From 730f417ecbbd01b9fb9d1550d061d4ea225b415c Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Wed, 25 Feb 2026 23:02:14 +0100 Subject: [PATCH 001/273] Fix MultiByteToWideChar usage in utf8_to_wstring_buf --- core/sys/windows/util.odin | 48 ++++++++++++----- tests/core/sys/windows/util.odin | 93 +++++++++++++++++++++++++++++++- 2 files changed, 127 insertions(+), 14 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 8cabdeb04..467bab214 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -117,23 +117,27 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ return text[:n] } +// Does not null-terminate the result. @(require_results) utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { - n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), nil, 0) - if n1 == 0 { - return nil - } else if int(n1) > len(buf) { + buf_length := len(buf) + if buf_length == 0 { + // This case must be handled separately because MultiByteToWideChar would interpret + // a buffer length of 0 as a request to calculate the required buffer size. return nil } - - n1 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), raw_data(buf[:]), n1) - if n1 == 0 { - return nil - } else if int(n1) > len(buf) { + if buf_length > cast(int)max(c_int) { + // Unsupported. return nil } - return buf[:n1] + elements_written := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), raw_data(buf[:]), cast(c_int)buf_length) + if elements_written == 0 { + // Insufficient buffer size or invalid characters. Contents of the buffer may have been modified. + return nil + } + return buf[:elements_written] } + utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf} @(require_results) @@ -146,10 +150,28 @@ utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> @(require_results) utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { - if res := utf8_to_utf16(buf, s); len(res) > 0 { - return wstring(raw_data(res)) + buf_length := len(buf) + if buf_length == 0 { + // We cannot even provide an empty string with a terminating null character. + return nil } - return nil + if len(s) == 0 { + // Empty string. Needs special care here because here, an empty string + // is different from conversion failure. + buf[0] = 0 + return wstring(raw_data(buf)) + } + // We will need to append the terminating null character. + // utf8_to_utf16 does not do that. + res := utf8_to_utf16(buf[:buf_length-1], s) + res_length := len(res) + if res_length == 0 { + // Conversion failure. + return nil + } + assert(res_length < buf_length) + buf[res_length] = 0 + return wstring(raw_data(res)) } utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf} diff --git a/tests/core/sys/windows/util.odin b/tests/core/sys/windows/util.odin index e2ab9cde0..2d1bcc0a6 100644 --- a/tests/core/sys/windows/util.odin +++ b/tests/core/sys/windows/util.odin @@ -31,4 +31,95 @@ utf16_to_utf8_buf_test :: proc(t: ^testing.T) { res := win32.utf16_to_utf8_buf(buf[:], transmute([]u16)wstr) testing.expect_value(t, res, test.ustr) } -} \ No newline at end of file +} + +@(test) +utf8_to_utf16_buf_test :: proc(t: ^testing.T) { + buf : [100]u16 = --- + // Test everything with a dirty buffer! + reset_buffer :: proc(buf : []u16) { + for i in 0 ..< len(buf) do buf[i] = cast(u16)(i + 1) + } + + result : []u16 + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:], "Hello\x00, World!") + testing.expect_value(t, len(result), 14) + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:], "你好,世界!") + testing.expect_value(t, len(result), 6) + testing.expect_value(t, result[0], 0x4F60) + testing.expect_value(t, result[1], 0x597D) + testing.expect_value(t, result[2], 0xFF0C) + testing.expect_value(t, result[3], 0x4E16) + testing.expect_value(t, result[4], 0x754C) + testing.expect_value(t, result[5], 0xFF01) + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:4], "Hello") + // Buffer too short. + testing.expect(t, result == nil) + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:], "") + // Valid, but indistinguishable from an error. + testing.expect_value(t, len(result), 0) + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:0], "Hello") + // Buffer too short. + testing.expect(t, result == nil) +} + +@(test) +utf8_to_wstring_buf_test :: proc(t : ^testing.T) { + buf : [100]u16 = --- + // Test everything with a dirty buffer! + reset_buffer :: proc(buf : []u16) { + for i in 0 ..< len(buf) do buf[i] = cast(u16)(i + 1) + } + + result : win32.wstring + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:], "Hello\x00, World!") + testing.expect(t, result != nil) + testing.expect_value(t, buf[13], '!') + testing.expect_value(t, buf[14], 0) + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:], "你好,世界!") + testing.expect(t, result != nil) + testing.expect_value(t, buf[0], 0x4F60) + testing.expect_value(t, buf[1], 0x597D) + testing.expect_value(t, buf[2], 0xFF0C) + testing.expect_value(t, buf[3], 0x4E16) + testing.expect_value(t, buf[4], 0x754C) + testing.expect_value(t, buf[5], 0xFF01) + testing.expect_value(t, buf[6], 0) + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:5], "Hello") + // Buffer too short. + testing.expect_value(t, result, nil) + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:6], "Hello") + // Buffer *just* long enough. + testing.expect(t, result != nil) + testing.expect_value(t, buf[4], 'o') + testing.expect_value(t, buf[5], 0) + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:], "") + // Valid, and distinguishable from an error. + testing.expect(t, result != nil) + testing.expect_value(t, buf[0], 0) + + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:0], "Hello") + // Buffer too short. + testing.expect(t, result == nil) +} From 572bebd031a6aa95c48ce11532f6d6c525492fae Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Thu, 26 Feb 2026 18:11:48 +0100 Subject: [PATCH 002/273] Add tests for win32 string conversion functions --- tests/core/sys/windows/util.odin | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tests/core/sys/windows/util.odin b/tests/core/sys/windows/util.odin index 2d1bcc0a6..638844416 100644 --- a/tests/core/sys/windows/util.odin +++ b/tests/core/sys/windows/util.odin @@ -38,7 +38,9 @@ utf8_to_utf16_buf_test :: proc(t: ^testing.T) { buf : [100]u16 = --- // Test everything with a dirty buffer! reset_buffer :: proc(buf : []u16) { - for i in 0 ..< len(buf) do buf[i] = cast(u16)(i + 1) + for i in 0 ..< len(buf) { + buf[i] = cast(u16)(i + 1) + } } result : []u16 @@ -46,6 +48,16 @@ utf8_to_utf16_buf_test :: proc(t: ^testing.T) { reset_buffer(buf[:]) result = win32.utf8_to_utf16_buf(buf[:], "Hello\x00, World!") testing.expect_value(t, len(result), 14) + testing.expect_value(t, result[4], 'o') + testing.expect_value(t, result[5], 0) + testing.expect_value(t, result[6], ',') + testing.expect_value(t, result[13], '!') + + reset_buffer(buf[:]) + result = win32.utf8_to_utf16_buf(buf[:], "H\x00\x00") + testing.expect_value(t, len(result), 3) + testing.expect_value(t, result[1], 0) + testing.expect_value(t, result[2], 0) reset_buffer(buf[:]) result = win32.utf8_to_utf16_buf(buf[:], "你好,世界!") @@ -78,7 +90,9 @@ utf8_to_wstring_buf_test :: proc(t : ^testing.T) { buf : [100]u16 = --- // Test everything with a dirty buffer! reset_buffer :: proc(buf : []u16) { - for i in 0 ..< len(buf) do buf[i] = cast(u16)(i + 1) + for i in 0 ..< len(buf) { + buf[i] = cast(u16)(i + 1) + } } result : win32.wstring @@ -89,6 +103,11 @@ utf8_to_wstring_buf_test :: proc(t : ^testing.T) { testing.expect_value(t, buf[13], '!') testing.expect_value(t, buf[14], 0) + reset_buffer(buf[:]) + result = win32.utf8_to_wstring_buf(buf[:], "H\x00\x00") + testing.expect(t, result != nil) + testing.expect_value(t, buf[1], 0) + reset_buffer(buf[:]) result = win32.utf8_to_wstring_buf(buf[:], "你好,世界!") testing.expect(t, result != nil) From e75d0694ba9570e7be215243bc0b32d20026714d Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Thu, 26 Feb 2026 18:14:34 +0100 Subject: [PATCH 003/273] win32 utf8_to_utf16_buf now null-terminates because _alloc did too. utf8_to_utf16_alloc no longer truncates trailing zero characters. utf8_to_wstring adjusted accordingly, including edge cases. --- core/sys/windows/util.odin | 62 ++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 467bab214..51d12d35c 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -110,14 +110,13 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ return nil } + // null-terminate the result here, even though the null element is not + // part of the slice. This is done to prevent callers which relied on + // this behavior, and is also expected by utf8_to_wstring_alloc. text[n] = 0 - for n >= 1 && text[n-1] == 0 { - n -= 1 - } return text[:n] } -// Does not null-terminate the result. @(require_results) utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { buf_length := len(buf) @@ -127,53 +126,76 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { return nil } if buf_length > cast(int)max(c_int) { - // Unsupported. - return nil + buf_length = cast(int)max(c_int) } elements_written := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), raw_data(buf[:]), cast(c_int)buf_length) if elements_written == 0 { - // Insufficient buffer size or invalid characters. Contents of the buffer may have been modified. + // Insufficient buffer size, empty input string, or invalid characters. Contents of the buffer may have been modified. return nil } + + // To be consistent with utf8_to_utf16_alloc, the output string + // is null-terminated here in the buffer, even if the terminating null character + // is not part of the returned slice. + if buf_length < cast(int)elements_written + 1 { + // The terminating null character does not fit. + return nil + } + buf[elements_written] = 0 return buf[:elements_written] } +// Converts each UTF-8 code point to UTF-16, including any amount of null characters. +// The resulting slice utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf} @(require_results) utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> wstring { - if res := utf8_to_utf16(s, allocator); len(res) > 0 { - return wstring(raw_data(res)) + if len(s) == 0 { + // Empty string. Needs special care because an empty string + // is different from conversion failure. + buf := make([]u16, 1, allocator) + buf[0] = 0 + return wstring(raw_data(buf)) + } + // utf8_to_utf16_alloc null-terminates the result in the allocated memory block, + // however, the null character is not part of the returned slice (it is just beyond). + // The conversion to wstring will lose this implicit overrun. + res := utf8_to_utf16(s, allocator) + if len(res) > 0 { + return wstring(raw_data(res)) + } else { + // Conversion failure. + return nil } - return nil } @(require_results) utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { buf_length := len(buf) if buf_length == 0 { - // We cannot even provide an empty string with a terminating null character. + // Insufficient buffer size, even for an empty string. return nil } if len(s) == 0 { - // Empty string. Needs special care here because here, an empty string + // Empty string. Needs special care because an empty string // is different from conversion failure. buf[0] = 0 return wstring(raw_data(buf)) } - // We will need to append the terminating null character. - // utf8_to_utf16 does not do that. - res := utf8_to_utf16(buf[:buf_length-1], s) - res_length := len(res) - if res_length == 0 { + res := utf8_to_utf16(buf[:], s) + if len(res) > 0 { + return wstring(raw_data(res)) + } else { // Conversion failure. return nil } - assert(res_length < buf_length) - buf[res_length] = 0 - return wstring(raw_data(res)) } +// Returns a null-termianted wstring, or nil on conversion failure. +// Conversion failure may happen due to an invalid byte sequence in the input string, +// or an insufficient buffer size (utf8_to_wstring_buf only). +// An empty string is valid, and distinct from nil. utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf} @(require_results) From 1c09a2be55935619a6da59336e1c7e45393bcb9e Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Thu, 26 Feb 2026 20:49:36 +0100 Subject: [PATCH 004/273] Add tests for utf8_to_utf16_alloc, utf8_to_wstring_alloc --- tests/core/sys/windows/util.odin | 110 +++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/tests/core/sys/windows/util.odin b/tests/core/sys/windows/util.odin index 638844416..777f85776 100644 --- a/tests/core/sys/windows/util.odin +++ b/tests/core/sys/windows/util.odin @@ -4,6 +4,7 @@ package test_core_sys_windows import "base:intrinsics" import "core:testing" import win32 "core:sys/windows" +import runtime "base:runtime" UTF16_Vector :: struct { wstr: win32.wstring, @@ -142,3 +143,112 @@ utf8_to_wstring_buf_test :: proc(t : ^testing.T) { // Buffer too short. testing.expect(t, result == nil) } + +// Custom allocator proc that always returns dirty (non-zeroed) memory. +dirty_allocator_proc :: proc(allocator_data: rawptr, mode: runtime.Allocator_Mode, + size, alignment: int, + old_memory: rawptr, old_size: int, + location: runtime.Source_Code_Location = #caller_location) -> ([]byte, runtime.Allocator_Error) { + real_allocator := cast(^runtime.Allocator)allocator_data + bytes, error := real_allocator.procedure(real_allocator.data, mode, + size, alignment, + old_memory, old_size, + location) + if error == .None { + for i in 0 ..< len(bytes) { + // This will yield a 0 byte on overflow, but that does not matter in this test suite. + bytes[i] = cast(byte)(i + 1) + } + } + return bytes, error +} + +@(test) +utf8_to_utf16_alloc_test :: proc(t : ^testing.T) { + // We want to ensure that everything works with dirty + // (non-zeroed) memory returned from the allocator. + real_allocator := context.temp_allocator + allocator := runtime.Allocator { + procedure = dirty_allocator_proc, + data = cast(rawptr)&real_allocator, + } + + // Test the dirty allocator. + allocator_test_slice := make([]u8, 100, allocator) + testing.expect_value(t, len(allocator_test_slice), 100) + for i in 0 ..< len(allocator_test_slice) { + testing.expect_value(t, allocator_test_slice[i], cast(u8)(i + 1)) + } + + result : []u16 + + result = win32.utf8_to_utf16_alloc("Hello\x00, World!", allocator) + testing.expect_value(t, len(result), 14) + testing.expect_value(t, result[4], 'o') + testing.expect_value(t, result[5], 0) + testing.expect_value(t, result[6], ',') + testing.expect_value(t, result[13], '!') + + result = win32.utf8_to_utf16_alloc("H\x00\x00", allocator) + testing.expect_value(t, len(result), 3) + testing.expect_value(t, result[1], 0) + testing.expect_value(t, result[2], 0) + + result = win32.utf8_to_utf16_alloc("你好,世界!", allocator) + testing.expect_value(t, len(result), 6) + testing.expect_value(t, result[0], 0x4F60) + testing.expect_value(t, result[1], 0x597D) + testing.expect_value(t, result[2], 0xFF0C) + testing.expect_value(t, result[3], 0x4E16) + testing.expect_value(t, result[4], 0x754C) + testing.expect_value(t, result[5], 0xFF01) + + result = win32.utf8_to_utf16_alloc("", allocator) + // Valid, but indistinguishable from an error. + testing.expect_value(t, len(result), 0) +} + +@(test) +utf8_to_wstring_alloc_test :: proc(t : ^testing.T) { + // We want to ensure that everything works with dirty + // (non-zeroed) memory returned from the allocator. + backing_allocator := context.temp_allocator + allocator := runtime.Allocator { + procedure = dirty_allocator_proc, + data = cast(rawptr)&backing_allocator, + } + + result : win32.wstring + buf : [^]u16 + + result = win32.utf8_to_wstring_alloc("Hello\x00, World!", allocator) + buf = transmute([^]u16)result + testing.expect(t, result != nil) + testing.expect_value(t, buf[4], 'o') + testing.expect_value(t, buf[5], 0) + testing.expect_value(t, buf[6], ',') + testing.expect_value(t, buf[13], '!') + testing.expect_value(t, buf[14], 0) + + result = win32.utf8_to_wstring_alloc("H\x00\x00", allocator) + buf = transmute([^]u16)result + testing.expect(t, result != nil) + testing.expect_value(t, buf[1], 0) + + result = win32.utf8_to_wstring_alloc("你好,世界!", allocator) + buf = transmute([^]u16)result + testing.expect(t, result != nil) + testing.expect_value(t, buf[0], 0x4F60) + testing.expect_value(t, buf[1], 0x597D) + testing.expect_value(t, buf[2], 0xFF0C) + testing.expect_value(t, buf[3], 0x4E16) + testing.expect_value(t, buf[4], 0x754C) + testing.expect_value(t, buf[5], 0xFF01) + testing.expect_value(t, buf[6], 0) + + result = win32.utf8_to_wstring_alloc("", allocator) + buf = transmute([^]u16)result + // Valid, and distinguishable from an error. + testing.expect(t, result != nil) + testing.expect_value(t, buf[0], 0) +} From fa3441936cf0d3ca13295db33fca8cb217a0b6bc Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Thu, 26 Feb 2026 20:52:00 +0100 Subject: [PATCH 005/273] Fix utf8_to_utf16_alloc edge case, and improve utf8_to_* documentation --- core/sys/windows/util.odin | 44 +++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 51d12d35c..2c2b8a1e4 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -121,21 +121,27 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { buf_length := len(buf) if buf_length == 0 { - // This case must be handled separately because MultiByteToWideChar would interpret - // a buffer length of 0 as a request to calculate the required buffer size. + return nil + } + s_length := len(s) + if s_length == 0 { + return nil + } + if s_length > cast(int)max(c_int) { + // Unsupported (input string is excessively long). return nil } if buf_length > cast(int)max(c_int) { buf_length = cast(int)max(c_int) } - elements_written := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), raw_data(buf[:]), cast(c_int)buf_length) + elements_written := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(s_length), raw_data(buf), cast(c_int)buf_length) if elements_written == 0 { // Insufficient buffer size, empty input string, or invalid characters. Contents of the buffer may have been modified. return nil } // To be consistent with utf8_to_utf16_alloc, the output string - // is null-terminated here in the buffer, even if the terminating null character + // is null-terminated here in the buffer, even though the terminating null character // is not part of the returned slice. if buf_length < cast(int)elements_written + 1 { // The terminating null character does not fit. @@ -145,8 +151,16 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { return buf[:elements_written] } -// Converts each UTF-8 code point to UTF-16, including any amount of null characters. -// The resulting slice +// Converts a regular UTF-8 `string` to UTF-16. +// +// The conversion includes any null characters present in the input string. +// +// Returns `nil` on conversion failure. +// +// Conversion may fail due to an invalid byte sequence in the input string, +// or an insufficient buffer size (`utf8_to_utf16_buf` only). +// +// The result of converting an empty string is indistinguishable from conversion failure. utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf} @(require_results) @@ -158,9 +172,9 @@ utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> buf[0] = 0 return wstring(raw_data(buf)) } - // utf8_to_utf16_alloc null-terminates the result in the allocated memory block, + // utf8_to_utf16 null-terminates the result in the allocated memory block, // however, the null character is not part of the returned slice (it is just beyond). - // The conversion to wstring will lose this implicit overrun. + // The conversion to wstring will bypass this implicit overrun. res := utf8_to_utf16(s, allocator) if len(res) > 0 { return wstring(raw_data(res)) @@ -183,6 +197,9 @@ utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { buf[0] = 0 return wstring(raw_data(buf)) } + // utf8_to_utf16 null-terminates the result in the buffer, + // however, the null character is not part of the returned slice (it is just beyond). + // The conversion to wstring will bypass this implicit overrun. res := utf8_to_utf16(buf[:], s) if len(res) > 0 { return wstring(raw_data(res)) @@ -192,10 +209,13 @@ utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { } } -// Returns a null-termianted wstring, or nil on conversion failure. -// Conversion failure may happen due to an invalid byte sequence in the input string, -// or an insufficient buffer size (utf8_to_wstring_buf only). -// An empty string is valid, and distinct from nil. +// Converts a regular UTF-8 `string` to UTF-16, and returns the result as a +// null-terminated `wstring`, or `nil` on conversion failure. +// +// Conversion may fail due to an invalid byte sequence in the input string, +// or an insufficient buffer size (`utf8_to_wstring_buf` only). +// +// An empty string is valid, and results in a value distinct from `nil`. utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf} @(require_results) From 9883e4ec291e425bd1738dff40e5fb4466d4d2aa Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Fri, 27 Feb 2026 19:16:34 +0100 Subject: [PATCH 006/273] Handle edge cases: Allocation error, extremely long input --- core/sys/windows/util.odin | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 2c2b8a1e4..88ffce05a 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -91,20 +91,28 @@ LANGIDFROMLCID :: #force_inline proc "contextless" (lcid: LCID) -> LANGID { @(require_results) utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> []u16 { - if len(s) < 1 { + s_length := len(s) + if s_length < 1 { + return nil + } + if s_length > cast(int)max(c_int) { + // Unsupported (input string is excessively long). return nil } b := transmute([]byte)s cstr := raw_data(b) - n := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(len(s)), nil, 0) + n := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(s_length), nil, 0) if n == 0 { return nil } text := make([]u16, n+1, allocator) + if text == nil { + return nil + } - n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(len(s)), raw_data(text), n) + n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(s_length), raw_data(text), n) if n1 == 0 { delete(text, allocator) return nil @@ -158,7 +166,8 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { // Returns `nil` on conversion failure. // // Conversion may fail due to an invalid byte sequence in the input string, -// or an insufficient buffer size (`utf8_to_utf16_buf` only). +// or an insufficient buffer size (`utf8_to_utf16_buf` only), +// or allocation failure (`utf8_to_utf16_alloc` only). // // The result of converting an empty string is indistinguishable from conversion failure. utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf} @@ -169,6 +178,9 @@ utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> // Empty string. Needs special care because an empty string // is different from conversion failure. buf := make([]u16, 1, allocator) + if buf == nil { + return nil + } buf[0] = 0 return wstring(raw_data(buf)) } @@ -213,7 +225,8 @@ utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { // null-terminated `wstring`, or `nil` on conversion failure. // // Conversion may fail due to an invalid byte sequence in the input string, -// or an insufficient buffer size (`utf8_to_wstring_buf` only). +// or an insufficient buffer size (`utf8_to_wstring_buf` only), +// or allocation failure (`utf8_to_wstring_alloc` only). // // An empty string is valid, and results in a value distinct from `nil`. utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf} From 4ec443df9b0c6ab488e9d72037b86830c3a23470 Mon Sep 17 00:00:00 2001 From: miningape Date: Sat, 28 Feb 2026 00:26:59 +0100 Subject: [PATCH 007/273] fix: `strings.substring` not returning end of range --- core/strings/strings.odin | 4 +++- tests/core/strings/test_core_strings.odin | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/strings/strings.odin b/core/strings/strings.odin index d40b81b3d..d55fea69e 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -3420,7 +3420,9 @@ internal_substring :: proc(s: string, rune_start: int, rune_end: int) -> (sub: s } rune_i += 1 } - if !ok { return } + if !ok { + sub = sub[rune_i:] + } } if rune_end >= rune_start { diff --git a/tests/core/strings/test_core_strings.odin b/tests/core/strings/test_core_strings.odin index 140689468..a7502ab92 100644 --- a/tests/core/strings/test_core_strings.odin +++ b/tests/core/strings/test_core_strings.odin @@ -164,11 +164,16 @@ test_substring :: proc(t: ^testing.T) { {s = "Hello", end = len("Hello"), sub = "Hello", ok = true}, {s = "Hello", start = 1, end = len("Hello"), sub = "ello", ok = true}, {s = "Hello", start = 1, end = len("Hello") - 1, sub = "ell", ok = true}, + {s = "Hello", start = 0, end = 0, sub = "", ok = true}, + {s = "Hello", start = 3, end = 3, sub = "", ok = true}, + {s = "Hello", start = len("Hello"), end = len("Hello"), sub = "", ok = true}, {s = "Hello", end = len("Hello") + 1, sub = "Hello", ok = false}, {s = "小猫咪", start = 0, end = 3, sub = "小猫咪", ok = true}, {s = "小猫咪", start = 1, end = 3, sub = "猫咪", ok = true}, {s = "小猫咪", start = 1, end = 5, sub = "猫咪", ok = false}, {s = "小猫咪", start = 1, end = 1, sub = "", ok = true}, + {s = "小猫咪", start = 1, end = 1, sub = "", ok = true}, + {s = "小猫咪", start = 3, end = 3, sub = "", ok = true}, } for tc in cases { From eeb7e775f3c1ed0853c8b51e47fb602cd44f37ff Mon Sep 17 00:00:00 2001 From: fendevel Date: Sat, 28 Feb 2026 00:37:34 +0000 Subject: [PATCH 008/273] webgl: Add bindings, fix `Tex*Image*D` --- core/sys/wasm/js/odin.js | 98 +++++++++++++++++++++++++++-------- vendor/wasm/WebGL/webgl.odin | 16 ++++++ vendor/wasm/WebGL/webgl2.odin | 1 + 3 files changed, 92 insertions(+), 23 deletions(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 19ac3093e..4d19916bd 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -10,7 +10,7 @@ function getElement(name) { } function stripNewline(str) { - return str.replace(/\n/, ' ') + return str.replace(/\n/, ' ') } class WasmMemoryInterface { @@ -40,22 +40,14 @@ class WasmMemoryInterface { } - loadF32Array(addr, len) { - let array = new Float32Array(this.memory.buffer, addr, len); - return array; - } - loadF64Array(addr, len) { - let array = new Float64Array(this.memory.buffer, addr, len); - return array; - } - loadU32Array(addr, len) { - let array = new Uint32Array(this.memory.buffer, addr, len); - return array; - } - loadI32Array(addr, len) { - let array = new Int32Array(this.memory.buffer, addr, len); - return array; - } + loadF32Array(addr, len) { return new Float32Array(this.memory.buffer, addr, len); } + loadF64Array(addr, len) { return new Float64Array(this.memory.buffer, addr, len); } + loadU32Array(addr, len) { return new Uint32Array(this.memory.buffer, addr, len); } + loadI32Array(addr, len) { return new Int32Array(this.memory.buffer, addr, len); } + loadU16Array(addr, len) { return new Uint16Array(this.memory.buffer, addr, len); } + loadI16Array(addr, len) { return new Int16Array(this.memory.buffer, addr, len); } + loadU8Array(addr, len) { return new Uint8Array(this.memory.buffer, addr, len); } + loadI8Array(addr, len) { return new Int8Array(this.memory.buffer, addr, len); } loadU8(addr) { return this.mem.getUint8 (addr); } @@ -200,6 +192,7 @@ class WebGLInterface { this.transformFeedbacks = []; this.syncs = []; this.programInfos = {}; + this.extensions = []; } get mem() { @@ -225,6 +218,9 @@ class WebGLInterface { } else { this.ctxVersion = 1.0; } + + this.extensions = this.ctx.getSupportedExtensions(); + return true; } @@ -281,6 +277,30 @@ class WebGLInterface { return source; } + loadTypedArrayFromTexelType(type, size, data) { + switch (type) { + case this.ctx.SHORT: return this.mem.loadI16Array(data, size/2); + case this.ctx.UNSIGNED_SHORT_5_5_5_1: + case this.ctx.UNSIGNED_SHORT_5_6_5: + case this.ctx.UNSIGNED_SHORT_4_4_4_4: + case this.ctx.UNSIGNED_SHORT: + case this.ctx.HALF_FLOAT: return this.mem.loadU16Array(data, size/2); + case this.ctx.FLOAT: return this.mem.loadF32Array(data, size/4); + case this.ctx.INT: return this.mem.loadI32Array(data, size/4) + case this.ctx.UNSIGNED_INT_24_8: + case this.ctx.UNSIGNED_INT_5_9_9_9_REV: + case this.ctx.UNSIGNED_INT_10F_11F_11F_REV: + case this.ctx.UNSIGNED_INT_2_10_10_10_REV: + case this.ctx.UNSIGNED_INT: return this.mem.loadU32Array(data, size/4) + case this.ctx.BYTE: return this.mem.loadI8Array(data, size); + case this.ctx.UNSIGNED_BYTE: return this.mem.loadU8Array(data, size); + case this.ctx.FLOAT_32_UNSIGNED_INT_24_8_REV: + throw new Error("Source data of type FLOAT_32_UNSIGNED_INT_24_8_REV must be null"); + } + + throw new Error(`Unsupported texture data type: 0x${type.toString(16)}`); + } + getWebGL1Interface() { return { SetCurrentContextById: (name_ptr, name_len) => { @@ -327,10 +347,30 @@ class WebGLInterface { IsExtensionSupported: (name_ptr, name_len) => { let name = this.mem.loadString(name_ptr, name_len); - let extensions = this.ctx.getSupportedExtensions(); + let extensions = this.extensions; return extensions.indexOf(name) !== -1 }, + GetSupportedExtensionFromIndex: (index, buf_ptr, buf_len, length_ptr) => { + let extensions = this.extensions; + if (index < 0 || index >= extensions.length) { + return false; + } + + let ext = extensions[index]; + const n = Math.min(buf_len, ext.length); + ext = ext.substring(0, n); + this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(ext)); + + this.mem.storeInt(length_ptr, n); + + return true; + }, + + GetExtension: (name_ptr, name_len) => { + let name = this.mem.loadString(name_ptr, name_len); + this.ctx.getExtension(name); + }, GetError: () => { let err = this.lastError; @@ -628,6 +668,11 @@ class WebGLInterface { this.ctx.generateMipmap(target); }, + GetBufferParameter: (target, pname) => { + return this.ctx.getBufferParameter(target, pname); + }, + + GetActiveAttrib: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { const info = this.ctx.getActiveAttrib(this.programs[program], index); @@ -830,7 +875,8 @@ class WebGLInterface { TexImage2D: (target, level, internalformat, width, height, border, format, type, size, data) => { if (data) { - this.ctx.texImage2D(target, level, internalformat, width, height, border, format, type, this.mem.loadBytes(data, size)); + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texImage2D(target, level, internalformat, width, height, border, format, type, texelData); } else { this.ctx.texImage2D(target, level, internalformat, width, height, border, format, type, null); } @@ -842,7 +888,8 @@ class WebGLInterface { this.ctx.texParameteri(target, pname, param); }, TexSubImage2D: (target, level, xoffset, yoffset, width, height, format, type, size, data) => { - this.ctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, this.mem.loadBytes(data, size)); + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, texelData); }, @@ -976,7 +1023,10 @@ class WebGLInterface { }, /* Texture objects */ - + TexStorage2D: (target, levels, internalformat, width, height) => { + this.assertWebGL2(); + this.ctx.texStorage2D(target, levels, internalformat, width, height); + }, TexStorage3D: (target, levels, internalformat, width, height, depth) => { this.assertWebGL2(); this.ctx.texStorage3D(target, levels, internalformat, width, height, depth); @@ -984,14 +1034,16 @@ class WebGLInterface { TexImage3D: (target, level, internalformat, width, height, depth, border, format, type, size, data) => { this.assertWebGL2(); if (data) { - this.ctx.texImage3D(target, level, internalformat, width, height, depth, border, format, type, this.mem.loadBytes(data, size)); + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texImage3D(target, level, internalformat, width, height, depth, border, format, type, texelData); } else { this.ctx.texImage3D(target, level, internalformat, width, height, depth, border, format, type, null); } }, TexSubImage3D: (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, size, data) => { this.assertWebGL2(); - this.ctx.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, this.mem.loadBytes(data, size)); + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texelData); }, CompressedTexImage3D: (target, level, internalformat, width, height, depth, border, imageSize, data) => { this.assertWebGL2(); diff --git a/vendor/wasm/WebGL/webgl.odin b/vendor/wasm/WebGL/webgl.odin index d607ec743..6338d6271 100644 --- a/vendor/wasm/WebGL/webgl.odin +++ b/vendor/wasm/WebGL/webgl.odin @@ -52,6 +52,7 @@ foreign webgl { GetError :: proc() -> Enum --- IsExtensionSupported :: proc(name: string) -> bool --- + GetExtension :: proc(name: string) --- ActiveTexture :: proc(x: Enum) --- AttachShader :: proc(program: Program, shader: Shader) --- @@ -118,6 +119,7 @@ foreign webgl { GenerateMipmap :: proc(target: Enum) --- + GetBufferParameter :: proc(target, name: Enum) -> int --- GetAttribLocation :: proc(program: Program, name: string) -> i32 --- GetUniformLocation :: proc(program: Program, name: string) -> i32 --- GetVertexAttribOffset :: proc(index: i32, pname: Enum) -> uintptr --- @@ -373,7 +375,21 @@ GetShaderInfoLog :: proc "contextless" (shader: Shader, buf: []byte) -> string { return string(buf[:length]) } +IterateSupportedExtensions :: proc(index: ^int, buf: []byte) -> (string, bool) { + foreign webgl { + @(link_name="GetSupportedExtensionFromIndex") + _GetSupportedExtensionFromIndex :: proc "contextless" (index: int, buf: []byte, length: ^int) -> bool --- + } + length: int + if !_GetSupportedExtensionFromIndex(index^, buf[:], &length) { + return "", false + } + + index^ += 1 + + return string(buf[:length]), true +} BufferDataSlice :: proc "contextless" (target: Enum, slice: $S/[]$E, usage: Enum) { BufferData(target, len(slice)*size_of(E), raw_data(slice), usage) diff --git a/vendor/wasm/WebGL/webgl2.odin b/vendor/wasm/WebGL/webgl2.odin index 1e36fd0fd..677287bd1 100644 --- a/vendor/wasm/WebGL/webgl2.odin +++ b/vendor/wasm/WebGL/webgl2.odin @@ -35,6 +35,7 @@ foreign webgl2 { RenderbufferStorageMultisample :: proc(target: Enum, samples: i32, internalformat: Enum, width, height: i32) --- /* Texture objects */ + TexStorage2D :: proc(target: Enum, levels: i32, internalformat: Enum, width, height: i32) --- TexStorage3D :: proc(target: Enum, levels: i32, internalformat: Enum, width, height, depth: i32) --- TexImage3D :: proc(target: Enum, level: i32, internalformat: Enum, width, height, depth: i32, border: i32, format, type: Enum, size: int, data: rawptr) --- TexSubImage3D :: proc(target: Enum, level: i32, xoffset, yoffset, zoffset, width, height, depth: i32, format, type: Enum, size: int, data: rawptr) --- From 1e0f5a691cf4682507853e2305df213183692751 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Sat, 28 Feb 2026 11:39:12 +0100 Subject: [PATCH 009/273] Fix overflow edge cases on 32-bit systems. --- core/sys/windows/util.odin | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 88ffce05a..542d2718e 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -103,17 +103,21 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ b := transmute([]byte)s cstr := raw_data(b) n := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(s_length), nil, 0) - if n == 0 { + if n <= 0 || cast(int)n >= max(int) { + // If n is equal to or greater than max(int), then we will not be able + // to create a big enough slice with the null terminator. + // NOTE: This only affects 32-bit systems and is purely pedantic because + // the system will never be able to allocate that much memory. return nil } - text := make([]u16, n+1, allocator) + text := make([]u16, cast(int)n + 1, allocator) if text == nil { return nil } n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(s_length), raw_data(text), n) - if n1 == 0 { + if n1 <= 0 { delete(text, allocator) return nil } @@ -128,7 +132,7 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ @(require_results) utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { buf_length := len(buf) - if buf_length == 0 { + if buf_length < 1 { return nil } s_length := len(s) @@ -143,7 +147,7 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { buf_length = cast(int)max(c_int) } elements_written := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(s_length), raw_data(buf), cast(c_int)buf_length) - if elements_written == 0 { + if elements_written <= 0 { // Insufficient buffer size, empty input string, or invalid characters. Contents of the buffer may have been modified. return nil } @@ -151,8 +155,9 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { // To be consistent with utf8_to_utf16_alloc, the output string // is null-terminated here in the buffer, even though the terminating null character // is not part of the returned slice. - if buf_length < cast(int)elements_written + 1 { + if buf_length <= cast(int)elements_written { // The terminating null character does not fit. + // Need at least a length of (elements_written+1). return nil } buf[elements_written] = 0 From f01fb605bc8b6fa40ce30129197ad1cab4ff56af Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Sat, 28 Feb 2026 10:24:00 -0600 Subject: [PATCH 010/273] [vendor:stb/vorbis] don't use core:c/libc --- vendor/stb/vorbis/stb_vorbis.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/stb/vorbis/stb_vorbis.odin b/vendor/stb/vorbis/stb_vorbis.odin index 38bba4f29..fb7ff0ec2 100644 --- a/vendor/stb/vorbis/stb_vorbis.odin +++ b/vendor/stb/vorbis/stb_vorbis.odin @@ -1,7 +1,7 @@ // Bindings for [[ stb_vorbis.c ; https://github.com/nothings/stb/blob/master/stb_vorbis.c ]]. package stb_vorbis -import c "core:c/libc" +import c "core:c" @(private) LIB :: ( From c685c312c538127e5a050472e23bedc4b9d93da5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 1 Mar 2026 13:00:27 +0000 Subject: [PATCH 011/273] Make the tokenizer work with a custom hash map protected by a spinlock --- core/odin/tokenizer/tokenizer.odin | 93 ++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 6 deletions(-) diff --git a/core/odin/tokenizer/tokenizer.odin b/core/odin/tokenizer/tokenizer.odin index 9f46f2ed6..50f04ba84 100644 --- a/core/odin/tokenizer/tokenizer.odin +++ b/core/odin/tokenizer/tokenizer.odin @@ -1,6 +1,8 @@ // The tokenizer (lexer) for `Odin` files, used to create tooling. package odin_tokenizer +import "base:intrinsics" +import "base:runtime" import "core:fmt" import "core:unicode" import "core:unicode/utf8" @@ -32,6 +34,71 @@ Tokenizer :: struct { error_count: int, } + +Keyword_Hash_Entry :: struct { + hash: u32, + kind: Token_Kind, + name: string, +} + +KEYWORD_LUT_LEN :: 1<<9 +KEYWORD_LUT_MASK :: KEYWORD_LUT_LEN-1 +Keyword_LUT :: [KEYWORD_LUT_LEN]Keyword_Hash_Entry + +global_keyword_lut: Keyword_LUT // protected by `_global_keyword_lut_spinlock` +_global_keyword_lut_initialized: bool // atomic +_global_keyword_lut_spinlock: bool // atomic + +_global_keyword_spin_lock :: proc() { + for intrinsics.atomic_exchange_explicit(&_global_keyword_lut_spinlock, true, .Acquire) { + intrinsics.cpu_relax() + } +} + +_global_keyword_spin_unlock :: proc() { + intrinsics.atomic_store_explicit(&_global_keyword_lut_spinlock, false, .Release) +} + +@(require_results) +keyword_hash :: proc(text: string) -> u32 #no_bounds_check { + h := u32(0x811c9dc5) + for i in 0.. bool { + if lut == nil { + return false + } + + max_keyword_size := 0 + + ti := runtime.type_info_base(type_info_of(Token_Kind)) + e := ti.variant.(runtime.Type_Info_Enum) + + for kind in (Token_Kind.B_Keyword_Begin+Token_Kind(1)).. 1) + assert(max_keyword_size < 16) + + return true +} + + init :: proc(t: ^Tokenizer, src: string, path: string, err: Error_Handler = default_error_handler) { t.src = src t.err = err @@ -44,6 +111,13 @@ init :: proc(t: ^Tokenizer, src: string, path: string, err: Error_Handler = defa t.error_count = 0 t.path = path + if !intrinsics.atomic_load(&_global_keyword_lut_initialized) { + _global_keyword_spin_lock() + ok := keyword_lut_init(&global_keyword_lut) + intrinsics.atomic_store(&_global_keyword_lut_initialized, ok) + _global_keyword_spin_unlock() + } + advance_rune(t) if t.ch == utf8.RUNE_BOM { advance_rune(t) @@ -502,13 +576,21 @@ scan :: proc(t: ^Tokenizer) -> Token { case is_letter(ch): lit = scan_identifier(t) kind = .Ident - check_keyword: if len(lit) > 1 { - // TODO(bill): Maybe have a hash table lookup rather than this linear search - for i in Token_Kind.B_Keyword_Begin ..= Token_Kind.B_Keyword_End { - if lit == tokens[i] { - kind = Token_Kind(i) + check_keyword: if 1 < len(lit) && len(lit) < 16 { + if intrinsics.atomic_load(&_global_keyword_lut_initialized) { + entry := &global_keyword_lut[keyword_hash(lit) & KEYWORD_LUT_MASK] + if entry.kind != .Invalid && entry.name == lit { + kind = entry.kind break check_keyword } + } else { + // TODO(bill): Maybe have a hash table lookup rather than this linear search + for i in Token_Kind.B_Keyword_Begin ..= Token_Kind.B_Keyword_End { + if lit == tokens[i] { + kind = Token_Kind(i) + break check_keyword + } + } } for keyword, i in custom_keyword_tokens { if lit == keyword { @@ -516,7 +598,6 @@ scan :: proc(t: ^Tokenizer) -> Token { break check_keyword } } - break check_keyword } case '0' <= ch && ch <= '9': kind, lit = scan_number(t, false) From 05a951b338688cf343736b099b1e74de407d1997 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 1 Mar 2026 13:05:51 +0000 Subject: [PATCH 012/273] Fix name lookup --- core/odin/tokenizer/tokenizer.odin | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/odin/tokenizer/tokenizer.odin b/core/odin/tokenizer/tokenizer.odin index 50f04ba84..3f7ccc6a5 100644 --- a/core/odin/tokenizer/tokenizer.odin +++ b/core/odin/tokenizer/tokenizer.odin @@ -2,7 +2,6 @@ package odin_tokenizer import "base:intrinsics" -import "base:runtime" import "core:fmt" import "core:unicode" import "core:unicode/utf8" @@ -75,18 +74,15 @@ keyword_lut_init :: proc(lut: ^Keyword_LUT) -> bool { max_keyword_size := 0 - ti := runtime.type_info_base(type_info_of(Token_Kind)) - e := ti.variant.(runtime.Type_Info_Enum) - for kind in (Token_Kind.B_Keyword_Begin+Token_Kind(1)).. Date: Sun, 1 Mar 2026 13:06:11 +0000 Subject: [PATCH 013/273] Remove `TODO` --- core/odin/tokenizer/tokenizer.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/odin/tokenizer/tokenizer.odin b/core/odin/tokenizer/tokenizer.odin index 3f7ccc6a5..f4d50b36c 100644 --- a/core/odin/tokenizer/tokenizer.odin +++ b/core/odin/tokenizer/tokenizer.odin @@ -580,7 +580,6 @@ scan :: proc(t: ^Tokenizer) -> Token { break check_keyword } } else { - // TODO(bill): Maybe have a hash table lookup rather than this linear search for i in Token_Kind.B_Keyword_Begin ..= Token_Kind.B_Keyword_End { if lit == tokens[i] { kind = Token_Kind(i) From e8ca4a24fa8455ac42eda33ba3ab1d7c49b024e4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 1 Mar 2026 13:28:30 +0000 Subject: [PATCH 014/273] Add `assert` to `freelist_push_with_index` --- core/container/xar/freelist.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/container/xar/freelist.odin b/core/container/xar/freelist.odin index c2afca0d0..4b11014f5 100644 --- a/core/container/xar/freelist.odin +++ b/core/container/xar/freelist.odin @@ -29,7 +29,8 @@ freelist_clear :: proc(x: ^$X/Freelist_Array($T, $SHIFT)) { freelist_push_with_index :: proc(x: ^$X/Freelist_Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, index: int, err: runtime.Allocator_Error) { if x.freelist != nil { slot := x.freelist - idx, _ := freelist_linear_search(x, slot) + idx, found := freelist_linear_search(x, slot) + assert(found) x.freelist = (^^T)(slot)^ slot^ = value return slot, idx, nil From 8bdf82ac8de23f27564c5c8948a5d2c38110327e Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Sun, 1 Mar 2026 13:38:29 +0100 Subject: [PATCH 015/273] Fix separating of diverging procedure types from block statements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To avoid creating a procedure literal from a procedure type and a following block statement, one can insert a semicolon or an empty line between the two: // procedure literals p1 :: proc() {…} p2 :: proc() {…} // procedure type followed by a block statement p3 :: proc() {…} The empty line as a separator did not work if the procedure type had a diverging result: // all of these are procedure literals p4 :: proc() -> ! {…} p5 :: proc() -> ! {…} p6 :: proc() -> ! {…} The least annoying fix I came up with is to insert implicit semicolon after the "not" token. I only needed to make sure that the inserted implicit semicolon is being skipped when the "not" token is a part of unary expression to avoid breaking an oddly-formatted code like: b := get_some_bool() if ! b {…} One small side-effect of this change is that in code like below: Proc_Type :: proc() -> ! // Some comment Some_Other_Type :: enum byte {…} The "// Some comment" is not associated with "Proc_Type" anymore. In Odin's standard library this only happens in one place, in `base/runtime/core.odin`: Assertion_Failure_Proc :: #type proc(prefix, message: string, loc: Source_Code_Location) -> ! // Allocation Stuff Allocator_Mode :: enum byte { Alloc, …, } --- src/parser.cpp | 3 +++ src/tokenizer.cpp | 1 + 2 files changed, 4 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index e98832034..5ada6d298 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -3490,6 +3490,9 @@ gb_internal Ast *parse_unary_expr(AstFile *f, bool lhs) { case Token_Mul: // Used for error handling when people do C-like things { Token token = advance_token(f); + if (token.kind == Token_Not) { + skip_possible_newline(f); + } Ast *expr = parse_unary_expr(f, lhs); return ast_unary_expr(f, token, expr); } diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index ffa53abb5..2ba25b297 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -1114,6 +1114,7 @@ semicolon_check:; /*fallthrough*/ case Token_Increment: case Token_Decrement: + case Token_Not: /*fallthrough*/ t->insert_semicolon = true; break; From 579b2612b1567f98de7e68f3cdcab3e12c0834b3 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 1 Mar 2026 14:54:26 +0100 Subject: [PATCH 016/273] Fix #6347 --- src/llvm_backend.hpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index a8076d75e..0f199907d 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -620,7 +620,12 @@ gb_internal LLVMValueRef lb_mem_zero_ptr_internal(lbProcedure *p, LLVMValueRef p gb_internal LLVMValueRef lb_mem_zero_ptr_internal(lbProcedure *p, LLVMValueRef ptr, usize len, unsigned alignment, bool is_volatile); gb_internal gb_inline i64 lb_max_zero_init_size(void) { - return cast(i64)(8); + if (build_context.metrics.os == TargetOs_darwin && build_context.metrics.arch == TargetArch_arm64) { + // https://github.com/odin-lang/Odin/issues/6347 + return cast(i64)(4*build_context.int_size); + } else { + return cast(i64)(8); + } } gb_internal LLVMTypeRef OdinLLVMGetArrayElementType(LLVMTypeRef type); From 5e009f5e8354d665706a56c9a469fc783b173e2b Mon Sep 17 00:00:00 2001 From: Franz Date: Sun, 1 Mar 2026 15:43:17 +0100 Subject: [PATCH 017/273] Fix name canonicalization for typed ranges in bit_set (#6353) --- src/name_canonicalization.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index d3faefed7..efe115c89 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -838,7 +838,8 @@ gb_internal void write_type_to_canonical_string(TypeWriter *w, Type *type) { } else { type_writer_append_fmt(w, "%lld", type->BitSet.lower); type_writer_append_fmt(w, CANONICAL_RANGE_OPERATOR); - type_writer_append_fmt(w, "%lld", type->BitSet.upper); + write_type_to_canonical_string(w, type->BitSet.elem); + type_writer_append_fmt(w, "(%lld)", type->BitSet.upper); } if (type->BitSet.underlying != nullptr) { type_writer_appendc(w, ";"); From e3d6fe72f8c7c79a09e18ba089552b7f6235c52b Mon Sep 17 00:00:00 2001 From: Louis Novy <101842021+louisnovy@users.noreply.github.com> Date: Sun, 1 Mar 2026 20:58:43 -0800 Subject: [PATCH 018/273] fix broken bit_set parapoly specialization #6240 --- src/check_expr.cpp | 5 +++++ src/check_type.cpp | 1 + tests/issues/run.bat | 1 + tests/issues/run.sh | 6 ++++++ 4 files changed, 13 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 1cf133f38..7f0acb4c6 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1501,6 +1501,11 @@ gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, T case Type_BitSet: if (source->kind == Type_BitSet) { + if (!is_type_polymorphic(poly->BitSet.elem)) { + if (poly->BitSet.upper != source->BitSet.upper || poly->BitSet.lower != source->BitSet.lower) { + return false; + } + } if (!is_polymorphic_type_assignable(c, poly->BitSet.elem, source->BitSet.elem, true, modify_type)) { return false; } diff --git a/src/check_type.cpp b/src/check_type.cpp index b1d0045e9..82e70dd33 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1229,6 +1229,7 @@ gb_internal void check_bit_set_type(CheckerContext *c, Type *type, Type *named_t ast_node(bs, BitSetType, node); GB_ASSERT(type->kind == Type_BitSet); type->BitSet.node = node; + type->BitSet.elem = t_invalid; /* i64 const DEFAULT_BITS = cast(i64)(8*build_context.word_size); */ i64 const MAX_BITS = 128; diff --git a/tests/issues/run.bat b/tests/issues/run.bat index f17f646a6..de380e313 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -29,6 +29,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_6068.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6101.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6165.odin %COMMON% || exit /b +..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr "3" || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index 73d0d9587..6c6796e28 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -36,6 +36,12 @@ $ODIN test ../test_issue_5699.odin $COMMON $ODIN test ../test_issue_6068.odin $COMMON $ODIN test ../test_issue_6101.odin $COMMON $ODIN test ../test_issue_6165.odin $COMMON +if [[ $($ODIN build ../test_issue_6240.odin $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 3 ]] ; then + echo "SUCCESSFUL 1/1" +else + echo "SUCCESSFUL 0/1" + exit 1 +fi set +x popd From 1a27af515f2dc431f7593b99d30a49a952486fbb Mon Sep 17 00:00:00 2001 From: Louis Novy <101842021+louisnovy@users.noreply.github.com> Date: Sun, 1 Mar 2026 21:18:30 -0800 Subject: [PATCH 019/273] add test file --- tests/issues/test_issue_6240.odin | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tests/issues/test_issue_6240.odin diff --git a/tests/issues/test_issue_6240.odin b/tests/issues/test_issue_6240.odin new file mode 100644 index 000000000..a56f44f33 --- /dev/null +++ b/tests/issues/test_issue_6240.odin @@ -0,0 +1,14 @@ +// Tests issue #6240 https://github.com/odin-lang/Odin/issues/6240 +package test_issues + +// should error - N=10 does not match bit_set range 0..<5 +foo :: proc($N: int, b: $B/bit_set[0 ..< N]) {} + +// should error without segfaulting - undefined identifier in bit_set range +bar :: proc(b: $B/bit_set[0 ..< asdf]) {} + +main :: proc() { + b: bit_set[0 ..< 5] + foo(10, b) + bar(bit_set[0 ..< 1]{}) +} From 7732a78c089a39722d9a43cc2cb206080ac028bf Mon Sep 17 00:00:00 2001 From: Louis Novy <101842021+louisnovy@users.noreply.github.com> Date: Sun, 1 Mar 2026 21:33:14 -0800 Subject: [PATCH 020/273] harden run.bat and add missing test_issue_2395 --- tests/issues/run.bat | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/issues/run.bat b/tests/issues/run.bat index de380e313..9e722886d 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -21,6 +21,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_4210.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_4364.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_4584.odin %COMMON% || exit /b +..\..\..\odin build ..\test_issue_2395.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "2" || exit /b ..\..\..\odin build ..\test_issue_5043.odin %COMMON% || exit /b ..\..\..\odin build ..\test_issue_5097.odin %COMMON% || exit /b ..\..\..\odin build ..\test_issue_5097-2.odin %COMMON% || exit /b @@ -29,7 +30,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_6068.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6101.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6165.odin %COMMON% || exit /b -..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr "3" || exit /b +..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b @echo off From 38c61e06be1a727409b544dad32888b48e32bd02 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 2 Mar 2026 20:15:55 +0100 Subject: [PATCH 021/273] Rename GetWorldPointVelocity to Body_GetWorldPointVelocity --- vendor/box2d/box2d.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/box2d/box2d.odin b/vendor/box2d/box2d.odin index 2301ed3d0..2cdfea191 100644 --- a/vendor/box2d/box2d.odin +++ b/vendor/box2d/box2d.odin @@ -773,7 +773,7 @@ foreign lib { Body_GetLocalPointVelocity :: proc(bodyId: BodyId, localPoint: Vec2) -> Vec2 --- // Get the linear velocity of a world point attached to a body. Usually in meters per second. - GetWorldPointVelocity :: proc(bodyId: BodyId, worldPoint: Vec2) -> Vec2 --- + Body_GetWorldPointVelocity :: proc(bodyId: BodyId, worldPoint: Vec2) -> Vec2 --- // Apply a force at a world point. If the force is not applied at the center of mass, // it will generate a torque and affect the angular velocity. This optionally wakes up the body. From 2a9c35fe3ca3b029f8ed3dae45698ca5d5c3b34c Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Mon, 2 Mar 2026 21:13:08 +0100 Subject: [PATCH 022/273] Fix incorrect PVOID/VOID usage in some win32 signatures --- core/sys/windows/gdi32.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 603eb4dd9..2ff346c7e 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -20,9 +20,9 @@ foreign gdi32 { CreateDIBPatternBrush :: proc(h: HGLOBAL, iUsage: UINT) -> HBRUSH --- CreateBitmap :: proc(nWidth: INT, nHeight: INT, nPlanes: UINT, nBitCount: UINT, lpBits: LPVOID) -> HBITMAP --- - CreateDIBitmap :: proc(hdc: HDC, pbmih: ^BITMAPINFOHEADER, flInit: DWORD, pjBits: VOID, pbmi: ^BITMAPINFO, iUsage: UINT) -> HBITMAP --- - CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: ^^VOID, hSection: HANDLE, offset: DWORD) -> HBITMAP --- - StretchDIBits :: proc(hdc: HDC, xDest, yDest, DestWidth, DestHeight, xSrc, ySrc, SrcWidth, SrcHeight: INT, lpBits: VOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT --- + CreateDIBitmap :: proc(hdc: HDC, pbmih: ^BITMAPINFOHEADER, flInit: DWORD, pjBits: PVOID, pbmi: ^BITMAPINFO, iUsage: UINT) -> HBITMAP --- + CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: ^PVOID, hSection: HANDLE, offset: DWORD) -> HBITMAP --- + StretchDIBits :: proc(hdc: HDC, xDest, yDest, DestWidth, DestHeight, xSrc, ySrc, SrcWidth, SrcHeight: INT, lpBits: LPVOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT --- StretchBlt :: proc(hdcDest: HDC, xDest, yDest, wDest, hDest: INT, hdcSrc: HDC, xSrc, ySrc, wSrc, hSrc: INT, rop: DWORD) -> BOOL --- SetPixelFormat :: proc(hdc: HDC, format: INT, ppfd: ^PIXELFORMATDESCRIPTOR) -> BOOL --- @@ -54,7 +54,7 @@ foreign gdi32 { CreateCompatibleBitmap :: proc(hdc: HDC, cx, cy: INT) -> HBITMAP --- BitBlt :: proc(hdc: HDC, x, y, cx, cy: INT, hdcSrc: HDC, x1, y1: INT, rop: DWORD) -> BOOL --- GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> INT --- - SetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start: UINT, cLines: UINT, lpBits: VOID, lpbmi: ^BITMAPINFO, ColorUse: UINT) -> INT --- + SetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start: UINT, cLines: UINT, lpBits: PVOID, lpbmi: ^BITMAPINFO, ColorUse: UINT) -> INT --- SetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- GetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- From 4c981ad10ac1c23bbd74f626d96fbf44a6252d52 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Mon, 2 Mar 2026 21:21:50 +0100 Subject: [PATCH 023/273] Fix return value of FreeLibraryAndExitThread --- core/sys/windows/kernel32.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 670484489..4c4407b7b 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -539,7 +539,7 @@ foreign kernel32 { LoadLibraryW :: proc(c_str: LPCWSTR) -> HMODULE --- LoadLibraryExW :: proc(c_str: LPCWSTR, hFile: HANDLE, dwFlags: LoadLibraryEx_Flags) -> HMODULE --- FreeLibrary :: proc(h: HMODULE) -> BOOL --- - FreeLibraryAndExitThread :: proc(hLibModule: HMODULE, dwExitCode: DWORD) -> VOID --- + FreeLibraryAndExitThread :: proc(hLibModule: HMODULE, dwExitCode: DWORD) --- GetProcAddress :: proc(h: HMODULE, c_str: LPCSTR) -> rawptr --- LoadResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> HGLOBAL --- From 4ab536a85a5ddda52ae9882184fc616ffb553f7c Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Tue, 24 Feb 2026 16:39:16 +0100 Subject: [PATCH 024/273] Drop pointless code Modifies a local variable after it was stored in an out parameter, so this modification has no effect. --- src/parser.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 5ada6d298..a79e39a51 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1434,9 +1434,6 @@ gb_internal Token consume_comment(AstFile *f, isize *end_line_) { if (end_line_) *end_line_ = end_line; next_token0(f); - if (f->curr_token.pos.line > tok.pos.line || tok.kind == Token_EOF) { - end_line++; - } return tok; } From b8f2daa5b2359b349796fe0bc1f5f74dcd4fc0ec Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Mon, 2 Mar 2026 21:14:50 +0100 Subject: [PATCH 025/273] Kill deprecated file tags We had the recommended form of file tags for long enough. Also there were some issues with the deprecated file tags - they were ignored if the appeared after recommended file tags, and could possibly show up in package docs. --- src/parser.cpp | 37 ++++++------------------------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index a79e39a51..833e9ea9f 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6790,37 +6790,12 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { } f->package_name = package_name.string; - { - if (docs != nullptr && docs->list.count > 0) { - for (Token const &tok : docs->list) { - GB_ASSERT(tok.kind == Token_Comment); - String str = tok.string; - - if (!string_starts_with(str, str_lit("//"))) { - continue; - } - - String lc = string_trim_whitespace(substring(str, 2, str.len)); - if (string_starts_with(lc, str_lit("+"))) { - syntax_warning(tok, "'//+' is deprecated: Use '#+' instead"); - String lt = substring(lc, 1, lc.len); - if (parse_file_tag(lt, tok, f) == false) { - return false; - } - } - } - } - - for (Token const &tok : tags) { - GB_ASSERT(tok.kind == Token_FileTag); - String str = tok.string; - - if (string_starts_with(str, str_lit("#+"))) { - String lt = string_trim_whitespace(substring(str, 2, str.len)); - if (parse_file_tag(lt, tok, f) == false) { - return false; - } - } + for (Token const &tok : tags) { + GB_ASSERT(tok.kind == Token_FileTag); + GB_ASSERT(string_starts_with(tok.string, str_lit("#+"))); + String lt = string_trim_whitespace(substring(tok.string, 2, tok.string.len)); + if (parse_file_tag(lt, tok, f) == false) { + return false; } } From 1f00da471cc223488cf333f5361445e120c51bbf Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Tue, 24 Feb 2026 16:31:16 +0100 Subject: [PATCH 026/273] Make sure to assign proper comment as package docs So far, the first comment found was marked as package docs, which meant that for the following code, the TODO comment would be assigned to the package declaration instead of the comment directly preceding the package declaration. // TODO: drop after finished with refactoring #+ feature using-stmt // Package foo implements this and that. package foo --- src/parser.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 833e9ea9f..84fbc5130 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6725,11 +6725,6 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { String filepath = f->tokenizer.fullpath; String base_dir = dir_from_path(filepath); - if (f->curr_token.kind == Token_Comment) { - consume_comment_groups(f, f->prev_token); - } - - CommentGroup *docs = f->lead_comment; Array tags = array_make(temporary_allocator()); bool first_invalid_token_set = false; @@ -6751,6 +6746,8 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { } } + CommentGroup *docs = f->lead_comment; + if (f->curr_token.kind != Token_package) { ERROR_BLOCK(); From 47ad434d1abc470119ce9280dc39615e730a21f4 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Tue, 3 Mar 2026 20:50:07 +0900 Subject: [PATCH 027/273] core:crypto/_blake2: Fix final blocks call with partial block --- core/crypto/_blake2/blake2.odin | 35 +++++++++------------------------ 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/core/crypto/_blake2/blake2.odin b/core/crypto/_blake2/blake2.odin index 4e8fd0a6a..6c3ad0635 100644 --- a/core/crypto/_blake2/blake2.odin +++ b/core/crypto/_blake2/blake2.odin @@ -11,6 +11,7 @@ package _blake2 */ import "base:intrinsics" +import "core:crypto" import "core:encoding/endian" BLAKE2S_BLOCK_SIZE :: 64 @@ -133,7 +134,7 @@ init :: proc "contextless" (ctx: ^$T, cfg: ^Blake2_Config) { p[17] = cfg.tree.(Blake2_Tree).inner_hash_size } } else { - p[2], p[3] = 1, 1 + p[2], p[3], p[4], p[5], p[6], p[7] = 1, 1, 0, 0, 0, 0 } ctx.size = cfg.size for i := 0; i < 8; i += 1 { @@ -222,7 +223,7 @@ reset :: proc "contextless" (ctx: ^$T) { return } - zero_explicit(ctx, size_of(ctx^)) + crypto.zero_explicit(ctx, size_of(ctx^)) } @(private) @@ -244,6 +245,9 @@ blake2s_final :: proc "contextless" (ctx: ^Blake2s_Context, hash: []byte) { ctx.f[1] = 0xffffffff } + for i := ctx.nx; i < BLAKE2S_BLOCK_SIZE; i+= 1 { + ctx.x[i] = 0 + } blocks(ctx, ctx.x[:]) dst: [BLAKE2S_SIZE]byte @@ -272,6 +276,9 @@ blake2b_final :: proc "contextless" (ctx: ^Blake2b_Context, hash: []byte) { ctx.f[1] = 0xffffffffffffffff } + for i := ctx.nx; i < BLAKE2B_BLOCK_SIZE; i+= 1 { + ctx.x[i] = 0 + } blocks(ctx, ctx.x[:]) dst: [BLAKE2B_SIZE]byte @@ -2877,27 +2884,3 @@ blake2b_blocks :: #force_inline proc "contextless" (ctx: ^Blake2b_Context, p: [] ctx.h[0], ctx.h[1], ctx.h[2], ctx.h[3], ctx.h[4], ctx.h[5], ctx.h[6], ctx.h[7] = h0, h1, h2, h3, h4, h5, h6, h7 } - -/* -Set each byte of a memory range to zero. - -This procedure copies the value `0` into the `len` bytes of a memory range, -starting at address `data`. - -This procedure returns the pointer to `data`. - -Unlike the `zero()` procedure, which can be optimized away or reordered by the -compiler under certain circumstances, `zero_explicit()` procedure can not be -optimized away or reordered with other memory access operations, and the -compiler assumes volatile semantics of the memory. -*/ -@(private) -zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { - // This routine tries to avoid the compiler optimizing away the call, - // so that it is always executed. It is intended to provide - // equivalent semantics to those provided by the C11 Annex K 3.7.4.1 - // memset_s call. - intrinsics.mem_zero_volatile(data, len) // Use the volatile mem_zero - intrinsics.atomic_thread_fence(.Seq_Cst) // Prevent reordering - return data -} \ No newline at end of file From a5e1eb56abe72cc149369f4793b444fdc62431ee Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 3 Mar 2026 12:26:42 +0000 Subject: [PATCH 028/273] Add `explicit_underlying: bool` RTTI field for `bit_set`; add `runtime.type_info_underlying` --- base/runtime/core.odin | 34 ++++++++++++++++++++++++++++++---- base/runtime/print.odin | 4 ++-- core/odin/ast/walk.odin | 4 +--- core/reflect/types.odin | 17 ++++------------- src/llvm_backend_type.cpp | 20 +++++++++++++++----- 5 files changed, 52 insertions(+), 27 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 5a0b3766c..d8104b1ec 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -166,10 +166,11 @@ Type_Info_Map :: struct { map_info: ^Map_Info, } Type_Info_Bit_Set :: struct { - elem: ^Type_Info, - underlying: ^Type_Info, // Possibly nil - lower: i64, - upper: i64, + elem: ^Type_Info, + underlying: ^Type_Info, + explicit_underlying: bool, // false = bit_set[T], true = bit_set[T, U] + lower: i64, + upper: i64, } Type_Info_Simd_Vector :: struct { elem: ^Type_Info, @@ -676,6 +677,26 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { return base } +@(require_results) +type_info_underlying :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { + if info == nil { + return nil + } + + base := info + loop: for { + #partial switch i in base.variant { + case Type_Info_Named: base = i.base + case Type_Info_Enum: base = i.base + case Type_Info_Bit_Set: base = i.underlying + case Type_Info_Bit_Field: base = i.backing_type + case: + break loop + } + } + return base +} + // type_info_base_without_enum returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `^Type_Info`. // This is also aliased as `type_info_core` @@ -713,6 +734,11 @@ when !ODIN_NO_RTTI { // returns the backing integer type of an enum or bit_set `typeid`. // This is also aliased as `typeid_core` typeid_base_without_enum :: typeid_core + + typeid_underlying :: proc "contextless" (id: typeid) -> typeid { + ti := type_info_underlying(type_info_of(id)) + return ti.id + } } diff --git a/base/runtime/print.odin b/base/runtime/print.odin index 2cdde8152..6569ece6c 100644 --- a/base/runtime/print.odin +++ b/base/runtime/print.odin @@ -478,7 +478,7 @@ print_type :: #force_no_inline proc "contextless" (ti: ^Type_Info) { print_string("..") print_i64(info.upper) } - if info.underlying != nil { + if info.explicit_underlying { print_string("; ") print_type(info.underlying) } @@ -893,7 +893,7 @@ write_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, t write_string(i, buf, "..") or_return write_i64 (i, buf, info.upper) or_return } - if info.underlying != nil { + if info.explicit_underlying { write_string (i, buf, "; ") or_return write_write_type(i, buf, info.underlying) or_return } diff --git a/core/odin/ast/walk.odin b/core/odin/ast/walk.odin index 24c90c13b..5b9340c62 100644 --- a/core/odin/ast/walk.odin +++ b/core/odin/ast/walk.odin @@ -405,9 +405,7 @@ walk :: proc(v: ^Visitor, node: ^Node) { walk_expr_list(v, n.fields) case ^Bit_Set_Type: walk(v, n.elem) - if n.underlying != nil { - walk(v, n.underlying) - } + walk(v, n.underlying) case ^Map_Type: walk(v, n.key) walk(v, n.value) diff --git a/core/reflect/types.odin b/core/reflect/types.odin index 385edb19b..53561281f 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -442,10 +442,7 @@ is_endian_platform :: proc(info: ^Type_Info) -> bool { case Type_Info_Integer: return v.endianness == .Platform case Type_Info_Bit_Set: - if v.underlying != nil { - return is_endian_platform(v.underlying) - } - return true + return is_endian_platform(v.underlying) case Type_Info_Pointer: return true } @@ -467,10 +464,7 @@ is_endian_little :: proc(info: ^Type_Info) -> bool { } return v.endianness == .Little case Type_Info_Bit_Set: - if v.underlying != nil { - return is_endian_platform(v.underlying) - } - return ODIN_ENDIAN == .Little + return is_endian_little(v.underlying) case Type_Info_Pointer: return ODIN_ENDIAN == .Little } @@ -492,10 +486,7 @@ is_endian_big :: proc(info: ^Type_Info) -> bool { } return v.endianness == .Big case Type_Info_Bit_Set: - if v.underlying != nil { - return is_endian_platform(v.underlying) - } - return ODIN_ENDIAN == .Big + return is_endian_big(v.underlying) case Type_Info_Pointer: return ODIN_ENDIAN == .Big } @@ -754,7 +745,7 @@ write_type_writer :: #force_no_inline proc(w: io.Writer, ti: ^Type_Info, n_writt io.write_string(w, "..=", &n) or_return io.write_i64(w, info.upper, 10, &n) or_return } - if info.underlying != nil { + if info.explicit_underlying { io.write_string(w, "; ", &n) or_return write_type(w, info.underlying, &n) or_return } diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 382304a4e..89c671f7d 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -923,15 +923,25 @@ gb_internal void lb_setup_type_info_data_giant_array(lbModule *m, i64 global_typ GB_ASSERT(is_type_typed(t->BitSet.elem)); - LLVMValueRef vals[4] = { - get_type_info_ptr(m, t->BitSet.elem), - LLVMConstNull(lb_type(m, t_type_info_ptr)), - lb_const_int(m, t_i64, t->BitSet.lower).value, - lb_const_int(m, t_i64, t->BitSet.upper).value, + LLVMValueRef vals[5] = { + get_type_info_ptr(m, t->BitSet.elem), // ^Type_Info + nullptr, // ^Type_Info + nullptr, // bool + lb_const_int(m, t_i64, t->BitSet.lower).value, // i64 + lb_const_int(m, t_i64, t->BitSet.upper).value, // i64 }; + Type *underlying = nullptr; + bool explicit_underlying = false; if (t->BitSet.underlying != nullptr) { + underlying = t->BitSet.underlying; + explicit_underlying = true; vals[1] = get_type_info_ptr(m, t->BitSet.underlying); + vals[2] = lb_const_bool(m, t_bool, true).value; + } else { + underlying = bit_set_to_int(t); } + vals[1] = get_type_info_ptr(m, underlying); + vals[2] = lb_const_bool(m, t_bool, explicit_underlying).value; variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); } From 2cb81559461c6fb0a2a50f77231768dd7c4c14df Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 3 Mar 2026 12:27:44 +0000 Subject: [PATCH 029/273] Add missing `@(require_results)` --- base/runtime/core.odin | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index d8104b1ec..3802bd6f0 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -702,6 +702,7 @@ type_info_underlying :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { // This is also aliased as `type_info_core` type_info_base_without_enum :: type_info_core +@(require_results) __type_info_of :: proc "contextless" (id: typeid) -> ^Type_Info #no_bounds_check { n := u64(len(type_table)) i := transmute(u64)id % n @@ -717,6 +718,7 @@ __type_info_of :: proc "contextless" (id: typeid) -> ^Type_Info #no_bounds_check when !ODIN_NO_RTTI { // typeid_base returns the base-type of a `typeid` stripping the `distinct`ness from the first level + @(require_results) typeid_base :: proc "contextless" (id: typeid) -> typeid { ti := type_info_of(id) ti = type_info_base(ti) @@ -725,6 +727,7 @@ when !ODIN_NO_RTTI { // typeid_core returns the core-type of a `typeid` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `typeid`. // This is also aliased as `typeid_base_without_enum` + @(require_results) typeid_core :: proc "contextless" (id: typeid) -> typeid { ti := type_info_core(type_info_of(id)) return ti.id @@ -735,6 +738,7 @@ when !ODIN_NO_RTTI { // This is also aliased as `typeid_core` typeid_base_without_enum :: typeid_core + @(require_results) typeid_underlying :: proc "contextless" (id: typeid) -> typeid { ti := type_info_underlying(type_info_of(id)) return ti.id From afbb0b4357e2675560d5505e606ad907ca424056 Mon Sep 17 00:00:00 2001 From: IllusionMan1212 Date: Tue, 3 Mar 2026 17:50:31 +0200 Subject: [PATCH 030/273] os: return `.Permission_Denied` for `.EACCES` in posix and linux --- core/os/errors_linux.odin | 2 +- core/os/errors_posix.odin | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/os/errors_linux.odin b/core/os/errors_linux.odin index 891b4177c..713c03359 100644 --- a/core/os/errors_linux.odin +++ b/core/os/errors_linux.odin @@ -148,7 +148,7 @@ _get_platform_error :: proc(errno: linux.Errno) -> Error { #partial switch errno { case .NONE: return nil - case .EPERM: + case .EPERM, .EACCES: return .Permission_Denied case .EEXIST: return .Exist diff --git a/core/os/errors_posix.odin b/core/os/errors_posix.odin index 5233fec1a..45bac931f 100644 --- a/core/os/errors_posix.odin +++ b/core/os/errors_posix.odin @@ -16,7 +16,7 @@ _get_platform_error_from_errno :: proc() -> Error { _get_platform_error_existing :: proc(errno: posix.Errno) -> Error { #partial switch errno { - case .EPERM: + case .EPERM, .EACCES: return .Permission_Denied case .EEXIST: return .Exist From b351b58ddc5946764ad8342378add8c8b5e2d3bc Mon Sep 17 00:00:00 2001 From: Franz Hoeltermann Date: Tue, 3 Mar 2026 17:22:31 +0100 Subject: [PATCH 031/273] Fix #6270 --- src/check_expr.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 7f0acb4c6..80df35edc 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3664,6 +3664,24 @@ gb_internal void check_cast(CheckerContext *c, Operand *x, Type *type, bool forb } } + if (is_const_expr) { + Type *src = core_type(x->type); + Type *dst = core_type(type); + + if (is_type_string(src) && is_type_string(dst)) { + bool src_utf16 = is_type_string16(src) || is_type_cstring16(src); + bool dst_utf16 = is_type_string16(dst) || is_type_cstring16(dst); + + if (!src_utf16 && dst_utf16) { + x->value = exact_value_string16(string_to_string16(permanent_allocator(), x->value.value_string)); + } + + if (src_utf16 && !dst_utf16) { + x->value = exact_value_string(string16_to_string(permanent_allocator(), x->value.value_string16)); + } + } + } + x->type = type; } From 1a5126c6b793ada0290984e66eedef5377e18838 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 4 Mar 2026 00:29:37 +0100 Subject: [PATCH 032/273] Make CI less nervous. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67c047472..8735945b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -140,7 +140,7 @@ jobs: - name: Optimized Core library tests run: ./odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Wycheproof tests - run: ./odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed -microarch:native + run: ./odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed - name: Vendor library tests run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Internals tests From 058bd9a91459af449c0ff89e38e25ada0ac852a8 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Wed, 4 Mar 2026 20:07:52 +0900 Subject: [PATCH 033/273] core:crypto/_blake2: Cleanups and fixes The fixes apply to "use it as a MAC" which was not part of the documented/exposed API. It now is, and is covered by the self-test routines from the RFC. --- core/crypto/_blake2/blake2.odin | 55 ++------ core/crypto/blake2b/blake2b.odin | 13 +- core/crypto/blake2s/blake2s.odin | 13 +- tests/core/crypto/test_core_crypto_hash.odin | 140 ++++++++++++++++++- 4 files changed, 178 insertions(+), 43 deletions(-) diff --git a/core/crypto/_blake2/blake2.odin b/core/crypto/_blake2/blake2.odin index 6c3ad0635..cf7111c70 100644 --- a/core/crypto/_blake2/blake2.odin +++ b/core/crypto/_blake2/blake2.odin @@ -19,17 +19,12 @@ BLAKE2S_SIZE :: 32 BLAKE2B_BLOCK_SIZE :: 128 BLAKE2B_SIZE :: 64 -MAX_SIZE :: 255 - Blake2s_Context :: struct { h: [8]u32, t: [2]u32, f: [2]u32, x: [BLAKE2S_BLOCK_SIZE]byte, nx: int, - ih: [8]u32, - padded_key: [BLAKE2S_BLOCK_SIZE]byte, - is_keyed: bool, size: byte, is_last_node: bool, @@ -42,9 +37,6 @@ Blake2b_Context :: struct { f: [2]u64, x: [BLAKE2B_BLOCK_SIZE]byte, nx: int, - ih: [8]u64, - padded_key: [BLAKE2B_BLOCK_SIZE]byte, - is_keyed: bool, size: byte, is_last_node: bool, @@ -87,11 +79,12 @@ BLAKE2B_IV := [8]u64 { init :: proc "contextless" (ctx: ^$T, cfg: ^Blake2_Config) { when T == Blake2s_Context { - max_size :: BLAKE2S_SIZE + MAX_SIZE :: BLAKE2S_SIZE } else when T == Blake2b_Context { - max_size :: BLAKE2B_SIZE + MAX_SIZE :: BLAKE2B_SIZE } - ensure_contextless(cfg.size <= max_size, "blake2: requested output size exceeeds algorithm max") + ensure_contextless(cfg.size <= MAX_SIZE, "blake2: requested output size exceeeds algorithm max") + ensure_contextless(len(cfg.key) <= MAX_SIZE, "blake2: requested key size exceeeds algorithm max") // To save having to allocate a scratch buffer, use the internal // data buffer (`ctx.x`), as it is exactly the correct size. @@ -152,17 +145,11 @@ init :: proc "contextless" (ctx: ^$T, cfg: ^Blake2_Config) { ctx.is_last_node = true } if len(cfg.key) > 0 { - copy(ctx.padded_key[:], cfg.key) - update(ctx, ctx.padded_key[:]) - ctx.is_keyed = true + copy(ctx.x[:], cfg.key) + ctx.nx = len(ctx.x) + } else { + ctx.nx = 0 } - copy(ctx.ih[:], ctx.h[:]) - copy(ctx.h[:], ctx.ih[:]) - if ctx.is_keyed { - update(ctx, ctx.padded_key[:]) - } - - ctx.nx = 0 ctx.is_initialized = true } @@ -172,22 +159,22 @@ update :: proc "contextless" (ctx: ^$T, p: []byte) { p := p when T == Blake2s_Context { - block_size :: BLAKE2S_BLOCK_SIZE + BLOCK_SIZE :: BLAKE2S_BLOCK_SIZE } else when T == Blake2b_Context { - block_size :: BLAKE2B_BLOCK_SIZE + BLOCK_SIZE :: BLAKE2B_BLOCK_SIZE } - left := block_size - ctx.nx + left := BLOCK_SIZE - ctx.nx if len(p) > left { copy(ctx.x[ctx.nx:], p[:left]) p = p[left:] blocks(ctx, ctx.x[:]) ctx.nx = 0 } - if len(p) > block_size { - n := len(p) &~ (block_size - 1) + if len(p) > BLOCK_SIZE { + n := len(p) &~ (BLOCK_SIZE - 1) if n == len(p) { - n -= block_size + n -= BLOCK_SIZE } blocks(ctx, p[:n]) p = p[n:] @@ -228,12 +215,6 @@ reset :: proc "contextless" (ctx: ^$T) { @(private) blake2s_final :: proc "contextless" (ctx: ^Blake2s_Context, hash: []byte) { - if ctx.is_keyed { - for i := 0; i < len(ctx.padded_key); i += 1 { - ctx.padded_key[i] = 0 - } - } - dec := BLAKE2S_BLOCK_SIZE - u32(ctx.nx) if ctx.t[0] < dec { ctx.t[1] -= 1 @@ -254,17 +235,11 @@ blake2s_final :: proc "contextless" (ctx: ^Blake2s_Context, hash: []byte) { for i := 0; i < BLAKE2S_SIZE / 4; i += 1 { endian.unchecked_put_u32le(dst[i * 4:], ctx.h[i]) } - copy(hash, dst[:]) + copy(hash, dst[:ctx.size]) } @(private) blake2b_final :: proc "contextless" (ctx: ^Blake2b_Context, hash: []byte) { - if ctx.is_keyed { - for i := 0; i < len(ctx.padded_key); i += 1 { - ctx.padded_key[i] = 0 - } - } - dec := BLAKE2B_BLOCK_SIZE - u64(ctx.nx) if ctx.t[0] < dec { ctx.t[1] -= 1 diff --git a/core/crypto/blake2b/blake2b.odin b/core/crypto/blake2b/blake2b.odin index 4590ca40e..6c2c5c1e9 100644 --- a/core/crypto/blake2b/blake2b.odin +++ b/core/crypto/blake2b/blake2b.odin @@ -28,13 +28,24 @@ Context :: _blake2.Blake2b_Context // init initializes a Context with the default BLAKE2b config. init :: proc(ctx: ^Context, digest_size := DIGEST_SIZE) { - ensure(digest_size <= _blake2.MAX_SIZE, "crypto/blake2b: invalid digest size") + ensure(digest_size <= DIGEST_SIZE, "crypto/blake2b: invalid digest size") cfg: _blake2.Blake2_Config cfg.size = u8(digest_size) _blake2.init(ctx, &cfg) } +// init_mac initializes a Context with a user provided key. +init_mac :: proc(ctx: ^Context, key: []byte, digest_size := DIGEST_SIZE) { + ensure(digest_size <= DIGEST_SIZE, "crypto/blake2b: invalid digest size") + ensure(len(key) <= DIGEST_SIZE, "crypto/blake2b: invalid key size") + + cfg: _blake2.Blake2_Config + cfg.size = u8(digest_size) + cfg.key = key + _blake2.init(ctx, &cfg) +} + // update adds more data to the Context. update :: proc(ctx: ^Context, data: []byte) { _blake2.update(ctx, data) diff --git a/core/crypto/blake2s/blake2s.odin b/core/crypto/blake2s/blake2s.odin index 37da53360..902f992b3 100644 --- a/core/crypto/blake2s/blake2s.odin +++ b/core/crypto/blake2s/blake2s.odin @@ -28,13 +28,24 @@ Context :: _blake2.Blake2s_Context // init initializes a Context with the default BLAKE2s config. init :: proc(ctx: ^Context, digest_size := DIGEST_SIZE) { - ensure(digest_size <= _blake2.MAX_SIZE, "crypto/blake2s: invalid digest size") + ensure(digest_size <= DIGEST_SIZE, "crypto/blake2s: invalid digest size") cfg: _blake2.Blake2_Config cfg.size = u8(digest_size) _blake2.init(ctx, &cfg) } +// init_mac initializes a Context with a user provided key. +init_mac :: proc(ctx: ^Context, key: []byte, digest_size := DIGEST_SIZE) { + ensure(digest_size <= DIGEST_SIZE, "crypto/blake2s: invalid digest size") + ensure(len(key) <= DIGEST_SIZE, "crypto/blake2s: invalid key size") + + cfg: _blake2.Blake2_Config + cfg.size = u8(digest_size) + cfg.key = key + _blake2.init(ctx, &cfg) +} + // update adds more data to the Context. update :: proc(ctx: ^Context, data: []byte) { _blake2.update(ctx, data) diff --git a/tests/core/crypto/test_core_crypto_hash.odin b/tests/core/crypto/test_core_crypto_hash.odin index 9a9d0cc76..805f3528a 100644 --- a/tests/core/crypto/test_core_crypto_hash.odin +++ b/tests/core/crypto/test_core_crypto_hash.odin @@ -5,6 +5,9 @@ import "core:bytes" import "core:encoding/hex" import "core:strings" import "core:testing" + +import "core:crypto/blake2b" +import "core:crypto/blake2s" import "core:crypto/hash" @(test) @@ -596,4 +599,139 @@ test_hash :: proc(t: ^testing.T) { c_str, ) } -} \ No newline at end of file +} + +@(private="file") +selftest_seq :: proc(dst: []byte, seed: u32) { + a := 0xdead4bad * seed + b: u32 = 1 + + for i in 0 ..< len(dst) { + a, b = b, a + b + dst[i] = byte(b >> 24) + } +} + +@(test) +test_blake2b_self :: proc(t: ^testing.T) { + expected := []byte{ + 0xC2, 0x3A, 0x78, 0x00, 0xD9, 0x81, 0x23, 0xBD, + 0x10, 0xF5, 0x06, 0xC6, 0x1E, 0x29, 0xDA, 0x56, + 0x03, 0xD7, 0x63, 0xB8, 0xBB, 0xAD, 0x2E, 0x73, + 0x7F, 0x5E, 0x76, 0x5A, 0x7B, 0xCC, 0xD4, 0x75, + } + md_lens := []int{20, 32, 48, 64} + src_lens := []int{0, 3, 128, 129, 255, 1024} + + b2b := proc(dst, src: []byte) { + ctx: blake2b.Context + + blake2b.init(&ctx, len(dst)) + blake2b.update(&ctx, src) + blake2b.final(&ctx, dst) + } + b2b_keyed := proc(dst, key, src: []byte) { + ctx: blake2b.Context + + blake2b.init_mac(&ctx, key, len(dst)) + blake2b.update(&ctx, src) + blake2b.final(&ctx, dst) + } + + buf: [1024]byte + md, key: [64]byte + + ctx: blake2b.Context + blake2b.init(&ctx, 32) + + for md_len in md_lens { + dst := md[:md_len] + for src_len in src_lens { + src := buf[:src_len] + + selftest_seq(src, u32(src_len)) + b2b(dst, src) + blake2b.update(&ctx, dst) + + k := key[:md_len] + selftest_seq(k, u32(md_len)) + b2b_keyed(dst, k, src) + blake2b.update(&ctx, dst) + } + } + + blake2b.final(&ctx, md[:32]) + + expected_str := string(hex.encode(expected, context.temp_allocator)) + actual_str := string(hex.encode(md[:32], context.temp_allocator)) + + testing.expectf( + t, + expected_str == actual_str, + "blake2b/self-test: Expected: %s Got %s", + expected_str, + actual_str, + ) +} + +@(test) +test_blake2s_self :: proc(t: ^testing.T) { + expected := []byte{ + 0x6A, 0x41, 0x1F, 0x08, 0xCE, 0x25, 0xAD, 0xCD, + 0xFB, 0x02, 0xAB, 0xA6, 0x41, 0x45, 0x1C, 0xEC, + 0x53, 0xC5, 0x98, 0xB2, 0x4F, 0x4F, 0xC7, 0x87, + 0xFB, 0xDC, 0x88, 0x79, 0x7F, 0x4C, 0x1D, 0xFE, + } + md_lens := []int{16, 20, 28, 32} + src_lens := []int{0, 3, 64, 65, 255, 1024} + + b2s := proc(dst, src: []byte) { + ctx: blake2s.Context + + blake2s.init(&ctx, len(dst)) + blake2s.update(&ctx, src) + blake2s.final(&ctx, dst) + } + b2s_keyed := proc(dst, key, src: []byte) { + ctx: blake2s.Context + + blake2s.init_mac(&ctx, key, len(dst)) + blake2s.update(&ctx, src) + blake2s.final(&ctx, dst) + } + + buf: [1024]byte + md, key: [32]byte + + ctx: blake2s.Context + blake2s.init(&ctx) + + for md_len in md_lens { + dst := md[:md_len] + for src_len in src_lens { + src := buf[:src_len] + + selftest_seq(src, u32(src_len)) + b2s(dst, src) + blake2s.update(&ctx, dst) + + k := key[:md_len] + selftest_seq(k, u32(md_len)) + b2s_keyed(dst, k, src) + blake2s.update(&ctx, dst) + } + } + + blake2s.final(&ctx, md[:]) + + expected_str := string(hex.encode(expected, context.temp_allocator)) + actual_str := string(hex.encode(md[:], context.temp_allocator)) + + testing.expectf( + t, + expected_str == actual_str, + "blake2s/self-test: Expected: %s Got %s", + expected_str, + actual_str, + ) +} From 86b629ba8415be86ad12f6a542b3f1cb8e3d99ee Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 18 Jan 2025 11:44:21 +0900 Subject: [PATCH 034/273] core/crypto/argon2id: Initial import --- core/crypto/argon2id/argon2id.odin | 622 +++++++++++++++++++ examples/all/all_js.odin | 1 + examples/all/all_main.odin | 1 + tests/core/crypto/test_core_crypto_hash.odin | 4 +- tests/core/crypto/test_core_crypto_kdf.odin | 53 ++ 5 files changed, 679 insertions(+), 2 deletions(-) create mode 100644 core/crypto/argon2id/argon2id.odin diff --git a/core/crypto/argon2id/argon2id.odin b/core/crypto/argon2id/argon2id.odin new file mode 100644 index 000000000..3bff5a3a9 --- /dev/null +++ b/core/crypto/argon2id/argon2id.odin @@ -0,0 +1,622 @@ +/* +package argon2id implements the Argon2id password hashing algorithm. + +See: [[ https://datatracker.ietf.org/doc/rfc9106/ ]] +*/ +package argon2id + +import "core:crypto/blake2b" +import "core:encoding/endian" +import "core:math/bits" +import "core:mem" + +// Implementation based on the RFC, Monocypher (CC0-1.0), and the reference +// code (CC0-1.0). + +// MAX_INPUT_SIZE is the mamximum size of the various inputs (password, +// salt, secret, ad) in bytes. +MAX_INPUT_SIZE :: (1 << 32) - 1 + +// MIN_PARALLELISM is the minimum allowed parallelism. +MIN_PARALLELISM :: 1 +// MAX_PARALLELISM is the maximum allowed parallelism. +MAX_PARALLELISM :: (1 << 24) - 1 + +// MIN_TAG_SIZE is the minimum digest size in bytes. +MIN_TAG_SIZE :: 4 +// MAX_TAG_SIZE is the maximum digest size in bytes. +MAX_TAG_SIZE :: (1 << 32) - 1 + +// RECOMMENDED_TAG_SIZE is the recommended tag size in bytes. +RECOMMENTED_TAG_SIZE :: 32 // 256-bits +// RECOMMENDNED_SALT_SIZE is the recommended salt size in bytes. +RECOMMENDED_SALT_SIZE :: 16 // 128-bits + +@(private) +V_RFC9106 :: 0x13 +@(private) +Y_ID :: 0x02 +@(private) +BLOCK_SIZE_BYTES :: 1024 +@(private) +BLOCK_SIZE_U64 :: 128 + +// PARAMS_RFC9106 is the first recommended "uniformly safe" parameter set +// per RFC 9106. +@(rodata) +PARAMS_RFC9106 := Parameters{ + memory_size = 2 * 1024 * 1024, // 2 GiB + passes = 1, + parallelism = 4, +} + +// PARAMS_RFC9106_SMALL is the second recommended "uniformly safe" parameter +// set per RFC 9106 tailored for memory constrained environments. +@(rodata) +PARAMS_RFC9106_SMALL := Parameters{ + memory_size = 64 * 1024, // 64 MiB + passes = 3, + parallelism = 4, +} + +// PARAMS_OWASP is one of the recommended parameter set from the OWASP +// Password Storage Cheat Sheet (as of 2026/02). The cheat sheet contains +// additional variations to this parameter set with various trade-offs +// between `memory_size` and `passes` that are intended to provide +// equivalent security. +// +// See: [[ https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html ]] +@(rodata) +PARAMS_OWASP := Parameters{ + memory_size = 19 * 1024, // 19 MiB + passes = 2, + parallelism = 1, +} + +// PARAMS_OWASP_SMALL is equivalent in strength to PARAMS_OWASP, but +// trades off less memory use for more CPU usage. +@(rodata) +PARAMS_OWASP_SMALL := Parameters{ + memory_size = 7 * 1024, // 7 MiB + passes = 5, + parallelism = 1, +} + +// Parameters is an Argon2id parameter set. +Parameters :: struct { + memory_size: u32, // m (KiB) + passes: u32, // t + parallelism: u32, // p +} + +@(private) +Block :: [BLOCK_SIZE_U64]u64 + +// derive invokes Argon2id with the specified parameter set and inputs, +// and outputs the derived key to dst. +@(require_results) +derive :: proc( + parameters: ^Parameters, + password: []byte, // P + salt: []byte, // S + dst: []byte, + secret: []byte = nil, // K (aka `pepper`) + ad: []byte = nil, // X + sanitize := true, + allocator := context.allocator, // Not temp as this can be large. +) -> mem.Allocator_Error #no_bounds_check { + if u64(len(password)) > MAX_INPUT_SIZE { + panic("crypto/argon2id: invalid password size") + } + if u64(len(salt)) > MAX_INPUT_SIZE { + panic("crypto/argon2id: invalid salt size") + } + if u64(len(secret)) > MAX_INPUT_SIZE { + panic("crypto/argon2id: invalid secret size") + } + if u64(len(ad)) > MAX_INPUT_SIZE { + panic("crypto/argon2id: invalid ad size") + } + if l := u64(len(dst)); l > MAX_TAG_SIZE || l < MIN_TAG_SIZE { + panic("crypto/argon2id: invalid dst size") + } + + p, t, m := parameters.parallelism, parameters.passes, u64(parameters.memory_size) + if p < MIN_PARALLELISM || p > MAX_PARALLELISM { + panic("crypto/argon2id: invalid parallelism") + } + if t < 1 { + panic("crypto/argon2id: invalid passes") + } + if m < 8 * u64(p) { + panic("crypto/argon2id: insufficient memory size") + } + if m * BLOCK_SIZE_BYTES > u64(max(int)) { + panic("crypto/argon2id: excessive memory size") + } + + // Allocate the memory as m' 1024-byte blocks, where m' is derived as: + // m' = 4 * p * floor (m / 4p) + // + // For p lanes, the memory is organized in a matrix B[i][j] of + // blocks with p rows (lanes) and q = m' / p columns. + m_ := 4 * u64(p) * (m / u64(4 * p)) + b := mem.alloc_bytes_non_zeroed( + int(m_) * BLOCK_SIZE_BYTES, + alignment = mem.DEFAULT_PAGE_SIZE, + allocator = allocator, + ) or_return + defer delete(b, allocator) + + block_buf: [BLOCK_SIZE_BYTES]byte = --- + + blocks := ([^]Block)(raw_data(b))[:m_] + segment_size := u32(m_ / u64(p) / 4) + lane_size := segment_size * 4 + + // Establish H_0 as the 64-byte value as shown below. If K, X, or S + // has zero length, it is just absent, but its length field remains. + // + // H_0 = H^(64)(LE32(p) || LE32(T) || LE32(m) || LE32(t) || + // LE32(v) || LE32(y) || LE32(length(P)) || P || + // LE32(length(S)) || S || LE32(length(K)) || K || + // LE32(length(X)) || X) + { + ctx: blake2b.Context + blake2b.init(&ctx) + + blake2b_update_u32le(&ctx, u32(p)) + blake2b_update_u32le(&ctx, u32(len(dst))) + blake2b_update_u32le(&ctx, parameters.memory_size) + blake2b_update_u32le(&ctx, t) + blake2b_update_u32le(&ctx, V_RFC9106) + blake2b_update_u32le(&ctx, Y_ID) + blake2b_update_u32le(&ctx, u32(len(password))) + blake2b.update(&ctx, password) + blake2b_update_u32le(&ctx, u32(len(salt))) + blake2b.update(&ctx, salt) + blake2b_update_u32le(&ctx, u32(len(secret))) + blake2b.update(&ctx, secret) + blake2b_update_u32le(&ctx, u32(len(ad))) + blake2b.update(&ctx, ad) + + h_0: [blake2b.DIGEST_SIZE+8]byte + blake2b.final(&ctx, h_0[:blake2b.DIGEST_SIZE]) + + // Compute B[i][0] for all i ranging from (and including) 0 to (not + // including) p. + // + // B[i][0] = H'^(1024)(H_0 || LE32(0) || LE32(i)) + // + // Compute B[i][1] for all i ranging from (and including) 0 to (not + // including) p. + // + // B[i][1] = H'^(1024)(H_0 || LE32(1) || LE32(i)) + for l in u32(0) ..< p { + for i in u32(0) ..< 2 { + endian.unchecked_put_u32le(h_0[blake2b.DIGEST_SIZE:], i) // LE32({0,1}) + endian.unchecked_put_u32le(h_0[blake2b.DIGEST_SIZE+4:], l) // LE32(i) + h_prime(block_buf[:], h_0[:]) + blk := &blocks[l * lane_size + i] + for j in 0 ..< BLOCK_SIZE_U64 { + blk[j] = endian.unchecked_get_u64le(block_buf[j*8:]) + } + } + } + + mem.zero_explicit(&h_0, size_of(h_0)) // No longer needed. + } + + // Compute B[i][j] for all i ranging from (and including) 0 to (not + // including) p and for all j ranging from (and including) 2 to (not + // including) q. The computation MUST proceed slicewise + // (Section 3.4): first, blocks from slice 0 are computed for all + // lanes (in an arbitrary order of lanes), then blocks from slice 1 + // are computed, etc. The block indices l and z are determined for + // each i, j differently for Argon2d, Argon2i, and Argon2id. + // + // B[i][j] = G(B[i][j-1], B[l][z]) + // + // If the number of passes t is larger than 1, we repeat step 5. We + // compute B[i][0] and B[i][j] for all i raging from (and including) + // 0 to (not including) p and for all j ranging from (and including) + // 1 to (not including) q. However, blocks are computed differently + // as the old value is XORed with the new one: + // + // B[i][0] = G(B[i][q-1], B[l][z]) XOR B[i][0]; + // B[i][j] = G(B[i][j-1], B[l][z]) XOR B[i][j]. + constant_time := true // Start with constant time indexing. + tmp, index_block: Block = ---, --- + for pass in u32(0) ..< t { + for slice in u32(0) ..< 4 { + // The first slice of the first pass has blocks 0 and 1 + // pre-filled. + pass_offset: u32 = pass == 0 && slice == 0 ? 2 : 0 + slice_offset := slice * segment_size + + // 3.4.1.3. Argon2id + // + // If the pass number is 0 and the slice number is 0 or 1, then compute + // J_1 and J_2 as for Argon2i, else compute J_1 and J_2 as for Argon2d. + if slice == 2 { + constant_time = false + } + + // Each segment can be processed in parallel, as long as + // each iteration of the loop completes before proceeding + // to the next. For simplicity we do this in serial + // instead of using threads. + for segment in u32(0) ..< u32(p) { + index_ctr: u64 = 1 + for block in pass_offset ..< segment_size { + // Current and previous blocks (indexes, not pointers) + lane_offset := segment * lane_size + segment_start := lane_offset + slice_offset + current := segment_start + block + previous := segment_start - 1 + switch { + case block == 0 && slice_offset == 0: + previous += lane_size + case: + previous += block + } + + index_seed: u64 + if constant_time { + // 3.4.1.2. Argon2i + // + // For each segment, we do the following. First, we compute the value Z + // as: + // + // Z= ( LE64(r) || LE64(l) || LE64(sl) || LE64(m') || + // LE64(t) || LE64(y) ) + // + // Figure 11: Input to Compute J1,J2 in Argon2i + // + // where + // + // r: the pass number + // l: the lane number + // sl: the slice number + // m': the total number of memory blocks + // t: the total number of passes + // y: the Argon2 type (0 for Argon2d, 1 for Argon2i, 2 for Argon2id) + // + // Then we compute: + // + // q/(128*SL) 1024-byte values + // G(ZERO(1024),G(ZERO(1024), + // Z || LE64(1) || ZERO(968) )), + // G(ZERO(1024),G(ZERO(1024), + // Z || LE64(2) || ZERO(968) )),... , + // G(ZERO(1024),G(ZERO(1024), + // Z || LE64(q/(128*SL)) || ZERO(968) )), + // + // which are partitioned into q/(SL) 8-byte values X, which are viewed + // as X1||X2 and converted to J_1=int32(X1) and J_2=int32(X2). + // + // The values r, l, sl, m', t, y, and i are represented as 8 bytes in + // little endian. + if block == pass_offset || (block % 128) == 0 { + mem.zero(&index_block, size_of(index_block)) + index_block[0] = u64(pass) + index_block[1] = u64(segment) + index_block[2] = u64(slice) + index_block[3] = u64(lane_size * p) + index_block[4] = u64(t) // passes + index_block[5] = Y_ID + index_block[6] = index_ctr + index_ctr += 1 + + copy(tmp[:], index_block[:]) + g_rounds(&index_block) + xor_block(&index_block, &tmp) + copy(tmp[:], index_block[:]) + g_rounds(&index_block) + xor_block(&index_block, &tmp) + } + index_seed = index_block[block % 128] + } else { + // 3.4.1.1. Argon2d + // + // J_1 is given by the first 32 bits of block B[i][j-1], while J_2 is + // given by the next 32 bits of block B[i][j-1]: + // + // J_1 = int32(extract(B[i][j-1], 0)) + // J_2 = int32(extract(B[i][j-1], 1)) + // + // Figure 10: Deriving J1,J2 in Argon2d + index_seed = blocks[previous][0] + } + + // 3.4.2. Mapping J_1 and J_2 to Reference Block Index [l][z] + // + // The value of l = J_2 mod p gives the index of the lane from which the + // block will be taken. For the first pass (r=0) and the first slice + // (sl=0), the block is taken from the current lane. + // + // The set W contains the indices that are referenced according to the + // following rules: + // + // 1. If l is the current lane, then W includes the indices of all + // blocks in the last SL - 1 = 3 segments computed and finished, as + // well as the blocks computed in the current segment in the current + // pass excluding B[i][j-1]. + // + // 2. If l is not the current lane, then W includes the indices of all + // blocks in the last SL - 1 = 3 segments computed and finished in + // lane l. If B[i][j] is the first block of a segment, then the + // very last index from W is excluded. + // + // Then take a block from W with a nonuniform distribution over [0, |W|) + // using the following mapping: + // + // J_1 -> |W|(1 - J_1^2 / 2^(64)) + // + // Figure 12: Computing J1 + // + // To avoid floating point computation, the following approximation is + // used: + // + // x = J_1^2 / 2^(32) + // y = (|W| * x) / 2^(32) + // zz = |W| - 1 - y + // + // Figure 13: Computing J1, Part 2 + // + // Then take the zz-th index from W; it will be the z value for the + // reference block index [l][z]. + next_slice: u32 = ((slice + 1) % 4) * segment_size + window_start, nb_segments: u32 + lane := u32(index_seed >> 32) % p + switch { + case pass == 0: + nb_segments = slice + if slice == 0 { + lane = segment + } + case: + window_start = next_slice + nb_segments = 3 + } + window_size := nb_segments * segment_size + if lane == segment { + window_size += block - 1 + } else if block == 0 { + window_size += ~u32(0) + } + + j1 := index_seed & 0xffffffff + x := (j1 * j1) >> 32 + y := (u64(window_size) * x) >> 32 + z := (u64(window_size) - 1) - y + ref := u32((u64(window_start) + z) % u64(lane_size)) + reference: u32 = lane * lane_size + ref + + copy(tmp[:], blocks[previous][:]) + xor_block(&tmp, &blocks[reference]) + if pass == 0 { + copy(blocks[current][:], tmp[:]) + } else { + xor_block(&blocks[current], &tmp) + } + g_rounds(&tmp) + xor_block(&blocks[current], &tmp) + } + } + } + } + mem.zero_explicit(&tmp, size_of(tmp)) + mem.zero_explicit(&index_block, size_of(index_block)) + + // After t steps have been iterated, the final block C is computed + // as the XOR of the last column: + // + // C = B[0][q-1] XOR B[1][q-1] XOR ... XOR B[p-1][q-1] + idx := lane_size - 1 + last_block := &blocks[idx] + for _ in 1 ..< p { + idx += lane_size + next_block := &blocks[idx] + xor_block(next_block, last_block) + last_block = next_block + } + + for v, i in last_block { + endian.unchecked_put_u64le(block_buf[i*8:], v) + } + + // The output tag is computed as H'^T(C). + h_prime(dst, block_buf[:]) + mem.zero_explicit(&block_buf, size_of(block_buf)) + + // Sanitize the working memory. While the RFC implies that this is + // optional ("enable the memory-wiping option in the library call"), + // the reference code defaults to enabling it. + // + // An opt-out is provided, as this can get somewhat expensive when + // m gets large. + if sanitize { + mem.zero_explicit(raw_data(b), len(b)) + } + + return nil +} + +@(private) +xor_block :: #force_inline proc(dst, src: ^Block) { + for v, i in src { + dst[i] ~= v + } +} + +@(private) +blake2b_update_u32le :: #force_inline proc(ctx: ^blake2b.Context, i: u32) { + tmp: [4]byte = --- + endian.unchecked_put_u32le(tmp[:], i) + blake2b.update(ctx, tmp[:]) + mem.zero_explicit(&tmp, size_of(tmp)) // Probably overkill. +} + +// 3.3. Variable-Length Hash Function H' +// +// Let V_i be a 64-byte block and W_i be its first 32 bytes. Then we +// define function H' as follows: +// +// if T <= 64 +// H'^T(A) = H^T(LE32(T)||A) +// else +// r = ceil(T/32)-2 +// V_1 = H^(64)(LE32(T)||A) +// V_2 = H^(64)(V_1) +// ... +// V_r = H^(64)(V_{r-1}) +// V_{r+1} = H^(T-32*r)(V_{r}) +// H'^T(X) = W_1 || W_2 || ... || W_r || V_{r+1} +// +// Figure 8: Function H' for Tag and Initial Block Computations +@(private) +h_prime :: proc(dst, src: []byte) { + t := len(dst) + ctx: blake2b.Context + blake2b.init(&ctx, min(t, blake2b.DIGEST_SIZE)) + blake2b_update_u32le(&ctx, u32(t)) + blake2b.update(&ctx, src) + blake2b.final(&ctx, dst) + + if t > 64 { + r := u32((u64(t) + 31) >> 5) - 2 + i: u32 = 1 + off_in := 0 + off_out := 32 + for i < r { + blake2b.init(&ctx, blake2b.DIGEST_SIZE) + blake2b.update(&ctx, dst[off_in:off_in+64]) + blake2b.final(&ctx, dst[off_out:]) + i += 1 + off_in += 32 + off_out += 32 + } + blake2b.init(&ctx, t - int(32 * r)) + blake2b.update(&ctx, dst[off_in:off_in+64]) + blake2b.final(&ctx, dst[off_out:]) + } +} + +// GB(a, b, c, d) is defined as follows: +// +// a = (a + b + 2 * trunc(a) * trunc(b)) mod 2^(64) +// d = (d XOR a) >>> 32 +// c = (c + d + 2 * trunc(c) * trunc(d)) mod 2^(64) +// b = (b XOR c) >>> 24 +// +// a = (a + b + 2 * trunc(a) * trunc(b)) mod 2^(64) +// d = (d XOR a) >>> 16 +// c = (c + d + 2 * trunc(c) * trunc(d)) mod 2^(64) +// b = (b XOR c) >>> 63 +// +// Figure 19: Details of GB +// +// The modular additions in GB are combined with 64-bit multiplications. +// Multiplications are the only difference from the original BLAKE2b +// design. This choice is done to increase the circuit depth and thus +// the running time of ASIC implementations, while having roughly the +// same running time on CPUs thanks to parallelism and pipelining. +@(private,require_results) +gb :: #force_inline proc(a, b, c, d: u64) -> (u64, u64, u64, u64) { + a, b, c, d := a, b, c, d + + trunc := #force_inline proc(v: u64) -> u64 { + return u64(u32(v)) + } + + a += b + ((trunc(a) * trunc(b)) << 1) + d = bits.rotate_left64(d ~ a, 32) // >>> 32 + c += d + ((trunc(c) * trunc(d)) << 1) + b = bits.rotate_left64((b ~ c), 40) // >>> 24 + + a += b + ((trunc(a) * trunc(b)) << 1) + d = bits.rotate_left64(d ~ a, 48) // >>> 16 + c += d + ((trunc(c) * trunc(d)) << 1) + b = bits.rotate_left64((b ~ c), 1) // >>> 63 + + return a, b, c, d +} + +// 3.6. Permutation P +// +// Permutation P is based on the round function of BLAKE2b. The eight +// 16-byte inputs S_0, S_1, ... , S_7 are viewed as a 4x4 matrix of +// 64-bit words, where S_i = (v_{2*i+1} || v_{2*i}): +// +// v_0 v_1 v_2 v_3 +// v_4 v_5 v_6 v_7 +// v_8 v_9 v_10 v_11 +// v_12 v_13 v_14 v_15 +// +// Figure 17: Matrix Element Labeling +// +// It works as follows: +// +// GB(v_0, v_4, v_8, v_12) +// GB(v_1, v_5, v_9, v_13) +// GB(v_2, v_6, v_10, v_14) +// GB(v_3, v_7, v_11, v_15) +// +// GB(v_0, v_5, v_10, v_15) +// GB(v_1, v_6, v_11, v_12) +// GB(v_2, v_7, v_8, v_13) +// GB(v_3, v_4, v_9, v_14) +// +// Figure 18: Feeding Matrix Elements to GB +@(private,require_results) +perm_p :: #force_inline proc(v_0, v_1, v_2, v_3, v_4, v_5, v_6, v_7, v_8, v_9, v_10, v_11, v_12, v_13, v_14, v_15: u64) -> (u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64, u64) { + v_0, v_1, v_2, v_3, v_4, v_5, v_6, v_7, v_8, v_9, v_10, v_11, v_12, v_13, v_14, v_15 := v_0, v_1, v_2, v_3, v_4, v_5, v_6, v_7, v_8, v_9, v_10, v_11, v_12, v_13, v_14, v_15 + + v_0, v_4, v_8, v_12 = gb(v_0, v_4, v_8, v_12) + v_1, v_5, v_9, v_13 = gb(v_1, v_5, v_9, v_13) + v_2, v_6, v_10, v_14 = gb(v_2, v_6, v_10, v_14) + v_3, v_7, v_11, v_15 = gb(v_3, v_7, v_11, v_15) + + v_0, v_5, v_10, v_15 = gb(v_0, v_5, v_10, v_15) + v_1, v_6, v_11, v_12 = gb(v_1, v_6, v_11, v_12) + v_2, v_7, v_8, v_13 = gb(v_2, v_7, v_8, v_13) + v_3, v_4, v_9, v_14 = gb(v_3, v_4, v_9, v_14) + + return v_0, v_1, v_2, v_3, v_4, v_5, v_6, v_7, v_8, v_9, v_10, v_11, v_12, v_13, v_14, v_15 +} + +// 3.5. Compression Function G +// +// The compression function G is built upon the BLAKE2b-based +// transformation P. P operates on the 128-byte input, which can be +// viewed as eight 16-byte registers: +// +// P(A_0, A_1, ... ,A_7) = (B_0, B_1, ... ,B_7) +// +// Figure 14: Blake Round Function P +// +// The compression function G(X, Y) operates on two 1024-byte blocks X +// and Y. It first computes R = X XOR Y. Then R is viewed as an 8x8 +// matrix of 16-byte registers R_0, R_1, ... , R_63. Then P is first +// applied to each row, and then to each column to get Z: +// +// ( Q_0, Q_1, Q_2, ... , Q_7) <- P( R_0, R_1, R_2, ... , R_7) +// ( Q_8, Q_9, Q_10, ... , Q_15) <- P( R_8, R_9, R_10, ... , R_15) +// ... +// (Q_56, Q_57, Q_58, ... , Q_63) <- P(R_56, R_57, R_58, ... , R_63) +// ( Z_0, Z_8, Z_16, ... , Z_56) <- P( Q_0, Q_8, Q_16, ... , Q_56) +// ( Z_1, Z_9, Z_17, ... , Z_57) <- P( Q_1, Q_9, Q_17, ... , Q_57) +// ... +// ( Z_7, Z_15, Z 23, ... , Z_63) <- P( Q_7, Q_15, Q_23, ... , Q_63) +// +// Figure 15: Core of Compression Function G +@(private) +g_rounds :: proc(b: ^Block) { + for i := 0; i < 128; i += 16 { + b[i], b[i+1], b[i+2], b[i+3], b[i+4], b[i+5], b[i+6], b[i+7], b[i+8], b[i+9], b[i+10], b[i+11], b[i+12], b[i+13], b[i+14], b[i+15] = perm_p(b[i], b[i+1], b[i+2], b[i+3], b[i+4], b[i+5], b[i+6], b[i+7], b[i+8], b[i+9], b[i+10], b[i+11], b[i+12], b[i+13], b[i+14], b[i+15]) + } + for i := 0; i < 16; i += 2 { + b[i], b[i+1], b[i+16], b[i+17], b[i+32], b[i+33], b[i+48], b[i+49], b[i+64], b[i+65], b[i+80], b[i+81], b[i+96], b[i+97], b[i+112], b[i+113] = perm_p(b[i], b[i+1], b[i+16], b[i+17], b[i+32], b[i+33], b[i+48], b[i+49], b[i+64], b[i+65], b[i+80], b[i+81], b[i+96], b[i+97], b[i+112], b[i+113]) + } +} diff --git a/examples/all/all_js.odin b/examples/all/all_js.odin index 3a234ee4a..b5016f992 100644 --- a/examples/all/all_js.odin +++ b/examples/all/all_js.odin @@ -27,6 +27,7 @@ package all @(require) import "core:crypto/aead" @(require) import "core:crypto/aegis" @(require) import "core:crypto/aes" +@(require) import "core:crypto/argon2id" @(require) import "core:crypto/blake2b" @(require) import "core:crypto/blake2s" @(require) import "core:crypto/chacha20" diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 4e98048bf..65e4b917c 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -32,6 +32,7 @@ package all @(require) import "core:crypto/aead" @(require) import "core:crypto/aegis" @(require) import "core:crypto/aes" +@(require) import "core:crypto/argon2id" @(require) import "core:crypto/blake2b" @(require) import "core:crypto/blake2s" @(require) import "core:crypto/chacha20" diff --git a/tests/core/crypto/test_core_crypto_hash.odin b/tests/core/crypto/test_core_crypto_hash.odin index 805f3528a..76c2aef6a 100644 --- a/tests/core/crypto/test_core_crypto_hash.odin +++ b/tests/core/crypto/test_core_crypto_hash.odin @@ -621,7 +621,7 @@ test_blake2b_self :: proc(t: ^testing.T) { 0x7F, 0x5E, 0x76, 0x5A, 0x7B, 0xCC, 0xD4, 0x75, } md_lens := []int{20, 32, 48, 64} - src_lens := []int{0, 3, 128, 129, 255, 1024} + src_lens := []int{0, 3, 128, 129, 255, 1024} b2b := proc(dst, src: []byte) { ctx: blake2b.Context @@ -683,7 +683,7 @@ test_blake2s_self :: proc(t: ^testing.T) { 0xFB, 0xDC, 0x88, 0x79, 0x7F, 0x4C, 0x1D, 0xFE, } md_lens := []int{16, 20, 28, 32} - src_lens := []int{0, 3, 64, 65, 255, 1024} + src_lens := []int{0, 3, 64, 65, 255, 1024} b2s := proc(dst, src: []byte) { ctx: blake2s.Context diff --git a/tests/core/crypto/test_core_crypto_kdf.odin b/tests/core/crypto/test_core_crypto_kdf.odin index c15dc2206..d0266e4d1 100644 --- a/tests/core/crypto/test_core_crypto_kdf.odin +++ b/tests/core/crypto/test_core_crypto_kdf.odin @@ -3,10 +3,63 @@ package test_core_crypto import "base:runtime" import "core:encoding/hex" import "core:testing" +import "core:crypto/argon2id" import "core:crypto/hash" import "core:crypto/hkdf" import "core:crypto/pbkdf2" +@(test) +test_argon2id :: proc(t: ^testing.T) { + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() + + test_vectors := []struct { + params: ^argon2id.Parameters, + password: string, + salt: string, + secret: string, + ad: string, + tag: string, + } { + // RFC 9106 5.3. + { + &argon2id.Parameters{ + 32, + 3, + 4, + }, + "0101010101010101010101010101010101010101010101010101010101010101", + "02020202020202020202020202020202", + "0303030303030303", + "040404040404040404040404", + "0d640df58d78766c08c037a34a8b53c9d01ef0452d75b65eb52520e96b01e659", + }, + } + for v, _ in test_vectors { + tag := make([]byte, len(v.tag)/2, context.temp_allocator) + + password, _ := hex.decode(transmute([]byte)(v.password), context.temp_allocator) + salt, _ := hex.decode(transmute([]byte)(v.salt), context.temp_allocator) + secret, _ := hex.decode(transmute([]byte)(v.secret), context.temp_allocator) + ad, _ := hex.decode(transmute([]byte)(v.ad), context.temp_allocator) + + _ = argon2id.derive(v.params, password, salt, tag, secret, ad) + + tag_str := string(hex.encode(tag, context.temp_allocator)) + + testing.expectf( + t, + tag_str == v.tag, + "argon2id: Expected: %s for input of (%s, %s, %s, %s), but got %s instead", + v.tag, + v.password, + v.salt, + v.secret, + v.ad, + tag_str, + ) + } +} + @(test) test_hkdf :: proc(t: ^testing.T) { runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() From ed74233acebc40849e40af9ca8087a47bcf547c7 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 4 Mar 2026 14:55:11 +0100 Subject: [PATCH 035/273] Add `bit_set` to `runtime.type_info_core`. --- base/runtime/core.odin | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 3802bd6f0..d3779b776 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -656,7 +656,7 @@ type_info_base :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { } -// type_info_core returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR +// `type_info_core` returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `^Type_Info`. // This is also aliased as `type_info_base_without_enum` @(require_results) @@ -670,6 +670,7 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { #partial switch i in base.variant { case Type_Info_Named: base = i.base case Type_Info_Enum: base = i.base + case Type_Info_Bit_Set: base = i.underlying case Type_Info_Bit_Field: base = i.backing_type case: break loop } @@ -677,27 +678,10 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { return base } -@(require_results) -type_info_underlying :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { - if info == nil { - return nil - } +// `type_info_underlying` returns underlying (backing) type +type_info_underlying :: type_info_core - base := info - loop: for { - #partial switch i in base.variant { - case Type_Info_Named: base = i.base - case Type_Info_Enum: base = i.base - case Type_Info_Bit_Set: base = i.underlying - case Type_Info_Bit_Field: base = i.backing_type - case: - break loop - } - } - return base -} - -// type_info_base_without_enum returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR +// `type_info_base_without_enum` returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `^Type_Info`. // This is also aliased as `type_info_core` type_info_base_without_enum :: type_info_core From 029c96ce227321b8d95614b525fe981618cd9644 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 4 Mar 2026 14:03:24 +0000 Subject: [PATCH 036/273] Separate `type_info_core` and `type_info_underlying` --- base/runtime/core.odin | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index d3779b776..97e7fa183 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -655,8 +655,7 @@ type_info_base :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { return base } - -// `type_info_core` returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR +// type_info_core returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `^Type_Info`. // This is also aliased as `type_info_base_without_enum` @(require_results) @@ -665,6 +664,27 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { return nil } + base := info + loop: for { + #partial switch i in base.variant { + case Type_Info_Named: base = i.base + case Type_Info_Enum: base = i.base + case Type_Info_Bit_Field: base = i.backing_type + case: break loop + } + } + return base +} + + + +// `type_info_underlying` returns underlying (backing) type +@(require_results) +type_info_underlying :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { + if info == nil { + return nil + } + base := info loop: for { #partial switch i in base.variant { @@ -678,9 +698,6 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { return base } -// `type_info_underlying` returns underlying (backing) type -type_info_underlying :: type_info_core - // `type_info_base_without_enum` returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR // returns the backing integer type of an enum or bit_set `^Type_Info`. // This is also aliased as `type_info_core` From 217b4967b0769c3d9580012e3c4c923ab6b1b64d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 4 Mar 2026 14:07:24 +0000 Subject: [PATCH 037/273] Improve docs for `type_info_underlying` --- base/runtime/core.odin | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 97e7fa183..2fcc21c97 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -656,7 +656,7 @@ type_info_base :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { } // type_info_core returns the core-type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR -// returns the backing integer type of an enum or bit_set `^Type_Info`. +// returns the backing integer type of an enum `^Type_Info`. // This is also aliased as `type_info_base_without_enum` @(require_results) type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { @@ -678,7 +678,8 @@ type_info_core :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { -// `type_info_underlying` returns underlying (backing) type +// type_info_underlying returns the underlying (backing) type of a `^Type_Info` stripping the `distinct`ness from the first level AND/OR +// returns the backing integer type of an enum `^Type_Info` AND/OR the underlying integer type of a bit_set or bit_field. @(require_results) type_info_underlying :: proc "contextless" (info: ^Type_Info) -> ^Type_Info { if info == nil { @@ -726,7 +727,7 @@ when !ODIN_NO_RTTI { return ti.id } // typeid_core returns the core-type of a `typeid` stripping the `distinct`ness from the first level AND/OR - // returns the backing integer type of an enum or bit_set `typeid`. + // returns the backing integer type of an enum `typeid`. // This is also aliased as `typeid_base_without_enum` @(require_results) typeid_core :: proc "contextless" (id: typeid) -> typeid { From fee99c56a644d007fb0dc11590190420d854dfe8 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 5 Mar 2026 22:06:54 +0100 Subject: [PATCH 038/273] fix MacOS CI --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8735945b1..bd799dd66 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -143,6 +143,10 @@ jobs: run: ./odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed - name: Vendor library tests run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address + if: matrix.os != 'macos-15-intel' && matrix.os != 'macos-latest' + - name: Vendor library tests (MacOS) + run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address -extra-linker-flags:"-L/opt/homebrew/opt/lua@5.4/lib" + if: matrix.os == 'macos-15-intel' || matrix.os == 'macos-latest' - name: Internals tests run: ./odin test tests/internal -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: GitHub Issue tests From 92a2270ee1228ced0341af6fb62d56321de4c7c7 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 6 Mar 2026 11:49:55 +0100 Subject: [PATCH 039/273] intel has libs at a different path --- .github/workflows/ci.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd799dd66..5db1119a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -140,13 +140,18 @@ jobs: - name: Optimized Core library tests run: ./odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Wycheproof tests + run: ./odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed - name: Vendor library tests run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address if: matrix.os != 'macos-15-intel' && matrix.os != 'macos-latest' - - name: Vendor library tests (MacOS) + - name: Vendor library tests (MacOS ARM) run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address -extra-linker-flags:"-L/opt/homebrew/opt/lua@5.4/lib" - if: matrix.os == 'macos-15-intel' || matrix.os == 'macos-latest' + if: matrix.os == 'macos-latest' + - name: Vendor library tests (MacOS Intel) + run: ./odin test tests/vendor -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address -extra-linker-flags:"-L/usr/local/opt/lua@5.4/lib" + if: matrix.os == 'macos-15-intel' + - name: Internals tests run: ./odin test tests/internal -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: GitHub Issue tests From 0c0159b5b7eebe2604c7bee7e4630676b3c41b2f Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 6 Mar 2026 21:05:53 +0100 Subject: [PATCH 040/273] add more js to examples/all js --- examples/all/all_js.odin | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/all/all_js.odin b/examples/all/all_js.odin index b5016f992..3e45565e0 100644 --- a/examples/all/all_js.odin +++ b/examples/all/all_js.odin @@ -143,10 +143,12 @@ package all @(require) import "core:sys/orca" @(require) import "core:sys/info" +@(require) import "core:sys/wasm/js" +@(require) import "core:sys/wasm/wasi" @(require) import "core:unicode" @(require) import "core:unicode/utf8" @(require) import "core:unicode/utf8/utf8string" @(require) import "core:unicode/utf16" -main :: proc() {} \ No newline at end of file +main :: proc() {} From 6434bf4b659a619b767e2a90047d9904f2bd565f Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 7 Mar 2026 12:38:04 +0100 Subject: [PATCH 041/273] Limit maximum exponent in parsing of float/integer literals --- core/c/libc/math.odin | 2 +- src/big_int.cpp | 22 ++++++++++++++++++++-- src/parser.cpp | 7 ++++++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/core/c/libc/math.odin b/core/c/libc/math.odin index d0a015c70..434b67817 100644 --- a/core/c/libc/math.odin +++ b/core/c/libc/math.odin @@ -159,7 +159,7 @@ float_t :: float double_t :: double NAN := transmute(double)(_nan_bit_pattern) -INFINITY :: 1e5000 +INFINITY :: 0h7ff00000_00000000 // +Inf HUGE_VALF :: INFINITY HUGE_VAL :: double(INFINITY) diff --git a/src/big_int.cpp b/src/big_int.cpp index 0b0a9a400..7067a7c3d 100644 --- a/src/big_int.cpp +++ b/src/big_int.cpp @@ -197,8 +197,13 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success BigInt b = {}; big_int_from_u64(&b, base); + defer (big_int_dealloc(&b)); + mp_zero(dst); + BigInt digit = {}; + defer (big_int_dealloc(&digit)); + isize i = 0; for (; i < len; i++) { Rune r = cast(Rune)text[i]; @@ -224,9 +229,10 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success } break; } - BigInt val = big_int_make_u64(v); + + big_int_from_u64(&digit, v); big_int_mul_eq(dst, &b); - big_int_add_eq(dst, &val); + big_int_add_eq(dst, &digit); } if (i < len && (text[i] == 'e' || text[i] == 'E')) { i += 1; @@ -235,6 +241,7 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success if (text[i] == '+') { i += 1; } + u64 exp = 0; for (; i < len; i++) { char r = cast(char)text[i]; @@ -251,8 +258,19 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success exp *= 10; exp += v; } + + // NOTE(Jeroen): A valid integer can never have an exponent larger than 308 (per `max(f64)`). + // As an integer, not even larger than `max(u128)` which has a base 10 exponent of 38. + // But we also use this path to parse float literals like those in `core:math.pow10_f64`, + // so we have to stick with 1e308. + if (exp > 308) { + *success = false; + return; + } + BigInt tmp = {}; mp_init(&tmp); + defer (big_int_dealloc(&tmp)); big_int_exp_u64(&tmp, &b, exp, success); big_int_mul_eq(dst, &tmp); } diff --git a/src/parser.cpp b/src/parser.cpp index 84fbc5130..ca81159b4 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -804,7 +804,12 @@ gb_internal ExactValue exact_value_from_token(AstFile *f, Token const &token) { syntax_error(token, "Invalid integer literal"); break; case Token_Float: - syntax_error(token, "Invalid float literal"); + // NOTE(Jeroen): Could be an integer, see `exact_value_float_from_string` + if (!string_contains_char(s, '.') && !string_contains_char(s, '-')) { + syntax_error(token, "Invalid integer literal"); + } else { + syntax_error(token, "Invalid float literal"); + } break; default: syntax_error(token, "Invalid token literal"); From d767e1c513e9b408c6adac2ddbeea266ce2fdd1d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 7 Mar 2026 14:57:39 +0100 Subject: [PATCH 042/273] Clarify long double comment --- core/c/libc/math.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/c/libc/math.odin b/core/c/libc/math.odin index 434b67817..bc3dd9034 100644 --- a/core/c/libc/math.odin +++ b/core/c/libc/math.odin @@ -154,7 +154,7 @@ _nan_bit_pattern := ~u64(0) // On amd64 Windows and Linux, float_t and double_t are respectively both // their usual types. On x86 it's not possible to define these types correctly -// since they would be long double which Odin does have support for. +// since they would be long double which Odin does NOT have support for. float_t :: float double_t :: double From 93b1e97402c4c163db7dc497076ab24122c50cd7 Mon Sep 17 00:00:00 2001 From: Gavin Rohrer Date: Sat, 7 Mar 2026 10:07:15 -0500 Subject: [PATCH 043/273] fix documentation of assign_at --- base/runtime/core_builtin.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 6e0fe931a..974b2f048 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -804,7 +804,7 @@ inject_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, ar -// `assign_at_elem` assigns a value at a given index. If the requested index is smaller than the current +// `assign_at_elem` assigns a value at a given index. If the requested index is past the end of the current // size of the dynamic array, it will attempt to `resize` the a new length of `index+1` and then assign as `index`. @builtin assign_at_elem :: proc(array: ^$T/[dynamic]$E, #any_int index: int, arg: E, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #no_bounds_check #optional_allocator_error { @@ -820,7 +820,7 @@ assign_at_elem :: proc(array: ^$T/[dynamic]$E, #any_int index: int, arg: E, loc } -// `assign_at_elems` assigns a values at a given index. If the requested index is smaller than the current +// `assign_at_elems` assigns a values at a given index. If the requested index is past the end of the current // size of the dynamic array, it will attempt to `resize` the a new length of `index+len(args)` and then assign as `index`. @builtin assign_at_elems :: proc(array: ^$T/[dynamic]$E, #any_int index: int, #no_broadcast args: ..E, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #no_bounds_check #optional_allocator_error { @@ -838,7 +838,7 @@ assign_at_elems :: proc(array: ^$T/[dynamic]$E, #any_int index: int, #no_broadca return } -// `assign_at_elem_string` assigns a string at a given index. If the requested index is smaller than the current +// `assign_at_elem_string` assigns a string at a given index. If the requested index is past the end of the current // size of the dynamic array, it will attempt to `resize` the a new length of `index+len(arg)` and then assign as `index`. @builtin assign_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, arg: string, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #no_bounds_check #optional_allocator_error { @@ -856,7 +856,7 @@ assign_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, ar return } -// `assign_at` assigns a value at a given index. If the requested index is smaller than the current +// `assign_at` assigns a value at a given index. If the requested index is past the end of the current // size of the dynamic array, it will attempt to `resize` the a new length of `index+size_needed` and then assign as `index`. @builtin assign_at :: proc{ From e1ea3d634b13626b27ac51b28268e868017568eb Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Sat, 7 Mar 2026 11:34:15 -0500 Subject: [PATCH 044/273] core:testing remove whitespace typo --- core/testing/runner.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/testing/runner.odin b/core/testing/runner.odin index e7a46c5cb..9033d078e 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -39,7 +39,7 @@ ALWAYS_REPORT_MEMORY : bool : #config(ODIN_TEST_ALWAYS_REPORT_MEMORY, false) // Treat memory leaks and bad frees as errors. FAIL_ON_BAD_MEMORY : bool : #config(ODIN_TEST_FAIL_ON_BAD_MEMORY, false) // Specify how much memory each thread allocator starts with. -PER_THREAD_MEMORY : int : #config(ODIN_TEST_THREAD_MEMORY, mem. ROLLBACK_STACK_DEFAULT_BLOCK_SIZE) +PER_THREAD_MEMORY : int : #config(ODIN_TEST_THREAD_MEMORY, mem.ROLLBACK_STACK_DEFAULT_BLOCK_SIZE) // Select a specific set of tests to run by name. // Each test is separated by a comma and may optionally include the package name. // This may be useful when running tests on multiple packages with `-all-packages`. From 7320f10de648fbb9fdf129ecb1525b951324703a Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Sun, 8 Mar 2026 12:08:49 +0100 Subject: [PATCH 045/273] Fix tokenizer init --- src/tokenizer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 2ba25b297..2bdd15a60 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -379,6 +379,7 @@ gb_internal void advance_to_next_rune(Tokenizer *t) { gb_internal void init_tokenizer_with_data(Tokenizer *t, String const &fullpath, void const *data, isize size) { t->fullpath = fullpath; + t->column_minus_one = -1; t->line_count = 1; t->start = cast(u8 *)data; From 0087d6d62e642fb9bda9ea730df68719b7abdd7e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 8 Mar 2026 15:05:23 +0100 Subject: [PATCH 046/273] Add `preserve/*` to `base:runtime` ```odin none :: proc "preserve/none" () {} most :: proc "preserve/most" () {} all :: proc "preserve/all" () {} print_cc :: proc(type: any) { ti := type_info_of(type.id) p := ti.variant.(runtime.Type_Info_Procedure) fmt.println(p.convention) } main :: proc() { print_cc(none) print_cc(most) print_cc(all) } ``` --- base/runtime/core.odin | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 2fcc21c97..983f104e3 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -39,6 +39,10 @@ Calling_Convention :: enum u8 { Win64 = 9, SysV = 10, + + Preserve_None = 11, + Preserve_Most = 12, + Preserve_All = 13, } Type_Info_Enum_Value :: distinct i64 From e77dd887aa5780aaedda4548ea2fb7eb207bb749 Mon Sep 17 00:00:00 2001 From: connnnal <216976529+connnnal@users.noreply.github.com> Date: Sun, 8 Mar 2026 16:50:53 +0000 Subject: [PATCH 047/273] Partial 1.619.x d3d12 bindings --- vendor/directx/d3d12/d3d12.odin | 78 ++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 25 deletions(-) diff --git a/vendor/directx/d3d12/d3d12.odin b/vendor/directx/d3d12/d3d12.odin index 8611172f8..3519dafaf 100644 --- a/vendor/directx/d3d12/d3d12.odin +++ b/vendor/directx/d3d12/d3d12.odin @@ -174,19 +174,20 @@ PRIMITIVE :: enum i32 { } SRV_DIMENSION :: enum i32 { - UNKNOWN = 0, - BUFFER = 1, - TEXTURE1D = 2, - TEXTURE1DARRAY = 3, - TEXTURE2D = 4, - TEXTURE2DARRAY = 5, - TEXTURE2DMS = 6, - TEXTURE2DMSARRAY = 7, - TEXTURE3D = 8, - TEXTURECUBE = 9, - TEXTURECUBEARRAY = 10, - BUFFEREX = 11, + UNKNOWN = 0, + BUFFER = 1, + TEXTURE1D = 2, + TEXTURE1DARRAY = 3, + TEXTURE2D = 4, + TEXTURE2DARRAY = 5, + TEXTURE2DMS = 6, + TEXTURE2DMSARRAY = 7, + TEXTURE3D = 8, + TEXTURECUBE = 9, + TEXTURECUBEARRAY = 10, + BUFFEREX = 11, RAYTRACING_ACCELERATION_STRUCTURE = 11, + BUFFER_BYTE_OFFSET = 12, } PFN_DESTRUCTION_CALLBACK :: #type proc "c" (a0: rawptr) @@ -858,6 +859,8 @@ FEATURE :: enum i32 { APPLICATION_SPECIFIC_DRIVER_STATE = 56, BYTECODE_BYPASS_HASH_SUPPORTED = 57, SHADER_CACHE_ABI_SUPPORT = 61, + BARRIER_LAYOUT = 64, + OPTIONS22 = 65, } SHADER_MIN_PRECISION_SUPPORT :: distinct bit_set[SHADER_MIN_PRECISION_SUPPORT_FLAG; u32] @@ -1311,6 +1314,13 @@ FEATURE_DATA_OPTIONS21 :: struct { ExtendedCommandInfoSupported: BOOL, } +FEATURE_DATA_OPTIONS22 :: struct { + ShaderExecutionReorderingActuallyReorders: BOOL, + CreateByteOffsetViewsSupported: BOOL, + Max1DDispatchSize: u32, + Max1DDispatchMeshSize: u32, +} + TIGHT_ALIGNMENT_TIER :: enum i32 { NOT_SUPPORTED = 0, _1 = NOT_SUPPORTED + 1, @@ -1809,6 +1819,13 @@ RAYTRACING_ACCELERATION_STRUCTURE_SRV :: struct { Location: GPU_VIRTUAL_ADDRESS, } +BUFFER_SRV_BYTE_OFFSET :: struct { + Offset: u64, + Size: u64, + StructureByteStride: u32, + Flags: BUFFER_SRV_FLAGS, +} + SHADER_RESOURCE_VIEW_DESC :: struct { Format: dxgi.FORMAT, ViewDimension: SRV_DIMENSION, @@ -1825,6 +1842,7 @@ SHADER_RESOURCE_VIEW_DESC :: struct { TextureCube: TEXCUBE_SRV, TextureCubeArray: TEXCUBE_ARRAY_SRV, RaytracingAccelerationStructure: RAYTRACING_ACCELERATION_STRUCTURE_SRV, + BufferByteOffset: BUFFER_SRV_BYTE_OFFSET, }, } @@ -1946,26 +1964,36 @@ TEX3D_UAV :: struct { WSize: u32, } +BUFFER_UAV_BYTE_OFFSET :: struct { + Offset: u64, + Size: u32, + StructureByteStride: u32, + CounterOffsetInBytes: u64, + Flags: BUFFER_UAV_FLAGS, +} + UAV_DIMENSION :: enum i32 { - UNKNOWN = 0, - BUFFER = 1, - TEXTURE1D = 2, - TEXTURE1DARRAY = 3, - TEXTURE2D = 4, - TEXTURE2DARRAY = 5, - TEXTURE3D = 8, + UNKNOWN = 0, + BUFFER = 1, + TEXTURE1D = 2, + TEXTURE1DARRAY = 3, + TEXTURE2D = 4, + TEXTURE2DARRAY = 5, + TEXTURE3D = 8, + BUFFER_BYTE_OFFSET = 9, } UNORDERED_ACCESS_VIEW_DESC :: struct { Format: dxgi.FORMAT, ViewDimension: UAV_DIMENSION, using _: struct #raw_union { - Buffer: BUFFER_UAV, - Texture1D: TEX1D_UAV, - Texture1DArray: TEX1D_ARRAY_UAV, - Texture2D: TEX2D_UAV, - Texture2DArray: TEX2D_ARRAY_UAV, - Texture3D: TEX3D_UAV, + Buffer: BUFFER_UAV, + Texture1D: TEX1D_UAV, + Texture1DArray: TEX1D_ARRAY_UAV, + Texture2D: TEX2D_UAV, + Texture2DArray: TEX2D_ARRAY_UAV, + Texture3D: TEX3D_UAV, + BufferByteOffset: BUFFER_UAV_BYTE_OFFSET, }, } From 8f101af8f8ef91f97f615b4d28ab673a0382b4b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tar=C4=B1k=20B=2E?= Date: Sun, 8 Mar 2026 21:01:31 +0100 Subject: [PATCH 048/273] Add formatting flag for space between time.Duration and unit --- core/fmt/fmt.odin | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 04211b8a9..e955141fc 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2592,11 +2592,19 @@ fmt_named_buitlin_custom_formatters :: proc(fi: ^Info, v: any, verb: rune, info: prec = 6 buf[w] = 'm' } + if fi.hash { + w -= 1 + buf[w] = ' ' + } w, u = ffrac(buf[:w], u, prec) w = fint(buf[:w], u) } else { w -= 1 buf[w] = 's' + if fi.hash { + w -= 1 + buf[w] = ' ' + } w, u = ffrac(buf[:w], u, 9) w = fint(buf[:w], u%60) u /= 60 From ac6cabd5e3927b301b8048dbe35e578f5de195f0 Mon Sep 17 00:00:00 2001 From: maximusdionyssopoulos Date: Mon, 9 Mar 2026 21:17:20 +1100 Subject: [PATCH 049/273] fix NSTimer scheduledTimerWithTimeInterval:repeats:block: procedure --- core/sys/darwin/Foundation/NSTimer.odin | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/sys/darwin/Foundation/NSTimer.odin b/core/sys/darwin/Foundation/NSTimer.odin index 2edcf34c3..7e10078ca 100644 --- a/core/sys/darwin/Foundation/NSTimer.odin +++ b/core/sys/darwin/Foundation/NSTimer.odin @@ -5,11 +5,10 @@ Timer :: struct { using _: Object } @(objc_type=Timer, objc_name="scheduledTimerWithTimeIntervalRepeatsBlock", objc_is_class_method=true) Timer_scheduledTimerWithTimeIntervalRepeatsBlock :: proc(interval: TimeInterval, repeats: BOOL, block: ^Block) -> ^Timer { - return msgSend(^Timer, Timer, "scheduledTimerWithTimeInterval:repeats:block:") + return msgSend(^Timer, Timer, "scheduledTimerWithTimeInterval:repeats:block:", repeats, block) } @(objc_type=Timer, objc_name="scheduledTimerWithTimeIntervalTargetSelectorUserInfoRepeat", objc_is_class_method=true) Timer_scheduledTimerWithTimeIntervalTargetSelectorUserInfoRepeat :: proc(interval: TimeInterval, aTarget: id, aSelector: SEL, userInfo: id, repeats: BOOL) -> ^Timer { return msgSend(^Timer, Timer, "scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:", interval, aTarget, aSelector, userInfo, repeats) } - From c4f5f9e55a942c790d007e38eed7eedfadc1d1b3 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 17:12:33 -0500 Subject: [PATCH 050/273] Add files needed to generate unicode tables This commit adds the directory `/core/assets/UCD/`. This directory contains three files; `PropList.txt`, `UnicodeData.txt`, and `license.txt`. These files are from the Unicode Database (UCD). The first two are used to generate tables for `core/unicode`. The third is the license that covers the files that make up the UCD. These files are from Unicode version 17.0.0. The latest versions may be found ad [ucd](https://www.unicode.org/Public/UCD/latest/ucd/). --- tests/core/assets/UCD/PropList.txt | 1944 ++ tests/core/assets/UCD/UnicodeData.txt | 40575 ++++++++++++++++++++++++ tests/core/assets/UCD/license.txt | 39 + 3 files changed, 42558 insertions(+) create mode 100644 tests/core/assets/UCD/PropList.txt create mode 100644 tests/core/assets/UCD/UnicodeData.txt create mode 100644 tests/core/assets/UCD/license.txt diff --git a/tests/core/assets/UCD/PropList.txt b/tests/core/assets/UCD/PropList.txt new file mode 100644 index 000000000..e64b4224d --- /dev/null +++ b/tests/core/assets/UCD/PropList.txt @@ -0,0 +1,1944 @@ +# PropList-17.0.0.txt +# Date: 2025-06-30, 06:19:01 GMT +# © 2025 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use and license, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ + +# ================================================ + +0009..000D ; White_Space # Cc [5] .. +0020 ; White_Space # Zs SPACE +0085 ; White_Space # Cc +00A0 ; White_Space # Zs NO-BREAK SPACE +1680 ; White_Space # Zs OGHAM SPACE MARK +2000..200A ; White_Space # Zs [11] EN QUAD..HAIR SPACE +2028 ; White_Space # Zl LINE SEPARATOR +2029 ; White_Space # Zp PARAGRAPH SEPARATOR +202F ; White_Space # Zs NARROW NO-BREAK SPACE +205F ; White_Space # Zs MEDIUM MATHEMATICAL SPACE +3000 ; White_Space # Zs IDEOGRAPHIC SPACE + +# Total code points: 25 + +# ================================================ + +061C ; Bidi_Control # Cf ARABIC LETTER MARK +200E..200F ; Bidi_Control # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +202A..202E ; Bidi_Control # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +2066..2069 ; Bidi_Control # Cf [4] LEFT-TO-RIGHT ISOLATE..POP DIRECTIONAL ISOLATE + +# Total code points: 12 + +# ================================================ + +200C..200D ; Join_Control # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER + +# Total code points: 2 + +# ================================================ + +002D ; Dash # Pd HYPHEN-MINUS +058A ; Dash # Pd ARMENIAN HYPHEN +05BE ; Dash # Pd HEBREW PUNCTUATION MAQAF +1400 ; Dash # Pd CANADIAN SYLLABICS HYPHEN +1806 ; Dash # Pd MONGOLIAN TODO SOFT HYPHEN +2010..2015 ; Dash # Pd [6] HYPHEN..HORIZONTAL BAR +2053 ; Dash # Po SWUNG DASH +207B ; Dash # Sm SUPERSCRIPT MINUS +208B ; Dash # Sm SUBSCRIPT MINUS +2212 ; Dash # Sm MINUS SIGN +2E17 ; Dash # Pd DOUBLE OBLIQUE HYPHEN +2E1A ; Dash # Pd HYPHEN WITH DIAERESIS +2E3A..2E3B ; Dash # Pd [2] TWO-EM DASH..THREE-EM DASH +2E40 ; Dash # Pd DOUBLE HYPHEN +2E5D ; Dash # Pd OBLIQUE HYPHEN +301C ; Dash # Pd WAVE DASH +3030 ; Dash # Pd WAVY DASH +30A0 ; Dash # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +FE31..FE32 ; Dash # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE58 ; Dash # Pd SMALL EM DASH +FE63 ; Dash # Pd SMALL HYPHEN-MINUS +FF0D ; Dash # Pd FULLWIDTH HYPHEN-MINUS +10D6E ; Dash # Pd GARAY HYPHEN +10EAD ; Dash # Pd YEZIDI HYPHENATION MARK + +# Total code points: 31 + +# ================================================ + +002D ; Hyphen # Pd HYPHEN-MINUS +00AD ; Hyphen # Cf SOFT HYPHEN +058A ; Hyphen # Pd ARMENIAN HYPHEN +1806 ; Hyphen # Pd MONGOLIAN TODO SOFT HYPHEN +2010..2011 ; Hyphen # Pd [2] HYPHEN..NON-BREAKING HYPHEN +2E17 ; Hyphen # Pd DOUBLE OBLIQUE HYPHEN +30FB ; Hyphen # Po KATAKANA MIDDLE DOT +FE63 ; Hyphen # Pd SMALL HYPHEN-MINUS +FF0D ; Hyphen # Pd FULLWIDTH HYPHEN-MINUS +FF65 ; Hyphen # Po HALFWIDTH KATAKANA MIDDLE DOT + +# Total code points: 11 + +# ================================================ + +0022 ; Quotation_Mark # Po QUOTATION MARK +0027 ; Quotation_Mark # Po APOSTROPHE +00AB ; Quotation_Mark # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00BB ; Quotation_Mark # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +2018 ; Quotation_Mark # Pi LEFT SINGLE QUOTATION MARK +2019 ; Quotation_Mark # Pf RIGHT SINGLE QUOTATION MARK +201A ; Quotation_Mark # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Quotation_Mark # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Quotation_Mark # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Quotation_Mark # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Quotation_Mark # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2039 ; Quotation_Mark # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Quotation_Mark # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +2E42 ; Quotation_Mark # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +300C ; Quotation_Mark # Ps LEFT CORNER BRACKET +300D ; Quotation_Mark # Pe RIGHT CORNER BRACKET +300E ; Quotation_Mark # Ps LEFT WHITE CORNER BRACKET +300F ; Quotation_Mark # Pe RIGHT WHITE CORNER BRACKET +301D ; Quotation_Mark # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Quotation_Mark # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +FE41 ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; Quotation_Mark # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; Quotation_Mark # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FF02 ; Quotation_Mark # Po FULLWIDTH QUOTATION MARK +FF07 ; Quotation_Mark # Po FULLWIDTH APOSTROPHE +FF62 ; Quotation_Mark # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET + +# Total code points: 30 + +# ================================================ + +0021 ; Terminal_Punctuation # Po EXCLAMATION MARK +002C ; Terminal_Punctuation # Po COMMA +002E ; Terminal_Punctuation # Po FULL STOP +003A..003B ; Terminal_Punctuation # Po [2] COLON..SEMICOLON +003F ; Terminal_Punctuation # Po QUESTION MARK +037E ; Terminal_Punctuation # Po GREEK QUESTION MARK +0387 ; Terminal_Punctuation # Po GREEK ANO TELEIA +0589 ; Terminal_Punctuation # Po ARMENIAN FULL STOP +05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ +060C ; Terminal_Punctuation # Po ARABIC COMMA +061B ; Terminal_Punctuation # Po ARABIC SEMICOLON +061D..061F ; Terminal_Punctuation # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK +06D4 ; Terminal_Punctuation # Po ARABIC FULL STOP +0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION +070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS +07F8..07F9 ; Terminal_Punctuation # Po [2] NKO COMMA..NKO EXCLAMATION MARK +0830..0835 ; Terminal_Punctuation # Po [6] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION SHIYYAALAA +0837..083E ; Terminal_Punctuation # Po [8] SAMARITAN PUNCTUATION MELODIC QITSA..SAMARITAN PUNCTUATION ANNAAU +085E ; Terminal_Punctuation # Po MANDAIC PUNCTUATION +0964..0965 ; Terminal_Punctuation # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0E5A..0E5B ; Terminal_Punctuation # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0F08 ; Terminal_Punctuation # Po TIBETAN MARK SBRUL SHAD +0F0D..0F12 ; Terminal_Punctuation # Po [6] TIBETAN MARK SHAD..TIBETAN MARK RGYA GRAM SHAD +104A..104B ; Terminal_Punctuation # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION +1361..1368 ; Terminal_Punctuation # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR +166E ; Terminal_Punctuation # Po CANADIAN SYLLABICS FULL STOP +16EB..16ED ; Terminal_Punctuation # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +1735..1736 ; Terminal_Punctuation # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +17D4..17D6 ; Terminal_Punctuation # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17DA ; Terminal_Punctuation # Po KHMER SIGN KOOMUUT +1802..1805 ; Terminal_Punctuation # Po [4] MONGOLIAN COMMA..MONGOLIAN FOUR DOTS +1808..1809 ; Terminal_Punctuation # Po [2] MONGOLIAN MANCHU COMMA..MONGOLIAN MANCHU FULL STOP +1944..1945 ; Terminal_Punctuation # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1AA8..1AAB ; Terminal_Punctuation # Po [4] TAI THAM SIGN KAAN..TAI THAM SIGN SATKAANKUU +1B4E..1B4F ; Terminal_Punctuation # Po [2] BALINESE INVERTED CARIK SIKI..BALINESE INVERTED CARIK PAREREN +1B5A..1B5B ; Terminal_Punctuation # Po [2] BALINESE PANTI..BALINESE PAMADA +1B5D..1B5F ; Terminal_Punctuation # Po [3] BALINESE CARIK PAMUNGKAH..BALINESE CARIK PAREREN +1B7D..1B7F ; Terminal_Punctuation # Po [3] BALINESE PANTI LANTANG..BALINESE PANTI BAWAK +1C3B..1C3F ; Terminal_Punctuation # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C7E..1C7F ; Terminal_Punctuation # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +2024 ; Terminal_Punctuation # Po ONE DOT LEADER +203C..203D ; Terminal_Punctuation # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +2047..2049 ; Terminal_Punctuation # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +2CF9..2CFB ; Terminal_Punctuation # Po [3] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2E2E ; Terminal_Punctuation # Po REVERSED QUESTION MARK +2E3C ; Terminal_Punctuation # Po STENOGRAPHIC FULL STOP +2E41 ; Terminal_Punctuation # Po REVERSED COMMA +2E4C ; Terminal_Punctuation # Po MEDIEVAL COMMA +2E4E..2E4F ; Terminal_Punctuation # Po [2] PUNCTUS ELEVATUS MARK..CORNISH VERSE DIVIDER +2E53..2E54 ; Terminal_Punctuation # Po [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK +3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP +A4FE..A4FF ; Terminal_Punctuation # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +A60D..A60F ; Terminal_Punctuation # Po [3] VAI COMMA..VAI QUESTION MARK +A6F3..A6F7 ; Terminal_Punctuation # Po [5] BAMUM FULL STOP..BAMUM QUESTION MARK +A876..A877 ; Terminal_Punctuation # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD +A8CE..A8CF ; Terminal_Punctuation # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A92F ; Terminal_Punctuation # Po KAYAH LI SIGN SHYA +A9C7..A9C9 ; Terminal_Punctuation # Po [3] JAVANESE PADA PANGKAT..JAVANESE PADA LUNGSI +AA5D..AA5F ; Terminal_Punctuation # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA +AADF ; Terminal_Punctuation # Po TAI VIET SYMBOL KOI KOI +AAF0..AAF1 ; Terminal_Punctuation # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +ABEB ; Terminal_Punctuation # Po MEETEI MAYEK CHEIKHEI +FE12 ; Terminal_Punctuation # Po PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE15..FE16 ; Terminal_Punctuation # Po [2] PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE50..FE52 ; Terminal_Punctuation # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; Terminal_Punctuation # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FF01 ; Terminal_Punctuation # Po FULLWIDTH EXCLAMATION MARK +FF0C ; Terminal_Punctuation # Po FULLWIDTH COMMA +FF0E ; Terminal_Punctuation # Po FULLWIDTH FULL STOP +FF1A..FF1B ; Terminal_Punctuation # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1F ; Terminal_Punctuation # Po FULLWIDTH QUESTION MARK +FF61 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA +1039F ; Terminal_Punctuation # Po UGARITIC WORD DIVIDER +103D0 ; Terminal_Punctuation # Po OLD PERSIAN WORD DIVIDER +10857 ; Terminal_Punctuation # Po IMPERIAL ARAMAIC SECTION SIGN +1091F ; Terminal_Punctuation # Po PHOENICIAN WORD SEPARATOR +10A56..10A57 ; Terminal_Punctuation # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA +10AF0..10AF5 ; Terminal_Punctuation # Po [6] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION TWO DOTS +10B3A..10B3F ; Terminal_Punctuation # Po [6] TINY TWO DOTS OVER ONE DOT PUNCTUATION..LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B99..10B9C ; Terminal_Punctuation # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10F55..10F59 ; Terminal_Punctuation # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +10F86..10F89 ; Terminal_Punctuation # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS +11047..1104D ; Terminal_Punctuation # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +110BE..110C1 ; Terminal_Punctuation # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +11141..11143 ; Terminal_Punctuation # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK +111C5..111C6 ; Terminal_Punctuation # Po [2] SHARADA DANDA..SHARADA DOUBLE DANDA +111CD ; Terminal_Punctuation # Po SHARADA SUTRA MARK +111DE..111DF ; Terminal_Punctuation # Po [2] SHARADA SECTION MARK-1..SHARADA SECTION MARK-2 +11238..1123C ; Terminal_Punctuation # Po [5] KHOJKI DANDA..KHOJKI DOUBLE SECTION MARK +112A9 ; Terminal_Punctuation # Po MULTANI SECTION MARK +113D4..113D5 ; Terminal_Punctuation # Po [2] TULU-TIGALARI DANDA..TULU-TIGALARI DOUBLE DANDA +1144B..1144D ; Terminal_Punctuation # Po [3] NEWA DANDA..NEWA COMMA +1145A..1145B ; Terminal_Punctuation # Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK +115C2..115C5 ; Terminal_Punctuation # Po [4] SIDDHAM DANDA..SIDDHAM SEPARATOR BAR +115C9..115D7 ; Terminal_Punctuation # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +11641..11642 ; Terminal_Punctuation # Po [2] MODI DANDA..MODI DOUBLE DANDA +1173C..1173E ; Terminal_Punctuation # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +11944 ; Terminal_Punctuation # Po DIVES AKURU DOUBLE DANDA +11946 ; Terminal_Punctuation # Po DIVES AKURU END OF TEXT MARK +11A42..11A43 ; Terminal_Punctuation # Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD +11A9B..11A9C ; Terminal_Punctuation # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD +11AA1..11AA2 ; Terminal_Punctuation # Po [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2 +11C41..11C43 ; Terminal_Punctuation # Po [3] BHAIKSUKI DANDA..BHAIKSUKI WORD SEPARATOR +11C71 ; Terminal_Punctuation # Po MARCHEN MARK SHAD +11EF7..11EF8 ; Terminal_Punctuation # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F43..11F44 ; Terminal_Punctuation # Po [2] KAWI DANDA..KAWI DOUBLE DANDA +12470..12474 ; Terminal_Punctuation # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +16A6E..16A6F ; Terminal_Punctuation # Po [2] MRO DANDA..MRO DOUBLE DANDA +16AF5 ; Terminal_Punctuation # Po BASSA VAH FULL STOP +16B37..16B39 ; Terminal_Punctuation # Po [3] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN CIM CHEEM +16B44 ; Terminal_Punctuation # Po PAHAWH HMONG SIGN XAUS +16D6E..16D6F ; Terminal_Punctuation # Po [2] KIRAT RAI DANDA..KIRAT RAI DOUBLE DANDA +16E97..16E98 ; Terminal_Punctuation # Po [2] MEDEFAIDRIN COMMA..MEDEFAIDRIN FULL STOP +1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON + +# Total code points: 291 + +# ================================================ + +005E ; Other_Math # Sk CIRCUMFLEX ACCENT +03D0..03D2 ; Other_Math # L& [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL +03D5 ; Other_Math # L& GREEK PHI SYMBOL +03F0..03F1 ; Other_Math # L& [2] GREEK KAPPA SYMBOL..GREEK RHO SYMBOL +03F4..03F5 ; Other_Math # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL +2016 ; Other_Math # Po DOUBLE VERTICAL LINE +2032..2034 ; Other_Math # Po [3] PRIME..TRIPLE PRIME +2040 ; Other_Math # Pc CHARACTER TIE +2061..2064 ; Other_Math # Cf [4] FUNCTION APPLICATION..INVISIBLE PLUS +207D ; Other_Math # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; Other_Math # Pe SUPERSCRIPT RIGHT PARENTHESIS +208D ; Other_Math # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; Other_Math # Pe SUBSCRIPT RIGHT PARENTHESIS +20D0..20DC ; Other_Math # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20E1 ; Other_Math # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E5..20E6 ; Other_Math # Mn [2] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING DOUBLE VERTICAL STROKE OVERLAY +20EB..20EF ; Other_Math # Mn [5] COMBINING LONG DOUBLE SOLIDUS OVERLAY..COMBINING RIGHT ARROW BELOW +2102 ; Other_Math # L& DOUBLE-STRUCK CAPITAL C +2107 ; Other_Math # L& EULER CONSTANT +210A..2113 ; Other_Math # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; Other_Math # L& DOUBLE-STRUCK CAPITAL N +2119..211D ; Other_Math # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; Other_Math # L& DOUBLE-STRUCK CAPITAL Z +2128 ; Other_Math # L& BLACK-LETTER CAPITAL Z +2129 ; Other_Math # So TURNED GREEK SMALL LETTER IOTA +212C..212D ; Other_Math # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212F..2131 ; Other_Math # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F +2133..2134 ; Other_Math # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O +2135..2138 ; Other_Math # Lo [4] ALEF SYMBOL..DALET SYMBOL +213C..213F ; Other_Math # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; Other_Math # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +2195..2199 ; Other_Math # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219C..219F ; Other_Math # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A1..21A2 ; Other_Math # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A4..21A5 ; Other_Math # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A7 ; Other_Math # So DOWNWARDS ARROW FROM BAR +21A9..21AD ; Other_Math # So [5] LEFTWARDS ARROW WITH HOOK..LEFT RIGHT WAVE ARROW +21B0..21B1 ; Other_Math # So [2] UPWARDS ARROW WITH TIP LEFTWARDS..UPWARDS ARROW WITH TIP RIGHTWARDS +21B6..21B7 ; Other_Math # So [2] ANTICLOCKWISE TOP SEMICIRCLE ARROW..CLOCKWISE TOP SEMICIRCLE ARROW +21BC..21CD ; Other_Math # So [18] LEFTWARDS HARPOON WITH BARB UPWARDS..LEFTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Other_Math # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D3 ; Other_Math # So DOWNWARDS DOUBLE ARROW +21D5..21DB ; Other_Math # So [7] UP DOWN DOUBLE ARROW..RIGHTWARDS TRIPLE ARROW +21DD ; Other_Math # So RIGHTWARDS SQUIGGLE ARROW +21E4..21E5 ; Other_Math # So [2] LEFTWARDS ARROW TO BAR..RIGHTWARDS ARROW TO BAR +2308 ; Other_Math # Ps LEFT CEILING +2309 ; Other_Math # Pe RIGHT CEILING +230A ; Other_Math # Ps LEFT FLOOR +230B ; Other_Math # Pe RIGHT FLOOR +23B4..23B5 ; Other_Math # So [2] TOP SQUARE BRACKET..BOTTOM SQUARE BRACKET +23B7 ; Other_Math # So RADICAL SYMBOL BOTTOM +23D0 ; Other_Math # So VERTICAL LINE EXTENSION +23E2 ; Other_Math # So WHITE TRAPEZIUM +25A0..25A1 ; Other_Math # So [2] BLACK SQUARE..WHITE SQUARE +25AE..25B6 ; Other_Math # So [9] BLACK VERTICAL RECTANGLE..BLACK RIGHT-POINTING TRIANGLE +25BC..25C0 ; Other_Math # So [5] BLACK DOWN-POINTING TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C6..25C7 ; Other_Math # So [2] BLACK DIAMOND..WHITE DIAMOND +25CA..25CB ; Other_Math # So [2] LOZENGE..WHITE CIRCLE +25CF..25D3 ; Other_Math # So [5] BLACK CIRCLE..CIRCLE WITH UPPER HALF BLACK +25E2 ; Other_Math # So BLACK LOWER RIGHT TRIANGLE +25E4 ; Other_Math # So BLACK UPPER LEFT TRIANGLE +25E7..25EC ; Other_Math # So [6] SQUARE WITH LEFT HALF BLACK..WHITE UP-POINTING TRIANGLE WITH DOT +2605..2606 ; Other_Math # So [2] BLACK STAR..WHITE STAR +2640 ; Other_Math # So FEMALE SIGN +2642 ; Other_Math # So MALE SIGN +2660..2663 ; Other_Math # So [4] BLACK SPADE SUIT..BLACK CLUB SUIT +266D..266E ; Other_Math # So [2] MUSIC FLAT SIGN..MUSIC NATURAL SIGN +27C5 ; Other_Math # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Other_Math # Pe RIGHT S-SHAPED BAG DELIMITER +27E6 ; Other_Math # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Other_Math # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Other_Math # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Other_Math # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Other_Math # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Other_Math # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Other_Math # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Other_Math # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; Other_Math # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; Other_Math # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +2983 ; Other_Math # Ps LEFT WHITE CURLY BRACKET +2984 ; Other_Math # Pe RIGHT WHITE CURLY BRACKET +2985 ; Other_Math # Ps LEFT WHITE PARENTHESIS +2986 ; Other_Math # Pe RIGHT WHITE PARENTHESIS +2987 ; Other_Math # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Other_Math # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Other_Math # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Other_Math # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Other_Math # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Other_Math # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Other_Math # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Other_Math # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Other_Math # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Other_Math # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Other_Math # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Other_Math # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Other_Math # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Other_Math # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Other_Math # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Other_Math # Pe RIGHT BLACK TORTOISE SHELL BRACKET +29D8 ; Other_Math # Ps LEFT WIGGLY FENCE +29D9 ; Other_Math # Pe RIGHT WIGGLY FENCE +29DA ; Other_Math # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Other_Math # Pe RIGHT DOUBLE WIGGLY FENCE +29FC ; Other_Math # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Other_Math # Pe RIGHT-POINTING CURVED ANGLE BRACKET +FE61 ; Other_Math # Po SMALL ASTERISK +FE63 ; Other_Math # Pd SMALL HYPHEN-MINUS +FE68 ; Other_Math # Po SMALL REVERSE SOLIDUS +FF3C ; Other_Math # Po FULLWIDTH REVERSE SOLIDUS +FF3E ; Other_Math # Sk FULLWIDTH CIRCUMFLEX ACCENT +1D400..1D454 ; Other_Math # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Other_Math # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Other_Math # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Other_Math # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Other_Math # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Other_Math # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Other_Math # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Other_Math # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Other_Math # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Other_Math # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Other_Math # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Other_Math # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Other_Math # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Other_Math # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Other_Math # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Other_Math # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Other_Math # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; Other_Math # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; Other_Math # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C2..1D6DA ; Other_Math # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DC..1D6FA ; Other_Math # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FC..1D714 ; Other_Math # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D716..1D734 ; Other_Math # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D736..1D74E ; Other_Math # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D750..1D76E ; Other_Math # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D770..1D788 ; Other_Math # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D78A..1D7A8 ; Other_Math # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7AA..1D7C2 ; Other_Math # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C4..1D7CB ; Other_Math # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; Other_Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1EE00..1EE03 ; Other_Math # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; Other_Math # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; Other_Math # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; Other_Math # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; Other_Math # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; Other_Math # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; Other_Math # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; Other_Math # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; Other_Math # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; Other_Math # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; Other_Math # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; Other_Math # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; Other_Math # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; Other_Math # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; Other_Math # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; Other_Math # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; Other_Math # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; Other_Math # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; Other_Math # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; Other_Math # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; Other_Math # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; Other_Math # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; Other_Math # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; Other_Math # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; Other_Math # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; Other_Math # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; Other_Math # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; Other_Math # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN + +# Total code points: 1362 + +# ================================================ + +0030..0039 ; Hex_Digit # Nd [10] DIGIT ZERO..DIGIT NINE +0041..0046 ; Hex_Digit # L& [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F +0061..0066 ; Hex_Digit # L& [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F +FF10..FF19 ; Hex_Digit # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF21..FF26 ; Hex_Digit # L& [6] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER F +FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER F + +# Total code points: 44 + +# ================================================ + +0030..0039 ; ASCII_Hex_Digit # Nd [10] DIGIT ZERO..DIGIT NINE +0041..0046 ; ASCII_Hex_Digit # L& [6] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER F +0061..0066 ; ASCII_Hex_Digit # L& [6] LATIN SMALL LETTER A..LATIN SMALL LETTER F + +# Total code points: 22 + +# ================================================ + +0345 ; Other_Alphabetic # Mn COMBINING GREEK YPOGEGRAMMENI +0363..036F ; Other_Alphabetic # Mn [13] COMBINING LATIN SMALL LETTER A..COMBINING LATIN SMALL LETTER X +05B0..05BD ; Other_Alphabetic # Mn [14] HEBREW POINT SHEVA..HEBREW POINT METEG +05BF ; Other_Alphabetic # Mn HEBREW POINT RAFE +05C1..05C2 ; Other_Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; Other_Alphabetic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; Other_Alphabetic # Mn HEBREW POINT QAMATS QATAN +0610..061A ; Other_Alphabetic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +064B..0657 ; Other_Alphabetic # Mn [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA +0659..065F ; Other_Alphabetic # Mn [7] ARABIC ZWARAKAY..ARABIC WAVY HAMZA BELOW +0670 ; Other_Alphabetic # Mn ARABIC LETTER SUPERSCRIPT ALEF +06D6..06DC ; Other_Alphabetic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06E1..06E4 ; Other_Alphabetic # Mn [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA +06E7..06E8 ; Other_Alphabetic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06ED ; Other_Alphabetic # Mn ARABIC SMALL LOW MEEM +0711 ; Other_Alphabetic # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0730..073F ; Other_Alphabetic # Mn [16] SYRIAC PTHAHA ABOVE..SYRIAC RWAHA +07A6..07B0 ; Other_Alphabetic # Mn [11] THAANA ABAFILI..THAANA SUKUN +0816..0817 ; Other_Alphabetic # Mn [2] SAMARITAN MARK IN..SAMARITAN MARK IN-ALAF +081B..0823 ; Other_Alphabetic # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0825..0827 ; Other_Alphabetic # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0829..082C ; Other_Alphabetic # Mn [4] SAMARITAN VOWEL SIGN LONG I..SAMARITAN VOWEL SIGN SUKUN +0897 ; Other_Alphabetic # Mn ARABIC PEPET +08D4..08DF ; Other_Alphabetic # Mn [12] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH WORD WAQFA +08E3..08E9 ; Other_Alphabetic # Mn [7] ARABIC TURNED DAMMA BELOW..ARABIC CURLY KASRATAN +08F0..0902 ; Other_Alphabetic # Mn [19] ARABIC OPEN FATHATAN..DEVANAGARI SIGN ANUSVARA +0903 ; Other_Alphabetic # Mc DEVANAGARI SIGN VISARGA +093A ; Other_Alphabetic # Mn DEVANAGARI VOWEL SIGN OE +093B ; Other_Alphabetic # Mc DEVANAGARI VOWEL SIGN OOE +093E..0940 ; Other_Alphabetic # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; Other_Alphabetic # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; Other_Alphabetic # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094E..094F ; Other_Alphabetic # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0955..0957 ; Other_Alphabetic # Mn [3] DEVANAGARI VOWEL SIGN CANDRA LONG E..DEVANAGARI VOWEL SIGN UUE +0962..0963 ; Other_Alphabetic # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0981 ; Other_Alphabetic # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; Other_Alphabetic # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +09BE..09C0 ; Other_Alphabetic # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; Other_Alphabetic # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09D7 ; Other_Alphabetic # Mc BENGALI AU LENGTH MARK +09E2..09E3 ; Other_Alphabetic # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +0A01..0A02 ; Other_Alphabetic # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; Other_Alphabetic # Mc GURMUKHI SIGN VISARGA +0A3E..0A40 ; Other_Alphabetic # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4C ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU +0A51 ; Other_Alphabetic # Mn GURMUKHI SIGN UDAAT +0A70..0A71 ; Other_Alphabetic # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A75 ; Other_Alphabetic # Mn GURMUKHI SIGN YAKASH +0A81..0A82 ; Other_Alphabetic # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; Other_Alphabetic # Mc GUJARATI SIGN VISARGA +0ABE..0AC0 ; Other_Alphabetic # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; Other_Alphabetic # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; Other_Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; Other_Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0AE2..0AE3 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AFA..0AFC ; Other_Alphabetic # Mn [3] GUJARATI SIGN SUKUN..GUJARATI SIGN MADDAH +0B01 ; Other_Alphabetic # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; Other_Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B3E ; Other_Alphabetic # Mc ORIYA VOWEL SIGN AA +0B3F ; Other_Alphabetic # Mn ORIYA VOWEL SIGN I +0B40 ; Other_Alphabetic # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; Other_Alphabetic # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; Other_Alphabetic # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; Other_Alphabetic # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B56 ; Other_Alphabetic # Mn ORIYA AI LENGTH MARK +0B57 ; Other_Alphabetic # Mc ORIYA AU LENGTH MARK +0B62..0B63 ; Other_Alphabetic # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B82 ; Other_Alphabetic # Mn TAMIL SIGN ANUSVARA +0BBE..0BBF ; Other_Alphabetic # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; Other_Alphabetic # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; Other_Alphabetic # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; Other_Alphabetic # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; Other_Alphabetic # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BD7 ; Other_Alphabetic # Mc TAMIL AU LENGTH MARK +0C00 ; Other_Alphabetic # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; Other_Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; Other_Alphabetic # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C3E..0C40 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; Other_Alphabetic # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4C ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU +0C55..0C56 ; Other_Alphabetic # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C62..0C63 ; Other_Alphabetic # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C81 ; Other_Alphabetic # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; Other_Alphabetic # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0CBE ; Other_Alphabetic # Mc KANNADA VOWEL SIGN AA +0CBF ; Other_Alphabetic # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; Other_Alphabetic # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; Other_Alphabetic # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; Other_Alphabetic # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Other_Alphabetic # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC ; Other_Alphabetic # Mn KANNADA VOWEL SIGN AU +0CD5..0CD6 ; Other_Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CE2..0CE3 ; Other_Alphabetic # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CF3 ; Other_Alphabetic # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT +0D00..0D01 ; Other_Alphabetic # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; Other_Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D3E..0D40 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; Other_Alphabetic # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D57 ; Other_Alphabetic # Mc MALAYALAM AU LENGTH MARK +0D62..0D63 ; Other_Alphabetic # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D81 ; Other_Alphabetic # Mn SINHALA SIGN CANDRABINDU +0D82..0D83 ; Other_Alphabetic # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0DCF..0DD1 ; Other_Alphabetic # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; Other_Alphabetic # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; Other_Alphabetic # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; Other_Alphabetic # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DF2..0DF3 ; Other_Alphabetic # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0E31 ; Other_Alphabetic # Mn THAI CHARACTER MAI HAN-AKAT +0E34..0E3A ; Other_Alphabetic # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E4D ; Other_Alphabetic # Mn THAI CHARACTER NIKHAHIT +0EB1 ; Other_Alphabetic # Mn LAO VOWEL SIGN MAI KAN +0EB4..0EB9 ; Other_Alphabetic # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; Other_Alphabetic # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0ECD ; Other_Alphabetic # Mn LAO NIGGAHITA +0F71..0F7E ; Other_Alphabetic # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; Other_Alphabetic # Mc TIBETAN SIGN RNAM BCAD +0F80..0F83 ; Other_Alphabetic # Mn [4] TIBETAN VOWEL SIGN REVERSED I..TIBETAN SIGN SNA LDAN +0F8D..0F97 ; Other_Alphabetic # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; Other_Alphabetic # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +102B..102C ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; Other_Alphabetic # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; Other_Alphabetic # Mc MYANMAR VOWEL SIGN E +1032..1036 ; Other_Alphabetic # Mn [5] MYANMAR VOWEL SIGN AI..MYANMAR SIGN ANUSVARA +1038 ; Other_Alphabetic # Mc MYANMAR SIGN VISARGA +103B..103C ; Other_Alphabetic # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; Other_Alphabetic # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +1056..1057 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; Other_Alphabetic # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105E..1060 ; Other_Alphabetic # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1062..1064 ; Other_Alphabetic # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1067..106D ; Other_Alphabetic # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +1071..1074 ; Other_Alphabetic # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1082 ; Other_Alphabetic # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; Other_Alphabetic # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C ; Other_Alphabetic # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; Other_Alphabetic # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108F ; Other_Alphabetic # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +109A..109C ; Other_Alphabetic # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D ; Other_Alphabetic # Mn MYANMAR VOWEL SIGN AITON AI +1712..1713 ; Other_Alphabetic # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U +1732..1733 ; Other_Alphabetic # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1752..1753 ; Other_Alphabetic # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1772..1773 ; Other_Alphabetic # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +17B6 ; Other_Alphabetic # Mc KHMER VOWEL SIGN AA +17B7..17BD ; Other_Alphabetic # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; Other_Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; Other_Alphabetic # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; Other_Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +1885..1886 ; Other_Alphabetic # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +18A9 ; Other_Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA +1920..1922 ; Other_Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; Other_Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; Other_Alphabetic # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; Other_Alphabetic # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; Other_Alphabetic # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; Other_Alphabetic # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; Other_Alphabetic # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1A17..1A18 ; Other_Alphabetic # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; Other_Alphabetic # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; Other_Alphabetic # Mn BUGINESE VOWEL SIGN AE +1A55 ; Other_Alphabetic # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; Other_Alphabetic # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; Other_Alphabetic # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; Other_Alphabetic # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A61 ; Other_Alphabetic # Mc TAI THAM VOWEL SIGN A +1A62 ; Other_Alphabetic # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; Other_Alphabetic # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; Other_Alphabetic # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; Other_Alphabetic # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A74 ; Other_Alphabetic # Mn [2] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN MAI KANG +1ABF..1AC0 ; Other_Alphabetic # Mn [2] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER TURNED W BELOW +1ACC..1ACE ; Other_Alphabetic # Mn [3] COMBINING LATIN SMALL LETTER INSULAR G..COMBINING LATIN SMALL LETTER INSULAR T +1B00..1B03 ; Other_Alphabetic # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; Other_Alphabetic # Mc BALINESE SIGN BISAH +1B35 ; Other_Alphabetic # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; Other_Alphabetic # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; Other_Alphabetic # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; Other_Alphabetic # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; Other_Alphabetic # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; Other_Alphabetic # Mn BALINESE VOWEL SIGN PEPET +1B43 ; Other_Alphabetic # Mc BALINESE VOWEL SIGN PEPET TEDUNG +1B80..1B81 ; Other_Alphabetic # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; Other_Alphabetic # Mc SUNDANESE SIGN PANGWISAD +1BA1 ; Other_Alphabetic # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; Other_Alphabetic # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; Other_Alphabetic # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; Other_Alphabetic # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAC..1BAD ; Other_Alphabetic # Mn [2] SUNDANESE CONSONANT SIGN PASANGAN MA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BE7 ; Other_Alphabetic # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; Other_Alphabetic # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; Other_Alphabetic # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; Other_Alphabetic # Mn BATAK VOWEL SIGN KARO O +1BEE ; Other_Alphabetic # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; Other_Alphabetic # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1C24..1C2B ; Other_Alphabetic # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; Other_Alphabetic # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; Other_Alphabetic # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36 ; Other_Alphabetic # Mn LEPCHA SIGN RAN +1DD3..1DF4 ; Other_Alphabetic # Mn [34] COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE..COMBINING LATIN SMALL LETTER U WITH DIAERESIS +24B6..24E9 ; Other_Alphabetic # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z +2DE0..2DFF ; Other_Alphabetic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +A674..A67B ; Other_Alphabetic # Mn [8] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC LETTER OMEGA +A69E..A69F ; Other_Alphabetic # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A802 ; Other_Alphabetic # Mn SYLOTI NAGRI SIGN DVISVARA +A80B ; Other_Alphabetic # Mn SYLOTI NAGRI SIGN ANUSVARA +A823..A824 ; Other_Alphabetic # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; Other_Alphabetic # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; Other_Alphabetic # Mc SYLOTI NAGRI VOWEL SIGN OO +A880..A881 ; Other_Alphabetic # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A8B4..A8C3 ; Other_Alphabetic # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C5 ; Other_Alphabetic # Mn SAURASHTRA SIGN CANDRABINDU +A8FF ; Other_Alphabetic # Mn DEVANAGARI VOWEL SIGN AY +A926..A92A ; Other_Alphabetic # Mn [5] KAYAH LI VOWEL UE..KAYAH LI VOWEL O +A947..A951 ; Other_Alphabetic # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952 ; Other_Alphabetic # Mc REJANG CONSONANT SIGN H +A980..A982 ; Other_Alphabetic # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; Other_Alphabetic # Mc JAVANESE SIGN WIGNYAN +A9B4..A9B5 ; Other_Alphabetic # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; Other_Alphabetic # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; Other_Alphabetic # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC..A9BD ; Other_Alphabetic # Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET +A9BE..A9BF ; Other_Alphabetic # Mc [2] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE CONSONANT SIGN CAKRA +A9E5 ; Other_Alphabetic # Mn MYANMAR SIGN SHAN SAW +AA29..AA2E ; Other_Alphabetic # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; Other_Alphabetic # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; Other_Alphabetic # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; Other_Alphabetic # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; Other_Alphabetic # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA43 ; Other_Alphabetic # Mn CHAM CONSONANT SIGN FINAL NG +AA4C ; Other_Alphabetic # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; Other_Alphabetic # Mc CHAM CONSONANT SIGN FINAL H +AA7B ; Other_Alphabetic # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; Other_Alphabetic # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; Other_Alphabetic # Mc MYANMAR SIGN TAI LAING TONE-5 +AAB0 ; Other_Alphabetic # Mn TAI VIET MAI KANG +AAB2..AAB4 ; Other_Alphabetic # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB7..AAB8 ; Other_Alphabetic # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AABE ; Other_Alphabetic # Mn TAI VIET VOWEL AM +AAEB ; Other_Alphabetic # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; Other_Alphabetic # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF5 ; Other_Alphabetic # Mc MEETEI MAYEK VOWEL SIGN VISARGA +ABE3..ABE4 ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; Other_Alphabetic # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; Other_Alphabetic # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; Other_Alphabetic # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA +10376..1037A ; Other_Alphabetic # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10A01..10A03 ; Other_Alphabetic # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; Other_Alphabetic # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; Other_Alphabetic # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10D24..10D27 ; Other_Alphabetic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D69 ; Other_Alphabetic # Mn GARAY VOWEL SIGN E +10EAB..10EAC ; Other_Alphabetic # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EFA..10EFC ; Other_Alphabetic # Mn [3] ARABIC DOUBLE VERTICAL BAR BELOW..ARABIC COMBINING ALEF OVERLAY +11000 ; Other_Alphabetic # Mc BRAHMI SIGN CANDRABINDU +11001 ; Other_Alphabetic # Mn BRAHMI SIGN ANUSVARA +11002 ; Other_Alphabetic # Mc BRAHMI SIGN VISARGA +11038..11045 ; Other_Alphabetic # Mn [14] BRAHMI VOWEL SIGN AA..BRAHMI VOWEL SIGN AU +11073..11074 ; Other_Alphabetic # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O +11080..11081 ; Other_Alphabetic # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA +11082 ; Other_Alphabetic # Mc KAITHI SIGN VISARGA +110B0..110B2 ; Other_Alphabetic # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; Other_Alphabetic # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; Other_Alphabetic # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110C2 ; Other_Alphabetic # Mn KAITHI VOWEL SIGN VOCALIC R +11100..11102 ; Other_Alphabetic # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11127..1112B ; Other_Alphabetic # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; Other_Alphabetic # Mc CHAKMA VOWEL SIGN E +1112D..11132 ; Other_Alphabetic # Mn [6] CHAKMA VOWEL SIGN AI..CHAKMA AU MARK +11145..11146 ; Other_Alphabetic # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11180..11181 ; Other_Alphabetic # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; Other_Alphabetic # Mc SHARADA SIGN VISARGA +111B3..111B5 ; Other_Alphabetic # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; Other_Alphabetic # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF ; Other_Alphabetic # Mc SHARADA VOWEL SIGN AU +111CE ; Other_Alphabetic # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E +111CF ; Other_Alphabetic # Mn SHARADA SIGN INVERTED CANDRABINDU +1122C..1122E ; Other_Alphabetic # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; Other_Alphabetic # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; Other_Alphabetic # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; Other_Alphabetic # Mn KHOJKI SIGN ANUSVARA +11237 ; Other_Alphabetic # Mn KHOJKI SIGN SHADDA +1123E ; Other_Alphabetic # Mn KHOJKI SIGN SUKUN +11241 ; Other_Alphabetic # Mn KHOJKI VOWEL SIGN VOCALIC R +112DF ; Other_Alphabetic # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; Other_Alphabetic # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112E8 ; Other_Alphabetic # Mn [6] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN AU +11300..11301 ; Other_Alphabetic # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; Other_Alphabetic # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +1133E..1133F ; Other_Alphabetic # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; Other_Alphabetic # Mn GRANTHA VOWEL SIGN II +11341..11344 ; Other_Alphabetic # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; Other_Alphabetic # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134C ; Other_Alphabetic # Mc [2] GRANTHA VOWEL SIGN OO..GRANTHA VOWEL SIGN AU +11357 ; Other_Alphabetic # Mc GRANTHA AU LENGTH MARK +11362..11363 ; Other_Alphabetic # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +113B8..113BA ; Other_Alphabetic # Mc [3] TULU-TIGALARI VOWEL SIGN AA..TULU-TIGALARI VOWEL SIGN II +113BB..113C0 ; Other_Alphabetic # Mn [6] TULU-TIGALARI VOWEL SIGN U..TULU-TIGALARI VOWEL SIGN VOCALIC LL +113C2 ; Other_Alphabetic # Mc TULU-TIGALARI VOWEL SIGN EE +113C5 ; Other_Alphabetic # Mc TULU-TIGALARI VOWEL SIGN AI +113C7..113CA ; Other_Alphabetic # Mc [4] TULU-TIGALARI VOWEL SIGN OO..TULU-TIGALARI SIGN CANDRA ANUNASIKA +113CC..113CD ; Other_Alphabetic # Mc [2] TULU-TIGALARI SIGN ANUSVARA..TULU-TIGALARI SIGN VISARGA +11435..11437 ; Other_Alphabetic # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; Other_Alphabetic # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; Other_Alphabetic # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11443..11444 ; Other_Alphabetic # Mn [2] NEWA SIGN CANDRABINDU..NEWA SIGN ANUSVARA +11445 ; Other_Alphabetic # Mc NEWA SIGN VISARGA +114B0..114B2 ; Other_Alphabetic # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; Other_Alphabetic # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; Other_Alphabetic # Mc TIRHUTA VOWEL SIGN E +114BA ; Other_Alphabetic # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; Other_Alphabetic # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; Other_Alphabetic # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; Other_Alphabetic # Mc TIRHUTA SIGN VISARGA +115AF..115B1 ; Other_Alphabetic # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; Other_Alphabetic # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; Other_Alphabetic # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; Other_Alphabetic # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; Other_Alphabetic # Mc SIDDHAM SIGN VISARGA +115DC..115DD ; Other_Alphabetic # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11630..11632 ; Other_Alphabetic # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; Other_Alphabetic # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; Other_Alphabetic # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; Other_Alphabetic # Mn MODI SIGN ANUSVARA +1163E ; Other_Alphabetic # Mc MODI SIGN VISARGA +11640 ; Other_Alphabetic # Mn MODI SIGN ARDHACANDRA +116AB ; Other_Alphabetic # Mn TAKRI SIGN ANUSVARA +116AC ; Other_Alphabetic # Mc TAKRI SIGN VISARGA +116AD ; Other_Alphabetic # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; Other_Alphabetic # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; Other_Alphabetic # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +1171D ; Other_Alphabetic # Mn AHOM CONSONANT SIGN MEDIAL LA +1171E ; Other_Alphabetic # Mc AHOM CONSONANT SIGN MEDIAL RA +1171F ; Other_Alphabetic # Mn AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; Other_Alphabetic # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; Other_Alphabetic # Mc AHOM VOWEL SIGN E +11727..1172A ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN AW..AHOM VOWEL SIGN AM +1182C..1182E ; Other_Alphabetic # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; Other_Alphabetic # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; Other_Alphabetic # Mc DOGRA SIGN VISARGA +11930..11935 ; Other_Alphabetic # Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E +11937..11938 ; Other_Alphabetic # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O +1193B..1193C ; Other_Alphabetic # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU +11940 ; Other_Alphabetic # Mc DIVES AKURU MEDIAL YA +11942 ; Other_Alphabetic # Mc DIVES AKURU MEDIAL RA +119D1..119D3 ; Other_Alphabetic # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II +119D4..119D7 ; Other_Alphabetic # Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR +119DA..119DB ; Other_Alphabetic # Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI +119DC..119DF ; Other_Alphabetic # Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA +119E4 ; Other_Alphabetic # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E +11A01..11A0A ; Other_Alphabetic # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A35..11A38 ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE SIGN CANDRABINDU..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; Other_Alphabetic # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3B..11A3E ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A51..11A56 ; Other_Alphabetic # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; Other_Alphabetic # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; Other_Alphabetic # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A8A..11A96 ; Other_Alphabetic # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; Other_Alphabetic # Mc SOYOMBO SIGN VISARGA +11B60 ; Other_Alphabetic # Mn SHARADA VOWEL SIGN OE +11B61 ; Other_Alphabetic # Mc SHARADA VOWEL SIGN OOE +11B62..11B64 ; Other_Alphabetic # Mn [3] SHARADA VOWEL SIGN UE..SHARADA VOWEL SIGN SHORT E +11B65 ; Other_Alphabetic # Mc SHARADA VOWEL SIGN SHORT O +11B66 ; Other_Alphabetic # Mn SHARADA VOWEL SIGN CANDRA E +11B67 ; Other_Alphabetic # Mc SHARADA VOWEL SIGN CANDRA O +11C2F ; Other_Alphabetic # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; Other_Alphabetic # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Other_Alphabetic # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; Other_Alphabetic # Mc BHAIKSUKI SIGN VISARGA +11C92..11CA7 ; Other_Alphabetic # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; Other_Alphabetic # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; Other_Alphabetic # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; Other_Alphabetic # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; Other_Alphabetic # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; Other_Alphabetic # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; Other_Alphabetic # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D31..11D36 ; Other_Alphabetic # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Other_Alphabetic # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Other_Alphabetic # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D41 ; Other_Alphabetic # Mn [3] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI SIGN VISARGA +11D43 ; Other_Alphabetic # Mn MASARAM GONDI SIGN CANDRA +11D47 ; Other_Alphabetic # Mn MASARAM GONDI RA-KARA +11D8A..11D8E ; Other_Alphabetic # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; Other_Alphabetic # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; Other_Alphabetic # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; Other_Alphabetic # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; Other_Alphabetic # Mc GUNJALA GONDI SIGN VISARGA +11EF3..11EF4 ; Other_Alphabetic # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; Other_Alphabetic # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11F00..11F01 ; Other_Alphabetic # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F03 ; Other_Alphabetic # Mc KAWI SIGN VISARGA +11F34..11F35 ; Other_Alphabetic # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; Other_Alphabetic # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; Other_Alphabetic # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; Other_Alphabetic # Mn KAWI VOWEL SIGN EU +1611E..16129 ; Other_Alphabetic # Mn [12] GURUNG KHEMA VOWEL SIGN AA..GURUNG KHEMA VOWEL LENGTH MARK +1612A..1612C ; Other_Alphabetic # Mc [3] GURUNG KHEMA CONSONANT SIGN MEDIAL YA..GURUNG KHEMA CONSONANT SIGN MEDIAL HA +1612D..1612E ; Other_Alphabetic # Mn [2] GURUNG KHEMA SIGN ANUSVARA..GURUNG KHEMA CONSONANT SIGN MEDIAL RA +16F4F ; Other_Alphabetic # Mn MIAO SIGN CONSONANT MODIFIER BAR +16F51..16F87 ; Other_Alphabetic # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI +16F8F..16F92 ; Other_Alphabetic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16FF0..16FF1 ; Other_Alphabetic # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +1BC9E ; Other_Alphabetic # Mn DUPLOYAN DOUBLE MARK +1E000..1E006 ; Other_Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Other_Alphabetic # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Other_Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Other_Alphabetic # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Other_Alphabetic # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E08F ; Other_Alphabetic # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +1E6E3 ; Other_Alphabetic # Mn TAI YO SIGN UE +1E6E6 ; Other_Alphabetic # Mn TAI YO SIGN AU +1E6EE..1E6EF ; Other_Alphabetic # Mn [2] TAI YO SIGN AY..TAI YO SIGN ANG +1E6F5 ; Other_Alphabetic # Mn TAI YO SIGN OM +1E947 ; Other_Alphabetic # Mn ADLAM HAMZA +1F130..1F149 ; Other_Alphabetic # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z +1F150..1F169 ; Other_Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F170..1F189 ; Other_Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z + +# Total code points: 1510 + +# ================================================ + +3006 ; Ideographic # Lo IDEOGRAPHIC CLOSING MARK +3007 ; Ideographic # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +3400..4DBF ; Ideographic # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +4E00..9FFF ; Ideographic # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF +F900..FA6D ; Ideographic # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +16FE4 ; Ideographic # Mn KHITAN SMALL SCRIPT FILLER +16FF2..16FF3 ; Ideographic # Lm [2] CHINESE SMALL SIMPLIFIED ER..CHINESE SMALL TRADITIONAL ER +16FF4..16FF6 ; Ideographic # Nl [3] YANGQIN SIGN SLOW ONE BEAT..YANGQIN SIGN SLOW TWO BEATS +17000..18CD5 ; Ideographic # Lo [7382] TANGUT IDEOGRAPH-17000..KHITAN SMALL SCRIPT CHARACTER-18CD5 +18CFF..18D1E ; Ideographic # Lo [32] KHITAN SMALL SCRIPT CHARACTER-18CFF..TANGUT IDEOGRAPH-18D1E +18D80..18DF2 ; Ideographic # Lo [115] TANGUT COMPONENT-769..TANGUT COMPONENT-883 +1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +20000..2A6DF ; Ideographic # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A700..2B81D ; Ideographic # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEAD ; Ideographic # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD +2CEB0..2EBE0 ; Ideographic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; Ideographic # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D +2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +30000..3134A ; Ideographic # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..33479 ; Ideographic # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 + +# Total code points: 110943 + +# ================================================ + +005E ; Diacritic # Sk CIRCUMFLEX ACCENT +0060 ; Diacritic # Sk GRAVE ACCENT +00A8 ; Diacritic # Sk DIAERESIS +00AF ; Diacritic # Sk MACRON +00B4 ; Diacritic # Sk ACUTE ACCENT +00B7 ; Diacritic # Po MIDDLE DOT +00B8 ; Diacritic # Sk CEDILLA +02B0..02C1 ; Diacritic # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; Diacritic # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02D1 ; Diacritic # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02DF ; Diacritic # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +02E0..02E4 ; Diacritic # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02EB ; Diacritic # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; Diacritic # Lm MODIFIER LETTER VOICING +02ED ; Diacritic # Sk MODIFIER LETTER UNASPIRATED +02EE ; Diacritic # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; Diacritic # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0300..034E ; Diacritic # Mn [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW +0350..0357 ; Diacritic # Mn [8] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING RIGHT HALF RING ABOVE +035D..0362 ; Diacritic # Mn [6] COMBINING DOUBLE BREVE..COMBINING DOUBLE RIGHTWARDS ARROW BELOW +0374 ; Diacritic # Lm GREEK NUMERAL SIGN +0375 ; Diacritic # Sk GREEK LOWER NUMERAL SIGN +037A ; Diacritic # Lm GREEK YPOGEGRAMMENI +0384..0385 ; Diacritic # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0483..0487 ; Diacritic # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0559 ; Diacritic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +0591..05BD ; Diacritic # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BF ; Diacritic # Mn HEBREW POINT RAFE +05C1..05C2 ; Diacritic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4..05C5 ; Diacritic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C7 ; Diacritic # Mn HEBREW POINT QAMATS QATAN +064B..0652 ; Diacritic # Mn [8] ARABIC FATHATAN..ARABIC SUKUN +0657..0658 ; Diacritic # Mn [2] ARABIC INVERTED DAMMA..ARABIC MARK NOON GHUNNA +06DF..06E0 ; Diacritic # Mn [2] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO +06E5..06E6 ; Diacritic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06EA..06EC ; Diacritic # Mn [3] ARABIC EMPTY CENTRE LOW STOP..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE +0730..074A ; Diacritic # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +07A6..07B0 ; Diacritic # Mn [11] THAANA ABAFILI..THAANA SUKUN +07EB..07F3 ; Diacritic # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; Diacritic # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +0818..0819 ; Diacritic # Mn [2] SAMARITAN MARK OCCLUSION..SAMARITAN MARK DAGESH +0898..089F ; Diacritic # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA +08C9 ; Diacritic # Lm ARABIC SMALL FARSI YEH +08CA..08D2 ; Diacritic # Mn [9] ARABIC SMALL HIGH FARSI YEH..ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW +08E3..08FE ; Diacritic # Mn [28] ARABIC TURNED DAMMA BELOW..ARABIC DAMMA WITH DOT +093C ; Diacritic # Mn DEVANAGARI SIGN NUKTA +094D ; Diacritic # Mn DEVANAGARI SIGN VIRAMA +0951..0954 ; Diacritic # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT +0971 ; Diacritic # Lm DEVANAGARI SIGN HIGH SPACING DOT +09BC ; Diacritic # Mn BENGALI SIGN NUKTA +09CD ; Diacritic # Mn BENGALI SIGN VIRAMA +0A3C ; Diacritic # Mn GURMUKHI SIGN NUKTA +0A4D ; Diacritic # Mn GURMUKHI SIGN VIRAMA +0ABC ; Diacritic # Mn GUJARATI SIGN NUKTA +0ACD ; Diacritic # Mn GUJARATI SIGN VIRAMA +0AFD..0AFF ; Diacritic # Mn [3] GUJARATI SIGN THREE-DOT NUKTA ABOVE..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B3C ; Diacritic # Mn ORIYA SIGN NUKTA +0B4D ; Diacritic # Mn ORIYA SIGN VIRAMA +0B55 ; Diacritic # Mn ORIYA SIGN OVERLINE +0BCD ; Diacritic # Mn TAMIL SIGN VIRAMA +0C3C ; Diacritic # Mn TELUGU SIGN NUKTA +0C4D ; Diacritic # Mn TELUGU SIGN VIRAMA +0CBC ; Diacritic # Mn KANNADA SIGN NUKTA +0CCD ; Diacritic # Mn KANNADA SIGN VIRAMA +0D3B..0D3C ; Diacritic # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D4D ; Diacritic # Mn MALAYALAM SIGN VIRAMA +0DCA ; Diacritic # Mn SINHALA SIGN AL-LAKUNA +0E3A ; Diacritic # Mn THAI CHARACTER PHINTHU +0E47..0E4C ; Diacritic # Mn [6] THAI CHARACTER MAITAIKHU..THAI CHARACTER THANTHAKHAT +0E4E ; Diacritic # Mn THAI CHARACTER YAMAKKAN +0EBA ; Diacritic # Mn LAO SIGN PALI VIRAMA +0EC8..0ECC ; Diacritic # Mn [5] LAO TONE MAI EK..LAO CANCELLATION MARK +0F18..0F19 ; Diacritic # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F35 ; Diacritic # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F37 ; Diacritic # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F39 ; Diacritic # Mn TIBETAN MARK TSA -PHRU +0F3E..0F3F ; Diacritic # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F82..0F84 ; Diacritic # Mn [3] TIBETAN SIGN NYI ZLA NAA DA..TIBETAN MARK HALANTA +0F86..0F87 ; Diacritic # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0FC6 ; Diacritic # Mn TIBETAN SYMBOL PADMA GDAN +1037 ; Diacritic # Mn MYANMAR SIGN DOT BELOW +1039..103A ; Diacritic # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +1063..1064 ; Diacritic # Mc [2] MYANMAR TONE MARK SGAW KAREN HATHI..MYANMAR TONE MARK SGAW KAREN KE PHO +1069..106D ; Diacritic # Mc [5] MYANMAR SIGN WESTERN PWO KAREN TONE-1..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +1087..108C ; Diacritic # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; Diacritic # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108F ; Diacritic # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +109A..109B ; Diacritic # Mc [2] MYANMAR SIGN KHAMTI TONE-1..MYANMAR SIGN KHAMTI TONE-3 +135D..135F ; Diacritic # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1714 ; Diacritic # Mn TAGALOG SIGN VIRAMA +1715 ; Diacritic # Mc TAGALOG SIGN PAMUDPOD +1734 ; Diacritic # Mc HANUNOO SIGN PAMUDPOD +17C9..17D3 ; Diacritic # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17DD ; Diacritic # Mn KHMER SIGN ATTHACAN +1939..193B ; Diacritic # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1A60 ; Diacritic # Mn TAI THAM SIGN SAKOT +1A75..1A7C ; Diacritic # Mn [8] TAI THAM SIGN TONE-1..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; Diacritic # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1AB0..1ABD ; Diacritic # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; Diacritic # Me COMBINING PARENTHESES OVERLAY +1AC1..1ACB ; Diacritic # Mn [11] COMBINING LEFT PARENTHESIS ABOVE LEFT..COMBINING TRIPLE ACUTE ACCENT +1ACF..1ADD ; Diacritic # Mn [15] COMBINING DOUBLE CARON..COMBINING DOT-AND-RING BELOW +1AE0..1AEB ; Diacritic # Mn [12] COMBINING LEFT TACK ABOVE..COMBINING DOUBLE RIGHTWARDS ARROW ABOVE +1B34 ; Diacritic # Mn BALINESE SIGN REREKAN +1B44 ; Diacritic # Mc BALINESE ADEG ADEG +1B6B..1B73 ; Diacritic # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1BAA ; Diacritic # Mc SUNDANESE SIGN PAMAAEH +1BAB ; Diacritic # Mn SUNDANESE SIGN VIRAMA +1BE6 ; Diacritic # Mn BATAK SIGN TOMPI +1BF2..1BF3 ; Diacritic # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1C36..1C37 ; Diacritic # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C78..1C7D ; Diacritic # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1CD0..1CD2 ; Diacritic # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD3 ; Diacritic # Po VEDIC SIGN NIHSHVASA +1CD4..1CE0 ; Diacritic # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1 ; Diacritic # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2..1CE8 ; Diacritic # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CED ; Diacritic # Mn VEDIC SIGN TIRYAK +1CF4 ; Diacritic # Mn VEDIC TONE CANDRA ABOVE +1CF7 ; Diacritic # Mc VEDIC SIGN ATIKRAMA +1CF8..1CF9 ; Diacritic # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1D2C..1D6A ; Diacritic # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D9B..1DBE ; Diacritic # Lm [36] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL EZH +1DC4..1DCF ; Diacritic # Mn [12] COMBINING MACRON-ACUTE..COMBINING ZIGZAG BELOW +1DF5..1DFF ; Diacritic # Mn [11] COMBINING UP TACK ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1FBD ; Diacritic # Sk GREEK KORONIS +1FBF..1FC1 ; Diacritic # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FCD..1FCF ; Diacritic # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FDD..1FDF ; Diacritic # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FED..1FEF ; Diacritic # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FFD..1FFE ; Diacritic # Sk [2] GREEK OXIA..GREEK DASIA +2CEF..2CF1 ; Diacritic # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2E2F ; Diacritic # Lm VERTICAL TILDE +302A..302D ; Diacritic # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F ; Diacritic # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3099..309A ; Diacritic # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C ; Diacritic # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +30FC ; Diacritic # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK +A66F ; Diacritic # Mn COMBINING CYRILLIC VZMET +A67C..A67D ; Diacritic # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK +A67F ; Diacritic # Lm CYRILLIC PAYEROK +A69C..A69D ; Diacritic # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A6F0..A6F1 ; Diacritic # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A700..A716 ; Diacritic # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F ; Diacritic # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; Diacritic # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A788 ; Diacritic # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; Diacritic # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A7F1 ; Diacritic # Lm MODIFIER LETTER CAPITAL S +A7F8..A7F9 ; Diacritic # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A806 ; Diacritic # Mn SYLOTI NAGRI SIGN HASANTA +A82C ; Diacritic # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA +A8C4 ; Diacritic # Mn SAURASHTRA SIGN VIRAMA +A8E0..A8F1 ; Diacritic # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A92B..A92D ; Diacritic # Mn [3] KAYAH LI TONE PLOPHU..KAYAH LI TONE CALYA PLOPHU +A92E ; Diacritic # Po KAYAH LI SIGN CWI +A953 ; Diacritic # Mc REJANG VIRAMA +A9B3 ; Diacritic # Mn JAVANESE SIGN CECAK TELU +A9C0 ; Diacritic # Mc JAVANESE PANGKON +A9E5 ; Diacritic # Mn MYANMAR SIGN SHAN SAW +AA7B ; Diacritic # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; Diacritic # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; Diacritic # Mc MYANMAR SIGN TAI LAING TONE-5 +AABF ; Diacritic # Mn TAI VIET TONE MAI EK +AAC0 ; Diacritic # Lo TAI VIET TONE MAI NUENG +AAC1 ; Diacritic # Mn TAI VIET TONE MAI THO +AAC2 ; Diacritic # Lo TAI VIET TONE MAI SONG +AAF6 ; Diacritic # Mn MEETEI MAYEK VIRAMA +AB5B ; Diacritic # Sk MODIFIER BREVE WITH INVERTED BREVE +AB5C..AB5F ; Diacritic # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB69 ; Diacritic # Lm MODIFIER LETTER SMALL TURNED W +AB6A..AB6B ; Diacritic # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +ABEC ; Diacritic # Mc MEETEI MAYEK LUM IYEK +ABED ; Diacritic # Mn MEETEI MAYEK APUN IYEK +FB1E ; Diacritic # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FE20..FE2F ; Diacritic # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FF3E ; Diacritic # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF40 ; Diacritic # Sk FULLWIDTH GRAVE ACCENT +FF70 ; Diacritic # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF9E..FF9F ; Diacritic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFE3 ; Diacritic # Sk FULLWIDTH MACRON +102E0 ; Diacritic # Mn COPTIC EPACT THOUSANDS MARK +10780..10785 ; Diacritic # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0 ; Diacritic # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA ; Diacritic # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +10A38..10A3A ; Diacritic # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; Diacritic # Mn KHAROSHTHI VIRAMA +10AE5..10AE6 ; Diacritic # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10D22..10D23 ; Diacritic # Lo [2] HANIFI ROHINGYA MARK SAKIN..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; Diacritic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D4E ; Diacritic # Lm GARAY VOWEL LENGTH MARK +10D69..10D6D ; Diacritic # Mn [5] GARAY VOWEL SIGN E..GARAY CONSONANT NASALIZATION MARK +10EFA ; Diacritic # Mn ARABIC DOUBLE VERTICAL BAR BELOW +10EFD..10EFF ; Diacritic # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA +10F46..10F50 ; Diacritic # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F82..10F85 ; Diacritic # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW +11046 ; Diacritic # Mn BRAHMI VIRAMA +11070 ; Diacritic # Mn BRAHMI SIGN OLD TAMIL VIRAMA +110B9..110BA ; Diacritic # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +11133..11134 ; Diacritic # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA +11173 ; Diacritic # Mn MAHAJANI SIGN NUKTA +111C0 ; Diacritic # Mc SHARADA SIGN VIRAMA +111CA..111CC ; Diacritic # Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK +11235 ; Diacritic # Mc KHOJKI SIGN VIRAMA +11236 ; Diacritic # Mn KHOJKI SIGN NUKTA +112E9..112EA ; Diacritic # Mn [2] KHUDAWADI SIGN NUKTA..KHUDAWADI SIGN VIRAMA +1133B..1133C ; Diacritic # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1134D ; Diacritic # Mc GRANTHA SIGN VIRAMA +11366..1136C ; Diacritic # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; Diacritic # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +113CE ; Diacritic # Mn TULU-TIGALARI SIGN VIRAMA +113CF ; Diacritic # Mc TULU-TIGALARI SIGN LOOPED VIRAMA +113D0 ; Diacritic # Mn TULU-TIGALARI CONJOINER +113D2 ; Diacritic # Mn TULU-TIGALARI GEMINATION MARK +113D3 ; Diacritic # Lo TULU-TIGALARI SIGN PLUTA +113E1..113E2 ; Diacritic # Mn [2] TULU-TIGALARI VEDIC TONE SVARITA..TULU-TIGALARI VEDIC TONE ANUDATTA +11442 ; Diacritic # Mn NEWA SIGN VIRAMA +11446 ; Diacritic # Mn NEWA SIGN NUKTA +114C2..114C3 ; Diacritic # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +115BF..115C0 ; Diacritic # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +1163F ; Diacritic # Mn MODI SIGN VIRAMA +116B6 ; Diacritic # Mc TAKRI SIGN VIRAMA +116B7 ; Diacritic # Mn TAKRI SIGN NUKTA +1172B ; Diacritic # Mn AHOM SIGN KILLER +11839..1183A ; Diacritic # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +1193D ; Diacritic # Mc DIVES AKURU SIGN HALANTA +1193E ; Diacritic # Mn DIVES AKURU VIRAMA +11943 ; Diacritic # Mn DIVES AKURU SIGN NUKTA +119E0 ; Diacritic # Mn NANDINAGARI SIGN VIRAMA +11A34 ; Diacritic # Mn ZANABAZAR SQUARE SIGN VIRAMA +11A47 ; Diacritic # Mn ZANABAZAR SQUARE SUBJOINER +11A99 ; Diacritic # Mn SOYOMBO SUBJOINER +11C3F ; Diacritic # Mn BHAIKSUKI SIGN VIRAMA +11D42 ; Diacritic # Mn MASARAM GONDI SIGN NUKTA +11D44..11D45 ; Diacritic # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA +11D97 ; Diacritic # Mn GUNJALA GONDI VIRAMA +11DD9 ; Diacritic # Lm TOLONG SIKI SIGN SELA +11F41 ; Diacritic # Mc KAWI SIGN KILLER +11F42 ; Diacritic # Mn KAWI CONJOINER +11F5A ; Diacritic # Mn KAWI SIGN NUKTA +13447..13455 ; Diacritic # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED +1612F ; Diacritic # Mn GURUNG KHEMA SIGN THOLHOMA +16AF0..16AF4 ; Diacritic # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16B30..16B36 ; Diacritic # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16D6B..16D6C ; Diacritic # Lm [2] KIRAT RAI SIGN VIRAMA..KIRAT RAI SIGN SAAT +16F8F..16F92 ; Diacritic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; Diacritic # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FF0..16FF1 ; Diacritic # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +1AFF0..1AFF3 ; Diacritic # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 +1AFF5..1AFFB ; Diacritic # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 +1AFFD..1AFFE ; Diacritic # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 +1CF00..1CF2D ; Diacritic # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT +1CF30..1CF46 ; Diacritic # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1D167..1D169 ; Diacritic # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16D..1D172 ; Diacritic # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D17B..1D182 ; Diacritic # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; Diacritic # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; Diacritic # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1E030..1E06D ; Diacritic # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E130..1E136 ; Diacritic # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D +1E2AE ; Diacritic # Mn TOTO SIGN RISING TONE +1E2EC..1E2EF ; Diacritic # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E5EE..1E5EF ; Diacritic # Mn [2] OL ONAL SIGN MU..OL ONAL SIGN IKIR +1E8D0..1E8D6 ; Diacritic # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK +1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA + +# Total code points: 1247 + +# ================================================ + +00B7 ; Extender # Po MIDDLE DOT +02D0..02D1 ; Extender # Lm [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON +0640 ; Extender # Lm ARABIC TATWEEL +07FA ; Extender # Lm NKO LAJANYALAN +0A71 ; Extender # Mn GURMUKHI ADDAK +0AFB ; Extender # Mn GUJARATI SIGN SHADDA +0B55 ; Extender # Mn ORIYA SIGN OVERLINE +0E46 ; Extender # Lm THAI CHARACTER MAIYAMOK +0EC6 ; Extender # Lm LAO KO LA +180A ; Extender # Po MONGOLIAN NIRUGU +1843 ; Extender # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1AA7 ; Extender # Lm TAI THAM SIGN MAI YAMOK +1C36 ; Extender # Mn LEPCHA SIGN RAN +1C7B ; Extender # Lm OL CHIKI RELAA +3005 ; Extender # Lm IDEOGRAPHIC ITERATION MARK +3031..3035 ; Extender # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +309D..309E ; Extender # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +30FC..30FE ; Extender # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +A015 ; Extender # Lm YI SYLLABLE WU +A60C ; Extender # Lm VAI SYLLABLE LENGTHENER +A9CF ; Extender # Lm JAVANESE PANGRANGKEP +A9E6 ; Extender # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +AA70 ; Extender # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AADD ; Extender # Lm TAI VIET SYMBOL SAM +AAF3..AAF4 ; Extender # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +10781..10782 ; Extender # Lm [2] MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON..MODIFIER LETTER SUPERSCRIPT HALF TRIANGULAR COLON +10D4E ; Extender # Lm GARAY VOWEL LENGTH MARK +10D6A ; Extender # Mn GARAY CONSONANT GEMINATION MARK +10D6F ; Extender # Lm GARAY REDUPLICATION MARK +11237 ; Extender # Mn KHOJKI SIGN SHADDA +1135D ; Extender # Lo GRANTHA SIGN PLUTA +113D2 ; Extender # Mn TULU-TIGALARI GEMINATION MARK +113D3 ; Extender # Lo TULU-TIGALARI SIGN PLUTA +115C6..115C8 ; Extender # Po [3] SIDDHAM REPETITION MARK-1..SIDDHAM REPETITION MARK-3 +11A98 ; Extender # Mn SOYOMBO GEMINATION MARK +11DD9 ; Extender # Lm TOLONG SIKI SIGN SELA +16B42..16B43 ; Extender # Lm [2] PAHAWH HMONG SIGN VOS NRUA..PAHAWH HMONG SIGN IB YAM +16FE0..16FE1 ; Extender # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +16FE3 ; Extender # Lm OLD CHINESE ITERATION MARK +16FF2..16FF3 ; Extender # Lm [2] CHINESE SMALL SIMPLIFIED ER..CHINESE SMALL TRADITIONAL ER +1E13C..1E13D ; Extender # Lm [2] NYIAKENG PUACHUE HMONG SIGN XW XW..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER +1E5EF ; Extender # Mn OL ONAL SIGN IKIR +1E944..1E946 ; Extender # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK + +# Total code points: 62 + +# ================================================ + +00AA ; Other_Lowercase # Lo FEMININE ORDINAL INDICATOR +00BA ; Other_Lowercase # Lo MASCULINE ORDINAL INDICATOR +02B0..02B8 ; Other_Lowercase # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02C0..02C1 ; Other_Lowercase # Lm [2] MODIFIER LETTER GLOTTAL STOP..MODIFIER LETTER REVERSED GLOTTAL STOP +02E0..02E4 ; Other_Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +0345 ; Other_Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI +037A ; Other_Lowercase # Lm GREEK YPOGEGRAMMENI +10FC ; Other_Lowercase # Lm MODIFIER LETTER GEORGIAN NAR +1D2C..1D6A ; Other_Lowercase # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D78 ; Other_Lowercase # Lm MODIFIER LETTER CYRILLIC EN +1D9B..1DBF ; Other_Lowercase # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +2071 ; Other_Lowercase # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; Other_Lowercase # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; Other_Lowercase # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +2170..217F ; Other_Lowercase # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND +24D0..24E9 ; Other_Lowercase # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +2C7C..2C7D ; Other_Lowercase # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +A69C..A69D ; Other_Lowercase # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A770 ; Other_Lowercase # Lm MODIFIER LETTER US +A7F1..A7F4 ; Other_Lowercase # Lm [4] MODIFIER LETTER CAPITAL S..MODIFIER LETTER CAPITAL Q +A7F8..A7F9 ; Other_Lowercase # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +AB5C..AB5F ; Other_Lowercase # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB69 ; Other_Lowercase # Lm MODIFIER LETTER SMALL TURNED W +10780 ; Other_Lowercase # Lm MODIFIER LETTER SMALL CAPITAL AA +10783..10785 ; Other_Lowercase # Lm [3] MODIFIER LETTER SMALL AE..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0 ; Other_Lowercase # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA ; Other_Lowercase # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +1E030..1E06D ; Other_Lowercase # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE + +# Total code points: 312 + +# ================================================ + +2160..216F ; Other_Uppercase # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND +24B6..24CF ; Other_Uppercase # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z +1F130..1F149 ; Other_Uppercase # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z +1F150..1F169 ; Other_Uppercase # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F170..1F189 ; Other_Uppercase # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z + +# Total code points: 120 + +# ================================================ + +FDD0..FDEF ; Noncharacter_Code_Point # Cn [32] .. +FFFE..FFFF ; Noncharacter_Code_Point # Cn [2] .. +1FFFE..1FFFF ; Noncharacter_Code_Point # Cn [2] .. +2FFFE..2FFFF ; Noncharacter_Code_Point # Cn [2] .. +3FFFE..3FFFF ; Noncharacter_Code_Point # Cn [2] .. +4FFFE..4FFFF ; Noncharacter_Code_Point # Cn [2] .. +5FFFE..5FFFF ; Noncharacter_Code_Point # Cn [2] .. +6FFFE..6FFFF ; Noncharacter_Code_Point # Cn [2] .. +7FFFE..7FFFF ; Noncharacter_Code_Point # Cn [2] .. +8FFFE..8FFFF ; Noncharacter_Code_Point # Cn [2] .. +9FFFE..9FFFF ; Noncharacter_Code_Point # Cn [2] .. +AFFFE..AFFFF ; Noncharacter_Code_Point # Cn [2] .. +BFFFE..BFFFF ; Noncharacter_Code_Point # Cn [2] .. +CFFFE..CFFFF ; Noncharacter_Code_Point # Cn [2] .. +DFFFE..DFFFF ; Noncharacter_Code_Point # Cn [2] .. +EFFFE..EFFFF ; Noncharacter_Code_Point # Cn [2] .. +FFFFE..FFFFF ; Noncharacter_Code_Point # Cn [2] .. +10FFFE..10FFFF; Noncharacter_Code_Point # Cn [2] .. + +# Total code points: 66 + +# ================================================ + +09BE ; Other_Grapheme_Extend # Mc BENGALI VOWEL SIGN AA +09D7 ; Other_Grapheme_Extend # Mc BENGALI AU LENGTH MARK +0B3E ; Other_Grapheme_Extend # Mc ORIYA VOWEL SIGN AA +0B57 ; Other_Grapheme_Extend # Mc ORIYA AU LENGTH MARK +0BBE ; Other_Grapheme_Extend # Mc TAMIL VOWEL SIGN AA +0BD7 ; Other_Grapheme_Extend # Mc TAMIL AU LENGTH MARK +0CC0 ; Other_Grapheme_Extend # Mc KANNADA VOWEL SIGN II +0CC2 ; Other_Grapheme_Extend # Mc KANNADA VOWEL SIGN UU +0CC7..0CC8 ; Other_Grapheme_Extend # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Other_Grapheme_Extend # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CD5..0CD6 ; Other_Grapheme_Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0D3E ; Other_Grapheme_Extend # Mc MALAYALAM VOWEL SIGN AA +0D57 ; Other_Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK +0DCF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA +0DDF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA +1715 ; Other_Grapheme_Extend # Mc TAGALOG SIGN PAMUDPOD +1734 ; Other_Grapheme_Extend # Mc HANUNOO SIGN PAMUDPOD +1B35 ; Other_Grapheme_Extend # Mc BALINESE VOWEL SIGN TEDUNG +1B3B ; Other_Grapheme_Extend # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3D ; Other_Grapheme_Extend # Mc BALINESE VOWEL SIGN LA LENGA TEDUNG +1B43..1B44 ; Other_Grapheme_Extend # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1BAA ; Other_Grapheme_Extend # Mc SUNDANESE SIGN PAMAAEH +1BF2..1BF3 ; Other_Grapheme_Extend # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +200C ; Other_Grapheme_Extend # Cf ZERO WIDTH NON-JOINER +302E..302F ; Other_Grapheme_Extend # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +A953 ; Other_Grapheme_Extend # Mc REJANG VIRAMA +A9C0 ; Other_Grapheme_Extend # Mc JAVANESE PANGKON +FF9E..FF9F ; Other_Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +111C0 ; Other_Grapheme_Extend # Mc SHARADA SIGN VIRAMA +11235 ; Other_Grapheme_Extend # Mc KHOJKI SIGN VIRAMA +1133E ; Other_Grapheme_Extend # Mc GRANTHA VOWEL SIGN AA +1134D ; Other_Grapheme_Extend # Mc GRANTHA SIGN VIRAMA +11357 ; Other_Grapheme_Extend # Mc GRANTHA AU LENGTH MARK +113B8 ; Other_Grapheme_Extend # Mc TULU-TIGALARI VOWEL SIGN AA +113C2 ; Other_Grapheme_Extend # Mc TULU-TIGALARI VOWEL SIGN EE +113C5 ; Other_Grapheme_Extend # Mc TULU-TIGALARI VOWEL SIGN AI +113C7..113C9 ; Other_Grapheme_Extend # Mc [3] TULU-TIGALARI VOWEL SIGN OO..TULU-TIGALARI AU LENGTH MARK +113CF ; Other_Grapheme_Extend # Mc TULU-TIGALARI SIGN LOOPED VIRAMA +114B0 ; Other_Grapheme_Extend # Mc TIRHUTA VOWEL SIGN AA +114BD ; Other_Grapheme_Extend # Mc TIRHUTA VOWEL SIGN SHORT O +115AF ; Other_Grapheme_Extend # Mc SIDDHAM VOWEL SIGN AA +116B6 ; Other_Grapheme_Extend # Mc TAKRI SIGN VIRAMA +11930 ; Other_Grapheme_Extend # Mc DIVES AKURU VOWEL SIGN AA +1193D ; Other_Grapheme_Extend # Mc DIVES AKURU SIGN HALANTA +11F41 ; Other_Grapheme_Extend # Mc KAWI SIGN KILLER +16FF0..16FF1 ; Other_Grapheme_Extend # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +1D165..1D166 ; Other_Grapheme_Extend # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D16D..1D172 ; Other_Grapheme_Extend # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +E0020..E007F ; Other_Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG + +# Total code points: 160 + +# ================================================ + +2FF0..2FF1 ; IDS_Binary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +2FF4..2FFD ; IDS_Binary_Operator # So [10] IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND..IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER RIGHT +31EF ; IDS_Binary_Operator # So IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION + +# Total code points: 13 + +# ================================================ + +2FF2..2FF3 ; IDS_Trinary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW + +# Total code points: 2 + +# ================================================ + +2FFE..2FFF ; IDS_Unary_Operator # So [2] IDEOGRAPHIC DESCRIPTION CHARACTER HORIZONTAL REFLECTION..IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION + +# Total code points: 2 + +# ================================================ + +2E80..2E99 ; Radical # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; Radical # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; Radical # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE + +# Total code points: 329 + +# ================================================ + +3400..4DBF ; Unified_Ideograph # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +4E00..9FFF ; Unified_Ideograph # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF +FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F +FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11 +FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14 +FA1F ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA1F +FA21 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA21 +FA23..FA24 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24 +FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29 +20000..2A6DF ; Unified_Ideograph # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A700..2B81D ; Unified_Ideograph # Lo [4382] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEAD ; Unified_Ideograph # Lo [5774] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEAD +2CEB0..2EBE0 ; Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; Unified_Ideograph # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D +30000..3134A ; Unified_Ideograph # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..33479 ; Unified_Ideograph # Lo [8490] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-33479 + +# Total code points: 101996 + +# ================================================ + +034F ; Other_Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER +115F..1160 ; Other_Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER +17B4..17B5 ; Other_Default_Ignorable_Code_Point # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +2065 ; Other_Default_Ignorable_Code_Point # Cn +3164 ; Other_Default_Ignorable_Code_Point # Lo HANGUL FILLER +FFA0 ; Other_Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER +FFF0..FFF8 ; Other_Default_Ignorable_Code_Point # Cn [9] .. +E0000 ; Other_Default_Ignorable_Code_Point # Cn +E0002..E001F ; Other_Default_Ignorable_Code_Point # Cn [30] .. +E0080..E00FF ; Other_Default_Ignorable_Code_Point # Cn [128] .. +E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600] .. + +# Total code points: 3776 + +# ================================================ + +0149 ; Deprecated # L& LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +0673 ; Deprecated # Lo ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +0F77 ; Deprecated # Mn TIBETAN VOWEL SIGN VOCALIC RR +0F79 ; Deprecated # Mn TIBETAN VOWEL SIGN VOCALIC LL +17A3..17A4 ; Deprecated # Lo [2] KHMER INDEPENDENT VOWEL QAQ..KHMER INDEPENDENT VOWEL QAA +206A..206F ; Deprecated # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES +2329 ; Deprecated # Ps LEFT-POINTING ANGLE BRACKET +232A ; Deprecated # Pe RIGHT-POINTING ANGLE BRACKET +E0001 ; Deprecated # Cf LANGUAGE TAG + +# Total code points: 15 + +# ================================================ + +0069..006A ; Soft_Dotted # L& [2] LATIN SMALL LETTER I..LATIN SMALL LETTER J +012F ; Soft_Dotted # L& LATIN SMALL LETTER I WITH OGONEK +0249 ; Soft_Dotted # L& LATIN SMALL LETTER J WITH STROKE +0268 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE +029D ; Soft_Dotted # L& LATIN SMALL LETTER J WITH CROSSED-TAIL +02B2 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J +03F3 ; Soft_Dotted # L& GREEK LETTER YOT +0456 ; Soft_Dotted # L& CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0458 ; Soft_Dotted # L& CYRILLIC SMALL LETTER JE +1D62 ; Soft_Dotted # Lm LATIN SUBSCRIPT SMALL LETTER I +1D96 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH RETROFLEX HOOK +1DA4 ; Soft_Dotted # Lm MODIFIER LETTER SMALL I WITH STROKE +1DA8 ; Soft_Dotted # Lm MODIFIER LETTER SMALL J WITH CROSSED-TAIL +1E2D ; Soft_Dotted # L& LATIN SMALL LETTER I WITH TILDE BELOW +1ECB ; Soft_Dotted # L& LATIN SMALL LETTER I WITH DOT BELOW +2071 ; Soft_Dotted # Lm SUPERSCRIPT LATIN SMALL LETTER I +2148..2149 ; Soft_Dotted # L& [2] DOUBLE-STRUCK ITALIC SMALL I..DOUBLE-STRUCK ITALIC SMALL J +2C7C ; Soft_Dotted # Lm LATIN SUBSCRIPT SMALL LETTER J +1D422..1D423 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SMALL I..MATHEMATICAL BOLD SMALL J +1D456..1D457 ; Soft_Dotted # L& [2] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL J +1D48A..1D48B ; Soft_Dotted # L& [2] MATHEMATICAL BOLD ITALIC SMALL I..MATHEMATICAL BOLD ITALIC SMALL J +1D4BE..1D4BF ; Soft_Dotted # L& [2] MATHEMATICAL SCRIPT SMALL I..MATHEMATICAL SCRIPT SMALL J +1D4F2..1D4F3 ; Soft_Dotted # L& [2] MATHEMATICAL BOLD SCRIPT SMALL I..MATHEMATICAL BOLD SCRIPT SMALL J +1D526..1D527 ; Soft_Dotted # L& [2] MATHEMATICAL FRAKTUR SMALL I..MATHEMATICAL FRAKTUR SMALL J +1D55A..1D55B ; Soft_Dotted # L& [2] MATHEMATICAL DOUBLE-STRUCK SMALL I..MATHEMATICAL DOUBLE-STRUCK SMALL J +1D58E..1D58F ; Soft_Dotted # L& [2] MATHEMATICAL BOLD FRAKTUR SMALL I..MATHEMATICAL BOLD FRAKTUR SMALL J +1D5C2..1D5C3 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF SMALL I..MATHEMATICAL SANS-SERIF SMALL J +1D5F6..1D5F7 ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD SMALL I..MATHEMATICAL SANS-SERIF BOLD SMALL J +1D62A..1D62B ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF ITALIC SMALL I..MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D65E..1D65F ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D692..1D693 ; Soft_Dotted # L& [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J +1DF1A ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK +1E04C..1E04D ; Soft_Dotted # Lm [2] MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I..MODIFIER LETTER CYRILLIC SMALL JE +1E068 ; Soft_Dotted # Lm CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I + +# Total code points: 50 + +# ================================================ + +0E40..0E44 ; Logical_Order_Exception # Lo [5] THAI CHARACTER SARA E..THAI CHARACTER SARA AI MAIMALAI +0EC0..0EC4 ; Logical_Order_Exception # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +19B5..19B7 ; Logical_Order_Exception # Lo [3] NEW TAI LUE VOWEL SIGN E..NEW TAI LUE VOWEL SIGN O +19BA ; Logical_Order_Exception # Lo NEW TAI LUE VOWEL SIGN AY +AAB5..AAB6 ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB9 ; Logical_Order_Exception # Lo TAI VIET VOWEL UEA +AABB..AABC ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL AUE..TAI VIET VOWEL AY + +# Total code points: 19 + +# ================================================ + +1885..1886 ; Other_ID_Start # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +2118 ; Other_ID_Start # Sm SCRIPT CAPITAL P +212E ; Other_ID_Start # So ESTIMATED SYMBOL +309B..309C ; Other_ID_Start # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + +# Total code points: 6 + +# ================================================ + +00B7 ; Other_ID_Continue # Po MIDDLE DOT +0387 ; Other_ID_Continue # Po GREEK ANO TELEIA +1369..1371 ; Other_ID_Continue # No [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE +19DA ; Other_ID_Continue # No NEW TAI LUE THAM DIGIT ONE +200C..200D ; Other_ID_Continue # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +30FB ; Other_ID_Continue # Po KATAKANA MIDDLE DOT +FF65 ; Other_ID_Continue # Po HALFWIDTH KATAKANA MIDDLE DOT + +# Total code points: 16 + +# ================================================ + +00B2..00B3 ; ID_Compat_Math_Continue # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B9 ; ID_Compat_Math_Continue # No SUPERSCRIPT ONE +2070 ; ID_Compat_Math_Continue # No SUPERSCRIPT ZERO +2074..2079 ; ID_Compat_Math_Continue # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE +207A..207C ; ID_Compat_Math_Continue # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; ID_Compat_Math_Continue # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; ID_Compat_Math_Continue # Pe SUPERSCRIPT RIGHT PARENTHESIS +2080..2089 ; ID_Compat_Math_Continue # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE +208A..208C ; ID_Compat_Math_Continue # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; ID_Compat_Math_Continue # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; ID_Compat_Math_Continue # Pe SUBSCRIPT RIGHT PARENTHESIS +2202 ; ID_Compat_Math_Continue # Sm PARTIAL DIFFERENTIAL +2207 ; ID_Compat_Math_Continue # Sm NABLA +221E ; ID_Compat_Math_Continue # Sm INFINITY +1D6C1 ; ID_Compat_Math_Continue # Sm MATHEMATICAL BOLD NABLA +1D6DB ; ID_Compat_Math_Continue # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6FB ; ID_Compat_Math_Continue # Sm MATHEMATICAL ITALIC NABLA +1D715 ; ID_Compat_Math_Continue # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D735 ; ID_Compat_Math_Continue # Sm MATHEMATICAL BOLD ITALIC NABLA +1D74F ; ID_Compat_Math_Continue # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D76F ; ID_Compat_Math_Continue # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D789 ; ID_Compat_Math_Continue # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D7A9 ; ID_Compat_Math_Continue # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7C3 ; ID_Compat_Math_Continue # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL + +# Total code points: 43 + +# ================================================ + +2202 ; ID_Compat_Math_Start # Sm PARTIAL DIFFERENTIAL +2207 ; ID_Compat_Math_Start # Sm NABLA +221E ; ID_Compat_Math_Start # Sm INFINITY +1D6C1 ; ID_Compat_Math_Start # Sm MATHEMATICAL BOLD NABLA +1D6DB ; ID_Compat_Math_Start # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6FB ; ID_Compat_Math_Start # Sm MATHEMATICAL ITALIC NABLA +1D715 ; ID_Compat_Math_Start # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D735 ; ID_Compat_Math_Start # Sm MATHEMATICAL BOLD ITALIC NABLA +1D74F ; ID_Compat_Math_Start # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D76F ; ID_Compat_Math_Start # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D789 ; ID_Compat_Math_Start # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D7A9 ; ID_Compat_Math_Start # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7C3 ; ID_Compat_Math_Start # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL + +# Total code points: 13 + +# ================================================ + +0021 ; Sentence_Terminal # Po EXCLAMATION MARK +002E ; Sentence_Terminal # Po FULL STOP +003F ; Sentence_Terminal # Po QUESTION MARK +0589 ; Sentence_Terminal # Po ARMENIAN FULL STOP +061D..061F ; Sentence_Terminal # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK +06D4 ; Sentence_Terminal # Po ARABIC FULL STOP +0700..0702 ; Sentence_Terminal # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP +07F9 ; Sentence_Terminal # Po NKO EXCLAMATION MARK +0837 ; Sentence_Terminal # Po SAMARITAN PUNCTUATION MELODIC QITSA +0839 ; Sentence_Terminal # Po SAMARITAN PUNCTUATION QITSA +083D..083E ; Sentence_Terminal # Po [2] SAMARITAN PUNCTUATION SOF MASHFAAT..SAMARITAN PUNCTUATION ANNAAU +0964..0965 ; Sentence_Terminal # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +104A..104B ; Sentence_Terminal # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION +1362 ; Sentence_Terminal # Po ETHIOPIC FULL STOP +1367..1368 ; Sentence_Terminal # Po [2] ETHIOPIC QUESTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +166E ; Sentence_Terminal # Po CANADIAN SYLLABICS FULL STOP +1735..1736 ; Sentence_Terminal # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +17D4..17D5 ; Sentence_Terminal # Po [2] KHMER SIGN KHAN..KHMER SIGN BARIYOOSAN +1803 ; Sentence_Terminal # Po MONGOLIAN FULL STOP +1809 ; Sentence_Terminal # Po MONGOLIAN MANCHU FULL STOP +1944..1945 ; Sentence_Terminal # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1AA8..1AAB ; Sentence_Terminal # Po [4] TAI THAM SIGN KAAN..TAI THAM SIGN SATKAANKUU +1B4E..1B4F ; Sentence_Terminal # Po [2] BALINESE INVERTED CARIK SIKI..BALINESE INVERTED CARIK PAREREN +1B5A..1B5B ; Sentence_Terminal # Po [2] BALINESE PANTI..BALINESE PAMADA +1B5E..1B5F ; Sentence_Terminal # Po [2] BALINESE CARIK SIKI..BALINESE CARIK PAREREN +1B7D..1B7F ; Sentence_Terminal # Po [3] BALINESE PANTI LANTANG..BALINESE PANTI BAWAK +1C3B..1C3C ; Sentence_Terminal # Po [2] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION NYET THYOOM TA-ROL +1C7E..1C7F ; Sentence_Terminal # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +2024 ; Sentence_Terminal # Po ONE DOT LEADER +203C..203D ; Sentence_Terminal # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +2047..2049 ; Sentence_Terminal # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +2CF9..2CFB ; Sentence_Terminal # Po [3] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN INDIRECT QUESTION MARK +2E2E ; Sentence_Terminal # Po REVERSED QUESTION MARK +2E3C ; Sentence_Terminal # Po STENOGRAPHIC FULL STOP +2E53..2E54 ; Sentence_Terminal # Po [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK +3002 ; Sentence_Terminal # Po IDEOGRAPHIC FULL STOP +A4FF ; Sentence_Terminal # Po LISU PUNCTUATION FULL STOP +A60E..A60F ; Sentence_Terminal # Po [2] VAI FULL STOP..VAI QUESTION MARK +A6F3 ; Sentence_Terminal # Po BAMUM FULL STOP +A6F7 ; Sentence_Terminal # Po BAMUM QUESTION MARK +A876..A877 ; Sentence_Terminal # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD +A8CE..A8CF ; Sentence_Terminal # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A92F ; Sentence_Terminal # Po KAYAH LI SIGN SHYA +A9C8..A9C9 ; Sentence_Terminal # Po [2] JAVANESE PADA LINGSA..JAVANESE PADA LUNGSI +AA5D..AA5F ; Sentence_Terminal # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA +AAF0..AAF1 ; Sentence_Terminal # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +ABEB ; Sentence_Terminal # Po MEETEI MAYEK CHEIKHEI +FE12 ; Sentence_Terminal # Po PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE15..FE16 ; Sentence_Terminal # Po [2] PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE52 ; Sentence_Terminal # Po SMALL FULL STOP +FE56..FE57 ; Sentence_Terminal # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK +FF01 ; Sentence_Terminal # Po FULLWIDTH EXCLAMATION MARK +FF0E ; Sentence_Terminal # Po FULLWIDTH FULL STOP +FF1F ; Sentence_Terminal # Po FULLWIDTH QUESTION MARK +FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP +10A56..10A57 ; Sentence_Terminal # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA +10F55..10F59 ; Sentence_Terminal # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +10F86..10F89 ; Sentence_Terminal # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS +11047..11048 ; Sentence_Terminal # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA +110BE..110C1 ; Sentence_Terminal # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +11141..11143 ; Sentence_Terminal # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK +111C5..111C6 ; Sentence_Terminal # Po [2] SHARADA DANDA..SHARADA DOUBLE DANDA +111CD ; Sentence_Terminal # Po SHARADA SUTRA MARK +111DE..111DF ; Sentence_Terminal # Po [2] SHARADA SECTION MARK-1..SHARADA SECTION MARK-2 +11238..11239 ; Sentence_Terminal # Po [2] KHOJKI DANDA..KHOJKI DOUBLE DANDA +1123B..1123C ; Sentence_Terminal # Po [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK +112A9 ; Sentence_Terminal # Po MULTANI SECTION MARK +113D4..113D5 ; Sentence_Terminal # Po [2] TULU-TIGALARI DANDA..TULU-TIGALARI DOUBLE DANDA +1144B..1144C ; Sentence_Terminal # Po [2] NEWA DANDA..NEWA DOUBLE DANDA +115C2..115C3 ; Sentence_Terminal # Po [2] SIDDHAM DANDA..SIDDHAM DOUBLE DANDA +115C9..115D7 ; Sentence_Terminal # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +11641..11642 ; Sentence_Terminal # Po [2] MODI DANDA..MODI DOUBLE DANDA +1173C..1173E ; Sentence_Terminal # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +11944 ; Sentence_Terminal # Po DIVES AKURU DOUBLE DANDA +11946 ; Sentence_Terminal # Po DIVES AKURU END OF TEXT MARK +11A42..11A43 ; Sentence_Terminal # Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD +11A9B..11A9C ; Sentence_Terminal # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD +11C41..11C42 ; Sentence_Terminal # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA +11EF7..11EF8 ; Sentence_Terminal # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F43..11F44 ; Sentence_Terminal # Po [2] KAWI DANDA..KAWI DOUBLE DANDA +16A6E..16A6F ; Sentence_Terminal # Po [2] MRO DANDA..MRO DOUBLE DANDA +16AF5 ; Sentence_Terminal # Po BASSA VAH FULL STOP +16B37..16B38 ; Sentence_Terminal # Po [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB +16B44 ; Sentence_Terminal # Po PAHAWH HMONG SIGN XAUS +16D6E..16D6F ; Sentence_Terminal # Po [2] KIRAT RAI DANDA..KIRAT RAI DOUBLE DANDA +16E98 ; Sentence_Terminal # Po MEDEFAIDRIN FULL STOP +1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1DA88 ; Sentence_Terminal # Po SIGNWRITING FULL STOP + +# Total code points: 170 + +# ================================================ + +180B..180D ; Variation_Selector # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180F ; Variation_Selector # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR +FE00..FE0F ; Variation_Selector # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 260 + +# ================================================ + +0009..000D ; Pattern_White_Space # Cc [5] .. +0020 ; Pattern_White_Space # Zs SPACE +0085 ; Pattern_White_Space # Cc +200E..200F ; Pattern_White_Space # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +2028 ; Pattern_White_Space # Zl LINE SEPARATOR +2029 ; Pattern_White_Space # Zp PARAGRAPH SEPARATOR + +# Total code points: 11 + +# ================================================ + +0021..0023 ; Pattern_Syntax # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Pattern_Syntax # Sc DOLLAR SIGN +0025..0027 ; Pattern_Syntax # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Pattern_Syntax # Ps LEFT PARENTHESIS +0029 ; Pattern_Syntax # Pe RIGHT PARENTHESIS +002A ; Pattern_Syntax # Po ASTERISK +002B ; Pattern_Syntax # Sm PLUS SIGN +002C ; Pattern_Syntax # Po COMMA +002D ; Pattern_Syntax # Pd HYPHEN-MINUS +002E..002F ; Pattern_Syntax # Po [2] FULL STOP..SOLIDUS +003A..003B ; Pattern_Syntax # Po [2] COLON..SEMICOLON +003C..003E ; Pattern_Syntax # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Pattern_Syntax # Po [2] QUESTION MARK..COMMERCIAL AT +005B ; Pattern_Syntax # Ps LEFT SQUARE BRACKET +005C ; Pattern_Syntax # Po REVERSE SOLIDUS +005D ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET +005E ; Pattern_Syntax # Sk CIRCUMFLEX ACCENT +0060 ; Pattern_Syntax # Sk GRAVE ACCENT +007B ; Pattern_Syntax # Ps LEFT CURLY BRACKET +007C ; Pattern_Syntax # Sm VERTICAL LINE +007D ; Pattern_Syntax # Pe RIGHT CURLY BRACKET +007E ; Pattern_Syntax # Sm TILDE +00A1 ; Pattern_Syntax # Po INVERTED EXCLAMATION MARK +00A2..00A5 ; Pattern_Syntax # Sc [4] CENT SIGN..YEN SIGN +00A6 ; Pattern_Syntax # So BROKEN BAR +00A7 ; Pattern_Syntax # Po SECTION SIGN +00A9 ; Pattern_Syntax # So COPYRIGHT SIGN +00AB ; Pattern_Syntax # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; Pattern_Syntax # Sm NOT SIGN +00AE ; Pattern_Syntax # So REGISTERED SIGN +00B0 ; Pattern_Syntax # So DEGREE SIGN +00B1 ; Pattern_Syntax # Sm PLUS-MINUS SIGN +00B6 ; Pattern_Syntax # Po PILCROW SIGN +00BB ; Pattern_Syntax # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BF ; Pattern_Syntax # Po INVERTED QUESTION MARK +00D7 ; Pattern_Syntax # Sm MULTIPLICATION SIGN +00F7 ; Pattern_Syntax # Sm DIVISION SIGN +2010..2015 ; Pattern_Syntax # Pd [6] HYPHEN..HORIZONTAL BAR +2016..2017 ; Pattern_Syntax # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE +2018 ; Pattern_Syntax # Pi LEFT SINGLE QUOTATION MARK +2019 ; Pattern_Syntax # Pf RIGHT SINGLE QUOTATION MARK +201A ; Pattern_Syntax # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Pattern_Syntax # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Pattern_Syntax # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Pattern_Syntax # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Pattern_Syntax # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2027 ; Pattern_Syntax # Po [8] DAGGER..HYPHENATION POINT +2030..2038 ; Pattern_Syntax # Po [9] PER MILLE SIGN..CARET +2039 ; Pattern_Syntax # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Pattern_Syntax # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B..203E ; Pattern_Syntax # Po [4] REFERENCE MARK..OVERLINE +2041..2043 ; Pattern_Syntax # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; Pattern_Syntax # Sm FRACTION SLASH +2045 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; Pattern_Syntax # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; Pattern_Syntax # Sm COMMERCIAL MINUS SIGN +2053 ; Pattern_Syntax # Po SWUNG DASH +2055..205E ; Pattern_Syntax # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +2190..2194 ; Pattern_Syntax # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; Pattern_Syntax # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; Pattern_Syntax # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; Pattern_Syntax # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; Pattern_Syntax # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; Pattern_Syntax # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; Pattern_Syntax # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; Pattern_Syntax # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; Pattern_Syntax # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; Pattern_Syntax # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; Pattern_Syntax # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD ; Pattern_Syntax # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; Pattern_Syntax # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Pattern_Syntax # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; Pattern_Syntax # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; Pattern_Syntax # So DOWNWARDS DOUBLE ARROW +21D4 ; Pattern_Syntax # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3 ; Pattern_Syntax # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..22FF ; Pattern_Syntax # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP +2300..2307 ; Pattern_Syntax # So [8] DIAMETER SIGN..WAVY LINE +2308 ; Pattern_Syntax # Ps LEFT CEILING +2309 ; Pattern_Syntax # Pe RIGHT CEILING +230A ; Pattern_Syntax # Ps LEFT FLOOR +230B ; Pattern_Syntax # Pe RIGHT FLOOR +230C..231F ; Pattern_Syntax # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER +2320..2321 ; Pattern_Syntax # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; Pattern_Syntax # So [7] FROWN..KEYBOARD +2329 ; Pattern_Syntax # Ps LEFT-POINTING ANGLE BRACKET +232A ; Pattern_Syntax # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; Pattern_Syntax # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; Pattern_Syntax # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; Pattern_Syntax # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; Pattern_Syntax # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23DB ; Pattern_Syntax # So [40] TOP SQUARE BRACKET..FUSE +23DC..23E1 ; Pattern_Syntax # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +23E2..2429 ; Pattern_Syntax # So [72] WHITE TRAPEZIUM..SYMBOL FOR DELETE MEDIUM SHADE FORM +242A..243F ; Pattern_Syntax # Cn [22] .. +2440..244A ; Pattern_Syntax # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +244B..245F ; Pattern_Syntax # Cn [21] .. +2500..25B6 ; Pattern_Syntax # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE +25B7 ; Pattern_Syntax # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25C0 ; Pattern_Syntax # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C1 ; Pattern_Syntax # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25F7 ; Pattern_Syntax # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; Pattern_Syntax # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..266E ; Pattern_Syntax # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN +266F ; Pattern_Syntax # Sm MUSIC SHARP SIGN +2670..2767 ; Pattern_Syntax # So [248] WEST SYRIAC CROSS..ROTATED FLORAL HEART BULLET +2768 ; Pattern_Syntax # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; Pattern_Syntax # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; Pattern_Syntax # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; Pattern_Syntax # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; Pattern_Syntax # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; Pattern_Syntax # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; Pattern_Syntax # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; Pattern_Syntax # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; Pattern_Syntax # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; Pattern_Syntax # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; Pattern_Syntax # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; Pattern_Syntax # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; Pattern_Syntax # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; Pattern_Syntax # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2794..27BF ; Pattern_Syntax # So [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP +27C0..27C4 ; Pattern_Syntax # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; Pattern_Syntax # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Pattern_Syntax # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5 ; Pattern_Syntax # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Pattern_Syntax # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Pattern_Syntax # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Pattern_Syntax # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Pattern_Syntax # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Pattern_Syntax # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Pattern_Syntax # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Pattern_Syntax # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Pattern_Syntax # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; Pattern_Syntax # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; Pattern_Syntax # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; Pattern_Syntax # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF ; Pattern_Syntax # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..2982 ; Pattern_Syntax # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; Pattern_Syntax # Ps LEFT WHITE CURLY BRACKET +2984 ; Pattern_Syntax # Pe RIGHT WHITE CURLY BRACKET +2985 ; Pattern_Syntax # Ps LEFT WHITE PARENTHESIS +2986 ; Pattern_Syntax # Pe RIGHT WHITE PARENTHESIS +2987 ; Pattern_Syntax # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Pattern_Syntax # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Pattern_Syntax # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Pattern_Syntax # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Pattern_Syntax # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Pattern_Syntax # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Pattern_Syntax # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Pattern_Syntax # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Pattern_Syntax # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Pattern_Syntax # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; Pattern_Syntax # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; Pattern_Syntax # Ps LEFT WIGGLY FENCE +29D9 ; Pattern_Syntax # Pe RIGHT WIGGLY FENCE +29DA ; Pattern_Syntax # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Pattern_Syntax # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; Pattern_Syntax # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; Pattern_Syntax # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Pattern_Syntax # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; Pattern_Syntax # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B00..2B2F ; Pattern_Syntax # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE +2B30..2B44 ; Pattern_Syntax # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B45..2B46 ; Pattern_Syntax # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +2B47..2B4C ; Pattern_Syntax # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B73 ; Pattern_Syntax # So [39] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B74..2B75 ; Pattern_Syntax # Cn [2] .. +2B76..2BFF ; Pattern_Syntax # So [138] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..HELLSCHREIBER PAUSE SYMBOL +2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; Pattern_Syntax # Pi LEFT SUBSTITUTION BRACKET +2E03 ; Pattern_Syntax # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; Pattern_Syntax # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; Pattern_Syntax # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; Pattern_Syntax # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; Pattern_Syntax # Pi LEFT TRANSPOSITION BRACKET +2E0A ; Pattern_Syntax # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; Pattern_Syntax # Po RAISED SQUARE +2E0C ; Pattern_Syntax # Pi LEFT RAISED OMISSION BRACKET +2E0D ; Pattern_Syntax # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16 ; Pattern_Syntax # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17 ; Pattern_Syntax # Pd DOUBLE OBLIQUE HYPHEN +2E18..2E19 ; Pattern_Syntax # Po [2] INVERTED INTERROBANG..PALM BRANCH +2E1A ; Pattern_Syntax # Pd HYPHEN WITH DIAERESIS +2E1B ; Pattern_Syntax # Po TILDE WITH RING ABOVE +2E1C ; Pattern_Syntax # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; Pattern_Syntax # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F ; Pattern_Syntax # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20 ; Pattern_Syntax # Pi LEFT VERTICAL BAR WITH QUILL +2E21 ; Pattern_Syntax # Pf RIGHT VERTICAL BAR WITH QUILL +2E22 ; Pattern_Syntax # Ps TOP LEFT HALF BRACKET +2E23 ; Pattern_Syntax # Pe TOP RIGHT HALF BRACKET +2E24 ; Pattern_Syntax # Ps BOTTOM LEFT HALF BRACKET +2E25 ; Pattern_Syntax # Pe BOTTOM RIGHT HALF BRACKET +2E26 ; Pattern_Syntax # Ps LEFT SIDEWAYS U BRACKET +2E27 ; Pattern_Syntax # Pe RIGHT SIDEWAYS U BRACKET +2E28 ; Pattern_Syntax # Ps LEFT DOUBLE PARENTHESIS +2E29 ; Pattern_Syntax # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2E ; Pattern_Syntax # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK +2E2F ; Pattern_Syntax # Lm VERTICAL TILDE +2E30..2E39 ; Pattern_Syntax # Po [10] RING POINT..TOP HALF SECTION SIGN +2E3A..2E3B ; Pattern_Syntax # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3F ; Pattern_Syntax # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM +2E40 ; Pattern_Syntax # Pd DOUBLE HYPHEN +2E41 ; Pattern_Syntax # Po REVERSED COMMA +2E42 ; Pattern_Syntax # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4F ; Pattern_Syntax # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER +2E50..2E51 ; Pattern_Syntax # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR +2E52..2E54 ; Pattern_Syntax # Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK +2E55 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH STROKE +2E56 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH STROKE +2E57 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE +2E58 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE +2E59 ; Pattern_Syntax # Ps TOP HALF LEFT PARENTHESIS +2E5A ; Pattern_Syntax # Pe TOP HALF RIGHT PARENTHESIS +2E5B ; Pattern_Syntax # Ps BOTTOM HALF LEFT PARENTHESIS +2E5C ; Pattern_Syntax # Pe BOTTOM HALF RIGHT PARENTHESIS +2E5D ; Pattern_Syntax # Pd OBLIQUE HYPHEN +2E5E..2E7F ; Pattern_Syntax # Cn [34] .. +3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET +3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET +300A ; Pattern_Syntax # Ps LEFT DOUBLE ANGLE BRACKET +300B ; Pattern_Syntax # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; Pattern_Syntax # Ps LEFT CORNER BRACKET +300D ; Pattern_Syntax # Pe RIGHT CORNER BRACKET +300E ; Pattern_Syntax # Ps LEFT WHITE CORNER BRACKET +300F ; Pattern_Syntax # Pe RIGHT WHITE CORNER BRACKET +3010 ; Pattern_Syntax # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; Pattern_Syntax # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; Pattern_Syntax # So [2] POSTAL MARK..GETA MARK +3014 ; Pattern_Syntax # Ps LEFT TORTOISE SHELL BRACKET +3015 ; Pattern_Syntax # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; Pattern_Syntax # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; Pattern_Syntax # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; Pattern_Syntax # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; Pattern_Syntax # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; Pattern_Syntax # Ps LEFT WHITE SQUARE BRACKET +301B ; Pattern_Syntax # Pe RIGHT WHITE SQUARE BRACKET +301C ; Pattern_Syntax # Pd WAVE DASH +301D ; Pattern_Syntax # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Pattern_Syntax # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; Pattern_Syntax # So POSTAL MARK FACE +3030 ; Pattern_Syntax # Pd WAVY DASH +FD3E ; Pattern_Syntax # Pe ORNATE LEFT PARENTHESIS +FD3F ; Pattern_Syntax # Ps ORNATE RIGHT PARENTHESIS +FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT + +# Total code points: 2760 + +# ================================================ + +0600..0605 ; Prepended_Concatenation_Mark # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +06DD ; Prepended_Concatenation_Mark # Cf ARABIC END OF AYAH +070F ; Prepended_Concatenation_Mark # Cf SYRIAC ABBREVIATION MARK +0890..0891 ; Prepended_Concatenation_Mark # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE +08E2 ; Prepended_Concatenation_Mark # Cf ARABIC DISPUTED END OF AYAH +110BD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN +110CD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN ABOVE + +# Total code points: 13 + +# ================================================ + +1F1E6..1F1FF ; Regional_Indicator # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z + +# Total code points: 26 + +# ================================================ + +0654..0655 ; Modifier_Combining_Mark # Mn [2] ARABIC HAMZA ABOVE..ARABIC HAMZA BELOW +0658 ; Modifier_Combining_Mark # Mn ARABIC MARK NOON GHUNNA +06DC ; Modifier_Combining_Mark # Mn ARABIC SMALL HIGH SEEN +06E3 ; Modifier_Combining_Mark # Mn ARABIC SMALL LOW SEEN +06E7..06E8 ; Modifier_Combining_Mark # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +08CA..08CB ; Modifier_Combining_Mark # Mn [2] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW +08CD..08CF ; Modifier_Combining_Mark # Mn [3] ARABIC SMALL HIGH ZAH..ARABIC LARGE ROUND DOT BELOW +08D3 ; Modifier_Combining_Mark # Mn ARABIC SMALL LOW WAW +08F3 ; Modifier_Combining_Mark # Mn ARABIC SMALL HIGH WAW + +# Total code points: 14 + +# EOF diff --git a/tests/core/assets/UCD/UnicodeData.txt b/tests/core/assets/UCD/UnicodeData.txt new file mode 100644 index 000000000..fca68e3e1 --- /dev/null +++ b/tests/core/assets/UCD/UnicodeData.txt @@ -0,0 +1,40575 @@ +0000;;Cc;0;BN;;;;;N;NULL;;;; +0001;;Cc;0;BN;;;;;N;START OF HEADING;;;; +0002;;Cc;0;BN;;;;;N;START OF TEXT;;;; +0003;;Cc;0;BN;;;;;N;END OF TEXT;;;; +0004;;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; +0005;;Cc;0;BN;;;;;N;ENQUIRY;;;; +0006;;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; +0007;;Cc;0;BN;;;;;N;BELL;;;; +0008;;Cc;0;BN;;;;;N;BACKSPACE;;;; +0009;;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; +000A;;Cc;0;B;;;;;N;LINE FEED (LF);;;; +000B;;Cc;0;S;;;;;N;LINE TABULATION;;;; +000C;;Cc;0;WS;;;;;N;FORM FEED (FF);;;; +000D;;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; +000E;;Cc;0;BN;;;;;N;SHIFT OUT;;;; +000F;;Cc;0;BN;;;;;N;SHIFT IN;;;; +0010;;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; +0011;;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; +0012;;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; +0013;;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; +0014;;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; +0015;;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; +0016;;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; +0017;;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; +0018;;Cc;0;BN;;;;;N;CANCEL;;;; +0019;;Cc;0;BN;;;;;N;END OF MEDIUM;;;; +001A;;Cc;0;BN;;;;;N;SUBSTITUTE;;;; +001B;;Cc;0;BN;;;;;N;ESCAPE;;;; +001C;;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; +001D;;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; +001E;;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; +001F;;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; +0020;SPACE;Zs;0;WS;;;;;N;;;;; +0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; +0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; +0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; +0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; +0026;AMPERSAND;Po;0;ON;;;;;N;;;;; +0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; +0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; +0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; +002A;ASTERISK;Po;0;ON;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; +002C;COMMA;Po;0;CS;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; +002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; +002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; +0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; +0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; +0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; +0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; +0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; +0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; +0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; +0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; +0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; +0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; +003A;COLON;Po;0;CS;;;;;N;;;;; +003B;SEMICOLON;Po;0;ON;;;;;N;;;;; +003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; +0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; +0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; +0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; +0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; +0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; +0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; +0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; +0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; +0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; +0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; +004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; +004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; +004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; +004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; +004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; +004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; +0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; +0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; +0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; +0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; +0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; +0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; +0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; +0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; +0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; +0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; +005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; +005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; +005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; +005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; +005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; +005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; +0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; +0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 +0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 +0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 +0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 +0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 +0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 +0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 +0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 +0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 +006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A +006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B +006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C +006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D +006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E +006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F +0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 +0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 +0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 +0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 +0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 +0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 +0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 +0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 +0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 +0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 +007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A +007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; +007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; +007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; +007E;TILDE;Sm;0;ON;;;;;N;;;;; +007F;;Cc;0;BN;;;;;N;DELETE;;;; +0080;;Cc;0;BN;;;;;N;;;;; +0081;;Cc;0;BN;;;;;N;;;;; +0082;;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; +0083;;Cc;0;BN;;;;;N;NO BREAK HERE;;;; +0084;;Cc;0;BN;;;;;N;;;;; +0085;;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; +0086;;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; +0087;;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; +0088;;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; +0089;;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; +008A;;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; +008B;;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; +008C;;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; +008D;;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; +008E;;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; +008F;;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; +0090;;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; +0091;;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; +0092;;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; +0093;;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; +0094;;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; +0095;;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; +0096;;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; +0097;;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; +0098;;Cc;0;BN;;;;;N;START OF STRING;;;; +0099;;Cc;0;BN;;;;;N;;;;; +009A;;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; +009B;;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; +009C;;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; +009D;;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; +009E;;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; +009F;;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; +00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; +00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; +00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; +00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; +00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; +00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;; +00A8;DIAERESIS;Sk;0;ON; 0020 0308;;;;N;SPACING DIAERESIS;;;; +00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; +00AA;FEMININE ORDINAL INDICATOR;Lo;0;L; 0061;;;;N;;;;; +00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;; +00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; +00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; +00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;; +00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; +00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; +00B2;SUPERSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;; +00B3;SUPERSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;; +00B4;ACUTE ACCENT;Sk;0;ON; 0020 0301;;;;N;SPACING ACUTE;;;; +00B5;MICRO SIGN;Ll;0;L; 03BC;;;;N;;;039C;;039C +00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;; +00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; +00B8;CEDILLA;Sk;0;ON; 0020 0327;;;;N;SPACING CEDILLA;;;; +00B9;SUPERSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; +00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L; 006F;;;;N;;;;; +00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; +00BC;VULGAR FRACTION ONE QUARTER;No;0;ON; 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; +00BD;VULGAR FRACTION ONE HALF;No;0;ON; 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; +00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON; 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; +00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; +00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; +00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; +00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; +00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; +00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; +00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; +00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6; +00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; +00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; +00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; +00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; +00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; +00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; +00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; +00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; +00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; +00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0; +00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; +00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; +00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; +00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; +00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; +00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; +00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; +00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; +00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; +00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; +00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; +00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; +00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; +00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE; +00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;; +00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 +00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 +00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 +00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 +00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 +00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 +00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6 +00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 +00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 +00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 +00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA +00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB +00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC +00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD +00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE +00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF +00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0 +00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 +00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 +00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 +00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 +00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 +00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 +00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 +00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 +00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA +00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB +00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC +00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD +00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE +00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 +0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; +0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 +0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; +0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 +0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; +0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 +0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; +0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 +0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; +0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 +010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; +010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A +010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; +010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C +010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; +010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E +0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; +0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 +0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; +0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 +0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; +0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 +0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; +0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 +0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; +0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 +011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; +011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A +011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; +011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C +011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; +011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E +0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; +0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 +0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; +0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 +0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; +0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 +0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; +0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 +0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; +0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 +012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; +012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A +012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; +012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C +012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; +012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E +0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; +0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 +0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L; 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; +0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 +0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; +0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 +0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; +0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 +0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;; +0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; +013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 +013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; +013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B +013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; +013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D +013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L; 004C 00B7;;;;N;;;;0140; +0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L; 006C 00B7;;;;N;;;013F;;013F +0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; +0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 +0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; +0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 +0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; +0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 +0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; +0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 +0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L; 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; +014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B; +014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A +014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; +014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C +014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; +014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E +0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; +0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 +0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; +0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 +0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; +0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 +0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; +0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 +0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; +0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 +015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; +015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A +015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; +015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C +015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F; +015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E +0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; +0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 +0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163; +0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162 +0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; +0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 +0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; +0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 +0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; +0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 +016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; +016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A +016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; +016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C +016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; +016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E +0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; +0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 +0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; +0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 +0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; +0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 +0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; +0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 +0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; +0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; +017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 +017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; +017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B +017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; +017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D +017F;LATIN SMALL LETTER LONG S;Ll;0;L; 0073;;;;N;;;0053;;0053 +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 +0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; +0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; +0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 +0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; +0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 +0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; +0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; +0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 +0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256; +018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; +018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; +018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B +018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; +018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; +018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; +0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; +0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; +0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 +0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; +0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; +0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6 +0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; +0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; +0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; +0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D +019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;A7DC;;A7DC +019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; +019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; +019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 +019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275; +01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; +01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 +01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3; +01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2 +01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; +01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 +01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; +01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; +01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 +01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; +01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; +01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; +01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; +01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC +01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; +01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; +01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF +01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; +01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; +01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; +01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 +01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; +01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 +01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; +01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; +01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 +01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; +01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; +01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; +01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC +01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; +01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 +01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; +01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; +01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; +01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; +01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 +01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 +01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 +01C7;LATIN CAPITAL LETTER LJ;Lu;0;L; 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 +01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L; 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8 +01C9;LATIN SMALL LETTER LJ;Ll;0;L; 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 +01CA;LATIN CAPITAL LETTER NJ;Lu;0;L; 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB +01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L; 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB +01CC;LATIN SMALL LETTER NJ;Ll;0;L; 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB +01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; +01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD +01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; +01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF +01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; +01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 +01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; +01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 +01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; +01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 +01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; +01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 +01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; +01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 +01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; +01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB +01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E +01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; +01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE +01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; +01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 +01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3; +01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2 +01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; +01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 +01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; +01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 +01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; +01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 +01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; +01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA +01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; +01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC +01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; +01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE +01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; +01F1;LATIN CAPITAL LETTER DZ;Lu;0;L; 0044 005A;;;;N;;;;01F3;01F2 +01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L; 0044 007A;;;;N;;;01F1;01F3;01F2 +01F3;LATIN SMALL LETTER DZ;Ll;0;L; 0064 007A;;;;N;;;01F1;;01F2 +01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; +01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 +01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; +01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; +01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; +01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 +01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; +01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA +01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD; +01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC +01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; +01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE +0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; +0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 +0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; +0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 +0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; +0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 +0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; +0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 +0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; +0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 +020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; +020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A +020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; +020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C +020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; +020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E +0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; +0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 +0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; +0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 +0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; +0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 +0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; +0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 +0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219; +0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218 +021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B; +021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A +021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; +021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C +021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; +021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E +0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; +0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; +0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; +0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 +0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; +0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 +0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; +0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 +0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; +0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 +022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; +022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A +022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; +022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C +022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; +022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E +0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; +0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 +0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; +0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 +0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; +0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; +0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; +0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; +0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; +0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; +023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; +023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; +023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B +023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; +023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; +023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E +0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F +0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; +0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 +0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; +0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; +0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; +0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; +0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 +0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; +0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 +024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; +024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A +024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; +024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C +024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; +024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D +0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70 +0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 +0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 +0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; +0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 +0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A +0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; +0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F +025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; +025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 +025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB +025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; +025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; +025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; +0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 +0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC +0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; +0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 +0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;A7CB;;A7CB +0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D +0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA +0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; +0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 +0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 +026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;A7AE;;A7AE +026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 +026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD +026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; +026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; +026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C +0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E +0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D +0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; +0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; +0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F +0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; +0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; +0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; +027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; +027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 +027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; +027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; +0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 +0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; +0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;A7C5;;A7C5 +0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 +0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; +0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; +0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; +0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1 +0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 +028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 +028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 +028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; +028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; +028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; +0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; +0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; +0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 +0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; +0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Lo;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; +0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; +0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; +0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; +029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; +029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; +029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2 +029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 +029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; +02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; +02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; +02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; +02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; +02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; +02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; +02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; +02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; +02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; +02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; +02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; +02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; +02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; +02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;; +02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; +02B2;MODIFIER LETTER SMALL J;Lm;0;L; 006A;;;;N;;;;; +02B3;MODIFIER LETTER SMALL R;Lm;0;L; 0072;;;;N;;;;; +02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L; 0279;;;;N;;;;; +02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L; 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; +02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L; 0281;;;;N;;;;; +02B7;MODIFIER LETTER SMALL W;Lm;0;L; 0077;;;;N;;;;; +02B8;MODIFIER LETTER SMALL Y;Lm;0;L; 0079;;;;N;;;;; +02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;; +02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;; +02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; +02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; +02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; +02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; +02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; +02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;; +02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;; +02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;; +02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;; +02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; +02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; +02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; +02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; +02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; +02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; +02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; +02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; +02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; +02D8;BREVE;Sk;0;ON; 0020 0306;;;;N;SPACING BREVE;;;; +02D9;DOT ABOVE;Sk;0;ON; 0020 0307;;;;N;SPACING DOT ABOVE;;;; +02DA;RING ABOVE;Sk;0;ON; 0020 030A;;;;N;SPACING RING ABOVE;;;; +02DB;OGONEK;Sk;0;ON; 0020 0328;;;;N;SPACING OGONEK;;;; +02DC;SMALL TILDE;Sk;0;ON; 0020 0303;;;;N;SPACING TILDE;;;; +02DD;DOUBLE ACUTE ACCENT;Sk;0;ON; 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; +02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; +02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; +02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L; 0263;;;;N;;;;; +02E1;MODIFIER LETTER SMALL L;Lm;0;L; 006C;;;;N;;;;; +02E2;MODIFIER LETTER SMALL S;Lm;0;L; 0073;;;;N;;;;; +02E3;MODIFIER LETTER SMALL X;Lm;0;L; 0078;;;;N;;;;; +02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L; 0295;;;;N;;;;; +02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; +02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; +02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; +02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; +02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; +02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; +02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; +02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; +02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; +02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; +02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; +02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; +02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;; +0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; +0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;; +0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; +0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; +0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; +0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; +0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;; +0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; +0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;; +0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; +030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; +030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; +030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; +030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; +030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; +030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; +0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; +0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; +0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; +0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;; +0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;; +0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; +0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; +0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; +0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; +0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; +031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; +031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; +031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; +031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; +031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; +031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; +0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; +0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; +0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; +0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; +0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; +0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; +0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; +0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; +0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; +0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; +032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; +032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; +032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; +032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; +032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; +032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; +0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; +0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; +0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; +0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; +0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; +0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; +0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; +0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; +0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; +0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; +033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; +033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; +033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; +033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; +033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; +033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; +0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;; +0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;; +0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; +0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; +0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; +0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 +0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; +034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; +034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; +034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; +034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; +0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; +0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; +0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; +035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; +035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; +035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; +035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; +0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; +0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; +0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; +0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; +0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; +0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; +0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; +0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; +0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; +0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; +036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; +036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; +036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; +036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; +036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; +036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; +0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; +0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 +0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; +0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 +0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;; +0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;; +0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; +0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 +037A;GREEK YPOGEGRAMMENI;Lm;0;L; 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD +037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE +037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF +037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;; +037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3; +0384;GREEK TONOS;Sk;0;ON; 0020 0301;;;;N;GREEK SPACING TONOS;;;; +0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; +0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; +0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; +0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; +0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; +038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; +038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; +038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; +038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; +0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; +0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; +0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; +0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; +0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; +0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; +0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; +0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; +0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; +0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; +039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; +039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; +039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; +039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; +039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; +039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; +03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; +03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; +03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; +03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; +03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; +03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; +03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; +03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; +03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; +03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; +03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; +03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 +03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 +03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 +03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A +03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; +03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 +03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 +03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 +03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 +03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 +03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 +03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 +03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 +03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 +03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A +03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B +03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C +03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D +03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E +03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F +03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 +03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 +03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 +03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 +03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 +03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 +03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 +03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 +03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA +03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB +03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C +03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E +03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; +03D0;GREEK BETA SYMBOL;Ll;0;L; 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 +03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 +03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L; 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; +03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; +03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; +03D5;GREEK PHI SYMBOL;Ll;0;L; 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 +03D6;GREEK PI SYMBOL;Ll;0;L; 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF +03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9; +03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8 +03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; +03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA +03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; +03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC +03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; +03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE +03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; +03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 +03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; +03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 +03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; +03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 +03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; +03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 +03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; +03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 +03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; +03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA +03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; +03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC +03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; +03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE +03F0;GREEK KAPPA SYMBOL;Ll;0;L; 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A +03F1;GREEK RHO SYMBOL;Ll;0;L; 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 +03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L; 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9 +03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F +03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8; +03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L; 03B5;;;;N;;;0395;;0395 +03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; +03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; +03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 +03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L; 03A3;;;;N;;;;03F2; +03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; +03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA +03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; +03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; +03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; +03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; +0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; +0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; +0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452; +0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; +0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; +0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; +0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; +0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457; +0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; +0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; +040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; +040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B; +040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; +040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; +040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E; +040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; +0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; +0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; +0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; +0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; +0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; +0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; +0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; +0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; +0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; +0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; +041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; +041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; +041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; +041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; +041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; +041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; +0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; +0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; +0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; +0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; +0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; +0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; +0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; +0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; +0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; +0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; +042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; +042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; +042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; +042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; +042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; +042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; +0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 +0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 +0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 +0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 +0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 +0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 +0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 +0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 +0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 +0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 +043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A +043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B +043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C +043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D +043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E +043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F +0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 +0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 +0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 +0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 +0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 +0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 +0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 +0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 +0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 +0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 +044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B +044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C +044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D +044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E +044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F +0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 +0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 +0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402 +0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 +0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 +0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 +0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 +0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407 +0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 +0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 +045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A +045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B +045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C +045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D +045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E +045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F +0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; +0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 +0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; +0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 +0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; +0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 +0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; +0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 +0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; +0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 +046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; +046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A +046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; +046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C +046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; +046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E +0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; +0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 +0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; +0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 +0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; +0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 +0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; +0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 +0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; +0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 +047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; +047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A +047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; +047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C +047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; +047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E +0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; +0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 +0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; +0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; +0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; +0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; +0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; +0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; +0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; +048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A +048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; +048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C +048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; +048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E +0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; +0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 +0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; +0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 +0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; +0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 +0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; +0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 +0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; +0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 +049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; +049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A +049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; +049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C +049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; +049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E +04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; +04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 +04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; +04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 +04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; +04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 +04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7; +04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6 +04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; +04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 +04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; +04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA +04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; +04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC +04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; +04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE +04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; +04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 +04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; +04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 +04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5; +04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4 +04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; +04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 +04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; +04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 +04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; +04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA +04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; +04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC +04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; +04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; +04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; +04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 +04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; +04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 +04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; +04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 +04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; +04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 +04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; +04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 +04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; +04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB +04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; +04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD +04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 +04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; +04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 +04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; +04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 +04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; +04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 +04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; +04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 +04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; +04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 +04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; +04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA +04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; +04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC +04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; +04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE +04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; +04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 +04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; +04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 +04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; +04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 +04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; +04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 +04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; +04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 +04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; +04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA +04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; +04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC +04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; +04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE +04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; +04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 +04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; +04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 +04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; +04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; +04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 +04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; +04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; +04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA +04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; +04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC +04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; +04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE +0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; +0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 +0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; +0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 +0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; +0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 +0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; +0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 +0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; +0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 +050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; +050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A +050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; +050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C +050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; +050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E +0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; +0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 +0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; +0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 +0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; +0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 +0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; +0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 +0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; +0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 +051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; +051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A +051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; +051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C +051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; +051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E +0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; +0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 +0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; +0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 +0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525; +0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524 +0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527; +0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526 +0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529; +0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528 +052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B; +052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A +052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D; +052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C +052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F; +052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E +0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; +0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; +0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; +0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; +0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; +0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; +0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; +0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; +0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; +053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; +053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; +053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; +053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; +053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; +053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; +0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; +0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; +0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; +0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; +0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; +0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; +0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; +0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; +0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; +0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; +054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; +054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; +054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; +054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; +054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; +054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; +0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; +0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; +0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; +0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; +0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; +0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; +0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; +0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; +055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; +055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; +055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; +055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; +055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; +0560;ARMENIAN SMALL LETTER TURNED AYB;Ll;0;L;;;;;N;;;;; +0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 +0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 +0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 +0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 +0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 +0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 +0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 +0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 +0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 +056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A +056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B +056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C +056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D +056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E +056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F +0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 +0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 +0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 +0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 +0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 +0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 +0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 +0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 +0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 +0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 +057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A +057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B +057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C +057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D +057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E +057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F +0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 +0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 +0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 +0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 +0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 +0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 +0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 +0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L; 0565 0582;;;;N;;;;; +0588;ARMENIAN SMALL LETTER YI WITH STROKE;Ll;0;L;;;;;N;;;;; +0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; +058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; +058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;; +0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; +0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; +0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; +0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; +0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; +0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;; +0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; +0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;; +0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; +059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; +059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; +059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; +059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; +059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; +059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; +05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; +05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; +05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; +05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; +05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;; +05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; +05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; +05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;; +05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; +05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;; +05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; +05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; +05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; +05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; +05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; +05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; +05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; +05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; +05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; +05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; +05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; +05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; +05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; +05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; +05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; +05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; +05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;; +05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;; +05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; +05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; +05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;; +05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; +05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; +05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;; +05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; +05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; +05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; +05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; +05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; +05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; +05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; +05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; +05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; +05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; +05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; +05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; +05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; +05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; +05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; +05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; +05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; +05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; +05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; +05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; +05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; +05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; +05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; +05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; +05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; +05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; +05EF;HEBREW YOD TRIANGLE;Lo;0;R;;;;;N;;;;; +05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; +05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; +05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; +05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; +05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; +0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; +0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; +0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; +0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; +0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;; +0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; +0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; +0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; +0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; +060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; +060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; +060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; +060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; +0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; +0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; +0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; +0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; +0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; +0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; +0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; +0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; +061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; +061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;; +061D;ARABIC END OF TEXT MARK;Po;0;AL;;;;;N;;;;; +061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; +061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; +0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;; +0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; +0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; +0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; +0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; +0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; +0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; +0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; +0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; +0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; +062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; +062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; +062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; +062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; +062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; +062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; +0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; +0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; +0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; +0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; +0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; +0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; +0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; +0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; +0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; +063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; +0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; +0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; +0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; +0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; +0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; +0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; +0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; +0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; +064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; +064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; +064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; +064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; +064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; +064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; +0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; +0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; +0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; +0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; +0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; +0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; +0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; +0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; +065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; +065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; +065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; +066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; +066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; +066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; +066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; +066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; +0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; +0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; +0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; +0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; +0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; +0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL; 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; +0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL; 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; +0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL; 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; +0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL; 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; +0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; +067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; +067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; +067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; +067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; +067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; +067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; +0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; +0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; +0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; +0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; +0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; +0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; +0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; +0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; +0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; +0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; +068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; +068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; +068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; +068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; +0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; +0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; +0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; +0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; +0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; +0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; +0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; +0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; +0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; +069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; +06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; +06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; +06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; +06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; +06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; +06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; +06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; +06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; +06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; +06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; +06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; +06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;; +06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; +06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; +06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; +06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; +06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; +06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; +06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; +06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; +06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; +06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; +06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; +06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; +06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; +06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; +06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; +06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; +06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; +06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; +06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; +06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; +06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; +06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; +06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;; +06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; +06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; +06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; +06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; +06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; +06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; +06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; +06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; +06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; +06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; +06DE;ARABIC START OF RUB EL HIZB;So;0;ON;;;;;N;;;;; +06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; +06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; +06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; +06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; +06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; +06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; +06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; +06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; +06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; +06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; +06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; +06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; +06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; +06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; +06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; +06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; +06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; +06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; +06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; +06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; +06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; +06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; +06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; +06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; +06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; +06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; +06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; +06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; +0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; +0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; +0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; +0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; +070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; +070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; +070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; +070F;SYRIAC ABBREVIATION MARK;Cf;0;AL;;;;;N;;;;; +0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; +0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; +0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; +0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; +0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; +0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; +0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; +0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; +0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; +071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; +071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; +071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; +071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; +071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; +0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; +0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; +0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; +0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; +0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; +0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; +0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; +0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; +0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; +0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; +072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; +072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; +072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; +072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; +072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; +072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;; +0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; +0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; +0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; +0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; +0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; +073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; +073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; +073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; +073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; +0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; +0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; +0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; +0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; +0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; +074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; +074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; +074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; +074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; +0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; +0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; +075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; +075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; +0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; +076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; +076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; +076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; +077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; +0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; +0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; +0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; +0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; +0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; +0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; +0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; +0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; +0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; +078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; +078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; +078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; +078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; +078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; +078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; +0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; +0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; +0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; +0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; +0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; +0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; +0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; +0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; +0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; +0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; +079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; +079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; +079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; +079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; +079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; +079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; +07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; +07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; +07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; +07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; +07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; +07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; +07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; +07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; +07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; +07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; +07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; +07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; +07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; +07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; +07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; +07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; +07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; +07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; +07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; +07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; +07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; +07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; +07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; +07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; +07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; +07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; +07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; +07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; +07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; +07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; +07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; +07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; +07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; +07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; +07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; +07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; +07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; +07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; +07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; +07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; +07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; +07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; +07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; +07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; +07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; +07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; +07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; +07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; +07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; +07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; +07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; +07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; +07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; +07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; +07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; +07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; +07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; +07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; +07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; +07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; +07FD;NKO DANTAYALAN;Mn;220;NSM;;;;;N;;;;; +07FE;NKO DOROME SIGN;Sc;0;R;;;;;N;;;;; +07FF;NKO TAMAN SIGN;Sc;0;R;;;;;N;;;;; +0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;; +0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;; +0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;; +0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;; +0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;; +0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;; +0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;; +0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;; +0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;; +0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;; +080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;; +080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;; +080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;; +080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;; +080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;; +080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;; +0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;; +0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;; +0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;; +0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;; +0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;; +0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;; +0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;; +0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;; +0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;; +0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;; +081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;; +081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;; +081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;; +081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; +081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;; +081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;; +0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;; +0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;; +0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;; +0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;; +0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;; +0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;; +0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;; +0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;; +0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;; +0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;; +082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;; +082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;; +082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;; +0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;; +0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;; +0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;; +0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;; +0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;; +0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;; +0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;; +0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;; +0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;; +0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;; +083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;; +083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;; +083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;; +083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;; +083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;; +0840;MANDAIC LETTER HALQA;Lo;0;R;;;;;N;;;;; +0841;MANDAIC LETTER AB;Lo;0;R;;;;;N;;;;; +0842;MANDAIC LETTER AG;Lo;0;R;;;;;N;;;;; +0843;MANDAIC LETTER AD;Lo;0;R;;;;;N;;;;; +0844;MANDAIC LETTER AH;Lo;0;R;;;;;N;;;;; +0845;MANDAIC LETTER USHENNA;Lo;0;R;;;;;N;;;;; +0846;MANDAIC LETTER AZ;Lo;0;R;;;;;N;;;;; +0847;MANDAIC LETTER IT;Lo;0;R;;;;;N;;;;; +0848;MANDAIC LETTER ATT;Lo;0;R;;;;;N;;;;; +0849;MANDAIC LETTER AKSA;Lo;0;R;;;;;N;;;;; +084A;MANDAIC LETTER AK;Lo;0;R;;;;;N;;;;; +084B;MANDAIC LETTER AL;Lo;0;R;;;;;N;;;;; +084C;MANDAIC LETTER AM;Lo;0;R;;;;;N;;;;; +084D;MANDAIC LETTER AN;Lo;0;R;;;;;N;;;;; +084E;MANDAIC LETTER AS;Lo;0;R;;;;;N;;;;; +084F;MANDAIC LETTER IN;Lo;0;R;;;;;N;;;;; +0850;MANDAIC LETTER AP;Lo;0;R;;;;;N;;;;; +0851;MANDAIC LETTER ASZ;Lo;0;R;;;;;N;;;;; +0852;MANDAIC LETTER AQ;Lo;0;R;;;;;N;;;;; +0853;MANDAIC LETTER AR;Lo;0;R;;;;;N;;;;; +0854;MANDAIC LETTER ASH;Lo;0;R;;;;;N;;;;; +0855;MANDAIC LETTER AT;Lo;0;R;;;;;N;;;;; +0856;MANDAIC LETTER DUSHENNA;Lo;0;R;;;;;N;;;;; +0857;MANDAIC LETTER KAD;Lo;0;R;;;;;N;;;;; +0858;MANDAIC LETTER AIN;Lo;0;R;;;;;N;;;;; +0859;MANDAIC AFFRICATION MARK;Mn;220;NSM;;;;;N;;;;; +085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;; +085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;; +0860;SYRIAC LETTER MALAYALAM NGA;Lo;0;AL;;;;;N;;;;; +0861;SYRIAC LETTER MALAYALAM JA;Lo;0;AL;;;;;N;;;;; +0862;SYRIAC LETTER MALAYALAM NYA;Lo;0;AL;;;;;N;;;;; +0863;SYRIAC LETTER MALAYALAM TTA;Lo;0;AL;;;;;N;;;;; +0864;SYRIAC LETTER MALAYALAM NNA;Lo;0;AL;;;;;N;;;;; +0865;SYRIAC LETTER MALAYALAM NNNA;Lo;0;AL;;;;;N;;;;; +0866;SYRIAC LETTER MALAYALAM BHA;Lo;0;AL;;;;;N;;;;; +0867;SYRIAC LETTER MALAYALAM RA;Lo;0;AL;;;;;N;;;;; +0868;SYRIAC LETTER MALAYALAM LLA;Lo;0;AL;;;;;N;;;;; +0869;SYRIAC LETTER MALAYALAM LLLA;Lo;0;AL;;;;;N;;;;; +086A;SYRIAC LETTER MALAYALAM SSA;Lo;0;AL;;;;;N;;;;; +0870;ARABIC LETTER ALEF WITH ATTACHED FATHA;Lo;0;AL;;;;;N;;;;; +0871;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA;Lo;0;AL;;;;;N;;;;; +0872;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE;Lo;0;AL;;;;;N;;;;; +0873;ARABIC LETTER ALEF WITH LEFT MIDDLE STROKE;Lo;0;AL;;;;;N;;;;; +0874;ARABIC LETTER ALEF WITH ATTACHED KASRA;Lo;0;AL;;;;;N;;;;; +0875;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA;Lo;0;AL;;;;;N;;;;; +0876;ARABIC LETTER ALEF WITH ATTACHED ROUND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0877;ARABIC LETTER ALEF WITH ATTACHED RIGHT ROUND DOT;Lo;0;AL;;;;;N;;;;; +0878;ARABIC LETTER ALEF WITH ATTACHED LEFT ROUND DOT;Lo;0;AL;;;;;N;;;;; +0879;ARABIC LETTER ALEF WITH ATTACHED ROUND DOT BELOW;Lo;0;AL;;;;;N;;;;; +087A;ARABIC LETTER ALEF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087B;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087C;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087D;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087E;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA AND LEFT RING;Lo;0;AL;;;;;N;;;;; +087F;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE AND LEFT RING;Lo;0;AL;;;;;N;;;;; +0880;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA AND LEFT RING;Lo;0;AL;;;;;N;;;;; +0881;ARABIC LETTER ALEF WITH ATTACHED RIGHT HAMZA;Lo;0;AL;;;;;N;;;;; +0882;ARABIC LETTER ALEF WITH ATTACHED LEFT HAMZA;Lo;0;AL;;;;;N;;;;; +0883;ARABIC TATWEEL WITH OVERSTRUCK HAMZA;Lo;0;AL;;;;;N;;;;; +0884;ARABIC TATWEEL WITH OVERSTRUCK WAW;Lo;0;AL;;;;;N;;;;; +0885;ARABIC TATWEEL WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0886;ARABIC LETTER THIN YEH;Lo;0;AL;;;;;N;;;;; +0887;ARABIC BASELINE ROUND DOT;Lo;0;AL;;;;;N;;;;; +0888;ARABIC RAISED ROUND DOT;Sk;0;AL;;;;;N;;;;; +0889;ARABIC LETTER NOON WITH INVERTED SMALL V;Lo;0;AL;;;;;N;;;;; +088A;ARABIC LETTER HAH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +088B;ARABIC LETTER TAH WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +088C;ARABIC LETTER TAH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +088D;ARABIC LETTER KEHEH WITH TWO DOTS VERTICALLY BELOW;Lo;0;AL;;;;;N;;;;; +088E;ARABIC VERTICAL TAIL;Lo;0;AL;;;;;N;;;;; +088F;ARABIC LETTER NOON WITH RING ABOVE;Lo;0;AL;;;;;N;;;;; +0890;ARABIC POUND MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0891;ARABIC PIASTRE MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0897;ARABIC PEPET;Mn;230;NSM;;;;;N;;;;; +0898;ARABIC SMALL HIGH WORD AL-JUZ;Mn;230;NSM;;;;;N;;;;; +0899;ARABIC SMALL LOW WORD ISHMAAM;Mn;220;NSM;;;;;N;;;;; +089A;ARABIC SMALL LOW WORD IMAALA;Mn;220;NSM;;;;;N;;;;; +089B;ARABIC SMALL LOW WORD TASHEEL;Mn;220;NSM;;;;;N;;;;; +089C;ARABIC MADDA WAAJIB;Mn;230;NSM;;;;;N;;;;; +089D;ARABIC SUPERSCRIPT ALEF MOKHASSAS;Mn;230;NSM;;;;;N;;;;; +089E;ARABIC DOUBLED MADDA;Mn;230;NSM;;;;;N;;;;; +089F;ARABIC HALF MADDA OVER MADDA;Mn;230;NSM;;;;;N;;;;; +08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A3;ARABIC LETTER TAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A4;ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A5;ARABIC LETTER QAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08A6;ARABIC LETTER LAM WITH DOUBLE BAR;Lo;0;AL;;;;;N;;;;; +08A7;ARABIC LETTER MEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A8;ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A9;ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +08AA;ARABIC LETTER REH WITH LOOP;Lo;0;AL;;;;;N;;;;; +08AB;ARABIC LETTER WAW WITH DOT WITHIN;Lo;0;AL;;;;;N;;;;; +08AC;ARABIC LETTER ROHINGYA YEH;Lo;0;AL;;;;;N;;;;; +08AD;ARABIC LETTER LOW ALEF;Lo;0;AL;;;;;N;;;;; +08AE;ARABIC LETTER DAL WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08AF;ARABIC LETTER SAD WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; +08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; +08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; +08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08B5;ARABIC LETTER QAF WITH DOT BELOW AND NO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08B6;ARABIC LETTER BEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;; +08B7;ARABIC LETTER PEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;; +08B8;ARABIC LETTER TEH WITH SMALL TEH ABOVE;Lo;0;AL;;;;;N;;;;; +08B9;ARABIC LETTER REH WITH SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;; +08BA;ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;; +08BB;ARABIC LETTER AFRICAN FEH;Lo;0;AL;;;;;N;;;;; +08BC;ARABIC LETTER AFRICAN QAF;Lo;0;AL;;;;;N;;;;; +08BD;ARABIC LETTER AFRICAN NOON;Lo;0;AL;;;;;N;;;;; +08BE;ARABIC LETTER PEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08BF;ARABIC LETTER TEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C0;ARABIC LETTER TTEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C1;ARABIC LETTER TCHEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C2;ARABIC LETTER KEHEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C3;ARABIC LETTER GHAIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08C4;ARABIC LETTER AFRICAN QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08C5;ARABIC LETTER JEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08C6;ARABIC LETTER JEEM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08C7;ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +08C8;ARABIC LETTER GRAF;Lo;0;AL;;;;;N;;;;; +08C9;ARABIC SMALL FARSI YEH;Lm;0;AL;;;;;N;;;;; +08CA;ARABIC SMALL HIGH FARSI YEH;Mn;230;NSM;;;;;N;;;;; +08CB;ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW;Mn;230;NSM;;;;;N;;;;; +08CC;ARABIC SMALL HIGH WORD SAH;Mn;230;NSM;;;;;N;;;;; +08CD;ARABIC SMALL HIGH ZAH;Mn;230;NSM;;;;;N;;;;; +08CE;ARABIC LARGE ROUND DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08CF;ARABIC LARGE ROUND DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08D0;ARABIC SUKUN BELOW;Mn;220;NSM;;;;;N;;;;; +08D1;ARABIC LARGE CIRCLE BELOW;Mn;220;NSM;;;;;N;;;;; +08D2;ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW;Mn;220;NSM;;;;;N;;;;; +08D3;ARABIC SMALL LOW WAW;Mn;220;NSM;;;;;N;;;;; +08D4;ARABIC SMALL HIGH WORD AR-RUB;Mn;230;NSM;;;;;N;;;;; +08D5;ARABIC SMALL HIGH SAD;Mn;230;NSM;;;;;N;;;;; +08D6;ARABIC SMALL HIGH AIN;Mn;230;NSM;;;;;N;;;;; +08D7;ARABIC SMALL HIGH QAF;Mn;230;NSM;;;;;N;;;;; +08D8;ARABIC SMALL HIGH NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;; +08D9;ARABIC SMALL LOW NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;; +08DA;ARABIC SMALL HIGH WORD ATH-THALATHA;Mn;230;NSM;;;;;N;;;;; +08DB;ARABIC SMALL HIGH WORD AS-SAJDA;Mn;230;NSM;;;;;N;;;;; +08DC;ARABIC SMALL HIGH WORD AN-NISF;Mn;230;NSM;;;;;N;;;;; +08DD;ARABIC SMALL HIGH WORD SAKTA;Mn;230;NSM;;;;;N;;;;; +08DE;ARABIC SMALL HIGH WORD QIF;Mn;230;NSM;;;;;N;;;;; +08DF;ARABIC SMALL HIGH WORD WAQFA;Mn;230;NSM;;;;;N;;;;; +08E0;ARABIC SMALL HIGH FOOTNOTE MARKER;Mn;230;NSM;;;;;N;;;;; +08E1;ARABIC SMALL HIGH SIGN SAFHA;Mn;230;NSM;;;;;N;;;;; +08E2;ARABIC DISPUTED END OF AYAH;Cf;0;AN;;;;;N;;;;; +08E3;ARABIC TURNED DAMMA BELOW;Mn;220;NSM;;;;;N;;;;; +08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; +08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; +08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; +08E7;ARABIC CURLY FATHATAN;Mn;230;NSM;;;;;N;;;;; +08E8;ARABIC CURLY DAMMATAN;Mn;230;NSM;;;;;N;;;;; +08E9;ARABIC CURLY KASRATAN;Mn;220;NSM;;;;;N;;;;; +08EA;ARABIC TONE ONE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08EB;ARABIC TONE TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +08EC;ARABIC TONE LOOP ABOVE;Mn;230;NSM;;;;;N;;;;; +08ED;ARABIC TONE ONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08EE;ARABIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +08EF;ARABIC TONE LOOP BELOW;Mn;220;NSM;;;;;N;;;;; +08F0;ARABIC OPEN FATHATAN;Mn;27;NSM;;;;;N;;;;; +08F1;ARABIC OPEN DAMMATAN;Mn;28;NSM;;;;;N;;;;; +08F2;ARABIC OPEN KASRATAN;Mn;29;NSM;;;;;N;;;;; +08F3;ARABIC SMALL HIGH WAW;Mn;230;NSM;;;;;N;;;;; +08F4;ARABIC FATHA WITH RING;Mn;230;NSM;;;;;N;;;;; +08F5;ARABIC FATHA WITH DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08F6;ARABIC KASRA WITH DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08F7;ARABIC LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F8;ARABIC RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F9;ARABIC LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FA;ARABIC RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FB;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08FC;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FD;ARABIC RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FE;ARABIC DAMMA WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FF;ARABIC MARK SIDEWAYS NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;; +0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; +0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; +0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; +0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; +090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; +090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; +090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; +0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; +0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; +0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; +0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; +092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; +0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; +0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +093A;DEVANAGARI VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +093B;DEVANAGARI VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; +093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +094F;DEVANAGARI VOWEL SIGN AW;Mc;0;L;;;;;N;;;;; +0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; +0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; +0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; +0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;; +0956;DEVANAGARI VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +0957;DEVANAGARI VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; +0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; +095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; +095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; +095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; +095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; +095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; +095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; +0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; +0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; +0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; +0973;DEVANAGARI LETTER OE;Lo;0;L;;;;;N;;;;; +0974;DEVANAGARI LETTER OOE;Lo;0;L;;;;;N;;;;; +0975;DEVANAGARI LETTER AW;Lo;0;L;;;;;N;;;;; +0976;DEVANAGARI LETTER UE;Lo;0;L;;;;;N;;;;; +0977;DEVANAGARI LETTER UUE;Lo;0;L;;;;;N;;;;; +0978;DEVANAGARI LETTER MARWARI DDA;Lo;0;L;;;;;N;;;;; +0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;; +097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;; +097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; +097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; +097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; +097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; +0980;BENGALI ANJI;Lo;0;L;;;;;N;;;;; +0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; +0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; +0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; +0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; +0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; +098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; +098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; +0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; +0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; +0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; +0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; +0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; +0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; +0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; +0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; +099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; +099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; +099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; +099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; +099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; +099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; +09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; +09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; +09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; +09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; +09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; +09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; +09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; +09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; +09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; +09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; +09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; +09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; +09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; +09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; +09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; +09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; +09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; +09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; +09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; +09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; +09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; +09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; +09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; +09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; +09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; +09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; +09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; +09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;; +09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;; +09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; +09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;; +09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;; +09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;; +09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;; +09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;; +09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; +09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; +09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; +09FC;BENGALI LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +09FD;BENGALI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +09FE;BENGALI SANDHI MARK;Mn;230;NSM;;;;;N;;;;; +0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; +0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; +0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; +0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; +0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; +0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; +0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; +0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; +0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; +0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; +0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; +0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; +0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; +0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; +0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; +0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; +0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; +0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; +0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; +0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; +0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; +0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; +0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; +0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; +0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; +0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; +0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; +0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; +0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; +0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; +0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; +0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; +0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; +0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; +0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; +0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; +0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; +0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; +0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; +0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; +0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; +0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; +0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; +0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; +0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; +0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; +0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; +0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; +0A76;GURMUKHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; +0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; +0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; +0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; +0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; +0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; +0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; +0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; +0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; +0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; +0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; +0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; +0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; +0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; +0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; +0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; +0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; +0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; +0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; +0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; +0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; +0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; +0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; +0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; +0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; +0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; +0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; +0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; +0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; +0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; +0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; +0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; +0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; +0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; +0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; +0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; +0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; +0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; +0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; +0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;; +0AFA;GUJARATI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;; +0AFB;GUJARATI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +0AFC;GUJARATI SIGN MADDAH;Mn;0;NSM;;;;;N;;;;; +0AFD;GUJARATI SIGN THREE-DOT NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0AFE;GUJARATI SIGN CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0AFF;GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; +0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; +0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; +0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; +0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; +0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; +0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; +0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; +0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; +0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; +0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; +0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; +0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; +0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; +0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; +0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; +0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; +0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; +0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; +0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; +0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; +0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; +0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; +0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; +0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; +0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; +0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; +0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; +0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; +0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; +0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; +0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; +0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; +0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; +0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; +0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; +0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; +0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;; +0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; +0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; +0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; +0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; +0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; +0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; +0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; +0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0B55;ORIYA SIGN OVERLINE;Mn;0;NSM;;;;;N;;;;; +0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; +0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; +0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; +0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; +0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;; +0B72;ORIYA FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0B73;ORIYA FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0B74;ORIYA FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0B75;ORIYA FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +0B76;ORIYA FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +0B77;ORIYA FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; +0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; +0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; +0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; +0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; +0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; +0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; +0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; +0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; +0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; +0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; +0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; +0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; +0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; +0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; +0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; +0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; +0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; +0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; +0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; +0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; +0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; +0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; +0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; +0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; +0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; +0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; +0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; +0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; +0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; +0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; +0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; +0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; +0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; +0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; +0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; +0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; +0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; +0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; +0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; +0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;; +0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;; +0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;; +0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;; +0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;; +0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;; +0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;; +0C00;TELUGU SIGN COMBINING CANDRABINDU ABOVE;Mn;0;NSM;;;;;N;;;;; +0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C04;TELUGU SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; +0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; +0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; +0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; +0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; +0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; +0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; +0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; +0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; +0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; +0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; +0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; +0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; +0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; +0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; +0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; +0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; +0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; +0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; +0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; +0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; +0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; +0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; +0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; +0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; +0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; +0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; +0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; +0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; +0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; +0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; +0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; +0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; +0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; +0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; +0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; +0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; +0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; +0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; +0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; +0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; +0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; +0C34;TELUGU LETTER LLLA;Lo;0;L;;;;;N;;;;; +0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; +0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; +0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; +0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; +0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3C;TELUGU SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; +0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; +0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; +0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; +0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;; +0C5C;TELUGU ARCHAIC SHRII;Lo;0;L;;;;;N;;;;; +0C5D;TELUGU LETTER NAKAARA POLLU;Lo;0;L;;;;;N;;;;; +0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C77;TELUGU SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; +0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; +0C80;KANNADA SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; +0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C84;KANNADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; +0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; +0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; +0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; +0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; +0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; +0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; +0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; +0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; +0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; +0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; +0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; +0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; +0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; +0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; +0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; +0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; +0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; +0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; +0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; +0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; +0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; +0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; +0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; +0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; +0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; +0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; +0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; +0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; +0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; +0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; +0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; +0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; +0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; +0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; +0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; +0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; +0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; +0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; +0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; +0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; +0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; +0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; +0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; +0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; +0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;; +0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; +0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;; +0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; +0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; +0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; +0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; +0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CDC;KANNADA ARCHAIC SHRII;Lo;0;L;;;;;N;;;;; +0CDD;KANNADA LETTER NAKAARA POLLU;Lo;0;L;;;;;N;;;;; +0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; +0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +0CF3;KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT;Mc;0;L;;;;;N;;;;; +0D00;MALAYALAM SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0D04;MALAYALAM LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; +0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; +0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; +0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; +0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; +0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; +0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; +0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; +0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; +0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; +0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; +0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; +0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; +0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; +0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; +0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; +0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; +0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; +0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; +0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; +0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; +0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; +0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; +0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; +0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; +0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; +0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; +0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; +0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; +0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; +0D29;MALAYALAM LETTER NNNA;Lo;0;L;;;;;N;;;;; +0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; +0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; +0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; +0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; +0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; +0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; +0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; +0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; +0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; +0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; +0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; +0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; +0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; +0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; +0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; +0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; +0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;; +0D3B;MALAYALAM SIGN VERTICAL BAR VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D3C;MALAYALAM SIGN CIRCULAR VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; +0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; +0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; +0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; +0D4F;MALAYALAM SIGN PARA;So;0;L;;;;;N;;;;; +0D54;MALAYALAM LETTER CHILLU M;Lo;0;L;;;;;N;;;;; +0D55;MALAYALAM LETTER CHILLU Y;Lo;0;L;;;;;N;;;;; +0D56;MALAYALAM LETTER CHILLU LLL;Lo;0;L;;;;;N;;;;; +0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D58;MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;; +0D59;MALAYALAM FRACTION ONE FORTIETH;No;0;L;;;;1/40;N;;;;; +0D5A;MALAYALAM FRACTION THREE EIGHTIETHS;No;0;L;;;;3/80;N;;;;; +0D5B;MALAYALAM FRACTION ONE TWENTIETH;No;0;L;;;;1/20;N;;;;; +0D5C;MALAYALAM FRACTION ONE TENTH;No;0;L;;;;1/10;N;;;;; +0D5D;MALAYALAM FRACTION THREE TWENTIETHS;No;0;L;;;;3/20;N;;;;; +0D5E;MALAYALAM FRACTION ONE FIFTH;No;0;L;;;;1/5;N;;;;; +0D5F;MALAYALAM LETTER ARCHAIC II;Lo;0;L;;;;;N;;;;; +0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; +0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0D76;MALAYALAM FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +0D77;MALAYALAM FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +0D78;MALAYALAM FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; +0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; +0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; +0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; +0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; +0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; +0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; +0D81;SINHALA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; +0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; +0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; +0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; +0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; +0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; +0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; +0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; +0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; +0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; +0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; +0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; +0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; +0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; +0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; +0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; +0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; +0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; +0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; +0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; +0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; +0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; +0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; +0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; +0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; +0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; +0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; +0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; +0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; +0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; +0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; +0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; +0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; +0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; +0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; +0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; +0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; +0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DE6;SINHALA LITH DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0DE7;SINHALA LITH DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0DE8;SINHALA LITH DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0DE9;SINHALA LITH DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0DEA;SINHALA LITH DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0DEB;SINHALA LITH DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0DEC;SINHALA LITH DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0DED;SINHALA LITH DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0DEE;SINHALA LITH DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0DEF;SINHALA LITH DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; +0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; +0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; +0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; +0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; +0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; +0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; +0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; +0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; +0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; +0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; +0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; +0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; +0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; +0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; +0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; +0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; +0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; +0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; +0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; +0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; +0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; +0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; +0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; +0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; +0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; +0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; +0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; +0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; +0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; +0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; +0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; +0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; +0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; +0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; +0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; +0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; +0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; +0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; +0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; +0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; +0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; +0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; +0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; +0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; +0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; +0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; +0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;; +0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; +0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; +0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; +0E33;THAI CHARACTER SARA AM;Lo;0;L; 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; +0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; +0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; +0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; +0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;; +0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; +0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; +0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; +0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; +0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; +0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; +0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; +0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;; +0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;; +0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;; +0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;; +0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;; +0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; +0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; +0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; +0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; +0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; +0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;; +0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; +0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; +0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; +0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; +0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; +0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; +0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; +0E86;LAO LETTER PALI GHA;Lo;0;L;;;;;N;;;;; +0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; +0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; +0E89;LAO LETTER PALI CHA;Lo;0;L;;;;;N;;;;; +0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; +0E8C;LAO LETTER PALI JHA;Lo;0;L;;;;;N;;;;; +0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; +0E8E;LAO LETTER PALI NYA;Lo;0;L;;;;;N;;;;; +0E8F;LAO LETTER PALI TTA;Lo;0;L;;;;;N;;;;; +0E90;LAO LETTER PALI TTHA;Lo;0;L;;;;;N;;;;; +0E91;LAO LETTER PALI DDA;Lo;0;L;;;;;N;;;;; +0E92;LAO LETTER PALI DDHA;Lo;0;L;;;;;N;;;;; +0E93;LAO LETTER PALI NNA;Lo;0;L;;;;;N;;;;; +0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; +0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; +0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; +0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; +0E98;LAO LETTER PALI DHA;Lo;0;L;;;;;N;;;;; +0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; +0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; +0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; +0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; +0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; +0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; +0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; +0EA0;LAO LETTER PALI BHA;Lo;0;L;;;;;N;;;;; +0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; +0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; +0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; +0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; +0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; +0EA8;LAO LETTER SANSKRIT SHA;Lo;0;L;;;;;N;;;;; +0EA9;LAO LETTER SANSKRIT SSA;Lo;0;L;;;;;N;;;;; +0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; +0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; +0EAC;LAO LETTER PALI LLA;Lo;0;L;;;;;N;;;;; +0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; +0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; +0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; +0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; +0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; +0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +0EB3;LAO VOWEL SIGN AM;Lo;0;L; 0ECD 0EB2;;;;N;;;;; +0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; +0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; +0EBA;LAO SIGN PALI VIRAMA;Mn;9;NSM;;;;;N;;;;; +0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; +0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; +0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; +0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; +0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; +0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; +0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; +0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; +0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; +0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; +0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; +0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; +0ECE;LAO YAMAKKAN;Mn;0;NSM;;;;;N;;;;; +0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0EDC;LAO HO NO;Lo;0;L; 0EAB 0E99;;;;N;;;;; +0EDD;LAO HO MO;Lo;0;L; 0EAB 0EA1;;;;N;;;;; +0EDE;LAO LETTER KHMU GO;Lo;0;L;;;;;N;;;;; +0EDF;LAO LETTER KHMU NYO;Lo;0;L;;;;;N;;;;; +0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; +0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;; +0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;; +0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;; +0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;; +0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;; +0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;; +0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;; +0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;; +0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;; +0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;; +0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L; 0F0B;;;;N;;;;; +0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;; +0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;; +0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;; +0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;; +0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;; +0F14;TIBETAN MARK GTER TSHEG;Po;0;L;;;;;N;TIBETAN COMMA;;;; +0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;; +0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;; +0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;; +0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;; +0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;; +0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;; +0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;; +0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;; +0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;; +0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;; +0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;; +0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; +0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; +0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; +0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; +0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; +0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; +0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; +0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; +0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; +0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; +0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;; +0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;; +0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;; +0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;; +0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;; +0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;; +0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;; +0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;; +0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; +0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; +0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; +0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; +0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; +0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; +0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; +0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; +0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; +0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; +0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; +0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; +0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; +0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; +0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; +0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; +0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; +0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; +0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; +0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; +0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; +0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; +0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; +0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; +0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; +0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; +0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; +0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; +0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; +0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; +0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; +0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; +0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;; +0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; +0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; +0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; +0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; +0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; +0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; +0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; +0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;; +0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; +0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; +0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; +0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; +0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; +0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; +0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; +0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; +0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM; 0FB2 0F81;;;;N;;;;; +0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; +0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM; 0FB3 0F81;;;;N;;;;; +0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; +0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; +0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; +0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; +0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;; +0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;; +0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; +0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; +0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;; +0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;; +0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; +0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; +0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;; +0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;; +0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;; +0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;; +0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;; +0F8C;TIBETAN SIGN INVERTED MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8D;TIBETAN SUBJOINED SIGN LCE TSA CAN;Mn;0;NSM;;;;;N;;;;; +0F8E;TIBETAN SUBJOINED SIGN MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F8F;TIBETAN SUBJOINED SIGN INVERTED MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; +0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; +0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; +0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; +0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; +0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; +0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; +0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; +0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; +0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; +0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;; +0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; +0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; +0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;; +0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;; +0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;; +0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;; +0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;; +0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; +0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; +0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;; +0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;; +0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;; +0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;; +0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;; +0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;; +0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;; +0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;; +0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;; +0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;; +0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;; +0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;; +0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; +0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;; +0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;; +0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD9;TIBETAN MARK LEADING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +0FDA;TIBETAN MARK TRAILING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; +1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; +1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; +1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; +1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; +1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; +1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; +1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; +1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; +1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; +100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; +100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; +100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; +100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; +100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; +100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; +1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; +1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; +1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; +1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; +1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; +1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; +1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; +1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; +1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; +1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; +101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; +101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; +101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; +101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; +101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; +101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; +1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; +1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; +1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; +1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; +1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; +1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; +1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; +1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; +102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; +1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; +1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; +1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; +103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; +103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; +104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; +104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; +104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; +104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; +104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; +1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; +1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; +1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; +105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; +105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; +105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; +105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; +105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; +1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; +1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; +1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; +1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; +1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; +1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; +1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; +1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; +1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; +106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; +106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; +106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; +106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; +106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; +106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; +1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; +1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; +1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; +1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; +1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; +1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; +1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; +1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; +1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; +1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; +107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; +107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; +107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; +107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; +107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; +107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; +1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; +1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; +1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; +1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; +1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; +1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; +1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; +1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; +108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; +108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; +108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; +108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; +108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; +108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; +1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;; +109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;; +109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;; +109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;; +109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; +109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25; +10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27; +10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D; +10D0;GEORGIAN LETTER AN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;1C90;;10D0 +10D1;GEORGIAN LETTER BAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;1C91;;10D1 +10D2;GEORGIAN LETTER GAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;1C92;;10D2 +10D3;GEORGIAN LETTER DON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;1C93;;10D3 +10D4;GEORGIAN LETTER EN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;1C94;;10D4 +10D5;GEORGIAN LETTER VIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;1C95;;10D5 +10D6;GEORGIAN LETTER ZEN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;1C96;;10D6 +10D7;GEORGIAN LETTER TAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;1C97;;10D7 +10D8;GEORGIAN LETTER IN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;1C98;;10D8 +10D9;GEORGIAN LETTER KAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;1C99;;10D9 +10DA;GEORGIAN LETTER LAS;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;1C9A;;10DA +10DB;GEORGIAN LETTER MAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;1C9B;;10DB +10DC;GEORGIAN LETTER NAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;1C9C;;10DC +10DD;GEORGIAN LETTER ON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;1C9D;;10DD +10DE;GEORGIAN LETTER PAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;1C9E;;10DE +10DF;GEORGIAN LETTER ZHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;1C9F;;10DF +10E0;GEORGIAN LETTER RAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;1CA0;;10E0 +10E1;GEORGIAN LETTER SAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;1CA1;;10E1 +10E2;GEORGIAN LETTER TAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;1CA2;;10E2 +10E3;GEORGIAN LETTER UN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;1CA3;;10E3 +10E4;GEORGIAN LETTER PHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;1CA4;;10E4 +10E5;GEORGIAN LETTER KHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;1CA5;;10E5 +10E6;GEORGIAN LETTER GHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;1CA6;;10E6 +10E7;GEORGIAN LETTER QAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;1CA7;;10E7 +10E8;GEORGIAN LETTER SHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;1CA8;;10E8 +10E9;GEORGIAN LETTER CHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;1CA9;;10E9 +10EA;GEORGIAN LETTER CAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;1CAA;;10EA +10EB;GEORGIAN LETTER JIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;1CAB;;10EB +10EC;GEORGIAN LETTER CIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;1CAC;;10EC +10ED;GEORGIAN LETTER CHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;1CAD;;10ED +10EE;GEORGIAN LETTER XAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;1CAE;;10EE +10EF;GEORGIAN LETTER JHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;1CAF;;10EF +10F0;GEORGIAN LETTER HAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;1CB0;;10F0 +10F1;GEORGIAN LETTER HE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;1CB1;;10F1 +10F2;GEORGIAN LETTER HIE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;1CB2;;10F2 +10F3;GEORGIAN LETTER WE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;1CB3;;10F3 +10F4;GEORGIAN LETTER HAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;1CB4;;10F4 +10F5;GEORGIAN LETTER HOE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;1CB5;;10F5 +10F6;GEORGIAN LETTER FI;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;1CB6;;10F6 +10F7;GEORGIAN LETTER YN;Ll;0;L;;;;;N;;;1CB7;;10F7 +10F8;GEORGIAN LETTER ELIFI;Ll;0;L;;;;;N;;;1CB8;;10F8 +10F9;GEORGIAN LETTER TURNED GAN;Ll;0;L;;;;;N;;;1CB9;;10F9 +10FA;GEORGIAN LETTER AIN;Ll;0;L;;;;;N;;;1CBA;;10FA +10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L; 10DC;;;;N;;;;; +10FD;GEORGIAN LETTER AEN;Ll;0;L;;;;;N;;;1CBD;;10FD +10FE;GEORGIAN LETTER HARD SIGN;Ll;0;L;;;;;N;;;1CBE;;10FE +10FF;GEORGIAN LETTER LABIAL SIGN;Ll;0;L;;;;;N;;;1CBF;;10FF +1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;; +1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;; +1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;; +1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;; +1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;; +110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; +110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;; +110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;; +1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; +1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; +1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; +112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; +112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; +112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; +1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; +1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; +113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; +113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; +113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; +1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; +1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; +1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; +1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; +114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; +114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; +114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; +114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; +114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; +1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; +1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; +1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; +1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;; +115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; +1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; +1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; +1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; +1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; +1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; +1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; +1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; +1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; +1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; +1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; +116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; +116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; +116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; +116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; +116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; +116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; +1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; +1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; +1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; +1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; +1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; +1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; +1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; +1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; +1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; +1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; +117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; +117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; +117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; +117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; +117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; +117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; +1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; +1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; +1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; +1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; +1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; +1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; +1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; +1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; +1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; +1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; +118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; +118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; +118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; +118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; +118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; +118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; +1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; +1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; +1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; +1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; +1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; +1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; +1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; +1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; +1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; +1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; +119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; +119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; +119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; +119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; +119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; +119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; +11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; +11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; +11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; +11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;; +11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;; +11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;; +11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;; +11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;; +11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;; +11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;; +11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;; +11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;; +11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;; +11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;; +11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;; +11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;; +11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;; +11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; +11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; +11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; +11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; +11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; +11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; +11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; +11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; +11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; +11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; +11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; +11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; +11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; +11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; +11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; +11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;; +11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;; +11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;; +11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;; +11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; +1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; +1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; +1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; +1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; +1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; +1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; +1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; +120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; +120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; +120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; +120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; +120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; +1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; +1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; +1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; +1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; +1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; +1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; +1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; +1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; +1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; +1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; +121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; +121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; +121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; +121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; +121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; +1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; +1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; +1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; +1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; +1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; +1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; +1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; +1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; +1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; +1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; +122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; +122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; +122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; +122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; +122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; +122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; +1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; +1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; +1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; +1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; +1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; +1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; +1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; +1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; +123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; +1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; +1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; +1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; +1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; +1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; +1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; +1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; +1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; +124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; +124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; +124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; +124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; +1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; +1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; +1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; +1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; +1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; +1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; +1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; +1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; +125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; +125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; +125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; +125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; +1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; +1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; +1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; +1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; +1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; +1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; +1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; +1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; +1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; +126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; +126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; +126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; +126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; +126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; +1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; +1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; +1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; +1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; +1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; +1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; +1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; +1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; +1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; +127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; +127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; +127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; +127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; +127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; +1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; +1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; +1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; +1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; +1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; +1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; +1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; +1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; +128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; +128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; +128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; +128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; +1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; +1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; +1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; +1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; +1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; +1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; +1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; +1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; +129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; +12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; +12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; +12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; +12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; +12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; +12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; +12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; +12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; +12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; +12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; +12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; +12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; +12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; +12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; +12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; +12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; +12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; +12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; +12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; +12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; +12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; +12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; +12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; +12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; +12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; +12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; +12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; +12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; +12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; +12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; +12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; +12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; +12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; +12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; +12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; +12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; +12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; +12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; +12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; +12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; +12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; +12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; +12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; +12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; +12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; +12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; +12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; +12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; +12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; +12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; +12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; +12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; +12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; +12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; +12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; +12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; +12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; +12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; +12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; +12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; +12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; +12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; +12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; +12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; +1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; +1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; +1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; +1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; +1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; +1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; +1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; +1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; +1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; +130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; +130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; +130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; +130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; +1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; +1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; +1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; +1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; +1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; +1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; +131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; +131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; +1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; +1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; +1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; +1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; +1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; +1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; +1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; +1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; +132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; +132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; +132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; +1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; +1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; +1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; +1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; +1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; +1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; +1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; +1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; +1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; +1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; +133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; +133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; +133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; +133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; +133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; +133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; +1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; +1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; +1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; +1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; +1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; +1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; +1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; +1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; +1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; +134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; +134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; +134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; +134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; +134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; +1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; +1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; +1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; +1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; +1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; +1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; +1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; +1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; +1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; +135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +135D;ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135E;ETHIOPIC COMBINING VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1360;ETHIOPIC SECTION MARK;Po;0;L;;;;;N;;;;; +1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; +1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; +1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; +1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; +1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; +1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; +1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; +1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; +1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; +1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; +137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; +1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; +1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; +1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; +1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; +1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; +1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; +1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; +1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; +1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; +138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; +138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; +138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; +138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; +138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; +138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; +1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; +1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; +1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; +1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; +1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; +1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; +1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; +1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; +1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; +1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; +13A0;CHEROKEE LETTER A;Lu;0;L;;;;;N;;;;AB70; +13A1;CHEROKEE LETTER E;Lu;0;L;;;;;N;;;;AB71; +13A2;CHEROKEE LETTER I;Lu;0;L;;;;;N;;;;AB72; +13A3;CHEROKEE LETTER O;Lu;0;L;;;;;N;;;;AB73; +13A4;CHEROKEE LETTER U;Lu;0;L;;;;;N;;;;AB74; +13A5;CHEROKEE LETTER V;Lu;0;L;;;;;N;;;;AB75; +13A6;CHEROKEE LETTER GA;Lu;0;L;;;;;N;;;;AB76; +13A7;CHEROKEE LETTER KA;Lu;0;L;;;;;N;;;;AB77; +13A8;CHEROKEE LETTER GE;Lu;0;L;;;;;N;;;;AB78; +13A9;CHEROKEE LETTER GI;Lu;0;L;;;;;N;;;;AB79; +13AA;CHEROKEE LETTER GO;Lu;0;L;;;;;N;;;;AB7A; +13AB;CHEROKEE LETTER GU;Lu;0;L;;;;;N;;;;AB7B; +13AC;CHEROKEE LETTER GV;Lu;0;L;;;;;N;;;;AB7C; +13AD;CHEROKEE LETTER HA;Lu;0;L;;;;;N;;;;AB7D; +13AE;CHEROKEE LETTER HE;Lu;0;L;;;;;N;;;;AB7E; +13AF;CHEROKEE LETTER HI;Lu;0;L;;;;;N;;;;AB7F; +13B0;CHEROKEE LETTER HO;Lu;0;L;;;;;N;;;;AB80; +13B1;CHEROKEE LETTER HU;Lu;0;L;;;;;N;;;;AB81; +13B2;CHEROKEE LETTER HV;Lu;0;L;;;;;N;;;;AB82; +13B3;CHEROKEE LETTER LA;Lu;0;L;;;;;N;;;;AB83; +13B4;CHEROKEE LETTER LE;Lu;0;L;;;;;N;;;;AB84; +13B5;CHEROKEE LETTER LI;Lu;0;L;;;;;N;;;;AB85; +13B6;CHEROKEE LETTER LO;Lu;0;L;;;;;N;;;;AB86; +13B7;CHEROKEE LETTER LU;Lu;0;L;;;;;N;;;;AB87; +13B8;CHEROKEE LETTER LV;Lu;0;L;;;;;N;;;;AB88; +13B9;CHEROKEE LETTER MA;Lu;0;L;;;;;N;;;;AB89; +13BA;CHEROKEE LETTER ME;Lu;0;L;;;;;N;;;;AB8A; +13BB;CHEROKEE LETTER MI;Lu;0;L;;;;;N;;;;AB8B; +13BC;CHEROKEE LETTER MO;Lu;0;L;;;;;N;;;;AB8C; +13BD;CHEROKEE LETTER MU;Lu;0;L;;;;;N;;;;AB8D; +13BE;CHEROKEE LETTER NA;Lu;0;L;;;;;N;;;;AB8E; +13BF;CHEROKEE LETTER HNA;Lu;0;L;;;;;N;;;;AB8F; +13C0;CHEROKEE LETTER NAH;Lu;0;L;;;;;N;;;;AB90; +13C1;CHEROKEE LETTER NE;Lu;0;L;;;;;N;;;;AB91; +13C2;CHEROKEE LETTER NI;Lu;0;L;;;;;N;;;;AB92; +13C3;CHEROKEE LETTER NO;Lu;0;L;;;;;N;;;;AB93; +13C4;CHEROKEE LETTER NU;Lu;0;L;;;;;N;;;;AB94; +13C5;CHEROKEE LETTER NV;Lu;0;L;;;;;N;;;;AB95; +13C6;CHEROKEE LETTER QUA;Lu;0;L;;;;;N;;;;AB96; +13C7;CHEROKEE LETTER QUE;Lu;0;L;;;;;N;;;;AB97; +13C8;CHEROKEE LETTER QUI;Lu;0;L;;;;;N;;;;AB98; +13C9;CHEROKEE LETTER QUO;Lu;0;L;;;;;N;;;;AB99; +13CA;CHEROKEE LETTER QUU;Lu;0;L;;;;;N;;;;AB9A; +13CB;CHEROKEE LETTER QUV;Lu;0;L;;;;;N;;;;AB9B; +13CC;CHEROKEE LETTER SA;Lu;0;L;;;;;N;;;;AB9C; +13CD;CHEROKEE LETTER S;Lu;0;L;;;;;N;;;;AB9D; +13CE;CHEROKEE LETTER SE;Lu;0;L;;;;;N;;;;AB9E; +13CF;CHEROKEE LETTER SI;Lu;0;L;;;;;N;;;;AB9F; +13D0;CHEROKEE LETTER SO;Lu;0;L;;;;;N;;;;ABA0; +13D1;CHEROKEE LETTER SU;Lu;0;L;;;;;N;;;;ABA1; +13D2;CHEROKEE LETTER SV;Lu;0;L;;;;;N;;;;ABA2; +13D3;CHEROKEE LETTER DA;Lu;0;L;;;;;N;;;;ABA3; +13D4;CHEROKEE LETTER TA;Lu;0;L;;;;;N;;;;ABA4; +13D5;CHEROKEE LETTER DE;Lu;0;L;;;;;N;;;;ABA5; +13D6;CHEROKEE LETTER TE;Lu;0;L;;;;;N;;;;ABA6; +13D7;CHEROKEE LETTER DI;Lu;0;L;;;;;N;;;;ABA7; +13D8;CHEROKEE LETTER TI;Lu;0;L;;;;;N;;;;ABA8; +13D9;CHEROKEE LETTER DO;Lu;0;L;;;;;N;;;;ABA9; +13DA;CHEROKEE LETTER DU;Lu;0;L;;;;;N;;;;ABAA; +13DB;CHEROKEE LETTER DV;Lu;0;L;;;;;N;;;;ABAB; +13DC;CHEROKEE LETTER DLA;Lu;0;L;;;;;N;;;;ABAC; +13DD;CHEROKEE LETTER TLA;Lu;0;L;;;;;N;;;;ABAD; +13DE;CHEROKEE LETTER TLE;Lu;0;L;;;;;N;;;;ABAE; +13DF;CHEROKEE LETTER TLI;Lu;0;L;;;;;N;;;;ABAF; +13E0;CHEROKEE LETTER TLO;Lu;0;L;;;;;N;;;;ABB0; +13E1;CHEROKEE LETTER TLU;Lu;0;L;;;;;N;;;;ABB1; +13E2;CHEROKEE LETTER TLV;Lu;0;L;;;;;N;;;;ABB2; +13E3;CHEROKEE LETTER TSA;Lu;0;L;;;;;N;;;;ABB3; +13E4;CHEROKEE LETTER TSE;Lu;0;L;;;;;N;;;;ABB4; +13E5;CHEROKEE LETTER TSI;Lu;0;L;;;;;N;;;;ABB5; +13E6;CHEROKEE LETTER TSO;Lu;0;L;;;;;N;;;;ABB6; +13E7;CHEROKEE LETTER TSU;Lu;0;L;;;;;N;;;;ABB7; +13E8;CHEROKEE LETTER TSV;Lu;0;L;;;;;N;;;;ABB8; +13E9;CHEROKEE LETTER WA;Lu;0;L;;;;;N;;;;ABB9; +13EA;CHEROKEE LETTER WE;Lu;0;L;;;;;N;;;;ABBA; +13EB;CHEROKEE LETTER WI;Lu;0;L;;;;;N;;;;ABBB; +13EC;CHEROKEE LETTER WO;Lu;0;L;;;;;N;;;;ABBC; +13ED;CHEROKEE LETTER WU;Lu;0;L;;;;;N;;;;ABBD; +13EE;CHEROKEE LETTER WV;Lu;0;L;;;;;N;;;;ABBE; +13EF;CHEROKEE LETTER YA;Lu;0;L;;;;;N;;;;ABBF; +13F0;CHEROKEE LETTER YE;Lu;0;L;;;;;N;;;;13F8; +13F1;CHEROKEE LETTER YI;Lu;0;L;;;;;N;;;;13F9; +13F2;CHEROKEE LETTER YO;Lu;0;L;;;;;N;;;;13FA; +13F3;CHEROKEE LETTER YU;Lu;0;L;;;;;N;;;;13FB; +13F4;CHEROKEE LETTER YV;Lu;0;L;;;;;N;;;;13FC; +13F5;CHEROKEE LETTER MV;Lu;0;L;;;;;N;;;;13FD; +13F8;CHEROKEE SMALL LETTER YE;Ll;0;L;;;;;N;;;13F0;;13F0 +13F9;CHEROKEE SMALL LETTER YI;Ll;0;L;;;;;N;;;13F1;;13F1 +13FA;CHEROKEE SMALL LETTER YO;Ll;0;L;;;;;N;;;13F2;;13F2 +13FB;CHEROKEE SMALL LETTER YU;Ll;0;L;;;;;N;;;13F3;;13F3 +13FC;CHEROKEE SMALL LETTER YV;Ll;0;L;;;;;N;;;13F4;;13F4 +13FD;CHEROKEE SMALL LETTER MV;Ll;0;L;;;;;N;;;13F5;;13F5 +1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; +1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; +1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; +1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; +1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; +1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; +1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; +1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; +1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; +1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; +140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; +140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; +140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; +140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; +140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; +140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; +1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; +1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; +1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; +1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; +1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; +1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; +1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; +1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; +1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; +1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; +141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; +141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; +141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; +141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; +141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; +1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; +1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; +1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; +1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; +1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; +1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; +1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; +1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; +1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; +1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; +142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; +142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; +142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; +142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; +142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; +142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; +1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; +1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; +1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; +1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; +1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; +1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; +1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; +1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; +1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; +1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; +143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; +143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; +143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; +143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; +143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; +143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; +1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; +1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; +1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; +1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; +1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; +1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; +1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; +1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; +1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; +1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; +144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; +144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; +144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; +144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; +144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; +144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; +1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; +1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; +1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; +1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; +1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; +1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; +1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; +1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; +1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; +1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; +145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; +145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; +145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; +145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; +145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; +145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; +1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; +1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; +1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; +1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; +1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; +1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; +1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; +1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; +1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; +1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; +146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; +146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; +146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; +146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; +146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; +146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; +1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; +1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; +1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; +1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; +1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; +1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; +1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; +1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; +1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; +1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; +147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; +147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; +147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; +147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; +147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; +147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; +1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; +1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; +1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; +1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; +1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; +1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; +1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; +1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; +1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; +1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; +148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; +148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; +148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; +148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; +148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; +148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; +1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; +1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; +1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; +1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; +1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; +1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; +1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; +1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; +1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; +1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; +149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; +149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; +149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; +149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; +149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; +149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; +14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; +14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; +14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; +14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; +14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; +14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; +14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; +14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; +14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; +14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; +14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; +14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; +14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; +14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; +14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; +14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; +14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; +14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; +14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; +14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; +14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; +14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; +14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; +14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; +14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; +14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; +14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; +14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; +14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; +14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; +14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; +14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; +14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; +14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; +14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; +14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; +14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; +14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; +14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; +14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; +14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; +14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; +14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; +14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; +14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; +14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; +14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; +14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; +14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; +14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; +14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; +14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; +14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; +14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; +14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; +14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; +14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; +14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; +14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; +14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; +14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; +14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; +14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; +14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; +14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; +14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; +14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; +14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; +14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; +14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; +14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; +14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; +14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; +14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; +14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; +14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; +14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; +14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; +14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; +14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; +14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; +14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; +14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; +14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; +14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; +14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; +14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; +14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; +14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; +14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; +14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; +14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; +14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; +14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; +14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; +14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; +1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; +1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; +1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; +1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; +1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; +1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; +1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; +1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; +1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; +1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; +150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; +150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; +150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; +150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; +150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; +150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; +1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; +1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; +1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; +1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; +1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; +1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; +1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; +1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; +1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; +1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; +151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; +151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; +151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; +151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; +151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; +151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; +1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; +1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; +1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; +1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; +1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; +1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; +1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; +1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; +1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; +1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; +152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; +152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; +152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; +152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; +152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; +152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; +1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; +1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; +1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; +1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; +1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; +1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; +1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; +1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; +1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; +1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; +153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; +153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; +153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; +153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; +153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; +153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; +1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; +1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; +1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; +1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; +1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; +1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; +1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; +1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; +1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; +1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; +154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; +154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; +154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; +154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; +154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; +154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; +1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; +1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; +1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; +1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; +1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; +1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; +1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; +1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; +1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; +1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; +155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; +155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; +155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; +155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; +155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; +155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; +1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; +1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; +1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; +1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; +1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; +1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; +1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; +1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; +1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; +1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; +156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; +156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; +156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; +156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; +156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; +156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; +1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; +1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; +1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; +1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; +1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; +1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; +1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; +1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; +1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; +1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; +157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; +157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; +157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; +157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; +157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; +157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; +1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; +1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; +1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; +1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; +1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; +1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; +1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; +1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; +1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; +1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; +158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; +158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; +158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; +158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; +158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; +158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; +1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; +1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; +1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; +1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; +1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; +1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; +1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; +1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; +1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; +1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; +159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; +159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; +159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; +159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; +159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; +159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; +15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; +15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; +15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; +15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; +15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; +15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; +15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; +15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; +15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; +15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; +15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; +15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; +15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; +15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; +15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; +15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; +15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; +15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; +15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; +15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; +15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; +15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; +15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; +15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; +15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; +15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; +15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; +15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; +15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; +15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; +15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; +15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; +15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; +15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; +15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; +15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; +15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; +15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; +15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; +15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; +15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; +15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; +15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; +15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; +15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; +15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; +15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; +15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; +15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; +15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; +15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; +15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; +15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; +15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; +15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; +15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; +15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; +15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; +15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; +15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; +15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; +15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; +15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; +15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; +15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; +15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; +15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; +15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; +15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; +15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; +15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; +15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; +15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; +15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; +15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; +15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; +15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; +15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; +15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; +15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; +15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; +15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; +15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; +15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; +15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; +15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; +15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; +15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; +15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; +15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; +15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; +15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; +15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; +15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; +15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; +15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; +1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; +1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; +1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; +1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; +1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; +1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; +1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; +1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; +1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; +1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; +160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; +160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; +160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; +160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; +160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; +160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; +1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; +1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; +1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; +1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; +1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; +1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; +1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; +1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; +1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; +1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; +161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; +161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; +161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; +161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; +161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; +161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; +1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; +1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; +1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; +1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; +1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; +1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; +1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; +1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; +1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; +1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; +162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; +162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; +162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; +162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; +162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; +162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; +1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; +1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; +1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; +1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; +1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; +1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; +1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; +1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; +1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; +1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; +163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; +163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; +163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; +163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; +163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; +163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; +1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; +1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; +1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; +1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; +1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; +1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; +1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; +1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; +1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; +1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; +164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; +164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; +164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; +164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; +164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; +164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; +1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; +1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; +1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; +1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; +1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; +1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; +1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; +1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; +1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; +1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; +165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; +165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; +165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; +165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; +165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; +165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; +1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; +1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; +1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; +1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; +1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; +1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; +1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; +1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; +1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; +1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; +166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; +166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; +166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; +166D;CANADIAN SYLLABICS CHI SIGN;So;0;L;;;;;N;;;;; +166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; +166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; +1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; +1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; +1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; +1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; +1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; +1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; +1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; +1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;; +1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;; +1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;; +167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;; +167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;; +167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;; +167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;; +167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;; +167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;; +1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; +1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; +1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; +1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; +1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; +1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; +1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; +1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; +1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; +1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; +168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; +168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; +168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; +168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; +168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; +168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; +1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; +1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; +1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; +1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; +1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; +1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; +1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; +1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; +1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; +1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; +169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; +16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; +16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; +16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; +16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; +16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; +16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; +16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; +16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; +16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; +16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; +16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; +16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; +16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; +16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; +16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; +16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; +16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; +16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; +16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; +16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; +16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; +16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; +16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; +16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; +16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; +16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; +16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; +16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; +16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; +16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; +16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; +16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; +16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; +16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; +16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; +16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; +16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; +16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; +16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; +16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; +16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; +16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; +16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; +16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; +16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; +16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; +16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; +16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; +16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; +16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; +16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; +16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; +16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; +16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; +16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; +16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; +16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; +16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; +16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; +16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; +16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; +16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; +16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; +16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; +16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; +16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; +16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; +16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; +16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; +16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; +16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; +16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; +16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; +16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; +16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; +16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; +16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;; +16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;; +16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;; +16F1;RUNIC LETTER K;Lo;0;L;;;;;N;;;;; +16F2;RUNIC LETTER SH;Lo;0;L;;;;;N;;;;; +16F3;RUNIC LETTER OO;Lo;0;L;;;;;N;;;;; +16F4;RUNIC LETTER FRANKS CASKET OS;Lo;0;L;;;;;N;;;;; +16F5;RUNIC LETTER FRANKS CASKET IS;Lo;0;L;;;;;N;;;;; +16F6;RUNIC LETTER FRANKS CASKET EH;Lo;0;L;;;;;N;;;;; +16F7;RUNIC LETTER FRANKS CASKET AC;Lo;0;L;;;;;N;;;;; +16F8;RUNIC LETTER FRANKS CASKET AESC;Lo;0;L;;;;;N;;;;; +1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; +1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; +1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; +1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; +1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; +1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; +1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; +1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; +1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; +1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; +170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; +170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; +170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; +170D;TAGALOG LETTER RA;Lo;0;L;;;;;N;;;;; +170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; +170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; +1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; +1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; +1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1715;TAGALOG SIGN PAMUDPOD;Mc;9;L;;;;;N;;;;; +171F;TAGALOG LETTER ARCHAIC RA;Lo;0;L;;;;;N;;;;; +1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; +1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; +1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; +1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; +1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; +1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; +1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; +1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; +1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; +1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; +172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; +172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; +172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; +172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; +172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; +172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; +1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; +1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; +1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1734;HANUNOO SIGN PAMUDPOD;Mc;9;L;;;;;N;;;;; +1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; +1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; +1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; +1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; +1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; +1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; +1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; +1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; +1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; +1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; +174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; +174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; +174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; +174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; +174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; +174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; +1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; +1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; +1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; +1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; +1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; +1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; +1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; +1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; +1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; +1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; +1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; +1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; +176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; +176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; +176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; +176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; +176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; +1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; +1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; +1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; +1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; +1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; +1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; +1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; +1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; +1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; +1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; +1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; +178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; +178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; +178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; +178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; +178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; +178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; +1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; +1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; +1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; +1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; +1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; +1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; +1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; +1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; +1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; +1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; +179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; +179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; +179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; +179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; +179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; +179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; +17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; +17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; +17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; +17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; +17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; +17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; +17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; +17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; +17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; +17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; +17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; +17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; +17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; +17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; +17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; +17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; +17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; +17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; +17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; +17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; +17B4;KHMER VOWEL INHERENT AQ;Mn;0;NSM;;;;;N;;;;; +17B5;KHMER VOWEL INHERENT AA;Mn;0;NSM;;;;;N;;;;; +17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; +17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; +17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; +17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; +17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; +17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; +17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; +17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; +17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; +17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; +17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; +17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; +17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; +17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; +17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; +17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; +17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; +17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; +17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; +17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; +17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; +17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; +17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; +17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; +17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; +17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; +17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;; +17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; +17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; +17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; +17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; +17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; +17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; +17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; +17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; +17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; +17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;; +1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; +1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; +1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; +1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; +1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; +1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; +1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; +1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; +1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; +180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; +180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; +180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; +180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; +180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; +180F;MONGOLIAN FREE VARIATION SELECTOR FOUR;Mn;0;NSM;;;;;N;;;;; +1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; +1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; +1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; +1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; +1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; +1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; +1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; +1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; +1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; +1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; +182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; +182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; +182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; +182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; +182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; +182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; +1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; +1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; +1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; +1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; +1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; +1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; +1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; +1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; +183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; +183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; +183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; +183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; +183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; +183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; +1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; +1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; +1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; +1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; +1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; +1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; +1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; +1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; +1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; +184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; +184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; +184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; +184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; +184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; +184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; +1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; +1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; +1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; +1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; +1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; +1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; +1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; +1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; +1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; +1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; +185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; +185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; +185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; +185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; +185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; +185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; +1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; +1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; +1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; +1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; +1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; +1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; +1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; +1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; +1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; +1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; +186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; +186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; +186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; +186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; +186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; +186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; +1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; +1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; +1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; +1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; +1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; +1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; +1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; +1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; +1878;MONGOLIAN LETTER CHA WITH TWO DOTS;Lo;0;L;;;;;N;;;;; +1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; +1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; +1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; +1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; +1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; +1885;MONGOLIAN LETTER ALI GALI BALUDA;Mn;0;NSM;;;;;N;;;;; +1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Mn;0;NSM;;;;;N;;;;; +1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; +1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; +1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; +188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; +188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; +188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; +188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; +188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; +188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; +1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; +1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; +1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; +1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; +1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; +1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; +1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; +1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; +1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; +189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; +189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; +189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; +189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; +189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; +18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; +18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; +18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; +18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; +18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; +18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; +18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; +18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; +18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; +18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;; +18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;; +18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;; +18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;; +18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;; +18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;; +18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;; +18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;; +18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;; +18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;; +18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;; +18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;; +18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;; +18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;; +18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;; +18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;; +18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;; +18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;; +18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;; +18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;; +18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;; +18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;; +18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;; +18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;; +18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;; +18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;; +18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;; +18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;; +18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;; +18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;; +18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;; +18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;; +18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;; +18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;; +18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;; +18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;; +18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;; +18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;; +18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;; +18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;; +18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;; +18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;; +18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;; +18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;; +18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;; +18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;; +18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;; +18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;; +18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;; +18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;; +18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;; +18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;; +18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;; +18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;; +18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;; +18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;; +18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;; +18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;; +18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;; +18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;; +18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;; +18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;; +18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;; +18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;; +18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;; +18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;; +18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;; +18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;; +18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;; +18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;; +1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; +1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; +1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; +1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; +1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; +1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; +1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; +1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; +1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; +1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; +190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; +190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; +190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; +190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; +190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; +190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; +1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; +1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; +1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; +1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; +1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; +1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; +1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; +1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; +1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; +1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; +191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; +191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; +191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; +191D;LIMBU LETTER GYAN;Lo;0;L;;;;;N;;;;; +191E;LIMBU LETTER TRA;Lo;0;L;;;;;N;;;;; +1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; +1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; +1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; +1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; +1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; +1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; +1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; +1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; +1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; +1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; +193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; +193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; +1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; +1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; +1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; +1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; +1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; +1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; +1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; +1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; +1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; +1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; +1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; +1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; +195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; +195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; +195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; +195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; +195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; +195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; +1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; +1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; +1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; +1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; +1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; +1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; +1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; +1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; +1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; +1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; +196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; +196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; +196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; +196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; +1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; +1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; +1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; +1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; +1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; +1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; +1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; +1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; +1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; +1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; +1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; +1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; +1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; +198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; +198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; +198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; +1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; +1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; +1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; +199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; +199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; +199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; +199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; +199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; +19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; +19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; +19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; +19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; +19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; +19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; +19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; +19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; +19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; +19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; +19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Lo;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Lo;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Lo;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Lo;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Lo;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Lo;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Lo;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Lo;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Lo;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Lo;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Lo;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Lo;0;L;;;;;N;;;;; +19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; +19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; +19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; +19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Lo;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Lo;0;L;;;;;N;;;;; +19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +19DA;NEW TAI LUE THAM DIGIT ONE;No;0;L;;;1;1;N;;;;; +19DE;NEW TAI LUE SIGN LAE;So;0;ON;;;;;N;;;;; +19DF;NEW TAI LUE SIGN LAEV;So;0;ON;;;;;N;;;;; +19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; +19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; +19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; +19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; +19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; +19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; +19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; +19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; +19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; +19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; +19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; +19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; +19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; +19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; +19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; +19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; +19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; +19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; +19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; +19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; +19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; +19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; +19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; +19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; +19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; +19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; +19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; +19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; +19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; +19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; +19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; +19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; +1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; +1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; +1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; +1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; +1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; +1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; +1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; +1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1A1B;BUGINESE VOWEL SIGN AE;Mn;0;NSM;;;;;N;;;;; +1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; +1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; +1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;; +1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;; +1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;; +1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;; +1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;; +1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;; +1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;; +1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;; +1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;; +1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;; +1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;; +1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;; +1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;; +1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;; +1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;; +1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;; +1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;; +1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;; +1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;; +1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;; +1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;; +1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;; +1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;; +1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;; +1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;; +1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;; +1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;; +1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;; +1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;; +1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;; +1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;; +1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;; +1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;; +1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;; +1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;; +1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;; +1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;; +1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;; +1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;; +1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;; +1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;; +1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;; +1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;; +1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;; +1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;; +1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;; +1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;; +1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;; +1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;; +1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;; +1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;; +1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;; +1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;; +1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;; +1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;; +1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;; +1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;; +1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;; +1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;; +1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;; +1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;; +1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;; +1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;; +1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;; +1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;; +1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;; +1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;; +1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;; +1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;; +1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;; +1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;; +1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;; +1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;; +1AB0;COMBINING DOUBLED CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;;;;; +1AB1;COMBINING DIAERESIS-RING;Mn;230;NSM;;;;;N;;;;; +1AB2;COMBINING INFINITY;Mn;230;NSM;;;;;N;;;;; +1AB3;COMBINING DOWNWARDS ARROW;Mn;230;NSM;;;;;N;;;;; +1AB4;COMBINING TRIPLE DOT;Mn;230;NSM;;;;;N;;;;; +1AB5;COMBINING X-X BELOW;Mn;220;NSM;;;;;N;;;;; +1AB6;COMBINING WIGGLY LINE BELOW;Mn;220;NSM;;;;;N;;;;; +1AB7;COMBINING OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB8;COMBINING DOUBLE OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB9;COMBINING LIGHT CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABA;COMBINING STRONG CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABB;COMBINING PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABC;COMBINING DOUBLE PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABD;COMBINING PARENTHESES BELOW;Mn;220;NSM;;;;;N;;;;; +1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;; +1ABF;COMBINING LATIN SMALL LETTER W BELOW;Mn;220;NSM;;;;;N;;;;; +1AC0;COMBINING LATIN SMALL LETTER TURNED W BELOW;Mn;220;NSM;;;;;N;;;;; +1AC1;COMBINING LEFT PARENTHESIS ABOVE LEFT;Mn;230;NSM;;;;;N;;;;; +1AC2;COMBINING RIGHT PARENTHESIS ABOVE RIGHT;Mn;230;NSM;;;;;N;;;;; +1AC3;COMBINING LEFT PARENTHESIS BELOW LEFT;Mn;220;NSM;;;;;N;;;;; +1AC4;COMBINING RIGHT PARENTHESIS BELOW RIGHT;Mn;220;NSM;;;;;N;;;;; +1AC5;COMBINING SQUARE BRACKETS ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC6;COMBINING NUMBER SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC7;COMBINING INVERTED DOUBLE ARCH ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC8;COMBINING PLUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC9;COMBINING DOUBLE PLUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1ACA;COMBINING DOUBLE PLUS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +1ACB;COMBINING TRIPLE ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1ACC;COMBINING LATIN SMALL LETTER INSULAR G;Mn;230;NSM;;;;;N;;;;; +1ACD;COMBINING LATIN SMALL LETTER INSULAR R;Mn;230;NSM;;;;;N;;;;; +1ACE;COMBINING LATIN SMALL LETTER INSULAR T;Mn;230;NSM;;;;;N;;;;; +1ACF;COMBINING DOUBLE CARON;Mn;230;NSM;;;;;N;;;;; +1AD0;COMBINING VERTICAL-LINE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1AD1;COMBINING GRAVE-VERTICAL-LINE;Mn;230;NSM;;;;;N;;;;; +1AD2;COMBINING VERTICAL-LINE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1AD3;COMBINING ACUTE-VERTICAL-LINE;Mn;230;NSM;;;;;N;;;;; +1AD4;COMBINING VERTICAL-LINE-MACRON;Mn;230;NSM;;;;;N;;;;; +1AD5;COMBINING MACRON-VERTICAL-LINE;Mn;230;NSM;;;;;N;;;;; +1AD6;COMBINING VERTICAL-LINE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1AD7;COMBINING VERTICAL-LINE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1AD8;COMBINING MACRON-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1AD9;COMBINING SHARP SIGN;Mn;230;NSM;;;;;N;;;;; +1ADA;COMBINING FLAT SIGN;Mn;230;NSM;;;;;N;;;;; +1ADB;COMBINING DOWN TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1ADC;COMBINING DIAERESIS WITH RAISED LEFT DOT;Mn;230;NSM;;;;;N;;;;; +1ADD;COMBINING DOT-AND-RING BELOW;Mn;220;NSM;;;;;N;;;;; +1AE0;COMBINING LEFT TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE1;COMBINING RIGHT TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE2;COMBINING MINUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE3;COMBINING INVERTED BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE4;COMBINING SQUARE ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE5;COMBINING SEAGULL ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE6;COMBINING DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;;;;; +1AE7;COMBINING DOUBLE ARCH ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE8;COMBINING EQUALS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1AE9;COMBINING LEFT ANGLE CENTRED ABOVE;Mn;230;NSM;;;;;N;;;;; +1AEA;COMBINING UPWARDS ARROW ABOVE;Mn;230;NSM;;;;;N;;;;; +1AEB;COMBINING DOUBLE RIGHTWARDS ARROW ABOVE;Mn;234;NSM;;;;;N;;;;; +1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;; +1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;; +1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;; +1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;; +1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;; +1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;; +1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; +1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;; +1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;; +1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;; +1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;; +1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;; +1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;; +1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;; +1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;; +1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;; +1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;; +1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;; +1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;; +1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;; +1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;; +1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;; +1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;; +1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;; +1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;; +1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;; +1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;; +1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;; +1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;; +1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;; +1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;; +1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;; +1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;; +1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;; +1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; +1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; +1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; +1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; +1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; +1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; +1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; +1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; +1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; +1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; +1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; +1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; +1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; +1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; +1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; +1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; +1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; +1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; +1B4C;BALINESE LETTER ARCHAIC JNYA;Lo;0;L;;;;;N;;;;; +1B4E;BALINESE INVERTED CARIK SIKI;Po;0;L;;;;;N;;;;; +1B4F;BALINESE INVERTED CARIK PAREREN;Po;0;L;;;;;N;;;;; +1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;; +1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;; +1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;; +1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;; +1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;; +1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;; +1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;; +1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; +1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; +1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; +1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; +1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; +1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; +1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; +1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; +1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; +1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; +1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; +1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; +1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; +1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; +1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; +1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; +1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; +1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; +1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; +1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; +1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; +1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; +1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; +1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; +1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; +1B7D;BALINESE PANTI LANTANG;Po;0;L;;;;;N;;;;; +1B7E;BALINESE PAMADA LANTANG;Po;0;L;;;;;N;;;;; +1B7F;BALINESE PANTI BAWAK;Po;0;L;;;;;N;;;;; +1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; +1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; +1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; +1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; +1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; +1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; +1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; +1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; +1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; +1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; +1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; +1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; +1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; +1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; +1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; +1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; +1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; +1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; +1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; +1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; +1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; +1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; +1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; +1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; +1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; +1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; +1BAB;SUNDANESE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1BAC;SUNDANESE CONSONANT SIGN PASANGAN MA;Mn;0;NSM;;;;;N;;;;; +1BAD;SUNDANESE CONSONANT SIGN PASANGAN WA;Mn;0;NSM;;;;;N;;;;; +1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; +1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; +1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1BBA;SUNDANESE AVAGRAHA;Lo;0;L;;;;;N;;;;; +1BBB;SUNDANESE LETTER REU;Lo;0;L;;;;;N;;;;; +1BBC;SUNDANESE LETTER LEU;Lo;0;L;;;;;N;;;;; +1BBD;SUNDANESE LETTER BHA;Lo;0;L;;;;;N;;;;; +1BBE;SUNDANESE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +1BBF;SUNDANESE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +1BC0;BATAK LETTER A;Lo;0;L;;;;;N;;;;; +1BC1;BATAK LETTER SIMALUNGUN A;Lo;0;L;;;;;N;;;;; +1BC2;BATAK LETTER HA;Lo;0;L;;;;;N;;;;; +1BC3;BATAK LETTER SIMALUNGUN HA;Lo;0;L;;;;;N;;;;; +1BC4;BATAK LETTER MANDAILING HA;Lo;0;L;;;;;N;;;;; +1BC5;BATAK LETTER BA;Lo;0;L;;;;;N;;;;; +1BC6;BATAK LETTER KARO BA;Lo;0;L;;;;;N;;;;; +1BC7;BATAK LETTER PA;Lo;0;L;;;;;N;;;;; +1BC8;BATAK LETTER SIMALUNGUN PA;Lo;0;L;;;;;N;;;;; +1BC9;BATAK LETTER NA;Lo;0;L;;;;;N;;;;; +1BCA;BATAK LETTER MANDAILING NA;Lo;0;L;;;;;N;;;;; +1BCB;BATAK LETTER WA;Lo;0;L;;;;;N;;;;; +1BCC;BATAK LETTER SIMALUNGUN WA;Lo;0;L;;;;;N;;;;; +1BCD;BATAK LETTER PAKPAK WA;Lo;0;L;;;;;N;;;;; +1BCE;BATAK LETTER GA;Lo;0;L;;;;;N;;;;; +1BCF;BATAK LETTER SIMALUNGUN GA;Lo;0;L;;;;;N;;;;; +1BD0;BATAK LETTER JA;Lo;0;L;;;;;N;;;;; +1BD1;BATAK LETTER DA;Lo;0;L;;;;;N;;;;; +1BD2;BATAK LETTER RA;Lo;0;L;;;;;N;;;;; +1BD3;BATAK LETTER SIMALUNGUN RA;Lo;0;L;;;;;N;;;;; +1BD4;BATAK LETTER MA;Lo;0;L;;;;;N;;;;; +1BD5;BATAK LETTER SIMALUNGUN MA;Lo;0;L;;;;;N;;;;; +1BD6;BATAK LETTER SOUTHERN TA;Lo;0;L;;;;;N;;;;; +1BD7;BATAK LETTER NORTHERN TA;Lo;0;L;;;;;N;;;;; +1BD8;BATAK LETTER SA;Lo;0;L;;;;;N;;;;; +1BD9;BATAK LETTER SIMALUNGUN SA;Lo;0;L;;;;;N;;;;; +1BDA;BATAK LETTER MANDAILING SA;Lo;0;L;;;;;N;;;;; +1BDB;BATAK LETTER YA;Lo;0;L;;;;;N;;;;; +1BDC;BATAK LETTER SIMALUNGUN YA;Lo;0;L;;;;;N;;;;; +1BDD;BATAK LETTER NGA;Lo;0;L;;;;;N;;;;; +1BDE;BATAK LETTER LA;Lo;0;L;;;;;N;;;;; +1BDF;BATAK LETTER SIMALUNGUN LA;Lo;0;L;;;;;N;;;;; +1BE0;BATAK LETTER NYA;Lo;0;L;;;;;N;;;;; +1BE1;BATAK LETTER CA;Lo;0;L;;;;;N;;;;; +1BE2;BATAK LETTER NDA;Lo;0;L;;;;;N;;;;; +1BE3;BATAK LETTER MBA;Lo;0;L;;;;;N;;;;; +1BE4;BATAK LETTER I;Lo;0;L;;;;;N;;;;; +1BE5;BATAK LETTER U;Lo;0;L;;;;;N;;;;; +1BE6;BATAK SIGN TOMPI;Mn;7;NSM;;;;;N;;;;; +1BE7;BATAK VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1BE8;BATAK VOWEL SIGN PAKPAK E;Mn;0;NSM;;;;;N;;;;; +1BE9;BATAK VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +1BEA;BATAK VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1BEB;BATAK VOWEL SIGN KARO I;Mc;0;L;;;;;N;;;;; +1BEC;BATAK VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1BED;BATAK VOWEL SIGN KARO O;Mn;0;NSM;;;;;N;;;;; +1BEE;BATAK VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1BEF;BATAK VOWEL SIGN U FOR SIMALUNGUN SA;Mn;0;NSM;;;;;N;;;;; +1BF0;BATAK CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +1BF1;BATAK CONSONANT SIGN H;Mn;0;NSM;;;;;N;;;;; +1BF2;BATAK PANGOLAT;Mc;9;L;;;;;N;;;;; +1BF3;BATAK PANONGONAN;Mc;9;L;;;;;N;;;;; +1BFC;BATAK SYMBOL BINDU NA METEK;Po;0;L;;;;;N;;;;; +1BFD;BATAK SYMBOL BINDU PINARBORAS;Po;0;L;;;;;N;;;;; +1BFE;BATAK SYMBOL BINDU JUDUL;Po;0;L;;;;;N;;;;; +1BFF;BATAK SYMBOL BINDU PANGOLAT;Po;0;L;;;;;N;;;;; +1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; +1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; +1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; +1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; +1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; +1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; +1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; +1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; +1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; +1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; +1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; +1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; +1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; +1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; +1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; +1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; +1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; +1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; +1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; +1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; +1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; +1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; +1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; +1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; +1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; +1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; +1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; +1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; +1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; +1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; +1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; +1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; +1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; +1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; +1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; +1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; +1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; +1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; +1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; +1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; +1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; +1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; +1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; +1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; +1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; +1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; +1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; +1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; +1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; +1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; +1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; +1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; +1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; +1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; +1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; +1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; +1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; +1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; +1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; +1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; +1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; +1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; +1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; +1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; +1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; +1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; +1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; +1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; +1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; +1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; +1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; +1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; +1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; +1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; +1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; +1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; +1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; +1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; +1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; +1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; +1C80;CYRILLIC SMALL LETTER ROUNDED VE;Ll;0;L;;;;;N;;;0412;;0412 +1C81;CYRILLIC SMALL LETTER LONG-LEGGED DE;Ll;0;L;;;;;N;;;0414;;0414 +1C82;CYRILLIC SMALL LETTER NARROW O;Ll;0;L;;;;;N;;;041E;;041E +1C83;CYRILLIC SMALL LETTER WIDE ES;Ll;0;L;;;;;N;;;0421;;0421 +1C84;CYRILLIC SMALL LETTER TALL TE;Ll;0;L;;;;;N;;;0422;;0422 +1C85;CYRILLIC SMALL LETTER THREE-LEGGED TE;Ll;0;L;;;;;N;;;0422;;0422 +1C86;CYRILLIC SMALL LETTER TALL HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +1C87;CYRILLIC SMALL LETTER TALL YAT;Ll;0;L;;;;;N;;;0462;;0462 +1C88;CYRILLIC SMALL LETTER UNBLENDED UK;Ll;0;L;;;;;N;;;A64A;;A64A +1C89;CYRILLIC CAPITAL LETTER TJE;Lu;0;L;;;;;N;;;;1C8A; +1C8A;CYRILLIC SMALL LETTER TJE;Ll;0;L;;;;;N;;;1C89;;1C89 +1C90;GEORGIAN MTAVRULI CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;10D0; +1C91;GEORGIAN MTAVRULI CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;10D1; +1C92;GEORGIAN MTAVRULI CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;10D2; +1C93;GEORGIAN MTAVRULI CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;10D3; +1C94;GEORGIAN MTAVRULI CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;10D4; +1C95;GEORGIAN MTAVRULI CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;10D5; +1C96;GEORGIAN MTAVRULI CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;10D6; +1C97;GEORGIAN MTAVRULI CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;10D7; +1C98;GEORGIAN MTAVRULI CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;10D8; +1C99;GEORGIAN MTAVRULI CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;10D9; +1C9A;GEORGIAN MTAVRULI CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;10DA; +1C9B;GEORGIAN MTAVRULI CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;10DB; +1C9C;GEORGIAN MTAVRULI CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;10DC; +1C9D;GEORGIAN MTAVRULI CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;10DD; +1C9E;GEORGIAN MTAVRULI CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;10DE; +1C9F;GEORGIAN MTAVRULI CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;10DF; +1CA0;GEORGIAN MTAVRULI CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;10E0; +1CA1;GEORGIAN MTAVRULI CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;10E1; +1CA2;GEORGIAN MTAVRULI CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;10E2; +1CA3;GEORGIAN MTAVRULI CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;10E3; +1CA4;GEORGIAN MTAVRULI CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;10E4; +1CA5;GEORGIAN MTAVRULI CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;10E5; +1CA6;GEORGIAN MTAVRULI CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;10E6; +1CA7;GEORGIAN MTAVRULI CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;10E7; +1CA8;GEORGIAN MTAVRULI CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;10E8; +1CA9;GEORGIAN MTAVRULI CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;10E9; +1CAA;GEORGIAN MTAVRULI CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;10EA; +1CAB;GEORGIAN MTAVRULI CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;10EB; +1CAC;GEORGIAN MTAVRULI CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;10EC; +1CAD;GEORGIAN MTAVRULI CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;10ED; +1CAE;GEORGIAN MTAVRULI CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;10EE; +1CAF;GEORGIAN MTAVRULI CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;10EF; +1CB0;GEORGIAN MTAVRULI CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;10F0; +1CB1;GEORGIAN MTAVRULI CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;10F1; +1CB2;GEORGIAN MTAVRULI CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;10F2; +1CB3;GEORGIAN MTAVRULI CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;10F3; +1CB4;GEORGIAN MTAVRULI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;10F4; +1CB5;GEORGIAN MTAVRULI CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;10F5; +1CB6;GEORGIAN MTAVRULI CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;10F6; +1CB7;GEORGIAN MTAVRULI CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;10F7; +1CB8;GEORGIAN MTAVRULI CAPITAL LETTER ELIFI;Lu;0;L;;;;;N;;;;10F8; +1CB9;GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN;Lu;0;L;;;;;N;;;;10F9; +1CBA;GEORGIAN MTAVRULI CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;10FA; +1CBD;GEORGIAN MTAVRULI CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;10FD; +1CBE;GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;10FE; +1CBF;GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN;Lu;0;L;;;;;N;;;;10FF; +1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;; +1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;; +1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;; +1CC3;SUNDANESE PUNCTUATION BINDU CAKRA;Po;0;L;;;;;N;;;;; +1CC4;SUNDANESE PUNCTUATION BINDU LEU SATANGA;Po;0;L;;;;;N;;;;; +1CC5;SUNDANESE PUNCTUATION BINDU KA SATANGA;Po;0;L;;;;;N;;;;; +1CC6;SUNDANESE PUNCTUATION BINDU DA SATANGA;Po;0;L;;;;;N;;;;; +1CC7;SUNDANESE PUNCTUATION BINDU BA SATANGA;Po;0;L;;;;;N;;;;; +1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;; +1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;; +1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;; +1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;; +1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;; +1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;; +1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;; +1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;; +1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;; +1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;; +1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;; +1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;; +1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;; +1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;; +1CF2;VEDIC SIGN ARDHAVISARGA;Lo;0;L;;;;;N;;;;; +1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Lo;0;L;;;;;N;;;;; +1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;; +1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +1CF7;VEDIC SIGN ATIKRAMA;Mc;0;L;;;;;N;;;;; +1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;; +1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;; +1CFA;VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; +1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; +1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; +1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; +1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; +1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; +1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; +1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; +1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; +1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; +1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; +1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; +1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; +1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; +1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; +1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; +1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; +1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; +1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; +1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; +1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; +1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; +1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; +1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; +1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; +1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; +1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; +1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; +1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; +1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; +1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; +1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; +1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; +1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; +1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; +1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; +1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; +1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; +1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; +1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; +1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; +1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; +1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; +1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; +1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; +1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L; 0041;;;;N;;;;; +1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L; 00C6;;;;N;;;;; +1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L; 0042;;;;N;;;;; +1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; +1D30;MODIFIER LETTER CAPITAL D;Lm;0;L; 0044;;;;N;;;;; +1D31;MODIFIER LETTER CAPITAL E;Lm;0;L; 0045;;;;N;;;;; +1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L; 018E;;;;N;;;;; +1D33;MODIFIER LETTER CAPITAL G;Lm;0;L; 0047;;;;N;;;;; +1D34;MODIFIER LETTER CAPITAL H;Lm;0;L; 0048;;;;N;;;;; +1D35;MODIFIER LETTER CAPITAL I;Lm;0;L; 0049;;;;N;;;;; +1D36;MODIFIER LETTER CAPITAL J;Lm;0;L; 004A;;;;N;;;;; +1D37;MODIFIER LETTER CAPITAL K;Lm;0;L; 004B;;;;N;;;;; +1D38;MODIFIER LETTER CAPITAL L;Lm;0;L; 004C;;;;N;;;;; +1D39;MODIFIER LETTER CAPITAL M;Lm;0;L; 004D;;;;N;;;;; +1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L; 004E;;;;N;;;;; +1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; +1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L; 004F;;;;N;;;;; +1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L; 0222;;;;N;;;;; +1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L; 0050;;;;N;;;;; +1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L; 0052;;;;N;;;;; +1D40;MODIFIER LETTER CAPITAL T;Lm;0;L; 0054;;;;N;;;;; +1D41;MODIFIER LETTER CAPITAL U;Lm;0;L; 0055;;;;N;;;;; +1D42;MODIFIER LETTER CAPITAL W;Lm;0;L; 0057;;;;N;;;;; +1D43;MODIFIER LETTER SMALL A;Lm;0;L; 0061;;;;N;;;;; +1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L; 0250;;;;N;;;;; +1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L; 0251;;;;N;;;;; +1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L; 1D02;;;;N;;;;; +1D47;MODIFIER LETTER SMALL B;Lm;0;L; 0062;;;;N;;;;; +1D48;MODIFIER LETTER SMALL D;Lm;0;L; 0064;;;;N;;;;; +1D49;MODIFIER LETTER SMALL E;Lm;0;L; 0065;;;;N;;;;; +1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L; 0259;;;;N;;;;; +1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L; 025B;;;;N;;;;; +1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L; 025C;;;;N;;;;; +1D4D;MODIFIER LETTER SMALL G;Lm;0;L; 0067;;;;N;;;;; +1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; +1D4F;MODIFIER LETTER SMALL K;Lm;0;L; 006B;;;;N;;;;; +1D50;MODIFIER LETTER SMALL M;Lm;0;L; 006D;;;;N;;;;; +1D51;MODIFIER LETTER SMALL ENG;Lm;0;L; 014B;;;;N;;;;; +1D52;MODIFIER LETTER SMALL O;Lm;0;L; 006F;;;;N;;;;; +1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L; 0254;;;;N;;;;; +1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L; 1D16;;;;N;;;;; +1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L; 1D17;;;;N;;;;; +1D56;MODIFIER LETTER SMALL P;Lm;0;L; 0070;;;;N;;;;; +1D57;MODIFIER LETTER SMALL T;Lm;0;L; 0074;;;;N;;;;; +1D58;MODIFIER LETTER SMALL U;Lm;0;L; 0075;;;;N;;;;; +1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L; 1D1D;;;;N;;;;; +1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L; 026F;;;;N;;;;; +1D5B;MODIFIER LETTER SMALL V;Lm;0;L; 0076;;;;N;;;;; +1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L; 1D25;;;;N;;;;; +1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L; 03B2;;;;N;;;;; +1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L; 03B3;;;;N;;;;; +1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L; 03B4;;;;N;;;;; +1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L; 03C6;;;;N;;;;; +1D61;MODIFIER LETTER SMALL CHI;Lm;0;L; 03C7;;;;N;;;;; +1D62;LATIN SUBSCRIPT SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; +1D63;LATIN SUBSCRIPT SMALL LETTER R;Lm;0;L; 0072;;;;N;;;;; +1D64;LATIN SUBSCRIPT SMALL LETTER U;Lm;0;L; 0075;;;;N;;;;; +1D65;LATIN SUBSCRIPT SMALL LETTER V;Lm;0;L; 0076;;;;N;;;;; +1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Lm;0;L; 03B2;;;;N;;;;; +1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L; 03B3;;;;N;;;;; +1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Lm;0;L; 03C1;;;;N;;;;; +1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Lm;0;L; 03C6;;;;N;;;;; +1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Lm;0;L; 03C7;;;;N;;;;; +1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; +1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; +1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L; 043D;;;;N;;;;; +1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D +1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; +1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 +1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; +1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;A7C6;;A7C6 +1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; +1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L; 0252;;;;N;;;;; +1D9C;MODIFIER LETTER SMALL C;Lm;0;L; 0063;;;;N;;;;; +1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L; 0255;;;;N;;;;; +1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L; 00F0;;;;N;;;;; +1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L; 025C;;;;N;;;;; +1DA0;MODIFIER LETTER SMALL F;Lm;0;L; 0066;;;;N;;;;; +1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L; 025F;;;;N;;;;; +1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L; 0261;;;;N;;;;; +1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L; 0265;;;;N;;;;; +1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L; 0268;;;;N;;;;; +1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L; 0269;;;;N;;;;; +1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L; 026A;;;;N;;;;; +1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L; 1D7B;;;;N;;;;; +1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L; 029D;;;;N;;;;; +1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L; 026D;;;;N;;;;; +1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L; 1D85;;;;N;;;;; +1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L; 029F;;;;N;;;;; +1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L; 0271;;;;N;;;;; +1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L; 0270;;;;N;;;;; +1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L; 0272;;;;N;;;;; +1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L; 0273;;;;N;;;;; +1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L; 0274;;;;N;;;;; +1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L; 0275;;;;N;;;;; +1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L; 0278;;;;N;;;;; +1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L; 0282;;;;N;;;;; +1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L; 0283;;;;N;;;;; +1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L; 01AB;;;;N;;;;; +1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L; 0289;;;;N;;;;; +1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L; 028A;;;;N;;;;; +1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L; 1D1C;;;;N;;;;; +1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L; 028B;;;;N;;;;; +1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L; 028C;;;;N;;;;; +1DBB;MODIFIER LETTER SMALL Z;Lm;0;L; 007A;;;;N;;;;; +1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L; 0290;;;;N;;;;; +1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L; 0291;;;;N;;;;; +1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L; 0292;;;;N;;;;; +1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L; 03B8;;;;N;;;;; +1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; +1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; +1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; +1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; +1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; +1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; +1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; +1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; +1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; +1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; +1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; +1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; +1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; +1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; +1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; +1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; +1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; +1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; +1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; +1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; +1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; +1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; +1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; +1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; +1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; +1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; +1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; +1DE7;COMBINING LATIN SMALL LETTER ALPHA;Mn;230;NSM;;;;;N;;;;; +1DE8;COMBINING LATIN SMALL LETTER B;Mn;230;NSM;;;;;N;;;;; +1DE9;COMBINING LATIN SMALL LETTER BETA;Mn;230;NSM;;;;;N;;;;; +1DEA;COMBINING LATIN SMALL LETTER SCHWA;Mn;230;NSM;;;;;N;;;;; +1DEB;COMBINING LATIN SMALL LETTER F;Mn;230;NSM;;;;;N;;;;; +1DEC;COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Mn;230;NSM;;;;;N;;;;; +1DED;COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DEE;COMBINING LATIN SMALL LETTER P;Mn;230;NSM;;;;;N;;;;; +1DEF;COMBINING LATIN SMALL LETTER ESH;Mn;230;NSM;;;;;N;;;;; +1DF0;COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DF1;COMBINING LATIN SMALL LETTER W;Mn;230;NSM;;;;;N;;;;; +1DF2;COMBINING LATIN SMALL LETTER A WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1DF6;COMBINING KAVYKA ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +1DF7;COMBINING KAVYKA ABOVE LEFT;Mn;228;NSM;;;;;N;;;;; +1DF8;COMBINING DOT ABOVE LEFT;Mn;228;NSM;;;;;N;;;;; +1DF9;COMBINING WIDE INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;;;;; +1DFA;COMBINING DOT BELOW LEFT;Mn;218;NSM;;;;;N;;;;; +1DFB;COMBINING DELETION MARK;Mn;230;NSM;;;;;N;;;;; +1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; +1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; +1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 +1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; +1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 +1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; +1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 +1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; +1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 +1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; +1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 +1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; +1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A +1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; +1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C +1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; +1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E +1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; +1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 +1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; +1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 +1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; +1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 +1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; +1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 +1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; +1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 +1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; +1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A +1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; +1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C +1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; +1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E +1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; +1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 +1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; +1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 +1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; +1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 +1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; +1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 +1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; +1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 +1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; +1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A +1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; +1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C +1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; +1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E +1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; +1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 +1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; +1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 +1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; +1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 +1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; +1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 +1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; +1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 +1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; +1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A +1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; +1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C +1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; +1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E +1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; +1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 +1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; +1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 +1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; +1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 +1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; +1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 +1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; +1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 +1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; +1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A +1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; +1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C +1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; +1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E +1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; +1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 +1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; +1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 +1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; +1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 +1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; +1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 +1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; +1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 +1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; +1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A +1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; +1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C +1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; +1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E +1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; +1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 +1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; +1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 +1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; +1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 +1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; +1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 +1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; +1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 +1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; +1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A +1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; +1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C +1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; +1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E +1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; +1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 +1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; +1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 +1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; +1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 +1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; +1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 +1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; +1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 +1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; +1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A +1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; +1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C +1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; +1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E +1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; +1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 +1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; +1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 +1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; +1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 +1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; +1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 +1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; +1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 +1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; +1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A +1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; +1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C +1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; +1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E +1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; +1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 +1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; +1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 +1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; +1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 +1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; +1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; +1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; +1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; +1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L; 0061 02BE;;;;N;;;;; +1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; +1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; +1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; +1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; +1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; +1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 +1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; +1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 +1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; +1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 +1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; +1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 +1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; +1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 +1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; +1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA +1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; +1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC +1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; +1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE +1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; +1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 +1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; +1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 +1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; +1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 +1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; +1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 +1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; +1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 +1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; +1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA +1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; +1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC +1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; +1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE +1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; +1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 +1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; +1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 +1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; +1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 +1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; +1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 +1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; +1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 +1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; +1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA +1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; +1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; +1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE +1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; +1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 +1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; +1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 +1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; +1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 +1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; +1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 +1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; +1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; +1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA +1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; +1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC +1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; +1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE +1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; +1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 +1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; +1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 +1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; +1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 +1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; +1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 +1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; +1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 +1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; +1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA +1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; +1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC +1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; +1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE +1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; +1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 +1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; +1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 +1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; +1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 +1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; +1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 +1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; +1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; +1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA +1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; +1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC +1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; +1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE +1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 +1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 +1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A +1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B +1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C +1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D +1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E +1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F +1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; +1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; +1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; +1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; +1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; +1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; +1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; +1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; +1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 +1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 +1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A +1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B +1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C +1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D +1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; +1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; +1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; +1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; +1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; +1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; +1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 +1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 +1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A +1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B +1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C +1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D +1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E +1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F +1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; +1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; +1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; +1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; +1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; +1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; +1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; +1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; +1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 +1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 +1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A +1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B +1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C +1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D +1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E +1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F +1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; +1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; +1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; +1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; +1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; +1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; +1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; +1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; +1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 +1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 +1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A +1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B +1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C +1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D +1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; +1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; +1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; +1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; +1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; +1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; +1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; +1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 +1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; +1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B +1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; +1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D +1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; +1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F +1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; +1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; +1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; +1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; +1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 +1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 +1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A +1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B +1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C +1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D +1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E +1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F +1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; +1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; +1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; +1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; +1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; +1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; +1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; +1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; +1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA +1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB +1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 +1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 +1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA +1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB +1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA +1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB +1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 +1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 +1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA +1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB +1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA +1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB +1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 +1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 +1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A +1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B +1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C +1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D +1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E +1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F +1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; +1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; +1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; +1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; +1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; +1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; +1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; +1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; +1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 +1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 +1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A +1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B +1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C +1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D +1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E +1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F +1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; +1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; +1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; +1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; +1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; +1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; +1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; +1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; +1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 +1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 +1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA +1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB +1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC +1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD +1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE +1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF +1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; +1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; +1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; +1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; +1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; +1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; +1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; +1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; +1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 +1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 +1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; +1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC +1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; +1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; +1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; +1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; +1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; +1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; +1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; +1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; +1FBD;GREEK KORONIS;Sk;0;ON; 0020 0313;;;;N;;;;; +1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 +1FBF;GREEK PSILI;Sk;0;ON; 0020 0313;;;;N;;;;; +1FC0;GREEK PERISPOMENI;Sk;0;ON; 0020 0342;;;;N;;;;; +1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; +1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; +1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC +1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; +1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; +1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; +1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; +1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; +1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; +1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; +1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; +1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; +1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; +1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; +1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 +1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 +1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; +1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; +1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; +1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; +1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; +1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; +1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; +1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; +1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; +1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; +1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; +1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 +1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 +1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; +1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; +1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; +1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC +1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; +1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; +1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; +1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; +1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; +1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; +1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; +1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; +1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; +1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; +1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; +1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC +1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; +1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; +1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; +1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; +1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; +1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; +1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; +1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; +1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; +1FFE;GREEK DASIA;Sk;0;ON; 0020 0314;;;;N;;;;; +2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; +2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; +2002;EN SPACE;Zs;0;WS; 0020;;;;N;;;;; +2003;EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2004;THREE-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2005;FOUR-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2006;SIX-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2007;FIGURE SPACE;Zs;0;WS; 0020;;;;N;;;;; +2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; +2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; +200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; +200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; +200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; +200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; +200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; +200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; +2010;HYPHEN;Pd;0;ON;;;;;N;;;;; +2011;NON-BREAKING HYPHEN;Pd;0;ON; 2010;;;;N;;;;; +2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; +2013;EN DASH;Pd;0;ON;;;;;N;;;;; +2014;EM DASH;Pd;0;ON;;;;;N;;;;; +2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; +2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; +2017;DOUBLE LOW LINE;Po;0;ON; 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; +2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; +2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; +201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; +201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; +201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; +201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; +201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; +201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; +2020;DAGGER;Po;0;ON;;;;;N;;;;; +2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; +2022;BULLET;Po;0;ON;;;;;N;;;;; +2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; +2024;ONE DOT LEADER;Po;0;ON; 002E;;;;N;;;;; +2025;TWO DOT LEADER;Po;0;ON; 002E 002E;;;;N;;;;; +2026;HORIZONTAL ELLIPSIS;Po;0;ON; 002E 002E 002E;;;;N;;;;; +2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; +2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; +2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; +202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; +202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; +202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; +202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; +202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;;;;; +2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +2032;PRIME;Po;0;ET;;;;;N;;;;; +2033;DOUBLE PRIME;Po;0;ET; 2032 2032;;;;N;;;;; +2034;TRIPLE PRIME;Po;0;ET; 2032 2032 2032;;;;N;;;;; +2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; +2036;REVERSED DOUBLE PRIME;Po;0;ON; 2035 2035;;;;N;;;;; +2037;REVERSED TRIPLE PRIME;Po;0;ON; 2035 2035 2035;;;;N;;;;; +2038;CARET;Po;0;ON;;;;;N;;;;; +2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; +203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; +203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; +203C;DOUBLE EXCLAMATION MARK;Po;0;ON; 0021 0021;;;;N;;;;; +203D;INTERROBANG;Po;0;ON;;;;;N;;;;; +203E;OVERLINE;Po;0;ON; 0020 0305;;;;N;SPACING OVERSCORE;;;; +203F;UNDERTIE;Pc;0;ON;;;;;N;;;;; +2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; +2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; +2042;ASTERISM;Po;0;ON;;;;;N;;;;; +2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; +2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; +2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; +2047;DOUBLE QUESTION MARK;Po;0;ON; 003F 003F;;;;N;;;;; +2048;QUESTION EXCLAMATION MARK;Po;0;ON; 003F 0021;;;;N;;;;; +2049;EXCLAMATION QUESTION MARK;Po;0;ON; 0021 003F;;;;N;;;;; +204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; +204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; +204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; +204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; +2050;CLOSE UP;Po;0;ON;;;;;N;;;;; +2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; +2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; +2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; +2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; +2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2057;QUADRUPLE PRIME;Po;0;ON; 2032 2032 2032 2032;;;;N;;;;; +2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; +205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; +205D;TRICOLON;Po;0;ON;;;;;N;;;;; +205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; +205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS; 0020;;;;N;;;;; +2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; +2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; +2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; +2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; +2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; +2066;LEFT-TO-RIGHT ISOLATE;Cf;0;LRI;;;;;N;;;;; +2067;RIGHT-TO-LEFT ISOLATE;Cf;0;RLI;;;;;N;;;;; +2068;FIRST STRONG ISOLATE;Cf;0;FSI;;;;;N;;;;; +2069;POP DIRECTIONAL ISOLATE;Cf;0;PDI;;;;;N;;;;; +206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +2070;SUPERSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; +2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; +2074;SUPERSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; +2075;SUPERSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; +2076;SUPERSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; +2077;SUPERSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; +2078;SUPERSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; +2079;SUPERSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; +207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; +207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; +2080;SUBSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;; +2081;SUBSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; +2082;SUBSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; +2083;SUBSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; +2084;SUBSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; +2085;SUBSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; +2086;SUBSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; +2087;SUBSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; +2088;SUBSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; +2089;SUBSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; +208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L; 0061;;;;N;;;;; +2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L; 0065;;;;N;;;;; +2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L; 006F;;;;N;;;;; +2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L; 0078;;;;N;;;;; +2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L; 0259;;;;N;;;;; +2095;LATIN SUBSCRIPT SMALL LETTER H;Lm;0;L; 0068;;;;N;;;;; +2096;LATIN SUBSCRIPT SMALL LETTER K;Lm;0;L; 006B;;;;N;;;;; +2097;LATIN SUBSCRIPT SMALL LETTER L;Lm;0;L; 006C;;;;N;;;;; +2098;LATIN SUBSCRIPT SMALL LETTER M;Lm;0;L; 006D;;;;N;;;;; +2099;LATIN SUBSCRIPT SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; +209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L; 0070;;;;N;;;;; +209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L; 0073;;;;N;;;;; +209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L; 0074;;;;N;;;;; +20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; +20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; +20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; +20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; +20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; +20A8;RUPEE SIGN;Sc;0;ET; 0052 0073;;;;N;;;;; +20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; +20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; +20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; +20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; +20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; +20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; +20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; +20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; +20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; +20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; +20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; +20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; +20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; +20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;; +20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; +20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; +20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +20BA;TURKISH LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; +20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; +20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; +20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;; +20BF;BITCOIN SIGN;Sc;0;ET;;;;;N;;;;; +20C0;SOM SIGN;Sc;0;ET;;;;;N;;;;; +20C1;SAUDI RIYAL SIGN;Sc;0;ET;;;;;N;;;;; +20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; +20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; +20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; +20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; +20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; +20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; +20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; +20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; +20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; +20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; +20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; +20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; +20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; +20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; +20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; +20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; +20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; +20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; +20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; +20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; +20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; +20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; +20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; +20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; +2100;ACCOUNT OF;So;0;ON; 0061 002F 0063;;;;N;;;;; +2101;ADDRESSED TO THE SUBJECT;So;0;ON; 0061 002F 0073;;;;N;;;;; +2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L; 0043;;;;N;DOUBLE-STRUCK C;;;; +2103;DEGREE CELSIUS;So;0;ON; 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; +2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; +2105;CARE OF;So;0;ON; 0063 002F 006F;;;;N;;;;; +2106;CADA UNA;So;0;ON; 0063 002F 0075;;;;N;;;;; +2107;EULER CONSTANT;Lu;0;L; 0190;;;;N;EULERS;;;; +2108;SCRUPLE;So;0;ON;;;;;N;;;;; +2109;DEGREE FAHRENHEIT;So;0;ON; 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; +210A;SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; +210B;SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;SCRIPT H;;;; +210C;BLACK-LETTER CAPITAL H;Lu;0;L; 0048;;;;N;BLACK-LETTER H;;;; +210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L; 0048;;;;N;DOUBLE-STRUCK H;;;; +210E;PLANCK CONSTANT;Ll;0;L; 0068;;;;N;;;;; +210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L; 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; +2110;SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;SCRIPT I;;;; +2111;BLACK-LETTER CAPITAL I;Lu;0;L; 0049;;;;N;BLACK-LETTER I;;;; +2112;SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;SCRIPT L;;;; +2113;SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; +2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L; 004E;;;;N;DOUBLE-STRUCK N;;;; +2116;NUMERO SIGN;So;0;ON; 004E 006F;;;;N;NUMERO;;;; +2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; +2118;SCRIPT CAPITAL P;Sm;0;ON;;;;;N;SCRIPT P;;;; +2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L; 0050;;;;N;DOUBLE-STRUCK P;;;; +211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L; 0051;;;;N;DOUBLE-STRUCK Q;;;; +211B;SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;SCRIPT R;;;; +211C;BLACK-LETTER CAPITAL R;Lu;0;L; 0052;;;;N;BLACK-LETTER R;;;; +211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L; 0052;;;;N;DOUBLE-STRUCK R;;;; +211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; +211F;RESPONSE;So;0;ON;;;;;N;;;;; +2120;SERVICE MARK;So;0;ON; 0053 004D;;;;N;;;;; +2121;TELEPHONE SIGN;So;0;ON; 0054 0045 004C;;;;N;T E L SYMBOL;;;; +2122;TRADE MARK SIGN;So;0;ON; 0054 004D;;;;N;TRADEMARK;;;; +2123;VERSICLE;So;0;ON;;;;;N;;;;; +2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L; 005A;;;;N;DOUBLE-STRUCK Z;;;; +2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; +2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; +2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; +2128;BLACK-LETTER CAPITAL Z;Lu;0;L; 005A;;;;N;BLACK-LETTER Z;;;; +2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; +212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; +212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; +212C;SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;SCRIPT B;;;; +212D;BLACK-LETTER CAPITAL C;Lu;0;L; 0043;;;;N;BLACK-LETTER C;;;; +212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; +212F;SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; +2130;SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;SCRIPT E;;;; +2131;SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;SCRIPT F;;;; +2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; +2133;SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;SCRIPT M;;;; +2134;SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; +2135;ALEF SYMBOL;Lo;0;L; 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; +2136;BET SYMBOL;Lo;0;L; 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; +2137;GIMEL SYMBOL;Lo;0;L; 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; +2138;DALET SYMBOL;Lo;0;L; 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; +2139;INFORMATION SOURCE;Ll;0;L; 0069;;;;N;;;;; +213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; +213B;FACSIMILE SIGN;So;0;ON; 0046 0041 0058;;;;N;;;;; +213C;DOUBLE-STRUCK SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON; 2211;;;;Y;;;;; +2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; +2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; +2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; +214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; +214C;PER SIGN;So;0;ON;;;;;N;;;;; +214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; +214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 +214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; +2150;VULGAR FRACTION ONE SEVENTH;No;0;ON; 0031 2044 0037;;;1/7;N;;;;; +2151;VULGAR FRACTION ONE NINTH;No;0;ON; 0031 2044 0039;;;1/9;N;;;;; +2152;VULGAR FRACTION ONE TENTH;No;0;ON; 0031 2044 0031 0030;;;1/10;N;;;;; +2153;VULGAR FRACTION ONE THIRD;No;0;ON; 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; +2154;VULGAR FRACTION TWO THIRDS;No;0;ON; 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; +2155;VULGAR FRACTION ONE FIFTH;No;0;ON; 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; +2156;VULGAR FRACTION TWO FIFTHS;No;0;ON; 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; +2157;VULGAR FRACTION THREE FIFTHS;No;0;ON; 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; +2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON; 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; +2159;VULGAR FRACTION ONE SIXTH;No;0;ON; 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; +215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON; 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; +215B;VULGAR FRACTION ONE EIGHTH;No;0;ON; 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; +215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON; 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; +215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON; 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; +215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON; 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; +215F;FRACTION NUMERATOR ONE;No;0;ON; 0031 2044;;;1;N;;;;; +2160;ROMAN NUMERAL ONE;Nl;0;L; 0049;;;1;N;;;;2170; +2161;ROMAN NUMERAL TWO;Nl;0;L; 0049 0049;;;2;N;;;;2171; +2162;ROMAN NUMERAL THREE;Nl;0;L; 0049 0049 0049;;;3;N;;;;2172; +2163;ROMAN NUMERAL FOUR;Nl;0;L; 0049 0056;;;4;N;;;;2173; +2164;ROMAN NUMERAL FIVE;Nl;0;L; 0056;;;5;N;;;;2174; +2165;ROMAN NUMERAL SIX;Nl;0;L; 0056 0049;;;6;N;;;;2175; +2166;ROMAN NUMERAL SEVEN;Nl;0;L; 0056 0049 0049;;;7;N;;;;2176; +2167;ROMAN NUMERAL EIGHT;Nl;0;L; 0056 0049 0049 0049;;;8;N;;;;2177; +2168;ROMAN NUMERAL NINE;Nl;0;L; 0049 0058;;;9;N;;;;2178; +2169;ROMAN NUMERAL TEN;Nl;0;L; 0058;;;10;N;;;;2179; +216A;ROMAN NUMERAL ELEVEN;Nl;0;L; 0058 0049;;;11;N;;;;217A; +216B;ROMAN NUMERAL TWELVE;Nl;0;L; 0058 0049 0049;;;12;N;;;;217B; +216C;ROMAN NUMERAL FIFTY;Nl;0;L; 004C;;;50;N;;;;217C; +216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0043;;;100;N;;;;217D; +216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0044;;;500;N;;;;217E; +216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 004D;;;1000;N;;;;217F; +2170;SMALL ROMAN NUMERAL ONE;Nl;0;L; 0069;;;1;N;;;2160;;2160 +2171;SMALL ROMAN NUMERAL TWO;Nl;0;L; 0069 0069;;;2;N;;;2161;;2161 +2172;SMALL ROMAN NUMERAL THREE;Nl;0;L; 0069 0069 0069;;;3;N;;;2162;;2162 +2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L; 0069 0076;;;4;N;;;2163;;2163 +2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L; 0076;;;5;N;;;2164;;2164 +2175;SMALL ROMAN NUMERAL SIX;Nl;0;L; 0076 0069;;;6;N;;;2165;;2165 +2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L; 0076 0069 0069;;;7;N;;;2166;;2166 +2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L; 0076 0069 0069 0069;;;8;N;;;2167;;2167 +2178;SMALL ROMAN NUMERAL NINE;Nl;0;L; 0069 0078;;;9;N;;;2168;;2168 +2179;SMALL ROMAN NUMERAL TEN;Nl;0;L; 0078;;;10;N;;;2169;;2169 +217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L; 0078 0069;;;11;N;;;216A;;216A +217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L; 0078 0069 0069;;;12;N;;;216B;;216B +217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L; 006C;;;50;N;;;216C;;216C +217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0063;;;100;N;;;216D;;216D +217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0064;;;500;N;;;216E;;216E +217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 006D;;;1000;N;;;216F;;216F +2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; +2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; +2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; +2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 +2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; +2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; +2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; +2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; +2189;VULGAR FRACTION ZERO THIRDS;No;0;ON; 0030 2044 0033;;;0;N;;;;; +218A;TURNED DIGIT TWO;So;0;ON;;;;;N;;;;; +218B;TURNED DIGIT THREE;So;0;ON;;;;;N;;;;; +2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; +2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; +2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; +2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; +2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; +2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; +2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; +2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; +2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; +219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; +219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; +219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; +219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; +219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; +219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; +21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; +21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; +21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; +21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; +21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; +21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; +21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; +21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; +21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; +21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; +21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; +21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; +21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; +21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; +21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; +21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; +21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; +21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; +21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; +21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; +21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; +21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; +21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; +21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; +21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; +21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; +21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; +21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; +21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; +21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; +21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; +21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; +21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; +21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; +21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; +21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; +21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; +21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; +21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; +21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; +21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; +21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; +21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; +21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; +21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; +21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; +21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; +21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; +21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; +21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; +21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; +21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; +21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; +21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; +21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; +21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; +21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; +21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; +21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; +21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; +21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; +21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; +21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; +21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; +21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; +21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; +21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; +21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; +21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; +21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; +21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; +21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; +21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +2200;FOR ALL;Sm;0;ON;;;;;N;;;;; +2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; +2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; +2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; +2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; +2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; +2206;INCREMENT;Sm;0;ON;;;;;N;;;;; +2207;NABLA;Sm;0;ON;;;;;N;;;;; +2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; +220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; +220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; +220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; +2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; +2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; +2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; +2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; +2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; +2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; +2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; +2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; +221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; +221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; +221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; +221E;INFINITY;Sm;0;ON;;;;;N;;;;; +221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; +2220;ANGLE;Sm;0;ON;;;;;Y;;;;; +2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; +2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; +2223;DIVIDES;Sm;0;ON;;;;;N;;;;; +2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; +2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; +2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; +2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; +222A;UNION;Sm;0;ON;;;;;N;;;;; +222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222C;DOUBLE INTEGRAL;Sm;0;ON; 222B 222B;;;;Y;;;;; +222D;TRIPLE INTEGRAL;Sm;0;ON; 222B 222B 222B;;;;Y;;;;; +222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222F;SURFACE INTEGRAL;Sm;0;ON; 222E 222E;;;;Y;;;;; +2230;VOLUME INTEGRAL;Sm;0;ON; 222E 222E 222E;;;;Y;;;;; +2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2234;THEREFORE;Sm;0;ON;;;;;N;;;;; +2235;BECAUSE;Sm;0;ON;;;;;N;;;;; +2236;RATIO;Sm;0;ON;;;;;N;;;;; +2237;PROPORTION;Sm;0;ON;;;;;N;;;;; +2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; +2239;EXCESS;Sm;0;ON;;;;;Y;;;;; +223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; +223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; +223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;; +223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; +223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; +2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; +2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; +2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; +2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; +2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; +2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; +224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; +224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; +2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; +2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; +2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; +2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; +2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; +2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; +2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; +2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; +225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; +225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; +225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; +225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; +225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; +225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; +2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; +2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; +2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; +2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; +2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; +2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; +2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; +2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; +226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; +226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; +226C;BETWEEN;Sm;0;ON;;;;;N;;;;; +226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;Y;;;;; +226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; +226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; +2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; +2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; +2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; +2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; +2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; +2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; +2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; +2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; +2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; +2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; +227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; +227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; +2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; +2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; +2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; +2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; +2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; +2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; +2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; +228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; +228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; +228C;MULTISET;Sm;0;ON;;;;;Y;;;;; +228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; +228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; +228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; +2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; +2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; +2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; +2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; +229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; +229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; +229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; +229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; +22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; +22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; +22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; +22A5;UP TACK;Sm;0;ON;;;;;N;;;;; +22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; +22A7;MODELS;Sm;0;ON;;;;;Y;;;;; +22A8;TRUE;Sm;0;ON;;;;;Y;;;;; +22A9;FORCES;Sm;0;ON;;;;;Y;;;;; +22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; +22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; +22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; +22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; +22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; +22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; +22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; +22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; +22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; +22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; +22BB;XOR;Sm;0;ON;;;;;N;;;;; +22BC;NAND;Sm;0;ON;;;;;N;;;;; +22BD;NOR;Sm;0;ON;;;;;N;;;;; +22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; +22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; +22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; +22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; +22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; +22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; +22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; +22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; +22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; +22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; +22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; +22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; +22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; +22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; +22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; +22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; +22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; +22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; +22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; +22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; +22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; +22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; +22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; +22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; +22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; +22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; +22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; +22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; +22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; +22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; +22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; +22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; +22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; +22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; +22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; +2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; +2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; +2302;HOUSE;So;0;ON;;;;;N;;;;; +2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; +2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; +2305;PROJECTIVE;So;0;ON;;;;;N;;;;; +2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; +2307;WAVY LINE;So;0;ON;;;;;N;;;;; +2308;LEFT CEILING;Ps;0;ON;;;;;Y;;;;; +2309;RIGHT CEILING;Pe;0;ON;;;;;Y;;;;; +230A;LEFT FLOOR;Ps;0;ON;;;;;Y;;;;; +230B;RIGHT FLOOR;Pe;0;ON;;;;;Y;;;;; +230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; +230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; +230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; +230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; +2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; +2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; +2312;ARC;So;0;ON;;;;;N;;;;; +2313;SEGMENT;So;0;ON;;;;;N;;;;; +2314;SECTOR;So;0;ON;;;;;N;;;;; +2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; +2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; +2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; +2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; +231A;WATCH;So;0;ON;;;;;N;;;;; +231B;HOURGLASS;So;0;ON;;;;;N;;;;; +231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; +231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; +231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; +231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; +2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2322;FROWN;So;0;ON;;;;;N;;;;; +2323;SMILE;So;0;ON;;;;;N;;;;; +2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; +2325;OPTION KEY;So;0;ON;;;;;N;;;;; +2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; +2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; +2328;KEYBOARD;So;0;ON;;;;;N;;;;; +2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; +232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; +232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; +232C;BENZENE RING;So;0;ON;;;;;N;;;;; +232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; +232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; +232F;SYMMETRY;So;0;ON;;;;;N;;;;; +2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; +2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; +2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; +2333;SLOPE;So;0;ON;;;;;N;;;;; +2334;COUNTERBORE;So;0;ON;;;;;N;;;;; +2335;COUNTERSINK;So;0;ON;;;;;N;;;;; +2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; +2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; +2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; +2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; +233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; +233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; +233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; +233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; +233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; +233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; +2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; +2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; +2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; +2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; +2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; +2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; +2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; +2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; +2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; +2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; +234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;; +234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; +234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; +234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; +234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;; +234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; +2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; +2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;; +2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; +2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; +2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; +2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;; +2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; +2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; +2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; +2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; +235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; +235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; +235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; +235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; +235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; +235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; +2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; +2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;; +2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; +2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; +2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; +2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; +2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; +2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; +2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; +2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; +236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; +236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; +236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; +236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; +236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; +236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; +2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; +2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; +2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; +2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; +2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; +2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; +2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; +2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; +2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; +2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; +237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; +237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; +237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; +237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; +237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; +237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; +2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; +2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; +2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; +2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; +2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; +2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; +2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;; +238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;; +238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;; +238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; +238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; +238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; +238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; +2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; +2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; +2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; +2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; +2398;NEXT PAGE;So;0;ON;;;;;N;;;;; +2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; +23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; +23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; +23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; +23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; +23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; +23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; +23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; +23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; +23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; +23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; +23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; +23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; +23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; +23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; +23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; +23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; +23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; +23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; +23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; +23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; +23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; +23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; +23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; +23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; +23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; +23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; +23DB;FUSE;So;0;ON;;;;;N;;;;; +23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; +23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; +23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; +23E5;FLATNESS;So;0;ON;;;;;N;;;;; +23E6;AC CURRENT;So;0;ON;;;;;N;;;;; +23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; +23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;; +23E9;BLACK RIGHT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EA;BLACK LEFT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EB;BLACK UP-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EC;BLACK DOWN-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23ED;BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EE;BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EF;BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F0;ALARM CLOCK;So;0;ON;;;;;N;;;;; +23F1;STOPWATCH;So;0;ON;;;;;N;;;;; +23F2;TIMER CLOCK;So;0;ON;;;;;N;;;;; +23F3;HOURGLASS WITH FLOWING SAND;So;0;ON;;;;;N;;;;; +23F4;BLACK MEDIUM LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F5;BLACK MEDIUM RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F6;BLACK MEDIUM UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F7;BLACK MEDIUM DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F8;DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F9;BLACK SQUARE FOR STOP;So;0;ON;;;;;N;;;;; +23FA;BLACK CIRCLE FOR RECORD;So;0;ON;;;;;N;;;;; +23FB;POWER SYMBOL;So;0;ON;;;;;N;;;;; +23FC;POWER ON-OFF SYMBOL;So;0;ON;;;;;N;;;;; +23FD;POWER ON SYMBOL;So;0;ON;;;;;N;;;;; +23FE;POWER SLEEP SYMBOL;So;0;ON;;;;;N;;;;; +23FF;OBSERVER EYE SYMBOL;So;0;ON;;;;;N;;;;; +2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; +2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; +2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; +2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; +2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; +2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; +2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; +2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; +2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; +2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; +240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; +240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; +240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; +240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; +240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; +240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; +2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; +2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; +2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; +2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; +2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; +2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; +2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; +2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; +2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; +2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; +241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; +241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; +241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; +241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; +241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; +241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; +2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; +2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; +2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; +2423;OPEN BOX;So;0;ON;;;;;N;;;;; +2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; +2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; +2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; +2427;SYMBOL FOR DELETE SQUARE CHECKER BOARD FORM;So;0;ON;;;;;N;;;;; +2428;SYMBOL FOR DELETE RECTANGULAR CHECKER BOARD FORM;So;0;ON;;;;;N;;;;; +2429;SYMBOL FOR DELETE MEDIUM SHADE FORM;So;0;ON;;;;;N;;;;; +2440;OCR HOOK;So;0;ON;;;;;N;;;;; +2441;OCR CHAIR;So;0;ON;;;;;N;;;;; +2442;OCR FORK;So;0;ON;;;;;N;;;;; +2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; +2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; +2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; +2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; +2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; +2448;OCR DASH;So;0;ON;;;;;N;;;;; +2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; +244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;ON; 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON; 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON; 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON; 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON; 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON; 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON; 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON; 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON; 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON; 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON; 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON; 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON; 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON; 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON; 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON; 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON; 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON; 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON; 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON; 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON; 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON; 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON; 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON; 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON; 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON; 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON; 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON; 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON; 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON; 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON; 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON; 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON; 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON; 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON; 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON; 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON; 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON; 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON; 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON; 0028 0032 0030 0029;;;20;N;;;;; +2488;DIGIT ONE FULL STOP;No;0;EN; 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; +2489;DIGIT TWO FULL STOP;No;0;EN; 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; +248A;DIGIT THREE FULL STOP;No;0;EN; 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; +248B;DIGIT FOUR FULL STOP;No;0;EN; 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; +248C;DIGIT FIVE FULL STOP;No;0;EN; 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; +248D;DIGIT SIX FULL STOP;No;0;EN; 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; +248E;DIGIT SEVEN FULL STOP;No;0;EN; 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; +248F;DIGIT EIGHT FULL STOP;No;0;EN; 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; +2490;DIGIT NINE FULL STOP;No;0;EN; 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; +2491;NUMBER TEN FULL STOP;No;0;EN; 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; +2492;NUMBER ELEVEN FULL STOP;No;0;EN; 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; +2493;NUMBER TWELVE FULL STOP;No;0;EN; 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; +2494;NUMBER THIRTEEN FULL STOP;No;0;EN; 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; +2495;NUMBER FOURTEEN FULL STOP;No;0;EN; 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; +2496;NUMBER FIFTEEN FULL STOP;No;0;EN; 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; +2497;NUMBER SIXTEEN FULL STOP;No;0;EN; 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; +2498;NUMBER SEVENTEEN FULL STOP;No;0;EN; 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; +2499;NUMBER EIGHTEEN FULL STOP;No;0;EN; 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; +249A;NUMBER NINETEEN FULL STOP;No;0;EN; 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; +249B;NUMBER TWENTY FULL STOP;No;0;EN; 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; +249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L; 0028 0061 0029;;;;N;;;;; +249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L; 0028 0062 0029;;;;N;;;;; +249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L; 0028 0063 0029;;;;N;;;;; +249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L; 0028 0064 0029;;;;N;;;;; +24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L; 0028 0065 0029;;;;N;;;;; +24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L; 0028 0066 0029;;;;N;;;;; +24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L; 0028 0067 0029;;;;N;;;;; +24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L; 0028 0068 0029;;;;N;;;;; +24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L; 0028 0069 0029;;;;N;;;;; +24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L; 0028 006A 0029;;;;N;;;;; +24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L; 0028 006B 0029;;;;N;;;;; +24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L; 0028 006C 0029;;;;N;;;;; +24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L; 0028 006D 0029;;;;N;;;;; +24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L; 0028 006E 0029;;;;N;;;;; +24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L; 0028 006F 0029;;;;N;;;;; +24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L; 0028 0070 0029;;;;N;;;;; +24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L; 0028 0071 0029;;;;N;;;;; +24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L; 0028 0072 0029;;;;N;;;;; +24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L; 0028 0073 0029;;;;N;;;;; +24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L; 0028 0074 0029;;;;N;;;;; +24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L; 0028 0075 0029;;;;N;;;;; +24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L; 0028 0076 0029;;;;N;;;;; +24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L; 0028 0077 0029;;;;N;;;;; +24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L; 0028 0078 0029;;;;N;;;;; +24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L; 0028 0079 0029;;;;N;;;;; +24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L; 0028 007A 0029;;;;N;;;;; +24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;24D0; +24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;24D1; +24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;24D2; +24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;24D3; +24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;24D4; +24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;24D5; +24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;24D6; +24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;24D7; +24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;24D8; +24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;24D9; +24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;24DA; +24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;24DB; +24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;24DC; +24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;24DD; +24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;24DE; +24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;24DF; +24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;24E0; +24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;24E1; +24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;24E2; +24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;24E3; +24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;24E4; +24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;24E5; +24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;24E6; +24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;24E7; +24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;24E8; +24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;24E9; +24D0;CIRCLED LATIN SMALL LETTER A;So;0;L; 0061;;;;N;;;24B6;;24B6 +24D1;CIRCLED LATIN SMALL LETTER B;So;0;L; 0062;;;;N;;;24B7;;24B7 +24D2;CIRCLED LATIN SMALL LETTER C;So;0;L; 0063;;;;N;;;24B8;;24B8 +24D3;CIRCLED LATIN SMALL LETTER D;So;0;L; 0064;;;;N;;;24B9;;24B9 +24D4;CIRCLED LATIN SMALL LETTER E;So;0;L; 0065;;;;N;;;24BA;;24BA +24D5;CIRCLED LATIN SMALL LETTER F;So;0;L; 0066;;;;N;;;24BB;;24BB +24D6;CIRCLED LATIN SMALL LETTER G;So;0;L; 0067;;;;N;;;24BC;;24BC +24D7;CIRCLED LATIN SMALL LETTER H;So;0;L; 0068;;;;N;;;24BD;;24BD +24D8;CIRCLED LATIN SMALL LETTER I;So;0;L; 0069;;;;N;;;24BE;;24BE +24D9;CIRCLED LATIN SMALL LETTER J;So;0;L; 006A;;;;N;;;24BF;;24BF +24DA;CIRCLED LATIN SMALL LETTER K;So;0;L; 006B;;;;N;;;24C0;;24C0 +24DB;CIRCLED LATIN SMALL LETTER L;So;0;L; 006C;;;;N;;;24C1;;24C1 +24DC;CIRCLED LATIN SMALL LETTER M;So;0;L; 006D;;;;N;;;24C2;;24C2 +24DD;CIRCLED LATIN SMALL LETTER N;So;0;L; 006E;;;;N;;;24C3;;24C3 +24DE;CIRCLED LATIN SMALL LETTER O;So;0;L; 006F;;;;N;;;24C4;;24C4 +24DF;CIRCLED LATIN SMALL LETTER P;So;0;L; 0070;;;;N;;;24C5;;24C5 +24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L; 0071;;;;N;;;24C6;;24C6 +24E1;CIRCLED LATIN SMALL LETTER R;So;0;L; 0072;;;;N;;;24C7;;24C7 +24E2;CIRCLED LATIN SMALL LETTER S;So;0;L; 0073;;;;N;;;24C8;;24C8 +24E3;CIRCLED LATIN SMALL LETTER T;So;0;L; 0074;;;;N;;;24C9;;24C9 +24E4;CIRCLED LATIN SMALL LETTER U;So;0;L; 0075;;;;N;;;24CA;;24CA +24E5;CIRCLED LATIN SMALL LETTER V;So;0;L; 0076;;;;N;;;24CB;;24CB +24E6;CIRCLED LATIN SMALL LETTER W;So;0;L; 0077;;;;N;;;24CC;;24CC +24E7;CIRCLED LATIN SMALL LETTER X;So;0;L; 0078;;;;N;;;24CD;;24CD +24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L; 0079;;;;N;;;24CE;;24CE +24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L; 007A;;;;N;;;24CF;;24CF +24EA;CIRCLED DIGIT ZERO;No;0;ON; 0030;;0;0;N;;;;; +24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; +24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; +24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; +24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; +24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; +24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; +24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; +24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; +24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; +24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; +24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; +24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; +24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; +24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; +24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; +24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; +24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; +24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; +24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; +24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;; +2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; +2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; +2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; +2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; +2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; +2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; +2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; +2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; +2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; +2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; +250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; +250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; +250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; +250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; +250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; +250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; +2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; +2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; +2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; +2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; +2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; +2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; +2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; +2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; +2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; +2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; +251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; +251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; +251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; +251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; +251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; +251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; +2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; +2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; +2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; +2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; +2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; +2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; +2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; +2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; +2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; +2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; +252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; +252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; +252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; +252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; +252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; +252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; +2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; +2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; +2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; +2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; +2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; +2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; +2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; +2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; +2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; +2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; +253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; +253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; +253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; +253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; +253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; +253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; +2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; +2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; +2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; +2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; +2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; +2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; +2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; +2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; +2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; +2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; +254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; +254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; +254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; +254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; +254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; +254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; +2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; +2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; +2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; +2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; +2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; +2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; +2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; +2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; +2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; +2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; +255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; +255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; +255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; +255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; +255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; +255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; +2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; +2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; +2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; +2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; +2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; +2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; +2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; +2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; +2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; +2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; +256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; +256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; +256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; +256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; +256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; +256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; +2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; +2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; +2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; +2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; +2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; +2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; +2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; +2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; +2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; +2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; +257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; +257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; +257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; +257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; +257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; +257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; +2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; +2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; +2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2588;FULL BLOCK;So;0;ON;;;;;N;;;;; +2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; +258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; +258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; +2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; +2593;DARK SHADE;So;0;ON;;;;;N;;;;; +2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; +2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; +2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; +2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; +259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; +25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; +25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; +25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; +25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; +25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; +25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; +25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; +25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; +25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; +25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; +25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; +25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; +25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; +25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; +25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; +25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; +25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; +25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; +25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; +25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; +25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; +25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; +25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; +25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; +25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; +25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +25C9;FISHEYE;So;0;ON;;;;;N;;;;; +25CA;LOZENGE;So;0;ON;;;;;N;;;;; +25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; +25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25CE;BULLSEYE;So;0;ON;;;;;N;;;;; +25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; +25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; +25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; +25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; +25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; +25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; +25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; +25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; +25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; +25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; +2601;CLOUD;So;0;ON;;;;;N;;;;; +2602;UMBRELLA;So;0;ON;;;;;N;;;;; +2603;SNOWMAN;So;0;ON;;;;;N;;;;; +2604;COMET;So;0;ON;;;;;N;;;;; +2605;BLACK STAR;So;0;ON;;;;;N;;;;; +2606;WHITE STAR;So;0;ON;;;;;N;;;;; +2607;LIGHTNING;So;0;ON;;;;;N;;;;; +2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; +2609;SUN;So;0;ON;;;;;N;;;;; +260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; +260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; +260C;CONJUNCTION;So;0;ON;;;;;N;;;;; +260D;OPPOSITION;So;0;ON;;;;;N;;;;; +260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; +260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; +2610;BALLOT BOX;So;0;ON;;;;;N;;;;; +2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; +2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; +2613;SALTIRE;So;0;ON;;;;;N;;;;; +2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; +2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; +2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2618;SHAMROCK;So;0;ON;;;;;N;;;;; +2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; +2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; +2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; +2624;CADUCEUS;So;0;ON;;;;;N;;;;; +2625;ANKH;So;0;ON;;;;;N;;;;; +2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; +2627;CHI RHO;So;0;ON;;;;;N;;;;; +2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; +2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; +262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; +262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; +262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; +262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; +262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; +262F;YIN YANG;So;0;ON;;;;;N;;;;; +2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; +2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; +2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; +2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; +2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; +2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; +2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; +2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; +2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; +263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; +263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; +263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; +263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; +263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; +263F;MERCURY;So;0;ON;;;;;N;;;;; +2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; +2641;EARTH;So;0;ON;;;;;N;;;;; +2642;MALE SIGN;So;0;ON;;;;;N;;;;; +2643;JUPITER;So;0;ON;;;;;N;;;;; +2644;SATURN;So;0;ON;;;;;N;;;;; +2645;URANUS;So;0;ON;;;;;N;;;;; +2646;NEPTUNE;So;0;ON;;;;;N;;;;; +2647;PLUTO;So;0;ON;;;;;N;;;;; +2648;ARIES;So;0;ON;;;;;N;;;;; +2649;TAURUS;So;0;ON;;;;;N;;;;; +264A;GEMINI;So;0;ON;;;;;N;;;;; +264B;CANCER;So;0;ON;;;;;N;;;;; +264C;LEO;So;0;ON;;;;;N;;;;; +264D;VIRGO;So;0;ON;;;;;N;;;;; +264E;LIBRA;So;0;ON;;;;;N;;;;; +264F;SCORPIUS;So;0;ON;;;;;N;;;;; +2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; +2651;CAPRICORN;So;0;ON;;;;;N;;;;; +2652;AQUARIUS;So;0;ON;;;;;N;;;;; +2653;PISCES;So;0;ON;;;;;N;;;;; +2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; +2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; +2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; +2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; +2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; +2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; +265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; +265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; +265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; +265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; +265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; +265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; +2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; +2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; +2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; +2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; +2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; +2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; +2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; +2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; +266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; +266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; +266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; +266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; +266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; +266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; +2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;; +2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;; +2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;; +2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;; +2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;; +2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;; +2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;; +267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; +267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; +267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; +2680;DIE FACE-1;So;0;ON;;;;;N;;;;; +2681;DIE FACE-2;So;0;ON;;;;;N;;;;; +2682;DIE FACE-3;So;0;ON;;;;;N;;;;; +2683;DIE FACE-4;So;0;ON;;;;;N;;;;; +2684;DIE FACE-5;So;0;ON;;;;;N;;;;; +2685;DIE FACE-6;So;0;ON;;;;;N;;;;; +2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; +2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; +2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; +268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; +268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; +268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; +268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; +268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; +268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; +2690;WHITE FLAG;So;0;ON;;;;;N;;;;; +2691;BLACK FLAG;So;0;ON;;;;;N;;;;; +2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; +2693;ANCHOR;So;0;ON;;;;;N;;;;; +2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; +2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; +2696;SCALES;So;0;ON;;;;;N;;;;; +2697;ALEMBIC;So;0;ON;;;;;N;;;;; +2698;FLOWER;So;0;ON;;;;;N;;;;; +2699;GEAR;So;0;ON;;;;;N;;;;; +269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; +269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; +269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; +269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;; +269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;; +26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; +26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; +26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; +26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; +26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; +26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; +26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; +26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; +26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; +26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; +26B0;COFFIN;So;0;ON;;;;;N;;;;; +26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; +26B2;NEUTER;So;0;ON;;;;;N;;;;; +26B3;CERES;So;0;ON;;;;;N;;;;; +26B4;PALLAS;So;0;ON;;;;;N;;;;; +26B5;JUNO;So;0;ON;;;;;N;;;;; +26B6;VESTA;So;0;ON;;;;;N;;;;; +26B7;CHIRON;So;0;ON;;;;;N;;;;; +26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; +26B9;SEXTILE;So;0;ON;;;;;N;;;;; +26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; +26BB;QUINCUNX;So;0;ON;;;;;N;;;;; +26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; +26BD;SOCCER BALL;So;0;ON;;;;;N;;;;; +26BE;BASEBALL;So;0;ON;;;;;N;;;;; +26BF;SQUARED KEY;So;0;ON;;;;;N;;;;; +26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;; +26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +26C6;RAIN;So;0;ON;;;;;N;;;;; +26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;; +26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;; +26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;; +26CC;CROSSING LANES;So;0;ON;;;;;N;;;;; +26CD;DISABLED CAR;So;0;ON;;;;;N;;;;; +26CE;OPHIUCHUS;So;0;ON;;;;;N;;;;; +26CF;PICK;So;0;ON;;;;;N;;;;; +26D0;CAR SLIDING;So;0;ON;;;;;N;;;;; +26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;; +26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;; +26D3;CHAINS;So;0;ON;;;;;N;;;;; +26D4;NO ENTRY;So;0;ON;;;;;N;;;;; +26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;; +26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;; +26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;; +26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;; +26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;; +26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;; +26E2;ASTRONOMICAL SYMBOL FOR URANUS;So;0;ON;;;;;N;;;;; +26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;; +26E4;PENTAGRAM;So;0;ON;;;;;N;;;;; +26E5;RIGHT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E6;LEFT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E7;INVERTED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;; +26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;; +26EA;CHURCH;So;0;ON;;;;;N;;;;; +26EB;CASTLE;So;0;ON;;;;;N;;;;; +26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;; +26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;; +26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;; +26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;; +26F0;MOUNTAIN;So;0;ON;;;;;N;;;;; +26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;; +26F2;FOUNTAIN;So;0;ON;;;;;N;;;;; +26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;; +26F4;FERRY;So;0;ON;;;;;N;;;;; +26F5;SAILBOAT;So;0;ON;;;;;N;;;;; +26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;; +26F7;SKIER;So;0;ON;;;;;N;;;;; +26F8;ICE SKATE;So;0;ON;;;;;N;;;;; +26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;; +26FA;TENT;So;0;ON;;;;;N;;;;; +26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;; +26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;; +26FD;FUEL PUMP;So;0;ON;;;;;N;;;;; +26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;; +26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;; +2700;BLACK SAFETY SCISSORS;So;0;ON;;;;;N;;;;; +2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; +2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; +2705;WHITE HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; +2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; +2708;AIRPLANE;So;0;ON;;;;;N;;;;; +2709;ENVELOPE;So;0;ON;;;;;N;;;;; +270A;RAISED FIST;So;0;ON;;;;;N;;;;; +270B;RAISED HAND;So;0;ON;;;;;N;;;;; +270C;VICTORY HAND;So;0;ON;;;;;N;;;;; +270D;WRITING HAND;So;0;ON;;;;;N;;;;; +270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +270F;PENCIL;So;0;ON;;;;;N;;;;; +2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +2711;WHITE NIB;So;0;ON;;;;;N;;;;; +2712;BLACK NIB;So;0;ON;;;;;N;;;;; +2713;CHECK MARK;So;0;ON;;;;;N;;;;; +2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2717;BALLOT X;So;0;ON;;;;;N;;;;; +2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; +2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; +271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; +271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; +271D;LATIN CROSS;So;0;ON;;;;;N;;;;; +271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; +2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; +2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; +2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2728;SPARKLES;So;0;ON;;;;;N;;;;; +2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; +272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; +272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; +272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; +2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; +2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; +2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; +273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; +273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; +273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; +2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; +2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; +2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; +2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; +2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; +2747;SPARKLE;So;0;ON;;;;;N;;;;; +2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; +2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274C;CROSS MARK;So;0;ON;;;;;N;;;;; +274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +274E;NEGATIVE SQUARED CROSS MARK;So;0;ON;;;;;N;;;;; +274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2753;BLACK QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2754;WHITE QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2755;WHITE EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; +2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;; +2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; +2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; +275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; +275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275F;HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2760;HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; +2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; +2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; +2766;FLORAL HEART;So;0;ON;;;;;N;;;;; +2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; +2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; +2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; +2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; +277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; +277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; +277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; +277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; +277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; +277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; +2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; +2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; +2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; +2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; +2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; +2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; +2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; +2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; +278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; +278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; +278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; +278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; +278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; +278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; +2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; +2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; +2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; +2795;HEAVY PLUS SIGN;So;0;ON;;;;;N;;;;; +2796;HEAVY MINUS SIGN;So;0;ON;;;;;N;;;;; +2797;HEAVY DIVISION SIGN;So;0;ON;;;;;N;;;;; +2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; +2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; +279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; +279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; +279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; +279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; +279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; +279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; +27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; +27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; +27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; +27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; +27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; +27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; +27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; +27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; +27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; +27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B0;CURLY LOOP;So;0;ON;;;;;N;;;;; +27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; +27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; +27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; +27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; +27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; +27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; +27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; +27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; +27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +27BF;DOUBLE CURLY LOOP;So;0;ON;;;;;N;;;;; +27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; +27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; +27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; +27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; +27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; +27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; +27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; +27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; +27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; +27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +27CB;MATHEMATICAL RISING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; +27CD;MATHEMATICAL FALLING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CE;SQUARED LOGICAL AND;Sm;0;ON;;;;;N;;;;; +27CF;SQUARED LOGICAL OR;Sm;0;ON;;;;;N;;;;; +27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; +27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; +27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; +27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; +27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; +27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; +27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; +27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; +27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; +27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; +27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; +27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; +27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; +27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; +2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; +2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; +2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; +2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; +2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; +293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; +293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; +2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; +2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; +297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; +297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; +2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; +2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; +2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; +2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; +2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; +2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; +2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; +2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; +298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; +298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; +298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; +298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; +298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; +298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; +2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; +2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; +2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; +2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; +299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; +299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; +299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; +299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; +299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; +29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;N;;;;; +29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; +29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; +29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; +29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; +29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; +29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; +29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; +29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; +29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; +29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; +29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; +29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; +29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; +29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; +29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; +29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; +29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; +29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; +29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; +29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; +29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; +29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; +29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; +29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; +29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; +29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; +29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; +29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; +29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; +29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; +29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; +29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; +29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +29FE;TINY;Sm;0;ON;;;;;N;;;;; +29FF;MINY;Sm;0;ON;;;;;N;;;;; +2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; +2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; +2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; +2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; +2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; +2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; +2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON; 222B 222B 222B 222B;;;;Y;;;;; +2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; +2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; +2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; +2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; +2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; +2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; +2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; +2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; +2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; +2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2A1D;JOIN;Sm;0;ON;;;;;N;;;;; +2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; +2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; +2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; +2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; +2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; +2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; +2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; +2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; +2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; +2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; +2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; +2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; +2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; +2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; +2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; +2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; +2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; +2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; +2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; +2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; +2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A74;DOUBLE COLON EQUAL;Sm;0;ON; 003A 003A 003D;;;;Y;;;;; +2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D;;;;N;;;;; +2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D 003D;;;;N;;;;; +2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; +2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; +2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; +2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; +2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; +2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; +2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; +2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; +2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; +2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; +2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; +2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; +2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;; +2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;; +2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; +2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; +2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; +2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; +2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; +2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; +2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; +2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; +2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; +2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; +2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; +2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; +2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; +2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; +2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; +2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; +2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; +2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4D;DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW;So;0;ON;;;;;N;;;;; +2B4E;SHORT SLANTED NORTH ARROW;So;0;ON;;;;;N;;;;; +2B4F;SHORT BACKSLANTED SOUTH ARROW;So;0;ON;;;;;N;;;;; +2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; +2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; +2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; +2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;; +2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;; +2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;; +2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;; +2B5A;SLANTED NORTH ARROW WITH HOOKED HEAD;So;0;ON;;;;;N;;;;; +2B5B;BACKSLANTED SOUTH ARROW WITH HOOKED TAIL;So;0;ON;;;;;N;;;;; +2B5C;SLANTED NORTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5D;BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5E;BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B5F;SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B60;LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B61;UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B62;RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B63;DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B64;LEFT RIGHT TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B65;UP DOWN TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B66;NORTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B67;NORTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B68;SOUTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B69;SOUTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B6A;LEFTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6B;UPWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6C;RIGHTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6D;DOWNWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6E;CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B6F;ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B70;LEFTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B71;UPWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B72;RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B73;DOWNWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B76;NORTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B77;NORTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B78;SOUTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B79;SOUTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7B;UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7D;DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7E;HORIZONTAL TAB KEY;So;0;ON;;;;;N;;;;; +2B7F;VERTICAL TAB KEY;So;0;ON;;;;;N;;;;; +2B80;LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B81;UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B82;RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B83;DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B84;LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B85;UPWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B86;RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B87;DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B88;LEFTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B89;UPWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8A;RIGHTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8B;DOWNWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8C;ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8D;ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8E;ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8F;ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B90;RETURN LEFT;So;0;ON;;;;;N;;;;; +2B91;RETURN RIGHT;So;0;ON;;;;;N;;;;; +2B92;NEWLINE LEFT;So;0;ON;;;;;N;;;;; +2B93;NEWLINE RIGHT;So;0;ON;;;;;N;;;;; +2B94;FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE;So;0;ON;;;;;N;;;;; +2B95;RIGHTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B96;EQUALS SIGN WITH INFINITY ABOVE;So;0;ON;;;;;N;;;;; +2B97;SYMBOL FOR TYPE A ELECTRONICS;So;0;ON;;;;;N;;;;; +2B98;THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B99;THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9A;THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9B;THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9C;BLACK LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9D;BLACK UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9E;BLACK RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9F;BLACK DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2BA0;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA1;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA2;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA3;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA4;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA5;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA6;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA7;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA8;BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BA9;BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAA;BLACK CURVED UPWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAB;BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAC;BLACK CURVED LEFTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAD;BLACK CURVED RIGHTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAE;BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAF;BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BB0;RIBBON ARROW DOWN LEFT;So;0;ON;;;;;N;;;;; +2BB1;RIBBON ARROW DOWN RIGHT;So;0;ON;;;;;N;;;;; +2BB2;RIBBON ARROW UP LEFT;So;0;ON;;;;;N;;;;; +2BB3;RIBBON ARROW UP RIGHT;So;0;ON;;;;;N;;;;; +2BB4;RIBBON ARROW LEFT UP;So;0;ON;;;;;N;;;;; +2BB5;RIBBON ARROW RIGHT UP;So;0;ON;;;;;N;;;;; +2BB6;RIBBON ARROW LEFT DOWN;So;0;ON;;;;;N;;;;; +2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;; +2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;; +2BBA;OVERLAPPING WHITE SQUARES;So;0;ON;;;;;N;;;;; +2BBB;OVERLAPPING WHITE AND BLACK SQUARES;So;0;ON;;;;;N;;;;; +2BBC;OVERLAPPING BLACK SQUARES;So;0;ON;;;;;N;;;;; +2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;; +2BBE;CIRCLED X;So;0;ON;;;;;N;;;;; +2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;; +2BC0;BLACK SQUARE CENTRED;So;0;ON;;;;;N;;;;; +2BC1;BLACK DIAMOND CENTRED;So;0;ON;;;;;N;;;;; +2BC2;TURNED BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2BC3;HORIZONTAL BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC4;BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC5;BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC9;NEPTUNE FORM TWO;So;0;ON;;;;;N;;;;; +2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCD;ROTATED LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCE;WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; +2BD2;GROUP MARK;So;0;ON;;;;;N;;;;; +2BD3;PLUTO FORM TWO;So;0;ON;;;;;N;;;;; +2BD4;PLUTO FORM THREE;So;0;ON;;;;;N;;;;; +2BD5;PLUTO FORM FOUR;So;0;ON;;;;;N;;;;; +2BD6;PLUTO FORM FIVE;So;0;ON;;;;;N;;;;; +2BD7;TRANSPLUTO;So;0;ON;;;;;N;;;;; +2BD8;PROSERPINA;So;0;ON;;;;;N;;;;; +2BD9;ASTRAEA;So;0;ON;;;;;N;;;;; +2BDA;HYGIEA;So;0;ON;;;;;N;;;;; +2BDB;PHOLUS;So;0;ON;;;;;N;;;;; +2BDC;NESSUS;So;0;ON;;;;;N;;;;; +2BDD;WHITE MOON SELENA;So;0;ON;;;;;N;;;;; +2BDE;BLACK DIAMOND ON CROSS;So;0;ON;;;;;N;;;;; +2BDF;TRUE LIGHT MOON ARTA;So;0;ON;;;;;N;;;;; +2BE0;CUPIDO;So;0;ON;;;;;N;;;;; +2BE1;HADES;So;0;ON;;;;;N;;;;; +2BE2;ZEUS;So;0;ON;;;;;N;;;;; +2BE3;KRONOS;So;0;ON;;;;;N;;;;; +2BE4;APOLLON;So;0;ON;;;;;N;;;;; +2BE5;ADMETOS;So;0;ON;;;;;N;;;;; +2BE6;VULCANUS;So;0;ON;;;;;N;;;;; +2BE7;POSEIDON;So;0;ON;;;;;N;;;;; +2BE8;LEFT HALF BLACK STAR;So;0;ON;;;;;N;;;;; +2BE9;RIGHT HALF BLACK STAR;So;0;ON;;;;;N;;;;; +2BEA;STAR WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2BEB;STAR WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BF0;ERIS FORM ONE;So;0;ON;;;;;N;;;;; +2BF1;ERIS FORM TWO;So;0;ON;;;;;N;;;;; +2BF2;SEDNA;So;0;ON;;;;;N;;;;; +2BF3;RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE;So;0;ON;;;;;N;;;;; +2BF4;RUSSIAN ASTROLOGICAL SYMBOL NOVILE;So;0;ON;;;;;N;;;;; +2BF5;RUSSIAN ASTROLOGICAL SYMBOL QUINTILE;So;0;ON;;;;;N;;;;; +2BF6;RUSSIAN ASTROLOGICAL SYMBOL BINOVILE;So;0;ON;;;;;N;;;;; +2BF7;RUSSIAN ASTROLOGICAL SYMBOL SENTAGON;So;0;ON;;;;;N;;;;; +2BF8;RUSSIAN ASTROLOGICAL SYMBOL TREDECILE;So;0;ON;;;;;N;;;;; +2BF9;EQUALS SIGN WITH INFINITY BELOW;So;0;ON;;;;;N;;;;; +2BFA;UNITED SYMBOL;So;0;ON;;;;;N;;;;; +2BFB;SEPARATED SYMBOL;So;0;ON;;;;;N;;;;; +2BFC;DOUBLED SYMBOL;So;0;ON;;;;;N;;;;; +2BFD;PASSED SYMBOL;So;0;ON;;;;;N;;;;; +2BFE;REVERSED RIGHT ANGLE;So;0;ON;;;;;Y;;;;; +2BFF;HELLSCHREIBER PAUSE SYMBOL;So;0;ON;;;;;N;;;;; +2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; +2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; +2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; +2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; +2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; +2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; +2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; +2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; +2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; +2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; +2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; +2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; +2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; +2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; +2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; +2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; +2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; +2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; +2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; +2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; +2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; +2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; +2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; +2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; +2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; +2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; +2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; +2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; +2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; +2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; +2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; +2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; +2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; +2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; +2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; +2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; +2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; +2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; +2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; +2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; +2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; +2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; +2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; +2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; +2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; +2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; +2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; +2C2F;GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI;Lu;0;L;;;;;N;;;;2C5F; +2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 +2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 +2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 +2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 +2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 +2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 +2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 +2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 +2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 +2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 +2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A +2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B +2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C +2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D +2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E +2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F +2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 +2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 +2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 +2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 +2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 +2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 +2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 +2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 +2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 +2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 +2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A +2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B +2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C +2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D +2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E +2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F +2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 +2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 +2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 +2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 +2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 +2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 +2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 +2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 +2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 +2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 +2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A +2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B +2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C +2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D +2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E +2C5F;GLAGOLITIC SMALL LETTER CAUDATE CHRIVI;Ll;0;L;;;;;N;;;2C2F;;2C2F +2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; +2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 +2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; +2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; +2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; +2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A +2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E +2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; +2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 +2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; +2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 +2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; +2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B +2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; +2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; +2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; +2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252; +2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; +2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; +2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 +2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; +2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; +2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 +2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; +2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; +2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; +2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; +2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; +2C7C;LATIN SUBSCRIPT SMALL LETTER J;Lm;0;L; 006A;;;;N;;;;; +2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L; 0056;;;;N;;;;; +2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F; +2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240; +2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; +2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 +2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; +2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 +2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; +2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 +2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; +2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 +2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; +2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 +2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; +2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A +2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; +2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C +2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; +2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E +2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; +2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 +2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; +2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 +2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; +2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 +2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; +2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 +2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; +2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 +2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; +2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A +2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; +2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C +2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; +2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E +2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; +2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 +2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; +2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 +2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; +2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 +2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; +2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 +2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; +2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 +2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; +2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA +2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; +2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC +2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; +2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE +2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; +2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 +2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; +2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 +2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; +2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 +2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; +2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 +2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; +2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 +2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; +2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA +2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; +2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC +2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; +2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE +2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; +2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 +2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; +2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 +2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; +2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 +2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; +2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 +2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; +2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 +2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; +2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA +2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; +2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC +2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; +2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE +2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; +2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 +2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; +2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 +2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; +2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 +2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; +2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 +2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; +2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 +2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; +2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA +2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; +2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC +2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; +2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE +2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; +2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 +2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; +2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 +2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; +2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; +2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; +2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; +2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; +2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; +2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; +2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC; +2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB +2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE; +2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED +2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;; +2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;; +2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;; +2CF2;COPTIC CAPITAL LETTER BOHAIRIC KHEI;Lu;0;L;;;;;N;;;;2CF3; +2CF3;COPTIC SMALL LETTER BOHAIRIC KHEI;Ll;0;L;;;;;N;;;2CF2;;2CF2 +2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; +2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; +2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; +2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; +2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0 +2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1 +2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2 +2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3 +2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4 +2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5 +2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6 +2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7 +2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8 +2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9 +2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA +2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB +2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC +2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD +2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE +2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF +2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0 +2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1 +2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2 +2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3 +2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4 +2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5 +2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6 +2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7 +2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8 +2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9 +2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA +2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB +2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC +2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD +2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE +2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF +2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0 +2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1 +2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2 +2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3 +2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4 +2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5 +2D27;GEORGIAN SMALL LETTER YN;Ll;0;L;;;;;N;;;10C7;;10C7 +2D2D;GEORGIAN SMALL LETTER AEN;Ll;0;L;;;;;N;;;10CD;;10CD +2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; +2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; +2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; +2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; +2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; +2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; +2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; +2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; +2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; +2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; +2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; +2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; +2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; +2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; +2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; +2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; +2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;; +2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; +2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; +2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; +2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; +2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; +2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; +2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; +2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; +2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; +2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; +2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; +2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; +2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; +2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; +2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; +2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; +2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; +2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; +2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;; +2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; +2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; +2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; +2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; +2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;; +2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; +2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; +2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; +2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; +2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; +2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; +2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; +2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; +2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; +2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; +2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; +2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;; +2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; +2D66;TIFINAGH LETTER YE;Lo;0;L;;;;;N;;;;; +2D67;TIFINAGH LETTER YO;Lo;0;L;;;;;N;;;;; +2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L; 2D61;;;;N;;;;; +2D70;TIFINAGH SEPARATOR MARK;Po;0;L;;;;;N;;;;; +2D7F;TIFINAGH CONSONANT JOINER;Mn;9;NSM;;;;;N;;;;; +2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; +2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; +2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; +2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; +2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; +2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; +2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; +2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; +2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; +2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; +2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; +2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; +2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; +2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; +2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; +2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; +2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; +2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; +2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; +2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; +2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; +2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; +2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; +2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; +2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; +2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; +2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; +2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; +2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; +2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; +2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; +2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; +2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; +2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; +2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; +2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; +2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; +2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; +2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; +2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; +2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; +2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; +2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; +2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; +2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; +2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; +2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; +2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; +2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; +2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; +2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; +2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; +2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; +2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; +2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; +2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; +2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; +2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; +2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; +2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; +2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; +2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; +2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; +2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; +2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; +2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; +2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; +2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; +2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; +2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; +2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; +2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; +2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; +2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; +2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; +2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; +2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; +2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; +2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; +2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; +2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; +2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; +2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; +2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; +2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; +2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; +2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; +2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; +2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; +2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; +2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; +2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; +2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; +2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; +2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; +2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; +2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; +2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; +2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; +2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; +2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; +2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; +2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; +2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; +2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; +2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; +2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; +2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; +2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; +2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; +2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; +2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; +2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; +2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; +2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; +2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; +2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; +2E30;RING POINT;Po;0;ON;;;;;N;;;;; +2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;; +2E32;TURNED COMMA;Po;0;ON;;;;;N;;;;; +2E33;RAISED DOT;Po;0;ON;;;;;N;;;;; +2E34;RAISED COMMA;Po;0;ON;;;;;N;;;;; +2E35;TURNED SEMICOLON;Po;0;ON;;;;;N;;;;; +2E36;DAGGER WITH LEFT GUARD;Po;0;ON;;;;;N;;;;; +2E37;DAGGER WITH RIGHT GUARD;Po;0;ON;;;;;N;;;;; +2E38;TURNED DAGGER;Po;0;ON;;;;;N;;;;; +2E39;TOP HALF SECTION SIGN;Po;0;ON;;;;;N;;;;; +2E3A;TWO-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3B;THREE-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3C;STENOGRAPHIC FULL STOP;Po;0;ON;;;;;N;;;;; +2E3D;VERTICAL SIX DOTS;Po;0;ON;;;;;N;;;;; +2E3E;WIGGLY VERTICAL LINE;Po;0;ON;;;;;N;;;;; +2E3F;CAPITULUM;Po;0;ON;;;;;N;;;;; +2E40;DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E41;REVERSED COMMA;Po;0;ON;;;;;N;;;;; +2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +2E43;DASH WITH LEFT UPTURN;Po;0;ON;;;;;N;;;;; +2E44;DOUBLE SUSPENSION MARK;Po;0;ON;;;;;N;;;;; +2E45;INVERTED LOW KAVYKA;Po;0;ON;;;;;N;;;;; +2E46;INVERTED LOW KAVYKA WITH KAVYKA ABOVE;Po;0;ON;;;;;N;;;;; +2E47;LOW KAVYKA;Po;0;ON;;;;;N;;;;; +2E48;LOW KAVYKA WITH DOT;Po;0;ON;;;;;N;;;;; +2E49;DOUBLE STACKED COMMA;Po;0;ON;;;;;N;;;;; +2E4A;DOTTED SOLIDUS;Po;0;ON;;;;;N;;;;; +2E4B;TRIPLE DAGGER;Po;0;ON;;;;;N;;;;; +2E4C;MEDIEVAL COMMA;Po;0;ON;;;;;N;;;;; +2E4D;PARAGRAPHUS MARK;Po;0;ON;;;;;N;;;;; +2E4E;PUNCTUS ELEVATUS MARK;Po;0;ON;;;;;N;;;;; +2E4F;CORNISH VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2E50;CROSS PATTY WITH RIGHT CROSSBAR;So;0;ON;;;;;N;;;;; +2E51;CROSS PATTY WITH LEFT CROSSBAR;So;0;ON;;;;;N;;;;; +2E52;TIRONIAN SIGN CAPITAL ET;Po;0;ON;;;;;N;;;;; +2E53;MEDIEVAL EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +2E54;MEDIEVAL QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E55;LEFT SQUARE BRACKET WITH STROKE;Ps;0;ON;;;;;Y;;;;; +2E56;RIGHT SQUARE BRACKET WITH STROKE;Pe;0;ON;;;;;Y;;;;; +2E57;LEFT SQUARE BRACKET WITH DOUBLE STROKE;Ps;0;ON;;;;;Y;;;;; +2E58;RIGHT SQUARE BRACKET WITH DOUBLE STROKE;Pe;0;ON;;;;;Y;;;;; +2E59;TOP HALF LEFT PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E5A;TOP HALF RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E5B;BOTTOM HALF LEFT PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E5C;BOTTOM HALF RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E5D;OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; +2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; +2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; +2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; +2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; +2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; +2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; +2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; +2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; +2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; +2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; +2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; +2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; +2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; +2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; +2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; +2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; +2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; +2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; +2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; +2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; +2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; +2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; +2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; +2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; +2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; +2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; +2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; +2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; +2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; +2E9F;CJK RADICAL MOTHER;So;0;ON; 6BCD;;;;N;;;;; +2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; +2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; +2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; +2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; +2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; +2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; +2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; +2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; +2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; +2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; +2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; +2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; +2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; +2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; +2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; +2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; +2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; +2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; +2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; +2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; +2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; +2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; +2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; +2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; +2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; +2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; +2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; +2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; +2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; +2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; +2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; +2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; +2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; +2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; +2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; +2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; +2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; +2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; +2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; +2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; +2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; +2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; +2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; +2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; +2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; +2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; +2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; +2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; +2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; +2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; +2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; +2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; +2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; +2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; +2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; +2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; +2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; +2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; +2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; +2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; +2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; +2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; +2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; +2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; +2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; +2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; +2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; +2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; +2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; +2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; +2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; +2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; +2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; +2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; +2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; +2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; +2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; +2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON; 9F9F;;;;N;;;;; +2F00;KANGXI RADICAL ONE;So;0;ON; 4E00;;;;N;;;;; +2F01;KANGXI RADICAL LINE;So;0;ON; 4E28;;;;N;;;;; +2F02;KANGXI RADICAL DOT;So;0;ON; 4E36;;;;N;;;;; +2F03;KANGXI RADICAL SLASH;So;0;ON; 4E3F;;;;N;;;;; +2F04;KANGXI RADICAL SECOND;So;0;ON; 4E59;;;;N;;;;; +2F05;KANGXI RADICAL HOOK;So;0;ON; 4E85;;;;N;;;;; +2F06;KANGXI RADICAL TWO;So;0;ON; 4E8C;;;;N;;;;; +2F07;KANGXI RADICAL LID;So;0;ON; 4EA0;;;;N;;;;; +2F08;KANGXI RADICAL MAN;So;0;ON; 4EBA;;;;N;;;;; +2F09;KANGXI RADICAL LEGS;So;0;ON; 513F;;;;N;;;;; +2F0A;KANGXI RADICAL ENTER;So;0;ON; 5165;;;;N;;;;; +2F0B;KANGXI RADICAL EIGHT;So;0;ON; 516B;;;;N;;;;; +2F0C;KANGXI RADICAL DOWN BOX;So;0;ON; 5182;;;;N;;;;; +2F0D;KANGXI RADICAL COVER;So;0;ON; 5196;;;;N;;;;; +2F0E;KANGXI RADICAL ICE;So;0;ON; 51AB;;;;N;;;;; +2F0F;KANGXI RADICAL TABLE;So;0;ON; 51E0;;;;N;;;;; +2F10;KANGXI RADICAL OPEN BOX;So;0;ON; 51F5;;;;N;;;;; +2F11;KANGXI RADICAL KNIFE;So;0;ON; 5200;;;;N;;;;; +2F12;KANGXI RADICAL POWER;So;0;ON; 529B;;;;N;;;;; +2F13;KANGXI RADICAL WRAP;So;0;ON; 52F9;;;;N;;;;; +2F14;KANGXI RADICAL SPOON;So;0;ON; 5315;;;;N;;;;; +2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON; 531A;;;;N;;;;; +2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON; 5338;;;;N;;;;; +2F17;KANGXI RADICAL TEN;So;0;ON; 5341;;;;N;;;;; +2F18;KANGXI RADICAL DIVINATION;So;0;ON; 535C;;;;N;;;;; +2F19;KANGXI RADICAL SEAL;So;0;ON; 5369;;;;N;;;;; +2F1A;KANGXI RADICAL CLIFF;So;0;ON; 5382;;;;N;;;;; +2F1B;KANGXI RADICAL PRIVATE;So;0;ON; 53B6;;;;N;;;;; +2F1C;KANGXI RADICAL AGAIN;So;0;ON; 53C8;;;;N;;;;; +2F1D;KANGXI RADICAL MOUTH;So;0;ON; 53E3;;;;N;;;;; +2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON; 56D7;;;;N;;;;; +2F1F;KANGXI RADICAL EARTH;So;0;ON; 571F;;;;N;;;;; +2F20;KANGXI RADICAL SCHOLAR;So;0;ON; 58EB;;;;N;;;;; +2F21;KANGXI RADICAL GO;So;0;ON; 5902;;;;N;;;;; +2F22;KANGXI RADICAL GO SLOWLY;So;0;ON; 590A;;;;N;;;;; +2F23;KANGXI RADICAL EVENING;So;0;ON; 5915;;;;N;;;;; +2F24;KANGXI RADICAL BIG;So;0;ON; 5927;;;;N;;;;; +2F25;KANGXI RADICAL WOMAN;So;0;ON; 5973;;;;N;;;;; +2F26;KANGXI RADICAL CHILD;So;0;ON; 5B50;;;;N;;;;; +2F27;KANGXI RADICAL ROOF;So;0;ON; 5B80;;;;N;;;;; +2F28;KANGXI RADICAL INCH;So;0;ON; 5BF8;;;;N;;;;; +2F29;KANGXI RADICAL SMALL;So;0;ON; 5C0F;;;;N;;;;; +2F2A;KANGXI RADICAL LAME;So;0;ON; 5C22;;;;N;;;;; +2F2B;KANGXI RADICAL CORPSE;So;0;ON; 5C38;;;;N;;;;; +2F2C;KANGXI RADICAL SPROUT;So;0;ON; 5C6E;;;;N;;;;; +2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON; 5C71;;;;N;;;;; +2F2E;KANGXI RADICAL RIVER;So;0;ON; 5DDB;;;;N;;;;; +2F2F;KANGXI RADICAL WORK;So;0;ON; 5DE5;;;;N;;;;; +2F30;KANGXI RADICAL ONESELF;So;0;ON; 5DF1;;;;N;;;;; +2F31;KANGXI RADICAL TURBAN;So;0;ON; 5DFE;;;;N;;;;; +2F32;KANGXI RADICAL DRY;So;0;ON; 5E72;;;;N;;;;; +2F33;KANGXI RADICAL SHORT THREAD;So;0;ON; 5E7A;;;;N;;;;; +2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON; 5E7F;;;;N;;;;; +2F35;KANGXI RADICAL LONG STRIDE;So;0;ON; 5EF4;;;;N;;;;; +2F36;KANGXI RADICAL TWO HANDS;So;0;ON; 5EFE;;;;N;;;;; +2F37;KANGXI RADICAL SHOOT;So;0;ON; 5F0B;;;;N;;;;; +2F38;KANGXI RADICAL BOW;So;0;ON; 5F13;;;;N;;;;; +2F39;KANGXI RADICAL SNOUT;So;0;ON; 5F50;;;;N;;;;; +2F3A;KANGXI RADICAL BRISTLE;So;0;ON; 5F61;;;;N;;;;; +2F3B;KANGXI RADICAL STEP;So;0;ON; 5F73;;;;N;;;;; +2F3C;KANGXI RADICAL HEART;So;0;ON; 5FC3;;;;N;;;;; +2F3D;KANGXI RADICAL HALBERD;So;0;ON; 6208;;;;N;;;;; +2F3E;KANGXI RADICAL DOOR;So;0;ON; 6236;;;;N;;;;; +2F3F;KANGXI RADICAL HAND;So;0;ON; 624B;;;;N;;;;; +2F40;KANGXI RADICAL BRANCH;So;0;ON; 652F;;;;N;;;;; +2F41;KANGXI RADICAL RAP;So;0;ON; 6534;;;;N;;;;; +2F42;KANGXI RADICAL SCRIPT;So;0;ON; 6587;;;;N;;;;; +2F43;KANGXI RADICAL DIPPER;So;0;ON; 6597;;;;N;;;;; +2F44;KANGXI RADICAL AXE;So;0;ON; 65A4;;;;N;;;;; +2F45;KANGXI RADICAL SQUARE;So;0;ON; 65B9;;;;N;;;;; +2F46;KANGXI RADICAL NOT;So;0;ON; 65E0;;;;N;;;;; +2F47;KANGXI RADICAL SUN;So;0;ON; 65E5;;;;N;;;;; +2F48;KANGXI RADICAL SAY;So;0;ON; 66F0;;;;N;;;;; +2F49;KANGXI RADICAL MOON;So;0;ON; 6708;;;;N;;;;; +2F4A;KANGXI RADICAL TREE;So;0;ON; 6728;;;;N;;;;; +2F4B;KANGXI RADICAL LACK;So;0;ON; 6B20;;;;N;;;;; +2F4C;KANGXI RADICAL STOP;So;0;ON; 6B62;;;;N;;;;; +2F4D;KANGXI RADICAL DEATH;So;0;ON; 6B79;;;;N;;;;; +2F4E;KANGXI RADICAL WEAPON;So;0;ON; 6BB3;;;;N;;;;; +2F4F;KANGXI RADICAL DO NOT;So;0;ON; 6BCB;;;;N;;;;; +2F50;KANGXI RADICAL COMPARE;So;0;ON; 6BD4;;;;N;;;;; +2F51;KANGXI RADICAL FUR;So;0;ON; 6BDB;;;;N;;;;; +2F52;KANGXI RADICAL CLAN;So;0;ON; 6C0F;;;;N;;;;; +2F53;KANGXI RADICAL STEAM;So;0;ON; 6C14;;;;N;;;;; +2F54;KANGXI RADICAL WATER;So;0;ON; 6C34;;;;N;;;;; +2F55;KANGXI RADICAL FIRE;So;0;ON; 706B;;;;N;;;;; +2F56;KANGXI RADICAL CLAW;So;0;ON; 722A;;;;N;;;;; +2F57;KANGXI RADICAL FATHER;So;0;ON; 7236;;;;N;;;;; +2F58;KANGXI RADICAL DOUBLE X;So;0;ON; 723B;;;;N;;;;; +2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON; 723F;;;;N;;;;; +2F5A;KANGXI RADICAL SLICE;So;0;ON; 7247;;;;N;;;;; +2F5B;KANGXI RADICAL FANG;So;0;ON; 7259;;;;N;;;;; +2F5C;KANGXI RADICAL COW;So;0;ON; 725B;;;;N;;;;; +2F5D;KANGXI RADICAL DOG;So;0;ON; 72AC;;;;N;;;;; +2F5E;KANGXI RADICAL PROFOUND;So;0;ON; 7384;;;;N;;;;; +2F5F;KANGXI RADICAL JADE;So;0;ON; 7389;;;;N;;;;; +2F60;KANGXI RADICAL MELON;So;0;ON; 74DC;;;;N;;;;; +2F61;KANGXI RADICAL TILE;So;0;ON; 74E6;;;;N;;;;; +2F62;KANGXI RADICAL SWEET;So;0;ON; 7518;;;;N;;;;; +2F63;KANGXI RADICAL LIFE;So;0;ON; 751F;;;;N;;;;; +2F64;KANGXI RADICAL USE;So;0;ON; 7528;;;;N;;;;; +2F65;KANGXI RADICAL FIELD;So;0;ON; 7530;;;;N;;;;; +2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON; 758B;;;;N;;;;; +2F67;KANGXI RADICAL SICKNESS;So;0;ON; 7592;;;;N;;;;; +2F68;KANGXI RADICAL DOTTED TENT;So;0;ON; 7676;;;;N;;;;; +2F69;KANGXI RADICAL WHITE;So;0;ON; 767D;;;;N;;;;; +2F6A;KANGXI RADICAL SKIN;So;0;ON; 76AE;;;;N;;;;; +2F6B;KANGXI RADICAL DISH;So;0;ON; 76BF;;;;N;;;;; +2F6C;KANGXI RADICAL EYE;So;0;ON; 76EE;;;;N;;;;; +2F6D;KANGXI RADICAL SPEAR;So;0;ON; 77DB;;;;N;;;;; +2F6E;KANGXI RADICAL ARROW;So;0;ON; 77E2;;;;N;;;;; +2F6F;KANGXI RADICAL STONE;So;0;ON; 77F3;;;;N;;;;; +2F70;KANGXI RADICAL SPIRIT;So;0;ON; 793A;;;;N;;;;; +2F71;KANGXI RADICAL TRACK;So;0;ON; 79B8;;;;N;;;;; +2F72;KANGXI RADICAL GRAIN;So;0;ON; 79BE;;;;N;;;;; +2F73;KANGXI RADICAL CAVE;So;0;ON; 7A74;;;;N;;;;; +2F74;KANGXI RADICAL STAND;So;0;ON; 7ACB;;;;N;;;;; +2F75;KANGXI RADICAL BAMBOO;So;0;ON; 7AF9;;;;N;;;;; +2F76;KANGXI RADICAL RICE;So;0;ON; 7C73;;;;N;;;;; +2F77;KANGXI RADICAL SILK;So;0;ON; 7CF8;;;;N;;;;; +2F78;KANGXI RADICAL JAR;So;0;ON; 7F36;;;;N;;;;; +2F79;KANGXI RADICAL NET;So;0;ON; 7F51;;;;N;;;;; +2F7A;KANGXI RADICAL SHEEP;So;0;ON; 7F8A;;;;N;;;;; +2F7B;KANGXI RADICAL FEATHER;So;0;ON; 7FBD;;;;N;;;;; +2F7C;KANGXI RADICAL OLD;So;0;ON; 8001;;;;N;;;;; +2F7D;KANGXI RADICAL AND;So;0;ON; 800C;;;;N;;;;; +2F7E;KANGXI RADICAL PLOW;So;0;ON; 8012;;;;N;;;;; +2F7F;KANGXI RADICAL EAR;So;0;ON; 8033;;;;N;;;;; +2F80;KANGXI RADICAL BRUSH;So;0;ON; 807F;;;;N;;;;; +2F81;KANGXI RADICAL MEAT;So;0;ON; 8089;;;;N;;;;; +2F82;KANGXI RADICAL MINISTER;So;0;ON; 81E3;;;;N;;;;; +2F83;KANGXI RADICAL SELF;So;0;ON; 81EA;;;;N;;;;; +2F84;KANGXI RADICAL ARRIVE;So;0;ON; 81F3;;;;N;;;;; +2F85;KANGXI RADICAL MORTAR;So;0;ON; 81FC;;;;N;;;;; +2F86;KANGXI RADICAL TONGUE;So;0;ON; 820C;;;;N;;;;; +2F87;KANGXI RADICAL OPPOSE;So;0;ON; 821B;;;;N;;;;; +2F88;KANGXI RADICAL BOAT;So;0;ON; 821F;;;;N;;;;; +2F89;KANGXI RADICAL STOPPING;So;0;ON; 826E;;;;N;;;;; +2F8A;KANGXI RADICAL COLOR;So;0;ON; 8272;;;;N;;;;; +2F8B;KANGXI RADICAL GRASS;So;0;ON; 8278;;;;N;;;;; +2F8C;KANGXI RADICAL TIGER;So;0;ON; 864D;;;;N;;;;; +2F8D;KANGXI RADICAL INSECT;So;0;ON; 866B;;;;N;;;;; +2F8E;KANGXI RADICAL BLOOD;So;0;ON; 8840;;;;N;;;;; +2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON; 884C;;;;N;;;;; +2F90;KANGXI RADICAL CLOTHES;So;0;ON; 8863;;;;N;;;;; +2F91;KANGXI RADICAL WEST;So;0;ON; 897E;;;;N;;;;; +2F92;KANGXI RADICAL SEE;So;0;ON; 898B;;;;N;;;;; +2F93;KANGXI RADICAL HORN;So;0;ON; 89D2;;;;N;;;;; +2F94;KANGXI RADICAL SPEECH;So;0;ON; 8A00;;;;N;;;;; +2F95;KANGXI RADICAL VALLEY;So;0;ON; 8C37;;;;N;;;;; +2F96;KANGXI RADICAL BEAN;So;0;ON; 8C46;;;;N;;;;; +2F97;KANGXI RADICAL PIG;So;0;ON; 8C55;;;;N;;;;; +2F98;KANGXI RADICAL BADGER;So;0;ON; 8C78;;;;N;;;;; +2F99;KANGXI RADICAL SHELL;So;0;ON; 8C9D;;;;N;;;;; +2F9A;KANGXI RADICAL RED;So;0;ON; 8D64;;;;N;;;;; +2F9B;KANGXI RADICAL RUN;So;0;ON; 8D70;;;;N;;;;; +2F9C;KANGXI RADICAL FOOT;So;0;ON; 8DB3;;;;N;;;;; +2F9D;KANGXI RADICAL BODY;So;0;ON; 8EAB;;;;N;;;;; +2F9E;KANGXI RADICAL CART;So;0;ON; 8ECA;;;;N;;;;; +2F9F;KANGXI RADICAL BITTER;So;0;ON; 8F9B;;;;N;;;;; +2FA0;KANGXI RADICAL MORNING;So;0;ON; 8FB0;;;;N;;;;; +2FA1;KANGXI RADICAL WALK;So;0;ON; 8FB5;;;;N;;;;; +2FA2;KANGXI RADICAL CITY;So;0;ON; 9091;;;;N;;;;; +2FA3;KANGXI RADICAL WINE;So;0;ON; 9149;;;;N;;;;; +2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON; 91C6;;;;N;;;;; +2FA5;KANGXI RADICAL VILLAGE;So;0;ON; 91CC;;;;N;;;;; +2FA6;KANGXI RADICAL GOLD;So;0;ON; 91D1;;;;N;;;;; +2FA7;KANGXI RADICAL LONG;So;0;ON; 9577;;;;N;;;;; +2FA8;KANGXI RADICAL GATE;So;0;ON; 9580;;;;N;;;;; +2FA9;KANGXI RADICAL MOUND;So;0;ON; 961C;;;;N;;;;; +2FAA;KANGXI RADICAL SLAVE;So;0;ON; 96B6;;;;N;;;;; +2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON; 96B9;;;;N;;;;; +2FAC;KANGXI RADICAL RAIN;So;0;ON; 96E8;;;;N;;;;; +2FAD;KANGXI RADICAL BLUE;So;0;ON; 9751;;;;N;;;;; +2FAE;KANGXI RADICAL WRONG;So;0;ON; 975E;;;;N;;;;; +2FAF;KANGXI RADICAL FACE;So;0;ON; 9762;;;;N;;;;; +2FB0;KANGXI RADICAL LEATHER;So;0;ON; 9769;;;;N;;;;; +2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON; 97CB;;;;N;;;;; +2FB2;KANGXI RADICAL LEEK;So;0;ON; 97ED;;;;N;;;;; +2FB3;KANGXI RADICAL SOUND;So;0;ON; 97F3;;;;N;;;;; +2FB4;KANGXI RADICAL LEAF;So;0;ON; 9801;;;;N;;;;; +2FB5;KANGXI RADICAL WIND;So;0;ON; 98A8;;;;N;;;;; +2FB6;KANGXI RADICAL FLY;So;0;ON; 98DB;;;;N;;;;; +2FB7;KANGXI RADICAL EAT;So;0;ON; 98DF;;;;N;;;;; +2FB8;KANGXI RADICAL HEAD;So;0;ON; 9996;;;;N;;;;; +2FB9;KANGXI RADICAL FRAGRANT;So;0;ON; 9999;;;;N;;;;; +2FBA;KANGXI RADICAL HORSE;So;0;ON; 99AC;;;;N;;;;; +2FBB;KANGXI RADICAL BONE;So;0;ON; 9AA8;;;;N;;;;; +2FBC;KANGXI RADICAL TALL;So;0;ON; 9AD8;;;;N;;;;; +2FBD;KANGXI RADICAL HAIR;So;0;ON; 9ADF;;;;N;;;;; +2FBE;KANGXI RADICAL FIGHT;So;0;ON; 9B25;;;;N;;;;; +2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON; 9B2F;;;;N;;;;; +2FC0;KANGXI RADICAL CAULDRON;So;0;ON; 9B32;;;;N;;;;; +2FC1;KANGXI RADICAL GHOST;So;0;ON; 9B3C;;;;N;;;;; +2FC2;KANGXI RADICAL FISH;So;0;ON; 9B5A;;;;N;;;;; +2FC3;KANGXI RADICAL BIRD;So;0;ON; 9CE5;;;;N;;;;; +2FC4;KANGXI RADICAL SALT;So;0;ON; 9E75;;;;N;;;;; +2FC5;KANGXI RADICAL DEER;So;0;ON; 9E7F;;;;N;;;;; +2FC6;KANGXI RADICAL WHEAT;So;0;ON; 9EA5;;;;N;;;;; +2FC7;KANGXI RADICAL HEMP;So;0;ON; 9EBB;;;;N;;;;; +2FC8;KANGXI RADICAL YELLOW;So;0;ON; 9EC3;;;;N;;;;; +2FC9;KANGXI RADICAL MILLET;So;0;ON; 9ECD;;;;N;;;;; +2FCA;KANGXI RADICAL BLACK;So;0;ON; 9ED1;;;;N;;;;; +2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON; 9EF9;;;;N;;;;; +2FCC;KANGXI RADICAL FROG;So;0;ON; 9EFD;;;;N;;;;; +2FCD;KANGXI RADICAL TRIPOD;So;0;ON; 9F0E;;;;N;;;;; +2FCE;KANGXI RADICAL DRUM;So;0;ON; 9F13;;;;N;;;;; +2FCF;KANGXI RADICAL RAT;So;0;ON; 9F20;;;;N;;;;; +2FD0;KANGXI RADICAL NOSE;So;0;ON; 9F3B;;;;N;;;;; +2FD1;KANGXI RADICAL EVEN;So;0;ON; 9F4A;;;;N;;;;; +2FD2;KANGXI RADICAL TOOTH;So;0;ON; 9F52;;;;N;;;;; +2FD3;KANGXI RADICAL DRAGON;So;0;ON; 9F8D;;;;N;;;;; +2FD4;KANGXI RADICAL TURTLE;So;0;ON; 9F9C;;;;N;;;;; +2FD5;KANGXI RADICAL FLUTE;So;0;ON; 9FA0;;;;N;;;;; +2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; +2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; +2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; +2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; +2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; +2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; +2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; +2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; +2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; +2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; +2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; +2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; +2FFC;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM RIGHT;So;0;ON;;;;;N;;;;; +2FFD;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER RIGHT;So;0;ON;;;;;N;;;;; +2FFE;IDEOGRAPHIC DESCRIPTION CHARACTER HORIZONTAL REFLECTION;So;0;ON;;;;;N;;;;; +2FFF;IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION;So;0;ON;;;;;N;;;;; +3000;IDEOGRAPHIC SPACE;Zs;0;WS; 0020;;;;N;;;;; +3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; +3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; +3003;DITTO MARK;Po;0;ON;;;;;N;;;;; +3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; +3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; +3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; +3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; +3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; +300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; +300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; +300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; +300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; +300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; +300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; +3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; +3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; +3012;POSTAL MARK;So;0;ON;;;;;N;;;;; +3013;GETA MARK;So;0;ON;;;;;N;;;;; +3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; +3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; +3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; +3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; +3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; +3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; +301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; +301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; +301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; +301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; +3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; +3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; +3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; +3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; +3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; +3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; +3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; +3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; +3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; +302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; +302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; +302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; +302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; +302E;HANGUL SINGLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +302F;HANGUL DOUBLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; +3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; +3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; +3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; +3036;CIRCLED POSTAL MARK;So;0;ON; 3012;;;;N;;;;; +3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; +3038;HANGZHOU NUMERAL TEN;Nl;0;L; 5341;;;10;N;;;;; +3039;HANGZHOU NUMERAL TWENTY;Nl;0;L; 5344;;;20;N;;;;; +303A;HANGZHOU NUMERAL THIRTY;Nl;0;L; 5345;;;30;N;;;;; +303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +303C;MASU MARK;Lo;0;L;;;;;N;;;;; +303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; +303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; +303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; +3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; +3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; +3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; +3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; +3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; +304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; +304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; +304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; +304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; +304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; +3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; +3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; +3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; +3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; +3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; +3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; +3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; +3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; +3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; +3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; +305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; +305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; +305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; +305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; +305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; +305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; +3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; +3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; +3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; +3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; +3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; +3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; +3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; +3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; +3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; +306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; +306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; +306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; +306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; +306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; +306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; +3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; +3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; +3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; +3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; +3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; +3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; +3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; +3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; +3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; +3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; +307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; +307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; +307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; +307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; +307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; +307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; +3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; +3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; +3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; +3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; +3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; +3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; +3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; +308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; +308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; +308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; +308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; +308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; +3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; +3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; +3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; +3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; +3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; +3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; +309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; +309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON; 0020 3099;;;;N;;;;; +309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON; 0020 309A;;;;N;;;;; +309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; +309F;HIRAGANA DIGRAPH YORI;Lo;0;L; 3088 308A;;;;N;;;;; +30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; +30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; +30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; +30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; +30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; +30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; +30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; +30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; +30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; +30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; +30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; +30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; +30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; +30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; +30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; +30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; +30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; +30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; +30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; +30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; +30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; +30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; +30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; +30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; +30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; +30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; +30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; +30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; +30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; +30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; +30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; +30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; +30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; +30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; +30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; +30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; +30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; +30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; +30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; +30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; +30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; +30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; +30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; +30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; +30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; +30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; +30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; +30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; +30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; +30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; +30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; +30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; +30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; +30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; +30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; +30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; +30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; +30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; +30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; +30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; +30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; +30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; +30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; +30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; +30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; +30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; +30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; +30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; +30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; +30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; +30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; +30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; +30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; +30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; +30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; +30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; +30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; +30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; +30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; +30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; +30FF;KATAKANA DIGRAPH KOTO;Lo;0;L; 30B3 30C8;;;;N;;;;; +3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; +3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; +3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; +3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; +3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; +310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; +310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; +310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; +310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; +310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; +310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; +3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; +3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; +3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; +3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; +3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; +3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; +3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; +3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; +3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; +3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; +311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; +311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; +311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; +311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; +311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; +311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; +3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; +3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; +3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; +3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; +3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; +3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; +3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; +3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; +3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; +3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; +312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; +312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; +312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; +312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; +312E;BOPOMOFO LETTER O WITH DOT ABOVE;Lo;0;L;;;;;N;;;;; +312F;BOPOMOFO LETTER NN;Lo;0;L;;;;;N;;;;; +3131;HANGUL LETTER KIYEOK;Lo;0;L; 1100;;;;N;HANGUL LETTER GIYEOG;;;; +3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L; 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; +3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; +3134;HANGUL LETTER NIEUN;Lo;0;L; 1102;;;;N;;;;; +3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; +3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; +3137;HANGUL LETTER TIKEUT;Lo;0;L; 1103;;;;N;HANGUL LETTER DIGEUD;;;; +3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L; 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; +3139;HANGUL LETTER RIEUL;Lo;0;L; 1105;;;;N;HANGUL LETTER LIEUL;;;; +313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; +313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; +313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; +313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L; 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; +313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; +313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; +3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; +3141;HANGUL LETTER MIEUM;Lo;0;L; 1106;;;;N;;;;; +3142;HANGUL LETTER PIEUP;Lo;0;L; 1107;;;;N;HANGUL LETTER BIEUB;;;; +3143;HANGUL LETTER SSANGPIEUP;Lo;0;L; 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; +3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L; 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; +3145;HANGUL LETTER SIOS;Lo;0;L; 1109;;;;N;;;;; +3146;HANGUL LETTER SSANGSIOS;Lo;0;L; 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; +3147;HANGUL LETTER IEUNG;Lo;0;L; 110B;;;;N;;;;; +3148;HANGUL LETTER CIEUC;Lo;0;L; 110C;;;;N;HANGUL LETTER JIEUJ;;;; +3149;HANGUL LETTER SSANGCIEUC;Lo;0;L; 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; +314A;HANGUL LETTER CHIEUCH;Lo;0;L; 110E;;;;N;HANGUL LETTER CIEUC;;;; +314B;HANGUL LETTER KHIEUKH;Lo;0;L; 110F;;;;N;HANGUL LETTER KIYEOK;;;; +314C;HANGUL LETTER THIEUTH;Lo;0;L; 1110;;;;N;HANGUL LETTER TIEUT;;;; +314D;HANGUL LETTER PHIEUPH;Lo;0;L; 1111;;;;N;HANGUL LETTER PIEUP;;;; +314E;HANGUL LETTER HIEUH;Lo;0;L; 1112;;;;N;;;;; +314F;HANGUL LETTER A;Lo;0;L; 1161;;;;N;;;;; +3150;HANGUL LETTER AE;Lo;0;L; 1162;;;;N;;;;; +3151;HANGUL LETTER YA;Lo;0;L; 1163;;;;N;;;;; +3152;HANGUL LETTER YAE;Lo;0;L; 1164;;;;N;;;;; +3153;HANGUL LETTER EO;Lo;0;L; 1165;;;;N;;;;; +3154;HANGUL LETTER E;Lo;0;L; 1166;;;;N;;;;; +3155;HANGUL LETTER YEO;Lo;0;L; 1167;;;;N;;;;; +3156;HANGUL LETTER YE;Lo;0;L; 1168;;;;N;;;;; +3157;HANGUL LETTER O;Lo;0;L; 1169;;;;N;;;;; +3158;HANGUL LETTER WA;Lo;0;L; 116A;;;;N;;;;; +3159;HANGUL LETTER WAE;Lo;0;L; 116B;;;;N;;;;; +315A;HANGUL LETTER OE;Lo;0;L; 116C;;;;N;;;;; +315B;HANGUL LETTER YO;Lo;0;L; 116D;;;;N;;;;; +315C;HANGUL LETTER U;Lo;0;L; 116E;;;;N;;;;; +315D;HANGUL LETTER WEO;Lo;0;L; 116F;;;;N;;;;; +315E;HANGUL LETTER WE;Lo;0;L; 1170;;;;N;;;;; +315F;HANGUL LETTER WI;Lo;0;L; 1171;;;;N;;;;; +3160;HANGUL LETTER YU;Lo;0;L; 1172;;;;N;;;;; +3161;HANGUL LETTER EU;Lo;0;L; 1173;;;;N;;;;; +3162;HANGUL LETTER YI;Lo;0;L; 1174;;;;N;;;;; +3163;HANGUL LETTER I;Lo;0;L; 1175;;;;N;;;;; +3164;HANGUL FILLER;Lo;0;L; 1160;;;;N;HANGUL CAE OM;;;; +3165;HANGUL LETTER SSANGNIEUN;Lo;0;L; 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; +3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L; 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; +3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L; 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; +3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L; 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; +3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L; 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; +316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L; 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; +316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L; 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; +316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L; 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; +316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L; 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; +316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L; 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; +316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L; 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; +3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L; 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; +3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L; 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; +3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L; 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; +3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L; 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; +3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L; 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; +3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L; 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; +3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L; 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; +3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L; 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; +3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L; 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; +3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L; 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; +317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L; 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; +317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L; 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; +317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L; 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; +317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L; 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; +317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L; 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; +317F;HANGUL LETTER PANSIOS;Lo;0;L; 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; +3180;HANGUL LETTER SSANGIEUNG;Lo;0;L; 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; +3181;HANGUL LETTER YESIEUNG;Lo;0;L; 114C;;;;N;HANGUL LETTER NGIEUNG;;;; +3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L; 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; +3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L; 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; +3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L; 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; +3185;HANGUL LETTER SSANGHIEUH;Lo;0;L; 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; +3186;HANGUL LETTER YEORINHIEUH;Lo;0;L; 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; +3187;HANGUL LETTER YO-YA;Lo;0;L; 1184;;;;N;HANGUL LETTER YOYA;;;; +3188;HANGUL LETTER YO-YAE;Lo;0;L; 1185;;;;N;HANGUL LETTER YOYAE;;;; +3189;HANGUL LETTER YO-I;Lo;0;L; 1188;;;;N;HANGUL LETTER YOI;;;; +318A;HANGUL LETTER YU-YEO;Lo;0;L; 1191;;;;N;HANGUL LETTER YUYEO;;;; +318B;HANGUL LETTER YU-YE;Lo;0;L; 1192;;;;N;HANGUL LETTER YUYE;;;; +318C;HANGUL LETTER YU-I;Lo;0;L; 1194;;;;N;HANGUL LETTER YUI;;;; +318D;HANGUL LETTER ARAEA;Lo;0;L; 119E;;;;N;HANGUL LETTER ALAE A;;;; +318E;HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; +3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;; +3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;; +3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L; 4E00;;;1;N;KAERITEN ITI;;;; +3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L; 4E8C;;;2;N;KAERITEN NI;;;; +3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L; 4E09;;;3;N;KAERITEN SAN;;;; +3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L; 56DB;;;4;N;KAERITEN SI;;;; +3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L; 4E0A;;;;N;KAERITEN ZYOU;;;; +3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L; 4E2D;;;;N;KAERITEN TYUU;;;; +3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L; 4E0B;;;;N;KAERITEN GE;;;; +3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L; 7532;;;;N;KAERITEN KOU;;;; +319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L; 4E59;;;;N;KAERITEN OTU;;;; +319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L; 4E19;;;;N;KAERITEN HEI;;;; +319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L; 4E01;;;;N;KAERITEN TEI;;;; +319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L; 5929;;;;N;KAERITEN TEN;;;; +319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L; 5730;;;;N;KAERITEN TI;;;; +319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L; 4EBA;;;;N;KAERITEN ZIN;;;; +31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; +31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; +31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; +31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; +31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; +31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; +31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; +31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; +31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; +31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; +31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; +31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; +31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; +31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; +31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; +31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; +31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; +31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; +31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; +31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; +31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; +31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; +31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; +31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;; +31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;; +31BA;BOPOMOFO LETTER ZY;Lo;0;L;;;;;N;;;;; +31BB;BOPOMOFO FINAL LETTER G;Lo;0;L;;;;;N;;;;; +31BC;BOPOMOFO LETTER GW;Lo;0;L;;;;;N;;;;; +31BD;BOPOMOFO LETTER KW;Lo;0;L;;;;;N;;;;; +31BE;BOPOMOFO LETTER OE;Lo;0;L;;;;;N;;;;; +31BF;BOPOMOFO LETTER AH;Lo;0;L;;;;;N;;;;; +31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; +31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; +31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; +31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; +31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; +31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; +31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; +31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; +31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; +31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; +31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; +31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; +31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; +31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; +31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; +31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; +31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; +31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; +31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; +31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; +31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; +31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; +31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; +31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; +31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; +31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; +31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; +31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; +31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; +31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; +31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; +31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; +31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; +31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; +31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; +31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; +31E4;CJK STROKE HXG;So;0;ON;;;;;N;;;;; +31E5;CJK STROKE SZP;So;0;ON;;;;;N;;;;; +31EF;IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION;So;0;ON;;;;;N;;;;; +31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; +31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; +31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; +31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; +31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; +31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; +31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; +31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; +31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; +31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; +31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; +31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; +31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; +31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; +31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; +31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; +3200;PARENTHESIZED HANGUL KIYEOK;So;0;L; 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; +3201;PARENTHESIZED HANGUL NIEUN;So;0;L; 0028 1102 0029;;;;N;;;;; +3202;PARENTHESIZED HANGUL TIKEUT;So;0;L; 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; +3203;PARENTHESIZED HANGUL RIEUL;So;0;L; 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; +3204;PARENTHESIZED HANGUL MIEUM;So;0;L; 0028 1106 0029;;;;N;;;;; +3205;PARENTHESIZED HANGUL PIEUP;So;0;L; 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; +3206;PARENTHESIZED HANGUL SIOS;So;0;L; 0028 1109 0029;;;;N;;;;; +3207;PARENTHESIZED HANGUL IEUNG;So;0;L; 0028 110B 0029;;;;N;;;;; +3208;PARENTHESIZED HANGUL CIEUC;So;0;L; 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; +3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L; 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; +320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L; 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; +320B;PARENTHESIZED HANGUL THIEUTH;So;0;L; 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; +320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L; 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; +320D;PARENTHESIZED HANGUL HIEUH;So;0;L; 0028 1112 0029;;;;N;;;;; +320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L; 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; +320F;PARENTHESIZED HANGUL NIEUN A;So;0;L; 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; +3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L; 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; +3211;PARENTHESIZED HANGUL RIEUL A;So;0;L; 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; +3212;PARENTHESIZED HANGUL MIEUM A;So;0;L; 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; +3213;PARENTHESIZED HANGUL PIEUP A;So;0;L; 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; +3214;PARENTHESIZED HANGUL SIOS A;So;0;L; 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; +3215;PARENTHESIZED HANGUL IEUNG A;So;0;L; 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; +3216;PARENTHESIZED HANGUL CIEUC A;So;0;L; 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; +3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L; 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; +3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L; 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; +3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L; 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; +321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L; 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; +321B;PARENTHESIZED HANGUL HIEUH A;So;0;L; 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; +321C;PARENTHESIZED HANGUL CIEUC U;So;0;L; 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; +321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON; 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; +321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON; 0028 110B 1169 1112 116E 0029;;;;N;;;;; +3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L; 0028 4E00 0029;;;1;N;;;;; +3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L; 0028 4E8C 0029;;;2;N;;;;; +3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L; 0028 4E09 0029;;;3;N;;;;; +3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L; 0028 56DB 0029;;;4;N;;;;; +3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L; 0028 4E94 0029;;;5;N;;;;; +3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L; 0028 516D 0029;;;6;N;;;;; +3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L; 0028 4E03 0029;;;7;N;;;;; +3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L; 0028 516B 0029;;;8;N;;;;; +3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L; 0028 4E5D 0029;;;9;N;;;;; +3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L; 0028 5341 0029;;;10;N;;;;; +322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L; 0028 6708 0029;;;;N;;;;; +322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L; 0028 706B 0029;;;;N;;;;; +322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L; 0028 6C34 0029;;;;N;;;;; +322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L; 0028 6728 0029;;;;N;;;;; +322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L; 0028 91D1 0029;;;;N;;;;; +322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L; 0028 571F 0029;;;;N;;;;; +3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L; 0028 65E5 0029;;;;N;;;;; +3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L; 0028 682A 0029;;;;N;;;;; +3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L; 0028 6709 0029;;;;N;;;;; +3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L; 0028 793E 0029;;;;N;;;;; +3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L; 0028 540D 0029;;;;N;;;;; +3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L; 0028 7279 0029;;;;N;;;;; +3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L; 0028 8CA1 0029;;;;N;;;;; +3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L; 0028 795D 0029;;;;N;;;;; +3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L; 0028 52B4 0029;;;;N;;;;; +3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L; 0028 4EE3 0029;;;;N;;;;; +323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L; 0028 547C 0029;;;;N;;;;; +323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L; 0028 5B66 0029;;;;N;;;;; +323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L; 0028 76E3 0029;;;;N;;;;; +323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L; 0028 4F01 0029;;;;N;;;;; +323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L; 0028 8CC7 0029;;;;N;;;;; +323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L; 0028 5354 0029;;;;N;;;;; +3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L; 0028 796D 0029;;;;N;;;;; +3241;PARENTHESIZED IDEOGRAPH REST;So;0;L; 0028 4F11 0029;;;;N;;;;; +3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L; 0028 81EA 0029;;;;N;;;;; +3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L; 0028 81F3 0029;;;;N;;;;; +3244;CIRCLED IDEOGRAPH QUESTION;So;0;L; 554F;;;;N;;;;; +3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L; 5E7C;;;;N;;;;; +3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L; 6587;;;;N;;;;; +3247;CIRCLED IDEOGRAPH KOTO;So;0;L; 7B8F;;;;N;;;;; +3248;CIRCLED NUMBER TEN ON BLACK SQUARE;No;0;L;;;;10;N;;;;; +3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;No;0;L;;;;20;N;;;;; +324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;No;0;L;;;;30;N;;;;; +324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;No;0;L;;;;40;N;;;;; +324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;No;0;L;;;;50;N;;;;; +324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;No;0;L;;;;60;N;;;;; +324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;No;0;L;;;;70;N;;;;; +324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;No;0;L;;;;80;N;;;;; +3250;PARTNERSHIP SIGN;So;0;ON; 0050 0054 0045;;;;N;;;;; +3251;CIRCLED NUMBER TWENTY ONE;No;0;ON; 0032 0031;;;21;N;;;;; +3252;CIRCLED NUMBER TWENTY TWO;No;0;ON; 0032 0032;;;22;N;;;;; +3253;CIRCLED NUMBER TWENTY THREE;No;0;ON; 0032 0033;;;23;N;;;;; +3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON; 0032 0034;;;24;N;;;;; +3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON; 0032 0035;;;25;N;;;;; +3256;CIRCLED NUMBER TWENTY SIX;No;0;ON; 0032 0036;;;26;N;;;;; +3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON; 0032 0037;;;27;N;;;;; +3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON; 0032 0038;;;28;N;;;;; +3259;CIRCLED NUMBER TWENTY NINE;No;0;ON; 0032 0039;;;29;N;;;;; +325A;CIRCLED NUMBER THIRTY;No;0;ON; 0033 0030;;;30;N;;;;; +325B;CIRCLED NUMBER THIRTY ONE;No;0;ON; 0033 0031;;;31;N;;;;; +325C;CIRCLED NUMBER THIRTY TWO;No;0;ON; 0033 0032;;;32;N;;;;; +325D;CIRCLED NUMBER THIRTY THREE;No;0;ON; 0033 0033;;;33;N;;;;; +325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON; 0033 0034;;;34;N;;;;; +325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON; 0033 0035;;;35;N;;;;; +3260;CIRCLED HANGUL KIYEOK;So;0;L; 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; +3261;CIRCLED HANGUL NIEUN;So;0;L; 1102;;;;N;;;;; +3262;CIRCLED HANGUL TIKEUT;So;0;L; 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; +3263;CIRCLED HANGUL RIEUL;So;0;L; 1105;;;;N;CIRCLED HANGUL LIEUL;;;; +3264;CIRCLED HANGUL MIEUM;So;0;L; 1106;;;;N;;;;; +3265;CIRCLED HANGUL PIEUP;So;0;L; 1107;;;;N;CIRCLED HANGUL BIEUB;;;; +3266;CIRCLED HANGUL SIOS;So;0;L; 1109;;;;N;;;;; +3267;CIRCLED HANGUL IEUNG;So;0;L; 110B;;;;N;;;;; +3268;CIRCLED HANGUL CIEUC;So;0;L; 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; +3269;CIRCLED HANGUL CHIEUCH;So;0;L; 110E;;;;N;CIRCLED HANGUL CIEUC;;;; +326A;CIRCLED HANGUL KHIEUKH;So;0;L; 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; +326B;CIRCLED HANGUL THIEUTH;So;0;L; 1110;;;;N;CIRCLED HANGUL TIEUT;;;; +326C;CIRCLED HANGUL PHIEUPH;So;0;L; 1111;;;;N;CIRCLED HANGUL PIEUP;;;; +326D;CIRCLED HANGUL HIEUH;So;0;L; 1112;;;;N;;;;; +326E;CIRCLED HANGUL KIYEOK A;So;0;L; 1100 1161;;;;N;CIRCLED HANGUL GA;;;; +326F;CIRCLED HANGUL NIEUN A;So;0;L; 1102 1161;;;;N;CIRCLED HANGUL NA;;;; +3270;CIRCLED HANGUL TIKEUT A;So;0;L; 1103 1161;;;;N;CIRCLED HANGUL DA;;;; +3271;CIRCLED HANGUL RIEUL A;So;0;L; 1105 1161;;;;N;CIRCLED HANGUL LA;;;; +3272;CIRCLED HANGUL MIEUM A;So;0;L; 1106 1161;;;;N;CIRCLED HANGUL MA;;;; +3273;CIRCLED HANGUL PIEUP A;So;0;L; 1107 1161;;;;N;CIRCLED HANGUL BA;;;; +3274;CIRCLED HANGUL SIOS A;So;0;L; 1109 1161;;;;N;CIRCLED HANGUL SA;;;; +3275;CIRCLED HANGUL IEUNG A;So;0;L; 110B 1161;;;;N;CIRCLED HANGUL A;;;; +3276;CIRCLED HANGUL CIEUC A;So;0;L; 110C 1161;;;;N;CIRCLED HANGUL JA;;;; +3277;CIRCLED HANGUL CHIEUCH A;So;0;L; 110E 1161;;;;N;CIRCLED HANGUL CA;;;; +3278;CIRCLED HANGUL KHIEUKH A;So;0;L; 110F 1161;;;;N;CIRCLED HANGUL KA;;;; +3279;CIRCLED HANGUL THIEUTH A;So;0;L; 1110 1161;;;;N;CIRCLED HANGUL TA;;;; +327A;CIRCLED HANGUL PHIEUPH A;So;0;L; 1111 1161;;;;N;CIRCLED HANGUL PA;;;; +327B;CIRCLED HANGUL HIEUH A;So;0;L; 1112 1161;;;;N;CIRCLED HANGUL HA;;;; +327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON; 110E 1161 11B7 1100 1169;;;;N;;;;; +327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON; 110C 116E 110B 1174;;;;N;;;;; +327E;CIRCLED HANGUL IEUNG U;So;0;ON; 110B 116E;;;;N;;;;; +327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; +3280;CIRCLED IDEOGRAPH ONE;No;0;L; 4E00;;;1;N;;;;; +3281;CIRCLED IDEOGRAPH TWO;No;0;L; 4E8C;;;2;N;;;;; +3282;CIRCLED IDEOGRAPH THREE;No;0;L; 4E09;;;3;N;;;;; +3283;CIRCLED IDEOGRAPH FOUR;No;0;L; 56DB;;;4;N;;;;; +3284;CIRCLED IDEOGRAPH FIVE;No;0;L; 4E94;;;5;N;;;;; +3285;CIRCLED IDEOGRAPH SIX;No;0;L; 516D;;;6;N;;;;; +3286;CIRCLED IDEOGRAPH SEVEN;No;0;L; 4E03;;;7;N;;;;; +3287;CIRCLED IDEOGRAPH EIGHT;No;0;L; 516B;;;8;N;;;;; +3288;CIRCLED IDEOGRAPH NINE;No;0;L; 4E5D;;;9;N;;;;; +3289;CIRCLED IDEOGRAPH TEN;No;0;L; 5341;;;10;N;;;;; +328A;CIRCLED IDEOGRAPH MOON;So;0;L; 6708;;;;N;;;;; +328B;CIRCLED IDEOGRAPH FIRE;So;0;L; 706B;;;;N;;;;; +328C;CIRCLED IDEOGRAPH WATER;So;0;L; 6C34;;;;N;;;;; +328D;CIRCLED IDEOGRAPH WOOD;So;0;L; 6728;;;;N;;;;; +328E;CIRCLED IDEOGRAPH METAL;So;0;L; 91D1;;;;N;;;;; +328F;CIRCLED IDEOGRAPH EARTH;So;0;L; 571F;;;;N;;;;; +3290;CIRCLED IDEOGRAPH SUN;So;0;L; 65E5;;;;N;;;;; +3291;CIRCLED IDEOGRAPH STOCK;So;0;L; 682A;;;;N;;;;; +3292;CIRCLED IDEOGRAPH HAVE;So;0;L; 6709;;;;N;;;;; +3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L; 793E;;;;N;;;;; +3294;CIRCLED IDEOGRAPH NAME;So;0;L; 540D;;;;N;;;;; +3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L; 7279;;;;N;;;;; +3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L; 8CA1;;;;N;;;;; +3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L; 795D;;;;N;;;;; +3298;CIRCLED IDEOGRAPH LABOR;So;0;L; 52B4;;;;N;;;;; +3299;CIRCLED IDEOGRAPH SECRET;So;0;L; 79D8;;;;N;;;;; +329A;CIRCLED IDEOGRAPH MALE;So;0;L; 7537;;;;N;;;;; +329B;CIRCLED IDEOGRAPH FEMALE;So;0;L; 5973;;;;N;;;;; +329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L; 9069;;;;N;;;;; +329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L; 512A;;;;N;;;;; +329E;CIRCLED IDEOGRAPH PRINT;So;0;L; 5370;;;;N;;;;; +329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L; 6CE8;;;;N;;;;; +32A0;CIRCLED IDEOGRAPH ITEM;So;0;L; 9805;;;;N;;;;; +32A1;CIRCLED IDEOGRAPH REST;So;0;L; 4F11;;;;N;;;;; +32A2;CIRCLED IDEOGRAPH COPY;So;0;L; 5199;;;;N;;;;; +32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L; 6B63;;;;N;;;;; +32A4;CIRCLED IDEOGRAPH HIGH;So;0;L; 4E0A;;;;N;;;;; +32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L; 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; +32A6;CIRCLED IDEOGRAPH LOW;So;0;L; 4E0B;;;;N;;;;; +32A7;CIRCLED IDEOGRAPH LEFT;So;0;L; 5DE6;;;;N;;;;; +32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L; 53F3;;;;N;;;;; +32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L; 533B;;;;N;;;;; +32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L; 5B97;;;;N;;;;; +32AB;CIRCLED IDEOGRAPH STUDY;So;0;L; 5B66;;;;N;;;;; +32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L; 76E3;;;;N;;;;; +32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L; 4F01;;;;N;;;;; +32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L; 8CC7;;;;N;;;;; +32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L; 5354;;;;N;;;;; +32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L; 591C;;;;N;;;;; +32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON; 0033 0036;;;36;N;;;;; +32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON; 0033 0037;;;37;N;;;;; +32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON; 0033 0038;;;38;N;;;;; +32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON; 0033 0039;;;39;N;;;;; +32B5;CIRCLED NUMBER FORTY;No;0;ON; 0034 0030;;;40;N;;;;; +32B6;CIRCLED NUMBER FORTY ONE;No;0;ON; 0034 0031;;;41;N;;;;; +32B7;CIRCLED NUMBER FORTY TWO;No;0;ON; 0034 0032;;;42;N;;;;; +32B8;CIRCLED NUMBER FORTY THREE;No;0;ON; 0034 0033;;;43;N;;;;; +32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON; 0034 0034;;;44;N;;;;; +32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON; 0034 0035;;;45;N;;;;; +32BB;CIRCLED NUMBER FORTY SIX;No;0;ON; 0034 0036;;;46;N;;;;; +32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON; 0034 0037;;;47;N;;;;; +32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON; 0034 0038;;;48;N;;;;; +32BE;CIRCLED NUMBER FORTY NINE;No;0;ON; 0034 0039;;;49;N;;;;; +32BF;CIRCLED NUMBER FIFTY;No;0;ON; 0035 0030;;;50;N;;;;; +32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L; 0031 6708;;;;N;;;;; +32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L; 0032 6708;;;;N;;;;; +32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L; 0033 6708;;;;N;;;;; +32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L; 0034 6708;;;;N;;;;; +32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L; 0035 6708;;;;N;;;;; +32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L; 0036 6708;;;;N;;;;; +32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L; 0037 6708;;;;N;;;;; +32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L; 0038 6708;;;;N;;;;; +32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L; 0039 6708;;;;N;;;;; +32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L; 0031 0030 6708;;;;N;;;;; +32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L; 0031 0031 6708;;;;N;;;;; +32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L; 0031 0032 6708;;;;N;;;;; +32CC;SQUARE HG;So;0;ON; 0048 0067;;;;N;;;;; +32CD;SQUARE ERG;So;0;ON; 0065 0072 0067;;;;N;;;;; +32CE;SQUARE EV;So;0;ON; 0065 0056;;;;N;;;;; +32CF;LIMITED LIABILITY SIGN;So;0;ON; 004C 0054 0044;;;;N;;;;; +32D0;CIRCLED KATAKANA A;So;0;L; 30A2;;;;N;;;;; +32D1;CIRCLED KATAKANA I;So;0;L; 30A4;;;;N;;;;; +32D2;CIRCLED KATAKANA U;So;0;L; 30A6;;;;N;;;;; +32D3;CIRCLED KATAKANA E;So;0;L; 30A8;;;;N;;;;; +32D4;CIRCLED KATAKANA O;So;0;L; 30AA;;;;N;;;;; +32D5;CIRCLED KATAKANA KA;So;0;L; 30AB;;;;N;;;;; +32D6;CIRCLED KATAKANA KI;So;0;L; 30AD;;;;N;;;;; +32D7;CIRCLED KATAKANA KU;So;0;L; 30AF;;;;N;;;;; +32D8;CIRCLED KATAKANA KE;So;0;L; 30B1;;;;N;;;;; +32D9;CIRCLED KATAKANA KO;So;0;L; 30B3;;;;N;;;;; +32DA;CIRCLED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; +32DB;CIRCLED KATAKANA SI;So;0;L; 30B7;;;;N;;;;; +32DC;CIRCLED KATAKANA SU;So;0;L; 30B9;;;;N;;;;; +32DD;CIRCLED KATAKANA SE;So;0;L; 30BB;;;;N;;;;; +32DE;CIRCLED KATAKANA SO;So;0;L; 30BD;;;;N;;;;; +32DF;CIRCLED KATAKANA TA;So;0;L; 30BF;;;;N;;;;; +32E0;CIRCLED KATAKANA TI;So;0;L; 30C1;;;;N;;;;; +32E1;CIRCLED KATAKANA TU;So;0;L; 30C4;;;;N;;;;; +32E2;CIRCLED KATAKANA TE;So;0;L; 30C6;;;;N;;;;; +32E3;CIRCLED KATAKANA TO;So;0;L; 30C8;;;;N;;;;; +32E4;CIRCLED KATAKANA NA;So;0;L; 30CA;;;;N;;;;; +32E5;CIRCLED KATAKANA NI;So;0;L; 30CB;;;;N;;;;; +32E6;CIRCLED KATAKANA NU;So;0;L; 30CC;;;;N;;;;; +32E7;CIRCLED KATAKANA NE;So;0;L; 30CD;;;;N;;;;; +32E8;CIRCLED KATAKANA NO;So;0;L; 30CE;;;;N;;;;; +32E9;CIRCLED KATAKANA HA;So;0;L; 30CF;;;;N;;;;; +32EA;CIRCLED KATAKANA HI;So;0;L; 30D2;;;;N;;;;; +32EB;CIRCLED KATAKANA HU;So;0;L; 30D5;;;;N;;;;; +32EC;CIRCLED KATAKANA HE;So;0;L; 30D8;;;;N;;;;; +32ED;CIRCLED KATAKANA HO;So;0;L; 30DB;;;;N;;;;; +32EE;CIRCLED KATAKANA MA;So;0;L; 30DE;;;;N;;;;; +32EF;CIRCLED KATAKANA MI;So;0;L; 30DF;;;;N;;;;; +32F0;CIRCLED KATAKANA MU;So;0;L; 30E0;;;;N;;;;; +32F1;CIRCLED KATAKANA ME;So;0;L; 30E1;;;;N;;;;; +32F2;CIRCLED KATAKANA MO;So;0;L; 30E2;;;;N;;;;; +32F3;CIRCLED KATAKANA YA;So;0;L; 30E4;;;;N;;;;; +32F4;CIRCLED KATAKANA YU;So;0;L; 30E6;;;;N;;;;; +32F5;CIRCLED KATAKANA YO;So;0;L; 30E8;;;;N;;;;; +32F6;CIRCLED KATAKANA RA;So;0;L; 30E9;;;;N;;;;; +32F7;CIRCLED KATAKANA RI;So;0;L; 30EA;;;;N;;;;; +32F8;CIRCLED KATAKANA RU;So;0;L; 30EB;;;;N;;;;; +32F9;CIRCLED KATAKANA RE;So;0;L; 30EC;;;;N;;;;; +32FA;CIRCLED KATAKANA RO;So;0;L; 30ED;;;;N;;;;; +32FB;CIRCLED KATAKANA WA;So;0;L; 30EF;;;;N;;;;; +32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; +32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; +32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; +32FF;SQUARE ERA NAME REIWA;So;0;L; 4EE4 548C;;;;N;;;;; +3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; +3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; +3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; +3303;SQUARE AARU;So;0;L; 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; +3304;SQUARE ININGU;So;0;L; 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; +3305;SQUARE INTI;So;0;L; 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; +3306;SQUARE UON;So;0;L; 30A6 30A9 30F3;;;;N;SQUARED UON;;;; +3307;SQUARE ESUKUUDO;So;0;L; 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; +3308;SQUARE EEKAA;So;0;L; 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; +3309;SQUARE ONSU;So;0;L; 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; +330A;SQUARE OOMU;So;0;L; 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; +330B;SQUARE KAIRI;So;0;L; 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; +330C;SQUARE KARATTO;So;0;L; 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; +330D;SQUARE KARORII;So;0;L; 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; +330E;SQUARE GARON;So;0;L; 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; +330F;SQUARE GANMA;So;0;L; 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; +3310;SQUARE GIGA;So;0;L; 30AE 30AC;;;;N;SQUARED GIGA;;;; +3311;SQUARE GINII;So;0;L; 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; +3312;SQUARE KYURII;So;0;L; 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; +3313;SQUARE GIRUDAA;So;0;L; 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; +3314;SQUARE KIRO;So;0;L; 30AD 30ED;;;;N;SQUARED KIRO;;;; +3315;SQUARE KIROGURAMU;So;0;L; 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; +3316;SQUARE KIROMEETORU;So;0;L; 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; +3317;SQUARE KIROWATTO;So;0;L; 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; +3318;SQUARE GURAMU;So;0;L; 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; +3319;SQUARE GURAMUTON;So;0;L; 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; +331A;SQUARE KURUZEIRO;So;0;L; 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; +331B;SQUARE KUROONE;So;0;L; 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; +331C;SQUARE KEESU;So;0;L; 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; +331D;SQUARE KORUNA;So;0;L; 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; +331E;SQUARE KOOPO;So;0;L; 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; +331F;SQUARE SAIKURU;So;0;L; 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; +3320;SQUARE SANTIIMU;So;0;L; 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; +3321;SQUARE SIRINGU;So;0;L; 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; +3322;SQUARE SENTI;So;0;L; 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; +3323;SQUARE SENTO;So;0;L; 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; +3324;SQUARE DAASU;So;0;L; 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; +3325;SQUARE DESI;So;0;L; 30C7 30B7;;;;N;SQUARED DESI;;;; +3326;SQUARE DORU;So;0;L; 30C9 30EB;;;;N;SQUARED DORU;;;; +3327;SQUARE TON;So;0;L; 30C8 30F3;;;;N;SQUARED TON;;;; +3328;SQUARE NANO;So;0;L; 30CA 30CE;;;;N;SQUARED NANO;;;; +3329;SQUARE NOTTO;So;0;L; 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; +332A;SQUARE HAITU;So;0;L; 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; +332B;SQUARE PAASENTO;So;0;L; 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; +332C;SQUARE PAATU;So;0;L; 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; +332D;SQUARE BAARERU;So;0;L; 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; +332E;SQUARE PIASUTORU;So;0;L; 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; +332F;SQUARE PIKURU;So;0;L; 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; +3330;SQUARE PIKO;So;0;L; 30D4 30B3;;;;N;SQUARED PIKO;;;; +3331;SQUARE BIRU;So;0;L; 30D3 30EB;;;;N;SQUARED BIRU;;;; +3332;SQUARE HUARADDO;So;0;L; 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; +3333;SQUARE HUIITO;So;0;L; 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; +3334;SQUARE BUSSYERU;So;0;L; 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; +3335;SQUARE HURAN;So;0;L; 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; +3336;SQUARE HEKUTAARU;So;0;L; 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; +3337;SQUARE PESO;So;0;L; 30DA 30BD;;;;N;SQUARED PESO;;;; +3338;SQUARE PENIHI;So;0;L; 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; +3339;SQUARE HERUTU;So;0;L; 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; +333A;SQUARE PENSU;So;0;L; 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; +333B;SQUARE PEEZI;So;0;L; 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; +333C;SQUARE BEETA;So;0;L; 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; +333D;SQUARE POINTO;So;0;L; 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; +333E;SQUARE BORUTO;So;0;L; 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; +333F;SQUARE HON;So;0;L; 30DB 30F3;;;;N;SQUARED HON;;;; +3340;SQUARE PONDO;So;0;L; 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; +3341;SQUARE HOORU;So;0;L; 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; +3342;SQUARE HOON;So;0;L; 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; +3343;SQUARE MAIKURO;So;0;L; 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; +3344;SQUARE MAIRU;So;0;L; 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; +3345;SQUARE MAHHA;So;0;L; 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; +3346;SQUARE MARUKU;So;0;L; 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; +3347;SQUARE MANSYON;So;0;L; 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; +3348;SQUARE MIKURON;So;0;L; 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; +3349;SQUARE MIRI;So;0;L; 30DF 30EA;;;;N;SQUARED MIRI;;;; +334A;SQUARE MIRIBAARU;So;0;L; 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; +334B;SQUARE MEGA;So;0;L; 30E1 30AC;;;;N;SQUARED MEGA;;;; +334C;SQUARE MEGATON;So;0;L; 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; +334D;SQUARE MEETORU;So;0;L; 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; +334E;SQUARE YAADO;So;0;L; 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; +334F;SQUARE YAARU;So;0;L; 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; +3350;SQUARE YUAN;So;0;L; 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; +3351;SQUARE RITTORU;So;0;L; 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; +3352;SQUARE RIRA;So;0;L; 30EA 30E9;;;;N;SQUARED RIRA;;;; +3353;SQUARE RUPII;So;0;L; 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; +3354;SQUARE RUUBURU;So;0;L; 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; +3355;SQUARE REMU;So;0;L; 30EC 30E0;;;;N;SQUARED REMU;;;; +3356;SQUARE RENTOGEN;So;0;L; 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; +3357;SQUARE WATTO;So;0;L; 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; +3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L; 0030 70B9;;;;N;;;;; +3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L; 0031 70B9;;;;N;;;;; +335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L; 0032 70B9;;;;N;;;;; +335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L; 0033 70B9;;;;N;;;;; +335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L; 0034 70B9;;;;N;;;;; +335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L; 0035 70B9;;;;N;;;;; +335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L; 0036 70B9;;;;N;;;;; +335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L; 0037 70B9;;;;N;;;;; +3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L; 0038 70B9;;;;N;;;;; +3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L; 0039 70B9;;;;N;;;;; +3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L; 0031 0030 70B9;;;;N;;;;; +3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L; 0031 0031 70B9;;;;N;;;;; +3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L; 0031 0032 70B9;;;;N;;;;; +3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L; 0031 0033 70B9;;;;N;;;;; +3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L; 0031 0034 70B9;;;;N;;;;; +3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L; 0031 0035 70B9;;;;N;;;;; +3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L; 0031 0036 70B9;;;;N;;;;; +3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L; 0031 0037 70B9;;;;N;;;;; +336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L; 0031 0038 70B9;;;;N;;;;; +336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L; 0031 0039 70B9;;;;N;;;;; +336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L; 0032 0030 70B9;;;;N;;;;; +336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L; 0032 0031 70B9;;;;N;;;;; +336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L; 0032 0032 70B9;;;;N;;;;; +336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L; 0032 0033 70B9;;;;N;;;;; +3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L; 0032 0034 70B9;;;;N;;;;; +3371;SQUARE HPA;So;0;L; 0068 0050 0061;;;;N;;;;; +3372;SQUARE DA;So;0;L; 0064 0061;;;;N;;;;; +3373;SQUARE AU;So;0;L; 0041 0055;;;;N;;;;; +3374;SQUARE BAR;So;0;L; 0062 0061 0072;;;;N;;;;; +3375;SQUARE OV;So;0;L; 006F 0056;;;;N;;;;; +3376;SQUARE PC;So;0;L; 0070 0063;;;;N;;;;; +3377;SQUARE DM;So;0;ON; 0064 006D;;;;N;;;;; +3378;SQUARE DM SQUARED;So;0;ON; 0064 006D 00B2;;;;N;;;;; +3379;SQUARE DM CUBED;So;0;ON; 0064 006D 00B3;;;;N;;;;; +337A;SQUARE IU;So;0;ON; 0049 0055;;;;N;;;;; +337B;SQUARE ERA NAME HEISEI;So;0;L; 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; +337C;SQUARE ERA NAME SYOUWA;So;0;L; 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; +337D;SQUARE ERA NAME TAISYOU;So;0;L; 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; +337E;SQUARE ERA NAME MEIZI;So;0;L; 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; +337F;SQUARE CORPORATION;So;0;L; 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; +3380;SQUARE PA AMPS;So;0;L; 0070 0041;;;;N;SQUARED PA AMPS;;;; +3381;SQUARE NA;So;0;L; 006E 0041;;;;N;SQUARED NA;;;; +3382;SQUARE MU A;So;0;L; 03BC 0041;;;;N;SQUARED MU A;;;; +3383;SQUARE MA;So;0;L; 006D 0041;;;;N;SQUARED MA;;;; +3384;SQUARE KA;So;0;L; 006B 0041;;;;N;SQUARED KA;;;; +3385;SQUARE KB;So;0;L; 004B 0042;;;;N;SQUARED KB;;;; +3386;SQUARE MB;So;0;L; 004D 0042;;;;N;SQUARED MB;;;; +3387;SQUARE GB;So;0;L; 0047 0042;;;;N;SQUARED GB;;;; +3388;SQUARE CAL;So;0;L; 0063 0061 006C;;;;N;SQUARED CAL;;;; +3389;SQUARE KCAL;So;0;L; 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; +338A;SQUARE PF;So;0;L; 0070 0046;;;;N;SQUARED PF;;;; +338B;SQUARE NF;So;0;L; 006E 0046;;;;N;SQUARED NF;;;; +338C;SQUARE MU F;So;0;L; 03BC 0046;;;;N;SQUARED MU F;;;; +338D;SQUARE MU G;So;0;L; 03BC 0067;;;;N;SQUARED MU G;;;; +338E;SQUARE MG;So;0;L; 006D 0067;;;;N;SQUARED MG;;;; +338F;SQUARE KG;So;0;L; 006B 0067;;;;N;SQUARED KG;;;; +3390;SQUARE HZ;So;0;L; 0048 007A;;;;N;SQUARED HZ;;;; +3391;SQUARE KHZ;So;0;L; 006B 0048 007A;;;;N;SQUARED KHZ;;;; +3392;SQUARE MHZ;So;0;L; 004D 0048 007A;;;;N;SQUARED MHZ;;;; +3393;SQUARE GHZ;So;0;L; 0047 0048 007A;;;;N;SQUARED GHZ;;;; +3394;SQUARE THZ;So;0;L; 0054 0048 007A;;;;N;SQUARED THZ;;;; +3395;SQUARE MU L;So;0;L; 03BC 2113;;;;N;SQUARED MU L;;;; +3396;SQUARE ML;So;0;L; 006D 2113;;;;N;SQUARED ML;;;; +3397;SQUARE DL;So;0;L; 0064 2113;;;;N;SQUARED DL;;;; +3398;SQUARE KL;So;0;L; 006B 2113;;;;N;SQUARED KL;;;; +3399;SQUARE FM;So;0;L; 0066 006D;;;;N;SQUARED FM;;;; +339A;SQUARE NM;So;0;L; 006E 006D;;;;N;SQUARED NM;;;; +339B;SQUARE MU M;So;0;L; 03BC 006D;;;;N;SQUARED MU M;;;; +339C;SQUARE MM;So;0;L; 006D 006D;;;;N;SQUARED MM;;;; +339D;SQUARE CM;So;0;L; 0063 006D;;;;N;SQUARED CM;;;; +339E;SQUARE KM;So;0;L; 006B 006D;;;;N;SQUARED KM;;;; +339F;SQUARE MM SQUARED;So;0;L; 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; +33A0;SQUARE CM SQUARED;So;0;L; 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; +33A1;SQUARE M SQUARED;So;0;L; 006D 00B2;;;;N;SQUARED M SQUARED;;;; +33A2;SQUARE KM SQUARED;So;0;L; 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; +33A3;SQUARE MM CUBED;So;0;L; 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; +33A4;SQUARE CM CUBED;So;0;L; 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; +33A5;SQUARE M CUBED;So;0;L; 006D 00B3;;;;N;SQUARED M CUBED;;;; +33A6;SQUARE KM CUBED;So;0;L; 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; +33A7;SQUARE M OVER S;So;0;L; 006D 2215 0073;;;;N;SQUARED M OVER S;;;; +33A8;SQUARE M OVER S SQUARED;So;0;L; 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; +33A9;SQUARE PA;So;0;L; 0050 0061;;;;N;SQUARED PA;;;; +33AA;SQUARE KPA;So;0;L; 006B 0050 0061;;;;N;SQUARED KPA;;;; +33AB;SQUARE MPA;So;0;L; 004D 0050 0061;;;;N;SQUARED MPA;;;; +33AC;SQUARE GPA;So;0;L; 0047 0050 0061;;;;N;SQUARED GPA;;;; +33AD;SQUARE RAD;So;0;L; 0072 0061 0064;;;;N;SQUARED RAD;;;; +33AE;SQUARE RAD OVER S;So;0;L; 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; +33AF;SQUARE RAD OVER S SQUARED;So;0;L; 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; +33B0;SQUARE PS;So;0;L; 0070 0073;;;;N;SQUARED PS;;;; +33B1;SQUARE NS;So;0;L; 006E 0073;;;;N;SQUARED NS;;;; +33B2;SQUARE MU S;So;0;L; 03BC 0073;;;;N;SQUARED MU S;;;; +33B3;SQUARE MS;So;0;L; 006D 0073;;;;N;SQUARED MS;;;; +33B4;SQUARE PV;So;0;L; 0070 0056;;;;N;SQUARED PV;;;; +33B5;SQUARE NV;So;0;L; 006E 0056;;;;N;SQUARED NV;;;; +33B6;SQUARE MU V;So;0;L; 03BC 0056;;;;N;SQUARED MU V;;;; +33B7;SQUARE MV;So;0;L; 006D 0056;;;;N;SQUARED MV;;;; +33B8;SQUARE KV;So;0;L; 006B 0056;;;;N;SQUARED KV;;;; +33B9;SQUARE MV MEGA;So;0;L; 004D 0056;;;;N;SQUARED MV MEGA;;;; +33BA;SQUARE PW;So;0;L; 0070 0057;;;;N;SQUARED PW;;;; +33BB;SQUARE NW;So;0;L; 006E 0057;;;;N;SQUARED NW;;;; +33BC;SQUARE MU W;So;0;L; 03BC 0057;;;;N;SQUARED MU W;;;; +33BD;SQUARE MW;So;0;L; 006D 0057;;;;N;SQUARED MW;;;; +33BE;SQUARE KW;So;0;L; 006B 0057;;;;N;SQUARED KW;;;; +33BF;SQUARE MW MEGA;So;0;L; 004D 0057;;;;N;SQUARED MW MEGA;;;; +33C0;SQUARE K OHM;So;0;L; 006B 03A9;;;;N;SQUARED K OHM;;;; +33C1;SQUARE M OHM;So;0;L; 004D 03A9;;;;N;SQUARED M OHM;;;; +33C2;SQUARE AM;So;0;L; 0061 002E 006D 002E;;;;N;SQUARED AM;;;; +33C3;SQUARE BQ;So;0;L; 0042 0071;;;;N;SQUARED BQ;;;; +33C4;SQUARE CC;So;0;L; 0063 0063;;;;N;SQUARED CC;;;; +33C5;SQUARE CD;So;0;L; 0063 0064;;;;N;SQUARED CD;;;; +33C6;SQUARE C OVER KG;So;0;L; 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; +33C7;SQUARE CO;So;0;L; 0043 006F 002E;;;;N;SQUARED CO;;;; +33C8;SQUARE DB;So;0;L; 0064 0042;;;;N;SQUARED DB;;;; +33C9;SQUARE GY;So;0;L; 0047 0079;;;;N;SQUARED GY;;;; +33CA;SQUARE HA;So;0;L; 0068 0061;;;;N;SQUARED HA;;;; +33CB;SQUARE HP;So;0;L; 0048 0050;;;;N;SQUARED HP;;;; +33CC;SQUARE IN;So;0;L; 0069 006E;;;;N;SQUARED IN;;;; +33CD;SQUARE KK;So;0;L; 004B 004B;;;;N;SQUARED KK;;;; +33CE;SQUARE KM CAPITAL;So;0;L; 004B 004D;;;;N;SQUARED KM CAPITAL;;;; +33CF;SQUARE KT;So;0;L; 006B 0074;;;;N;SQUARED KT;;;; +33D0;SQUARE LM;So;0;L; 006C 006D;;;;N;SQUARED LM;;;; +33D1;SQUARE LN;So;0;L; 006C 006E;;;;N;SQUARED LN;;;; +33D2;SQUARE LOG;So;0;L; 006C 006F 0067;;;;N;SQUARED LOG;;;; +33D3;SQUARE LX;So;0;L; 006C 0078;;;;N;SQUARED LX;;;; +33D4;SQUARE MB SMALL;So;0;L; 006D 0062;;;;N;SQUARED MB SMALL;;;; +33D5;SQUARE MIL;So;0;L; 006D 0069 006C;;;;N;SQUARED MIL;;;; +33D6;SQUARE MOL;So;0;L; 006D 006F 006C;;;;N;SQUARED MOL;;;; +33D7;SQUARE PH;So;0;L; 0050 0048;;;;N;SQUARED PH;;;; +33D8;SQUARE PM;So;0;L; 0070 002E 006D 002E;;;;N;SQUARED PM;;;; +33D9;SQUARE PPM;So;0;L; 0050 0050 004D;;;;N;SQUARED PPM;;;; +33DA;SQUARE PR;So;0;L; 0050 0052;;;;N;SQUARED PR;;;; +33DB;SQUARE SR;So;0;L; 0073 0072;;;;N;SQUARED SR;;;; +33DC;SQUARE SV;So;0;L; 0053 0076;;;;N;SQUARED SV;;;; +33DD;SQUARE WB;So;0;L; 0057 0062;;;;N;SQUARED WB;;;; +33DE;SQUARE V OVER M;So;0;ON; 0056 2215 006D;;;;N;;;;; +33DF;SQUARE A OVER M;So;0;ON; 0041 2215 006D;;;;N;;;;; +33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L; 0031 65E5;;;;N;;;;; +33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L; 0032 65E5;;;;N;;;;; +33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L; 0033 65E5;;;;N;;;;; +33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L; 0034 65E5;;;;N;;;;; +33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L; 0035 65E5;;;;N;;;;; +33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L; 0036 65E5;;;;N;;;;; +33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L; 0037 65E5;;;;N;;;;; +33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L; 0038 65E5;;;;N;;;;; +33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L; 0039 65E5;;;;N;;;;; +33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L; 0031 0030 65E5;;;;N;;;;; +33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L; 0031 0031 65E5;;;;N;;;;; +33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L; 0031 0032 65E5;;;;N;;;;; +33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L; 0031 0033 65E5;;;;N;;;;; +33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L; 0031 0034 65E5;;;;N;;;;; +33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L; 0031 0035 65E5;;;;N;;;;; +33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L; 0031 0036 65E5;;;;N;;;;; +33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L; 0031 0037 65E5;;;;N;;;;; +33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L; 0031 0038 65E5;;;;N;;;;; +33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L; 0031 0039 65E5;;;;N;;;;; +33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L; 0032 0030 65E5;;;;N;;;;; +33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L; 0032 0031 65E5;;;;N;;;;; +33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L; 0032 0032 65E5;;;;N;;;;; +33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L; 0032 0033 65E5;;;;N;;;;; +33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L; 0032 0034 65E5;;;;N;;;;; +33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L; 0032 0035 65E5;;;;N;;;;; +33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L; 0032 0036 65E5;;;;N;;;;; +33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L; 0032 0037 65E5;;;;N;;;;; +33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L; 0032 0038 65E5;;;;N;;;;; +33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L; 0032 0039 65E5;;;;N;;;;; +33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L; 0033 0030 65E5;;;;N;;;;; +33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L; 0033 0031 65E5;;;;N;;;;; +33FF;SQUARE GAL;So;0;ON; 0067 0061 006C;;;;N;;;;; +3400;;Lo;0;L;;;;;N;;;;; +4DBF;;Lo;0;L;;;;;N;;;;; +4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;; +4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;; +4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;; +4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; +4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; +4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; +4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; +4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; +4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; +4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; +4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; +4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; +4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; +4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; +4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; +4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; +4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; +4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; +4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; +4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; +4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; +4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; +4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; +4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; +4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; +4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; +4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; +4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; +4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; +4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; +4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; +4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; +4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; +4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; +4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; +4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; +4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; +4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; +4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; +4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; +4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; +4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; +4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; +4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; +4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; +4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; +4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; +4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; +4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; +4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; +4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; +4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; +4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; +4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; +4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; +4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; +4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; +4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; +4E00;;Lo;0;L;;;;;N;;;;; +9FFF;;Lo;0;L;;;;;N;;;;; +A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; +A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; +A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; +A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; +A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; +A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; +A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; +A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; +A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; +A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; +A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; +A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; +A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; +A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; +A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; +A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; +A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; +A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; +A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; +A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; +A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; +A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; +A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; +A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; +A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; +A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; +A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; +A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; +A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; +A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; +A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; +A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; +A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; +A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; +A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; +A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; +A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; +A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; +A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; +A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; +A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; +A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; +A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; +A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; +A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; +A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; +A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; +A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; +A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; +A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; +A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; +A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; +A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; +A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; +A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; +A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; +A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; +A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; +A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; +A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; +A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; +A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; +A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; +A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; +A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; +A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; +A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; +A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; +A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; +A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; +A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; +A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; +A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; +A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; +A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; +A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; +A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; +A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; +A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; +A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; +A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; +A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; +A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; +A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; +A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; +A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; +A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; +A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; +A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; +A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; +A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; +A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; +A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; +A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; +A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; +A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; +A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; +A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; +A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; +A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; +A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; +A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; +A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; +A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; +A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; +A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; +A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; +A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; +A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; +A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; +A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; +A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; +A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; +A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; +A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; +A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; +A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; +A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; +A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; +A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; +A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; +A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; +A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; +A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; +A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; +A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; +A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; +A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; +A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; +A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; +A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; +A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; +A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; +A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; +A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; +A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; +A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; +A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; +A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; +A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; +A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; +A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; +A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; +A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; +A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; +A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; +A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; +A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; +A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; +A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; +A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; +A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; +A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; +A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; +A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; +A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; +A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; +A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; +A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; +A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; +A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; +A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; +A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; +A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; +A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; +A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; +A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; +A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; +A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; +A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; +A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; +A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; +A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; +A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; +A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; +A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; +A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; +A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; +A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; +A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; +A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; +A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; +A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; +A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; +A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; +A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; +A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; +A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; +A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; +A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; +A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; +A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; +A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; +A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; +A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; +A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; +A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; +A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; +A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; +A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; +A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; +A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; +A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; +A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; +A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; +A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; +A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; +A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; +A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; +A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; +A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; +A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; +A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; +A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; +A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; +A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; +A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; +A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; +A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; +A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; +A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; +A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; +A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; +A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; +A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; +A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; +A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; +A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; +A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; +A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; +A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; +A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; +A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; +A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; +A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; +A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; +A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; +A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; +A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; +A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; +A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; +A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; +A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; +A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; +A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; +A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; +A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; +A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; +A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; +A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; +A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; +A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; +A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; +A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; +A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; +A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; +A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; +A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; +A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; +A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; +A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; +A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; +A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; +A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; +A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; +A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; +A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; +A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; +A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; +A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; +A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; +A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; +A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; +A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; +A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; +A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; +A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; +A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; +A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; +A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; +A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; +A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; +A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; +A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; +A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; +A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; +A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; +A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; +A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; +A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; +A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; +A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; +A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; +A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; +A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; +A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; +A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; +A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; +A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; +A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; +A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; +A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; +A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; +A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; +A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; +A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; +A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; +A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; +A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; +A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; +A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; +A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; +A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; +A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; +A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; +A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; +A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; +A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; +A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; +A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; +A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; +A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; +A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; +A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; +A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; +A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; +A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; +A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; +A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; +A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; +A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; +A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; +A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; +A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; +A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; +A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; +A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; +A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; +A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; +A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; +A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; +A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; +A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; +A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; +A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; +A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; +A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; +A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; +A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; +A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; +A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; +A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; +A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; +A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; +A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; +A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; +A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; +A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; +A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; +A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; +A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; +A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; +A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; +A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; +A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; +A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; +A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; +A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; +A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; +A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; +A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; +A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; +A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; +A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; +A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; +A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; +A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; +A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; +A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; +A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; +A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; +A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; +A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; +A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; +A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; +A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; +A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; +A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; +A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; +A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; +A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; +A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; +A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; +A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; +A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; +A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; +A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; +A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; +A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; +A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; +A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; +A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; +A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; +A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; +A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; +A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; +A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; +A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; +A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; +A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; +A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; +A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; +A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; +A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; +A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; +A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; +A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; +A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; +A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; +A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; +A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; +A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; +A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; +A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; +A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; +A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; +A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; +A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; +A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; +A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; +A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; +A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; +A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; +A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; +A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; +A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; +A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; +A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; +A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; +A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; +A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; +A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; +A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; +A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; +A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; +A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; +A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; +A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; +A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; +A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; +A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; +A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; +A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; +A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; +A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; +A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; +A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; +A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; +A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; +A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; +A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; +A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; +A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; +A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; +A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; +A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; +A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; +A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; +A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; +A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; +A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; +A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; +A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; +A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; +A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; +A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; +A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; +A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; +A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; +A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; +A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; +A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; +A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; +A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; +A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; +A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; +A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; +A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; +A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; +A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; +A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; +A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; +A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; +A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; +A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; +A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; +A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; +A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; +A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; +A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; +A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; +A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; +A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; +A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; +A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; +A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; +A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; +A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; +A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; +A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; +A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; +A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; +A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; +A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; +A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; +A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; +A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; +A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; +A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; +A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; +A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; +A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; +A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; +A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; +A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; +A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; +A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; +A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; +A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; +A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; +A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; +A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; +A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; +A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; +A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; +A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; +A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; +A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; +A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; +A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; +A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; +A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; +A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; +A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; +A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; +A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; +A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; +A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; +A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; +A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; +A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; +A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; +A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; +A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; +A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; +A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; +A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; +A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; +A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; +A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; +A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; +A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; +A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; +A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; +A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; +A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; +A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; +A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; +A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; +A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; +A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; +A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; +A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; +A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; +A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; +A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; +A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; +A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; +A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; +A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; +A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; +A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; +A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; +A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; +A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; +A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; +A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; +A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; +A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; +A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; +A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; +A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; +A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; +A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; +A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; +A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; +A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; +A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; +A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; +A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; +A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; +A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; +A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; +A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; +A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; +A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; +A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; +A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; +A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; +A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; +A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; +A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; +A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; +A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; +A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; +A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; +A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; +A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; +A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; +A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; +A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; +A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; +A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; +A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; +A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; +A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; +A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; +A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; +A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; +A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; +A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; +A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; +A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; +A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; +A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; +A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; +A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; +A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; +A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; +A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; +A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; +A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; +A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; +A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; +A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; +A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; +A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; +A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; +A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; +A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; +A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; +A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; +A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; +A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; +A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; +A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; +A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; +A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; +A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; +A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; +A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; +A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; +A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; +A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; +A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; +A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; +A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; +A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; +A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; +A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; +A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; +A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; +A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; +A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; +A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; +A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; +A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; +A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; +A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; +A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; +A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; +A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; +A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; +A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; +A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; +A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; +A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; +A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; +A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; +A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; +A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; +A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; +A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; +A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; +A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; +A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; +A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; +A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; +A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; +A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; +A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; +A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; +A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; +A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; +A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; +A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; +A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; +A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; +A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; +A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; +A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; +A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; +A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; +A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; +A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; +A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; +A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; +A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; +A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; +A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; +A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; +A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; +A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; +A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; +A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; +A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; +A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; +A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; +A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; +A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; +A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; +A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; +A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; +A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; +A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; +A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; +A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; +A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; +A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; +A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; +A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; +A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; +A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; +A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; +A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; +A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; +A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; +A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; +A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; +A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; +A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; +A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; +A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; +A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; +A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; +A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; +A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; +A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; +A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; +A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; +A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; +A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; +A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; +A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; +A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; +A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; +A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; +A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; +A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; +A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; +A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; +A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; +A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; +A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; +A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; +A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; +A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; +A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; +A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; +A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; +A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; +A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; +A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; +A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; +A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; +A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; +A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; +A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; +A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; +A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; +A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; +A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; +A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; +A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; +A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; +A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; +A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; +A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; +A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; +A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; +A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; +A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; +A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; +A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; +A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; +A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; +A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; +A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; +A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; +A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; +A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; +A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; +A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; +A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; +A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; +A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; +A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; +A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; +A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; +A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; +A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; +A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; +A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; +A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; +A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; +A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; +A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; +A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; +A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; +A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; +A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; +A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; +A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; +A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; +A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; +A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; +A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; +A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; +A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; +A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; +A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; +A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; +A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; +A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; +A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; +A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; +A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; +A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; +A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; +A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; +A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; +A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; +A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; +A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; +A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; +A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; +A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; +A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; +A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; +A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; +A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; +A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; +A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; +A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; +A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; +A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; +A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; +A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; +A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; +A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; +A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; +A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; +A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; +A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; +A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; +A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; +A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; +A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; +A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; +A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; +A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; +A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; +A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; +A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; +A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; +A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; +A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; +A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; +A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; +A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; +A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; +A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; +A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; +A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; +A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; +A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; +A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; +A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; +A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; +A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; +A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; +A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; +A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; +A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; +A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; +A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; +A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; +A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; +A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; +A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; +A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; +A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; +A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; +A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; +A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; +A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; +A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; +A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; +A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; +A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; +A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; +A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; +A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; +A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; +A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; +A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; +A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; +A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; +A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; +A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; +A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; +A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; +A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; +A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; +A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; +A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; +A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; +A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; +A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; +A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; +A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; +A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; +A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; +A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; +A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; +A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; +A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; +A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; +A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; +A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; +A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; +A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; +A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; +A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; +A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; +A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; +A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; +A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; +A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; +A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; +A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; +A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; +A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; +A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; +A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; +A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; +A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; +A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; +A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; +A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; +A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; +A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; +A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; +A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; +A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; +A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; +A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; +A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; +A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; +A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; +A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; +A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; +A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; +A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; +A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; +A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; +A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; +A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; +A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; +A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; +A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; +A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; +A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; +A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; +A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; +A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; +A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; +A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; +A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; +A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; +A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; +A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; +A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; +A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; +A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; +A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; +A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; +A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; +A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; +A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; +A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; +A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; +A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; +A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; +A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; +A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; +A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; +A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; +A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; +A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; +A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; +A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; +A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; +A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; +A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; +A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; +A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; +A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; +A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; +A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; +A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; +A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; +A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; +A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; +A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; +A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; +A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; +A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; +A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; +A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; +A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; +A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; +A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; +A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; +A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; +A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; +A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; +A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; +A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; +A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; +A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; +A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; +A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; +A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; +A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; +A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; +A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; +A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; +A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; +A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; +A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; +A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; +A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; +A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; +A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; +A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; +A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; +A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; +A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; +A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; +A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; +A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; +A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; +A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; +A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; +A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; +A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; +A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; +A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; +A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; +A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; +A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; +A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; +A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; +A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;; +A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;; +A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;; +A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;; +A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;; +A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;; +A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;; +A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;; +A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;; +A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;; +A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;; +A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;; +A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;; +A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;; +A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;; +A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;; +A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;; +A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;; +A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;; +A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;; +A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;; +A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;; +A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;; +A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;; +A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;; +A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;; +A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;; +A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;; +A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;; +A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;; +A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;; +A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;; +A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;; +A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;; +A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;; +A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;; +A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;; +A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;; +A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;; +A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;; +A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;; +A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;; +A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;; +A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;; +A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;; +A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;; +A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;; +A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;; +A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; +A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; +A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; +A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; +A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; +A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; +A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; +A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; +A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; +A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; +A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; +A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; +A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; +A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; +A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; +A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; +A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; +A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; +A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; +A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; +A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; +A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; +A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; +A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; +A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; +A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; +A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; +A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; +A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; +A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; +A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; +A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; +A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; +A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; +A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; +A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; +A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; +A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; +A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; +A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; +A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; +A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; +A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; +A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; +A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; +A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; +A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; +A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; +A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; +A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; +A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; +A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; +A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; +A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; +A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; +A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; +A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; +A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; +A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; +A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; +A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; +A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; +A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; +A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; +A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; +A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; +A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; +A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; +A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; +A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; +A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; +A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; +A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; +A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; +A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; +A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; +A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; +A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; +A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; +A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; +A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; +A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; +A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; +A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; +A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; +A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; +A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; +A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; +A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; +A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; +A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; +A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; +A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; +A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; +A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; +A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; +A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; +A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; +A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; +A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; +A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; +A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; +A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; +A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; +A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; +A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; +A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; +A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; +A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; +A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; +A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; +A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; +A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; +A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; +A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; +A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; +A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; +A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; +A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; +A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; +A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; +A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; +A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; +A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; +A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; +A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; +A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; +A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; +A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; +A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; +A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; +A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; +A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; +A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; +A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; +A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; +A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; +A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; +A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; +A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; +A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; +A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; +A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; +A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; +A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; +A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; +A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; +A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; +A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; +A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; +A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; +A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; +A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; +A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; +A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; +A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; +A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; +A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 +A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; +A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 +A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; +A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 +A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; +A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 +A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; +A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 +A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; +A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A +A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; +A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C +A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; +A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E +A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; +A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 +A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; +A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 +A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; +A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 +A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; +A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 +A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; +A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 +A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; +A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A +A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; +A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C +A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; +A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E +A660;CYRILLIC CAPITAL LETTER REVERSED TSE;Lu;0;L;;;;;N;;;;A661; +A661;CYRILLIC SMALL LETTER REVERSED TSE;Ll;0;L;;;;;N;;;A660;;A660 +A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; +A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 +A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; +A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 +A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; +A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 +A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; +A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 +A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; +A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A +A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; +A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C +A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; +A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; +A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; +A674;COMBINING CYRILLIC LETTER UKRAINIAN IE;Mn;230;NSM;;;;;N;;;;; +A675;COMBINING CYRILLIC LETTER I;Mn;230;NSM;;;;;N;;;;; +A676;COMBINING CYRILLIC LETTER YI;Mn;230;NSM;;;;;N;;;;; +A677;COMBINING CYRILLIC LETTER U;Mn;230;NSM;;;;;N;;;;; +A678;COMBINING CYRILLIC LETTER HARD SIGN;Mn;230;NSM;;;;;N;;;;; +A679;COMBINING CYRILLIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; +A67A;COMBINING CYRILLIC LETTER SOFT SIGN;Mn;230;NSM;;;;;N;;;;; +A67B;COMBINING CYRILLIC LETTER OMEGA;Mn;230;NSM;;;;;N;;;;; +A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; +A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; +A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; +A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; +A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; +A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 +A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; +A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 +A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; +A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 +A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; +A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 +A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; +A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 +A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; +A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A +A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; +A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C +A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; +A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E +A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; +A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 +A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; +A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 +A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; +A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 +A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; +A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 +A698;CYRILLIC CAPITAL LETTER DOUBLE O;Lu;0;L;;;;;N;;;;A699; +A699;CYRILLIC SMALL LETTER DOUBLE O;Ll;0;L;;;;;N;;;A698;;A698 +A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; +A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A +A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L; 044A;;;;N;;;;; +A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L; 044C;;;;N;;;;; +A69E;COMBINING CYRILLIC LETTER EF;Mn;230;NSM;;;;;N;;;;; +A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; +A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; +A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; +A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;; +A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;; +A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;; +A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;; +A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;; +A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;; +A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;; +A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;; +A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;; +A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;; +A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;; +A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;; +A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;; +A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;; +A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;; +A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;; +A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;; +A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;; +A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;; +A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;; +A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;; +A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;; +A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;; +A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;; +A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;; +A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;; +A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;; +A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;; +A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;; +A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;; +A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;; +A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;; +A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;; +A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;; +A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;; +A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;; +A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;; +A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;; +A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;; +A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;; +A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;; +A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;; +A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;; +A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;; +A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;; +A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;; +A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;; +A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;; +A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;; +A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;; +A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;; +A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;; +A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;; +A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;; +A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;; +A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;; +A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;; +A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;; +A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;; +A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;; +A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;; +A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;; +A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;; +A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;; +A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;; +A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;; +A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;; +A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;; +A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;; +A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;; +A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;; +A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;; +A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;; +A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;; +A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;; +A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;; +A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;; +A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;; +A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;; +A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;; +A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;; +A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;; +A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;; +A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;; +A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;; +A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;; +A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; +A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; +A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; +A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; +A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; +A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; +A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; +A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; +A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; +A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; +A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; +A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; +A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; +A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; +A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; +A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; +A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; +A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 +A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; +A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 +A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; +A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 +A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; +A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 +A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; +A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A +A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; +A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C +A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; +A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E +A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; +A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; +A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; +A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 +A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; +A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 +A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; +A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 +A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; +A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 +A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; +A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A +A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; +A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C +A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; +A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E +A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; +A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 +A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; +A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 +A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; +A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 +A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; +A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 +A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; +A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 +A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; +A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A +A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; +A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C +A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; +A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E +A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; +A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 +A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; +A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 +A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; +A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 +A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; +A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 +A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; +A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 +A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; +A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A +A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; +A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C +A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; +A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E +A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; +A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 +A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; +A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 +A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; +A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 +A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; +A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 +A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; +A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 +A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; +A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A +A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; +A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C +A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; +A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E +A770;MODIFIER LETTER US;Lm;0;L; A76F;;;;N;;;;; +A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; +A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; +A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; +A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; +A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; +A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; +A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; +A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; +A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; +A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 +A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; +A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B +A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; +A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; +A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E +A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; +A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 +A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; +A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 +A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; +A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 +A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; +A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 +A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; +A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; +A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; +A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; +A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B +A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; +A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; +A78F;LATIN LETTER SINOLOGICAL DOT;Lo;0;L;;;;;N;;;;; +A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; +A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 +A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; +A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792 +A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;A7C4;;A7C4 +A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797; +A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796 +A798;LATIN CAPITAL LETTER F WITH STROKE;Lu;0;L;;;;;N;;;;A799; +A799;LATIN SMALL LETTER F WITH STROKE;Ll;0;L;;;;;N;;;A798;;A798 +A79A;LATIN CAPITAL LETTER VOLAPUK AE;Lu;0;L;;;;;N;;;;A79B; +A79B;LATIN SMALL LETTER VOLAPUK AE;Ll;0;L;;;;;N;;;A79A;;A79A +A79C;LATIN CAPITAL LETTER VOLAPUK OE;Lu;0;L;;;;;N;;;;A79D; +A79D;LATIN SMALL LETTER VOLAPUK OE;Ll;0;L;;;;;N;;;A79C;;A79C +A79E;LATIN CAPITAL LETTER VOLAPUK UE;Lu;0;L;;;;;N;;;;A79F; +A79F;LATIN SMALL LETTER VOLAPUK UE;Ll;0;L;;;;;N;;;A79E;;A79E +A7A0;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A1; +A7A1;LATIN SMALL LETTER G WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A0;;A7A0 +A7A2;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A3; +A7A3;LATIN SMALL LETTER K WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A2;;A7A2 +A7A4;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A5; +A7A5;LATIN SMALL LETTER N WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A4;;A7A4 +A7A6;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A7; +A7A7;LATIN SMALL LETTER R WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A6;;A7A6 +A7A8;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A9; +A7A9;LATIN SMALL LETTER S WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A8;;A7A8 +A7AA;LATIN CAPITAL LETTER H WITH HOOK;Lu;0;L;;;;;N;;;;0266; +A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C; +A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; +A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; +A7AE;LATIN CAPITAL LETTER SMALL CAPITAL I;Lu;0;L;;;;;N;;;;026A; +A7AF;LATIN LETTER SMALL CAPITAL Q;Ll;0;L;;;;;N;;;;; +A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; +A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; +A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D; +A7B3;LATIN CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;AB53; +A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5; +A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4 +A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7; +A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6 +A7B8;LATIN CAPITAL LETTER U WITH STROKE;Lu;0;L;;;;;N;;;;A7B9; +A7B9;LATIN SMALL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;A7B8;;A7B8 +A7BA;LATIN CAPITAL LETTER GLOTTAL A;Lu;0;L;;;;;N;;;;A7BB; +A7BB;LATIN SMALL LETTER GLOTTAL A;Ll;0;L;;;;;N;;;A7BA;;A7BA +A7BC;LATIN CAPITAL LETTER GLOTTAL I;Lu;0;L;;;;;N;;;;A7BD; +A7BD;LATIN SMALL LETTER GLOTTAL I;Ll;0;L;;;;;N;;;A7BC;;A7BC +A7BE;LATIN CAPITAL LETTER GLOTTAL U;Lu;0;L;;;;;N;;;;A7BF; +A7BF;LATIN SMALL LETTER GLOTTAL U;Ll;0;L;;;;;N;;;A7BE;;A7BE +A7C0;LATIN CAPITAL LETTER OLD POLISH O;Lu;0;L;;;;;N;;;;A7C1; +A7C1;LATIN SMALL LETTER OLD POLISH O;Ll;0;L;;;;;N;;;A7C0;;A7C0 +A7C2;LATIN CAPITAL LETTER ANGLICANA W;Lu;0;L;;;;;N;;;;A7C3; +A7C3;LATIN SMALL LETTER ANGLICANA W;Ll;0;L;;;;;N;;;A7C2;;A7C2 +A7C4;LATIN CAPITAL LETTER C WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;A794; +A7C5;LATIN CAPITAL LETTER S WITH HOOK;Lu;0;L;;;;;N;;;;0282; +A7C6;LATIN CAPITAL LETTER Z WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;1D8E; +A7C7;LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY;Lu;0;L;;;;;N;;;;A7C8; +A7C8;LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY;Ll;0;L;;;;;N;;;A7C7;;A7C7 +A7C9;LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY;Lu;0;L;;;;;N;;;;A7CA; +A7CA;LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY;Ll;0;L;;;;;N;;;A7C9;;A7C9 +A7CB;LATIN CAPITAL LETTER RAMS HORN;Lu;0;L;;;;;N;;;;0264; +A7CC;LATIN CAPITAL LETTER S WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A7CD; +A7CD;LATIN SMALL LETTER S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A7CC;;A7CC +A7CE;LATIN CAPITAL LETTER PHARYNGEAL VOICED FRICATIVE;Lu;0;L;;;;;N;;;;A7CF; +A7CF;LATIN SMALL LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;;;A7CE;;A7CE +A7D0;LATIN CAPITAL LETTER CLOSED INSULAR G;Lu;0;L;;;;;N;;;;A7D1; +A7D1;LATIN SMALL LETTER CLOSED INSULAR G;Ll;0;L;;;;;N;;;A7D0;;A7D0 +A7D2;LATIN CAPITAL LETTER DOUBLE THORN;Lu;0;L;;;;;N;;;;A7D3; +A7D3;LATIN SMALL LETTER DOUBLE THORN;Ll;0;L;;;;;N;;;A7D2;;A7D2 +A7D4;LATIN CAPITAL LETTER DOUBLE WYNN;Lu;0;L;;;;;N;;;;A7D5; +A7D5;LATIN SMALL LETTER DOUBLE WYNN;Ll;0;L;;;;;N;;;A7D4;;A7D4 +A7D6;LATIN CAPITAL LETTER MIDDLE SCOTS S;Lu;0;L;;;;;N;;;;A7D7; +A7D7;LATIN SMALL LETTER MIDDLE SCOTS S;Ll;0;L;;;;;N;;;A7D6;;A7D6 +A7D8;LATIN CAPITAL LETTER SIGMOID S;Lu;0;L;;;;;N;;;;A7D9; +A7D9;LATIN SMALL LETTER SIGMOID S;Ll;0;L;;;;;N;;;A7D8;;A7D8 +A7DA;LATIN CAPITAL LETTER LAMBDA;Lu;0;L;;;;;N;;;;A7DB; +A7DB;LATIN SMALL LETTER LAMBDA;Ll;0;L;;;;;N;;;A7DA;;A7DA +A7DC;LATIN CAPITAL LETTER LAMBDA WITH STROKE;Lu;0;L;;;;;N;;;;019B; +A7F1;MODIFIER LETTER CAPITAL S;Lm;0;L; 0053;;;;N;;;;; +A7F2;MODIFIER LETTER CAPITAL C;Lm;0;L; 0043;;;;N;;;;; +A7F3;MODIFIER LETTER CAPITAL F;Lm;0;L; 0046;;;;N;;;;; +A7F4;MODIFIER LETTER CAPITAL Q;Lm;0;L; 0051;;;;N;;;;; +A7F5;LATIN CAPITAL LETTER REVERSED HALF H;Lu;0;L;;;;;N;;;;A7F6; +A7F6;LATIN SMALL LETTER REVERSED HALF H;Ll;0;L;;;;;N;;;A7F5;;A7F5 +A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;; +A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L; 0126;;;;N;;;;; +A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L; 0153;;;;N;;;;; +A7FA;LATIN LETTER SMALL CAPITAL TURNED M;Ll;0;L;;;;;N;;;;; +A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; +A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; +A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; +A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; +A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; +A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; +A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; +A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; +A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; +A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; +A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; +A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; +A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; +A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; +A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; +A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; +A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; +A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; +A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; +A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; +A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; +A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; +A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; +A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; +A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; +A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; +A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; +A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; +A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; +A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; +A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; +A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; +A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; +A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; +A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; +A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; +A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; +A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; +A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; +A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; +A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; +A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; +A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; +A82C;SYLOTI NAGRI SIGN ALTERNATE HASANTA;Mn;9;NSM;;;;;N;;;;; +A830;NORTH INDIC FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +A831;NORTH INDIC FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +A832;NORTH INDIC FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;; +A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;; +A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;; +A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;; +A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; +A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; +A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; +A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; +A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; +A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; +A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; +A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; +A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; +A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; +A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; +A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; +A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; +A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; +A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; +A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; +A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; +A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; +A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; +A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; +A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; +A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; +A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; +A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; +A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; +A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; +A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; +A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; +A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; +A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; +A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; +A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; +A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; +A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; +A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; +A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; +A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; +A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; +A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; +A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; +A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; +A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; +A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; +A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; +A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; +A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; +A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; +A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; +A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; +A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; +A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; +A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; +A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; +A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; +A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; +A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; +A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; +A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; +A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; +A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; +A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; +A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; +A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; +A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; +A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; +A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; +A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; +A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; +A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; +A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; +A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; +A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; +A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; +A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; +A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; +A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; +A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; +A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; +A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; +A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; +A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; +A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; +A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; +A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; +A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; +A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; +A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; +A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; +A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; +A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; +A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; +A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; +A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; +A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; +A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; +A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; +A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; +A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +A8C5;SAURASHTRA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; +A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;; +A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;; +A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;; +A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;; +A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;; +A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;; +A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;; +A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;; +A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;; +A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;; +A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;; +A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; +A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;; +A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;; +A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;; +A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; +A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; +A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; +A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;; +A8FE;DEVANAGARI LETTER AY;Lo;0;L;;;;;N;;;;; +A8FF;DEVANAGARI VOWEL SIGN AY;Mn;0;NSM;;;;;N;;;;; +A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; +A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; +A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; +A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; +A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; +A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; +A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; +A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; +A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; +A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; +A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; +A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; +A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; +A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; +A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; +A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; +A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; +A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; +A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; +A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; +A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; +A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; +A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; +A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; +A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; +A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; +A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; +A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; +A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; +A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; +A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; +A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; +A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; +A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; +A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; +A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; +A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; +A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; +A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; +A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; +A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; +A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; +A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; +A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; +A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; +A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; +A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; +A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; +A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; +A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; +A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; +A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; +A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; +A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; +A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; +A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; +A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; +A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; +A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; +A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; +A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; +A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; +A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; +A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;; +A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;; +A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;; +A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;; +A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;; +A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;; +A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;; +A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;; +A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;; +A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;; +A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;; +A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;; +A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;; +A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;; +A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;; +A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;; +A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;; +A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;; +A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;; +A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;; +A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;; +A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;; +A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;; +A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;; +A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;; +A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;; +A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;; +A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;; +A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;; +A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;; +A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;; +A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;; +A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;; +A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;; +A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;; +A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;; +A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;; +A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;; +A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;; +A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;; +A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;; +A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;; +A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;; +A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;; +A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;; +A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;; +A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;; +A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;; +A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;; +A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;; +A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;; +A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;; +A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;; +A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;; +A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;; +A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;; +A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;; +A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;; +A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;; +A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;; +A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;; +A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +A9BD;JAVANESE CONSONANT SIGN KERET;Mn;0;NSM;;;;;N;;;;; +A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;; +A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;; +A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;; +A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;; +A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;; +A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;; +A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;; +A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;; +A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;; +A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;; +A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;; +A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;; +A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;; +A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;; +A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;; +A9E0;MYANMAR LETTER SHAN GHA;Lo;0;L;;;;;N;;;;; +A9E1;MYANMAR LETTER SHAN CHA;Lo;0;L;;;;;N;;;;; +A9E2;MYANMAR LETTER SHAN JHA;Lo;0;L;;;;;N;;;;; +A9E3;MYANMAR LETTER SHAN NNA;Lo;0;L;;;;;N;;;;; +A9E4;MYANMAR LETTER SHAN BHA;Lo;0;L;;;;;N;;;;; +A9E5;MYANMAR SIGN SHAN SAW;Mn;0;NSM;;;;;N;;;;; +A9E6;MYANMAR MODIFIER LETTER SHAN REDUPLICATION;Lm;0;L;;;;;N;;;;; +A9E7;MYANMAR LETTER TAI LAING NYA;Lo;0;L;;;;;N;;;;; +A9E8;MYANMAR LETTER TAI LAING FA;Lo;0;L;;;;;N;;;;; +A9E9;MYANMAR LETTER TAI LAING GA;Lo;0;L;;;;;N;;;;; +A9EA;MYANMAR LETTER TAI LAING GHA;Lo;0;L;;;;;N;;;;; +A9EB;MYANMAR LETTER TAI LAING JA;Lo;0;L;;;;;N;;;;; +A9EC;MYANMAR LETTER TAI LAING JHA;Lo;0;L;;;;;N;;;;; +A9ED;MYANMAR LETTER TAI LAING DDA;Lo;0;L;;;;;N;;;;; +A9EE;MYANMAR LETTER TAI LAING DDHA;Lo;0;L;;;;;N;;;;; +A9EF;MYANMAR LETTER TAI LAING NNA;Lo;0;L;;;;;N;;;;; +A9F0;MYANMAR TAI LAING DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9F1;MYANMAR TAI LAING DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9F2;MYANMAR TAI LAING DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9F3;MYANMAR TAI LAING DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9F4;MYANMAR TAI LAING DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9F5;MYANMAR TAI LAING DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9F6;MYANMAR TAI LAING DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9F7;MYANMAR TAI LAING DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9F8;MYANMAR TAI LAING DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9F9;MYANMAR TAI LAING DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9FA;MYANMAR LETTER TAI LAING LLA;Lo;0;L;;;;;N;;;;; +A9FB;MYANMAR LETTER TAI LAING DA;Lo;0;L;;;;;N;;;;; +A9FC;MYANMAR LETTER TAI LAING DHA;Lo;0;L;;;;;N;;;;; +A9FD;MYANMAR LETTER TAI LAING BA;Lo;0;L;;;;;N;;;;; +A9FE;MYANMAR LETTER TAI LAING BHA;Lo;0;L;;;;;N;;;;; +AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; +AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; +AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; +AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; +AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; +AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; +AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; +AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; +AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; +AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; +AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; +AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; +AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; +AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; +AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; +AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; +AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; +AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; +AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; +AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; +AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; +AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; +AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; +AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; +AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; +AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; +AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; +AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; +AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; +AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; +AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; +AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; +AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; +AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; +AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; +AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; +AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; +AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; +AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; +AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; +AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; +AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; +AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; +AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; +AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; +AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; +AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; +AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; +AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; +AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; +AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; +AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;; +AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;; +AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;; +AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;; +AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;; +AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;; +AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;; +AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;; +AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;; +AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;; +AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;; +AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;; +AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;; +AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;; +AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;; +AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;; +AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;; +AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;; +AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;; +AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;; +AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;; +AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;; +AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;; +AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;; +AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;; +AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;; +AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;; +AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;; +AA7C;MYANMAR SIGN TAI LAING TONE-2;Mn;0;NSM;;;;;N;;;;; +AA7D;MYANMAR SIGN TAI LAING TONE-5;Mc;0;L;;;;;N;;;;; +AA7E;MYANMAR LETTER SHWE PALAUNG CHA;Lo;0;L;;;;;N;;;;; +AA7F;MYANMAR LETTER SHWE PALAUNG SHA;Lo;0;L;;;;;N;;;;; +AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;; +AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;; +AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;; +AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; +AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;; +AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;; +AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;; +AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;; +AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;; +AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;; +AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;; +AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;; +AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;; +AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;; +AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;; +AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;; +AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;; +AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; +AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;; +AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;; +AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;; +AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;; +AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;; +AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;; +AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;; +AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;; +AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;; +AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;; +AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;; +AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;; +AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;; +AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;; +AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;; +AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;; +AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;; +AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;; +AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;; +AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;; +AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;; +AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;; +AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;; +AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;; +AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;; +AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;; +AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;; +AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;; +AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;; +AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;; +AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;; +AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;; +AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;; +AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;; +AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;; +AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;; +AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;; +AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;; +AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;; +AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;; +AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;; +AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;; +AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;; +AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;; +AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;; +AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;; +AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;; +AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;; +AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;; +AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;; +AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;; +AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;; +AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;; +AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;; +AAE0;MEETEI MAYEK LETTER E;Lo;0;L;;;;;N;;;;; +AAE1;MEETEI MAYEK LETTER O;Lo;0;L;;;;;N;;;;; +AAE2;MEETEI MAYEK LETTER CHA;Lo;0;L;;;;;N;;;;; +AAE3;MEETEI MAYEK LETTER NYA;Lo;0;L;;;;;N;;;;; +AAE4;MEETEI MAYEK LETTER TTA;Lo;0;L;;;;;N;;;;; +AAE5;MEETEI MAYEK LETTER TTHA;Lo;0;L;;;;;N;;;;; +AAE6;MEETEI MAYEK LETTER DDA;Lo;0;L;;;;;N;;;;; +AAE7;MEETEI MAYEK LETTER DDHA;Lo;0;L;;;;;N;;;;; +AAE8;MEETEI MAYEK LETTER NNA;Lo;0;L;;;;;N;;;;; +AAE9;MEETEI MAYEK LETTER SHA;Lo;0;L;;;;;N;;;;; +AAEA;MEETEI MAYEK LETTER SSA;Lo;0;L;;;;;N;;;;; +AAEB;MEETEI MAYEK VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +AAEC;MEETEI MAYEK VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +AAED;MEETEI MAYEK VOWEL SIGN AAI;Mn;0;NSM;;;;;N;;;;; +AAEE;MEETEI MAYEK VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +AAEF;MEETEI MAYEK VOWEL SIGN AAU;Mc;0;L;;;;;N;;;;; +AAF0;MEETEI MAYEK CHEIKHAN;Po;0;L;;;;;N;;;;; +AAF1;MEETEI MAYEK AHANG KHUDAM;Po;0;L;;;;;N;;;;; +AAF2;MEETEI MAYEK ANJI;Lo;0;L;;;;;N;;;;; +AAF3;MEETEI MAYEK SYLLABLE REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF4;MEETEI MAYEK WORD REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF5;MEETEI MAYEK VOWEL SIGN VISARGA;Mc;0;L;;;;;N;;;;; +AAF6;MEETEI MAYEK VIRAMA;Mn;9;NSM;;;;;N;;;;; +AB01;ETHIOPIC SYLLABLE TTHU;Lo;0;L;;;;;N;;;;; +AB02;ETHIOPIC SYLLABLE TTHI;Lo;0;L;;;;;N;;;;; +AB03;ETHIOPIC SYLLABLE TTHAA;Lo;0;L;;;;;N;;;;; +AB04;ETHIOPIC SYLLABLE TTHEE;Lo;0;L;;;;;N;;;;; +AB05;ETHIOPIC SYLLABLE TTHE;Lo;0;L;;;;;N;;;;; +AB06;ETHIOPIC SYLLABLE TTHO;Lo;0;L;;;;;N;;;;; +AB09;ETHIOPIC SYLLABLE DDHU;Lo;0;L;;;;;N;;;;; +AB0A;ETHIOPIC SYLLABLE DDHI;Lo;0;L;;;;;N;;;;; +AB0B;ETHIOPIC SYLLABLE DDHAA;Lo;0;L;;;;;N;;;;; +AB0C;ETHIOPIC SYLLABLE DDHEE;Lo;0;L;;;;;N;;;;; +AB0D;ETHIOPIC SYLLABLE DDHE;Lo;0;L;;;;;N;;;;; +AB0E;ETHIOPIC SYLLABLE DDHO;Lo;0;L;;;;;N;;;;; +AB11;ETHIOPIC SYLLABLE DZU;Lo;0;L;;;;;N;;;;; +AB12;ETHIOPIC SYLLABLE DZI;Lo;0;L;;;;;N;;;;; +AB13;ETHIOPIC SYLLABLE DZAA;Lo;0;L;;;;;N;;;;; +AB14;ETHIOPIC SYLLABLE DZEE;Lo;0;L;;;;;N;;;;; +AB15;ETHIOPIC SYLLABLE DZE;Lo;0;L;;;;;N;;;;; +AB16;ETHIOPIC SYLLABLE DZO;Lo;0;L;;;;;N;;;;; +AB20;ETHIOPIC SYLLABLE CCHHA;Lo;0;L;;;;;N;;;;; +AB21;ETHIOPIC SYLLABLE CCHHU;Lo;0;L;;;;;N;;;;; +AB22;ETHIOPIC SYLLABLE CCHHI;Lo;0;L;;;;;N;;;;; +AB23;ETHIOPIC SYLLABLE CCHHAA;Lo;0;L;;;;;N;;;;; +AB24;ETHIOPIC SYLLABLE CCHHEE;Lo;0;L;;;;;N;;;;; +AB25;ETHIOPIC SYLLABLE CCHHE;Lo;0;L;;;;;N;;;;; +AB26;ETHIOPIC SYLLABLE CCHHO;Lo;0;L;;;;;N;;;;; +AB28;ETHIOPIC SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +AB29;ETHIOPIC SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +AB2A;ETHIOPIC SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +AB2B;ETHIOPIC SYLLABLE BBAA;Lo;0;L;;;;;N;;;;; +AB2C;ETHIOPIC SYLLABLE BBEE;Lo;0;L;;;;;N;;;;; +AB2D;ETHIOPIC SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +AB2E;ETHIOPIC SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +AB30;LATIN SMALL LETTER BARRED ALPHA;Ll;0;L;;;;;N;;;;; +AB31;LATIN SMALL LETTER A REVERSED-SCHWA;Ll;0;L;;;;;N;;;;; +AB32;LATIN SMALL LETTER BLACKLETTER E;Ll;0;L;;;;;N;;;;; +AB33;LATIN SMALL LETTER BARRED E;Ll;0;L;;;;;N;;;;; +AB34;LATIN SMALL LETTER E WITH FLOURISH;Ll;0;L;;;;;N;;;;; +AB35;LATIN SMALL LETTER LENIS F;Ll;0;L;;;;;N;;;;; +AB36;LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB37;LATIN SMALL LETTER L WITH INVERTED LAZY S;Ll;0;L;;;;;N;;;;; +AB38;LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +AB39;LATIN SMALL LETTER L WITH MIDDLE RING;Ll;0;L;;;;;N;;;;; +AB3A;LATIN SMALL LETTER M WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3B;LATIN SMALL LETTER N WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3C;LATIN SMALL LETTER ENG WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3D;LATIN SMALL LETTER BLACKLETTER O;Ll;0;L;;;;;N;;;;; +AB3E;LATIN SMALL LETTER BLACKLETTER O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB3F;LATIN SMALL LETTER OPEN O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB40;LATIN SMALL LETTER INVERTED OE;Ll;0;L;;;;;N;;;;; +AB41;LATIN SMALL LETTER TURNED OE WITH STROKE;Ll;0;L;;;;;N;;;;; +AB42;LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE;Ll;0;L;;;;;N;;;;; +AB43;LATIN SMALL LETTER TURNED O OPEN-O;Ll;0;L;;;;;N;;;;; +AB44;LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB45;LATIN SMALL LETTER STIRRUP R;Ll;0;L;;;;;N;;;;; +AB46;LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;; +AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;; +AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;; +AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;; +AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;; +AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; +AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; +AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; +AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;A7B3;;A7B3 +AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; +AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB57;LATIN SMALL LETTER X WITH LONG LEFT LEG;Ll;0;L;;;;;N;;;;; +AB58;LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB59;LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF;Ll;0;L;;;;;N;;;;; +AB5A;LATIN SMALL LETTER Y WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB5B;MODIFIER BREVE WITH INVERTED BREVE;Sk;0;L;;;;;N;;;;; +AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L; A727;;;;N;;;;; +AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L; AB37;;;;N;;;;; +AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L; 026B;;;;N;;;;; +AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L; AB52;;;;N;;;;; +AB60;LATIN SMALL LETTER SAKHA YAT;Ll;0;L;;;;;N;;;;; +AB61;LATIN SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;;; +AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;; +AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;; +AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; +AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;; +AB66;LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +AB67;LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +AB68;LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +AB69;MODIFIER LETTER SMALL TURNED W;Lm;0;L; 028D;;;;N;;;;; +AB6A;MODIFIER LETTER LEFT TACK;Sk;0;ON;;;;;N;;;;; +AB6B;MODIFIER LETTER RIGHT TACK;Sk;0;ON;;;;;N;;;;; +AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0 +AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1 +AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2 +AB73;CHEROKEE SMALL LETTER O;Ll;0;L;;;;;N;;;13A3;;13A3 +AB74;CHEROKEE SMALL LETTER U;Ll;0;L;;;;;N;;;13A4;;13A4 +AB75;CHEROKEE SMALL LETTER V;Ll;0;L;;;;;N;;;13A5;;13A5 +AB76;CHEROKEE SMALL LETTER GA;Ll;0;L;;;;;N;;;13A6;;13A6 +AB77;CHEROKEE SMALL LETTER KA;Ll;0;L;;;;;N;;;13A7;;13A7 +AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8 +AB79;CHEROKEE SMALL LETTER GI;Ll;0;L;;;;;N;;;13A9;;13A9 +AB7A;CHEROKEE SMALL LETTER GO;Ll;0;L;;;;;N;;;13AA;;13AA +AB7B;CHEROKEE SMALL LETTER GU;Ll;0;L;;;;;N;;;13AB;;13AB +AB7C;CHEROKEE SMALL LETTER GV;Ll;0;L;;;;;N;;;13AC;;13AC +AB7D;CHEROKEE SMALL LETTER HA;Ll;0;L;;;;;N;;;13AD;;13AD +AB7E;CHEROKEE SMALL LETTER HE;Ll;0;L;;;;;N;;;13AE;;13AE +AB7F;CHEROKEE SMALL LETTER HI;Ll;0;L;;;;;N;;;13AF;;13AF +AB80;CHEROKEE SMALL LETTER HO;Ll;0;L;;;;;N;;;13B0;;13B0 +AB81;CHEROKEE SMALL LETTER HU;Ll;0;L;;;;;N;;;13B1;;13B1 +AB82;CHEROKEE SMALL LETTER HV;Ll;0;L;;;;;N;;;13B2;;13B2 +AB83;CHEROKEE SMALL LETTER LA;Ll;0;L;;;;;N;;;13B3;;13B3 +AB84;CHEROKEE SMALL LETTER LE;Ll;0;L;;;;;N;;;13B4;;13B4 +AB85;CHEROKEE SMALL LETTER LI;Ll;0;L;;;;;N;;;13B5;;13B5 +AB86;CHEROKEE SMALL LETTER LO;Ll;0;L;;;;;N;;;13B6;;13B6 +AB87;CHEROKEE SMALL LETTER LU;Ll;0;L;;;;;N;;;13B7;;13B7 +AB88;CHEROKEE SMALL LETTER LV;Ll;0;L;;;;;N;;;13B8;;13B8 +AB89;CHEROKEE SMALL LETTER MA;Ll;0;L;;;;;N;;;13B9;;13B9 +AB8A;CHEROKEE SMALL LETTER ME;Ll;0;L;;;;;N;;;13BA;;13BA +AB8B;CHEROKEE SMALL LETTER MI;Ll;0;L;;;;;N;;;13BB;;13BB +AB8C;CHEROKEE SMALL LETTER MO;Ll;0;L;;;;;N;;;13BC;;13BC +AB8D;CHEROKEE SMALL LETTER MU;Ll;0;L;;;;;N;;;13BD;;13BD +AB8E;CHEROKEE SMALL LETTER NA;Ll;0;L;;;;;N;;;13BE;;13BE +AB8F;CHEROKEE SMALL LETTER HNA;Ll;0;L;;;;;N;;;13BF;;13BF +AB90;CHEROKEE SMALL LETTER NAH;Ll;0;L;;;;;N;;;13C0;;13C0 +AB91;CHEROKEE SMALL LETTER NE;Ll;0;L;;;;;N;;;13C1;;13C1 +AB92;CHEROKEE SMALL LETTER NI;Ll;0;L;;;;;N;;;13C2;;13C2 +AB93;CHEROKEE SMALL LETTER NO;Ll;0;L;;;;;N;;;13C3;;13C3 +AB94;CHEROKEE SMALL LETTER NU;Ll;0;L;;;;;N;;;13C4;;13C4 +AB95;CHEROKEE SMALL LETTER NV;Ll;0;L;;;;;N;;;13C5;;13C5 +AB96;CHEROKEE SMALL LETTER QUA;Ll;0;L;;;;;N;;;13C6;;13C6 +AB97;CHEROKEE SMALL LETTER QUE;Ll;0;L;;;;;N;;;13C7;;13C7 +AB98;CHEROKEE SMALL LETTER QUI;Ll;0;L;;;;;N;;;13C8;;13C8 +AB99;CHEROKEE SMALL LETTER QUO;Ll;0;L;;;;;N;;;13C9;;13C9 +AB9A;CHEROKEE SMALL LETTER QUU;Ll;0;L;;;;;N;;;13CA;;13CA +AB9B;CHEROKEE SMALL LETTER QUV;Ll;0;L;;;;;N;;;13CB;;13CB +AB9C;CHEROKEE SMALL LETTER SA;Ll;0;L;;;;;N;;;13CC;;13CC +AB9D;CHEROKEE SMALL LETTER S;Ll;0;L;;;;;N;;;13CD;;13CD +AB9E;CHEROKEE SMALL LETTER SE;Ll;0;L;;;;;N;;;13CE;;13CE +AB9F;CHEROKEE SMALL LETTER SI;Ll;0;L;;;;;N;;;13CF;;13CF +ABA0;CHEROKEE SMALL LETTER SO;Ll;0;L;;;;;N;;;13D0;;13D0 +ABA1;CHEROKEE SMALL LETTER SU;Ll;0;L;;;;;N;;;13D1;;13D1 +ABA2;CHEROKEE SMALL LETTER SV;Ll;0;L;;;;;N;;;13D2;;13D2 +ABA3;CHEROKEE SMALL LETTER DA;Ll;0;L;;;;;N;;;13D3;;13D3 +ABA4;CHEROKEE SMALL LETTER TA;Ll;0;L;;;;;N;;;13D4;;13D4 +ABA5;CHEROKEE SMALL LETTER DE;Ll;0;L;;;;;N;;;13D5;;13D5 +ABA6;CHEROKEE SMALL LETTER TE;Ll;0;L;;;;;N;;;13D6;;13D6 +ABA7;CHEROKEE SMALL LETTER DI;Ll;0;L;;;;;N;;;13D7;;13D7 +ABA8;CHEROKEE SMALL LETTER TI;Ll;0;L;;;;;N;;;13D8;;13D8 +ABA9;CHEROKEE SMALL LETTER DO;Ll;0;L;;;;;N;;;13D9;;13D9 +ABAA;CHEROKEE SMALL LETTER DU;Ll;0;L;;;;;N;;;13DA;;13DA +ABAB;CHEROKEE SMALL LETTER DV;Ll;0;L;;;;;N;;;13DB;;13DB +ABAC;CHEROKEE SMALL LETTER DLA;Ll;0;L;;;;;N;;;13DC;;13DC +ABAD;CHEROKEE SMALL LETTER TLA;Ll;0;L;;;;;N;;;13DD;;13DD +ABAE;CHEROKEE SMALL LETTER TLE;Ll;0;L;;;;;N;;;13DE;;13DE +ABAF;CHEROKEE SMALL LETTER TLI;Ll;0;L;;;;;N;;;13DF;;13DF +ABB0;CHEROKEE SMALL LETTER TLO;Ll;0;L;;;;;N;;;13E0;;13E0 +ABB1;CHEROKEE SMALL LETTER TLU;Ll;0;L;;;;;N;;;13E1;;13E1 +ABB2;CHEROKEE SMALL LETTER TLV;Ll;0;L;;;;;N;;;13E2;;13E2 +ABB3;CHEROKEE SMALL LETTER TSA;Ll;0;L;;;;;N;;;13E3;;13E3 +ABB4;CHEROKEE SMALL LETTER TSE;Ll;0;L;;;;;N;;;13E4;;13E4 +ABB5;CHEROKEE SMALL LETTER TSI;Ll;0;L;;;;;N;;;13E5;;13E5 +ABB6;CHEROKEE SMALL LETTER TSO;Ll;0;L;;;;;N;;;13E6;;13E6 +ABB7;CHEROKEE SMALL LETTER TSU;Ll;0;L;;;;;N;;;13E7;;13E7 +ABB8;CHEROKEE SMALL LETTER TSV;Ll;0;L;;;;;N;;;13E8;;13E8 +ABB9;CHEROKEE SMALL LETTER WA;Ll;0;L;;;;;N;;;13E9;;13E9 +ABBA;CHEROKEE SMALL LETTER WE;Ll;0;L;;;;;N;;;13EA;;13EA +ABBB;CHEROKEE SMALL LETTER WI;Ll;0;L;;;;;N;;;13EB;;13EB +ABBC;CHEROKEE SMALL LETTER WO;Ll;0;L;;;;;N;;;13EC;;13EC +ABBD;CHEROKEE SMALL LETTER WU;Ll;0;L;;;;;N;;;13ED;;13ED +ABBE;CHEROKEE SMALL LETTER WV;Ll;0;L;;;;;N;;;13EE;;13EE +ABBF;CHEROKEE SMALL LETTER YA;Ll;0;L;;;;;N;;;13EF;;13EF +ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; +ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; +ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; +ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;; +ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;; +ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;; +ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;; +ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;; +ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;; +ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;; +ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;; +ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;; +ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;; +ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;; +ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;; +ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;; +ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;; +ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;; +ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;; +ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;; +ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;; +ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;; +ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;; +ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;; +ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;; +ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;; +ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;; +ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;; +ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;; +ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;; +ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;; +ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;; +ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;; +ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;; +ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;; +ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;; +ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;; +ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;; +ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;; +ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;; +ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;; +ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;; +ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;; +ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;; +ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;; +ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;; +ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AC00;;Lo;0;L;;;;;N;;;;; +D7A3;;Lo;0;L;;;;;N;;;;; +D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; +D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;; +D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;; +D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;; +D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;; +D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;; +D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;; +D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;; +D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;; +D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;; +D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;; +D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;; +D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;; +D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;; +D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;; +D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;; +D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;; +D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;; +D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;; +D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;; +D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;; +D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;; +D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;; +D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;; +D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;; +D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;; +D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;; +D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;; +D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;; +D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;; +D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;; +D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;; +D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;; +D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;; +D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;; +D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;; +D800;;Cs;0;L;;;;;N;;;;; +DB7F;;Cs;0;L;;;;;N;;;;; +DB80;;Cs;0;L;;;;;N;;;;; +DBFF;;Cs;0;L;;;;;N;;;;; +DC00;;Cs;0;L;;;;;N;;;;; +DFFF;;Cs;0;L;;;;;N;;;;; +E000;;Co;0;L;;;;;N;;;;; +F8FF;;Co;0;L;;;;;N;;;;; +F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; +F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; +F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; +F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; +F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; +F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; +F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; +F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; +F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; +F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; +F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; +F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; +F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; +F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; +F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; +F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; +F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; +F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; +F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; +F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; +F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; +F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; +F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; +F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; +F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; +F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; +F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; +F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; +F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; +F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; +F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; +F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; +F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; +F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; +F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; +F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; +F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; +F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; +F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; +F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; +F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; +F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; +F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; +F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; +F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; +F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; +F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; +F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; +F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; +F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; +F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; +F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; +F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; +F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; +F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; +F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; +F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; +F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; +F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; +F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; +F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; +F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; +F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; +F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; +F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; +F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; +F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; +F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; +F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; +F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; +F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; +F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; +F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; +F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; +F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; +F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; +F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; +F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; +F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; +F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; +F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; +F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; +F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; +F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; +F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; +F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; +F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; +F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; +F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; +F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; +F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; +F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; +F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; +F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; +F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; +F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; +F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; +F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; +F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; +F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; +F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; +F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; +F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; +F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; +F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; +F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; +F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; +F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; +F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; +F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; +F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; +F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; +F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; +F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; +F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; +F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; +F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; +F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; +F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; +F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; +F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; +F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; +F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; +F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; +F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; +F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; +F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; +F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; +F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; +F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; +F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; +F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; +F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; +F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; +F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; +F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; +F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; +F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; +F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; +F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; +F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; +F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; +F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; +F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; +F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; +F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; +F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; +F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; +F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; +F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; +F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; +F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; +F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; +F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; +F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; +F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; +F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; +F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; +F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; +F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; +F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; +F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; +F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; +F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; +F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; +F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; +F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; +F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; +F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; +F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; +F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; +F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; +F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; +F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; +F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; +F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; +F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; +F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; +F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; +F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; +F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; +F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; +F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; +F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; +F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; +F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; +F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; +F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; +F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; +F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; +F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; +F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; +F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; +F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; +F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; +F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; +F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; +F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; +F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; +F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; +F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; +F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; +F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; +F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; +F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; +F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; +F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; +F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; +F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; +F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; +F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; +F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; +F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; +F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; +F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; +F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; +F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; +F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; +F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; +F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; +F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; +F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; +F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; +F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; +F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; +F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; +F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; +F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; +F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; +F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; +F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; +F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; +F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; +F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; +F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; +F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; +F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; +F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; +F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; +F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; +F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; +F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; +F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; +F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; +F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; +F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; +F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; +F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; +F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; +FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; +FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; +FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; +FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; +FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; +FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; +FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; +FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; +FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; +FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; +FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; +FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; +FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; +FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; +FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; +FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; +FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; +FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; +FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; +FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; +FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; +FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; +FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; +FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; +FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; +FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; +FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; +FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; +FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; +FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; +FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; +FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;; +FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; +FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; +FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; +FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;; +FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; +FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; +FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; +FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; +FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; +FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; +FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; +FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; +FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; +FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; +FA2E;CJK COMPATIBILITY IDEOGRAPH-FA2E;Lo;0;L;90DE;;;;N;;;;; +FA2F;CJK COMPATIBILITY IDEOGRAPH-FA2F;Lo;0;L;96B7;;;;N;;;;; +FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; +FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; +FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; +FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; +FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; +FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; +FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; +FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; +FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; +FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; +FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; +FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; +FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; +FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; +FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; +FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; +FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; +FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; +FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; +FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; +FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; +FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; +FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; +FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; +FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; +FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; +FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; +FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; +FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; +FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; +FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; +FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; +FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; +FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; +FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; +FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; +FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; +FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; +FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; +FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; +FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; +FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; +FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; +FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; +FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; +FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; +FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; +FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; +FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; +FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; +FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; +FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; +FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; +FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; +FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; +FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; +FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; +FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; +FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; +FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;; +FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;; +FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;; +FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; +FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; +FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; +FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; +FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; +FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; +FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; +FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; +FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; +FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; +FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; +FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; +FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; +FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; +FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; +FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; +FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; +FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; +FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; +FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; +FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; +FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; +FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; +FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; +FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; +FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; +FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; +FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; +FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; +FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; +FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; +FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; +FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; +FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; +FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; +FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; +FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; +FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; +FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; +FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; +FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; +FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; +FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; +FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; +FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; +FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; +FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; +FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; +FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; +FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; +FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; +FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; +FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; +FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; +FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; +FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; +FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; +FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; +FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; +FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; +FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; +FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; +FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; +FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; +FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; +FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; +FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; +FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; +FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; +FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; +FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; +FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; +FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; +FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; +FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; +FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; +FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; +FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; +FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; +FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; +FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; +FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; +FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; +FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; +FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; +FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; +FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; +FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; +FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; +FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; +FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; +FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; +FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; +FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; +FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; +FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; +FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; +FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; +FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; +FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; +FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; +FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; +FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; +FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; +FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; +FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; +FB00;LATIN SMALL LIGATURE FF;Ll;0;L; 0066 0066;;;;N;;;;; +FB01;LATIN SMALL LIGATURE FI;Ll;0;L; 0066 0069;;;;N;;;;; +FB02;LATIN SMALL LIGATURE FL;Ll;0;L; 0066 006C;;;;N;;;;; +FB03;LATIN SMALL LIGATURE FFI;Ll;0;L; 0066 0066 0069;;;;N;;;;; +FB04;LATIN SMALL LIGATURE FFL;Ll;0;L; 0066 0066 006C;;;;N;;;;; +FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L; 017F 0074;;;;N;;;;; +FB06;LATIN SMALL LIGATURE ST;Ll;0;L; 0073 0074;;;;N;;;;; +FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L; 0574 0576;;;;N;;;;; +FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L; 0574 0565;;;;N;;;;; +FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L; 0574 056B;;;;N;;;;; +FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L; 057E 0576;;;;N;;;;; +FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L; 0574 056D;;;;N;;;;; +FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; +FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; +FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; +FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R; 05E2;;;;N;;;;; +FB21;HEBREW LETTER WIDE ALEF;Lo;0;R; 05D0;;;;N;;;;; +FB22;HEBREW LETTER WIDE DALET;Lo;0;R; 05D3;;;;N;;;;; +FB23;HEBREW LETTER WIDE HE;Lo;0;R; 05D4;;;;N;;;;; +FB24;HEBREW LETTER WIDE KAF;Lo;0;R; 05DB;;;;N;;;;; +FB25;HEBREW LETTER WIDE LAMED;Lo;0;R; 05DC;;;;N;;;;; +FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R; 05DD;;;;N;;;;; +FB27;HEBREW LETTER WIDE RESH;Lo;0;R; 05E8;;;;N;;;;; +FB28;HEBREW LETTER WIDE TAV;Lo;0;R; 05EA;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; +FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; +FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; +FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; +FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; +FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; +FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; +FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; +FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; +FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; +FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; +FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; +FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; +FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; +FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; +FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; +FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; +FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; +FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; +FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; +FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; +FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; +FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; +FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; +FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; +FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; +FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; +FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; +FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; +FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; +FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; +FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; +FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R; 05D0 05DC;;;;N;;;;; +FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL; 0671;;;;N;;;;; +FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL; 0671;;;;N;;;;; +FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL; 067B;;;;N;;;;; +FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL; 067E;;;;N;;;;; +FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL; 067A;;;;N;;;;; +FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL; 067F;;;;N;;;;; +FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL; 0679;;;;N;;;;; +FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL; 0684;;;;N;;;;; +FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL; 0683;;;;N;;;;; +FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL; 0687;;;;N;;;;; +FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL; 068D;;;;N;;;;; +FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL; 068D;;;;N;;;;; +FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL; 068C;;;;N;;;;; +FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL; 068C;;;;N;;;;; +FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL; 068E;;;;N;;;;; +FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL; 068E;;;;N;;;;; +FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL; 0688;;;;N;;;;; +FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL; 0688;;;;N;;;;; +FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL; 0698;;;;N;;;;; +FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL; 0698;;;;N;;;;; +FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL; 0691;;;;N;;;;; +FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL; 0691;;;;N;;;;; +FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL; 06BA;;;;N;;;;; +FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL; 06BA;;;;N;;;;; +FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL; 06C0;;;;N;;;;; +FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL; 06C0;;;;N;;;;; +FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL; 06D2;;;;N;;;;; +FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL; 06D2;;;;N;;;;; +FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 06D3;;;;N;;;;; +FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 06D3;;;;N;;;;; +FBB2;ARABIC SYMBOL DOT ABOVE;Sk;0;AL;;;;;N;;;;; +FBB3;ARABIC SYMBOL DOT BELOW;Sk;0;AL;;;;;N;;;;; +FBB4;ARABIC SYMBOL TWO DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB5;ARABIC SYMBOL TWO DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB6;ARABIC SYMBOL THREE DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB7;ARABIC SYMBOL THREE DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB8;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB9;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW;Sk;0;AL;;;;;N;;;;; +FBBA;ARABIC SYMBOL FOUR DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBBB;ARABIC SYMBOL FOUR DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBBC;ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW;Sk;0;AL;;;;;N;;;;; +FBBD;ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE;Sk;0;AL;;;;;N;;;;; +FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;; +FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;; +FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;; +FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;; +FBC2;ARABIC SYMBOL WASLA ABOVE;Sk;0;AL;;;;;N;;;;; +FBC3;ARABIC LIGATURE JALLA WA-ALAA;So;0;ON;;;;;N;;;;; +FBC4;ARABIC LIGATURE DAAMAT BARAKAATUHUM;So;0;ON;;;;;N;;;;; +FBC5;ARABIC LIGATURE RAHMATU ALLAAHI TAAALAA ALAYH;So;0;ON;;;;;N;;;;; +FBC6;ARABIC LIGATURE RAHMATU ALLAAHI ALAYHIM;So;0;ON;;;;;N;;;;; +FBC7;ARABIC LIGATURE RAHMATU ALLAAHI ALAYHIMAA;So;0;ON;;;;;N;;;;; +FBC8;ARABIC LIGATURE RAHIMAHUM ALLAAHU TAAALAA;So;0;ON;;;;;N;;;;; +FBC9;ARABIC LIGATURE RAHIMAHUMAA ALLAAH;So;0;ON;;;;;N;;;;; +FBCA;ARABIC LIGATURE RAHIMAHUMAA ALLAAHU TAAALAA;So;0;ON;;;;;N;;;;; +FBCB;ARABIC LIGATURE RADI ALLAAHU TAAALAA ANHUM;So;0;ON;;;;;N;;;;; +FBCC;ARABIC LIGATURE HAFIZAHU ALLAAH;So;0;ON;;;;;N;;;;; +FBCD;ARABIC LIGATURE HAFIZAHU ALLAAHU TAAALAA;So;0;ON;;;;;N;;;;; +FBCE;ARABIC LIGATURE HAFIZAHUM ALLAAHU TAAALAA;So;0;ON;;;;;N;;;;; +FBCF;ARABIC LIGATURE HAFIZAHUMAA ALLAAHU TAAALAA;So;0;ON;;;;;N;;;;; +FBD0;ARABIC LIGATURE SALLALLAAHU TAAALAA ALAYHI WA-SALLAM;So;0;ON;;;;;N;;;;; +FBD1;ARABIC LIGATURE AJJAL ALLAAHU FARAJAHU ASH-SHAREEF;So;0;ON;;;;;N;;;;; +FBD2;ARABIC LIGATURE ALAYHI AR-RAHMAH;So;0;ON;;;;;N;;;;; +FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL; 06C7;;;;N;;;;; +FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL; 06C7;;;;N;;;;; +FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL; 06C6;;;;N;;;;; +FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL; 06C6;;;;N;;;;; +FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL; 06C8;;;;N;;;;; +FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL; 06C8;;;;N;;;;; +FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0677;;;;N;;;;; +FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL; 06CB;;;;N;;;;; +FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL; 06CB;;;;N;;;;; +FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL; 06C5;;;;N;;;;; +FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL; 06C5;;;;N;;;;; +FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL; 06C9;;;;N;;;;; +FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL; 06C9;;;;N;;;;; +FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0649;;;;N;;;;; +FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL; 0649;;;;N;;;;; +FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL; 0626 0627;;;;N;;;;; +FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL; 0626 0627;;;;N;;;;; +FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; +FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; +FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL; 0626 0648;;;;N;;;;; +FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL; 0626 0648;;;;N;;;;; +FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; +FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; +FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; +FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; +FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; +FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; +FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL; 0626 062C;;;;N;;;;; +FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL; 0626 062D;;;;N;;;;; +FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL; 0626 064A;;;;N;;;;; +FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0628 062C;;;;N;;;;; +FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL; 0628 062D;;;;N;;;;; +FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0628 062E;;;;N;;;;; +FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0628 0649;;;;N;;;;; +FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL; 0628 064A;;;;N;;;;; +FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062A 062C;;;;N;;;;; +FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL; 062A 062D;;;;N;;;;; +FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL; 062A 062E;;;;N;;;;; +FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062A 0649;;;;N;;;;; +FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL; 062A 064A;;;;N;;;;; +FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062B 062C;;;;N;;;;; +FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062B 0649;;;;N;;;;; +FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL; 062B 064A;;;;N;;;;; +FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL; 062C 062D;;;;N;;;;; +FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 062C 0645;;;;N;;;;; +FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062D 062C;;;;N;;;;; +FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062D 0645;;;;N;;;;; +FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062E 062C;;;;N;;;;; +FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL; 062E 062D;;;;N;;;;; +FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062E 0645;;;;N;;;;; +FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL; 0635 062D;;;;N;;;;; +FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0635 0645;;;;N;;;;; +FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL; 0636 062C;;;;N;;;;; +FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL; 0636 062D;;;;N;;;;; +FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL; 0636 062E;;;;N;;;;; +FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0636 0645;;;;N;;;;; +FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL; 0637 062D;;;;N;;;;; +FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL; 0639 062C;;;;N;;;;; +FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL; 0639 0645;;;;N;;;;; +FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL; 063A 062C;;;;N;;;;; +FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL; 063A 0645;;;;N;;;;; +FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0641 062C;;;;N;;;;; +FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL; 0641 062D;;;;N;;;;; +FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0641 062E;;;;N;;;;; +FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0641 0645;;;;N;;;;; +FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0641 0649;;;;N;;;;; +FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL; 0641 064A;;;;N;;;;; +FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL; 0642 062D;;;;N;;;;; +FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0642 0645;;;;N;;;;; +FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0642 0649;;;;N;;;;; +FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL; 0642 064A;;;;N;;;;; +FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL; 0643 0627;;;;N;;;;; +FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL; 0643 062C;;;;N;;;;; +FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL; 0643 062D;;;;N;;;;; +FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL; 0643 062E;;;;N;;;;; +FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0643 0649;;;;N;;;;; +FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL; 0643 064A;;;;N;;;;; +FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL; 0644 062C;;;;N;;;;; +FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL; 0644 062D;;;;N;;;;; +FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL; 0644 062E;;;;N;;;;; +FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0644 0649;;;;N;;;;; +FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL; 0644 064A;;;;N;;;;; +FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL; 0645 062C;;;;N;;;;; +FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL; 0645 062D;;;;N;;;;; +FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL; 0645 062E;;;;N;;;;; +FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0645 0649;;;;N;;;;; +FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL; 0645 064A;;;;N;;;;; +FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL; 0646 062C;;;;N;;;;; +FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL; 0646 062D;;;;N;;;;; +FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL; 0646 062E;;;;N;;;;; +FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0646 0649;;;;N;;;;; +FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL; 0646 064A;;;;N;;;;; +FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0647 062C;;;;N;;;;; +FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0647 0645;;;;N;;;;; +FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0647 0649;;;;N;;;;; +FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL; 0647 064A;;;;N;;;;; +FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL; 064A 062C;;;;N;;;;; +FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL; 064A 062D;;;;N;;;;; +FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL; 064A 062E;;;;N;;;;; +FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 064A 0649;;;;N;;;;; +FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL; 064A 064A;;;;N;;;;; +FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0630 0670;;;;N;;;;; +FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0631 0670;;;;N;;;;; +FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0649 0670;;;;N;;;;; +FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C 0651;;;;N;;;;; +FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D 0651;;;;N;;;;; +FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL; 0020 064E 0651;;;;N;;;;; +FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F 0651;;;;N;;;;; +FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL; 0020 0650 0651;;;;N;;;;; +FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0020 0651 0670;;;;N;;;;; +FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL; 0626 0631;;;;N;;;;; +FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL; 0626 0632;;;;N;;;;; +FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL; 0626 0646;;;;N;;;;; +FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL; 0626 064A;;;;N;;;;; +FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL; 0628 0631;;;;N;;;;; +FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL; 0628 0632;;;;N;;;;; +FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL; 0628 0646;;;;N;;;;; +FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0628 0649;;;;N;;;;; +FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL; 0628 064A;;;;N;;;;; +FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL; 062A 0631;;;;N;;;;; +FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL; 062A 0632;;;;N;;;;; +FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL; 062A 0646;;;;N;;;;; +FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0649;;;;N;;;;; +FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL; 062A 064A;;;;N;;;;; +FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL; 062B 0631;;;;N;;;;; +FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL; 062B 0632;;;;N;;;;; +FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL; 062B 0646;;;;N;;;;; +FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062B 0649;;;;N;;;;; +FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL; 062B 064A;;;;N;;;;; +FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0641 0649;;;;N;;;;; +FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL; 0641 064A;;;;N;;;;; +FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0642 0649;;;;N;;;;; +FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL; 0642 064A;;;;N;;;;; +FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL; 0643 0627;;;;N;;;;; +FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0643 0649;;;;N;;;;; +FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL; 0643 064A;;;;N;;;;; +FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 0649;;;;N;;;;; +FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL; 0644 064A;;;;N;;;;; +FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL; 0645 0627;;;;N;;;;; +FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL; 0646 0631;;;;N;;;;; +FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL; 0646 0632;;;;N;;;;; +FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL; 0646 0646;;;;N;;;;; +FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0649;;;;N;;;;; +FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL; 0646 064A;;;;N;;;;; +FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL; 0649 0670;;;;N;;;;; +FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL; 064A 0631;;;;N;;;;; +FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL; 064A 0632;;;;N;;;;; +FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL; 064A 0646;;;;N;;;;; +FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 064A 0649;;;;N;;;;; +FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL; 064A 064A;;;;N;;;;; +FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL; 0626 062C;;;;N;;;;; +FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL; 0626 062D;;;;N;;;;; +FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL; 0626 062E;;;;N;;;;; +FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; +FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL; 0628 062C;;;;N;;;;; +FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL; 0628 062D;;;;N;;;;; +FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL; 0628 062E;;;;N;;;;; +FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; +FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062C;;;;N;;;;; +FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL; 062A 062D;;;;N;;;;; +FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL; 062A 062E;;;;N;;;;; +FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; +FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 062D;;;;N;;;;; +FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062C 0645;;;;N;;;;; +FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062D 062C;;;;N;;;;; +FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062D 0645;;;;N;;;;; +FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 062E 062C;;;;N;;;;; +FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062E 0645;;;;N;;;;; +FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D;;;;N;;;;; +FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL; 0635 062E;;;;N;;;;; +FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645;;;;N;;;;; +FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL; 0636 062C;;;;N;;;;; +FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL; 0636 062D;;;;N;;;;; +FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL; 0636 062E;;;;N;;;;; +FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL; 0636 0645;;;;N;;;;; +FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL; 0637 062D;;;;N;;;;; +FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL; 0639 062C;;;;N;;;;; +FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645;;;;N;;;;; +FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL; 063A 062C;;;;N;;;;; +FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL; 063A 0645;;;;N;;;;; +FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL; 0641 062C;;;;N;;;;; +FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL; 0641 062D;;;;N;;;;; +FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL; 0641 062E;;;;N;;;;; +FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 0645;;;;N;;;;; +FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL; 0642 062D;;;;N;;;;; +FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL; 0642 0645;;;;N;;;;; +FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL; 0643 062C;;;;N;;;;; +FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL; 0643 062D;;;;N;;;;; +FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL; 0643 062E;;;;N;;;;; +FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C;;;;N;;;;; +FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL; 0644 062D;;;;N;;;;; +FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL; 0644 062E;;;;N;;;;; +FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL; 0644 0647;;;;N;;;;; +FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062C;;;;N;;;;; +FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062D;;;;N;;;;; +FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062E;;;;N;;;;; +FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL; 0646 062C;;;;N;;;;; +FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL; 0646 062D;;;;N;;;;; +FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL; 0646 062E;;;;N;;;;; +FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; +FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL; 0647 062C;;;;N;;;;; +FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645;;;;N;;;;; +FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL; 0647 0670;;;;N;;;;; +FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL; 064A 062C;;;;N;;;;; +FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL; 064A 062D;;;;N;;;;; +FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL; 064A 062E;;;;N;;;;; +FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; +FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; +FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; +FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; +FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL; 062B 0647;;;;N;;;;; +FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; +FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; +FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; +FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; +FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL; 0640 064E 0651;;;;N;;;;; +FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F 0651;;;;N;;;;; +FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL; 0640 0650 0651;;;;N;;;;; +FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0637 0649;;;;N;;;;; +FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL; 0637 064A;;;;N;;;;; +FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0639 0649;;;;N;;;;; +FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL; 0639 064A;;;;N;;;;; +FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 063A 0649;;;;N;;;;; +FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL; 063A 064A;;;;N;;;;; +FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0633 0649;;;;N;;;;; +FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0633 064A;;;;N;;;;; +FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0634 0649;;;;N;;;;; +FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0634 064A;;;;N;;;;; +FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062D 0649;;;;N;;;;; +FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL; 062D 064A;;;;N;;;;; +FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062C 0649;;;;N;;;;; +FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL; 062C 064A;;;;N;;;;; +FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062E 0649;;;;N;;;;; +FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL; 062E 064A;;;;N;;;;; +FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0635 0649;;;;N;;;;; +FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL; 0635 064A;;;;N;;;;; +FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0636 0649;;;;N;;;;; +FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL; 0636 064A;;;;N;;;;; +FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL; 0634 0631;;;;N;;;;; +FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL; 0633 0631;;;;N;;;;; +FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL; 0635 0631;;;;N;;;;; +FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL; 0636 0631;;;;N;;;;; +FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0637 0649;;;;N;;;;; +FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL; 0637 064A;;;;N;;;;; +FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0649;;;;N;;;;; +FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL; 0639 064A;;;;N;;;;; +FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0649;;;;N;;;;; +FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL; 063A 064A;;;;N;;;;; +FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 0649;;;;N;;;;; +FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL; 0633 064A;;;;N;;;;; +FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0634 0649;;;;N;;;;; +FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL; 0634 064A;;;;N;;;;; +FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0649;;;;N;;;;; +FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL; 062D 064A;;;;N;;;;; +FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0649;;;;N;;;;; +FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 064A;;;;N;;;;; +FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062E 0649;;;;N;;;;; +FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL; 062E 064A;;;;N;;;;; +FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0635 0649;;;;N;;;;; +FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL; 0635 064A;;;;N;;;;; +FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 0649;;;;N;;;;; +FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL; 0636 064A;;;;N;;;;; +FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL; 0634 0631;;;;N;;;;; +FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL; 0633 0631;;;;N;;;;; +FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL; 0635 0631;;;;N;;;;; +FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL; 0636 0631;;;;N;;;;; +FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; +FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; +FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL; 0627 064B;;;;N;;;;; +FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL; 0627 064B;;;;N;;;;; +FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;; +FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;; +FD40;ARABIC LIGATURE RAHIMAHU ALLAAH;So;0;ON;;;;;N;;;;; +FD41;ARABIC LIGATURE RADI ALLAAHU ANH;So;0;ON;;;;;N;;;;; +FD42;ARABIC LIGATURE RADI ALLAAHU ANHAA;So;0;ON;;;;;N;;;;; +FD43;ARABIC LIGATURE RADI ALLAAHU ANHUM;So;0;ON;;;;;N;;;;; +FD44;ARABIC LIGATURE RADI ALLAAHU ANHUMAA;So;0;ON;;;;;N;;;;; +FD45;ARABIC LIGATURE RADI ALLAAHU ANHUNNA;So;0;ON;;;;;N;;;;; +FD46;ARABIC LIGATURE SALLALLAAHU ALAYHI WA-AALIH;So;0;ON;;;;;N;;;;; +FD47;ARABIC LIGATURE ALAYHI AS-SALAAM;So;0;ON;;;;;N;;;;; +FD48;ARABIC LIGATURE ALAYHIM AS-SALAAM;So;0;ON;;;;;N;;;;; +FD49;ARABIC LIGATURE ALAYHIMAA AS-SALAAM;So;0;ON;;;;;N;;;;; +FD4A;ARABIC LIGATURE ALAYHI AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; +FD4B;ARABIC LIGATURE QUDDISA SIRRAH;So;0;ON;;;;;N;;;;; +FD4C;ARABIC LIGATURE SALLALLAHU ALAYHI WAAALIHEE WA-SALLAM;So;0;ON;;;;;N;;;;; +FD4D;ARABIC LIGATURE ALAYHAA AS-SALAAM;So;0;ON;;;;;N;;;;; +FD4E;ARABIC LIGATURE TABAARAKA WA-TAAALAA;So;0;ON;;;;;N;;;;; +FD4F;ARABIC LIGATURE RAHIMAHUM ALLAAH;So;0;ON;;;;;N;;;;; +FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062C 0645;;;;N;;;;; +FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; +FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; +FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062D 0645;;;;N;;;;; +FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062E 0645;;;;N;;;;; +FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 062A 0645 062C;;;;N;;;;; +FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062A 0645 062D;;;;N;;;;; +FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 062A 0645 062E;;;;N;;;;; +FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; +FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; +FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 0645 064A;;;;N;;;;; +FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0645 0649;;;;N;;;;; +FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062D 062C;;;;N;;;;; +FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 062C 062D;;;;N;;;;; +FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062C 0649;;;;N;;;;; +FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; +FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; +FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0633 0645 062C;;;;N;;;;; +FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; +FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; +FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; +FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; +FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; +FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; +FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; +FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0634 062C 064A;;;;N;;;;; +FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; +FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; +FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; +FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; +FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 062D 0649;;;;N;;;;; +FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; +FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; +FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; +FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; +FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645 0645;;;;N;;;;; +FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0637 0645 064A;;;;N;;;;; +FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; +FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; +FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; +FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0645 0649;;;;N;;;;; +FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 063A 0645 0645;;;;N;;;;; +FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 063A 0645 064A;;;;N;;;;; +FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0645 0649;;;;N;;;;; +FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; +FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; +FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; +FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0642 0645 0645;;;;N;;;;; +FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; +FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0644 062D 064A;;;;N;;;;; +FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 062D 0649;;;;N;;;;; +FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; +FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; +FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; +FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; +FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; +FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; +FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062D 062C;;;;N;;;;; +FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062D 0645;;;;N;;;;; +FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062D 064A;;;;N;;;;; +FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062C 062D;;;;N;;;;; +FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062C 0645;;;;N;;;;; +FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062E 062C;;;;N;;;;; +FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062E 0645;;;;N;;;;; +FD90;ARABIC LIGATURE RAHMATU ALLAAHI ALAYH;So;0;ON;;;;;N;;;;; +FD91;ARABIC LIGATURE RAHMATU ALLAAHI ALAYHAA;So;0;ON;;;;;N;;;;; +FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062C 062E;;;;N;;;;; +FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0647 0645 062C;;;;N;;;;; +FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645 0645;;;;N;;;;; +FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062D 0645;;;;N;;;;; +FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062D 0649;;;;N;;;;; +FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; +FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; +FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062C 0649;;;;N;;;;; +FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 0645 064A;;;;N;;;;; +FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0645 0649;;;;N;;;;; +FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; +FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; +FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062E 064A;;;;N;;;;; +FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 062C 064A;;;;N;;;;; +FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062C 0649;;;;N;;;;; +FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 062A 062E 064A;;;;N;;;;; +FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062E 0649;;;;N;;;;; +FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 0645 064A;;;;N;;;;; +FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0645 0649;;;;N;;;;; +FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 0645 064A;;;;N;;;;; +FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 062D 0649;;;;N;;;;; +FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0645 0649;;;;N;;;;; +FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062E 0649;;;;N;;;;; +FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0635 062D 064A;;;;N;;;;; +FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0634 062D 064A;;;;N;;;;; +FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0636 062D 064A;;;;N;;;;; +FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 062C 064A;;;;N;;;;; +FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 0645 064A;;;;N;;;;; +FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 064A 062D 064A;;;;N;;;;; +FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 062C 064A;;;;N;;;;; +FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 0645 064A;;;;N;;;;; +FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 0645 064A;;;;N;;;;; +FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0642 0645 064A;;;;N;;;;; +FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0646 062D 064A;;;;N;;;;; +FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; +FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; +FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0639 0645 064A;;;;N;;;;; +FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0643 0645 064A;;;;N;;;;; +FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; +FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062E 064A;;;;N;;;;; +FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; +FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; +FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; +FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; +FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 062C 062D 064A;;;;N;;;;; +FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 062C 064A;;;;N;;;;; +FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 062C 064A;;;;N;;;;; +FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0641 0645 064A;;;;N;;;;; +FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062D 064A;;;;N;;;;; +FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; +FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; +FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; +FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0633 062E 064A;;;;N;;;;; +FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 062C 064A;;;;N;;;;; +FDC8;ARABIC LIGATURE RAHIMAHU ALLAAH TAAALAA;So;0;ON;;;;;N;;;;; +FDC9;ARABIC LIGATURE RADI ALLAAHU TAAALAA ANH;So;0;ON;;;;;N;;;;; +FDCA;ARABIC LIGATURE RADI ALLAAHU TAAALAA ANHAA;So;0;ON;;;;;N;;;;; +FDCB;ARABIC LIGATURE RADI ALLAAHU TAAALAA ANHUMAA;So;0;ON;;;;;N;;;;; +FDCC;ARABIC LIGATURE SALLALLAHU ALAYHI WA-ALAA AALIHEE WA-SALLAM;So;0;ON;;;;;N;;;;; +FDCD;ARABIC LIGATURE AJJAL ALLAAHU TAAALAA FARAJAHU ASH-SHAREEF;So;0;ON;;;;;N;;;;; +FDCE;ARABIC LIGATURE KARRAMA ALLAAHU WAJHAH;So;0;ON;;;;;N;;;;; +FDCF;ARABIC LIGATURE SALAAMUHU ALAYNAA;So;0;ON;;;;;N;;;;; +FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0635 0644 06D2;;;;N;;;;; +FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0642 0644 06D2;;;;N;;;;; +FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL; 0627 0644 0644 0647;;;;N;;;;; +FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL; 0627 0643 0628 0631;;;;N;;;;; +FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL; 0645 062D 0645 062F;;;;N;;;;; +FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL; 0635 0644 0639 0645;;;;N;;;;; +FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL; 0631 0633 0648 0644;;;;N;;;;; +FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL; 0639 0644 064A 0647;;;;N;;;;; +FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL; 0648 0633 0644 0645;;;;N;;;;; +FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL; 0635 0644 0649;;;;N;;;;; +FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; +FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL; 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; +FDFC;RIAL SIGN;Sc;0;AL; 0631 06CC 0627 0644;;;;N;;;;; +FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;; +FDFE;ARABIC LIGATURE SUBHAANAHU WA TAAALAA;So;0;ON;;;;;N;;;;; +FDFF;ARABIC LIGATURE AZZA WA JALL;So;0;ON;;;;;N;;;;; +FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; +FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; +FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; +FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; +FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; +FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; +FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; +FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; +FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; +FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; +FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; +FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; +FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; +FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; +FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; +FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; +FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON; 002C;;;;N;;;;; +FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;;;;; +FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON; 003A;;;;N;;;;; +FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON; 3016;;;;N;;;;; +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON; 3017;;;;N;;;;; +FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON; 2026;;;;N;;;;; +FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; +FE27;COMBINING LIGATURE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE28;COMBINING LIGATURE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE29;COMBINING TILDE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; +FE2E;COMBINING CYRILLIC TITLO LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE2F;COMBINING CYRILLIC TITLO RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; +FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; +FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; +FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; +FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; +FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; +FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; +FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; +FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; +FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; +FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; +FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON; 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; +FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON; 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; +FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON; 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; +FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON; 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; +FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON; 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; +FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON; 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; +FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; +FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; +FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON; 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; +FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON; 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; +FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; +FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; +FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;N;;;;; +FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;N;;;;; +FE49;DASHED OVERLINE;Po;0;ON; 203E;;;;N;SPACING DASHED OVERSCORE;;;; +FE4A;CENTRELINE OVERLINE;Po;0;ON; 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; +FE4B;WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING WAVY OVERSCORE;;;; +FE4C;DOUBLE WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; +FE4D;DASHED LOW LINE;Pc;0;ON; 005F;;;;N;SPACING DASHED UNDERSCORE;;;; +FE4E;CENTRELINE LOW LINE;Pc;0;ON; 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; +FE4F;WAVY LOW LINE;Pc;0;ON; 005F;;;;N;SPACING WAVY UNDERSCORE;;;; +FE50;SMALL COMMA;Po;0;CS; 002C;;;;N;;;;; +FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FE52;SMALL FULL STOP;Po;0;CS; 002E;;;;N;SMALL PERIOD;;;; +FE54;SMALL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FE55;SMALL COLON;Po;0;CS; 003A;;;;N;;;;; +FE56;SMALL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FE57;SMALL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FE58;SMALL EM DASH;Pd;0;ON; 2014;;;;N;;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE5F;SMALL NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; +FE60;SMALL AMPERSAND;Po;0;ON; 0026;;;;N;;;;; +FE61;SMALL ASTERISK;Po;0;ON; 002A;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; +FE66;SMALL EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +FE68;SMALL REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;SMALL BACKSLASH;;;; +FE69;SMALL DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; +FE6A;SMALL PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; +FE6B;SMALL COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; +FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL; 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; +FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL; 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; +FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; +FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; +FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; +FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL; 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; +FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL; 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; +FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; +FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; +FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL; 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; +FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL; 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; +FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL; 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; +FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL; 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; +FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL; 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; +FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL; 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; +FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL; 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; +FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; +FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; +FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; +FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; +FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; +FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; +FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; +FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; +FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; +FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; +FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; +FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; +FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; +FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; +FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; +FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; +FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; +FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; +FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; +FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; +FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; +FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; +FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; +FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; +FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; +FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; +FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; +FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; +FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; +FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; +FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; +FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; +FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; +FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; +FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; +FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; +FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; +FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; +FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; +FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; +FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; +FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; +FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; +FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; +FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; +FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; +FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; +FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; +FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; +FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; +FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; +FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; +FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; +FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; +FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; +FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; +FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; +FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; +FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; +FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; +FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; +FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; +FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; +FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; +FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; +FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; +FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; +FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; +FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; +FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; +FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; +FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; +FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; +FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; +FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; +FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; +FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; +FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; +FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; +FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; +FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; +FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; +FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; +FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; +FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; +FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; +FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; +FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; +FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; +FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; +FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; +FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; +FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; +FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; +FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; +FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; +FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; +FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; +FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; +FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; +FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; +FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; +FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; +FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; +FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; +FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; +FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; +FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; +FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; +FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; +FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; +FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; +FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; +FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; +FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; +FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; +FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; +FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; +FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; +FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FF02;FULLWIDTH QUOTATION MARK;Po;0;ON; 0022;;;;N;;;;; +FF03;FULLWIDTH NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; +FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; +FF05;FULLWIDTH PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; +FF06;FULLWIDTH AMPERSAND;Po;0;ON; 0026;;;;N;;;;; +FF07;FULLWIDTH APOSTROPHE;Po;0;ON; 0027;;;;N;;;;; +FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; +FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; +FF0A;FULLWIDTH ASTERISK;Po;0;ON; 002A;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FF0C;FULLWIDTH COMMA;Po;0;CS; 002C;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; +FF0E;FULLWIDTH FULL STOP;Po;0;CS; 002E;;;;N;FULLWIDTH PERIOD;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;CS; 002F;;;;N;FULLWIDTH SLASH;;;; +FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +FF11;FULLWIDTH DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +FF12;FULLWIDTH DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +FF13;FULLWIDTH DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +FF16;FULLWIDTH DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +FF19;FULLWIDTH DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +FF1A;FULLWIDTH COLON;Po;0;CS; 003A;;;;N;;;;; +FF1B;FULLWIDTH SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; +FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; +FF1F;FULLWIDTH QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; +FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L; 0041;;;;N;;;;FF41; +FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L; 0042;;;;N;;;;FF42; +FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L; 0043;;;;N;;;;FF43; +FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L; 0044;;;;N;;;;FF44; +FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L; 0045;;;;N;;;;FF45; +FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L; 0046;;;;N;;;;FF46; +FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L; 0047;;;;N;;;;FF47; +FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L; 0048;;;;N;;;;FF48; +FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L; 0049;;;;N;;;;FF49; +FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L; 004A;;;;N;;;;FF4A; +FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L; 004B;;;;N;;;;FF4B; +FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L; 004C;;;;N;;;;FF4C; +FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L; 004D;;;;N;;;;FF4D; +FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L; 004E;;;;N;;;;FF4E; +FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L; 004F;;;;N;;;;FF4F; +FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L; 0050;;;;N;;;;FF50; +FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L; 0051;;;;N;;;;FF51; +FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L; 0052;;;;N;;;;FF52; +FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L; 0053;;;;N;;;;FF53; +FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L; 0054;;;;N;;;;FF54; +FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L; 0055;;;;N;;;;FF55; +FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L; 0056;;;;N;;;;FF56; +FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L; 0057;;;;N;;;;FF57; +FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L; 0058;;;;N;;;;FF58; +FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L; 0059;;;;N;;;;FF59; +FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L; 005A;;;;N;;;;FF5A; +FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; +FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;FULLWIDTH BACKSLASH;;;; +FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; +FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON; 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; +FF3F;FULLWIDTH LOW LINE;Pc;0;ON; 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; +FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON; 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; +FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L; 0061;;;;N;;;FF21;;FF21 +FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L; 0062;;;;N;;;FF22;;FF22 +FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L; 0063;;;;N;;;FF23;;FF23 +FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L; 0064;;;;N;;;FF24;;FF24 +FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L; 0065;;;;N;;;FF25;;FF25 +FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L; 0066;;;;N;;;FF26;;FF26 +FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L; 0067;;;;N;;;FF27;;FF27 +FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L; 0068;;;;N;;;FF28;;FF28 +FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L; 0069;;;;N;;;FF29;;FF29 +FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L; 006A;;;;N;;;FF2A;;FF2A +FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L; 006B;;;;N;;;FF2B;;FF2B +FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L; 006C;;;;N;;;FF2C;;FF2C +FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L; 006D;;;;N;;;FF2D;;FF2D +FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;FF2E;;FF2E +FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L; 006F;;;;N;;;FF2F;;FF2F +FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L; 0070;;;;N;;;FF30;;FF30 +FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L; 0071;;;;N;;;FF31;;FF31 +FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L; 0072;;;;N;;;FF32;;FF32 +FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L; 0073;;;;N;;;FF33;;FF33 +FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L; 0074;;;;N;;;FF34;;FF34 +FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L; 0075;;;;N;;;FF35;;FF35 +FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L; 0076;;;;N;;;FF36;;FF36 +FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L; 0077;;;;N;;;FF37;;FF37 +FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L; 0078;;;;N;;;FF38;;FF38 +FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L; 0079;;;;N;;;FF39;;FF39 +FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L; 007A;;;;N;;;FF3A;;FF3A +FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; +FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON; 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; +FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; +FF5E;FULLWIDTH TILDE;Sm;0;ON; 007E;;;;N;FULLWIDTH SPACING TILDE;;;; +FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON; 2985;;;;Y;;;;; +FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON; 2986;;;;Y;;;;; +FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; +FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; +FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; +FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON; 30FB;;;;N;;;;; +FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L; 30F2;;;;N;;;;; +FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L; 30A1;;;;N;;;;; +FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L; 30A3;;;;N;;;;; +FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L; 30A5;;;;N;;;;; +FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L; 30A7;;;;N;;;;; +FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L; 30A9;;;;N;;;;; +FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L; 30E3;;;;N;;;;; +FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L; 30E5;;;;N;;;;; +FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L; 30E7;;;;N;;;;; +FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L; 30C3;;;;N;;;;; +FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L; 30FC;;;;N;;;;; +FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L; 30A2;;;;N;;;;; +FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L; 30A4;;;;N;;;;; +FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L; 30A6;;;;N;;;;; +FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L; 30A8;;;;N;;;;; +FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L; 30AA;;;;N;;;;; +FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L; 30AB;;;;N;;;;; +FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L; 30AD;;;;N;;;;; +FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L; 30AF;;;;N;;;;; +FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L; 30B1;;;;N;;;;; +FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L; 30B3;;;;N;;;;; +FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L; 30B5;;;;N;;;;; +FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L; 30B7;;;;N;;;;; +FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L; 30B9;;;;N;;;;; +FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L; 30BB;;;;N;;;;; +FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L; 30BD;;;;N;;;;; +FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L; 30BF;;;;N;;;;; +FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L; 30C1;;;;N;;;;; +FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L; 30C4;;;;N;;;;; +FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L; 30C6;;;;N;;;;; +FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L; 30C8;;;;N;;;;; +FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L; 30CA;;;;N;;;;; +FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L; 30CB;;;;N;;;;; +FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L; 30CC;;;;N;;;;; +FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L; 30CD;;;;N;;;;; +FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L; 30CE;;;;N;;;;; +FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L; 30CF;;;;N;;;;; +FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L; 30D2;;;;N;;;;; +FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L; 30D5;;;;N;;;;; +FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L; 30D8;;;;N;;;;; +FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L; 30DB;;;;N;;;;; +FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L; 30DE;;;;N;;;;; +FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L; 30DF;;;;N;;;;; +FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L; 30E0;;;;N;;;;; +FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L; 30E1;;;;N;;;;; +FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L; 30E2;;;;N;;;;; +FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L; 30E4;;;;N;;;;; +FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L; 30E6;;;;N;;;;; +FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L; 30E8;;;;N;;;;; +FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L; 30E9;;;;N;;;;; +FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L; 30EA;;;;N;;;;; +FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L; 30EB;;;;N;;;;; +FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L; 30EC;;;;N;;;;; +FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L; 30ED;;;;N;;;;; +FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L; 30EF;;;;N;;;;; +FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L; 30F3;;;;N;;;;; +FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; +FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; +FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L; 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; +FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L; 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; +FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L; 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; +FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; +FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L; 3134;;;;N;;;;; +FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; +FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; +FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L; 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; +FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L; 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; +FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L; 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; +FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; +FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; +FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; +FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L; 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; +FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; +FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; +FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; +FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L; 3141;;;;N;;;;; +FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L; 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; +FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L; 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; +FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L; 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; +FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L; 3145;;;;N;;;;; +FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L; 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; +FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L; 3147;;;;N;;;;; +FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L; 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; +FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L; 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; +FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L; 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; +FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L; 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; +FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L; 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; +FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L; 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; +FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L; 314E;;;;N;;;;; +FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L; 314F;;;;N;;;;; +FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L; 3150;;;;N;;;;; +FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L; 3151;;;;N;;;;; +FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L; 3152;;;;N;;;;; +FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L; 3153;;;;N;;;;; +FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L; 3154;;;;N;;;;; +FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L; 3155;;;;N;;;;; +FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L; 3156;;;;N;;;;; +FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L; 3157;;;;N;;;;; +FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L; 3158;;;;N;;;;; +FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L; 3159;;;;N;;;;; +FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L; 315A;;;;N;;;;; +FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L; 315B;;;;N;;;;; +FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L; 315C;;;;N;;;;; +FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L; 315D;;;;N;;;;; +FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L; 315E;;;;N;;;;; +FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L; 315F;;;;N;;;;; +FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L; 3160;;;;N;;;;; +FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L; 3161;;;;N;;;;; +FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L; 3162;;;;N;;;;; +FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; +FFE0;FULLWIDTH CENT SIGN;Sc;0;ET; 00A2;;;;N;;;;; +FFE1;FULLWIDTH POUND SIGN;Sc;0;ET; 00A3;;;;N;;;;; +FFE2;FULLWIDTH NOT SIGN;Sm;0;ON; 00AC;;;;N;;;;; +FFE3;FULLWIDTH MACRON;Sk;0;ON; 00AF;;;;N;FULLWIDTH SPACING MACRON;;;; +FFE4;FULLWIDTH BROKEN BAR;So;0;ON; 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; +FFE5;FULLWIDTH YEN SIGN;Sc;0;ET; 00A5;;;;N;;;;; +FFE6;FULLWIDTH WON SIGN;Sc;0;ET; 20A9;;;;N;;;;; +FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON; 2502;;;;N;;;;; +FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON; 2190;;;;N;;;;; +FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON; 2191;;;;N;;;;; +FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON; 2192;;;;N;;;;; +FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON; 2193;;;;N;;;;; +FFED;HALFWIDTH BLACK SQUARE;So;0;ON; 25A0;;;;N;;;;; +FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON; 25CB;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; +FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; +10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; +10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; +10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; +10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; +10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; +10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; +10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; +10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; +10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; +1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; +1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; +1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; +1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; +1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; +10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; +10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; +10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; +10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; +10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; +10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; +10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; +10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; +10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; +10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; +1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; +1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; +1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; +1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; +1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; +1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; +10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; +10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; +10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; +10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; +10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; +10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; +10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; +10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; +10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; +1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; +1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; +1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; +1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; +1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; +1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; +10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; +10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; +10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; +10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; +10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; +10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; +10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; +10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; +10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; +10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; +1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; +1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; +1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; +1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; +10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; +10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; +10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; +10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; +10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; +10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; +10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; +10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; +10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; +10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; +1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; +1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; +1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; +1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; +10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; +10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; +10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; +10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; +10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; +10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; +10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; +10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; +10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; +10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; +1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; +1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; +1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; +1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; +10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; +10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; +10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; +10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; +10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; +10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; +10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; +10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; +10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; +10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; +1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; +1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; +1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; +1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; +1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; +1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; +10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; +10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; +10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; +10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; +10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; +10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; +10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; +10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; +10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; +10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; +1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; +1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; +1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; +1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; +1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; +1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; +100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; +100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; +100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; +100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; +100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; +100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; +100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; +100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; +100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; +100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; +100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; +100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; +100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; +100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; +100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; +100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; +100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; +100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; +100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; +100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; +100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; +100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; +100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; +100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; +100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; +100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; +100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; +100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; +100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; +100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; +100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; +100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; +100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; +100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; +100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; +100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; +100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; +100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; +100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; +100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; +100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; +100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;; +100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; +100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;; +100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; +100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; +100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; +100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; +100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; +100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; +100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; +100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; +100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; +100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; +100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; +100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; +100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; +100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; +100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; +100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; +100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; +100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; +100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; +100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; +100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; +100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; +100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; +100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; +100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; +100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; +100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; +100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; +100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; +100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; +100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; +100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; +100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; +100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; +100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; +100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; +100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; +100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; +100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; +100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; +100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; +100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; +100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; +100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; +100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; +100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; +100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; +10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; +10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; +10102;AEGEAN CHECK MARK;Po;0;L;;;;;N;;;;; +10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; +10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; +10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; +1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; +1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; +1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; +1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; +1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; +1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; +10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; +10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; +10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; +10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; +10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; +10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; +10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; +10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; +1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; +1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; +1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; +1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; +1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; +10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; +10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; +10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; +10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; +10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; +10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; +10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; +10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; +10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; +1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; +1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; +1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; +1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; +1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; +10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; +10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; +10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; +10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; +10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; +10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; +10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; +1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; +1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; +10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; +10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; +10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; +10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; +10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; +10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; +10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; +10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; +1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; +1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; +1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; +1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; +1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; +1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; +10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; +10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; +10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; +10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; +10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; +10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; +10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; +10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; +10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; +10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; +1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; +1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; +10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; +10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; +10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; +10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; +10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; +10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; +1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; +1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; +10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; +10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; +10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; +10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; +10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; +10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; +10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; +1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; +1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; +1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; +1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; +10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; +10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; +10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; +10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; +10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; +10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; +10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; +10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; +10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; +10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; +1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; +1018B;GREEK ONE QUARTER SIGN;No;0;ON;;;;1/4;N;;;;; +1018C;GREEK SINUSOID SIGN;So;0;ON;;;;;N;;;;; +1018D;GREEK INDICTION SIGN;So;0;L;;;;;N;;;;; +1018E;NOMISMA SIGN;So;0;L;;;;;N;;;;; +10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; +10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; +10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; +10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; +10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; +10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; +10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; +10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; +1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; +1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; +1019C;ASCIA SYMBOL;So;0;ON;;;;;N;;;;; +101A0;GREEK SYMBOL TAU RHO;So;0;ON;;;;;N;;;;; +101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; +101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; +101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; +101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; +101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; +101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; +101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; +101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; +101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; +101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; +101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; +101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; +101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; +101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; +101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; +101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; +101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; +101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; +101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; +101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; +101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; +101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; +101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; +101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; +101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; +101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; +101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; +101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; +101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; +101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; +101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; +101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; +101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; +101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; +101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; +101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; +101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; +101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; +101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; +101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; +101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; +101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; +101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; +101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; +101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; +101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; +10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; +10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; +10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; +10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; +10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; +10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; +10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; +10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; +10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; +10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; +1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; +1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; +1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; +1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; +1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; +1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; +10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; +10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; +10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; +10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; +10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; +10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; +10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; +10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; +10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; +10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; +1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; +1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; +1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; +102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; +102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; +102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; +102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; +102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; +102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; +102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; +102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; +102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; +102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; +102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; +102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; +102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; +102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; +102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; +102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; +102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; +102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; +102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; +102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; +102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; +102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; +102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; +102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; +102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; +102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; +102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; +102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; +102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; +102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; +102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; +102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; +102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; +102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; +102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; +102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; +102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; +102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; +102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; +102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; +102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; +102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; +102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; +102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; +102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; +102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; +102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; +102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; +102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; +102E0;COPTIC EPACT THOUSANDS MARK;Mn;220;NSM;;;;;N;;;;; +102E1;COPTIC EPACT DIGIT ONE;No;0;EN;;;;1;N;;;;; +102E2;COPTIC EPACT DIGIT TWO;No;0;EN;;;;2;N;;;;; +102E3;COPTIC EPACT DIGIT THREE;No;0;EN;;;;3;N;;;;; +102E4;COPTIC EPACT DIGIT FOUR;No;0;EN;;;;4;N;;;;; +102E5;COPTIC EPACT DIGIT FIVE;No;0;EN;;;;5;N;;;;; +102E6;COPTIC EPACT DIGIT SIX;No;0;EN;;;;6;N;;;;; +102E7;COPTIC EPACT DIGIT SEVEN;No;0;EN;;;;7;N;;;;; +102E8;COPTIC EPACT DIGIT EIGHT;No;0;EN;;;;8;N;;;;; +102E9;COPTIC EPACT DIGIT NINE;No;0;EN;;;;9;N;;;;; +102EA;COPTIC EPACT NUMBER TEN;No;0;EN;;;;10;N;;;;; +102EB;COPTIC EPACT NUMBER TWENTY;No;0;EN;;;;20;N;;;;; +102EC;COPTIC EPACT NUMBER THIRTY;No;0;EN;;;;30;N;;;;; +102ED;COPTIC EPACT NUMBER FORTY;No;0;EN;;;;40;N;;;;; +102EE;COPTIC EPACT NUMBER FIFTY;No;0;EN;;;;50;N;;;;; +102EF;COPTIC EPACT NUMBER SIXTY;No;0;EN;;;;60;N;;;;; +102F0;COPTIC EPACT NUMBER SEVENTY;No;0;EN;;;;70;N;;;;; +102F1;COPTIC EPACT NUMBER EIGHTY;No;0;EN;;;;80;N;;;;; +102F2;COPTIC EPACT NUMBER NINETY;No;0;EN;;;;90;N;;;;; +102F3;COPTIC EPACT NUMBER ONE HUNDRED;No;0;EN;;;;100;N;;;;; +102F4;COPTIC EPACT NUMBER TWO HUNDRED;No;0;EN;;;;200;N;;;;; +102F5;COPTIC EPACT NUMBER THREE HUNDRED;No;0;EN;;;;300;N;;;;; +102F6;COPTIC EPACT NUMBER FOUR HUNDRED;No;0;EN;;;;400;N;;;;; +102F7;COPTIC EPACT NUMBER FIVE HUNDRED;No;0;EN;;;;500;N;;;;; +102F8;COPTIC EPACT NUMBER SIX HUNDRED;No;0;EN;;;;600;N;;;;; +102F9;COPTIC EPACT NUMBER SEVEN HUNDRED;No;0;EN;;;;700;N;;;;; +102FA;COPTIC EPACT NUMBER EIGHT HUNDRED;No;0;EN;;;;800;N;;;;; +102FB;COPTIC EPACT NUMBER NINE HUNDRED;No;0;EN;;;;900;N;;;;; +10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; +10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; +10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; +10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; +10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; +10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; +10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; +10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; +10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; +10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; +1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; +1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; +1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; +1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; +1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; +1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;; +10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; +10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; +10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; +10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; +10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; +10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; +10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; +10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;; +10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; +10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; +1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; +1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;; +1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;; +1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;; +1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;; +1031F;OLD ITALIC LETTER ESS;Lo;0;L;;;;;N;;;;; +10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; +10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; +10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; +10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; +1032D;OLD ITALIC LETTER YE;Lo;0;L;;;;;N;;;;; +1032E;OLD ITALIC LETTER NORTHERN TSE;Lo;0;L;;;;;N;;;;; +1032F;OLD ITALIC LETTER SOUTHERN TSE;Lo;0;L;;;;;N;;;;; +10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; +10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; +10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; +10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; +10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; +10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; +10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; +10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; +10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; +10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; +1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; +1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; +1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; +1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; +1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; +1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; +10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; +10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; +10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; +10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; +10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; +10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; +10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; +10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; +10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; +10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; +1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; +10350;OLD PERMIC LETTER AN;Lo;0;L;;;;;N;;;;; +10351;OLD PERMIC LETTER BUR;Lo;0;L;;;;;N;;;;; +10352;OLD PERMIC LETTER GAI;Lo;0;L;;;;;N;;;;; +10353;OLD PERMIC LETTER DOI;Lo;0;L;;;;;N;;;;; +10354;OLD PERMIC LETTER E;Lo;0;L;;;;;N;;;;; +10355;OLD PERMIC LETTER ZHOI;Lo;0;L;;;;;N;;;;; +10356;OLD PERMIC LETTER DZHOI;Lo;0;L;;;;;N;;;;; +10357;OLD PERMIC LETTER ZATA;Lo;0;L;;;;;N;;;;; +10358;OLD PERMIC LETTER DZITA;Lo;0;L;;;;;N;;;;; +10359;OLD PERMIC LETTER I;Lo;0;L;;;;;N;;;;; +1035A;OLD PERMIC LETTER KOKE;Lo;0;L;;;;;N;;;;; +1035B;OLD PERMIC LETTER LEI;Lo;0;L;;;;;N;;;;; +1035C;OLD PERMIC LETTER MENOE;Lo;0;L;;;;;N;;;;; +1035D;OLD PERMIC LETTER NENOE;Lo;0;L;;;;;N;;;;; +1035E;OLD PERMIC LETTER VOOI;Lo;0;L;;;;;N;;;;; +1035F;OLD PERMIC LETTER PEEI;Lo;0;L;;;;;N;;;;; +10360;OLD PERMIC LETTER REI;Lo;0;L;;;;;N;;;;; +10361;OLD PERMIC LETTER SII;Lo;0;L;;;;;N;;;;; +10362;OLD PERMIC LETTER TAI;Lo;0;L;;;;;N;;;;; +10363;OLD PERMIC LETTER U;Lo;0;L;;;;;N;;;;; +10364;OLD PERMIC LETTER CHERY;Lo;0;L;;;;;N;;;;; +10365;OLD PERMIC LETTER SHOOI;Lo;0;L;;;;;N;;;;; +10366;OLD PERMIC LETTER SHCHOOI;Lo;0;L;;;;;N;;;;; +10367;OLD PERMIC LETTER YRY;Lo;0;L;;;;;N;;;;; +10368;OLD PERMIC LETTER YERU;Lo;0;L;;;;;N;;;;; +10369;OLD PERMIC LETTER O;Lo;0;L;;;;;N;;;;; +1036A;OLD PERMIC LETTER OO;Lo;0;L;;;;;N;;;;; +1036B;OLD PERMIC LETTER EF;Lo;0;L;;;;;N;;;;; +1036C;OLD PERMIC LETTER HA;Lo;0;L;;;;;N;;;;; +1036D;OLD PERMIC LETTER TSIU;Lo;0;L;;;;;N;;;;; +1036E;OLD PERMIC LETTER VER;Lo;0;L;;;;;N;;;;; +1036F;OLD PERMIC LETTER YER;Lo;0;L;;;;;N;;;;; +10370;OLD PERMIC LETTER YERI;Lo;0;L;;;;;N;;;;; +10371;OLD PERMIC LETTER YAT;Lo;0;L;;;;;N;;;;; +10372;OLD PERMIC LETTER IE;Lo;0;L;;;;;N;;;;; +10373;OLD PERMIC LETTER YU;Lo;0;L;;;;;N;;;;; +10374;OLD PERMIC LETTER YA;Lo;0;L;;;;;N;;;;; +10375;OLD PERMIC LETTER IA;Lo;0;L;;;;;N;;;;; +10376;COMBINING OLD PERMIC LETTER AN;Mn;230;NSM;;;;;N;;;;; +10377;COMBINING OLD PERMIC LETTER DOI;Mn;230;NSM;;;;;N;;;;; +10378;COMBINING OLD PERMIC LETTER ZATA;Mn;230;NSM;;;;;N;;;;; +10379;COMBINING OLD PERMIC LETTER NENOE;Mn;230;NSM;;;;;N;;;;; +1037A;COMBINING OLD PERMIC LETTER SII;Mn;230;NSM;;;;;N;;;;; +10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; +10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; +10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; +10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; +10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; +10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; +10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; +10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; +10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; +10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; +1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; +1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; +1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; +1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; +1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; +1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; +10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; +10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; +10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; +10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; +10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; +10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; +10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; +10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; +10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; +10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; +1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; +1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; +1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; +1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; +1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; +103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; +103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; +103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; +103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; +103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; +103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; +103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; +103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; +103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; +103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; +103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; +103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; +103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; +103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; +103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; +103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; +103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; +103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; +103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; +103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; +103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; +103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; +103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; +103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; +103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; +103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; +103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; +103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; +103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; +103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; +103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; +103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; +103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; +103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; +103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; +103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; +103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; +103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; +103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; +103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; +103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; +103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; +103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; +103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; +103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; +103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; +103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; +103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; +103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; +10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; +10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; +10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; +10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; +10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; +10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; +10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; +10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; +10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; +10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; +1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; +1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; +1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; +1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; +1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; +1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; +10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; +10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; +10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; +10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; +10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; +10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; +10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; +10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; +10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; +10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; +1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; +1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; +1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; +1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; +1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; +1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; +10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; +10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; +10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; +10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; +10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; +10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; +10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; +10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; +10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 +10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 +1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 +1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 +1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 +1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 +1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 +1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 +10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 +10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 +10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A +10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B +10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C +10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D +10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E +10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F +10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 +10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 +1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 +1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 +1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 +1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 +1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 +1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 +10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 +10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 +10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A +10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B +10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C +10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D +10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E +10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F +10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 +10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 +1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 +1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 +1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 +1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 +1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 +1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 +10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; +10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; +10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; +10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; +10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; +10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; +10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; +10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; +10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; +10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; +1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; +1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; +1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; +1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; +1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; +1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; +10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; +10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; +10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; +10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; +10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; +10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; +10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; +10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; +10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; +10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; +1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; +1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; +1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; +1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; +1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; +1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; +10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; +10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; +10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; +10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; +10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; +10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; +10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; +10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; +10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; +10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; +1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; +1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; +1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; +1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; +1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; +1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; +10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; +10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; +10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; +10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; +10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; +10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; +10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; +10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; +10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; +10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; +1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; +1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; +1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; +1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; +1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; +1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; +10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; +10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; +10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; +10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; +10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; +10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; +10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; +10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; +10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; +10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; +1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; +1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; +1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; +1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; +104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104B0;OSAGE CAPITAL LETTER A;Lu;0;L;;;;;N;;;;104D8; +104B1;OSAGE CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;104D9; +104B2;OSAGE CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;104DA; +104B3;OSAGE CAPITAL LETTER AH;Lu;0;L;;;;;N;;;;104DB; +104B4;OSAGE CAPITAL LETTER BRA;Lu;0;L;;;;;N;;;;104DC; +104B5;OSAGE CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;104DD; +104B6;OSAGE CAPITAL LETTER EHCHA;Lu;0;L;;;;;N;;;;104DE; +104B7;OSAGE CAPITAL LETTER E;Lu;0;L;;;;;N;;;;104DF; +104B8;OSAGE CAPITAL LETTER EIN;Lu;0;L;;;;;N;;;;104E0; +104B9;OSAGE CAPITAL LETTER HA;Lu;0;L;;;;;N;;;;104E1; +104BA;OSAGE CAPITAL LETTER HYA;Lu;0;L;;;;;N;;;;104E2; +104BB;OSAGE CAPITAL LETTER I;Lu;0;L;;;;;N;;;;104E3; +104BC;OSAGE CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;104E4; +104BD;OSAGE CAPITAL LETTER EHKA;Lu;0;L;;;;;N;;;;104E5; +104BE;OSAGE CAPITAL LETTER KYA;Lu;0;L;;;;;N;;;;104E6; +104BF;OSAGE CAPITAL LETTER LA;Lu;0;L;;;;;N;;;;104E7; +104C0;OSAGE CAPITAL LETTER MA;Lu;0;L;;;;;N;;;;104E8; +104C1;OSAGE CAPITAL LETTER NA;Lu;0;L;;;;;N;;;;104E9; +104C2;OSAGE CAPITAL LETTER O;Lu;0;L;;;;;N;;;;104EA; +104C3;OSAGE CAPITAL LETTER OIN;Lu;0;L;;;;;N;;;;104EB; +104C4;OSAGE CAPITAL LETTER PA;Lu;0;L;;;;;N;;;;104EC; +104C5;OSAGE CAPITAL LETTER EHPA;Lu;0;L;;;;;N;;;;104ED; +104C6;OSAGE CAPITAL LETTER SA;Lu;0;L;;;;;N;;;;104EE; +104C7;OSAGE CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;104EF; +104C8;OSAGE CAPITAL LETTER TA;Lu;0;L;;;;;N;;;;104F0; +104C9;OSAGE CAPITAL LETTER EHTA;Lu;0;L;;;;;N;;;;104F1; +104CA;OSAGE CAPITAL LETTER TSA;Lu;0;L;;;;;N;;;;104F2; +104CB;OSAGE CAPITAL LETTER EHTSA;Lu;0;L;;;;;N;;;;104F3; +104CC;OSAGE CAPITAL LETTER TSHA;Lu;0;L;;;;;N;;;;104F4; +104CD;OSAGE CAPITAL LETTER DHA;Lu;0;L;;;;;N;;;;104F5; +104CE;OSAGE CAPITAL LETTER U;Lu;0;L;;;;;N;;;;104F6; +104CF;OSAGE CAPITAL LETTER WA;Lu;0;L;;;;;N;;;;104F7; +104D0;OSAGE CAPITAL LETTER KHA;Lu;0;L;;;;;N;;;;104F8; +104D1;OSAGE CAPITAL LETTER GHA;Lu;0;L;;;;;N;;;;104F9; +104D2;OSAGE CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;104FA; +104D3;OSAGE CAPITAL LETTER ZHA;Lu;0;L;;;;;N;;;;104FB; +104D8;OSAGE SMALL LETTER A;Ll;0;L;;;;;N;;;104B0;;104B0 +104D9;OSAGE SMALL LETTER AI;Ll;0;L;;;;;N;;;104B1;;104B1 +104DA;OSAGE SMALL LETTER AIN;Ll;0;L;;;;;N;;;104B2;;104B2 +104DB;OSAGE SMALL LETTER AH;Ll;0;L;;;;;N;;;104B3;;104B3 +104DC;OSAGE SMALL LETTER BRA;Ll;0;L;;;;;N;;;104B4;;104B4 +104DD;OSAGE SMALL LETTER CHA;Ll;0;L;;;;;N;;;104B5;;104B5 +104DE;OSAGE SMALL LETTER EHCHA;Ll;0;L;;;;;N;;;104B6;;104B6 +104DF;OSAGE SMALL LETTER E;Ll;0;L;;;;;N;;;104B7;;104B7 +104E0;OSAGE SMALL LETTER EIN;Ll;0;L;;;;;N;;;104B8;;104B8 +104E1;OSAGE SMALL LETTER HA;Ll;0;L;;;;;N;;;104B9;;104B9 +104E2;OSAGE SMALL LETTER HYA;Ll;0;L;;;;;N;;;104BA;;104BA +104E3;OSAGE SMALL LETTER I;Ll;0;L;;;;;N;;;104BB;;104BB +104E4;OSAGE SMALL LETTER KA;Ll;0;L;;;;;N;;;104BC;;104BC +104E5;OSAGE SMALL LETTER EHKA;Ll;0;L;;;;;N;;;104BD;;104BD +104E6;OSAGE SMALL LETTER KYA;Ll;0;L;;;;;N;;;104BE;;104BE +104E7;OSAGE SMALL LETTER LA;Ll;0;L;;;;;N;;;104BF;;104BF +104E8;OSAGE SMALL LETTER MA;Ll;0;L;;;;;N;;;104C0;;104C0 +104E9;OSAGE SMALL LETTER NA;Ll;0;L;;;;;N;;;104C1;;104C1 +104EA;OSAGE SMALL LETTER O;Ll;0;L;;;;;N;;;104C2;;104C2 +104EB;OSAGE SMALL LETTER OIN;Ll;0;L;;;;;N;;;104C3;;104C3 +104EC;OSAGE SMALL LETTER PA;Ll;0;L;;;;;N;;;104C4;;104C4 +104ED;OSAGE SMALL LETTER EHPA;Ll;0;L;;;;;N;;;104C5;;104C5 +104EE;OSAGE SMALL LETTER SA;Ll;0;L;;;;;N;;;104C6;;104C6 +104EF;OSAGE SMALL LETTER SHA;Ll;0;L;;;;;N;;;104C7;;104C7 +104F0;OSAGE SMALL LETTER TA;Ll;0;L;;;;;N;;;104C8;;104C8 +104F1;OSAGE SMALL LETTER EHTA;Ll;0;L;;;;;N;;;104C9;;104C9 +104F2;OSAGE SMALL LETTER TSA;Ll;0;L;;;;;N;;;104CA;;104CA +104F3;OSAGE SMALL LETTER EHTSA;Ll;0;L;;;;;N;;;104CB;;104CB +104F4;OSAGE SMALL LETTER TSHA;Ll;0;L;;;;;N;;;104CC;;104CC +104F5;OSAGE SMALL LETTER DHA;Ll;0;L;;;;;N;;;104CD;;104CD +104F6;OSAGE SMALL LETTER U;Ll;0;L;;;;;N;;;104CE;;104CE +104F7;OSAGE SMALL LETTER WA;Ll;0;L;;;;;N;;;104CF;;104CF +104F8;OSAGE SMALL LETTER KHA;Ll;0;L;;;;;N;;;104D0;;104D0 +104F9;OSAGE SMALL LETTER GHA;Ll;0;L;;;;;N;;;104D1;;104D1 +104FA;OSAGE SMALL LETTER ZA;Ll;0;L;;;;;N;;;104D2;;104D2 +104FB;OSAGE SMALL LETTER ZHA;Ll;0;L;;;;;N;;;104D3;;104D3 +10500;ELBASAN LETTER A;Lo;0;L;;;;;N;;;;; +10501;ELBASAN LETTER BE;Lo;0;L;;;;;N;;;;; +10502;ELBASAN LETTER CE;Lo;0;L;;;;;N;;;;; +10503;ELBASAN LETTER CHE;Lo;0;L;;;;;N;;;;; +10504;ELBASAN LETTER DE;Lo;0;L;;;;;N;;;;; +10505;ELBASAN LETTER NDE;Lo;0;L;;;;;N;;;;; +10506;ELBASAN LETTER DHE;Lo;0;L;;;;;N;;;;; +10507;ELBASAN LETTER EI;Lo;0;L;;;;;N;;;;; +10508;ELBASAN LETTER E;Lo;0;L;;;;;N;;;;; +10509;ELBASAN LETTER FE;Lo;0;L;;;;;N;;;;; +1050A;ELBASAN LETTER GE;Lo;0;L;;;;;N;;;;; +1050B;ELBASAN LETTER GJE;Lo;0;L;;;;;N;;;;; +1050C;ELBASAN LETTER HE;Lo;0;L;;;;;N;;;;; +1050D;ELBASAN LETTER I;Lo;0;L;;;;;N;;;;; +1050E;ELBASAN LETTER JE;Lo;0;L;;;;;N;;;;; +1050F;ELBASAN LETTER KE;Lo;0;L;;;;;N;;;;; +10510;ELBASAN LETTER LE;Lo;0;L;;;;;N;;;;; +10511;ELBASAN LETTER LLE;Lo;0;L;;;;;N;;;;; +10512;ELBASAN LETTER ME;Lo;0;L;;;;;N;;;;; +10513;ELBASAN LETTER NE;Lo;0;L;;;;;N;;;;; +10514;ELBASAN LETTER NA;Lo;0;L;;;;;N;;;;; +10515;ELBASAN LETTER NJE;Lo;0;L;;;;;N;;;;; +10516;ELBASAN LETTER O;Lo;0;L;;;;;N;;;;; +10517;ELBASAN LETTER PE;Lo;0;L;;;;;N;;;;; +10518;ELBASAN LETTER QE;Lo;0;L;;;;;N;;;;; +10519;ELBASAN LETTER RE;Lo;0;L;;;;;N;;;;; +1051A;ELBASAN LETTER RRE;Lo;0;L;;;;;N;;;;; +1051B;ELBASAN LETTER SE;Lo;0;L;;;;;N;;;;; +1051C;ELBASAN LETTER SHE;Lo;0;L;;;;;N;;;;; +1051D;ELBASAN LETTER TE;Lo;0;L;;;;;N;;;;; +1051E;ELBASAN LETTER THE;Lo;0;L;;;;;N;;;;; +1051F;ELBASAN LETTER U;Lo;0;L;;;;;N;;;;; +10520;ELBASAN LETTER VE;Lo;0;L;;;;;N;;;;; +10521;ELBASAN LETTER XE;Lo;0;L;;;;;N;;;;; +10522;ELBASAN LETTER Y;Lo;0;L;;;;;N;;;;; +10523;ELBASAN LETTER ZE;Lo;0;L;;;;;N;;;;; +10524;ELBASAN LETTER ZHE;Lo;0;L;;;;;N;;;;; +10525;ELBASAN LETTER GHE;Lo;0;L;;;;;N;;;;; +10526;ELBASAN LETTER GHAMMA;Lo;0;L;;;;;N;;;;; +10527;ELBASAN LETTER KHE;Lo;0;L;;;;;N;;;;; +10530;CAUCASIAN ALBANIAN LETTER ALT;Lo;0;L;;;;;N;;;;; +10531;CAUCASIAN ALBANIAN LETTER BET;Lo;0;L;;;;;N;;;;; +10532;CAUCASIAN ALBANIAN LETTER GIM;Lo;0;L;;;;;N;;;;; +10533;CAUCASIAN ALBANIAN LETTER DAT;Lo;0;L;;;;;N;;;;; +10534;CAUCASIAN ALBANIAN LETTER EB;Lo;0;L;;;;;N;;;;; +10535;CAUCASIAN ALBANIAN LETTER ZARL;Lo;0;L;;;;;N;;;;; +10536;CAUCASIAN ALBANIAN LETTER EYN;Lo;0;L;;;;;N;;;;; +10537;CAUCASIAN ALBANIAN LETTER ZHIL;Lo;0;L;;;;;N;;;;; +10538;CAUCASIAN ALBANIAN LETTER TAS;Lo;0;L;;;;;N;;;;; +10539;CAUCASIAN ALBANIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1053A;CAUCASIAN ALBANIAN LETTER YOWD;Lo;0;L;;;;;N;;;;; +1053B;CAUCASIAN ALBANIAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +1053C;CAUCASIAN ALBANIAN LETTER IRB;Lo;0;L;;;;;N;;;;; +1053D;CAUCASIAN ALBANIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1053E;CAUCASIAN ALBANIAN LETTER LAN;Lo;0;L;;;;;N;;;;; +1053F;CAUCASIAN ALBANIAN LETTER INYA;Lo;0;L;;;;;N;;;;; +10540;CAUCASIAN ALBANIAN LETTER XEYN;Lo;0;L;;;;;N;;;;; +10541;CAUCASIAN ALBANIAN LETTER DYAN;Lo;0;L;;;;;N;;;;; +10542;CAUCASIAN ALBANIAN LETTER CAR;Lo;0;L;;;;;N;;;;; +10543;CAUCASIAN ALBANIAN LETTER JHOX;Lo;0;L;;;;;N;;;;; +10544;CAUCASIAN ALBANIAN LETTER KAR;Lo;0;L;;;;;N;;;;; +10545;CAUCASIAN ALBANIAN LETTER LYIT;Lo;0;L;;;;;N;;;;; +10546;CAUCASIAN ALBANIAN LETTER HEYT;Lo;0;L;;;;;N;;;;; +10547;CAUCASIAN ALBANIAN LETTER QAY;Lo;0;L;;;;;N;;;;; +10548;CAUCASIAN ALBANIAN LETTER AOR;Lo;0;L;;;;;N;;;;; +10549;CAUCASIAN ALBANIAN LETTER CHOY;Lo;0;L;;;;;N;;;;; +1054A;CAUCASIAN ALBANIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1054B;CAUCASIAN ALBANIAN LETTER CYAY;Lo;0;L;;;;;N;;;;; +1054C;CAUCASIAN ALBANIAN LETTER MAQ;Lo;0;L;;;;;N;;;;; +1054D;CAUCASIAN ALBANIAN LETTER QAR;Lo;0;L;;;;;N;;;;; +1054E;CAUCASIAN ALBANIAN LETTER NOWC;Lo;0;L;;;;;N;;;;; +1054F;CAUCASIAN ALBANIAN LETTER DZYAY;Lo;0;L;;;;;N;;;;; +10550;CAUCASIAN ALBANIAN LETTER SHAK;Lo;0;L;;;;;N;;;;; +10551;CAUCASIAN ALBANIAN LETTER JAYN;Lo;0;L;;;;;N;;;;; +10552;CAUCASIAN ALBANIAN LETTER ON;Lo;0;L;;;;;N;;;;; +10553;CAUCASIAN ALBANIAN LETTER TYAY;Lo;0;L;;;;;N;;;;; +10554;CAUCASIAN ALBANIAN LETTER FAM;Lo;0;L;;;;;N;;;;; +10555;CAUCASIAN ALBANIAN LETTER DZAY;Lo;0;L;;;;;N;;;;; +10556;CAUCASIAN ALBANIAN LETTER CHAT;Lo;0;L;;;;;N;;;;; +10557;CAUCASIAN ALBANIAN LETTER PEN;Lo;0;L;;;;;N;;;;; +10558;CAUCASIAN ALBANIAN LETTER GHEYS;Lo;0;L;;;;;N;;;;; +10559;CAUCASIAN ALBANIAN LETTER RAT;Lo;0;L;;;;;N;;;;; +1055A;CAUCASIAN ALBANIAN LETTER SEYK;Lo;0;L;;;;;N;;;;; +1055B;CAUCASIAN ALBANIAN LETTER VEYZ;Lo;0;L;;;;;N;;;;; +1055C;CAUCASIAN ALBANIAN LETTER TIWR;Lo;0;L;;;;;N;;;;; +1055D;CAUCASIAN ALBANIAN LETTER SHOY;Lo;0;L;;;;;N;;;;; +1055E;CAUCASIAN ALBANIAN LETTER IWN;Lo;0;L;;;;;N;;;;; +1055F;CAUCASIAN ALBANIAN LETTER CYAW;Lo;0;L;;;;;N;;;;; +10560;CAUCASIAN ALBANIAN LETTER CAYN;Lo;0;L;;;;;N;;;;; +10561;CAUCASIAN ALBANIAN LETTER YAYD;Lo;0;L;;;;;N;;;;; +10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;; +10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;; +1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;; +10570;VITHKUQI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;10597; +10571;VITHKUQI CAPITAL LETTER BBE;Lu;0;L;;;;;N;;;;10598; +10572;VITHKUQI CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;10599; +10573;VITHKUQI CAPITAL LETTER CE;Lu;0;L;;;;;N;;;;1059A; +10574;VITHKUQI CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;1059B; +10575;VITHKUQI CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;1059C; +10576;VITHKUQI CAPITAL LETTER DHE;Lu;0;L;;;;;N;;;;1059D; +10577;VITHKUQI CAPITAL LETTER EI;Lu;0;L;;;;;N;;;;1059E; +10578;VITHKUQI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;1059F; +10579;VITHKUQI CAPITAL LETTER FE;Lu;0;L;;;;;N;;;;105A0; +1057A;VITHKUQI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;105A1; +1057C;VITHKUQI CAPITAL LETTER HA;Lu;0;L;;;;;N;;;;105A3; +1057D;VITHKUQI CAPITAL LETTER HHA;Lu;0;L;;;;;N;;;;105A4; +1057E;VITHKUQI CAPITAL LETTER I;Lu;0;L;;;;;N;;;;105A5; +1057F;VITHKUQI CAPITAL LETTER IJE;Lu;0;L;;;;;N;;;;105A6; +10580;VITHKUQI CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;105A7; +10581;VITHKUQI CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;105A8; +10582;VITHKUQI CAPITAL LETTER LA;Lu;0;L;;;;;N;;;;105A9; +10583;VITHKUQI CAPITAL LETTER LLA;Lu;0;L;;;;;N;;;;105AA; +10584;VITHKUQI CAPITAL LETTER ME;Lu;0;L;;;;;N;;;;105AB; +10585;VITHKUQI CAPITAL LETTER NE;Lu;0;L;;;;;N;;;;105AC; +10586;VITHKUQI CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;105AD; +10587;VITHKUQI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;105AE; +10588;VITHKUQI CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;105AF; +10589;VITHKUQI CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;105B0; +1058A;VITHKUQI CAPITAL LETTER RE;Lu;0;L;;;;;N;;;;105B1; +1058C;VITHKUQI CAPITAL LETTER SE;Lu;0;L;;;;;N;;;;105B3; +1058D;VITHKUQI CAPITAL LETTER SHE;Lu;0;L;;;;;N;;;;105B4; +1058E;VITHKUQI CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;105B5; +1058F;VITHKUQI CAPITAL LETTER THE;Lu;0;L;;;;;N;;;;105B6; +10590;VITHKUQI CAPITAL LETTER U;Lu;0;L;;;;;N;;;;105B7; +10591;VITHKUQI CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;105B8; +10592;VITHKUQI CAPITAL LETTER XE;Lu;0;L;;;;;N;;;;105B9; +10594;VITHKUQI CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;105BB; +10595;VITHKUQI CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;105BC; +10597;VITHKUQI SMALL LETTER A;Ll;0;L;;;;;N;;;10570;;10570 +10598;VITHKUQI SMALL LETTER BBE;Ll;0;L;;;;;N;;;10571;;10571 +10599;VITHKUQI SMALL LETTER BE;Ll;0;L;;;;;N;;;10572;;10572 +1059A;VITHKUQI SMALL LETTER CE;Ll;0;L;;;;;N;;;10573;;10573 +1059B;VITHKUQI SMALL LETTER CHE;Ll;0;L;;;;;N;;;10574;;10574 +1059C;VITHKUQI SMALL LETTER DE;Ll;0;L;;;;;N;;;10575;;10575 +1059D;VITHKUQI SMALL LETTER DHE;Ll;0;L;;;;;N;;;10576;;10576 +1059E;VITHKUQI SMALL LETTER EI;Ll;0;L;;;;;N;;;10577;;10577 +1059F;VITHKUQI SMALL LETTER E;Ll;0;L;;;;;N;;;10578;;10578 +105A0;VITHKUQI SMALL LETTER FE;Ll;0;L;;;;;N;;;10579;;10579 +105A1;VITHKUQI SMALL LETTER GA;Ll;0;L;;;;;N;;;1057A;;1057A +105A3;VITHKUQI SMALL LETTER HA;Ll;0;L;;;;;N;;;1057C;;1057C +105A4;VITHKUQI SMALL LETTER HHA;Ll;0;L;;;;;N;;;1057D;;1057D +105A5;VITHKUQI SMALL LETTER I;Ll;0;L;;;;;N;;;1057E;;1057E +105A6;VITHKUQI SMALL LETTER IJE;Ll;0;L;;;;;N;;;1057F;;1057F +105A7;VITHKUQI SMALL LETTER JE;Ll;0;L;;;;;N;;;10580;;10580 +105A8;VITHKUQI SMALL LETTER KA;Ll;0;L;;;;;N;;;10581;;10581 +105A9;VITHKUQI SMALL LETTER LA;Ll;0;L;;;;;N;;;10582;;10582 +105AA;VITHKUQI SMALL LETTER LLA;Ll;0;L;;;;;N;;;10583;;10583 +105AB;VITHKUQI SMALL LETTER ME;Ll;0;L;;;;;N;;;10584;;10584 +105AC;VITHKUQI SMALL LETTER NE;Ll;0;L;;;;;N;;;10585;;10585 +105AD;VITHKUQI SMALL LETTER NJE;Ll;0;L;;;;;N;;;10586;;10586 +105AE;VITHKUQI SMALL LETTER O;Ll;0;L;;;;;N;;;10587;;10587 +105AF;VITHKUQI SMALL LETTER PE;Ll;0;L;;;;;N;;;10588;;10588 +105B0;VITHKUQI SMALL LETTER QA;Ll;0;L;;;;;N;;;10589;;10589 +105B1;VITHKUQI SMALL LETTER RE;Ll;0;L;;;;;N;;;1058A;;1058A +105B3;VITHKUQI SMALL LETTER SE;Ll;0;L;;;;;N;;;1058C;;1058C +105B4;VITHKUQI SMALL LETTER SHE;Ll;0;L;;;;;N;;;1058D;;1058D +105B5;VITHKUQI SMALL LETTER TE;Ll;0;L;;;;;N;;;1058E;;1058E +105B6;VITHKUQI SMALL LETTER THE;Ll;0;L;;;;;N;;;1058F;;1058F +105B7;VITHKUQI SMALL LETTER U;Ll;0;L;;;;;N;;;10590;;10590 +105B8;VITHKUQI SMALL LETTER VE;Ll;0;L;;;;;N;;;10591;;10591 +105B9;VITHKUQI SMALL LETTER XE;Ll;0;L;;;;;N;;;10592;;10592 +105BB;VITHKUQI SMALL LETTER Y;Ll;0;L;;;;;N;;;10594;;10594 +105BC;VITHKUQI SMALL LETTER ZE;Ll;0;L;;;;;N;;;10595;;10595 +105C0;TODHRI LETTER A;Lo;0;L;;;;;N;;;;; +105C1;TODHRI LETTER AS;Lo;0;L;;;;;N;;;;; +105C2;TODHRI LETTER BA;Lo;0;L;;;;;N;;;;; +105C3;TODHRI LETTER MBA;Lo;0;L;;;;;N;;;;; +105C4;TODHRI LETTER CA;Lo;0;L;;;;;N;;;;; +105C5;TODHRI LETTER CHA;Lo;0;L;;;;;N;;;;; +105C6;TODHRI LETTER DA;Lo;0;L;;;;;N;;;;; +105C7;TODHRI LETTER NDA;Lo;0;L;;;;;N;;;;; +105C8;TODHRI LETTER DHA;Lo;0;L;;;;;N;;;;; +105C9;TODHRI LETTER EI;Lo;0;L;105D2 0307;;;;N;;;;; +105CA;TODHRI LETTER E;Lo;0;L;;;;;N;;;;; +105CB;TODHRI LETTER FA;Lo;0;L;;;;;N;;;;; +105CC;TODHRI LETTER GA;Lo;0;L;;;;;N;;;;; +105CD;TODHRI LETTER NGA;Lo;0;L;;;;;N;;;;; +105CE;TODHRI LETTER GJA;Lo;0;L;;;;;N;;;;; +105CF;TODHRI LETTER NGJA;Lo;0;L;;;;;N;;;;; +105D0;TODHRI LETTER HA;Lo;0;L;;;;;N;;;;; +105D1;TODHRI LETTER HJA;Lo;0;L;;;;;N;;;;; +105D2;TODHRI LETTER I;Lo;0;L;;;;;N;;;;; +105D3;TODHRI LETTER JA;Lo;0;L;;;;;N;;;;; +105D4;TODHRI LETTER KA;Lo;0;L;;;;;N;;;;; +105D5;TODHRI LETTER LA;Lo;0;L;;;;;N;;;;; +105D6;TODHRI LETTER LLA;Lo;0;L;;;;;N;;;;; +105D7;TODHRI LETTER MA;Lo;0;L;;;;;N;;;;; +105D8;TODHRI LETTER NA;Lo;0;L;;;;;N;;;;; +105D9;TODHRI LETTER NJAN;Lo;0;L;;;;;N;;;;; +105DA;TODHRI LETTER O;Lo;0;L;;;;;N;;;;; +105DB;TODHRI LETTER PA;Lo;0;L;;;;;N;;;;; +105DC;TODHRI LETTER QA;Lo;0;L;;;;;N;;;;; +105DD;TODHRI LETTER RA;Lo;0;L;;;;;N;;;;; +105DE;TODHRI LETTER RRA;Lo;0;L;;;;;N;;;;; +105DF;TODHRI LETTER SA;Lo;0;L;;;;;N;;;;; +105E0;TODHRI LETTER SHA;Lo;0;L;;;;;N;;;;; +105E1;TODHRI LETTER SHTA;Lo;0;L;;;;;N;;;;; +105E2;TODHRI LETTER TA;Lo;0;L;;;;;N;;;;; +105E3;TODHRI LETTER THA;Lo;0;L;;;;;N;;;;; +105E4;TODHRI LETTER U;Lo;0;L;105DA 0307;;;;N;;;;; +105E5;TODHRI LETTER VA;Lo;0;L;;;;;N;;;;; +105E6;TODHRI LETTER XA;Lo;0;L;;;;;N;;;;; +105E7;TODHRI LETTER NXA;Lo;0;L;;;;;N;;;;; +105E8;TODHRI LETTER XHA;Lo;0;L;;;;;N;;;;; +105E9;TODHRI LETTER NXHA;Lo;0;L;;;;;N;;;;; +105EA;TODHRI LETTER Y;Lo;0;L;;;;;N;;;;; +105EB;TODHRI LETTER JY;Lo;0;L;;;;;N;;;;; +105EC;TODHRI LETTER ZA;Lo;0;L;;;;;N;;;;; +105ED;TODHRI LETTER ZHA;Lo;0;L;;;;;N;;;;; +105EE;TODHRI LETTER GHA;Lo;0;L;;;;;N;;;;; +105EF;TODHRI LETTER STA;Lo;0;L;;;;;N;;;;; +105F0;TODHRI LETTER SKAN;Lo;0;L;;;;;N;;;;; +105F1;TODHRI LETTER KHA;Lo;0;L;;;;;N;;;;; +105F2;TODHRI LETTER PSA;Lo;0;L;;;;;N;;;;; +105F3;TODHRI LETTER OO;Lo;0;L;;;;;N;;;;; +10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;; +10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;; +10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;; +10603;LINEAR A SIGN AB004;Lo;0;L;;;;;N;;;;; +10604;LINEAR A SIGN AB005;Lo;0;L;;;;;N;;;;; +10605;LINEAR A SIGN AB006;Lo;0;L;;;;;N;;;;; +10606;LINEAR A SIGN AB007;Lo;0;L;;;;;N;;;;; +10607;LINEAR A SIGN AB008;Lo;0;L;;;;;N;;;;; +10608;LINEAR A SIGN AB009;Lo;0;L;;;;;N;;;;; +10609;LINEAR A SIGN AB010;Lo;0;L;;;;;N;;;;; +1060A;LINEAR A SIGN AB011;Lo;0;L;;;;;N;;;;; +1060B;LINEAR A SIGN AB013;Lo;0;L;;;;;N;;;;; +1060C;LINEAR A SIGN AB016;Lo;0;L;;;;;N;;;;; +1060D;LINEAR A SIGN AB017;Lo;0;L;;;;;N;;;;; +1060E;LINEAR A SIGN AB020;Lo;0;L;;;;;N;;;;; +1060F;LINEAR A SIGN AB021;Lo;0;L;;;;;N;;;;; +10610;LINEAR A SIGN AB021F;Lo;0;L;;;;;N;;;;; +10611;LINEAR A SIGN AB021M;Lo;0;L;;;;;N;;;;; +10612;LINEAR A SIGN AB022;Lo;0;L;;;;;N;;;;; +10613;LINEAR A SIGN AB022F;Lo;0;L;;;;;N;;;;; +10614;LINEAR A SIGN AB022M;Lo;0;L;;;;;N;;;;; +10615;LINEAR A SIGN AB023;Lo;0;L;;;;;N;;;;; +10616;LINEAR A SIGN AB023M;Lo;0;L;;;;;N;;;;; +10617;LINEAR A SIGN AB024;Lo;0;L;;;;;N;;;;; +10618;LINEAR A SIGN AB026;Lo;0;L;;;;;N;;;;; +10619;LINEAR A SIGN AB027;Lo;0;L;;;;;N;;;;; +1061A;LINEAR A SIGN AB028;Lo;0;L;;;;;N;;;;; +1061B;LINEAR A SIGN A028B;Lo;0;L;;;;;N;;;;; +1061C;LINEAR A SIGN AB029;Lo;0;L;;;;;N;;;;; +1061D;LINEAR A SIGN AB030;Lo;0;L;;;;;N;;;;; +1061E;LINEAR A SIGN AB031;Lo;0;L;;;;;N;;;;; +1061F;LINEAR A SIGN AB034;Lo;0;L;;;;;N;;;;; +10620;LINEAR A SIGN AB037;Lo;0;L;;;;;N;;;;; +10621;LINEAR A SIGN AB038;Lo;0;L;;;;;N;;;;; +10622;LINEAR A SIGN AB039;Lo;0;L;;;;;N;;;;; +10623;LINEAR A SIGN AB040;Lo;0;L;;;;;N;;;;; +10624;LINEAR A SIGN AB041;Lo;0;L;;;;;N;;;;; +10625;LINEAR A SIGN AB044;Lo;0;L;;;;;N;;;;; +10626;LINEAR A SIGN AB045;Lo;0;L;;;;;N;;;;; +10627;LINEAR A SIGN AB046;Lo;0;L;;;;;N;;;;; +10628;LINEAR A SIGN AB047;Lo;0;L;;;;;N;;;;; +10629;LINEAR A SIGN AB048;Lo;0;L;;;;;N;;;;; +1062A;LINEAR A SIGN AB049;Lo;0;L;;;;;N;;;;; +1062B;LINEAR A SIGN AB050;Lo;0;L;;;;;N;;;;; +1062C;LINEAR A SIGN AB051;Lo;0;L;;;;;N;;;;; +1062D;LINEAR A SIGN AB053;Lo;0;L;;;;;N;;;;; +1062E;LINEAR A SIGN AB054;Lo;0;L;;;;;N;;;;; +1062F;LINEAR A SIGN AB055;Lo;0;L;;;;;N;;;;; +10630;LINEAR A SIGN AB056;Lo;0;L;;;;;N;;;;; +10631;LINEAR A SIGN AB057;Lo;0;L;;;;;N;;;;; +10632;LINEAR A SIGN AB058;Lo;0;L;;;;;N;;;;; +10633;LINEAR A SIGN AB059;Lo;0;L;;;;;N;;;;; +10634;LINEAR A SIGN AB060;Lo;0;L;;;;;N;;;;; +10635;LINEAR A SIGN AB061;Lo;0;L;;;;;N;;;;; +10636;LINEAR A SIGN AB065;Lo;0;L;;;;;N;;;;; +10637;LINEAR A SIGN AB066;Lo;0;L;;;;;N;;;;; +10638;LINEAR A SIGN AB067;Lo;0;L;;;;;N;;;;; +10639;LINEAR A SIGN AB069;Lo;0;L;;;;;N;;;;; +1063A;LINEAR A SIGN AB070;Lo;0;L;;;;;N;;;;; +1063B;LINEAR A SIGN AB073;Lo;0;L;;;;;N;;;;; +1063C;LINEAR A SIGN AB074;Lo;0;L;;;;;N;;;;; +1063D;LINEAR A SIGN AB076;Lo;0;L;;;;;N;;;;; +1063E;LINEAR A SIGN AB077;Lo;0;L;;;;;N;;;;; +1063F;LINEAR A SIGN AB078;Lo;0;L;;;;;N;;;;; +10640;LINEAR A SIGN AB079;Lo;0;L;;;;;N;;;;; +10641;LINEAR A SIGN AB080;Lo;0;L;;;;;N;;;;; +10642;LINEAR A SIGN AB081;Lo;0;L;;;;;N;;;;; +10643;LINEAR A SIGN AB082;Lo;0;L;;;;;N;;;;; +10644;LINEAR A SIGN AB085;Lo;0;L;;;;;N;;;;; +10645;LINEAR A SIGN AB086;Lo;0;L;;;;;N;;;;; +10646;LINEAR A SIGN AB087;Lo;0;L;;;;;N;;;;; +10647;LINEAR A SIGN A100-102;Lo;0;L;;;;;N;;;;; +10648;LINEAR A SIGN AB118;Lo;0;L;;;;;N;;;;; +10649;LINEAR A SIGN AB120;Lo;0;L;;;;;N;;;;; +1064A;LINEAR A SIGN A120B;Lo;0;L;;;;;N;;;;; +1064B;LINEAR A SIGN AB122;Lo;0;L;;;;;N;;;;; +1064C;LINEAR A SIGN AB123;Lo;0;L;;;;;N;;;;; +1064D;LINEAR A SIGN AB131A;Lo;0;L;;;;;N;;;;; +1064E;LINEAR A SIGN AB131B;Lo;0;L;;;;;N;;;;; +1064F;LINEAR A SIGN A131C;Lo;0;L;;;;;N;;;;; +10650;LINEAR A SIGN AB164;Lo;0;L;;;;;N;;;;; +10651;LINEAR A SIGN AB171;Lo;0;L;;;;;N;;;;; +10652;LINEAR A SIGN AB180;Lo;0;L;;;;;N;;;;; +10653;LINEAR A SIGN AB188;Lo;0;L;;;;;N;;;;; +10654;LINEAR A SIGN AB191;Lo;0;L;;;;;N;;;;; +10655;LINEAR A SIGN A301;Lo;0;L;;;;;N;;;;; +10656;LINEAR A SIGN A302;Lo;0;L;;;;;N;;;;; +10657;LINEAR A SIGN A303;Lo;0;L;;;;;N;;;;; +10658;LINEAR A SIGN A304;Lo;0;L;;;;;N;;;;; +10659;LINEAR A SIGN A305;Lo;0;L;;;;;N;;;;; +1065A;LINEAR A SIGN A306;Lo;0;L;;;;;N;;;;; +1065B;LINEAR A SIGN A307;Lo;0;L;;;;;N;;;;; +1065C;LINEAR A SIGN A308;Lo;0;L;;;;;N;;;;; +1065D;LINEAR A SIGN A309A;Lo;0;L;;;;;N;;;;; +1065E;LINEAR A SIGN A309B;Lo;0;L;;;;;N;;;;; +1065F;LINEAR A SIGN A309C;Lo;0;L;;;;;N;;;;; +10660;LINEAR A SIGN A310;Lo;0;L;;;;;N;;;;; +10661;LINEAR A SIGN A311;Lo;0;L;;;;;N;;;;; +10662;LINEAR A SIGN A312;Lo;0;L;;;;;N;;;;; +10663;LINEAR A SIGN A313A;Lo;0;L;;;;;N;;;;; +10664;LINEAR A SIGN A313B;Lo;0;L;;;;;N;;;;; +10665;LINEAR A SIGN A313C;Lo;0;L;;;;;N;;;;; +10666;LINEAR A SIGN A314;Lo;0;L;;;;;N;;;;; +10667;LINEAR A SIGN A315;Lo;0;L;;;;;N;;;;; +10668;LINEAR A SIGN A316;Lo;0;L;;;;;N;;;;; +10669;LINEAR A SIGN A317;Lo;0;L;;;;;N;;;;; +1066A;LINEAR A SIGN A318;Lo;0;L;;;;;N;;;;; +1066B;LINEAR A SIGN A319;Lo;0;L;;;;;N;;;;; +1066C;LINEAR A SIGN A320;Lo;0;L;;;;;N;;;;; +1066D;LINEAR A SIGN A321;Lo;0;L;;;;;N;;;;; +1066E;LINEAR A SIGN A322;Lo;0;L;;;;;N;;;;; +1066F;LINEAR A SIGN A323;Lo;0;L;;;;;N;;;;; +10670;LINEAR A SIGN A324;Lo;0;L;;;;;N;;;;; +10671;LINEAR A SIGN A325;Lo;0;L;;;;;N;;;;; +10672;LINEAR A SIGN A326;Lo;0;L;;;;;N;;;;; +10673;LINEAR A SIGN A327;Lo;0;L;;;;;N;;;;; +10674;LINEAR A SIGN A328;Lo;0;L;;;;;N;;;;; +10675;LINEAR A SIGN A329;Lo;0;L;;;;;N;;;;; +10676;LINEAR A SIGN A330;Lo;0;L;;;;;N;;;;; +10677;LINEAR A SIGN A331;Lo;0;L;;;;;N;;;;; +10678;LINEAR A SIGN A332;Lo;0;L;;;;;N;;;;; +10679;LINEAR A SIGN A333;Lo;0;L;;;;;N;;;;; +1067A;LINEAR A SIGN A334;Lo;0;L;;;;;N;;;;; +1067B;LINEAR A SIGN A335;Lo;0;L;;;;;N;;;;; +1067C;LINEAR A SIGN A336;Lo;0;L;;;;;N;;;;; +1067D;LINEAR A SIGN A337;Lo;0;L;;;;;N;;;;; +1067E;LINEAR A SIGN A338;Lo;0;L;;;;;N;;;;; +1067F;LINEAR A SIGN A339;Lo;0;L;;;;;N;;;;; +10680;LINEAR A SIGN A340;Lo;0;L;;;;;N;;;;; +10681;LINEAR A SIGN A341;Lo;0;L;;;;;N;;;;; +10682;LINEAR A SIGN A342;Lo;0;L;;;;;N;;;;; +10683;LINEAR A SIGN A343;Lo;0;L;;;;;N;;;;; +10684;LINEAR A SIGN A344;Lo;0;L;;;;;N;;;;; +10685;LINEAR A SIGN A345;Lo;0;L;;;;;N;;;;; +10686;LINEAR A SIGN A346;Lo;0;L;;;;;N;;;;; +10687;LINEAR A SIGN A347;Lo;0;L;;;;;N;;;;; +10688;LINEAR A SIGN A348;Lo;0;L;;;;;N;;;;; +10689;LINEAR A SIGN A349;Lo;0;L;;;;;N;;;;; +1068A;LINEAR A SIGN A350;Lo;0;L;;;;;N;;;;; +1068B;LINEAR A SIGN A351;Lo;0;L;;;;;N;;;;; +1068C;LINEAR A SIGN A352;Lo;0;L;;;;;N;;;;; +1068D;LINEAR A SIGN A353;Lo;0;L;;;;;N;;;;; +1068E;LINEAR A SIGN A354;Lo;0;L;;;;;N;;;;; +1068F;LINEAR A SIGN A355;Lo;0;L;;;;;N;;;;; +10690;LINEAR A SIGN A356;Lo;0;L;;;;;N;;;;; +10691;LINEAR A SIGN A357;Lo;0;L;;;;;N;;;;; +10692;LINEAR A SIGN A358;Lo;0;L;;;;;N;;;;; +10693;LINEAR A SIGN A359;Lo;0;L;;;;;N;;;;; +10694;LINEAR A SIGN A360;Lo;0;L;;;;;N;;;;; +10695;LINEAR A SIGN A361;Lo;0;L;;;;;N;;;;; +10696;LINEAR A SIGN A362;Lo;0;L;;;;;N;;;;; +10697;LINEAR A SIGN A363;Lo;0;L;;;;;N;;;;; +10698;LINEAR A SIGN A364;Lo;0;L;;;;;N;;;;; +10699;LINEAR A SIGN A365;Lo;0;L;;;;;N;;;;; +1069A;LINEAR A SIGN A366;Lo;0;L;;;;;N;;;;; +1069B;LINEAR A SIGN A367;Lo;0;L;;;;;N;;;;; +1069C;LINEAR A SIGN A368;Lo;0;L;;;;;N;;;;; +1069D;LINEAR A SIGN A369;Lo;0;L;;;;;N;;;;; +1069E;LINEAR A SIGN A370;Lo;0;L;;;;;N;;;;; +1069F;LINEAR A SIGN A371;Lo;0;L;;;;;N;;;;; +106A0;LINEAR A SIGN A400-VAS;Lo;0;L;;;;;N;;;;; +106A1;LINEAR A SIGN A401-VAS;Lo;0;L;;;;;N;;;;; +106A2;LINEAR A SIGN A402-VAS;Lo;0;L;;;;;N;;;;; +106A3;LINEAR A SIGN A403-VAS;Lo;0;L;;;;;N;;;;; +106A4;LINEAR A SIGN A404-VAS;Lo;0;L;;;;;N;;;;; +106A5;LINEAR A SIGN A405-VAS;Lo;0;L;;;;;N;;;;; +106A6;LINEAR A SIGN A406-VAS;Lo;0;L;;;;;N;;;;; +106A7;LINEAR A SIGN A407-VAS;Lo;0;L;;;;;N;;;;; +106A8;LINEAR A SIGN A408-VAS;Lo;0;L;;;;;N;;;;; +106A9;LINEAR A SIGN A409-VAS;Lo;0;L;;;;;N;;;;; +106AA;LINEAR A SIGN A410-VAS;Lo;0;L;;;;;N;;;;; +106AB;LINEAR A SIGN A411-VAS;Lo;0;L;;;;;N;;;;; +106AC;LINEAR A SIGN A412-VAS;Lo;0;L;;;;;N;;;;; +106AD;LINEAR A SIGN A413-VAS;Lo;0;L;;;;;N;;;;; +106AE;LINEAR A SIGN A414-VAS;Lo;0;L;;;;;N;;;;; +106AF;LINEAR A SIGN A415-VAS;Lo;0;L;;;;;N;;;;; +106B0;LINEAR A SIGN A416-VAS;Lo;0;L;;;;;N;;;;; +106B1;LINEAR A SIGN A417-VAS;Lo;0;L;;;;;N;;;;; +106B2;LINEAR A SIGN A418-VAS;Lo;0;L;;;;;N;;;;; +106B3;LINEAR A SIGN A501;Lo;0;L;;;;;N;;;;; +106B4;LINEAR A SIGN A502;Lo;0;L;;;;;N;;;;; +106B5;LINEAR A SIGN A503;Lo;0;L;;;;;N;;;;; +106B6;LINEAR A SIGN A504;Lo;0;L;;;;;N;;;;; +106B7;LINEAR A SIGN A505;Lo;0;L;;;;;N;;;;; +106B8;LINEAR A SIGN A506;Lo;0;L;;;;;N;;;;; +106B9;LINEAR A SIGN A508;Lo;0;L;;;;;N;;;;; +106BA;LINEAR A SIGN A509;Lo;0;L;;;;;N;;;;; +106BB;LINEAR A SIGN A510;Lo;0;L;;;;;N;;;;; +106BC;LINEAR A SIGN A511;Lo;0;L;;;;;N;;;;; +106BD;LINEAR A SIGN A512;Lo;0;L;;;;;N;;;;; +106BE;LINEAR A SIGN A513;Lo;0;L;;;;;N;;;;; +106BF;LINEAR A SIGN A515;Lo;0;L;;;;;N;;;;; +106C0;LINEAR A SIGN A516;Lo;0;L;;;;;N;;;;; +106C1;LINEAR A SIGN A520;Lo;0;L;;;;;N;;;;; +106C2;LINEAR A SIGN A521;Lo;0;L;;;;;N;;;;; +106C3;LINEAR A SIGN A523;Lo;0;L;;;;;N;;;;; +106C4;LINEAR A SIGN A524;Lo;0;L;;;;;N;;;;; +106C5;LINEAR A SIGN A525;Lo;0;L;;;;;N;;;;; +106C6;LINEAR A SIGN A526;Lo;0;L;;;;;N;;;;; +106C7;LINEAR A SIGN A527;Lo;0;L;;;;;N;;;;; +106C8;LINEAR A SIGN A528;Lo;0;L;;;;;N;;;;; +106C9;LINEAR A SIGN A529;Lo;0;L;;;;;N;;;;; +106CA;LINEAR A SIGN A530;Lo;0;L;;;;;N;;;;; +106CB;LINEAR A SIGN A531;Lo;0;L;;;;;N;;;;; +106CC;LINEAR A SIGN A532;Lo;0;L;;;;;N;;;;; +106CD;LINEAR A SIGN A534;Lo;0;L;;;;;N;;;;; +106CE;LINEAR A SIGN A535;Lo;0;L;;;;;N;;;;; +106CF;LINEAR A SIGN A536;Lo;0;L;;;;;N;;;;; +106D0;LINEAR A SIGN A537;Lo;0;L;;;;;N;;;;; +106D1;LINEAR A SIGN A538;Lo;0;L;;;;;N;;;;; +106D2;LINEAR A SIGN A539;Lo;0;L;;;;;N;;;;; +106D3;LINEAR A SIGN A540;Lo;0;L;;;;;N;;;;; +106D4;LINEAR A SIGN A541;Lo;0;L;;;;;N;;;;; +106D5;LINEAR A SIGN A542;Lo;0;L;;;;;N;;;;; +106D6;LINEAR A SIGN A545;Lo;0;L;;;;;N;;;;; +106D7;LINEAR A SIGN A547;Lo;0;L;;;;;N;;;;; +106D8;LINEAR A SIGN A548;Lo;0;L;;;;;N;;;;; +106D9;LINEAR A SIGN A549;Lo;0;L;;;;;N;;;;; +106DA;LINEAR A SIGN A550;Lo;0;L;;;;;N;;;;; +106DB;LINEAR A SIGN A551;Lo;0;L;;;;;N;;;;; +106DC;LINEAR A SIGN A552;Lo;0;L;;;;;N;;;;; +106DD;LINEAR A SIGN A553;Lo;0;L;;;;;N;;;;; +106DE;LINEAR A SIGN A554;Lo;0;L;;;;;N;;;;; +106DF;LINEAR A SIGN A555;Lo;0;L;;;;;N;;;;; +106E0;LINEAR A SIGN A556;Lo;0;L;;;;;N;;;;; +106E1;LINEAR A SIGN A557;Lo;0;L;;;;;N;;;;; +106E2;LINEAR A SIGN A559;Lo;0;L;;;;;N;;;;; +106E3;LINEAR A SIGN A563;Lo;0;L;;;;;N;;;;; +106E4;LINEAR A SIGN A564;Lo;0;L;;;;;N;;;;; +106E5;LINEAR A SIGN A565;Lo;0;L;;;;;N;;;;; +106E6;LINEAR A SIGN A566;Lo;0;L;;;;;N;;;;; +106E7;LINEAR A SIGN A568;Lo;0;L;;;;;N;;;;; +106E8;LINEAR A SIGN A569;Lo;0;L;;;;;N;;;;; +106E9;LINEAR A SIGN A570;Lo;0;L;;;;;N;;;;; +106EA;LINEAR A SIGN A571;Lo;0;L;;;;;N;;;;; +106EB;LINEAR A SIGN A572;Lo;0;L;;;;;N;;;;; +106EC;LINEAR A SIGN A573;Lo;0;L;;;;;N;;;;; +106ED;LINEAR A SIGN A574;Lo;0;L;;;;;N;;;;; +106EE;LINEAR A SIGN A575;Lo;0;L;;;;;N;;;;; +106EF;LINEAR A SIGN A576;Lo;0;L;;;;;N;;;;; +106F0;LINEAR A SIGN A577;Lo;0;L;;;;;N;;;;; +106F1;LINEAR A SIGN A578;Lo;0;L;;;;;N;;;;; +106F2;LINEAR A SIGN A579;Lo;0;L;;;;;N;;;;; +106F3;LINEAR A SIGN A580;Lo;0;L;;;;;N;;;;; +106F4;LINEAR A SIGN A581;Lo;0;L;;;;;N;;;;; +106F5;LINEAR A SIGN A582;Lo;0;L;;;;;N;;;;; +106F6;LINEAR A SIGN A583;Lo;0;L;;;;;N;;;;; +106F7;LINEAR A SIGN A584;Lo;0;L;;;;;N;;;;; +106F8;LINEAR A SIGN A585;Lo;0;L;;;;;N;;;;; +106F9;LINEAR A SIGN A586;Lo;0;L;;;;;N;;;;; +106FA;LINEAR A SIGN A587;Lo;0;L;;;;;N;;;;; +106FB;LINEAR A SIGN A588;Lo;0;L;;;;;N;;;;; +106FC;LINEAR A SIGN A589;Lo;0;L;;;;;N;;;;; +106FD;LINEAR A SIGN A591;Lo;0;L;;;;;N;;;;; +106FE;LINEAR A SIGN A592;Lo;0;L;;;;;N;;;;; +106FF;LINEAR A SIGN A594;Lo;0;L;;;;;N;;;;; +10700;LINEAR A SIGN A595;Lo;0;L;;;;;N;;;;; +10701;LINEAR A SIGN A596;Lo;0;L;;;;;N;;;;; +10702;LINEAR A SIGN A598;Lo;0;L;;;;;N;;;;; +10703;LINEAR A SIGN A600;Lo;0;L;;;;;N;;;;; +10704;LINEAR A SIGN A601;Lo;0;L;;;;;N;;;;; +10705;LINEAR A SIGN A602;Lo;0;L;;;;;N;;;;; +10706;LINEAR A SIGN A603;Lo;0;L;;;;;N;;;;; +10707;LINEAR A SIGN A604;Lo;0;L;;;;;N;;;;; +10708;LINEAR A SIGN A606;Lo;0;L;;;;;N;;;;; +10709;LINEAR A SIGN A608;Lo;0;L;;;;;N;;;;; +1070A;LINEAR A SIGN A609;Lo;0;L;;;;;N;;;;; +1070B;LINEAR A SIGN A610;Lo;0;L;;;;;N;;;;; +1070C;LINEAR A SIGN A611;Lo;0;L;;;;;N;;;;; +1070D;LINEAR A SIGN A612;Lo;0;L;;;;;N;;;;; +1070E;LINEAR A SIGN A613;Lo;0;L;;;;;N;;;;; +1070F;LINEAR A SIGN A614;Lo;0;L;;;;;N;;;;; +10710;LINEAR A SIGN A615;Lo;0;L;;;;;N;;;;; +10711;LINEAR A SIGN A616;Lo;0;L;;;;;N;;;;; +10712;LINEAR A SIGN A617;Lo;0;L;;;;;N;;;;; +10713;LINEAR A SIGN A618;Lo;0;L;;;;;N;;;;; +10714;LINEAR A SIGN A619;Lo;0;L;;;;;N;;;;; +10715;LINEAR A SIGN A620;Lo;0;L;;;;;N;;;;; +10716;LINEAR A SIGN A621;Lo;0;L;;;;;N;;;;; +10717;LINEAR A SIGN A622;Lo;0;L;;;;;N;;;;; +10718;LINEAR A SIGN A623;Lo;0;L;;;;;N;;;;; +10719;LINEAR A SIGN A624;Lo;0;L;;;;;N;;;;; +1071A;LINEAR A SIGN A626;Lo;0;L;;;;;N;;;;; +1071B;LINEAR A SIGN A627;Lo;0;L;;;;;N;;;;; +1071C;LINEAR A SIGN A628;Lo;0;L;;;;;N;;;;; +1071D;LINEAR A SIGN A629;Lo;0;L;;;;;N;;;;; +1071E;LINEAR A SIGN A634;Lo;0;L;;;;;N;;;;; +1071F;LINEAR A SIGN A637;Lo;0;L;;;;;N;;;;; +10720;LINEAR A SIGN A638;Lo;0;L;;;;;N;;;;; +10721;LINEAR A SIGN A640;Lo;0;L;;;;;N;;;;; +10722;LINEAR A SIGN A642;Lo;0;L;;;;;N;;;;; +10723;LINEAR A SIGN A643;Lo;0;L;;;;;N;;;;; +10724;LINEAR A SIGN A644;Lo;0;L;;;;;N;;;;; +10725;LINEAR A SIGN A645;Lo;0;L;;;;;N;;;;; +10726;LINEAR A SIGN A646;Lo;0;L;;;;;N;;;;; +10727;LINEAR A SIGN A648;Lo;0;L;;;;;N;;;;; +10728;LINEAR A SIGN A649;Lo;0;L;;;;;N;;;;; +10729;LINEAR A SIGN A651;Lo;0;L;;;;;N;;;;; +1072A;LINEAR A SIGN A652;Lo;0;L;;;;;N;;;;; +1072B;LINEAR A SIGN A653;Lo;0;L;;;;;N;;;;; +1072C;LINEAR A SIGN A654;Lo;0;L;;;;;N;;;;; +1072D;LINEAR A SIGN A655;Lo;0;L;;;;;N;;;;; +1072E;LINEAR A SIGN A656;Lo;0;L;;;;;N;;;;; +1072F;LINEAR A SIGN A657;Lo;0;L;;;;;N;;;;; +10730;LINEAR A SIGN A658;Lo;0;L;;;;;N;;;;; +10731;LINEAR A SIGN A659;Lo;0;L;;;;;N;;;;; +10732;LINEAR A SIGN A660;Lo;0;L;;;;;N;;;;; +10733;LINEAR A SIGN A661;Lo;0;L;;;;;N;;;;; +10734;LINEAR A SIGN A662;Lo;0;L;;;;;N;;;;; +10735;LINEAR A SIGN A663;Lo;0;L;;;;;N;;;;; +10736;LINEAR A SIGN A664;Lo;0;L;;;;;N;;;;; +10740;LINEAR A SIGN A701 A;Lo;0;L;;;;;N;;;;; +10741;LINEAR A SIGN A702 B;Lo;0;L;;;;;N;;;;; +10742;LINEAR A SIGN A703 D;Lo;0;L;;;;;N;;;;; +10743;LINEAR A SIGN A704 E;Lo;0;L;;;;;N;;;;; +10744;LINEAR A SIGN A705 F;Lo;0;L;;;;;N;;;;; +10745;LINEAR A SIGN A706 H;Lo;0;L;;;;;N;;;;; +10746;LINEAR A SIGN A707 J;Lo;0;L;;;;;N;;;;; +10747;LINEAR A SIGN A708 K;Lo;0;L;;;;;N;;;;; +10748;LINEAR A SIGN A709 L;Lo;0;L;;;;;N;;;;; +10749;LINEAR A SIGN A709-2 L2;Lo;0;L;;;;;N;;;;; +1074A;LINEAR A SIGN A709-3 L3;Lo;0;L;;;;;N;;;;; +1074B;LINEAR A SIGN A709-4 L4;Lo;0;L;;;;;N;;;;; +1074C;LINEAR A SIGN A709-6 L6;Lo;0;L;;;;;N;;;;; +1074D;LINEAR A SIGN A710 W;Lo;0;L;;;;;N;;;;; +1074E;LINEAR A SIGN A711 X;Lo;0;L;;;;;N;;;;; +1074F;LINEAR A SIGN A712 Y;Lo;0;L;;;;;N;;;;; +10750;LINEAR A SIGN A713 OMEGA;Lo;0;L;;;;;N;;;;; +10751;LINEAR A SIGN A714 ABB;Lo;0;L;;;;;N;;;;; +10752;LINEAR A SIGN A715 BB;Lo;0;L;;;;;N;;;;; +10753;LINEAR A SIGN A717 DD;Lo;0;L;;;;;N;;;;; +10754;LINEAR A SIGN A726 EYYY;Lo;0;L;;;;;N;;;;; +10755;LINEAR A SIGN A732 JE;Lo;0;L;;;;;N;;;;; +10760;LINEAR A SIGN A800;Lo;0;L;;;;;N;;;;; +10761;LINEAR A SIGN A801;Lo;0;L;;;;;N;;;;; +10762;LINEAR A SIGN A802;Lo;0;L;;;;;N;;;;; +10763;LINEAR A SIGN A803;Lo;0;L;;;;;N;;;;; +10764;LINEAR A SIGN A804;Lo;0;L;;;;;N;;;;; +10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;; +10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;; +10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;; +10780;MODIFIER LETTER SMALL CAPITAL AA;Lm;0;L;;;;;N;;;;; +10781;MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON;Lm;0;L; 02D0;;;;N;;;;; +10782;MODIFIER LETTER SUPERSCRIPT HALF TRIANGULAR COLON;Lm;0;L; 02D1;;;;N;;;;; +10783;MODIFIER LETTER SMALL AE;Lm;0;L; 00E6;;;;N;;;;; +10784;MODIFIER LETTER SMALL CAPITAL B;Lm;0;L; 0299;;;;N;;;;; +10785;MODIFIER LETTER SMALL B WITH HOOK;Lm;0;L; 0253;;;;N;;;;; +10787;MODIFIER LETTER SMALL DZ DIGRAPH;Lm;0;L; 02A3;;;;N;;;;; +10788;MODIFIER LETTER SMALL DZ DIGRAPH WITH RETROFLEX HOOK;Lm;0;L; AB66;;;;N;;;;; +10789;MODIFIER LETTER SMALL DZ DIGRAPH WITH CURL;Lm;0;L; 02A5;;;;N;;;;; +1078A;MODIFIER LETTER SMALL DEZH DIGRAPH;Lm;0;L; 02A4;;;;N;;;;; +1078B;MODIFIER LETTER SMALL D WITH TAIL;Lm;0;L; 0256;;;;N;;;;; +1078C;MODIFIER LETTER SMALL D WITH HOOK;Lm;0;L; 0257;;;;N;;;;; +1078D;MODIFIER LETTER SMALL D WITH HOOK AND TAIL;Lm;0;L; 1D91;;;;N;;;;; +1078E;MODIFIER LETTER SMALL REVERSED E;Lm;0;L; 0258;;;;N;;;;; +1078F;MODIFIER LETTER SMALL CLOSED REVERSED OPEN E;Lm;0;L; 025E;;;;N;;;;; +10790;MODIFIER LETTER SMALL FENG DIGRAPH;Lm;0;L; 02A9;;;;N;;;;; +10791;MODIFIER LETTER SMALL RAMS HORN;Lm;0;L; 0264;;;;N;;;;; +10792;MODIFIER LETTER SMALL CAPITAL G;Lm;0;L; 0262;;;;N;;;;; +10793;MODIFIER LETTER SMALL G WITH HOOK;Lm;0;L; 0260;;;;N;;;;; +10794;MODIFIER LETTER SMALL CAPITAL G WITH HOOK;Lm;0;L; 029B;;;;N;;;;; +10795;MODIFIER LETTER SMALL H WITH STROKE;Lm;0;L; 0127;;;;N;;;;; +10796;MODIFIER LETTER SMALL CAPITAL H;Lm;0;L; 029C;;;;N;;;;; +10797;MODIFIER LETTER SMALL HENG WITH HOOK;Lm;0;L; 0267;;;;N;;;;; +10798;MODIFIER LETTER SMALL DOTLESS J WITH STROKE AND HOOK;Lm;0;L; 0284;;;;N;;;;; +10799;MODIFIER LETTER SMALL LS DIGRAPH;Lm;0;L; 02AA;;;;N;;;;; +1079A;MODIFIER LETTER SMALL LZ DIGRAPH;Lm;0;L; 02AB;;;;N;;;;; +1079B;MODIFIER LETTER SMALL L WITH BELT;Lm;0;L; 026C;;;;N;;;;; +1079C;MODIFIER LETTER SMALL CAPITAL L WITH BELT;Lm;0;L; 1DF04;;;;N;;;;; +1079D;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK AND BELT;Lm;0;L; A78E;;;;N;;;;; +1079E;MODIFIER LETTER SMALL LEZH;Lm;0;L; 026E;;;;N;;;;; +1079F;MODIFIER LETTER SMALL LEZH WITH RETROFLEX HOOK;Lm;0;L; 1DF05;;;;N;;;;; +107A0;MODIFIER LETTER SMALL TURNED Y;Lm;0;L; 028E;;;;N;;;;; +107A1;MODIFIER LETTER SMALL TURNED Y WITH BELT;Lm;0;L; 1DF06;;;;N;;;;; +107A2;MODIFIER LETTER SMALL O WITH STROKE;Lm;0;L; 00F8;;;;N;;;;; +107A3;MODIFIER LETTER SMALL CAPITAL OE;Lm;0;L; 0276;;;;N;;;;; +107A4;MODIFIER LETTER SMALL CLOSED OMEGA;Lm;0;L; 0277;;;;N;;;;; +107A5;MODIFIER LETTER SMALL Q;Lm;0;L; 0071;;;;N;;;;; +107A6;MODIFIER LETTER SMALL TURNED R WITH LONG LEG;Lm;0;L; 027A;;;;N;;;;; +107A7;MODIFIER LETTER SMALL TURNED R WITH LONG LEG AND RETROFLEX HOOK;Lm;0;L; 1DF08;;;;N;;;;; +107A8;MODIFIER LETTER SMALL R WITH TAIL;Lm;0;L; 027D;;;;N;;;;; +107A9;MODIFIER LETTER SMALL R WITH FISHHOOK;Lm;0;L; 027E;;;;N;;;;; +107AA;MODIFIER LETTER SMALL CAPITAL R;Lm;0;L; 0280;;;;N;;;;; +107AB;MODIFIER LETTER SMALL TC DIGRAPH WITH CURL;Lm;0;L; 02A8;;;;N;;;;; +107AC;MODIFIER LETTER SMALL TS DIGRAPH;Lm;0;L; 02A6;;;;N;;;;; +107AD;MODIFIER LETTER SMALL TS DIGRAPH WITH RETROFLEX HOOK;Lm;0;L; AB67;;;;N;;;;; +107AE;MODIFIER LETTER SMALL TESH DIGRAPH;Lm;0;L; 02A7;;;;N;;;;; +107AF;MODIFIER LETTER SMALL T WITH RETROFLEX HOOK;Lm;0;L; 0288;;;;N;;;;; +107B0;MODIFIER LETTER SMALL V WITH RIGHT HOOK;Lm;0;L; 2C71;;;;N;;;;; +107B2;MODIFIER LETTER SMALL CAPITAL Y;Lm;0;L; 028F;;;;N;;;;; +107B3;MODIFIER LETTER GLOTTAL STOP WITH STROKE;Lm;0;L; 02A1;;;;N;;;;; +107B4;MODIFIER LETTER REVERSED GLOTTAL STOP WITH STROKE;Lm;0;L; 02A2;;;;N;;;;; +107B5;MODIFIER LETTER BILABIAL CLICK;Lm;0;L; 0298;;;;N;;;;; +107B6;MODIFIER LETTER DENTAL CLICK;Lm;0;L; 01C0;;;;N;;;;; +107B7;MODIFIER LETTER LATERAL CLICK;Lm;0;L; 01C1;;;;N;;;;; +107B8;MODIFIER LETTER ALVEOLAR CLICK;Lm;0;L; 01C2;;;;N;;;;; +107B9;MODIFIER LETTER RETROFLEX CLICK WITH RETROFLEX HOOK;Lm;0;L; 1DF0A;;;;N;;;;; +107BA;MODIFIER LETTER SMALL S WITH CURL;Lm;0;L; 1DF1E;;;;N;;;;; +10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; +10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; +10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; +10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; +10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; +10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; +10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; +1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; +1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; +1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; +1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; +1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; +1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; +10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; +10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; +10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; +10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; +10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; +10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; +10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; +10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; +10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; +10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; +1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; +1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; +1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; +1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; +1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; +1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; +10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; +10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; +10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; +10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; +10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; +10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; +10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; +10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; +10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; +10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; +1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; +1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; +1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; +1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; +1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; +1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; +10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; +10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; +10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; +10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; +10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; +10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; +10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; +10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; +1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; +1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; +10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; +10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; +10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;; +10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; +10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; +10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; +10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; +1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; +1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; +1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; +1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; +10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;; +10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; +10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; +10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; +10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; +10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; +10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;; +10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;; +10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;; +1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;; +1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;; +1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;; +1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +10860;PALMYRENE LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10861;PALMYRENE LETTER BETH;Lo;0;R;;;;;N;;;;; +10862;PALMYRENE LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10863;PALMYRENE LETTER DALETH;Lo;0;R;;;;;N;;;;; +10864;PALMYRENE LETTER HE;Lo;0;R;;;;;N;;;;; +10865;PALMYRENE LETTER WAW;Lo;0;R;;;;;N;;;;; +10866;PALMYRENE LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10867;PALMYRENE LETTER HETH;Lo;0;R;;;;;N;;;;; +10868;PALMYRENE LETTER TETH;Lo;0;R;;;;;N;;;;; +10869;PALMYRENE LETTER YODH;Lo;0;R;;;;;N;;;;; +1086A;PALMYRENE LETTER KAPH;Lo;0;R;;;;;N;;;;; +1086B;PALMYRENE LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1086C;PALMYRENE LETTER MEM;Lo;0;R;;;;;N;;;;; +1086D;PALMYRENE LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +1086E;PALMYRENE LETTER NUN;Lo;0;R;;;;;N;;;;; +1086F;PALMYRENE LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10870;PALMYRENE LETTER AYIN;Lo;0;R;;;;;N;;;;; +10871;PALMYRENE LETTER PE;Lo;0;R;;;;;N;;;;; +10872;PALMYRENE LETTER SADHE;Lo;0;R;;;;;N;;;;; +10873;PALMYRENE LETTER QOPH;Lo;0;R;;;;;N;;;;; +10874;PALMYRENE LETTER RESH;Lo;0;R;;;;;N;;;;; +10875;PALMYRENE LETTER SHIN;Lo;0;R;;;;;N;;;;; +10876;PALMYRENE LETTER TAW;Lo;0;R;;;;;N;;;;; +10877;PALMYRENE LEFT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10878;PALMYRENE RIGHT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10879;PALMYRENE NUMBER ONE;No;0;R;;;;1;N;;;;; +1087A;PALMYRENE NUMBER TWO;No;0;R;;;;2;N;;;;; +1087B;PALMYRENE NUMBER THREE;No;0;R;;;;3;N;;;;; +1087C;PALMYRENE NUMBER FOUR;No;0;R;;;;4;N;;;;; +1087D;PALMYRENE NUMBER FIVE;No;0;R;;;;5;N;;;;; +1087E;PALMYRENE NUMBER TEN;No;0;R;;;;10;N;;;;; +1087F;PALMYRENE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10880;NABATAEAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; +10881;NABATAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10882;NABATAEAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; +10883;NABATAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10884;NABATAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10885;NABATAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10886;NABATAEAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; +10887;NABATAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10888;NABATAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10889;NABATAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +1088A;NABATAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +1088B;NABATAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +1088C;NABATAEAN LETTER FINAL YODH;Lo;0;R;;;;;N;;;;; +1088D;NABATAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +1088E;NABATAEAN LETTER FINAL KAPH;Lo;0;R;;;;;N;;;;; +1088F;NABATAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10890;NABATAEAN LETTER FINAL LAMEDH;Lo;0;R;;;;;N;;;;; +10891;NABATAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10892;NABATAEAN LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +10893;NABATAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10894;NABATAEAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +10895;NABATAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10896;NABATAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10897;NABATAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10898;NABATAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10899;NABATAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +1089A;NABATAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +1089B;NABATAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +1089C;NABATAEAN LETTER FINAL SHIN;Lo;0;R;;;;;N;;;;; +1089D;NABATAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +1089E;NABATAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108A7;NABATAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108A8;NABATAEAN NUMBER TWO;No;0;R;;;;2;N;;;;; +108A9;NABATAEAN NUMBER THREE;No;0;R;;;;3;N;;;;; +108AA;NABATAEAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AB;NABATAEAN CRUCIFORM NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AC;NABATAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +108E0;HATRAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +108E1;HATRAN LETTER BETH;Lo;0;R;;;;;N;;;;; +108E2;HATRAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +108E3;HATRAN LETTER DALETH-RESH;Lo;0;R;;;;;N;;;;; +108E4;HATRAN LETTER HE;Lo;0;R;;;;;N;;;;; +108E5;HATRAN LETTER WAW;Lo;0;R;;;;;N;;;;; +108E6;HATRAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +108E7;HATRAN LETTER HETH;Lo;0;R;;;;;N;;;;; +108E8;HATRAN LETTER TETH;Lo;0;R;;;;;N;;;;; +108E9;HATRAN LETTER YODH;Lo;0;R;;;;;N;;;;; +108EA;HATRAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +108EB;HATRAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +108EC;HATRAN LETTER MEM;Lo;0;R;;;;;N;;;;; +108ED;HATRAN LETTER NUN;Lo;0;R;;;;;N;;;;; +108EE;HATRAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +108EF;HATRAN LETTER AYN;Lo;0;R;;;;;N;;;;; +108F0;HATRAN LETTER PE;Lo;0;R;;;;;N;;;;; +108F1;HATRAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +108F2;HATRAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +108F4;HATRAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +108F5;HATRAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108FB;HATRAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108FC;HATRAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108FD;HATRAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108FE;HATRAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108FF;HATRAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; +10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; +10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; +10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; +10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; +10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; +10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; +10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; +10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; +1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; +1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; +1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; +10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; +10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; +10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; +10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; +10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; +10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; +10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; +10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; +10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; +10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; +10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; +10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; +10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; +10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; +1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; +1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; +1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; +1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; +1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; +1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; +10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; +10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; +10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; +10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; +10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; +10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; +10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; +10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; +10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; +10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; +1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; +10940;SIDETIC LETTER N01;Lo;0;R;;;;;N;;;;; +10941;SIDETIC LETTER N02;Lo;0;R;;;;;N;;;;; +10942;SIDETIC LETTER N03;Lo;0;R;;;;;N;;;;; +10943;SIDETIC LETTER N04;Lo;0;R;;;;;N;;;;; +10944;SIDETIC LETTER N05;Lo;0;R;;;;;N;;;;; +10945;SIDETIC LETTER N06;Lo;0;R;;;;;N;;;;; +10946;SIDETIC LETTER N07;Lo;0;R;;;;;N;;;;; +10947;SIDETIC LETTER N08;Lo;0;R;;;;;N;;;;; +10948;SIDETIC LETTER N09;Lo;0;R;;;;;N;;;;; +10949;SIDETIC LETTER N10;Lo;0;R;;;;;N;;;;; +1094A;SIDETIC LETTER N11;Lo;0;R;;;;;N;;;;; +1094B;SIDETIC LETTER N12;Lo;0;R;;;;;N;;;;; +1094C;SIDETIC LETTER N13;Lo;0;R;;;;;N;;;;; +1094D;SIDETIC LETTER N14;Lo;0;R;;;;;N;;;;; +1094E;SIDETIC LETTER N15;Lo;0;R;;;;;N;;;;; +1094F;SIDETIC LETTER N16;Lo;0;R;;;;;N;;;;; +10950;SIDETIC LETTER N17;Lo;0;R;;;;;N;;;;; +10951;SIDETIC LETTER N18;Lo;0;R;;;;;N;;;;; +10952;SIDETIC LETTER N19;Lo;0;R;;;;;N;;;;; +10953;SIDETIC LETTER N20;Lo;0;R;;;;;N;;;;; +10954;SIDETIC LETTER N21;Lo;0;R;;;;;N;;;;; +10955;SIDETIC LETTER N22;Lo;0;R;;;;;N;;;;; +10956;SIDETIC LETTER N23;Lo;0;R;;;;;N;;;;; +10957;SIDETIC LETTER N24;Lo;0;R;;;;;N;;;;; +10958;SIDETIC LETTER N25;Lo;0;R;;;;;N;;;;; +10959;SIDETIC LETTER N26;Lo;0;R;;;;;N;;;;; +10980;MEROITIC HIEROGLYPHIC LETTER A;Lo;0;R;;;;;N;;;;; +10981;MEROITIC HIEROGLYPHIC LETTER E;Lo;0;R;;;;;N;;;;; +10982;MEROITIC HIEROGLYPHIC LETTER I;Lo;0;R;;;;;N;;;;; +10983;MEROITIC HIEROGLYPHIC LETTER O;Lo;0;R;;;;;N;;;;; +10984;MEROITIC HIEROGLYPHIC LETTER YA;Lo;0;R;;;;;N;;;;; +10985;MEROITIC HIEROGLYPHIC LETTER WA;Lo;0;R;;;;;N;;;;; +10986;MEROITIC HIEROGLYPHIC LETTER BA;Lo;0;R;;;;;N;;;;; +10987;MEROITIC HIEROGLYPHIC LETTER BA-2;Lo;0;R;;;;;N;;;;; +10988;MEROITIC HIEROGLYPHIC LETTER PA;Lo;0;R;;;;;N;;;;; +10989;MEROITIC HIEROGLYPHIC LETTER MA;Lo;0;R;;;;;N;;;;; +1098A;MEROITIC HIEROGLYPHIC LETTER NA;Lo;0;R;;;;;N;;;;; +1098B;MEROITIC HIEROGLYPHIC LETTER NA-2;Lo;0;R;;;;;N;;;;; +1098C;MEROITIC HIEROGLYPHIC LETTER NE;Lo;0;R;;;;;N;;;;; +1098D;MEROITIC HIEROGLYPHIC LETTER NE-2;Lo;0;R;;;;;N;;;;; +1098E;MEROITIC HIEROGLYPHIC LETTER RA;Lo;0;R;;;;;N;;;;; +1098F;MEROITIC HIEROGLYPHIC LETTER RA-2;Lo;0;R;;;;;N;;;;; +10990;MEROITIC HIEROGLYPHIC LETTER LA;Lo;0;R;;;;;N;;;;; +10991;MEROITIC HIEROGLYPHIC LETTER KHA;Lo;0;R;;;;;N;;;;; +10992;MEROITIC HIEROGLYPHIC LETTER HHA;Lo;0;R;;;;;N;;;;; +10993;MEROITIC HIEROGLYPHIC LETTER SA;Lo;0;R;;;;;N;;;;; +10994;MEROITIC HIEROGLYPHIC LETTER SA-2;Lo;0;R;;;;;N;;;;; +10995;MEROITIC HIEROGLYPHIC LETTER SE;Lo;0;R;;;;;N;;;;; +10996;MEROITIC HIEROGLYPHIC LETTER KA;Lo;0;R;;;;;N;;;;; +10997;MEROITIC HIEROGLYPHIC LETTER QA;Lo;0;R;;;;;N;;;;; +10998;MEROITIC HIEROGLYPHIC LETTER TA;Lo;0;R;;;;;N;;;;; +10999;MEROITIC HIEROGLYPHIC LETTER TA-2;Lo;0;R;;;;;N;;;;; +1099A;MEROITIC HIEROGLYPHIC LETTER TE;Lo;0;R;;;;;N;;;;; +1099B;MEROITIC HIEROGLYPHIC LETTER TE-2;Lo;0;R;;;;;N;;;;; +1099C;MEROITIC HIEROGLYPHIC LETTER TO;Lo;0;R;;;;;N;;;;; +1099D;MEROITIC HIEROGLYPHIC LETTER DA;Lo;0;R;;;;;N;;;;; +1099E;MEROITIC HIEROGLYPHIC SYMBOL VIDJ;Lo;0;R;;;;;N;;;;; +1099F;MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2;Lo;0;R;;;;;N;;;;; +109A0;MEROITIC CURSIVE LETTER A;Lo;0;R;;;;;N;;;;; +109A1;MEROITIC CURSIVE LETTER E;Lo;0;R;;;;;N;;;;; +109A2;MEROITIC CURSIVE LETTER I;Lo;0;R;;;;;N;;;;; +109A3;MEROITIC CURSIVE LETTER O;Lo;0;R;;;;;N;;;;; +109A4;MEROITIC CURSIVE LETTER YA;Lo;0;R;;;;;N;;;;; +109A5;MEROITIC CURSIVE LETTER WA;Lo;0;R;;;;;N;;;;; +109A6;MEROITIC CURSIVE LETTER BA;Lo;0;R;;;;;N;;;;; +109A7;MEROITIC CURSIVE LETTER PA;Lo;0;R;;;;;N;;;;; +109A8;MEROITIC CURSIVE LETTER MA;Lo;0;R;;;;;N;;;;; +109A9;MEROITIC CURSIVE LETTER NA;Lo;0;R;;;;;N;;;;; +109AA;MEROITIC CURSIVE LETTER NE;Lo;0;R;;;;;N;;;;; +109AB;MEROITIC CURSIVE LETTER RA;Lo;0;R;;;;;N;;;;; +109AC;MEROITIC CURSIVE LETTER LA;Lo;0;R;;;;;N;;;;; +109AD;MEROITIC CURSIVE LETTER KHA;Lo;0;R;;;;;N;;;;; +109AE;MEROITIC CURSIVE LETTER HHA;Lo;0;R;;;;;N;;;;; +109AF;MEROITIC CURSIVE LETTER SA;Lo;0;R;;;;;N;;;;; +109B0;MEROITIC CURSIVE LETTER ARCHAIC SA;Lo;0;R;;;;;N;;;;; +109B1;MEROITIC CURSIVE LETTER SE;Lo;0;R;;;;;N;;;;; +109B2;MEROITIC CURSIVE LETTER KA;Lo;0;R;;;;;N;;;;; +109B3;MEROITIC CURSIVE LETTER QA;Lo;0;R;;;;;N;;;;; +109B4;MEROITIC CURSIVE LETTER TA;Lo;0;R;;;;;N;;;;; +109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; +109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; +109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; +109BC;MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS;No;0;R;;;;11/12;N;;;;; +109BD;MEROITIC CURSIVE FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; +109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; +109C0;MEROITIC CURSIVE NUMBER ONE;No;0;R;;;;1;N;;;;; +109C1;MEROITIC CURSIVE NUMBER TWO;No;0;R;;;;2;N;;;;; +109C2;MEROITIC CURSIVE NUMBER THREE;No;0;R;;;;3;N;;;;; +109C3;MEROITIC CURSIVE NUMBER FOUR;No;0;R;;;;4;N;;;;; +109C4;MEROITIC CURSIVE NUMBER FIVE;No;0;R;;;;5;N;;;;; +109C5;MEROITIC CURSIVE NUMBER SIX;No;0;R;;;;6;N;;;;; +109C6;MEROITIC CURSIVE NUMBER SEVEN;No;0;R;;;;7;N;;;;; +109C7;MEROITIC CURSIVE NUMBER EIGHT;No;0;R;;;;8;N;;;;; +109C8;MEROITIC CURSIVE NUMBER NINE;No;0;R;;;;9;N;;;;; +109C9;MEROITIC CURSIVE NUMBER TEN;No;0;R;;;;10;N;;;;; +109CA;MEROITIC CURSIVE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +109CB;MEROITIC CURSIVE NUMBER THIRTY;No;0;R;;;;30;N;;;;; +109CC;MEROITIC CURSIVE NUMBER FORTY;No;0;R;;;;40;N;;;;; +109CD;MEROITIC CURSIVE NUMBER FIFTY;No;0;R;;;;50;N;;;;; +109CE;MEROITIC CURSIVE NUMBER SIXTY;No;0;R;;;;60;N;;;;; +109CF;MEROITIC CURSIVE NUMBER SEVENTY;No;0;R;;;;70;N;;;;; +109D2;MEROITIC CURSIVE NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +109D3;MEROITIC CURSIVE NUMBER TWO HUNDRED;No;0;R;;;;200;N;;;;; +109D4;MEROITIC CURSIVE NUMBER THREE HUNDRED;No;0;R;;;;300;N;;;;; +109D5;MEROITIC CURSIVE NUMBER FOUR HUNDRED;No;0;R;;;;400;N;;;;; +109D6;MEROITIC CURSIVE NUMBER FIVE HUNDRED;No;0;R;;;;500;N;;;;; +109D7;MEROITIC CURSIVE NUMBER SIX HUNDRED;No;0;R;;;;600;N;;;;; +109D8;MEROITIC CURSIVE NUMBER SEVEN HUNDRED;No;0;R;;;;700;N;;;;; +109D9;MEROITIC CURSIVE NUMBER EIGHT HUNDRED;No;0;R;;;;800;N;;;;; +109DA;MEROITIC CURSIVE NUMBER NINE HUNDRED;No;0;R;;;;900;N;;;;; +109DB;MEROITIC CURSIVE NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +109DC;MEROITIC CURSIVE NUMBER TWO THOUSAND;No;0;R;;;;2000;N;;;;; +109DD;MEROITIC CURSIVE NUMBER THREE THOUSAND;No;0;R;;;;3000;N;;;;; +109DE;MEROITIC CURSIVE NUMBER FOUR THOUSAND;No;0;R;;;;4000;N;;;;; +109DF;MEROITIC CURSIVE NUMBER FIVE THOUSAND;No;0;R;;;;5000;N;;;;; +109E0;MEROITIC CURSIVE NUMBER SIX THOUSAND;No;0;R;;;;6000;N;;;;; +109E1;MEROITIC CURSIVE NUMBER SEVEN THOUSAND;No;0;R;;;;7000;N;;;;; +109E2;MEROITIC CURSIVE NUMBER EIGHT THOUSAND;No;0;R;;;;8000;N;;;;; +109E3;MEROITIC CURSIVE NUMBER NINE THOUSAND;No;0;R;;;;9000;N;;;;; +109E4;MEROITIC CURSIVE NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +109E5;MEROITIC CURSIVE NUMBER TWENTY THOUSAND;No;0;R;;;;20000;N;;;;; +109E6;MEROITIC CURSIVE NUMBER THIRTY THOUSAND;No;0;R;;;;30000;N;;;;; +109E7;MEROITIC CURSIVE NUMBER FORTY THOUSAND;No;0;R;;;;40000;N;;;;; +109E8;MEROITIC CURSIVE NUMBER FIFTY THOUSAND;No;0;R;;;;50000;N;;;;; +109E9;MEROITIC CURSIVE NUMBER SIXTY THOUSAND;No;0;R;;;;60000;N;;;;; +109EA;MEROITIC CURSIVE NUMBER SEVENTY THOUSAND;No;0;R;;;;70000;N;;;;; +109EB;MEROITIC CURSIVE NUMBER EIGHTY THOUSAND;No;0;R;;;;80000;N;;;;; +109EC;MEROITIC CURSIVE NUMBER NINETY THOUSAND;No;0;R;;;;90000;N;;;;; +109ED;MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND;No;0;R;;;;100000;N;;;;; +109EE;MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND;No;0;R;;;;200000;N;;;;; +109EF;MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND;No;0;R;;;;300000;N;;;;; +109F0;MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND;No;0;R;;;;400000;N;;;;; +109F1;MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND;No;0;R;;;;500000;N;;;;; +109F2;MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND;No;0;R;;;;600000;N;;;;; +109F3;MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND;No;0;R;;;;700000;N;;;;; +109F4;MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND;No;0;R;;;;800000;N;;;;; +109F5;MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND;No;0;R;;;;900000;N;;;;; +109F6;MEROITIC CURSIVE FRACTION ONE TWELFTH;No;0;R;;;;1/12;N;;;;; +109F7;MEROITIC CURSIVE FRACTION TWO TWELFTHS;No;0;R;;;;2/12;N;;;;; +109F8;MEROITIC CURSIVE FRACTION THREE TWELFTHS;No;0;R;;;;3/12;N;;;;; +109F9;MEROITIC CURSIVE FRACTION FOUR TWELFTHS;No;0;R;;;;4/12;N;;;;; +109FA;MEROITIC CURSIVE FRACTION FIVE TWELFTHS;No;0;R;;;;5/12;N;;;;; +109FB;MEROITIC CURSIVE FRACTION SIX TWELFTHS;No;0;R;;;;6/12;N;;;;; +109FC;MEROITIC CURSIVE FRACTION SEVEN TWELFTHS;No;0;R;;;;7/12;N;;;;; +109FD;MEROITIC CURSIVE FRACTION EIGHT TWELFTHS;No;0;R;;;;8/12;N;;;;; +109FE;MEROITIC CURSIVE FRACTION NINE TWELFTHS;No;0;R;;;;9/12;N;;;;; +109FF;MEROITIC CURSIVE FRACTION TEN TWELFTHS;No;0;R;;;;10/12;N;;;;; +10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; +10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; +10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; +10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; +10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; +10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; +10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; +10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; +10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; +10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; +10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; +10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; +10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; +10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; +10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; +10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; +10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; +10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; +10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; +10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; +10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; +10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; +10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; +10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; +10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; +10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; +10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; +10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; +10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; +10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; +10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; +10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; +10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; +10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; +10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; +10A34;KHAROSHTHI LETTER TTTA;Lo;0;R;;;;;N;;;;; +10A35;KHAROSHTHI LETTER VHA;Lo;0;R;;;;;N;;;;; +10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; +10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; +10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; +10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; +10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; +10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; +10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; +10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; +10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10A48;KHAROSHTHI FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; +10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; +10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; +10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; +10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; +10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; +10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; +10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; +10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;; +10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;; +10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;; +10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;; +10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;; +10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;; +10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;; +10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;; +10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;; +10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;; +10A80;OLD NORTH ARABIAN LETTER HEH;Lo;0;R;;;;;N;;;;; +10A81;OLD NORTH ARABIAN LETTER LAM;Lo;0;R;;;;;N;;;;; +10A82;OLD NORTH ARABIAN LETTER HAH;Lo;0;R;;;;;N;;;;; +10A83;OLD NORTH ARABIAN LETTER MEEM;Lo;0;R;;;;;N;;;;; +10A84;OLD NORTH ARABIAN LETTER QAF;Lo;0;R;;;;;N;;;;; +10A85;OLD NORTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A86;OLD NORTH ARABIAN LETTER ES-2;Lo;0;R;;;;;N;;;;; +10A87;OLD NORTH ARABIAN LETTER REH;Lo;0;R;;;;;N;;;;; +10A88;OLD NORTH ARABIAN LETTER BEH;Lo;0;R;;;;;N;;;;; +10A89;OLD NORTH ARABIAN LETTER TEH;Lo;0;R;;;;;N;;;;; +10A8A;OLD NORTH ARABIAN LETTER ES-1;Lo;0;R;;;;;N;;;;; +10A8B;OLD NORTH ARABIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +10A8C;OLD NORTH ARABIAN LETTER NOON;Lo;0;R;;;;;N;;;;; +10A8D;OLD NORTH ARABIAN LETTER KHAH;Lo;0;R;;;;;N;;;;; +10A8E;OLD NORTH ARABIAN LETTER SAD;Lo;0;R;;;;;N;;;;; +10A8F;OLD NORTH ARABIAN LETTER ES-3;Lo;0;R;;;;;N;;;;; +10A90;OLD NORTH ARABIAN LETTER FEH;Lo;0;R;;;;;N;;;;; +10A91;OLD NORTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A92;OLD NORTH ARABIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10A93;OLD NORTH ARABIAN LETTER DAD;Lo;0;R;;;;;N;;;;; +10A94;OLD NORTH ARABIAN LETTER GEEM;Lo;0;R;;;;;N;;;;; +10A95;OLD NORTH ARABIAN LETTER DAL;Lo;0;R;;;;;N;;;;; +10A96;OLD NORTH ARABIAN LETTER GHAIN;Lo;0;R;;;;;N;;;;; +10A97;OLD NORTH ARABIAN LETTER TAH;Lo;0;R;;;;;N;;;;; +10A98;OLD NORTH ARABIAN LETTER ZAIN;Lo;0;R;;;;;N;;;;; +10A99;OLD NORTH ARABIAN LETTER THAL;Lo;0;R;;;;;N;;;;; +10A9A;OLD NORTH ARABIAN LETTER YEH;Lo;0;R;;;;;N;;;;; +10A9B;OLD NORTH ARABIAN LETTER THEH;Lo;0;R;;;;;N;;;;; +10A9C;OLD NORTH ARABIAN LETTER ZAH;Lo;0;R;;;;;N;;;;; +10A9D;OLD NORTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A9E;OLD NORTH ARABIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10A9F;OLD NORTH ARABIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AC0;MANICHAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10AC1;MANICHAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10AC2;MANICHAEAN LETTER BHETH;Lo;0;R;;;;;N;;;;; +10AC3;MANICHAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10AC4;MANICHAEAN LETTER GHIMEL;Lo;0;R;;;;;N;;;;; +10AC5;MANICHAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10AC6;MANICHAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10AC7;MANICHAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10AC8;MANICHAEAN SIGN UD;So;0;R;;;;;N;;;;; +10AC9;MANICHAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10ACA;MANICHAEAN LETTER ZHAYIN;Lo;0;R;;;;;N;;;;; +10ACB;MANICHAEAN LETTER JAYIN;Lo;0;R;;;;;N;;;;; +10ACC;MANICHAEAN LETTER JHAYIN;Lo;0;R;;;;;N;;;;; +10ACD;MANICHAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10ACE;MANICHAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10ACF;MANICHAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10AD0;MANICHAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10AD1;MANICHAEAN LETTER XAPH;Lo;0;R;;;;;N;;;;; +10AD2;MANICHAEAN LETTER KHAPH;Lo;0;R;;;;;N;;;;; +10AD3;MANICHAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10AD4;MANICHAEAN LETTER DHAMEDH;Lo;0;R;;;;;N;;;;; +10AD5;MANICHAEAN LETTER THAMEDH;Lo;0;R;;;;;N;;;;; +10AD6;MANICHAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10AD7;MANICHAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10AD8;MANICHAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10AD9;MANICHAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10ADA;MANICHAEAN LETTER AAYIN;Lo;0;R;;;;;N;;;;; +10ADB;MANICHAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10ADC;MANICHAEAN LETTER FE;Lo;0;R;;;;;N;;;;; +10ADD;MANICHAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10ADE;MANICHAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10ADF;MANICHAEAN LETTER XOPH;Lo;0;R;;;;;N;;;;; +10AE0;MANICHAEAN LETTER QHOPH;Lo;0;R;;;;;N;;;;; +10AE1;MANICHAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10AE2;MANICHAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10AE3;MANICHAEAN LETTER SSHIN;Lo;0;R;;;;;N;;;;; +10AE4;MANICHAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10AE5;MANICHAEAN ABBREVIATION MARK ABOVE;Mn;230;NSM;;;;;N;;;;; +10AE6;MANICHAEAN ABBREVIATION MARK BELOW;Mn;220;NSM;;;;;N;;;;; +10AEB;MANICHAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10AEC;MANICHAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10AED;MANICHAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10AEE;MANICHAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AEF;MANICHAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10AF0;MANICHAEAN PUNCTUATION STAR;Po;0;R;;;;;N;;;;; +10AF1;MANICHAEAN PUNCTUATION FLEURON;Po;0;R;;;;;N;;;;; +10AF2;MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF3;MANICHAEAN PUNCTUATION DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF4;MANICHAEAN PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10AF5;MANICHAEAN PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; +10AF6;MANICHAEAN PUNCTUATION LINE FILLER;Po;0;R;;;;;N;;;;; +10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;; +10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;; +10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;; +10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;; +10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;; +10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;; +10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;; +10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;; +10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;; +10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;; +10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;; +10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;; +10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;; +10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;; +10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;; +10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;; +10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;; +10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;; +10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;; +10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;; +10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;; +10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;; +10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;; +10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;; +10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;; +10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;; +10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;; +10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;; +10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;; +10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;; +10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;; +10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;; +10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;; +10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;; +10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;; +10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;; +10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;; +10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;; +10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;; +10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;; +10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;; +10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;; +10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;; +10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;; +10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;; +10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;; +10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;; +10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;; +10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;; +10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;; +10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;; +10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;; +10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;; +10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;; +10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B80;PSALTER PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B81;PSALTER PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B82;PSALTER PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B83;PSALTER PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B84;PSALTER PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B85;PSALTER PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B86;PSALTER PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B87;PSALTER PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B88;PSALTER PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B89;PSALTER PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B8A;PSALTER PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B8B;PSALTER PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B8C;PSALTER PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B8D;PSALTER PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B8E;PSALTER PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B8F;PSALTER PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B90;PSALTER PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B91;PSALTER PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B99;PSALTER PAHLAVI SECTION MARK;Po;0;R;;;;;N;;;;; +10B9A;PSALTER PAHLAVI TURNED SECTION MARK;Po;0;R;;;;;N;;;;; +10B9B;PSALTER PAHLAVI FOUR DOTS WITH CROSS;Po;0;R;;;;;N;;;;; +10B9C;PSALTER PAHLAVI FOUR DOTS WITH DOT;Po;0;R;;;;;N;;;;; +10BA9;PSALTER PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10BAA;PSALTER PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10BAB;PSALTER PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10BAC;PSALTER PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10BAD;PSALTER PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10BAE;PSALTER PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10BAF;PSALTER PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;; +10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;; +10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;; +10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;; +10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;; +10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;; +10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;; +10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;; +10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;; +10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;; +10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;; +10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;; +10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;; +10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;; +10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;; +10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;; +10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;; +10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;; +10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;; +10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;; +10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;; +10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;; +10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;; +10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;; +10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;; +10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;; +10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;; +10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;; +10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;; +10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;; +10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;; +10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;; +10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;; +10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;; +10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;; +10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;; +10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;; +10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;; +10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;; +10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;; +10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;; +10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;; +10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;; +10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;; +10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;; +10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;; +10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;; +10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;; +10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;; +10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;; +10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;; +10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;; +10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;; +10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;; +10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;; +10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;; +10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;; +10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;; +10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;; +10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;; +10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;; +10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;; +10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;; +10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;; +10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;; +10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;; +10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;; +10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;; +10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;; +10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;; +10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; +10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; +10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; +10C80;OLD HUNGARIAN CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10CC0; +10C81;OLD HUNGARIAN CAPITAL LETTER AA;Lu;0;R;;;;;N;;;;10CC1; +10C82;OLD HUNGARIAN CAPITAL LETTER EB;Lu;0;R;;;;;N;;;;10CC2; +10C83;OLD HUNGARIAN CAPITAL LETTER AMB;Lu;0;R;;;;;N;;;;10CC3; +10C84;OLD HUNGARIAN CAPITAL LETTER EC;Lu;0;R;;;;;N;;;;10CC4; +10C85;OLD HUNGARIAN CAPITAL LETTER ENC;Lu;0;R;;;;;N;;;;10CC5; +10C86;OLD HUNGARIAN CAPITAL LETTER ECS;Lu;0;R;;;;;N;;;;10CC6; +10C87;OLD HUNGARIAN CAPITAL LETTER ED;Lu;0;R;;;;;N;;;;10CC7; +10C88;OLD HUNGARIAN CAPITAL LETTER AND;Lu;0;R;;;;;N;;;;10CC8; +10C89;OLD HUNGARIAN CAPITAL LETTER E;Lu;0;R;;;;;N;;;;10CC9; +10C8A;OLD HUNGARIAN CAPITAL LETTER CLOSE E;Lu;0;R;;;;;N;;;;10CCA; +10C8B;OLD HUNGARIAN CAPITAL LETTER EE;Lu;0;R;;;;;N;;;;10CCB; +10C8C;OLD HUNGARIAN CAPITAL LETTER EF;Lu;0;R;;;;;N;;;;10CCC; +10C8D;OLD HUNGARIAN CAPITAL LETTER EG;Lu;0;R;;;;;N;;;;10CCD; +10C8E;OLD HUNGARIAN CAPITAL LETTER EGY;Lu;0;R;;;;;N;;;;10CCE; +10C8F;OLD HUNGARIAN CAPITAL LETTER EH;Lu;0;R;;;;;N;;;;10CCF; +10C90;OLD HUNGARIAN CAPITAL LETTER I;Lu;0;R;;;;;N;;;;10CD0; +10C91;OLD HUNGARIAN CAPITAL LETTER II;Lu;0;R;;;;;N;;;;10CD1; +10C92;OLD HUNGARIAN CAPITAL LETTER EJ;Lu;0;R;;;;;N;;;;10CD2; +10C93;OLD HUNGARIAN CAPITAL LETTER EK;Lu;0;R;;;;;N;;;;10CD3; +10C94;OLD HUNGARIAN CAPITAL LETTER AK;Lu;0;R;;;;;N;;;;10CD4; +10C95;OLD HUNGARIAN CAPITAL LETTER UNK;Lu;0;R;;;;;N;;;;10CD5; +10C96;OLD HUNGARIAN CAPITAL LETTER EL;Lu;0;R;;;;;N;;;;10CD6; +10C97;OLD HUNGARIAN CAPITAL LETTER ELY;Lu;0;R;;;;;N;;;;10CD7; +10C98;OLD HUNGARIAN CAPITAL LETTER EM;Lu;0;R;;;;;N;;;;10CD8; +10C99;OLD HUNGARIAN CAPITAL LETTER EN;Lu;0;R;;;;;N;;;;10CD9; +10C9A;OLD HUNGARIAN CAPITAL LETTER ENY;Lu;0;R;;;;;N;;;;10CDA; +10C9B;OLD HUNGARIAN CAPITAL LETTER O;Lu;0;R;;;;;N;;;;10CDB; +10C9C;OLD HUNGARIAN CAPITAL LETTER OO;Lu;0;R;;;;;N;;;;10CDC; +10C9D;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE;Lu;0;R;;;;;N;;;;10CDD; +10C9E;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE;Lu;0;R;;;;;N;;;;10CDE; +10C9F;OLD HUNGARIAN CAPITAL LETTER OEE;Lu;0;R;;;;;N;;;;10CDF; +10CA0;OLD HUNGARIAN CAPITAL LETTER EP;Lu;0;R;;;;;N;;;;10CE0; +10CA1;OLD HUNGARIAN CAPITAL LETTER EMP;Lu;0;R;;;;;N;;;;10CE1; +10CA2;OLD HUNGARIAN CAPITAL LETTER ER;Lu;0;R;;;;;N;;;;10CE2; +10CA3;OLD HUNGARIAN CAPITAL LETTER SHORT ER;Lu;0;R;;;;;N;;;;10CE3; +10CA4;OLD HUNGARIAN CAPITAL LETTER ES;Lu;0;R;;;;;N;;;;10CE4; +10CA5;OLD HUNGARIAN CAPITAL LETTER ESZ;Lu;0;R;;;;;N;;;;10CE5; +10CA6;OLD HUNGARIAN CAPITAL LETTER ET;Lu;0;R;;;;;N;;;;10CE6; +10CA7;OLD HUNGARIAN CAPITAL LETTER ENT;Lu;0;R;;;;;N;;;;10CE7; +10CA8;OLD HUNGARIAN CAPITAL LETTER ETY;Lu;0;R;;;;;N;;;;10CE8; +10CA9;OLD HUNGARIAN CAPITAL LETTER ECH;Lu;0;R;;;;;N;;;;10CE9; +10CAA;OLD HUNGARIAN CAPITAL LETTER U;Lu;0;R;;;;;N;;;;10CEA; +10CAB;OLD HUNGARIAN CAPITAL LETTER UU;Lu;0;R;;;;;N;;;;10CEB; +10CAC;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE;Lu;0;R;;;;;N;;;;10CEC; +10CAD;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE;Lu;0;R;;;;;N;;;;10CED; +10CAE;OLD HUNGARIAN CAPITAL LETTER EV;Lu;0;R;;;;;N;;;;10CEE; +10CAF;OLD HUNGARIAN CAPITAL LETTER EZ;Lu;0;R;;;;;N;;;;10CEF; +10CB0;OLD HUNGARIAN CAPITAL LETTER EZS;Lu;0;R;;;;;N;;;;10CF0; +10CB1;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN;Lu;0;R;;;;;N;;;;10CF1; +10CB2;OLD HUNGARIAN CAPITAL LETTER US;Lu;0;R;;;;;N;;;;10CF2; +10CC0;OLD HUNGARIAN SMALL LETTER A;Ll;0;R;;;;;N;;;10C80;;10C80 +10CC1;OLD HUNGARIAN SMALL LETTER AA;Ll;0;R;;;;;N;;;10C81;;10C81 +10CC2;OLD HUNGARIAN SMALL LETTER EB;Ll;0;R;;;;;N;;;10C82;;10C82 +10CC3;OLD HUNGARIAN SMALL LETTER AMB;Ll;0;R;;;;;N;;;10C83;;10C83 +10CC4;OLD HUNGARIAN SMALL LETTER EC;Ll;0;R;;;;;N;;;10C84;;10C84 +10CC5;OLD HUNGARIAN SMALL LETTER ENC;Ll;0;R;;;;;N;;;10C85;;10C85 +10CC6;OLD HUNGARIAN SMALL LETTER ECS;Ll;0;R;;;;;N;;;10C86;;10C86 +10CC7;OLD HUNGARIAN SMALL LETTER ED;Ll;0;R;;;;;N;;;10C87;;10C87 +10CC8;OLD HUNGARIAN SMALL LETTER AND;Ll;0;R;;;;;N;;;10C88;;10C88 +10CC9;OLD HUNGARIAN SMALL LETTER E;Ll;0;R;;;;;N;;;10C89;;10C89 +10CCA;OLD HUNGARIAN SMALL LETTER CLOSE E;Ll;0;R;;;;;N;;;10C8A;;10C8A +10CCB;OLD HUNGARIAN SMALL LETTER EE;Ll;0;R;;;;;N;;;10C8B;;10C8B +10CCC;OLD HUNGARIAN SMALL LETTER EF;Ll;0;R;;;;;N;;;10C8C;;10C8C +10CCD;OLD HUNGARIAN SMALL LETTER EG;Ll;0;R;;;;;N;;;10C8D;;10C8D +10CCE;OLD HUNGARIAN SMALL LETTER EGY;Ll;0;R;;;;;N;;;10C8E;;10C8E +10CCF;OLD HUNGARIAN SMALL LETTER EH;Ll;0;R;;;;;N;;;10C8F;;10C8F +10CD0;OLD HUNGARIAN SMALL LETTER I;Ll;0;R;;;;;N;;;10C90;;10C90 +10CD1;OLD HUNGARIAN SMALL LETTER II;Ll;0;R;;;;;N;;;10C91;;10C91 +10CD2;OLD HUNGARIAN SMALL LETTER EJ;Ll;0;R;;;;;N;;;10C92;;10C92 +10CD3;OLD HUNGARIAN SMALL LETTER EK;Ll;0;R;;;;;N;;;10C93;;10C93 +10CD4;OLD HUNGARIAN SMALL LETTER AK;Ll;0;R;;;;;N;;;10C94;;10C94 +10CD5;OLD HUNGARIAN SMALL LETTER UNK;Ll;0;R;;;;;N;;;10C95;;10C95 +10CD6;OLD HUNGARIAN SMALL LETTER EL;Ll;0;R;;;;;N;;;10C96;;10C96 +10CD7;OLD HUNGARIAN SMALL LETTER ELY;Ll;0;R;;;;;N;;;10C97;;10C97 +10CD8;OLD HUNGARIAN SMALL LETTER EM;Ll;0;R;;;;;N;;;10C98;;10C98 +10CD9;OLD HUNGARIAN SMALL LETTER EN;Ll;0;R;;;;;N;;;10C99;;10C99 +10CDA;OLD HUNGARIAN SMALL LETTER ENY;Ll;0;R;;;;;N;;;10C9A;;10C9A +10CDB;OLD HUNGARIAN SMALL LETTER O;Ll;0;R;;;;;N;;;10C9B;;10C9B +10CDC;OLD HUNGARIAN SMALL LETTER OO;Ll;0;R;;;;;N;;;10C9C;;10C9C +10CDD;OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE;Ll;0;R;;;;;N;;;10C9D;;10C9D +10CDE;OLD HUNGARIAN SMALL LETTER RUDIMENTA OE;Ll;0;R;;;;;N;;;10C9E;;10C9E +10CDF;OLD HUNGARIAN SMALL LETTER OEE;Ll;0;R;;;;;N;;;10C9F;;10C9F +10CE0;OLD HUNGARIAN SMALL LETTER EP;Ll;0;R;;;;;N;;;10CA0;;10CA0 +10CE1;OLD HUNGARIAN SMALL LETTER EMP;Ll;0;R;;;;;N;;;10CA1;;10CA1 +10CE2;OLD HUNGARIAN SMALL LETTER ER;Ll;0;R;;;;;N;;;10CA2;;10CA2 +10CE3;OLD HUNGARIAN SMALL LETTER SHORT ER;Ll;0;R;;;;;N;;;10CA3;;10CA3 +10CE4;OLD HUNGARIAN SMALL LETTER ES;Ll;0;R;;;;;N;;;10CA4;;10CA4 +10CE5;OLD HUNGARIAN SMALL LETTER ESZ;Ll;0;R;;;;;N;;;10CA5;;10CA5 +10CE6;OLD HUNGARIAN SMALL LETTER ET;Ll;0;R;;;;;N;;;10CA6;;10CA6 +10CE7;OLD HUNGARIAN SMALL LETTER ENT;Ll;0;R;;;;;N;;;10CA7;;10CA7 +10CE8;OLD HUNGARIAN SMALL LETTER ETY;Ll;0;R;;;;;N;;;10CA8;;10CA8 +10CE9;OLD HUNGARIAN SMALL LETTER ECH;Ll;0;R;;;;;N;;;10CA9;;10CA9 +10CEA;OLD HUNGARIAN SMALL LETTER U;Ll;0;R;;;;;N;;;10CAA;;10CAA +10CEB;OLD HUNGARIAN SMALL LETTER UU;Ll;0;R;;;;;N;;;10CAB;;10CAB +10CEC;OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE;Ll;0;R;;;;;N;;;10CAC;;10CAC +10CED;OLD HUNGARIAN SMALL LETTER RUDIMENTA UE;Ll;0;R;;;;;N;;;10CAD;;10CAD +10CEE;OLD HUNGARIAN SMALL LETTER EV;Ll;0;R;;;;;N;;;10CAE;;10CAE +10CEF;OLD HUNGARIAN SMALL LETTER EZ;Ll;0;R;;;;;N;;;10CAF;;10CAF +10CF0;OLD HUNGARIAN SMALL LETTER EZS;Ll;0;R;;;;;N;;;10CB0;;10CB0 +10CF1;OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN;Ll;0;R;;;;;N;;;10CB1;;10CB1 +10CF2;OLD HUNGARIAN SMALL LETTER US;Ll;0;R;;;;;N;;;10CB2;;10CB2 +10CFA;OLD HUNGARIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10CFB;OLD HUNGARIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10CFC;OLD HUNGARIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10D00;HANIFI ROHINGYA LETTER A;Lo;0;AL;;;;;N;;;;; +10D01;HANIFI ROHINGYA LETTER BA;Lo;0;AL;;;;;N;;;;; +10D02;HANIFI ROHINGYA LETTER PA;Lo;0;AL;;;;;N;;;;; +10D03;HANIFI ROHINGYA LETTER TA;Lo;0;AL;;;;;N;;;;; +10D04;HANIFI ROHINGYA LETTER TTA;Lo;0;AL;;;;;N;;;;; +10D05;HANIFI ROHINGYA LETTER JA;Lo;0;AL;;;;;N;;;;; +10D06;HANIFI ROHINGYA LETTER CA;Lo;0;AL;;;;;N;;;;; +10D07;HANIFI ROHINGYA LETTER HA;Lo;0;AL;;;;;N;;;;; +10D08;HANIFI ROHINGYA LETTER KHA;Lo;0;AL;;;;;N;;;;; +10D09;HANIFI ROHINGYA LETTER FA;Lo;0;AL;;;;;N;;;;; +10D0A;HANIFI ROHINGYA LETTER DA;Lo;0;AL;;;;;N;;;;; +10D0B;HANIFI ROHINGYA LETTER DDA;Lo;0;AL;;;;;N;;;;; +10D0C;HANIFI ROHINGYA LETTER RA;Lo;0;AL;;;;;N;;;;; +10D0D;HANIFI ROHINGYA LETTER RRA;Lo;0;AL;;;;;N;;;;; +10D0E;HANIFI ROHINGYA LETTER ZA;Lo;0;AL;;;;;N;;;;; +10D0F;HANIFI ROHINGYA LETTER SA;Lo;0;AL;;;;;N;;;;; +10D10;HANIFI ROHINGYA LETTER SHA;Lo;0;AL;;;;;N;;;;; +10D11;HANIFI ROHINGYA LETTER KA;Lo;0;AL;;;;;N;;;;; +10D12;HANIFI ROHINGYA LETTER GA;Lo;0;AL;;;;;N;;;;; +10D13;HANIFI ROHINGYA LETTER LA;Lo;0;AL;;;;;N;;;;; +10D14;HANIFI ROHINGYA LETTER MA;Lo;0;AL;;;;;N;;;;; +10D15;HANIFI ROHINGYA LETTER NA;Lo;0;AL;;;;;N;;;;; +10D16;HANIFI ROHINGYA LETTER WA;Lo;0;AL;;;;;N;;;;; +10D17;HANIFI ROHINGYA LETTER KINNA WA;Lo;0;AL;;;;;N;;;;; +10D18;HANIFI ROHINGYA LETTER YA;Lo;0;AL;;;;;N;;;;; +10D19;HANIFI ROHINGYA LETTER KINNA YA;Lo;0;AL;;;;;N;;;;; +10D1A;HANIFI ROHINGYA LETTER NGA;Lo;0;AL;;;;;N;;;;; +10D1B;HANIFI ROHINGYA LETTER NYA;Lo;0;AL;;;;;N;;;;; +10D1C;HANIFI ROHINGYA LETTER VA;Lo;0;AL;;;;;N;;;;; +10D1D;HANIFI ROHINGYA VOWEL A;Lo;0;AL;;;;;N;;;;; +10D1E;HANIFI ROHINGYA VOWEL I;Lo;0;AL;;;;;N;;;;; +10D1F;HANIFI ROHINGYA VOWEL U;Lo;0;AL;;;;;N;;;;; +10D20;HANIFI ROHINGYA VOWEL E;Lo;0;AL;;;;;N;;;;; +10D21;HANIFI ROHINGYA VOWEL O;Lo;0;AL;;;;;N;;;;; +10D22;HANIFI ROHINGYA MARK SAKIN;Lo;0;AL;;;;;N;;;;; +10D23;HANIFI ROHINGYA MARK NA KHONNA;Lo;0;AL;;;;;N;;;;; +10D24;HANIFI ROHINGYA SIGN HARBAHAY;Mn;230;NSM;;;;;N;;;;; +10D25;HANIFI ROHINGYA SIGN TAHALA;Mn;230;NSM;;;;;N;;;;; +10D26;HANIFI ROHINGYA SIGN TANA;Mn;230;NSM;;;;;N;;;;; +10D27;HANIFI ROHINGYA SIGN TASSI;Mn;230;NSM;;;;;N;;;;; +10D30;HANIFI ROHINGYA DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +10D31;HANIFI ROHINGYA DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +10D32;HANIFI ROHINGYA DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +10D33;HANIFI ROHINGYA DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +10D34;HANIFI ROHINGYA DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +10D35;HANIFI ROHINGYA DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +10D36;HANIFI ROHINGYA DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +10D37;HANIFI ROHINGYA DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +10D38;HANIFI ROHINGYA DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +10D39;HANIFI ROHINGYA DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +10D40;GARAY DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +10D41;GARAY DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +10D42;GARAY DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +10D43;GARAY DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +10D44;GARAY DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +10D45;GARAY DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +10D46;GARAY DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +10D47;GARAY DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +10D48;GARAY DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +10D49;GARAY DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +10D4A;GARAY VOWEL SIGN A;Lo;0;R;;;;;N;;;;; +10D4B;GARAY VOWEL SIGN I;Lo;0;R;;;;;N;;;;; +10D4C;GARAY VOWEL SIGN O;Lo;0;R;;;;;N;;;;; +10D4D;GARAY VOWEL SIGN EE;Lo;0;R;;;;;N;;;;; +10D4E;GARAY VOWEL LENGTH MARK;Lm;0;R;;;;;N;;;;; +10D4F;GARAY SUKUN;Lo;0;R;;;;;N;;;;; +10D50;GARAY CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10D70; +10D51;GARAY CAPITAL LETTER CA;Lu;0;R;;;;;N;;;;10D71; +10D52;GARAY CAPITAL LETTER MA;Lu;0;R;;;;;N;;;;10D72; +10D53;GARAY CAPITAL LETTER KA;Lu;0;R;;;;;N;;;;10D73; +10D54;GARAY CAPITAL LETTER BA;Lu;0;R;;;;;N;;;;10D74; +10D55;GARAY CAPITAL LETTER JA;Lu;0;R;;;;;N;;;;10D75; +10D56;GARAY CAPITAL LETTER SA;Lu;0;R;;;;;N;;;;10D76; +10D57;GARAY CAPITAL LETTER WA;Lu;0;R;;;;;N;;;;10D77; +10D58;GARAY CAPITAL LETTER LA;Lu;0;R;;;;;N;;;;10D78; +10D59;GARAY CAPITAL LETTER GA;Lu;0;R;;;;;N;;;;10D79; +10D5A;GARAY CAPITAL LETTER DA;Lu;0;R;;;;;N;;;;10D7A; +10D5B;GARAY CAPITAL LETTER XA;Lu;0;R;;;;;N;;;;10D7B; +10D5C;GARAY CAPITAL LETTER YA;Lu;0;R;;;;;N;;;;10D7C; +10D5D;GARAY CAPITAL LETTER TA;Lu;0;R;;;;;N;;;;10D7D; +10D5E;GARAY CAPITAL LETTER RA;Lu;0;R;;;;;N;;;;10D7E; +10D5F;GARAY CAPITAL LETTER NYA;Lu;0;R;;;;;N;;;;10D7F; +10D60;GARAY CAPITAL LETTER FA;Lu;0;R;;;;;N;;;;10D80; +10D61;GARAY CAPITAL LETTER NA;Lu;0;R;;;;;N;;;;10D81; +10D62;GARAY CAPITAL LETTER PA;Lu;0;R;;;;;N;;;;10D82; +10D63;GARAY CAPITAL LETTER HA;Lu;0;R;;;;;N;;;;10D83; +10D64;GARAY CAPITAL LETTER OLD KA;Lu;0;R;;;;;N;;;;10D84; +10D65;GARAY CAPITAL LETTER OLD NA;Lu;0;R;;;;;N;;;;10D85; +10D69;GARAY VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; +10D6A;GARAY CONSONANT GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +10D6B;GARAY COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10D6C;GARAY COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10D6D;GARAY CONSONANT NASALIZATION MARK;Mn;230;NSM;;;;;N;;;;; +10D6E;GARAY HYPHEN;Pd;0;ON;;;;;N;;;;; +10D6F;GARAY REDUPLICATION MARK;Lm;0;R;;;;;N;;;;; +10D70;GARAY SMALL LETTER A;Ll;0;R;;;;;N;;;10D50;;10D50 +10D71;GARAY SMALL LETTER CA;Ll;0;R;;;;;N;;;10D51;;10D51 +10D72;GARAY SMALL LETTER MA;Ll;0;R;;;;;N;;;10D52;;10D52 +10D73;GARAY SMALL LETTER KA;Ll;0;R;;;;;N;;;10D53;;10D53 +10D74;GARAY SMALL LETTER BA;Ll;0;R;;;;;N;;;10D54;;10D54 +10D75;GARAY SMALL LETTER JA;Ll;0;R;;;;;N;;;10D55;;10D55 +10D76;GARAY SMALL LETTER SA;Ll;0;R;;;;;N;;;10D56;;10D56 +10D77;GARAY SMALL LETTER WA;Ll;0;R;;;;;N;;;10D57;;10D57 +10D78;GARAY SMALL LETTER LA;Ll;0;R;;;;;N;;;10D58;;10D58 +10D79;GARAY SMALL LETTER GA;Ll;0;R;;;;;N;;;10D59;;10D59 +10D7A;GARAY SMALL LETTER DA;Ll;0;R;;;;;N;;;10D5A;;10D5A +10D7B;GARAY SMALL LETTER XA;Ll;0;R;;;;;N;;;10D5B;;10D5B +10D7C;GARAY SMALL LETTER YA;Ll;0;R;;;;;N;;;10D5C;;10D5C +10D7D;GARAY SMALL LETTER TA;Ll;0;R;;;;;N;;;10D5D;;10D5D +10D7E;GARAY SMALL LETTER RA;Ll;0;R;;;;;N;;;10D5E;;10D5E +10D7F;GARAY SMALL LETTER NYA;Ll;0;R;;;;;N;;;10D5F;;10D5F +10D80;GARAY SMALL LETTER FA;Ll;0;R;;;;;N;;;10D60;;10D60 +10D81;GARAY SMALL LETTER NA;Ll;0;R;;;;;N;;;10D61;;10D61 +10D82;GARAY SMALL LETTER PA;Ll;0;R;;;;;N;;;10D62;;10D62 +10D83;GARAY SMALL LETTER HA;Ll;0;R;;;;;N;;;10D63;;10D63 +10D84;GARAY SMALL LETTER OLD KA;Ll;0;R;;;;;N;;;10D64;;10D64 +10D85;GARAY SMALL LETTER OLD NA;Ll;0;R;;;;;N;;;10D65;;10D65 +10D8E;GARAY PLUS SIGN;Sm;0;R;;;;;N;;;;; +10D8F;GARAY MINUS SIGN;Sm;0;R;;;;;N;;;;; +10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; +10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; +10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; +10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;; +10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;; +10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;; +10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;; +10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;; +10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;; +10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;; +10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;; +10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;; +10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;; +10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;; +10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;; +10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;; +10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;; +10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;; +10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;; +10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;; +10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;; +10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;; +10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;; +10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;; +10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;; +10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;; +10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;; +10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;N;;;;; +10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;; +10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;; +10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;; +10E80;YEZIDI LETTER ELIF;Lo;0;R;;;;;N;;;;; +10E81;YEZIDI LETTER BE;Lo;0;R;;;;;N;;;;; +10E82;YEZIDI LETTER PE;Lo;0;R;;;;;N;;;;; +10E83;YEZIDI LETTER PHE;Lo;0;R;;;;;N;;;;; +10E84;YEZIDI LETTER THE;Lo;0;R;;;;;N;;;;; +10E85;YEZIDI LETTER SE;Lo;0;R;;;;;N;;;;; +10E86;YEZIDI LETTER CIM;Lo;0;R;;;;;N;;;;; +10E87;YEZIDI LETTER CHIM;Lo;0;R;;;;;N;;;;; +10E88;YEZIDI LETTER CHHIM;Lo;0;R;;;;;N;;;;; +10E89;YEZIDI LETTER HHA;Lo;0;R;;;;;N;;;;; +10E8A;YEZIDI LETTER XA;Lo;0;R;;;;;N;;;;; +10E8B;YEZIDI LETTER DAL;Lo;0;R;;;;;N;;;;; +10E8C;YEZIDI LETTER ZAL;Lo;0;R;;;;;N;;;;; +10E8D;YEZIDI LETTER RA;Lo;0;R;;;;;N;;;;; +10E8E;YEZIDI LETTER RHA;Lo;0;R;;;;;N;;;;; +10E8F;YEZIDI LETTER ZA;Lo;0;R;;;;;N;;;;; +10E90;YEZIDI LETTER JA;Lo;0;R;;;;;N;;;;; +10E91;YEZIDI LETTER SIN;Lo;0;R;;;;;N;;;;; +10E92;YEZIDI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10E93;YEZIDI LETTER SAD;Lo;0;R;;;;;N;;;;; +10E94;YEZIDI LETTER DAD;Lo;0;R;;;;;N;;;;; +10E95;YEZIDI LETTER TA;Lo;0;R;;;;;N;;;;; +10E96;YEZIDI LETTER ZE;Lo;0;R;;;;;N;;;;; +10E97;YEZIDI LETTER EYN;Lo;0;R;;;;;N;;;;; +10E98;YEZIDI LETTER XHEYN;Lo;0;R;;;;;N;;;;; +10E99;YEZIDI LETTER FA;Lo;0;R;;;;;N;;;;; +10E9A;YEZIDI LETTER VA;Lo;0;R;;;;;N;;;;; +10E9B;YEZIDI LETTER VA ALTERNATE FORM;Lo;0;R;;;;;N;;;;; +10E9C;YEZIDI LETTER QAF;Lo;0;R;;;;;N;;;;; +10E9D;YEZIDI LETTER KAF;Lo;0;R;;;;;N;;;;; +10E9E;YEZIDI LETTER KHAF;Lo;0;R;;;;;N;;;;; +10E9F;YEZIDI LETTER GAF;Lo;0;R;;;;;N;;;;; +10EA0;YEZIDI LETTER LAM;Lo;0;R;;;;;N;;;;; +10EA1;YEZIDI LETTER MIM;Lo;0;R;;;;;N;;;;; +10EA2;YEZIDI LETTER NUN;Lo;0;R;;;;;N;;;;; +10EA3;YEZIDI LETTER UM;Lo;0;R;;;;;N;;;;; +10EA4;YEZIDI LETTER WAW;Lo;0;R;;;;;N;;;;; +10EA5;YEZIDI LETTER OW;Lo;0;R;;;;;N;;;;; +10EA6;YEZIDI LETTER EW;Lo;0;R;;;;;N;;;;; +10EA7;YEZIDI LETTER HAY;Lo;0;R;;;;;N;;;;; +10EA8;YEZIDI LETTER YOT;Lo;0;R;;;;;N;;;;; +10EA9;YEZIDI LETTER ET;Lo;0;R;;;;;N;;;;; +10EAB;YEZIDI COMBINING HAMZA MARK;Mn;230;NSM;;;;;N;;;;; +10EAC;YEZIDI COMBINING MADDA MARK;Mn;230;NSM;;;;;N;;;;; +10EAD;YEZIDI HYPHENATION MARK;Pd;0;R;;;;;N;;;;; +10EB0;YEZIDI LETTER LAM WITH DOT ABOVE;Lo;0;R;;;;;N;;;;; +10EB1;YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE;Lo;0;R;;;;;N;;;;; +10EC2;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW;Lo;0;AL;;;;;N;;;;; +10EC3;ARABIC LETTER TAH WITH TWO DOTS VERTICALLY BELOW;Lo;0;AL;;;;;N;;;;; +10EC4;ARABIC LETTER KAF WITH TWO DOTS VERTICALLY BELOW;Lo;0;AL;;;;;N;;;;; +10EC5;ARABIC SMALL YEH BARREE WITH TWO DOTS BELOW;Lm;0;AL;;;;;N;;;;; +10EC6;ARABIC LETTER THIN NOON;Lo;0;AL;;;;;N;;;;; +10EC7;ARABIC LETTER YEH WITH FOUR DOTS BELOW;Lo;0;AL;;;;;N;;;;; +10ED0;ARABIC BIBLICAL END OF VERSE;Po;0;ON;;;;;N;;;;; +10ED1;ARABIC LIGATURE ALAYHAA AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; +10ED2;ARABIC LIGATURE ALAYHIM AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; +10ED3;ARABIC LIGATURE ALAYHIMAA AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; +10ED4;ARABIC LIGATURE QADDASA ALLAAHU SIRRAH;So;0;ON;;;;;N;;;;; +10ED5;ARABIC LIGATURE QUDDISA SIRRUHUM;So;0;ON;;;;;N;;;;; +10ED6;ARABIC LIGATURE QUDDISA SIRRUHUMAA;So;0;ON;;;;;N;;;;; +10ED7;ARABIC LIGATURE QUDDISAT ASRAARUHUM;So;0;ON;;;;;N;;;;; +10ED8;ARABIC LIGATURE NAWWARA ALLAAHU MARQADAH;So;0;ON;;;;;N;;;;; +10EFA;ARABIC DOUBLE VERTICAL BAR BELOW;Mn;220;NSM;;;;;N;;;;; +10EFB;ARABIC SMALL LOW NOON;Mn;220;NSM;;;;;N;;;;; +10EFC;ARABIC COMBINING ALEF OVERLAY;Mn;0;NSM;;;;;N;;;;; +10EFD;ARABIC SMALL LOW WORD SAKTA;Mn;220;NSM;;;;;N;;;;; +10EFE;ARABIC SMALL LOW WORD QASR;Mn;220;NSM;;;;;N;;;;; +10EFF;ARABIC SMALL LOW WORD MADDA;Mn;220;NSM;;;;;N;;;;; +10F00;OLD SOGDIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10F01;OLD SOGDIAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; +10F02;OLD SOGDIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10F03;OLD SOGDIAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; +10F04;OLD SOGDIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10F05;OLD SOGDIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10F06;OLD SOGDIAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; +10F07;OLD SOGDIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10F08;OLD SOGDIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10F09;OLD SOGDIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10F0A;OLD SOGDIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10F0B;OLD SOGDIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10F0C;OLD SOGDIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10F0D;OLD SOGDIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10F0E;OLD SOGDIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10F0F;OLD SOGDIAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +10F10;OLD SOGDIAN LETTER FINAL NUN WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F11;OLD SOGDIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10F12;OLD SOGDIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10F13;OLD SOGDIAN LETTER ALTERNATE AYIN;Lo;0;R;;;;;N;;;;; +10F14;OLD SOGDIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10F15;OLD SOGDIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10F16;OLD SOGDIAN LETTER FINAL SADHE;Lo;0;R;;;;;N;;;;; +10F17;OLD SOGDIAN LETTER FINAL SADHE WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F18;OLD SOGDIAN LETTER RESH-AYIN-DALETH;Lo;0;R;;;;;N;;;;; +10F19;OLD SOGDIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10F1A;OLD SOGDIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10F1B;OLD SOGDIAN LETTER FINAL TAW;Lo;0;R;;;;;N;;;;; +10F1C;OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F1D;OLD SOGDIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10F1E;OLD SOGDIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10F1F;OLD SOGDIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10F20;OLD SOGDIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10F21;OLD SOGDIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10F22;OLD SOGDIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10F23;OLD SOGDIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10F24;OLD SOGDIAN NUMBER THIRTY;No;0;R;;;;30;N;;;;; +10F25;OLD SOGDIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10F26;OLD SOGDIAN FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +10F27;OLD SOGDIAN LIGATURE AYIN-DALETH;Lo;0;R;;;;;N;;;;; +10F30;SOGDIAN LETTER ALEPH;Lo;0;AL;;;;;N;;;;; +10F31;SOGDIAN LETTER BETH;Lo;0;AL;;;;;N;;;;; +10F32;SOGDIAN LETTER GIMEL;Lo;0;AL;;;;;N;;;;; +10F33;SOGDIAN LETTER HE;Lo;0;AL;;;;;N;;;;; +10F34;SOGDIAN LETTER WAW;Lo;0;AL;;;;;N;;;;; +10F35;SOGDIAN LETTER ZAYIN;Lo;0;AL;;;;;N;;;;; +10F36;SOGDIAN LETTER HETH;Lo;0;AL;;;;;N;;;;; +10F37;SOGDIAN LETTER YODH;Lo;0;AL;;;;;N;;;;; +10F38;SOGDIAN LETTER KAPH;Lo;0;AL;;;;;N;;;;; +10F39;SOGDIAN LETTER LAMEDH;Lo;0;AL;;;;;N;;;;; +10F3A;SOGDIAN LETTER MEM;Lo;0;AL;;;;;N;;;;; +10F3B;SOGDIAN LETTER NUN;Lo;0;AL;;;;;N;;;;; +10F3C;SOGDIAN LETTER SAMEKH;Lo;0;AL;;;;;N;;;;; +10F3D;SOGDIAN LETTER AYIN;Lo;0;AL;;;;;N;;;;; +10F3E;SOGDIAN LETTER PE;Lo;0;AL;;;;;N;;;;; +10F3F;SOGDIAN LETTER SADHE;Lo;0;AL;;;;;N;;;;; +10F40;SOGDIAN LETTER RESH-AYIN;Lo;0;AL;;;;;N;;;;; +10F41;SOGDIAN LETTER SHIN;Lo;0;AL;;;;;N;;;;; +10F42;SOGDIAN LETTER TAW;Lo;0;AL;;;;;N;;;;; +10F43;SOGDIAN LETTER FETH;Lo;0;AL;;;;;N;;;;; +10F44;SOGDIAN LETTER LESH;Lo;0;AL;;;;;N;;;;; +10F45;SOGDIAN INDEPENDENT SHIN;Lo;0;AL;;;;;N;;;;; +10F46;SOGDIAN COMBINING DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10F47;SOGDIAN COMBINING TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +10F48;SOGDIAN COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10F49;SOGDIAN COMBINING TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4A;SOGDIAN COMBINING CURVE ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4B;SOGDIAN COMBINING CURVE BELOW;Mn;220;NSM;;;;;N;;;;; +10F4C;SOGDIAN COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4D;SOGDIAN COMBINING HOOK BELOW;Mn;220;NSM;;;;;N;;;;; +10F4E;SOGDIAN COMBINING LONG HOOK BELOW;Mn;220;NSM;;;;;N;;;;; +10F4F;SOGDIAN COMBINING RESH BELOW;Mn;220;NSM;;;;;N;;;;; +10F50;SOGDIAN COMBINING STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +10F51;SOGDIAN NUMBER ONE;No;0;AL;;;;1;N;;;;; +10F52;SOGDIAN NUMBER TEN;No;0;AL;;;;10;N;;;;; +10F53;SOGDIAN NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +10F54;SOGDIAN NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +10F55;SOGDIAN PUNCTUATION TWO VERTICAL BARS;Po;0;AL;;;;;N;;;;; +10F56;SOGDIAN PUNCTUATION TWO VERTICAL BARS WITH DOTS;Po;0;AL;;;;;N;;;;; +10F57;SOGDIAN PUNCTUATION CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;; +10F58;SOGDIAN PUNCTUATION TWO CIRCLES WITH DOTS;Po;0;AL;;;;;N;;;;; +10F59;SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;; +10F70;OLD UYGHUR LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10F71;OLD UYGHUR LETTER BETH;Lo;0;R;;;;;N;;;;; +10F72;OLD UYGHUR LETTER GIMEL-HETH;Lo;0;R;;;;;N;;;;; +10F73;OLD UYGHUR LETTER WAW;Lo;0;R;;;;;N;;;;; +10F74;OLD UYGHUR LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10F75;OLD UYGHUR LETTER FINAL HETH;Lo;0;R;;;;;N;;;;; +10F76;OLD UYGHUR LETTER YODH;Lo;0;R;;;;;N;;;;; +10F77;OLD UYGHUR LETTER KAPH;Lo;0;R;;;;;N;;;;; +10F78;OLD UYGHUR LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10F79;OLD UYGHUR LETTER MEM;Lo;0;R;;;;;N;;;;; +10F7A;OLD UYGHUR LETTER NUN;Lo;0;R;;;;;N;;;;; +10F7B;OLD UYGHUR LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10F7C;OLD UYGHUR LETTER PE;Lo;0;R;;;;;N;;;;; +10F7D;OLD UYGHUR LETTER SADHE;Lo;0;R;;;;;N;;;;; +10F7E;OLD UYGHUR LETTER RESH;Lo;0;R;;;;;N;;;;; +10F7F;OLD UYGHUR LETTER SHIN;Lo;0;R;;;;;N;;;;; +10F80;OLD UYGHUR LETTER TAW;Lo;0;R;;;;;N;;;;; +10F81;OLD UYGHUR LETTER LESH;Lo;0;R;;;;;N;;;;; +10F82;OLD UYGHUR COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10F83;OLD UYGHUR COMBINING DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10F84;OLD UYGHUR COMBINING TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +10F85;OLD UYGHUR COMBINING TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +10F86;OLD UYGHUR PUNCTUATION BAR;Po;0;R;;;;;N;;;;; +10F87;OLD UYGHUR PUNCTUATION TWO BARS;Po;0;R;;;;;N;;;;; +10F88;OLD UYGHUR PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; +10F89;OLD UYGHUR PUNCTUATION FOUR DOTS;Po;0;R;;;;;N;;;;; +10FB0;CHORASMIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10FB1;CHORASMIAN LETTER SMALL ALEPH;Lo;0;R;;;;;N;;;;; +10FB2;CHORASMIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10FB3;CHORASMIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10FB4;CHORASMIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10FB5;CHORASMIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10FB6;CHORASMIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10FB7;CHORASMIAN LETTER CURLED WAW;Lo;0;R;;;;;N;;;;; +10FB8;CHORASMIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10FB9;CHORASMIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10FBA;CHORASMIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10FBB;CHORASMIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10FBC;CHORASMIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10FBD;CHORASMIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10FBE;CHORASMIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10FBF;CHORASMIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10FC0;CHORASMIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10FC1;CHORASMIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10FC2;CHORASMIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10FC3;CHORASMIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10FC4;CHORASMIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10FC5;CHORASMIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10FC6;CHORASMIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10FC7;CHORASMIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10FC8;CHORASMIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10FC9;CHORASMIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10FCA;CHORASMIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10FCB;CHORASMIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10FE0;ELYMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10FE1;ELYMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; +10FE2;ELYMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10FE3;ELYMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; +10FE4;ELYMAIC LETTER HE;Lo;0;R;;;;;N;;;;; +10FE5;ELYMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; +10FE6;ELYMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10FE7;ELYMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; +10FE8;ELYMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; +10FE9;ELYMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; +10FEA;ELYMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; +10FEB;ELYMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10FEC;ELYMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; +10FED;ELYMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; +10FEE;ELYMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10FEF;ELYMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; +10FF0;ELYMAIC LETTER PE;Lo;0;R;;;;;N;;;;; +10FF1;ELYMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; +10FF2;ELYMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; +10FF3;ELYMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; +10FF4;ELYMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; +10FF5;ELYMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; +10FF6;ELYMAIC LIGATURE ZAYIN-YODH;Lo;0;R;;;;;N;;;;; +11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11003;BRAHMI SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11004;BRAHMI SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11005;BRAHMI LETTER A;Lo;0;L;;;;;N;;;;; +11006;BRAHMI LETTER AA;Lo;0;L;;;;;N;;;;; +11007;BRAHMI LETTER I;Lo;0;L;;;;;N;;;;; +11008;BRAHMI LETTER II;Lo;0;L;;;;;N;;;;; +11009;BRAHMI LETTER U;Lo;0;L;;;;;N;;;;; +1100A;BRAHMI LETTER UU;Lo;0;L;;;;;N;;;;; +1100B;BRAHMI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1100C;BRAHMI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1100D;BRAHMI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1100E;BRAHMI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1100F;BRAHMI LETTER E;Lo;0;L;;;;;N;;;;; +11010;BRAHMI LETTER AI;Lo;0;L;;;;;N;;;;; +11011;BRAHMI LETTER O;Lo;0;L;;;;;N;;;;; +11012;BRAHMI LETTER AU;Lo;0;L;;;;;N;;;;; +11013;BRAHMI LETTER KA;Lo;0;L;;;;;N;;;;; +11014;BRAHMI LETTER KHA;Lo;0;L;;;;;N;;;;; +11015;BRAHMI LETTER GA;Lo;0;L;;;;;N;;;;; +11016;BRAHMI LETTER GHA;Lo;0;L;;;;;N;;;;; +11017;BRAHMI LETTER NGA;Lo;0;L;;;;;N;;;;; +11018;BRAHMI LETTER CA;Lo;0;L;;;;;N;;;;; +11019;BRAHMI LETTER CHA;Lo;0;L;;;;;N;;;;; +1101A;BRAHMI LETTER JA;Lo;0;L;;;;;N;;;;; +1101B;BRAHMI LETTER JHA;Lo;0;L;;;;;N;;;;; +1101C;BRAHMI LETTER NYA;Lo;0;L;;;;;N;;;;; +1101D;BRAHMI LETTER TTA;Lo;0;L;;;;;N;;;;; +1101E;BRAHMI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1101F;BRAHMI LETTER DDA;Lo;0;L;;;;;N;;;;; +11020;BRAHMI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11021;BRAHMI LETTER NNA;Lo;0;L;;;;;N;;;;; +11022;BRAHMI LETTER TA;Lo;0;L;;;;;N;;;;; +11023;BRAHMI LETTER THA;Lo;0;L;;;;;N;;;;; +11024;BRAHMI LETTER DA;Lo;0;L;;;;;N;;;;; +11025;BRAHMI LETTER DHA;Lo;0;L;;;;;N;;;;; +11026;BRAHMI LETTER NA;Lo;0;L;;;;;N;;;;; +11027;BRAHMI LETTER PA;Lo;0;L;;;;;N;;;;; +11028;BRAHMI LETTER PHA;Lo;0;L;;;;;N;;;;; +11029;BRAHMI LETTER BA;Lo;0;L;;;;;N;;;;; +1102A;BRAHMI LETTER BHA;Lo;0;L;;;;;N;;;;; +1102B;BRAHMI LETTER MA;Lo;0;L;;;;;N;;;;; +1102C;BRAHMI LETTER YA;Lo;0;L;;;;;N;;;;; +1102D;BRAHMI LETTER RA;Lo;0;L;;;;;N;;;;; +1102E;BRAHMI LETTER LA;Lo;0;L;;;;;N;;;;; +1102F;BRAHMI LETTER VA;Lo;0;L;;;;;N;;;;; +11030;BRAHMI LETTER SHA;Lo;0;L;;;;;N;;;;; +11031;BRAHMI LETTER SSA;Lo;0;L;;;;;N;;;;; +11032;BRAHMI LETTER SA;Lo;0;L;;;;;N;;;;; +11033;BRAHMI LETTER HA;Lo;0;L;;;;;N;;;;; +11034;BRAHMI LETTER LLA;Lo;0;L;;;;;N;;;;; +11035;BRAHMI LETTER OLD TAMIL LLLA;Lo;0;L;;;;;N;;;;; +11036;BRAHMI LETTER OLD TAMIL RRA;Lo;0;L;;;;;N;;;;; +11037;BRAHMI LETTER OLD TAMIL NNNA;Lo;0;L;;;;;N;;;;; +11038;BRAHMI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11039;BRAHMI VOWEL SIGN BHATTIPROLU AA;Mn;0;NSM;;;;;N;;;;; +1103A;BRAHMI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1103B;BRAHMI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1103C;BRAHMI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1103D;BRAHMI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1103E;BRAHMI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +1103F;BRAHMI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11040;BRAHMI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11041;BRAHMI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11042;BRAHMI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11043;BRAHMI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11044;BRAHMI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11045;BRAHMI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11046;BRAHMI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11047;BRAHMI DANDA;Po;0;L;;;;;N;;;;; +11048;BRAHMI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11049;BRAHMI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; +1104A;BRAHMI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; +1104B;BRAHMI PUNCTUATION LINE;Po;0;L;;;;;N;;;;; +1104C;BRAHMI PUNCTUATION CRESCENT BAR;Po;0;L;;;;;N;;;;; +1104D;BRAHMI PUNCTUATION LOTUS;Po;0;L;;;;;N;;;;; +11052;BRAHMI NUMBER ONE;No;0;ON;;;1;1;N;;;;; +11053;BRAHMI NUMBER TWO;No;0;ON;;;2;2;N;;;;; +11054;BRAHMI NUMBER THREE;No;0;ON;;;3;3;N;;;;; +11055;BRAHMI NUMBER FOUR;No;0;ON;;;4;4;N;;;;; +11056;BRAHMI NUMBER FIVE;No;0;ON;;;5;5;N;;;;; +11057;BRAHMI NUMBER SIX;No;0;ON;;;6;6;N;;;;; +11058;BRAHMI NUMBER SEVEN;No;0;ON;;;7;7;N;;;;; +11059;BRAHMI NUMBER EIGHT;No;0;ON;;;8;8;N;;;;; +1105A;BRAHMI NUMBER NINE;No;0;ON;;;9;9;N;;;;; +1105B;BRAHMI NUMBER TEN;No;0;ON;;;;10;N;;;;; +1105C;BRAHMI NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +1105D;BRAHMI NUMBER THIRTY;No;0;ON;;;;30;N;;;;; +1105E;BRAHMI NUMBER FORTY;No;0;ON;;;;40;N;;;;; +1105F;BRAHMI NUMBER FIFTY;No;0;ON;;;;50;N;;;;; +11060;BRAHMI NUMBER SIXTY;No;0;ON;;;;60;N;;;;; +11061;BRAHMI NUMBER SEVENTY;No;0;ON;;;;70;N;;;;; +11062;BRAHMI NUMBER EIGHTY;No;0;ON;;;;80;N;;;;; +11063;BRAHMI NUMBER NINETY;No;0;ON;;;;90;N;;;;; +11064;BRAHMI NUMBER ONE HUNDRED;No;0;ON;;;;100;N;;;;; +11065;BRAHMI NUMBER ONE THOUSAND;No;0;ON;;;;1000;N;;;;; +11066;BRAHMI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11067;BRAHMI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11068;BRAHMI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11069;BRAHMI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1106A;BRAHMI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1106B;BRAHMI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1106C;BRAHMI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11070;BRAHMI SIGN OLD TAMIL VIRAMA;Mn;9;NSM;;;;;N;;;;; +11071;BRAHMI LETTER OLD TAMIL SHORT E;Lo;0;L;;;;;N;;;;; +11072;BRAHMI LETTER OLD TAMIL SHORT O;Lo;0;L;;;;;N;;;;; +11073;BRAHMI VOWEL SIGN OLD TAMIL SHORT E;Mn;0;NSM;;;;;N;;;;; +11074;BRAHMI VOWEL SIGN OLD TAMIL SHORT O;Mn;0;NSM;;;;;N;;;;; +11075;BRAHMI LETTER OLD TAMIL LLA;Lo;0;L;;;;;N;;;;; +1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;; +11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;; +11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;; +11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;; +11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;; +11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;; +11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;; +11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;; +1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;; +1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;; +1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;; +1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;; +1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;; +1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;; +11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;; +11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;; +11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;; +11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;; +11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;; +11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;; +11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;; +11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;; +11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;; +1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;; +1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;; +1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;; +1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;; +1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;; +110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;; +110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;; +110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;; +110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;; +110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;; +110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;; +110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;; +110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;; +110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;; +110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;; +110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;; +110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;; +110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;; +110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;; +110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;; +110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;; +110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;; +110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;; +110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;; +110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;; +110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +110C2;KAITHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +110CD;KAITHI NUMBER SIGN ABOVE;Cf;0;L;;;;;N;;;;; +110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;; +110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;; +110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;; +110D3;SORA SOMPENG LETTER CAH;Lo;0;L;;;;;N;;;;; +110D4;SORA SOMPENG LETTER DAH;Lo;0;L;;;;;N;;;;; +110D5;SORA SOMPENG LETTER GAH;Lo;0;L;;;;;N;;;;; +110D6;SORA SOMPENG LETTER MAH;Lo;0;L;;;;;N;;;;; +110D7;SORA SOMPENG LETTER NGAH;Lo;0;L;;;;;N;;;;; +110D8;SORA SOMPENG LETTER LAH;Lo;0;L;;;;;N;;;;; +110D9;SORA SOMPENG LETTER NAH;Lo;0;L;;;;;N;;;;; +110DA;SORA SOMPENG LETTER VAH;Lo;0;L;;;;;N;;;;; +110DB;SORA SOMPENG LETTER PAH;Lo;0;L;;;;;N;;;;; +110DC;SORA SOMPENG LETTER YAH;Lo;0;L;;;;;N;;;;; +110DD;SORA SOMPENG LETTER RAH;Lo;0;L;;;;;N;;;;; +110DE;SORA SOMPENG LETTER HAH;Lo;0;L;;;;;N;;;;; +110DF;SORA SOMPENG LETTER KAH;Lo;0;L;;;;;N;;;;; +110E0;SORA SOMPENG LETTER JAH;Lo;0;L;;;;;N;;;;; +110E1;SORA SOMPENG LETTER NYAH;Lo;0;L;;;;;N;;;;; +110E2;SORA SOMPENG LETTER AH;Lo;0;L;;;;;N;;;;; +110E3;SORA SOMPENG LETTER EEH;Lo;0;L;;;;;N;;;;; +110E4;SORA SOMPENG LETTER IH;Lo;0;L;;;;;N;;;;; +110E5;SORA SOMPENG LETTER UH;Lo;0;L;;;;;N;;;;; +110E6;SORA SOMPENG LETTER OH;Lo;0;L;;;;;N;;;;; +110E7;SORA SOMPENG LETTER EH;Lo;0;L;;;;;N;;;;; +110E8;SORA SOMPENG LETTER MAE;Lo;0;L;;;;;N;;;;; +110F0;SORA SOMPENG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +110F1;SORA SOMPENG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +110F2;SORA SOMPENG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +110F3;SORA SOMPENG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +110F4;SORA SOMPENG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +110F5;SORA SOMPENG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +110F6;SORA SOMPENG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +110F7;SORA SOMPENG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +110F8;SORA SOMPENG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +110F9;SORA SOMPENG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11100;CHAKMA SIGN CANDRABINDU;Mn;230;NSM;;;;;N;;;;; +11101;CHAKMA SIGN ANUSVARA;Mn;230;NSM;;;;;N;;;;; +11102;CHAKMA SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +11103;CHAKMA LETTER AA;Lo;0;L;;;;;N;;;;; +11104;CHAKMA LETTER I;Lo;0;L;;;;;N;;;;; +11105;CHAKMA LETTER U;Lo;0;L;;;;;N;;;;; +11106;CHAKMA LETTER E;Lo;0;L;;;;;N;;;;; +11107;CHAKMA LETTER KAA;Lo;0;L;;;;;N;;;;; +11108;CHAKMA LETTER KHAA;Lo;0;L;;;;;N;;;;; +11109;CHAKMA LETTER GAA;Lo;0;L;;;;;N;;;;; +1110A;CHAKMA LETTER GHAA;Lo;0;L;;;;;N;;;;; +1110B;CHAKMA LETTER NGAA;Lo;0;L;;;;;N;;;;; +1110C;CHAKMA LETTER CAA;Lo;0;L;;;;;N;;;;; +1110D;CHAKMA LETTER CHAA;Lo;0;L;;;;;N;;;;; +1110E;CHAKMA LETTER JAA;Lo;0;L;;;;;N;;;;; +1110F;CHAKMA LETTER JHAA;Lo;0;L;;;;;N;;;;; +11110;CHAKMA LETTER NYAA;Lo;0;L;;;;;N;;;;; +11111;CHAKMA LETTER TTAA;Lo;0;L;;;;;N;;;;; +11112;CHAKMA LETTER TTHAA;Lo;0;L;;;;;N;;;;; +11113;CHAKMA LETTER DDAA;Lo;0;L;;;;;N;;;;; +11114;CHAKMA LETTER DDHAA;Lo;0;L;;;;;N;;;;; +11115;CHAKMA LETTER NNAA;Lo;0;L;;;;;N;;;;; +11116;CHAKMA LETTER TAA;Lo;0;L;;;;;N;;;;; +11117;CHAKMA LETTER THAA;Lo;0;L;;;;;N;;;;; +11118;CHAKMA LETTER DAA;Lo;0;L;;;;;N;;;;; +11119;CHAKMA LETTER DHAA;Lo;0;L;;;;;N;;;;; +1111A;CHAKMA LETTER NAA;Lo;0;L;;;;;N;;;;; +1111B;CHAKMA LETTER PAA;Lo;0;L;;;;;N;;;;; +1111C;CHAKMA LETTER PHAA;Lo;0;L;;;;;N;;;;; +1111D;CHAKMA LETTER BAA;Lo;0;L;;;;;N;;;;; +1111E;CHAKMA LETTER BHAA;Lo;0;L;;;;;N;;;;; +1111F;CHAKMA LETTER MAA;Lo;0;L;;;;;N;;;;; +11120;CHAKMA LETTER YYAA;Lo;0;L;;;;;N;;;;; +11121;CHAKMA LETTER YAA;Lo;0;L;;;;;N;;;;; +11122;CHAKMA LETTER RAA;Lo;0;L;;;;;N;;;;; +11123;CHAKMA LETTER LAA;Lo;0;L;;;;;N;;;;; +11124;CHAKMA LETTER WAA;Lo;0;L;;;;;N;;;;; +11125;CHAKMA LETTER SAA;Lo;0;L;;;;;N;;;;; +11126;CHAKMA LETTER HAA;Lo;0;L;;;;;N;;;;; +11127;CHAKMA VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +11128;CHAKMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11129;CHAKMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1112A;CHAKMA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1112B;CHAKMA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1112C;CHAKMA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1112D;CHAKMA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1112E;CHAKMA VOWEL SIGN O;Mn;0;NSM;11131 11127;;;;N;;;;; +1112F;CHAKMA VOWEL SIGN AU;Mn;0;NSM;11132 11127;;;;N;;;;; +11130;CHAKMA VOWEL SIGN OI;Mn;0;NSM;;;;;N;;;;; +11131;CHAKMA O MARK;Mn;0;NSM;;;;;N;;;;; +11132;CHAKMA AU MARK;Mn;0;NSM;;;;;N;;;;; +11133;CHAKMA VIRAMA;Mn;9;NSM;;;;;N;;;;; +11134;CHAKMA MAAYYAA;Mn;9;NSM;;;;;N;;;;; +11136;CHAKMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11137;CHAKMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11138;CHAKMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11139;CHAKMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1113A;CHAKMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1113B;CHAKMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1113C;CHAKMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1113D;CHAKMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1113E;CHAKMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1113F;CHAKMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11140;CHAKMA SECTION MARK;Po;0;L;;;;;N;;;;; +11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;; +11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11143;CHAKMA QUESTION MARK;Po;0;L;;;;;N;;;;; +11144;CHAKMA LETTER LHAA;Lo;0;L;;;;;N;;;;; +11145;CHAKMA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11146;CHAKMA VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; +11147;CHAKMA LETTER VAA;Lo;0;L;;;;;N;;;;; +11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;; +11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;; +11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;; +11153;MAHAJANI LETTER E;Lo;0;L;;;;;N;;;;; +11154;MAHAJANI LETTER O;Lo;0;L;;;;;N;;;;; +11155;MAHAJANI LETTER KA;Lo;0;L;;;;;N;;;;; +11156;MAHAJANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11157;MAHAJANI LETTER GA;Lo;0;L;;;;;N;;;;; +11158;MAHAJANI LETTER GHA;Lo;0;L;;;;;N;;;;; +11159;MAHAJANI LETTER CA;Lo;0;L;;;;;N;;;;; +1115A;MAHAJANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1115B;MAHAJANI LETTER JA;Lo;0;L;;;;;N;;;;; +1115C;MAHAJANI LETTER JHA;Lo;0;L;;;;;N;;;;; +1115D;MAHAJANI LETTER NYA;Lo;0;L;;;;;N;;;;; +1115E;MAHAJANI LETTER TTA;Lo;0;L;;;;;N;;;;; +1115F;MAHAJANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11160;MAHAJANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11161;MAHAJANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11162;MAHAJANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11163;MAHAJANI LETTER TA;Lo;0;L;;;;;N;;;;; +11164;MAHAJANI LETTER THA;Lo;0;L;;;;;N;;;;; +11165;MAHAJANI LETTER DA;Lo;0;L;;;;;N;;;;; +11166;MAHAJANI LETTER DHA;Lo;0;L;;;;;N;;;;; +11167;MAHAJANI LETTER NA;Lo;0;L;;;;;N;;;;; +11168;MAHAJANI LETTER PA;Lo;0;L;;;;;N;;;;; +11169;MAHAJANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1116A;MAHAJANI LETTER BA;Lo;0;L;;;;;N;;;;; +1116B;MAHAJANI LETTER BHA;Lo;0;L;;;;;N;;;;; +1116C;MAHAJANI LETTER MA;Lo;0;L;;;;;N;;;;; +1116D;MAHAJANI LETTER RA;Lo;0;L;;;;;N;;;;; +1116E;MAHAJANI LETTER LA;Lo;0;L;;;;;N;;;;; +1116F;MAHAJANI LETTER VA;Lo;0;L;;;;;N;;;;; +11170;MAHAJANI LETTER SA;Lo;0;L;;;;;N;;;;; +11171;MAHAJANI LETTER HA;Lo;0;L;;;;;N;;;;; +11172;MAHAJANI LETTER RRA;Lo;0;L;;;;;N;;;;; +11173;MAHAJANI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11174;MAHAJANI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11175;MAHAJANI SECTION MARK;Po;0;L;;;;;N;;;;; +11176;MAHAJANI LIGATURE SHRI;Lo;0;L;;;;;N;;;;; +11180;SHARADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11181;SHARADA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11182;SHARADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11183;SHARADA LETTER A;Lo;0;L;;;;;N;;;;; +11184;SHARADA LETTER AA;Lo;0;L;;;;;N;;;;; +11185;SHARADA LETTER I;Lo;0;L;;;;;N;;;;; +11186;SHARADA LETTER II;Lo;0;L;;;;;N;;;;; +11187;SHARADA LETTER U;Lo;0;L;;;;;N;;;;; +11188;SHARADA LETTER UU;Lo;0;L;;;;;N;;;;; +11189;SHARADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1118A;SHARADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1118B;SHARADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1118C;SHARADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1118D;SHARADA LETTER E;Lo;0;L;;;;;N;;;;; +1118E;SHARADA LETTER AI;Lo;0;L;;;;;N;;;;; +1118F;SHARADA LETTER O;Lo;0;L;;;;;N;;;;; +11190;SHARADA LETTER AU;Lo;0;L;;;;;N;;;;; +11191;SHARADA LETTER KA;Lo;0;L;;;;;N;;;;; +11192;SHARADA LETTER KHA;Lo;0;L;;;;;N;;;;; +11193;SHARADA LETTER GA;Lo;0;L;;;;;N;;;;; +11194;SHARADA LETTER GHA;Lo;0;L;;;;;N;;;;; +11195;SHARADA LETTER NGA;Lo;0;L;;;;;N;;;;; +11196;SHARADA LETTER CA;Lo;0;L;;;;;N;;;;; +11197;SHARADA LETTER CHA;Lo;0;L;;;;;N;;;;; +11198;SHARADA LETTER JA;Lo;0;L;;;;;N;;;;; +11199;SHARADA LETTER JHA;Lo;0;L;;;;;N;;;;; +1119A;SHARADA LETTER NYA;Lo;0;L;;;;;N;;;;; +1119B;SHARADA LETTER TTA;Lo;0;L;;;;;N;;;;; +1119C;SHARADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1119D;SHARADA LETTER DDA;Lo;0;L;;;;;N;;;;; +1119E;SHARADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1119F;SHARADA LETTER NNA;Lo;0;L;;;;;N;;;;; +111A0;SHARADA LETTER TA;Lo;0;L;;;;;N;;;;; +111A1;SHARADA LETTER THA;Lo;0;L;;;;;N;;;;; +111A2;SHARADA LETTER DA;Lo;0;L;;;;;N;;;;; +111A3;SHARADA LETTER DHA;Lo;0;L;;;;;N;;;;; +111A4;SHARADA LETTER NA;Lo;0;L;;;;;N;;;;; +111A5;SHARADA LETTER PA;Lo;0;L;;;;;N;;;;; +111A6;SHARADA LETTER PHA;Lo;0;L;;;;;N;;;;; +111A7;SHARADA LETTER BA;Lo;0;L;;;;;N;;;;; +111A8;SHARADA LETTER BHA;Lo;0;L;;;;;N;;;;; +111A9;SHARADA LETTER MA;Lo;0;L;;;;;N;;;;; +111AA;SHARADA LETTER YA;Lo;0;L;;;;;N;;;;; +111AB;SHARADA LETTER RA;Lo;0;L;;;;;N;;;;; +111AC;SHARADA LETTER LA;Lo;0;L;;;;;N;;;;; +111AD;SHARADA LETTER LLA;Lo;0;L;;;;;N;;;;; +111AE;SHARADA LETTER VA;Lo;0;L;;;;;N;;;;; +111AF;SHARADA LETTER SHA;Lo;0;L;;;;;N;;;;; +111B0;SHARADA LETTER SSA;Lo;0;L;;;;;N;;;;; +111B1;SHARADA LETTER SA;Lo;0;L;;;;;N;;;;; +111B2;SHARADA LETTER HA;Lo;0;L;;;;;N;;;;; +111B3;SHARADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +111B4;SHARADA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +111B5;SHARADA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +111B6;SHARADA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +111B7;SHARADA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +111B8;SHARADA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +111B9;SHARADA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +111BA;SHARADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +111BB;SHARADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +111BC;SHARADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +111BD;SHARADA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +111BE;SHARADA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +111BF;SHARADA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +111C0;SHARADA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +111C1;SHARADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +111C2;SHARADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +111C3;SHARADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +111C4;SHARADA OM;Lo;0;L;;;;;N;;;;; +111C5;SHARADA DANDA;Po;0;L;;;;;N;;;;; +111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; +111C9;SHARADA SANDHI MARK;Mn;0;NSM;;;;;N;;;;; +111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;; +111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;; +111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;; +111CE;SHARADA VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +111CF;SHARADA SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +111D2;SHARADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +111D3;SHARADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +111D4;SHARADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +111D5;SHARADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +111D6;SHARADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +111D7;SHARADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; +111DB;SHARADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +111DC;SHARADA HEADSTROKE;Lo;0;L;;;;;N;;;;; +111DD;SHARADA CONTINUATION SIGN;Po;0;L;;;;;N;;;;; +111DE;SHARADA SECTION MARK-1;Po;0;L;;;;;N;;;;; +111DF;SHARADA SECTION MARK-2;Po;0;L;;;;;N;;;;; +111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; +111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; +111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; +111E4;SINHALA ARCHAIC DIGIT FOUR;No;0;L;;;;4;N;;;;; +111E5;SINHALA ARCHAIC DIGIT FIVE;No;0;L;;;;5;N;;;;; +111E6;SINHALA ARCHAIC DIGIT SIX;No;0;L;;;;6;N;;;;; +111E7;SINHALA ARCHAIC DIGIT SEVEN;No;0;L;;;;7;N;;;;; +111E8;SINHALA ARCHAIC DIGIT EIGHT;No;0;L;;;;8;N;;;;; +111E9;SINHALA ARCHAIC DIGIT NINE;No;0;L;;;;9;N;;;;; +111EA;SINHALA ARCHAIC NUMBER TEN;No;0;L;;;;10;N;;;;; +111EB;SINHALA ARCHAIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +111EC;SINHALA ARCHAIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +111ED;SINHALA ARCHAIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +111EE;SINHALA ARCHAIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +111EF;SINHALA ARCHAIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +111F0;SINHALA ARCHAIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +111F1;SINHALA ARCHAIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +111F2;SINHALA ARCHAIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +111F3;SINHALA ARCHAIC NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +111F4;SINHALA ARCHAIC NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +11200;KHOJKI LETTER A;Lo;0;L;;;;;N;;;;; +11201;KHOJKI LETTER AA;Lo;0;L;;;;;N;;;;; +11202;KHOJKI LETTER I;Lo;0;L;;;;;N;;;;; +11203;KHOJKI LETTER U;Lo;0;L;;;;;N;;;;; +11204;KHOJKI LETTER E;Lo;0;L;;;;;N;;;;; +11205;KHOJKI LETTER AI;Lo;0;L;;;;;N;;;;; +11206;KHOJKI LETTER O;Lo;0;L;;;;;N;;;;; +11207;KHOJKI LETTER AU;Lo;0;L;;;;;N;;;;; +11208;KHOJKI LETTER KA;Lo;0;L;;;;;N;;;;; +11209;KHOJKI LETTER KHA;Lo;0;L;;;;;N;;;;; +1120A;KHOJKI LETTER GA;Lo;0;L;;;;;N;;;;; +1120B;KHOJKI LETTER GGA;Lo;0;L;;;;;N;;;;; +1120C;KHOJKI LETTER GHA;Lo;0;L;;;;;N;;;;; +1120D;KHOJKI LETTER NGA;Lo;0;L;;;;;N;;;;; +1120E;KHOJKI LETTER CA;Lo;0;L;;;;;N;;;;; +1120F;KHOJKI LETTER CHA;Lo;0;L;;;;;N;;;;; +11210;KHOJKI LETTER JA;Lo;0;L;;;;;N;;;;; +11211;KHOJKI LETTER JJA;Lo;0;L;;;;;N;;;;; +11213;KHOJKI LETTER NYA;Lo;0;L;;;;;N;;;;; +11214;KHOJKI LETTER TTA;Lo;0;L;;;;;N;;;;; +11215;KHOJKI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11216;KHOJKI LETTER DDA;Lo;0;L;;;;;N;;;;; +11217;KHOJKI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11218;KHOJKI LETTER NNA;Lo;0;L;;;;;N;;;;; +11219;KHOJKI LETTER TA;Lo;0;L;;;;;N;;;;; +1121A;KHOJKI LETTER THA;Lo;0;L;;;;;N;;;;; +1121B;KHOJKI LETTER DA;Lo;0;L;;;;;N;;;;; +1121C;KHOJKI LETTER DDDA;Lo;0;L;;;;;N;;;;; +1121D;KHOJKI LETTER DHA;Lo;0;L;;;;;N;;;;; +1121E;KHOJKI LETTER NA;Lo;0;L;;;;;N;;;;; +1121F;KHOJKI LETTER PA;Lo;0;L;;;;;N;;;;; +11220;KHOJKI LETTER PHA;Lo;0;L;;;;;N;;;;; +11221;KHOJKI LETTER BA;Lo;0;L;;;;;N;;;;; +11222;KHOJKI LETTER BBA;Lo;0;L;;;;;N;;;;; +11223;KHOJKI LETTER BHA;Lo;0;L;;;;;N;;;;; +11224;KHOJKI LETTER MA;Lo;0;L;;;;;N;;;;; +11225;KHOJKI LETTER YA;Lo;0;L;;;;;N;;;;; +11226;KHOJKI LETTER RA;Lo;0;L;;;;;N;;;;; +11227;KHOJKI LETTER LA;Lo;0;L;;;;;N;;;;; +11228;KHOJKI LETTER VA;Lo;0;L;;;;;N;;;;; +11229;KHOJKI LETTER SA;Lo;0;L;;;;;N;;;;; +1122A;KHOJKI LETTER HA;Lo;0;L;;;;;N;;;;; +1122B;KHOJKI LETTER LLA;Lo;0;L;;;;;N;;;;; +1122C;KHOJKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1122D;KHOJKI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1122E;KHOJKI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +1122F;KHOJKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11230;KHOJKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11231;KHOJKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11232;KHOJKI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11233;KHOJKI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11234;KHOJKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11235;KHOJKI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11236;KHOJKI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11237;KHOJKI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +11238;KHOJKI DANDA;Po;0;L;;;;;N;;;;; +11239;KHOJKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +1123A;KHOJKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; +1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; +1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +1123E;KHOJKI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;; +1123F;KHOJKI LETTER QA;Lo;0;L;;;;;N;;;;; +11240;KHOJKI LETTER SHORT I;Lo;0;L;;;;;N;;;;; +11241;KHOJKI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;; +11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;; +11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;; +11283;MULTANI LETTER E;Lo;0;L;;;;;N;;;;; +11284;MULTANI LETTER KA;Lo;0;L;;;;;N;;;;; +11285;MULTANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11286;MULTANI LETTER GA;Lo;0;L;;;;;N;;;;; +11288;MULTANI LETTER GHA;Lo;0;L;;;;;N;;;;; +1128A;MULTANI LETTER CA;Lo;0;L;;;;;N;;;;; +1128B;MULTANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1128C;MULTANI LETTER JA;Lo;0;L;;;;;N;;;;; +1128D;MULTANI LETTER JJA;Lo;0;L;;;;;N;;;;; +1128F;MULTANI LETTER NYA;Lo;0;L;;;;;N;;;;; +11290;MULTANI LETTER TTA;Lo;0;L;;;;;N;;;;; +11291;MULTANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11292;MULTANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11293;MULTANI LETTER DDDA;Lo;0;L;;;;;N;;;;; +11294;MULTANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11295;MULTANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11296;MULTANI LETTER TA;Lo;0;L;;;;;N;;;;; +11297;MULTANI LETTER THA;Lo;0;L;;;;;N;;;;; +11298;MULTANI LETTER DA;Lo;0;L;;;;;N;;;;; +11299;MULTANI LETTER DHA;Lo;0;L;;;;;N;;;;; +1129A;MULTANI LETTER NA;Lo;0;L;;;;;N;;;;; +1129B;MULTANI LETTER PA;Lo;0;L;;;;;N;;;;; +1129C;MULTANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1129D;MULTANI LETTER BA;Lo;0;L;;;;;N;;;;; +1129F;MULTANI LETTER BHA;Lo;0;L;;;;;N;;;;; +112A0;MULTANI LETTER MA;Lo;0;L;;;;;N;;;;; +112A1;MULTANI LETTER YA;Lo;0;L;;;;;N;;;;; +112A2;MULTANI LETTER RA;Lo;0;L;;;;;N;;;;; +112A3;MULTANI LETTER LA;Lo;0;L;;;;;N;;;;; +112A4;MULTANI LETTER VA;Lo;0;L;;;;;N;;;;; +112A5;MULTANI LETTER SA;Lo;0;L;;;;;N;;;;; +112A6;MULTANI LETTER HA;Lo;0;L;;;;;N;;;;; +112A7;MULTANI LETTER RRA;Lo;0;L;;;;;N;;;;; +112A8;MULTANI LETTER RHA;Lo;0;L;;;;;N;;;;; +112A9;MULTANI SECTION MARK;Po;0;L;;;;;N;;;;; +112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; +112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; +112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; +112B3;KHUDAWADI LETTER II;Lo;0;L;;;;;N;;;;; +112B4;KHUDAWADI LETTER U;Lo;0;L;;;;;N;;;;; +112B5;KHUDAWADI LETTER UU;Lo;0;L;;;;;N;;;;; +112B6;KHUDAWADI LETTER E;Lo;0;L;;;;;N;;;;; +112B7;KHUDAWADI LETTER AI;Lo;0;L;;;;;N;;;;; +112B8;KHUDAWADI LETTER O;Lo;0;L;;;;;N;;;;; +112B9;KHUDAWADI LETTER AU;Lo;0;L;;;;;N;;;;; +112BA;KHUDAWADI LETTER KA;Lo;0;L;;;;;N;;;;; +112BB;KHUDAWADI LETTER KHA;Lo;0;L;;;;;N;;;;; +112BC;KHUDAWADI LETTER GA;Lo;0;L;;;;;N;;;;; +112BD;KHUDAWADI LETTER GGA;Lo;0;L;;;;;N;;;;; +112BE;KHUDAWADI LETTER GHA;Lo;0;L;;;;;N;;;;; +112BF;KHUDAWADI LETTER NGA;Lo;0;L;;;;;N;;;;; +112C0;KHUDAWADI LETTER CA;Lo;0;L;;;;;N;;;;; +112C1;KHUDAWADI LETTER CHA;Lo;0;L;;;;;N;;;;; +112C2;KHUDAWADI LETTER JA;Lo;0;L;;;;;N;;;;; +112C3;KHUDAWADI LETTER JJA;Lo;0;L;;;;;N;;;;; +112C4;KHUDAWADI LETTER JHA;Lo;0;L;;;;;N;;;;; +112C5;KHUDAWADI LETTER NYA;Lo;0;L;;;;;N;;;;; +112C6;KHUDAWADI LETTER TTA;Lo;0;L;;;;;N;;;;; +112C7;KHUDAWADI LETTER TTHA;Lo;0;L;;;;;N;;;;; +112C8;KHUDAWADI LETTER DDA;Lo;0;L;;;;;N;;;;; +112C9;KHUDAWADI LETTER DDDA;Lo;0;L;;;;;N;;;;; +112CA;KHUDAWADI LETTER RRA;Lo;0;L;;;;;N;;;;; +112CB;KHUDAWADI LETTER DDHA;Lo;0;L;;;;;N;;;;; +112CC;KHUDAWADI LETTER NNA;Lo;0;L;;;;;N;;;;; +112CD;KHUDAWADI LETTER TA;Lo;0;L;;;;;N;;;;; +112CE;KHUDAWADI LETTER THA;Lo;0;L;;;;;N;;;;; +112CF;KHUDAWADI LETTER DA;Lo;0;L;;;;;N;;;;; +112D0;KHUDAWADI LETTER DHA;Lo;0;L;;;;;N;;;;; +112D1;KHUDAWADI LETTER NA;Lo;0;L;;;;;N;;;;; +112D2;KHUDAWADI LETTER PA;Lo;0;L;;;;;N;;;;; +112D3;KHUDAWADI LETTER PHA;Lo;0;L;;;;;N;;;;; +112D4;KHUDAWADI LETTER BA;Lo;0;L;;;;;N;;;;; +112D5;KHUDAWADI LETTER BBA;Lo;0;L;;;;;N;;;;; +112D6;KHUDAWADI LETTER BHA;Lo;0;L;;;;;N;;;;; +112D7;KHUDAWADI LETTER MA;Lo;0;L;;;;;N;;;;; +112D8;KHUDAWADI LETTER YA;Lo;0;L;;;;;N;;;;; +112D9;KHUDAWADI LETTER RA;Lo;0;L;;;;;N;;;;; +112DA;KHUDAWADI LETTER LA;Lo;0;L;;;;;N;;;;; +112DB;KHUDAWADI LETTER VA;Lo;0;L;;;;;N;;;;; +112DC;KHUDAWADI LETTER SHA;Lo;0;L;;;;;N;;;;; +112DD;KHUDAWADI LETTER SA;Lo;0;L;;;;;N;;;;; +112DE;KHUDAWADI LETTER HA;Lo;0;L;;;;;N;;;;; +112DF;KHUDAWADI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +112E0;KHUDAWADI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +112E1;KHUDAWADI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +112E2;KHUDAWADI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +112E3;KHUDAWADI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +112E4;KHUDAWADI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +112E5;KHUDAWADI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +112E6;KHUDAWADI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +112E7;KHUDAWADI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +112E8;KHUDAWADI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +112E9;KHUDAWADI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +112EA;KHUDAWADI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +112F0;KHUDAWADI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +112F1;KHUDAWADI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +112F2;KHUDAWADI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +112F3;KHUDAWADI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +112F4;KHUDAWADI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +112F5;KHUDAWADI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +112F6;KHUDAWADI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11300;GRANTHA SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11305;GRANTHA LETTER A;Lo;0;L;;;;;N;;;;; +11306;GRANTHA LETTER AA;Lo;0;L;;;;;N;;;;; +11307;GRANTHA LETTER I;Lo;0;L;;;;;N;;;;; +11308;GRANTHA LETTER II;Lo;0;L;;;;;N;;;;; +11309;GRANTHA LETTER U;Lo;0;L;;;;;N;;;;; +1130A;GRANTHA LETTER UU;Lo;0;L;;;;;N;;;;; +1130B;GRANTHA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1130C;GRANTHA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1130F;GRANTHA LETTER EE;Lo;0;L;;;;;N;;;;; +11310;GRANTHA LETTER AI;Lo;0;L;;;;;N;;;;; +11313;GRANTHA LETTER OO;Lo;0;L;;;;;N;;;;; +11314;GRANTHA LETTER AU;Lo;0;L;;;;;N;;;;; +11315;GRANTHA LETTER KA;Lo;0;L;;;;;N;;;;; +11316;GRANTHA LETTER KHA;Lo;0;L;;;;;N;;;;; +11317;GRANTHA LETTER GA;Lo;0;L;;;;;N;;;;; +11318;GRANTHA LETTER GHA;Lo;0;L;;;;;N;;;;; +11319;GRANTHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1131A;GRANTHA LETTER CA;Lo;0;L;;;;;N;;;;; +1131B;GRANTHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1131C;GRANTHA LETTER JA;Lo;0;L;;;;;N;;;;; +1131D;GRANTHA LETTER JHA;Lo;0;L;;;;;N;;;;; +1131E;GRANTHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1131F;GRANTHA LETTER TTA;Lo;0;L;;;;;N;;;;; +11320;GRANTHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +11321;GRANTHA LETTER DDA;Lo;0;L;;;;;N;;;;; +11322;GRANTHA LETTER DDHA;Lo;0;L;;;;;N;;;;; +11323;GRANTHA LETTER NNA;Lo;0;L;;;;;N;;;;; +11324;GRANTHA LETTER TA;Lo;0;L;;;;;N;;;;; +11325;GRANTHA LETTER THA;Lo;0;L;;;;;N;;;;; +11326;GRANTHA LETTER DA;Lo;0;L;;;;;N;;;;; +11327;GRANTHA LETTER DHA;Lo;0;L;;;;;N;;;;; +11328;GRANTHA LETTER NA;Lo;0;L;;;;;N;;;;; +1132A;GRANTHA LETTER PA;Lo;0;L;;;;;N;;;;; +1132B;GRANTHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1132C;GRANTHA LETTER BA;Lo;0;L;;;;;N;;;;; +1132D;GRANTHA LETTER BHA;Lo;0;L;;;;;N;;;;; +1132E;GRANTHA LETTER MA;Lo;0;L;;;;;N;;;;; +1132F;GRANTHA LETTER YA;Lo;0;L;;;;;N;;;;; +11330;GRANTHA LETTER RA;Lo;0;L;;;;;N;;;;; +11332;GRANTHA LETTER LA;Lo;0;L;;;;;N;;;;; +11333;GRANTHA LETTER LLA;Lo;0;L;;;;;N;;;;; +11335;GRANTHA LETTER VA;Lo;0;L;;;;;N;;;;; +11336;GRANTHA LETTER SHA;Lo;0;L;;;;;N;;;;; +11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;; +11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;; +11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;; +1133B;COMBINING BINDU BELOW;Mn;7;NSM;;;;;N;;;;; +1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1133F;GRANTHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11340;GRANTHA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11341;GRANTHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11342;GRANTHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11343;GRANTHA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +11344;GRANTHA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +11347;GRANTHA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +11348;GRANTHA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; +1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; +1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11350;GRANTHA OM;Lo;0;L;;;;;N;;;;; +11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; +1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +1135F;GRANTHA LETTER VEDIC DOUBLE ANUSVARA;Lo;0;L;;;;;N;;;;; +11360;GRANTHA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11361;GRANTHA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +11362;GRANTHA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +11363;GRANTHA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +11366;COMBINING GRANTHA DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +11367;COMBINING GRANTHA DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +11368;COMBINING GRANTHA DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +11369;COMBINING GRANTHA DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +1136A;COMBINING GRANTHA DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +1136B;COMBINING GRANTHA DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +1136C;COMBINING GRANTHA DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +11370;COMBINING GRANTHA LETTER A;Mn;230;NSM;;;;;N;;;;; +11371;COMBINING GRANTHA LETTER KA;Mn;230;NSM;;;;;N;;;;; +11372;COMBINING GRANTHA LETTER NA;Mn;230;NSM;;;;;N;;;;; +11373;COMBINING GRANTHA LETTER VI;Mn;230;NSM;;;;;N;;;;; +11374;COMBINING GRANTHA LETTER PA;Mn;230;NSM;;;;;N;;;;; +11380;TULU-TIGALARI LETTER A;Lo;0;L;;;;;N;;;;; +11381;TULU-TIGALARI LETTER AA;Lo;0;L;;;;;N;;;;; +11382;TULU-TIGALARI LETTER I;Lo;0;L;;;;;N;;;;; +11383;TULU-TIGALARI LETTER II;Lo;0;L;11382 113C9;;;;N;;;;; +11384;TULU-TIGALARI LETTER U;Lo;0;L;;;;;N;;;;; +11385;TULU-TIGALARI LETTER UU;Lo;0;L;11384 113BB;;;;N;;;;; +11386;TULU-TIGALARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11387;TULU-TIGALARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11388;TULU-TIGALARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11389;TULU-TIGALARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1138B;TULU-TIGALARI LETTER EE;Lo;0;L;;;;;N;;;;; +1138E;TULU-TIGALARI LETTER AI;Lo;0;L;1138B 113C2;;;;N;;;;; +11390;TULU-TIGALARI LETTER OO;Lo;0;L;;;;;N;;;;; +11391;TULU-TIGALARI LETTER AU;Lo;0;L;11390 113C9;;;;N;;;;; +11392;TULU-TIGALARI LETTER KA;Lo;0;L;;;;;N;;;;; +11393;TULU-TIGALARI LETTER KHA;Lo;0;L;;;;;N;;;;; +11394;TULU-TIGALARI LETTER GA;Lo;0;L;;;;;N;;;;; +11395;TULU-TIGALARI LETTER GHA;Lo;0;L;;;;;N;;;;; +11396;TULU-TIGALARI LETTER NGA;Lo;0;L;;;;;N;;;;; +11397;TULU-TIGALARI LETTER CA;Lo;0;L;;;;;N;;;;; +11398;TULU-TIGALARI LETTER CHA;Lo;0;L;;;;;N;;;;; +11399;TULU-TIGALARI LETTER JA;Lo;0;L;;;;;N;;;;; +1139A;TULU-TIGALARI LETTER JHA;Lo;0;L;;;;;N;;;;; +1139B;TULU-TIGALARI LETTER NYA;Lo;0;L;;;;;N;;;;; +1139C;TULU-TIGALARI LETTER TTA;Lo;0;L;;;;;N;;;;; +1139D;TULU-TIGALARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1139E;TULU-TIGALARI LETTER DDA;Lo;0;L;;;;;N;;;;; +1139F;TULU-TIGALARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +113A0;TULU-TIGALARI LETTER NNA;Lo;0;L;;;;;N;;;;; +113A1;TULU-TIGALARI LETTER TA;Lo;0;L;;;;;N;;;;; +113A2;TULU-TIGALARI LETTER THA;Lo;0;L;;;;;N;;;;; +113A3;TULU-TIGALARI LETTER DA;Lo;0;L;;;;;N;;;;; +113A4;TULU-TIGALARI LETTER DHA;Lo;0;L;;;;;N;;;;; +113A5;TULU-TIGALARI LETTER NA;Lo;0;L;;;;;N;;;;; +113A6;TULU-TIGALARI LETTER PA;Lo;0;L;;;;;N;;;;; +113A7;TULU-TIGALARI LETTER PHA;Lo;0;L;;;;;N;;;;; +113A8;TULU-TIGALARI LETTER BA;Lo;0;L;;;;;N;;;;; +113A9;TULU-TIGALARI LETTER BHA;Lo;0;L;;;;;N;;;;; +113AA;TULU-TIGALARI LETTER MA;Lo;0;L;;;;;N;;;;; +113AB;TULU-TIGALARI LETTER YA;Lo;0;L;;;;;N;;;;; +113AC;TULU-TIGALARI LETTER RA;Lo;0;L;;;;;N;;;;; +113AD;TULU-TIGALARI LETTER LA;Lo;0;L;;;;;N;;;;; +113AE;TULU-TIGALARI LETTER VA;Lo;0;L;;;;;N;;;;; +113AF;TULU-TIGALARI LETTER SHA;Lo;0;L;;;;;N;;;;; +113B0;TULU-TIGALARI LETTER SSA;Lo;0;L;;;;;N;;;;; +113B1;TULU-TIGALARI LETTER SA;Lo;0;L;;;;;N;;;;; +113B2;TULU-TIGALARI LETTER HA;Lo;0;L;;;;;N;;;;; +113B3;TULU-TIGALARI LETTER LLA;Lo;0;L;;;;;N;;;;; +113B4;TULU-TIGALARI LETTER RRA;Lo;0;L;;;;;N;;;;; +113B5;TULU-TIGALARI LETTER LLLA;Lo;0;L;;;;;N;;;;; +113B7;TULU-TIGALARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +113B8;TULU-TIGALARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +113B9;TULU-TIGALARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +113BA;TULU-TIGALARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +113BB;TULU-TIGALARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +113BC;TULU-TIGALARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +113BD;TULU-TIGALARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +113BE;TULU-TIGALARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +113BF;TULU-TIGALARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +113C0;TULU-TIGALARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +113C2;TULU-TIGALARI VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +113C5;TULU-TIGALARI VOWEL SIGN AI;Mc;0;L;113C2 113C2;;;;N;;;;; +113C7;TULU-TIGALARI VOWEL SIGN OO;Mc;0;L;113C2 113B8;;;;N;;;;; +113C8;TULU-TIGALARI VOWEL SIGN AU;Mc;0;L;113C2 113C9;;;;N;;;;; +113C9;TULU-TIGALARI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +113CA;TULU-TIGALARI SIGN CANDRA ANUNASIKA;Mc;0;L;;;;;N;;;;; +113CC;TULU-TIGALARI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +113CD;TULU-TIGALARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +113CE;TULU-TIGALARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +113CF;TULU-TIGALARI SIGN LOOPED VIRAMA;Mc;9;L;;;;;N;;;;; +113D0;TULU-TIGALARI CONJOINER;Mn;9;NSM;;;;;N;;;;; +113D1;TULU-TIGALARI REPHA;Lo;0;L;;;;;N;;;;; +113D2;TULU-TIGALARI GEMINATION MARK;Mn;0;NSM;;;;;N;;;;; +113D3;TULU-TIGALARI SIGN PLUTA;Lo;0;L;;;;;N;;;;; +113D4;TULU-TIGALARI DANDA;Po;0;L;;;;;N;;;;; +113D5;TULU-TIGALARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +113D7;TULU-TIGALARI SIGN OM PUSHPIKA;Po;0;L;;;;;N;;;;; +113D8;TULU-TIGALARI SIGN SHRII PUSHPIKA;Po;0;L;;;;;N;;;;; +113E1;TULU-TIGALARI VEDIC TONE SVARITA;Mn;0;NSM;;;;;N;;;;; +113E2;TULU-TIGALARI VEDIC TONE ANUDATTA;Mn;0;NSM;;;;;N;;;;; +11400;NEWA LETTER A;Lo;0;L;;;;;N;;;;; +11401;NEWA LETTER AA;Lo;0;L;;;;;N;;;;; +11402;NEWA LETTER I;Lo;0;L;;;;;N;;;;; +11403;NEWA LETTER II;Lo;0;L;;;;;N;;;;; +11404;NEWA LETTER U;Lo;0;L;;;;;N;;;;; +11405;NEWA LETTER UU;Lo;0;L;;;;;N;;;;; +11406;NEWA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11407;NEWA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11408;NEWA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11409;NEWA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1140A;NEWA LETTER E;Lo;0;L;;;;;N;;;;; +1140B;NEWA LETTER AI;Lo;0;L;;;;;N;;;;; +1140C;NEWA LETTER O;Lo;0;L;;;;;N;;;;; +1140D;NEWA LETTER AU;Lo;0;L;;;;;N;;;;; +1140E;NEWA LETTER KA;Lo;0;L;;;;;N;;;;; +1140F;NEWA LETTER KHA;Lo;0;L;;;;;N;;;;; +11410;NEWA LETTER GA;Lo;0;L;;;;;N;;;;; +11411;NEWA LETTER GHA;Lo;0;L;;;;;N;;;;; +11412;NEWA LETTER NGA;Lo;0;L;;;;;N;;;;; +11413;NEWA LETTER NGHA;Lo;0;L;;;;;N;;;;; +11414;NEWA LETTER CA;Lo;0;L;;;;;N;;;;; +11415;NEWA LETTER CHA;Lo;0;L;;;;;N;;;;; +11416;NEWA LETTER JA;Lo;0;L;;;;;N;;;;; +11417;NEWA LETTER JHA;Lo;0;L;;;;;N;;;;; +11418;NEWA LETTER NYA;Lo;0;L;;;;;N;;;;; +11419;NEWA LETTER NYHA;Lo;0;L;;;;;N;;;;; +1141A;NEWA LETTER TTA;Lo;0;L;;;;;N;;;;; +1141B;NEWA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1141C;NEWA LETTER DDA;Lo;0;L;;;;;N;;;;; +1141D;NEWA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1141E;NEWA LETTER NNA;Lo;0;L;;;;;N;;;;; +1141F;NEWA LETTER TA;Lo;0;L;;;;;N;;;;; +11420;NEWA LETTER THA;Lo;0;L;;;;;N;;;;; +11421;NEWA LETTER DA;Lo;0;L;;;;;N;;;;; +11422;NEWA LETTER DHA;Lo;0;L;;;;;N;;;;; +11423;NEWA LETTER NA;Lo;0;L;;;;;N;;;;; +11424;NEWA LETTER NHA;Lo;0;L;;;;;N;;;;; +11425;NEWA LETTER PA;Lo;0;L;;;;;N;;;;; +11426;NEWA LETTER PHA;Lo;0;L;;;;;N;;;;; +11427;NEWA LETTER BA;Lo;0;L;;;;;N;;;;; +11428;NEWA LETTER BHA;Lo;0;L;;;;;N;;;;; +11429;NEWA LETTER MA;Lo;0;L;;;;;N;;;;; +1142A;NEWA LETTER MHA;Lo;0;L;;;;;N;;;;; +1142B;NEWA LETTER YA;Lo;0;L;;;;;N;;;;; +1142C;NEWA LETTER RA;Lo;0;L;;;;;N;;;;; +1142D;NEWA LETTER RHA;Lo;0;L;;;;;N;;;;; +1142E;NEWA LETTER LA;Lo;0;L;;;;;N;;;;; +1142F;NEWA LETTER LHA;Lo;0;L;;;;;N;;;;; +11430;NEWA LETTER WA;Lo;0;L;;;;;N;;;;; +11431;NEWA LETTER SHA;Lo;0;L;;;;;N;;;;; +11432;NEWA LETTER SSA;Lo;0;L;;;;;N;;;;; +11433;NEWA LETTER SA;Lo;0;L;;;;;N;;;;; +11434;NEWA LETTER HA;Lo;0;L;;;;;N;;;;; +11435;NEWA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11436;NEWA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11437;NEWA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11438;NEWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11439;NEWA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1143A;NEWA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +1143B;NEWA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +1143C;NEWA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1143D;NEWA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +1143E;NEWA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1143F;NEWA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11440;NEWA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11441;NEWA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11442;NEWA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11443;NEWA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11444;NEWA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11445;NEWA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11446;NEWA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11447;NEWA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +11448;NEWA SIGN FINAL ANUSVARA;Lo;0;L;;;;;N;;;;; +11449;NEWA OM;Lo;0;L;;;;;N;;;;; +1144A;NEWA SIDDHI;Lo;0;L;;;;;N;;;;; +1144B;NEWA DANDA;Po;0;L;;;;;N;;;;; +1144C;NEWA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +1144D;NEWA COMMA;Po;0;L;;;;;N;;;;; +1144E;NEWA GAP FILLER;Po;0;L;;;;;N;;;;; +1144F;NEWA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11450;NEWA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11451;NEWA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11452;NEWA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11453;NEWA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11454;NEWA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11455;NEWA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11456;NEWA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11457;NEWA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11458;NEWA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11459;NEWA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1145A;NEWA DOUBLE COMMA;Po;0;L;;;;;N;;;;; +1145B;NEWA PLACEHOLDER MARK;Po;0;L;;;;;N;;;;; +1145D;NEWA INSERTION SIGN;Po;0;L;;;;;N;;;;; +1145E;NEWA SANDHI MARK;Mn;230;NSM;;;;;N;;;;; +1145F;NEWA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +11460;NEWA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11461;NEWA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;; +11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;; +11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;; +11483;TIRHUTA LETTER I;Lo;0;L;;;;;N;;;;; +11484;TIRHUTA LETTER II;Lo;0;L;;;;;N;;;;; +11485;TIRHUTA LETTER U;Lo;0;L;;;;;N;;;;; +11486;TIRHUTA LETTER UU;Lo;0;L;;;;;N;;;;; +11487;TIRHUTA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11488;TIRHUTA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11489;TIRHUTA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1148A;TIRHUTA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1148B;TIRHUTA LETTER E;Lo;0;L;;;;;N;;;;; +1148C;TIRHUTA LETTER AI;Lo;0;L;;;;;N;;;;; +1148D;TIRHUTA LETTER O;Lo;0;L;;;;;N;;;;; +1148E;TIRHUTA LETTER AU;Lo;0;L;;;;;N;;;;; +1148F;TIRHUTA LETTER KA;Lo;0;L;;;;;N;;;;; +11490;TIRHUTA LETTER KHA;Lo;0;L;;;;;N;;;;; +11491;TIRHUTA LETTER GA;Lo;0;L;;;;;N;;;;; +11492;TIRHUTA LETTER GHA;Lo;0;L;;;;;N;;;;; +11493;TIRHUTA LETTER NGA;Lo;0;L;;;;;N;;;;; +11494;TIRHUTA LETTER CA;Lo;0;L;;;;;N;;;;; +11495;TIRHUTA LETTER CHA;Lo;0;L;;;;;N;;;;; +11496;TIRHUTA LETTER JA;Lo;0;L;;;;;N;;;;; +11497;TIRHUTA LETTER JHA;Lo;0;L;;;;;N;;;;; +11498;TIRHUTA LETTER NYA;Lo;0;L;;;;;N;;;;; +11499;TIRHUTA LETTER TTA;Lo;0;L;;;;;N;;;;; +1149A;TIRHUTA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1149B;TIRHUTA LETTER DDA;Lo;0;L;;;;;N;;;;; +1149C;TIRHUTA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1149D;TIRHUTA LETTER NNA;Lo;0;L;;;;;N;;;;; +1149E;TIRHUTA LETTER TA;Lo;0;L;;;;;N;;;;; +1149F;TIRHUTA LETTER THA;Lo;0;L;;;;;N;;;;; +114A0;TIRHUTA LETTER DA;Lo;0;L;;;;;N;;;;; +114A1;TIRHUTA LETTER DHA;Lo;0;L;;;;;N;;;;; +114A2;TIRHUTA LETTER NA;Lo;0;L;;;;;N;;;;; +114A3;TIRHUTA LETTER PA;Lo;0;L;;;;;N;;;;; +114A4;TIRHUTA LETTER PHA;Lo;0;L;;;;;N;;;;; +114A5;TIRHUTA LETTER BA;Lo;0;L;;;;;N;;;;; +114A6;TIRHUTA LETTER BHA;Lo;0;L;;;;;N;;;;; +114A7;TIRHUTA LETTER MA;Lo;0;L;;;;;N;;;;; +114A8;TIRHUTA LETTER YA;Lo;0;L;;;;;N;;;;; +114A9;TIRHUTA LETTER RA;Lo;0;L;;;;;N;;;;; +114AA;TIRHUTA LETTER LA;Lo;0;L;;;;;N;;;;; +114AB;TIRHUTA LETTER VA;Lo;0;L;;;;;N;;;;; +114AC;TIRHUTA LETTER SHA;Lo;0;L;;;;;N;;;;; +114AD;TIRHUTA LETTER SSA;Lo;0;L;;;;;N;;;;; +114AE;TIRHUTA LETTER SA;Lo;0;L;;;;;N;;;;; +114AF;TIRHUTA LETTER HA;Lo;0;L;;;;;N;;;;; +114B0;TIRHUTA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +114B1;TIRHUTA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +114B2;TIRHUTA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +114B3;TIRHUTA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +114B4;TIRHUTA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +114B5;TIRHUTA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +114B6;TIRHUTA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +114B7;TIRHUTA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +114B8;TIRHUTA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +114B9;TIRHUTA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +114BA;TIRHUTA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +114BB;TIRHUTA VOWEL SIGN AI;Mc;0;L;114B9 114BA;;;;N;;;;; +114BC;TIRHUTA VOWEL SIGN O;Mc;0;L;114B9 114B0;;;;N;;;;; +114BD;TIRHUTA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +114BE;TIRHUTA VOWEL SIGN AU;Mc;0;L;114B9 114BD;;;;N;;;;; +114BF;TIRHUTA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +114C0;TIRHUTA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +114C1;TIRHUTA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +114C2;TIRHUTA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +114C3;TIRHUTA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +114C4;TIRHUTA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +114C5;TIRHUTA GVANG;Lo;0;L;;;;;N;;;;; +114C6;TIRHUTA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +114C7;TIRHUTA OM;Lo;0;L;;;;;N;;;;; +114D0;TIRHUTA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +114D1;TIRHUTA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +114D2;TIRHUTA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +114D3;TIRHUTA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +114D4;TIRHUTA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +114D5;TIRHUTA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +114D6;TIRHUTA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +114D7;TIRHUTA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +114D8;TIRHUTA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +114D9;TIRHUTA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11580;SIDDHAM LETTER A;Lo;0;L;;;;;N;;;;; +11581;SIDDHAM LETTER AA;Lo;0;L;;;;;N;;;;; +11582;SIDDHAM LETTER I;Lo;0;L;;;;;N;;;;; +11583;SIDDHAM LETTER II;Lo;0;L;;;;;N;;;;; +11584;SIDDHAM LETTER U;Lo;0;L;;;;;N;;;;; +11585;SIDDHAM LETTER UU;Lo;0;L;;;;;N;;;;; +11586;SIDDHAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11587;SIDDHAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11588;SIDDHAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11589;SIDDHAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1158A;SIDDHAM LETTER E;Lo;0;L;;;;;N;;;;; +1158B;SIDDHAM LETTER AI;Lo;0;L;;;;;N;;;;; +1158C;SIDDHAM LETTER O;Lo;0;L;;;;;N;;;;; +1158D;SIDDHAM LETTER AU;Lo;0;L;;;;;N;;;;; +1158E;SIDDHAM LETTER KA;Lo;0;L;;;;;N;;;;; +1158F;SIDDHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +11590;SIDDHAM LETTER GA;Lo;0;L;;;;;N;;;;; +11591;SIDDHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +11592;SIDDHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +11593;SIDDHAM LETTER CA;Lo;0;L;;;;;N;;;;; +11594;SIDDHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +11595;SIDDHAM LETTER JA;Lo;0;L;;;;;N;;;;; +11596;SIDDHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +11597;SIDDHAM LETTER NYA;Lo;0;L;;;;;N;;;;; +11598;SIDDHAM LETTER TTA;Lo;0;L;;;;;N;;;;; +11599;SIDDHAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +1159A;SIDDHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +1159B;SIDDHAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +1159C;SIDDHAM LETTER NNA;Lo;0;L;;;;;N;;;;; +1159D;SIDDHAM LETTER TA;Lo;0;L;;;;;N;;;;; +1159E;SIDDHAM LETTER THA;Lo;0;L;;;;;N;;;;; +1159F;SIDDHAM LETTER DA;Lo;0;L;;;;;N;;;;; +115A0;SIDDHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +115A1;SIDDHAM LETTER NA;Lo;0;L;;;;;N;;;;; +115A2;SIDDHAM LETTER PA;Lo;0;L;;;;;N;;;;; +115A3;SIDDHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +115A4;SIDDHAM LETTER BA;Lo;0;L;;;;;N;;;;; +115A5;SIDDHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +115A6;SIDDHAM LETTER MA;Lo;0;L;;;;;N;;;;; +115A7;SIDDHAM LETTER YA;Lo;0;L;;;;;N;;;;; +115A8;SIDDHAM LETTER RA;Lo;0;L;;;;;N;;;;; +115A9;SIDDHAM LETTER LA;Lo;0;L;;;;;N;;;;; +115AA;SIDDHAM LETTER VA;Lo;0;L;;;;;N;;;;; +115AB;SIDDHAM LETTER SHA;Lo;0;L;;;;;N;;;;; +115AC;SIDDHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +115AD;SIDDHAM LETTER SA;Lo;0;L;;;;;N;;;;; +115AE;SIDDHAM LETTER HA;Lo;0;L;;;;;N;;;;; +115AF;SIDDHAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +115B0;SIDDHAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +115B1;SIDDHAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +115B2;SIDDHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +115B3;SIDDHAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +115B4;SIDDHAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +115B5;SIDDHAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +115B8;SIDDHAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +115B9;SIDDHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +115BA;SIDDHAM VOWEL SIGN O;Mc;0;L;115B8 115AF;;;;N;;;;; +115BB;SIDDHAM VOWEL SIGN AU;Mc;0;L;115B9 115AF;;;;N;;;;; +115BC;SIDDHAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +115BD;SIDDHAM SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +115BE;SIDDHAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +115BF;SIDDHAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +115C0;SIDDHAM SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +115C1;SIDDHAM SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +115C2;SIDDHAM DANDA;Po;0;L;;;;;N;;;;; +115C3;SIDDHAM DOUBLE DANDA;Po;0;L;;;;;N;;;;; +115C4;SIDDHAM SEPARATOR DOT;Po;0;L;;;;;N;;;;; +115C5;SIDDHAM SEPARATOR BAR;Po;0;L;;;;;N;;;;; +115C6;SIDDHAM REPETITION MARK-1;Po;0;L;;;;;N;;;;; +115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; +115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; +115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; +115CA;SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS;Po;0;L;;;;;N;;;;; +115CB;SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CC;SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CD;SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CE;SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CF;SIDDHAM SECTION MARK DOUBLE RING;Po;0;L;;;;;N;;;;; +115D0;SIDDHAM SECTION MARK DOUBLE RING WITH RAYS;Po;0;L;;;;;N;;;;; +115D1;SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D2;SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D3;SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D4;SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D5;SIDDHAM SECTION MARK WITH CIRCLES AND RAYS;Po;0;L;;;;;N;;;;; +115D6;SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES;Po;0;L;;;;;N;;;;; +115D7;SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES;Po;0;L;;;;;N;;;;; +115D8;SIDDHAM LETTER THREE-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115D9;SIDDHAM LETTER TWO-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115DA;SIDDHAM LETTER TWO-CIRCLE ALTERNATE II;Lo;0;L;;;;;N;;;;; +115DB;SIDDHAM LETTER ALTERNATE U;Lo;0;L;;;;;N;;;;; +115DC;SIDDHAM VOWEL SIGN ALTERNATE U;Mn;0;NSM;;;;;N;;;;; +115DD;SIDDHAM VOWEL SIGN ALTERNATE UU;Mn;0;NSM;;;;;N;;;;; +11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; +11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; +11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; +11603;MODI LETTER II;Lo;0;L;;;;;N;;;;; +11604;MODI LETTER U;Lo;0;L;;;;;N;;;;; +11605;MODI LETTER UU;Lo;0;L;;;;;N;;;;; +11606;MODI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11607;MODI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11608;MODI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11609;MODI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1160A;MODI LETTER E;Lo;0;L;;;;;N;;;;; +1160B;MODI LETTER AI;Lo;0;L;;;;;N;;;;; +1160C;MODI LETTER O;Lo;0;L;;;;;N;;;;; +1160D;MODI LETTER AU;Lo;0;L;;;;;N;;;;; +1160E;MODI LETTER KA;Lo;0;L;;;;;N;;;;; +1160F;MODI LETTER KHA;Lo;0;L;;;;;N;;;;; +11610;MODI LETTER GA;Lo;0;L;;;;;N;;;;; +11611;MODI LETTER GHA;Lo;0;L;;;;;N;;;;; +11612;MODI LETTER NGA;Lo;0;L;;;;;N;;;;; +11613;MODI LETTER CA;Lo;0;L;;;;;N;;;;; +11614;MODI LETTER CHA;Lo;0;L;;;;;N;;;;; +11615;MODI LETTER JA;Lo;0;L;;;;;N;;;;; +11616;MODI LETTER JHA;Lo;0;L;;;;;N;;;;; +11617;MODI LETTER NYA;Lo;0;L;;;;;N;;;;; +11618;MODI LETTER TTA;Lo;0;L;;;;;N;;;;; +11619;MODI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1161A;MODI LETTER DDA;Lo;0;L;;;;;N;;;;; +1161B;MODI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1161C;MODI LETTER NNA;Lo;0;L;;;;;N;;;;; +1161D;MODI LETTER TA;Lo;0;L;;;;;N;;;;; +1161E;MODI LETTER THA;Lo;0;L;;;;;N;;;;; +1161F;MODI LETTER DA;Lo;0;L;;;;;N;;;;; +11620;MODI LETTER DHA;Lo;0;L;;;;;N;;;;; +11621;MODI LETTER NA;Lo;0;L;;;;;N;;;;; +11622;MODI LETTER PA;Lo;0;L;;;;;N;;;;; +11623;MODI LETTER PHA;Lo;0;L;;;;;N;;;;; +11624;MODI LETTER BA;Lo;0;L;;;;;N;;;;; +11625;MODI LETTER BHA;Lo;0;L;;;;;N;;;;; +11626;MODI LETTER MA;Lo;0;L;;;;;N;;;;; +11627;MODI LETTER YA;Lo;0;L;;;;;N;;;;; +11628;MODI LETTER RA;Lo;0;L;;;;;N;;;;; +11629;MODI LETTER LA;Lo;0;L;;;;;N;;;;; +1162A;MODI LETTER VA;Lo;0;L;;;;;N;;;;; +1162B;MODI LETTER SHA;Lo;0;L;;;;;N;;;;; +1162C;MODI LETTER SSA;Lo;0;L;;;;;N;;;;; +1162D;MODI LETTER SA;Lo;0;L;;;;;N;;;;; +1162E;MODI LETTER HA;Lo;0;L;;;;;N;;;;; +1162F;MODI LETTER LLA;Lo;0;L;;;;;N;;;;; +11630;MODI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11631;MODI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11632;MODI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11633;MODI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11634;MODI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11635;MODI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11636;MODI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11637;MODI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11638;MODI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11639;MODI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1163A;MODI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1163B;MODI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1163C;MODI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1163D;MODI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1163E;MODI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1163F;MODI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11640;MODI SIGN ARDHACANDRA;Mn;0;NSM;;;;;N;;;;; +11641;MODI DANDA;Po;0;L;;;;;N;;;;; +11642;MODI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11643;MODI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11644;MODI SIGN HUVA;Lo;0;L;;;;;N;;;;; +11650;MODI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11651;MODI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11652;MODI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11653;MODI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11654;MODI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11655;MODI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11656;MODI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11657;MODI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11658;MODI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11659;MODI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11660;MONGOLIAN BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11661;MONGOLIAN ROTATED BIRGA;Po;0;ON;;;;;N;;;;; +11662;MONGOLIAN DOUBLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11663;MONGOLIAN TRIPLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11664;MONGOLIAN BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11665;MONGOLIAN ROTATED BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11666;MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11667;MONGOLIAN INVERTED BIRGA;Po;0;ON;;;;;N;;;;; +11668;MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11669;MONGOLIAN SWIRL BIRGA;Po;0;ON;;;;;N;;;;; +1166A;MONGOLIAN SWIRL BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +1166B;MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +1166C;MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11680;TAKRI LETTER A;Lo;0;L;;;;;N;;;;; +11681;TAKRI LETTER AA;Lo;0;L;;;;;N;;;;; +11682;TAKRI LETTER I;Lo;0;L;;;;;N;;;;; +11683;TAKRI LETTER II;Lo;0;L;;;;;N;;;;; +11684;TAKRI LETTER U;Lo;0;L;;;;;N;;;;; +11685;TAKRI LETTER UU;Lo;0;L;;;;;N;;;;; +11686;TAKRI LETTER E;Lo;0;L;;;;;N;;;;; +11687;TAKRI LETTER AI;Lo;0;L;;;;;N;;;;; +11688;TAKRI LETTER O;Lo;0;L;;;;;N;;;;; +11689;TAKRI LETTER AU;Lo;0;L;;;;;N;;;;; +1168A;TAKRI LETTER KA;Lo;0;L;;;;;N;;;;; +1168B;TAKRI LETTER KHA;Lo;0;L;;;;;N;;;;; +1168C;TAKRI LETTER GA;Lo;0;L;;;;;N;;;;; +1168D;TAKRI LETTER GHA;Lo;0;L;;;;;N;;;;; +1168E;TAKRI LETTER NGA;Lo;0;L;;;;;N;;;;; +1168F;TAKRI LETTER CA;Lo;0;L;;;;;N;;;;; +11690;TAKRI LETTER CHA;Lo;0;L;;;;;N;;;;; +11691;TAKRI LETTER JA;Lo;0;L;;;;;N;;;;; +11692;TAKRI LETTER JHA;Lo;0;L;;;;;N;;;;; +11693;TAKRI LETTER NYA;Lo;0;L;;;;;N;;;;; +11694;TAKRI LETTER TTA;Lo;0;L;;;;;N;;;;; +11695;TAKRI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11696;TAKRI LETTER DDA;Lo;0;L;;;;;N;;;;; +11697;TAKRI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11698;TAKRI LETTER NNA;Lo;0;L;;;;;N;;;;; +11699;TAKRI LETTER TA;Lo;0;L;;;;;N;;;;; +1169A;TAKRI LETTER THA;Lo;0;L;;;;;N;;;;; +1169B;TAKRI LETTER DA;Lo;0;L;;;;;N;;;;; +1169C;TAKRI LETTER DHA;Lo;0;L;;;;;N;;;;; +1169D;TAKRI LETTER NA;Lo;0;L;;;;;N;;;;; +1169E;TAKRI LETTER PA;Lo;0;L;;;;;N;;;;; +1169F;TAKRI LETTER PHA;Lo;0;L;;;;;N;;;;; +116A0;TAKRI LETTER BA;Lo;0;L;;;;;N;;;;; +116A1;TAKRI LETTER BHA;Lo;0;L;;;;;N;;;;; +116A2;TAKRI LETTER MA;Lo;0;L;;;;;N;;;;; +116A3;TAKRI LETTER YA;Lo;0;L;;;;;N;;;;; +116A4;TAKRI LETTER RA;Lo;0;L;;;;;N;;;;; +116A5;TAKRI LETTER LA;Lo;0;L;;;;;N;;;;; +116A6;TAKRI LETTER VA;Lo;0;L;;;;;N;;;;; +116A7;TAKRI LETTER SHA;Lo;0;L;;;;;N;;;;; +116A8;TAKRI LETTER SA;Lo;0;L;;;;;N;;;;; +116A9;TAKRI LETTER HA;Lo;0;L;;;;;N;;;;; +116AA;TAKRI LETTER RRA;Lo;0;L;;;;;N;;;;; +116AB;TAKRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +116AC;TAKRI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +116AD;TAKRI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +116AE;TAKRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +116AF;TAKRI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +116B0;TAKRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +116B1;TAKRI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +116B2;TAKRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +116B3;TAKRI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +116B4;TAKRI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +116B8;TAKRI LETTER ARCHAIC KHA;Lo;0;L;;;;;N;;;;; +116B9;TAKRI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +116C3;TAKRI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +116C4;TAKRI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +116C5;TAKRI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +116C6;TAKRI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +116D0;MYANMAR PAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +116D1;MYANMAR PAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +116D2;MYANMAR PAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +116D3;MYANMAR PAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +116D4;MYANMAR PAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +116D5;MYANMAR PAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +116D6;MYANMAR PAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +116D7;MYANMAR PAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +116D8;MYANMAR PAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +116D9;MYANMAR PAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +116DA;MYANMAR EASTERN PWO KAREN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +116DB;MYANMAR EASTERN PWO KAREN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +116DC;MYANMAR EASTERN PWO KAREN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +116DD;MYANMAR EASTERN PWO KAREN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +116DE;MYANMAR EASTERN PWO KAREN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +116DF;MYANMAR EASTERN PWO KAREN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +116E0;MYANMAR EASTERN PWO KAREN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +116E1;MYANMAR EASTERN PWO KAREN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +116E2;MYANMAR EASTERN PWO KAREN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +116E3;MYANMAR EASTERN PWO KAREN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11700;AHOM LETTER KA;Lo;0;L;;;;;N;;;;; +11701;AHOM LETTER KHA;Lo;0;L;;;;;N;;;;; +11702;AHOM LETTER NGA;Lo;0;L;;;;;N;;;;; +11703;AHOM LETTER NA;Lo;0;L;;;;;N;;;;; +11704;AHOM LETTER TA;Lo;0;L;;;;;N;;;;; +11705;AHOM LETTER ALTERNATE TA;Lo;0;L;;;;;N;;;;; +11706;AHOM LETTER PA;Lo;0;L;;;;;N;;;;; +11707;AHOM LETTER PHA;Lo;0;L;;;;;N;;;;; +11708;AHOM LETTER BA;Lo;0;L;;;;;N;;;;; +11709;AHOM LETTER MA;Lo;0;L;;;;;N;;;;; +1170A;AHOM LETTER JA;Lo;0;L;;;;;N;;;;; +1170B;AHOM LETTER CHA;Lo;0;L;;;;;N;;;;; +1170C;AHOM LETTER THA;Lo;0;L;;;;;N;;;;; +1170D;AHOM LETTER RA;Lo;0;L;;;;;N;;;;; +1170E;AHOM LETTER LA;Lo;0;L;;;;;N;;;;; +1170F;AHOM LETTER SA;Lo;0;L;;;;;N;;;;; +11710;AHOM LETTER NYA;Lo;0;L;;;;;N;;;;; +11711;AHOM LETTER HA;Lo;0;L;;;;;N;;;;; +11712;AHOM LETTER A;Lo;0;L;;;;;N;;;;; +11713;AHOM LETTER DA;Lo;0;L;;;;;N;;;;; +11714;AHOM LETTER DHA;Lo;0;L;;;;;N;;;;; +11715;AHOM LETTER GA;Lo;0;L;;;;;N;;;;; +11716;AHOM LETTER ALTERNATE GA;Lo;0;L;;;;;N;;;;; +11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;; +11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;; +11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;; +1171A;AHOM LETTER ALTERNATE BA;Lo;0;L;;;;;N;;;;; +1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1171E;AHOM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;; +11720;AHOM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +11721;AHOM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11722;AHOM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11723;AHOM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11724;AHOM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11725;AHOM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11726;AHOM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11727;AHOM VOWEL SIGN AW;Mn;0;NSM;;;;;N;;;;; +11728;AHOM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11729;AHOM VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1172A;AHOM VOWEL SIGN AM;Mn;0;NSM;;;;;N;;;;; +1172B;AHOM SIGN KILLER;Mn;9;NSM;;;;;N;;;;; +11730;AHOM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11731;AHOM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11732;AHOM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11733;AHOM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11734;AHOM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11735;AHOM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11736;AHOM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11737;AHOM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11738;AHOM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11739;AHOM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1173A;AHOM NUMBER TEN;No;0;L;;;;10;N;;;;; +1173B;AHOM NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1173C;AHOM SIGN SMALL SECTION;Po;0;L;;;;;N;;;;; +1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;; +1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;; +1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;; +11740;AHOM LETTER CA;Lo;0;L;;;;;N;;;;; +11741;AHOM LETTER TTA;Lo;0;L;;;;;N;;;;; +11742;AHOM LETTER TTHA;Lo;0;L;;;;;N;;;;; +11743;AHOM LETTER DDA;Lo;0;L;;;;;N;;;;; +11744;AHOM LETTER DDHA;Lo;0;L;;;;;N;;;;; +11745;AHOM LETTER NNA;Lo;0;L;;;;;N;;;;; +11746;AHOM LETTER LLA;Lo;0;L;;;;;N;;;;; +11800;DOGRA LETTER A;Lo;0;L;;;;;N;;;;; +11801;DOGRA LETTER AA;Lo;0;L;;;;;N;;;;; +11802;DOGRA LETTER I;Lo;0;L;;;;;N;;;;; +11803;DOGRA LETTER II;Lo;0;L;;;;;N;;;;; +11804;DOGRA LETTER U;Lo;0;L;;;;;N;;;;; +11805;DOGRA LETTER UU;Lo;0;L;;;;;N;;;;; +11806;DOGRA LETTER E;Lo;0;L;;;;;N;;;;; +11807;DOGRA LETTER AI;Lo;0;L;;;;;N;;;;; +11808;DOGRA LETTER O;Lo;0;L;;;;;N;;;;; +11809;DOGRA LETTER AU;Lo;0;L;;;;;N;;;;; +1180A;DOGRA LETTER KA;Lo;0;L;;;;;N;;;;; +1180B;DOGRA LETTER KHA;Lo;0;L;;;;;N;;;;; +1180C;DOGRA LETTER GA;Lo;0;L;;;;;N;;;;; +1180D;DOGRA LETTER GHA;Lo;0;L;;;;;N;;;;; +1180E;DOGRA LETTER NGA;Lo;0;L;;;;;N;;;;; +1180F;DOGRA LETTER CA;Lo;0;L;;;;;N;;;;; +11810;DOGRA LETTER CHA;Lo;0;L;;;;;N;;;;; +11811;DOGRA LETTER JA;Lo;0;L;;;;;N;;;;; +11812;DOGRA LETTER JHA;Lo;0;L;;;;;N;;;;; +11813;DOGRA LETTER NYA;Lo;0;L;;;;;N;;;;; +11814;DOGRA LETTER TTA;Lo;0;L;;;;;N;;;;; +11815;DOGRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +11816;DOGRA LETTER DDA;Lo;0;L;;;;;N;;;;; +11817;DOGRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +11818;DOGRA LETTER NNA;Lo;0;L;;;;;N;;;;; +11819;DOGRA LETTER TA;Lo;0;L;;;;;N;;;;; +1181A;DOGRA LETTER THA;Lo;0;L;;;;;N;;;;; +1181B;DOGRA LETTER DA;Lo;0;L;;;;;N;;;;; +1181C;DOGRA LETTER DHA;Lo;0;L;;;;;N;;;;; +1181D;DOGRA LETTER NA;Lo;0;L;;;;;N;;;;; +1181E;DOGRA LETTER PA;Lo;0;L;;;;;N;;;;; +1181F;DOGRA LETTER PHA;Lo;0;L;;;;;N;;;;; +11820;DOGRA LETTER BA;Lo;0;L;;;;;N;;;;; +11821;DOGRA LETTER BHA;Lo;0;L;;;;;N;;;;; +11822;DOGRA LETTER MA;Lo;0;L;;;;;N;;;;; +11823;DOGRA LETTER YA;Lo;0;L;;;;;N;;;;; +11824;DOGRA LETTER RA;Lo;0;L;;;;;N;;;;; +11825;DOGRA LETTER LA;Lo;0;L;;;;;N;;;;; +11826;DOGRA LETTER VA;Lo;0;L;;;;;N;;;;; +11827;DOGRA LETTER SHA;Lo;0;L;;;;;N;;;;; +11828;DOGRA LETTER SSA;Lo;0;L;;;;;N;;;;; +11829;DOGRA LETTER SA;Lo;0;L;;;;;N;;;;; +1182A;DOGRA LETTER HA;Lo;0;L;;;;;N;;;;; +1182B;DOGRA LETTER RRA;Lo;0;L;;;;;N;;;;; +1182C;DOGRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1182D;DOGRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1182E;DOGRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +1182F;DOGRA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11830;DOGRA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11831;DOGRA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11832;DOGRA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11833;DOGRA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11834;DOGRA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11835;DOGRA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11836;DOGRA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11837;DOGRA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11838;DOGRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11839;DOGRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1183A;DOGRA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1183B;DOGRA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; +118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; +118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; +118A3;WARANG CITI CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;118C3; +118A4;WARANG CITI CAPITAL LETTER YA;Lu;0;L;;;;;N;;;;118C4; +118A5;WARANG CITI CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;118C5; +118A6;WARANG CITI CAPITAL LETTER II;Lu;0;L;;;;;N;;;;118C6; +118A7;WARANG CITI CAPITAL LETTER UU;Lu;0;L;;;;;N;;;;118C7; +118A8;WARANG CITI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;118C8; +118A9;WARANG CITI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;118C9; +118AA;WARANG CITI CAPITAL LETTER ANG;Lu;0;L;;;;;N;;;;118CA; +118AB;WARANG CITI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;118CB; +118AC;WARANG CITI CAPITAL LETTER KO;Lu;0;L;;;;;N;;;;118CC; +118AD;WARANG CITI CAPITAL LETTER ENY;Lu;0;L;;;;;N;;;;118CD; +118AE;WARANG CITI CAPITAL LETTER YUJ;Lu;0;L;;;;;N;;;;118CE; +118AF;WARANG CITI CAPITAL LETTER UC;Lu;0;L;;;;;N;;;;118CF; +118B0;WARANG CITI CAPITAL LETTER ENN;Lu;0;L;;;;;N;;;;118D0; +118B1;WARANG CITI CAPITAL LETTER ODD;Lu;0;L;;;;;N;;;;118D1; +118B2;WARANG CITI CAPITAL LETTER TTE;Lu;0;L;;;;;N;;;;118D2; +118B3;WARANG CITI CAPITAL LETTER NUNG;Lu;0;L;;;;;N;;;;118D3; +118B4;WARANG CITI CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;118D4; +118B5;WARANG CITI CAPITAL LETTER AT;Lu;0;L;;;;;N;;;;118D5; +118B6;WARANG CITI CAPITAL LETTER AM;Lu;0;L;;;;;N;;;;118D6; +118B7;WARANG CITI CAPITAL LETTER BU;Lu;0;L;;;;;N;;;;118D7; +118B8;WARANG CITI CAPITAL LETTER PU;Lu;0;L;;;;;N;;;;118D8; +118B9;WARANG CITI CAPITAL LETTER HIYO;Lu;0;L;;;;;N;;;;118D9; +118BA;WARANG CITI CAPITAL LETTER HOLO;Lu;0;L;;;;;N;;;;118DA; +118BB;WARANG CITI CAPITAL LETTER HORR;Lu;0;L;;;;;N;;;;118DB; +118BC;WARANG CITI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;118DC; +118BD;WARANG CITI CAPITAL LETTER SSUU;Lu;0;L;;;;;N;;;;118DD; +118BE;WARANG CITI CAPITAL LETTER SII;Lu;0;L;;;;;N;;;;118DE; +118BF;WARANG CITI CAPITAL LETTER VIYO;Lu;0;L;;;;;N;;;;118DF; +118C0;WARANG CITI SMALL LETTER NGAA;Ll;0;L;;;;;N;;;118A0;;118A0 +118C1;WARANG CITI SMALL LETTER A;Ll;0;L;;;;;N;;;118A1;;118A1 +118C2;WARANG CITI SMALL LETTER WI;Ll;0;L;;;;;N;;;118A2;;118A2 +118C3;WARANG CITI SMALL LETTER YU;Ll;0;L;;;;;N;;;118A3;;118A3 +118C4;WARANG CITI SMALL LETTER YA;Ll;0;L;;;;;N;;;118A4;;118A4 +118C5;WARANG CITI SMALL LETTER YO;Ll;0;L;;;;;N;;;118A5;;118A5 +118C6;WARANG CITI SMALL LETTER II;Ll;0;L;;;;;N;;;118A6;;118A6 +118C7;WARANG CITI SMALL LETTER UU;Ll;0;L;;;;;N;;;118A7;;118A7 +118C8;WARANG CITI SMALL LETTER E;Ll;0;L;;;;;N;;;118A8;;118A8 +118C9;WARANG CITI SMALL LETTER O;Ll;0;L;;;;;N;;;118A9;;118A9 +118CA;WARANG CITI SMALL LETTER ANG;Ll;0;L;;;;;N;;;118AA;;118AA +118CB;WARANG CITI SMALL LETTER GA;Ll;0;L;;;;;N;;;118AB;;118AB +118CC;WARANG CITI SMALL LETTER KO;Ll;0;L;;;;;N;;;118AC;;118AC +118CD;WARANG CITI SMALL LETTER ENY;Ll;0;L;;;;;N;;;118AD;;118AD +118CE;WARANG CITI SMALL LETTER YUJ;Ll;0;L;;;;;N;;;118AE;;118AE +118CF;WARANG CITI SMALL LETTER UC;Ll;0;L;;;;;N;;;118AF;;118AF +118D0;WARANG CITI SMALL LETTER ENN;Ll;0;L;;;;;N;;;118B0;;118B0 +118D1;WARANG CITI SMALL LETTER ODD;Ll;0;L;;;;;N;;;118B1;;118B1 +118D2;WARANG CITI SMALL LETTER TTE;Ll;0;L;;;;;N;;;118B2;;118B2 +118D3;WARANG CITI SMALL LETTER NUNG;Ll;0;L;;;;;N;;;118B3;;118B3 +118D4;WARANG CITI SMALL LETTER DA;Ll;0;L;;;;;N;;;118B4;;118B4 +118D5;WARANG CITI SMALL LETTER AT;Ll;0;L;;;;;N;;;118B5;;118B5 +118D6;WARANG CITI SMALL LETTER AM;Ll;0;L;;;;;N;;;118B6;;118B6 +118D7;WARANG CITI SMALL LETTER BU;Ll;0;L;;;;;N;;;118B7;;118B7 +118D8;WARANG CITI SMALL LETTER PU;Ll;0;L;;;;;N;;;118B8;;118B8 +118D9;WARANG CITI SMALL LETTER HIYO;Ll;0;L;;;;;N;;;118B9;;118B9 +118DA;WARANG CITI SMALL LETTER HOLO;Ll;0;L;;;;;N;;;118BA;;118BA +118DB;WARANG CITI SMALL LETTER HORR;Ll;0;L;;;;;N;;;118BB;;118BB +118DC;WARANG CITI SMALL LETTER HAR;Ll;0;L;;;;;N;;;118BC;;118BC +118DD;WARANG CITI SMALL LETTER SSUU;Ll;0;L;;;;;N;;;118BD;;118BD +118DE;WARANG CITI SMALL LETTER SII;Ll;0;L;;;;;N;;;118BE;;118BE +118DF;WARANG CITI SMALL LETTER VIYO;Ll;0;L;;;;;N;;;118BF;;118BF +118E0;WARANG CITI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +118E1;WARANG CITI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +118E2;WARANG CITI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +118E3;WARANG CITI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +118E4;WARANG CITI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +118E5;WARANG CITI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +118E6;WARANG CITI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +118E7;WARANG CITI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +118E8;WARANG CITI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +118E9;WARANG CITI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +118EA;WARANG CITI NUMBER TEN;No;0;L;;;;10;N;;;;; +118EB;WARANG CITI NUMBER TWENTY;No;0;L;;;;20;N;;;;; +118EC;WARANG CITI NUMBER THIRTY;No;0;L;;;;30;N;;;;; +118ED;WARANG CITI NUMBER FORTY;No;0;L;;;;40;N;;;;; +118EE;WARANG CITI NUMBER FIFTY;No;0;L;;;;50;N;;;;; +118EF;WARANG CITI NUMBER SIXTY;No;0;L;;;;60;N;;;;; +118F0;WARANG CITI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;; +118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;; +11900;DIVES AKURU LETTER A;Lo;0;L;;;;;N;;;;; +11901;DIVES AKURU LETTER AA;Lo;0;L;;;;;N;;;;; +11902;DIVES AKURU LETTER I;Lo;0;L;;;;;N;;;;; +11903;DIVES AKURU LETTER II;Lo;0;L;;;;;N;;;;; +11904;DIVES AKURU LETTER U;Lo;0;L;;;;;N;;;;; +11905;DIVES AKURU LETTER UU;Lo;0;L;;;;;N;;;;; +11906;DIVES AKURU LETTER E;Lo;0;L;;;;;N;;;;; +11909;DIVES AKURU LETTER O;Lo;0;L;;;;;N;;;;; +1190C;DIVES AKURU LETTER KA;Lo;0;L;;;;;N;;;;; +1190D;DIVES AKURU LETTER KHA;Lo;0;L;;;;;N;;;;; +1190E;DIVES AKURU LETTER GA;Lo;0;L;;;;;N;;;;; +1190F;DIVES AKURU LETTER GHA;Lo;0;L;;;;;N;;;;; +11910;DIVES AKURU LETTER NGA;Lo;0;L;;;;;N;;;;; +11911;DIVES AKURU LETTER CA;Lo;0;L;;;;;N;;;;; +11912;DIVES AKURU LETTER CHA;Lo;0;L;;;;;N;;;;; +11913;DIVES AKURU LETTER JA;Lo;0;L;;;;;N;;;;; +11915;DIVES AKURU LETTER NYA;Lo;0;L;;;;;N;;;;; +11916;DIVES AKURU LETTER TTA;Lo;0;L;;;;;N;;;;; +11918;DIVES AKURU LETTER DDA;Lo;0;L;;;;;N;;;;; +11919;DIVES AKURU LETTER DDHA;Lo;0;L;;;;;N;;;;; +1191A;DIVES AKURU LETTER NNA;Lo;0;L;;;;;N;;;;; +1191B;DIVES AKURU LETTER TA;Lo;0;L;;;;;N;;;;; +1191C;DIVES AKURU LETTER THA;Lo;0;L;;;;;N;;;;; +1191D;DIVES AKURU LETTER DA;Lo;0;L;;;;;N;;;;; +1191E;DIVES AKURU LETTER DHA;Lo;0;L;;;;;N;;;;; +1191F;DIVES AKURU LETTER NA;Lo;0;L;;;;;N;;;;; +11920;DIVES AKURU LETTER PA;Lo;0;L;;;;;N;;;;; +11921;DIVES AKURU LETTER PHA;Lo;0;L;;;;;N;;;;; +11922;DIVES AKURU LETTER BA;Lo;0;L;;;;;N;;;;; +11923;DIVES AKURU LETTER BHA;Lo;0;L;;;;;N;;;;; +11924;DIVES AKURU LETTER MA;Lo;0;L;;;;;N;;;;; +11925;DIVES AKURU LETTER YA;Lo;0;L;;;;;N;;;;; +11926;DIVES AKURU LETTER YYA;Lo;0;L;;;;;N;;;;; +11927;DIVES AKURU LETTER RA;Lo;0;L;;;;;N;;;;; +11928;DIVES AKURU LETTER LA;Lo;0;L;;;;;N;;;;; +11929;DIVES AKURU LETTER VA;Lo;0;L;;;;;N;;;;; +1192A;DIVES AKURU LETTER SHA;Lo;0;L;;;;;N;;;;; +1192B;DIVES AKURU LETTER SSA;Lo;0;L;;;;;N;;;;; +1192C;DIVES AKURU LETTER SA;Lo;0;L;;;;;N;;;;; +1192D;DIVES AKURU LETTER HA;Lo;0;L;;;;;N;;;;; +1192E;DIVES AKURU LETTER LLA;Lo;0;L;;;;;N;;;;; +1192F;DIVES AKURU LETTER ZA;Lo;0;L;;;;;N;;;;; +11930;DIVES AKURU VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11931;DIVES AKURU VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11932;DIVES AKURU VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11933;DIVES AKURU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11934;DIVES AKURU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11935;DIVES AKURU VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11937;DIVES AKURU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11938;DIVES AKURU VOWEL SIGN O;Mc;0;L;11935 11930;;;;N;;;;; +1193B;DIVES AKURU SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1193C;DIVES AKURU SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +1193D;DIVES AKURU SIGN HALANTA;Mc;9;L;;;;;N;;;;; +1193E;DIVES AKURU VIRAMA;Mn;9;NSM;;;;;N;;;;; +1193F;DIVES AKURU PREFIXED NASAL SIGN;Lo;0;L;;;;;N;;;;; +11940;DIVES AKURU MEDIAL YA;Mc;0;L;;;;;N;;;;; +11941;DIVES AKURU INITIAL RA;Lo;0;L;;;;;N;;;;; +11942;DIVES AKURU MEDIAL RA;Mc;0;L;;;;;N;;;;; +11943;DIVES AKURU SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11944;DIVES AKURU DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11945;DIVES AKURU GAP FILLER;Po;0;L;;;;;N;;;;; +11946;DIVES AKURU END OF TEXT MARK;Po;0;L;;;;;N;;;;; +11950;DIVES AKURU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11951;DIVES AKURU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11952;DIVES AKURU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11953;DIVES AKURU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11954;DIVES AKURU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11955;DIVES AKURU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11956;DIVES AKURU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11957;DIVES AKURU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11958;DIVES AKURU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11959;DIVES AKURU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +119A0;NANDINAGARI LETTER A;Lo;0;L;;;;;N;;;;; +119A1;NANDINAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +119A2;NANDINAGARI LETTER I;Lo;0;L;;;;;N;;;;; +119A3;NANDINAGARI LETTER II;Lo;0;L;;;;;N;;;;; +119A4;NANDINAGARI LETTER U;Lo;0;L;;;;;N;;;;; +119A5;NANDINAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +119A6;NANDINAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +119A7;NANDINAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +119AA;NANDINAGARI LETTER E;Lo;0;L;;;;;N;;;;; +119AB;NANDINAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +119AC;NANDINAGARI LETTER O;Lo;0;L;;;;;N;;;;; +119AD;NANDINAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +119AE;NANDINAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +119AF;NANDINAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +119B0;NANDINAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +119B1;NANDINAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +119B2;NANDINAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +119B3;NANDINAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +119B4;NANDINAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +119B5;NANDINAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +119B6;NANDINAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +119B7;NANDINAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +119B8;NANDINAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +119B9;NANDINAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +119BA;NANDINAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +119BB;NANDINAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +119BC;NANDINAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +119BD;NANDINAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +119BE;NANDINAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +119BF;NANDINAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +119C0;NANDINAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +119C1;NANDINAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +119C2;NANDINAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +119C3;NANDINAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +119C4;NANDINAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +119C5;NANDINAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +119C6;NANDINAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +119C7;NANDINAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +119C8;NANDINAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +119C9;NANDINAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +119CA;NANDINAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +119CB;NANDINAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +119CC;NANDINAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +119CD;NANDINAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +119CE;NANDINAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +119CF;NANDINAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +119D0;NANDINAGARI LETTER RRA;Lo;0;L;;;;;N;;;;; +119D1;NANDINAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +119D2;NANDINAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +119D3;NANDINAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +119D4;NANDINAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +119D5;NANDINAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +119D6;NANDINAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +119D7;NANDINAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +119DA;NANDINAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +119DB;NANDINAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +119DC;NANDINAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +119DD;NANDINAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +119DE;NANDINAGARI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +119DF;NANDINAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +119E0;NANDINAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +119E1;NANDINAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +119E2;NANDINAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +119E3;NANDINAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +119E4;NANDINAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +11A00;ZANABAZAR SQUARE LETTER A;Lo;0;L;;;;;N;;;;; +11A01;ZANABAZAR SQUARE VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11A02;ZANABAZAR SQUARE VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11A03;ZANABAZAR SQUARE VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11A04;ZANABAZAR SQUARE VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11A05;ZANABAZAR SQUARE VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11A06;ZANABAZAR SQUARE VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11A07;ZANABAZAR SQUARE VOWEL SIGN AI;Mn;0;L;;;;;N;;;;; +11A08;ZANABAZAR SQUARE VOWEL SIGN AU;Mn;0;L;;;;;N;;;;; +11A09;ZANABAZAR SQUARE VOWEL SIGN REVERSED I;Mn;0;NSM;;;;;N;;;;; +11A0A;ZANABAZAR SQUARE VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +11A0B;ZANABAZAR SQUARE LETTER KA;Lo;0;L;;;;;N;;;;; +11A0C;ZANABAZAR SQUARE LETTER KHA;Lo;0;L;;;;;N;;;;; +11A0D;ZANABAZAR SQUARE LETTER GA;Lo;0;L;;;;;N;;;;; +11A0E;ZANABAZAR SQUARE LETTER GHA;Lo;0;L;;;;;N;;;;; +11A0F;ZANABAZAR SQUARE LETTER NGA;Lo;0;L;;;;;N;;;;; +11A10;ZANABAZAR SQUARE LETTER CA;Lo;0;L;;;;;N;;;;; +11A11;ZANABAZAR SQUARE LETTER CHA;Lo;0;L;;;;;N;;;;; +11A12;ZANABAZAR SQUARE LETTER JA;Lo;0;L;;;;;N;;;;; +11A13;ZANABAZAR SQUARE LETTER NYA;Lo;0;L;;;;;N;;;;; +11A14;ZANABAZAR SQUARE LETTER TTA;Lo;0;L;;;;;N;;;;; +11A15;ZANABAZAR SQUARE LETTER TTHA;Lo;0;L;;;;;N;;;;; +11A16;ZANABAZAR SQUARE LETTER DDA;Lo;0;L;;;;;N;;;;; +11A17;ZANABAZAR SQUARE LETTER DDHA;Lo;0;L;;;;;N;;;;; +11A18;ZANABAZAR SQUARE LETTER NNA;Lo;0;L;;;;;N;;;;; +11A19;ZANABAZAR SQUARE LETTER TA;Lo;0;L;;;;;N;;;;; +11A1A;ZANABAZAR SQUARE LETTER THA;Lo;0;L;;;;;N;;;;; +11A1B;ZANABAZAR SQUARE LETTER DA;Lo;0;L;;;;;N;;;;; +11A1C;ZANABAZAR SQUARE LETTER DHA;Lo;0;L;;;;;N;;;;; +11A1D;ZANABAZAR SQUARE LETTER NA;Lo;0;L;;;;;N;;;;; +11A1E;ZANABAZAR SQUARE LETTER PA;Lo;0;L;;;;;N;;;;; +11A1F;ZANABAZAR SQUARE LETTER PHA;Lo;0;L;;;;;N;;;;; +11A20;ZANABAZAR SQUARE LETTER BA;Lo;0;L;;;;;N;;;;; +11A21;ZANABAZAR SQUARE LETTER BHA;Lo;0;L;;;;;N;;;;; +11A22;ZANABAZAR SQUARE LETTER MA;Lo;0;L;;;;;N;;;;; +11A23;ZANABAZAR SQUARE LETTER TSA;Lo;0;L;;;;;N;;;;; +11A24;ZANABAZAR SQUARE LETTER TSHA;Lo;0;L;;;;;N;;;;; +11A25;ZANABAZAR SQUARE LETTER DZA;Lo;0;L;;;;;N;;;;; +11A26;ZANABAZAR SQUARE LETTER DZHA;Lo;0;L;;;;;N;;;;; +11A27;ZANABAZAR SQUARE LETTER ZHA;Lo;0;L;;;;;N;;;;; +11A28;ZANABAZAR SQUARE LETTER ZA;Lo;0;L;;;;;N;;;;; +11A29;ZANABAZAR SQUARE LETTER -A;Lo;0;L;;;;;N;;;;; +11A2A;ZANABAZAR SQUARE LETTER YA;Lo;0;L;;;;;N;;;;; +11A2B;ZANABAZAR SQUARE LETTER RA;Lo;0;L;;;;;N;;;;; +11A2C;ZANABAZAR SQUARE LETTER LA;Lo;0;L;;;;;N;;;;; +11A2D;ZANABAZAR SQUARE LETTER VA;Lo;0;L;;;;;N;;;;; +11A2E;ZANABAZAR SQUARE LETTER SHA;Lo;0;L;;;;;N;;;;; +11A2F;ZANABAZAR SQUARE LETTER SSA;Lo;0;L;;;;;N;;;;; +11A30;ZANABAZAR SQUARE LETTER SA;Lo;0;L;;;;;N;;;;; +11A31;ZANABAZAR SQUARE LETTER HA;Lo;0;L;;;;;N;;;;; +11A32;ZANABAZAR SQUARE LETTER KSSA;Lo;0;L;;;;;N;;;;; +11A33;ZANABAZAR SQUARE FINAL CONSONANT MARK;Mn;0;NSM;;;;;N;;;;; +11A34;ZANABAZAR SQUARE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11A35;ZANABAZAR SQUARE SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11A36;ZANABAZAR SQUARE SIGN CANDRABINDU WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;; +11A37;ZANABAZAR SQUARE SIGN CANDRA WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;; +11A38;ZANABAZAR SQUARE SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11A39;ZANABAZAR SQUARE SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11A3A;ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;; +11A3B;ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA;Mn;0;NSM;;;;;N;;;;; +11A3C;ZANABAZAR SQUARE CLUSTER-FINAL LETTER RA;Mn;0;NSM;;;;;N;;;;; +11A3D;ZANABAZAR SQUARE CLUSTER-FINAL LETTER LA;Mn;0;NSM;;;;;N;;;;; +11A3E;ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA;Mn;0;NSM;;;;;N;;;;; +11A3F;ZANABAZAR SQUARE INITIAL HEAD MARK;Po;0;L;;;;;N;;;;; +11A40;ZANABAZAR SQUARE CLOSING HEAD MARK;Po;0;L;;;;;N;;;;; +11A41;ZANABAZAR SQUARE MARK TSHEG;Po;0;L;;;;;N;;;;; +11A42;ZANABAZAR SQUARE MARK SHAD;Po;0;L;;;;;N;;;;; +11A43;ZANABAZAR SQUARE MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;; +11A44;ZANABAZAR SQUARE MARK LONG TSHEG;Po;0;L;;;;;N;;;;; +11A45;ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;; +11A46;ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;; +11A47;ZANABAZAR SQUARE SUBJOINER;Mn;9;NSM;;;;;N;;;;; +11A50;SOYOMBO LETTER A;Lo;0;L;;;;;N;;;;; +11A51;SOYOMBO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11A52;SOYOMBO VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11A53;SOYOMBO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11A54;SOYOMBO VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11A55;SOYOMBO VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11A56;SOYOMBO VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11A57;SOYOMBO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11A58;SOYOMBO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11A59;SOYOMBO VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11A5A;SOYOMBO VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11A5B;SOYOMBO VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +11A5C;SOYOMBO LETTER KA;Lo;0;L;;;;;N;;;;; +11A5D;SOYOMBO LETTER KHA;Lo;0;L;;;;;N;;;;; +11A5E;SOYOMBO LETTER GA;Lo;0;L;;;;;N;;;;; +11A5F;SOYOMBO LETTER GHA;Lo;0;L;;;;;N;;;;; +11A60;SOYOMBO LETTER NGA;Lo;0;L;;;;;N;;;;; +11A61;SOYOMBO LETTER CA;Lo;0;L;;;;;N;;;;; +11A62;SOYOMBO LETTER CHA;Lo;0;L;;;;;N;;;;; +11A63;SOYOMBO LETTER JA;Lo;0;L;;;;;N;;;;; +11A64;SOYOMBO LETTER JHA;Lo;0;L;;;;;N;;;;; +11A65;SOYOMBO LETTER NYA;Lo;0;L;;;;;N;;;;; +11A66;SOYOMBO LETTER TTA;Lo;0;L;;;;;N;;;;; +11A67;SOYOMBO LETTER TTHA;Lo;0;L;;;;;N;;;;; +11A68;SOYOMBO LETTER DDA;Lo;0;L;;;;;N;;;;; +11A69;SOYOMBO LETTER DDHA;Lo;0;L;;;;;N;;;;; +11A6A;SOYOMBO LETTER NNA;Lo;0;L;;;;;N;;;;; +11A6B;SOYOMBO LETTER TA;Lo;0;L;;;;;N;;;;; +11A6C;SOYOMBO LETTER THA;Lo;0;L;;;;;N;;;;; +11A6D;SOYOMBO LETTER DA;Lo;0;L;;;;;N;;;;; +11A6E;SOYOMBO LETTER DHA;Lo;0;L;;;;;N;;;;; +11A6F;SOYOMBO LETTER NA;Lo;0;L;;;;;N;;;;; +11A70;SOYOMBO LETTER PA;Lo;0;L;;;;;N;;;;; +11A71;SOYOMBO LETTER PHA;Lo;0;L;;;;;N;;;;; +11A72;SOYOMBO LETTER BA;Lo;0;L;;;;;N;;;;; +11A73;SOYOMBO LETTER BHA;Lo;0;L;;;;;N;;;;; +11A74;SOYOMBO LETTER MA;Lo;0;L;;;;;N;;;;; +11A75;SOYOMBO LETTER TSA;Lo;0;L;;;;;N;;;;; +11A76;SOYOMBO LETTER TSHA;Lo;0;L;;;;;N;;;;; +11A77;SOYOMBO LETTER DZA;Lo;0;L;;;;;N;;;;; +11A78;SOYOMBO LETTER ZHA;Lo;0;L;;;;;N;;;;; +11A79;SOYOMBO LETTER ZA;Lo;0;L;;;;;N;;;;; +11A7A;SOYOMBO LETTER -A;Lo;0;L;;;;;N;;;;; +11A7B;SOYOMBO LETTER YA;Lo;0;L;;;;;N;;;;; +11A7C;SOYOMBO LETTER RA;Lo;0;L;;;;;N;;;;; +11A7D;SOYOMBO LETTER LA;Lo;0;L;;;;;N;;;;; +11A7E;SOYOMBO LETTER VA;Lo;0;L;;;;;N;;;;; +11A7F;SOYOMBO LETTER SHA;Lo;0;L;;;;;N;;;;; +11A80;SOYOMBO LETTER SSA;Lo;0;L;;;;;N;;;;; +11A81;SOYOMBO LETTER SA;Lo;0;L;;;;;N;;;;; +11A82;SOYOMBO LETTER HA;Lo;0;L;;;;;N;;;;; +11A83;SOYOMBO LETTER KSSA;Lo;0;L;;;;;N;;;;; +11A84;SOYOMBO SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11A85;SOYOMBO SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11A86;SOYOMBO CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;; +11A87;SOYOMBO CLUSTER-INITIAL LETTER LA;Lo;0;L;;;;;N;;;;; +11A88;SOYOMBO CLUSTER-INITIAL LETTER SHA;Lo;0;L;;;;;N;;;;; +11A89;SOYOMBO CLUSTER-INITIAL LETTER SA;Lo;0;L;;;;;N;;;;; +11A8A;SOYOMBO FINAL CONSONANT SIGN G;Mn;0;NSM;;;;;N;;;;; +11A8B;SOYOMBO FINAL CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +11A8C;SOYOMBO FINAL CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +11A8D;SOYOMBO FINAL CONSONANT SIGN D;Mn;0;NSM;;;;;N;;;;; +11A8E;SOYOMBO FINAL CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +11A8F;SOYOMBO FINAL CONSONANT SIGN B;Mn;0;NSM;;;;;N;;;;; +11A90;SOYOMBO FINAL CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +11A91;SOYOMBO FINAL CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +11A92;SOYOMBO FINAL CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +11A93;SOYOMBO FINAL CONSONANT SIGN SH;Mn;0;NSM;;;;;N;;;;; +11A94;SOYOMBO FINAL CONSONANT SIGN S;Mn;0;NSM;;;;;N;;;;; +11A95;SOYOMBO FINAL CONSONANT SIGN -A;Mn;0;NSM;;;;;N;;;;; +11A96;SOYOMBO SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11A97;SOYOMBO SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11A98;SOYOMBO GEMINATION MARK;Mn;0;NSM;;;;;N;;;;; +11A99;SOYOMBO SUBJOINER;Mn;9;NSM;;;;;N;;;;; +11A9A;SOYOMBO MARK TSHEG;Po;0;L;;;;;N;;;;; +11A9B;SOYOMBO MARK SHAD;Po;0;L;;;;;N;;;;; +11A9C;SOYOMBO MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;; +11A9D;SOYOMBO MARK PLUTA;Lo;0;L;;;;;N;;;;; +11A9E;SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME;Po;0;L;;;;;N;;;;; +11A9F;SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME;Po;0;L;;;;;N;;;;; +11AA0;SOYOMBO HEAD MARK WITH MOON AND SUN;Po;0;L;;;;;N;;;;; +11AA1;SOYOMBO TERMINAL MARK-1;Po;0;L;;;;;N;;;;; +11AA2;SOYOMBO TERMINAL MARK-2;Po;0;L;;;;;N;;;;; +11AB0;CANADIAN SYLLABICS NATTILIK HI;Lo;0;L;;;;;N;;;;; +11AB1;CANADIAN SYLLABICS NATTILIK HII;Lo;0;L;;;;;N;;;;; +11AB2;CANADIAN SYLLABICS NATTILIK HO;Lo;0;L;;;;;N;;;;; +11AB3;CANADIAN SYLLABICS NATTILIK HOO;Lo;0;L;;;;;N;;;;; +11AB4;CANADIAN SYLLABICS NATTILIK HA;Lo;0;L;;;;;N;;;;; +11AB5;CANADIAN SYLLABICS NATTILIK HAA;Lo;0;L;;;;;N;;;;; +11AB6;CANADIAN SYLLABICS NATTILIK SHRI;Lo;0;L;;;;;N;;;;; +11AB7;CANADIAN SYLLABICS NATTILIK SHRII;Lo;0;L;;;;;N;;;;; +11AB8;CANADIAN SYLLABICS NATTILIK SHRO;Lo;0;L;;;;;N;;;;; +11AB9;CANADIAN SYLLABICS NATTILIK SHROO;Lo;0;L;;;;;N;;;;; +11ABA;CANADIAN SYLLABICS NATTILIK SHRA;Lo;0;L;;;;;N;;;;; +11ABB;CANADIAN SYLLABICS NATTILIK SHRAA;Lo;0;L;;;;;N;;;;; +11ABC;CANADIAN SYLLABICS SPE;Lo;0;L;;;;;N;;;;; +11ABD;CANADIAN SYLLABICS SPI;Lo;0;L;;;;;N;;;;; +11ABE;CANADIAN SYLLABICS SPO;Lo;0;L;;;;;N;;;;; +11ABF;CANADIAN SYLLABICS SPA;Lo;0;L;;;;;N;;;;; +11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;; +11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;; +11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;; +11AC3;PAU CIN HAU LETTER MA;Lo;0;L;;;;;N;;;;; +11AC4;PAU CIN HAU LETTER DA;Lo;0;L;;;;;N;;;;; +11AC5;PAU CIN HAU LETTER ZA;Lo;0;L;;;;;N;;;;; +11AC6;PAU CIN HAU LETTER VA;Lo;0;L;;;;;N;;;;; +11AC7;PAU CIN HAU LETTER NGA;Lo;0;L;;;;;N;;;;; +11AC8;PAU CIN HAU LETTER HA;Lo;0;L;;;;;N;;;;; +11AC9;PAU CIN HAU LETTER GA;Lo;0;L;;;;;N;;;;; +11ACA;PAU CIN HAU LETTER KHA;Lo;0;L;;;;;N;;;;; +11ACB;PAU CIN HAU LETTER SA;Lo;0;L;;;;;N;;;;; +11ACC;PAU CIN HAU LETTER BA;Lo;0;L;;;;;N;;;;; +11ACD;PAU CIN HAU LETTER CA;Lo;0;L;;;;;N;;;;; +11ACE;PAU CIN HAU LETTER TA;Lo;0;L;;;;;N;;;;; +11ACF;PAU CIN HAU LETTER THA;Lo;0;L;;;;;N;;;;; +11AD0;PAU CIN HAU LETTER NA;Lo;0;L;;;;;N;;;;; +11AD1;PAU CIN HAU LETTER PHA;Lo;0;L;;;;;N;;;;; +11AD2;PAU CIN HAU LETTER RA;Lo;0;L;;;;;N;;;;; +11AD3;PAU CIN HAU LETTER FA;Lo;0;L;;;;;N;;;;; +11AD4;PAU CIN HAU LETTER CHA;Lo;0;L;;;;;N;;;;; +11AD5;PAU CIN HAU LETTER A;Lo;0;L;;;;;N;;;;; +11AD6;PAU CIN HAU LETTER E;Lo;0;L;;;;;N;;;;; +11AD7;PAU CIN HAU LETTER I;Lo;0;L;;;;;N;;;;; +11AD8;PAU CIN HAU LETTER O;Lo;0;L;;;;;N;;;;; +11AD9;PAU CIN HAU LETTER U;Lo;0;L;;;;;N;;;;; +11ADA;PAU CIN HAU LETTER UA;Lo;0;L;;;;;N;;;;; +11ADB;PAU CIN HAU LETTER IA;Lo;0;L;;;;;N;;;;; +11ADC;PAU CIN HAU LETTER FINAL P;Lo;0;L;;;;;N;;;;; +11ADD;PAU CIN HAU LETTER FINAL K;Lo;0;L;;;;;N;;;;; +11ADE;PAU CIN HAU LETTER FINAL T;Lo;0;L;;;;;N;;;;; +11ADF;PAU CIN HAU LETTER FINAL M;Lo;0;L;;;;;N;;;;; +11AE0;PAU CIN HAU LETTER FINAL N;Lo;0;L;;;;;N;;;;; +11AE1;PAU CIN HAU LETTER FINAL L;Lo;0;L;;;;;N;;;;; +11AE2;PAU CIN HAU LETTER FINAL W;Lo;0;L;;;;;N;;;;; +11AE3;PAU CIN HAU LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +11AE4;PAU CIN HAU LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +11AE5;PAU CIN HAU RISING TONE LONG;Lo;0;L;;;;;N;;;;; +11AE6;PAU CIN HAU RISING TONE;Lo;0;L;;;;;N;;;;; +11AE7;PAU CIN HAU SANDHI GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AE8;PAU CIN HAU RISING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AE9;PAU CIN HAU RISING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEA;PAU CIN HAU SANDHI GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +11AEB;PAU CIN HAU SANDHI TONE LONG;Lo;0;L;;;;;N;;;;; +11AEC;PAU CIN HAU SANDHI TONE;Lo;0;L;;;;;N;;;;; +11AED;PAU CIN HAU SANDHI TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AEE;PAU CIN HAU SANDHI TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEF;PAU CIN HAU MID-LEVEL TONE;Lo;0;L;;;;;N;;;;; +11AF0;PAU CIN HAU GLOTTAL STOP VARIANT;Lo;0;L;;;;;N;;;;; +11AF1;PAU CIN HAU MID-LEVEL TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF2;PAU CIN HAU MID-LEVEL TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF3;PAU CIN HAU LOW-FALLING TONE LONG;Lo;0;L;;;;;N;;;;; +11AF4;PAU CIN HAU LOW-FALLING TONE;Lo;0;L;;;;;N;;;;; +11AF5;PAU CIN HAU GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +11B00;DEVANAGARI HEAD MARK;Po;0;L;;;;;N;;;;; +11B01;DEVANAGARI HEAD MARK WITH HEADSTROKE;Po;0;L;;;;;N;;;;; +11B02;DEVANAGARI SIGN BHALE;Po;0;L;;;;;N;;;;; +11B03;DEVANAGARI SIGN BHALE WITH HOOK;Po;0;L;;;;;N;;;;; +11B04;DEVANAGARI SIGN EXTENDED BHALE;Po;0;L;;;;;N;;;;; +11B05;DEVANAGARI SIGN EXTENDED BHALE WITH HOOK;Po;0;L;;;;;N;;;;; +11B06;DEVANAGARI SIGN WESTERN FIVE-LIKE BHALE;Po;0;L;;;;;N;;;;; +11B07;DEVANAGARI SIGN WESTERN NINE-LIKE BHALE;Po;0;L;;;;;N;;;;; +11B08;DEVANAGARI SIGN REVERSED NINE-LIKE BHALE;Po;0;L;;;;;N;;;;; +11B09;DEVANAGARI SIGN MINDU;Po;0;L;;;;;N;;;;; +11B60;SHARADA VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11B61;SHARADA VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; +11B62;SHARADA VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11B63;SHARADA VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +11B64;SHARADA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +11B65;SHARADA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +11B66;SHARADA VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +11B67;SHARADA VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +11BC0;SUNUWAR LETTER DEVI;Lo;0;L;;;;;N;;;;; +11BC1;SUNUWAR LETTER TASLA;Lo;0;L;;;;;N;;;;; +11BC2;SUNUWAR LETTER EKO;Lo;0;L;;;;;N;;;;; +11BC3;SUNUWAR LETTER IMAR;Lo;0;L;;;;;N;;;;; +11BC4;SUNUWAR LETTER REU;Lo;0;L;;;;;N;;;;; +11BC5;SUNUWAR LETTER UTTHI;Lo;0;L;;;;;N;;;;; +11BC6;SUNUWAR LETTER KIK;Lo;0;L;;;;;N;;;;; +11BC7;SUNUWAR LETTER MA;Lo;0;L;;;;;N;;;;; +11BC8;SUNUWAR LETTER APPHO;Lo;0;L;;;;;N;;;;; +11BC9;SUNUWAR LETTER PIP;Lo;0;L;;;;;N;;;;; +11BCA;SUNUWAR LETTER GIL;Lo;0;L;;;;;N;;;;; +11BCB;SUNUWAR LETTER HAMSO;Lo;0;L;;;;;N;;;;; +11BCC;SUNUWAR LETTER CARMI;Lo;0;L;;;;;N;;;;; +11BCD;SUNUWAR LETTER NAH;Lo;0;L;;;;;N;;;;; +11BCE;SUNUWAR LETTER BUR;Lo;0;L;;;;;N;;;;; +11BCF;SUNUWAR LETTER JYAH;Lo;0;L;;;;;N;;;;; +11BD0;SUNUWAR LETTER LOACHA;Lo;0;L;;;;;N;;;;; +11BD1;SUNUWAR LETTER OTTHI;Lo;0;L;;;;;N;;;;; +11BD2;SUNUWAR LETTER SHYELE;Lo;0;L;;;;;N;;;;; +11BD3;SUNUWAR LETTER VARCA;Lo;0;L;;;;;N;;;;; +11BD4;SUNUWAR LETTER YAT;Lo;0;L;;;;;N;;;;; +11BD5;SUNUWAR LETTER AVA;Lo;0;L;;;;;N;;;;; +11BD6;SUNUWAR LETTER AAL;Lo;0;L;;;;;N;;;;; +11BD7;SUNUWAR LETTER DONGA;Lo;0;L;;;;;N;;;;; +11BD8;SUNUWAR LETTER THARI;Lo;0;L;;;;;N;;;;; +11BD9;SUNUWAR LETTER PHAR;Lo;0;L;;;;;N;;;;; +11BDA;SUNUWAR LETTER NGAR;Lo;0;L;;;;;N;;;;; +11BDB;SUNUWAR LETTER KHA;Lo;0;L;;;;;N;;;;; +11BDC;SUNUWAR LETTER SHYER;Lo;0;L;;;;;N;;;;; +11BDD;SUNUWAR LETTER CHELAP;Lo;0;L;;;;;N;;;;; +11BDE;SUNUWAR LETTER TENTU;Lo;0;L;;;;;N;;;;; +11BDF;SUNUWAR LETTER THELE;Lo;0;L;;;;;N;;;;; +11BE0;SUNUWAR LETTER KLOKO;Lo;0;L;;;;;N;;;;; +11BE1;SUNUWAR SIGN PVO;Po;0;L;;;;;N;;;;; +11BF0;SUNUWAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11BF1;SUNUWAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11BF2;SUNUWAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11BF3;SUNUWAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11BF4;SUNUWAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11BF5;SUNUWAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11BF6;SUNUWAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11BF7;SUNUWAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11BF8;SUNUWAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11BF9;SUNUWAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11C00;BHAIKSUKI LETTER A;Lo;0;L;;;;;N;;;;; +11C01;BHAIKSUKI LETTER AA;Lo;0;L;;;;;N;;;;; +11C02;BHAIKSUKI LETTER I;Lo;0;L;;;;;N;;;;; +11C03;BHAIKSUKI LETTER II;Lo;0;L;;;;;N;;;;; +11C04;BHAIKSUKI LETTER U;Lo;0;L;;;;;N;;;;; +11C05;BHAIKSUKI LETTER UU;Lo;0;L;;;;;N;;;;; +11C06;BHAIKSUKI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11C07;BHAIKSUKI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11C08;BHAIKSUKI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11C0A;BHAIKSUKI LETTER E;Lo;0;L;;;;;N;;;;; +11C0B;BHAIKSUKI LETTER AI;Lo;0;L;;;;;N;;;;; +11C0C;BHAIKSUKI LETTER O;Lo;0;L;;;;;N;;;;; +11C0D;BHAIKSUKI LETTER AU;Lo;0;L;;;;;N;;;;; +11C0E;BHAIKSUKI LETTER KA;Lo;0;L;;;;;N;;;;; +11C0F;BHAIKSUKI LETTER KHA;Lo;0;L;;;;;N;;;;; +11C10;BHAIKSUKI LETTER GA;Lo;0;L;;;;;N;;;;; +11C11;BHAIKSUKI LETTER GHA;Lo;0;L;;;;;N;;;;; +11C12;BHAIKSUKI LETTER NGA;Lo;0;L;;;;;N;;;;; +11C13;BHAIKSUKI LETTER CA;Lo;0;L;;;;;N;;;;; +11C14;BHAIKSUKI LETTER CHA;Lo;0;L;;;;;N;;;;; +11C15;BHAIKSUKI LETTER JA;Lo;0;L;;;;;N;;;;; +11C16;BHAIKSUKI LETTER JHA;Lo;0;L;;;;;N;;;;; +11C17;BHAIKSUKI LETTER NYA;Lo;0;L;;;;;N;;;;; +11C18;BHAIKSUKI LETTER TTA;Lo;0;L;;;;;N;;;;; +11C19;BHAIKSUKI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11C1A;BHAIKSUKI LETTER DDA;Lo;0;L;;;;;N;;;;; +11C1B;BHAIKSUKI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11C1C;BHAIKSUKI LETTER NNA;Lo;0;L;;;;;N;;;;; +11C1D;BHAIKSUKI LETTER TA;Lo;0;L;;;;;N;;;;; +11C1E;BHAIKSUKI LETTER THA;Lo;0;L;;;;;N;;;;; +11C1F;BHAIKSUKI LETTER DA;Lo;0;L;;;;;N;;;;; +11C20;BHAIKSUKI LETTER DHA;Lo;0;L;;;;;N;;;;; +11C21;BHAIKSUKI LETTER NA;Lo;0;L;;;;;N;;;;; +11C22;BHAIKSUKI LETTER PA;Lo;0;L;;;;;N;;;;; +11C23;BHAIKSUKI LETTER PHA;Lo;0;L;;;;;N;;;;; +11C24;BHAIKSUKI LETTER BA;Lo;0;L;;;;;N;;;;; +11C25;BHAIKSUKI LETTER BHA;Lo;0;L;;;;;N;;;;; +11C26;BHAIKSUKI LETTER MA;Lo;0;L;;;;;N;;;;; +11C27;BHAIKSUKI LETTER YA;Lo;0;L;;;;;N;;;;; +11C28;BHAIKSUKI LETTER RA;Lo;0;L;;;;;N;;;;; +11C29;BHAIKSUKI LETTER LA;Lo;0;L;;;;;N;;;;; +11C2A;BHAIKSUKI LETTER VA;Lo;0;L;;;;;N;;;;; +11C2B;BHAIKSUKI LETTER SHA;Lo;0;L;;;;;N;;;;; +11C2C;BHAIKSUKI LETTER SSA;Lo;0;L;;;;;N;;;;; +11C2D;BHAIKSUKI LETTER SA;Lo;0;L;;;;;N;;;;; +11C2E;BHAIKSUKI LETTER HA;Lo;0;L;;;;;N;;;;; +11C2F;BHAIKSUKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11C30;BHAIKSUKI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11C31;BHAIKSUKI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11C32;BHAIKSUKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11C33;BHAIKSUKI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11C34;BHAIKSUKI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11C35;BHAIKSUKI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11C36;BHAIKSUKI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11C38;BHAIKSUKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11C39;BHAIKSUKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11C3A;BHAIKSUKI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11C3B;BHAIKSUKI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11C3C;BHAIKSUKI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11C3D;BHAIKSUKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11C3E;BHAIKSUKI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11C3F;BHAIKSUKI SIGN VIRAMA;Mn;9;L;;;;;N;;;;; +11C40;BHAIKSUKI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +11C41;BHAIKSUKI DANDA;Po;0;L;;;;;N;;;;; +11C42;BHAIKSUKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11C43;BHAIKSUKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; +11C44;BHAIKSUKI GAP FILLER-1;Po;0;L;;;;;N;;;;; +11C45;BHAIKSUKI GAP FILLER-2;Po;0;L;;;;;N;;;;; +11C50;BHAIKSUKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11C51;BHAIKSUKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11C52;BHAIKSUKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11C53;BHAIKSUKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11C54;BHAIKSUKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11C55;BHAIKSUKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11C56;BHAIKSUKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11C57;BHAIKSUKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11C58;BHAIKSUKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11C59;BHAIKSUKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11C5A;BHAIKSUKI NUMBER ONE;No;0;L;;;;1;N;;;;; +11C5B;BHAIKSUKI NUMBER TWO;No;0;L;;;;2;N;;;;; +11C5C;BHAIKSUKI NUMBER THREE;No;0;L;;;;3;N;;;;; +11C5D;BHAIKSUKI NUMBER FOUR;No;0;L;;;;4;N;;;;; +11C5E;BHAIKSUKI NUMBER FIVE;No;0;L;;;;5;N;;;;; +11C5F;BHAIKSUKI NUMBER SIX;No;0;L;;;;6;N;;;;; +11C60;BHAIKSUKI NUMBER SEVEN;No;0;L;;;;7;N;;;;; +11C61;BHAIKSUKI NUMBER EIGHT;No;0;L;;;;8;N;;;;; +11C62;BHAIKSUKI NUMBER NINE;No;0;L;;;;9;N;;;;; +11C63;BHAIKSUKI NUMBER TEN;No;0;L;;;;10;N;;;;; +11C64;BHAIKSUKI NUMBER TWENTY;No;0;L;;;;20;N;;;;; +11C65;BHAIKSUKI NUMBER THIRTY;No;0;L;;;;30;N;;;;; +11C66;BHAIKSUKI NUMBER FORTY;No;0;L;;;;40;N;;;;; +11C67;BHAIKSUKI NUMBER FIFTY;No;0;L;;;;50;N;;;;; +11C68;BHAIKSUKI NUMBER SIXTY;No;0;L;;;;60;N;;;;; +11C69;BHAIKSUKI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +11C6A;BHAIKSUKI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +11C6B;BHAIKSUKI NUMBER NINETY;No;0;L;;;;90;N;;;;; +11C6C;BHAIKSUKI HUNDREDS UNIT MARK;No;0;L;;;;100;N;;;;; +11C70;MARCHEN HEAD MARK;Po;0;L;;;;;N;;;;; +11C71;MARCHEN MARK SHAD;Po;0;L;;;;;N;;;;; +11C72;MARCHEN LETTER KA;Lo;0;L;;;;;N;;;;; +11C73;MARCHEN LETTER KHA;Lo;0;L;;;;;N;;;;; +11C74;MARCHEN LETTER GA;Lo;0;L;;;;;N;;;;; +11C75;MARCHEN LETTER NGA;Lo;0;L;;;;;N;;;;; +11C76;MARCHEN LETTER CA;Lo;0;L;;;;;N;;;;; +11C77;MARCHEN LETTER CHA;Lo;0;L;;;;;N;;;;; +11C78;MARCHEN LETTER JA;Lo;0;L;;;;;N;;;;; +11C79;MARCHEN LETTER NYA;Lo;0;L;;;;;N;;;;; +11C7A;MARCHEN LETTER TA;Lo;0;L;;;;;N;;;;; +11C7B;MARCHEN LETTER THA;Lo;0;L;;;;;N;;;;; +11C7C;MARCHEN LETTER DA;Lo;0;L;;;;;N;;;;; +11C7D;MARCHEN LETTER NA;Lo;0;L;;;;;N;;;;; +11C7E;MARCHEN LETTER PA;Lo;0;L;;;;;N;;;;; +11C7F;MARCHEN LETTER PHA;Lo;0;L;;;;;N;;;;; +11C80;MARCHEN LETTER BA;Lo;0;L;;;;;N;;;;; +11C81;MARCHEN LETTER MA;Lo;0;L;;;;;N;;;;; +11C82;MARCHEN LETTER TSA;Lo;0;L;;;;;N;;;;; +11C83;MARCHEN LETTER TSHA;Lo;0;L;;;;;N;;;;; +11C84;MARCHEN LETTER DZA;Lo;0;L;;;;;N;;;;; +11C85;MARCHEN LETTER WA;Lo;0;L;;;;;N;;;;; +11C86;MARCHEN LETTER ZHA;Lo;0;L;;;;;N;;;;; +11C87;MARCHEN LETTER ZA;Lo;0;L;;;;;N;;;;; +11C88;MARCHEN LETTER -A;Lo;0;L;;;;;N;;;;; +11C89;MARCHEN LETTER YA;Lo;0;L;;;;;N;;;;; +11C8A;MARCHEN LETTER RA;Lo;0;L;;;;;N;;;;; +11C8B;MARCHEN LETTER LA;Lo;0;L;;;;;N;;;;; +11C8C;MARCHEN LETTER SHA;Lo;0;L;;;;;N;;;;; +11C8D;MARCHEN LETTER SA;Lo;0;L;;;;;N;;;;; +11C8E;MARCHEN LETTER HA;Lo;0;L;;;;;N;;;;; +11C8F;MARCHEN LETTER A;Lo;0;L;;;;;N;;;;; +11C92;MARCHEN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +11C93;MARCHEN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +11C94;MARCHEN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +11C95;MARCHEN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +11C96;MARCHEN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +11C97;MARCHEN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +11C98;MARCHEN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +11C99;MARCHEN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +11C9A;MARCHEN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +11C9B;MARCHEN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +11C9C;MARCHEN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +11C9D;MARCHEN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +11C9E;MARCHEN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +11C9F;MARCHEN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +11CA0;MARCHEN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +11CA1;MARCHEN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +11CA2;MARCHEN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +11CA3;MARCHEN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +11CA4;MARCHEN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +11CA5;MARCHEN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +11CA6;MARCHEN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +11CA7;MARCHEN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +11CA9;MARCHEN SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +11CAA;MARCHEN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +11CAB;MARCHEN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +11CAC;MARCHEN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +11CAD;MARCHEN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +11CAE;MARCHEN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +11CAF;MARCHEN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +11CB0;MARCHEN VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11CB1;MARCHEN VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11CB2;MARCHEN VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11CB3;MARCHEN VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11CB4;MARCHEN VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11CB5;MARCHEN SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11CB6;MARCHEN SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11D00;MASARAM GONDI LETTER A;Lo;0;L;;;;;N;;;;; +11D01;MASARAM GONDI LETTER AA;Lo;0;L;;;;;N;;;;; +11D02;MASARAM GONDI LETTER I;Lo;0;L;;;;;N;;;;; +11D03;MASARAM GONDI LETTER II;Lo;0;L;;;;;N;;;;; +11D04;MASARAM GONDI LETTER U;Lo;0;L;;;;;N;;;;; +11D05;MASARAM GONDI LETTER UU;Lo;0;L;;;;;N;;;;; +11D06;MASARAM GONDI LETTER E;Lo;0;L;;;;;N;;;;; +11D08;MASARAM GONDI LETTER AI;Lo;0;L;;;;;N;;;;; +11D09;MASARAM GONDI LETTER O;Lo;0;L;;;;;N;;;;; +11D0B;MASARAM GONDI LETTER AU;Lo;0;L;;;;;N;;;;; +11D0C;MASARAM GONDI LETTER KA;Lo;0;L;;;;;N;;;;; +11D0D;MASARAM GONDI LETTER KHA;Lo;0;L;;;;;N;;;;; +11D0E;MASARAM GONDI LETTER GA;Lo;0;L;;;;;N;;;;; +11D0F;MASARAM GONDI LETTER GHA;Lo;0;L;;;;;N;;;;; +11D10;MASARAM GONDI LETTER NGA;Lo;0;L;;;;;N;;;;; +11D11;MASARAM GONDI LETTER CA;Lo;0;L;;;;;N;;;;; +11D12;MASARAM GONDI LETTER CHA;Lo;0;L;;;;;N;;;;; +11D13;MASARAM GONDI LETTER JA;Lo;0;L;;;;;N;;;;; +11D14;MASARAM GONDI LETTER JHA;Lo;0;L;;;;;N;;;;; +11D15;MASARAM GONDI LETTER NYA;Lo;0;L;;;;;N;;;;; +11D16;MASARAM GONDI LETTER TTA;Lo;0;L;;;;;N;;;;; +11D17;MASARAM GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11D18;MASARAM GONDI LETTER DDA;Lo;0;L;;;;;N;;;;; +11D19;MASARAM GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11D1A;MASARAM GONDI LETTER NNA;Lo;0;L;;;;;N;;;;; +11D1B;MASARAM GONDI LETTER TA;Lo;0;L;;;;;N;;;;; +11D1C;MASARAM GONDI LETTER THA;Lo;0;L;;;;;N;;;;; +11D1D;MASARAM GONDI LETTER DA;Lo;0;L;;;;;N;;;;; +11D1E;MASARAM GONDI LETTER DHA;Lo;0;L;;;;;N;;;;; +11D1F;MASARAM GONDI LETTER NA;Lo;0;L;;;;;N;;;;; +11D20;MASARAM GONDI LETTER PA;Lo;0;L;;;;;N;;;;; +11D21;MASARAM GONDI LETTER PHA;Lo;0;L;;;;;N;;;;; +11D22;MASARAM GONDI LETTER BA;Lo;0;L;;;;;N;;;;; +11D23;MASARAM GONDI LETTER BHA;Lo;0;L;;;;;N;;;;; +11D24;MASARAM GONDI LETTER MA;Lo;0;L;;;;;N;;;;; +11D25;MASARAM GONDI LETTER YA;Lo;0;L;;;;;N;;;;; +11D26;MASARAM GONDI LETTER RA;Lo;0;L;;;;;N;;;;; +11D27;MASARAM GONDI LETTER LA;Lo;0;L;;;;;N;;;;; +11D28;MASARAM GONDI LETTER VA;Lo;0;L;;;;;N;;;;; +11D29;MASARAM GONDI LETTER SHA;Lo;0;L;;;;;N;;;;; +11D2A;MASARAM GONDI LETTER SSA;Lo;0;L;;;;;N;;;;; +11D2B;MASARAM GONDI LETTER SA;Lo;0;L;;;;;N;;;;; +11D2C;MASARAM GONDI LETTER HA;Lo;0;L;;;;;N;;;;; +11D2D;MASARAM GONDI LETTER LLA;Lo;0;L;;;;;N;;;;; +11D2E;MASARAM GONDI LETTER KSSA;Lo;0;L;;;;;N;;;;; +11D2F;MASARAM GONDI LETTER JNYA;Lo;0;L;;;;;N;;;;; +11D30;MASARAM GONDI LETTER TRA;Lo;0;L;;;;;N;;;;; +11D31;MASARAM GONDI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11D32;MASARAM GONDI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11D33;MASARAM GONDI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11D34;MASARAM GONDI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11D35;MASARAM GONDI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11D36;MASARAM GONDI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11D3A;MASARAM GONDI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11D3C;MASARAM GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11D3D;MASARAM GONDI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11D3F;MASARAM GONDI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11D40;MASARAM GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11D41;MASARAM GONDI SIGN VISARGA;Mn;0;NSM;;;;;N;;;;; +11D42;MASARAM GONDI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11D43;MASARAM GONDI SIGN CANDRA;Mn;0;NSM;;;;;N;;;;; +11D44;MASARAM GONDI SIGN HALANTA;Mn;9;NSM;;;;;N;;;;; +11D45;MASARAM GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11D46;MASARAM GONDI REPHA;Lo;0;L;;;;;N;;;;; +11D47;MASARAM GONDI RA-KARA;Mn;0;NSM;;;;;N;;;;; +11D50;MASARAM GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11D51;MASARAM GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11D52;MASARAM GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11D53;MASARAM GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11D54;MASARAM GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11D55;MASARAM GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11D56;MASARAM GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11D57;MASARAM GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11D58;MASARAM GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11D59;MASARAM GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11D60;GUNJALA GONDI LETTER A;Lo;0;L;;;;;N;;;;; +11D61;GUNJALA GONDI LETTER AA;Lo;0;L;;;;;N;;;;; +11D62;GUNJALA GONDI LETTER I;Lo;0;L;;;;;N;;;;; +11D63;GUNJALA GONDI LETTER II;Lo;0;L;;;;;N;;;;; +11D64;GUNJALA GONDI LETTER U;Lo;0;L;;;;;N;;;;; +11D65;GUNJALA GONDI LETTER UU;Lo;0;L;;;;;N;;;;; +11D67;GUNJALA GONDI LETTER EE;Lo;0;L;;;;;N;;;;; +11D68;GUNJALA GONDI LETTER AI;Lo;0;L;;;;;N;;;;; +11D6A;GUNJALA GONDI LETTER OO;Lo;0;L;;;;;N;;;;; +11D6B;GUNJALA GONDI LETTER AU;Lo;0;L;;;;;N;;;;; +11D6C;GUNJALA GONDI LETTER YA;Lo;0;L;;;;;N;;;;; +11D6D;GUNJALA GONDI LETTER VA;Lo;0;L;;;;;N;;;;; +11D6E;GUNJALA GONDI LETTER BA;Lo;0;L;;;;;N;;;;; +11D6F;GUNJALA GONDI LETTER BHA;Lo;0;L;;;;;N;;;;; +11D70;GUNJALA GONDI LETTER MA;Lo;0;L;;;;;N;;;;; +11D71;GUNJALA GONDI LETTER KA;Lo;0;L;;;;;N;;;;; +11D72;GUNJALA GONDI LETTER KHA;Lo;0;L;;;;;N;;;;; +11D73;GUNJALA GONDI LETTER TA;Lo;0;L;;;;;N;;;;; +11D74;GUNJALA GONDI LETTER THA;Lo;0;L;;;;;N;;;;; +11D75;GUNJALA GONDI LETTER LA;Lo;0;L;;;;;N;;;;; +11D76;GUNJALA GONDI LETTER GA;Lo;0;L;;;;;N;;;;; +11D77;GUNJALA GONDI LETTER GHA;Lo;0;L;;;;;N;;;;; +11D78;GUNJALA GONDI LETTER DA;Lo;0;L;;;;;N;;;;; +11D79;GUNJALA GONDI LETTER DHA;Lo;0;L;;;;;N;;;;; +11D7A;GUNJALA GONDI LETTER NA;Lo;0;L;;;;;N;;;;; +11D7B;GUNJALA GONDI LETTER CA;Lo;0;L;;;;;N;;;;; +11D7C;GUNJALA GONDI LETTER CHA;Lo;0;L;;;;;N;;;;; +11D7D;GUNJALA GONDI LETTER TTA;Lo;0;L;;;;;N;;;;; +11D7E;GUNJALA GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11D7F;GUNJALA GONDI LETTER LLA;Lo;0;L;;;;;N;;;;; +11D80;GUNJALA GONDI LETTER JA;Lo;0;L;;;;;N;;;;; +11D81;GUNJALA GONDI LETTER JHA;Lo;0;L;;;;;N;;;;; +11D82;GUNJALA GONDI LETTER DDA;Lo;0;L;;;;;N;;;;; +11D83;GUNJALA GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11D84;GUNJALA GONDI LETTER NGA;Lo;0;L;;;;;N;;;;; +11D85;GUNJALA GONDI LETTER PA;Lo;0;L;;;;;N;;;;; +11D86;GUNJALA GONDI LETTER PHA;Lo;0;L;;;;;N;;;;; +11D87;GUNJALA GONDI LETTER HA;Lo;0;L;;;;;N;;;;; +11D88;GUNJALA GONDI LETTER RA;Lo;0;L;;;;;N;;;;; +11D89;GUNJALA GONDI LETTER SA;Lo;0;L;;;;;N;;;;; +11D8A;GUNJALA GONDI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11D8B;GUNJALA GONDI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11D8C;GUNJALA GONDI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11D8D;GUNJALA GONDI VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11D8E;GUNJALA GONDI VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11D90;GUNJALA GONDI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +11D91;GUNJALA GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11D93;GUNJALA GONDI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +11D94;GUNJALA GONDI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11D95;GUNJALA GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11D96;GUNJALA GONDI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11D97;GUNJALA GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11D98;GUNJALA GONDI OM;Lo;0;L;;;;;N;;;;; +11DA0;GUNJALA GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11DA1;GUNJALA GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11DA2;GUNJALA GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11DA3;GUNJALA GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11DA4;GUNJALA GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11DA5;GUNJALA GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11DA6;GUNJALA GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11DA7;GUNJALA GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11DA8;GUNJALA GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11DA9;GUNJALA GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11DB0;TOLONG SIKI LETTER I;Lo;0;L;;;;;N;;;;; +11DB1;TOLONG SIKI LETTER E;Lo;0;L;;;;;N;;;;; +11DB2;TOLONG SIKI LETTER U;Lo;0;L;;;;;N;;;;; +11DB3;TOLONG SIKI LETTER O;Lo;0;L;;;;;N;;;;; +11DB4;TOLONG SIKI LETTER A;Lo;0;L;;;;;N;;;;; +11DB5;TOLONG SIKI LETTER AA;Lo;0;L;;;;;N;;;;; +11DB6;TOLONG SIKI LETTER P;Lo;0;L;;;;;N;;;;; +11DB7;TOLONG SIKI LETTER PH;Lo;0;L;;;;;N;;;;; +11DB8;TOLONG SIKI LETTER B;Lo;0;L;;;;;N;;;;; +11DB9;TOLONG SIKI LETTER BH;Lo;0;L;;;;;N;;;;; +11DBA;TOLONG SIKI LETTER M;Lo;0;L;;;;;N;;;;; +11DBB;TOLONG SIKI LETTER T;Lo;0;L;;;;;N;;;;; +11DBC;TOLONG SIKI LETTER TH;Lo;0;L;;;;;N;;;;; +11DBD;TOLONG SIKI LETTER D;Lo;0;L;;;;;N;;;;; +11DBE;TOLONG SIKI LETTER DH;Lo;0;L;;;;;N;;;;; +11DBF;TOLONG SIKI LETTER N;Lo;0;L;;;;;N;;;;; +11DC0;TOLONG SIKI LETTER TT;Lo;0;L;;;;;N;;;;; +11DC1;TOLONG SIKI LETTER TTH;Lo;0;L;;;;;N;;;;; +11DC2;TOLONG SIKI LETTER DD;Lo;0;L;;;;;N;;;;; +11DC3;TOLONG SIKI LETTER DDH;Lo;0;L;;;;;N;;;;; +11DC4;TOLONG SIKI LETTER NN;Lo;0;L;;;;;N;;;;; +11DC5;TOLONG SIKI LETTER C;Lo;0;L;;;;;N;;;;; +11DC6;TOLONG SIKI LETTER CH;Lo;0;L;;;;;N;;;;; +11DC7;TOLONG SIKI LETTER J;Lo;0;L;;;;;N;;;;; +11DC8;TOLONG SIKI LETTER JH;Lo;0;L;;;;;N;;;;; +11DC9;TOLONG SIKI LETTER NY;Lo;0;L;;;;;N;;;;; +11DCA;TOLONG SIKI LETTER K;Lo;0;L;;;;;N;;;;; +11DCB;TOLONG SIKI LETTER KH;Lo;0;L;;;;;N;;;;; +11DCC;TOLONG SIKI LETTER G;Lo;0;L;;;;;N;;;;; +11DCD;TOLONG SIKI LETTER GH;Lo;0;L;;;;;N;;;;; +11DCE;TOLONG SIKI LETTER NG;Lo;0;L;;;;;N;;;;; +11DCF;TOLONG SIKI LETTER Y;Lo;0;L;;;;;N;;;;; +11DD0;TOLONG SIKI LETTER R;Lo;0;L;;;;;N;;;;; +11DD1;TOLONG SIKI LETTER L;Lo;0;L;;;;;N;;;;; +11DD2;TOLONG SIKI LETTER V;Lo;0;L;;;;;N;;;;; +11DD3;TOLONG SIKI LETTER NNY;Lo;0;L;;;;;N;;;;; +11DD4;TOLONG SIKI LETTER S;Lo;0;L;;;;;N;;;;; +11DD5;TOLONG SIKI LETTER H;Lo;0;L;;;;;N;;;;; +11DD6;TOLONG SIKI LETTER X;Lo;0;L;;;;;N;;;;; +11DD7;TOLONG SIKI LETTER RR;Lo;0;L;;;;;N;;;;; +11DD8;TOLONG SIKI LETTER RRH;Lo;0;L;;;;;N;;;;; +11DD9;TOLONG SIKI SIGN SELA;Lm;0;L;;;;;N;;;;; +11DDA;TOLONG SIKI SIGN HECAKA;Lo;0;L;;;;;N;;;;; +11DDB;TOLONG SIKI UNGGA;Lo;0;L;;;;;N;;;;; +11DE0;TOLONG SIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11DE1;TOLONG SIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11DE2;TOLONG SIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11DE3;TOLONG SIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11DE4;TOLONG SIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11DE5;TOLONG SIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11DE6;TOLONG SIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11DE7;TOLONG SIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11DE8;TOLONG SIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11DE9;TOLONG SIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11EE0;MAKASAR LETTER KA;Lo;0;L;;;;;N;;;;; +11EE1;MAKASAR LETTER GA;Lo;0;L;;;;;N;;;;; +11EE2;MAKASAR LETTER NGA;Lo;0;L;;;;;N;;;;; +11EE3;MAKASAR LETTER PA;Lo;0;L;;;;;N;;;;; +11EE4;MAKASAR LETTER BA;Lo;0;L;;;;;N;;;;; +11EE5;MAKASAR LETTER MA;Lo;0;L;;;;;N;;;;; +11EE6;MAKASAR LETTER TA;Lo;0;L;;;;;N;;;;; +11EE7;MAKASAR LETTER DA;Lo;0;L;;;;;N;;;;; +11EE8;MAKASAR LETTER NA;Lo;0;L;;;;;N;;;;; +11EE9;MAKASAR LETTER CA;Lo;0;L;;;;;N;;;;; +11EEA;MAKASAR LETTER JA;Lo;0;L;;;;;N;;;;; +11EEB;MAKASAR LETTER NYA;Lo;0;L;;;;;N;;;;; +11EEC;MAKASAR LETTER YA;Lo;0;L;;;;;N;;;;; +11EED;MAKASAR LETTER RA;Lo;0;L;;;;;N;;;;; +11EEE;MAKASAR LETTER LA;Lo;0;L;;;;;N;;;;; +11EEF;MAKASAR LETTER VA;Lo;0;L;;;;;N;;;;; +11EF0;MAKASAR LETTER SA;Lo;0;L;;;;;N;;;;; +11EF1;MAKASAR LETTER A;Lo;0;L;;;;;N;;;;; +11EF2;MAKASAR ANGKA;Lo;0;L;;;;;N;;;;; +11EF3;MAKASAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11EF4;MAKASAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11EF5;MAKASAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11EF6;MAKASAR VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11EF7;MAKASAR PASSIMBANG;Po;0;L;;;;;N;;;;; +11EF8;MAKASAR END OF SECTION;Po;0;L;;;;;N;;;;; +11F00;KAWI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11F01;KAWI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11F02;KAWI SIGN REPHA;Lo;0;L;;;;;N;;;;; +11F03;KAWI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11F04;KAWI LETTER A;Lo;0;L;;;;;N;;;;; +11F05;KAWI LETTER AA;Lo;0;L;;;;;N;;;;; +11F06;KAWI LETTER I;Lo;0;L;;;;;N;;;;; +11F07;KAWI LETTER II;Lo;0;L;;;;;N;;;;; +11F08;KAWI LETTER U;Lo;0;L;;;;;N;;;;; +11F09;KAWI LETTER UU;Lo;0;L;;;;;N;;;;; +11F0A;KAWI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11F0B;KAWI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11F0C;KAWI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11F0D;KAWI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +11F0E;KAWI LETTER E;Lo;0;L;;;;;N;;;;; +11F0F;KAWI LETTER AI;Lo;0;L;;;;;N;;;;; +11F10;KAWI LETTER O;Lo;0;L;;;;;N;;;;; +11F12;KAWI LETTER KA;Lo;0;L;;;;;N;;;;; +11F13;KAWI LETTER KHA;Lo;0;L;;;;;N;;;;; +11F14;KAWI LETTER GA;Lo;0;L;;;;;N;;;;; +11F15;KAWI LETTER GHA;Lo;0;L;;;;;N;;;;; +11F16;KAWI LETTER NGA;Lo;0;L;;;;;N;;;;; +11F17;KAWI LETTER CA;Lo;0;L;;;;;N;;;;; +11F18;KAWI LETTER CHA;Lo;0;L;;;;;N;;;;; +11F19;KAWI LETTER JA;Lo;0;L;;;;;N;;;;; +11F1A;KAWI LETTER JHA;Lo;0;L;;;;;N;;;;; +11F1B;KAWI LETTER NYA;Lo;0;L;;;;;N;;;;; +11F1C;KAWI LETTER TTA;Lo;0;L;;;;;N;;;;; +11F1D;KAWI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11F1E;KAWI LETTER DDA;Lo;0;L;;;;;N;;;;; +11F1F;KAWI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11F20;KAWI LETTER NNA;Lo;0;L;;;;;N;;;;; +11F21;KAWI LETTER TA;Lo;0;L;;;;;N;;;;; +11F22;KAWI LETTER THA;Lo;0;L;;;;;N;;;;; +11F23;KAWI LETTER DA;Lo;0;L;;;;;N;;;;; +11F24;KAWI LETTER DHA;Lo;0;L;;;;;N;;;;; +11F25;KAWI LETTER NA;Lo;0;L;;;;;N;;;;; +11F26;KAWI LETTER PA;Lo;0;L;;;;;N;;;;; +11F27;KAWI LETTER PHA;Lo;0;L;;;;;N;;;;; +11F28;KAWI LETTER BA;Lo;0;L;;;;;N;;;;; +11F29;KAWI LETTER BHA;Lo;0;L;;;;;N;;;;; +11F2A;KAWI LETTER MA;Lo;0;L;;;;;N;;;;; +11F2B;KAWI LETTER YA;Lo;0;L;;;;;N;;;;; +11F2C;KAWI LETTER RA;Lo;0;L;;;;;N;;;;; +11F2D;KAWI LETTER LA;Lo;0;L;;;;;N;;;;; +11F2E;KAWI LETTER WA;Lo;0;L;;;;;N;;;;; +11F2F;KAWI LETTER SHA;Lo;0;L;;;;;N;;;;; +11F30;KAWI LETTER SSA;Lo;0;L;;;;;N;;;;; +11F31;KAWI LETTER SA;Lo;0;L;;;;;N;;;;; +11F32;KAWI LETTER HA;Lo;0;L;;;;;N;;;;; +11F33;KAWI LETTER JNYA;Lo;0;L;;;;;N;;;;; +11F34;KAWI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11F35;KAWI VOWEL SIGN ALTERNATE AA;Mc;0;L;;;;;N;;;;; +11F36;KAWI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11F37;KAWI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11F38;KAWI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11F39;KAWI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11F3A;KAWI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11F3E;KAWI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11F3F;KAWI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11F40;KAWI VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +11F41;KAWI SIGN KILLER;Mc;9;L;;;;;N;;;;; +11F42;KAWI CONJOINER;Mn;9;NSM;;;;;N;;;;; +11F43;KAWI DANDA;Po;0;L;;;;;N;;;;; +11F44;KAWI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11F45;KAWI PUNCTUATION SECTION MARKER;Po;0;L;;;;;N;;;;; +11F46;KAWI PUNCTUATION ALTERNATE SECTION MARKER;Po;0;L;;;;;N;;;;; +11F47;KAWI PUNCTUATION FLOWER;Po;0;L;;;;;N;;;;; +11F48;KAWI PUNCTUATION SPACE FILLER;Po;0;L;;;;;N;;;;; +11F49;KAWI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; +11F4A;KAWI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; +11F4B;KAWI PUNCTUATION TRIPLE DOT;Po;0;L;;;;;N;;;;; +11F4C;KAWI PUNCTUATION CIRCLE;Po;0;L;;;;;N;;;;; +11F4D;KAWI PUNCTUATION FILLED CIRCLE;Po;0;L;;;;;N;;;;; +11F4E;KAWI PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +11F4F;KAWI PUNCTUATION CLOSING SPIRAL;Po;0;L;;;;;N;;;;; +11F50;KAWI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11F51;KAWI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11F52;KAWI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11F53;KAWI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11F54;KAWI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11F55;KAWI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11F56;KAWI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11F57;KAWI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11F58;KAWI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11F59;KAWI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11F5A;KAWI SIGN NUKTA;Mn;0;NSM;;;;;N;;;;; +11FB0;LISU LETTER YHA;Lo;0;L;;;;;N;;;;; +11FC0;TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH;No;0;L;;;;1/320;N;;;;; +11FC1;TAMIL FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;; +11FC2;TAMIL FRACTION ONE EIGHTIETH;No;0;L;;;;1/80;N;;;;; +11FC3;TAMIL FRACTION ONE SIXTY-FOURTH;No;0;L;;;;1/64;N;;;;; +11FC4;TAMIL FRACTION ONE FORTIETH;No;0;L;;;;1/40;N;;;;; +11FC5;TAMIL FRACTION ONE THIRTY-SECOND;No;0;L;;;;1/32;N;;;;; +11FC6;TAMIL FRACTION THREE EIGHTIETHS;No;0;L;;;;3/80;N;;;;; +11FC7;TAMIL FRACTION THREE SIXTY-FOURTHS;No;0;L;;;;3/64;N;;;;; +11FC8;TAMIL FRACTION ONE TWENTIETH;No;0;L;;;;1/20;N;;;;; +11FC9;TAMIL FRACTION ONE SIXTEENTH-1;No;0;L;;;;1/16;N;;;;; +11FCA;TAMIL FRACTION ONE SIXTEENTH-2;No;0;L;;;;1/16;N;;;;; +11FCB;TAMIL FRACTION ONE TENTH;No;0;L;;;;1/10;N;;;;; +11FCC;TAMIL FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +11FCD;TAMIL FRACTION THREE TWENTIETHS;No;0;L;;;;3/20;N;;;;; +11FCE;TAMIL FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +11FCF;TAMIL FRACTION ONE FIFTH;No;0;L;;;;1/5;N;;;;; +11FD0;TAMIL FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +11FD1;TAMIL FRACTION ONE HALF-1;No;0;L;;;;1/2;N;;;;; +11FD2;TAMIL FRACTION ONE HALF-2;No;0;L;;;;1/2;N;;;;; +11FD3;TAMIL FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +11FD4;TAMIL FRACTION DOWNSCALING FACTOR KIIZH;No;0;L;;;;1/320;N;;;;; +11FD5;TAMIL SIGN NEL;So;0;ON;;;;;N;;;;; +11FD6;TAMIL SIGN CEVITU;So;0;ON;;;;;N;;;;; +11FD7;TAMIL SIGN AAZHAAKKU;So;0;ON;;;;;N;;;;; +11FD8;TAMIL SIGN UZHAKKU;So;0;ON;;;;;N;;;;; +11FD9;TAMIL SIGN MUUVUZHAKKU;So;0;ON;;;;;N;;;;; +11FDA;TAMIL SIGN KURUNI;So;0;ON;;;;;N;;;;; +11FDB;TAMIL SIGN PATHAKKU;So;0;ON;;;;;N;;;;; +11FDC;TAMIL SIGN MUKKURUNI;So;0;ON;;;;;N;;;;; +11FDD;TAMIL SIGN KAACU;Sc;0;ET;;;;;N;;;;; +11FDE;TAMIL SIGN PANAM;Sc;0;ET;;;;;N;;;;; +11FDF;TAMIL SIGN PON;Sc;0;ET;;;;;N;;;;; +11FE0;TAMIL SIGN VARAAKAN;Sc;0;ET;;;;;N;;;;; +11FE1;TAMIL SIGN PAARAM;So;0;ON;;;;;N;;;;; +11FE2;TAMIL SIGN KUZHI;So;0;ON;;;;;N;;;;; +11FE3;TAMIL SIGN VELI;So;0;ON;;;;;N;;;;; +11FE4;TAMIL WET CULTIVATION SIGN;So;0;ON;;;;;N;;;;; +11FE5;TAMIL DRY CULTIVATION SIGN;So;0;ON;;;;;N;;;;; +11FE6;TAMIL LAND SIGN;So;0;ON;;;;;N;;;;; +11FE7;TAMIL SALT PAN SIGN;So;0;ON;;;;;N;;;;; +11FE8;TAMIL TRADITIONAL CREDIT SIGN;So;0;ON;;;;;N;;;;; +11FE9;TAMIL TRADITIONAL NUMBER SIGN;So;0;ON;;;;;N;;;;; +11FEA;TAMIL CURRENT SIGN;So;0;ON;;;;;N;;;;; +11FEB;TAMIL AND ODD SIGN;So;0;ON;;;;;N;;;;; +11FEC;TAMIL SPENT SIGN;So;0;ON;;;;;N;;;;; +11FED;TAMIL TOTAL SIGN;So;0;ON;;;;;N;;;;; +11FEE;TAMIL IN POSSESSION SIGN;So;0;ON;;;;;N;;;;; +11FEF;TAMIL STARTING FROM SIGN;So;0;ON;;;;;N;;;;; +11FF0;TAMIL SIGN MUTHALIYA;So;0;ON;;;;;N;;;;; +11FF1;TAMIL SIGN VAKAIYARAA;So;0;ON;;;;;N;;;;; +11FFF;TAMIL PUNCTUATION END OF TEXT;Po;0;L;;;;;N;;;;; +12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; +12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; +12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; +12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; +12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; +12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; +12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; +12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; +12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; +1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; +1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; +1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; +1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; +12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; +12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; +12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; +12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; +12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; +12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; +1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; +1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; +1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; +1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; +12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; +12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; +12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; +12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; +12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; +12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; +12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; +12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; +12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; +12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; +1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; +1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; +1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; +1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; +1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; +1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; +12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; +12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; +12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; +12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; +12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; +12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; +12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; +12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; +12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;1;N;;;;; +12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;1;N;;;;; +1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; +1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; +1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; +1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; +12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; +12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; +12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; +12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; +12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; +12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; +12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; +12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; +12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; +12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; +1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; +1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; +1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; +1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; +1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; +12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; +12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; +12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; +12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; +12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; +12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; +12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; +12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; +12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; +12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; +1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; +1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; +1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; +1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; +1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; +12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; +12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; +12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; +12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; +12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; +12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; +12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; +12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; +12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; +12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; +1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; +1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; +1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; +1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; +12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; +12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; +12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; +12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; +12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; +12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; +12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; +12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; +12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;1;N;;;;; +1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; +1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; +1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; +1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; +1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; +1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; +12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; +12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; +12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; +12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; +12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; +12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; +12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; +12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; +12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; +1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; +1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; +1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; +1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; +1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; +12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; +12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; +12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; +12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; +12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; +12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; +12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; +12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; +12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; +12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; +1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; +1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; +1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; +1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; +1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; +120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; +120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; +120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; +120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; +120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; +120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; +120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; +120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; +120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; +120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; +120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; +120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; +120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; +120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; +120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; +120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; +120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; +120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; +120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; +120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; +120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; +120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; +120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; +120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; +120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; +120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; +120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; +120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; +120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; +120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; +120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; +120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; +120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; +120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; +120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; +120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; +120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; +120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; +120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; +120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; +120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; +120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; +120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; +120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; +120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; +120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; +120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; +120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; +120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; +120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; +120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; +120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; +120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; +120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; +120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; +120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; +120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; +120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; +120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; +120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; +120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; +120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; +120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; +120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; +120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; +120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; +120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; +120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; +120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; +120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; +120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; +120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; +120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; +120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; +12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; +12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; +12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; +12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; +12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; +12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; +12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; +12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; +12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; +12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; +1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; +1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; +1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; +1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; +12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; +12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; +12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; +12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; +12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; +12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; +12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; +12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; +1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; +1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; +1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; +1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; +12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; +12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; +12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; +12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; +12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; +12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; +12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; +12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; +12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; +12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; +1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; +1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; +1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; +1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; +1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; +1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; +12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; +12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; +12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; +12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; +12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; +12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; +12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; +12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; +1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; +1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; +1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; +1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; +12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; +12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; +12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; +12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; +12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; +12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; +12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; +12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; +12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; +12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; +1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; +1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; +1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; +1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; +1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; +12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; +12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; +12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; +12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; +12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; +12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; +12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; +12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; +12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; +12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; +1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; +1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; +1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; +1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; +1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; +1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; +12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; +12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; +12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; +12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; +12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; +12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; +12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; +12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; +1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; +1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; +1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; +1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; +1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; +12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; +12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; +12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; +12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; +12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; +12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; +12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; +12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; +12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; +12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; +1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; +1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; +1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; +1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; +1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; +1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; +12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; +12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; +12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; +12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; +12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; +12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; +12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; +12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; +12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; +12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; +1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; +1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; +1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; +1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; +1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; +12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; +12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; +12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; +12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; +12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; +12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; +12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; +12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; +12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; +1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; +1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; +1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; +1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; +121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; +121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; +121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; +121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; +121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; +121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; +121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; +121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; +121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; +121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; +121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; +121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; +121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; +121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; +121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; +121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; +121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; +121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; +121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; +121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; +121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; +121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; +121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; +121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; +121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; +121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; +121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; +121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; +121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; +121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; +121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; +121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; +121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; +121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; +121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; +121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; +121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; +121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; +121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; +121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; +121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; +121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; +121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; +121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; +121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; +121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; +121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; +121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; +121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; +121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; +121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; +121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; +121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; +121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; +121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; +121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; +121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; +121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; +121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; +121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; +121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; +121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; +121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; +121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; +121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; +121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; +121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; +121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; +121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; +121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; +121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; +121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; +121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; +121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; +121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; +121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; +121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; +121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; +121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; +121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; +121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; +12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; +12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; +12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; +12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; +12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; +12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; +12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; +1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; +1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; +1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; +1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; +12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; +12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; +12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; +12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; +12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; +12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; +12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; +12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; +12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; +12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; +1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; +1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; +1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; +1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; +1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; +1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; +12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; +12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; +12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; +12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; +12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;1/2;N;;;;; +12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; +12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; +12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; +1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; +1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;2;N;;;;; +1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; +1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; +1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; +1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; +12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; +12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; +12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; +12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; +12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; +12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; +12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; +12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; +12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; +1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; +1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; +1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; +1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; +1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; +1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; +12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; +12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; +12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; +12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; +12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; +12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; +12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; +12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; +12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; +12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; +1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; +1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; +1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; +1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; +1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; +1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; +12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; +12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; +12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; +12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; +1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; +1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; +12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; +12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; +12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; +12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; +12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; +12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; +12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; +12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; +1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; +1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; +1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; +1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; +12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; +12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; +12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; +12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; +12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; +12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; +1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; +1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; +1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; +1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; +1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; +1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; +12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; +12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; +12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; +12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; +12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; +12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; +12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; +12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; +12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; +12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; +1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; +1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; +1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; +1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; +1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; +1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; +12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; +12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; +12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; +12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; +12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; +12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; +12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; +12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; +12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; +12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; +1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; +1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; +1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; +1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; +1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; +122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; +122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; +122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; +122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; +122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; +122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; +122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; +122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; +122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; +122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; +122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; +122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; +122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; +122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; +122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; +122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; +122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; +122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; +122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; +122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; +122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; +122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; +122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; +122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; +122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; +122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; +122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; +122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; +122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; +122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; +122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; +122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; +122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; +122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; +122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; +122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; +122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; +122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; +122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; +122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; +122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; +122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; +122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; +122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; +122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; +122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; +122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; +122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; +122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; +122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; +122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; +122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; +122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; +122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; +122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; +122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; +122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; +122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; +122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; +122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; +122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; +122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; +122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; +122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; +122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; +122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; +122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; +122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; +122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; +122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; +122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; +122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; +122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; +122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; +122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; +122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; +122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; +122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; +122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; +122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; +122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; +122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; +122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; +122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; +122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; +122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; +122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; +122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; +122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; +122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; +122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; +12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; +12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; +12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; +12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; +12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; +12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; +12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; +12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; +12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; +1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; +1230B;CUNEIFORM SIGN U;Lo;0;L;;;;1;N;;;;; +1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; +1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;3;N;;;;; +1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; +1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; +12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; +12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; +12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; +12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; +12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; +12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; +12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; +12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; +12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; +1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; +1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; +1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; +1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; +12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; +12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; +12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; +12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; +12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; +12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; +12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; +12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; +12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; +1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; +1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; +1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; +1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; +12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; +12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; +12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; +12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; +12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; +12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; +12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; +12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; +12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; +1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; +1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; +1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; +1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; +12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; +12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; +12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; +12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; +12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; +12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; +12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; +12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; +12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; +12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; +1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; +1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; +1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; +1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; +1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; +1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; +12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; +12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; +12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; +12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; +12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; +12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; +12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; +12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; +12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; +1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; +1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; +1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; +1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; +1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; +12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; +12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; +12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; +12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; +12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; +12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; +12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; +12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; +12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; +12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; +1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; +1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; +1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; +1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; +1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; +1236F;CUNEIFORM SIGN KAP ELAMITE;Lo;0;L;;;;;N;;;;; +12370;CUNEIFORM SIGN AB TIMES NUN;Lo;0;L;;;;;N;;;;; +12371;CUNEIFORM SIGN AB2 TIMES A;Lo;0;L;;;;;N;;;;; +12372;CUNEIFORM SIGN AMAR TIMES KUG;Lo;0;L;;;;;N;;;;; +12373;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH;Lo;0;L;;;;;N;;;;; +12374;CUNEIFORM SIGN DAG3;Lo;0;L;;;;;N;;;;; +12375;CUNEIFORM SIGN DISH PLUS SHU;Lo;0;L;;;;;N;;;;; +12376;CUNEIFORM SIGN DUB TIMES SHE;Lo;0;L;;;;;N;;;;; +12377;CUNEIFORM SIGN EZEN TIMES GUD;Lo;0;L;;;;;N;;;;; +12378;CUNEIFORM SIGN EZEN TIMES SHE;Lo;0;L;;;;;N;;;;; +12379;CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A;Lo;0;L;;;;;N;;;;; +1237A;CUNEIFORM SIGN GA2 TIMES ASH2;Lo;0;L;;;;;N;;;;; +1237B;CUNEIFORM SIGN GE22;Lo;0;L;;;;;N;;;;; +1237C;CUNEIFORM SIGN GIG;Lo;0;L;;;;;N;;;;; +1237D;CUNEIFORM SIGN HUSH;Lo;0;L;;;;;N;;;;; +1237E;CUNEIFORM SIGN KA TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1237F;CUNEIFORM SIGN KA TIMES ASH3;Lo;0;L;;;;;N;;;;; +12380;CUNEIFORM SIGN KA TIMES GISH;Lo;0;L;;;;;N;;;;; +12381;CUNEIFORM SIGN KA TIMES GUD;Lo;0;L;;;;;N;;;;; +12382;CUNEIFORM SIGN KA TIMES HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12383;CUNEIFORM SIGN KA TIMES LUM;Lo;0;L;;;;;N;;;;; +12384;CUNEIFORM SIGN KA TIMES PA;Lo;0;L;;;;;N;;;;; +12385;CUNEIFORM SIGN KA TIMES SHUL;Lo;0;L;;;;;N;;;;; +12386;CUNEIFORM SIGN KA TIMES TU;Lo;0;L;;;;;N;;;;; +12387;CUNEIFORM SIGN KA TIMES UR2;Lo;0;L;;;;;N;;;;; +12388;CUNEIFORM SIGN LAGAB TIMES GI;Lo;0;L;;;;;N;;;;; +12389;CUNEIFORM SIGN LU2 SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1238A;CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL;Lo;0;L;;;;;N;;;;; +1238B;CUNEIFORM SIGN LU2 TIMES SHU;Lo;0;L;;;;;N;;;;; +1238C;CUNEIFORM SIGN MESH;Lo;0;L;;;;;N;;;;; +1238D;CUNEIFORM SIGN MUSH3 TIMES ZA;Lo;0;L;;;;;N;;;;; +1238E;CUNEIFORM SIGN NA4;Lo;0;L;;;;;N;;;;; +1238F;CUNEIFORM SIGN NIN;Lo;0;L;;;;;N;;;;; +12390;CUNEIFORM SIGN NIN9;Lo;0;L;;;;;N;;;;; +12391;CUNEIFORM SIGN NINDA2 TIMES BAL;Lo;0;L;;;;;N;;;;; +12392;CUNEIFORM SIGN NINDA2 TIMES GI;Lo;0;L;;;;;N;;;;; +12393;CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +12394;CUNEIFORM SIGN PESH2 ASTERISK;Lo;0;L;;;;;N;;;;; +12395;CUNEIFORM SIGN PIR2;Lo;0;L;;;;;N;;;;; +12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; +12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; +12399;CUNEIFORM SIGN U U;Lo;0;L;;;;2;N;;;;; +12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; +12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; +12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; +12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; +12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; +12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; +12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; +12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; +12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; +12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; +1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; +1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; +1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; +1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; +1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; +1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; +12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; +12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; +12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; +12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; +12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; +12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; +12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; +12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; +12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; +12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; +1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; +1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; +1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; +1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; +1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; +1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; +12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; +12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; +12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; +12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; +12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; +12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; +12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; +12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; +12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; +1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; +1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; +1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; +1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; +1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; +1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; +12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; +12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;; +12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;N;;;;; +12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; +12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; +12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; +12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; +12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; +1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; +1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; +1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; +1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; +1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; +1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; +12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; +12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; +12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; +12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; +12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; +12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; +12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; +12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; +12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; +12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; +1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; +1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; +1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; +1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; +1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; +1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; +12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; +12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; +12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; +12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; +12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; +12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; +12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;2;N;;;;; +12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;3;N;;;;; +12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; +12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; +1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; +1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; +1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; +1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; +1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; +1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; +12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; +12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; +12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; +12463;CUNEIFORM NUMERIC SIGN ONE QUARTER GUR;Nl;0;L;;;;1/4;N;;;;; +12464;CUNEIFORM NUMERIC SIGN ONE HALF GUR;Nl;0;L;;;;1/2;N;;;;; +12465;CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD;Nl;0;L;;;;1/3;N;;;;; +12466;CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS;Nl;0;L;;;;2/3;N;;;;; +12467;CUNEIFORM NUMERIC SIGN ELAMITE FORTY;Nl;0;L;;;;40;N;;;;; +12468;CUNEIFORM NUMERIC SIGN ELAMITE FIFTY;Nl;0;L;;;;50;N;;;;; +12469;CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM;Nl;0;L;;;;4;N;;;;; +1246A;CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM;Nl;0;L;;;;5;N;;;;; +1246B;CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM;Nl;0;L;;;;6;N;;;;; +1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;; +1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;; +1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;; +12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; +12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; +12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; +12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; +12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;; +12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;; +12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;; +12483;CUNEIFORM SIGN BAD TIMES DISH TENU;Lo;0;L;;;;;N;;;;; +12484;CUNEIFORM SIGN BAHAR2 TIMES AB2;Lo;0;L;;;;;N;;;;; +12485;CUNEIFORM SIGN BAHAR2 TIMES NI;Lo;0;L;;;;;N;;;;; +12486;CUNEIFORM SIGN BAHAR2 TIMES ZA;Lo;0;L;;;;;N;;;;; +12487;CUNEIFORM SIGN BU OVER BU TIMES NA2;Lo;0;L;;;;;N;;;;; +12488;CUNEIFORM SIGN DA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12489;CUNEIFORM SIGN DAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1248A;CUNEIFORM SIGN DIM TIMES IGI;Lo;0;L;;;;;N;;;;; +1248B;CUNEIFORM SIGN DIM TIMES U U U;Lo;0;L;;;;;N;;;;; +1248C;CUNEIFORM SIGN DIM2 TIMES UD;Lo;0;L;;;;;N;;;;; +1248D;CUNEIFORM SIGN DUG TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1248E;CUNEIFORM SIGN DUG TIMES ASH;Lo;0;L;;;;;N;;;;; +1248F;CUNEIFORM SIGN DUG TIMES ASH AT LEFT;Lo;0;L;;;;;N;;;;; +12490;CUNEIFORM SIGN DUG TIMES DIN;Lo;0;L;;;;;N;;;;; +12491;CUNEIFORM SIGN DUG TIMES DUN;Lo;0;L;;;;;N;;;;; +12492;CUNEIFORM SIGN DUG TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12493;CUNEIFORM SIGN DUG TIMES GA;Lo;0;L;;;;;N;;;;; +12494;CUNEIFORM SIGN DUG TIMES GI;Lo;0;L;;;;;N;;;;; +12495;CUNEIFORM SIGN DUG TIMES GIR2 GUNU;Lo;0;L;;;;;N;;;;; +12496;CUNEIFORM SIGN DUG TIMES GISH;Lo;0;L;;;;;N;;;;; +12497;CUNEIFORM SIGN DUG TIMES HA;Lo;0;L;;;;;N;;;;; +12498;CUNEIFORM SIGN DUG TIMES HI;Lo;0;L;;;;;N;;;;; +12499;CUNEIFORM SIGN DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1249A;CUNEIFORM SIGN DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1249B;CUNEIFORM SIGN DUG TIMES KUR;Lo;0;L;;;;;N;;;;; +1249C;CUNEIFORM SIGN DUG TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +1249D;CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +1249E;CUNEIFORM SIGN DUG TIMES LAK-020;Lo;0;L;;;;;N;;;;; +1249F;CUNEIFORM SIGN DUG TIMES LAM;Lo;0;L;;;;;N;;;;; +124A0;CUNEIFORM SIGN DUG TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124A1;CUNEIFORM SIGN DUG TIMES LUH PLUS GISH;Lo;0;L;;;;;N;;;;; +124A2;CUNEIFORM SIGN DUG TIMES MASH;Lo;0;L;;;;;N;;;;; +124A3;CUNEIFORM SIGN DUG TIMES MES;Lo;0;L;;;;;N;;;;; +124A4;CUNEIFORM SIGN DUG TIMES MI;Lo;0;L;;;;;N;;;;; +124A5;CUNEIFORM SIGN DUG TIMES NI;Lo;0;L;;;;;N;;;;; +124A6;CUNEIFORM SIGN DUG TIMES PI;Lo;0;L;;;;;N;;;;; +124A7;CUNEIFORM SIGN DUG TIMES SHE;Lo;0;L;;;;;N;;;;; +124A8;CUNEIFORM SIGN DUG TIMES SI GUNU;Lo;0;L;;;;;N;;;;; +124A9;CUNEIFORM SIGN E2 TIMES KUR;Lo;0;L;;;;;N;;;;; +124AA;CUNEIFORM SIGN E2 TIMES PAP;Lo;0;L;;;;;N;;;;; +124AB;CUNEIFORM SIGN ERIN2 X;Lo;0;L;;;;;N;;;;; +124AC;CUNEIFORM SIGN ESH2 CROSSING ESH2;Lo;0;L;;;;;N;;;;; +124AD;CUNEIFORM SIGN EZEN SHESHIG TIMES ASH;Lo;0;L;;;;;N;;;;; +124AE;CUNEIFORM SIGN EZEN SHESHIG TIMES HI;Lo;0;L;;;;;N;;;;; +124AF;CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B0;CUNEIFORM SIGN EZEN SHESHIG TIMES LA;Lo;0;L;;;;;N;;;;; +124B1;CUNEIFORM SIGN EZEN SHESHIG TIMES LAL;Lo;0;L;;;;;N;;;;; +124B2;CUNEIFORM SIGN EZEN SHESHIG TIMES ME;Lo;0;L;;;;;N;;;;; +124B3;CUNEIFORM SIGN EZEN SHESHIG TIMES MES;Lo;0;L;;;;;N;;;;; +124B4;CUNEIFORM SIGN EZEN SHESHIG TIMES SU;Lo;0;L;;;;;N;;;;; +124B5;CUNEIFORM SIGN EZEN TIMES SU;Lo;0;L;;;;;N;;;;; +124B6;CUNEIFORM SIGN GA2 TIMES BAHAR2;Lo;0;L;;;;;N;;;;; +124B7;CUNEIFORM SIGN GA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +124B8;CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B9;CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +124BA;CUNEIFORM SIGN GA2 TIMES EREN;Lo;0;L;;;;;N;;;;; +124BB;CUNEIFORM SIGN GA2 TIMES GA;Lo;0;L;;;;;N;;;;; +124BC;CUNEIFORM SIGN GA2 TIMES GAR PLUS DI;Lo;0;L;;;;;N;;;;; +124BD;CUNEIFORM SIGN GA2 TIMES GAR PLUS NE;Lo;0;L;;;;;N;;;;; +124BE;CUNEIFORM SIGN GA2 TIMES HA PLUS A;Lo;0;L;;;;;N;;;;; +124BF;CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +124C0;CUNEIFORM SIGN GA2 TIMES LAM;Lo;0;L;;;;;N;;;;; +124C1;CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124C2;CUNEIFORM SIGN GA2 TIMES LUH;Lo;0;L;;;;;N;;;;; +124C3;CUNEIFORM SIGN GA2 TIMES MUSH;Lo;0;L;;;;;N;;;;; +124C4;CUNEIFORM SIGN GA2 TIMES NE;Lo;0;L;;;;;N;;;;; +124C5;CUNEIFORM SIGN GA2 TIMES NE PLUS E2;Lo;0;L;;;;;N;;;;; +124C6;CUNEIFORM SIGN GA2 TIMES NE PLUS GI;Lo;0;L;;;;;N;;;;; +124C7;CUNEIFORM SIGN GA2 TIMES SHIM;Lo;0;L;;;;;N;;;;; +124C8;CUNEIFORM SIGN GA2 TIMES ZIZ2;Lo;0;L;;;;;N;;;;; +124C9;CUNEIFORM SIGN GABA ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +124CA;CUNEIFORM SIGN GESHTIN TIMES U;Lo;0;L;;;;;N;;;;; +124CB;CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +124CC;CUNEIFORM SIGN GU2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124CD;CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +124CE;CUNEIFORM SIGN HA TENU GUNU;Lo;0;L;;;;;N;;;;; +124CF;CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH;Lo;0;L;;;;;N;;;;; +124D0;CUNEIFORM SIGN KA TIMES BU;Lo;0;L;;;;;N;;;;; +124D1;CUNEIFORM SIGN KA TIMES KA;Lo;0;L;;;;;N;;;;; +124D2;CUNEIFORM SIGN KA TIMES U U U;Lo;0;L;;;;;N;;;;; +124D3;CUNEIFORM SIGN KA TIMES UR;Lo;0;L;;;;;N;;;;; +124D4;CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU;Lo;0;L;;;;;N;;;;; +124D5;CUNEIFORM SIGN LAK-003;Lo;0;L;;;;;N;;;;; +124D6;CUNEIFORM SIGN LAK-021;Lo;0;L;;;;;N;;;;; +124D7;CUNEIFORM SIGN LAK-025;Lo;0;L;;;;;N;;;;; +124D8;CUNEIFORM SIGN LAK-030;Lo;0;L;;;;;N;;;;; +124D9;CUNEIFORM SIGN LAK-050;Lo;0;L;;;;;N;;;;; +124DA;CUNEIFORM SIGN LAK-051;Lo;0;L;;;;;N;;;;; +124DB;CUNEIFORM SIGN LAK-062;Lo;0;L;;;;;N;;;;; +124DC;CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU;Lo;0;L;;;;;N;;;;; +124DD;CUNEIFORM SIGN LAK-080;Lo;0;L;;;;;N;;;;; +124DE;CUNEIFORM SIGN LAK-081 OVER LAK-081;Lo;0;L;;;;;N;;;;; +124DF;CUNEIFORM SIGN LAK-092;Lo;0;L;;;;;N;;;;; +124E0;CUNEIFORM SIGN LAK-130;Lo;0;L;;;;;N;;;;; +124E1;CUNEIFORM SIGN LAK-142;Lo;0;L;;;;;N;;;;; +124E2;CUNEIFORM SIGN LAK-210;Lo;0;L;;;;;N;;;;; +124E3;CUNEIFORM SIGN LAK-219;Lo;0;L;;;;;N;;;;; +124E4;CUNEIFORM SIGN LAK-220;Lo;0;L;;;;;N;;;;; +124E5;CUNEIFORM SIGN LAK-225;Lo;0;L;;;;;N;;;;; +124E6;CUNEIFORM SIGN LAK-228;Lo;0;L;;;;;N;;;;; +124E7;CUNEIFORM SIGN LAK-238;Lo;0;L;;;;;N;;;;; +124E8;CUNEIFORM SIGN LAK-265;Lo;0;L;;;;;N;;;;; +124E9;CUNEIFORM SIGN LAK-266;Lo;0;L;;;;;N;;;;; +124EA;CUNEIFORM SIGN LAK-343;Lo;0;L;;;;;N;;;;; +124EB;CUNEIFORM SIGN LAK-347;Lo;0;L;;;;;N;;;;; +124EC;CUNEIFORM SIGN LAK-348;Lo;0;L;;;;;N;;;;; +124ED;CUNEIFORM SIGN LAK-383;Lo;0;L;;;;;N;;;;; +124EE;CUNEIFORM SIGN LAK-384;Lo;0;L;;;;;N;;;;; +124EF;CUNEIFORM SIGN LAK-390;Lo;0;L;;;;;N;;;;; +124F0;CUNEIFORM SIGN LAK-441;Lo;0;L;;;;;N;;;;; +124F1;CUNEIFORM SIGN LAK-449;Lo;0;L;;;;;N;;;;; +124F2;CUNEIFORM SIGN LAK-449 TIMES GU;Lo;0;L;;;;;N;;;;; +124F3;CUNEIFORM SIGN LAK-449 TIMES IGI;Lo;0;L;;;;;N;;;;; +124F4;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F5;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F6;CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA;Lo;0;L;;;;;N;;;;; +124F7;CUNEIFORM SIGN LAK-450;Lo;0;L;;;;;N;;;;; +124F8;CUNEIFORM SIGN LAK-457;Lo;0;L;;;;;N;;;;; +124F9;CUNEIFORM SIGN LAK-470;Lo;0;L;;;;;N;;;;; +124FA;CUNEIFORM SIGN LAK-483;Lo;0;L;;;;;N;;;;; +124FB;CUNEIFORM SIGN LAK-490;Lo;0;L;;;;;N;;;;; +124FC;CUNEIFORM SIGN LAK-492;Lo;0;L;;;;;N;;;;; +124FD;CUNEIFORM SIGN LAK-493;Lo;0;L;;;;;N;;;;; +124FE;CUNEIFORM SIGN LAK-495;Lo;0;L;;;;;N;;;;; +124FF;CUNEIFORM SIGN LAK-550;Lo;0;L;;;;;N;;;;; +12500;CUNEIFORM SIGN LAK-608;Lo;0;L;;;;;N;;;;; +12501;CUNEIFORM SIGN LAK-617;Lo;0;L;;;;;N;;;;; +12502;CUNEIFORM SIGN LAK-617 TIMES ASH;Lo;0;L;;;;;N;;;;; +12503;CUNEIFORM SIGN LAK-617 TIMES BAD;Lo;0;L;;;;;N;;;;; +12504;CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12505;CUNEIFORM SIGN LAK-617 TIMES KU3;Lo;0;L;;;;;N;;;;; +12506;CUNEIFORM SIGN LAK-617 TIMES LA;Lo;0;L;;;;;N;;;;; +12507;CUNEIFORM SIGN LAK-617 TIMES TAR;Lo;0;L;;;;;N;;;;; +12508;CUNEIFORM SIGN LAK-617 TIMES TE;Lo;0;L;;;;;N;;;;; +12509;CUNEIFORM SIGN LAK-617 TIMES U2;Lo;0;L;;;;;N;;;;; +1250A;CUNEIFORM SIGN LAK-617 TIMES UD;Lo;0;L;;;;;N;;;;; +1250B;CUNEIFORM SIGN LAK-617 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1250C;CUNEIFORM SIGN LAK-636;Lo;0;L;;;;;N;;;;; +1250D;CUNEIFORM SIGN LAK-648;Lo;0;L;;;;;N;;;;; +1250E;CUNEIFORM SIGN LAK-648 TIMES DUB;Lo;0;L;;;;;N;;;;; +1250F;CUNEIFORM SIGN LAK-648 TIMES GA;Lo;0;L;;;;;N;;;;; +12510;CUNEIFORM SIGN LAK-648 TIMES IGI;Lo;0;L;;;;;N;;;;; +12511;CUNEIFORM SIGN LAK-648 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12512;CUNEIFORM SIGN LAK-648 TIMES NI;Lo;0;L;;;;;N;;;;; +12513;CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +12514;CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI;Lo;0;L;;;;;N;;;;; +12515;CUNEIFORM SIGN LAK-648 TIMES UD;Lo;0;L;;;;;N;;;;; +12516;CUNEIFORM SIGN LAK-648 TIMES URUDA;Lo;0;L;;;;;N;;;;; +12517;CUNEIFORM SIGN LAK-724;Lo;0;L;;;;;N;;;;; +12518;CUNEIFORM SIGN LAK-749;Lo;0;L;;;;;N;;;;; +12519;CUNEIFORM SIGN LU2 GUNU TIMES ASH;Lo;0;L;;;;;N;;;;; +1251A;CUNEIFORM SIGN LU2 TIMES DISH;Lo;0;L;;;;;N;;;;; +1251B;CUNEIFORM SIGN LU2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1251C;CUNEIFORM SIGN LU2 TIMES PAP;Lo;0;L;;;;;N;;;;; +1251D;CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +1251E;CUNEIFORM SIGN LU2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1251F;CUNEIFORM SIGN MI PLUS ZA7;Lo;0;L;;;;;N;;;;; +12520;CUNEIFORM SIGN MUSH OVER MUSH TIMES GA;Lo;0;L;;;;;N;;;;; +12521;CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK;Lo;0;L;;;;;N;;;;; +12522;CUNEIFORM SIGN NINDA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +12523;CUNEIFORM SIGN NINDA2 TIMES GISH;Lo;0;L;;;;;N;;;;; +12524;CUNEIFORM SIGN NINDA2 TIMES GUL;Lo;0;L;;;;;N;;;;; +12525;CUNEIFORM SIGN NINDA2 TIMES HI;Lo;0;L;;;;;N;;;;; +12526;CUNEIFORM SIGN NINDA2 TIMES KESH2;Lo;0;L;;;;;N;;;;; +12527;CUNEIFORM SIGN NINDA2 TIMES LAK-050;Lo;0;L;;;;;N;;;;; +12528;CUNEIFORM SIGN NINDA2 TIMES MASH;Lo;0;L;;;;;N;;;;; +12529;CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1252A;CUNEIFORM SIGN NINDA2 TIMES U;Lo;0;L;;;;;N;;;;; +1252B;CUNEIFORM SIGN NINDA2 TIMES U PLUS U;Lo;0;L;;;;;N;;;;; +1252C;CUNEIFORM SIGN NINDA2 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1252D;CUNEIFORM SIGN SAG GUNU TIMES HA;Lo;0;L;;;;;N;;;;; +1252E;CUNEIFORM SIGN SAG TIMES EN;Lo;0;L;;;;;N;;;;; +1252F;CUNEIFORM SIGN SAG TIMES SHE AT LEFT;Lo;0;L;;;;;N;;;;; +12530;CUNEIFORM SIGN SAG TIMES TAK4;Lo;0;L;;;;;N;;;;; +12531;CUNEIFORM SIGN SHA6 TENU;Lo;0;L;;;;;N;;;;; +12532;CUNEIFORM SIGN SHE OVER SHE;Lo;0;L;;;;;N;;;;; +12533;CUNEIFORM SIGN SHE PLUS HUB2;Lo;0;L;;;;;N;;;;; +12534;CUNEIFORM SIGN SHE PLUS NAM2;Lo;0;L;;;;;N;;;;; +12535;CUNEIFORM SIGN SHE PLUS SAR;Lo;0;L;;;;;N;;;;; +12536;CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI;Lo;0;L;;;;;N;;;;; +12537;CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN;Lo;0;L;;;;;N;;;;; +12538;CUNEIFORM SIGN SI TIMES TAK4;Lo;0;L;;;;;N;;;;; +12539;CUNEIFORM SIGN TAK4 PLUS SAG;Lo;0;L;;;;;N;;;;; +1253A;CUNEIFORM SIGN TUM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1253B;CUNEIFORM SIGN TUM TIMES THREE DISH;Lo;0;L;;;;;N;;;;; +1253C;CUNEIFORM SIGN UR2 INVERTED;Lo;0;L;;;;;N;;;;; +1253D;CUNEIFORM SIGN UR2 TIMES UD;Lo;0;L;;;;;N;;;;; +1253E;CUNEIFORM SIGN URU TIMES DARA3;Lo;0;L;;;;;N;;;;; +1253F;CUNEIFORM SIGN URU TIMES LAK-668;Lo;0;L;;;;;N;;;;; +12540;CUNEIFORM SIGN URU TIMES LU3;Lo;0;L;;;;;N;;;;; +12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;; +12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;; +12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;; +12F90;CYPRO-MINOAN SIGN CM001;Lo;0;L;;;;;N;;;;; +12F91;CYPRO-MINOAN SIGN CM002;Lo;0;L;;;;;N;;;;; +12F92;CYPRO-MINOAN SIGN CM004;Lo;0;L;;;;;N;;;;; +12F93;CYPRO-MINOAN SIGN CM005;Lo;0;L;;;;;N;;;;; +12F94;CYPRO-MINOAN SIGN CM006;Lo;0;L;;;;;N;;;;; +12F95;CYPRO-MINOAN SIGN CM007;Lo;0;L;;;;;N;;;;; +12F96;CYPRO-MINOAN SIGN CM008;Lo;0;L;;;;;N;;;;; +12F97;CYPRO-MINOAN SIGN CM009;Lo;0;L;;;;;N;;;;; +12F98;CYPRO-MINOAN SIGN CM010;Lo;0;L;;;;;N;;;;; +12F99;CYPRO-MINOAN SIGN CM011;Lo;0;L;;;;;N;;;;; +12F9A;CYPRO-MINOAN SIGN CM012;Lo;0;L;;;;;N;;;;; +12F9B;CYPRO-MINOAN SIGN CM012B;Lo;0;L;;;;;N;;;;; +12F9C;CYPRO-MINOAN SIGN CM013;Lo;0;L;;;;;N;;;;; +12F9D;CYPRO-MINOAN SIGN CM015;Lo;0;L;;;;;N;;;;; +12F9E;CYPRO-MINOAN SIGN CM017;Lo;0;L;;;;;N;;;;; +12F9F;CYPRO-MINOAN SIGN CM019;Lo;0;L;;;;;N;;;;; +12FA0;CYPRO-MINOAN SIGN CM021;Lo;0;L;;;;;N;;;;; +12FA1;CYPRO-MINOAN SIGN CM023;Lo;0;L;;;;;N;;;;; +12FA2;CYPRO-MINOAN SIGN CM024;Lo;0;L;;;;;N;;;;; +12FA3;CYPRO-MINOAN SIGN CM025;Lo;0;L;;;;;N;;;;; +12FA4;CYPRO-MINOAN SIGN CM026;Lo;0;L;;;;;N;;;;; +12FA5;CYPRO-MINOAN SIGN CM027;Lo;0;L;;;;;N;;;;; +12FA6;CYPRO-MINOAN SIGN CM028;Lo;0;L;;;;;N;;;;; +12FA7;CYPRO-MINOAN SIGN CM029;Lo;0;L;;;;;N;;;;; +12FA8;CYPRO-MINOAN SIGN CM030;Lo;0;L;;;;;N;;;;; +12FA9;CYPRO-MINOAN SIGN CM033;Lo;0;L;;;;;N;;;;; +12FAA;CYPRO-MINOAN SIGN CM034;Lo;0;L;;;;;N;;;;; +12FAB;CYPRO-MINOAN SIGN CM035;Lo;0;L;;;;;N;;;;; +12FAC;CYPRO-MINOAN SIGN CM036;Lo;0;L;;;;;N;;;;; +12FAD;CYPRO-MINOAN SIGN CM037;Lo;0;L;;;;;N;;;;; +12FAE;CYPRO-MINOAN SIGN CM038;Lo;0;L;;;;;N;;;;; +12FAF;CYPRO-MINOAN SIGN CM039;Lo;0;L;;;;;N;;;;; +12FB0;CYPRO-MINOAN SIGN CM040;Lo;0;L;;;;;N;;;;; +12FB1;CYPRO-MINOAN SIGN CM041;Lo;0;L;;;;;N;;;;; +12FB2;CYPRO-MINOAN SIGN CM044;Lo;0;L;;;;;N;;;;; +12FB3;CYPRO-MINOAN SIGN CM046;Lo;0;L;;;;;N;;;;; +12FB4;CYPRO-MINOAN SIGN CM047;Lo;0;L;;;;;N;;;;; +12FB5;CYPRO-MINOAN SIGN CM049;Lo;0;L;;;;;N;;;;; +12FB6;CYPRO-MINOAN SIGN CM050;Lo;0;L;;;;;N;;;;; +12FB7;CYPRO-MINOAN SIGN CM051;Lo;0;L;;;;;N;;;;; +12FB8;CYPRO-MINOAN SIGN CM052;Lo;0;L;;;;;N;;;;; +12FB9;CYPRO-MINOAN SIGN CM053;Lo;0;L;;;;;N;;;;; +12FBA;CYPRO-MINOAN SIGN CM054;Lo;0;L;;;;;N;;;;; +12FBB;CYPRO-MINOAN SIGN CM055;Lo;0;L;;;;;N;;;;; +12FBC;CYPRO-MINOAN SIGN CM056;Lo;0;L;;;;;N;;;;; +12FBD;CYPRO-MINOAN SIGN CM058;Lo;0;L;;;;;N;;;;; +12FBE;CYPRO-MINOAN SIGN CM059;Lo;0;L;;;;;N;;;;; +12FBF;CYPRO-MINOAN SIGN CM060;Lo;0;L;;;;;N;;;;; +12FC0;CYPRO-MINOAN SIGN CM061;Lo;0;L;;;;;N;;;;; +12FC1;CYPRO-MINOAN SIGN CM062;Lo;0;L;;;;;N;;;;; +12FC2;CYPRO-MINOAN SIGN CM063;Lo;0;L;;;;;N;;;;; +12FC3;CYPRO-MINOAN SIGN CM064;Lo;0;L;;;;;N;;;;; +12FC4;CYPRO-MINOAN SIGN CM066;Lo;0;L;;;;;N;;;;; +12FC5;CYPRO-MINOAN SIGN CM067;Lo;0;L;;;;;N;;;;; +12FC6;CYPRO-MINOAN SIGN CM068;Lo;0;L;;;;;N;;;;; +12FC7;CYPRO-MINOAN SIGN CM069;Lo;0;L;;;;;N;;;;; +12FC8;CYPRO-MINOAN SIGN CM070;Lo;0;L;;;;;N;;;;; +12FC9;CYPRO-MINOAN SIGN CM071;Lo;0;L;;;;;N;;;;; +12FCA;CYPRO-MINOAN SIGN CM072;Lo;0;L;;;;;N;;;;; +12FCB;CYPRO-MINOAN SIGN CM073;Lo;0;L;;;;;N;;;;; +12FCC;CYPRO-MINOAN SIGN CM074;Lo;0;L;;;;;N;;;;; +12FCD;CYPRO-MINOAN SIGN CM075;Lo;0;L;;;;;N;;;;; +12FCE;CYPRO-MINOAN SIGN CM075B;Lo;0;L;;;;;N;;;;; +12FCF;CYPRO-MINOAN SIGN CM076;Lo;0;L;;;;;N;;;;; +12FD0;CYPRO-MINOAN SIGN CM078;Lo;0;L;;;;;N;;;;; +12FD1;CYPRO-MINOAN SIGN CM079;Lo;0;L;;;;;N;;;;; +12FD2;CYPRO-MINOAN SIGN CM080;Lo;0;L;;;;;N;;;;; +12FD3;CYPRO-MINOAN SIGN CM081;Lo;0;L;;;;;N;;;;; +12FD4;CYPRO-MINOAN SIGN CM082;Lo;0;L;;;;;N;;;;; +12FD5;CYPRO-MINOAN SIGN CM083;Lo;0;L;;;;;N;;;;; +12FD6;CYPRO-MINOAN SIGN CM084;Lo;0;L;;;;;N;;;;; +12FD7;CYPRO-MINOAN SIGN CM085;Lo;0;L;;;;;N;;;;; +12FD8;CYPRO-MINOAN SIGN CM086;Lo;0;L;;;;;N;;;;; +12FD9;CYPRO-MINOAN SIGN CM087;Lo;0;L;;;;;N;;;;; +12FDA;CYPRO-MINOAN SIGN CM088;Lo;0;L;;;;;N;;;;; +12FDB;CYPRO-MINOAN SIGN CM089;Lo;0;L;;;;;N;;;;; +12FDC;CYPRO-MINOAN SIGN CM090;Lo;0;L;;;;;N;;;;; +12FDD;CYPRO-MINOAN SIGN CM091;Lo;0;L;;;;;N;;;;; +12FDE;CYPRO-MINOAN SIGN CM092;Lo;0;L;;;;;N;;;;; +12FDF;CYPRO-MINOAN SIGN CM094;Lo;0;L;;;;;N;;;;; +12FE0;CYPRO-MINOAN SIGN CM095;Lo;0;L;;;;;N;;;;; +12FE1;CYPRO-MINOAN SIGN CM096;Lo;0;L;;;;;N;;;;; +12FE2;CYPRO-MINOAN SIGN CM097;Lo;0;L;;;;;N;;;;; +12FE3;CYPRO-MINOAN SIGN CM098;Lo;0;L;;;;;N;;;;; +12FE4;CYPRO-MINOAN SIGN CM099;Lo;0;L;;;;;N;;;;; +12FE5;CYPRO-MINOAN SIGN CM100;Lo;0;L;;;;;N;;;;; +12FE6;CYPRO-MINOAN SIGN CM101;Lo;0;L;;;;;N;;;;; +12FE7;CYPRO-MINOAN SIGN CM102;Lo;0;L;;;;;N;;;;; +12FE8;CYPRO-MINOAN SIGN CM103;Lo;0;L;;;;;N;;;;; +12FE9;CYPRO-MINOAN SIGN CM104;Lo;0;L;;;;;N;;;;; +12FEA;CYPRO-MINOAN SIGN CM105;Lo;0;L;;;;;N;;;;; +12FEB;CYPRO-MINOAN SIGN CM107;Lo;0;L;;;;;N;;;;; +12FEC;CYPRO-MINOAN SIGN CM108;Lo;0;L;;;;;N;;;;; +12FED;CYPRO-MINOAN SIGN CM109;Lo;0;L;;;;;N;;;;; +12FEE;CYPRO-MINOAN SIGN CM110;Lo;0;L;;;;;N;;;;; +12FEF;CYPRO-MINOAN SIGN CM112;Lo;0;L;;;;;N;;;;; +12FF0;CYPRO-MINOAN SIGN CM114;Lo;0;L;;;;;N;;;;; +12FF1;CYPRO-MINOAN SIGN CM301;Po;0;L;;;;;N;;;;; +12FF2;CYPRO-MINOAN SIGN CM302;Po;0;L;;;;;N;;;;; +13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;; +13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;; +13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;; +13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;; +13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;; +13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;; +13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;; +1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;; +13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;; +13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;; +13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;; +13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;; +13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;; +13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;; +13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;; +13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;; +13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;; +13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;; +13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;; +1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;; +1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;; +1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;; +1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;; +1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;; +1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;; +13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;; +13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;; +13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;; +13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;; +13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;; +13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;; +13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;; +13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;; +13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;; +13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;; +1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;; +1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;; +1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;; +1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;; +1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;; +1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;; +13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;; +13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;; +13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;; +13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;; +13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;; +13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;; +13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;; +13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;; +13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;; +13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;; +1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;; +1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;; +1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;; +1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;; +1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;; +1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;; +13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;; +13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;; +13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;; +13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;; +13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;; +13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;; +13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;; +13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;; +13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;; +13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;; +1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;; +1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;; +1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;; +1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;; +1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;; +1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;; +13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;; +13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;; +13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;; +13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;; +13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;; +13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;; +13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;; +13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;; +13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;; +13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;; +1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;; +1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;; +1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;; +1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;; +1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;; +1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;; +130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;; +130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;; +130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;; +130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;; +130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;; +130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;; +130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;; +130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;; +130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;; +130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;; +130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;; +130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;; +130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;; +130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;; +130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;; +130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;; +130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;; +130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;; +130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;; +130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;; +130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;; +130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;; +130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;; +130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;; +130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;; +130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;; +130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;; +130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;; +130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;; +130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;; +130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;; +130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;; +130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;; +130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;; +130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;; +130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;; +130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;; +130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;; +130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;; +130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;; +130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;; +130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;; +130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;; +130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;; +130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;; +130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;; +130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;; +130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;; +130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;; +130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;; +130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;; +130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;; +130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;; +130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;; +130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;; +130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;; +130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;; +130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;; +130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;; +130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;; +130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;; +130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;; +130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;; +130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;; +130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;; +130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;; +130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;; +130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;; +130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;; +130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;; +130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;; +130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;; +130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;; +130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;; +130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;; +130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;; +130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;; +130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;; +130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;; +130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;; +130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;; +130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;; +130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;; +130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;; +130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;; +130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;; +130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;; +130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;; +130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;; +130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;; +130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;; +130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;; +130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;; +130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;; +130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;; +130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;; +13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;; +13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;; +13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;; +13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;; +13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;; +13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;; +13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;; +13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;; +13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;; +13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;; +1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;; +1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;; +1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;; +1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;; +1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;; +1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;; +13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;; +13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;; +13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;; +13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;; +13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;; +13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;; +13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;; +13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;; +13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;; +13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;; +1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;; +1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;; +1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;; +1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;; +1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;; +1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;; +13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;; +13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;; +13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;; +13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;; +13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;; +13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;; +13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;; +13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;; +13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;; +13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;; +1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;; +1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;; +1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;; +1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;; +1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;; +1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;; +13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;; +13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;; +13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;; +13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;; +13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;; +13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;; +13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;; +13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;; +13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;; +13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;; +1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;; +1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;; +1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;; +1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;; +1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;; +1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;; +13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;; +13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;; +13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;; +13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;; +13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;; +13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;; +13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;; +13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;; +13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;; +13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;; +1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;; +1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;; +1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;; +1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;; +1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;; +1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;; +13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;; +13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;; +13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;; +13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;; +13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;; +13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;; +13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;; +13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;; +13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;; +13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;; +1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;; +1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;; +1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;; +1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;; +1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;; +1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;; +13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;; +13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;; +13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;; +13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;; +13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;; +13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;; +13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;; +13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;; +13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;; +13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;; +1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;; +1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;; +1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;; +1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;; +1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;; +1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;; +13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;; +13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;; +13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;; +13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;; +13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;; +13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;; +13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;; +13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;; +13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;; +13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;; +1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;; +1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;; +1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;; +1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;; +1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;; +1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;; +13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;; +13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;; +13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;; +13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;; +13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;; +13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;; +13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;; +13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;; +13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;; +13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;; +1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;; +1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;; +1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;; +1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;; +1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;; +1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;; +13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;; +13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;; +13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;; +13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;; +13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;; +13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;; +13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;; +13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;; +13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;; +13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;; +1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;; +1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;; +1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;; +1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;; +1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;; +1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;; +131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;; +131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;; +131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;; +131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;; +131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;; +131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;; +131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;; +131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;; +131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;; +131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;; +131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;; +131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;; +131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;; +131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;; +131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;; +131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;; +131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;; +131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;; +131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;; +131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;; +131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;; +131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;; +131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;; +131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;; +131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;; +131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;; +131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;; +131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;; +131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;; +131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;; +131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;; +131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;; +131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;; +131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;; +131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;; +131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;; +131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;; +131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;; +131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;; +131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;; +131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;; +131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;; +131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;; +131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;; +131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;; +131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;; +131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;; +131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;; +131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;; +131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;; +131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;; +131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;; +131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;; +131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;; +131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;; +131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;; +131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;; +131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;; +131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;; +131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;; +131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;; +131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;; +131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;; +131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;; +131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;; +131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;; +131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;; +131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;; +131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;; +131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;; +131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;; +131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;; +131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;; +131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;; +131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;; +131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;; +131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;; +131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;; +131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;; +131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;; +131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;; +131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;; +131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;; +131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;; +131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;; +131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;; +131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;; +131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;; +131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;; +131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;; +131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;; +131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;; +131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;; +131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;; +131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;; +131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;; +13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;; +13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;; +13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;; +13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;; +13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;; +13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;; +13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;; +13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;; +13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;; +13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;; +1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;; +1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;; +1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;; +1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;; +1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;; +1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;; +13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;; +13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;; +13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;; +13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;; +13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;; +13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;; +13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;; +13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;; +13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;; +13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;; +1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;; +1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;; +1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;; +1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;; +1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;; +1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;; +13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;; +13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;; +13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;; +13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;; +13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;; +13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;; +13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;; +13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;; +13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;; +13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;; +1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;; +1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;; +1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;; +1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;; +1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;; +1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;; +13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;; +13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;; +13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;; +13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;; +13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;; +13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;; +13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;; +13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;; +13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;; +13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;; +1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;; +1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;; +1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;; +1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;; +1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;; +1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;; +13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;; +13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;; +13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;; +13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;; +13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;; +13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;; +13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;; +13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;; +13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;; +13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;; +1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;; +1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;; +1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;; +1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;; +1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;; +1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;; +13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;; +13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;; +13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;; +13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;; +13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;; +13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;; +13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;; +13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;; +13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;; +13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;; +1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;; +1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;; +1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;; +1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;; +1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;; +1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;; +13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;; +13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;; +13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;; +13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;; +13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;; +13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;; +13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;; +13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;; +13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;; +13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;; +1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;; +1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;; +1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;; +1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;; +1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;; +1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;; +13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;; +13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;; +13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;; +13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;; +13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;; +13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;; +13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;; +13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;; +13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;; +13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;; +1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;; +1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;; +1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;; +1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;; +1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;; +1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;; +13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;; +13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;; +13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;; +13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;; +13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;; +13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;; +13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;; +13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;; +13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;; +13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;; +1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;; +1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;; +1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;; +1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;; +1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;; +1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;; +13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;; +13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;; +13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;; +13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;; +13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;; +13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;; +13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;; +13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;; +13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;; +13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;; +1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;; +1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;; +1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;; +1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;; +1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;; +1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;; +132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;; +132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;; +132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;; +132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;; +132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;; +132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;; +132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;; +132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;; +132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;; +132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;; +132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;; +132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;; +132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;; +132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;; +132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;; +132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;; +132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;; +132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;; +132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;; +132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;; +132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;; +132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;; +132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;; +132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;; +132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;; +132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;; +132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;; +132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;; +132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;; +132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;; +132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;; +132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;; +132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;; +132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;; +132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;; +132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;; +132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;; +132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;; +132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;; +132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;; +132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;; +132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;; +132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;; +132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;; +132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;; +132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;; +132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;; +132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;; +132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;; +132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;; +132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;; +132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;; +132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;; +132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;; +132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;; +132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;; +132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;; +132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;; +132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;; +132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;; +132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;; +132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;; +132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;; +132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;; +132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;; +132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;; +132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;; +132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;; +132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;; +132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;; +132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;; +132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;; +132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;; +132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;; +132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;; +132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;; +132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;; +132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;; +132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;; +132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;; +132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;; +132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;; +132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;; +132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;; +132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;; +132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;; +132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;; +132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;; +132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;; +132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;; +132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;; +132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;; +132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;; +132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;; +132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;; +132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;; +13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;; +13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;; +13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;; +13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;; +13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;; +13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;; +13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;; +13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;; +13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;; +13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;; +1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;; +1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;; +1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;; +1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;; +1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;; +1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;; +13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;; +13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;; +13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;; +13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;; +13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;; +13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;; +13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;; +13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;; +13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;; +13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;; +1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;; +1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;; +1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;; +1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;; +1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;; +1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;; +13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;; +13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;; +13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;; +13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;; +13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;; +13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;; +13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;; +13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;; +13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;; +13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;; +1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;; +1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;; +1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;; +1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;; +1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;; +1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;; +13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;; +13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;; +13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;; +13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;; +13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;; +13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;; +13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;; +13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;; +13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;; +13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;; +1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;; +1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;; +1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;; +1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;; +1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;; +1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;; +13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;; +13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;; +13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;; +13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;; +13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;; +13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;; +13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;; +13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;; +13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;; +13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;; +1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;; +1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;; +1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;; +1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;; +1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;; +1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;; +13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;; +13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;; +13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;; +13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;; +13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;; +13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;; +13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;; +13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;; +13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;; +13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;; +1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;; +1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;; +1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;; +1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;; +1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;; +1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;; +13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;; +13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;; +13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;; +13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;; +13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;; +13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;; +13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;; +13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;; +13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;; +13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;; +1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;; +1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;; +1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;; +1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;; +1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;; +1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;; +13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;; +13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;; +13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;; +13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;; +13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;; +13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;; +13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;; +13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;; +13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;; +13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;; +1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;; +1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;; +1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;; +1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;; +1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;; +1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;; +13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;; +13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;; +13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;; +13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;; +13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;; +13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;; +13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;; +13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;; +13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;; +13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;; +1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;; +1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;; +1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;; +1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;; +1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;; +1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;; +13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;; +13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;; +13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;; +13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;; +13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;; +13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;; +13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;; +13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;; +13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;; +13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;; +1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;; +1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;; +1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;; +1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;; +1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;; +1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;; +133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;; +133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;; +133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;; +133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;; +133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;; +133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;; +133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;; +133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;; +133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;; +133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;; +133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;; +133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;; +133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;; +133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;; +133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;; +133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;; +133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;; +133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;; +133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;; +133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;; +133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;; +133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;; +133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;; +133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;; +133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;; +133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;; +133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;; +133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;; +133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;; +133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;; +133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;; +133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;; +133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;; +133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;; +133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;; +133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;; +133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;; +133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;; +133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;; +133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;; +133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;; +133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;; +133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;; +133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;; +133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;; +133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;; +133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;; +133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;; +133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;; +133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;; +133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;; +133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;; +133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;; +133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;; +133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;; +133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;; +133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;; +133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;; +133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;; +133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;; +133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;; +133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;; +133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;; +133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;; +133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;; +133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;; +133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;; +133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;; +133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;; +133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;; +133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;; +133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;; +133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;; +133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;; +133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;; +133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;; +133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;; +133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;; +133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;; +133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;; +133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;; +133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;; +133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;; +133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;; +133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;; +133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;; +133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;; +133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;; +133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;; +133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;; +133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;; +133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;; +133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;; +133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;; +133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;; +133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;; +13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;; +13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;; +13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;; +13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;; +13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;; +13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;; +13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;; +13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;; +13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;; +13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;; +1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;; +1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;; +1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;; +1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;; +1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;; +1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;; +13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;; +13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;; +13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;; +13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;; +13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;; +13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;; +13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;; +13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;; +13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;; +13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;; +1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;; +1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;; +1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;; +1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;; +1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;; +1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;; +13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;; +13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;; +13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;; +13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;; +13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;; +13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;; +13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;; +13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;; +13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;; +13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;; +1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;; +1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;; +1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; +1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; +1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; +1342F;EGYPTIAN HIEROGLYPH V011D;Lo;0;L;;;;;N;;;;; +13430;EGYPTIAN HIEROGLYPH VERTICAL JOINER;Cf;0;L;;;;;N;;;;; +13431;EGYPTIAN HIEROGLYPH HORIZONTAL JOINER;Cf;0;L;;;;;N;;;;; +13432;EGYPTIAN HIEROGLYPH INSERT AT TOP START;Cf;0;L;;;;;N;;;;; +13433;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM START;Cf;0;L;;;;;N;;;;; +13434;EGYPTIAN HIEROGLYPH INSERT AT TOP END;Cf;0;L;;;;;N;;;;; +13435;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM END;Cf;0;L;;;;;N;;;;; +13436;EGYPTIAN HIEROGLYPH OVERLAY MIDDLE;Cf;0;L;;;;;N;;;;; +13437;EGYPTIAN HIEROGLYPH BEGIN SEGMENT;Cf;0;L;;;;;N;;;;; +13438;EGYPTIAN HIEROGLYPH END SEGMENT;Cf;0;L;;;;;N;;;;; +13439;EGYPTIAN HIEROGLYPH INSERT AT MIDDLE;Cf;0;L;;;;;N;;;;; +1343A;EGYPTIAN HIEROGLYPH INSERT AT TOP;Cf;0;L;;;;;N;;;;; +1343B;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM;Cf;0;L;;;;;N;;;;; +1343C;EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE;Cf;0;L;;;;;N;;;;; +1343D;EGYPTIAN HIEROGLYPH END ENCLOSURE;Cf;0;L;;;;;N;;;;; +1343E;EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE;Cf;0;L;;;;;N;;;;; +1343F;EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE;Cf;0;L;;;;;N;;;;; +13440;EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY;Mn;0;NSM;;;;;N;;;;; +13441;EGYPTIAN HIEROGLYPH FULL BLANK;Lo;0;L;;;;;N;;;;; +13442;EGYPTIAN HIEROGLYPH HALF BLANK;Lo;0;L;;;;;N;;;;; +13443;EGYPTIAN HIEROGLYPH LOST SIGN;Lo;0;L;;;;;N;;;;; +13444;EGYPTIAN HIEROGLYPH HALF LOST SIGN;Lo;0;L;;;;;N;;;;; +13445;EGYPTIAN HIEROGLYPH TALL LOST SIGN;Lo;0;L;;;;;N;;;;; +13446;EGYPTIAN HIEROGLYPH WIDE LOST SIGN;Lo;0;L;;;;;N;;;;; +13447;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START;Mn;0;NSM;;;;;N;;;;; +13448;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START;Mn;0;NSM;;;;;N;;;;; +13449;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START;Mn;0;NSM;;;;;N;;;;; +1344A;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP END;Mn;0;NSM;;;;;N;;;;; +1344B;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP;Mn;0;NSM;;;;;N;;;;; +1344C;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START AND TOP END;Mn;0;NSM;;;;;N;;;;; +1344D;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND TOP;Mn;0;NSM;;;;;N;;;;; +1344E;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM END;Mn;0;NSM;;;;;N;;;;; +1344F;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START AND BOTTOM END;Mn;0;NSM;;;;;N;;;;; +13450;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM;Mn;0;NSM;;;;;N;;;;; +13451;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND BOTTOM;Mn;0;NSM;;;;;N;;;;; +13452;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT END;Mn;0;NSM;;;;;N;;;;; +13453;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP AND END;Mn;0;NSM;;;;;N;;;;; +13454;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM AND END;Mn;0;NSM;;;;;N;;;;; +13455;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED;Mn;0;NSM;;;;;N;;;;; +13460;EGYPTIAN HIEROGLYPH-13460;Lo;0;L;;;;;N;;;;; +13461;EGYPTIAN HIEROGLYPH-13461;Lo;0;L;;;;;N;;;;; +13462;EGYPTIAN HIEROGLYPH-13462;Lo;0;L;;;;;N;;;;; +13463;EGYPTIAN HIEROGLYPH-13463;Lo;0;L;;;;;N;;;;; +13464;EGYPTIAN HIEROGLYPH-13464;Lo;0;L;;;;;N;;;;; +13465;EGYPTIAN HIEROGLYPH-13465;Lo;0;L;;;;;N;;;;; +13466;EGYPTIAN HIEROGLYPH-13466;Lo;0;L;;;;;N;;;;; +13467;EGYPTIAN HIEROGLYPH-13467;Lo;0;L;;;;;N;;;;; +13468;EGYPTIAN HIEROGLYPH-13468;Lo;0;L;;;;;N;;;;; +13469;EGYPTIAN HIEROGLYPH-13469;Lo;0;L;;;;;N;;;;; +1346A;EGYPTIAN HIEROGLYPH-1346A;Lo;0;L;;;;;N;;;;; +1346B;EGYPTIAN HIEROGLYPH-1346B;Lo;0;L;;;;;N;;;;; +1346C;EGYPTIAN HIEROGLYPH-1346C;Lo;0;L;;;;;N;;;;; +1346D;EGYPTIAN HIEROGLYPH-1346D;Lo;0;L;;;;;N;;;;; +1346E;EGYPTIAN HIEROGLYPH-1346E;Lo;0;L;;;;;N;;;;; +1346F;EGYPTIAN HIEROGLYPH-1346F;Lo;0;L;;;;;N;;;;; +13470;EGYPTIAN HIEROGLYPH-13470;Lo;0;L;;;;;N;;;;; +13471;EGYPTIAN HIEROGLYPH-13471;Lo;0;L;;;;;N;;;;; +13472;EGYPTIAN HIEROGLYPH-13472;Lo;0;L;;;;;N;;;;; +13473;EGYPTIAN HIEROGLYPH-13473;Lo;0;L;;;;;N;;;;; +13474;EGYPTIAN HIEROGLYPH-13474;Lo;0;L;;;;;N;;;;; +13475;EGYPTIAN HIEROGLYPH-13475;Lo;0;L;;;;;N;;;;; +13476;EGYPTIAN HIEROGLYPH-13476;Lo;0;L;;;;;N;;;;; +13477;EGYPTIAN HIEROGLYPH-13477;Lo;0;L;;;;;N;;;;; +13478;EGYPTIAN HIEROGLYPH-13478;Lo;0;L;;;;;N;;;;; +13479;EGYPTIAN HIEROGLYPH-13479;Lo;0;L;;;;;N;;;;; +1347A;EGYPTIAN HIEROGLYPH-1347A;Lo;0;L;;;;;N;;;;; +1347B;EGYPTIAN HIEROGLYPH-1347B;Lo;0;L;;;;;N;;;;; +1347C;EGYPTIAN HIEROGLYPH-1347C;Lo;0;L;;;;;N;;;;; +1347D;EGYPTIAN HIEROGLYPH-1347D;Lo;0;L;;;;;N;;;;; +1347E;EGYPTIAN HIEROGLYPH-1347E;Lo;0;L;;;;;N;;;;; +1347F;EGYPTIAN HIEROGLYPH-1347F;Lo;0;L;;;;;N;;;;; +13480;EGYPTIAN HIEROGLYPH-13480;Lo;0;L;;;;;N;;;;; +13481;EGYPTIAN HIEROGLYPH-13481;Lo;0;L;;;;;N;;;;; +13482;EGYPTIAN HIEROGLYPH-13482;Lo;0;L;;;;;N;;;;; +13483;EGYPTIAN HIEROGLYPH-13483;Lo;0;L;;;;;N;;;;; +13484;EGYPTIAN HIEROGLYPH-13484;Lo;0;L;;;;;N;;;;; +13485;EGYPTIAN HIEROGLYPH-13485;Lo;0;L;;;;;N;;;;; +13486;EGYPTIAN HIEROGLYPH-13486;Lo;0;L;;;;;N;;;;; +13487;EGYPTIAN HIEROGLYPH-13487;Lo;0;L;;;;;N;;;;; +13488;EGYPTIAN HIEROGLYPH-13488;Lo;0;L;;;;;N;;;;; +13489;EGYPTIAN HIEROGLYPH-13489;Lo;0;L;;;;;N;;;;; +1348A;EGYPTIAN HIEROGLYPH-1348A;Lo;0;L;;;;;N;;;;; +1348B;EGYPTIAN HIEROGLYPH-1348B;Lo;0;L;;;;;N;;;;; +1348C;EGYPTIAN HIEROGLYPH-1348C;Lo;0;L;;;;;N;;;;; +1348D;EGYPTIAN HIEROGLYPH-1348D;Lo;0;L;;;;;N;;;;; +1348E;EGYPTIAN HIEROGLYPH-1348E;Lo;0;L;;;;;N;;;;; +1348F;EGYPTIAN HIEROGLYPH-1348F;Lo;0;L;;;;;N;;;;; +13490;EGYPTIAN HIEROGLYPH-13490;Lo;0;L;;;;;N;;;;; +13491;EGYPTIAN HIEROGLYPH-13491;Lo;0;L;;;;;N;;;;; +13492;EGYPTIAN HIEROGLYPH-13492;Lo;0;L;;;;;N;;;;; +13493;EGYPTIAN HIEROGLYPH-13493;Lo;0;L;;;;;N;;;;; +13494;EGYPTIAN HIEROGLYPH-13494;Lo;0;L;;;;;N;;;;; +13495;EGYPTIAN HIEROGLYPH-13495;Lo;0;L;;;;;N;;;;; +13496;EGYPTIAN HIEROGLYPH-13496;Lo;0;L;;;;;N;;;;; +13497;EGYPTIAN HIEROGLYPH-13497;Lo;0;L;;;;;N;;;;; +13498;EGYPTIAN HIEROGLYPH-13498;Lo;0;L;;;;;N;;;;; +13499;EGYPTIAN HIEROGLYPH-13499;Lo;0;L;;;;;N;;;;; +1349A;EGYPTIAN HIEROGLYPH-1349A;Lo;0;L;;;;;N;;;;; +1349B;EGYPTIAN HIEROGLYPH-1349B;Lo;0;L;;;;;N;;;;; +1349C;EGYPTIAN HIEROGLYPH-1349C;Lo;0;L;;;;;N;;;;; +1349D;EGYPTIAN HIEROGLYPH-1349D;Lo;0;L;;;;;N;;;;; +1349E;EGYPTIAN HIEROGLYPH-1349E;Lo;0;L;;;;;N;;;;; +1349F;EGYPTIAN HIEROGLYPH-1349F;Lo;0;L;;;;;N;;;;; +134A0;EGYPTIAN HIEROGLYPH-134A0;Lo;0;L;;;;;N;;;;; +134A1;EGYPTIAN HIEROGLYPH-134A1;Lo;0;L;;;;;N;;;;; +134A2;EGYPTIAN HIEROGLYPH-134A2;Lo;0;L;;;;;N;;;;; +134A3;EGYPTIAN HIEROGLYPH-134A3;Lo;0;L;;;;;N;;;;; +134A4;EGYPTIAN HIEROGLYPH-134A4;Lo;0;L;;;;;N;;;;; +134A5;EGYPTIAN HIEROGLYPH-134A5;Lo;0;L;;;;;N;;;;; +134A6;EGYPTIAN HIEROGLYPH-134A6;Lo;0;L;;;;;N;;;;; +134A7;EGYPTIAN HIEROGLYPH-134A7;Lo;0;L;;;;;N;;;;; +134A8;EGYPTIAN HIEROGLYPH-134A8;Lo;0;L;;;;;N;;;;; +134A9;EGYPTIAN HIEROGLYPH-134A9;Lo;0;L;;;;;N;;;;; +134AA;EGYPTIAN HIEROGLYPH-134AA;Lo;0;L;;;;;N;;;;; +134AB;EGYPTIAN HIEROGLYPH-134AB;Lo;0;L;;;;;N;;;;; +134AC;EGYPTIAN HIEROGLYPH-134AC;Lo;0;L;;;;;N;;;;; +134AD;EGYPTIAN HIEROGLYPH-134AD;Lo;0;L;;;;;N;;;;; +134AE;EGYPTIAN HIEROGLYPH-134AE;Lo;0;L;;;;;N;;;;; +134AF;EGYPTIAN HIEROGLYPH-134AF;Lo;0;L;;;;;N;;;;; +134B0;EGYPTIAN HIEROGLYPH-134B0;Lo;0;L;;;;;N;;;;; +134B1;EGYPTIAN HIEROGLYPH-134B1;Lo;0;L;;;;;N;;;;; +134B2;EGYPTIAN HIEROGLYPH-134B2;Lo;0;L;;;;;N;;;;; +134B3;EGYPTIAN HIEROGLYPH-134B3;Lo;0;L;;;;;N;;;;; +134B4;EGYPTIAN HIEROGLYPH-134B4;Lo;0;L;;;;;N;;;;; +134B5;EGYPTIAN HIEROGLYPH-134B5;Lo;0;L;;;;;N;;;;; +134B6;EGYPTIAN HIEROGLYPH-134B6;Lo;0;L;;;;;N;;;;; +134B7;EGYPTIAN HIEROGLYPH-134B7;Lo;0;L;;;;;N;;;;; +134B8;EGYPTIAN HIEROGLYPH-134B8;Lo;0;L;;;;;N;;;;; +134B9;EGYPTIAN HIEROGLYPH-134B9;Lo;0;L;;;;;N;;;;; +134BA;EGYPTIAN HIEROGLYPH-134BA;Lo;0;L;;;;;N;;;;; +134BB;EGYPTIAN HIEROGLYPH-134BB;Lo;0;L;;;;;N;;;;; +134BC;EGYPTIAN HIEROGLYPH-134BC;Lo;0;L;;;;;N;;;;; +134BD;EGYPTIAN HIEROGLYPH-134BD;Lo;0;L;;;;;N;;;;; +134BE;EGYPTIAN HIEROGLYPH-134BE;Lo;0;L;;;;;N;;;;; +134BF;EGYPTIAN HIEROGLYPH-134BF;Lo;0;L;;;;;N;;;;; +134C0;EGYPTIAN HIEROGLYPH-134C0;Lo;0;L;;;;;N;;;;; +134C1;EGYPTIAN HIEROGLYPH-134C1;Lo;0;L;;;;;N;;;;; +134C2;EGYPTIAN HIEROGLYPH-134C2;Lo;0;L;;;;;N;;;;; +134C3;EGYPTIAN HIEROGLYPH-134C3;Lo;0;L;;;;;N;;;;; +134C4;EGYPTIAN HIEROGLYPH-134C4;Lo;0;L;;;;;N;;;;; +134C5;EGYPTIAN HIEROGLYPH-134C5;Lo;0;L;;;;;N;;;;; +134C6;EGYPTIAN HIEROGLYPH-134C6;Lo;0;L;;;;;N;;;;; +134C7;EGYPTIAN HIEROGLYPH-134C7;Lo;0;L;;;;;N;;;;; +134C8;EGYPTIAN HIEROGLYPH-134C8;Lo;0;L;;;;;N;;;;; +134C9;EGYPTIAN HIEROGLYPH-134C9;Lo;0;L;;;;;N;;;;; +134CA;EGYPTIAN HIEROGLYPH-134CA;Lo;0;L;;;;;N;;;;; +134CB;EGYPTIAN HIEROGLYPH-134CB;Lo;0;L;;;;;N;;;;; +134CC;EGYPTIAN HIEROGLYPH-134CC;Lo;0;L;;;;;N;;;;; +134CD;EGYPTIAN HIEROGLYPH-134CD;Lo;0;L;;;;;N;;;;; +134CE;EGYPTIAN HIEROGLYPH-134CE;Lo;0;L;;;;;N;;;;; +134CF;EGYPTIAN HIEROGLYPH-134CF;Lo;0;L;;;;;N;;;;; +134D0;EGYPTIAN HIEROGLYPH-134D0;Lo;0;L;;;;;N;;;;; +134D1;EGYPTIAN HIEROGLYPH-134D1;Lo;0;L;;;;;N;;;;; +134D2;EGYPTIAN HIEROGLYPH-134D2;Lo;0;L;;;;;N;;;;; +134D3;EGYPTIAN HIEROGLYPH-134D3;Lo;0;L;;;;;N;;;;; +134D4;EGYPTIAN HIEROGLYPH-134D4;Lo;0;L;;;;;N;;;;; +134D5;EGYPTIAN HIEROGLYPH-134D5;Lo;0;L;;;;;N;;;;; +134D6;EGYPTIAN HIEROGLYPH-134D6;Lo;0;L;;;;;N;;;;; +134D7;EGYPTIAN HIEROGLYPH-134D7;Lo;0;L;;;;;N;;;;; +134D8;EGYPTIAN HIEROGLYPH-134D8;Lo;0;L;;;;;N;;;;; +134D9;EGYPTIAN HIEROGLYPH-134D9;Lo;0;L;;;;;N;;;;; +134DA;EGYPTIAN HIEROGLYPH-134DA;Lo;0;L;;;;;N;;;;; +134DB;EGYPTIAN HIEROGLYPH-134DB;Lo;0;L;;;;;N;;;;; +134DC;EGYPTIAN HIEROGLYPH-134DC;Lo;0;L;;;;;N;;;;; +134DD;EGYPTIAN HIEROGLYPH-134DD;Lo;0;L;;;;;N;;;;; +134DE;EGYPTIAN HIEROGLYPH-134DE;Lo;0;L;;;;;N;;;;; +134DF;EGYPTIAN HIEROGLYPH-134DF;Lo;0;L;;;;;N;;;;; +134E0;EGYPTIAN HIEROGLYPH-134E0;Lo;0;L;;;;;N;;;;; +134E1;EGYPTIAN HIEROGLYPH-134E1;Lo;0;L;;;;;N;;;;; +134E2;EGYPTIAN HIEROGLYPH-134E2;Lo;0;L;;;;;N;;;;; +134E3;EGYPTIAN HIEROGLYPH-134E3;Lo;0;L;;;;;N;;;;; +134E4;EGYPTIAN HIEROGLYPH-134E4;Lo;0;L;;;;;N;;;;; +134E5;EGYPTIAN HIEROGLYPH-134E5;Lo;0;L;;;;;N;;;;; +134E6;EGYPTIAN HIEROGLYPH-134E6;Lo;0;L;;;;;N;;;;; +134E7;EGYPTIAN HIEROGLYPH-134E7;Lo;0;L;;;;;N;;;;; +134E8;EGYPTIAN HIEROGLYPH-134E8;Lo;0;L;;;;;N;;;;; +134E9;EGYPTIAN HIEROGLYPH-134E9;Lo;0;L;;;;;N;;;;; +134EA;EGYPTIAN HIEROGLYPH-134EA;Lo;0;L;;;;;N;;;;; +134EB;EGYPTIAN HIEROGLYPH-134EB;Lo;0;L;;;;;N;;;;; +134EC;EGYPTIAN HIEROGLYPH-134EC;Lo;0;L;;;;;N;;;;; +134ED;EGYPTIAN HIEROGLYPH-134ED;Lo;0;L;;;;;N;;;;; +134EE;EGYPTIAN HIEROGLYPH-134EE;Lo;0;L;;;;;N;;;;; +134EF;EGYPTIAN HIEROGLYPH-134EF;Lo;0;L;;;;;N;;;;; +134F0;EGYPTIAN HIEROGLYPH-134F0;Lo;0;L;;;;;N;;;;; +134F1;EGYPTIAN HIEROGLYPH-134F1;Lo;0;L;;;;;N;;;;; +134F2;EGYPTIAN HIEROGLYPH-134F2;Lo;0;L;;;;;N;;;;; +134F3;EGYPTIAN HIEROGLYPH-134F3;Lo;0;L;;;;;N;;;;; +134F4;EGYPTIAN HIEROGLYPH-134F4;Lo;0;L;;;;;N;;;;; +134F5;EGYPTIAN HIEROGLYPH-134F5;Lo;0;L;;;;;N;;;;; +134F6;EGYPTIAN HIEROGLYPH-134F6;Lo;0;L;;;;;N;;;;; +134F7;EGYPTIAN HIEROGLYPH-134F7;Lo;0;L;;;;;N;;;;; +134F8;EGYPTIAN HIEROGLYPH-134F8;Lo;0;L;;;;;N;;;;; +134F9;EGYPTIAN HIEROGLYPH-134F9;Lo;0;L;;;;;N;;;;; +134FA;EGYPTIAN HIEROGLYPH-134FA;Lo;0;L;;;;;N;;;;; +134FB;EGYPTIAN HIEROGLYPH-134FB;Lo;0;L;;;;;N;;;;; +134FC;EGYPTIAN HIEROGLYPH-134FC;Lo;0;L;;;;;N;;;;; +134FD;EGYPTIAN HIEROGLYPH-134FD;Lo;0;L;;;;;N;;;;; +134FE;EGYPTIAN HIEROGLYPH-134FE;Lo;0;L;;;;;N;;;;; +134FF;EGYPTIAN HIEROGLYPH-134FF;Lo;0;L;;;;;N;;;;; +13500;EGYPTIAN HIEROGLYPH-13500;Lo;0;L;;;;;N;;;;; +13501;EGYPTIAN HIEROGLYPH-13501;Lo;0;L;;;;;N;;;;; +13502;EGYPTIAN HIEROGLYPH-13502;Lo;0;L;;;;;N;;;;; +13503;EGYPTIAN HIEROGLYPH-13503;Lo;0;L;;;;;N;;;;; +13504;EGYPTIAN HIEROGLYPH-13504;Lo;0;L;;;;;N;;;;; +13505;EGYPTIAN HIEROGLYPH-13505;Lo;0;L;;;;;N;;;;; +13506;EGYPTIAN HIEROGLYPH-13506;Lo;0;L;;;;;N;;;;; +13507;EGYPTIAN HIEROGLYPH-13507;Lo;0;L;;;;;N;;;;; +13508;EGYPTIAN HIEROGLYPH-13508;Lo;0;L;;;;;N;;;;; +13509;EGYPTIAN HIEROGLYPH-13509;Lo;0;L;;;;;N;;;;; +1350A;EGYPTIAN HIEROGLYPH-1350A;Lo;0;L;;;;;N;;;;; +1350B;EGYPTIAN HIEROGLYPH-1350B;Lo;0;L;;;;;N;;;;; +1350C;EGYPTIAN HIEROGLYPH-1350C;Lo;0;L;;;;;N;;;;; +1350D;EGYPTIAN HIEROGLYPH-1350D;Lo;0;L;;;;;N;;;;; +1350E;EGYPTIAN HIEROGLYPH-1350E;Lo;0;L;;;;;N;;;;; +1350F;EGYPTIAN HIEROGLYPH-1350F;Lo;0;L;;;;;N;;;;; +13510;EGYPTIAN HIEROGLYPH-13510;Lo;0;L;;;;;N;;;;; +13511;EGYPTIAN HIEROGLYPH-13511;Lo;0;L;;;;;N;;;;; +13512;EGYPTIAN HIEROGLYPH-13512;Lo;0;L;;;;;N;;;;; +13513;EGYPTIAN HIEROGLYPH-13513;Lo;0;L;;;;;N;;;;; +13514;EGYPTIAN HIEROGLYPH-13514;Lo;0;L;;;;;N;;;;; +13515;EGYPTIAN HIEROGLYPH-13515;Lo;0;L;;;;;N;;;;; +13516;EGYPTIAN HIEROGLYPH-13516;Lo;0;L;;;;;N;;;;; +13517;EGYPTIAN HIEROGLYPH-13517;Lo;0;L;;;;;N;;;;; +13518;EGYPTIAN HIEROGLYPH-13518;Lo;0;L;;;;;N;;;;; +13519;EGYPTIAN HIEROGLYPH-13519;Lo;0;L;;;;;N;;;;; +1351A;EGYPTIAN HIEROGLYPH-1351A;Lo;0;L;;;;;N;;;;; +1351B;EGYPTIAN HIEROGLYPH-1351B;Lo;0;L;;;;;N;;;;; +1351C;EGYPTIAN HIEROGLYPH-1351C;Lo;0;L;;;;;N;;;;; +1351D;EGYPTIAN HIEROGLYPH-1351D;Lo;0;L;;;;;N;;;;; +1351E;EGYPTIAN HIEROGLYPH-1351E;Lo;0;L;;;;;N;;;;; +1351F;EGYPTIAN HIEROGLYPH-1351F;Lo;0;L;;;;;N;;;;; +13520;EGYPTIAN HIEROGLYPH-13520;Lo;0;L;;;;;N;;;;; +13521;EGYPTIAN HIEROGLYPH-13521;Lo;0;L;;;;;N;;;;; +13522;EGYPTIAN HIEROGLYPH-13522;Lo;0;L;;;;;N;;;;; +13523;EGYPTIAN HIEROGLYPH-13523;Lo;0;L;;;;;N;;;;; +13524;EGYPTIAN HIEROGLYPH-13524;Lo;0;L;;;;;N;;;;; +13525;EGYPTIAN HIEROGLYPH-13525;Lo;0;L;;;;;N;;;;; +13526;EGYPTIAN HIEROGLYPH-13526;Lo;0;L;;;;;N;;;;; +13527;EGYPTIAN HIEROGLYPH-13527;Lo;0;L;;;;;N;;;;; +13528;EGYPTIAN HIEROGLYPH-13528;Lo;0;L;;;;;N;;;;; +13529;EGYPTIAN HIEROGLYPH-13529;Lo;0;L;;;;;N;;;;; +1352A;EGYPTIAN HIEROGLYPH-1352A;Lo;0;L;;;;;N;;;;; +1352B;EGYPTIAN HIEROGLYPH-1352B;Lo;0;L;;;;;N;;;;; +1352C;EGYPTIAN HIEROGLYPH-1352C;Lo;0;L;;;;;N;;;;; +1352D;EGYPTIAN HIEROGLYPH-1352D;Lo;0;L;;;;;N;;;;; +1352E;EGYPTIAN HIEROGLYPH-1352E;Lo;0;L;;;;;N;;;;; +1352F;EGYPTIAN HIEROGLYPH-1352F;Lo;0;L;;;;;N;;;;; +13530;EGYPTIAN HIEROGLYPH-13530;Lo;0;L;;;;;N;;;;; +13531;EGYPTIAN HIEROGLYPH-13531;Lo;0;L;;;;;N;;;;; +13532;EGYPTIAN HIEROGLYPH-13532;Lo;0;L;;;;;N;;;;; +13533;EGYPTIAN HIEROGLYPH-13533;Lo;0;L;;;;;N;;;;; +13534;EGYPTIAN HIEROGLYPH-13534;Lo;0;L;;;;;N;;;;; +13535;EGYPTIAN HIEROGLYPH-13535;Lo;0;L;;;;;N;;;;; +13536;EGYPTIAN HIEROGLYPH-13536;Lo;0;L;;;;;N;;;;; +13537;EGYPTIAN HIEROGLYPH-13537;Lo;0;L;;;;;N;;;;; +13538;EGYPTIAN HIEROGLYPH-13538;Lo;0;L;;;;;N;;;;; +13539;EGYPTIAN HIEROGLYPH-13539;Lo;0;L;;;;;N;;;;; +1353A;EGYPTIAN HIEROGLYPH-1353A;Lo;0;L;;;;;N;;;;; +1353B;EGYPTIAN HIEROGLYPH-1353B;Lo;0;L;;;;;N;;;;; +1353C;EGYPTIAN HIEROGLYPH-1353C;Lo;0;L;;;;;N;;;;; +1353D;EGYPTIAN HIEROGLYPH-1353D;Lo;0;L;;;;;N;;;;; +1353E;EGYPTIAN HIEROGLYPH-1353E;Lo;0;L;;;;;N;;;;; +1353F;EGYPTIAN HIEROGLYPH-1353F;Lo;0;L;;;;;N;;;;; +13540;EGYPTIAN HIEROGLYPH-13540;Lo;0;L;;;;;N;;;;; +13541;EGYPTIAN HIEROGLYPH-13541;Lo;0;L;;;;;N;;;;; +13542;EGYPTIAN HIEROGLYPH-13542;Lo;0;L;;;;;N;;;;; +13543;EGYPTIAN HIEROGLYPH-13543;Lo;0;L;;;;;N;;;;; +13544;EGYPTIAN HIEROGLYPH-13544;Lo;0;L;;;;;N;;;;; +13545;EGYPTIAN HIEROGLYPH-13545;Lo;0;L;;;;;N;;;;; +13546;EGYPTIAN HIEROGLYPH-13546;Lo;0;L;;;;;N;;;;; +13547;EGYPTIAN HIEROGLYPH-13547;Lo;0;L;;;;;N;;;;; +13548;EGYPTIAN HIEROGLYPH-13548;Lo;0;L;;;;;N;;;;; +13549;EGYPTIAN HIEROGLYPH-13549;Lo;0;L;;;;;N;;;;; +1354A;EGYPTIAN HIEROGLYPH-1354A;Lo;0;L;;;;;N;;;;; +1354B;EGYPTIAN HIEROGLYPH-1354B;Lo;0;L;;;;;N;;;;; +1354C;EGYPTIAN HIEROGLYPH-1354C;Lo;0;L;;;;;N;;;;; +1354D;EGYPTIAN HIEROGLYPH-1354D;Lo;0;L;;;;;N;;;;; +1354E;EGYPTIAN HIEROGLYPH-1354E;Lo;0;L;;;;;N;;;;; +1354F;EGYPTIAN HIEROGLYPH-1354F;Lo;0;L;;;;;N;;;;; +13550;EGYPTIAN HIEROGLYPH-13550;Lo;0;L;;;;;N;;;;; +13551;EGYPTIAN HIEROGLYPH-13551;Lo;0;L;;;;;N;;;;; +13552;EGYPTIAN HIEROGLYPH-13552;Lo;0;L;;;;;N;;;;; +13553;EGYPTIAN HIEROGLYPH-13553;Lo;0;L;;;;;N;;;;; +13554;EGYPTIAN HIEROGLYPH-13554;Lo;0;L;;;;;N;;;;; +13555;EGYPTIAN HIEROGLYPH-13555;Lo;0;L;;;;;N;;;;; +13556;EGYPTIAN HIEROGLYPH-13556;Lo;0;L;;;;;N;;;;; +13557;EGYPTIAN HIEROGLYPH-13557;Lo;0;L;;;;;N;;;;; +13558;EGYPTIAN HIEROGLYPH-13558;Lo;0;L;;;;;N;;;;; +13559;EGYPTIAN HIEROGLYPH-13559;Lo;0;L;;;;;N;;;;; +1355A;EGYPTIAN HIEROGLYPH-1355A;Lo;0;L;;;;;N;;;;; +1355B;EGYPTIAN HIEROGLYPH-1355B;Lo;0;L;;;;;N;;;;; +1355C;EGYPTIAN HIEROGLYPH-1355C;Lo;0;L;;;;;N;;;;; +1355D;EGYPTIAN HIEROGLYPH-1355D;Lo;0;L;;;;;N;;;;; +1355E;EGYPTIAN HIEROGLYPH-1355E;Lo;0;L;;;;;N;;;;; +1355F;EGYPTIAN HIEROGLYPH-1355F;Lo;0;L;;;;;N;;;;; +13560;EGYPTIAN HIEROGLYPH-13560;Lo;0;L;;;;;N;;;;; +13561;EGYPTIAN HIEROGLYPH-13561;Lo;0;L;;;;;N;;;;; +13562;EGYPTIAN HIEROGLYPH-13562;Lo;0;L;;;;;N;;;;; +13563;EGYPTIAN HIEROGLYPH-13563;Lo;0;L;;;;;N;;;;; +13564;EGYPTIAN HIEROGLYPH-13564;Lo;0;L;;;;;N;;;;; +13565;EGYPTIAN HIEROGLYPH-13565;Lo;0;L;;;;;N;;;;; +13566;EGYPTIAN HIEROGLYPH-13566;Lo;0;L;;;;;N;;;;; +13567;EGYPTIAN HIEROGLYPH-13567;Lo;0;L;;;;;N;;;;; +13568;EGYPTIAN HIEROGLYPH-13568;Lo;0;L;;;;;N;;;;; +13569;EGYPTIAN HIEROGLYPH-13569;Lo;0;L;;;;;N;;;;; +1356A;EGYPTIAN HIEROGLYPH-1356A;Lo;0;L;;;;;N;;;;; +1356B;EGYPTIAN HIEROGLYPH-1356B;Lo;0;L;;;;;N;;;;; +1356C;EGYPTIAN HIEROGLYPH-1356C;Lo;0;L;;;;;N;;;;; +1356D;EGYPTIAN HIEROGLYPH-1356D;Lo;0;L;;;;;N;;;;; +1356E;EGYPTIAN HIEROGLYPH-1356E;Lo;0;L;;;;;N;;;;; +1356F;EGYPTIAN HIEROGLYPH-1356F;Lo;0;L;;;;;N;;;;; +13570;EGYPTIAN HIEROGLYPH-13570;Lo;0;L;;;;;N;;;;; +13571;EGYPTIAN HIEROGLYPH-13571;Lo;0;L;;;;;N;;;;; +13572;EGYPTIAN HIEROGLYPH-13572;Lo;0;L;;;;;N;;;;; +13573;EGYPTIAN HIEROGLYPH-13573;Lo;0;L;;;;;N;;;;; +13574;EGYPTIAN HIEROGLYPH-13574;Lo;0;L;;;;;N;;;;; +13575;EGYPTIAN HIEROGLYPH-13575;Lo;0;L;;;;;N;;;;; +13576;EGYPTIAN HIEROGLYPH-13576;Lo;0;L;;;;;N;;;;; +13577;EGYPTIAN HIEROGLYPH-13577;Lo;0;L;;;;;N;;;;; +13578;EGYPTIAN HIEROGLYPH-13578;Lo;0;L;;;;;N;;;;; +13579;EGYPTIAN HIEROGLYPH-13579;Lo;0;L;;;;;N;;;;; +1357A;EGYPTIAN HIEROGLYPH-1357A;Lo;0;L;;;;;N;;;;; +1357B;EGYPTIAN HIEROGLYPH-1357B;Lo;0;L;;;;;N;;;;; +1357C;EGYPTIAN HIEROGLYPH-1357C;Lo;0;L;;;;;N;;;;; +1357D;EGYPTIAN HIEROGLYPH-1357D;Lo;0;L;;;;;N;;;;; +1357E;EGYPTIAN HIEROGLYPH-1357E;Lo;0;L;;;;;N;;;;; +1357F;EGYPTIAN HIEROGLYPH-1357F;Lo;0;L;;;;;N;;;;; +13580;EGYPTIAN HIEROGLYPH-13580;Lo;0;L;;;;;N;;;;; +13581;EGYPTIAN HIEROGLYPH-13581;Lo;0;L;;;;;N;;;;; +13582;EGYPTIAN HIEROGLYPH-13582;Lo;0;L;;;;;N;;;;; +13583;EGYPTIAN HIEROGLYPH-13583;Lo;0;L;;;;;N;;;;; +13584;EGYPTIAN HIEROGLYPH-13584;Lo;0;L;;;;;N;;;;; +13585;EGYPTIAN HIEROGLYPH-13585;Lo;0;L;;;;;N;;;;; +13586;EGYPTIAN HIEROGLYPH-13586;Lo;0;L;;;;;N;;;;; +13587;EGYPTIAN HIEROGLYPH-13587;Lo;0;L;;;;;N;;;;; +13588;EGYPTIAN HIEROGLYPH-13588;Lo;0;L;;;;;N;;;;; +13589;EGYPTIAN HIEROGLYPH-13589;Lo;0;L;;;;;N;;;;; +1358A;EGYPTIAN HIEROGLYPH-1358A;Lo;0;L;;;;;N;;;;; +1358B;EGYPTIAN HIEROGLYPH-1358B;Lo;0;L;;;;;N;;;;; +1358C;EGYPTIAN HIEROGLYPH-1358C;Lo;0;L;;;;;N;;;;; +1358D;EGYPTIAN HIEROGLYPH-1358D;Lo;0;L;;;;;N;;;;; +1358E;EGYPTIAN HIEROGLYPH-1358E;Lo;0;L;;;;;N;;;;; +1358F;EGYPTIAN HIEROGLYPH-1358F;Lo;0;L;;;;;N;;;;; +13590;EGYPTIAN HIEROGLYPH-13590;Lo;0;L;;;;;N;;;;; +13591;EGYPTIAN HIEROGLYPH-13591;Lo;0;L;;;;;N;;;;; +13592;EGYPTIAN HIEROGLYPH-13592;Lo;0;L;;;;;N;;;;; +13593;EGYPTIAN HIEROGLYPH-13593;Lo;0;L;;;;;N;;;;; +13594;EGYPTIAN HIEROGLYPH-13594;Lo;0;L;;;;;N;;;;; +13595;EGYPTIAN HIEROGLYPH-13595;Lo;0;L;;;;;N;;;;; +13596;EGYPTIAN HIEROGLYPH-13596;Lo;0;L;;;;;N;;;;; +13597;EGYPTIAN HIEROGLYPH-13597;Lo;0;L;;;;;N;;;;; +13598;EGYPTIAN HIEROGLYPH-13598;Lo;0;L;;;;;N;;;;; +13599;EGYPTIAN HIEROGLYPH-13599;Lo;0;L;;;;;N;;;;; +1359A;EGYPTIAN HIEROGLYPH-1359A;Lo;0;L;;;;;N;;;;; +1359B;EGYPTIAN HIEROGLYPH-1359B;Lo;0;L;;;;;N;;;;; +1359C;EGYPTIAN HIEROGLYPH-1359C;Lo;0;L;;;;;N;;;;; +1359D;EGYPTIAN HIEROGLYPH-1359D;Lo;0;L;;;;;N;;;;; +1359E;EGYPTIAN HIEROGLYPH-1359E;Lo;0;L;;;;;N;;;;; +1359F;EGYPTIAN HIEROGLYPH-1359F;Lo;0;L;;;;;N;;;;; +135A0;EGYPTIAN HIEROGLYPH-135A0;Lo;0;L;;;;;N;;;;; +135A1;EGYPTIAN HIEROGLYPH-135A1;Lo;0;L;;;;;N;;;;; +135A2;EGYPTIAN HIEROGLYPH-135A2;Lo;0;L;;;;;N;;;;; +135A3;EGYPTIAN HIEROGLYPH-135A3;Lo;0;L;;;;;N;;;;; +135A4;EGYPTIAN HIEROGLYPH-135A4;Lo;0;L;;;;;N;;;;; +135A5;EGYPTIAN HIEROGLYPH-135A5;Lo;0;L;;;;;N;;;;; +135A6;EGYPTIAN HIEROGLYPH-135A6;Lo;0;L;;;;;N;;;;; +135A7;EGYPTIAN HIEROGLYPH-135A7;Lo;0;L;;;;;N;;;;; +135A8;EGYPTIAN HIEROGLYPH-135A8;Lo;0;L;;;;;N;;;;; +135A9;EGYPTIAN HIEROGLYPH-135A9;Lo;0;L;;;;;N;;;;; +135AA;EGYPTIAN HIEROGLYPH-135AA;Lo;0;L;;;;;N;;;;; +135AB;EGYPTIAN HIEROGLYPH-135AB;Lo;0;L;;;;;N;;;;; +135AC;EGYPTIAN HIEROGLYPH-135AC;Lo;0;L;;;;;N;;;;; +135AD;EGYPTIAN HIEROGLYPH-135AD;Lo;0;L;;;;;N;;;;; +135AE;EGYPTIAN HIEROGLYPH-135AE;Lo;0;L;;;;;N;;;;; +135AF;EGYPTIAN HIEROGLYPH-135AF;Lo;0;L;;;;;N;;;;; +135B0;EGYPTIAN HIEROGLYPH-135B0;Lo;0;L;;;;;N;;;;; +135B1;EGYPTIAN HIEROGLYPH-135B1;Lo;0;L;;;;;N;;;;; +135B2;EGYPTIAN HIEROGLYPH-135B2;Lo;0;L;;;;;N;;;;; +135B3;EGYPTIAN HIEROGLYPH-135B3;Lo;0;L;;;;;N;;;;; +135B4;EGYPTIAN HIEROGLYPH-135B4;Lo;0;L;;;;;N;;;;; +135B5;EGYPTIAN HIEROGLYPH-135B5;Lo;0;L;;;;;N;;;;; +135B6;EGYPTIAN HIEROGLYPH-135B6;Lo;0;L;;;;;N;;;;; +135B7;EGYPTIAN HIEROGLYPH-135B7;Lo;0;L;;;;;N;;;;; +135B8;EGYPTIAN HIEROGLYPH-135B8;Lo;0;L;;;;;N;;;;; +135B9;EGYPTIAN HIEROGLYPH-135B9;Lo;0;L;;;;;N;;;;; +135BA;EGYPTIAN HIEROGLYPH-135BA;Lo;0;L;;;;;N;;;;; +135BB;EGYPTIAN HIEROGLYPH-135BB;Lo;0;L;;;;;N;;;;; +135BC;EGYPTIAN HIEROGLYPH-135BC;Lo;0;L;;;;;N;;;;; +135BD;EGYPTIAN HIEROGLYPH-135BD;Lo;0;L;;;;;N;;;;; +135BE;EGYPTIAN HIEROGLYPH-135BE;Lo;0;L;;;;;N;;;;; +135BF;EGYPTIAN HIEROGLYPH-135BF;Lo;0;L;;;;;N;;;;; +135C0;EGYPTIAN HIEROGLYPH-135C0;Lo;0;L;;;;;N;;;;; +135C1;EGYPTIAN HIEROGLYPH-135C1;Lo;0;L;;;;;N;;;;; +135C2;EGYPTIAN HIEROGLYPH-135C2;Lo;0;L;;;;;N;;;;; +135C3;EGYPTIAN HIEROGLYPH-135C3;Lo;0;L;;;;;N;;;;; +135C4;EGYPTIAN HIEROGLYPH-135C4;Lo;0;L;;;;;N;;;;; +135C5;EGYPTIAN HIEROGLYPH-135C5;Lo;0;L;;;;;N;;;;; +135C6;EGYPTIAN HIEROGLYPH-135C6;Lo;0;L;;;;;N;;;;; +135C7;EGYPTIAN HIEROGLYPH-135C7;Lo;0;L;;;;;N;;;;; +135C8;EGYPTIAN HIEROGLYPH-135C8;Lo;0;L;;;;;N;;;;; +135C9;EGYPTIAN HIEROGLYPH-135C9;Lo;0;L;;;;;N;;;;; +135CA;EGYPTIAN HIEROGLYPH-135CA;Lo;0;L;;;;;N;;;;; +135CB;EGYPTIAN HIEROGLYPH-135CB;Lo;0;L;;;;;N;;;;; +135CC;EGYPTIAN HIEROGLYPH-135CC;Lo;0;L;;;;;N;;;;; +135CD;EGYPTIAN HIEROGLYPH-135CD;Lo;0;L;;;;;N;;;;; +135CE;EGYPTIAN HIEROGLYPH-135CE;Lo;0;L;;;;;N;;;;; +135CF;EGYPTIAN HIEROGLYPH-135CF;Lo;0;L;;;;;N;;;;; +135D0;EGYPTIAN HIEROGLYPH-135D0;Lo;0;L;;;;;N;;;;; +135D1;EGYPTIAN HIEROGLYPH-135D1;Lo;0;L;;;;;N;;;;; +135D2;EGYPTIAN HIEROGLYPH-135D2;Lo;0;L;;;;;N;;;;; +135D3;EGYPTIAN HIEROGLYPH-135D3;Lo;0;L;;;;;N;;;;; +135D4;EGYPTIAN HIEROGLYPH-135D4;Lo;0;L;;;;;N;;;;; +135D5;EGYPTIAN HIEROGLYPH-135D5;Lo;0;L;;;;;N;;;;; +135D6;EGYPTIAN HIEROGLYPH-135D6;Lo;0;L;;;;;N;;;;; +135D7;EGYPTIAN HIEROGLYPH-135D7;Lo;0;L;;;;;N;;;;; +135D8;EGYPTIAN HIEROGLYPH-135D8;Lo;0;L;;;;;N;;;;; +135D9;EGYPTIAN HIEROGLYPH-135D9;Lo;0;L;;;;;N;;;;; +135DA;EGYPTIAN HIEROGLYPH-135DA;Lo;0;L;;;;;N;;;;; +135DB;EGYPTIAN HIEROGLYPH-135DB;Lo;0;L;;;;;N;;;;; +135DC;EGYPTIAN HIEROGLYPH-135DC;Lo;0;L;;;;;N;;;;; +135DD;EGYPTIAN HIEROGLYPH-135DD;Lo;0;L;;;;;N;;;;; +135DE;EGYPTIAN HIEROGLYPH-135DE;Lo;0;L;;;;;N;;;;; +135DF;EGYPTIAN HIEROGLYPH-135DF;Lo;0;L;;;;;N;;;;; +135E0;EGYPTIAN HIEROGLYPH-135E0;Lo;0;L;;;;;N;;;;; +135E1;EGYPTIAN HIEROGLYPH-135E1;Lo;0;L;;;;;N;;;;; +135E2;EGYPTIAN HIEROGLYPH-135E2;Lo;0;L;;;;;N;;;;; +135E3;EGYPTIAN HIEROGLYPH-135E3;Lo;0;L;;;;;N;;;;; +135E4;EGYPTIAN HIEROGLYPH-135E4;Lo;0;L;;;;;N;;;;; +135E5;EGYPTIAN HIEROGLYPH-135E5;Lo;0;L;;;;;N;;;;; +135E6;EGYPTIAN HIEROGLYPH-135E6;Lo;0;L;;;;;N;;;;; +135E7;EGYPTIAN HIEROGLYPH-135E7;Lo;0;L;;;;;N;;;;; +135E8;EGYPTIAN HIEROGLYPH-135E8;Lo;0;L;;;;;N;;;;; +135E9;EGYPTIAN HIEROGLYPH-135E9;Lo;0;L;;;;;N;;;;; +135EA;EGYPTIAN HIEROGLYPH-135EA;Lo;0;L;;;;;N;;;;; +135EB;EGYPTIAN HIEROGLYPH-135EB;Lo;0;L;;;;;N;;;;; +135EC;EGYPTIAN HIEROGLYPH-135EC;Lo;0;L;;;;;N;;;;; +135ED;EGYPTIAN HIEROGLYPH-135ED;Lo;0;L;;;;;N;;;;; +135EE;EGYPTIAN HIEROGLYPH-135EE;Lo;0;L;;;;;N;;;;; +135EF;EGYPTIAN HIEROGLYPH-135EF;Lo;0;L;;;;;N;;;;; +135F0;EGYPTIAN HIEROGLYPH-135F0;Lo;0;L;;;;;N;;;;; +135F1;EGYPTIAN HIEROGLYPH-135F1;Lo;0;L;;;;;N;;;;; +135F2;EGYPTIAN HIEROGLYPH-135F2;Lo;0;L;;;;;N;;;;; +135F3;EGYPTIAN HIEROGLYPH-135F3;Lo;0;L;;;;;N;;;;; +135F4;EGYPTIAN HIEROGLYPH-135F4;Lo;0;L;;;;;N;;;;; +135F5;EGYPTIAN HIEROGLYPH-135F5;Lo;0;L;;;;;N;;;;; +135F6;EGYPTIAN HIEROGLYPH-135F6;Lo;0;L;;;;;N;;;;; +135F7;EGYPTIAN HIEROGLYPH-135F7;Lo;0;L;;;;;N;;;;; +135F8;EGYPTIAN HIEROGLYPH-135F8;Lo;0;L;;;;;N;;;;; +135F9;EGYPTIAN HIEROGLYPH-135F9;Lo;0;L;;;;;N;;;;; +135FA;EGYPTIAN HIEROGLYPH-135FA;Lo;0;L;;;;;N;;;;; +135FB;EGYPTIAN HIEROGLYPH-135FB;Lo;0;L;;;;;N;;;;; +135FC;EGYPTIAN HIEROGLYPH-135FC;Lo;0;L;;;;;N;;;;; +135FD;EGYPTIAN HIEROGLYPH-135FD;Lo;0;L;;;;;N;;;;; +135FE;EGYPTIAN HIEROGLYPH-135FE;Lo;0;L;;;;;N;;;;; +135FF;EGYPTIAN HIEROGLYPH-135FF;Lo;0;L;;;;;N;;;;; +13600;EGYPTIAN HIEROGLYPH-13600;Lo;0;L;;;;;N;;;;; +13601;EGYPTIAN HIEROGLYPH-13601;Lo;0;L;;;;;N;;;;; +13602;EGYPTIAN HIEROGLYPH-13602;Lo;0;L;;;;;N;;;;; +13603;EGYPTIAN HIEROGLYPH-13603;Lo;0;L;;;;;N;;;;; +13604;EGYPTIAN HIEROGLYPH-13604;Lo;0;L;;;;;N;;;;; +13605;EGYPTIAN HIEROGLYPH-13605;Lo;0;L;;;;;N;;;;; +13606;EGYPTIAN HIEROGLYPH-13606;Lo;0;L;;;;;N;;;;; +13607;EGYPTIAN HIEROGLYPH-13607;Lo;0;L;;;;;N;;;;; +13608;EGYPTIAN HIEROGLYPH-13608;Lo;0;L;;;;;N;;;;; +13609;EGYPTIAN HIEROGLYPH-13609;Lo;0;L;;;;;N;;;;; +1360A;EGYPTIAN HIEROGLYPH-1360A;Lo;0;L;;;;;N;;;;; +1360B;EGYPTIAN HIEROGLYPH-1360B;Lo;0;L;;;;;N;;;;; +1360C;EGYPTIAN HIEROGLYPH-1360C;Lo;0;L;;;;;N;;;;; +1360D;EGYPTIAN HIEROGLYPH-1360D;Lo;0;L;;;;;N;;;;; +1360E;EGYPTIAN HIEROGLYPH-1360E;Lo;0;L;;;;;N;;;;; +1360F;EGYPTIAN HIEROGLYPH-1360F;Lo;0;L;;;;;N;;;;; +13610;EGYPTIAN HIEROGLYPH-13610;Lo;0;L;;;;;N;;;;; +13611;EGYPTIAN HIEROGLYPH-13611;Lo;0;L;;;;;N;;;;; +13612;EGYPTIAN HIEROGLYPH-13612;Lo;0;L;;;;;N;;;;; +13613;EGYPTIAN HIEROGLYPH-13613;Lo;0;L;;;;;N;;;;; +13614;EGYPTIAN HIEROGLYPH-13614;Lo;0;L;;;;;N;;;;; +13615;EGYPTIAN HIEROGLYPH-13615;Lo;0;L;;;;;N;;;;; +13616;EGYPTIAN HIEROGLYPH-13616;Lo;0;L;;;;;N;;;;; +13617;EGYPTIAN HIEROGLYPH-13617;Lo;0;L;;;;;N;;;;; +13618;EGYPTIAN HIEROGLYPH-13618;Lo;0;L;;;;;N;;;;; +13619;EGYPTIAN HIEROGLYPH-13619;Lo;0;L;;;;;N;;;;; +1361A;EGYPTIAN HIEROGLYPH-1361A;Lo;0;L;;;;;N;;;;; +1361B;EGYPTIAN HIEROGLYPH-1361B;Lo;0;L;;;;;N;;;;; +1361C;EGYPTIAN HIEROGLYPH-1361C;Lo;0;L;;;;;N;;;;; +1361D;EGYPTIAN HIEROGLYPH-1361D;Lo;0;L;;;;;N;;;;; +1361E;EGYPTIAN HIEROGLYPH-1361E;Lo;0;L;;;;;N;;;;; +1361F;EGYPTIAN HIEROGLYPH-1361F;Lo;0;L;;;;;N;;;;; +13620;EGYPTIAN HIEROGLYPH-13620;Lo;0;L;;;;;N;;;;; +13621;EGYPTIAN HIEROGLYPH-13621;Lo;0;L;;;;;N;;;;; +13622;EGYPTIAN HIEROGLYPH-13622;Lo;0;L;;;;;N;;;;; +13623;EGYPTIAN HIEROGLYPH-13623;Lo;0;L;;;;;N;;;;; +13624;EGYPTIAN HIEROGLYPH-13624;Lo;0;L;;;;;N;;;;; +13625;EGYPTIAN HIEROGLYPH-13625;Lo;0;L;;;;;N;;;;; +13626;EGYPTIAN HIEROGLYPH-13626;Lo;0;L;;;;;N;;;;; +13627;EGYPTIAN HIEROGLYPH-13627;Lo;0;L;;;;;N;;;;; +13628;EGYPTIAN HIEROGLYPH-13628;Lo;0;L;;;;;N;;;;; +13629;EGYPTIAN HIEROGLYPH-13629;Lo;0;L;;;;;N;;;;; +1362A;EGYPTIAN HIEROGLYPH-1362A;Lo;0;L;;;;;N;;;;; +1362B;EGYPTIAN HIEROGLYPH-1362B;Lo;0;L;;;;;N;;;;; +1362C;EGYPTIAN HIEROGLYPH-1362C;Lo;0;L;;;;;N;;;;; +1362D;EGYPTIAN HIEROGLYPH-1362D;Lo;0;L;;;;;N;;;;; +1362E;EGYPTIAN HIEROGLYPH-1362E;Lo;0;L;;;;;N;;;;; +1362F;EGYPTIAN HIEROGLYPH-1362F;Lo;0;L;;;;;N;;;;; +13630;EGYPTIAN HIEROGLYPH-13630;Lo;0;L;;;;;N;;;;; +13631;EGYPTIAN HIEROGLYPH-13631;Lo;0;L;;;;;N;;;;; +13632;EGYPTIAN HIEROGLYPH-13632;Lo;0;L;;;;;N;;;;; +13633;EGYPTIAN HIEROGLYPH-13633;Lo;0;L;;;;;N;;;;; +13634;EGYPTIAN HIEROGLYPH-13634;Lo;0;L;;;;;N;;;;; +13635;EGYPTIAN HIEROGLYPH-13635;Lo;0;L;;;;;N;;;;; +13636;EGYPTIAN HIEROGLYPH-13636;Lo;0;L;;;;;N;;;;; +13637;EGYPTIAN HIEROGLYPH-13637;Lo;0;L;;;;;N;;;;; +13638;EGYPTIAN HIEROGLYPH-13638;Lo;0;L;;;;;N;;;;; +13639;EGYPTIAN HIEROGLYPH-13639;Lo;0;L;;;;;N;;;;; +1363A;EGYPTIAN HIEROGLYPH-1363A;Lo;0;L;;;;;N;;;;; +1363B;EGYPTIAN HIEROGLYPH-1363B;Lo;0;L;;;;;N;;;;; +1363C;EGYPTIAN HIEROGLYPH-1363C;Lo;0;L;;;;;N;;;;; +1363D;EGYPTIAN HIEROGLYPH-1363D;Lo;0;L;;;;;N;;;;; +1363E;EGYPTIAN HIEROGLYPH-1363E;Lo;0;L;;;;;N;;;;; +1363F;EGYPTIAN HIEROGLYPH-1363F;Lo;0;L;;;;;N;;;;; +13640;EGYPTIAN HIEROGLYPH-13640;Lo;0;L;;;;;N;;;;; +13641;EGYPTIAN HIEROGLYPH-13641;Lo;0;L;;;;;N;;;;; +13642;EGYPTIAN HIEROGLYPH-13642;Lo;0;L;;;;;N;;;;; +13643;EGYPTIAN HIEROGLYPH-13643;Lo;0;L;;;;;N;;;;; +13644;EGYPTIAN HIEROGLYPH-13644;Lo;0;L;;;;;N;;;;; +13645;EGYPTIAN HIEROGLYPH-13645;Lo;0;L;;;;;N;;;;; +13646;EGYPTIAN HIEROGLYPH-13646;Lo;0;L;;;;;N;;;;; +13647;EGYPTIAN HIEROGLYPH-13647;Lo;0;L;;;;;N;;;;; +13648;EGYPTIAN HIEROGLYPH-13648;Lo;0;L;;;;;N;;;;; +13649;EGYPTIAN HIEROGLYPH-13649;Lo;0;L;;;;;N;;;;; +1364A;EGYPTIAN HIEROGLYPH-1364A;Lo;0;L;;;;;N;;;;; +1364B;EGYPTIAN HIEROGLYPH-1364B;Lo;0;L;;;;;N;;;;; +1364C;EGYPTIAN HIEROGLYPH-1364C;Lo;0;L;;;;;N;;;;; +1364D;EGYPTIAN HIEROGLYPH-1364D;Lo;0;L;;;;;N;;;;; +1364E;EGYPTIAN HIEROGLYPH-1364E;Lo;0;L;;;;;N;;;;; +1364F;EGYPTIAN HIEROGLYPH-1364F;Lo;0;L;;;;;N;;;;; +13650;EGYPTIAN HIEROGLYPH-13650;Lo;0;L;;;;;N;;;;; +13651;EGYPTIAN HIEROGLYPH-13651;Lo;0;L;;;;;N;;;;; +13652;EGYPTIAN HIEROGLYPH-13652;Lo;0;L;;;;;N;;;;; +13653;EGYPTIAN HIEROGLYPH-13653;Lo;0;L;;;;;N;;;;; +13654;EGYPTIAN HIEROGLYPH-13654;Lo;0;L;;;;;N;;;;; +13655;EGYPTIAN HIEROGLYPH-13655;Lo;0;L;;;;;N;;;;; +13656;EGYPTIAN HIEROGLYPH-13656;Lo;0;L;;;;;N;;;;; +13657;EGYPTIAN HIEROGLYPH-13657;Lo;0;L;;;;;N;;;;; +13658;EGYPTIAN HIEROGLYPH-13658;Lo;0;L;;;;;N;;;;; +13659;EGYPTIAN HIEROGLYPH-13659;Lo;0;L;;;;;N;;;;; +1365A;EGYPTIAN HIEROGLYPH-1365A;Lo;0;L;;;;;N;;;;; +1365B;EGYPTIAN HIEROGLYPH-1365B;Lo;0;L;;;;;N;;;;; +1365C;EGYPTIAN HIEROGLYPH-1365C;Lo;0;L;;;;;N;;;;; +1365D;EGYPTIAN HIEROGLYPH-1365D;Lo;0;L;;;;;N;;;;; +1365E;EGYPTIAN HIEROGLYPH-1365E;Lo;0;L;;;;;N;;;;; +1365F;EGYPTIAN HIEROGLYPH-1365F;Lo;0;L;;;;;N;;;;; +13660;EGYPTIAN HIEROGLYPH-13660;Lo;0;L;;;;;N;;;;; +13661;EGYPTIAN HIEROGLYPH-13661;Lo;0;L;;;;;N;;;;; +13662;EGYPTIAN HIEROGLYPH-13662;Lo;0;L;;;;;N;;;;; +13663;EGYPTIAN HIEROGLYPH-13663;Lo;0;L;;;;;N;;;;; +13664;EGYPTIAN HIEROGLYPH-13664;Lo;0;L;;;;;N;;;;; +13665;EGYPTIAN HIEROGLYPH-13665;Lo;0;L;;;;;N;;;;; +13666;EGYPTIAN HIEROGLYPH-13666;Lo;0;L;;;;;N;;;;; +13667;EGYPTIAN HIEROGLYPH-13667;Lo;0;L;;;;;N;;;;; +13668;EGYPTIAN HIEROGLYPH-13668;Lo;0;L;;;;;N;;;;; +13669;EGYPTIAN HIEROGLYPH-13669;Lo;0;L;;;;;N;;;;; +1366A;EGYPTIAN HIEROGLYPH-1366A;Lo;0;L;;;;;N;;;;; +1366B;EGYPTIAN HIEROGLYPH-1366B;Lo;0;L;;;;;N;;;;; +1366C;EGYPTIAN HIEROGLYPH-1366C;Lo;0;L;;;;;N;;;;; +1366D;EGYPTIAN HIEROGLYPH-1366D;Lo;0;L;;;;;N;;;;; +1366E;EGYPTIAN HIEROGLYPH-1366E;Lo;0;L;;;;;N;;;;; +1366F;EGYPTIAN HIEROGLYPH-1366F;Lo;0;L;;;;;N;;;;; +13670;EGYPTIAN HIEROGLYPH-13670;Lo;0;L;;;;;N;;;;; +13671;EGYPTIAN HIEROGLYPH-13671;Lo;0;L;;;;;N;;;;; +13672;EGYPTIAN HIEROGLYPH-13672;Lo;0;L;;;;;N;;;;; +13673;EGYPTIAN HIEROGLYPH-13673;Lo;0;L;;;;;N;;;;; +13674;EGYPTIAN HIEROGLYPH-13674;Lo;0;L;;;;;N;;;;; +13675;EGYPTIAN HIEROGLYPH-13675;Lo;0;L;;;;;N;;;;; +13676;EGYPTIAN HIEROGLYPH-13676;Lo;0;L;;;;;N;;;;; +13677;EGYPTIAN HIEROGLYPH-13677;Lo;0;L;;;;;N;;;;; +13678;EGYPTIAN HIEROGLYPH-13678;Lo;0;L;;;;;N;;;;; +13679;EGYPTIAN HIEROGLYPH-13679;Lo;0;L;;;;;N;;;;; +1367A;EGYPTIAN HIEROGLYPH-1367A;Lo;0;L;;;;;N;;;;; +1367B;EGYPTIAN HIEROGLYPH-1367B;Lo;0;L;;;;;N;;;;; +1367C;EGYPTIAN HIEROGLYPH-1367C;Lo;0;L;;;;;N;;;;; +1367D;EGYPTIAN HIEROGLYPH-1367D;Lo;0;L;;;;;N;;;;; +1367E;EGYPTIAN HIEROGLYPH-1367E;Lo;0;L;;;;;N;;;;; +1367F;EGYPTIAN HIEROGLYPH-1367F;Lo;0;L;;;;;N;;;;; +13680;EGYPTIAN HIEROGLYPH-13680;Lo;0;L;;;;;N;;;;; +13681;EGYPTIAN HIEROGLYPH-13681;Lo;0;L;;;;;N;;;;; +13682;EGYPTIAN HIEROGLYPH-13682;Lo;0;L;;;;;N;;;;; +13683;EGYPTIAN HIEROGLYPH-13683;Lo;0;L;;;;;N;;;;; +13684;EGYPTIAN HIEROGLYPH-13684;Lo;0;L;;;;;N;;;;; +13685;EGYPTIAN HIEROGLYPH-13685;Lo;0;L;;;;;N;;;;; +13686;EGYPTIAN HIEROGLYPH-13686;Lo;0;L;;;;;N;;;;; +13687;EGYPTIAN HIEROGLYPH-13687;Lo;0;L;;;;;N;;;;; +13688;EGYPTIAN HIEROGLYPH-13688;Lo;0;L;;;;;N;;;;; +13689;EGYPTIAN HIEROGLYPH-13689;Lo;0;L;;;;;N;;;;; +1368A;EGYPTIAN HIEROGLYPH-1368A;Lo;0;L;;;;;N;;;;; +1368B;EGYPTIAN HIEROGLYPH-1368B;Lo;0;L;;;;;N;;;;; +1368C;EGYPTIAN HIEROGLYPH-1368C;Lo;0;L;;;;;N;;;;; +1368D;EGYPTIAN HIEROGLYPH-1368D;Lo;0;L;;;;;N;;;;; +1368E;EGYPTIAN HIEROGLYPH-1368E;Lo;0;L;;;;;N;;;;; +1368F;EGYPTIAN HIEROGLYPH-1368F;Lo;0;L;;;;;N;;;;; +13690;EGYPTIAN HIEROGLYPH-13690;Lo;0;L;;;;;N;;;;; +13691;EGYPTIAN HIEROGLYPH-13691;Lo;0;L;;;;;N;;;;; +13692;EGYPTIAN HIEROGLYPH-13692;Lo;0;L;;;;;N;;;;; +13693;EGYPTIAN HIEROGLYPH-13693;Lo;0;L;;;;;N;;;;; +13694;EGYPTIAN HIEROGLYPH-13694;Lo;0;L;;;;;N;;;;; +13695;EGYPTIAN HIEROGLYPH-13695;Lo;0;L;;;;;N;;;;; +13696;EGYPTIAN HIEROGLYPH-13696;Lo;0;L;;;;;N;;;;; +13697;EGYPTIAN HIEROGLYPH-13697;Lo;0;L;;;;;N;;;;; +13698;EGYPTIAN HIEROGLYPH-13698;Lo;0;L;;;;;N;;;;; +13699;EGYPTIAN HIEROGLYPH-13699;Lo;0;L;;;;;N;;;;; +1369A;EGYPTIAN HIEROGLYPH-1369A;Lo;0;L;;;;;N;;;;; +1369B;EGYPTIAN HIEROGLYPH-1369B;Lo;0;L;;;;;N;;;;; +1369C;EGYPTIAN HIEROGLYPH-1369C;Lo;0;L;;;;;N;;;;; +1369D;EGYPTIAN HIEROGLYPH-1369D;Lo;0;L;;;;;N;;;;; +1369E;EGYPTIAN HIEROGLYPH-1369E;Lo;0;L;;;;;N;;;;; +1369F;EGYPTIAN HIEROGLYPH-1369F;Lo;0;L;;;;;N;;;;; +136A0;EGYPTIAN HIEROGLYPH-136A0;Lo;0;L;;;;;N;;;;; +136A1;EGYPTIAN HIEROGLYPH-136A1;Lo;0;L;;;;;N;;;;; +136A2;EGYPTIAN HIEROGLYPH-136A2;Lo;0;L;;;;;N;;;;; +136A3;EGYPTIAN HIEROGLYPH-136A3;Lo;0;L;;;;;N;;;;; +136A4;EGYPTIAN HIEROGLYPH-136A4;Lo;0;L;;;;;N;;;;; +136A5;EGYPTIAN HIEROGLYPH-136A5;Lo;0;L;;;;;N;;;;; +136A6;EGYPTIAN HIEROGLYPH-136A6;Lo;0;L;;;;;N;;;;; +136A7;EGYPTIAN HIEROGLYPH-136A7;Lo;0;L;;;;;N;;;;; +136A8;EGYPTIAN HIEROGLYPH-136A8;Lo;0;L;;;;;N;;;;; +136A9;EGYPTIAN HIEROGLYPH-136A9;Lo;0;L;;;;;N;;;;; +136AA;EGYPTIAN HIEROGLYPH-136AA;Lo;0;L;;;;;N;;;;; +136AB;EGYPTIAN HIEROGLYPH-136AB;Lo;0;L;;;;;N;;;;; +136AC;EGYPTIAN HIEROGLYPH-136AC;Lo;0;L;;;;;N;;;;; +136AD;EGYPTIAN HIEROGLYPH-136AD;Lo;0;L;;;;;N;;;;; +136AE;EGYPTIAN HIEROGLYPH-136AE;Lo;0;L;;;;;N;;;;; +136AF;EGYPTIAN HIEROGLYPH-136AF;Lo;0;L;;;;;N;;;;; +136B0;EGYPTIAN HIEROGLYPH-136B0;Lo;0;L;;;;;N;;;;; +136B1;EGYPTIAN HIEROGLYPH-136B1;Lo;0;L;;;;;N;;;;; +136B2;EGYPTIAN HIEROGLYPH-136B2;Lo;0;L;;;;;N;;;;; +136B3;EGYPTIAN HIEROGLYPH-136B3;Lo;0;L;;;;;N;;;;; +136B4;EGYPTIAN HIEROGLYPH-136B4;Lo;0;L;;;;;N;;;;; +136B5;EGYPTIAN HIEROGLYPH-136B5;Lo;0;L;;;;;N;;;;; +136B6;EGYPTIAN HIEROGLYPH-136B6;Lo;0;L;;;;;N;;;;; +136B7;EGYPTIAN HIEROGLYPH-136B7;Lo;0;L;;;;;N;;;;; +136B8;EGYPTIAN HIEROGLYPH-136B8;Lo;0;L;;;;;N;;;;; +136B9;EGYPTIAN HIEROGLYPH-136B9;Lo;0;L;;;;;N;;;;; +136BA;EGYPTIAN HIEROGLYPH-136BA;Lo;0;L;;;;;N;;;;; +136BB;EGYPTIAN HIEROGLYPH-136BB;Lo;0;L;;;;;N;;;;; +136BC;EGYPTIAN HIEROGLYPH-136BC;Lo;0;L;;;;;N;;;;; +136BD;EGYPTIAN HIEROGLYPH-136BD;Lo;0;L;;;;;N;;;;; +136BE;EGYPTIAN HIEROGLYPH-136BE;Lo;0;L;;;;;N;;;;; +136BF;EGYPTIAN HIEROGLYPH-136BF;Lo;0;L;;;;;N;;;;; +136C0;EGYPTIAN HIEROGLYPH-136C0;Lo;0;L;;;;;N;;;;; +136C1;EGYPTIAN HIEROGLYPH-136C1;Lo;0;L;;;;;N;;;;; +136C2;EGYPTIAN HIEROGLYPH-136C2;Lo;0;L;;;;;N;;;;; +136C3;EGYPTIAN HIEROGLYPH-136C3;Lo;0;L;;;;;N;;;;; +136C4;EGYPTIAN HIEROGLYPH-136C4;Lo;0;L;;;;;N;;;;; +136C5;EGYPTIAN HIEROGLYPH-136C5;Lo;0;L;;;;;N;;;;; +136C6;EGYPTIAN HIEROGLYPH-136C6;Lo;0;L;;;;;N;;;;; +136C7;EGYPTIAN HIEROGLYPH-136C7;Lo;0;L;;;;;N;;;;; +136C8;EGYPTIAN HIEROGLYPH-136C8;Lo;0;L;;;;;N;;;;; +136C9;EGYPTIAN HIEROGLYPH-136C9;Lo;0;L;;;;;N;;;;; +136CA;EGYPTIAN HIEROGLYPH-136CA;Lo;0;L;;;;;N;;;;; +136CB;EGYPTIAN HIEROGLYPH-136CB;Lo;0;L;;;;;N;;;;; +136CC;EGYPTIAN HIEROGLYPH-136CC;Lo;0;L;;;;;N;;;;; +136CD;EGYPTIAN HIEROGLYPH-136CD;Lo;0;L;;;;;N;;;;; +136CE;EGYPTIAN HIEROGLYPH-136CE;Lo;0;L;;;;;N;;;;; +136CF;EGYPTIAN HIEROGLYPH-136CF;Lo;0;L;;;;;N;;;;; +136D0;EGYPTIAN HIEROGLYPH-136D0;Lo;0;L;;;;;N;;;;; +136D1;EGYPTIAN HIEROGLYPH-136D1;Lo;0;L;;;;;N;;;;; +136D2;EGYPTIAN HIEROGLYPH-136D2;Lo;0;L;;;;;N;;;;; +136D3;EGYPTIAN HIEROGLYPH-136D3;Lo;0;L;;;;;N;;;;; +136D4;EGYPTIAN HIEROGLYPH-136D4;Lo;0;L;;;;;N;;;;; +136D5;EGYPTIAN HIEROGLYPH-136D5;Lo;0;L;;;;;N;;;;; +136D6;EGYPTIAN HIEROGLYPH-136D6;Lo;0;L;;;;;N;;;;; +136D7;EGYPTIAN HIEROGLYPH-136D7;Lo;0;L;;;;;N;;;;; +136D8;EGYPTIAN HIEROGLYPH-136D8;Lo;0;L;;;;;N;;;;; +136D9;EGYPTIAN HIEROGLYPH-136D9;Lo;0;L;;;;;N;;;;; +136DA;EGYPTIAN HIEROGLYPH-136DA;Lo;0;L;;;;;N;;;;; +136DB;EGYPTIAN HIEROGLYPH-136DB;Lo;0;L;;;;;N;;;;; +136DC;EGYPTIAN HIEROGLYPH-136DC;Lo;0;L;;;;;N;;;;; +136DD;EGYPTIAN HIEROGLYPH-136DD;Lo;0;L;;;;;N;;;;; +136DE;EGYPTIAN HIEROGLYPH-136DE;Lo;0;L;;;;;N;;;;; +136DF;EGYPTIAN HIEROGLYPH-136DF;Lo;0;L;;;;;N;;;;; +136E0;EGYPTIAN HIEROGLYPH-136E0;Lo;0;L;;;;;N;;;;; +136E1;EGYPTIAN HIEROGLYPH-136E1;Lo;0;L;;;;;N;;;;; +136E2;EGYPTIAN HIEROGLYPH-136E2;Lo;0;L;;;;;N;;;;; +136E3;EGYPTIAN HIEROGLYPH-136E3;Lo;0;L;;;;;N;;;;; +136E4;EGYPTIAN HIEROGLYPH-136E4;Lo;0;L;;;;;N;;;;; +136E5;EGYPTIAN HIEROGLYPH-136E5;Lo;0;L;;;;;N;;;;; +136E6;EGYPTIAN HIEROGLYPH-136E6;Lo;0;L;;;;;N;;;;; +136E7;EGYPTIAN HIEROGLYPH-136E7;Lo;0;L;;;;;N;;;;; +136E8;EGYPTIAN HIEROGLYPH-136E8;Lo;0;L;;;;;N;;;;; +136E9;EGYPTIAN HIEROGLYPH-136E9;Lo;0;L;;;;;N;;;;; +136EA;EGYPTIAN HIEROGLYPH-136EA;Lo;0;L;;;;;N;;;;; +136EB;EGYPTIAN HIEROGLYPH-136EB;Lo;0;L;;;;;N;;;;; +136EC;EGYPTIAN HIEROGLYPH-136EC;Lo;0;L;;;;;N;;;;; +136ED;EGYPTIAN HIEROGLYPH-136ED;Lo;0;L;;;;;N;;;;; +136EE;EGYPTIAN HIEROGLYPH-136EE;Lo;0;L;;;;;N;;;;; +136EF;EGYPTIAN HIEROGLYPH-136EF;Lo;0;L;;;;;N;;;;; +136F0;EGYPTIAN HIEROGLYPH-136F0;Lo;0;L;;;;;N;;;;; +136F1;EGYPTIAN HIEROGLYPH-136F1;Lo;0;L;;;;;N;;;;; +136F2;EGYPTIAN HIEROGLYPH-136F2;Lo;0;L;;;;;N;;;;; +136F3;EGYPTIAN HIEROGLYPH-136F3;Lo;0;L;;;;;N;;;;; +136F4;EGYPTIAN HIEROGLYPH-136F4;Lo;0;L;;;;;N;;;;; +136F5;EGYPTIAN HIEROGLYPH-136F5;Lo;0;L;;;;;N;;;;; +136F6;EGYPTIAN HIEROGLYPH-136F6;Lo;0;L;;;;;N;;;;; +136F7;EGYPTIAN HIEROGLYPH-136F7;Lo;0;L;;;;;N;;;;; +136F8;EGYPTIAN HIEROGLYPH-136F8;Lo;0;L;;;;;N;;;;; +136F9;EGYPTIAN HIEROGLYPH-136F9;Lo;0;L;;;;;N;;;;; +136FA;EGYPTIAN HIEROGLYPH-136FA;Lo;0;L;;;;;N;;;;; +136FB;EGYPTIAN HIEROGLYPH-136FB;Lo;0;L;;;;;N;;;;; +136FC;EGYPTIAN HIEROGLYPH-136FC;Lo;0;L;;;;;N;;;;; +136FD;EGYPTIAN HIEROGLYPH-136FD;Lo;0;L;;;;;N;;;;; +136FE;EGYPTIAN HIEROGLYPH-136FE;Lo;0;L;;;;;N;;;;; +136FF;EGYPTIAN HIEROGLYPH-136FF;Lo;0;L;;;;;N;;;;; +13700;EGYPTIAN HIEROGLYPH-13700;Lo;0;L;;;;;N;;;;; +13701;EGYPTIAN HIEROGLYPH-13701;Lo;0;L;;;;;N;;;;; +13702;EGYPTIAN HIEROGLYPH-13702;Lo;0;L;;;;;N;;;;; +13703;EGYPTIAN HIEROGLYPH-13703;Lo;0;L;;;;;N;;;;; +13704;EGYPTIAN HIEROGLYPH-13704;Lo;0;L;;;;;N;;;;; +13705;EGYPTIAN HIEROGLYPH-13705;Lo;0;L;;;;;N;;;;; +13706;EGYPTIAN HIEROGLYPH-13706;Lo;0;L;;;;;N;;;;; +13707;EGYPTIAN HIEROGLYPH-13707;Lo;0;L;;;;;N;;;;; +13708;EGYPTIAN HIEROGLYPH-13708;Lo;0;L;;;;;N;;;;; +13709;EGYPTIAN HIEROGLYPH-13709;Lo;0;L;;;;;N;;;;; +1370A;EGYPTIAN HIEROGLYPH-1370A;Lo;0;L;;;;;N;;;;; +1370B;EGYPTIAN HIEROGLYPH-1370B;Lo;0;L;;;;;N;;;;; +1370C;EGYPTIAN HIEROGLYPH-1370C;Lo;0;L;;;;;N;;;;; +1370D;EGYPTIAN HIEROGLYPH-1370D;Lo;0;L;;;;;N;;;;; +1370E;EGYPTIAN HIEROGLYPH-1370E;Lo;0;L;;;;;N;;;;; +1370F;EGYPTIAN HIEROGLYPH-1370F;Lo;0;L;;;;;N;;;;; +13710;EGYPTIAN HIEROGLYPH-13710;Lo;0;L;;;;;N;;;;; +13711;EGYPTIAN HIEROGLYPH-13711;Lo;0;L;;;;;N;;;;; +13712;EGYPTIAN HIEROGLYPH-13712;Lo;0;L;;;;;N;;;;; +13713;EGYPTIAN HIEROGLYPH-13713;Lo;0;L;;;;;N;;;;; +13714;EGYPTIAN HIEROGLYPH-13714;Lo;0;L;;;;;N;;;;; +13715;EGYPTIAN HIEROGLYPH-13715;Lo;0;L;;;;;N;;;;; +13716;EGYPTIAN HIEROGLYPH-13716;Lo;0;L;;;;;N;;;;; +13717;EGYPTIAN HIEROGLYPH-13717;Lo;0;L;;;;;N;;;;; +13718;EGYPTIAN HIEROGLYPH-13718;Lo;0;L;;;;;N;;;;; +13719;EGYPTIAN HIEROGLYPH-13719;Lo;0;L;;;;;N;;;;; +1371A;EGYPTIAN HIEROGLYPH-1371A;Lo;0;L;;;;;N;;;;; +1371B;EGYPTIAN HIEROGLYPH-1371B;Lo;0;L;;;;;N;;;;; +1371C;EGYPTIAN HIEROGLYPH-1371C;Lo;0;L;;;;;N;;;;; +1371D;EGYPTIAN HIEROGLYPH-1371D;Lo;0;L;;;;;N;;;;; +1371E;EGYPTIAN HIEROGLYPH-1371E;Lo;0;L;;;;;N;;;;; +1371F;EGYPTIAN HIEROGLYPH-1371F;Lo;0;L;;;;;N;;;;; +13720;EGYPTIAN HIEROGLYPH-13720;Lo;0;L;;;;;N;;;;; +13721;EGYPTIAN HIEROGLYPH-13721;Lo;0;L;;;;;N;;;;; +13722;EGYPTIAN HIEROGLYPH-13722;Lo;0;L;;;;;N;;;;; +13723;EGYPTIAN HIEROGLYPH-13723;Lo;0;L;;;;;N;;;;; +13724;EGYPTIAN HIEROGLYPH-13724;Lo;0;L;;;;;N;;;;; +13725;EGYPTIAN HIEROGLYPH-13725;Lo;0;L;;;;;N;;;;; +13726;EGYPTIAN HIEROGLYPH-13726;Lo;0;L;;;;;N;;;;; +13727;EGYPTIAN HIEROGLYPH-13727;Lo;0;L;;;;;N;;;;; +13728;EGYPTIAN HIEROGLYPH-13728;Lo;0;L;;;;;N;;;;; +13729;EGYPTIAN HIEROGLYPH-13729;Lo;0;L;;;;;N;;;;; +1372A;EGYPTIAN HIEROGLYPH-1372A;Lo;0;L;;;;;N;;;;; +1372B;EGYPTIAN HIEROGLYPH-1372B;Lo;0;L;;;;;N;;;;; +1372C;EGYPTIAN HIEROGLYPH-1372C;Lo;0;L;;;;;N;;;;; +1372D;EGYPTIAN HIEROGLYPH-1372D;Lo;0;L;;;;;N;;;;; +1372E;EGYPTIAN HIEROGLYPH-1372E;Lo;0;L;;;;;N;;;;; +1372F;EGYPTIAN HIEROGLYPH-1372F;Lo;0;L;;;;;N;;;;; +13730;EGYPTIAN HIEROGLYPH-13730;Lo;0;L;;;;;N;;;;; +13731;EGYPTIAN HIEROGLYPH-13731;Lo;0;L;;;;;N;;;;; +13732;EGYPTIAN HIEROGLYPH-13732;Lo;0;L;;;;;N;;;;; +13733;EGYPTIAN HIEROGLYPH-13733;Lo;0;L;;;;;N;;;;; +13734;EGYPTIAN HIEROGLYPH-13734;Lo;0;L;;;;;N;;;;; +13735;EGYPTIAN HIEROGLYPH-13735;Lo;0;L;;;;;N;;;;; +13736;EGYPTIAN HIEROGLYPH-13736;Lo;0;L;;;;;N;;;;; +13737;EGYPTIAN HIEROGLYPH-13737;Lo;0;L;;;;;N;;;;; +13738;EGYPTIAN HIEROGLYPH-13738;Lo;0;L;;;;;N;;;;; +13739;EGYPTIAN HIEROGLYPH-13739;Lo;0;L;;;;;N;;;;; +1373A;EGYPTIAN HIEROGLYPH-1373A;Lo;0;L;;;;;N;;;;; +1373B;EGYPTIAN HIEROGLYPH-1373B;Lo;0;L;;;;;N;;;;; +1373C;EGYPTIAN HIEROGLYPH-1373C;Lo;0;L;;;;;N;;;;; +1373D;EGYPTIAN HIEROGLYPH-1373D;Lo;0;L;;;;;N;;;;; +1373E;EGYPTIAN HIEROGLYPH-1373E;Lo;0;L;;;;;N;;;;; +1373F;EGYPTIAN HIEROGLYPH-1373F;Lo;0;L;;;;;N;;;;; +13740;EGYPTIAN HIEROGLYPH-13740;Lo;0;L;;;;;N;;;;; +13741;EGYPTIAN HIEROGLYPH-13741;Lo;0;L;;;;;N;;;;; +13742;EGYPTIAN HIEROGLYPH-13742;Lo;0;L;;;;;N;;;;; +13743;EGYPTIAN HIEROGLYPH-13743;Lo;0;L;;;;;N;;;;; +13744;EGYPTIAN HIEROGLYPH-13744;Lo;0;L;;;;;N;;;;; +13745;EGYPTIAN HIEROGLYPH-13745;Lo;0;L;;;;;N;;;;; +13746;EGYPTIAN HIEROGLYPH-13746;Lo;0;L;;;;;N;;;;; +13747;EGYPTIAN HIEROGLYPH-13747;Lo;0;L;;;;;N;;;;; +13748;EGYPTIAN HIEROGLYPH-13748;Lo;0;L;;;;;N;;;;; +13749;EGYPTIAN HIEROGLYPH-13749;Lo;0;L;;;;;N;;;;; +1374A;EGYPTIAN HIEROGLYPH-1374A;Lo;0;L;;;;;N;;;;; +1374B;EGYPTIAN HIEROGLYPH-1374B;Lo;0;L;;;;;N;;;;; +1374C;EGYPTIAN HIEROGLYPH-1374C;Lo;0;L;;;;;N;;;;; +1374D;EGYPTIAN HIEROGLYPH-1374D;Lo;0;L;;;;;N;;;;; +1374E;EGYPTIAN HIEROGLYPH-1374E;Lo;0;L;;;;;N;;;;; +1374F;EGYPTIAN HIEROGLYPH-1374F;Lo;0;L;;;;;N;;;;; +13750;EGYPTIAN HIEROGLYPH-13750;Lo;0;L;;;;;N;;;;; +13751;EGYPTIAN HIEROGLYPH-13751;Lo;0;L;;;;;N;;;;; +13752;EGYPTIAN HIEROGLYPH-13752;Lo;0;L;;;;;N;;;;; +13753;EGYPTIAN HIEROGLYPH-13753;Lo;0;L;;;;;N;;;;; +13754;EGYPTIAN HIEROGLYPH-13754;Lo;0;L;;;;;N;;;;; +13755;EGYPTIAN HIEROGLYPH-13755;Lo;0;L;;;;;N;;;;; +13756;EGYPTIAN HIEROGLYPH-13756;Lo;0;L;;;;;N;;;;; +13757;EGYPTIAN HIEROGLYPH-13757;Lo;0;L;;;;;N;;;;; +13758;EGYPTIAN HIEROGLYPH-13758;Lo;0;L;;;;;N;;;;; +13759;EGYPTIAN HIEROGLYPH-13759;Lo;0;L;;;;;N;;;;; +1375A;EGYPTIAN HIEROGLYPH-1375A;Lo;0;L;;;;;N;;;;; +1375B;EGYPTIAN HIEROGLYPH-1375B;Lo;0;L;;;;;N;;;;; +1375C;EGYPTIAN HIEROGLYPH-1375C;Lo;0;L;;;;;N;;;;; +1375D;EGYPTIAN HIEROGLYPH-1375D;Lo;0;L;;;;;N;;;;; +1375E;EGYPTIAN HIEROGLYPH-1375E;Lo;0;L;;;;;N;;;;; +1375F;EGYPTIAN HIEROGLYPH-1375F;Lo;0;L;;;;;N;;;;; +13760;EGYPTIAN HIEROGLYPH-13760;Lo;0;L;;;;;N;;;;; +13761;EGYPTIAN HIEROGLYPH-13761;Lo;0;L;;;;;N;;;;; +13762;EGYPTIAN HIEROGLYPH-13762;Lo;0;L;;;;;N;;;;; +13763;EGYPTIAN HIEROGLYPH-13763;Lo;0;L;;;;;N;;;;; +13764;EGYPTIAN HIEROGLYPH-13764;Lo;0;L;;;;;N;;;;; +13765;EGYPTIAN HIEROGLYPH-13765;Lo;0;L;;;;;N;;;;; +13766;EGYPTIAN HIEROGLYPH-13766;Lo;0;L;;;;;N;;;;; +13767;EGYPTIAN HIEROGLYPH-13767;Lo;0;L;;;;;N;;;;; +13768;EGYPTIAN HIEROGLYPH-13768;Lo;0;L;;;;;N;;;;; +13769;EGYPTIAN HIEROGLYPH-13769;Lo;0;L;;;;;N;;;;; +1376A;EGYPTIAN HIEROGLYPH-1376A;Lo;0;L;;;;;N;;;;; +1376B;EGYPTIAN HIEROGLYPH-1376B;Lo;0;L;;;;;N;;;;; +1376C;EGYPTIAN HIEROGLYPH-1376C;Lo;0;L;;;;;N;;;;; +1376D;EGYPTIAN HIEROGLYPH-1376D;Lo;0;L;;;;;N;;;;; +1376E;EGYPTIAN HIEROGLYPH-1376E;Lo;0;L;;;;;N;;;;; +1376F;EGYPTIAN HIEROGLYPH-1376F;Lo;0;L;;;;;N;;;;; +13770;EGYPTIAN HIEROGLYPH-13770;Lo;0;L;;;;;N;;;;; +13771;EGYPTIAN HIEROGLYPH-13771;Lo;0;L;;;;;N;;;;; +13772;EGYPTIAN HIEROGLYPH-13772;Lo;0;L;;;;;N;;;;; +13773;EGYPTIAN HIEROGLYPH-13773;Lo;0;L;;;;;N;;;;; +13774;EGYPTIAN HIEROGLYPH-13774;Lo;0;L;;;;;N;;;;; +13775;EGYPTIAN HIEROGLYPH-13775;Lo;0;L;;;;;N;;;;; +13776;EGYPTIAN HIEROGLYPH-13776;Lo;0;L;;;;;N;;;;; +13777;EGYPTIAN HIEROGLYPH-13777;Lo;0;L;;;;;N;;;;; +13778;EGYPTIAN HIEROGLYPH-13778;Lo;0;L;;;;;N;;;;; +13779;EGYPTIAN HIEROGLYPH-13779;Lo;0;L;;;;;N;;;;; +1377A;EGYPTIAN HIEROGLYPH-1377A;Lo;0;L;;;;;N;;;;; +1377B;EGYPTIAN HIEROGLYPH-1377B;Lo;0;L;;;;;N;;;;; +1377C;EGYPTIAN HIEROGLYPH-1377C;Lo;0;L;;;;;N;;;;; +1377D;EGYPTIAN HIEROGLYPH-1377D;Lo;0;L;;;;;N;;;;; +1377E;EGYPTIAN HIEROGLYPH-1377E;Lo;0;L;;;;;N;;;;; +1377F;EGYPTIAN HIEROGLYPH-1377F;Lo;0;L;;;;;N;;;;; +13780;EGYPTIAN HIEROGLYPH-13780;Lo;0;L;;;;;N;;;;; +13781;EGYPTIAN HIEROGLYPH-13781;Lo;0;L;;;;;N;;;;; +13782;EGYPTIAN HIEROGLYPH-13782;Lo;0;L;;;;;N;;;;; +13783;EGYPTIAN HIEROGLYPH-13783;Lo;0;L;;;;;N;;;;; +13784;EGYPTIAN HIEROGLYPH-13784;Lo;0;L;;;;;N;;;;; +13785;EGYPTIAN HIEROGLYPH-13785;Lo;0;L;;;;;N;;;;; +13786;EGYPTIAN HIEROGLYPH-13786;Lo;0;L;;;;;N;;;;; +13787;EGYPTIAN HIEROGLYPH-13787;Lo;0;L;;;;;N;;;;; +13788;EGYPTIAN HIEROGLYPH-13788;Lo;0;L;;;;;N;;;;; +13789;EGYPTIAN HIEROGLYPH-13789;Lo;0;L;;;;;N;;;;; +1378A;EGYPTIAN HIEROGLYPH-1378A;Lo;0;L;;;;;N;;;;; +1378B;EGYPTIAN HIEROGLYPH-1378B;Lo;0;L;;;;;N;;;;; +1378C;EGYPTIAN HIEROGLYPH-1378C;Lo;0;L;;;;;N;;;;; +1378D;EGYPTIAN HIEROGLYPH-1378D;Lo;0;L;;;;;N;;;;; +1378E;EGYPTIAN HIEROGLYPH-1378E;Lo;0;L;;;;;N;;;;; +1378F;EGYPTIAN HIEROGLYPH-1378F;Lo;0;L;;;;;N;;;;; +13790;EGYPTIAN HIEROGLYPH-13790;Lo;0;L;;;;;N;;;;; +13791;EGYPTIAN HIEROGLYPH-13791;Lo;0;L;;;;;N;;;;; +13792;EGYPTIAN HIEROGLYPH-13792;Lo;0;L;;;;;N;;;;; +13793;EGYPTIAN HIEROGLYPH-13793;Lo;0;L;;;;;N;;;;; +13794;EGYPTIAN HIEROGLYPH-13794;Lo;0;L;;;;;N;;;;; +13795;EGYPTIAN HIEROGLYPH-13795;Lo;0;L;;;;;N;;;;; +13796;EGYPTIAN HIEROGLYPH-13796;Lo;0;L;;;;;N;;;;; +13797;EGYPTIAN HIEROGLYPH-13797;Lo;0;L;;;;;N;;;;; +13798;EGYPTIAN HIEROGLYPH-13798;Lo;0;L;;;;;N;;;;; +13799;EGYPTIAN HIEROGLYPH-13799;Lo;0;L;;;;;N;;;;; +1379A;EGYPTIAN HIEROGLYPH-1379A;Lo;0;L;;;;;N;;;;; +1379B;EGYPTIAN HIEROGLYPH-1379B;Lo;0;L;;;;;N;;;;; +1379C;EGYPTIAN HIEROGLYPH-1379C;Lo;0;L;;;;;N;;;;; +1379D;EGYPTIAN HIEROGLYPH-1379D;Lo;0;L;;;;;N;;;;; +1379E;EGYPTIAN HIEROGLYPH-1379E;Lo;0;L;;;;;N;;;;; +1379F;EGYPTIAN HIEROGLYPH-1379F;Lo;0;L;;;;;N;;;;; +137A0;EGYPTIAN HIEROGLYPH-137A0;Lo;0;L;;;;;N;;;;; +137A1;EGYPTIAN HIEROGLYPH-137A1;Lo;0;L;;;;;N;;;;; +137A2;EGYPTIAN HIEROGLYPH-137A2;Lo;0;L;;;;;N;;;;; +137A3;EGYPTIAN HIEROGLYPH-137A3;Lo;0;L;;;;;N;;;;; +137A4;EGYPTIAN HIEROGLYPH-137A4;Lo;0;L;;;;;N;;;;; +137A5;EGYPTIAN HIEROGLYPH-137A5;Lo;0;L;;;;;N;;;;; +137A6;EGYPTIAN HIEROGLYPH-137A6;Lo;0;L;;;;;N;;;;; +137A7;EGYPTIAN HIEROGLYPH-137A7;Lo;0;L;;;;;N;;;;; +137A8;EGYPTIAN HIEROGLYPH-137A8;Lo;0;L;;;;;N;;;;; +137A9;EGYPTIAN HIEROGLYPH-137A9;Lo;0;L;;;;;N;;;;; +137AA;EGYPTIAN HIEROGLYPH-137AA;Lo;0;L;;;;;N;;;;; +137AB;EGYPTIAN HIEROGLYPH-137AB;Lo;0;L;;;;;N;;;;; +137AC;EGYPTIAN HIEROGLYPH-137AC;Lo;0;L;;;;;N;;;;; +137AD;EGYPTIAN HIEROGLYPH-137AD;Lo;0;L;;;;;N;;;;; +137AE;EGYPTIAN HIEROGLYPH-137AE;Lo;0;L;;;;;N;;;;; +137AF;EGYPTIAN HIEROGLYPH-137AF;Lo;0;L;;;;;N;;;;; +137B0;EGYPTIAN HIEROGLYPH-137B0;Lo;0;L;;;;;N;;;;; +137B1;EGYPTIAN HIEROGLYPH-137B1;Lo;0;L;;;;;N;;;;; +137B2;EGYPTIAN HIEROGLYPH-137B2;Lo;0;L;;;;;N;;;;; +137B3;EGYPTIAN HIEROGLYPH-137B3;Lo;0;L;;;;;N;;;;; +137B4;EGYPTIAN HIEROGLYPH-137B4;Lo;0;L;;;;;N;;;;; +137B5;EGYPTIAN HIEROGLYPH-137B5;Lo;0;L;;;;;N;;;;; +137B6;EGYPTIAN HIEROGLYPH-137B6;Lo;0;L;;;;;N;;;;; +137B7;EGYPTIAN HIEROGLYPH-137B7;Lo;0;L;;;;;N;;;;; +137B8;EGYPTIAN HIEROGLYPH-137B8;Lo;0;L;;;;;N;;;;; +137B9;EGYPTIAN HIEROGLYPH-137B9;Lo;0;L;;;;;N;;;;; +137BA;EGYPTIAN HIEROGLYPH-137BA;Lo;0;L;;;;;N;;;;; +137BB;EGYPTIAN HIEROGLYPH-137BB;Lo;0;L;;;;;N;;;;; +137BC;EGYPTIAN HIEROGLYPH-137BC;Lo;0;L;;;;;N;;;;; +137BD;EGYPTIAN HIEROGLYPH-137BD;Lo;0;L;;;;;N;;;;; +137BE;EGYPTIAN HIEROGLYPH-137BE;Lo;0;L;;;;;N;;;;; +137BF;EGYPTIAN HIEROGLYPH-137BF;Lo;0;L;;;;;N;;;;; +137C0;EGYPTIAN HIEROGLYPH-137C0;Lo;0;L;;;;;N;;;;; +137C1;EGYPTIAN HIEROGLYPH-137C1;Lo;0;L;;;;;N;;;;; +137C2;EGYPTIAN HIEROGLYPH-137C2;Lo;0;L;;;;;N;;;;; +137C3;EGYPTIAN HIEROGLYPH-137C3;Lo;0;L;;;;;N;;;;; +137C4;EGYPTIAN HIEROGLYPH-137C4;Lo;0;L;;;;;N;;;;; +137C5;EGYPTIAN HIEROGLYPH-137C5;Lo;0;L;;;;;N;;;;; +137C6;EGYPTIAN HIEROGLYPH-137C6;Lo;0;L;;;;;N;;;;; +137C7;EGYPTIAN HIEROGLYPH-137C7;Lo;0;L;;;;;N;;;;; +137C8;EGYPTIAN HIEROGLYPH-137C8;Lo;0;L;;;;;N;;;;; +137C9;EGYPTIAN HIEROGLYPH-137C9;Lo;0;L;;;;;N;;;;; +137CA;EGYPTIAN HIEROGLYPH-137CA;Lo;0;L;;;;;N;;;;; +137CB;EGYPTIAN HIEROGLYPH-137CB;Lo;0;L;;;;;N;;;;; +137CC;EGYPTIAN HIEROGLYPH-137CC;Lo;0;L;;;;;N;;;;; +137CD;EGYPTIAN HIEROGLYPH-137CD;Lo;0;L;;;;;N;;;;; +137CE;EGYPTIAN HIEROGLYPH-137CE;Lo;0;L;;;;;N;;;;; +137CF;EGYPTIAN HIEROGLYPH-137CF;Lo;0;L;;;;;N;;;;; +137D0;EGYPTIAN HIEROGLYPH-137D0;Lo;0;L;;;;;N;;;;; +137D1;EGYPTIAN HIEROGLYPH-137D1;Lo;0;L;;;;;N;;;;; +137D2;EGYPTIAN HIEROGLYPH-137D2;Lo;0;L;;;;;N;;;;; +137D3;EGYPTIAN HIEROGLYPH-137D3;Lo;0;L;;;;;N;;;;; +137D4;EGYPTIAN HIEROGLYPH-137D4;Lo;0;L;;;;;N;;;;; +137D5;EGYPTIAN HIEROGLYPH-137D5;Lo;0;L;;;;;N;;;;; +137D6;EGYPTIAN HIEROGLYPH-137D6;Lo;0;L;;;;;N;;;;; +137D7;EGYPTIAN HIEROGLYPH-137D7;Lo;0;L;;;;;N;;;;; +137D8;EGYPTIAN HIEROGLYPH-137D8;Lo;0;L;;;;;N;;;;; +137D9;EGYPTIAN HIEROGLYPH-137D9;Lo;0;L;;;;;N;;;;; +137DA;EGYPTIAN HIEROGLYPH-137DA;Lo;0;L;;;;;N;;;;; +137DB;EGYPTIAN HIEROGLYPH-137DB;Lo;0;L;;;;;N;;;;; +137DC;EGYPTIAN HIEROGLYPH-137DC;Lo;0;L;;;;;N;;;;; +137DD;EGYPTIAN HIEROGLYPH-137DD;Lo;0;L;;;;;N;;;;; +137DE;EGYPTIAN HIEROGLYPH-137DE;Lo;0;L;;;;;N;;;;; +137DF;EGYPTIAN HIEROGLYPH-137DF;Lo;0;L;;;;;N;;;;; +137E0;EGYPTIAN HIEROGLYPH-137E0;Lo;0;L;;;;;N;;;;; +137E1;EGYPTIAN HIEROGLYPH-137E1;Lo;0;L;;;;;N;;;;; +137E2;EGYPTIAN HIEROGLYPH-137E2;Lo;0;L;;;;;N;;;;; +137E3;EGYPTIAN HIEROGLYPH-137E3;Lo;0;L;;;;;N;;;;; +137E4;EGYPTIAN HIEROGLYPH-137E4;Lo;0;L;;;;;N;;;;; +137E5;EGYPTIAN HIEROGLYPH-137E5;Lo;0;L;;;;;N;;;;; +137E6;EGYPTIAN HIEROGLYPH-137E6;Lo;0;L;;;;;N;;;;; +137E7;EGYPTIAN HIEROGLYPH-137E7;Lo;0;L;;;;;N;;;;; +137E8;EGYPTIAN HIEROGLYPH-137E8;Lo;0;L;;;;;N;;;;; +137E9;EGYPTIAN HIEROGLYPH-137E9;Lo;0;L;;;;;N;;;;; +137EA;EGYPTIAN HIEROGLYPH-137EA;Lo;0;L;;;;;N;;;;; +137EB;EGYPTIAN HIEROGLYPH-137EB;Lo;0;L;;;;;N;;;;; +137EC;EGYPTIAN HIEROGLYPH-137EC;Lo;0;L;;;;;N;;;;; +137ED;EGYPTIAN HIEROGLYPH-137ED;Lo;0;L;;;;;N;;;;; +137EE;EGYPTIAN HIEROGLYPH-137EE;Lo;0;L;;;;;N;;;;; +137EF;EGYPTIAN HIEROGLYPH-137EF;Lo;0;L;;;;;N;;;;; +137F0;EGYPTIAN HIEROGLYPH-137F0;Lo;0;L;;;;;N;;;;; +137F1;EGYPTIAN HIEROGLYPH-137F1;Lo;0;L;;;;;N;;;;; +137F2;EGYPTIAN HIEROGLYPH-137F2;Lo;0;L;;;;;N;;;;; +137F3;EGYPTIAN HIEROGLYPH-137F3;Lo;0;L;;;;;N;;;;; +137F4;EGYPTIAN HIEROGLYPH-137F4;Lo;0;L;;;;;N;;;;; +137F5;EGYPTIAN HIEROGLYPH-137F5;Lo;0;L;;;;;N;;;;; +137F6;EGYPTIAN HIEROGLYPH-137F6;Lo;0;L;;;;;N;;;;; +137F7;EGYPTIAN HIEROGLYPH-137F7;Lo;0;L;;;;;N;;;;; +137F8;EGYPTIAN HIEROGLYPH-137F8;Lo;0;L;;;;;N;;;;; +137F9;EGYPTIAN HIEROGLYPH-137F9;Lo;0;L;;;;;N;;;;; +137FA;EGYPTIAN HIEROGLYPH-137FA;Lo;0;L;;;;;N;;;;; +137FB;EGYPTIAN HIEROGLYPH-137FB;Lo;0;L;;;;;N;;;;; +137FC;EGYPTIAN HIEROGLYPH-137FC;Lo;0;L;;;;;N;;;;; +137FD;EGYPTIAN HIEROGLYPH-137FD;Lo;0;L;;;;;N;;;;; +137FE;EGYPTIAN HIEROGLYPH-137FE;Lo;0;L;;;;;N;;;;; +137FF;EGYPTIAN HIEROGLYPH-137FF;Lo;0;L;;;;;N;;;;; +13800;EGYPTIAN HIEROGLYPH-13800;Lo;0;L;;;;;N;;;;; +13801;EGYPTIAN HIEROGLYPH-13801;Lo;0;L;;;;;N;;;;; +13802;EGYPTIAN HIEROGLYPH-13802;Lo;0;L;;;;;N;;;;; +13803;EGYPTIAN HIEROGLYPH-13803;Lo;0;L;;;;;N;;;;; +13804;EGYPTIAN HIEROGLYPH-13804;Lo;0;L;;;;;N;;;;; +13805;EGYPTIAN HIEROGLYPH-13805;Lo;0;L;;;;;N;;;;; +13806;EGYPTIAN HIEROGLYPH-13806;Lo;0;L;;;;;N;;;;; +13807;EGYPTIAN HIEROGLYPH-13807;Lo;0;L;;;;;N;;;;; +13808;EGYPTIAN HIEROGLYPH-13808;Lo;0;L;;;;;N;;;;; +13809;EGYPTIAN HIEROGLYPH-13809;Lo;0;L;;;;;N;;;;; +1380A;EGYPTIAN HIEROGLYPH-1380A;Lo;0;L;;;;;N;;;;; +1380B;EGYPTIAN HIEROGLYPH-1380B;Lo;0;L;;;;;N;;;;; +1380C;EGYPTIAN HIEROGLYPH-1380C;Lo;0;L;;;;;N;;;;; +1380D;EGYPTIAN HIEROGLYPH-1380D;Lo;0;L;;;;;N;;;;; +1380E;EGYPTIAN HIEROGLYPH-1380E;Lo;0;L;;;;;N;;;;; +1380F;EGYPTIAN HIEROGLYPH-1380F;Lo;0;L;;;;;N;;;;; +13810;EGYPTIAN HIEROGLYPH-13810;Lo;0;L;;;;;N;;;;; +13811;EGYPTIAN HIEROGLYPH-13811;Lo;0;L;;;;;N;;;;; +13812;EGYPTIAN HIEROGLYPH-13812;Lo;0;L;;;;;N;;;;; +13813;EGYPTIAN HIEROGLYPH-13813;Lo;0;L;;;;;N;;;;; +13814;EGYPTIAN HIEROGLYPH-13814;Lo;0;L;;;;;N;;;;; +13815;EGYPTIAN HIEROGLYPH-13815;Lo;0;L;;;;;N;;;;; +13816;EGYPTIAN HIEROGLYPH-13816;Lo;0;L;;;;;N;;;;; +13817;EGYPTIAN HIEROGLYPH-13817;Lo;0;L;;;;;N;;;;; +13818;EGYPTIAN HIEROGLYPH-13818;Lo;0;L;;;;;N;;;;; +13819;EGYPTIAN HIEROGLYPH-13819;Lo;0;L;;;;;N;;;;; +1381A;EGYPTIAN HIEROGLYPH-1381A;Lo;0;L;;;;;N;;;;; +1381B;EGYPTIAN HIEROGLYPH-1381B;Lo;0;L;;;;;N;;;;; +1381C;EGYPTIAN HIEROGLYPH-1381C;Lo;0;L;;;;;N;;;;; +1381D;EGYPTIAN HIEROGLYPH-1381D;Lo;0;L;;;;;N;;;;; +1381E;EGYPTIAN HIEROGLYPH-1381E;Lo;0;L;;;;;N;;;;; +1381F;EGYPTIAN HIEROGLYPH-1381F;Lo;0;L;;;;;N;;;;; +13820;EGYPTIAN HIEROGLYPH-13820;Lo;0;L;;;;;N;;;;; +13821;EGYPTIAN HIEROGLYPH-13821;Lo;0;L;;;;;N;;;;; +13822;EGYPTIAN HIEROGLYPH-13822;Lo;0;L;;;;;N;;;;; +13823;EGYPTIAN HIEROGLYPH-13823;Lo;0;L;;;;;N;;;;; +13824;EGYPTIAN HIEROGLYPH-13824;Lo;0;L;;;;;N;;;;; +13825;EGYPTIAN HIEROGLYPH-13825;Lo;0;L;;;;;N;;;;; +13826;EGYPTIAN HIEROGLYPH-13826;Lo;0;L;;;;;N;;;;; +13827;EGYPTIAN HIEROGLYPH-13827;Lo;0;L;;;;;N;;;;; +13828;EGYPTIAN HIEROGLYPH-13828;Lo;0;L;;;;;N;;;;; +13829;EGYPTIAN HIEROGLYPH-13829;Lo;0;L;;;;;N;;;;; +1382A;EGYPTIAN HIEROGLYPH-1382A;Lo;0;L;;;;;N;;;;; +1382B;EGYPTIAN HIEROGLYPH-1382B;Lo;0;L;;;;;N;;;;; +1382C;EGYPTIAN HIEROGLYPH-1382C;Lo;0;L;;;;;N;;;;; +1382D;EGYPTIAN HIEROGLYPH-1382D;Lo;0;L;;;;;N;;;;; +1382E;EGYPTIAN HIEROGLYPH-1382E;Lo;0;L;;;;;N;;;;; +1382F;EGYPTIAN HIEROGLYPH-1382F;Lo;0;L;;;;;N;;;;; +13830;EGYPTIAN HIEROGLYPH-13830;Lo;0;L;;;;;N;;;;; +13831;EGYPTIAN HIEROGLYPH-13831;Lo;0;L;;;;;N;;;;; +13832;EGYPTIAN HIEROGLYPH-13832;Lo;0;L;;;;;N;;;;; +13833;EGYPTIAN HIEROGLYPH-13833;Lo;0;L;;;;;N;;;;; +13834;EGYPTIAN HIEROGLYPH-13834;Lo;0;L;;;;;N;;;;; +13835;EGYPTIAN HIEROGLYPH-13835;Lo;0;L;;;;;N;;;;; +13836;EGYPTIAN HIEROGLYPH-13836;Lo;0;L;;;;;N;;;;; +13837;EGYPTIAN HIEROGLYPH-13837;Lo;0;L;;;;;N;;;;; +13838;EGYPTIAN HIEROGLYPH-13838;Lo;0;L;;;;;N;;;;; +13839;EGYPTIAN HIEROGLYPH-13839;Lo;0;L;;;;;N;;;;; +1383A;EGYPTIAN HIEROGLYPH-1383A;Lo;0;L;;;;;N;;;;; +1383B;EGYPTIAN HIEROGLYPH-1383B;Lo;0;L;;;;;N;;;;; +1383C;EGYPTIAN HIEROGLYPH-1383C;Lo;0;L;;;;;N;;;;; +1383D;EGYPTIAN HIEROGLYPH-1383D;Lo;0;L;;;;;N;;;;; +1383E;EGYPTIAN HIEROGLYPH-1383E;Lo;0;L;;;;;N;;;;; +1383F;EGYPTIAN HIEROGLYPH-1383F;Lo;0;L;;;;;N;;;;; +13840;EGYPTIAN HIEROGLYPH-13840;Lo;0;L;;;;;N;;;;; +13841;EGYPTIAN HIEROGLYPH-13841;Lo;0;L;;;;;N;;;;; +13842;EGYPTIAN HIEROGLYPH-13842;Lo;0;L;;;;;N;;;;; +13843;EGYPTIAN HIEROGLYPH-13843;Lo;0;L;;;;;N;;;;; +13844;EGYPTIAN HIEROGLYPH-13844;Lo;0;L;;;;;N;;;;; +13845;EGYPTIAN HIEROGLYPH-13845;Lo;0;L;;;;;N;;;;; +13846;EGYPTIAN HIEROGLYPH-13846;Lo;0;L;;;;;N;;;;; +13847;EGYPTIAN HIEROGLYPH-13847;Lo;0;L;;;;;N;;;;; +13848;EGYPTIAN HIEROGLYPH-13848;Lo;0;L;;;;;N;;;;; +13849;EGYPTIAN HIEROGLYPH-13849;Lo;0;L;;;;;N;;;;; +1384A;EGYPTIAN HIEROGLYPH-1384A;Lo;0;L;;;;;N;;;;; +1384B;EGYPTIAN HIEROGLYPH-1384B;Lo;0;L;;;;;N;;;;; +1384C;EGYPTIAN HIEROGLYPH-1384C;Lo;0;L;;;;;N;;;;; +1384D;EGYPTIAN HIEROGLYPH-1384D;Lo;0;L;;;;;N;;;;; +1384E;EGYPTIAN HIEROGLYPH-1384E;Lo;0;L;;;;;N;;;;; +1384F;EGYPTIAN HIEROGLYPH-1384F;Lo;0;L;;;;;N;;;;; +13850;EGYPTIAN HIEROGLYPH-13850;Lo;0;L;;;;;N;;;;; +13851;EGYPTIAN HIEROGLYPH-13851;Lo;0;L;;;;;N;;;;; +13852;EGYPTIAN HIEROGLYPH-13852;Lo;0;L;;;;;N;;;;; +13853;EGYPTIAN HIEROGLYPH-13853;Lo;0;L;;;;;N;;;;; +13854;EGYPTIAN HIEROGLYPH-13854;Lo;0;L;;;;;N;;;;; +13855;EGYPTIAN HIEROGLYPH-13855;Lo;0;L;;;;;N;;;;; +13856;EGYPTIAN HIEROGLYPH-13856;Lo;0;L;;;;;N;;;;; +13857;EGYPTIAN HIEROGLYPH-13857;Lo;0;L;;;;;N;;;;; +13858;EGYPTIAN HIEROGLYPH-13858;Lo;0;L;;;;;N;;;;; +13859;EGYPTIAN HIEROGLYPH-13859;Lo;0;L;;;;;N;;;;; +1385A;EGYPTIAN HIEROGLYPH-1385A;Lo;0;L;;;;;N;;;;; +1385B;EGYPTIAN HIEROGLYPH-1385B;Lo;0;L;;;;;N;;;;; +1385C;EGYPTIAN HIEROGLYPH-1385C;Lo;0;L;;;;;N;;;;; +1385D;EGYPTIAN HIEROGLYPH-1385D;Lo;0;L;;;;;N;;;;; +1385E;EGYPTIAN HIEROGLYPH-1385E;Lo;0;L;;;;;N;;;;; +1385F;EGYPTIAN HIEROGLYPH-1385F;Lo;0;L;;;;;N;;;;; +13860;EGYPTIAN HIEROGLYPH-13860;Lo;0;L;;;;;N;;;;; +13861;EGYPTIAN HIEROGLYPH-13861;Lo;0;L;;;;;N;;;;; +13862;EGYPTIAN HIEROGLYPH-13862;Lo;0;L;;;;;N;;;;; +13863;EGYPTIAN HIEROGLYPH-13863;Lo;0;L;;;;;N;;;;; +13864;EGYPTIAN HIEROGLYPH-13864;Lo;0;L;;;;;N;;;;; +13865;EGYPTIAN HIEROGLYPH-13865;Lo;0;L;;;;;N;;;;; +13866;EGYPTIAN HIEROGLYPH-13866;Lo;0;L;;;;;N;;;;; +13867;EGYPTIAN HIEROGLYPH-13867;Lo;0;L;;;;;N;;;;; +13868;EGYPTIAN HIEROGLYPH-13868;Lo;0;L;;;;;N;;;;; +13869;EGYPTIAN HIEROGLYPH-13869;Lo;0;L;;;;;N;;;;; +1386A;EGYPTIAN HIEROGLYPH-1386A;Lo;0;L;;;;;N;;;;; +1386B;EGYPTIAN HIEROGLYPH-1386B;Lo;0;L;;;;;N;;;;; +1386C;EGYPTIAN HIEROGLYPH-1386C;Lo;0;L;;;;;N;;;;; +1386D;EGYPTIAN HIEROGLYPH-1386D;Lo;0;L;;;;;N;;;;; +1386E;EGYPTIAN HIEROGLYPH-1386E;Lo;0;L;;;;;N;;;;; +1386F;EGYPTIAN HIEROGLYPH-1386F;Lo;0;L;;;;;N;;;;; +13870;EGYPTIAN HIEROGLYPH-13870;Lo;0;L;;;;;N;;;;; +13871;EGYPTIAN HIEROGLYPH-13871;Lo;0;L;;;;;N;;;;; +13872;EGYPTIAN HIEROGLYPH-13872;Lo;0;L;;;;;N;;;;; +13873;EGYPTIAN HIEROGLYPH-13873;Lo;0;L;;;;;N;;;;; +13874;EGYPTIAN HIEROGLYPH-13874;Lo;0;L;;;;;N;;;;; +13875;EGYPTIAN HIEROGLYPH-13875;Lo;0;L;;;;;N;;;;; +13876;EGYPTIAN HIEROGLYPH-13876;Lo;0;L;;;;;N;;;;; +13877;EGYPTIAN HIEROGLYPH-13877;Lo;0;L;;;;;N;;;;; +13878;EGYPTIAN HIEROGLYPH-13878;Lo;0;L;;;;;N;;;;; +13879;EGYPTIAN HIEROGLYPH-13879;Lo;0;L;;;;;N;;;;; +1387A;EGYPTIAN HIEROGLYPH-1387A;Lo;0;L;;;;;N;;;;; +1387B;EGYPTIAN HIEROGLYPH-1387B;Lo;0;L;;;;;N;;;;; +1387C;EGYPTIAN HIEROGLYPH-1387C;Lo;0;L;;;;;N;;;;; +1387D;EGYPTIAN HIEROGLYPH-1387D;Lo;0;L;;;;;N;;;;; +1387E;EGYPTIAN HIEROGLYPH-1387E;Lo;0;L;;;;;N;;;;; +1387F;EGYPTIAN HIEROGLYPH-1387F;Lo;0;L;;;;;N;;;;; +13880;EGYPTIAN HIEROGLYPH-13880;Lo;0;L;;;;;N;;;;; +13881;EGYPTIAN HIEROGLYPH-13881;Lo;0;L;;;;;N;;;;; +13882;EGYPTIAN HIEROGLYPH-13882;Lo;0;L;;;;;N;;;;; +13883;EGYPTIAN HIEROGLYPH-13883;Lo;0;L;;;;;N;;;;; +13884;EGYPTIAN HIEROGLYPH-13884;Lo;0;L;;;;;N;;;;; +13885;EGYPTIAN HIEROGLYPH-13885;Lo;0;L;;;;;N;;;;; +13886;EGYPTIAN HIEROGLYPH-13886;Lo;0;L;;;;;N;;;;; +13887;EGYPTIAN HIEROGLYPH-13887;Lo;0;L;;;;;N;;;;; +13888;EGYPTIAN HIEROGLYPH-13888;Lo;0;L;;;;;N;;;;; +13889;EGYPTIAN HIEROGLYPH-13889;Lo;0;L;;;;;N;;;;; +1388A;EGYPTIAN HIEROGLYPH-1388A;Lo;0;L;;;;;N;;;;; +1388B;EGYPTIAN HIEROGLYPH-1388B;Lo;0;L;;;;;N;;;;; +1388C;EGYPTIAN HIEROGLYPH-1388C;Lo;0;L;;;;;N;;;;; +1388D;EGYPTIAN HIEROGLYPH-1388D;Lo;0;L;;;;;N;;;;; +1388E;EGYPTIAN HIEROGLYPH-1388E;Lo;0;L;;;;;N;;;;; +1388F;EGYPTIAN HIEROGLYPH-1388F;Lo;0;L;;;;;N;;;;; +13890;EGYPTIAN HIEROGLYPH-13890;Lo;0;L;;;;;N;;;;; +13891;EGYPTIAN HIEROGLYPH-13891;Lo;0;L;;;;;N;;;;; +13892;EGYPTIAN HIEROGLYPH-13892;Lo;0;L;;;;;N;;;;; +13893;EGYPTIAN HIEROGLYPH-13893;Lo;0;L;;;;;N;;;;; +13894;EGYPTIAN HIEROGLYPH-13894;Lo;0;L;;;;;N;;;;; +13895;EGYPTIAN HIEROGLYPH-13895;Lo;0;L;;;;;N;;;;; +13896;EGYPTIAN HIEROGLYPH-13896;Lo;0;L;;;;;N;;;;; +13897;EGYPTIAN HIEROGLYPH-13897;Lo;0;L;;;;;N;;;;; +13898;EGYPTIAN HIEROGLYPH-13898;Lo;0;L;;;;;N;;;;; +13899;EGYPTIAN HIEROGLYPH-13899;Lo;0;L;;;;;N;;;;; +1389A;EGYPTIAN HIEROGLYPH-1389A;Lo;0;L;;;;;N;;;;; +1389B;EGYPTIAN HIEROGLYPH-1389B;Lo;0;L;;;;;N;;;;; +1389C;EGYPTIAN HIEROGLYPH-1389C;Lo;0;L;;;;;N;;;;; +1389D;EGYPTIAN HIEROGLYPH-1389D;Lo;0;L;;;;;N;;;;; +1389E;EGYPTIAN HIEROGLYPH-1389E;Lo;0;L;;;;;N;;;;; +1389F;EGYPTIAN HIEROGLYPH-1389F;Lo;0;L;;;;;N;;;;; +138A0;EGYPTIAN HIEROGLYPH-138A0;Lo;0;L;;;;;N;;;;; +138A1;EGYPTIAN HIEROGLYPH-138A1;Lo;0;L;;;;;N;;;;; +138A2;EGYPTIAN HIEROGLYPH-138A2;Lo;0;L;;;;;N;;;;; +138A3;EGYPTIAN HIEROGLYPH-138A3;Lo;0;L;;;;;N;;;;; +138A4;EGYPTIAN HIEROGLYPH-138A4;Lo;0;L;;;;;N;;;;; +138A5;EGYPTIAN HIEROGLYPH-138A5;Lo;0;L;;;;;N;;;;; +138A6;EGYPTIAN HIEROGLYPH-138A6;Lo;0;L;;;;;N;;;;; +138A7;EGYPTIAN HIEROGLYPH-138A7;Lo;0;L;;;;;N;;;;; +138A8;EGYPTIAN HIEROGLYPH-138A8;Lo;0;L;;;;;N;;;;; +138A9;EGYPTIAN HIEROGLYPH-138A9;Lo;0;L;;;;;N;;;;; +138AA;EGYPTIAN HIEROGLYPH-138AA;Lo;0;L;;;;;N;;;;; +138AB;EGYPTIAN HIEROGLYPH-138AB;Lo;0;L;;;;;N;;;;; +138AC;EGYPTIAN HIEROGLYPH-138AC;Lo;0;L;;;;;N;;;;; +138AD;EGYPTIAN HIEROGLYPH-138AD;Lo;0;L;;;;;N;;;;; +138AE;EGYPTIAN HIEROGLYPH-138AE;Lo;0;L;;;;;N;;;;; +138AF;EGYPTIAN HIEROGLYPH-138AF;Lo;0;L;;;;;N;;;;; +138B0;EGYPTIAN HIEROGLYPH-138B0;Lo;0;L;;;;;N;;;;; +138B1;EGYPTIAN HIEROGLYPH-138B1;Lo;0;L;;;;;N;;;;; +138B2;EGYPTIAN HIEROGLYPH-138B2;Lo;0;L;;;;;N;;;;; +138B3;EGYPTIAN HIEROGLYPH-138B3;Lo;0;L;;;;;N;;;;; +138B4;EGYPTIAN HIEROGLYPH-138B4;Lo;0;L;;;;;N;;;;; +138B5;EGYPTIAN HIEROGLYPH-138B5;Lo;0;L;;;;;N;;;;; +138B6;EGYPTIAN HIEROGLYPH-138B6;Lo;0;L;;;;;N;;;;; +138B7;EGYPTIAN HIEROGLYPH-138B7;Lo;0;L;;;;;N;;;;; +138B8;EGYPTIAN HIEROGLYPH-138B8;Lo;0;L;;;;;N;;;;; +138B9;EGYPTIAN HIEROGLYPH-138B9;Lo;0;L;;;;;N;;;;; +138BA;EGYPTIAN HIEROGLYPH-138BA;Lo;0;L;;;;;N;;;;; +138BB;EGYPTIAN HIEROGLYPH-138BB;Lo;0;L;;;;;N;;;;; +138BC;EGYPTIAN HIEROGLYPH-138BC;Lo;0;L;;;;;N;;;;; +138BD;EGYPTIAN HIEROGLYPH-138BD;Lo;0;L;;;;;N;;;;; +138BE;EGYPTIAN HIEROGLYPH-138BE;Lo;0;L;;;;;N;;;;; +138BF;EGYPTIAN HIEROGLYPH-138BF;Lo;0;L;;;;;N;;;;; +138C0;EGYPTIAN HIEROGLYPH-138C0;Lo;0;L;;;;;N;;;;; +138C1;EGYPTIAN HIEROGLYPH-138C1;Lo;0;L;;;;;N;;;;; +138C2;EGYPTIAN HIEROGLYPH-138C2;Lo;0;L;;;;;N;;;;; +138C3;EGYPTIAN HIEROGLYPH-138C3;Lo;0;L;;;;;N;;;;; +138C4;EGYPTIAN HIEROGLYPH-138C4;Lo;0;L;;;;;N;;;;; +138C5;EGYPTIAN HIEROGLYPH-138C5;Lo;0;L;;;;;N;;;;; +138C6;EGYPTIAN HIEROGLYPH-138C6;Lo;0;L;;;;;N;;;;; +138C7;EGYPTIAN HIEROGLYPH-138C7;Lo;0;L;;;;;N;;;;; +138C8;EGYPTIAN HIEROGLYPH-138C8;Lo;0;L;;;;;N;;;;; +138C9;EGYPTIAN HIEROGLYPH-138C9;Lo;0;L;;;;;N;;;;; +138CA;EGYPTIAN HIEROGLYPH-138CA;Lo;0;L;;;;;N;;;;; +138CB;EGYPTIAN HIEROGLYPH-138CB;Lo;0;L;;;;;N;;;;; +138CC;EGYPTIAN HIEROGLYPH-138CC;Lo;0;L;;;;;N;;;;; +138CD;EGYPTIAN HIEROGLYPH-138CD;Lo;0;L;;;;;N;;;;; +138CE;EGYPTIAN HIEROGLYPH-138CE;Lo;0;L;;;;;N;;;;; +138CF;EGYPTIAN HIEROGLYPH-138CF;Lo;0;L;;;;;N;;;;; +138D0;EGYPTIAN HIEROGLYPH-138D0;Lo;0;L;;;;;N;;;;; +138D1;EGYPTIAN HIEROGLYPH-138D1;Lo;0;L;;;;;N;;;;; +138D2;EGYPTIAN HIEROGLYPH-138D2;Lo;0;L;;;;;N;;;;; +138D3;EGYPTIAN HIEROGLYPH-138D3;Lo;0;L;;;;;N;;;;; +138D4;EGYPTIAN HIEROGLYPH-138D4;Lo;0;L;;;;;N;;;;; +138D5;EGYPTIAN HIEROGLYPH-138D5;Lo;0;L;;;;;N;;;;; +138D6;EGYPTIAN HIEROGLYPH-138D6;Lo;0;L;;;;;N;;;;; +138D7;EGYPTIAN HIEROGLYPH-138D7;Lo;0;L;;;;;N;;;;; +138D8;EGYPTIAN HIEROGLYPH-138D8;Lo;0;L;;;;;N;;;;; +138D9;EGYPTIAN HIEROGLYPH-138D9;Lo;0;L;;;;;N;;;;; +138DA;EGYPTIAN HIEROGLYPH-138DA;Lo;0;L;;;;;N;;;;; +138DB;EGYPTIAN HIEROGLYPH-138DB;Lo;0;L;;;;;N;;;;; +138DC;EGYPTIAN HIEROGLYPH-138DC;Lo;0;L;;;;;N;;;;; +138DD;EGYPTIAN HIEROGLYPH-138DD;Lo;0;L;;;;;N;;;;; +138DE;EGYPTIAN HIEROGLYPH-138DE;Lo;0;L;;;;;N;;;;; +138DF;EGYPTIAN HIEROGLYPH-138DF;Lo;0;L;;;;;N;;;;; +138E0;EGYPTIAN HIEROGLYPH-138E0;Lo;0;L;;;;;N;;;;; +138E1;EGYPTIAN HIEROGLYPH-138E1;Lo;0;L;;;;;N;;;;; +138E2;EGYPTIAN HIEROGLYPH-138E2;Lo;0;L;;;;;N;;;;; +138E3;EGYPTIAN HIEROGLYPH-138E3;Lo;0;L;;;;;N;;;;; +138E4;EGYPTIAN HIEROGLYPH-138E4;Lo;0;L;;;;;N;;;;; +138E5;EGYPTIAN HIEROGLYPH-138E5;Lo;0;L;;;;;N;;;;; +138E6;EGYPTIAN HIEROGLYPH-138E6;Lo;0;L;;;;;N;;;;; +138E7;EGYPTIAN HIEROGLYPH-138E7;Lo;0;L;;;;;N;;;;; +138E8;EGYPTIAN HIEROGLYPH-138E8;Lo;0;L;;;;;N;;;;; +138E9;EGYPTIAN HIEROGLYPH-138E9;Lo;0;L;;;;;N;;;;; +138EA;EGYPTIAN HIEROGLYPH-138EA;Lo;0;L;;;;;N;;;;; +138EB;EGYPTIAN HIEROGLYPH-138EB;Lo;0;L;;;;;N;;;;; +138EC;EGYPTIAN HIEROGLYPH-138EC;Lo;0;L;;;;;N;;;;; +138ED;EGYPTIAN HIEROGLYPH-138ED;Lo;0;L;;;;;N;;;;; +138EE;EGYPTIAN HIEROGLYPH-138EE;Lo;0;L;;;;;N;;;;; +138EF;EGYPTIAN HIEROGLYPH-138EF;Lo;0;L;;;;;N;;;;; +138F0;EGYPTIAN HIEROGLYPH-138F0;Lo;0;L;;;;;N;;;;; +138F1;EGYPTIAN HIEROGLYPH-138F1;Lo;0;L;;;;;N;;;;; +138F2;EGYPTIAN HIEROGLYPH-138F2;Lo;0;L;;;;;N;;;;; +138F3;EGYPTIAN HIEROGLYPH-138F3;Lo;0;L;;;;;N;;;;; +138F4;EGYPTIAN HIEROGLYPH-138F4;Lo;0;L;;;;;N;;;;; +138F5;EGYPTIAN HIEROGLYPH-138F5;Lo;0;L;;;;;N;;;;; +138F6;EGYPTIAN HIEROGLYPH-138F6;Lo;0;L;;;;;N;;;;; +138F7;EGYPTIAN HIEROGLYPH-138F7;Lo;0;L;;;;;N;;;;; +138F8;EGYPTIAN HIEROGLYPH-138F8;Lo;0;L;;;;;N;;;;; +138F9;EGYPTIAN HIEROGLYPH-138F9;Lo;0;L;;;;;N;;;;; +138FA;EGYPTIAN HIEROGLYPH-138FA;Lo;0;L;;;;;N;;;;; +138FB;EGYPTIAN HIEROGLYPH-138FB;Lo;0;L;;;;;N;;;;; +138FC;EGYPTIAN HIEROGLYPH-138FC;Lo;0;L;;;;;N;;;;; +138FD;EGYPTIAN HIEROGLYPH-138FD;Lo;0;L;;;;;N;;;;; +138FE;EGYPTIAN HIEROGLYPH-138FE;Lo;0;L;;;;;N;;;;; +138FF;EGYPTIAN HIEROGLYPH-138FF;Lo;0;L;;;;;N;;;;; +13900;EGYPTIAN HIEROGLYPH-13900;Lo;0;L;;;;;N;;;;; +13901;EGYPTIAN HIEROGLYPH-13901;Lo;0;L;;;;;N;;;;; +13902;EGYPTIAN HIEROGLYPH-13902;Lo;0;L;;;;;N;;;;; +13903;EGYPTIAN HIEROGLYPH-13903;Lo;0;L;;;;;N;;;;; +13904;EGYPTIAN HIEROGLYPH-13904;Lo;0;L;;;;;N;;;;; +13905;EGYPTIAN HIEROGLYPH-13905;Lo;0;L;;;;;N;;;;; +13906;EGYPTIAN HIEROGLYPH-13906;Lo;0;L;;;;;N;;;;; +13907;EGYPTIAN HIEROGLYPH-13907;Lo;0;L;;;;;N;;;;; +13908;EGYPTIAN HIEROGLYPH-13908;Lo;0;L;;;;;N;;;;; +13909;EGYPTIAN HIEROGLYPH-13909;Lo;0;L;;;;;N;;;;; +1390A;EGYPTIAN HIEROGLYPH-1390A;Lo;0;L;;;;;N;;;;; +1390B;EGYPTIAN HIEROGLYPH-1390B;Lo;0;L;;;;;N;;;;; +1390C;EGYPTIAN HIEROGLYPH-1390C;Lo;0;L;;;;;N;;;;; +1390D;EGYPTIAN HIEROGLYPH-1390D;Lo;0;L;;;;;N;;;;; +1390E;EGYPTIAN HIEROGLYPH-1390E;Lo;0;L;;;;;N;;;;; +1390F;EGYPTIAN HIEROGLYPH-1390F;Lo;0;L;;;;;N;;;;; +13910;EGYPTIAN HIEROGLYPH-13910;Lo;0;L;;;;;N;;;;; +13911;EGYPTIAN HIEROGLYPH-13911;Lo;0;L;;;;;N;;;;; +13912;EGYPTIAN HIEROGLYPH-13912;Lo;0;L;;;;;N;;;;; +13913;EGYPTIAN HIEROGLYPH-13913;Lo;0;L;;;;;N;;;;; +13914;EGYPTIAN HIEROGLYPH-13914;Lo;0;L;;;;;N;;;;; +13915;EGYPTIAN HIEROGLYPH-13915;Lo;0;L;;;;;N;;;;; +13916;EGYPTIAN HIEROGLYPH-13916;Lo;0;L;;;;;N;;;;; +13917;EGYPTIAN HIEROGLYPH-13917;Lo;0;L;;;;;N;;;;; +13918;EGYPTIAN HIEROGLYPH-13918;Lo;0;L;;;;;N;;;;; +13919;EGYPTIAN HIEROGLYPH-13919;Lo;0;L;;;;;N;;;;; +1391A;EGYPTIAN HIEROGLYPH-1391A;Lo;0;L;;;;;N;;;;; +1391B;EGYPTIAN HIEROGLYPH-1391B;Lo;0;L;;;;;N;;;;; +1391C;EGYPTIAN HIEROGLYPH-1391C;Lo;0;L;;;;;N;;;;; +1391D;EGYPTIAN HIEROGLYPH-1391D;Lo;0;L;;;;;N;;;;; +1391E;EGYPTIAN HIEROGLYPH-1391E;Lo;0;L;;;;;N;;;;; +1391F;EGYPTIAN HIEROGLYPH-1391F;Lo;0;L;;;;;N;;;;; +13920;EGYPTIAN HIEROGLYPH-13920;Lo;0;L;;;;;N;;;;; +13921;EGYPTIAN HIEROGLYPH-13921;Lo;0;L;;;;;N;;;;; +13922;EGYPTIAN HIEROGLYPH-13922;Lo;0;L;;;;;N;;;;; +13923;EGYPTIAN HIEROGLYPH-13923;Lo;0;L;;;;;N;;;;; +13924;EGYPTIAN HIEROGLYPH-13924;Lo;0;L;;;;;N;;;;; +13925;EGYPTIAN HIEROGLYPH-13925;Lo;0;L;;;;;N;;;;; +13926;EGYPTIAN HIEROGLYPH-13926;Lo;0;L;;;;;N;;;;; +13927;EGYPTIAN HIEROGLYPH-13927;Lo;0;L;;;;;N;;;;; +13928;EGYPTIAN HIEROGLYPH-13928;Lo;0;L;;;;;N;;;;; +13929;EGYPTIAN HIEROGLYPH-13929;Lo;0;L;;;;;N;;;;; +1392A;EGYPTIAN HIEROGLYPH-1392A;Lo;0;L;;;;;N;;;;; +1392B;EGYPTIAN HIEROGLYPH-1392B;Lo;0;L;;;;;N;;;;; +1392C;EGYPTIAN HIEROGLYPH-1392C;Lo;0;L;;;;;N;;;;; +1392D;EGYPTIAN HIEROGLYPH-1392D;Lo;0;L;;;;;N;;;;; +1392E;EGYPTIAN HIEROGLYPH-1392E;Lo;0;L;;;;;N;;;;; +1392F;EGYPTIAN HIEROGLYPH-1392F;Lo;0;L;;;;;N;;;;; +13930;EGYPTIAN HIEROGLYPH-13930;Lo;0;L;;;;;N;;;;; +13931;EGYPTIAN HIEROGLYPH-13931;Lo;0;L;;;;;N;;;;; +13932;EGYPTIAN HIEROGLYPH-13932;Lo;0;L;;;;;N;;;;; +13933;EGYPTIAN HIEROGLYPH-13933;Lo;0;L;;;;;N;;;;; +13934;EGYPTIAN HIEROGLYPH-13934;Lo;0;L;;;;;N;;;;; +13935;EGYPTIAN HIEROGLYPH-13935;Lo;0;L;;;;;N;;;;; +13936;EGYPTIAN HIEROGLYPH-13936;Lo;0;L;;;;;N;;;;; +13937;EGYPTIAN HIEROGLYPH-13937;Lo;0;L;;;;;N;;;;; +13938;EGYPTIAN HIEROGLYPH-13938;Lo;0;L;;;;;N;;;;; +13939;EGYPTIAN HIEROGLYPH-13939;Lo;0;L;;;;;N;;;;; +1393A;EGYPTIAN HIEROGLYPH-1393A;Lo;0;L;;;;;N;;;;; +1393B;EGYPTIAN HIEROGLYPH-1393B;Lo;0;L;;;;;N;;;;; +1393C;EGYPTIAN HIEROGLYPH-1393C;Lo;0;L;;;;;N;;;;; +1393D;EGYPTIAN HIEROGLYPH-1393D;Lo;0;L;;;;;N;;;;; +1393E;EGYPTIAN HIEROGLYPH-1393E;Lo;0;L;;;;;N;;;;; +1393F;EGYPTIAN HIEROGLYPH-1393F;Lo;0;L;;;;;N;;;;; +13940;EGYPTIAN HIEROGLYPH-13940;Lo;0;L;;;;;N;;;;; +13941;EGYPTIAN HIEROGLYPH-13941;Lo;0;L;;;;;N;;;;; +13942;EGYPTIAN HIEROGLYPH-13942;Lo;0;L;;;;;N;;;;; +13943;EGYPTIAN HIEROGLYPH-13943;Lo;0;L;;;;;N;;;;; +13944;EGYPTIAN HIEROGLYPH-13944;Lo;0;L;;;;;N;;;;; +13945;EGYPTIAN HIEROGLYPH-13945;Lo;0;L;;;;;N;;;;; +13946;EGYPTIAN HIEROGLYPH-13946;Lo;0;L;;;;;N;;;;; +13947;EGYPTIAN HIEROGLYPH-13947;Lo;0;L;;;;;N;;;;; +13948;EGYPTIAN HIEROGLYPH-13948;Lo;0;L;;;;;N;;;;; +13949;EGYPTIAN HIEROGLYPH-13949;Lo;0;L;;;;;N;;;;; +1394A;EGYPTIAN HIEROGLYPH-1394A;Lo;0;L;;;;;N;;;;; +1394B;EGYPTIAN HIEROGLYPH-1394B;Lo;0;L;;;;;N;;;;; +1394C;EGYPTIAN HIEROGLYPH-1394C;Lo;0;L;;;;;N;;;;; +1394D;EGYPTIAN HIEROGLYPH-1394D;Lo;0;L;;;;;N;;;;; +1394E;EGYPTIAN HIEROGLYPH-1394E;Lo;0;L;;;;;N;;;;; +1394F;EGYPTIAN HIEROGLYPH-1394F;Lo;0;L;;;;;N;;;;; +13950;EGYPTIAN HIEROGLYPH-13950;Lo;0;L;;;;;N;;;;; +13951;EGYPTIAN HIEROGLYPH-13951;Lo;0;L;;;;;N;;;;; +13952;EGYPTIAN HIEROGLYPH-13952;Lo;0;L;;;;;N;;;;; +13953;EGYPTIAN HIEROGLYPH-13953;Lo;0;L;;;;;N;;;;; +13954;EGYPTIAN HIEROGLYPH-13954;Lo;0;L;;;;;N;;;;; +13955;EGYPTIAN HIEROGLYPH-13955;Lo;0;L;;;;;N;;;;; +13956;EGYPTIAN HIEROGLYPH-13956;Lo;0;L;;;;;N;;;;; +13957;EGYPTIAN HIEROGLYPH-13957;Lo;0;L;;;;;N;;;;; +13958;EGYPTIAN HIEROGLYPH-13958;Lo;0;L;;;;;N;;;;; +13959;EGYPTIAN HIEROGLYPH-13959;Lo;0;L;;;;;N;;;;; +1395A;EGYPTIAN HIEROGLYPH-1395A;Lo;0;L;;;;;N;;;;; +1395B;EGYPTIAN HIEROGLYPH-1395B;Lo;0;L;;;;;N;;;;; +1395C;EGYPTIAN HIEROGLYPH-1395C;Lo;0;L;;;;;N;;;;; +1395D;EGYPTIAN HIEROGLYPH-1395D;Lo;0;L;;;;;N;;;;; +1395E;EGYPTIAN HIEROGLYPH-1395E;Lo;0;L;;;;;N;;;;; +1395F;EGYPTIAN HIEROGLYPH-1395F;Lo;0;L;;;;;N;;;;; +13960;EGYPTIAN HIEROGLYPH-13960;Lo;0;L;;;;;N;;;;; +13961;EGYPTIAN HIEROGLYPH-13961;Lo;0;L;;;;;N;;;;; +13962;EGYPTIAN HIEROGLYPH-13962;Lo;0;L;;;;;N;;;;; +13963;EGYPTIAN HIEROGLYPH-13963;Lo;0;L;;;;;N;;;;; +13964;EGYPTIAN HIEROGLYPH-13964;Lo;0;L;;;;;N;;;;; +13965;EGYPTIAN HIEROGLYPH-13965;Lo;0;L;;;;;N;;;;; +13966;EGYPTIAN HIEROGLYPH-13966;Lo;0;L;;;;;N;;;;; +13967;EGYPTIAN HIEROGLYPH-13967;Lo;0;L;;;;;N;;;;; +13968;EGYPTIAN HIEROGLYPH-13968;Lo;0;L;;;;;N;;;;; +13969;EGYPTIAN HIEROGLYPH-13969;Lo;0;L;;;;;N;;;;; +1396A;EGYPTIAN HIEROGLYPH-1396A;Lo;0;L;;;;;N;;;;; +1396B;EGYPTIAN HIEROGLYPH-1396B;Lo;0;L;;;;;N;;;;; +1396C;EGYPTIAN HIEROGLYPH-1396C;Lo;0;L;;;;;N;;;;; +1396D;EGYPTIAN HIEROGLYPH-1396D;Lo;0;L;;;;;N;;;;; +1396E;EGYPTIAN HIEROGLYPH-1396E;Lo;0;L;;;;;N;;;;; +1396F;EGYPTIAN HIEROGLYPH-1396F;Lo;0;L;;;;;N;;;;; +13970;EGYPTIAN HIEROGLYPH-13970;Lo;0;L;;;;;N;;;;; +13971;EGYPTIAN HIEROGLYPH-13971;Lo;0;L;;;;;N;;;;; +13972;EGYPTIAN HIEROGLYPH-13972;Lo;0;L;;;;;N;;;;; +13973;EGYPTIAN HIEROGLYPH-13973;Lo;0;L;;;;;N;;;;; +13974;EGYPTIAN HIEROGLYPH-13974;Lo;0;L;;;;;N;;;;; +13975;EGYPTIAN HIEROGLYPH-13975;Lo;0;L;;;;;N;;;;; +13976;EGYPTIAN HIEROGLYPH-13976;Lo;0;L;;;;;N;;;;; +13977;EGYPTIAN HIEROGLYPH-13977;Lo;0;L;;;;;N;;;;; +13978;EGYPTIAN HIEROGLYPH-13978;Lo;0;L;;;;;N;;;;; +13979;EGYPTIAN HIEROGLYPH-13979;Lo;0;L;;;;;N;;;;; +1397A;EGYPTIAN HIEROGLYPH-1397A;Lo;0;L;;;;;N;;;;; +1397B;EGYPTIAN HIEROGLYPH-1397B;Lo;0;L;;;;;N;;;;; +1397C;EGYPTIAN HIEROGLYPH-1397C;Lo;0;L;;;;;N;;;;; +1397D;EGYPTIAN HIEROGLYPH-1397D;Lo;0;L;;;;;N;;;;; +1397E;EGYPTIAN HIEROGLYPH-1397E;Lo;0;L;;;;;N;;;;; +1397F;EGYPTIAN HIEROGLYPH-1397F;Lo;0;L;;;;;N;;;;; +13980;EGYPTIAN HIEROGLYPH-13980;Lo;0;L;;;;;N;;;;; +13981;EGYPTIAN HIEROGLYPH-13981;Lo;0;L;;;;;N;;;;; +13982;EGYPTIAN HIEROGLYPH-13982;Lo;0;L;;;;;N;;;;; +13983;EGYPTIAN HIEROGLYPH-13983;Lo;0;L;;;;;N;;;;; +13984;EGYPTIAN HIEROGLYPH-13984;Lo;0;L;;;;;N;;;;; +13985;EGYPTIAN HIEROGLYPH-13985;Lo;0;L;;;;;N;;;;; +13986;EGYPTIAN HIEROGLYPH-13986;Lo;0;L;;;;;N;;;;; +13987;EGYPTIAN HIEROGLYPH-13987;Lo;0;L;;;;;N;;;;; +13988;EGYPTIAN HIEROGLYPH-13988;Lo;0;L;;;;;N;;;;; +13989;EGYPTIAN HIEROGLYPH-13989;Lo;0;L;;;;;N;;;;; +1398A;EGYPTIAN HIEROGLYPH-1398A;Lo;0;L;;;;;N;;;;; +1398B;EGYPTIAN HIEROGLYPH-1398B;Lo;0;L;;;;;N;;;;; +1398C;EGYPTIAN HIEROGLYPH-1398C;Lo;0;L;;;;;N;;;;; +1398D;EGYPTIAN HIEROGLYPH-1398D;Lo;0;L;;;;;N;;;;; +1398E;EGYPTIAN HIEROGLYPH-1398E;Lo;0;L;;;;;N;;;;; +1398F;EGYPTIAN HIEROGLYPH-1398F;Lo;0;L;;;;;N;;;;; +13990;EGYPTIAN HIEROGLYPH-13990;Lo;0;L;;;;;N;;;;; +13991;EGYPTIAN HIEROGLYPH-13991;Lo;0;L;;;;;N;;;;; +13992;EGYPTIAN HIEROGLYPH-13992;Lo;0;L;;;;;N;;;;; +13993;EGYPTIAN HIEROGLYPH-13993;Lo;0;L;;;;;N;;;;; +13994;EGYPTIAN HIEROGLYPH-13994;Lo;0;L;;;;;N;;;;; +13995;EGYPTIAN HIEROGLYPH-13995;Lo;0;L;;;;;N;;;;; +13996;EGYPTIAN HIEROGLYPH-13996;Lo;0;L;;;;;N;;;;; +13997;EGYPTIAN HIEROGLYPH-13997;Lo;0;L;;;;;N;;;;; +13998;EGYPTIAN HIEROGLYPH-13998;Lo;0;L;;;;;N;;;;; +13999;EGYPTIAN HIEROGLYPH-13999;Lo;0;L;;;;;N;;;;; +1399A;EGYPTIAN HIEROGLYPH-1399A;Lo;0;L;;;;;N;;;;; +1399B;EGYPTIAN HIEROGLYPH-1399B;Lo;0;L;;;;;N;;;;; +1399C;EGYPTIAN HIEROGLYPH-1399C;Lo;0;L;;;;;N;;;;; +1399D;EGYPTIAN HIEROGLYPH-1399D;Lo;0;L;;;;;N;;;;; +1399E;EGYPTIAN HIEROGLYPH-1399E;Lo;0;L;;;;;N;;;;; +1399F;EGYPTIAN HIEROGLYPH-1399F;Lo;0;L;;;;;N;;;;; +139A0;EGYPTIAN HIEROGLYPH-139A0;Lo;0;L;;;;;N;;;;; +139A1;EGYPTIAN HIEROGLYPH-139A1;Lo;0;L;;;;;N;;;;; +139A2;EGYPTIAN HIEROGLYPH-139A2;Lo;0;L;;;;;N;;;;; +139A3;EGYPTIAN HIEROGLYPH-139A3;Lo;0;L;;;;;N;;;;; +139A4;EGYPTIAN HIEROGLYPH-139A4;Lo;0;L;;;;;N;;;;; +139A5;EGYPTIAN HIEROGLYPH-139A5;Lo;0;L;;;;;N;;;;; +139A6;EGYPTIAN HIEROGLYPH-139A6;Lo;0;L;;;;;N;;;;; +139A7;EGYPTIAN HIEROGLYPH-139A7;Lo;0;L;;;;;N;;;;; +139A8;EGYPTIAN HIEROGLYPH-139A8;Lo;0;L;;;;;N;;;;; +139A9;EGYPTIAN HIEROGLYPH-139A9;Lo;0;L;;;;;N;;;;; +139AA;EGYPTIAN HIEROGLYPH-139AA;Lo;0;L;;;;;N;;;;; +139AB;EGYPTIAN HIEROGLYPH-139AB;Lo;0;L;;;;;N;;;;; +139AC;EGYPTIAN HIEROGLYPH-139AC;Lo;0;L;;;;;N;;;;; +139AD;EGYPTIAN HIEROGLYPH-139AD;Lo;0;L;;;;;N;;;;; +139AE;EGYPTIAN HIEROGLYPH-139AE;Lo;0;L;;;;;N;;;;; +139AF;EGYPTIAN HIEROGLYPH-139AF;Lo;0;L;;;;;N;;;;; +139B0;EGYPTIAN HIEROGLYPH-139B0;Lo;0;L;;;;;N;;;;; +139B1;EGYPTIAN HIEROGLYPH-139B1;Lo;0;L;;;;;N;;;;; +139B2;EGYPTIAN HIEROGLYPH-139B2;Lo;0;L;;;;;N;;;;; +139B3;EGYPTIAN HIEROGLYPH-139B3;Lo;0;L;;;;;N;;;;; +139B4;EGYPTIAN HIEROGLYPH-139B4;Lo;0;L;;;;;N;;;;; +139B5;EGYPTIAN HIEROGLYPH-139B5;Lo;0;L;;;;;N;;;;; +139B6;EGYPTIAN HIEROGLYPH-139B6;Lo;0;L;;;;;N;;;;; +139B7;EGYPTIAN HIEROGLYPH-139B7;Lo;0;L;;;;;N;;;;; +139B8;EGYPTIAN HIEROGLYPH-139B8;Lo;0;L;;;;;N;;;;; +139B9;EGYPTIAN HIEROGLYPH-139B9;Lo;0;L;;;;;N;;;;; +139BA;EGYPTIAN HIEROGLYPH-139BA;Lo;0;L;;;;;N;;;;; +139BB;EGYPTIAN HIEROGLYPH-139BB;Lo;0;L;;;;;N;;;;; +139BC;EGYPTIAN HIEROGLYPH-139BC;Lo;0;L;;;;;N;;;;; +139BD;EGYPTIAN HIEROGLYPH-139BD;Lo;0;L;;;;;N;;;;; +139BE;EGYPTIAN HIEROGLYPH-139BE;Lo;0;L;;;;;N;;;;; +139BF;EGYPTIAN HIEROGLYPH-139BF;Lo;0;L;;;;;N;;;;; +139C0;EGYPTIAN HIEROGLYPH-139C0;Lo;0;L;;;;;N;;;;; +139C1;EGYPTIAN HIEROGLYPH-139C1;Lo;0;L;;;;;N;;;;; +139C2;EGYPTIAN HIEROGLYPH-139C2;Lo;0;L;;;;;N;;;;; +139C3;EGYPTIAN HIEROGLYPH-139C3;Lo;0;L;;;;;N;;;;; +139C4;EGYPTIAN HIEROGLYPH-139C4;Lo;0;L;;;;;N;;;;; +139C5;EGYPTIAN HIEROGLYPH-139C5;Lo;0;L;;;;;N;;;;; +139C6;EGYPTIAN HIEROGLYPH-139C6;Lo;0;L;;;;;N;;;;; +139C7;EGYPTIAN HIEROGLYPH-139C7;Lo;0;L;;;;;N;;;;; +139C8;EGYPTIAN HIEROGLYPH-139C8;Lo;0;L;;;;;N;;;;; +139C9;EGYPTIAN HIEROGLYPH-139C9;Lo;0;L;;;;;N;;;;; +139CA;EGYPTIAN HIEROGLYPH-139CA;Lo;0;L;;;;;N;;;;; +139CB;EGYPTIAN HIEROGLYPH-139CB;Lo;0;L;;;;;N;;;;; +139CC;EGYPTIAN HIEROGLYPH-139CC;Lo;0;L;;;;;N;;;;; +139CD;EGYPTIAN HIEROGLYPH-139CD;Lo;0;L;;;;;N;;;;; +139CE;EGYPTIAN HIEROGLYPH-139CE;Lo;0;L;;;;;N;;;;; +139CF;EGYPTIAN HIEROGLYPH-139CF;Lo;0;L;;;;;N;;;;; +139D0;EGYPTIAN HIEROGLYPH-139D0;Lo;0;L;;;;;N;;;;; +139D1;EGYPTIAN HIEROGLYPH-139D1;Lo;0;L;;;;;N;;;;; +139D2;EGYPTIAN HIEROGLYPH-139D2;Lo;0;L;;;;;N;;;;; +139D3;EGYPTIAN HIEROGLYPH-139D3;Lo;0;L;;;;;N;;;;; +139D4;EGYPTIAN HIEROGLYPH-139D4;Lo;0;L;;;;;N;;;;; +139D5;EGYPTIAN HIEROGLYPH-139D5;Lo;0;L;;;;;N;;;;; +139D6;EGYPTIAN HIEROGLYPH-139D6;Lo;0;L;;;;;N;;;;; +139D7;EGYPTIAN HIEROGLYPH-139D7;Lo;0;L;;;;;N;;;;; +139D8;EGYPTIAN HIEROGLYPH-139D8;Lo;0;L;;;;;N;;;;; +139D9;EGYPTIAN HIEROGLYPH-139D9;Lo;0;L;;;;;N;;;;; +139DA;EGYPTIAN HIEROGLYPH-139DA;Lo;0;L;;;;;N;;;;; +139DB;EGYPTIAN HIEROGLYPH-139DB;Lo;0;L;;;;;N;;;;; +139DC;EGYPTIAN HIEROGLYPH-139DC;Lo;0;L;;;;;N;;;;; +139DD;EGYPTIAN HIEROGLYPH-139DD;Lo;0;L;;;;;N;;;;; +139DE;EGYPTIAN HIEROGLYPH-139DE;Lo;0;L;;;;;N;;;;; +139DF;EGYPTIAN HIEROGLYPH-139DF;Lo;0;L;;;;;N;;;;; +139E0;EGYPTIAN HIEROGLYPH-139E0;Lo;0;L;;;;;N;;;;; +139E1;EGYPTIAN HIEROGLYPH-139E1;Lo;0;L;;;;;N;;;;; +139E2;EGYPTIAN HIEROGLYPH-139E2;Lo;0;L;;;;;N;;;;; +139E3;EGYPTIAN HIEROGLYPH-139E3;Lo;0;L;;;;;N;;;;; +139E4;EGYPTIAN HIEROGLYPH-139E4;Lo;0;L;;;;;N;;;;; +139E5;EGYPTIAN HIEROGLYPH-139E5;Lo;0;L;;;;;N;;;;; +139E6;EGYPTIAN HIEROGLYPH-139E6;Lo;0;L;;;;;N;;;;; +139E7;EGYPTIAN HIEROGLYPH-139E7;Lo;0;L;;;;;N;;;;; +139E8;EGYPTIAN HIEROGLYPH-139E8;Lo;0;L;;;;;N;;;;; +139E9;EGYPTIAN HIEROGLYPH-139E9;Lo;0;L;;;;;N;;;;; +139EA;EGYPTIAN HIEROGLYPH-139EA;Lo;0;L;;;;;N;;;;; +139EB;EGYPTIAN HIEROGLYPH-139EB;Lo;0;L;;;;;N;;;;; +139EC;EGYPTIAN HIEROGLYPH-139EC;Lo;0;L;;;;;N;;;;; +139ED;EGYPTIAN HIEROGLYPH-139ED;Lo;0;L;;;;;N;;;;; +139EE;EGYPTIAN HIEROGLYPH-139EE;Lo;0;L;;;;;N;;;;; +139EF;EGYPTIAN HIEROGLYPH-139EF;Lo;0;L;;;;;N;;;;; +139F0;EGYPTIAN HIEROGLYPH-139F0;Lo;0;L;;;;;N;;;;; +139F1;EGYPTIAN HIEROGLYPH-139F1;Lo;0;L;;;;;N;;;;; +139F2;EGYPTIAN HIEROGLYPH-139F2;Lo;0;L;;;;;N;;;;; +139F3;EGYPTIAN HIEROGLYPH-139F3;Lo;0;L;;;;;N;;;;; +139F4;EGYPTIAN HIEROGLYPH-139F4;Lo;0;L;;;;;N;;;;; +139F5;EGYPTIAN HIEROGLYPH-139F5;Lo;0;L;;;;;N;;;;; +139F6;EGYPTIAN HIEROGLYPH-139F6;Lo;0;L;;;;;N;;;;; +139F7;EGYPTIAN HIEROGLYPH-139F7;Lo;0;L;;;;;N;;;;; +139F8;EGYPTIAN HIEROGLYPH-139F8;Lo;0;L;;;;;N;;;;; +139F9;EGYPTIAN HIEROGLYPH-139F9;Lo;0;L;;;;;N;;;;; +139FA;EGYPTIAN HIEROGLYPH-139FA;Lo;0;L;;;;;N;;;;; +139FB;EGYPTIAN HIEROGLYPH-139FB;Lo;0;L;;;;;N;;;;; +139FC;EGYPTIAN HIEROGLYPH-139FC;Lo;0;L;;;;;N;;;;; +139FD;EGYPTIAN HIEROGLYPH-139FD;Lo;0;L;;;;;N;;;;; +139FE;EGYPTIAN HIEROGLYPH-139FE;Lo;0;L;;;;;N;;;;; +139FF;EGYPTIAN HIEROGLYPH-139FF;Lo;0;L;;;;;N;;;;; +13A00;EGYPTIAN HIEROGLYPH-13A00;Lo;0;L;;;;;N;;;;; +13A01;EGYPTIAN HIEROGLYPH-13A01;Lo;0;L;;;;;N;;;;; +13A02;EGYPTIAN HIEROGLYPH-13A02;Lo;0;L;;;;;N;;;;; +13A03;EGYPTIAN HIEROGLYPH-13A03;Lo;0;L;;;;;N;;;;; +13A04;EGYPTIAN HIEROGLYPH-13A04;Lo;0;L;;;;;N;;;;; +13A05;EGYPTIAN HIEROGLYPH-13A05;Lo;0;L;;;;;N;;;;; +13A06;EGYPTIAN HIEROGLYPH-13A06;Lo;0;L;;;;;N;;;;; +13A07;EGYPTIAN HIEROGLYPH-13A07;Lo;0;L;;;;;N;;;;; +13A08;EGYPTIAN HIEROGLYPH-13A08;Lo;0;L;;;;;N;;;;; +13A09;EGYPTIAN HIEROGLYPH-13A09;Lo;0;L;;;;;N;;;;; +13A0A;EGYPTIAN HIEROGLYPH-13A0A;Lo;0;L;;;;;N;;;;; +13A0B;EGYPTIAN HIEROGLYPH-13A0B;Lo;0;L;;;;;N;;;;; +13A0C;EGYPTIAN HIEROGLYPH-13A0C;Lo;0;L;;;;;N;;;;; +13A0D;EGYPTIAN HIEROGLYPH-13A0D;Lo;0;L;;;;;N;;;;; +13A0E;EGYPTIAN HIEROGLYPH-13A0E;Lo;0;L;;;;;N;;;;; +13A0F;EGYPTIAN HIEROGLYPH-13A0F;Lo;0;L;;;;;N;;;;; +13A10;EGYPTIAN HIEROGLYPH-13A10;Lo;0;L;;;;;N;;;;; +13A11;EGYPTIAN HIEROGLYPH-13A11;Lo;0;L;;;;;N;;;;; +13A12;EGYPTIAN HIEROGLYPH-13A12;Lo;0;L;;;;;N;;;;; +13A13;EGYPTIAN HIEROGLYPH-13A13;Lo;0;L;;;;;N;;;;; +13A14;EGYPTIAN HIEROGLYPH-13A14;Lo;0;L;;;;;N;;;;; +13A15;EGYPTIAN HIEROGLYPH-13A15;Lo;0;L;;;;;N;;;;; +13A16;EGYPTIAN HIEROGLYPH-13A16;Lo;0;L;;;;;N;;;;; +13A17;EGYPTIAN HIEROGLYPH-13A17;Lo;0;L;;;;;N;;;;; +13A18;EGYPTIAN HIEROGLYPH-13A18;Lo;0;L;;;;;N;;;;; +13A19;EGYPTIAN HIEROGLYPH-13A19;Lo;0;L;;;;;N;;;;; +13A1A;EGYPTIAN HIEROGLYPH-13A1A;Lo;0;L;;;;;N;;;;; +13A1B;EGYPTIAN HIEROGLYPH-13A1B;Lo;0;L;;;;;N;;;;; +13A1C;EGYPTIAN HIEROGLYPH-13A1C;Lo;0;L;;;;;N;;;;; +13A1D;EGYPTIAN HIEROGLYPH-13A1D;Lo;0;L;;;;;N;;;;; +13A1E;EGYPTIAN HIEROGLYPH-13A1E;Lo;0;L;;;;;N;;;;; +13A1F;EGYPTIAN HIEROGLYPH-13A1F;Lo;0;L;;;;;N;;;;; +13A20;EGYPTIAN HIEROGLYPH-13A20;Lo;0;L;;;;;N;;;;; +13A21;EGYPTIAN HIEROGLYPH-13A21;Lo;0;L;;;;;N;;;;; +13A22;EGYPTIAN HIEROGLYPH-13A22;Lo;0;L;;;;;N;;;;; +13A23;EGYPTIAN HIEROGLYPH-13A23;Lo;0;L;;;;;N;;;;; +13A24;EGYPTIAN HIEROGLYPH-13A24;Lo;0;L;;;;;N;;;;; +13A25;EGYPTIAN HIEROGLYPH-13A25;Lo;0;L;;;;;N;;;;; +13A26;EGYPTIAN HIEROGLYPH-13A26;Lo;0;L;;;;;N;;;;; +13A27;EGYPTIAN HIEROGLYPH-13A27;Lo;0;L;;;;;N;;;;; +13A28;EGYPTIAN HIEROGLYPH-13A28;Lo;0;L;;;;;N;;;;; +13A29;EGYPTIAN HIEROGLYPH-13A29;Lo;0;L;;;;;N;;;;; +13A2A;EGYPTIAN HIEROGLYPH-13A2A;Lo;0;L;;;;;N;;;;; +13A2B;EGYPTIAN HIEROGLYPH-13A2B;Lo;0;L;;;;;N;;;;; +13A2C;EGYPTIAN HIEROGLYPH-13A2C;Lo;0;L;;;;;N;;;;; +13A2D;EGYPTIAN HIEROGLYPH-13A2D;Lo;0;L;;;;;N;;;;; +13A2E;EGYPTIAN HIEROGLYPH-13A2E;Lo;0;L;;;;;N;;;;; +13A2F;EGYPTIAN HIEROGLYPH-13A2F;Lo;0;L;;;;;N;;;;; +13A30;EGYPTIAN HIEROGLYPH-13A30;Lo;0;L;;;;;N;;;;; +13A31;EGYPTIAN HIEROGLYPH-13A31;Lo;0;L;;;;;N;;;;; +13A32;EGYPTIAN HIEROGLYPH-13A32;Lo;0;L;;;;;N;;;;; +13A33;EGYPTIAN HIEROGLYPH-13A33;Lo;0;L;;;;;N;;;;; +13A34;EGYPTIAN HIEROGLYPH-13A34;Lo;0;L;;;;;N;;;;; +13A35;EGYPTIAN HIEROGLYPH-13A35;Lo;0;L;;;;;N;;;;; +13A36;EGYPTIAN HIEROGLYPH-13A36;Lo;0;L;;;;;N;;;;; +13A37;EGYPTIAN HIEROGLYPH-13A37;Lo;0;L;;;;;N;;;;; +13A38;EGYPTIAN HIEROGLYPH-13A38;Lo;0;L;;;;;N;;;;; +13A39;EGYPTIAN HIEROGLYPH-13A39;Lo;0;L;;;;;N;;;;; +13A3A;EGYPTIAN HIEROGLYPH-13A3A;Lo;0;L;;;;;N;;;;; +13A3B;EGYPTIAN HIEROGLYPH-13A3B;Lo;0;L;;;;;N;;;;; +13A3C;EGYPTIAN HIEROGLYPH-13A3C;Lo;0;L;;;;;N;;;;; +13A3D;EGYPTIAN HIEROGLYPH-13A3D;Lo;0;L;;;;;N;;;;; +13A3E;EGYPTIAN HIEROGLYPH-13A3E;Lo;0;L;;;;;N;;;;; +13A3F;EGYPTIAN HIEROGLYPH-13A3F;Lo;0;L;;;;;N;;;;; +13A40;EGYPTIAN HIEROGLYPH-13A40;Lo;0;L;;;;;N;;;;; +13A41;EGYPTIAN HIEROGLYPH-13A41;Lo;0;L;;;;;N;;;;; +13A42;EGYPTIAN HIEROGLYPH-13A42;Lo;0;L;;;;;N;;;;; +13A43;EGYPTIAN HIEROGLYPH-13A43;Lo;0;L;;;;;N;;;;; +13A44;EGYPTIAN HIEROGLYPH-13A44;Lo;0;L;;;;;N;;;;; +13A45;EGYPTIAN HIEROGLYPH-13A45;Lo;0;L;;;;;N;;;;; +13A46;EGYPTIAN HIEROGLYPH-13A46;Lo;0;L;;;;;N;;;;; +13A47;EGYPTIAN HIEROGLYPH-13A47;Lo;0;L;;;;;N;;;;; +13A48;EGYPTIAN HIEROGLYPH-13A48;Lo;0;L;;;;;N;;;;; +13A49;EGYPTIAN HIEROGLYPH-13A49;Lo;0;L;;;;;N;;;;; +13A4A;EGYPTIAN HIEROGLYPH-13A4A;Lo;0;L;;;;;N;;;;; +13A4B;EGYPTIAN HIEROGLYPH-13A4B;Lo;0;L;;;;;N;;;;; +13A4C;EGYPTIAN HIEROGLYPH-13A4C;Lo;0;L;;;;;N;;;;; +13A4D;EGYPTIAN HIEROGLYPH-13A4D;Lo;0;L;;;;;N;;;;; +13A4E;EGYPTIAN HIEROGLYPH-13A4E;Lo;0;L;;;;;N;;;;; +13A4F;EGYPTIAN HIEROGLYPH-13A4F;Lo;0;L;;;;;N;;;;; +13A50;EGYPTIAN HIEROGLYPH-13A50;Lo;0;L;;;;;N;;;;; +13A51;EGYPTIAN HIEROGLYPH-13A51;Lo;0;L;;;;;N;;;;; +13A52;EGYPTIAN HIEROGLYPH-13A52;Lo;0;L;;;;;N;;;;; +13A53;EGYPTIAN HIEROGLYPH-13A53;Lo;0;L;;;;;N;;;;; +13A54;EGYPTIAN HIEROGLYPH-13A54;Lo;0;L;;;;;N;;;;; +13A55;EGYPTIAN HIEROGLYPH-13A55;Lo;0;L;;;;;N;;;;; +13A56;EGYPTIAN HIEROGLYPH-13A56;Lo;0;L;;;;;N;;;;; +13A57;EGYPTIAN HIEROGLYPH-13A57;Lo;0;L;;;;;N;;;;; +13A58;EGYPTIAN HIEROGLYPH-13A58;Lo;0;L;;;;;N;;;;; +13A59;EGYPTIAN HIEROGLYPH-13A59;Lo;0;L;;;;;N;;;;; +13A5A;EGYPTIAN HIEROGLYPH-13A5A;Lo;0;L;;;;;N;;;;; +13A5B;EGYPTIAN HIEROGLYPH-13A5B;Lo;0;L;;;;;N;;;;; +13A5C;EGYPTIAN HIEROGLYPH-13A5C;Lo;0;L;;;;;N;;;;; +13A5D;EGYPTIAN HIEROGLYPH-13A5D;Lo;0;L;;;;;N;;;;; +13A5E;EGYPTIAN HIEROGLYPH-13A5E;Lo;0;L;;;;;N;;;;; +13A5F;EGYPTIAN HIEROGLYPH-13A5F;Lo;0;L;;;;;N;;;;; +13A60;EGYPTIAN HIEROGLYPH-13A60;Lo;0;L;;;;;N;;;;; +13A61;EGYPTIAN HIEROGLYPH-13A61;Lo;0;L;;;;;N;;;;; +13A62;EGYPTIAN HIEROGLYPH-13A62;Lo;0;L;;;;;N;;;;; +13A63;EGYPTIAN HIEROGLYPH-13A63;Lo;0;L;;;;;N;;;;; +13A64;EGYPTIAN HIEROGLYPH-13A64;Lo;0;L;;;;;N;;;;; +13A65;EGYPTIAN HIEROGLYPH-13A65;Lo;0;L;;;;;N;;;;; +13A66;EGYPTIAN HIEROGLYPH-13A66;Lo;0;L;;;;;N;;;;; +13A67;EGYPTIAN HIEROGLYPH-13A67;Lo;0;L;;;;;N;;;;; +13A68;EGYPTIAN HIEROGLYPH-13A68;Lo;0;L;;;;;N;;;;; +13A69;EGYPTIAN HIEROGLYPH-13A69;Lo;0;L;;;;;N;;;;; +13A6A;EGYPTIAN HIEROGLYPH-13A6A;Lo;0;L;;;;;N;;;;; +13A6B;EGYPTIAN HIEROGLYPH-13A6B;Lo;0;L;;;;;N;;;;; +13A6C;EGYPTIAN HIEROGLYPH-13A6C;Lo;0;L;;;;;N;;;;; +13A6D;EGYPTIAN HIEROGLYPH-13A6D;Lo;0;L;;;;;N;;;;; +13A6E;EGYPTIAN HIEROGLYPH-13A6E;Lo;0;L;;;;;N;;;;; +13A6F;EGYPTIAN HIEROGLYPH-13A6F;Lo;0;L;;;;;N;;;;; +13A70;EGYPTIAN HIEROGLYPH-13A70;Lo;0;L;;;;;N;;;;; +13A71;EGYPTIAN HIEROGLYPH-13A71;Lo;0;L;;;;;N;;;;; +13A72;EGYPTIAN HIEROGLYPH-13A72;Lo;0;L;;;;;N;;;;; +13A73;EGYPTIAN HIEROGLYPH-13A73;Lo;0;L;;;;;N;;;;; +13A74;EGYPTIAN HIEROGLYPH-13A74;Lo;0;L;;;;;N;;;;; +13A75;EGYPTIAN HIEROGLYPH-13A75;Lo;0;L;;;;;N;;;;; +13A76;EGYPTIAN HIEROGLYPH-13A76;Lo;0;L;;;;;N;;;;; +13A77;EGYPTIAN HIEROGLYPH-13A77;Lo;0;L;;;;;N;;;;; +13A78;EGYPTIAN HIEROGLYPH-13A78;Lo;0;L;;;;;N;;;;; +13A79;EGYPTIAN HIEROGLYPH-13A79;Lo;0;L;;;;;N;;;;; +13A7A;EGYPTIAN HIEROGLYPH-13A7A;Lo;0;L;;;;;N;;;;; +13A7B;EGYPTIAN HIEROGLYPH-13A7B;Lo;0;L;;;;;N;;;;; +13A7C;EGYPTIAN HIEROGLYPH-13A7C;Lo;0;L;;;;;N;;;;; +13A7D;EGYPTIAN HIEROGLYPH-13A7D;Lo;0;L;;;;;N;;;;; +13A7E;EGYPTIAN HIEROGLYPH-13A7E;Lo;0;L;;;;;N;;;;; +13A7F;EGYPTIAN HIEROGLYPH-13A7F;Lo;0;L;;;;;N;;;;; +13A80;EGYPTIAN HIEROGLYPH-13A80;Lo;0;L;;;;;N;;;;; +13A81;EGYPTIAN HIEROGLYPH-13A81;Lo;0;L;;;;;N;;;;; +13A82;EGYPTIAN HIEROGLYPH-13A82;Lo;0;L;;;;;N;;;;; +13A83;EGYPTIAN HIEROGLYPH-13A83;Lo;0;L;;;;;N;;;;; +13A84;EGYPTIAN HIEROGLYPH-13A84;Lo;0;L;;;;;N;;;;; +13A85;EGYPTIAN HIEROGLYPH-13A85;Lo;0;L;;;;;N;;;;; +13A86;EGYPTIAN HIEROGLYPH-13A86;Lo;0;L;;;;;N;;;;; +13A87;EGYPTIAN HIEROGLYPH-13A87;Lo;0;L;;;;;N;;;;; +13A88;EGYPTIAN HIEROGLYPH-13A88;Lo;0;L;;;;;N;;;;; +13A89;EGYPTIAN HIEROGLYPH-13A89;Lo;0;L;;;;;N;;;;; +13A8A;EGYPTIAN HIEROGLYPH-13A8A;Lo;0;L;;;;;N;;;;; +13A8B;EGYPTIAN HIEROGLYPH-13A8B;Lo;0;L;;;;;N;;;;; +13A8C;EGYPTIAN HIEROGLYPH-13A8C;Lo;0;L;;;;;N;;;;; +13A8D;EGYPTIAN HIEROGLYPH-13A8D;Lo;0;L;;;;;N;;;;; +13A8E;EGYPTIAN HIEROGLYPH-13A8E;Lo;0;L;;;;;N;;;;; +13A8F;EGYPTIAN HIEROGLYPH-13A8F;Lo;0;L;;;;;N;;;;; +13A90;EGYPTIAN HIEROGLYPH-13A90;Lo;0;L;;;;;N;;;;; +13A91;EGYPTIAN HIEROGLYPH-13A91;Lo;0;L;;;;;N;;;;; +13A92;EGYPTIAN HIEROGLYPH-13A92;Lo;0;L;;;;;N;;;;; +13A93;EGYPTIAN HIEROGLYPH-13A93;Lo;0;L;;;;;N;;;;; +13A94;EGYPTIAN HIEROGLYPH-13A94;Lo;0;L;;;;;N;;;;; +13A95;EGYPTIAN HIEROGLYPH-13A95;Lo;0;L;;;;;N;;;;; +13A96;EGYPTIAN HIEROGLYPH-13A96;Lo;0;L;;;;;N;;;;; +13A97;EGYPTIAN HIEROGLYPH-13A97;Lo;0;L;;;;;N;;;;; +13A98;EGYPTIAN HIEROGLYPH-13A98;Lo;0;L;;;;;N;;;;; +13A99;EGYPTIAN HIEROGLYPH-13A99;Lo;0;L;;;;;N;;;;; +13A9A;EGYPTIAN HIEROGLYPH-13A9A;Lo;0;L;;;;;N;;;;; +13A9B;EGYPTIAN HIEROGLYPH-13A9B;Lo;0;L;;;;;N;;;;; +13A9C;EGYPTIAN HIEROGLYPH-13A9C;Lo;0;L;;;;;N;;;;; +13A9D;EGYPTIAN HIEROGLYPH-13A9D;Lo;0;L;;;;;N;;;;; +13A9E;EGYPTIAN HIEROGLYPH-13A9E;Lo;0;L;;;;;N;;;;; +13A9F;EGYPTIAN HIEROGLYPH-13A9F;Lo;0;L;;;;;N;;;;; +13AA0;EGYPTIAN HIEROGLYPH-13AA0;Lo;0;L;;;;;N;;;;; +13AA1;EGYPTIAN HIEROGLYPH-13AA1;Lo;0;L;;;;;N;;;;; +13AA2;EGYPTIAN HIEROGLYPH-13AA2;Lo;0;L;;;;;N;;;;; +13AA3;EGYPTIAN HIEROGLYPH-13AA3;Lo;0;L;;;;;N;;;;; +13AA4;EGYPTIAN HIEROGLYPH-13AA4;Lo;0;L;;;;;N;;;;; +13AA5;EGYPTIAN HIEROGLYPH-13AA5;Lo;0;L;;;;;N;;;;; +13AA6;EGYPTIAN HIEROGLYPH-13AA6;Lo;0;L;;;;;N;;;;; +13AA7;EGYPTIAN HIEROGLYPH-13AA7;Lo;0;L;;;;;N;;;;; +13AA8;EGYPTIAN HIEROGLYPH-13AA8;Lo;0;L;;;;;N;;;;; +13AA9;EGYPTIAN HIEROGLYPH-13AA9;Lo;0;L;;;;;N;;;;; +13AAA;EGYPTIAN HIEROGLYPH-13AAA;Lo;0;L;;;;;N;;;;; +13AAB;EGYPTIAN HIEROGLYPH-13AAB;Lo;0;L;;;;;N;;;;; +13AAC;EGYPTIAN HIEROGLYPH-13AAC;Lo;0;L;;;;;N;;;;; +13AAD;EGYPTIAN HIEROGLYPH-13AAD;Lo;0;L;;;;;N;;;;; +13AAE;EGYPTIAN HIEROGLYPH-13AAE;Lo;0;L;;;;;N;;;;; +13AAF;EGYPTIAN HIEROGLYPH-13AAF;Lo;0;L;;;;;N;;;;; +13AB0;EGYPTIAN HIEROGLYPH-13AB0;Lo;0;L;;;;;N;;;;; +13AB1;EGYPTIAN HIEROGLYPH-13AB1;Lo;0;L;;;;;N;;;;; +13AB2;EGYPTIAN HIEROGLYPH-13AB2;Lo;0;L;;;;;N;;;;; +13AB3;EGYPTIAN HIEROGLYPH-13AB3;Lo;0;L;;;;;N;;;;; +13AB4;EGYPTIAN HIEROGLYPH-13AB4;Lo;0;L;;;;;N;;;;; +13AB5;EGYPTIAN HIEROGLYPH-13AB5;Lo;0;L;;;;;N;;;;; +13AB6;EGYPTIAN HIEROGLYPH-13AB6;Lo;0;L;;;;;N;;;;; +13AB7;EGYPTIAN HIEROGLYPH-13AB7;Lo;0;L;;;;;N;;;;; +13AB8;EGYPTIAN HIEROGLYPH-13AB8;Lo;0;L;;;;;N;;;;; +13AB9;EGYPTIAN HIEROGLYPH-13AB9;Lo;0;L;;;;;N;;;;; +13ABA;EGYPTIAN HIEROGLYPH-13ABA;Lo;0;L;;;;;N;;;;; +13ABB;EGYPTIAN HIEROGLYPH-13ABB;Lo;0;L;;;;;N;;;;; +13ABC;EGYPTIAN HIEROGLYPH-13ABC;Lo;0;L;;;;;N;;;;; +13ABD;EGYPTIAN HIEROGLYPH-13ABD;Lo;0;L;;;;;N;;;;; +13ABE;EGYPTIAN HIEROGLYPH-13ABE;Lo;0;L;;;;;N;;;;; +13ABF;EGYPTIAN HIEROGLYPH-13ABF;Lo;0;L;;;;;N;;;;; +13AC0;EGYPTIAN HIEROGLYPH-13AC0;Lo;0;L;;;;;N;;;;; +13AC1;EGYPTIAN HIEROGLYPH-13AC1;Lo;0;L;;;;;N;;;;; +13AC2;EGYPTIAN HIEROGLYPH-13AC2;Lo;0;L;;;;;N;;;;; +13AC3;EGYPTIAN HIEROGLYPH-13AC3;Lo;0;L;;;;;N;;;;; +13AC4;EGYPTIAN HIEROGLYPH-13AC4;Lo;0;L;;;;;N;;;;; +13AC5;EGYPTIAN HIEROGLYPH-13AC5;Lo;0;L;;;;;N;;;;; +13AC6;EGYPTIAN HIEROGLYPH-13AC6;Lo;0;L;;;;;N;;;;; +13AC7;EGYPTIAN HIEROGLYPH-13AC7;Lo;0;L;;;;;N;;;;; +13AC8;EGYPTIAN HIEROGLYPH-13AC8;Lo;0;L;;;;;N;;;;; +13AC9;EGYPTIAN HIEROGLYPH-13AC9;Lo;0;L;;;;;N;;;;; +13ACA;EGYPTIAN HIEROGLYPH-13ACA;Lo;0;L;;;;;N;;;;; +13ACB;EGYPTIAN HIEROGLYPH-13ACB;Lo;0;L;;;;;N;;;;; +13ACC;EGYPTIAN HIEROGLYPH-13ACC;Lo;0;L;;;;;N;;;;; +13ACD;EGYPTIAN HIEROGLYPH-13ACD;Lo;0;L;;;;;N;;;;; +13ACE;EGYPTIAN HIEROGLYPH-13ACE;Lo;0;L;;;;;N;;;;; +13ACF;EGYPTIAN HIEROGLYPH-13ACF;Lo;0;L;;;;;N;;;;; +13AD0;EGYPTIAN HIEROGLYPH-13AD0;Lo;0;L;;;;;N;;;;; +13AD1;EGYPTIAN HIEROGLYPH-13AD1;Lo;0;L;;;;;N;;;;; +13AD2;EGYPTIAN HIEROGLYPH-13AD2;Lo;0;L;;;;;N;;;;; +13AD3;EGYPTIAN HIEROGLYPH-13AD3;Lo;0;L;;;;;N;;;;; +13AD4;EGYPTIAN HIEROGLYPH-13AD4;Lo;0;L;;;;;N;;;;; +13AD5;EGYPTIAN HIEROGLYPH-13AD5;Lo;0;L;;;;;N;;;;; +13AD6;EGYPTIAN HIEROGLYPH-13AD6;Lo;0;L;;;;;N;;;;; +13AD7;EGYPTIAN HIEROGLYPH-13AD7;Lo;0;L;;;;;N;;;;; +13AD8;EGYPTIAN HIEROGLYPH-13AD8;Lo;0;L;;;;;N;;;;; +13AD9;EGYPTIAN HIEROGLYPH-13AD9;Lo;0;L;;;;;N;;;;; +13ADA;EGYPTIAN HIEROGLYPH-13ADA;Lo;0;L;;;;;N;;;;; +13ADB;EGYPTIAN HIEROGLYPH-13ADB;Lo;0;L;;;;;N;;;;; +13ADC;EGYPTIAN HIEROGLYPH-13ADC;Lo;0;L;;;;;N;;;;; +13ADD;EGYPTIAN HIEROGLYPH-13ADD;Lo;0;L;;;;;N;;;;; +13ADE;EGYPTIAN HIEROGLYPH-13ADE;Lo;0;L;;;;;N;;;;; +13ADF;EGYPTIAN HIEROGLYPH-13ADF;Lo;0;L;;;;;N;;;;; +13AE0;EGYPTIAN HIEROGLYPH-13AE0;Lo;0;L;;;;;N;;;;; +13AE1;EGYPTIAN HIEROGLYPH-13AE1;Lo;0;L;;;;;N;;;;; +13AE2;EGYPTIAN HIEROGLYPH-13AE2;Lo;0;L;;;;;N;;;;; +13AE3;EGYPTIAN HIEROGLYPH-13AE3;Lo;0;L;;;;;N;;;;; +13AE4;EGYPTIAN HIEROGLYPH-13AE4;Lo;0;L;;;;;N;;;;; +13AE5;EGYPTIAN HIEROGLYPH-13AE5;Lo;0;L;;;;;N;;;;; +13AE6;EGYPTIAN HIEROGLYPH-13AE6;Lo;0;L;;;;;N;;;;; +13AE7;EGYPTIAN HIEROGLYPH-13AE7;Lo;0;L;;;;;N;;;;; +13AE8;EGYPTIAN HIEROGLYPH-13AE8;Lo;0;L;;;;;N;;;;; +13AE9;EGYPTIAN HIEROGLYPH-13AE9;Lo;0;L;;;;;N;;;;; +13AEA;EGYPTIAN HIEROGLYPH-13AEA;Lo;0;L;;;;;N;;;;; +13AEB;EGYPTIAN HIEROGLYPH-13AEB;Lo;0;L;;;;;N;;;;; +13AEC;EGYPTIAN HIEROGLYPH-13AEC;Lo;0;L;;;;;N;;;;; +13AED;EGYPTIAN HIEROGLYPH-13AED;Lo;0;L;;;;;N;;;;; +13AEE;EGYPTIAN HIEROGLYPH-13AEE;Lo;0;L;;;;;N;;;;; +13AEF;EGYPTIAN HIEROGLYPH-13AEF;Lo;0;L;;;;;N;;;;; +13AF0;EGYPTIAN HIEROGLYPH-13AF0;Lo;0;L;;;;;N;;;;; +13AF1;EGYPTIAN HIEROGLYPH-13AF1;Lo;0;L;;;;;N;;;;; +13AF2;EGYPTIAN HIEROGLYPH-13AF2;Lo;0;L;;;;;N;;;;; +13AF3;EGYPTIAN HIEROGLYPH-13AF3;Lo;0;L;;;;;N;;;;; +13AF4;EGYPTIAN HIEROGLYPH-13AF4;Lo;0;L;;;;;N;;;;; +13AF5;EGYPTIAN HIEROGLYPH-13AF5;Lo;0;L;;;;;N;;;;; +13AF6;EGYPTIAN HIEROGLYPH-13AF6;Lo;0;L;;;;;N;;;;; +13AF7;EGYPTIAN HIEROGLYPH-13AF7;Lo;0;L;;;;;N;;;;; +13AF8;EGYPTIAN HIEROGLYPH-13AF8;Lo;0;L;;;;;N;;;;; +13AF9;EGYPTIAN HIEROGLYPH-13AF9;Lo;0;L;;;;;N;;;;; +13AFA;EGYPTIAN HIEROGLYPH-13AFA;Lo;0;L;;;;;N;;;;; +13AFB;EGYPTIAN HIEROGLYPH-13AFB;Lo;0;L;;;;;N;;;;; +13AFC;EGYPTIAN HIEROGLYPH-13AFC;Lo;0;L;;;;;N;;;;; +13AFD;EGYPTIAN HIEROGLYPH-13AFD;Lo;0;L;;;;;N;;;;; +13AFE;EGYPTIAN HIEROGLYPH-13AFE;Lo;0;L;;;;;N;;;;; +13AFF;EGYPTIAN HIEROGLYPH-13AFF;Lo;0;L;;;;;N;;;;; +13B00;EGYPTIAN HIEROGLYPH-13B00;Lo;0;L;;;;;N;;;;; +13B01;EGYPTIAN HIEROGLYPH-13B01;Lo;0;L;;;;;N;;;;; +13B02;EGYPTIAN HIEROGLYPH-13B02;Lo;0;L;;;;;N;;;;; +13B03;EGYPTIAN HIEROGLYPH-13B03;Lo;0;L;;;;;N;;;;; +13B04;EGYPTIAN HIEROGLYPH-13B04;Lo;0;L;;;;;N;;;;; +13B05;EGYPTIAN HIEROGLYPH-13B05;Lo;0;L;;;;;N;;;;; +13B06;EGYPTIAN HIEROGLYPH-13B06;Lo;0;L;;;;;N;;;;; +13B07;EGYPTIAN HIEROGLYPH-13B07;Lo;0;L;;;;;N;;;;; +13B08;EGYPTIAN HIEROGLYPH-13B08;Lo;0;L;;;;;N;;;;; +13B09;EGYPTIAN HIEROGLYPH-13B09;Lo;0;L;;;;;N;;;;; +13B0A;EGYPTIAN HIEROGLYPH-13B0A;Lo;0;L;;;;;N;;;;; +13B0B;EGYPTIAN HIEROGLYPH-13B0B;Lo;0;L;;;;;N;;;;; +13B0C;EGYPTIAN HIEROGLYPH-13B0C;Lo;0;L;;;;;N;;;;; +13B0D;EGYPTIAN HIEROGLYPH-13B0D;Lo;0;L;;;;;N;;;;; +13B0E;EGYPTIAN HIEROGLYPH-13B0E;Lo;0;L;;;;;N;;;;; +13B0F;EGYPTIAN HIEROGLYPH-13B0F;Lo;0;L;;;;;N;;;;; +13B10;EGYPTIAN HIEROGLYPH-13B10;Lo;0;L;;;;;N;;;;; +13B11;EGYPTIAN HIEROGLYPH-13B11;Lo;0;L;;;;;N;;;;; +13B12;EGYPTIAN HIEROGLYPH-13B12;Lo;0;L;;;;;N;;;;; +13B13;EGYPTIAN HIEROGLYPH-13B13;Lo;0;L;;;;;N;;;;; +13B14;EGYPTIAN HIEROGLYPH-13B14;Lo;0;L;;;;;N;;;;; +13B15;EGYPTIAN HIEROGLYPH-13B15;Lo;0;L;;;;;N;;;;; +13B16;EGYPTIAN HIEROGLYPH-13B16;Lo;0;L;;;;;N;;;;; +13B17;EGYPTIAN HIEROGLYPH-13B17;Lo;0;L;;;;;N;;;;; +13B18;EGYPTIAN HIEROGLYPH-13B18;Lo;0;L;;;;;N;;;;; +13B19;EGYPTIAN HIEROGLYPH-13B19;Lo;0;L;;;;;N;;;;; +13B1A;EGYPTIAN HIEROGLYPH-13B1A;Lo;0;L;;;;;N;;;;; +13B1B;EGYPTIAN HIEROGLYPH-13B1B;Lo;0;L;;;;;N;;;;; +13B1C;EGYPTIAN HIEROGLYPH-13B1C;Lo;0;L;;;;;N;;;;; +13B1D;EGYPTIAN HIEROGLYPH-13B1D;Lo;0;L;;;;;N;;;;; +13B1E;EGYPTIAN HIEROGLYPH-13B1E;Lo;0;L;;;;;N;;;;; +13B1F;EGYPTIAN HIEROGLYPH-13B1F;Lo;0;L;;;;;N;;;;; +13B20;EGYPTIAN HIEROGLYPH-13B20;Lo;0;L;;;;;N;;;;; +13B21;EGYPTIAN HIEROGLYPH-13B21;Lo;0;L;;;;;N;;;;; +13B22;EGYPTIAN HIEROGLYPH-13B22;Lo;0;L;;;;;N;;;;; +13B23;EGYPTIAN HIEROGLYPH-13B23;Lo;0;L;;;;;N;;;;; +13B24;EGYPTIAN HIEROGLYPH-13B24;Lo;0;L;;;;;N;;;;; +13B25;EGYPTIAN HIEROGLYPH-13B25;Lo;0;L;;;;;N;;;;; +13B26;EGYPTIAN HIEROGLYPH-13B26;Lo;0;L;;;;;N;;;;; +13B27;EGYPTIAN HIEROGLYPH-13B27;Lo;0;L;;;;;N;;;;; +13B28;EGYPTIAN HIEROGLYPH-13B28;Lo;0;L;;;;;N;;;;; +13B29;EGYPTIAN HIEROGLYPH-13B29;Lo;0;L;;;;;N;;;;; +13B2A;EGYPTIAN HIEROGLYPH-13B2A;Lo;0;L;;;;;N;;;;; +13B2B;EGYPTIAN HIEROGLYPH-13B2B;Lo;0;L;;;;;N;;;;; +13B2C;EGYPTIAN HIEROGLYPH-13B2C;Lo;0;L;;;;;N;;;;; +13B2D;EGYPTIAN HIEROGLYPH-13B2D;Lo;0;L;;;;;N;;;;; +13B2E;EGYPTIAN HIEROGLYPH-13B2E;Lo;0;L;;;;;N;;;;; +13B2F;EGYPTIAN HIEROGLYPH-13B2F;Lo;0;L;;;;;N;;;;; +13B30;EGYPTIAN HIEROGLYPH-13B30;Lo;0;L;;;;;N;;;;; +13B31;EGYPTIAN HIEROGLYPH-13B31;Lo;0;L;;;;;N;;;;; +13B32;EGYPTIAN HIEROGLYPH-13B32;Lo;0;L;;;;;N;;;;; +13B33;EGYPTIAN HIEROGLYPH-13B33;Lo;0;L;;;;;N;;;;; +13B34;EGYPTIAN HIEROGLYPH-13B34;Lo;0;L;;;;;N;;;;; +13B35;EGYPTIAN HIEROGLYPH-13B35;Lo;0;L;;;;;N;;;;; +13B36;EGYPTIAN HIEROGLYPH-13B36;Lo;0;L;;;;;N;;;;; +13B37;EGYPTIAN HIEROGLYPH-13B37;Lo;0;L;;;;;N;;;;; +13B38;EGYPTIAN HIEROGLYPH-13B38;Lo;0;L;;;;;N;;;;; +13B39;EGYPTIAN HIEROGLYPH-13B39;Lo;0;L;;;;;N;;;;; +13B3A;EGYPTIAN HIEROGLYPH-13B3A;Lo;0;L;;;;;N;;;;; +13B3B;EGYPTIAN HIEROGLYPH-13B3B;Lo;0;L;;;;;N;;;;; +13B3C;EGYPTIAN HIEROGLYPH-13B3C;Lo;0;L;;;;;N;;;;; +13B3D;EGYPTIAN HIEROGLYPH-13B3D;Lo;0;L;;;;;N;;;;; +13B3E;EGYPTIAN HIEROGLYPH-13B3E;Lo;0;L;;;;;N;;;;; +13B3F;EGYPTIAN HIEROGLYPH-13B3F;Lo;0;L;;;;;N;;;;; +13B40;EGYPTIAN HIEROGLYPH-13B40;Lo;0;L;;;;;N;;;;; +13B41;EGYPTIAN HIEROGLYPH-13B41;Lo;0;L;;;;;N;;;;; +13B42;EGYPTIAN HIEROGLYPH-13B42;Lo;0;L;;;;;N;;;;; +13B43;EGYPTIAN HIEROGLYPH-13B43;Lo;0;L;;;;;N;;;;; +13B44;EGYPTIAN HIEROGLYPH-13B44;Lo;0;L;;;;;N;;;;; +13B45;EGYPTIAN HIEROGLYPH-13B45;Lo;0;L;;;;;N;;;;; +13B46;EGYPTIAN HIEROGLYPH-13B46;Lo;0;L;;;;;N;;;;; +13B47;EGYPTIAN HIEROGLYPH-13B47;Lo;0;L;;;;;N;;;;; +13B48;EGYPTIAN HIEROGLYPH-13B48;Lo;0;L;;;;;N;;;;; +13B49;EGYPTIAN HIEROGLYPH-13B49;Lo;0;L;;;;;N;;;;; +13B4A;EGYPTIAN HIEROGLYPH-13B4A;Lo;0;L;;;;;N;;;;; +13B4B;EGYPTIAN HIEROGLYPH-13B4B;Lo;0;L;;;;;N;;;;; +13B4C;EGYPTIAN HIEROGLYPH-13B4C;Lo;0;L;;;;;N;;;;; +13B4D;EGYPTIAN HIEROGLYPH-13B4D;Lo;0;L;;;;;N;;;;; +13B4E;EGYPTIAN HIEROGLYPH-13B4E;Lo;0;L;;;;;N;;;;; +13B4F;EGYPTIAN HIEROGLYPH-13B4F;Lo;0;L;;;;;N;;;;; +13B50;EGYPTIAN HIEROGLYPH-13B50;Lo;0;L;;;;;N;;;;; +13B51;EGYPTIAN HIEROGLYPH-13B51;Lo;0;L;;;;;N;;;;; +13B52;EGYPTIAN HIEROGLYPH-13B52;Lo;0;L;;;;;N;;;;; +13B53;EGYPTIAN HIEROGLYPH-13B53;Lo;0;L;;;;;N;;;;; +13B54;EGYPTIAN HIEROGLYPH-13B54;Lo;0;L;;;;;N;;;;; +13B55;EGYPTIAN HIEROGLYPH-13B55;Lo;0;L;;;;;N;;;;; +13B56;EGYPTIAN HIEROGLYPH-13B56;Lo;0;L;;;;;N;;;;; +13B57;EGYPTIAN HIEROGLYPH-13B57;Lo;0;L;;;;;N;;;;; +13B58;EGYPTIAN HIEROGLYPH-13B58;Lo;0;L;;;;;N;;;;; +13B59;EGYPTIAN HIEROGLYPH-13B59;Lo;0;L;;;;;N;;;;; +13B5A;EGYPTIAN HIEROGLYPH-13B5A;Lo;0;L;;;;;N;;;;; +13B5B;EGYPTIAN HIEROGLYPH-13B5B;Lo;0;L;;;;;N;;;;; +13B5C;EGYPTIAN HIEROGLYPH-13B5C;Lo;0;L;;;;;N;;;;; +13B5D;EGYPTIAN HIEROGLYPH-13B5D;Lo;0;L;;;;;N;;;;; +13B5E;EGYPTIAN HIEROGLYPH-13B5E;Lo;0;L;;;;;N;;;;; +13B5F;EGYPTIAN HIEROGLYPH-13B5F;Lo;0;L;;;;;N;;;;; +13B60;EGYPTIAN HIEROGLYPH-13B60;Lo;0;L;;;;;N;;;;; +13B61;EGYPTIAN HIEROGLYPH-13B61;Lo;0;L;;;;;N;;;;; +13B62;EGYPTIAN HIEROGLYPH-13B62;Lo;0;L;;;;;N;;;;; +13B63;EGYPTIAN HIEROGLYPH-13B63;Lo;0;L;;;;;N;;;;; +13B64;EGYPTIAN HIEROGLYPH-13B64;Lo;0;L;;;;;N;;;;; +13B65;EGYPTIAN HIEROGLYPH-13B65;Lo;0;L;;;;;N;;;;; +13B66;EGYPTIAN HIEROGLYPH-13B66;Lo;0;L;;;;;N;;;;; +13B67;EGYPTIAN HIEROGLYPH-13B67;Lo;0;L;;;;;N;;;;; +13B68;EGYPTIAN HIEROGLYPH-13B68;Lo;0;L;;;;;N;;;;; +13B69;EGYPTIAN HIEROGLYPH-13B69;Lo;0;L;;;;;N;;;;; +13B6A;EGYPTIAN HIEROGLYPH-13B6A;Lo;0;L;;;;;N;;;;; +13B6B;EGYPTIAN HIEROGLYPH-13B6B;Lo;0;L;;;;;N;;;;; +13B6C;EGYPTIAN HIEROGLYPH-13B6C;Lo;0;L;;;;;N;;;;; +13B6D;EGYPTIAN HIEROGLYPH-13B6D;Lo;0;L;;;;;N;;;;; +13B6E;EGYPTIAN HIEROGLYPH-13B6E;Lo;0;L;;;;;N;;;;; +13B6F;EGYPTIAN HIEROGLYPH-13B6F;Lo;0;L;;;;;N;;;;; +13B70;EGYPTIAN HIEROGLYPH-13B70;Lo;0;L;;;;;N;;;;; +13B71;EGYPTIAN HIEROGLYPH-13B71;Lo;0;L;;;;;N;;;;; +13B72;EGYPTIAN HIEROGLYPH-13B72;Lo;0;L;;;;;N;;;;; +13B73;EGYPTIAN HIEROGLYPH-13B73;Lo;0;L;;;;;N;;;;; +13B74;EGYPTIAN HIEROGLYPH-13B74;Lo;0;L;;;;;N;;;;; +13B75;EGYPTIAN HIEROGLYPH-13B75;Lo;0;L;;;;;N;;;;; +13B76;EGYPTIAN HIEROGLYPH-13B76;Lo;0;L;;;;;N;;;;; +13B77;EGYPTIAN HIEROGLYPH-13B77;Lo;0;L;;;;;N;;;;; +13B78;EGYPTIAN HIEROGLYPH-13B78;Lo;0;L;;;;;N;;;;; +13B79;EGYPTIAN HIEROGLYPH-13B79;Lo;0;L;;;;;N;;;;; +13B7A;EGYPTIAN HIEROGLYPH-13B7A;Lo;0;L;;;;;N;;;;; +13B7B;EGYPTIAN HIEROGLYPH-13B7B;Lo;0;L;;;;;N;;;;; +13B7C;EGYPTIAN HIEROGLYPH-13B7C;Lo;0;L;;;;;N;;;;; +13B7D;EGYPTIAN HIEROGLYPH-13B7D;Lo;0;L;;;;;N;;;;; +13B7E;EGYPTIAN HIEROGLYPH-13B7E;Lo;0;L;;;;;N;;;;; +13B7F;EGYPTIAN HIEROGLYPH-13B7F;Lo;0;L;;;;;N;;;;; +13B80;EGYPTIAN HIEROGLYPH-13B80;Lo;0;L;;;;;N;;;;; +13B81;EGYPTIAN HIEROGLYPH-13B81;Lo;0;L;;;;;N;;;;; +13B82;EGYPTIAN HIEROGLYPH-13B82;Lo;0;L;;;;;N;;;;; +13B83;EGYPTIAN HIEROGLYPH-13B83;Lo;0;L;;;;;N;;;;; +13B84;EGYPTIAN HIEROGLYPH-13B84;Lo;0;L;;;;;N;;;;; +13B85;EGYPTIAN HIEROGLYPH-13B85;Lo;0;L;;;;;N;;;;; +13B86;EGYPTIAN HIEROGLYPH-13B86;Lo;0;L;;;;;N;;;;; +13B87;EGYPTIAN HIEROGLYPH-13B87;Lo;0;L;;;;;N;;;;; +13B88;EGYPTIAN HIEROGLYPH-13B88;Lo;0;L;;;;;N;;;;; +13B89;EGYPTIAN HIEROGLYPH-13B89;Lo;0;L;;;;;N;;;;; +13B8A;EGYPTIAN HIEROGLYPH-13B8A;Lo;0;L;;;;;N;;;;; +13B8B;EGYPTIAN HIEROGLYPH-13B8B;Lo;0;L;;;;;N;;;;; +13B8C;EGYPTIAN HIEROGLYPH-13B8C;Lo;0;L;;;;;N;;;;; +13B8D;EGYPTIAN HIEROGLYPH-13B8D;Lo;0;L;;;;;N;;;;; +13B8E;EGYPTIAN HIEROGLYPH-13B8E;Lo;0;L;;;;;N;;;;; +13B8F;EGYPTIAN HIEROGLYPH-13B8F;Lo;0;L;;;;;N;;;;; +13B90;EGYPTIAN HIEROGLYPH-13B90;Lo;0;L;;;;;N;;;;; +13B91;EGYPTIAN HIEROGLYPH-13B91;Lo;0;L;;;;;N;;;;; +13B92;EGYPTIAN HIEROGLYPH-13B92;Lo;0;L;;;;;N;;;;; +13B93;EGYPTIAN HIEROGLYPH-13B93;Lo;0;L;;;;;N;;;;; +13B94;EGYPTIAN HIEROGLYPH-13B94;Lo;0;L;;;;;N;;;;; +13B95;EGYPTIAN HIEROGLYPH-13B95;Lo;0;L;;;;;N;;;;; +13B96;EGYPTIAN HIEROGLYPH-13B96;Lo;0;L;;;;;N;;;;; +13B97;EGYPTIAN HIEROGLYPH-13B97;Lo;0;L;;;;;N;;;;; +13B98;EGYPTIAN HIEROGLYPH-13B98;Lo;0;L;;;;;N;;;;; +13B99;EGYPTIAN HIEROGLYPH-13B99;Lo;0;L;;;;;N;;;;; +13B9A;EGYPTIAN HIEROGLYPH-13B9A;Lo;0;L;;;;;N;;;;; +13B9B;EGYPTIAN HIEROGLYPH-13B9B;Lo;0;L;;;;;N;;;;; +13B9C;EGYPTIAN HIEROGLYPH-13B9C;Lo;0;L;;;;;N;;;;; +13B9D;EGYPTIAN HIEROGLYPH-13B9D;Lo;0;L;;;;;N;;;;; +13B9E;EGYPTIAN HIEROGLYPH-13B9E;Lo;0;L;;;;;N;;;;; +13B9F;EGYPTIAN HIEROGLYPH-13B9F;Lo;0;L;;;;;N;;;;; +13BA0;EGYPTIAN HIEROGLYPH-13BA0;Lo;0;L;;;;;N;;;;; +13BA1;EGYPTIAN HIEROGLYPH-13BA1;Lo;0;L;;;;;N;;;;; +13BA2;EGYPTIAN HIEROGLYPH-13BA2;Lo;0;L;;;;;N;;;;; +13BA3;EGYPTIAN HIEROGLYPH-13BA3;Lo;0;L;;;;;N;;;;; +13BA4;EGYPTIAN HIEROGLYPH-13BA4;Lo;0;L;;;;;N;;;;; +13BA5;EGYPTIAN HIEROGLYPH-13BA5;Lo;0;L;;;;;N;;;;; +13BA6;EGYPTIAN HIEROGLYPH-13BA6;Lo;0;L;;;;;N;;;;; +13BA7;EGYPTIAN HIEROGLYPH-13BA7;Lo;0;L;;;;;N;;;;; +13BA8;EGYPTIAN HIEROGLYPH-13BA8;Lo;0;L;;;;;N;;;;; +13BA9;EGYPTIAN HIEROGLYPH-13BA9;Lo;0;L;;;;;N;;;;; +13BAA;EGYPTIAN HIEROGLYPH-13BAA;Lo;0;L;;;;;N;;;;; +13BAB;EGYPTIAN HIEROGLYPH-13BAB;Lo;0;L;;;;;N;;;;; +13BAC;EGYPTIAN HIEROGLYPH-13BAC;Lo;0;L;;;;;N;;;;; +13BAD;EGYPTIAN HIEROGLYPH-13BAD;Lo;0;L;;;;;N;;;;; +13BAE;EGYPTIAN HIEROGLYPH-13BAE;Lo;0;L;;;;;N;;;;; +13BAF;EGYPTIAN HIEROGLYPH-13BAF;Lo;0;L;;;;;N;;;;; +13BB0;EGYPTIAN HIEROGLYPH-13BB0;Lo;0;L;;;;;N;;;;; +13BB1;EGYPTIAN HIEROGLYPH-13BB1;Lo;0;L;;;;;N;;;;; +13BB2;EGYPTIAN HIEROGLYPH-13BB2;Lo;0;L;;;;;N;;;;; +13BB3;EGYPTIAN HIEROGLYPH-13BB3;Lo;0;L;;;;;N;;;;; +13BB4;EGYPTIAN HIEROGLYPH-13BB4;Lo;0;L;;;;;N;;;;; +13BB5;EGYPTIAN HIEROGLYPH-13BB5;Lo;0;L;;;;;N;;;;; +13BB6;EGYPTIAN HIEROGLYPH-13BB6;Lo;0;L;;;;;N;;;;; +13BB7;EGYPTIAN HIEROGLYPH-13BB7;Lo;0;L;;;;;N;;;;; +13BB8;EGYPTIAN HIEROGLYPH-13BB8;Lo;0;L;;;;;N;;;;; +13BB9;EGYPTIAN HIEROGLYPH-13BB9;Lo;0;L;;;;;N;;;;; +13BBA;EGYPTIAN HIEROGLYPH-13BBA;Lo;0;L;;;;;N;;;;; +13BBB;EGYPTIAN HIEROGLYPH-13BBB;Lo;0;L;;;;;N;;;;; +13BBC;EGYPTIAN HIEROGLYPH-13BBC;Lo;0;L;;;;;N;;;;; +13BBD;EGYPTIAN HIEROGLYPH-13BBD;Lo;0;L;;;;;N;;;;; +13BBE;EGYPTIAN HIEROGLYPH-13BBE;Lo;0;L;;;;;N;;;;; +13BBF;EGYPTIAN HIEROGLYPH-13BBF;Lo;0;L;;;;;N;;;;; +13BC0;EGYPTIAN HIEROGLYPH-13BC0;Lo;0;L;;;;;N;;;;; +13BC1;EGYPTIAN HIEROGLYPH-13BC1;Lo;0;L;;;;;N;;;;; +13BC2;EGYPTIAN HIEROGLYPH-13BC2;Lo;0;L;;;;;N;;;;; +13BC3;EGYPTIAN HIEROGLYPH-13BC3;Lo;0;L;;;;;N;;;;; +13BC4;EGYPTIAN HIEROGLYPH-13BC4;Lo;0;L;;;;;N;;;;; +13BC5;EGYPTIAN HIEROGLYPH-13BC5;Lo;0;L;;;;;N;;;;; +13BC6;EGYPTIAN HIEROGLYPH-13BC6;Lo;0;L;;;;;N;;;;; +13BC7;EGYPTIAN HIEROGLYPH-13BC7;Lo;0;L;;;;;N;;;;; +13BC8;EGYPTIAN HIEROGLYPH-13BC8;Lo;0;L;;;;;N;;;;; +13BC9;EGYPTIAN HIEROGLYPH-13BC9;Lo;0;L;;;;;N;;;;; +13BCA;EGYPTIAN HIEROGLYPH-13BCA;Lo;0;L;;;;;N;;;;; +13BCB;EGYPTIAN HIEROGLYPH-13BCB;Lo;0;L;;;;;N;;;;; +13BCC;EGYPTIAN HIEROGLYPH-13BCC;Lo;0;L;;;;;N;;;;; +13BCD;EGYPTIAN HIEROGLYPH-13BCD;Lo;0;L;;;;;N;;;;; +13BCE;EGYPTIAN HIEROGLYPH-13BCE;Lo;0;L;;;;;N;;;;; +13BCF;EGYPTIAN HIEROGLYPH-13BCF;Lo;0;L;;;;;N;;;;; +13BD0;EGYPTIAN HIEROGLYPH-13BD0;Lo;0;L;;;;;N;;;;; +13BD1;EGYPTIAN HIEROGLYPH-13BD1;Lo;0;L;;;;;N;;;;; +13BD2;EGYPTIAN HIEROGLYPH-13BD2;Lo;0;L;;;;;N;;;;; +13BD3;EGYPTIAN HIEROGLYPH-13BD3;Lo;0;L;;;;;N;;;;; +13BD4;EGYPTIAN HIEROGLYPH-13BD4;Lo;0;L;;;;;N;;;;; +13BD5;EGYPTIAN HIEROGLYPH-13BD5;Lo;0;L;;;;;N;;;;; +13BD6;EGYPTIAN HIEROGLYPH-13BD6;Lo;0;L;;;;;N;;;;; +13BD7;EGYPTIAN HIEROGLYPH-13BD7;Lo;0;L;;;;;N;;;;; +13BD8;EGYPTIAN HIEROGLYPH-13BD8;Lo;0;L;;;;;N;;;;; +13BD9;EGYPTIAN HIEROGLYPH-13BD9;Lo;0;L;;;;;N;;;;; +13BDA;EGYPTIAN HIEROGLYPH-13BDA;Lo;0;L;;;;;N;;;;; +13BDB;EGYPTIAN HIEROGLYPH-13BDB;Lo;0;L;;;;;N;;;;; +13BDC;EGYPTIAN HIEROGLYPH-13BDC;Lo;0;L;;;;;N;;;;; +13BDD;EGYPTIAN HIEROGLYPH-13BDD;Lo;0;L;;;;;N;;;;; +13BDE;EGYPTIAN HIEROGLYPH-13BDE;Lo;0;L;;;;;N;;;;; +13BDF;EGYPTIAN HIEROGLYPH-13BDF;Lo;0;L;;;;;N;;;;; +13BE0;EGYPTIAN HIEROGLYPH-13BE0;Lo;0;L;;;;;N;;;;; +13BE1;EGYPTIAN HIEROGLYPH-13BE1;Lo;0;L;;;;;N;;;;; +13BE2;EGYPTIAN HIEROGLYPH-13BE2;Lo;0;L;;;;;N;;;;; +13BE3;EGYPTIAN HIEROGLYPH-13BE3;Lo;0;L;;;;;N;;;;; +13BE4;EGYPTIAN HIEROGLYPH-13BE4;Lo;0;L;;;;;N;;;;; +13BE5;EGYPTIAN HIEROGLYPH-13BE5;Lo;0;L;;;;;N;;;;; +13BE6;EGYPTIAN HIEROGLYPH-13BE6;Lo;0;L;;;;;N;;;;; +13BE7;EGYPTIAN HIEROGLYPH-13BE7;Lo;0;L;;;;;N;;;;; +13BE8;EGYPTIAN HIEROGLYPH-13BE8;Lo;0;L;;;;;N;;;;; +13BE9;EGYPTIAN HIEROGLYPH-13BE9;Lo;0;L;;;;;N;;;;; +13BEA;EGYPTIAN HIEROGLYPH-13BEA;Lo;0;L;;;;;N;;;;; +13BEB;EGYPTIAN HIEROGLYPH-13BEB;Lo;0;L;;;;;N;;;;; +13BEC;EGYPTIAN HIEROGLYPH-13BEC;Lo;0;L;;;;;N;;;;; +13BED;EGYPTIAN HIEROGLYPH-13BED;Lo;0;L;;;;;N;;;;; +13BEE;EGYPTIAN HIEROGLYPH-13BEE;Lo;0;L;;;;;N;;;;; +13BEF;EGYPTIAN HIEROGLYPH-13BEF;Lo;0;L;;;;;N;;;;; +13BF0;EGYPTIAN HIEROGLYPH-13BF0;Lo;0;L;;;;;N;;;;; +13BF1;EGYPTIAN HIEROGLYPH-13BF1;Lo;0;L;;;;;N;;;;; +13BF2;EGYPTIAN HIEROGLYPH-13BF2;Lo;0;L;;;;;N;;;;; +13BF3;EGYPTIAN HIEROGLYPH-13BF3;Lo;0;L;;;;;N;;;;; +13BF4;EGYPTIAN HIEROGLYPH-13BF4;Lo;0;L;;;;;N;;;;; +13BF5;EGYPTIAN HIEROGLYPH-13BF5;Lo;0;L;;;;;N;;;;; +13BF6;EGYPTIAN HIEROGLYPH-13BF6;Lo;0;L;;;;;N;;;;; +13BF7;EGYPTIAN HIEROGLYPH-13BF7;Lo;0;L;;;;;N;;;;; +13BF8;EGYPTIAN HIEROGLYPH-13BF8;Lo;0;L;;;;;N;;;;; +13BF9;EGYPTIAN HIEROGLYPH-13BF9;Lo;0;L;;;;;N;;;;; +13BFA;EGYPTIAN HIEROGLYPH-13BFA;Lo;0;L;;;;;N;;;;; +13BFB;EGYPTIAN HIEROGLYPH-13BFB;Lo;0;L;;;;;N;;;;; +13BFC;EGYPTIAN HIEROGLYPH-13BFC;Lo;0;L;;;;;N;;;;; +13BFD;EGYPTIAN HIEROGLYPH-13BFD;Lo;0;L;;;;;N;;;;; +13BFE;EGYPTIAN HIEROGLYPH-13BFE;Lo;0;L;;;;;N;;;;; +13BFF;EGYPTIAN HIEROGLYPH-13BFF;Lo;0;L;;;;;N;;;;; +13C00;EGYPTIAN HIEROGLYPH-13C00;Lo;0;L;;;;;N;;;;; +13C01;EGYPTIAN HIEROGLYPH-13C01;Lo;0;L;;;;;N;;;;; +13C02;EGYPTIAN HIEROGLYPH-13C02;Lo;0;L;;;;;N;;;;; +13C03;EGYPTIAN HIEROGLYPH-13C03;Lo;0;L;;;;;N;;;;; +13C04;EGYPTIAN HIEROGLYPH-13C04;Lo;0;L;;;;;N;;;;; +13C05;EGYPTIAN HIEROGLYPH-13C05;Lo;0;L;;;;;N;;;;; +13C06;EGYPTIAN HIEROGLYPH-13C06;Lo;0;L;;;;;N;;;;; +13C07;EGYPTIAN HIEROGLYPH-13C07;Lo;0;L;;;;;N;;;;; +13C08;EGYPTIAN HIEROGLYPH-13C08;Lo;0;L;;;;;N;;;;; +13C09;EGYPTIAN HIEROGLYPH-13C09;Lo;0;L;;;;;N;;;;; +13C0A;EGYPTIAN HIEROGLYPH-13C0A;Lo;0;L;;;;;N;;;;; +13C0B;EGYPTIAN HIEROGLYPH-13C0B;Lo;0;L;;;;;N;;;;; +13C0C;EGYPTIAN HIEROGLYPH-13C0C;Lo;0;L;;;;;N;;;;; +13C0D;EGYPTIAN HIEROGLYPH-13C0D;Lo;0;L;;;;;N;;;;; +13C0E;EGYPTIAN HIEROGLYPH-13C0E;Lo;0;L;;;;;N;;;;; +13C0F;EGYPTIAN HIEROGLYPH-13C0F;Lo;0;L;;;;;N;;;;; +13C10;EGYPTIAN HIEROGLYPH-13C10;Lo;0;L;;;;;N;;;;; +13C11;EGYPTIAN HIEROGLYPH-13C11;Lo;0;L;;;;;N;;;;; +13C12;EGYPTIAN HIEROGLYPH-13C12;Lo;0;L;;;;;N;;;;; +13C13;EGYPTIAN HIEROGLYPH-13C13;Lo;0;L;;;;;N;;;;; +13C14;EGYPTIAN HIEROGLYPH-13C14;Lo;0;L;;;;;N;;;;; +13C15;EGYPTIAN HIEROGLYPH-13C15;Lo;0;L;;;;;N;;;;; +13C16;EGYPTIAN HIEROGLYPH-13C16;Lo;0;L;;;;;N;;;;; +13C17;EGYPTIAN HIEROGLYPH-13C17;Lo;0;L;;;;;N;;;;; +13C18;EGYPTIAN HIEROGLYPH-13C18;Lo;0;L;;;;;N;;;;; +13C19;EGYPTIAN HIEROGLYPH-13C19;Lo;0;L;;;;;N;;;;; +13C1A;EGYPTIAN HIEROGLYPH-13C1A;Lo;0;L;;;;;N;;;;; +13C1B;EGYPTIAN HIEROGLYPH-13C1B;Lo;0;L;;;;;N;;;;; +13C1C;EGYPTIAN HIEROGLYPH-13C1C;Lo;0;L;;;;;N;;;;; +13C1D;EGYPTIAN HIEROGLYPH-13C1D;Lo;0;L;;;;;N;;;;; +13C1E;EGYPTIAN HIEROGLYPH-13C1E;Lo;0;L;;;;;N;;;;; +13C1F;EGYPTIAN HIEROGLYPH-13C1F;Lo;0;L;;;;;N;;;;; +13C20;EGYPTIAN HIEROGLYPH-13C20;Lo;0;L;;;;;N;;;;; +13C21;EGYPTIAN HIEROGLYPH-13C21;Lo;0;L;;;;;N;;;;; +13C22;EGYPTIAN HIEROGLYPH-13C22;Lo;0;L;;;;;N;;;;; +13C23;EGYPTIAN HIEROGLYPH-13C23;Lo;0;L;;;;;N;;;;; +13C24;EGYPTIAN HIEROGLYPH-13C24;Lo;0;L;;;;;N;;;;; +13C25;EGYPTIAN HIEROGLYPH-13C25;Lo;0;L;;;;;N;;;;; +13C26;EGYPTIAN HIEROGLYPH-13C26;Lo;0;L;;;;;N;;;;; +13C27;EGYPTIAN HIEROGLYPH-13C27;Lo;0;L;;;;;N;;;;; +13C28;EGYPTIAN HIEROGLYPH-13C28;Lo;0;L;;;;;N;;;;; +13C29;EGYPTIAN HIEROGLYPH-13C29;Lo;0;L;;;;;N;;;;; +13C2A;EGYPTIAN HIEROGLYPH-13C2A;Lo;0;L;;;;;N;;;;; +13C2B;EGYPTIAN HIEROGLYPH-13C2B;Lo;0;L;;;;;N;;;;; +13C2C;EGYPTIAN HIEROGLYPH-13C2C;Lo;0;L;;;;;N;;;;; +13C2D;EGYPTIAN HIEROGLYPH-13C2D;Lo;0;L;;;;;N;;;;; +13C2E;EGYPTIAN HIEROGLYPH-13C2E;Lo;0;L;;;;;N;;;;; +13C2F;EGYPTIAN HIEROGLYPH-13C2F;Lo;0;L;;;;;N;;;;; +13C30;EGYPTIAN HIEROGLYPH-13C30;Lo;0;L;;;;;N;;;;; +13C31;EGYPTIAN HIEROGLYPH-13C31;Lo;0;L;;;;;N;;;;; +13C32;EGYPTIAN HIEROGLYPH-13C32;Lo;0;L;;;;;N;;;;; +13C33;EGYPTIAN HIEROGLYPH-13C33;Lo;0;L;;;;;N;;;;; +13C34;EGYPTIAN HIEROGLYPH-13C34;Lo;0;L;;;;;N;;;;; +13C35;EGYPTIAN HIEROGLYPH-13C35;Lo;0;L;;;;;N;;;;; +13C36;EGYPTIAN HIEROGLYPH-13C36;Lo;0;L;;;;;N;;;;; +13C37;EGYPTIAN HIEROGLYPH-13C37;Lo;0;L;;;;;N;;;;; +13C38;EGYPTIAN HIEROGLYPH-13C38;Lo;0;L;;;;;N;;;;; +13C39;EGYPTIAN HIEROGLYPH-13C39;Lo;0;L;;;;;N;;;;; +13C3A;EGYPTIAN HIEROGLYPH-13C3A;Lo;0;L;;;;;N;;;;; +13C3B;EGYPTIAN HIEROGLYPH-13C3B;Lo;0;L;;;;;N;;;;; +13C3C;EGYPTIAN HIEROGLYPH-13C3C;Lo;0;L;;;;;N;;;;; +13C3D;EGYPTIAN HIEROGLYPH-13C3D;Lo;0;L;;;;;N;;;;; +13C3E;EGYPTIAN HIEROGLYPH-13C3E;Lo;0;L;;;;;N;;;;; +13C3F;EGYPTIAN HIEROGLYPH-13C3F;Lo;0;L;;;;;N;;;;; +13C40;EGYPTIAN HIEROGLYPH-13C40;Lo;0;L;;;;;N;;;;; +13C41;EGYPTIAN HIEROGLYPH-13C41;Lo;0;L;;;;;N;;;;; +13C42;EGYPTIAN HIEROGLYPH-13C42;Lo;0;L;;;;;N;;;;; +13C43;EGYPTIAN HIEROGLYPH-13C43;Lo;0;L;;;;;N;;;;; +13C44;EGYPTIAN HIEROGLYPH-13C44;Lo;0;L;;;;;N;;;;; +13C45;EGYPTIAN HIEROGLYPH-13C45;Lo;0;L;;;;;N;;;;; +13C46;EGYPTIAN HIEROGLYPH-13C46;Lo;0;L;;;;;N;;;;; +13C47;EGYPTIAN HIEROGLYPH-13C47;Lo;0;L;;;;;N;;;;; +13C48;EGYPTIAN HIEROGLYPH-13C48;Lo;0;L;;;;;N;;;;; +13C49;EGYPTIAN HIEROGLYPH-13C49;Lo;0;L;;;;;N;;;;; +13C4A;EGYPTIAN HIEROGLYPH-13C4A;Lo;0;L;;;;;N;;;;; +13C4B;EGYPTIAN HIEROGLYPH-13C4B;Lo;0;L;;;;;N;;;;; +13C4C;EGYPTIAN HIEROGLYPH-13C4C;Lo;0;L;;;;;N;;;;; +13C4D;EGYPTIAN HIEROGLYPH-13C4D;Lo;0;L;;;;;N;;;;; +13C4E;EGYPTIAN HIEROGLYPH-13C4E;Lo;0;L;;;;;N;;;;; +13C4F;EGYPTIAN HIEROGLYPH-13C4F;Lo;0;L;;;;;N;;;;; +13C50;EGYPTIAN HIEROGLYPH-13C50;Lo;0;L;;;;;N;;;;; +13C51;EGYPTIAN HIEROGLYPH-13C51;Lo;0;L;;;;;N;;;;; +13C52;EGYPTIAN HIEROGLYPH-13C52;Lo;0;L;;;;;N;;;;; +13C53;EGYPTIAN HIEROGLYPH-13C53;Lo;0;L;;;;;N;;;;; +13C54;EGYPTIAN HIEROGLYPH-13C54;Lo;0;L;;;;;N;;;;; +13C55;EGYPTIAN HIEROGLYPH-13C55;Lo;0;L;;;;;N;;;;; +13C56;EGYPTIAN HIEROGLYPH-13C56;Lo;0;L;;;;;N;;;;; +13C57;EGYPTIAN HIEROGLYPH-13C57;Lo;0;L;;;;;N;;;;; +13C58;EGYPTIAN HIEROGLYPH-13C58;Lo;0;L;;;;;N;;;;; +13C59;EGYPTIAN HIEROGLYPH-13C59;Lo;0;L;;;;;N;;;;; +13C5A;EGYPTIAN HIEROGLYPH-13C5A;Lo;0;L;;;;;N;;;;; +13C5B;EGYPTIAN HIEROGLYPH-13C5B;Lo;0;L;;;;;N;;;;; +13C5C;EGYPTIAN HIEROGLYPH-13C5C;Lo;0;L;;;;;N;;;;; +13C5D;EGYPTIAN HIEROGLYPH-13C5D;Lo;0;L;;;;;N;;;;; +13C5E;EGYPTIAN HIEROGLYPH-13C5E;Lo;0;L;;;;;N;;;;; +13C5F;EGYPTIAN HIEROGLYPH-13C5F;Lo;0;L;;;;;N;;;;; +13C60;EGYPTIAN HIEROGLYPH-13C60;Lo;0;L;;;;;N;;;;; +13C61;EGYPTIAN HIEROGLYPH-13C61;Lo;0;L;;;;;N;;;;; +13C62;EGYPTIAN HIEROGLYPH-13C62;Lo;0;L;;;;;N;;;;; +13C63;EGYPTIAN HIEROGLYPH-13C63;Lo;0;L;;;;;N;;;;; +13C64;EGYPTIAN HIEROGLYPH-13C64;Lo;0;L;;;;;N;;;;; +13C65;EGYPTIAN HIEROGLYPH-13C65;Lo;0;L;;;;;N;;;;; +13C66;EGYPTIAN HIEROGLYPH-13C66;Lo;0;L;;;;;N;;;;; +13C67;EGYPTIAN HIEROGLYPH-13C67;Lo;0;L;;;;;N;;;;; +13C68;EGYPTIAN HIEROGLYPH-13C68;Lo;0;L;;;;;N;;;;; +13C69;EGYPTIAN HIEROGLYPH-13C69;Lo;0;L;;;;;N;;;;; +13C6A;EGYPTIAN HIEROGLYPH-13C6A;Lo;0;L;;;;;N;;;;; +13C6B;EGYPTIAN HIEROGLYPH-13C6B;Lo;0;L;;;;;N;;;;; +13C6C;EGYPTIAN HIEROGLYPH-13C6C;Lo;0;L;;;;;N;;;;; +13C6D;EGYPTIAN HIEROGLYPH-13C6D;Lo;0;L;;;;;N;;;;; +13C6E;EGYPTIAN HIEROGLYPH-13C6E;Lo;0;L;;;;;N;;;;; +13C6F;EGYPTIAN HIEROGLYPH-13C6F;Lo;0;L;;;;;N;;;;; +13C70;EGYPTIAN HIEROGLYPH-13C70;Lo;0;L;;;;;N;;;;; +13C71;EGYPTIAN HIEROGLYPH-13C71;Lo;0;L;;;;;N;;;;; +13C72;EGYPTIAN HIEROGLYPH-13C72;Lo;0;L;;;;;N;;;;; +13C73;EGYPTIAN HIEROGLYPH-13C73;Lo;0;L;;;;;N;;;;; +13C74;EGYPTIAN HIEROGLYPH-13C74;Lo;0;L;;;;;N;;;;; +13C75;EGYPTIAN HIEROGLYPH-13C75;Lo;0;L;;;;;N;;;;; +13C76;EGYPTIAN HIEROGLYPH-13C76;Lo;0;L;;;;;N;;;;; +13C77;EGYPTIAN HIEROGLYPH-13C77;Lo;0;L;;;;;N;;;;; +13C78;EGYPTIAN HIEROGLYPH-13C78;Lo;0;L;;;;;N;;;;; +13C79;EGYPTIAN HIEROGLYPH-13C79;Lo;0;L;;;;;N;;;;; +13C7A;EGYPTIAN HIEROGLYPH-13C7A;Lo;0;L;;;;;N;;;;; +13C7B;EGYPTIAN HIEROGLYPH-13C7B;Lo;0;L;;;;;N;;;;; +13C7C;EGYPTIAN HIEROGLYPH-13C7C;Lo;0;L;;;;;N;;;;; +13C7D;EGYPTIAN HIEROGLYPH-13C7D;Lo;0;L;;;;;N;;;;; +13C7E;EGYPTIAN HIEROGLYPH-13C7E;Lo;0;L;;;;;N;;;;; +13C7F;EGYPTIAN HIEROGLYPH-13C7F;Lo;0;L;;;;;N;;;;; +13C80;EGYPTIAN HIEROGLYPH-13C80;Lo;0;L;;;;;N;;;;; +13C81;EGYPTIAN HIEROGLYPH-13C81;Lo;0;L;;;;;N;;;;; +13C82;EGYPTIAN HIEROGLYPH-13C82;Lo;0;L;;;;;N;;;;; +13C83;EGYPTIAN HIEROGLYPH-13C83;Lo;0;L;;;;;N;;;;; +13C84;EGYPTIAN HIEROGLYPH-13C84;Lo;0;L;;;;;N;;;;; +13C85;EGYPTIAN HIEROGLYPH-13C85;Lo;0;L;;;;;N;;;;; +13C86;EGYPTIAN HIEROGLYPH-13C86;Lo;0;L;;;;;N;;;;; +13C87;EGYPTIAN HIEROGLYPH-13C87;Lo;0;L;;;;;N;;;;; +13C88;EGYPTIAN HIEROGLYPH-13C88;Lo;0;L;;;;;N;;;;; +13C89;EGYPTIAN HIEROGLYPH-13C89;Lo;0;L;;;;;N;;;;; +13C8A;EGYPTIAN HIEROGLYPH-13C8A;Lo;0;L;;;;;N;;;;; +13C8B;EGYPTIAN HIEROGLYPH-13C8B;Lo;0;L;;;;;N;;;;; +13C8C;EGYPTIAN HIEROGLYPH-13C8C;Lo;0;L;;;;;N;;;;; +13C8D;EGYPTIAN HIEROGLYPH-13C8D;Lo;0;L;;;;;N;;;;; +13C8E;EGYPTIAN HIEROGLYPH-13C8E;Lo;0;L;;;;;N;;;;; +13C8F;EGYPTIAN HIEROGLYPH-13C8F;Lo;0;L;;;;;N;;;;; +13C90;EGYPTIAN HIEROGLYPH-13C90;Lo;0;L;;;;;N;;;;; +13C91;EGYPTIAN HIEROGLYPH-13C91;Lo;0;L;;;;;N;;;;; +13C92;EGYPTIAN HIEROGLYPH-13C92;Lo;0;L;;;;;N;;;;; +13C93;EGYPTIAN HIEROGLYPH-13C93;Lo;0;L;;;;;N;;;;; +13C94;EGYPTIAN HIEROGLYPH-13C94;Lo;0;L;;;;;N;;;;; +13C95;EGYPTIAN HIEROGLYPH-13C95;Lo;0;L;;;;;N;;;;; +13C96;EGYPTIAN HIEROGLYPH-13C96;Lo;0;L;;;;;N;;;;; +13C97;EGYPTIAN HIEROGLYPH-13C97;Lo;0;L;;;;;N;;;;; +13C98;EGYPTIAN HIEROGLYPH-13C98;Lo;0;L;;;;;N;;;;; +13C99;EGYPTIAN HIEROGLYPH-13C99;Lo;0;L;;;;;N;;;;; +13C9A;EGYPTIAN HIEROGLYPH-13C9A;Lo;0;L;;;;;N;;;;; +13C9B;EGYPTIAN HIEROGLYPH-13C9B;Lo;0;L;;;;;N;;;;; +13C9C;EGYPTIAN HIEROGLYPH-13C9C;Lo;0;L;;;;;N;;;;; +13C9D;EGYPTIAN HIEROGLYPH-13C9D;Lo;0;L;;;;;N;;;;; +13C9E;EGYPTIAN HIEROGLYPH-13C9E;Lo;0;L;;;;;N;;;;; +13C9F;EGYPTIAN HIEROGLYPH-13C9F;Lo;0;L;;;;;N;;;;; +13CA0;EGYPTIAN HIEROGLYPH-13CA0;Lo;0;L;;;;;N;;;;; +13CA1;EGYPTIAN HIEROGLYPH-13CA1;Lo;0;L;;;;;N;;;;; +13CA2;EGYPTIAN HIEROGLYPH-13CA2;Lo;0;L;;;;;N;;;;; +13CA3;EGYPTIAN HIEROGLYPH-13CA3;Lo;0;L;;;;;N;;;;; +13CA4;EGYPTIAN HIEROGLYPH-13CA4;Lo;0;L;;;;;N;;;;; +13CA5;EGYPTIAN HIEROGLYPH-13CA5;Lo;0;L;;;;;N;;;;; +13CA6;EGYPTIAN HIEROGLYPH-13CA6;Lo;0;L;;;;;N;;;;; +13CA7;EGYPTIAN HIEROGLYPH-13CA7;Lo;0;L;;;;;N;;;;; +13CA8;EGYPTIAN HIEROGLYPH-13CA8;Lo;0;L;;;;;N;;;;; +13CA9;EGYPTIAN HIEROGLYPH-13CA9;Lo;0;L;;;;;N;;;;; +13CAA;EGYPTIAN HIEROGLYPH-13CAA;Lo;0;L;;;;;N;;;;; +13CAB;EGYPTIAN HIEROGLYPH-13CAB;Lo;0;L;;;;;N;;;;; +13CAC;EGYPTIAN HIEROGLYPH-13CAC;Lo;0;L;;;;;N;;;;; +13CAD;EGYPTIAN HIEROGLYPH-13CAD;Lo;0;L;;;;;N;;;;; +13CAE;EGYPTIAN HIEROGLYPH-13CAE;Lo;0;L;;;;;N;;;;; +13CAF;EGYPTIAN HIEROGLYPH-13CAF;Lo;0;L;;;;;N;;;;; +13CB0;EGYPTIAN HIEROGLYPH-13CB0;Lo;0;L;;;;;N;;;;; +13CB1;EGYPTIAN HIEROGLYPH-13CB1;Lo;0;L;;;;;N;;;;; +13CB2;EGYPTIAN HIEROGLYPH-13CB2;Lo;0;L;;;;;N;;;;; +13CB3;EGYPTIAN HIEROGLYPH-13CB3;Lo;0;L;;;;;N;;;;; +13CB4;EGYPTIAN HIEROGLYPH-13CB4;Lo;0;L;;;;;N;;;;; +13CB5;EGYPTIAN HIEROGLYPH-13CB5;Lo;0;L;;;;;N;;;;; +13CB6;EGYPTIAN HIEROGLYPH-13CB6;Lo;0;L;;;;;N;;;;; +13CB7;EGYPTIAN HIEROGLYPH-13CB7;Lo;0;L;;;;;N;;;;; +13CB8;EGYPTIAN HIEROGLYPH-13CB8;Lo;0;L;;;;;N;;;;; +13CB9;EGYPTIAN HIEROGLYPH-13CB9;Lo;0;L;;;;;N;;;;; +13CBA;EGYPTIAN HIEROGLYPH-13CBA;Lo;0;L;;;;;N;;;;; +13CBB;EGYPTIAN HIEROGLYPH-13CBB;Lo;0;L;;;;;N;;;;; +13CBC;EGYPTIAN HIEROGLYPH-13CBC;Lo;0;L;;;;;N;;;;; +13CBD;EGYPTIAN HIEROGLYPH-13CBD;Lo;0;L;;;;;N;;;;; +13CBE;EGYPTIAN HIEROGLYPH-13CBE;Lo;0;L;;;;;N;;;;; +13CBF;EGYPTIAN HIEROGLYPH-13CBF;Lo;0;L;;;;;N;;;;; +13CC0;EGYPTIAN HIEROGLYPH-13CC0;Lo;0;L;;;;;N;;;;; +13CC1;EGYPTIAN HIEROGLYPH-13CC1;Lo;0;L;;;;;N;;;;; +13CC2;EGYPTIAN HIEROGLYPH-13CC2;Lo;0;L;;;;;N;;;;; +13CC3;EGYPTIAN HIEROGLYPH-13CC3;Lo;0;L;;;;;N;;;;; +13CC4;EGYPTIAN HIEROGLYPH-13CC4;Lo;0;L;;;;;N;;;;; +13CC5;EGYPTIAN HIEROGLYPH-13CC5;Lo;0;L;;;;;N;;;;; +13CC6;EGYPTIAN HIEROGLYPH-13CC6;Lo;0;L;;;;;N;;;;; +13CC7;EGYPTIAN HIEROGLYPH-13CC7;Lo;0;L;;;;;N;;;;; +13CC8;EGYPTIAN HIEROGLYPH-13CC8;Lo;0;L;;;;;N;;;;; +13CC9;EGYPTIAN HIEROGLYPH-13CC9;Lo;0;L;;;;;N;;;;; +13CCA;EGYPTIAN HIEROGLYPH-13CCA;Lo;0;L;;;;;N;;;;; +13CCB;EGYPTIAN HIEROGLYPH-13CCB;Lo;0;L;;;;;N;;;;; +13CCC;EGYPTIAN HIEROGLYPH-13CCC;Lo;0;L;;;;;N;;;;; +13CCD;EGYPTIAN HIEROGLYPH-13CCD;Lo;0;L;;;;;N;;;;; +13CCE;EGYPTIAN HIEROGLYPH-13CCE;Lo;0;L;;;;;N;;;;; +13CCF;EGYPTIAN HIEROGLYPH-13CCF;Lo;0;L;;;;;N;;;;; +13CD0;EGYPTIAN HIEROGLYPH-13CD0;Lo;0;L;;;;;N;;;;; +13CD1;EGYPTIAN HIEROGLYPH-13CD1;Lo;0;L;;;;;N;;;;; +13CD2;EGYPTIAN HIEROGLYPH-13CD2;Lo;0;L;;;;;N;;;;; +13CD3;EGYPTIAN HIEROGLYPH-13CD3;Lo;0;L;;;;;N;;;;; +13CD4;EGYPTIAN HIEROGLYPH-13CD4;Lo;0;L;;;;;N;;;;; +13CD5;EGYPTIAN HIEROGLYPH-13CD5;Lo;0;L;;;;;N;;;;; +13CD6;EGYPTIAN HIEROGLYPH-13CD6;Lo;0;L;;;;;N;;;;; +13CD7;EGYPTIAN HIEROGLYPH-13CD7;Lo;0;L;;;;;N;;;;; +13CD8;EGYPTIAN HIEROGLYPH-13CD8;Lo;0;L;;;;;N;;;;; +13CD9;EGYPTIAN HIEROGLYPH-13CD9;Lo;0;L;;;;;N;;;;; +13CDA;EGYPTIAN HIEROGLYPH-13CDA;Lo;0;L;;;;;N;;;;; +13CDB;EGYPTIAN HIEROGLYPH-13CDB;Lo;0;L;;;;;N;;;;; +13CDC;EGYPTIAN HIEROGLYPH-13CDC;Lo;0;L;;;;;N;;;;; +13CDD;EGYPTIAN HIEROGLYPH-13CDD;Lo;0;L;;;;;N;;;;; +13CDE;EGYPTIAN HIEROGLYPH-13CDE;Lo;0;L;;;;;N;;;;; +13CDF;EGYPTIAN HIEROGLYPH-13CDF;Lo;0;L;;;;;N;;;;; +13CE0;EGYPTIAN HIEROGLYPH-13CE0;Lo;0;L;;;;;N;;;;; +13CE1;EGYPTIAN HIEROGLYPH-13CE1;Lo;0;L;;;;;N;;;;; +13CE2;EGYPTIAN HIEROGLYPH-13CE2;Lo;0;L;;;;;N;;;;; +13CE3;EGYPTIAN HIEROGLYPH-13CE3;Lo;0;L;;;;;N;;;;; +13CE4;EGYPTIAN HIEROGLYPH-13CE4;Lo;0;L;;;;;N;;;;; +13CE5;EGYPTIAN HIEROGLYPH-13CE5;Lo;0;L;;;;;N;;;;; +13CE6;EGYPTIAN HIEROGLYPH-13CE6;Lo;0;L;;;;;N;;;;; +13CE7;EGYPTIAN HIEROGLYPH-13CE7;Lo;0;L;;;;;N;;;;; +13CE8;EGYPTIAN HIEROGLYPH-13CE8;Lo;0;L;;;;;N;;;;; +13CE9;EGYPTIAN HIEROGLYPH-13CE9;Lo;0;L;;;;;N;;;;; +13CEA;EGYPTIAN HIEROGLYPH-13CEA;Lo;0;L;;;;;N;;;;; +13CEB;EGYPTIAN HIEROGLYPH-13CEB;Lo;0;L;;;;;N;;;;; +13CEC;EGYPTIAN HIEROGLYPH-13CEC;Lo;0;L;;;;;N;;;;; +13CED;EGYPTIAN HIEROGLYPH-13CED;Lo;0;L;;;;;N;;;;; +13CEE;EGYPTIAN HIEROGLYPH-13CEE;Lo;0;L;;;;;N;;;;; +13CEF;EGYPTIAN HIEROGLYPH-13CEF;Lo;0;L;;;;;N;;;;; +13CF0;EGYPTIAN HIEROGLYPH-13CF0;Lo;0;L;;;;;N;;;;; +13CF1;EGYPTIAN HIEROGLYPH-13CF1;Lo;0;L;;;;;N;;;;; +13CF2;EGYPTIAN HIEROGLYPH-13CF2;Lo;0;L;;;;;N;;;;; +13CF3;EGYPTIAN HIEROGLYPH-13CF3;Lo;0;L;;;;;N;;;;; +13CF4;EGYPTIAN HIEROGLYPH-13CF4;Lo;0;L;;;;;N;;;;; +13CF5;EGYPTIAN HIEROGLYPH-13CF5;Lo;0;L;;;;;N;;;;; +13CF6;EGYPTIAN HIEROGLYPH-13CF6;Lo;0;L;;;;;N;;;;; +13CF7;EGYPTIAN HIEROGLYPH-13CF7;Lo;0;L;;;;;N;;;;; +13CF8;EGYPTIAN HIEROGLYPH-13CF8;Lo;0;L;;;;;N;;;;; +13CF9;EGYPTIAN HIEROGLYPH-13CF9;Lo;0;L;;;;;N;;;;; +13CFA;EGYPTIAN HIEROGLYPH-13CFA;Lo;0;L;;;;;N;;;;; +13CFB;EGYPTIAN HIEROGLYPH-13CFB;Lo;0;L;;;;;N;;;;; +13CFC;EGYPTIAN HIEROGLYPH-13CFC;Lo;0;L;;;;;N;;;;; +13CFD;EGYPTIAN HIEROGLYPH-13CFD;Lo;0;L;;;;;N;;;;; +13CFE;EGYPTIAN HIEROGLYPH-13CFE;Lo;0;L;;;;;N;;;;; +13CFF;EGYPTIAN HIEROGLYPH-13CFF;Lo;0;L;;;;;N;;;;; +13D00;EGYPTIAN HIEROGLYPH-13D00;Lo;0;L;;;;;N;;;;; +13D01;EGYPTIAN HIEROGLYPH-13D01;Lo;0;L;;;;;N;;;;; +13D02;EGYPTIAN HIEROGLYPH-13D02;Lo;0;L;;;;;N;;;;; +13D03;EGYPTIAN HIEROGLYPH-13D03;Lo;0;L;;;;;N;;;;; +13D04;EGYPTIAN HIEROGLYPH-13D04;Lo;0;L;;;;;N;;;;; +13D05;EGYPTIAN HIEROGLYPH-13D05;Lo;0;L;;;;;N;;;;; +13D06;EGYPTIAN HIEROGLYPH-13D06;Lo;0;L;;;;;N;;;;; +13D07;EGYPTIAN HIEROGLYPH-13D07;Lo;0;L;;;;;N;;;;; +13D08;EGYPTIAN HIEROGLYPH-13D08;Lo;0;L;;;;;N;;;;; +13D09;EGYPTIAN HIEROGLYPH-13D09;Lo;0;L;;;;;N;;;;; +13D0A;EGYPTIAN HIEROGLYPH-13D0A;Lo;0;L;;;;;N;;;;; +13D0B;EGYPTIAN HIEROGLYPH-13D0B;Lo;0;L;;;;;N;;;;; +13D0C;EGYPTIAN HIEROGLYPH-13D0C;Lo;0;L;;;;;N;;;;; +13D0D;EGYPTIAN HIEROGLYPH-13D0D;Lo;0;L;;;;;N;;;;; +13D0E;EGYPTIAN HIEROGLYPH-13D0E;Lo;0;L;;;;;N;;;;; +13D0F;EGYPTIAN HIEROGLYPH-13D0F;Lo;0;L;;;;;N;;;;; +13D10;EGYPTIAN HIEROGLYPH-13D10;Lo;0;L;;;;;N;;;;; +13D11;EGYPTIAN HIEROGLYPH-13D11;Lo;0;L;;;;;N;;;;; +13D12;EGYPTIAN HIEROGLYPH-13D12;Lo;0;L;;;;;N;;;;; +13D13;EGYPTIAN HIEROGLYPH-13D13;Lo;0;L;;;;;N;;;;; +13D14;EGYPTIAN HIEROGLYPH-13D14;Lo;0;L;;;;;N;;;;; +13D15;EGYPTIAN HIEROGLYPH-13D15;Lo;0;L;;;;;N;;;;; +13D16;EGYPTIAN HIEROGLYPH-13D16;Lo;0;L;;;;;N;;;;; +13D17;EGYPTIAN HIEROGLYPH-13D17;Lo;0;L;;;;;N;;;;; +13D18;EGYPTIAN HIEROGLYPH-13D18;Lo;0;L;;;;;N;;;;; +13D19;EGYPTIAN HIEROGLYPH-13D19;Lo;0;L;;;;;N;;;;; +13D1A;EGYPTIAN HIEROGLYPH-13D1A;Lo;0;L;;;;;N;;;;; +13D1B;EGYPTIAN HIEROGLYPH-13D1B;Lo;0;L;;;;;N;;;;; +13D1C;EGYPTIAN HIEROGLYPH-13D1C;Lo;0;L;;;;;N;;;;; +13D1D;EGYPTIAN HIEROGLYPH-13D1D;Lo;0;L;;;;;N;;;;; +13D1E;EGYPTIAN HIEROGLYPH-13D1E;Lo;0;L;;;;;N;;;;; +13D1F;EGYPTIAN HIEROGLYPH-13D1F;Lo;0;L;;;;;N;;;;; +13D20;EGYPTIAN HIEROGLYPH-13D20;Lo;0;L;;;;;N;;;;; +13D21;EGYPTIAN HIEROGLYPH-13D21;Lo;0;L;;;;;N;;;;; +13D22;EGYPTIAN HIEROGLYPH-13D22;Lo;0;L;;;;;N;;;;; +13D23;EGYPTIAN HIEROGLYPH-13D23;Lo;0;L;;;;;N;;;;; +13D24;EGYPTIAN HIEROGLYPH-13D24;Lo;0;L;;;;;N;;;;; +13D25;EGYPTIAN HIEROGLYPH-13D25;Lo;0;L;;;;;N;;;;; +13D26;EGYPTIAN HIEROGLYPH-13D26;Lo;0;L;;;;;N;;;;; +13D27;EGYPTIAN HIEROGLYPH-13D27;Lo;0;L;;;;;N;;;;; +13D28;EGYPTIAN HIEROGLYPH-13D28;Lo;0;L;;;;;N;;;;; +13D29;EGYPTIAN HIEROGLYPH-13D29;Lo;0;L;;;;;N;;;;; +13D2A;EGYPTIAN HIEROGLYPH-13D2A;Lo;0;L;;;;;N;;;;; +13D2B;EGYPTIAN HIEROGLYPH-13D2B;Lo;0;L;;;;;N;;;;; +13D2C;EGYPTIAN HIEROGLYPH-13D2C;Lo;0;L;;;;;N;;;;; +13D2D;EGYPTIAN HIEROGLYPH-13D2D;Lo;0;L;;;;;N;;;;; +13D2E;EGYPTIAN HIEROGLYPH-13D2E;Lo;0;L;;;;;N;;;;; +13D2F;EGYPTIAN HIEROGLYPH-13D2F;Lo;0;L;;;;;N;;;;; +13D30;EGYPTIAN HIEROGLYPH-13D30;Lo;0;L;;;;;N;;;;; +13D31;EGYPTIAN HIEROGLYPH-13D31;Lo;0;L;;;;;N;;;;; +13D32;EGYPTIAN HIEROGLYPH-13D32;Lo;0;L;;;;;N;;;;; +13D33;EGYPTIAN HIEROGLYPH-13D33;Lo;0;L;;;;;N;;;;; +13D34;EGYPTIAN HIEROGLYPH-13D34;Lo;0;L;;;;;N;;;;; +13D35;EGYPTIAN HIEROGLYPH-13D35;Lo;0;L;;;;;N;;;;; +13D36;EGYPTIAN HIEROGLYPH-13D36;Lo;0;L;;;;;N;;;;; +13D37;EGYPTIAN HIEROGLYPH-13D37;Lo;0;L;;;;;N;;;;; +13D38;EGYPTIAN HIEROGLYPH-13D38;Lo;0;L;;;;;N;;;;; +13D39;EGYPTIAN HIEROGLYPH-13D39;Lo;0;L;;;;;N;;;;; +13D3A;EGYPTIAN HIEROGLYPH-13D3A;Lo;0;L;;;;;N;;;;; +13D3B;EGYPTIAN HIEROGLYPH-13D3B;Lo;0;L;;;;;N;;;;; +13D3C;EGYPTIAN HIEROGLYPH-13D3C;Lo;0;L;;;;;N;;;;; +13D3D;EGYPTIAN HIEROGLYPH-13D3D;Lo;0;L;;;;;N;;;;; +13D3E;EGYPTIAN HIEROGLYPH-13D3E;Lo;0;L;;;;;N;;;;; +13D3F;EGYPTIAN HIEROGLYPH-13D3F;Lo;0;L;;;;;N;;;;; +13D40;EGYPTIAN HIEROGLYPH-13D40;Lo;0;L;;;;;N;;;;; +13D41;EGYPTIAN HIEROGLYPH-13D41;Lo;0;L;;;;;N;;;;; +13D42;EGYPTIAN HIEROGLYPH-13D42;Lo;0;L;;;;;N;;;;; +13D43;EGYPTIAN HIEROGLYPH-13D43;Lo;0;L;;;;;N;;;;; +13D44;EGYPTIAN HIEROGLYPH-13D44;Lo;0;L;;;;;N;;;;; +13D45;EGYPTIAN HIEROGLYPH-13D45;Lo;0;L;;;;;N;;;;; +13D46;EGYPTIAN HIEROGLYPH-13D46;Lo;0;L;;;;;N;;;;; +13D47;EGYPTIAN HIEROGLYPH-13D47;Lo;0;L;;;;;N;;;;; +13D48;EGYPTIAN HIEROGLYPH-13D48;Lo;0;L;;;;;N;;;;; +13D49;EGYPTIAN HIEROGLYPH-13D49;Lo;0;L;;;;;N;;;;; +13D4A;EGYPTIAN HIEROGLYPH-13D4A;Lo;0;L;;;;;N;;;;; +13D4B;EGYPTIAN HIEROGLYPH-13D4B;Lo;0;L;;;;;N;;;;; +13D4C;EGYPTIAN HIEROGLYPH-13D4C;Lo;0;L;;;;;N;;;;; +13D4D;EGYPTIAN HIEROGLYPH-13D4D;Lo;0;L;;;;;N;;;;; +13D4E;EGYPTIAN HIEROGLYPH-13D4E;Lo;0;L;;;;;N;;;;; +13D4F;EGYPTIAN HIEROGLYPH-13D4F;Lo;0;L;;;;;N;;;;; +13D50;EGYPTIAN HIEROGLYPH-13D50;Lo;0;L;;;;;N;;;;; +13D51;EGYPTIAN HIEROGLYPH-13D51;Lo;0;L;;;;;N;;;;; +13D52;EGYPTIAN HIEROGLYPH-13D52;Lo;0;L;;;;;N;;;;; +13D53;EGYPTIAN HIEROGLYPH-13D53;Lo;0;L;;;;;N;;;;; +13D54;EGYPTIAN HIEROGLYPH-13D54;Lo;0;L;;;;;N;;;;; +13D55;EGYPTIAN HIEROGLYPH-13D55;Lo;0;L;;;;;N;;;;; +13D56;EGYPTIAN HIEROGLYPH-13D56;Lo;0;L;;;;;N;;;;; +13D57;EGYPTIAN HIEROGLYPH-13D57;Lo;0;L;;;;;N;;;;; +13D58;EGYPTIAN HIEROGLYPH-13D58;Lo;0;L;;;;;N;;;;; +13D59;EGYPTIAN HIEROGLYPH-13D59;Lo;0;L;;;;;N;;;;; +13D5A;EGYPTIAN HIEROGLYPH-13D5A;Lo;0;L;;;;;N;;;;; +13D5B;EGYPTIAN HIEROGLYPH-13D5B;Lo;0;L;;;;;N;;;;; +13D5C;EGYPTIAN HIEROGLYPH-13D5C;Lo;0;L;;;;;N;;;;; +13D5D;EGYPTIAN HIEROGLYPH-13D5D;Lo;0;L;;;;;N;;;;; +13D5E;EGYPTIAN HIEROGLYPH-13D5E;Lo;0;L;;;;;N;;;;; +13D5F;EGYPTIAN HIEROGLYPH-13D5F;Lo;0;L;;;;;N;;;;; +13D60;EGYPTIAN HIEROGLYPH-13D60;Lo;0;L;;;;;N;;;;; +13D61;EGYPTIAN HIEROGLYPH-13D61;Lo;0;L;;;;;N;;;;; +13D62;EGYPTIAN HIEROGLYPH-13D62;Lo;0;L;;;;;N;;;;; +13D63;EGYPTIAN HIEROGLYPH-13D63;Lo;0;L;;;;;N;;;;; +13D64;EGYPTIAN HIEROGLYPH-13D64;Lo;0;L;;;;;N;;;;; +13D65;EGYPTIAN HIEROGLYPH-13D65;Lo;0;L;;;;;N;;;;; +13D66;EGYPTIAN HIEROGLYPH-13D66;Lo;0;L;;;;;N;;;;; +13D67;EGYPTIAN HIEROGLYPH-13D67;Lo;0;L;;;;;N;;;;; +13D68;EGYPTIAN HIEROGLYPH-13D68;Lo;0;L;;;;;N;;;;; +13D69;EGYPTIAN HIEROGLYPH-13D69;Lo;0;L;;;;;N;;;;; +13D6A;EGYPTIAN HIEROGLYPH-13D6A;Lo;0;L;;;;;N;;;;; +13D6B;EGYPTIAN HIEROGLYPH-13D6B;Lo;0;L;;;;;N;;;;; +13D6C;EGYPTIAN HIEROGLYPH-13D6C;Lo;0;L;;;;;N;;;;; +13D6D;EGYPTIAN HIEROGLYPH-13D6D;Lo;0;L;;;;;N;;;;; +13D6E;EGYPTIAN HIEROGLYPH-13D6E;Lo;0;L;;;;;N;;;;; +13D6F;EGYPTIAN HIEROGLYPH-13D6F;Lo;0;L;;;;;N;;;;; +13D70;EGYPTIAN HIEROGLYPH-13D70;Lo;0;L;;;;;N;;;;; +13D71;EGYPTIAN HIEROGLYPH-13D71;Lo;0;L;;;;;N;;;;; +13D72;EGYPTIAN HIEROGLYPH-13D72;Lo;0;L;;;;;N;;;;; +13D73;EGYPTIAN HIEROGLYPH-13D73;Lo;0;L;;;;;N;;;;; +13D74;EGYPTIAN HIEROGLYPH-13D74;Lo;0;L;;;;;N;;;;; +13D75;EGYPTIAN HIEROGLYPH-13D75;Lo;0;L;;;;;N;;;;; +13D76;EGYPTIAN HIEROGLYPH-13D76;Lo;0;L;;;;;N;;;;; +13D77;EGYPTIAN HIEROGLYPH-13D77;Lo;0;L;;;;;N;;;;; +13D78;EGYPTIAN HIEROGLYPH-13D78;Lo;0;L;;;;;N;;;;; +13D79;EGYPTIAN HIEROGLYPH-13D79;Lo;0;L;;;;;N;;;;; +13D7A;EGYPTIAN HIEROGLYPH-13D7A;Lo;0;L;;;;;N;;;;; +13D7B;EGYPTIAN HIEROGLYPH-13D7B;Lo;0;L;;;;;N;;;;; +13D7C;EGYPTIAN HIEROGLYPH-13D7C;Lo;0;L;;;;;N;;;;; +13D7D;EGYPTIAN HIEROGLYPH-13D7D;Lo;0;L;;;;;N;;;;; +13D7E;EGYPTIAN HIEROGLYPH-13D7E;Lo;0;L;;;;;N;;;;; +13D7F;EGYPTIAN HIEROGLYPH-13D7F;Lo;0;L;;;;;N;;;;; +13D80;EGYPTIAN HIEROGLYPH-13D80;Lo;0;L;;;;;N;;;;; +13D81;EGYPTIAN HIEROGLYPH-13D81;Lo;0;L;;;;;N;;;;; +13D82;EGYPTIAN HIEROGLYPH-13D82;Lo;0;L;;;;;N;;;;; +13D83;EGYPTIAN HIEROGLYPH-13D83;Lo;0;L;;;;;N;;;;; +13D84;EGYPTIAN HIEROGLYPH-13D84;Lo;0;L;;;;;N;;;;; +13D85;EGYPTIAN HIEROGLYPH-13D85;Lo;0;L;;;;;N;;;;; +13D86;EGYPTIAN HIEROGLYPH-13D86;Lo;0;L;;;;;N;;;;; +13D87;EGYPTIAN HIEROGLYPH-13D87;Lo;0;L;;;;;N;;;;; +13D88;EGYPTIAN HIEROGLYPH-13D88;Lo;0;L;;;;;N;;;;; +13D89;EGYPTIAN HIEROGLYPH-13D89;Lo;0;L;;;;;N;;;;; +13D8A;EGYPTIAN HIEROGLYPH-13D8A;Lo;0;L;;;;;N;;;;; +13D8B;EGYPTIAN HIEROGLYPH-13D8B;Lo;0;L;;;;;N;;;;; +13D8C;EGYPTIAN HIEROGLYPH-13D8C;Lo;0;L;;;;;N;;;;; +13D8D;EGYPTIAN HIEROGLYPH-13D8D;Lo;0;L;;;;;N;;;;; +13D8E;EGYPTIAN HIEROGLYPH-13D8E;Lo;0;L;;;;;N;;;;; +13D8F;EGYPTIAN HIEROGLYPH-13D8F;Lo;0;L;;;;;N;;;;; +13D90;EGYPTIAN HIEROGLYPH-13D90;Lo;0;L;;;;;N;;;;; +13D91;EGYPTIAN HIEROGLYPH-13D91;Lo;0;L;;;;;N;;;;; +13D92;EGYPTIAN HIEROGLYPH-13D92;Lo;0;L;;;;;N;;;;; +13D93;EGYPTIAN HIEROGLYPH-13D93;Lo;0;L;;;;;N;;;;; +13D94;EGYPTIAN HIEROGLYPH-13D94;Lo;0;L;;;;;N;;;;; +13D95;EGYPTIAN HIEROGLYPH-13D95;Lo;0;L;;;;;N;;;;; +13D96;EGYPTIAN HIEROGLYPH-13D96;Lo;0;L;;;;;N;;;;; +13D97;EGYPTIAN HIEROGLYPH-13D97;Lo;0;L;;;;;N;;;;; +13D98;EGYPTIAN HIEROGLYPH-13D98;Lo;0;L;;;;;N;;;;; +13D99;EGYPTIAN HIEROGLYPH-13D99;Lo;0;L;;;;;N;;;;; +13D9A;EGYPTIAN HIEROGLYPH-13D9A;Lo;0;L;;;;;N;;;;; +13D9B;EGYPTIAN HIEROGLYPH-13D9B;Lo;0;L;;;;;N;;;;; +13D9C;EGYPTIAN HIEROGLYPH-13D9C;Lo;0;L;;;;;N;;;;; +13D9D;EGYPTIAN HIEROGLYPH-13D9D;Lo;0;L;;;;;N;;;;; +13D9E;EGYPTIAN HIEROGLYPH-13D9E;Lo;0;L;;;;;N;;;;; +13D9F;EGYPTIAN HIEROGLYPH-13D9F;Lo;0;L;;;;;N;;;;; +13DA0;EGYPTIAN HIEROGLYPH-13DA0;Lo;0;L;;;;;N;;;;; +13DA1;EGYPTIAN HIEROGLYPH-13DA1;Lo;0;L;;;;;N;;;;; +13DA2;EGYPTIAN HIEROGLYPH-13DA2;Lo;0;L;;;;;N;;;;; +13DA3;EGYPTIAN HIEROGLYPH-13DA3;Lo;0;L;;;;;N;;;;; +13DA4;EGYPTIAN HIEROGLYPH-13DA4;Lo;0;L;;;;;N;;;;; +13DA5;EGYPTIAN HIEROGLYPH-13DA5;Lo;0;L;;;;;N;;;;; +13DA6;EGYPTIAN HIEROGLYPH-13DA6;Lo;0;L;;;;;N;;;;; +13DA7;EGYPTIAN HIEROGLYPH-13DA7;Lo;0;L;;;;;N;;;;; +13DA8;EGYPTIAN HIEROGLYPH-13DA8;Lo;0;L;;;;;N;;;;; +13DA9;EGYPTIAN HIEROGLYPH-13DA9;Lo;0;L;;;;;N;;;;; +13DAA;EGYPTIAN HIEROGLYPH-13DAA;Lo;0;L;;;;;N;;;;; +13DAB;EGYPTIAN HIEROGLYPH-13DAB;Lo;0;L;;;;;N;;;;; +13DAC;EGYPTIAN HIEROGLYPH-13DAC;Lo;0;L;;;;;N;;;;; +13DAD;EGYPTIAN HIEROGLYPH-13DAD;Lo;0;L;;;;;N;;;;; +13DAE;EGYPTIAN HIEROGLYPH-13DAE;Lo;0;L;;;;;N;;;;; +13DAF;EGYPTIAN HIEROGLYPH-13DAF;Lo;0;L;;;;;N;;;;; +13DB0;EGYPTIAN HIEROGLYPH-13DB0;Lo;0;L;;;;;N;;;;; +13DB1;EGYPTIAN HIEROGLYPH-13DB1;Lo;0;L;;;;;N;;;;; +13DB2;EGYPTIAN HIEROGLYPH-13DB2;Lo;0;L;;;;;N;;;;; +13DB3;EGYPTIAN HIEROGLYPH-13DB3;Lo;0;L;;;;;N;;;;; +13DB4;EGYPTIAN HIEROGLYPH-13DB4;Lo;0;L;;;;;N;;;;; +13DB5;EGYPTIAN HIEROGLYPH-13DB5;Lo;0;L;;;;;N;;;;; +13DB6;EGYPTIAN HIEROGLYPH-13DB6;Lo;0;L;;;;;N;;;;; +13DB7;EGYPTIAN HIEROGLYPH-13DB7;Lo;0;L;;;;;N;;;;; +13DB8;EGYPTIAN HIEROGLYPH-13DB8;Lo;0;L;;;;;N;;;;; +13DB9;EGYPTIAN HIEROGLYPH-13DB9;Lo;0;L;;;;;N;;;;; +13DBA;EGYPTIAN HIEROGLYPH-13DBA;Lo;0;L;;;;;N;;;;; +13DBB;EGYPTIAN HIEROGLYPH-13DBB;Lo;0;L;;;;;N;;;;; +13DBC;EGYPTIAN HIEROGLYPH-13DBC;Lo;0;L;;;;;N;;;;; +13DBD;EGYPTIAN HIEROGLYPH-13DBD;Lo;0;L;;;;;N;;;;; +13DBE;EGYPTIAN HIEROGLYPH-13DBE;Lo;0;L;;;;;N;;;;; +13DBF;EGYPTIAN HIEROGLYPH-13DBF;Lo;0;L;;;;;N;;;;; +13DC0;EGYPTIAN HIEROGLYPH-13DC0;Lo;0;L;;;;;N;;;;; +13DC1;EGYPTIAN HIEROGLYPH-13DC1;Lo;0;L;;;;;N;;;;; +13DC2;EGYPTIAN HIEROGLYPH-13DC2;Lo;0;L;;;;;N;;;;; +13DC3;EGYPTIAN HIEROGLYPH-13DC3;Lo;0;L;;;;;N;;;;; +13DC4;EGYPTIAN HIEROGLYPH-13DC4;Lo;0;L;;;;;N;;;;; +13DC5;EGYPTIAN HIEROGLYPH-13DC5;Lo;0;L;;;;;N;;;;; +13DC6;EGYPTIAN HIEROGLYPH-13DC6;Lo;0;L;;;;;N;;;;; +13DC7;EGYPTIAN HIEROGLYPH-13DC7;Lo;0;L;;;;;N;;;;; +13DC8;EGYPTIAN HIEROGLYPH-13DC8;Lo;0;L;;;;;N;;;;; +13DC9;EGYPTIAN HIEROGLYPH-13DC9;Lo;0;L;;;;;N;;;;; +13DCA;EGYPTIAN HIEROGLYPH-13DCA;Lo;0;L;;;;;N;;;;; +13DCB;EGYPTIAN HIEROGLYPH-13DCB;Lo;0;L;;;;;N;;;;; +13DCC;EGYPTIAN HIEROGLYPH-13DCC;Lo;0;L;;;;;N;;;;; +13DCD;EGYPTIAN HIEROGLYPH-13DCD;Lo;0;L;;;;;N;;;;; +13DCE;EGYPTIAN HIEROGLYPH-13DCE;Lo;0;L;;;;;N;;;;; +13DCF;EGYPTIAN HIEROGLYPH-13DCF;Lo;0;L;;;;;N;;;;; +13DD0;EGYPTIAN HIEROGLYPH-13DD0;Lo;0;L;;;;;N;;;;; +13DD1;EGYPTIAN HIEROGLYPH-13DD1;Lo;0;L;;;;;N;;;;; +13DD2;EGYPTIAN HIEROGLYPH-13DD2;Lo;0;L;;;;;N;;;;; +13DD3;EGYPTIAN HIEROGLYPH-13DD3;Lo;0;L;;;;;N;;;;; +13DD4;EGYPTIAN HIEROGLYPH-13DD4;Lo;0;L;;;;;N;;;;; +13DD5;EGYPTIAN HIEROGLYPH-13DD5;Lo;0;L;;;;;N;;;;; +13DD6;EGYPTIAN HIEROGLYPH-13DD6;Lo;0;L;;;;;N;;;;; +13DD7;EGYPTIAN HIEROGLYPH-13DD7;Lo;0;L;;;;;N;;;;; +13DD8;EGYPTIAN HIEROGLYPH-13DD8;Lo;0;L;;;;;N;;;;; +13DD9;EGYPTIAN HIEROGLYPH-13DD9;Lo;0;L;;;;;N;;;;; +13DDA;EGYPTIAN HIEROGLYPH-13DDA;Lo;0;L;;;;;N;;;;; +13DDB;EGYPTIAN HIEROGLYPH-13DDB;Lo;0;L;;;;;N;;;;; +13DDC;EGYPTIAN HIEROGLYPH-13DDC;Lo;0;L;;;;;N;;;;; +13DDD;EGYPTIAN HIEROGLYPH-13DDD;Lo;0;L;;;;;N;;;;; +13DDE;EGYPTIAN HIEROGLYPH-13DDE;Lo;0;L;;;;;N;;;;; +13DDF;EGYPTIAN HIEROGLYPH-13DDF;Lo;0;L;;;;;N;;;;; +13DE0;EGYPTIAN HIEROGLYPH-13DE0;Lo;0;L;;;;;N;;;;; +13DE1;EGYPTIAN HIEROGLYPH-13DE1;Lo;0;L;;;;;N;;;;; +13DE2;EGYPTIAN HIEROGLYPH-13DE2;Lo;0;L;;;;;N;;;;; +13DE3;EGYPTIAN HIEROGLYPH-13DE3;Lo;0;L;;;;;N;;;;; +13DE4;EGYPTIAN HIEROGLYPH-13DE4;Lo;0;L;;;;;N;;;;; +13DE5;EGYPTIAN HIEROGLYPH-13DE5;Lo;0;L;;;;;N;;;;; +13DE6;EGYPTIAN HIEROGLYPH-13DE6;Lo;0;L;;;;;N;;;;; +13DE7;EGYPTIAN HIEROGLYPH-13DE7;Lo;0;L;;;;;N;;;;; +13DE8;EGYPTIAN HIEROGLYPH-13DE8;Lo;0;L;;;;;N;;;;; +13DE9;EGYPTIAN HIEROGLYPH-13DE9;Lo;0;L;;;;;N;;;;; +13DEA;EGYPTIAN HIEROGLYPH-13DEA;Lo;0;L;;;;;N;;;;; +13DEB;EGYPTIAN HIEROGLYPH-13DEB;Lo;0;L;;;;;N;;;;; +13DEC;EGYPTIAN HIEROGLYPH-13DEC;Lo;0;L;;;;;N;;;;; +13DED;EGYPTIAN HIEROGLYPH-13DED;Lo;0;L;;;;;N;;;;; +13DEE;EGYPTIAN HIEROGLYPH-13DEE;Lo;0;L;;;;;N;;;;; +13DEF;EGYPTIAN HIEROGLYPH-13DEF;Lo;0;L;;;;;N;;;;; +13DF0;EGYPTIAN HIEROGLYPH-13DF0;Lo;0;L;;;;;N;;;;; +13DF1;EGYPTIAN HIEROGLYPH-13DF1;Lo;0;L;;;;;N;;;;; +13DF2;EGYPTIAN HIEROGLYPH-13DF2;Lo;0;L;;;;;N;;;;; +13DF3;EGYPTIAN HIEROGLYPH-13DF3;Lo;0;L;;;;;N;;;;; +13DF4;EGYPTIAN HIEROGLYPH-13DF4;Lo;0;L;;;;;N;;;;; +13DF5;EGYPTIAN HIEROGLYPH-13DF5;Lo;0;L;;;;;N;;;;; +13DF6;EGYPTIAN HIEROGLYPH-13DF6;Lo;0;L;;;;;N;;;;; +13DF7;EGYPTIAN HIEROGLYPH-13DF7;Lo;0;L;;;;;N;;;;; +13DF8;EGYPTIAN HIEROGLYPH-13DF8;Lo;0;L;;;;;N;;;;; +13DF9;EGYPTIAN HIEROGLYPH-13DF9;Lo;0;L;;;;;N;;;;; +13DFA;EGYPTIAN HIEROGLYPH-13DFA;Lo;0;L;;;;;N;;;;; +13DFB;EGYPTIAN HIEROGLYPH-13DFB;Lo;0;L;;;;;N;;;;; +13DFC;EGYPTIAN HIEROGLYPH-13DFC;Lo;0;L;;;;;N;;;;; +13DFD;EGYPTIAN HIEROGLYPH-13DFD;Lo;0;L;;;;;N;;;;; +13DFE;EGYPTIAN HIEROGLYPH-13DFE;Lo;0;L;;;;;N;;;;; +13DFF;EGYPTIAN HIEROGLYPH-13DFF;Lo;0;L;;;;;N;;;;; +13E00;EGYPTIAN HIEROGLYPH-13E00;Lo;0;L;;;;;N;;;;; +13E01;EGYPTIAN HIEROGLYPH-13E01;Lo;0;L;;;;;N;;;;; +13E02;EGYPTIAN HIEROGLYPH-13E02;Lo;0;L;;;;;N;;;;; +13E03;EGYPTIAN HIEROGLYPH-13E03;Lo;0;L;;;;;N;;;;; +13E04;EGYPTIAN HIEROGLYPH-13E04;Lo;0;L;;;;;N;;;;; +13E05;EGYPTIAN HIEROGLYPH-13E05;Lo;0;L;;;;;N;;;;; +13E06;EGYPTIAN HIEROGLYPH-13E06;Lo;0;L;;;;;N;;;;; +13E07;EGYPTIAN HIEROGLYPH-13E07;Lo;0;L;;;;;N;;;;; +13E08;EGYPTIAN HIEROGLYPH-13E08;Lo;0;L;;;;;N;;;;; +13E09;EGYPTIAN HIEROGLYPH-13E09;Lo;0;L;;;;;N;;;;; +13E0A;EGYPTIAN HIEROGLYPH-13E0A;Lo;0;L;;;;;N;;;;; +13E0B;EGYPTIAN HIEROGLYPH-13E0B;Lo;0;L;;;;;N;;;;; +13E0C;EGYPTIAN HIEROGLYPH-13E0C;Lo;0;L;;;;;N;;;;; +13E0D;EGYPTIAN HIEROGLYPH-13E0D;Lo;0;L;;;;;N;;;;; +13E0E;EGYPTIAN HIEROGLYPH-13E0E;Lo;0;L;;;;;N;;;;; +13E0F;EGYPTIAN HIEROGLYPH-13E0F;Lo;0;L;;;;;N;;;;; +13E10;EGYPTIAN HIEROGLYPH-13E10;Lo;0;L;;;;;N;;;;; +13E11;EGYPTIAN HIEROGLYPH-13E11;Lo;0;L;;;;;N;;;;; +13E12;EGYPTIAN HIEROGLYPH-13E12;Lo;0;L;;;;;N;;;;; +13E13;EGYPTIAN HIEROGLYPH-13E13;Lo;0;L;;;;;N;;;;; +13E14;EGYPTIAN HIEROGLYPH-13E14;Lo;0;L;;;;;N;;;;; +13E15;EGYPTIAN HIEROGLYPH-13E15;Lo;0;L;;;;;N;;;;; +13E16;EGYPTIAN HIEROGLYPH-13E16;Lo;0;L;;;;;N;;;;; +13E17;EGYPTIAN HIEROGLYPH-13E17;Lo;0;L;;;;;N;;;;; +13E18;EGYPTIAN HIEROGLYPH-13E18;Lo;0;L;;;;;N;;;;; +13E19;EGYPTIAN HIEROGLYPH-13E19;Lo;0;L;;;;;N;;;;; +13E1A;EGYPTIAN HIEROGLYPH-13E1A;Lo;0;L;;;;;N;;;;; +13E1B;EGYPTIAN HIEROGLYPH-13E1B;Lo;0;L;;;;;N;;;;; +13E1C;EGYPTIAN HIEROGLYPH-13E1C;Lo;0;L;;;;;N;;;;; +13E1D;EGYPTIAN HIEROGLYPH-13E1D;Lo;0;L;;;;;N;;;;; +13E1E;EGYPTIAN HIEROGLYPH-13E1E;Lo;0;L;;;;;N;;;;; +13E1F;EGYPTIAN HIEROGLYPH-13E1F;Lo;0;L;;;;;N;;;;; +13E20;EGYPTIAN HIEROGLYPH-13E20;Lo;0;L;;;;;N;;;;; +13E21;EGYPTIAN HIEROGLYPH-13E21;Lo;0;L;;;;;N;;;;; +13E22;EGYPTIAN HIEROGLYPH-13E22;Lo;0;L;;;;;N;;;;; +13E23;EGYPTIAN HIEROGLYPH-13E23;Lo;0;L;;;;;N;;;;; +13E24;EGYPTIAN HIEROGLYPH-13E24;Lo;0;L;;;;;N;;;;; +13E25;EGYPTIAN HIEROGLYPH-13E25;Lo;0;L;;;;;N;;;;; +13E26;EGYPTIAN HIEROGLYPH-13E26;Lo;0;L;;;;;N;;;;; +13E27;EGYPTIAN HIEROGLYPH-13E27;Lo;0;L;;;;;N;;;;; +13E28;EGYPTIAN HIEROGLYPH-13E28;Lo;0;L;;;;;N;;;;; +13E29;EGYPTIAN HIEROGLYPH-13E29;Lo;0;L;;;;;N;;;;; +13E2A;EGYPTIAN HIEROGLYPH-13E2A;Lo;0;L;;;;;N;;;;; +13E2B;EGYPTIAN HIEROGLYPH-13E2B;Lo;0;L;;;;;N;;;;; +13E2C;EGYPTIAN HIEROGLYPH-13E2C;Lo;0;L;;;;;N;;;;; +13E2D;EGYPTIAN HIEROGLYPH-13E2D;Lo;0;L;;;;;N;;;;; +13E2E;EGYPTIAN HIEROGLYPH-13E2E;Lo;0;L;;;;;N;;;;; +13E2F;EGYPTIAN HIEROGLYPH-13E2F;Lo;0;L;;;;;N;;;;; +13E30;EGYPTIAN HIEROGLYPH-13E30;Lo;0;L;;;;;N;;;;; +13E31;EGYPTIAN HIEROGLYPH-13E31;Lo;0;L;;;;;N;;;;; +13E32;EGYPTIAN HIEROGLYPH-13E32;Lo;0;L;;;;;N;;;;; +13E33;EGYPTIAN HIEROGLYPH-13E33;Lo;0;L;;;;;N;;;;; +13E34;EGYPTIAN HIEROGLYPH-13E34;Lo;0;L;;;;;N;;;;; +13E35;EGYPTIAN HIEROGLYPH-13E35;Lo;0;L;;;;;N;;;;; +13E36;EGYPTIAN HIEROGLYPH-13E36;Lo;0;L;;;;;N;;;;; +13E37;EGYPTIAN HIEROGLYPH-13E37;Lo;0;L;;;;;N;;;;; +13E38;EGYPTIAN HIEROGLYPH-13E38;Lo;0;L;;;;;N;;;;; +13E39;EGYPTIAN HIEROGLYPH-13E39;Lo;0;L;;;;;N;;;;; +13E3A;EGYPTIAN HIEROGLYPH-13E3A;Lo;0;L;;;;;N;;;;; +13E3B;EGYPTIAN HIEROGLYPH-13E3B;Lo;0;L;;;;;N;;;;; +13E3C;EGYPTIAN HIEROGLYPH-13E3C;Lo;0;L;;;;;N;;;;; +13E3D;EGYPTIAN HIEROGLYPH-13E3D;Lo;0;L;;;;;N;;;;; +13E3E;EGYPTIAN HIEROGLYPH-13E3E;Lo;0;L;;;;;N;;;;; +13E3F;EGYPTIAN HIEROGLYPH-13E3F;Lo;0;L;;;;;N;;;;; +13E40;EGYPTIAN HIEROGLYPH-13E40;Lo;0;L;;;;;N;;;;; +13E41;EGYPTIAN HIEROGLYPH-13E41;Lo;0;L;;;;;N;;;;; +13E42;EGYPTIAN HIEROGLYPH-13E42;Lo;0;L;;;;;N;;;;; +13E43;EGYPTIAN HIEROGLYPH-13E43;Lo;0;L;;;;;N;;;;; +13E44;EGYPTIAN HIEROGLYPH-13E44;Lo;0;L;;;;;N;;;;; +13E45;EGYPTIAN HIEROGLYPH-13E45;Lo;0;L;;;;;N;;;;; +13E46;EGYPTIAN HIEROGLYPH-13E46;Lo;0;L;;;;;N;;;;; +13E47;EGYPTIAN HIEROGLYPH-13E47;Lo;0;L;;;;;N;;;;; +13E48;EGYPTIAN HIEROGLYPH-13E48;Lo;0;L;;;;;N;;;;; +13E49;EGYPTIAN HIEROGLYPH-13E49;Lo;0;L;;;;;N;;;;; +13E4A;EGYPTIAN HIEROGLYPH-13E4A;Lo;0;L;;;;;N;;;;; +13E4B;EGYPTIAN HIEROGLYPH-13E4B;Lo;0;L;;;;;N;;;;; +13E4C;EGYPTIAN HIEROGLYPH-13E4C;Lo;0;L;;;;;N;;;;; +13E4D;EGYPTIAN HIEROGLYPH-13E4D;Lo;0;L;;;;;N;;;;; +13E4E;EGYPTIAN HIEROGLYPH-13E4E;Lo;0;L;;;;;N;;;;; +13E4F;EGYPTIAN HIEROGLYPH-13E4F;Lo;0;L;;;;;N;;;;; +13E50;EGYPTIAN HIEROGLYPH-13E50;Lo;0;L;;;;;N;;;;; +13E51;EGYPTIAN HIEROGLYPH-13E51;Lo;0;L;;;;;N;;;;; +13E52;EGYPTIAN HIEROGLYPH-13E52;Lo;0;L;;;;;N;;;;; +13E53;EGYPTIAN HIEROGLYPH-13E53;Lo;0;L;;;;;N;;;;; +13E54;EGYPTIAN HIEROGLYPH-13E54;Lo;0;L;;;;;N;;;;; +13E55;EGYPTIAN HIEROGLYPH-13E55;Lo;0;L;;;;;N;;;;; +13E56;EGYPTIAN HIEROGLYPH-13E56;Lo;0;L;;;;;N;;;;; +13E57;EGYPTIAN HIEROGLYPH-13E57;Lo;0;L;;;;;N;;;;; +13E58;EGYPTIAN HIEROGLYPH-13E58;Lo;0;L;;;;;N;;;;; +13E59;EGYPTIAN HIEROGLYPH-13E59;Lo;0;L;;;;;N;;;;; +13E5A;EGYPTIAN HIEROGLYPH-13E5A;Lo;0;L;;;;;N;;;;; +13E5B;EGYPTIAN HIEROGLYPH-13E5B;Lo;0;L;;;;;N;;;;; +13E5C;EGYPTIAN HIEROGLYPH-13E5C;Lo;0;L;;;;;N;;;;; +13E5D;EGYPTIAN HIEROGLYPH-13E5D;Lo;0;L;;;;;N;;;;; +13E5E;EGYPTIAN HIEROGLYPH-13E5E;Lo;0;L;;;;;N;;;;; +13E5F;EGYPTIAN HIEROGLYPH-13E5F;Lo;0;L;;;;;N;;;;; +13E60;EGYPTIAN HIEROGLYPH-13E60;Lo;0;L;;;;;N;;;;; +13E61;EGYPTIAN HIEROGLYPH-13E61;Lo;0;L;;;;;N;;;;; +13E62;EGYPTIAN HIEROGLYPH-13E62;Lo;0;L;;;;;N;;;;; +13E63;EGYPTIAN HIEROGLYPH-13E63;Lo;0;L;;;;;N;;;;; +13E64;EGYPTIAN HIEROGLYPH-13E64;Lo;0;L;;;;;N;;;;; +13E65;EGYPTIAN HIEROGLYPH-13E65;Lo;0;L;;;;;N;;;;; +13E66;EGYPTIAN HIEROGLYPH-13E66;Lo;0;L;;;;;N;;;;; +13E67;EGYPTIAN HIEROGLYPH-13E67;Lo;0;L;;;;;N;;;;; +13E68;EGYPTIAN HIEROGLYPH-13E68;Lo;0;L;;;;;N;;;;; +13E69;EGYPTIAN HIEROGLYPH-13E69;Lo;0;L;;;;;N;;;;; +13E6A;EGYPTIAN HIEROGLYPH-13E6A;Lo;0;L;;;;;N;;;;; +13E6B;EGYPTIAN HIEROGLYPH-13E6B;Lo;0;L;;;;;N;;;;; +13E6C;EGYPTIAN HIEROGLYPH-13E6C;Lo;0;L;;;;;N;;;;; +13E6D;EGYPTIAN HIEROGLYPH-13E6D;Lo;0;L;;;;;N;;;;; +13E6E;EGYPTIAN HIEROGLYPH-13E6E;Lo;0;L;;;;;N;;;;; +13E6F;EGYPTIAN HIEROGLYPH-13E6F;Lo;0;L;;;;;N;;;;; +13E70;EGYPTIAN HIEROGLYPH-13E70;Lo;0;L;;;;;N;;;;; +13E71;EGYPTIAN HIEROGLYPH-13E71;Lo;0;L;;;;;N;;;;; +13E72;EGYPTIAN HIEROGLYPH-13E72;Lo;0;L;;;;;N;;;;; +13E73;EGYPTIAN HIEROGLYPH-13E73;Lo;0;L;;;;;N;;;;; +13E74;EGYPTIAN HIEROGLYPH-13E74;Lo;0;L;;;;;N;;;;; +13E75;EGYPTIAN HIEROGLYPH-13E75;Lo;0;L;;;;;N;;;;; +13E76;EGYPTIAN HIEROGLYPH-13E76;Lo;0;L;;;;;N;;;;; +13E77;EGYPTIAN HIEROGLYPH-13E77;Lo;0;L;;;;;N;;;;; +13E78;EGYPTIAN HIEROGLYPH-13E78;Lo;0;L;;;;;N;;;;; +13E79;EGYPTIAN HIEROGLYPH-13E79;Lo;0;L;;;;;N;;;;; +13E7A;EGYPTIAN HIEROGLYPH-13E7A;Lo;0;L;;;;;N;;;;; +13E7B;EGYPTIAN HIEROGLYPH-13E7B;Lo;0;L;;;;;N;;;;; +13E7C;EGYPTIAN HIEROGLYPH-13E7C;Lo;0;L;;;;;N;;;;; +13E7D;EGYPTIAN HIEROGLYPH-13E7D;Lo;0;L;;;;;N;;;;; +13E7E;EGYPTIAN HIEROGLYPH-13E7E;Lo;0;L;;;;;N;;;;; +13E7F;EGYPTIAN HIEROGLYPH-13E7F;Lo;0;L;;;;;N;;;;; +13E80;EGYPTIAN HIEROGLYPH-13E80;Lo;0;L;;;;;N;;;;; +13E81;EGYPTIAN HIEROGLYPH-13E81;Lo;0;L;;;;;N;;;;; +13E82;EGYPTIAN HIEROGLYPH-13E82;Lo;0;L;;;;;N;;;;; +13E83;EGYPTIAN HIEROGLYPH-13E83;Lo;0;L;;;;;N;;;;; +13E84;EGYPTIAN HIEROGLYPH-13E84;Lo;0;L;;;;;N;;;;; +13E85;EGYPTIAN HIEROGLYPH-13E85;Lo;0;L;;;;;N;;;;; +13E86;EGYPTIAN HIEROGLYPH-13E86;Lo;0;L;;;;;N;;;;; +13E87;EGYPTIAN HIEROGLYPH-13E87;Lo;0;L;;;;;N;;;;; +13E88;EGYPTIAN HIEROGLYPH-13E88;Lo;0;L;;;;;N;;;;; +13E89;EGYPTIAN HIEROGLYPH-13E89;Lo;0;L;;;;;N;;;;; +13E8A;EGYPTIAN HIEROGLYPH-13E8A;Lo;0;L;;;;;N;;;;; +13E8B;EGYPTIAN HIEROGLYPH-13E8B;Lo;0;L;;;;;N;;;;; +13E8C;EGYPTIAN HIEROGLYPH-13E8C;Lo;0;L;;;;;N;;;;; +13E8D;EGYPTIAN HIEROGLYPH-13E8D;Lo;0;L;;;;;N;;;;; +13E8E;EGYPTIAN HIEROGLYPH-13E8E;Lo;0;L;;;;;N;;;;; +13E8F;EGYPTIAN HIEROGLYPH-13E8F;Lo;0;L;;;;;N;;;;; +13E90;EGYPTIAN HIEROGLYPH-13E90;Lo;0;L;;;;;N;;;;; +13E91;EGYPTIAN HIEROGLYPH-13E91;Lo;0;L;;;;;N;;;;; +13E92;EGYPTIAN HIEROGLYPH-13E92;Lo;0;L;;;;;N;;;;; +13E93;EGYPTIAN HIEROGLYPH-13E93;Lo;0;L;;;;;N;;;;; +13E94;EGYPTIAN HIEROGLYPH-13E94;Lo;0;L;;;;;N;;;;; +13E95;EGYPTIAN HIEROGLYPH-13E95;Lo;0;L;;;;;N;;;;; +13E96;EGYPTIAN HIEROGLYPH-13E96;Lo;0;L;;;;;N;;;;; +13E97;EGYPTIAN HIEROGLYPH-13E97;Lo;0;L;;;;;N;;;;; +13E98;EGYPTIAN HIEROGLYPH-13E98;Lo;0;L;;;;;N;;;;; +13E99;EGYPTIAN HIEROGLYPH-13E99;Lo;0;L;;;;;N;;;;; +13E9A;EGYPTIAN HIEROGLYPH-13E9A;Lo;0;L;;;;;N;;;;; +13E9B;EGYPTIAN HIEROGLYPH-13E9B;Lo;0;L;;;;;N;;;;; +13E9C;EGYPTIAN HIEROGLYPH-13E9C;Lo;0;L;;;;;N;;;;; +13E9D;EGYPTIAN HIEROGLYPH-13E9D;Lo;0;L;;;;;N;;;;; +13E9E;EGYPTIAN HIEROGLYPH-13E9E;Lo;0;L;;;;;N;;;;; +13E9F;EGYPTIAN HIEROGLYPH-13E9F;Lo;0;L;;;;;N;;;;; +13EA0;EGYPTIAN HIEROGLYPH-13EA0;Lo;0;L;;;;;N;;;;; +13EA1;EGYPTIAN HIEROGLYPH-13EA1;Lo;0;L;;;;;N;;;;; +13EA2;EGYPTIAN HIEROGLYPH-13EA2;Lo;0;L;;;;;N;;;;; +13EA3;EGYPTIAN HIEROGLYPH-13EA3;Lo;0;L;;;;;N;;;;; +13EA4;EGYPTIAN HIEROGLYPH-13EA4;Lo;0;L;;;;;N;;;;; +13EA5;EGYPTIAN HIEROGLYPH-13EA5;Lo;0;L;;;;;N;;;;; +13EA6;EGYPTIAN HIEROGLYPH-13EA6;Lo;0;L;;;;;N;;;;; +13EA7;EGYPTIAN HIEROGLYPH-13EA7;Lo;0;L;;;;;N;;;;; +13EA8;EGYPTIAN HIEROGLYPH-13EA8;Lo;0;L;;;;;N;;;;; +13EA9;EGYPTIAN HIEROGLYPH-13EA9;Lo;0;L;;;;;N;;;;; +13EAA;EGYPTIAN HIEROGLYPH-13EAA;Lo;0;L;;;;;N;;;;; +13EAB;EGYPTIAN HIEROGLYPH-13EAB;Lo;0;L;;;;;N;;;;; +13EAC;EGYPTIAN HIEROGLYPH-13EAC;Lo;0;L;;;;;N;;;;; +13EAD;EGYPTIAN HIEROGLYPH-13EAD;Lo;0;L;;;;;N;;;;; +13EAE;EGYPTIAN HIEROGLYPH-13EAE;Lo;0;L;;;;;N;;;;; +13EAF;EGYPTIAN HIEROGLYPH-13EAF;Lo;0;L;;;;;N;;;;; +13EB0;EGYPTIAN HIEROGLYPH-13EB0;Lo;0;L;;;;;N;;;;; +13EB1;EGYPTIAN HIEROGLYPH-13EB1;Lo;0;L;;;;;N;;;;; +13EB2;EGYPTIAN HIEROGLYPH-13EB2;Lo;0;L;;;;;N;;;;; +13EB3;EGYPTIAN HIEROGLYPH-13EB3;Lo;0;L;;;;;N;;;;; +13EB4;EGYPTIAN HIEROGLYPH-13EB4;Lo;0;L;;;;;N;;;;; +13EB5;EGYPTIAN HIEROGLYPH-13EB5;Lo;0;L;;;;;N;;;;; +13EB6;EGYPTIAN HIEROGLYPH-13EB6;Lo;0;L;;;;;N;;;;; +13EB7;EGYPTIAN HIEROGLYPH-13EB7;Lo;0;L;;;;;N;;;;; +13EB8;EGYPTIAN HIEROGLYPH-13EB8;Lo;0;L;;;;;N;;;;; +13EB9;EGYPTIAN HIEROGLYPH-13EB9;Lo;0;L;;;;;N;;;;; +13EBA;EGYPTIAN HIEROGLYPH-13EBA;Lo;0;L;;;;;N;;;;; +13EBB;EGYPTIAN HIEROGLYPH-13EBB;Lo;0;L;;;;;N;;;;; +13EBC;EGYPTIAN HIEROGLYPH-13EBC;Lo;0;L;;;;;N;;;;; +13EBD;EGYPTIAN HIEROGLYPH-13EBD;Lo;0;L;;;;;N;;;;; +13EBE;EGYPTIAN HIEROGLYPH-13EBE;Lo;0;L;;;;;N;;;;; +13EBF;EGYPTIAN HIEROGLYPH-13EBF;Lo;0;L;;;;;N;;;;; +13EC0;EGYPTIAN HIEROGLYPH-13EC0;Lo;0;L;;;;;N;;;;; +13EC1;EGYPTIAN HIEROGLYPH-13EC1;Lo;0;L;;;;;N;;;;; +13EC2;EGYPTIAN HIEROGLYPH-13EC2;Lo;0;L;;;;;N;;;;; +13EC3;EGYPTIAN HIEROGLYPH-13EC3;Lo;0;L;;;;;N;;;;; +13EC4;EGYPTIAN HIEROGLYPH-13EC4;Lo;0;L;;;;;N;;;;; +13EC5;EGYPTIAN HIEROGLYPH-13EC5;Lo;0;L;;;;;N;;;;; +13EC6;EGYPTIAN HIEROGLYPH-13EC6;Lo;0;L;;;;;N;;;;; +13EC7;EGYPTIAN HIEROGLYPH-13EC7;Lo;0;L;;;;;N;;;;; +13EC8;EGYPTIAN HIEROGLYPH-13EC8;Lo;0;L;;;;;N;;;;; +13EC9;EGYPTIAN HIEROGLYPH-13EC9;Lo;0;L;;;;;N;;;;; +13ECA;EGYPTIAN HIEROGLYPH-13ECA;Lo;0;L;;;;;N;;;;; +13ECB;EGYPTIAN HIEROGLYPH-13ECB;Lo;0;L;;;;;N;;;;; +13ECC;EGYPTIAN HIEROGLYPH-13ECC;Lo;0;L;;;;;N;;;;; +13ECD;EGYPTIAN HIEROGLYPH-13ECD;Lo;0;L;;;;;N;;;;; +13ECE;EGYPTIAN HIEROGLYPH-13ECE;Lo;0;L;;;;;N;;;;; +13ECF;EGYPTIAN HIEROGLYPH-13ECF;Lo;0;L;;;;;N;;;;; +13ED0;EGYPTIAN HIEROGLYPH-13ED0;Lo;0;L;;;;;N;;;;; +13ED1;EGYPTIAN HIEROGLYPH-13ED1;Lo;0;L;;;;;N;;;;; +13ED2;EGYPTIAN HIEROGLYPH-13ED2;Lo;0;L;;;;;N;;;;; +13ED3;EGYPTIAN HIEROGLYPH-13ED3;Lo;0;L;;;;;N;;;;; +13ED4;EGYPTIAN HIEROGLYPH-13ED4;Lo;0;L;;;;;N;;;;; +13ED5;EGYPTIAN HIEROGLYPH-13ED5;Lo;0;L;;;;;N;;;;; +13ED6;EGYPTIAN HIEROGLYPH-13ED6;Lo;0;L;;;;;N;;;;; +13ED7;EGYPTIAN HIEROGLYPH-13ED7;Lo;0;L;;;;;N;;;;; +13ED8;EGYPTIAN HIEROGLYPH-13ED8;Lo;0;L;;;;;N;;;;; +13ED9;EGYPTIAN HIEROGLYPH-13ED9;Lo;0;L;;;;;N;;;;; +13EDA;EGYPTIAN HIEROGLYPH-13EDA;Lo;0;L;;;;;N;;;;; +13EDB;EGYPTIAN HIEROGLYPH-13EDB;Lo;0;L;;;;;N;;;;; +13EDC;EGYPTIAN HIEROGLYPH-13EDC;Lo;0;L;;;;;N;;;;; +13EDD;EGYPTIAN HIEROGLYPH-13EDD;Lo;0;L;;;;;N;;;;; +13EDE;EGYPTIAN HIEROGLYPH-13EDE;Lo;0;L;;;;;N;;;;; +13EDF;EGYPTIAN HIEROGLYPH-13EDF;Lo;0;L;;;;;N;;;;; +13EE0;EGYPTIAN HIEROGLYPH-13EE0;Lo;0;L;;;;;N;;;;; +13EE1;EGYPTIAN HIEROGLYPH-13EE1;Lo;0;L;;;;;N;;;;; +13EE2;EGYPTIAN HIEROGLYPH-13EE2;Lo;0;L;;;;;N;;;;; +13EE3;EGYPTIAN HIEROGLYPH-13EE3;Lo;0;L;;;;;N;;;;; +13EE4;EGYPTIAN HIEROGLYPH-13EE4;Lo;0;L;;;;;N;;;;; +13EE5;EGYPTIAN HIEROGLYPH-13EE5;Lo;0;L;;;;;N;;;;; +13EE6;EGYPTIAN HIEROGLYPH-13EE6;Lo;0;L;;;;;N;;;;; +13EE7;EGYPTIAN HIEROGLYPH-13EE7;Lo;0;L;;;;;N;;;;; +13EE8;EGYPTIAN HIEROGLYPH-13EE8;Lo;0;L;;;;;N;;;;; +13EE9;EGYPTIAN HIEROGLYPH-13EE9;Lo;0;L;;;;;N;;;;; +13EEA;EGYPTIAN HIEROGLYPH-13EEA;Lo;0;L;;;;;N;;;;; +13EEB;EGYPTIAN HIEROGLYPH-13EEB;Lo;0;L;;;;;N;;;;; +13EEC;EGYPTIAN HIEROGLYPH-13EEC;Lo;0;L;;;;;N;;;;; +13EED;EGYPTIAN HIEROGLYPH-13EED;Lo;0;L;;;;;N;;;;; +13EEE;EGYPTIAN HIEROGLYPH-13EEE;Lo;0;L;;;;;N;;;;; +13EEF;EGYPTIAN HIEROGLYPH-13EEF;Lo;0;L;;;;;N;;;;; +13EF0;EGYPTIAN HIEROGLYPH-13EF0;Lo;0;L;;;;;N;;;;; +13EF1;EGYPTIAN HIEROGLYPH-13EF1;Lo;0;L;;;;;N;;;;; +13EF2;EGYPTIAN HIEROGLYPH-13EF2;Lo;0;L;;;;;N;;;;; +13EF3;EGYPTIAN HIEROGLYPH-13EF3;Lo;0;L;;;;;N;;;;; +13EF4;EGYPTIAN HIEROGLYPH-13EF4;Lo;0;L;;;;;N;;;;; +13EF5;EGYPTIAN HIEROGLYPH-13EF5;Lo;0;L;;;;;N;;;;; +13EF6;EGYPTIAN HIEROGLYPH-13EF6;Lo;0;L;;;;;N;;;;; +13EF7;EGYPTIAN HIEROGLYPH-13EF7;Lo;0;L;;;;;N;;;;; +13EF8;EGYPTIAN HIEROGLYPH-13EF8;Lo;0;L;;;;;N;;;;; +13EF9;EGYPTIAN HIEROGLYPH-13EF9;Lo;0;L;;;;;N;;;;; +13EFA;EGYPTIAN HIEROGLYPH-13EFA;Lo;0;L;;;;;N;;;;; +13EFB;EGYPTIAN HIEROGLYPH-13EFB;Lo;0;L;;;;;N;;;;; +13EFC;EGYPTIAN HIEROGLYPH-13EFC;Lo;0;L;;;;;N;;;;; +13EFD;EGYPTIAN HIEROGLYPH-13EFD;Lo;0;L;;;;;N;;;;; +13EFE;EGYPTIAN HIEROGLYPH-13EFE;Lo;0;L;;;;;N;;;;; +13EFF;EGYPTIAN HIEROGLYPH-13EFF;Lo;0;L;;;;;N;;;;; +13F00;EGYPTIAN HIEROGLYPH-13F00;Lo;0;L;;;;;N;;;;; +13F01;EGYPTIAN HIEROGLYPH-13F01;Lo;0;L;;;;;N;;;;; +13F02;EGYPTIAN HIEROGLYPH-13F02;Lo;0;L;;;;;N;;;;; +13F03;EGYPTIAN HIEROGLYPH-13F03;Lo;0;L;;;;;N;;;;; +13F04;EGYPTIAN HIEROGLYPH-13F04;Lo;0;L;;;;;N;;;;; +13F05;EGYPTIAN HIEROGLYPH-13F05;Lo;0;L;;;;;N;;;;; +13F06;EGYPTIAN HIEROGLYPH-13F06;Lo;0;L;;;;;N;;;;; +13F07;EGYPTIAN HIEROGLYPH-13F07;Lo;0;L;;;;;N;;;;; +13F08;EGYPTIAN HIEROGLYPH-13F08;Lo;0;L;;;;;N;;;;; +13F09;EGYPTIAN HIEROGLYPH-13F09;Lo;0;L;;;;;N;;;;; +13F0A;EGYPTIAN HIEROGLYPH-13F0A;Lo;0;L;;;;;N;;;;; +13F0B;EGYPTIAN HIEROGLYPH-13F0B;Lo;0;L;;;;;N;;;;; +13F0C;EGYPTIAN HIEROGLYPH-13F0C;Lo;0;L;;;;;N;;;;; +13F0D;EGYPTIAN HIEROGLYPH-13F0D;Lo;0;L;;;;;N;;;;; +13F0E;EGYPTIAN HIEROGLYPH-13F0E;Lo;0;L;;;;;N;;;;; +13F0F;EGYPTIAN HIEROGLYPH-13F0F;Lo;0;L;;;;;N;;;;; +13F10;EGYPTIAN HIEROGLYPH-13F10;Lo;0;L;;;;;N;;;;; +13F11;EGYPTIAN HIEROGLYPH-13F11;Lo;0;L;;;;;N;;;;; +13F12;EGYPTIAN HIEROGLYPH-13F12;Lo;0;L;;;;;N;;;;; +13F13;EGYPTIAN HIEROGLYPH-13F13;Lo;0;L;;;;;N;;;;; +13F14;EGYPTIAN HIEROGLYPH-13F14;Lo;0;L;;;;;N;;;;; +13F15;EGYPTIAN HIEROGLYPH-13F15;Lo;0;L;;;;;N;;;;; +13F16;EGYPTIAN HIEROGLYPH-13F16;Lo;0;L;;;;;N;;;;; +13F17;EGYPTIAN HIEROGLYPH-13F17;Lo;0;L;;;;;N;;;;; +13F18;EGYPTIAN HIEROGLYPH-13F18;Lo;0;L;;;;;N;;;;; +13F19;EGYPTIAN HIEROGLYPH-13F19;Lo;0;L;;;;;N;;;;; +13F1A;EGYPTIAN HIEROGLYPH-13F1A;Lo;0;L;;;;;N;;;;; +13F1B;EGYPTIAN HIEROGLYPH-13F1B;Lo;0;L;;;;;N;;;;; +13F1C;EGYPTIAN HIEROGLYPH-13F1C;Lo;0;L;;;;;N;;;;; +13F1D;EGYPTIAN HIEROGLYPH-13F1D;Lo;0;L;;;;;N;;;;; +13F1E;EGYPTIAN HIEROGLYPH-13F1E;Lo;0;L;;;;;N;;;;; +13F1F;EGYPTIAN HIEROGLYPH-13F1F;Lo;0;L;;;;;N;;;;; +13F20;EGYPTIAN HIEROGLYPH-13F20;Lo;0;L;;;;;N;;;;; +13F21;EGYPTIAN HIEROGLYPH-13F21;Lo;0;L;;;;;N;;;;; +13F22;EGYPTIAN HIEROGLYPH-13F22;Lo;0;L;;;;;N;;;;; +13F23;EGYPTIAN HIEROGLYPH-13F23;Lo;0;L;;;;;N;;;;; +13F24;EGYPTIAN HIEROGLYPH-13F24;Lo;0;L;;;;;N;;;;; +13F25;EGYPTIAN HIEROGLYPH-13F25;Lo;0;L;;;;;N;;;;; +13F26;EGYPTIAN HIEROGLYPH-13F26;Lo;0;L;;;;;N;;;;; +13F27;EGYPTIAN HIEROGLYPH-13F27;Lo;0;L;;;;;N;;;;; +13F28;EGYPTIAN HIEROGLYPH-13F28;Lo;0;L;;;;;N;;;;; +13F29;EGYPTIAN HIEROGLYPH-13F29;Lo;0;L;;;;;N;;;;; +13F2A;EGYPTIAN HIEROGLYPH-13F2A;Lo;0;L;;;;;N;;;;; +13F2B;EGYPTIAN HIEROGLYPH-13F2B;Lo;0;L;;;;;N;;;;; +13F2C;EGYPTIAN HIEROGLYPH-13F2C;Lo;0;L;;;;;N;;;;; +13F2D;EGYPTIAN HIEROGLYPH-13F2D;Lo;0;L;;;;;N;;;;; +13F2E;EGYPTIAN HIEROGLYPH-13F2E;Lo;0;L;;;;;N;;;;; +13F2F;EGYPTIAN HIEROGLYPH-13F2F;Lo;0;L;;;;;N;;;;; +13F30;EGYPTIAN HIEROGLYPH-13F30;Lo;0;L;;;;;N;;;;; +13F31;EGYPTIAN HIEROGLYPH-13F31;Lo;0;L;;;;;N;;;;; +13F32;EGYPTIAN HIEROGLYPH-13F32;Lo;0;L;;;;;N;;;;; +13F33;EGYPTIAN HIEROGLYPH-13F33;Lo;0;L;;;;;N;;;;; +13F34;EGYPTIAN HIEROGLYPH-13F34;Lo;0;L;;;;;N;;;;; +13F35;EGYPTIAN HIEROGLYPH-13F35;Lo;0;L;;;;;N;;;;; +13F36;EGYPTIAN HIEROGLYPH-13F36;Lo;0;L;;;;;N;;;;; +13F37;EGYPTIAN HIEROGLYPH-13F37;Lo;0;L;;;;;N;;;;; +13F38;EGYPTIAN HIEROGLYPH-13F38;Lo;0;L;;;;;N;;;;; +13F39;EGYPTIAN HIEROGLYPH-13F39;Lo;0;L;;;;;N;;;;; +13F3A;EGYPTIAN HIEROGLYPH-13F3A;Lo;0;L;;;;;N;;;;; +13F3B;EGYPTIAN HIEROGLYPH-13F3B;Lo;0;L;;;;;N;;;;; +13F3C;EGYPTIAN HIEROGLYPH-13F3C;Lo;0;L;;;;;N;;;;; +13F3D;EGYPTIAN HIEROGLYPH-13F3D;Lo;0;L;;;;;N;;;;; +13F3E;EGYPTIAN HIEROGLYPH-13F3E;Lo;0;L;;;;;N;;;;; +13F3F;EGYPTIAN HIEROGLYPH-13F3F;Lo;0;L;;;;;N;;;;; +13F40;EGYPTIAN HIEROGLYPH-13F40;Lo;0;L;;;;;N;;;;; +13F41;EGYPTIAN HIEROGLYPH-13F41;Lo;0;L;;;;;N;;;;; +13F42;EGYPTIAN HIEROGLYPH-13F42;Lo;0;L;;;;;N;;;;; +13F43;EGYPTIAN HIEROGLYPH-13F43;Lo;0;L;;;;;N;;;;; +13F44;EGYPTIAN HIEROGLYPH-13F44;Lo;0;L;;;;;N;;;;; +13F45;EGYPTIAN HIEROGLYPH-13F45;Lo;0;L;;;;;N;;;;; +13F46;EGYPTIAN HIEROGLYPH-13F46;Lo;0;L;;;;;N;;;;; +13F47;EGYPTIAN HIEROGLYPH-13F47;Lo;0;L;;;;;N;;;;; +13F48;EGYPTIAN HIEROGLYPH-13F48;Lo;0;L;;;;;N;;;;; +13F49;EGYPTIAN HIEROGLYPH-13F49;Lo;0;L;;;;;N;;;;; +13F4A;EGYPTIAN HIEROGLYPH-13F4A;Lo;0;L;;;;;N;;;;; +13F4B;EGYPTIAN HIEROGLYPH-13F4B;Lo;0;L;;;;;N;;;;; +13F4C;EGYPTIAN HIEROGLYPH-13F4C;Lo;0;L;;;;;N;;;;; +13F4D;EGYPTIAN HIEROGLYPH-13F4D;Lo;0;L;;;;;N;;;;; +13F4E;EGYPTIAN HIEROGLYPH-13F4E;Lo;0;L;;;;;N;;;;; +13F4F;EGYPTIAN HIEROGLYPH-13F4F;Lo;0;L;;;;;N;;;;; +13F50;EGYPTIAN HIEROGLYPH-13F50;Lo;0;L;;;;;N;;;;; +13F51;EGYPTIAN HIEROGLYPH-13F51;Lo;0;L;;;;;N;;;;; +13F52;EGYPTIAN HIEROGLYPH-13F52;Lo;0;L;;;;;N;;;;; +13F53;EGYPTIAN HIEROGLYPH-13F53;Lo;0;L;;;;;N;;;;; +13F54;EGYPTIAN HIEROGLYPH-13F54;Lo;0;L;;;;;N;;;;; +13F55;EGYPTIAN HIEROGLYPH-13F55;Lo;0;L;;;;;N;;;;; +13F56;EGYPTIAN HIEROGLYPH-13F56;Lo;0;L;;;;;N;;;;; +13F57;EGYPTIAN HIEROGLYPH-13F57;Lo;0;L;;;;;N;;;;; +13F58;EGYPTIAN HIEROGLYPH-13F58;Lo;0;L;;;;;N;;;;; +13F59;EGYPTIAN HIEROGLYPH-13F59;Lo;0;L;;;;;N;;;;; +13F5A;EGYPTIAN HIEROGLYPH-13F5A;Lo;0;L;;;;;N;;;;; +13F5B;EGYPTIAN HIEROGLYPH-13F5B;Lo;0;L;;;;;N;;;;; +13F5C;EGYPTIAN HIEROGLYPH-13F5C;Lo;0;L;;;;;N;;;;; +13F5D;EGYPTIAN HIEROGLYPH-13F5D;Lo;0;L;;;;;N;;;;; +13F5E;EGYPTIAN HIEROGLYPH-13F5E;Lo;0;L;;;;;N;;;;; +13F5F;EGYPTIAN HIEROGLYPH-13F5F;Lo;0;L;;;;;N;;;;; +13F60;EGYPTIAN HIEROGLYPH-13F60;Lo;0;L;;;;;N;;;;; +13F61;EGYPTIAN HIEROGLYPH-13F61;Lo;0;L;;;;;N;;;;; +13F62;EGYPTIAN HIEROGLYPH-13F62;Lo;0;L;;;;;N;;;;; +13F63;EGYPTIAN HIEROGLYPH-13F63;Lo;0;L;;;;;N;;;;; +13F64;EGYPTIAN HIEROGLYPH-13F64;Lo;0;L;;;;;N;;;;; +13F65;EGYPTIAN HIEROGLYPH-13F65;Lo;0;L;;;;;N;;;;; +13F66;EGYPTIAN HIEROGLYPH-13F66;Lo;0;L;;;;;N;;;;; +13F67;EGYPTIAN HIEROGLYPH-13F67;Lo;0;L;;;;;N;;;;; +13F68;EGYPTIAN HIEROGLYPH-13F68;Lo;0;L;;;;;N;;;;; +13F69;EGYPTIAN HIEROGLYPH-13F69;Lo;0;L;;;;;N;;;;; +13F6A;EGYPTIAN HIEROGLYPH-13F6A;Lo;0;L;;;;;N;;;;; +13F6B;EGYPTIAN HIEROGLYPH-13F6B;Lo;0;L;;;;;N;;;;; +13F6C;EGYPTIAN HIEROGLYPH-13F6C;Lo;0;L;;;;;N;;;;; +13F6D;EGYPTIAN HIEROGLYPH-13F6D;Lo;0;L;;;;;N;;;;; +13F6E;EGYPTIAN HIEROGLYPH-13F6E;Lo;0;L;;;;;N;;;;; +13F6F;EGYPTIAN HIEROGLYPH-13F6F;Lo;0;L;;;;;N;;;;; +13F70;EGYPTIAN HIEROGLYPH-13F70;Lo;0;L;;;;;N;;;;; +13F71;EGYPTIAN HIEROGLYPH-13F71;Lo;0;L;;;;;N;;;;; +13F72;EGYPTIAN HIEROGLYPH-13F72;Lo;0;L;;;;;N;;;;; +13F73;EGYPTIAN HIEROGLYPH-13F73;Lo;0;L;;;;;N;;;;; +13F74;EGYPTIAN HIEROGLYPH-13F74;Lo;0;L;;;;;N;;;;; +13F75;EGYPTIAN HIEROGLYPH-13F75;Lo;0;L;;;;;N;;;;; +13F76;EGYPTIAN HIEROGLYPH-13F76;Lo;0;L;;;;;N;;;;; +13F77;EGYPTIAN HIEROGLYPH-13F77;Lo;0;L;;;;;N;;;;; +13F78;EGYPTIAN HIEROGLYPH-13F78;Lo;0;L;;;;;N;;;;; +13F79;EGYPTIAN HIEROGLYPH-13F79;Lo;0;L;;;;;N;;;;; +13F7A;EGYPTIAN HIEROGLYPH-13F7A;Lo;0;L;;;;;N;;;;; +13F7B;EGYPTIAN HIEROGLYPH-13F7B;Lo;0;L;;;;;N;;;;; +13F7C;EGYPTIAN HIEROGLYPH-13F7C;Lo;0;L;;;;;N;;;;; +13F7D;EGYPTIAN HIEROGLYPH-13F7D;Lo;0;L;;;;;N;;;;; +13F7E;EGYPTIAN HIEROGLYPH-13F7E;Lo;0;L;;;;;N;;;;; +13F7F;EGYPTIAN HIEROGLYPH-13F7F;Lo;0;L;;;;;N;;;;; +13F80;EGYPTIAN HIEROGLYPH-13F80;Lo;0;L;;;;;N;;;;; +13F81;EGYPTIAN HIEROGLYPH-13F81;Lo;0;L;;;;;N;;;;; +13F82;EGYPTIAN HIEROGLYPH-13F82;Lo;0;L;;;;;N;;;;; +13F83;EGYPTIAN HIEROGLYPH-13F83;Lo;0;L;;;;;N;;;;; +13F84;EGYPTIAN HIEROGLYPH-13F84;Lo;0;L;;;;;N;;;;; +13F85;EGYPTIAN HIEROGLYPH-13F85;Lo;0;L;;;;;N;;;;; +13F86;EGYPTIAN HIEROGLYPH-13F86;Lo;0;L;;;;;N;;;;; +13F87;EGYPTIAN HIEROGLYPH-13F87;Lo;0;L;;;;;N;;;;; +13F88;EGYPTIAN HIEROGLYPH-13F88;Lo;0;L;;;;;N;;;;; +13F89;EGYPTIAN HIEROGLYPH-13F89;Lo;0;L;;;;;N;;;;; +13F8A;EGYPTIAN HIEROGLYPH-13F8A;Lo;0;L;;;;;N;;;;; +13F8B;EGYPTIAN HIEROGLYPH-13F8B;Lo;0;L;;;;;N;;;;; +13F8C;EGYPTIAN HIEROGLYPH-13F8C;Lo;0;L;;;;;N;;;;; +13F8D;EGYPTIAN HIEROGLYPH-13F8D;Lo;0;L;;;;;N;;;;; +13F8E;EGYPTIAN HIEROGLYPH-13F8E;Lo;0;L;;;;;N;;;;; +13F8F;EGYPTIAN HIEROGLYPH-13F8F;Lo;0;L;;;;;N;;;;; +13F90;EGYPTIAN HIEROGLYPH-13F90;Lo;0;L;;;;;N;;;;; +13F91;EGYPTIAN HIEROGLYPH-13F91;Lo;0;L;;;;;N;;;;; +13F92;EGYPTIAN HIEROGLYPH-13F92;Lo;0;L;;;;;N;;;;; +13F93;EGYPTIAN HIEROGLYPH-13F93;Lo;0;L;;;;;N;;;;; +13F94;EGYPTIAN HIEROGLYPH-13F94;Lo;0;L;;;;;N;;;;; +13F95;EGYPTIAN HIEROGLYPH-13F95;Lo;0;L;;;;;N;;;;; +13F96;EGYPTIAN HIEROGLYPH-13F96;Lo;0;L;;;;;N;;;;; +13F97;EGYPTIAN HIEROGLYPH-13F97;Lo;0;L;;;;;N;;;;; +13F98;EGYPTIAN HIEROGLYPH-13F98;Lo;0;L;;;;;N;;;;; +13F99;EGYPTIAN HIEROGLYPH-13F99;Lo;0;L;;;;;N;;;;; +13F9A;EGYPTIAN HIEROGLYPH-13F9A;Lo;0;L;;;;;N;;;;; +13F9B;EGYPTIAN HIEROGLYPH-13F9B;Lo;0;L;;;;;N;;;;; +13F9C;EGYPTIAN HIEROGLYPH-13F9C;Lo;0;L;;;;;N;;;;; +13F9D;EGYPTIAN HIEROGLYPH-13F9D;Lo;0;L;;;;;N;;;;; +13F9E;EGYPTIAN HIEROGLYPH-13F9E;Lo;0;L;;;;;N;;;;; +13F9F;EGYPTIAN HIEROGLYPH-13F9F;Lo;0;L;;;;;N;;;;; +13FA0;EGYPTIAN HIEROGLYPH-13FA0;Lo;0;L;;;;;N;;;;; +13FA1;EGYPTIAN HIEROGLYPH-13FA1;Lo;0;L;;;;;N;;;;; +13FA2;EGYPTIAN HIEROGLYPH-13FA2;Lo;0;L;;;;;N;;;;; +13FA3;EGYPTIAN HIEROGLYPH-13FA3;Lo;0;L;;;;;N;;;;; +13FA4;EGYPTIAN HIEROGLYPH-13FA4;Lo;0;L;;;;;N;;;;; +13FA5;EGYPTIAN HIEROGLYPH-13FA5;Lo;0;L;;;;;N;;;;; +13FA6;EGYPTIAN HIEROGLYPH-13FA6;Lo;0;L;;;;;N;;;;; +13FA7;EGYPTIAN HIEROGLYPH-13FA7;Lo;0;L;;;;;N;;;;; +13FA8;EGYPTIAN HIEROGLYPH-13FA8;Lo;0;L;;;;;N;;;;; +13FA9;EGYPTIAN HIEROGLYPH-13FA9;Lo;0;L;;;;;N;;;;; +13FAA;EGYPTIAN HIEROGLYPH-13FAA;Lo;0;L;;;;;N;;;;; +13FAB;EGYPTIAN HIEROGLYPH-13FAB;Lo;0;L;;;;;N;;;;; +13FAC;EGYPTIAN HIEROGLYPH-13FAC;Lo;0;L;;;;;N;;;;; +13FAD;EGYPTIAN HIEROGLYPH-13FAD;Lo;0;L;;;;;N;;;;; +13FAE;EGYPTIAN HIEROGLYPH-13FAE;Lo;0;L;;;;;N;;;;; +13FAF;EGYPTIAN HIEROGLYPH-13FAF;Lo;0;L;;;;;N;;;;; +13FB0;EGYPTIAN HIEROGLYPH-13FB0;Lo;0;L;;;;;N;;;;; +13FB1;EGYPTIAN HIEROGLYPH-13FB1;Lo;0;L;;;;;N;;;;; +13FB2;EGYPTIAN HIEROGLYPH-13FB2;Lo;0;L;;;;;N;;;;; +13FB3;EGYPTIAN HIEROGLYPH-13FB3;Lo;0;L;;;;;N;;;;; +13FB4;EGYPTIAN HIEROGLYPH-13FB4;Lo;0;L;;;;;N;;;;; +13FB5;EGYPTIAN HIEROGLYPH-13FB5;Lo;0;L;;;;;N;;;;; +13FB6;EGYPTIAN HIEROGLYPH-13FB6;Lo;0;L;;;;;N;;;;; +13FB7;EGYPTIAN HIEROGLYPH-13FB7;Lo;0;L;;;;;N;;;;; +13FB8;EGYPTIAN HIEROGLYPH-13FB8;Lo;0;L;;;;;N;;;;; +13FB9;EGYPTIAN HIEROGLYPH-13FB9;Lo;0;L;;;;;N;;;;; +13FBA;EGYPTIAN HIEROGLYPH-13FBA;Lo;0;L;;;;;N;;;;; +13FBB;EGYPTIAN HIEROGLYPH-13FBB;Lo;0;L;;;;;N;;;;; +13FBC;EGYPTIAN HIEROGLYPH-13FBC;Lo;0;L;;;;;N;;;;; +13FBD;EGYPTIAN HIEROGLYPH-13FBD;Lo;0;L;;;;;N;;;;; +13FBE;EGYPTIAN HIEROGLYPH-13FBE;Lo;0;L;;;;;N;;;;; +13FBF;EGYPTIAN HIEROGLYPH-13FBF;Lo;0;L;;;;;N;;;;; +13FC0;EGYPTIAN HIEROGLYPH-13FC0;Lo;0;L;;;;;N;;;;; +13FC1;EGYPTIAN HIEROGLYPH-13FC1;Lo;0;L;;;;;N;;;;; +13FC2;EGYPTIAN HIEROGLYPH-13FC2;Lo;0;L;;;;;N;;;;; +13FC3;EGYPTIAN HIEROGLYPH-13FC3;Lo;0;L;;;;;N;;;;; +13FC4;EGYPTIAN HIEROGLYPH-13FC4;Lo;0;L;;;;;N;;;;; +13FC5;EGYPTIAN HIEROGLYPH-13FC5;Lo;0;L;;;;;N;;;;; +13FC6;EGYPTIAN HIEROGLYPH-13FC6;Lo;0;L;;;;;N;;;;; +13FC7;EGYPTIAN HIEROGLYPH-13FC7;Lo;0;L;;;;;N;;;;; +13FC8;EGYPTIAN HIEROGLYPH-13FC8;Lo;0;L;;;;;N;;;;; +13FC9;EGYPTIAN HIEROGLYPH-13FC9;Lo;0;L;;;;;N;;;;; +13FCA;EGYPTIAN HIEROGLYPH-13FCA;Lo;0;L;;;;;N;;;;; +13FCB;EGYPTIAN HIEROGLYPH-13FCB;Lo;0;L;;;;;N;;;;; +13FCC;EGYPTIAN HIEROGLYPH-13FCC;Lo;0;L;;;;;N;;;;; +13FCD;EGYPTIAN HIEROGLYPH-13FCD;Lo;0;L;;;;;N;;;;; +13FCE;EGYPTIAN HIEROGLYPH-13FCE;Lo;0;L;;;;;N;;;;; +13FCF;EGYPTIAN HIEROGLYPH-13FCF;Lo;0;L;;;;;N;;;;; +13FD0;EGYPTIAN HIEROGLYPH-13FD0;Lo;0;L;;;;;N;;;;; +13FD1;EGYPTIAN HIEROGLYPH-13FD1;Lo;0;L;;;;;N;;;;; +13FD2;EGYPTIAN HIEROGLYPH-13FD2;Lo;0;L;;;;;N;;;;; +13FD3;EGYPTIAN HIEROGLYPH-13FD3;Lo;0;L;;;;;N;;;;; +13FD4;EGYPTIAN HIEROGLYPH-13FD4;Lo;0;L;;;;;N;;;;; +13FD5;EGYPTIAN HIEROGLYPH-13FD5;Lo;0;L;;;;;N;;;;; +13FD6;EGYPTIAN HIEROGLYPH-13FD6;Lo;0;L;;;;;N;;;;; +13FD7;EGYPTIAN HIEROGLYPH-13FD7;Lo;0;L;;;;;N;;;;; +13FD8;EGYPTIAN HIEROGLYPH-13FD8;Lo;0;L;;;;;N;;;;; +13FD9;EGYPTIAN HIEROGLYPH-13FD9;Lo;0;L;;;;;N;;;;; +13FDA;EGYPTIAN HIEROGLYPH-13FDA;Lo;0;L;;;;;N;;;;; +13FDB;EGYPTIAN HIEROGLYPH-13FDB;Lo;0;L;;;;;N;;;;; +13FDC;EGYPTIAN HIEROGLYPH-13FDC;Lo;0;L;;;;;N;;;;; +13FDD;EGYPTIAN HIEROGLYPH-13FDD;Lo;0;L;;;;;N;;;;; +13FDE;EGYPTIAN HIEROGLYPH-13FDE;Lo;0;L;;;;;N;;;;; +13FDF;EGYPTIAN HIEROGLYPH-13FDF;Lo;0;L;;;;;N;;;;; +13FE0;EGYPTIAN HIEROGLYPH-13FE0;Lo;0;L;;;;;N;;;;; +13FE1;EGYPTIAN HIEROGLYPH-13FE1;Lo;0;L;;;;;N;;;;; +13FE2;EGYPTIAN HIEROGLYPH-13FE2;Lo;0;L;;;;;N;;;;; +13FE3;EGYPTIAN HIEROGLYPH-13FE3;Lo;0;L;;;;;N;;;;; +13FE4;EGYPTIAN HIEROGLYPH-13FE4;Lo;0;L;;;;;N;;;;; +13FE5;EGYPTIAN HIEROGLYPH-13FE5;Lo;0;L;;;;;N;;;;; +13FE6;EGYPTIAN HIEROGLYPH-13FE6;Lo;0;L;;;;;N;;;;; +13FE7;EGYPTIAN HIEROGLYPH-13FE7;Lo;0;L;;;;;N;;;;; +13FE8;EGYPTIAN HIEROGLYPH-13FE8;Lo;0;L;;;;;N;;;;; +13FE9;EGYPTIAN HIEROGLYPH-13FE9;Lo;0;L;;;;;N;;;;; +13FEA;EGYPTIAN HIEROGLYPH-13FEA;Lo;0;L;;;;;N;;;;; +13FEB;EGYPTIAN HIEROGLYPH-13FEB;Lo;0;L;;;;;N;;;;; +13FEC;EGYPTIAN HIEROGLYPH-13FEC;Lo;0;L;;;;;N;;;;; +13FED;EGYPTIAN HIEROGLYPH-13FED;Lo;0;L;;;;;N;;;;; +13FEE;EGYPTIAN HIEROGLYPH-13FEE;Lo;0;L;;;;;N;;;;; +13FEF;EGYPTIAN HIEROGLYPH-13FEF;Lo;0;L;;;;;N;;;;; +13FF0;EGYPTIAN HIEROGLYPH-13FF0;Lo;0;L;;;;;N;;;;; +13FF1;EGYPTIAN HIEROGLYPH-13FF1;Lo;0;L;;;;;N;;;;; +13FF2;EGYPTIAN HIEROGLYPH-13FF2;Lo;0;L;;;;;N;;;;; +13FF3;EGYPTIAN HIEROGLYPH-13FF3;Lo;0;L;;;;;N;;;;; +13FF4;EGYPTIAN HIEROGLYPH-13FF4;Lo;0;L;;;;;N;;;;; +13FF5;EGYPTIAN HIEROGLYPH-13FF5;Lo;0;L;;;;;N;;;;; +13FF6;EGYPTIAN HIEROGLYPH-13FF6;Lo;0;L;;;;;N;;;;; +13FF7;EGYPTIAN HIEROGLYPH-13FF7;Lo;0;L;;;;;N;;;;; +13FF8;EGYPTIAN HIEROGLYPH-13FF8;Lo;0;L;;;;;N;;;;; +13FF9;EGYPTIAN HIEROGLYPH-13FF9;Lo;0;L;;;;;N;;;;; +13FFA;EGYPTIAN HIEROGLYPH-13FFA;Lo;0;L;;;;;N;;;;; +13FFB;EGYPTIAN HIEROGLYPH-13FFB;Lo;0;L;;;;;N;;;;; +13FFC;EGYPTIAN HIEROGLYPH-13FFC;Lo;0;L;;;;;N;;;;; +13FFD;EGYPTIAN HIEROGLYPH-13FFD;Lo;0;L;;;;;N;;;;; +13FFE;EGYPTIAN HIEROGLYPH-13FFE;Lo;0;L;;;;;N;;;;; +13FFF;EGYPTIAN HIEROGLYPH-13FFF;Lo;0;L;;;;;N;;;;; +14000;EGYPTIAN HIEROGLYPH-14000;Lo;0;L;;;;;N;;;;; +14001;EGYPTIAN HIEROGLYPH-14001;Lo;0;L;;;;;N;;;;; +14002;EGYPTIAN HIEROGLYPH-14002;Lo;0;L;;;;;N;;;;; +14003;EGYPTIAN HIEROGLYPH-14003;Lo;0;L;;;;;N;;;;; +14004;EGYPTIAN HIEROGLYPH-14004;Lo;0;L;;;;;N;;;;; +14005;EGYPTIAN HIEROGLYPH-14005;Lo;0;L;;;;;N;;;;; +14006;EGYPTIAN HIEROGLYPH-14006;Lo;0;L;;;;;N;;;;; +14007;EGYPTIAN HIEROGLYPH-14007;Lo;0;L;;;;;N;;;;; +14008;EGYPTIAN HIEROGLYPH-14008;Lo;0;L;;;;;N;;;;; +14009;EGYPTIAN HIEROGLYPH-14009;Lo;0;L;;;;;N;;;;; +1400A;EGYPTIAN HIEROGLYPH-1400A;Lo;0;L;;;;;N;;;;; +1400B;EGYPTIAN HIEROGLYPH-1400B;Lo;0;L;;;;;N;;;;; +1400C;EGYPTIAN HIEROGLYPH-1400C;Lo;0;L;;;;;N;;;;; +1400D;EGYPTIAN HIEROGLYPH-1400D;Lo;0;L;;;;;N;;;;; +1400E;EGYPTIAN HIEROGLYPH-1400E;Lo;0;L;;;;;N;;;;; +1400F;EGYPTIAN HIEROGLYPH-1400F;Lo;0;L;;;;;N;;;;; +14010;EGYPTIAN HIEROGLYPH-14010;Lo;0;L;;;;;N;;;;; +14011;EGYPTIAN HIEROGLYPH-14011;Lo;0;L;;;;;N;;;;; +14012;EGYPTIAN HIEROGLYPH-14012;Lo;0;L;;;;;N;;;;; +14013;EGYPTIAN HIEROGLYPH-14013;Lo;0;L;;;;;N;;;;; +14014;EGYPTIAN HIEROGLYPH-14014;Lo;0;L;;;;;N;;;;; +14015;EGYPTIAN HIEROGLYPH-14015;Lo;0;L;;;;;N;;;;; +14016;EGYPTIAN HIEROGLYPH-14016;Lo;0;L;;;;;N;;;;; +14017;EGYPTIAN HIEROGLYPH-14017;Lo;0;L;;;;;N;;;;; +14018;EGYPTIAN HIEROGLYPH-14018;Lo;0;L;;;;;N;;;;; +14019;EGYPTIAN HIEROGLYPH-14019;Lo;0;L;;;;;N;;;;; +1401A;EGYPTIAN HIEROGLYPH-1401A;Lo;0;L;;;;;N;;;;; +1401B;EGYPTIAN HIEROGLYPH-1401B;Lo;0;L;;;;;N;;;;; +1401C;EGYPTIAN HIEROGLYPH-1401C;Lo;0;L;;;;;N;;;;; +1401D;EGYPTIAN HIEROGLYPH-1401D;Lo;0;L;;;;;N;;;;; +1401E;EGYPTIAN HIEROGLYPH-1401E;Lo;0;L;;;;;N;;;;; +1401F;EGYPTIAN HIEROGLYPH-1401F;Lo;0;L;;;;;N;;;;; +14020;EGYPTIAN HIEROGLYPH-14020;Lo;0;L;;;;;N;;;;; +14021;EGYPTIAN HIEROGLYPH-14021;Lo;0;L;;;;;N;;;;; +14022;EGYPTIAN HIEROGLYPH-14022;Lo;0;L;;;;;N;;;;; +14023;EGYPTIAN HIEROGLYPH-14023;Lo;0;L;;;;;N;;;;; +14024;EGYPTIAN HIEROGLYPH-14024;Lo;0;L;;;;;N;;;;; +14025;EGYPTIAN HIEROGLYPH-14025;Lo;0;L;;;;;N;;;;; +14026;EGYPTIAN HIEROGLYPH-14026;Lo;0;L;;;;;N;;;;; +14027;EGYPTIAN HIEROGLYPH-14027;Lo;0;L;;;;;N;;;;; +14028;EGYPTIAN HIEROGLYPH-14028;Lo;0;L;;;;;N;;;;; +14029;EGYPTIAN HIEROGLYPH-14029;Lo;0;L;;;;;N;;;;; +1402A;EGYPTIAN HIEROGLYPH-1402A;Lo;0;L;;;;;N;;;;; +1402B;EGYPTIAN HIEROGLYPH-1402B;Lo;0;L;;;;;N;;;;; +1402C;EGYPTIAN HIEROGLYPH-1402C;Lo;0;L;;;;;N;;;;; +1402D;EGYPTIAN HIEROGLYPH-1402D;Lo;0;L;;;;;N;;;;; +1402E;EGYPTIAN HIEROGLYPH-1402E;Lo;0;L;;;;;N;;;;; +1402F;EGYPTIAN HIEROGLYPH-1402F;Lo;0;L;;;;;N;;;;; +14030;EGYPTIAN HIEROGLYPH-14030;Lo;0;L;;;;;N;;;;; +14031;EGYPTIAN HIEROGLYPH-14031;Lo;0;L;;;;;N;;;;; +14032;EGYPTIAN HIEROGLYPH-14032;Lo;0;L;;;;;N;;;;; +14033;EGYPTIAN HIEROGLYPH-14033;Lo;0;L;;;;;N;;;;; +14034;EGYPTIAN HIEROGLYPH-14034;Lo;0;L;;;;;N;;;;; +14035;EGYPTIAN HIEROGLYPH-14035;Lo;0;L;;;;;N;;;;; +14036;EGYPTIAN HIEROGLYPH-14036;Lo;0;L;;;;;N;;;;; +14037;EGYPTIAN HIEROGLYPH-14037;Lo;0;L;;;;;N;;;;; +14038;EGYPTIAN HIEROGLYPH-14038;Lo;0;L;;;;;N;;;;; +14039;EGYPTIAN HIEROGLYPH-14039;Lo;0;L;;;;;N;;;;; +1403A;EGYPTIAN HIEROGLYPH-1403A;Lo;0;L;;;;;N;;;;; +1403B;EGYPTIAN HIEROGLYPH-1403B;Lo;0;L;;;;;N;;;;; +1403C;EGYPTIAN HIEROGLYPH-1403C;Lo;0;L;;;;;N;;;;; +1403D;EGYPTIAN HIEROGLYPH-1403D;Lo;0;L;;;;;N;;;;; +1403E;EGYPTIAN HIEROGLYPH-1403E;Lo;0;L;;;;;N;;;;; +1403F;EGYPTIAN HIEROGLYPH-1403F;Lo;0;L;;;;;N;;;;; +14040;EGYPTIAN HIEROGLYPH-14040;Lo;0;L;;;;;N;;;;; +14041;EGYPTIAN HIEROGLYPH-14041;Lo;0;L;;;;;N;;;;; +14042;EGYPTIAN HIEROGLYPH-14042;Lo;0;L;;;;;N;;;;; +14043;EGYPTIAN HIEROGLYPH-14043;Lo;0;L;;;;;N;;;;; +14044;EGYPTIAN HIEROGLYPH-14044;Lo;0;L;;;;;N;;;;; +14045;EGYPTIAN HIEROGLYPH-14045;Lo;0;L;;;;;N;;;;; +14046;EGYPTIAN HIEROGLYPH-14046;Lo;0;L;;;;;N;;;;; +14047;EGYPTIAN HIEROGLYPH-14047;Lo;0;L;;;;;N;;;;; +14048;EGYPTIAN HIEROGLYPH-14048;Lo;0;L;;;;;N;;;;; +14049;EGYPTIAN HIEROGLYPH-14049;Lo;0;L;;;;;N;;;;; +1404A;EGYPTIAN HIEROGLYPH-1404A;Lo;0;L;;;;;N;;;;; +1404B;EGYPTIAN HIEROGLYPH-1404B;Lo;0;L;;;;;N;;;;; +1404C;EGYPTIAN HIEROGLYPH-1404C;Lo;0;L;;;;;N;;;;; +1404D;EGYPTIAN HIEROGLYPH-1404D;Lo;0;L;;;;;N;;;;; +1404E;EGYPTIAN HIEROGLYPH-1404E;Lo;0;L;;;;;N;;;;; +1404F;EGYPTIAN HIEROGLYPH-1404F;Lo;0;L;;;;;N;;;;; +14050;EGYPTIAN HIEROGLYPH-14050;Lo;0;L;;;;;N;;;;; +14051;EGYPTIAN HIEROGLYPH-14051;Lo;0;L;;;;;N;;;;; +14052;EGYPTIAN HIEROGLYPH-14052;Lo;0;L;;;;;N;;;;; +14053;EGYPTIAN HIEROGLYPH-14053;Lo;0;L;;;;;N;;;;; +14054;EGYPTIAN HIEROGLYPH-14054;Lo;0;L;;;;;N;;;;; +14055;EGYPTIAN HIEROGLYPH-14055;Lo;0;L;;;;;N;;;;; +14056;EGYPTIAN HIEROGLYPH-14056;Lo;0;L;;;;;N;;;;; +14057;EGYPTIAN HIEROGLYPH-14057;Lo;0;L;;;;;N;;;;; +14058;EGYPTIAN HIEROGLYPH-14058;Lo;0;L;;;;;N;;;;; +14059;EGYPTIAN HIEROGLYPH-14059;Lo;0;L;;;;;N;;;;; +1405A;EGYPTIAN HIEROGLYPH-1405A;Lo;0;L;;;;;N;;;;; +1405B;EGYPTIAN HIEROGLYPH-1405B;Lo;0;L;;;;;N;;;;; +1405C;EGYPTIAN HIEROGLYPH-1405C;Lo;0;L;;;;;N;;;;; +1405D;EGYPTIAN HIEROGLYPH-1405D;Lo;0;L;;;;;N;;;;; +1405E;EGYPTIAN HIEROGLYPH-1405E;Lo;0;L;;;;;N;;;;; +1405F;EGYPTIAN HIEROGLYPH-1405F;Lo;0;L;;;;;N;;;;; +14060;EGYPTIAN HIEROGLYPH-14060;Lo;0;L;;;;;N;;;;; +14061;EGYPTIAN HIEROGLYPH-14061;Lo;0;L;;;;;N;;;;; +14062;EGYPTIAN HIEROGLYPH-14062;Lo;0;L;;;;;N;;;;; +14063;EGYPTIAN HIEROGLYPH-14063;Lo;0;L;;;;;N;;;;; +14064;EGYPTIAN HIEROGLYPH-14064;Lo;0;L;;;;;N;;;;; +14065;EGYPTIAN HIEROGLYPH-14065;Lo;0;L;;;;;N;;;;; +14066;EGYPTIAN HIEROGLYPH-14066;Lo;0;L;;;;;N;;;;; +14067;EGYPTIAN HIEROGLYPH-14067;Lo;0;L;;;;;N;;;;; +14068;EGYPTIAN HIEROGLYPH-14068;Lo;0;L;;;;;N;;;;; +14069;EGYPTIAN HIEROGLYPH-14069;Lo;0;L;;;;;N;;;;; +1406A;EGYPTIAN HIEROGLYPH-1406A;Lo;0;L;;;;;N;;;;; +1406B;EGYPTIAN HIEROGLYPH-1406B;Lo;0;L;;;;;N;;;;; +1406C;EGYPTIAN HIEROGLYPH-1406C;Lo;0;L;;;;;N;;;;; +1406D;EGYPTIAN HIEROGLYPH-1406D;Lo;0;L;;;;;N;;;;; +1406E;EGYPTIAN HIEROGLYPH-1406E;Lo;0;L;;;;;N;;;;; +1406F;EGYPTIAN HIEROGLYPH-1406F;Lo;0;L;;;;;N;;;;; +14070;EGYPTIAN HIEROGLYPH-14070;Lo;0;L;;;;;N;;;;; +14071;EGYPTIAN HIEROGLYPH-14071;Lo;0;L;;;;;N;;;;; +14072;EGYPTIAN HIEROGLYPH-14072;Lo;0;L;;;;;N;;;;; +14073;EGYPTIAN HIEROGLYPH-14073;Lo;0;L;;;;;N;;;;; +14074;EGYPTIAN HIEROGLYPH-14074;Lo;0;L;;;;;N;;;;; +14075;EGYPTIAN HIEROGLYPH-14075;Lo;0;L;;;;;N;;;;; +14076;EGYPTIAN HIEROGLYPH-14076;Lo;0;L;;;;;N;;;;; +14077;EGYPTIAN HIEROGLYPH-14077;Lo;0;L;;;;;N;;;;; +14078;EGYPTIAN HIEROGLYPH-14078;Lo;0;L;;;;;N;;;;; +14079;EGYPTIAN HIEROGLYPH-14079;Lo;0;L;;;;;N;;;;; +1407A;EGYPTIAN HIEROGLYPH-1407A;Lo;0;L;;;;;N;;;;; +1407B;EGYPTIAN HIEROGLYPH-1407B;Lo;0;L;;;;;N;;;;; +1407C;EGYPTIAN HIEROGLYPH-1407C;Lo;0;L;;;;;N;;;;; +1407D;EGYPTIAN HIEROGLYPH-1407D;Lo;0;L;;;;;N;;;;; +1407E;EGYPTIAN HIEROGLYPH-1407E;Lo;0;L;;;;;N;;;;; +1407F;EGYPTIAN HIEROGLYPH-1407F;Lo;0;L;;;;;N;;;;; +14080;EGYPTIAN HIEROGLYPH-14080;Lo;0;L;;;;;N;;;;; +14081;EGYPTIAN HIEROGLYPH-14081;Lo;0;L;;;;;N;;;;; +14082;EGYPTIAN HIEROGLYPH-14082;Lo;0;L;;;;;N;;;;; +14083;EGYPTIAN HIEROGLYPH-14083;Lo;0;L;;;;;N;;;;; +14084;EGYPTIAN HIEROGLYPH-14084;Lo;0;L;;;;;N;;;;; +14085;EGYPTIAN HIEROGLYPH-14085;Lo;0;L;;;;;N;;;;; +14086;EGYPTIAN HIEROGLYPH-14086;Lo;0;L;;;;;N;;;;; +14087;EGYPTIAN HIEROGLYPH-14087;Lo;0;L;;;;;N;;;;; +14088;EGYPTIAN HIEROGLYPH-14088;Lo;0;L;;;;;N;;;;; +14089;EGYPTIAN HIEROGLYPH-14089;Lo;0;L;;;;;N;;;;; +1408A;EGYPTIAN HIEROGLYPH-1408A;Lo;0;L;;;;;N;;;;; +1408B;EGYPTIAN HIEROGLYPH-1408B;Lo;0;L;;;;;N;;;;; +1408C;EGYPTIAN HIEROGLYPH-1408C;Lo;0;L;;;;;N;;;;; +1408D;EGYPTIAN HIEROGLYPH-1408D;Lo;0;L;;;;;N;;;;; +1408E;EGYPTIAN HIEROGLYPH-1408E;Lo;0;L;;;;;N;;;;; +1408F;EGYPTIAN HIEROGLYPH-1408F;Lo;0;L;;;;;N;;;;; +14090;EGYPTIAN HIEROGLYPH-14090;Lo;0;L;;;;;N;;;;; +14091;EGYPTIAN HIEROGLYPH-14091;Lo;0;L;;;;;N;;;;; +14092;EGYPTIAN HIEROGLYPH-14092;Lo;0;L;;;;;N;;;;; +14093;EGYPTIAN HIEROGLYPH-14093;Lo;0;L;;;;;N;;;;; +14094;EGYPTIAN HIEROGLYPH-14094;Lo;0;L;;;;;N;;;;; +14095;EGYPTIAN HIEROGLYPH-14095;Lo;0;L;;;;;N;;;;; +14096;EGYPTIAN HIEROGLYPH-14096;Lo;0;L;;;;;N;;;;; +14097;EGYPTIAN HIEROGLYPH-14097;Lo;0;L;;;;;N;;;;; +14098;EGYPTIAN HIEROGLYPH-14098;Lo;0;L;;;;;N;;;;; +14099;EGYPTIAN HIEROGLYPH-14099;Lo;0;L;;;;;N;;;;; +1409A;EGYPTIAN HIEROGLYPH-1409A;Lo;0;L;;;;;N;;;;; +1409B;EGYPTIAN HIEROGLYPH-1409B;Lo;0;L;;;;;N;;;;; +1409C;EGYPTIAN HIEROGLYPH-1409C;Lo;0;L;;;;;N;;;;; +1409D;EGYPTIAN HIEROGLYPH-1409D;Lo;0;L;;;;;N;;;;; +1409E;EGYPTIAN HIEROGLYPH-1409E;Lo;0;L;;;;;N;;;;; +1409F;EGYPTIAN HIEROGLYPH-1409F;Lo;0;L;;;;;N;;;;; +140A0;EGYPTIAN HIEROGLYPH-140A0;Lo;0;L;;;;;N;;;;; +140A1;EGYPTIAN HIEROGLYPH-140A1;Lo;0;L;;;;;N;;;;; +140A2;EGYPTIAN HIEROGLYPH-140A2;Lo;0;L;;;;;N;;;;; +140A3;EGYPTIAN HIEROGLYPH-140A3;Lo;0;L;;;;;N;;;;; +140A4;EGYPTIAN HIEROGLYPH-140A4;Lo;0;L;;;;;N;;;;; +140A5;EGYPTIAN HIEROGLYPH-140A5;Lo;0;L;;;;;N;;;;; +140A6;EGYPTIAN HIEROGLYPH-140A6;Lo;0;L;;;;;N;;;;; +140A7;EGYPTIAN HIEROGLYPH-140A7;Lo;0;L;;;;;N;;;;; +140A8;EGYPTIAN HIEROGLYPH-140A8;Lo;0;L;;;;;N;;;;; +140A9;EGYPTIAN HIEROGLYPH-140A9;Lo;0;L;;;;;N;;;;; +140AA;EGYPTIAN HIEROGLYPH-140AA;Lo;0;L;;;;;N;;;;; +140AB;EGYPTIAN HIEROGLYPH-140AB;Lo;0;L;;;;;N;;;;; +140AC;EGYPTIAN HIEROGLYPH-140AC;Lo;0;L;;;;;N;;;;; +140AD;EGYPTIAN HIEROGLYPH-140AD;Lo;0;L;;;;;N;;;;; +140AE;EGYPTIAN HIEROGLYPH-140AE;Lo;0;L;;;;;N;;;;; +140AF;EGYPTIAN HIEROGLYPH-140AF;Lo;0;L;;;;;N;;;;; +140B0;EGYPTIAN HIEROGLYPH-140B0;Lo;0;L;;;;;N;;;;; +140B1;EGYPTIAN HIEROGLYPH-140B1;Lo;0;L;;;;;N;;;;; +140B2;EGYPTIAN HIEROGLYPH-140B2;Lo;0;L;;;;;N;;;;; +140B3;EGYPTIAN HIEROGLYPH-140B3;Lo;0;L;;;;;N;;;;; +140B4;EGYPTIAN HIEROGLYPH-140B4;Lo;0;L;;;;;N;;;;; +140B5;EGYPTIAN HIEROGLYPH-140B5;Lo;0;L;;;;;N;;;;; +140B6;EGYPTIAN HIEROGLYPH-140B6;Lo;0;L;;;;;N;;;;; +140B7;EGYPTIAN HIEROGLYPH-140B7;Lo;0;L;;;;;N;;;;; +140B8;EGYPTIAN HIEROGLYPH-140B8;Lo;0;L;;;;;N;;;;; +140B9;EGYPTIAN HIEROGLYPH-140B9;Lo;0;L;;;;;N;;;;; +140BA;EGYPTIAN HIEROGLYPH-140BA;Lo;0;L;;;;;N;;;;; +140BB;EGYPTIAN HIEROGLYPH-140BB;Lo;0;L;;;;;N;;;;; +140BC;EGYPTIAN HIEROGLYPH-140BC;Lo;0;L;;;;;N;;;;; +140BD;EGYPTIAN HIEROGLYPH-140BD;Lo;0;L;;;;;N;;;;; +140BE;EGYPTIAN HIEROGLYPH-140BE;Lo;0;L;;;;;N;;;;; +140BF;EGYPTIAN HIEROGLYPH-140BF;Lo;0;L;;;;;N;;;;; +140C0;EGYPTIAN HIEROGLYPH-140C0;Lo;0;L;;;;;N;;;;; +140C1;EGYPTIAN HIEROGLYPH-140C1;Lo;0;L;;;;;N;;;;; +140C2;EGYPTIAN HIEROGLYPH-140C2;Lo;0;L;;;;;N;;;;; +140C3;EGYPTIAN HIEROGLYPH-140C3;Lo;0;L;;;;;N;;;;; +140C4;EGYPTIAN HIEROGLYPH-140C4;Lo;0;L;;;;;N;;;;; +140C5;EGYPTIAN HIEROGLYPH-140C5;Lo;0;L;;;;;N;;;;; +140C6;EGYPTIAN HIEROGLYPH-140C6;Lo;0;L;;;;;N;;;;; +140C7;EGYPTIAN HIEROGLYPH-140C7;Lo;0;L;;;;;N;;;;; +140C8;EGYPTIAN HIEROGLYPH-140C8;Lo;0;L;;;;;N;;;;; +140C9;EGYPTIAN HIEROGLYPH-140C9;Lo;0;L;;;;;N;;;;; +140CA;EGYPTIAN HIEROGLYPH-140CA;Lo;0;L;;;;;N;;;;; +140CB;EGYPTIAN HIEROGLYPH-140CB;Lo;0;L;;;;;N;;;;; +140CC;EGYPTIAN HIEROGLYPH-140CC;Lo;0;L;;;;;N;;;;; +140CD;EGYPTIAN HIEROGLYPH-140CD;Lo;0;L;;;;;N;;;;; +140CE;EGYPTIAN HIEROGLYPH-140CE;Lo;0;L;;;;;N;;;;; +140CF;EGYPTIAN HIEROGLYPH-140CF;Lo;0;L;;;;;N;;;;; +140D0;EGYPTIAN HIEROGLYPH-140D0;Lo;0;L;;;;;N;;;;; +140D1;EGYPTIAN HIEROGLYPH-140D1;Lo;0;L;;;;;N;;;;; +140D2;EGYPTIAN HIEROGLYPH-140D2;Lo;0;L;;;;;N;;;;; +140D3;EGYPTIAN HIEROGLYPH-140D3;Lo;0;L;;;;;N;;;;; +140D4;EGYPTIAN HIEROGLYPH-140D4;Lo;0;L;;;;;N;;;;; +140D5;EGYPTIAN HIEROGLYPH-140D5;Lo;0;L;;;;;N;;;;; +140D6;EGYPTIAN HIEROGLYPH-140D6;Lo;0;L;;;;;N;;;;; +140D7;EGYPTIAN HIEROGLYPH-140D7;Lo;0;L;;;;;N;;;;; +140D8;EGYPTIAN HIEROGLYPH-140D8;Lo;0;L;;;;;N;;;;; +140D9;EGYPTIAN HIEROGLYPH-140D9;Lo;0;L;;;;;N;;;;; +140DA;EGYPTIAN HIEROGLYPH-140DA;Lo;0;L;;;;;N;;;;; +140DB;EGYPTIAN HIEROGLYPH-140DB;Lo;0;L;;;;;N;;;;; +140DC;EGYPTIAN HIEROGLYPH-140DC;Lo;0;L;;;;;N;;;;; +140DD;EGYPTIAN HIEROGLYPH-140DD;Lo;0;L;;;;;N;;;;; +140DE;EGYPTIAN HIEROGLYPH-140DE;Lo;0;L;;;;;N;;;;; +140DF;EGYPTIAN HIEROGLYPH-140DF;Lo;0;L;;;;;N;;;;; +140E0;EGYPTIAN HIEROGLYPH-140E0;Lo;0;L;;;;;N;;;;; +140E1;EGYPTIAN HIEROGLYPH-140E1;Lo;0;L;;;;;N;;;;; +140E2;EGYPTIAN HIEROGLYPH-140E2;Lo;0;L;;;;;N;;;;; +140E3;EGYPTIAN HIEROGLYPH-140E3;Lo;0;L;;;;;N;;;;; +140E4;EGYPTIAN HIEROGLYPH-140E4;Lo;0;L;;;;;N;;;;; +140E5;EGYPTIAN HIEROGLYPH-140E5;Lo;0;L;;;;;N;;;;; +140E6;EGYPTIAN HIEROGLYPH-140E6;Lo;0;L;;;;;N;;;;; +140E7;EGYPTIAN HIEROGLYPH-140E7;Lo;0;L;;;;;N;;;;; +140E8;EGYPTIAN HIEROGLYPH-140E8;Lo;0;L;;;;;N;;;;; +140E9;EGYPTIAN HIEROGLYPH-140E9;Lo;0;L;;;;;N;;;;; +140EA;EGYPTIAN HIEROGLYPH-140EA;Lo;0;L;;;;;N;;;;; +140EB;EGYPTIAN HIEROGLYPH-140EB;Lo;0;L;;;;;N;;;;; +140EC;EGYPTIAN HIEROGLYPH-140EC;Lo;0;L;;;;;N;;;;; +140ED;EGYPTIAN HIEROGLYPH-140ED;Lo;0;L;;;;;N;;;;; +140EE;EGYPTIAN HIEROGLYPH-140EE;Lo;0;L;;;;;N;;;;; +140EF;EGYPTIAN HIEROGLYPH-140EF;Lo;0;L;;;;;N;;;;; +140F0;EGYPTIAN HIEROGLYPH-140F0;Lo;0;L;;;;;N;;;;; +140F1;EGYPTIAN HIEROGLYPH-140F1;Lo;0;L;;;;;N;;;;; +140F2;EGYPTIAN HIEROGLYPH-140F2;Lo;0;L;;;;;N;;;;; +140F3;EGYPTIAN HIEROGLYPH-140F3;Lo;0;L;;;;;N;;;;; +140F4;EGYPTIAN HIEROGLYPH-140F4;Lo;0;L;;;;;N;;;;; +140F5;EGYPTIAN HIEROGLYPH-140F5;Lo;0;L;;;;;N;;;;; +140F6;EGYPTIAN HIEROGLYPH-140F6;Lo;0;L;;;;;N;;;;; +140F7;EGYPTIAN HIEROGLYPH-140F7;Lo;0;L;;;;;N;;;;; +140F8;EGYPTIAN HIEROGLYPH-140F8;Lo;0;L;;;;;N;;;;; +140F9;EGYPTIAN HIEROGLYPH-140F9;Lo;0;L;;;;;N;;;;; +140FA;EGYPTIAN HIEROGLYPH-140FA;Lo;0;L;;;;;N;;;;; +140FB;EGYPTIAN HIEROGLYPH-140FB;Lo;0;L;;;;;N;;;;; +140FC;EGYPTIAN HIEROGLYPH-140FC;Lo;0;L;;;;;N;;;;; +140FD;EGYPTIAN HIEROGLYPH-140FD;Lo;0;L;;;;;N;;;;; +140FE;EGYPTIAN HIEROGLYPH-140FE;Lo;0;L;;;;;N;;;;; +140FF;EGYPTIAN HIEROGLYPH-140FF;Lo;0;L;;;;;N;;;;; +14100;EGYPTIAN HIEROGLYPH-14100;Lo;0;L;;;;;N;;;;; +14101;EGYPTIAN HIEROGLYPH-14101;Lo;0;L;;;;;N;;;;; +14102;EGYPTIAN HIEROGLYPH-14102;Lo;0;L;;;;;N;;;;; +14103;EGYPTIAN HIEROGLYPH-14103;Lo;0;L;;;;;N;;;;; +14104;EGYPTIAN HIEROGLYPH-14104;Lo;0;L;;;;;N;;;;; +14105;EGYPTIAN HIEROGLYPH-14105;Lo;0;L;;;;;N;;;;; +14106;EGYPTIAN HIEROGLYPH-14106;Lo;0;L;;;;;N;;;;; +14107;EGYPTIAN HIEROGLYPH-14107;Lo;0;L;;;;;N;;;;; +14108;EGYPTIAN HIEROGLYPH-14108;Lo;0;L;;;;;N;;;;; +14109;EGYPTIAN HIEROGLYPH-14109;Lo;0;L;;;;;N;;;;; +1410A;EGYPTIAN HIEROGLYPH-1410A;Lo;0;L;;;;;N;;;;; +1410B;EGYPTIAN HIEROGLYPH-1410B;Lo;0;L;;;;;N;;;;; +1410C;EGYPTIAN HIEROGLYPH-1410C;Lo;0;L;;;;;N;;;;; +1410D;EGYPTIAN HIEROGLYPH-1410D;Lo;0;L;;;;;N;;;;; +1410E;EGYPTIAN HIEROGLYPH-1410E;Lo;0;L;;;;;N;;;;; +1410F;EGYPTIAN HIEROGLYPH-1410F;Lo;0;L;;;;;N;;;;; +14110;EGYPTIAN HIEROGLYPH-14110;Lo;0;L;;;;;N;;;;; +14111;EGYPTIAN HIEROGLYPH-14111;Lo;0;L;;;;;N;;;;; +14112;EGYPTIAN HIEROGLYPH-14112;Lo;0;L;;;;;N;;;;; +14113;EGYPTIAN HIEROGLYPH-14113;Lo;0;L;;;;;N;;;;; +14114;EGYPTIAN HIEROGLYPH-14114;Lo;0;L;;;;;N;;;;; +14115;EGYPTIAN HIEROGLYPH-14115;Lo;0;L;;;;;N;;;;; +14116;EGYPTIAN HIEROGLYPH-14116;Lo;0;L;;;;;N;;;;; +14117;EGYPTIAN HIEROGLYPH-14117;Lo;0;L;;;;;N;;;;; +14118;EGYPTIAN HIEROGLYPH-14118;Lo;0;L;;;;;N;;;;; +14119;EGYPTIAN HIEROGLYPH-14119;Lo;0;L;;;;;N;;;;; +1411A;EGYPTIAN HIEROGLYPH-1411A;Lo;0;L;;;;;N;;;;; +1411B;EGYPTIAN HIEROGLYPH-1411B;Lo;0;L;;;;;N;;;;; +1411C;EGYPTIAN HIEROGLYPH-1411C;Lo;0;L;;;;;N;;;;; +1411D;EGYPTIAN HIEROGLYPH-1411D;Lo;0;L;;;;;N;;;;; +1411E;EGYPTIAN HIEROGLYPH-1411E;Lo;0;L;;;;;N;;;;; +1411F;EGYPTIAN HIEROGLYPH-1411F;Lo;0;L;;;;;N;;;;; +14120;EGYPTIAN HIEROGLYPH-14120;Lo;0;L;;;;;N;;;;; +14121;EGYPTIAN HIEROGLYPH-14121;Lo;0;L;;;;;N;;;;; +14122;EGYPTIAN HIEROGLYPH-14122;Lo;0;L;;;;;N;;;;; +14123;EGYPTIAN HIEROGLYPH-14123;Lo;0;L;;;;;N;;;;; +14124;EGYPTIAN HIEROGLYPH-14124;Lo;0;L;;;;;N;;;;; +14125;EGYPTIAN HIEROGLYPH-14125;Lo;0;L;;;;;N;;;;; +14126;EGYPTIAN HIEROGLYPH-14126;Lo;0;L;;;;;N;;;;; +14127;EGYPTIAN HIEROGLYPH-14127;Lo;0;L;;;;;N;;;;; +14128;EGYPTIAN HIEROGLYPH-14128;Lo;0;L;;;;;N;;;;; +14129;EGYPTIAN HIEROGLYPH-14129;Lo;0;L;;;;;N;;;;; +1412A;EGYPTIAN HIEROGLYPH-1412A;Lo;0;L;;;;;N;;;;; +1412B;EGYPTIAN HIEROGLYPH-1412B;Lo;0;L;;;;;N;;;;; +1412C;EGYPTIAN HIEROGLYPH-1412C;Lo;0;L;;;;;N;;;;; +1412D;EGYPTIAN HIEROGLYPH-1412D;Lo;0;L;;;;;N;;;;; +1412E;EGYPTIAN HIEROGLYPH-1412E;Lo;0;L;;;;;N;;;;; +1412F;EGYPTIAN HIEROGLYPH-1412F;Lo;0;L;;;;;N;;;;; +14130;EGYPTIAN HIEROGLYPH-14130;Lo;0;L;;;;;N;;;;; +14131;EGYPTIAN HIEROGLYPH-14131;Lo;0;L;;;;;N;;;;; +14132;EGYPTIAN HIEROGLYPH-14132;Lo;0;L;;;;;N;;;;; +14133;EGYPTIAN HIEROGLYPH-14133;Lo;0;L;;;;;N;;;;; +14134;EGYPTIAN HIEROGLYPH-14134;Lo;0;L;;;;;N;;;;; +14135;EGYPTIAN HIEROGLYPH-14135;Lo;0;L;;;;;N;;;;; +14136;EGYPTIAN HIEROGLYPH-14136;Lo;0;L;;;;;N;;;;; +14137;EGYPTIAN HIEROGLYPH-14137;Lo;0;L;;;;;N;;;;; +14138;EGYPTIAN HIEROGLYPH-14138;Lo;0;L;;;;;N;;;;; +14139;EGYPTIAN HIEROGLYPH-14139;Lo;0;L;;;;;N;;;;; +1413A;EGYPTIAN HIEROGLYPH-1413A;Lo;0;L;;;;;N;;;;; +1413B;EGYPTIAN HIEROGLYPH-1413B;Lo;0;L;;;;;N;;;;; +1413C;EGYPTIAN HIEROGLYPH-1413C;Lo;0;L;;;;;N;;;;; +1413D;EGYPTIAN HIEROGLYPH-1413D;Lo;0;L;;;;;N;;;;; +1413E;EGYPTIAN HIEROGLYPH-1413E;Lo;0;L;;;;;N;;;;; +1413F;EGYPTIAN HIEROGLYPH-1413F;Lo;0;L;;;;;N;;;;; +14140;EGYPTIAN HIEROGLYPH-14140;Lo;0;L;;;;;N;;;;; +14141;EGYPTIAN HIEROGLYPH-14141;Lo;0;L;;;;;N;;;;; +14142;EGYPTIAN HIEROGLYPH-14142;Lo;0;L;;;;;N;;;;; +14143;EGYPTIAN HIEROGLYPH-14143;Lo;0;L;;;;;N;;;;; +14144;EGYPTIAN HIEROGLYPH-14144;Lo;0;L;;;;;N;;;;; +14145;EGYPTIAN HIEROGLYPH-14145;Lo;0;L;;;;;N;;;;; +14146;EGYPTIAN HIEROGLYPH-14146;Lo;0;L;;;;;N;;;;; +14147;EGYPTIAN HIEROGLYPH-14147;Lo;0;L;;;;;N;;;;; +14148;EGYPTIAN HIEROGLYPH-14148;Lo;0;L;;;;;N;;;;; +14149;EGYPTIAN HIEROGLYPH-14149;Lo;0;L;;;;;N;;;;; +1414A;EGYPTIAN HIEROGLYPH-1414A;Lo;0;L;;;;;N;;;;; +1414B;EGYPTIAN HIEROGLYPH-1414B;Lo;0;L;;;;;N;;;;; +1414C;EGYPTIAN HIEROGLYPH-1414C;Lo;0;L;;;;;N;;;;; +1414D;EGYPTIAN HIEROGLYPH-1414D;Lo;0;L;;;;;N;;;;; +1414E;EGYPTIAN HIEROGLYPH-1414E;Lo;0;L;;;;;N;;;;; +1414F;EGYPTIAN HIEROGLYPH-1414F;Lo;0;L;;;;;N;;;;; +14150;EGYPTIAN HIEROGLYPH-14150;Lo;0;L;;;;;N;;;;; +14151;EGYPTIAN HIEROGLYPH-14151;Lo;0;L;;;;;N;;;;; +14152;EGYPTIAN HIEROGLYPH-14152;Lo;0;L;;;;;N;;;;; +14153;EGYPTIAN HIEROGLYPH-14153;Lo;0;L;;;;;N;;;;; +14154;EGYPTIAN HIEROGLYPH-14154;Lo;0;L;;;;;N;;;;; +14155;EGYPTIAN HIEROGLYPH-14155;Lo;0;L;;;;;N;;;;; +14156;EGYPTIAN HIEROGLYPH-14156;Lo;0;L;;;;;N;;;;; +14157;EGYPTIAN HIEROGLYPH-14157;Lo;0;L;;;;;N;;;;; +14158;EGYPTIAN HIEROGLYPH-14158;Lo;0;L;;;;;N;;;;; +14159;EGYPTIAN HIEROGLYPH-14159;Lo;0;L;;;;;N;;;;; +1415A;EGYPTIAN HIEROGLYPH-1415A;Lo;0;L;;;;;N;;;;; +1415B;EGYPTIAN HIEROGLYPH-1415B;Lo;0;L;;;;;N;;;;; +1415C;EGYPTIAN HIEROGLYPH-1415C;Lo;0;L;;;;;N;;;;; +1415D;EGYPTIAN HIEROGLYPH-1415D;Lo;0;L;;;;;N;;;;; +1415E;EGYPTIAN HIEROGLYPH-1415E;Lo;0;L;;;;;N;;;;; +1415F;EGYPTIAN HIEROGLYPH-1415F;Lo;0;L;;;;;N;;;;; +14160;EGYPTIAN HIEROGLYPH-14160;Lo;0;L;;;;;N;;;;; +14161;EGYPTIAN HIEROGLYPH-14161;Lo;0;L;;;;;N;;;;; +14162;EGYPTIAN HIEROGLYPH-14162;Lo;0;L;;;;;N;;;;; +14163;EGYPTIAN HIEROGLYPH-14163;Lo;0;L;;;;;N;;;;; +14164;EGYPTIAN HIEROGLYPH-14164;Lo;0;L;;;;;N;;;;; +14165;EGYPTIAN HIEROGLYPH-14165;Lo;0;L;;;;;N;;;;; +14166;EGYPTIAN HIEROGLYPH-14166;Lo;0;L;;;;;N;;;;; +14167;EGYPTIAN HIEROGLYPH-14167;Lo;0;L;;;;;N;;;;; +14168;EGYPTIAN HIEROGLYPH-14168;Lo;0;L;;;;;N;;;;; +14169;EGYPTIAN HIEROGLYPH-14169;Lo;0;L;;;;;N;;;;; +1416A;EGYPTIAN HIEROGLYPH-1416A;Lo;0;L;;;;;N;;;;; +1416B;EGYPTIAN HIEROGLYPH-1416B;Lo;0;L;;;;;N;;;;; +1416C;EGYPTIAN HIEROGLYPH-1416C;Lo;0;L;;;;;N;;;;; +1416D;EGYPTIAN HIEROGLYPH-1416D;Lo;0;L;;;;;N;;;;; +1416E;EGYPTIAN HIEROGLYPH-1416E;Lo;0;L;;;;;N;;;;; +1416F;EGYPTIAN HIEROGLYPH-1416F;Lo;0;L;;;;;N;;;;; +14170;EGYPTIAN HIEROGLYPH-14170;Lo;0;L;;;;;N;;;;; +14171;EGYPTIAN HIEROGLYPH-14171;Lo;0;L;;;;;N;;;;; +14172;EGYPTIAN HIEROGLYPH-14172;Lo;0;L;;;;;N;;;;; +14173;EGYPTIAN HIEROGLYPH-14173;Lo;0;L;;;;;N;;;;; +14174;EGYPTIAN HIEROGLYPH-14174;Lo;0;L;;;;;N;;;;; +14175;EGYPTIAN HIEROGLYPH-14175;Lo;0;L;;;;;N;;;;; +14176;EGYPTIAN HIEROGLYPH-14176;Lo;0;L;;;;;N;;;;; +14177;EGYPTIAN HIEROGLYPH-14177;Lo;0;L;;;;;N;;;;; +14178;EGYPTIAN HIEROGLYPH-14178;Lo;0;L;;;;;N;;;;; +14179;EGYPTIAN HIEROGLYPH-14179;Lo;0;L;;;;;N;;;;; +1417A;EGYPTIAN HIEROGLYPH-1417A;Lo;0;L;;;;;N;;;;; +1417B;EGYPTIAN HIEROGLYPH-1417B;Lo;0;L;;;;;N;;;;; +1417C;EGYPTIAN HIEROGLYPH-1417C;Lo;0;L;;;;;N;;;;; +1417D;EGYPTIAN HIEROGLYPH-1417D;Lo;0;L;;;;;N;;;;; +1417E;EGYPTIAN HIEROGLYPH-1417E;Lo;0;L;;;;;N;;;;; +1417F;EGYPTIAN HIEROGLYPH-1417F;Lo;0;L;;;;;N;;;;; +14180;EGYPTIAN HIEROGLYPH-14180;Lo;0;L;;;;;N;;;;; +14181;EGYPTIAN HIEROGLYPH-14181;Lo;0;L;;;;;N;;;;; +14182;EGYPTIAN HIEROGLYPH-14182;Lo;0;L;;;;;N;;;;; +14183;EGYPTIAN HIEROGLYPH-14183;Lo;0;L;;;;;N;;;;; +14184;EGYPTIAN HIEROGLYPH-14184;Lo;0;L;;;;;N;;;;; +14185;EGYPTIAN HIEROGLYPH-14185;Lo;0;L;;;;;N;;;;; +14186;EGYPTIAN HIEROGLYPH-14186;Lo;0;L;;;;;N;;;;; +14187;EGYPTIAN HIEROGLYPH-14187;Lo;0;L;;;;;N;;;;; +14188;EGYPTIAN HIEROGLYPH-14188;Lo;0;L;;;;;N;;;;; +14189;EGYPTIAN HIEROGLYPH-14189;Lo;0;L;;;;;N;;;;; +1418A;EGYPTIAN HIEROGLYPH-1418A;Lo;0;L;;;;;N;;;;; +1418B;EGYPTIAN HIEROGLYPH-1418B;Lo;0;L;;;;;N;;;;; +1418C;EGYPTIAN HIEROGLYPH-1418C;Lo;0;L;;;;;N;;;;; +1418D;EGYPTIAN HIEROGLYPH-1418D;Lo;0;L;;;;;N;;;;; +1418E;EGYPTIAN HIEROGLYPH-1418E;Lo;0;L;;;;;N;;;;; +1418F;EGYPTIAN HIEROGLYPH-1418F;Lo;0;L;;;;;N;;;;; +14190;EGYPTIAN HIEROGLYPH-14190;Lo;0;L;;;;;N;;;;; +14191;EGYPTIAN HIEROGLYPH-14191;Lo;0;L;;;;;N;;;;; +14192;EGYPTIAN HIEROGLYPH-14192;Lo;0;L;;;;;N;;;;; +14193;EGYPTIAN HIEROGLYPH-14193;Lo;0;L;;;;;N;;;;; +14194;EGYPTIAN HIEROGLYPH-14194;Lo;0;L;;;;;N;;;;; +14195;EGYPTIAN HIEROGLYPH-14195;Lo;0;L;;;;;N;;;;; +14196;EGYPTIAN HIEROGLYPH-14196;Lo;0;L;;;;;N;;;;; +14197;EGYPTIAN HIEROGLYPH-14197;Lo;0;L;;;;;N;;;;; +14198;EGYPTIAN HIEROGLYPH-14198;Lo;0;L;;;;;N;;;;; +14199;EGYPTIAN HIEROGLYPH-14199;Lo;0;L;;;;;N;;;;; +1419A;EGYPTIAN HIEROGLYPH-1419A;Lo;0;L;;;;;N;;;;; +1419B;EGYPTIAN HIEROGLYPH-1419B;Lo;0;L;;;;;N;;;;; +1419C;EGYPTIAN HIEROGLYPH-1419C;Lo;0;L;;;;;N;;;;; +1419D;EGYPTIAN HIEROGLYPH-1419D;Lo;0;L;;;;;N;;;;; +1419E;EGYPTIAN HIEROGLYPH-1419E;Lo;0;L;;;;;N;;;;; +1419F;EGYPTIAN HIEROGLYPH-1419F;Lo;0;L;;;;;N;;;;; +141A0;EGYPTIAN HIEROGLYPH-141A0;Lo;0;L;;;;;N;;;;; +141A1;EGYPTIAN HIEROGLYPH-141A1;Lo;0;L;;;;;N;;;;; +141A2;EGYPTIAN HIEROGLYPH-141A2;Lo;0;L;;;;;N;;;;; +141A3;EGYPTIAN HIEROGLYPH-141A3;Lo;0;L;;;;;N;;;;; +141A4;EGYPTIAN HIEROGLYPH-141A4;Lo;0;L;;;;;N;;;;; +141A5;EGYPTIAN HIEROGLYPH-141A5;Lo;0;L;;;;;N;;;;; +141A6;EGYPTIAN HIEROGLYPH-141A6;Lo;0;L;;;;;N;;;;; +141A7;EGYPTIAN HIEROGLYPH-141A7;Lo;0;L;;;;;N;;;;; +141A8;EGYPTIAN HIEROGLYPH-141A8;Lo;0;L;;;;;N;;;;; +141A9;EGYPTIAN HIEROGLYPH-141A9;Lo;0;L;;;;;N;;;;; +141AA;EGYPTIAN HIEROGLYPH-141AA;Lo;0;L;;;;;N;;;;; +141AB;EGYPTIAN HIEROGLYPH-141AB;Lo;0;L;;;;;N;;;;; +141AC;EGYPTIAN HIEROGLYPH-141AC;Lo;0;L;;;;;N;;;;; +141AD;EGYPTIAN HIEROGLYPH-141AD;Lo;0;L;;;;;N;;;;; +141AE;EGYPTIAN HIEROGLYPH-141AE;Lo;0;L;;;;;N;;;;; +141AF;EGYPTIAN HIEROGLYPH-141AF;Lo;0;L;;;;;N;;;;; +141B0;EGYPTIAN HIEROGLYPH-141B0;Lo;0;L;;;;;N;;;;; +141B1;EGYPTIAN HIEROGLYPH-141B1;Lo;0;L;;;;;N;;;;; +141B2;EGYPTIAN HIEROGLYPH-141B2;Lo;0;L;;;;;N;;;;; +141B3;EGYPTIAN HIEROGLYPH-141B3;Lo;0;L;;;;;N;;;;; +141B4;EGYPTIAN HIEROGLYPH-141B4;Lo;0;L;;;;;N;;;;; +141B5;EGYPTIAN HIEROGLYPH-141B5;Lo;0;L;;;;;N;;;;; +141B6;EGYPTIAN HIEROGLYPH-141B6;Lo;0;L;;;;;N;;;;; +141B7;EGYPTIAN HIEROGLYPH-141B7;Lo;0;L;;;;;N;;;;; +141B8;EGYPTIAN HIEROGLYPH-141B8;Lo;0;L;;;;;N;;;;; +141B9;EGYPTIAN HIEROGLYPH-141B9;Lo;0;L;;;;;N;;;;; +141BA;EGYPTIAN HIEROGLYPH-141BA;Lo;0;L;;;;;N;;;;; +141BB;EGYPTIAN HIEROGLYPH-141BB;Lo;0;L;;;;;N;;;;; +141BC;EGYPTIAN HIEROGLYPH-141BC;Lo;0;L;;;;;N;;;;; +141BD;EGYPTIAN HIEROGLYPH-141BD;Lo;0;L;;;;;N;;;;; +141BE;EGYPTIAN HIEROGLYPH-141BE;Lo;0;L;;;;;N;;;;; +141BF;EGYPTIAN HIEROGLYPH-141BF;Lo;0;L;;;;;N;;;;; +141C0;EGYPTIAN HIEROGLYPH-141C0;Lo;0;L;;;;;N;;;;; +141C1;EGYPTIAN HIEROGLYPH-141C1;Lo;0;L;;;;;N;;;;; +141C2;EGYPTIAN HIEROGLYPH-141C2;Lo;0;L;;;;;N;;;;; +141C3;EGYPTIAN HIEROGLYPH-141C3;Lo;0;L;;;;;N;;;;; +141C4;EGYPTIAN HIEROGLYPH-141C4;Lo;0;L;;;;;N;;;;; +141C5;EGYPTIAN HIEROGLYPH-141C5;Lo;0;L;;;;;N;;;;; +141C6;EGYPTIAN HIEROGLYPH-141C6;Lo;0;L;;;;;N;;;;; +141C7;EGYPTIAN HIEROGLYPH-141C7;Lo;0;L;;;;;N;;;;; +141C8;EGYPTIAN HIEROGLYPH-141C8;Lo;0;L;;;;;N;;;;; +141C9;EGYPTIAN HIEROGLYPH-141C9;Lo;0;L;;;;;N;;;;; +141CA;EGYPTIAN HIEROGLYPH-141CA;Lo;0;L;;;;;N;;;;; +141CB;EGYPTIAN HIEROGLYPH-141CB;Lo;0;L;;;;;N;;;;; +141CC;EGYPTIAN HIEROGLYPH-141CC;Lo;0;L;;;;;N;;;;; +141CD;EGYPTIAN HIEROGLYPH-141CD;Lo;0;L;;;;;N;;;;; +141CE;EGYPTIAN HIEROGLYPH-141CE;Lo;0;L;;;;;N;;;;; +141CF;EGYPTIAN HIEROGLYPH-141CF;Lo;0;L;;;;;N;;;;; +141D0;EGYPTIAN HIEROGLYPH-141D0;Lo;0;L;;;;;N;;;;; +141D1;EGYPTIAN HIEROGLYPH-141D1;Lo;0;L;;;;;N;;;;; +141D2;EGYPTIAN HIEROGLYPH-141D2;Lo;0;L;;;;;N;;;;; +141D3;EGYPTIAN HIEROGLYPH-141D3;Lo;0;L;;;;;N;;;;; +141D4;EGYPTIAN HIEROGLYPH-141D4;Lo;0;L;;;;;N;;;;; +141D5;EGYPTIAN HIEROGLYPH-141D5;Lo;0;L;;;;;N;;;;; +141D6;EGYPTIAN HIEROGLYPH-141D6;Lo;0;L;;;;;N;;;;; +141D7;EGYPTIAN HIEROGLYPH-141D7;Lo;0;L;;;;;N;;;;; +141D8;EGYPTIAN HIEROGLYPH-141D8;Lo;0;L;;;;;N;;;;; +141D9;EGYPTIAN HIEROGLYPH-141D9;Lo;0;L;;;;;N;;;;; +141DA;EGYPTIAN HIEROGLYPH-141DA;Lo;0;L;;;;;N;;;;; +141DB;EGYPTIAN HIEROGLYPH-141DB;Lo;0;L;;;;;N;;;;; +141DC;EGYPTIAN HIEROGLYPH-141DC;Lo;0;L;;;;;N;;;;; +141DD;EGYPTIAN HIEROGLYPH-141DD;Lo;0;L;;;;;N;;;;; +141DE;EGYPTIAN HIEROGLYPH-141DE;Lo;0;L;;;;;N;;;;; +141DF;EGYPTIAN HIEROGLYPH-141DF;Lo;0;L;;;;;N;;;;; +141E0;EGYPTIAN HIEROGLYPH-141E0;Lo;0;L;;;;;N;;;;; +141E1;EGYPTIAN HIEROGLYPH-141E1;Lo;0;L;;;;;N;;;;; +141E2;EGYPTIAN HIEROGLYPH-141E2;Lo;0;L;;;;;N;;;;; +141E3;EGYPTIAN HIEROGLYPH-141E3;Lo;0;L;;;;;N;;;;; +141E4;EGYPTIAN HIEROGLYPH-141E4;Lo;0;L;;;;;N;;;;; +141E5;EGYPTIAN HIEROGLYPH-141E5;Lo;0;L;;;;;N;;;;; +141E6;EGYPTIAN HIEROGLYPH-141E6;Lo;0;L;;;;;N;;;;; +141E7;EGYPTIAN HIEROGLYPH-141E7;Lo;0;L;;;;;N;;;;; +141E8;EGYPTIAN HIEROGLYPH-141E8;Lo;0;L;;;;;N;;;;; +141E9;EGYPTIAN HIEROGLYPH-141E9;Lo;0;L;;;;;N;;;;; +141EA;EGYPTIAN HIEROGLYPH-141EA;Lo;0;L;;;;;N;;;;; +141EB;EGYPTIAN HIEROGLYPH-141EB;Lo;0;L;;;;;N;;;;; +141EC;EGYPTIAN HIEROGLYPH-141EC;Lo;0;L;;;;;N;;;;; +141ED;EGYPTIAN HIEROGLYPH-141ED;Lo;0;L;;;;;N;;;;; +141EE;EGYPTIAN HIEROGLYPH-141EE;Lo;0;L;;;;;N;;;;; +141EF;EGYPTIAN HIEROGLYPH-141EF;Lo;0;L;;;;;N;;;;; +141F0;EGYPTIAN HIEROGLYPH-141F0;Lo;0;L;;;;;N;;;;; +141F1;EGYPTIAN HIEROGLYPH-141F1;Lo;0;L;;;;;N;;;;; +141F2;EGYPTIAN HIEROGLYPH-141F2;Lo;0;L;;;;;N;;;;; +141F3;EGYPTIAN HIEROGLYPH-141F3;Lo;0;L;;;;;N;;;;; +141F4;EGYPTIAN HIEROGLYPH-141F4;Lo;0;L;;;;;N;;;;; +141F5;EGYPTIAN HIEROGLYPH-141F5;Lo;0;L;;;;;N;;;;; +141F6;EGYPTIAN HIEROGLYPH-141F6;Lo;0;L;;;;;N;;;;; +141F7;EGYPTIAN HIEROGLYPH-141F7;Lo;0;L;;;;;N;;;;; +141F8;EGYPTIAN HIEROGLYPH-141F8;Lo;0;L;;;;;N;;;;; +141F9;EGYPTIAN HIEROGLYPH-141F9;Lo;0;L;;;;;N;;;;; +141FA;EGYPTIAN HIEROGLYPH-141FA;Lo;0;L;;;;;N;;;;; +141FB;EGYPTIAN HIEROGLYPH-141FB;Lo;0;L;;;;;N;;;;; +141FC;EGYPTIAN HIEROGLYPH-141FC;Lo;0;L;;;;;N;;;;; +141FD;EGYPTIAN HIEROGLYPH-141FD;Lo;0;L;;;;;N;;;;; +141FE;EGYPTIAN HIEROGLYPH-141FE;Lo;0;L;;;;;N;;;;; +141FF;EGYPTIAN HIEROGLYPH-141FF;Lo;0;L;;;;;N;;;;; +14200;EGYPTIAN HIEROGLYPH-14200;Lo;0;L;;;;;N;;;;; +14201;EGYPTIAN HIEROGLYPH-14201;Lo;0;L;;;;;N;;;;; +14202;EGYPTIAN HIEROGLYPH-14202;Lo;0;L;;;;;N;;;;; +14203;EGYPTIAN HIEROGLYPH-14203;Lo;0;L;;;;;N;;;;; +14204;EGYPTIAN HIEROGLYPH-14204;Lo;0;L;;;;;N;;;;; +14205;EGYPTIAN HIEROGLYPH-14205;Lo;0;L;;;;;N;;;;; +14206;EGYPTIAN HIEROGLYPH-14206;Lo;0;L;;;;;N;;;;; +14207;EGYPTIAN HIEROGLYPH-14207;Lo;0;L;;;;;N;;;;; +14208;EGYPTIAN HIEROGLYPH-14208;Lo;0;L;;;;;N;;;;; +14209;EGYPTIAN HIEROGLYPH-14209;Lo;0;L;;;;;N;;;;; +1420A;EGYPTIAN HIEROGLYPH-1420A;Lo;0;L;;;;;N;;;;; +1420B;EGYPTIAN HIEROGLYPH-1420B;Lo;0;L;;;;;N;;;;; +1420C;EGYPTIAN HIEROGLYPH-1420C;Lo;0;L;;;;;N;;;;; +1420D;EGYPTIAN HIEROGLYPH-1420D;Lo;0;L;;;;;N;;;;; +1420E;EGYPTIAN HIEROGLYPH-1420E;Lo;0;L;;;;;N;;;;; +1420F;EGYPTIAN HIEROGLYPH-1420F;Lo;0;L;;;;;N;;;;; +14210;EGYPTIAN HIEROGLYPH-14210;Lo;0;L;;;;;N;;;;; +14211;EGYPTIAN HIEROGLYPH-14211;Lo;0;L;;;;;N;;;;; +14212;EGYPTIAN HIEROGLYPH-14212;Lo;0;L;;;;;N;;;;; +14213;EGYPTIAN HIEROGLYPH-14213;Lo;0;L;;;;;N;;;;; +14214;EGYPTIAN HIEROGLYPH-14214;Lo;0;L;;;;;N;;;;; +14215;EGYPTIAN HIEROGLYPH-14215;Lo;0;L;;;;;N;;;;; +14216;EGYPTIAN HIEROGLYPH-14216;Lo;0;L;;;;;N;;;;; +14217;EGYPTIAN HIEROGLYPH-14217;Lo;0;L;;;;;N;;;;; +14218;EGYPTIAN HIEROGLYPH-14218;Lo;0;L;;;;;N;;;;; +14219;EGYPTIAN HIEROGLYPH-14219;Lo;0;L;;;;;N;;;;; +1421A;EGYPTIAN HIEROGLYPH-1421A;Lo;0;L;;;;;N;;;;; +1421B;EGYPTIAN HIEROGLYPH-1421B;Lo;0;L;;;;;N;;;;; +1421C;EGYPTIAN HIEROGLYPH-1421C;Lo;0;L;;;;;N;;;;; +1421D;EGYPTIAN HIEROGLYPH-1421D;Lo;0;L;;;;;N;;;;; +1421E;EGYPTIAN HIEROGLYPH-1421E;Lo;0;L;;;;;N;;;;; +1421F;EGYPTIAN HIEROGLYPH-1421F;Lo;0;L;;;;;N;;;;; +14220;EGYPTIAN HIEROGLYPH-14220;Lo;0;L;;;;;N;;;;; +14221;EGYPTIAN HIEROGLYPH-14221;Lo;0;L;;;;;N;;;;; +14222;EGYPTIAN HIEROGLYPH-14222;Lo;0;L;;;;;N;;;;; +14223;EGYPTIAN HIEROGLYPH-14223;Lo;0;L;;;;;N;;;;; +14224;EGYPTIAN HIEROGLYPH-14224;Lo;0;L;;;;;N;;;;; +14225;EGYPTIAN HIEROGLYPH-14225;Lo;0;L;;;;;N;;;;; +14226;EGYPTIAN HIEROGLYPH-14226;Lo;0;L;;;;;N;;;;; +14227;EGYPTIAN HIEROGLYPH-14227;Lo;0;L;;;;;N;;;;; +14228;EGYPTIAN HIEROGLYPH-14228;Lo;0;L;;;;;N;;;;; +14229;EGYPTIAN HIEROGLYPH-14229;Lo;0;L;;;;;N;;;;; +1422A;EGYPTIAN HIEROGLYPH-1422A;Lo;0;L;;;;;N;;;;; +1422B;EGYPTIAN HIEROGLYPH-1422B;Lo;0;L;;;;;N;;;;; +1422C;EGYPTIAN HIEROGLYPH-1422C;Lo;0;L;;;;;N;;;;; +1422D;EGYPTIAN HIEROGLYPH-1422D;Lo;0;L;;;;;N;;;;; +1422E;EGYPTIAN HIEROGLYPH-1422E;Lo;0;L;;;;;N;;;;; +1422F;EGYPTIAN HIEROGLYPH-1422F;Lo;0;L;;;;;N;;;;; +14230;EGYPTIAN HIEROGLYPH-14230;Lo;0;L;;;;;N;;;;; +14231;EGYPTIAN HIEROGLYPH-14231;Lo;0;L;;;;;N;;;;; +14232;EGYPTIAN HIEROGLYPH-14232;Lo;0;L;;;;;N;;;;; +14233;EGYPTIAN HIEROGLYPH-14233;Lo;0;L;;;;;N;;;;; +14234;EGYPTIAN HIEROGLYPH-14234;Lo;0;L;;;;;N;;;;; +14235;EGYPTIAN HIEROGLYPH-14235;Lo;0;L;;;;;N;;;;; +14236;EGYPTIAN HIEROGLYPH-14236;Lo;0;L;;;;;N;;;;; +14237;EGYPTIAN HIEROGLYPH-14237;Lo;0;L;;;;;N;;;;; +14238;EGYPTIAN HIEROGLYPH-14238;Lo;0;L;;;;;N;;;;; +14239;EGYPTIAN HIEROGLYPH-14239;Lo;0;L;;;;;N;;;;; +1423A;EGYPTIAN HIEROGLYPH-1423A;Lo;0;L;;;;;N;;;;; +1423B;EGYPTIAN HIEROGLYPH-1423B;Lo;0;L;;;;;N;;;;; +1423C;EGYPTIAN HIEROGLYPH-1423C;Lo;0;L;;;;;N;;;;; +1423D;EGYPTIAN HIEROGLYPH-1423D;Lo;0;L;;;;;N;;;;; +1423E;EGYPTIAN HIEROGLYPH-1423E;Lo;0;L;;;;;N;;;;; +1423F;EGYPTIAN HIEROGLYPH-1423F;Lo;0;L;;;;;N;;;;; +14240;EGYPTIAN HIEROGLYPH-14240;Lo;0;L;;;;;N;;;;; +14241;EGYPTIAN HIEROGLYPH-14241;Lo;0;L;;;;;N;;;;; +14242;EGYPTIAN HIEROGLYPH-14242;Lo;0;L;;;;;N;;;;; +14243;EGYPTIAN HIEROGLYPH-14243;Lo;0;L;;;;;N;;;;; +14244;EGYPTIAN HIEROGLYPH-14244;Lo;0;L;;;;;N;;;;; +14245;EGYPTIAN HIEROGLYPH-14245;Lo;0;L;;;;;N;;;;; +14246;EGYPTIAN HIEROGLYPH-14246;Lo;0;L;;;;;N;;;;; +14247;EGYPTIAN HIEROGLYPH-14247;Lo;0;L;;;;;N;;;;; +14248;EGYPTIAN HIEROGLYPH-14248;Lo;0;L;;;;;N;;;;; +14249;EGYPTIAN HIEROGLYPH-14249;Lo;0;L;;;;;N;;;;; +1424A;EGYPTIAN HIEROGLYPH-1424A;Lo;0;L;;;;;N;;;;; +1424B;EGYPTIAN HIEROGLYPH-1424B;Lo;0;L;;;;;N;;;;; +1424C;EGYPTIAN HIEROGLYPH-1424C;Lo;0;L;;;;;N;;;;; +1424D;EGYPTIAN HIEROGLYPH-1424D;Lo;0;L;;;;;N;;;;; +1424E;EGYPTIAN HIEROGLYPH-1424E;Lo;0;L;;;;;N;;;;; +1424F;EGYPTIAN HIEROGLYPH-1424F;Lo;0;L;;;;;N;;;;; +14250;EGYPTIAN HIEROGLYPH-14250;Lo;0;L;;;;;N;;;;; +14251;EGYPTIAN HIEROGLYPH-14251;Lo;0;L;;;;;N;;;;; +14252;EGYPTIAN HIEROGLYPH-14252;Lo;0;L;;;;;N;;;;; +14253;EGYPTIAN HIEROGLYPH-14253;Lo;0;L;;;;;N;;;;; +14254;EGYPTIAN HIEROGLYPH-14254;Lo;0;L;;;;;N;;;;; +14255;EGYPTIAN HIEROGLYPH-14255;Lo;0;L;;;;;N;;;;; +14256;EGYPTIAN HIEROGLYPH-14256;Lo;0;L;;;;;N;;;;; +14257;EGYPTIAN HIEROGLYPH-14257;Lo;0;L;;;;;N;;;;; +14258;EGYPTIAN HIEROGLYPH-14258;Lo;0;L;;;;;N;;;;; +14259;EGYPTIAN HIEROGLYPH-14259;Lo;0;L;;;;;N;;;;; +1425A;EGYPTIAN HIEROGLYPH-1425A;Lo;0;L;;;;;N;;;;; +1425B;EGYPTIAN HIEROGLYPH-1425B;Lo;0;L;;;;;N;;;;; +1425C;EGYPTIAN HIEROGLYPH-1425C;Lo;0;L;;;;;N;;;;; +1425D;EGYPTIAN HIEROGLYPH-1425D;Lo;0;L;;;;;N;;;;; +1425E;EGYPTIAN HIEROGLYPH-1425E;Lo;0;L;;;;;N;;;;; +1425F;EGYPTIAN HIEROGLYPH-1425F;Lo;0;L;;;;;N;;;;; +14260;EGYPTIAN HIEROGLYPH-14260;Lo;0;L;;;;;N;;;;; +14261;EGYPTIAN HIEROGLYPH-14261;Lo;0;L;;;;;N;;;;; +14262;EGYPTIAN HIEROGLYPH-14262;Lo;0;L;;;;;N;;;;; +14263;EGYPTIAN HIEROGLYPH-14263;Lo;0;L;;;;;N;;;;; +14264;EGYPTIAN HIEROGLYPH-14264;Lo;0;L;;;;;N;;;;; +14265;EGYPTIAN HIEROGLYPH-14265;Lo;0;L;;;;;N;;;;; +14266;EGYPTIAN HIEROGLYPH-14266;Lo;0;L;;;;;N;;;;; +14267;EGYPTIAN HIEROGLYPH-14267;Lo;0;L;;;;;N;;;;; +14268;EGYPTIAN HIEROGLYPH-14268;Lo;0;L;;;;;N;;;;; +14269;EGYPTIAN HIEROGLYPH-14269;Lo;0;L;;;;;N;;;;; +1426A;EGYPTIAN HIEROGLYPH-1426A;Lo;0;L;;;;;N;;;;; +1426B;EGYPTIAN HIEROGLYPH-1426B;Lo;0;L;;;;;N;;;;; +1426C;EGYPTIAN HIEROGLYPH-1426C;Lo;0;L;;;;;N;;;;; +1426D;EGYPTIAN HIEROGLYPH-1426D;Lo;0;L;;;;;N;;;;; +1426E;EGYPTIAN HIEROGLYPH-1426E;Lo;0;L;;;;;N;;;;; +1426F;EGYPTIAN HIEROGLYPH-1426F;Lo;0;L;;;;;N;;;;; +14270;EGYPTIAN HIEROGLYPH-14270;Lo;0;L;;;;;N;;;;; +14271;EGYPTIAN HIEROGLYPH-14271;Lo;0;L;;;;;N;;;;; +14272;EGYPTIAN HIEROGLYPH-14272;Lo;0;L;;;;;N;;;;; +14273;EGYPTIAN HIEROGLYPH-14273;Lo;0;L;;;;;N;;;;; +14274;EGYPTIAN HIEROGLYPH-14274;Lo;0;L;;;;;N;;;;; +14275;EGYPTIAN HIEROGLYPH-14275;Lo;0;L;;;;;N;;;;; +14276;EGYPTIAN HIEROGLYPH-14276;Lo;0;L;;;;;N;;;;; +14277;EGYPTIAN HIEROGLYPH-14277;Lo;0;L;;;;;N;;;;; +14278;EGYPTIAN HIEROGLYPH-14278;Lo;0;L;;;;;N;;;;; +14279;EGYPTIAN HIEROGLYPH-14279;Lo;0;L;;;;;N;;;;; +1427A;EGYPTIAN HIEROGLYPH-1427A;Lo;0;L;;;;;N;;;;; +1427B;EGYPTIAN HIEROGLYPH-1427B;Lo;0;L;;;;;N;;;;; +1427C;EGYPTIAN HIEROGLYPH-1427C;Lo;0;L;;;;;N;;;;; +1427D;EGYPTIAN HIEROGLYPH-1427D;Lo;0;L;;;;;N;;;;; +1427E;EGYPTIAN HIEROGLYPH-1427E;Lo;0;L;;;;;N;;;;; +1427F;EGYPTIAN HIEROGLYPH-1427F;Lo;0;L;;;;;N;;;;; +14280;EGYPTIAN HIEROGLYPH-14280;Lo;0;L;;;;;N;;;;; +14281;EGYPTIAN HIEROGLYPH-14281;Lo;0;L;;;;;N;;;;; +14282;EGYPTIAN HIEROGLYPH-14282;Lo;0;L;;;;;N;;;;; +14283;EGYPTIAN HIEROGLYPH-14283;Lo;0;L;;;;;N;;;;; +14284;EGYPTIAN HIEROGLYPH-14284;Lo;0;L;;;;;N;;;;; +14285;EGYPTIAN HIEROGLYPH-14285;Lo;0;L;;;;;N;;;;; +14286;EGYPTIAN HIEROGLYPH-14286;Lo;0;L;;;;;N;;;;; +14287;EGYPTIAN HIEROGLYPH-14287;Lo;0;L;;;;;N;;;;; +14288;EGYPTIAN HIEROGLYPH-14288;Lo;0;L;;;;;N;;;;; +14289;EGYPTIAN HIEROGLYPH-14289;Lo;0;L;;;;;N;;;;; +1428A;EGYPTIAN HIEROGLYPH-1428A;Lo;0;L;;;;;N;;;;; +1428B;EGYPTIAN HIEROGLYPH-1428B;Lo;0;L;;;;;N;;;;; +1428C;EGYPTIAN HIEROGLYPH-1428C;Lo;0;L;;;;;N;;;;; +1428D;EGYPTIAN HIEROGLYPH-1428D;Lo;0;L;;;;;N;;;;; +1428E;EGYPTIAN HIEROGLYPH-1428E;Lo;0;L;;;;;N;;;;; +1428F;EGYPTIAN HIEROGLYPH-1428F;Lo;0;L;;;;;N;;;;; +14290;EGYPTIAN HIEROGLYPH-14290;Lo;0;L;;;;;N;;;;; +14291;EGYPTIAN HIEROGLYPH-14291;Lo;0;L;;;;;N;;;;; +14292;EGYPTIAN HIEROGLYPH-14292;Lo;0;L;;;;;N;;;;; +14293;EGYPTIAN HIEROGLYPH-14293;Lo;0;L;;;;;N;;;;; +14294;EGYPTIAN HIEROGLYPH-14294;Lo;0;L;;;;;N;;;;; +14295;EGYPTIAN HIEROGLYPH-14295;Lo;0;L;;;;;N;;;;; +14296;EGYPTIAN HIEROGLYPH-14296;Lo;0;L;;;;;N;;;;; +14297;EGYPTIAN HIEROGLYPH-14297;Lo;0;L;;;;;N;;;;; +14298;EGYPTIAN HIEROGLYPH-14298;Lo;0;L;;;;;N;;;;; +14299;EGYPTIAN HIEROGLYPH-14299;Lo;0;L;;;;;N;;;;; +1429A;EGYPTIAN HIEROGLYPH-1429A;Lo;0;L;;;;;N;;;;; +1429B;EGYPTIAN HIEROGLYPH-1429B;Lo;0;L;;;;;N;;;;; +1429C;EGYPTIAN HIEROGLYPH-1429C;Lo;0;L;;;;;N;;;;; +1429D;EGYPTIAN HIEROGLYPH-1429D;Lo;0;L;;;;;N;;;;; +1429E;EGYPTIAN HIEROGLYPH-1429E;Lo;0;L;;;;;N;;;;; +1429F;EGYPTIAN HIEROGLYPH-1429F;Lo;0;L;;;;;N;;;;; +142A0;EGYPTIAN HIEROGLYPH-142A0;Lo;0;L;;;;;N;;;;; +142A1;EGYPTIAN HIEROGLYPH-142A1;Lo;0;L;;;;;N;;;;; +142A2;EGYPTIAN HIEROGLYPH-142A2;Lo;0;L;;;;;N;;;;; +142A3;EGYPTIAN HIEROGLYPH-142A3;Lo;0;L;;;;;N;;;;; +142A4;EGYPTIAN HIEROGLYPH-142A4;Lo;0;L;;;;;N;;;;; +142A5;EGYPTIAN HIEROGLYPH-142A5;Lo;0;L;;;;;N;;;;; +142A6;EGYPTIAN HIEROGLYPH-142A6;Lo;0;L;;;;;N;;;;; +142A7;EGYPTIAN HIEROGLYPH-142A7;Lo;0;L;;;;;N;;;;; +142A8;EGYPTIAN HIEROGLYPH-142A8;Lo;0;L;;;;;N;;;;; +142A9;EGYPTIAN HIEROGLYPH-142A9;Lo;0;L;;;;;N;;;;; +142AA;EGYPTIAN HIEROGLYPH-142AA;Lo;0;L;;;;;N;;;;; +142AB;EGYPTIAN HIEROGLYPH-142AB;Lo;0;L;;;;;N;;;;; +142AC;EGYPTIAN HIEROGLYPH-142AC;Lo;0;L;;;;;N;;;;; +142AD;EGYPTIAN HIEROGLYPH-142AD;Lo;0;L;;;;;N;;;;; +142AE;EGYPTIAN HIEROGLYPH-142AE;Lo;0;L;;;;;N;;;;; +142AF;EGYPTIAN HIEROGLYPH-142AF;Lo;0;L;;;;;N;;;;; +142B0;EGYPTIAN HIEROGLYPH-142B0;Lo;0;L;;;;;N;;;;; +142B1;EGYPTIAN HIEROGLYPH-142B1;Lo;0;L;;;;;N;;;;; +142B2;EGYPTIAN HIEROGLYPH-142B2;Lo;0;L;;;;;N;;;;; +142B3;EGYPTIAN HIEROGLYPH-142B3;Lo;0;L;;;;;N;;;;; +142B4;EGYPTIAN HIEROGLYPH-142B4;Lo;0;L;;;;;N;;;;; +142B5;EGYPTIAN HIEROGLYPH-142B5;Lo;0;L;;;;;N;;;;; +142B6;EGYPTIAN HIEROGLYPH-142B6;Lo;0;L;;;;;N;;;;; +142B7;EGYPTIAN HIEROGLYPH-142B7;Lo;0;L;;;;;N;;;;; +142B8;EGYPTIAN HIEROGLYPH-142B8;Lo;0;L;;;;;N;;;;; +142B9;EGYPTIAN HIEROGLYPH-142B9;Lo;0;L;;;;;N;;;;; +142BA;EGYPTIAN HIEROGLYPH-142BA;Lo;0;L;;;;;N;;;;; +142BB;EGYPTIAN HIEROGLYPH-142BB;Lo;0;L;;;;;N;;;;; +142BC;EGYPTIAN HIEROGLYPH-142BC;Lo;0;L;;;;;N;;;;; +142BD;EGYPTIAN HIEROGLYPH-142BD;Lo;0;L;;;;;N;;;;; +142BE;EGYPTIAN HIEROGLYPH-142BE;Lo;0;L;;;;;N;;;;; +142BF;EGYPTIAN HIEROGLYPH-142BF;Lo;0;L;;;;;N;;;;; +142C0;EGYPTIAN HIEROGLYPH-142C0;Lo;0;L;;;;;N;;;;; +142C1;EGYPTIAN HIEROGLYPH-142C1;Lo;0;L;;;;;N;;;;; +142C2;EGYPTIAN HIEROGLYPH-142C2;Lo;0;L;;;;;N;;;;; +142C3;EGYPTIAN HIEROGLYPH-142C3;Lo;0;L;;;;;N;;;;; +142C4;EGYPTIAN HIEROGLYPH-142C4;Lo;0;L;;;;;N;;;;; +142C5;EGYPTIAN HIEROGLYPH-142C5;Lo;0;L;;;;;N;;;;; +142C6;EGYPTIAN HIEROGLYPH-142C6;Lo;0;L;;;;;N;;;;; +142C7;EGYPTIAN HIEROGLYPH-142C7;Lo;0;L;;;;;N;;;;; +142C8;EGYPTIAN HIEROGLYPH-142C8;Lo;0;L;;;;;N;;;;; +142C9;EGYPTIAN HIEROGLYPH-142C9;Lo;0;L;;;;;N;;;;; +142CA;EGYPTIAN HIEROGLYPH-142CA;Lo;0;L;;;;;N;;;;; +142CB;EGYPTIAN HIEROGLYPH-142CB;Lo;0;L;;;;;N;;;;; +142CC;EGYPTIAN HIEROGLYPH-142CC;Lo;0;L;;;;;N;;;;; +142CD;EGYPTIAN HIEROGLYPH-142CD;Lo;0;L;;;;;N;;;;; +142CE;EGYPTIAN HIEROGLYPH-142CE;Lo;0;L;;;;;N;;;;; +142CF;EGYPTIAN HIEROGLYPH-142CF;Lo;0;L;;;;;N;;;;; +142D0;EGYPTIAN HIEROGLYPH-142D0;Lo;0;L;;;;;N;;;;; +142D1;EGYPTIAN HIEROGLYPH-142D1;Lo;0;L;;;;;N;;;;; +142D2;EGYPTIAN HIEROGLYPH-142D2;Lo;0;L;;;;;N;;;;; +142D3;EGYPTIAN HIEROGLYPH-142D3;Lo;0;L;;;;;N;;;;; +142D4;EGYPTIAN HIEROGLYPH-142D4;Lo;0;L;;;;;N;;;;; +142D5;EGYPTIAN HIEROGLYPH-142D5;Lo;0;L;;;;;N;;;;; +142D6;EGYPTIAN HIEROGLYPH-142D6;Lo;0;L;;;;;N;;;;; +142D7;EGYPTIAN HIEROGLYPH-142D7;Lo;0;L;;;;;N;;;;; +142D8;EGYPTIAN HIEROGLYPH-142D8;Lo;0;L;;;;;N;;;;; +142D9;EGYPTIAN HIEROGLYPH-142D9;Lo;0;L;;;;;N;;;;; +142DA;EGYPTIAN HIEROGLYPH-142DA;Lo;0;L;;;;;N;;;;; +142DB;EGYPTIAN HIEROGLYPH-142DB;Lo;0;L;;;;;N;;;;; +142DC;EGYPTIAN HIEROGLYPH-142DC;Lo;0;L;;;;;N;;;;; +142DD;EGYPTIAN HIEROGLYPH-142DD;Lo;0;L;;;;;N;;;;; +142DE;EGYPTIAN HIEROGLYPH-142DE;Lo;0;L;;;;;N;;;;; +142DF;EGYPTIAN HIEROGLYPH-142DF;Lo;0;L;;;;;N;;;;; +142E0;EGYPTIAN HIEROGLYPH-142E0;Lo;0;L;;;;;N;;;;; +142E1;EGYPTIAN HIEROGLYPH-142E1;Lo;0;L;;;;;N;;;;; +142E2;EGYPTIAN HIEROGLYPH-142E2;Lo;0;L;;;;;N;;;;; +142E3;EGYPTIAN HIEROGLYPH-142E3;Lo;0;L;;;;;N;;;;; +142E4;EGYPTIAN HIEROGLYPH-142E4;Lo;0;L;;;;;N;;;;; +142E5;EGYPTIAN HIEROGLYPH-142E5;Lo;0;L;;;;;N;;;;; +142E6;EGYPTIAN HIEROGLYPH-142E6;Lo;0;L;;;;;N;;;;; +142E7;EGYPTIAN HIEROGLYPH-142E7;Lo;0;L;;;;;N;;;;; +142E8;EGYPTIAN HIEROGLYPH-142E8;Lo;0;L;;;;;N;;;;; +142E9;EGYPTIAN HIEROGLYPH-142E9;Lo;0;L;;;;;N;;;;; +142EA;EGYPTIAN HIEROGLYPH-142EA;Lo;0;L;;;;;N;;;;; +142EB;EGYPTIAN HIEROGLYPH-142EB;Lo;0;L;;;;;N;;;;; +142EC;EGYPTIAN HIEROGLYPH-142EC;Lo;0;L;;;;;N;;;;; +142ED;EGYPTIAN HIEROGLYPH-142ED;Lo;0;L;;;;;N;;;;; +142EE;EGYPTIAN HIEROGLYPH-142EE;Lo;0;L;;;;;N;;;;; +142EF;EGYPTIAN HIEROGLYPH-142EF;Lo;0;L;;;;;N;;;;; +142F0;EGYPTIAN HIEROGLYPH-142F0;Lo;0;L;;;;;N;;;;; +142F1;EGYPTIAN HIEROGLYPH-142F1;Lo;0;L;;;;;N;;;;; +142F2;EGYPTIAN HIEROGLYPH-142F2;Lo;0;L;;;;;N;;;;; +142F3;EGYPTIAN HIEROGLYPH-142F3;Lo;0;L;;;;;N;;;;; +142F4;EGYPTIAN HIEROGLYPH-142F4;Lo;0;L;;;;;N;;;;; +142F5;EGYPTIAN HIEROGLYPH-142F5;Lo;0;L;;;;;N;;;;; +142F6;EGYPTIAN HIEROGLYPH-142F6;Lo;0;L;;;;;N;;;;; +142F7;EGYPTIAN HIEROGLYPH-142F7;Lo;0;L;;;;;N;;;;; +142F8;EGYPTIAN HIEROGLYPH-142F8;Lo;0;L;;;;;N;;;;; +142F9;EGYPTIAN HIEROGLYPH-142F9;Lo;0;L;;;;;N;;;;; +142FA;EGYPTIAN HIEROGLYPH-142FA;Lo;0;L;;;;;N;;;;; +142FB;EGYPTIAN HIEROGLYPH-142FB;Lo;0;L;;;;;N;;;;; +142FC;EGYPTIAN HIEROGLYPH-142FC;Lo;0;L;;;;;N;;;;; +142FD;EGYPTIAN HIEROGLYPH-142FD;Lo;0;L;;;;;N;;;;; +142FE;EGYPTIAN HIEROGLYPH-142FE;Lo;0;L;;;;;N;;;;; +142FF;EGYPTIAN HIEROGLYPH-142FF;Lo;0;L;;;;;N;;;;; +14300;EGYPTIAN HIEROGLYPH-14300;Lo;0;L;;;;;N;;;;; +14301;EGYPTIAN HIEROGLYPH-14301;Lo;0;L;;;;;N;;;;; +14302;EGYPTIAN HIEROGLYPH-14302;Lo;0;L;;;;;N;;;;; +14303;EGYPTIAN HIEROGLYPH-14303;Lo;0;L;;;;;N;;;;; +14304;EGYPTIAN HIEROGLYPH-14304;Lo;0;L;;;;;N;;;;; +14305;EGYPTIAN HIEROGLYPH-14305;Lo;0;L;;;;;N;;;;; +14306;EGYPTIAN HIEROGLYPH-14306;Lo;0;L;;;;;N;;;;; +14307;EGYPTIAN HIEROGLYPH-14307;Lo;0;L;;;;;N;;;;; +14308;EGYPTIAN HIEROGLYPH-14308;Lo;0;L;;;;;N;;;;; +14309;EGYPTIAN HIEROGLYPH-14309;Lo;0;L;;;;;N;;;;; +1430A;EGYPTIAN HIEROGLYPH-1430A;Lo;0;L;;;;;N;;;;; +1430B;EGYPTIAN HIEROGLYPH-1430B;Lo;0;L;;;;;N;;;;; +1430C;EGYPTIAN HIEROGLYPH-1430C;Lo;0;L;;;;;N;;;;; +1430D;EGYPTIAN HIEROGLYPH-1430D;Lo;0;L;;;;;N;;;;; +1430E;EGYPTIAN HIEROGLYPH-1430E;Lo;0;L;;;;;N;;;;; +1430F;EGYPTIAN HIEROGLYPH-1430F;Lo;0;L;;;;;N;;;;; +14310;EGYPTIAN HIEROGLYPH-14310;Lo;0;L;;;;;N;;;;; +14311;EGYPTIAN HIEROGLYPH-14311;Lo;0;L;;;;;N;;;;; +14312;EGYPTIAN HIEROGLYPH-14312;Lo;0;L;;;;;N;;;;; +14313;EGYPTIAN HIEROGLYPH-14313;Lo;0;L;;;;;N;;;;; +14314;EGYPTIAN HIEROGLYPH-14314;Lo;0;L;;;;;N;;;;; +14315;EGYPTIAN HIEROGLYPH-14315;Lo;0;L;;;;;N;;;;; +14316;EGYPTIAN HIEROGLYPH-14316;Lo;0;L;;;;;N;;;;; +14317;EGYPTIAN HIEROGLYPH-14317;Lo;0;L;;;;;N;;;;; +14318;EGYPTIAN HIEROGLYPH-14318;Lo;0;L;;;;;N;;;;; +14319;EGYPTIAN HIEROGLYPH-14319;Lo;0;L;;;;;N;;;;; +1431A;EGYPTIAN HIEROGLYPH-1431A;Lo;0;L;;;;;N;;;;; +1431B;EGYPTIAN HIEROGLYPH-1431B;Lo;0;L;;;;;N;;;;; +1431C;EGYPTIAN HIEROGLYPH-1431C;Lo;0;L;;;;;N;;;;; +1431D;EGYPTIAN HIEROGLYPH-1431D;Lo;0;L;;;;;N;;;;; +1431E;EGYPTIAN HIEROGLYPH-1431E;Lo;0;L;;;;;N;;;;; +1431F;EGYPTIAN HIEROGLYPH-1431F;Lo;0;L;;;;;N;;;;; +14320;EGYPTIAN HIEROGLYPH-14320;Lo;0;L;;;;;N;;;;; +14321;EGYPTIAN HIEROGLYPH-14321;Lo;0;L;;;;;N;;;;; +14322;EGYPTIAN HIEROGLYPH-14322;Lo;0;L;;;;;N;;;;; +14323;EGYPTIAN HIEROGLYPH-14323;Lo;0;L;;;;;N;;;;; +14324;EGYPTIAN HIEROGLYPH-14324;Lo;0;L;;;;;N;;;;; +14325;EGYPTIAN HIEROGLYPH-14325;Lo;0;L;;;;;N;;;;; +14326;EGYPTIAN HIEROGLYPH-14326;Lo;0;L;;;;;N;;;;; +14327;EGYPTIAN HIEROGLYPH-14327;Lo;0;L;;;;;N;;;;; +14328;EGYPTIAN HIEROGLYPH-14328;Lo;0;L;;;;;N;;;;; +14329;EGYPTIAN HIEROGLYPH-14329;Lo;0;L;;;;;N;;;;; +1432A;EGYPTIAN HIEROGLYPH-1432A;Lo;0;L;;;;;N;;;;; +1432B;EGYPTIAN HIEROGLYPH-1432B;Lo;0;L;;;;;N;;;;; +1432C;EGYPTIAN HIEROGLYPH-1432C;Lo;0;L;;;;;N;;;;; +1432D;EGYPTIAN HIEROGLYPH-1432D;Lo;0;L;;;;;N;;;;; +1432E;EGYPTIAN HIEROGLYPH-1432E;Lo;0;L;;;;;N;;;;; +1432F;EGYPTIAN HIEROGLYPH-1432F;Lo;0;L;;;;;N;;;;; +14330;EGYPTIAN HIEROGLYPH-14330;Lo;0;L;;;;;N;;;;; +14331;EGYPTIAN HIEROGLYPH-14331;Lo;0;L;;;;;N;;;;; +14332;EGYPTIAN HIEROGLYPH-14332;Lo;0;L;;;;;N;;;;; +14333;EGYPTIAN HIEROGLYPH-14333;Lo;0;L;;;;;N;;;;; +14334;EGYPTIAN HIEROGLYPH-14334;Lo;0;L;;;;;N;;;;; +14335;EGYPTIAN HIEROGLYPH-14335;Lo;0;L;;;;;N;;;;; +14336;EGYPTIAN HIEROGLYPH-14336;Lo;0;L;;;;;N;;;;; +14337;EGYPTIAN HIEROGLYPH-14337;Lo;0;L;;;;;N;;;;; +14338;EGYPTIAN HIEROGLYPH-14338;Lo;0;L;;;;;N;;;;; +14339;EGYPTIAN HIEROGLYPH-14339;Lo;0;L;;;;;N;;;;; +1433A;EGYPTIAN HIEROGLYPH-1433A;Lo;0;L;;;;;N;;;;; +1433B;EGYPTIAN HIEROGLYPH-1433B;Lo;0;L;;;;;N;;;;; +1433C;EGYPTIAN HIEROGLYPH-1433C;Lo;0;L;;;;;N;;;;; +1433D;EGYPTIAN HIEROGLYPH-1433D;Lo;0;L;;;;;N;;;;; +1433E;EGYPTIAN HIEROGLYPH-1433E;Lo;0;L;;;;;N;;;;; +1433F;EGYPTIAN HIEROGLYPH-1433F;Lo;0;L;;;;;N;;;;; +14340;EGYPTIAN HIEROGLYPH-14340;Lo;0;L;;;;;N;;;;; +14341;EGYPTIAN HIEROGLYPH-14341;Lo;0;L;;;;;N;;;;; +14342;EGYPTIAN HIEROGLYPH-14342;Lo;0;L;;;;;N;;;;; +14343;EGYPTIAN HIEROGLYPH-14343;Lo;0;L;;;;;N;;;;; +14344;EGYPTIAN HIEROGLYPH-14344;Lo;0;L;;;;;N;;;;; +14345;EGYPTIAN HIEROGLYPH-14345;Lo;0;L;;;;;N;;;;; +14346;EGYPTIAN HIEROGLYPH-14346;Lo;0;L;;;;;N;;;;; +14347;EGYPTIAN HIEROGLYPH-14347;Lo;0;L;;;;;N;;;;; +14348;EGYPTIAN HIEROGLYPH-14348;Lo;0;L;;;;;N;;;;; +14349;EGYPTIAN HIEROGLYPH-14349;Lo;0;L;;;;;N;;;;; +1434A;EGYPTIAN HIEROGLYPH-1434A;Lo;0;L;;;;;N;;;;; +1434B;EGYPTIAN HIEROGLYPH-1434B;Lo;0;L;;;;;N;;;;; +1434C;EGYPTIAN HIEROGLYPH-1434C;Lo;0;L;;;;;N;;;;; +1434D;EGYPTIAN HIEROGLYPH-1434D;Lo;0;L;;;;;N;;;;; +1434E;EGYPTIAN HIEROGLYPH-1434E;Lo;0;L;;;;;N;;;;; +1434F;EGYPTIAN HIEROGLYPH-1434F;Lo;0;L;;;;;N;;;;; +14350;EGYPTIAN HIEROGLYPH-14350;Lo;0;L;;;;;N;;;;; +14351;EGYPTIAN HIEROGLYPH-14351;Lo;0;L;;;;;N;;;;; +14352;EGYPTIAN HIEROGLYPH-14352;Lo;0;L;;;;;N;;;;; +14353;EGYPTIAN HIEROGLYPH-14353;Lo;0;L;;;;;N;;;;; +14354;EGYPTIAN HIEROGLYPH-14354;Lo;0;L;;;;;N;;;;; +14355;EGYPTIAN HIEROGLYPH-14355;Lo;0;L;;;;;N;;;;; +14356;EGYPTIAN HIEROGLYPH-14356;Lo;0;L;;;;;N;;;;; +14357;EGYPTIAN HIEROGLYPH-14357;Lo;0;L;;;;;N;;;;; +14358;EGYPTIAN HIEROGLYPH-14358;Lo;0;L;;;;;N;;;;; +14359;EGYPTIAN HIEROGLYPH-14359;Lo;0;L;;;;;N;;;;; +1435A;EGYPTIAN HIEROGLYPH-1435A;Lo;0;L;;;;;N;;;;; +1435B;EGYPTIAN HIEROGLYPH-1435B;Lo;0;L;;;;;N;;;;; +1435C;EGYPTIAN HIEROGLYPH-1435C;Lo;0;L;;;;;N;;;;; +1435D;EGYPTIAN HIEROGLYPH-1435D;Lo;0;L;;;;;N;;;;; +1435E;EGYPTIAN HIEROGLYPH-1435E;Lo;0;L;;;;;N;;;;; +1435F;EGYPTIAN HIEROGLYPH-1435F;Lo;0;L;;;;;N;;;;; +14360;EGYPTIAN HIEROGLYPH-14360;Lo;0;L;;;;;N;;;;; +14361;EGYPTIAN HIEROGLYPH-14361;Lo;0;L;;;;;N;;;;; +14362;EGYPTIAN HIEROGLYPH-14362;Lo;0;L;;;;;N;;;;; +14363;EGYPTIAN HIEROGLYPH-14363;Lo;0;L;;;;;N;;;;; +14364;EGYPTIAN HIEROGLYPH-14364;Lo;0;L;;;;;N;;;;; +14365;EGYPTIAN HIEROGLYPH-14365;Lo;0;L;;;;;N;;;;; +14366;EGYPTIAN HIEROGLYPH-14366;Lo;0;L;;;;;N;;;;; +14367;EGYPTIAN HIEROGLYPH-14367;Lo;0;L;;;;;N;;;;; +14368;EGYPTIAN HIEROGLYPH-14368;Lo;0;L;;;;;N;;;;; +14369;EGYPTIAN HIEROGLYPH-14369;Lo;0;L;;;;;N;;;;; +1436A;EGYPTIAN HIEROGLYPH-1436A;Lo;0;L;;;;;N;;;;; +1436B;EGYPTIAN HIEROGLYPH-1436B;Lo;0;L;;;;;N;;;;; +1436C;EGYPTIAN HIEROGLYPH-1436C;Lo;0;L;;;;;N;;;;; +1436D;EGYPTIAN HIEROGLYPH-1436D;Lo;0;L;;;;;N;;;;; +1436E;EGYPTIAN HIEROGLYPH-1436E;Lo;0;L;;;;;N;;;;; +1436F;EGYPTIAN HIEROGLYPH-1436F;Lo;0;L;;;;;N;;;;; +14370;EGYPTIAN HIEROGLYPH-14370;Lo;0;L;;;;;N;;;;; +14371;EGYPTIAN HIEROGLYPH-14371;Lo;0;L;;;;;N;;;;; +14372;EGYPTIAN HIEROGLYPH-14372;Lo;0;L;;;;;N;;;;; +14373;EGYPTIAN HIEROGLYPH-14373;Lo;0;L;;;;;N;;;;; +14374;EGYPTIAN HIEROGLYPH-14374;Lo;0;L;;;;;N;;;;; +14375;EGYPTIAN HIEROGLYPH-14375;Lo;0;L;;;;;N;;;;; +14376;EGYPTIAN HIEROGLYPH-14376;Lo;0;L;;;;;N;;;;; +14377;EGYPTIAN HIEROGLYPH-14377;Lo;0;L;;;;;N;;;;; +14378;EGYPTIAN HIEROGLYPH-14378;Lo;0;L;;;;;N;;;;; +14379;EGYPTIAN HIEROGLYPH-14379;Lo;0;L;;;;;N;;;;; +1437A;EGYPTIAN HIEROGLYPH-1437A;Lo;0;L;;;;;N;;;;; +1437B;EGYPTIAN HIEROGLYPH-1437B;Lo;0;L;;;;;N;;;;; +1437C;EGYPTIAN HIEROGLYPH-1437C;Lo;0;L;;;;;N;;;;; +1437D;EGYPTIAN HIEROGLYPH-1437D;Lo;0;L;;;;;N;;;;; +1437E;EGYPTIAN HIEROGLYPH-1437E;Lo;0;L;;;;;N;;;;; +1437F;EGYPTIAN HIEROGLYPH-1437F;Lo;0;L;;;;;N;;;;; +14380;EGYPTIAN HIEROGLYPH-14380;Lo;0;L;;;;;N;;;;; +14381;EGYPTIAN HIEROGLYPH-14381;Lo;0;L;;;;;N;;;;; +14382;EGYPTIAN HIEROGLYPH-14382;Lo;0;L;;;;;N;;;;; +14383;EGYPTIAN HIEROGLYPH-14383;Lo;0;L;;;;;N;;;;; +14384;EGYPTIAN HIEROGLYPH-14384;Lo;0;L;;;;;N;;;;; +14385;EGYPTIAN HIEROGLYPH-14385;Lo;0;L;;;;;N;;;;; +14386;EGYPTIAN HIEROGLYPH-14386;Lo;0;L;;;;;N;;;;; +14387;EGYPTIAN HIEROGLYPH-14387;Lo;0;L;;;;;N;;;;; +14388;EGYPTIAN HIEROGLYPH-14388;Lo;0;L;;;;;N;;;;; +14389;EGYPTIAN HIEROGLYPH-14389;Lo;0;L;;;;;N;;;;; +1438A;EGYPTIAN HIEROGLYPH-1438A;Lo;0;L;;;;;N;;;;; +1438B;EGYPTIAN HIEROGLYPH-1438B;Lo;0;L;;;;;N;;;;; +1438C;EGYPTIAN HIEROGLYPH-1438C;Lo;0;L;;;;;N;;;;; +1438D;EGYPTIAN HIEROGLYPH-1438D;Lo;0;L;;;;;N;;;;; +1438E;EGYPTIAN HIEROGLYPH-1438E;Lo;0;L;;;;;N;;;;; +1438F;EGYPTIAN HIEROGLYPH-1438F;Lo;0;L;;;;;N;;;;; +14390;EGYPTIAN HIEROGLYPH-14390;Lo;0;L;;;;;N;;;;; +14391;EGYPTIAN HIEROGLYPH-14391;Lo;0;L;;;;;N;;;;; +14392;EGYPTIAN HIEROGLYPH-14392;Lo;0;L;;;;;N;;;;; +14393;EGYPTIAN HIEROGLYPH-14393;Lo;0;L;;;;;N;;;;; +14394;EGYPTIAN HIEROGLYPH-14394;Lo;0;L;;;;;N;;;;; +14395;EGYPTIAN HIEROGLYPH-14395;Lo;0;L;;;;;N;;;;; +14396;EGYPTIAN HIEROGLYPH-14396;Lo;0;L;;;;;N;;;;; +14397;EGYPTIAN HIEROGLYPH-14397;Lo;0;L;;;;;N;;;;; +14398;EGYPTIAN HIEROGLYPH-14398;Lo;0;L;;;;;N;;;;; +14399;EGYPTIAN HIEROGLYPH-14399;Lo;0;L;;;;;N;;;;; +1439A;EGYPTIAN HIEROGLYPH-1439A;Lo;0;L;;;;;N;;;;; +1439B;EGYPTIAN HIEROGLYPH-1439B;Lo;0;L;;;;;N;;;;; +1439C;EGYPTIAN HIEROGLYPH-1439C;Lo;0;L;;;;;N;;;;; +1439D;EGYPTIAN HIEROGLYPH-1439D;Lo;0;L;;;;;N;;;;; +1439E;EGYPTIAN HIEROGLYPH-1439E;Lo;0;L;;;;;N;;;;; +1439F;EGYPTIAN HIEROGLYPH-1439F;Lo;0;L;;;;;N;;;;; +143A0;EGYPTIAN HIEROGLYPH-143A0;Lo;0;L;;;;;N;;;;; +143A1;EGYPTIAN HIEROGLYPH-143A1;Lo;0;L;;;;;N;;;;; +143A2;EGYPTIAN HIEROGLYPH-143A2;Lo;0;L;;;;;N;;;;; +143A3;EGYPTIAN HIEROGLYPH-143A3;Lo;0;L;;;;;N;;;;; +143A4;EGYPTIAN HIEROGLYPH-143A4;Lo;0;L;;;;;N;;;;; +143A5;EGYPTIAN HIEROGLYPH-143A5;Lo;0;L;;;;;N;;;;; +143A6;EGYPTIAN HIEROGLYPH-143A6;Lo;0;L;;;;;N;;;;; +143A7;EGYPTIAN HIEROGLYPH-143A7;Lo;0;L;;;;;N;;;;; +143A8;EGYPTIAN HIEROGLYPH-143A8;Lo;0;L;;;;;N;;;;; +143A9;EGYPTIAN HIEROGLYPH-143A9;Lo;0;L;;;;;N;;;;; +143AA;EGYPTIAN HIEROGLYPH-143AA;Lo;0;L;;;;;N;;;;; +143AB;EGYPTIAN HIEROGLYPH-143AB;Lo;0;L;;;;;N;;;;; +143AC;EGYPTIAN HIEROGLYPH-143AC;Lo;0;L;;;;;N;;;;; +143AD;EGYPTIAN HIEROGLYPH-143AD;Lo;0;L;;;;;N;;;;; +143AE;EGYPTIAN HIEROGLYPH-143AE;Lo;0;L;;;;;N;;;;; +143AF;EGYPTIAN HIEROGLYPH-143AF;Lo;0;L;;;;;N;;;;; +143B0;EGYPTIAN HIEROGLYPH-143B0;Lo;0;L;;;;;N;;;;; +143B1;EGYPTIAN HIEROGLYPH-143B1;Lo;0;L;;;;;N;;;;; +143B2;EGYPTIAN HIEROGLYPH-143B2;Lo;0;L;;;;;N;;;;; +143B3;EGYPTIAN HIEROGLYPH-143B3;Lo;0;L;;;;;N;;;;; +143B4;EGYPTIAN HIEROGLYPH-143B4;Lo;0;L;;;;;N;;;;; +143B5;EGYPTIAN HIEROGLYPH-143B5;Lo;0;L;;;;;N;;;;; +143B6;EGYPTIAN HIEROGLYPH-143B6;Lo;0;L;;;;;N;;;;; +143B7;EGYPTIAN HIEROGLYPH-143B7;Lo;0;L;;;;;N;;;;; +143B8;EGYPTIAN HIEROGLYPH-143B8;Lo;0;L;;;;;N;;;;; +143B9;EGYPTIAN HIEROGLYPH-143B9;Lo;0;L;;;;;N;;;;; +143BA;EGYPTIAN HIEROGLYPH-143BA;Lo;0;L;;;;;N;;;;; +143BB;EGYPTIAN HIEROGLYPH-143BB;Lo;0;L;;;;;N;;;;; +143BC;EGYPTIAN HIEROGLYPH-143BC;Lo;0;L;;;;;N;;;;; +143BD;EGYPTIAN HIEROGLYPH-143BD;Lo;0;L;;;;;N;;;;; +143BE;EGYPTIAN HIEROGLYPH-143BE;Lo;0;L;;;;;N;;;;; +143BF;EGYPTIAN HIEROGLYPH-143BF;Lo;0;L;;;;;N;;;;; +143C0;EGYPTIAN HIEROGLYPH-143C0;Lo;0;L;;;;;N;;;;; +143C1;EGYPTIAN HIEROGLYPH-143C1;Lo;0;L;;;;;N;;;;; +143C2;EGYPTIAN HIEROGLYPH-143C2;Lo;0;L;;;;;N;;;;; +143C3;EGYPTIAN HIEROGLYPH-143C3;Lo;0;L;;;;;N;;;;; +143C4;EGYPTIAN HIEROGLYPH-143C4;Lo;0;L;;;;;N;;;;; +143C5;EGYPTIAN HIEROGLYPH-143C5;Lo;0;L;;;;;N;;;;; +143C6;EGYPTIAN HIEROGLYPH-143C6;Lo;0;L;;;;;N;;;;; +143C7;EGYPTIAN HIEROGLYPH-143C7;Lo;0;L;;;;;N;;;;; +143C8;EGYPTIAN HIEROGLYPH-143C8;Lo;0;L;;;;;N;;;;; +143C9;EGYPTIAN HIEROGLYPH-143C9;Lo;0;L;;;;;N;;;;; +143CA;EGYPTIAN HIEROGLYPH-143CA;Lo;0;L;;;;;N;;;;; +143CB;EGYPTIAN HIEROGLYPH-143CB;Lo;0;L;;;;;N;;;;; +143CC;EGYPTIAN HIEROGLYPH-143CC;Lo;0;L;;;;;N;;;;; +143CD;EGYPTIAN HIEROGLYPH-143CD;Lo;0;L;;;;;N;;;;; +143CE;EGYPTIAN HIEROGLYPH-143CE;Lo;0;L;;;;;N;;;;; +143CF;EGYPTIAN HIEROGLYPH-143CF;Lo;0;L;;;;;N;;;;; +143D0;EGYPTIAN HIEROGLYPH-143D0;Lo;0;L;;;;;N;;;;; +143D1;EGYPTIAN HIEROGLYPH-143D1;Lo;0;L;;;;;N;;;;; +143D2;EGYPTIAN HIEROGLYPH-143D2;Lo;0;L;;;;;N;;;;; +143D3;EGYPTIAN HIEROGLYPH-143D3;Lo;0;L;;;;;N;;;;; +143D4;EGYPTIAN HIEROGLYPH-143D4;Lo;0;L;;;;;N;;;;; +143D5;EGYPTIAN HIEROGLYPH-143D5;Lo;0;L;;;;;N;;;;; +143D6;EGYPTIAN HIEROGLYPH-143D6;Lo;0;L;;;;;N;;;;; +143D7;EGYPTIAN HIEROGLYPH-143D7;Lo;0;L;;;;;N;;;;; +143D8;EGYPTIAN HIEROGLYPH-143D8;Lo;0;L;;;;;N;;;;; +143D9;EGYPTIAN HIEROGLYPH-143D9;Lo;0;L;;;;;N;;;;; +143DA;EGYPTIAN HIEROGLYPH-143DA;Lo;0;L;;;;;N;;;;; +143DB;EGYPTIAN HIEROGLYPH-143DB;Lo;0;L;;;;;N;;;;; +143DC;EGYPTIAN HIEROGLYPH-143DC;Lo;0;L;;;;;N;;;;; +143DD;EGYPTIAN HIEROGLYPH-143DD;Lo;0;L;;;;;N;;;;; +143DE;EGYPTIAN HIEROGLYPH-143DE;Lo;0;L;;;;;N;;;;; +143DF;EGYPTIAN HIEROGLYPH-143DF;Lo;0;L;;;;;N;;;;; +143E0;EGYPTIAN HIEROGLYPH-143E0;Lo;0;L;;;;;N;;;;; +143E1;EGYPTIAN HIEROGLYPH-143E1;Lo;0;L;;;;;N;;;;; +143E2;EGYPTIAN HIEROGLYPH-143E2;Lo;0;L;;;;;N;;;;; +143E3;EGYPTIAN HIEROGLYPH-143E3;Lo;0;L;;;;;N;;;;; +143E4;EGYPTIAN HIEROGLYPH-143E4;Lo;0;L;;;;;N;;;;; +143E5;EGYPTIAN HIEROGLYPH-143E5;Lo;0;L;;;;;N;;;;; +143E6;EGYPTIAN HIEROGLYPH-143E6;Lo;0;L;;;;;N;;;;; +143E7;EGYPTIAN HIEROGLYPH-143E7;Lo;0;L;;;;;N;;;;; +143E8;EGYPTIAN HIEROGLYPH-143E8;Lo;0;L;;;;;N;;;;; +143E9;EGYPTIAN HIEROGLYPH-143E9;Lo;0;L;;;;;N;;;;; +143EA;EGYPTIAN HIEROGLYPH-143EA;Lo;0;L;;;;;N;;;;; +143EB;EGYPTIAN HIEROGLYPH-143EB;Lo;0;L;;;;;N;;;;; +143EC;EGYPTIAN HIEROGLYPH-143EC;Lo;0;L;;;;;N;;;;; +143ED;EGYPTIAN HIEROGLYPH-143ED;Lo;0;L;;;;;N;;;;; +143EE;EGYPTIAN HIEROGLYPH-143EE;Lo;0;L;;;;;N;;;;; +143EF;EGYPTIAN HIEROGLYPH-143EF;Lo;0;L;;;;;N;;;;; +143F0;EGYPTIAN HIEROGLYPH-143F0;Lo;0;L;;;;;N;;;;; +143F1;EGYPTIAN HIEROGLYPH-143F1;Lo;0;L;;;;;N;;;;; +143F2;EGYPTIAN HIEROGLYPH-143F2;Lo;0;L;;;;;N;;;;; +143F3;EGYPTIAN HIEROGLYPH-143F3;Lo;0;L;;;;;N;;;;; +143F4;EGYPTIAN HIEROGLYPH-143F4;Lo;0;L;;;;;N;;;;; +143F5;EGYPTIAN HIEROGLYPH-143F5;Lo;0;L;;;;;N;;;;; +143F6;EGYPTIAN HIEROGLYPH-143F6;Lo;0;L;;;;;N;;;;; +143F7;EGYPTIAN HIEROGLYPH-143F7;Lo;0;L;;;;;N;;;;; +143F8;EGYPTIAN HIEROGLYPH-143F8;Lo;0;L;;;;;N;;;;; +143F9;EGYPTIAN HIEROGLYPH-143F9;Lo;0;L;;;;;N;;;;; +143FA;EGYPTIAN HIEROGLYPH-143FA;Lo;0;L;;;;;N;;;;; +14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +14403;ANATOLIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +14404;ANATOLIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +14405;ANATOLIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +14406;ANATOLIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +14407;ANATOLIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +14408;ANATOLIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +14409;ANATOLIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1440A;ANATOLIAN HIEROGLYPH A010A;Lo;0;L;;;;;N;;;;; +1440B;ANATOLIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1440C;ANATOLIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1440D;ANATOLIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +1440E;ANATOLIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +1440F;ANATOLIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +14410;ANATOLIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +14411;ANATOLIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +14412;ANATOLIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +14413;ANATOLIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +14414;ANATOLIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +14415;ANATOLIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +14416;ANATOLIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +14417;ANATOLIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +14418;ANATOLIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +14419;ANATOLIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1441A;ANATOLIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1441B;ANATOLIAN HIEROGLYPH A026A;Lo;0;L;;;;;N;;;;; +1441C;ANATOLIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +1441D;ANATOLIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +1441E;ANATOLIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +1441F;ANATOLIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +14420;ANATOLIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +14421;ANATOLIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +14422;ANATOLIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +14423;ANATOLIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +14424;ANATOLIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +14425;ANATOLIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +14426;ANATOLIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +14427;ANATOLIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +14428;ANATOLIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +14429;ANATOLIAN HIEROGLYPH A039A;Lo;0;L;;;;;N;;;;; +1442A;ANATOLIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1442B;ANATOLIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +1442C;ANATOLIAN HIEROGLYPH A041A;Lo;0;L;;;;;N;;;;; +1442D;ANATOLIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +1442E;ANATOLIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +1442F;ANATOLIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +14430;ANATOLIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +14431;ANATOLIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +14432;ANATOLIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +14433;ANATOLIAN HIEROGLYPH A046A;Lo;0;L;;;;;N;;;;; +14434;ANATOLIAN HIEROGLYPH A046B;Lo;0;L;;;;;N;;;;; +14435;ANATOLIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +14436;ANATOLIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +14437;ANATOLIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +14438;ANATOLIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +14439;ANATOLIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1443A;ANATOLIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1443B;ANATOLIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1443C;ANATOLIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +1443D;ANATOLIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +1443E;ANATOLIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +1443F;ANATOLIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +14440;ANATOLIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +14441;ANATOLIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +14442;ANATOLIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +14443;ANATOLIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +14444;ANATOLIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +14445;ANATOLIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +14446;ANATOLIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +14447;ANATOLIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +14448;ANATOLIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +14449;ANATOLIAN HIEROGLYPH A066A;Lo;0;L;;;;;N;;;;; +1444A;ANATOLIAN HIEROGLYPH A066B;Lo;0;L;;;;;N;;;;; +1444B;ANATOLIAN HIEROGLYPH A066C;Lo;0;L;;;;;N;;;;; +1444C;ANATOLIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1444D;ANATOLIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1444E;ANATOLIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1444F;ANATOLIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +14450;ANATOLIAN HIEROGLYPH A071;Lo;0;L;;;;;N;;;;; +14451;ANATOLIAN HIEROGLYPH A072;Lo;0;L;;;;;N;;;;; +14452;ANATOLIAN HIEROGLYPH A073;Lo;0;L;;;;;N;;;;; +14453;ANATOLIAN HIEROGLYPH A074;Lo;0;L;;;;;N;;;;; +14454;ANATOLIAN HIEROGLYPH A075;Lo;0;L;;;;;N;;;;; +14455;ANATOLIAN HIEROGLYPH A076;Lo;0;L;;;;;N;;;;; +14456;ANATOLIAN HIEROGLYPH A077;Lo;0;L;;;;;N;;;;; +14457;ANATOLIAN HIEROGLYPH A078;Lo;0;L;;;;;N;;;;; +14458;ANATOLIAN HIEROGLYPH A079;Lo;0;L;;;;;N;;;;; +14459;ANATOLIAN HIEROGLYPH A080;Lo;0;L;;;;;N;;;;; +1445A;ANATOLIAN HIEROGLYPH A081;Lo;0;L;;;;;N;;;;; +1445B;ANATOLIAN HIEROGLYPH A082;Lo;0;L;;;;;N;;;;; +1445C;ANATOLIAN HIEROGLYPH A083;Lo;0;L;;;;;N;;;;; +1445D;ANATOLIAN HIEROGLYPH A084;Lo;0;L;;;;;N;;;;; +1445E;ANATOLIAN HIEROGLYPH A085;Lo;0;L;;;;;N;;;;; +1445F;ANATOLIAN HIEROGLYPH A086;Lo;0;L;;;;;N;;;;; +14460;ANATOLIAN HIEROGLYPH A087;Lo;0;L;;;;;N;;;;; +14461;ANATOLIAN HIEROGLYPH A088;Lo;0;L;;;;;N;;;;; +14462;ANATOLIAN HIEROGLYPH A089;Lo;0;L;;;;;N;;;;; +14463;ANATOLIAN HIEROGLYPH A090;Lo;0;L;;;;;N;;;;; +14464;ANATOLIAN HIEROGLYPH A091;Lo;0;L;;;;;N;;;;; +14465;ANATOLIAN HIEROGLYPH A092;Lo;0;L;;;;;N;;;;; +14466;ANATOLIAN HIEROGLYPH A093;Lo;0;L;;;;;N;;;;; +14467;ANATOLIAN HIEROGLYPH A094;Lo;0;L;;;;;N;;;;; +14468;ANATOLIAN HIEROGLYPH A095;Lo;0;L;;;;;N;;;;; +14469;ANATOLIAN HIEROGLYPH A096;Lo;0;L;;;;;N;;;;; +1446A;ANATOLIAN HIEROGLYPH A097;Lo;0;L;;;;;N;;;;; +1446B;ANATOLIAN HIEROGLYPH A097A;Lo;0;L;;;;;N;;;;; +1446C;ANATOLIAN HIEROGLYPH A098;Lo;0;L;;;;;N;;;;; +1446D;ANATOLIAN HIEROGLYPH A098A;Lo;0;L;;;;;N;;;;; +1446E;ANATOLIAN HIEROGLYPH A099;Lo;0;L;;;;;N;;;;; +1446F;ANATOLIAN HIEROGLYPH A100;Lo;0;L;;;;;N;;;;; +14470;ANATOLIAN HIEROGLYPH A100A;Lo;0;L;;;;;N;;;;; +14471;ANATOLIAN HIEROGLYPH A101;Lo;0;L;;;;;N;;;;; +14472;ANATOLIAN HIEROGLYPH A101A;Lo;0;L;;;;;N;;;;; +14473;ANATOLIAN HIEROGLYPH A102;Lo;0;L;;;;;N;;;;; +14474;ANATOLIAN HIEROGLYPH A102A;Lo;0;L;;;;;N;;;;; +14475;ANATOLIAN HIEROGLYPH A103;Lo;0;L;;;;;N;;;;; +14476;ANATOLIAN HIEROGLYPH A104;Lo;0;L;;;;;N;;;;; +14477;ANATOLIAN HIEROGLYPH A104A;Lo;0;L;;;;;N;;;;; +14478;ANATOLIAN HIEROGLYPH A104B;Lo;0;L;;;;;N;;;;; +14479;ANATOLIAN HIEROGLYPH A104C;Lo;0;L;;;;;N;;;;; +1447A;ANATOLIAN HIEROGLYPH A105;Lo;0;L;;;;;N;;;;; +1447B;ANATOLIAN HIEROGLYPH A105A;Lo;0;L;;;;;N;;;;; +1447C;ANATOLIAN HIEROGLYPH A105B;Lo;0;L;;;;;N;;;;; +1447D;ANATOLIAN HIEROGLYPH A106;Lo;0;L;;;;;N;;;;; +1447E;ANATOLIAN HIEROGLYPH A107;Lo;0;L;;;;;N;;;;; +1447F;ANATOLIAN HIEROGLYPH A107A;Lo;0;L;;;;;N;;;;; +14480;ANATOLIAN HIEROGLYPH A107B;Lo;0;L;;;;;N;;;;; +14481;ANATOLIAN HIEROGLYPH A107C;Lo;0;L;;;;;N;;;;; +14482;ANATOLIAN HIEROGLYPH A108;Lo;0;L;;;;;N;;;;; +14483;ANATOLIAN HIEROGLYPH A109;Lo;0;L;;;;;N;;;;; +14484;ANATOLIAN HIEROGLYPH A110;Lo;0;L;;;;;N;;;;; +14485;ANATOLIAN HIEROGLYPH A110A;Lo;0;L;;;;;N;;;;; +14486;ANATOLIAN HIEROGLYPH A110B;Lo;0;L;;;;;N;;;;; +14487;ANATOLIAN HIEROGLYPH A111;Lo;0;L;;;;;N;;;;; +14488;ANATOLIAN HIEROGLYPH A112;Lo;0;L;;;;;N;;;;; +14489;ANATOLIAN HIEROGLYPH A113;Lo;0;L;;;;;N;;;;; +1448A;ANATOLIAN HIEROGLYPH A114;Lo;0;L;;;;;N;;;;; +1448B;ANATOLIAN HIEROGLYPH A115;Lo;0;L;;;;;N;;;;; +1448C;ANATOLIAN HIEROGLYPH A115A;Lo;0;L;;;;;N;;;;; +1448D;ANATOLIAN HIEROGLYPH A116;Lo;0;L;;;;;N;;;;; +1448E;ANATOLIAN HIEROGLYPH A117;Lo;0;L;;;;;N;;;;; +1448F;ANATOLIAN HIEROGLYPH A118;Lo;0;L;;;;;N;;;;; +14490;ANATOLIAN HIEROGLYPH A119;Lo;0;L;;;;;N;;;;; +14491;ANATOLIAN HIEROGLYPH A120;Lo;0;L;;;;;N;;;;; +14492;ANATOLIAN HIEROGLYPH A121;Lo;0;L;;;;;N;;;;; +14493;ANATOLIAN HIEROGLYPH A122;Lo;0;L;;;;;N;;;;; +14494;ANATOLIAN HIEROGLYPH A123;Lo;0;L;;;;;N;;;;; +14495;ANATOLIAN HIEROGLYPH A124;Lo;0;L;;;;;N;;;;; +14496;ANATOLIAN HIEROGLYPH A125;Lo;0;L;;;;;N;;;;; +14497;ANATOLIAN HIEROGLYPH A125A;Lo;0;L;;;;;N;;;;; +14498;ANATOLIAN HIEROGLYPH A126;Lo;0;L;;;;;N;;;;; +14499;ANATOLIAN HIEROGLYPH A127;Lo;0;L;;;;;N;;;;; +1449A;ANATOLIAN HIEROGLYPH A128;Lo;0;L;;;;;N;;;;; +1449B;ANATOLIAN HIEROGLYPH A129;Lo;0;L;;;;;N;;;;; +1449C;ANATOLIAN HIEROGLYPH A130;Lo;0;L;;;;;N;;;;; +1449D;ANATOLIAN HIEROGLYPH A131;Lo;0;L;;;;;N;;;;; +1449E;ANATOLIAN HIEROGLYPH A132;Lo;0;L;;;;;N;;;;; +1449F;ANATOLIAN HIEROGLYPH A133;Lo;0;L;;;;;N;;;;; +144A0;ANATOLIAN HIEROGLYPH A134;Lo;0;L;;;;;N;;;;; +144A1;ANATOLIAN HIEROGLYPH A135;Lo;0;L;;;;;N;;;;; +144A2;ANATOLIAN HIEROGLYPH A135A;Lo;0;L;;;;;N;;;;; +144A3;ANATOLIAN HIEROGLYPH A136;Lo;0;L;;;;;N;;;;; +144A4;ANATOLIAN HIEROGLYPH A137;Lo;0;L;;;;;N;;;;; +144A5;ANATOLIAN HIEROGLYPH A138;Lo;0;L;;;;;N;;;;; +144A6;ANATOLIAN HIEROGLYPH A139;Lo;0;L;;;;;N;;;;; +144A7;ANATOLIAN HIEROGLYPH A140;Lo;0;L;;;;;N;;;;; +144A8;ANATOLIAN HIEROGLYPH A141;Lo;0;L;;;;;N;;;;; +144A9;ANATOLIAN HIEROGLYPH A142;Lo;0;L;;;;;N;;;;; +144AA;ANATOLIAN HIEROGLYPH A143;Lo;0;L;;;;;N;;;;; +144AB;ANATOLIAN HIEROGLYPH A144;Lo;0;L;;;;;N;;;;; +144AC;ANATOLIAN HIEROGLYPH A145;Lo;0;L;;;;;N;;;;; +144AD;ANATOLIAN HIEROGLYPH A146;Lo;0;L;;;;;N;;;;; +144AE;ANATOLIAN HIEROGLYPH A147;Lo;0;L;;;;;N;;;;; +144AF;ANATOLIAN HIEROGLYPH A148;Lo;0;L;;;;;N;;;;; +144B0;ANATOLIAN HIEROGLYPH A149;Lo;0;L;;;;;N;;;;; +144B1;ANATOLIAN HIEROGLYPH A150;Lo;0;L;;;;;N;;;;; +144B2;ANATOLIAN HIEROGLYPH A151;Lo;0;L;;;;;N;;;;; +144B3;ANATOLIAN HIEROGLYPH A152;Lo;0;L;;;;;N;;;;; +144B4;ANATOLIAN HIEROGLYPH A153;Lo;0;L;;;;;N;;;;; +144B5;ANATOLIAN HIEROGLYPH A154;Lo;0;L;;;;;N;;;;; +144B6;ANATOLIAN HIEROGLYPH A155;Lo;0;L;;;;;N;;;;; +144B7;ANATOLIAN HIEROGLYPH A156;Lo;0;L;;;;;N;;;;; +144B8;ANATOLIAN HIEROGLYPH A157;Lo;0;L;;;;;N;;;;; +144B9;ANATOLIAN HIEROGLYPH A158;Lo;0;L;;;;;N;;;;; +144BA;ANATOLIAN HIEROGLYPH A159;Lo;0;L;;;;;N;;;;; +144BB;ANATOLIAN HIEROGLYPH A160;Lo;0;L;;;;;N;;;;; +144BC;ANATOLIAN HIEROGLYPH A161;Lo;0;L;;;;;N;;;;; +144BD;ANATOLIAN HIEROGLYPH A162;Lo;0;L;;;;;N;;;;; +144BE;ANATOLIAN HIEROGLYPH A163;Lo;0;L;;;;;N;;;;; +144BF;ANATOLIAN HIEROGLYPH A164;Lo;0;L;;;;;N;;;;; +144C0;ANATOLIAN HIEROGLYPH A165;Lo;0;L;;;;;N;;;;; +144C1;ANATOLIAN HIEROGLYPH A166;Lo;0;L;;;;;N;;;;; +144C2;ANATOLIAN HIEROGLYPH A167;Lo;0;L;;;;;N;;;;; +144C3;ANATOLIAN HIEROGLYPH A168;Lo;0;L;;;;;N;;;;; +144C4;ANATOLIAN HIEROGLYPH A169;Lo;0;L;;;;;N;;;;; +144C5;ANATOLIAN HIEROGLYPH A170;Lo;0;L;;;;;N;;;;; +144C6;ANATOLIAN HIEROGLYPH A171;Lo;0;L;;;;;N;;;;; +144C7;ANATOLIAN HIEROGLYPH A172;Lo;0;L;;;;;N;;;;; +144C8;ANATOLIAN HIEROGLYPH A173;Lo;0;L;;;;;N;;;;; +144C9;ANATOLIAN HIEROGLYPH A174;Lo;0;L;;;;;N;;;;; +144CA;ANATOLIAN HIEROGLYPH A175;Lo;0;L;;;;;N;;;;; +144CB;ANATOLIAN HIEROGLYPH A176;Lo;0;L;;;;;N;;;;; +144CC;ANATOLIAN HIEROGLYPH A177;Lo;0;L;;;;;N;;;;; +144CD;ANATOLIAN HIEROGLYPH A178;Lo;0;L;;;;;N;;;;; +144CE;ANATOLIAN HIEROGLYPH A179;Lo;0;L;;;;;N;;;;; +144CF;ANATOLIAN HIEROGLYPH A180;Lo;0;L;;;;;N;;;;; +144D0;ANATOLIAN HIEROGLYPH A181;Lo;0;L;;;;;N;;;;; +144D1;ANATOLIAN HIEROGLYPH A182;Lo;0;L;;;;;N;;;;; +144D2;ANATOLIAN HIEROGLYPH A183;Lo;0;L;;;;;N;;;;; +144D3;ANATOLIAN HIEROGLYPH A184;Lo;0;L;;;;;N;;;;; +144D4;ANATOLIAN HIEROGLYPH A185;Lo;0;L;;;;;N;;;;; +144D5;ANATOLIAN HIEROGLYPH A186;Lo;0;L;;;;;N;;;;; +144D6;ANATOLIAN HIEROGLYPH A187;Lo;0;L;;;;;N;;;;; +144D7;ANATOLIAN HIEROGLYPH A188;Lo;0;L;;;;;N;;;;; +144D8;ANATOLIAN HIEROGLYPH A189;Lo;0;L;;;;;N;;;;; +144D9;ANATOLIAN HIEROGLYPH A190;Lo;0;L;;;;;N;;;;; +144DA;ANATOLIAN HIEROGLYPH A191;Lo;0;L;;;;;N;;;;; +144DB;ANATOLIAN HIEROGLYPH A192;Lo;0;L;;;;;N;;;;; +144DC;ANATOLIAN HIEROGLYPH A193;Lo;0;L;;;;;N;;;;; +144DD;ANATOLIAN HIEROGLYPH A194;Lo;0;L;;;;;N;;;;; +144DE;ANATOLIAN HIEROGLYPH A195;Lo;0;L;;;;;N;;;;; +144DF;ANATOLIAN HIEROGLYPH A196;Lo;0;L;;;;;N;;;;; +144E0;ANATOLIAN HIEROGLYPH A197;Lo;0;L;;;;;N;;;;; +144E1;ANATOLIAN HIEROGLYPH A198;Lo;0;L;;;;;N;;;;; +144E2;ANATOLIAN HIEROGLYPH A199;Lo;0;L;;;;;N;;;;; +144E3;ANATOLIAN HIEROGLYPH A200;Lo;0;L;;;;;N;;;;; +144E4;ANATOLIAN HIEROGLYPH A201;Lo;0;L;;;;;N;;;;; +144E5;ANATOLIAN HIEROGLYPH A202;Lo;0;L;;;;;N;;;;; +144E6;ANATOLIAN HIEROGLYPH A202A;Lo;0;L;;;;;N;;;;; +144E7;ANATOLIAN HIEROGLYPH A202B;Lo;0;L;;;;;N;;;;; +144E8;ANATOLIAN HIEROGLYPH A203;Lo;0;L;;;;;N;;;;; +144E9;ANATOLIAN HIEROGLYPH A204;Lo;0;L;;;;;N;;;;; +144EA;ANATOLIAN HIEROGLYPH A205;Lo;0;L;;;;;N;;;;; +144EB;ANATOLIAN HIEROGLYPH A206;Lo;0;L;;;;;N;;;;; +144EC;ANATOLIAN HIEROGLYPH A207;Lo;0;L;;;;;N;;;;; +144ED;ANATOLIAN HIEROGLYPH A207A;Lo;0;L;;;;;N;;;;; +144EE;ANATOLIAN HIEROGLYPH A208;Lo;0;L;;;;;N;;;;; +144EF;ANATOLIAN HIEROGLYPH A209;Lo;0;L;;;;;N;;;;; +144F0;ANATOLIAN HIEROGLYPH A209A;Lo;0;L;;;;;N;;;;; +144F1;ANATOLIAN HIEROGLYPH A210;Lo;0;L;;;;;N;;;;; +144F2;ANATOLIAN HIEROGLYPH A211;Lo;0;L;;;;;N;;;;; +144F3;ANATOLIAN HIEROGLYPH A212;Lo;0;L;;;;;N;;;;; +144F4;ANATOLIAN HIEROGLYPH A213;Lo;0;L;;;;;N;;;;; +144F5;ANATOLIAN HIEROGLYPH A214;Lo;0;L;;;;;N;;;;; +144F6;ANATOLIAN HIEROGLYPH A215;Lo;0;L;;;;;N;;;;; +144F7;ANATOLIAN HIEROGLYPH A215A;Lo;0;L;;;;;N;;;;; +144F8;ANATOLIAN HIEROGLYPH A216;Lo;0;L;;;;;N;;;;; +144F9;ANATOLIAN HIEROGLYPH A216A;Lo;0;L;;;;;N;;;;; +144FA;ANATOLIAN HIEROGLYPH A217;Lo;0;L;;;;;N;;;;; +144FB;ANATOLIAN HIEROGLYPH A218;Lo;0;L;;;;;N;;;;; +144FC;ANATOLIAN HIEROGLYPH A219;Lo;0;L;;;;;N;;;;; +144FD;ANATOLIAN HIEROGLYPH A220;Lo;0;L;;;;;N;;;;; +144FE;ANATOLIAN HIEROGLYPH A221;Lo;0;L;;;;;N;;;;; +144FF;ANATOLIAN HIEROGLYPH A222;Lo;0;L;;;;;N;;;;; +14500;ANATOLIAN HIEROGLYPH A223;Lo;0;L;;;;;N;;;;; +14501;ANATOLIAN HIEROGLYPH A224;Lo;0;L;;;;;N;;;;; +14502;ANATOLIAN HIEROGLYPH A225;Lo;0;L;;;;;N;;;;; +14503;ANATOLIAN HIEROGLYPH A226;Lo;0;L;;;;;N;;;;; +14504;ANATOLIAN HIEROGLYPH A227;Lo;0;L;;;;;N;;;;; +14505;ANATOLIAN HIEROGLYPH A227A;Lo;0;L;;;;;N;;;;; +14506;ANATOLIAN HIEROGLYPH A228;Lo;0;L;;;;;N;;;;; +14507;ANATOLIAN HIEROGLYPH A229;Lo;0;L;;;;;N;;;;; +14508;ANATOLIAN HIEROGLYPH A230;Lo;0;L;;;;;N;;;;; +14509;ANATOLIAN HIEROGLYPH A231;Lo;0;L;;;;;N;;;;; +1450A;ANATOLIAN HIEROGLYPH A232;Lo;0;L;;;;;N;;;;; +1450B;ANATOLIAN HIEROGLYPH A233;Lo;0;L;;;;;N;;;;; +1450C;ANATOLIAN HIEROGLYPH A234;Lo;0;L;;;;;N;;;;; +1450D;ANATOLIAN HIEROGLYPH A235;Lo;0;L;;;;;N;;;;; +1450E;ANATOLIAN HIEROGLYPH A236;Lo;0;L;;;;;N;;;;; +1450F;ANATOLIAN HIEROGLYPH A237;Lo;0;L;;;;;N;;;;; +14510;ANATOLIAN HIEROGLYPH A238;Lo;0;L;;;;;N;;;;; +14511;ANATOLIAN HIEROGLYPH A239;Lo;0;L;;;;;N;;;;; +14512;ANATOLIAN HIEROGLYPH A240;Lo;0;L;;;;;N;;;;; +14513;ANATOLIAN HIEROGLYPH A241;Lo;0;L;;;;;N;;;;; +14514;ANATOLIAN HIEROGLYPH A242;Lo;0;L;;;;;N;;;;; +14515;ANATOLIAN HIEROGLYPH A243;Lo;0;L;;;;;N;;;;; +14516;ANATOLIAN HIEROGLYPH A244;Lo;0;L;;;;;N;;;;; +14517;ANATOLIAN HIEROGLYPH A245;Lo;0;L;;;;;N;;;;; +14518;ANATOLIAN HIEROGLYPH A246;Lo;0;L;;;;;N;;;;; +14519;ANATOLIAN HIEROGLYPH A247;Lo;0;L;;;;;N;;;;; +1451A;ANATOLIAN HIEROGLYPH A248;Lo;0;L;;;;;N;;;;; +1451B;ANATOLIAN HIEROGLYPH A249;Lo;0;L;;;;;N;;;;; +1451C;ANATOLIAN HIEROGLYPH A250;Lo;0;L;;;;;N;;;;; +1451D;ANATOLIAN HIEROGLYPH A251;Lo;0;L;;;;;N;;;;; +1451E;ANATOLIAN HIEROGLYPH A252;Lo;0;L;;;;;N;;;;; +1451F;ANATOLIAN HIEROGLYPH A253;Lo;0;L;;;;;N;;;;; +14520;ANATOLIAN HIEROGLYPH A254;Lo;0;L;;;;;N;;;;; +14521;ANATOLIAN HIEROGLYPH A255;Lo;0;L;;;;;N;;;;; +14522;ANATOLIAN HIEROGLYPH A256;Lo;0;L;;;;;N;;;;; +14523;ANATOLIAN HIEROGLYPH A257;Lo;0;L;;;;;N;;;;; +14524;ANATOLIAN HIEROGLYPH A258;Lo;0;L;;;;;N;;;;; +14525;ANATOLIAN HIEROGLYPH A259;Lo;0;L;;;;;N;;;;; +14526;ANATOLIAN HIEROGLYPH A260;Lo;0;L;;;;;N;;;;; +14527;ANATOLIAN HIEROGLYPH A261;Lo;0;L;;;;;N;;;;; +14528;ANATOLIAN HIEROGLYPH A262;Lo;0;L;;;;;N;;;;; +14529;ANATOLIAN HIEROGLYPH A263;Lo;0;L;;;;;N;;;;; +1452A;ANATOLIAN HIEROGLYPH A264;Lo;0;L;;;;;N;;;;; +1452B;ANATOLIAN HIEROGLYPH A265;Lo;0;L;;;;;N;;;;; +1452C;ANATOLIAN HIEROGLYPH A266;Lo;0;L;;;;;N;;;;; +1452D;ANATOLIAN HIEROGLYPH A267;Lo;0;L;;;;;N;;;;; +1452E;ANATOLIAN HIEROGLYPH A267A;Lo;0;L;;;;;N;;;;; +1452F;ANATOLIAN HIEROGLYPH A268;Lo;0;L;;;;;N;;;;; +14530;ANATOLIAN HIEROGLYPH A269;Lo;0;L;;;;;N;;;;; +14531;ANATOLIAN HIEROGLYPH A270;Lo;0;L;;;;;N;;;;; +14532;ANATOLIAN HIEROGLYPH A271;Lo;0;L;;;;;N;;;;; +14533;ANATOLIAN HIEROGLYPH A272;Lo;0;L;;;;;N;;;;; +14534;ANATOLIAN HIEROGLYPH A273;Lo;0;L;;;;;N;;;;; +14535;ANATOLIAN HIEROGLYPH A274;Lo;0;L;;;;;N;;;;; +14536;ANATOLIAN HIEROGLYPH A275;Lo;0;L;;;;;N;;;;; +14537;ANATOLIAN HIEROGLYPH A276;Lo;0;L;;;;;N;;;;; +14538;ANATOLIAN HIEROGLYPH A277;Lo;0;L;;;;;N;;;;; +14539;ANATOLIAN HIEROGLYPH A278;Lo;0;L;;;;;N;;;;; +1453A;ANATOLIAN HIEROGLYPH A279;Lo;0;L;;;;;N;;;;; +1453B;ANATOLIAN HIEROGLYPH A280;Lo;0;L;;;;;N;;;;; +1453C;ANATOLIAN HIEROGLYPH A281;Lo;0;L;;;;;N;;;;; +1453D;ANATOLIAN HIEROGLYPH A282;Lo;0;L;;;;;N;;;;; +1453E;ANATOLIAN HIEROGLYPH A283;Lo;0;L;;;;;N;;;;; +1453F;ANATOLIAN HIEROGLYPH A284;Lo;0;L;;;;;N;;;;; +14540;ANATOLIAN HIEROGLYPH A285;Lo;0;L;;;;;N;;;;; +14541;ANATOLIAN HIEROGLYPH A286;Lo;0;L;;;;;N;;;;; +14542;ANATOLIAN HIEROGLYPH A287;Lo;0;L;;;;;N;;;;; +14543;ANATOLIAN HIEROGLYPH A288;Lo;0;L;;;;;N;;;;; +14544;ANATOLIAN HIEROGLYPH A289;Lo;0;L;;;;;N;;;;; +14545;ANATOLIAN HIEROGLYPH A289A;Lo;0;L;;;;;N;;;;; +14546;ANATOLIAN HIEROGLYPH A290;Lo;0;L;;;;;N;;;;; +14547;ANATOLIAN HIEROGLYPH A291;Lo;0;L;;;;;N;;;;; +14548;ANATOLIAN HIEROGLYPH A292;Lo;0;L;;;;;N;;;;; +14549;ANATOLIAN HIEROGLYPH A293;Lo;0;L;;;;;N;;;;; +1454A;ANATOLIAN HIEROGLYPH A294;Lo;0;L;;;;;N;;;;; +1454B;ANATOLIAN HIEROGLYPH A294A;Lo;0;L;;;;;N;;;;; +1454C;ANATOLIAN HIEROGLYPH A295;Lo;0;L;;;;;N;;;;; +1454D;ANATOLIAN HIEROGLYPH A296;Lo;0;L;;;;;N;;;;; +1454E;ANATOLIAN HIEROGLYPH A297;Lo;0;L;;;;;N;;;;; +1454F;ANATOLIAN HIEROGLYPH A298;Lo;0;L;;;;;N;;;;; +14550;ANATOLIAN HIEROGLYPH A299;Lo;0;L;;;;;N;;;;; +14551;ANATOLIAN HIEROGLYPH A299A;Lo;0;L;;;;;N;;;;; +14552;ANATOLIAN HIEROGLYPH A300;Lo;0;L;;;;;N;;;;; +14553;ANATOLIAN HIEROGLYPH A301;Lo;0;L;;;;;N;;;;; +14554;ANATOLIAN HIEROGLYPH A302;Lo;0;L;;;;;N;;;;; +14555;ANATOLIAN HIEROGLYPH A303;Lo;0;L;;;;;N;;;;; +14556;ANATOLIAN HIEROGLYPH A304;Lo;0;L;;;;;N;;;;; +14557;ANATOLIAN HIEROGLYPH A305;Lo;0;L;;;;;N;;;;; +14558;ANATOLIAN HIEROGLYPH A306;Lo;0;L;;;;;N;;;;; +14559;ANATOLIAN HIEROGLYPH A307;Lo;0;L;;;;;N;;;;; +1455A;ANATOLIAN HIEROGLYPH A308;Lo;0;L;;;;;N;;;;; +1455B;ANATOLIAN HIEROGLYPH A309;Lo;0;L;;;;;N;;;;; +1455C;ANATOLIAN HIEROGLYPH A309A;Lo;0;L;;;;;N;;;;; +1455D;ANATOLIAN HIEROGLYPH A310;Lo;0;L;;;;;N;;;;; +1455E;ANATOLIAN HIEROGLYPH A311;Lo;0;L;;;;;N;;;;; +1455F;ANATOLIAN HIEROGLYPH A312;Lo;0;L;;;;;N;;;;; +14560;ANATOLIAN HIEROGLYPH A313;Lo;0;L;;;;;N;;;;; +14561;ANATOLIAN HIEROGLYPH A314;Lo;0;L;;;;;N;;;;; +14562;ANATOLIAN HIEROGLYPH A315;Lo;0;L;;;;;N;;;;; +14563;ANATOLIAN HIEROGLYPH A316;Lo;0;L;;;;;N;;;;; +14564;ANATOLIAN HIEROGLYPH A317;Lo;0;L;;;;;N;;;;; +14565;ANATOLIAN HIEROGLYPH A318;Lo;0;L;;;;;N;;;;; +14566;ANATOLIAN HIEROGLYPH A319;Lo;0;L;;;;;N;;;;; +14567;ANATOLIAN HIEROGLYPH A320;Lo;0;L;;;;;N;;;;; +14568;ANATOLIAN HIEROGLYPH A321;Lo;0;L;;;;;N;;;;; +14569;ANATOLIAN HIEROGLYPH A322;Lo;0;L;;;;;N;;;;; +1456A;ANATOLIAN HIEROGLYPH A323;Lo;0;L;;;;;N;;;;; +1456B;ANATOLIAN HIEROGLYPH A324;Lo;0;L;;;;;N;;;;; +1456C;ANATOLIAN HIEROGLYPH A325;Lo;0;L;;;;;N;;;;; +1456D;ANATOLIAN HIEROGLYPH A326;Lo;0;L;;;;;N;;;;; +1456E;ANATOLIAN HIEROGLYPH A327;Lo;0;L;;;;;N;;;;; +1456F;ANATOLIAN HIEROGLYPH A328;Lo;0;L;;;;;N;;;;; +14570;ANATOLIAN HIEROGLYPH A329;Lo;0;L;;;;;N;;;;; +14571;ANATOLIAN HIEROGLYPH A329A;Lo;0;L;;;;;N;;;;; +14572;ANATOLIAN HIEROGLYPH A330;Lo;0;L;;;;;N;;;;; +14573;ANATOLIAN HIEROGLYPH A331;Lo;0;L;;;;;N;;;;; +14574;ANATOLIAN HIEROGLYPH A332A;Lo;0;L;;;;;N;;;;; +14575;ANATOLIAN HIEROGLYPH A332B;Lo;0;L;;;;;N;;;;; +14576;ANATOLIAN HIEROGLYPH A332C;Lo;0;L;;;;;N;;;;; +14577;ANATOLIAN HIEROGLYPH A333;Lo;0;L;;;;;N;;;;; +14578;ANATOLIAN HIEROGLYPH A334;Lo;0;L;;;;;N;;;;; +14579;ANATOLIAN HIEROGLYPH A335;Lo;0;L;;;;;N;;;;; +1457A;ANATOLIAN HIEROGLYPH A336;Lo;0;L;;;;;N;;;;; +1457B;ANATOLIAN HIEROGLYPH A336A;Lo;0;L;;;;;N;;;;; +1457C;ANATOLIAN HIEROGLYPH A336B;Lo;0;L;;;;;N;;;;; +1457D;ANATOLIAN HIEROGLYPH A336C;Lo;0;L;;;;;N;;;;; +1457E;ANATOLIAN HIEROGLYPH A337;Lo;0;L;;;;;N;;;;; +1457F;ANATOLIAN HIEROGLYPH A338;Lo;0;L;;;;;N;;;;; +14580;ANATOLIAN HIEROGLYPH A339;Lo;0;L;;;;;N;;;;; +14581;ANATOLIAN HIEROGLYPH A340;Lo;0;L;;;;;N;;;;; +14582;ANATOLIAN HIEROGLYPH A341;Lo;0;L;;;;;N;;;;; +14583;ANATOLIAN HIEROGLYPH A342;Lo;0;L;;;;;N;;;;; +14584;ANATOLIAN HIEROGLYPH A343;Lo;0;L;;;;;N;;;;; +14585;ANATOLIAN HIEROGLYPH A344;Lo;0;L;;;;;N;;;;; +14586;ANATOLIAN HIEROGLYPH A345;Lo;0;L;;;;;N;;;;; +14587;ANATOLIAN HIEROGLYPH A346;Lo;0;L;;;;;N;;;;; +14588;ANATOLIAN HIEROGLYPH A347;Lo;0;L;;;;;N;;;;; +14589;ANATOLIAN HIEROGLYPH A348;Lo;0;L;;;;;N;;;;; +1458A;ANATOLIAN HIEROGLYPH A349;Lo;0;L;;;;;N;;;;; +1458B;ANATOLIAN HIEROGLYPH A350;Lo;0;L;;;;;N;;;;; +1458C;ANATOLIAN HIEROGLYPH A351;Lo;0;L;;;;;N;;;;; +1458D;ANATOLIAN HIEROGLYPH A352;Lo;0;L;;;;;N;;;;; +1458E;ANATOLIAN HIEROGLYPH A353;Lo;0;L;;;;;N;;;;; +1458F;ANATOLIAN HIEROGLYPH A354;Lo;0;L;;;;;N;;;;; +14590;ANATOLIAN HIEROGLYPH A355;Lo;0;L;;;;;N;;;;; +14591;ANATOLIAN HIEROGLYPH A356;Lo;0;L;;;;;N;;;;; +14592;ANATOLIAN HIEROGLYPH A357;Lo;0;L;;;;;N;;;;; +14593;ANATOLIAN HIEROGLYPH A358;Lo;0;L;;;;;N;;;;; +14594;ANATOLIAN HIEROGLYPH A359;Lo;0;L;;;;;N;;;;; +14595;ANATOLIAN HIEROGLYPH A359A;Lo;0;L;;;;;N;;;;; +14596;ANATOLIAN HIEROGLYPH A360;Lo;0;L;;;;;N;;;;; +14597;ANATOLIAN HIEROGLYPH A361;Lo;0;L;;;;;N;;;;; +14598;ANATOLIAN HIEROGLYPH A362;Lo;0;L;;;;;N;;;;; +14599;ANATOLIAN HIEROGLYPH A363;Lo;0;L;;;;;N;;;;; +1459A;ANATOLIAN HIEROGLYPH A364;Lo;0;L;;;;;N;;;;; +1459B;ANATOLIAN HIEROGLYPH A364A;Lo;0;L;;;;;N;;;;; +1459C;ANATOLIAN HIEROGLYPH A365;Lo;0;L;;;;;N;;;;; +1459D;ANATOLIAN HIEROGLYPH A366;Lo;0;L;;;;;N;;;;; +1459E;ANATOLIAN HIEROGLYPH A367;Lo;0;L;;;;;N;;;;; +1459F;ANATOLIAN HIEROGLYPH A368;Lo;0;L;;;;;N;;;;; +145A0;ANATOLIAN HIEROGLYPH A368A;Lo;0;L;;;;;N;;;;; +145A1;ANATOLIAN HIEROGLYPH A369;Lo;0;L;;;;;N;;;;; +145A2;ANATOLIAN HIEROGLYPH A370;Lo;0;L;;;;;N;;;;; +145A3;ANATOLIAN HIEROGLYPH A371;Lo;0;L;;;;;N;;;;; +145A4;ANATOLIAN HIEROGLYPH A371A;Lo;0;L;;;;;N;;;;; +145A5;ANATOLIAN HIEROGLYPH A372;Lo;0;L;;;;;N;;;;; +145A6;ANATOLIAN HIEROGLYPH A373;Lo;0;L;;;;;N;;;;; +145A7;ANATOLIAN HIEROGLYPH A374;Lo;0;L;;;;;N;;;;; +145A8;ANATOLIAN HIEROGLYPH A375;Lo;0;L;;;;;N;;;;; +145A9;ANATOLIAN HIEROGLYPH A376;Lo;0;L;;;;;N;;;;; +145AA;ANATOLIAN HIEROGLYPH A377;Lo;0;L;;;;;N;;;;; +145AB;ANATOLIAN HIEROGLYPH A378;Lo;0;L;;;;;N;;;;; +145AC;ANATOLIAN HIEROGLYPH A379;Lo;0;L;;;;;N;;;;; +145AD;ANATOLIAN HIEROGLYPH A380;Lo;0;L;;;;;N;;;;; +145AE;ANATOLIAN HIEROGLYPH A381;Lo;0;L;;;;;N;;;;; +145AF;ANATOLIAN HIEROGLYPH A381A;Lo;0;L;;;;;N;;;;; +145B0;ANATOLIAN HIEROGLYPH A382;Lo;0;L;;;;;N;;;;; +145B1;ANATOLIAN HIEROGLYPH A383 RA OR RI;Lo;0;L;;;;;N;;;;; +145B2;ANATOLIAN HIEROGLYPH A383A;Lo;0;L;;;;;N;;;;; +145B3;ANATOLIAN HIEROGLYPH A384;Lo;0;L;;;;;N;;;;; +145B4;ANATOLIAN HIEROGLYPH A385;Lo;0;L;;;;;N;;;;; +145B5;ANATOLIAN HIEROGLYPH A386;Lo;0;L;;;;;N;;;;; +145B6;ANATOLIAN HIEROGLYPH A386A;Lo;0;L;;;;;N;;;;; +145B7;ANATOLIAN HIEROGLYPH A387;Lo;0;L;;;;;N;;;;; +145B8;ANATOLIAN HIEROGLYPH A388;Lo;0;L;;;;;N;;;;; +145B9;ANATOLIAN HIEROGLYPH A389;Lo;0;L;;;;;N;;;;; +145BA;ANATOLIAN HIEROGLYPH A390;Lo;0;L;;;;;N;;;;; +145BB;ANATOLIAN HIEROGLYPH A391;Lo;0;L;;;;;N;;;;; +145BC;ANATOLIAN HIEROGLYPH A392;Lo;0;L;;;;;N;;;;; +145BD;ANATOLIAN HIEROGLYPH A393 EIGHT;Lo;0;L;;;;;N;;;;; +145BE;ANATOLIAN HIEROGLYPH A394;Lo;0;L;;;;;N;;;;; +145BF;ANATOLIAN HIEROGLYPH A395;Lo;0;L;;;;;N;;;;; +145C0;ANATOLIAN HIEROGLYPH A396;Lo;0;L;;;;;N;;;;; +145C1;ANATOLIAN HIEROGLYPH A397;Lo;0;L;;;;;N;;;;; +145C2;ANATOLIAN HIEROGLYPH A398;Lo;0;L;;;;;N;;;;; +145C3;ANATOLIAN HIEROGLYPH A399;Lo;0;L;;;;;N;;;;; +145C4;ANATOLIAN HIEROGLYPH A400;Lo;0;L;;;;;N;;;;; +145C5;ANATOLIAN HIEROGLYPH A401;Lo;0;L;;;;;N;;;;; +145C6;ANATOLIAN HIEROGLYPH A402;Lo;0;L;;;;;N;;;;; +145C7;ANATOLIAN HIEROGLYPH A403;Lo;0;L;;;;;N;;;;; +145C8;ANATOLIAN HIEROGLYPH A404;Lo;0;L;;;;;N;;;;; +145C9;ANATOLIAN HIEROGLYPH A405;Lo;0;L;;;;;N;;;;; +145CA;ANATOLIAN HIEROGLYPH A406;Lo;0;L;;;;;N;;;;; +145CB;ANATOLIAN HIEROGLYPH A407;Lo;0;L;;;;;N;;;;; +145CC;ANATOLIAN HIEROGLYPH A408;Lo;0;L;;;;;N;;;;; +145CD;ANATOLIAN HIEROGLYPH A409;Lo;0;L;;;;;N;;;;; +145CE;ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145CF;ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145D0;ANATOLIAN HIEROGLYPH A411;Lo;0;L;;;;;N;;;;; +145D1;ANATOLIAN HIEROGLYPH A412;Lo;0;L;;;;;N;;;;; +145D2;ANATOLIAN HIEROGLYPH A413;Lo;0;L;;;;;N;;;;; +145D3;ANATOLIAN HIEROGLYPH A414;Lo;0;L;;;;;N;;;;; +145D4;ANATOLIAN HIEROGLYPH A415;Lo;0;L;;;;;N;;;;; +145D5;ANATOLIAN HIEROGLYPH A416;Lo;0;L;;;;;N;;;;; +145D6;ANATOLIAN HIEROGLYPH A417;Lo;0;L;;;;;N;;;;; +145D7;ANATOLIAN HIEROGLYPH A418;Lo;0;L;;;;;N;;;;; +145D8;ANATOLIAN HIEROGLYPH A419;Lo;0;L;;;;;N;;;;; +145D9;ANATOLIAN HIEROGLYPH A420;Lo;0;L;;;;;N;;;;; +145DA;ANATOLIAN HIEROGLYPH A421;Lo;0;L;;;;;N;;;;; +145DB;ANATOLIAN HIEROGLYPH A422;Lo;0;L;;;;;N;;;;; +145DC;ANATOLIAN HIEROGLYPH A423;Lo;0;L;;;;;N;;;;; +145DD;ANATOLIAN HIEROGLYPH A424;Lo;0;L;;;;;N;;;;; +145DE;ANATOLIAN HIEROGLYPH A425;Lo;0;L;;;;;N;;;;; +145DF;ANATOLIAN HIEROGLYPH A426;Lo;0;L;;;;;N;;;;; +145E0;ANATOLIAN HIEROGLYPH A427;Lo;0;L;;;;;N;;;;; +145E1;ANATOLIAN HIEROGLYPH A428;Lo;0;L;;;;;N;;;;; +145E2;ANATOLIAN HIEROGLYPH A429;Lo;0;L;;;;;N;;;;; +145E3;ANATOLIAN HIEROGLYPH A430;Lo;0;L;;;;;N;;;;; +145E4;ANATOLIAN HIEROGLYPH A431;Lo;0;L;;;;;N;;;;; +145E5;ANATOLIAN HIEROGLYPH A432;Lo;0;L;;;;;N;;;;; +145E6;ANATOLIAN HIEROGLYPH A433;Lo;0;L;;;;;N;;;;; +145E7;ANATOLIAN HIEROGLYPH A434;Lo;0;L;;;;;N;;;;; +145E8;ANATOLIAN HIEROGLYPH A435;Lo;0;L;;;;;N;;;;; +145E9;ANATOLIAN HIEROGLYPH A436;Lo;0;L;;;;;N;;;;; +145EA;ANATOLIAN HIEROGLYPH A437;Lo;0;L;;;;;N;;;;; +145EB;ANATOLIAN HIEROGLYPH A438;Lo;0;L;;;;;N;;;;; +145EC;ANATOLIAN HIEROGLYPH A439;Lo;0;L;;;;;N;;;;; +145ED;ANATOLIAN HIEROGLYPH A440;Lo;0;L;;;;;N;;;;; +145EE;ANATOLIAN HIEROGLYPH A441;Lo;0;L;;;;;N;;;;; +145EF;ANATOLIAN HIEROGLYPH A442;Lo;0;L;;;;;N;;;;; +145F0;ANATOLIAN HIEROGLYPH A443;Lo;0;L;;;;;N;;;;; +145F1;ANATOLIAN HIEROGLYPH A444;Lo;0;L;;;;;N;;;;; +145F2;ANATOLIAN HIEROGLYPH A445;Lo;0;L;;;;;N;;;;; +145F3;ANATOLIAN HIEROGLYPH A446;Lo;0;L;;;;;N;;;;; +145F4;ANATOLIAN HIEROGLYPH A447;Lo;0;L;;;;;N;;;;; +145F5;ANATOLIAN HIEROGLYPH A448;Lo;0;L;;;;;N;;;;; +145F6;ANATOLIAN HIEROGLYPH A449;Lo;0;L;;;;;N;;;;; +145F7;ANATOLIAN HIEROGLYPH A450;Lo;0;L;;;;;N;;;;; +145F8;ANATOLIAN HIEROGLYPH A450A;Lo;0;L;;;;;N;;;;; +145F9;ANATOLIAN HIEROGLYPH A451;Lo;0;L;;;;;N;;;;; +145FA;ANATOLIAN HIEROGLYPH A452;Lo;0;L;;;;;N;;;;; +145FB;ANATOLIAN HIEROGLYPH A453;Lo;0;L;;;;;N;;;;; +145FC;ANATOLIAN HIEROGLYPH A454;Lo;0;L;;;;;N;;;;; +145FD;ANATOLIAN HIEROGLYPH A455;Lo;0;L;;;;;N;;;;; +145FE;ANATOLIAN HIEROGLYPH A456;Lo;0;L;;;;;N;;;;; +145FF;ANATOLIAN HIEROGLYPH A457;Lo;0;L;;;;;N;;;;; +14600;ANATOLIAN HIEROGLYPH A457A;Lo;0;L;;;;;N;;;;; +14601;ANATOLIAN HIEROGLYPH A458;Lo;0;L;;;;;N;;;;; +14602;ANATOLIAN HIEROGLYPH A459;Lo;0;L;;;;;N;;;;; +14603;ANATOLIAN HIEROGLYPH A460;Lo;0;L;;;;;N;;;;; +14604;ANATOLIAN HIEROGLYPH A461;Lo;0;L;;;;;N;;;;; +14605;ANATOLIAN HIEROGLYPH A462;Lo;0;L;;;;;N;;;;; +14606;ANATOLIAN HIEROGLYPH A463;Lo;0;L;;;;;N;;;;; +14607;ANATOLIAN HIEROGLYPH A464;Lo;0;L;;;;;N;;;;; +14608;ANATOLIAN HIEROGLYPH A465;Lo;0;L;;;;;N;;;;; +14609;ANATOLIAN HIEROGLYPH A466;Lo;0;L;;;;;N;;;;; +1460A;ANATOLIAN HIEROGLYPH A467;Lo;0;L;;;;;N;;;;; +1460B;ANATOLIAN HIEROGLYPH A468;Lo;0;L;;;;;N;;;;; +1460C;ANATOLIAN HIEROGLYPH A469;Lo;0;L;;;;;N;;;;; +1460D;ANATOLIAN HIEROGLYPH A470;Lo;0;L;;;;;N;;;;; +1460E;ANATOLIAN HIEROGLYPH A471;Lo;0;L;;;;;N;;;;; +1460F;ANATOLIAN HIEROGLYPH A472;Lo;0;L;;;;;N;;;;; +14610;ANATOLIAN HIEROGLYPH A473;Lo;0;L;;;;;N;;;;; +14611;ANATOLIAN HIEROGLYPH A474;Lo;0;L;;;;;N;;;;; +14612;ANATOLIAN HIEROGLYPH A475;Lo;0;L;;;;;N;;;;; +14613;ANATOLIAN HIEROGLYPH A476;Lo;0;L;;;;;N;;;;; +14614;ANATOLIAN HIEROGLYPH A477;Lo;0;L;;;;;N;;;;; +14615;ANATOLIAN HIEROGLYPH A478;Lo;0;L;;;;;N;;;;; +14616;ANATOLIAN HIEROGLYPH A479;Lo;0;L;;;;;N;;;;; +14617;ANATOLIAN HIEROGLYPH A480;Lo;0;L;;;;;N;;;;; +14618;ANATOLIAN HIEROGLYPH A481;Lo;0;L;;;;;N;;;;; +14619;ANATOLIAN HIEROGLYPH A482;Lo;0;L;;;;;N;;;;; +1461A;ANATOLIAN HIEROGLYPH A483;Lo;0;L;;;;;N;;;;; +1461B;ANATOLIAN HIEROGLYPH A484;Lo;0;L;;;;;N;;;;; +1461C;ANATOLIAN HIEROGLYPH A485;Lo;0;L;;;;;N;;;;; +1461D;ANATOLIAN HIEROGLYPH A486;Lo;0;L;;;;;N;;;;; +1461E;ANATOLIAN HIEROGLYPH A487;Lo;0;L;;;;;N;;;;; +1461F;ANATOLIAN HIEROGLYPH A488;Lo;0;L;;;;;N;;;;; +14620;ANATOLIAN HIEROGLYPH A489;Lo;0;L;;;;;N;;;;; +14621;ANATOLIAN HIEROGLYPH A490;Lo;0;L;;;;;N;;;;; +14622;ANATOLIAN HIEROGLYPH A491;Lo;0;L;;;;;N;;;;; +14623;ANATOLIAN HIEROGLYPH A492;Lo;0;L;;;;;N;;;;; +14624;ANATOLIAN HIEROGLYPH A493;Lo;0;L;;;;;N;;;;; +14625;ANATOLIAN HIEROGLYPH A494;Lo;0;L;;;;;N;;;;; +14626;ANATOLIAN HIEROGLYPH A495;Lo;0;L;;;;;N;;;;; +14627;ANATOLIAN HIEROGLYPH A496;Lo;0;L;;;;;N;;;;; +14628;ANATOLIAN HIEROGLYPH A497;Lo;0;L;;;;;N;;;;; +14629;ANATOLIAN HIEROGLYPH A501;Lo;0;L;;;;;N;;;;; +1462A;ANATOLIAN HIEROGLYPH A502;Lo;0;L;;;;;N;;;;; +1462B;ANATOLIAN HIEROGLYPH A503;Lo;0;L;;;;;N;;;;; +1462C;ANATOLIAN HIEROGLYPH A504;Lo;0;L;;;;;N;;;;; +1462D;ANATOLIAN HIEROGLYPH A505;Lo;0;L;;;;;N;;;;; +1462E;ANATOLIAN HIEROGLYPH A506;Lo;0;L;;;;;N;;;;; +1462F;ANATOLIAN HIEROGLYPH A507;Lo;0;L;;;;;N;;;;; +14630;ANATOLIAN HIEROGLYPH A508;Lo;0;L;;;;;N;;;;; +14631;ANATOLIAN HIEROGLYPH A509;Lo;0;L;;;;;N;;;;; +14632;ANATOLIAN HIEROGLYPH A510;Lo;0;L;;;;;N;;;;; +14633;ANATOLIAN HIEROGLYPH A511;Lo;0;L;;;;;N;;;;; +14634;ANATOLIAN HIEROGLYPH A512;Lo;0;L;;;;;N;;;;; +14635;ANATOLIAN HIEROGLYPH A513;Lo;0;L;;;;;N;;;;; +14636;ANATOLIAN HIEROGLYPH A514;Lo;0;L;;;;;N;;;;; +14637;ANATOLIAN HIEROGLYPH A515;Lo;0;L;;;;;N;;;;; +14638;ANATOLIAN HIEROGLYPH A516;Lo;0;L;;;;;N;;;;; +14639;ANATOLIAN HIEROGLYPH A517;Lo;0;L;;;;;N;;;;; +1463A;ANATOLIAN HIEROGLYPH A518;Lo;0;L;;;;;N;;;;; +1463B;ANATOLIAN HIEROGLYPH A519;Lo;0;L;;;;;N;;;;; +1463C;ANATOLIAN HIEROGLYPH A520;Lo;0;L;;;;;N;;;;; +1463D;ANATOLIAN HIEROGLYPH A521;Lo;0;L;;;;;N;;;;; +1463E;ANATOLIAN HIEROGLYPH A522;Lo;0;L;;;;;N;;;;; +1463F;ANATOLIAN HIEROGLYPH A523;Lo;0;L;;;;;N;;;;; +14640;ANATOLIAN HIEROGLYPH A524;Lo;0;L;;;;;N;;;;; +14641;ANATOLIAN HIEROGLYPH A525;Lo;0;L;;;;;N;;;;; +14642;ANATOLIAN HIEROGLYPH A526;Lo;0;L;;;;;N;;;;; +14643;ANATOLIAN HIEROGLYPH A527;Lo;0;L;;;;;N;;;;; +14644;ANATOLIAN HIEROGLYPH A528;Lo;0;L;;;;;N;;;;; +14645;ANATOLIAN HIEROGLYPH A529;Lo;0;L;;;;;N;;;;; +14646;ANATOLIAN HIEROGLYPH A530;Lo;0;L;;;;;N;;;;; +16100;GURUNG KHEMA LETTER A;Lo;0;L;;;;;N;;;;; +16101;GURUNG KHEMA LETTER KA;Lo;0;L;;;;;N;;;;; +16102;GURUNG KHEMA LETTER KHA;Lo;0;L;;;;;N;;;;; +16103;GURUNG KHEMA LETTER GA;Lo;0;L;;;;;N;;;;; +16104;GURUNG KHEMA LETTER GHA;Lo;0;L;;;;;N;;;;; +16105;GURUNG KHEMA LETTER NGA;Lo;0;L;;;;;N;;;;; +16106;GURUNG KHEMA LETTER CA;Lo;0;L;;;;;N;;;;; +16107;GURUNG KHEMA LETTER CHA;Lo;0;L;;;;;N;;;;; +16108;GURUNG KHEMA LETTER JA;Lo;0;L;;;;;N;;;;; +16109;GURUNG KHEMA LETTER JHA;Lo;0;L;;;;;N;;;;; +1610A;GURUNG KHEMA LETTER HA;Lo;0;L;;;;;N;;;;; +1610B;GURUNG KHEMA LETTER TTA;Lo;0;L;;;;;N;;;;; +1610C;GURUNG KHEMA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1610D;GURUNG KHEMA LETTER DDA;Lo;0;L;;;;;N;;;;; +1610E;GURUNG KHEMA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1610F;GURUNG KHEMA LETTER VA;Lo;0;L;;;;;N;;;;; +16110;GURUNG KHEMA LETTER TA;Lo;0;L;;;;;N;;;;; +16111;GURUNG KHEMA LETTER THA;Lo;0;L;;;;;N;;;;; +16112;GURUNG KHEMA LETTER DA;Lo;0;L;;;;;N;;;;; +16113;GURUNG KHEMA LETTER DHA;Lo;0;L;;;;;N;;;;; +16114;GURUNG KHEMA LETTER NA;Lo;0;L;;;;;N;;;;; +16115;GURUNG KHEMA LETTER PA;Lo;0;L;;;;;N;;;;; +16116;GURUNG KHEMA LETTER PHA;Lo;0;L;;;;;N;;;;; +16117;GURUNG KHEMA LETTER BA;Lo;0;L;;;;;N;;;;; +16118;GURUNG KHEMA LETTER BHA;Lo;0;L;;;;;N;;;;; +16119;GURUNG KHEMA LETTER MA;Lo;0;L;;;;;N;;;;; +1611A;GURUNG KHEMA LETTER YA;Lo;0;L;;;;;N;;;;; +1611B;GURUNG KHEMA LETTER RA;Lo;0;L;;;;;N;;;;; +1611C;GURUNG KHEMA LETTER LA;Lo;0;L;;;;;N;;;;; +1611D;GURUNG KHEMA LETTER SA;Lo;0;L;;;;;N;;;;; +1611E;GURUNG KHEMA VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +1611F;GURUNG KHEMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +16120;GURUNG KHEMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +16121;GURUNG KHEMA VOWEL SIGN U;Mn;0;NSM;1611E 1611E;;;;N;;;;; +16122;GURUNG KHEMA VOWEL SIGN UU;Mn;0;NSM;1611E 16129;;;;N;;;;; +16123;GURUNG KHEMA VOWEL SIGN E;Mn;0;NSM;1611E 1611F;;;;N;;;;; +16124;GURUNG KHEMA VOWEL SIGN EE;Mn;0;NSM;16129 1611F;;;;N;;;;; +16125;GURUNG KHEMA VOWEL SIGN AI;Mn;0;NSM;1611E 16120;;;;N;;;;; +16126;GURUNG KHEMA VOWEL SIGN O;Mn;0;NSM;16121 1611F;;;;N;;;;; +16127;GURUNG KHEMA VOWEL SIGN OO;Mn;0;NSM;16122 1611F;;;;N;;;;; +16128;GURUNG KHEMA VOWEL SIGN AU;Mn;0;NSM;16121 16120;;;;N;;;;; +16129;GURUNG KHEMA VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +1612A;GURUNG KHEMA CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +1612B;GURUNG KHEMA CONSONANT SIGN MEDIAL VA;Mc;0;L;;;;;N;;;;; +1612C;GURUNG KHEMA CONSONANT SIGN MEDIAL HA;Mc;0;L;;;;;N;;;;; +1612D;GURUNG KHEMA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1612E;GURUNG KHEMA CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;; +1612F;GURUNG KHEMA SIGN THOLHOMA;Mn;9;NSM;;;;;N;;;;; +16130;GURUNG KHEMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16131;GURUNG KHEMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16132;GURUNG KHEMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16133;GURUNG KHEMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16134;GURUNG KHEMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16135;GURUNG KHEMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16136;GURUNG KHEMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16137;GURUNG KHEMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16138;GURUNG KHEMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16139;GURUNG KHEMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; +16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; +16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +16803;BAMUM LETTER PHASE-A PON MFON PIPAEMBA;Lo;0;L;;;;;N;;;;; +16804;BAMUM LETTER PHASE-A NAA MFON;Lo;0;L;;;;;N;;;;; +16805;BAMUM LETTER PHASE-A SHUENSHUET;Lo;0;L;;;;;N;;;;; +16806;BAMUM LETTER PHASE-A TITA MFON;Lo;0;L;;;;;N;;;;; +16807;BAMUM LETTER PHASE-A NZA MFON;Lo;0;L;;;;;N;;;;; +16808;BAMUM LETTER PHASE-A SHINDA PA NJI;Lo;0;L;;;;;N;;;;; +16809;BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +1680A;BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA;Lo;0;L;;;;;N;;;;; +1680B;BAMUM LETTER PHASE-A MAEMBGBIEE;Lo;0;L;;;;;N;;;;; +1680C;BAMUM LETTER PHASE-A TU MAEMBA;Lo;0;L;;;;;N;;;;; +1680D;BAMUM LETTER PHASE-A NGANGU;Lo;0;L;;;;;N;;;;; +1680E;BAMUM LETTER PHASE-A MAEMVEUX;Lo;0;L;;;;;N;;;;; +1680F;BAMUM LETTER PHASE-A MANSUAE;Lo;0;L;;;;;N;;;;; +16810;BAMUM LETTER PHASE-A MVEUAENGAM;Lo;0;L;;;;;N;;;;; +16811;BAMUM LETTER PHASE-A SEUNYAM;Lo;0;L;;;;;N;;;;; +16812;BAMUM LETTER PHASE-A NTOQPEN;Lo;0;L;;;;;N;;;;; +16813;BAMUM LETTER PHASE-A KEUKEUTNDA;Lo;0;L;;;;;N;;;;; +16814;BAMUM LETTER PHASE-A NKINDI;Lo;0;L;;;;;N;;;;; +16815;BAMUM LETTER PHASE-A SUU;Lo;0;L;;;;;N;;;;; +16816;BAMUM LETTER PHASE-A NGKUENZEUM;Lo;0;L;;;;;N;;;;; +16817;BAMUM LETTER PHASE-A LAPAQ;Lo;0;L;;;;;N;;;;; +16818;BAMUM LETTER PHASE-A LET KUT;Lo;0;L;;;;;N;;;;; +16819;BAMUM LETTER PHASE-A NTAP MFAA;Lo;0;L;;;;;N;;;;; +1681A;BAMUM LETTER PHASE-A MAEKEUP;Lo;0;L;;;;;N;;;;; +1681B;BAMUM LETTER PHASE-A PASHAE;Lo;0;L;;;;;N;;;;; +1681C;BAMUM LETTER PHASE-A GHEUAERAE;Lo;0;L;;;;;N;;;;; +1681D;BAMUM LETTER PHASE-A PAMSHAE;Lo;0;L;;;;;N;;;;; +1681E;BAMUM LETTER PHASE-A MON NGGEUAET;Lo;0;L;;;;;N;;;;; +1681F;BAMUM LETTER PHASE-A NZUN MEUT;Lo;0;L;;;;;N;;;;; +16820;BAMUM LETTER PHASE-A U YUQ NAE;Lo;0;L;;;;;N;;;;; +16821;BAMUM LETTER PHASE-A GHEUAEGHEUAE;Lo;0;L;;;;;N;;;;; +16822;BAMUM LETTER PHASE-A NTAP NTAA;Lo;0;L;;;;;N;;;;; +16823;BAMUM LETTER PHASE-A SISA;Lo;0;L;;;;;N;;;;; +16824;BAMUM LETTER PHASE-A MGBASA;Lo;0;L;;;;;N;;;;; +16825;BAMUM LETTER PHASE-A MEUNJOMNDEUQ;Lo;0;L;;;;;N;;;;; +16826;BAMUM LETTER PHASE-A MOOMPUQ;Lo;0;L;;;;;N;;;;; +16827;BAMUM LETTER PHASE-A KAFA;Lo;0;L;;;;;N;;;;; +16828;BAMUM LETTER PHASE-A PA LEERAEWA;Lo;0;L;;;;;N;;;;; +16829;BAMUM LETTER PHASE-A NDA LEERAEWA;Lo;0;L;;;;;N;;;;; +1682A;BAMUM LETTER PHASE-A PET;Lo;0;L;;;;;N;;;;; +1682B;BAMUM LETTER PHASE-A MAEMKPEN;Lo;0;L;;;;;N;;;;; +1682C;BAMUM LETTER PHASE-A NIKA;Lo;0;L;;;;;N;;;;; +1682D;BAMUM LETTER PHASE-A PUP;Lo;0;L;;;;;N;;;;; +1682E;BAMUM LETTER PHASE-A TUAEP;Lo;0;L;;;;;N;;;;; +1682F;BAMUM LETTER PHASE-A LUAEP;Lo;0;L;;;;;N;;;;; +16830;BAMUM LETTER PHASE-A SONJAM;Lo;0;L;;;;;N;;;;; +16831;BAMUM LETTER PHASE-A TEUTEUWEN;Lo;0;L;;;;;N;;;;; +16832;BAMUM LETTER PHASE-A MAENYI;Lo;0;L;;;;;N;;;;; +16833;BAMUM LETTER PHASE-A KET;Lo;0;L;;;;;N;;;;; +16834;BAMUM LETTER PHASE-A NDAANGGEUAET;Lo;0;L;;;;;N;;;;; +16835;BAMUM LETTER PHASE-A KUOQ;Lo;0;L;;;;;N;;;;; +16836;BAMUM LETTER PHASE-A MOOMEUT;Lo;0;L;;;;;N;;;;; +16837;BAMUM LETTER PHASE-A SHUM;Lo;0;L;;;;;N;;;;; +16838;BAMUM LETTER PHASE-A LOMMAE;Lo;0;L;;;;;N;;;;; +16839;BAMUM LETTER PHASE-A FIRI;Lo;0;L;;;;;N;;;;; +1683A;BAMUM LETTER PHASE-A ROM;Lo;0;L;;;;;N;;;;; +1683B;BAMUM LETTER PHASE-A KPOQ;Lo;0;L;;;;;N;;;;; +1683C;BAMUM LETTER PHASE-A SOQ;Lo;0;L;;;;;N;;;;; +1683D;BAMUM LETTER PHASE-A MAP PIEET;Lo;0;L;;;;;N;;;;; +1683E;BAMUM LETTER PHASE-A SHIRAE;Lo;0;L;;;;;N;;;;; +1683F;BAMUM LETTER PHASE-A NTAP;Lo;0;L;;;;;N;;;;; +16840;BAMUM LETTER PHASE-A SHOQ NSHUT YUM;Lo;0;L;;;;;N;;;;; +16841;BAMUM LETTER PHASE-A NYIT MONGKEUAEQ;Lo;0;L;;;;;N;;;;; +16842;BAMUM LETTER PHASE-A PAARAE;Lo;0;L;;;;;N;;;;; +16843;BAMUM LETTER PHASE-A NKAARAE;Lo;0;L;;;;;N;;;;; +16844;BAMUM LETTER PHASE-A UNKNOWN;Lo;0;L;;;;;N;;;;; +16845;BAMUM LETTER PHASE-A NGGEN;Lo;0;L;;;;;N;;;;; +16846;BAMUM LETTER PHASE-A MAESI;Lo;0;L;;;;;N;;;;; +16847;BAMUM LETTER PHASE-A NJAM;Lo;0;L;;;;;N;;;;; +16848;BAMUM LETTER PHASE-A MBANYI;Lo;0;L;;;;;N;;;;; +16849;BAMUM LETTER PHASE-A NYET;Lo;0;L;;;;;N;;;;; +1684A;BAMUM LETTER PHASE-A TEUAEN;Lo;0;L;;;;;N;;;;; +1684B;BAMUM LETTER PHASE-A SOT;Lo;0;L;;;;;N;;;;; +1684C;BAMUM LETTER PHASE-A PAAM;Lo;0;L;;;;;N;;;;; +1684D;BAMUM LETTER PHASE-A NSHIEE;Lo;0;L;;;;;N;;;;; +1684E;BAMUM LETTER PHASE-A MAEM;Lo;0;L;;;;;N;;;;; +1684F;BAMUM LETTER PHASE-A NYI;Lo;0;L;;;;;N;;;;; +16850;BAMUM LETTER PHASE-A KAQ;Lo;0;L;;;;;N;;;;; +16851;BAMUM LETTER PHASE-A NSHA;Lo;0;L;;;;;N;;;;; +16852;BAMUM LETTER PHASE-A VEE;Lo;0;L;;;;;N;;;;; +16853;BAMUM LETTER PHASE-A LU;Lo;0;L;;;;;N;;;;; +16854;BAMUM LETTER PHASE-A NEN;Lo;0;L;;;;;N;;;;; +16855;BAMUM LETTER PHASE-A NAQ;Lo;0;L;;;;;N;;;;; +16856;BAMUM LETTER PHASE-A MBAQ;Lo;0;L;;;;;N;;;;; +16857;BAMUM LETTER PHASE-B NSHUET;Lo;0;L;;;;;N;;;;; +16858;BAMUM LETTER PHASE-B TU MAEMGBIEE;Lo;0;L;;;;;N;;;;; +16859;BAMUM LETTER PHASE-B SIEE;Lo;0;L;;;;;N;;;;; +1685A;BAMUM LETTER PHASE-B SET TU;Lo;0;L;;;;;N;;;;; +1685B;BAMUM LETTER PHASE-B LOM NTEUM;Lo;0;L;;;;;N;;;;; +1685C;BAMUM LETTER PHASE-B MBA MAELEE;Lo;0;L;;;;;N;;;;; +1685D;BAMUM LETTER PHASE-B KIEEM;Lo;0;L;;;;;N;;;;; +1685E;BAMUM LETTER PHASE-B YEURAE;Lo;0;L;;;;;N;;;;; +1685F;BAMUM LETTER PHASE-B MBAARAE;Lo;0;L;;;;;N;;;;; +16860;BAMUM LETTER PHASE-B KAM;Lo;0;L;;;;;N;;;;; +16861;BAMUM LETTER PHASE-B PEESHI;Lo;0;L;;;;;N;;;;; +16862;BAMUM LETTER PHASE-B YAFU LEERAEWA;Lo;0;L;;;;;N;;;;; +16863;BAMUM LETTER PHASE-B LAM NSHUT NYAM;Lo;0;L;;;;;N;;;;; +16864;BAMUM LETTER PHASE-B NTIEE SHEUOQ;Lo;0;L;;;;;N;;;;; +16865;BAMUM LETTER PHASE-B NDU NJAA;Lo;0;L;;;;;N;;;;; +16866;BAMUM LETTER PHASE-B GHEUGHEUAEM;Lo;0;L;;;;;N;;;;; +16867;BAMUM LETTER PHASE-B PIT;Lo;0;L;;;;;N;;;;; +16868;BAMUM LETTER PHASE-B TU NSIEE;Lo;0;L;;;;;N;;;;; +16869;BAMUM LETTER PHASE-B SHET NJAQ;Lo;0;L;;;;;N;;;;; +1686A;BAMUM LETTER PHASE-B SHEUAEQTU;Lo;0;L;;;;;N;;;;; +1686B;BAMUM LETTER PHASE-B MFON TEUAEQ;Lo;0;L;;;;;N;;;;; +1686C;BAMUM LETTER PHASE-B MBIT MBAAKET;Lo;0;L;;;;;N;;;;; +1686D;BAMUM LETTER PHASE-B NYI NTEUM;Lo;0;L;;;;;N;;;;; +1686E;BAMUM LETTER PHASE-B KEUPUQ;Lo;0;L;;;;;N;;;;; +1686F;BAMUM LETTER PHASE-B GHEUGHEN;Lo;0;L;;;;;N;;;;; +16870;BAMUM LETTER PHASE-B KEUYEUX;Lo;0;L;;;;;N;;;;; +16871;BAMUM LETTER PHASE-B LAANAE;Lo;0;L;;;;;N;;;;; +16872;BAMUM LETTER PHASE-B PARUM;Lo;0;L;;;;;N;;;;; +16873;BAMUM LETTER PHASE-B VEUM;Lo;0;L;;;;;N;;;;; +16874;BAMUM LETTER PHASE-B NGKINDI MVOP;Lo;0;L;;;;;N;;;;; +16875;BAMUM LETTER PHASE-B NGGEU MBU;Lo;0;L;;;;;N;;;;; +16876;BAMUM LETTER PHASE-B WUAET;Lo;0;L;;;;;N;;;;; +16877;BAMUM LETTER PHASE-B SAKEUAE;Lo;0;L;;;;;N;;;;; +16878;BAMUM LETTER PHASE-B TAAM;Lo;0;L;;;;;N;;;;; +16879;BAMUM LETTER PHASE-B MEUQ;Lo;0;L;;;;;N;;;;; +1687A;BAMUM LETTER PHASE-B NGGUOQ;Lo;0;L;;;;;N;;;;; +1687B;BAMUM LETTER PHASE-B NGGUOQ LARGE;Lo;0;L;;;;;N;;;;; +1687C;BAMUM LETTER PHASE-B MFIYAQ;Lo;0;L;;;;;N;;;;; +1687D;BAMUM LETTER PHASE-B SUE;Lo;0;L;;;;;N;;;;; +1687E;BAMUM LETTER PHASE-B MBEURI;Lo;0;L;;;;;N;;;;; +1687F;BAMUM LETTER PHASE-B MONTIEEN;Lo;0;L;;;;;N;;;;; +16880;BAMUM LETTER PHASE-B NYAEMAE;Lo;0;L;;;;;N;;;;; +16881;BAMUM LETTER PHASE-B PUNGAAM;Lo;0;L;;;;;N;;;;; +16882;BAMUM LETTER PHASE-B MEUT NGGEET;Lo;0;L;;;;;N;;;;; +16883;BAMUM LETTER PHASE-B FEUX;Lo;0;L;;;;;N;;;;; +16884;BAMUM LETTER PHASE-B MBUOQ;Lo;0;L;;;;;N;;;;; +16885;BAMUM LETTER PHASE-B FEE;Lo;0;L;;;;;N;;;;; +16886;BAMUM LETTER PHASE-B KEUAEM;Lo;0;L;;;;;N;;;;; +16887;BAMUM LETTER PHASE-B MA NJEUAENA;Lo;0;L;;;;;N;;;;; +16888;BAMUM LETTER PHASE-B MA NJUQA;Lo;0;L;;;;;N;;;;; +16889;BAMUM LETTER PHASE-B LET;Lo;0;L;;;;;N;;;;; +1688A;BAMUM LETTER PHASE-B NGGAAM;Lo;0;L;;;;;N;;;;; +1688B;BAMUM LETTER PHASE-B NSEN;Lo;0;L;;;;;N;;;;; +1688C;BAMUM LETTER PHASE-B MA;Lo;0;L;;;;;N;;;;; +1688D;BAMUM LETTER PHASE-B KIQ;Lo;0;L;;;;;N;;;;; +1688E;BAMUM LETTER PHASE-B NGOM;Lo;0;L;;;;;N;;;;; +1688F;BAMUM LETTER PHASE-C NGKUE MAEMBA;Lo;0;L;;;;;N;;;;; +16890;BAMUM LETTER PHASE-C NZA;Lo;0;L;;;;;N;;;;; +16891;BAMUM LETTER PHASE-C YUM;Lo;0;L;;;;;N;;;;; +16892;BAMUM LETTER PHASE-C WANGKUOQ;Lo;0;L;;;;;N;;;;; +16893;BAMUM LETTER PHASE-C NGGEN;Lo;0;L;;;;;N;;;;; +16894;BAMUM LETTER PHASE-C NDEUAEREE;Lo;0;L;;;;;N;;;;; +16895;BAMUM LETTER PHASE-C NGKAQ;Lo;0;L;;;;;N;;;;; +16896;BAMUM LETTER PHASE-C GHARAE;Lo;0;L;;;;;N;;;;; +16897;BAMUM LETTER PHASE-C MBEEKEET;Lo;0;L;;;;;N;;;;; +16898;BAMUM LETTER PHASE-C GBAYI;Lo;0;L;;;;;N;;;;; +16899;BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN;Lo;0;L;;;;;N;;;;; +1689A;BAMUM LETTER PHASE-C NTU MBIT;Lo;0;L;;;;;N;;;;; +1689B;BAMUM LETTER PHASE-C MBEUM;Lo;0;L;;;;;N;;;;; +1689C;BAMUM LETTER PHASE-C PIRIEEN;Lo;0;L;;;;;N;;;;; +1689D;BAMUM LETTER PHASE-C NDOMBU;Lo;0;L;;;;;N;;;;; +1689E;BAMUM LETTER PHASE-C MBAA CABBAGE-TREE;Lo;0;L;;;;;N;;;;; +1689F;BAMUM LETTER PHASE-C KEUSHEUAEP;Lo;0;L;;;;;N;;;;; +168A0;BAMUM LETTER PHASE-C GHAP;Lo;0;L;;;;;N;;;;; +168A1;BAMUM LETTER PHASE-C KEUKAQ;Lo;0;L;;;;;N;;;;; +168A2;BAMUM LETTER PHASE-C YU MUOMAE;Lo;0;L;;;;;N;;;;; +168A3;BAMUM LETTER PHASE-C NZEUM;Lo;0;L;;;;;N;;;;; +168A4;BAMUM LETTER PHASE-C MBUE;Lo;0;L;;;;;N;;;;; +168A5;BAMUM LETTER PHASE-C NSEUAEN;Lo;0;L;;;;;N;;;;; +168A6;BAMUM LETTER PHASE-C MBIT;Lo;0;L;;;;;N;;;;; +168A7;BAMUM LETTER PHASE-C YEUQ;Lo;0;L;;;;;N;;;;; +168A8;BAMUM LETTER PHASE-C KPARAQ;Lo;0;L;;;;;N;;;;; +168A9;BAMUM LETTER PHASE-C KAA;Lo;0;L;;;;;N;;;;; +168AA;BAMUM LETTER PHASE-C SEUX;Lo;0;L;;;;;N;;;;; +168AB;BAMUM LETTER PHASE-C NDIDA;Lo;0;L;;;;;N;;;;; +168AC;BAMUM LETTER PHASE-C TAASHAE;Lo;0;L;;;;;N;;;;; +168AD;BAMUM LETTER PHASE-C NJUEQ;Lo;0;L;;;;;N;;;;; +168AE;BAMUM LETTER PHASE-C TITA YUE;Lo;0;L;;;;;N;;;;; +168AF;BAMUM LETTER PHASE-C SUAET;Lo;0;L;;;;;N;;;;; +168B0;BAMUM LETTER PHASE-C NGGUAEN NYAM;Lo;0;L;;;;;N;;;;; +168B1;BAMUM LETTER PHASE-C VEUX;Lo;0;L;;;;;N;;;;; +168B2;BAMUM LETTER PHASE-C NANSANAQ;Lo;0;L;;;;;N;;;;; +168B3;BAMUM LETTER PHASE-C MA KEUAERI;Lo;0;L;;;;;N;;;;; +168B4;BAMUM LETTER PHASE-C NTAA;Lo;0;L;;;;;N;;;;; +168B5;BAMUM LETTER PHASE-C NGGUON;Lo;0;L;;;;;N;;;;; +168B6;BAMUM LETTER PHASE-C LAP;Lo;0;L;;;;;N;;;;; +168B7;BAMUM LETTER PHASE-C MBIRIEEN;Lo;0;L;;;;;N;;;;; +168B8;BAMUM LETTER PHASE-C MGBASAQ;Lo;0;L;;;;;N;;;;; +168B9;BAMUM LETTER PHASE-C NTEUNGBA;Lo;0;L;;;;;N;;;;; +168BA;BAMUM LETTER PHASE-C TEUTEUX;Lo;0;L;;;;;N;;;;; +168BB;BAMUM LETTER PHASE-C NGGUM;Lo;0;L;;;;;N;;;;; +168BC;BAMUM LETTER PHASE-C FUE;Lo;0;L;;;;;N;;;;; +168BD;BAMUM LETTER PHASE-C NDEUT;Lo;0;L;;;;;N;;;;; +168BE;BAMUM LETTER PHASE-C NSA;Lo;0;L;;;;;N;;;;; +168BF;BAMUM LETTER PHASE-C NSHAQ;Lo;0;L;;;;;N;;;;; +168C0;BAMUM LETTER PHASE-C BUNG;Lo;0;L;;;;;N;;;;; +168C1;BAMUM LETTER PHASE-C VEUAEPEN;Lo;0;L;;;;;N;;;;; +168C2;BAMUM LETTER PHASE-C MBERAE;Lo;0;L;;;;;N;;;;; +168C3;BAMUM LETTER PHASE-C RU;Lo;0;L;;;;;N;;;;; +168C4;BAMUM LETTER PHASE-C NJAEM;Lo;0;L;;;;;N;;;;; +168C5;BAMUM LETTER PHASE-C LAM;Lo;0;L;;;;;N;;;;; +168C6;BAMUM LETTER PHASE-C TITUAEP;Lo;0;L;;;;;N;;;;; +168C7;BAMUM LETTER PHASE-C NSUOT NGOM;Lo;0;L;;;;;N;;;;; +168C8;BAMUM LETTER PHASE-C NJEEEE;Lo;0;L;;;;;N;;;;; +168C9;BAMUM LETTER PHASE-C KET;Lo;0;L;;;;;N;;;;; +168CA;BAMUM LETTER PHASE-C NGGU;Lo;0;L;;;;;N;;;;; +168CB;BAMUM LETTER PHASE-C MAESI;Lo;0;L;;;;;N;;;;; +168CC;BAMUM LETTER PHASE-C MBUAEM;Lo;0;L;;;;;N;;;;; +168CD;BAMUM LETTER PHASE-C LU;Lo;0;L;;;;;N;;;;; +168CE;BAMUM LETTER PHASE-C KUT;Lo;0;L;;;;;N;;;;; +168CF;BAMUM LETTER PHASE-C NJAM;Lo;0;L;;;;;N;;;;; +168D0;BAMUM LETTER PHASE-C NGOM;Lo;0;L;;;;;N;;;;; +168D1;BAMUM LETTER PHASE-C WUP;Lo;0;L;;;;;N;;;;; +168D2;BAMUM LETTER PHASE-C NGGUEET;Lo;0;L;;;;;N;;;;; +168D3;BAMUM LETTER PHASE-C NSOM;Lo;0;L;;;;;N;;;;; +168D4;BAMUM LETTER PHASE-C NTEN;Lo;0;L;;;;;N;;;;; +168D5;BAMUM LETTER PHASE-C KUOP NKAARAE;Lo;0;L;;;;;N;;;;; +168D6;BAMUM LETTER PHASE-C NSUN;Lo;0;L;;;;;N;;;;; +168D7;BAMUM LETTER PHASE-C NDAM;Lo;0;L;;;;;N;;;;; +168D8;BAMUM LETTER PHASE-C MA NSIEE;Lo;0;L;;;;;N;;;;; +168D9;BAMUM LETTER PHASE-C YAA;Lo;0;L;;;;;N;;;;; +168DA;BAMUM LETTER PHASE-C NDAP;Lo;0;L;;;;;N;;;;; +168DB;BAMUM LETTER PHASE-C SHUEQ;Lo;0;L;;;;;N;;;;; +168DC;BAMUM LETTER PHASE-C SETFON;Lo;0;L;;;;;N;;;;; +168DD;BAMUM LETTER PHASE-C MBI;Lo;0;L;;;;;N;;;;; +168DE;BAMUM LETTER PHASE-C MAEMBA;Lo;0;L;;;;;N;;;;; +168DF;BAMUM LETTER PHASE-C MBANYI;Lo;0;L;;;;;N;;;;; +168E0;BAMUM LETTER PHASE-C KEUSEUX;Lo;0;L;;;;;N;;;;; +168E1;BAMUM LETTER PHASE-C MBEUX;Lo;0;L;;;;;N;;;;; +168E2;BAMUM LETTER PHASE-C KEUM;Lo;0;L;;;;;N;;;;; +168E3;BAMUM LETTER PHASE-C MBAA PICKET;Lo;0;L;;;;;N;;;;; +168E4;BAMUM LETTER PHASE-C YUWOQ;Lo;0;L;;;;;N;;;;; +168E5;BAMUM LETTER PHASE-C NJEUX;Lo;0;L;;;;;N;;;;; +168E6;BAMUM LETTER PHASE-C MIEE;Lo;0;L;;;;;N;;;;; +168E7;BAMUM LETTER PHASE-C MUAE;Lo;0;L;;;;;N;;;;; +168E8;BAMUM LETTER PHASE-C SHIQ;Lo;0;L;;;;;N;;;;; +168E9;BAMUM LETTER PHASE-C KEN LAW;Lo;0;L;;;;;N;;;;; +168EA;BAMUM LETTER PHASE-C KEN FATIGUE;Lo;0;L;;;;;N;;;;; +168EB;BAMUM LETTER PHASE-C NGAQ;Lo;0;L;;;;;N;;;;; +168EC;BAMUM LETTER PHASE-C NAQ;Lo;0;L;;;;;N;;;;; +168ED;BAMUM LETTER PHASE-C LIQ;Lo;0;L;;;;;N;;;;; +168EE;BAMUM LETTER PHASE-C PIN;Lo;0;L;;;;;N;;;;; +168EF;BAMUM LETTER PHASE-C PEN;Lo;0;L;;;;;N;;;;; +168F0;BAMUM LETTER PHASE-C TET;Lo;0;L;;;;;N;;;;; +168F1;BAMUM LETTER PHASE-D MBUO;Lo;0;L;;;;;N;;;;; +168F2;BAMUM LETTER PHASE-D WAP;Lo;0;L;;;;;N;;;;; +168F3;BAMUM LETTER PHASE-D NJI;Lo;0;L;;;;;N;;;;; +168F4;BAMUM LETTER PHASE-D MFON;Lo;0;L;;;;;N;;;;; +168F5;BAMUM LETTER PHASE-D NJIEE;Lo;0;L;;;;;N;;;;; +168F6;BAMUM LETTER PHASE-D LIEE;Lo;0;L;;;;;N;;;;; +168F7;BAMUM LETTER PHASE-D NJEUT;Lo;0;L;;;;;N;;;;; +168F8;BAMUM LETTER PHASE-D NSHEE;Lo;0;L;;;;;N;;;;; +168F9;BAMUM LETTER PHASE-D NGGAAMAE;Lo;0;L;;;;;N;;;;; +168FA;BAMUM LETTER PHASE-D NYAM;Lo;0;L;;;;;N;;;;; +168FB;BAMUM LETTER PHASE-D WUAEN;Lo;0;L;;;;;N;;;;; +168FC;BAMUM LETTER PHASE-D NGKUN;Lo;0;L;;;;;N;;;;; +168FD;BAMUM LETTER PHASE-D SHEE;Lo;0;L;;;;;N;;;;; +168FE;BAMUM LETTER PHASE-D NGKAP;Lo;0;L;;;;;N;;;;; +168FF;BAMUM LETTER PHASE-D KEUAETMEUN;Lo;0;L;;;;;N;;;;; +16900;BAMUM LETTER PHASE-D TEUT;Lo;0;L;;;;;N;;;;; +16901;BAMUM LETTER PHASE-D SHEUAE;Lo;0;L;;;;;N;;;;; +16902;BAMUM LETTER PHASE-D NJAP;Lo;0;L;;;;;N;;;;; +16903;BAMUM LETTER PHASE-D SUE;Lo;0;L;;;;;N;;;;; +16904;BAMUM LETTER PHASE-D KET;Lo;0;L;;;;;N;;;;; +16905;BAMUM LETTER PHASE-D YAEMMAE;Lo;0;L;;;;;N;;;;; +16906;BAMUM LETTER PHASE-D KUOM;Lo;0;L;;;;;N;;;;; +16907;BAMUM LETTER PHASE-D SAP;Lo;0;L;;;;;N;;;;; +16908;BAMUM LETTER PHASE-D MFEUT;Lo;0;L;;;;;N;;;;; +16909;BAMUM LETTER PHASE-D NDEUX;Lo;0;L;;;;;N;;;;; +1690A;BAMUM LETTER PHASE-D MALEERI;Lo;0;L;;;;;N;;;;; +1690B;BAMUM LETTER PHASE-D MEUT;Lo;0;L;;;;;N;;;;; +1690C;BAMUM LETTER PHASE-D SEUAEQ;Lo;0;L;;;;;N;;;;; +1690D;BAMUM LETTER PHASE-D YEN;Lo;0;L;;;;;N;;;;; +1690E;BAMUM LETTER PHASE-D NJEUAEM;Lo;0;L;;;;;N;;;;; +1690F;BAMUM LETTER PHASE-D KEUOT MBUAE;Lo;0;L;;;;;N;;;;; +16910;BAMUM LETTER PHASE-D NGKEURI;Lo;0;L;;;;;N;;;;; +16911;BAMUM LETTER PHASE-D TU;Lo;0;L;;;;;N;;;;; +16912;BAMUM LETTER PHASE-D GHAA;Lo;0;L;;;;;N;;;;; +16913;BAMUM LETTER PHASE-D NGKYEE;Lo;0;L;;;;;N;;;;; +16914;BAMUM LETTER PHASE-D FEUFEUAET;Lo;0;L;;;;;N;;;;; +16915;BAMUM LETTER PHASE-D NDEE;Lo;0;L;;;;;N;;;;; +16916;BAMUM LETTER PHASE-D MGBOFUM;Lo;0;L;;;;;N;;;;; +16917;BAMUM LETTER PHASE-D LEUAEP;Lo;0;L;;;;;N;;;;; +16918;BAMUM LETTER PHASE-D NDON;Lo;0;L;;;;;N;;;;; +16919;BAMUM LETTER PHASE-D MONI;Lo;0;L;;;;;N;;;;; +1691A;BAMUM LETTER PHASE-D MGBEUN;Lo;0;L;;;;;N;;;;; +1691B;BAMUM LETTER PHASE-D PUUT;Lo;0;L;;;;;N;;;;; +1691C;BAMUM LETTER PHASE-D MGBIEE;Lo;0;L;;;;;N;;;;; +1691D;BAMUM LETTER PHASE-D MFO;Lo;0;L;;;;;N;;;;; +1691E;BAMUM LETTER PHASE-D LUM;Lo;0;L;;;;;N;;;;; +1691F;BAMUM LETTER PHASE-D NSIEEP;Lo;0;L;;;;;N;;;;; +16920;BAMUM LETTER PHASE-D MBAA;Lo;0;L;;;;;N;;;;; +16921;BAMUM LETTER PHASE-D KWAET;Lo;0;L;;;;;N;;;;; +16922;BAMUM LETTER PHASE-D NYET;Lo;0;L;;;;;N;;;;; +16923;BAMUM LETTER PHASE-D TEUAEN;Lo;0;L;;;;;N;;;;; +16924;BAMUM LETTER PHASE-D SOT;Lo;0;L;;;;;N;;;;; +16925;BAMUM LETTER PHASE-D YUWOQ;Lo;0;L;;;;;N;;;;; +16926;BAMUM LETTER PHASE-D KEUM;Lo;0;L;;;;;N;;;;; +16927;BAMUM LETTER PHASE-D RAEM;Lo;0;L;;;;;N;;;;; +16928;BAMUM LETTER PHASE-D TEEEE;Lo;0;L;;;;;N;;;;; +16929;BAMUM LETTER PHASE-D NGKEUAEQ;Lo;0;L;;;;;N;;;;; +1692A;BAMUM LETTER PHASE-D MFEUAE;Lo;0;L;;;;;N;;;;; +1692B;BAMUM LETTER PHASE-D NSIEET;Lo;0;L;;;;;N;;;;; +1692C;BAMUM LETTER PHASE-D KEUP;Lo;0;L;;;;;N;;;;; +1692D;BAMUM LETTER PHASE-D PIP;Lo;0;L;;;;;N;;;;; +1692E;BAMUM LETTER PHASE-D PEUTAE;Lo;0;L;;;;;N;;;;; +1692F;BAMUM LETTER PHASE-D NYUE;Lo;0;L;;;;;N;;;;; +16930;BAMUM LETTER PHASE-D LET;Lo;0;L;;;;;N;;;;; +16931;BAMUM LETTER PHASE-D NGGAAM;Lo;0;L;;;;;N;;;;; +16932;BAMUM LETTER PHASE-D MFIEE;Lo;0;L;;;;;N;;;;; +16933;BAMUM LETTER PHASE-D NGGWAEN;Lo;0;L;;;;;N;;;;; +16934;BAMUM LETTER PHASE-D YUOM;Lo;0;L;;;;;N;;;;; +16935;BAMUM LETTER PHASE-D PAP;Lo;0;L;;;;;N;;;;; +16936;BAMUM LETTER PHASE-D YUOP;Lo;0;L;;;;;N;;;;; +16937;BAMUM LETTER PHASE-D NDAM;Lo;0;L;;;;;N;;;;; +16938;BAMUM LETTER PHASE-D NTEUM;Lo;0;L;;;;;N;;;;; +16939;BAMUM LETTER PHASE-D SUAE;Lo;0;L;;;;;N;;;;; +1693A;BAMUM LETTER PHASE-D KUN;Lo;0;L;;;;;N;;;;; +1693B;BAMUM LETTER PHASE-D NGGEUX;Lo;0;L;;;;;N;;;;; +1693C;BAMUM LETTER PHASE-D NGKIEE;Lo;0;L;;;;;N;;;;; +1693D;BAMUM LETTER PHASE-D TUOT;Lo;0;L;;;;;N;;;;; +1693E;BAMUM LETTER PHASE-D MEUN;Lo;0;L;;;;;N;;;;; +1693F;BAMUM LETTER PHASE-D KUQ;Lo;0;L;;;;;N;;;;; +16940;BAMUM LETTER PHASE-D NSUM;Lo;0;L;;;;;N;;;;; +16941;BAMUM LETTER PHASE-D TEUN;Lo;0;L;;;;;N;;;;; +16942;BAMUM LETTER PHASE-D MAENJET;Lo;0;L;;;;;N;;;;; +16943;BAMUM LETTER PHASE-D NGGAP;Lo;0;L;;;;;N;;;;; +16944;BAMUM LETTER PHASE-D LEUM;Lo;0;L;;;;;N;;;;; +16945;BAMUM LETTER PHASE-D NGGUOM;Lo;0;L;;;;;N;;;;; +16946;BAMUM LETTER PHASE-D NSHUT;Lo;0;L;;;;;N;;;;; +16947;BAMUM LETTER PHASE-D NJUEQ;Lo;0;L;;;;;N;;;;; +16948;BAMUM LETTER PHASE-D GHEUAE;Lo;0;L;;;;;N;;;;; +16949;BAMUM LETTER PHASE-D KU;Lo;0;L;;;;;N;;;;; +1694A;BAMUM LETTER PHASE-D REN OLD;Lo;0;L;;;;;N;;;;; +1694B;BAMUM LETTER PHASE-D TAE;Lo;0;L;;;;;N;;;;; +1694C;BAMUM LETTER PHASE-D TOQ;Lo;0;L;;;;;N;;;;; +1694D;BAMUM LETTER PHASE-D NYI;Lo;0;L;;;;;N;;;;; +1694E;BAMUM LETTER PHASE-D RII;Lo;0;L;;;;;N;;;;; +1694F;BAMUM LETTER PHASE-D LEEEE;Lo;0;L;;;;;N;;;;; +16950;BAMUM LETTER PHASE-D MEEEE;Lo;0;L;;;;;N;;;;; +16951;BAMUM LETTER PHASE-D M;Lo;0;L;;;;;N;;;;; +16952;BAMUM LETTER PHASE-D SUU;Lo;0;L;;;;;N;;;;; +16953;BAMUM LETTER PHASE-D MU;Lo;0;L;;;;;N;;;;; +16954;BAMUM LETTER PHASE-D SHII;Lo;0;L;;;;;N;;;;; +16955;BAMUM LETTER PHASE-D SHEUX;Lo;0;L;;;;;N;;;;; +16956;BAMUM LETTER PHASE-D KYEE;Lo;0;L;;;;;N;;;;; +16957;BAMUM LETTER PHASE-D NU;Lo;0;L;;;;;N;;;;; +16958;BAMUM LETTER PHASE-D SHU;Lo;0;L;;;;;N;;;;; +16959;BAMUM LETTER PHASE-D NTEE;Lo;0;L;;;;;N;;;;; +1695A;BAMUM LETTER PHASE-D PEE;Lo;0;L;;;;;N;;;;; +1695B;BAMUM LETTER PHASE-D NI;Lo;0;L;;;;;N;;;;; +1695C;BAMUM LETTER PHASE-D SHOQ;Lo;0;L;;;;;N;;;;; +1695D;BAMUM LETTER PHASE-D PUQ;Lo;0;L;;;;;N;;;;; +1695E;BAMUM LETTER PHASE-D MVOP;Lo;0;L;;;;;N;;;;; +1695F;BAMUM LETTER PHASE-D LOQ;Lo;0;L;;;;;N;;;;; +16960;BAMUM LETTER PHASE-D REN MUCH;Lo;0;L;;;;;N;;;;; +16961;BAMUM LETTER PHASE-D TI;Lo;0;L;;;;;N;;;;; +16962;BAMUM LETTER PHASE-D NTUU;Lo;0;L;;;;;N;;;;; +16963;BAMUM LETTER PHASE-D MBAA SEVEN;Lo;0;L;;;;;N;;;;; +16964;BAMUM LETTER PHASE-D SAQ;Lo;0;L;;;;;N;;;;; +16965;BAMUM LETTER PHASE-D FAA;Lo;0;L;;;;;N;;;;; +16966;BAMUM LETTER PHASE-E NDAP;Lo;0;L;;;;;N;;;;; +16967;BAMUM LETTER PHASE-E TOON;Lo;0;L;;;;;N;;;;; +16968;BAMUM LETTER PHASE-E MBEUM;Lo;0;L;;;;;N;;;;; +16969;BAMUM LETTER PHASE-E LAP;Lo;0;L;;;;;N;;;;; +1696A;BAMUM LETTER PHASE-E VOM;Lo;0;L;;;;;N;;;;; +1696B;BAMUM LETTER PHASE-E LOON;Lo;0;L;;;;;N;;;;; +1696C;BAMUM LETTER PHASE-E PAA;Lo;0;L;;;;;N;;;;; +1696D;BAMUM LETTER PHASE-E SOM;Lo;0;L;;;;;N;;;;; +1696E;BAMUM LETTER PHASE-E RAQ;Lo;0;L;;;;;N;;;;; +1696F;BAMUM LETTER PHASE-E NSHUOP;Lo;0;L;;;;;N;;;;; +16970;BAMUM LETTER PHASE-E NDUN;Lo;0;L;;;;;N;;;;; +16971;BAMUM LETTER PHASE-E PUAE;Lo;0;L;;;;;N;;;;; +16972;BAMUM LETTER PHASE-E TAM;Lo;0;L;;;;;N;;;;; +16973;BAMUM LETTER PHASE-E NGKA;Lo;0;L;;;;;N;;;;; +16974;BAMUM LETTER PHASE-E KPEUX;Lo;0;L;;;;;N;;;;; +16975;BAMUM LETTER PHASE-E WUO;Lo;0;L;;;;;N;;;;; +16976;BAMUM LETTER PHASE-E SEE;Lo;0;L;;;;;N;;;;; +16977;BAMUM LETTER PHASE-E NGGEUAET;Lo;0;L;;;;;N;;;;; +16978;BAMUM LETTER PHASE-E PAAM;Lo;0;L;;;;;N;;;;; +16979;BAMUM LETTER PHASE-E TOO;Lo;0;L;;;;;N;;;;; +1697A;BAMUM LETTER PHASE-E KUOP;Lo;0;L;;;;;N;;;;; +1697B;BAMUM LETTER PHASE-E LOM;Lo;0;L;;;;;N;;;;; +1697C;BAMUM LETTER PHASE-E NSHIEE;Lo;0;L;;;;;N;;;;; +1697D;BAMUM LETTER PHASE-E NGOP;Lo;0;L;;;;;N;;;;; +1697E;BAMUM LETTER PHASE-E MAEM;Lo;0;L;;;;;N;;;;; +1697F;BAMUM LETTER PHASE-E NGKEUX;Lo;0;L;;;;;N;;;;; +16980;BAMUM LETTER PHASE-E NGOQ;Lo;0;L;;;;;N;;;;; +16981;BAMUM LETTER PHASE-E NSHUE;Lo;0;L;;;;;N;;;;; +16982;BAMUM LETTER PHASE-E RIMGBA;Lo;0;L;;;;;N;;;;; +16983;BAMUM LETTER PHASE-E NJEUX;Lo;0;L;;;;;N;;;;; +16984;BAMUM LETTER PHASE-E PEEM;Lo;0;L;;;;;N;;;;; +16985;BAMUM LETTER PHASE-E SAA;Lo;0;L;;;;;N;;;;; +16986;BAMUM LETTER PHASE-E NGGURAE;Lo;0;L;;;;;N;;;;; +16987;BAMUM LETTER PHASE-E MGBA;Lo;0;L;;;;;N;;;;; +16988;BAMUM LETTER PHASE-E GHEUX;Lo;0;L;;;;;N;;;;; +16989;BAMUM LETTER PHASE-E NGKEUAEM;Lo;0;L;;;;;N;;;;; +1698A;BAMUM LETTER PHASE-E NJAEMLI;Lo;0;L;;;;;N;;;;; +1698B;BAMUM LETTER PHASE-E MAP;Lo;0;L;;;;;N;;;;; +1698C;BAMUM LETTER PHASE-E LOOT;Lo;0;L;;;;;N;;;;; +1698D;BAMUM LETTER PHASE-E NGGEEEE;Lo;0;L;;;;;N;;;;; +1698E;BAMUM LETTER PHASE-E NDIQ;Lo;0;L;;;;;N;;;;; +1698F;BAMUM LETTER PHASE-E TAEN NTEUM;Lo;0;L;;;;;N;;;;; +16990;BAMUM LETTER PHASE-E SET;Lo;0;L;;;;;N;;;;; +16991;BAMUM LETTER PHASE-E PUM;Lo;0;L;;;;;N;;;;; +16992;BAMUM LETTER PHASE-E NDAA SOFTNESS;Lo;0;L;;;;;N;;;;; +16993;BAMUM LETTER PHASE-E NGGUAESHAE NYAM;Lo;0;L;;;;;N;;;;; +16994;BAMUM LETTER PHASE-E YIEE;Lo;0;L;;;;;N;;;;; +16995;BAMUM LETTER PHASE-E GHEUN;Lo;0;L;;;;;N;;;;; +16996;BAMUM LETTER PHASE-E TUAE;Lo;0;L;;;;;N;;;;; +16997;BAMUM LETTER PHASE-E YEUAE;Lo;0;L;;;;;N;;;;; +16998;BAMUM LETTER PHASE-E PO;Lo;0;L;;;;;N;;;;; +16999;BAMUM LETTER PHASE-E TUMAE;Lo;0;L;;;;;N;;;;; +1699A;BAMUM LETTER PHASE-E KEUAE;Lo;0;L;;;;;N;;;;; +1699B;BAMUM LETTER PHASE-E SUAEN;Lo;0;L;;;;;N;;;;; +1699C;BAMUM LETTER PHASE-E TEUAEQ;Lo;0;L;;;;;N;;;;; +1699D;BAMUM LETTER PHASE-E VEUAE;Lo;0;L;;;;;N;;;;; +1699E;BAMUM LETTER PHASE-E WEUX;Lo;0;L;;;;;N;;;;; +1699F;BAMUM LETTER PHASE-E LAAM;Lo;0;L;;;;;N;;;;; +169A0;BAMUM LETTER PHASE-E PU;Lo;0;L;;;;;N;;;;; +169A1;BAMUM LETTER PHASE-E TAAQ;Lo;0;L;;;;;N;;;;; +169A2;BAMUM LETTER PHASE-E GHAAMAE;Lo;0;L;;;;;N;;;;; +169A3;BAMUM LETTER PHASE-E NGEUREUT;Lo;0;L;;;;;N;;;;; +169A4;BAMUM LETTER PHASE-E SHEUAEQ;Lo;0;L;;;;;N;;;;; +169A5;BAMUM LETTER PHASE-E MGBEN;Lo;0;L;;;;;N;;;;; +169A6;BAMUM LETTER PHASE-E MBEE;Lo;0;L;;;;;N;;;;; +169A7;BAMUM LETTER PHASE-E NZAQ;Lo;0;L;;;;;N;;;;; +169A8;BAMUM LETTER PHASE-E NKOM;Lo;0;L;;;;;N;;;;; +169A9;BAMUM LETTER PHASE-E GBET;Lo;0;L;;;;;N;;;;; +169AA;BAMUM LETTER PHASE-E TUM;Lo;0;L;;;;;N;;;;; +169AB;BAMUM LETTER PHASE-E KUET;Lo;0;L;;;;;N;;;;; +169AC;BAMUM LETTER PHASE-E YAP;Lo;0;L;;;;;N;;;;; +169AD;BAMUM LETTER PHASE-E NYI CLEAVER;Lo;0;L;;;;;N;;;;; +169AE;BAMUM LETTER PHASE-E YIT;Lo;0;L;;;;;N;;;;; +169AF;BAMUM LETTER PHASE-E MFEUQ;Lo;0;L;;;;;N;;;;; +169B0;BAMUM LETTER PHASE-E NDIAQ;Lo;0;L;;;;;N;;;;; +169B1;BAMUM LETTER PHASE-E PIEEQ;Lo;0;L;;;;;N;;;;; +169B2;BAMUM LETTER PHASE-E YUEQ;Lo;0;L;;;;;N;;;;; +169B3;BAMUM LETTER PHASE-E LEUAEM;Lo;0;L;;;;;N;;;;; +169B4;BAMUM LETTER PHASE-E FUE;Lo;0;L;;;;;N;;;;; +169B5;BAMUM LETTER PHASE-E GBEUX;Lo;0;L;;;;;N;;;;; +169B6;BAMUM LETTER PHASE-E NGKUP;Lo;0;L;;;;;N;;;;; +169B7;BAMUM LETTER PHASE-E KET;Lo;0;L;;;;;N;;;;; +169B8;BAMUM LETTER PHASE-E MAE;Lo;0;L;;;;;N;;;;; +169B9;BAMUM LETTER PHASE-E NGKAAMI;Lo;0;L;;;;;N;;;;; +169BA;BAMUM LETTER PHASE-E GHET;Lo;0;L;;;;;N;;;;; +169BB;BAMUM LETTER PHASE-E FA;Lo;0;L;;;;;N;;;;; +169BC;BAMUM LETTER PHASE-E NTUM;Lo;0;L;;;;;N;;;;; +169BD;BAMUM LETTER PHASE-E PEUT;Lo;0;L;;;;;N;;;;; +169BE;BAMUM LETTER PHASE-E YEUM;Lo;0;L;;;;;N;;;;; +169BF;BAMUM LETTER PHASE-E NGGEUAE;Lo;0;L;;;;;N;;;;; +169C0;BAMUM LETTER PHASE-E NYI BETWEEN;Lo;0;L;;;;;N;;;;; +169C1;BAMUM LETTER PHASE-E NZUQ;Lo;0;L;;;;;N;;;;; +169C2;BAMUM LETTER PHASE-E POON;Lo;0;L;;;;;N;;;;; +169C3;BAMUM LETTER PHASE-E MIEE;Lo;0;L;;;;;N;;;;; +169C4;BAMUM LETTER PHASE-E FUET;Lo;0;L;;;;;N;;;;; +169C5;BAMUM LETTER PHASE-E NAE;Lo;0;L;;;;;N;;;;; +169C6;BAMUM LETTER PHASE-E MUAE;Lo;0;L;;;;;N;;;;; +169C7;BAMUM LETTER PHASE-E GHEUAE;Lo;0;L;;;;;N;;;;; +169C8;BAMUM LETTER PHASE-E FU I;Lo;0;L;;;;;N;;;;; +169C9;BAMUM LETTER PHASE-E MVI;Lo;0;L;;;;;N;;;;; +169CA;BAMUM LETTER PHASE-E PUAQ;Lo;0;L;;;;;N;;;;; +169CB;BAMUM LETTER PHASE-E NGKUM;Lo;0;L;;;;;N;;;;; +169CC;BAMUM LETTER PHASE-E KUT;Lo;0;L;;;;;N;;;;; +169CD;BAMUM LETTER PHASE-E PIET;Lo;0;L;;;;;N;;;;; +169CE;BAMUM LETTER PHASE-E NTAP;Lo;0;L;;;;;N;;;;; +169CF;BAMUM LETTER PHASE-E YEUAET;Lo;0;L;;;;;N;;;;; +169D0;BAMUM LETTER PHASE-E NGGUP;Lo;0;L;;;;;N;;;;; +169D1;BAMUM LETTER PHASE-E PA PEOPLE;Lo;0;L;;;;;N;;;;; +169D2;BAMUM LETTER PHASE-E FU CALL;Lo;0;L;;;;;N;;;;; +169D3;BAMUM LETTER PHASE-E FOM;Lo;0;L;;;;;N;;;;; +169D4;BAMUM LETTER PHASE-E NJEE;Lo;0;L;;;;;N;;;;; +169D5;BAMUM LETTER PHASE-E A;Lo;0;L;;;;;N;;;;; +169D6;BAMUM LETTER PHASE-E TOQ;Lo;0;L;;;;;N;;;;; +169D7;BAMUM LETTER PHASE-E O;Lo;0;L;;;;;N;;;;; +169D8;BAMUM LETTER PHASE-E I;Lo;0;L;;;;;N;;;;; +169D9;BAMUM LETTER PHASE-E LAQ;Lo;0;L;;;;;N;;;;; +169DA;BAMUM LETTER PHASE-E PA PLURAL;Lo;0;L;;;;;N;;;;; +169DB;BAMUM LETTER PHASE-E TAA;Lo;0;L;;;;;N;;;;; +169DC;BAMUM LETTER PHASE-E TAQ;Lo;0;L;;;;;N;;;;; +169DD;BAMUM LETTER PHASE-E NDAA MY HOUSE;Lo;0;L;;;;;N;;;;; +169DE;BAMUM LETTER PHASE-E SHIQ;Lo;0;L;;;;;N;;;;; +169DF;BAMUM LETTER PHASE-E YEUX;Lo;0;L;;;;;N;;;;; +169E0;BAMUM LETTER PHASE-E NGUAE;Lo;0;L;;;;;N;;;;; +169E1;BAMUM LETTER PHASE-E YUAEN;Lo;0;L;;;;;N;;;;; +169E2;BAMUM LETTER PHASE-E YOQ SWIMMING;Lo;0;L;;;;;N;;;;; +169E3;BAMUM LETTER PHASE-E YOQ COVER;Lo;0;L;;;;;N;;;;; +169E4;BAMUM LETTER PHASE-E YUQ;Lo;0;L;;;;;N;;;;; +169E5;BAMUM LETTER PHASE-E YUN;Lo;0;L;;;;;N;;;;; +169E6;BAMUM LETTER PHASE-E KEUX;Lo;0;L;;;;;N;;;;; +169E7;BAMUM LETTER PHASE-E PEUX;Lo;0;L;;;;;N;;;;; +169E8;BAMUM LETTER PHASE-E NJEE EPOCH;Lo;0;L;;;;;N;;;;; +169E9;BAMUM LETTER PHASE-E PUE;Lo;0;L;;;;;N;;;;; +169EA;BAMUM LETTER PHASE-E WUE;Lo;0;L;;;;;N;;;;; +169EB;BAMUM LETTER PHASE-E FEE;Lo;0;L;;;;;N;;;;; +169EC;BAMUM LETTER PHASE-E VEE;Lo;0;L;;;;;N;;;;; +169ED;BAMUM LETTER PHASE-E LU;Lo;0;L;;;;;N;;;;; +169EE;BAMUM LETTER PHASE-E MI;Lo;0;L;;;;;N;;;;; +169EF;BAMUM LETTER PHASE-E REUX;Lo;0;L;;;;;N;;;;; +169F0;BAMUM LETTER PHASE-E RAE;Lo;0;L;;;;;N;;;;; +169F1;BAMUM LETTER PHASE-E NGUAET;Lo;0;L;;;;;N;;;;; +169F2;BAMUM LETTER PHASE-E NGA;Lo;0;L;;;;;N;;;;; +169F3;BAMUM LETTER PHASE-E SHO;Lo;0;L;;;;;N;;;;; +169F4;BAMUM LETTER PHASE-E SHOQ;Lo;0;L;;;;;N;;;;; +169F5;BAMUM LETTER PHASE-E FU REMEDY;Lo;0;L;;;;;N;;;;; +169F6;BAMUM LETTER PHASE-E NA;Lo;0;L;;;;;N;;;;; +169F7;BAMUM LETTER PHASE-E PI;Lo;0;L;;;;;N;;;;; +169F8;BAMUM LETTER PHASE-E LOQ;Lo;0;L;;;;;N;;;;; +169F9;BAMUM LETTER PHASE-E KO;Lo;0;L;;;;;N;;;;; +169FA;BAMUM LETTER PHASE-E MEN;Lo;0;L;;;;;N;;;;; +169FB;BAMUM LETTER PHASE-E MA;Lo;0;L;;;;;N;;;;; +169FC;BAMUM LETTER PHASE-E MAQ;Lo;0;L;;;;;N;;;;; +169FD;BAMUM LETTER PHASE-E TEU;Lo;0;L;;;;;N;;;;; +169FE;BAMUM LETTER PHASE-E KI;Lo;0;L;;;;;N;;;;; +169FF;BAMUM LETTER PHASE-E MON;Lo;0;L;;;;;N;;;;; +16A00;BAMUM LETTER PHASE-E TEN;Lo;0;L;;;;;N;;;;; +16A01;BAMUM LETTER PHASE-E FAQ;Lo;0;L;;;;;N;;;;; +16A02;BAMUM LETTER PHASE-E GHOM;Lo;0;L;;;;;N;;;;; +16A03;BAMUM LETTER PHASE-F KA;Lo;0;L;;;;;N;;;;; +16A04;BAMUM LETTER PHASE-F U;Lo;0;L;;;;;N;;;;; +16A05;BAMUM LETTER PHASE-F KU;Lo;0;L;;;;;N;;;;; +16A06;BAMUM LETTER PHASE-F EE;Lo;0;L;;;;;N;;;;; +16A07;BAMUM LETTER PHASE-F REE;Lo;0;L;;;;;N;;;;; +16A08;BAMUM LETTER PHASE-F TAE;Lo;0;L;;;;;N;;;;; +16A09;BAMUM LETTER PHASE-F NYI;Lo;0;L;;;;;N;;;;; +16A0A;BAMUM LETTER PHASE-F LA;Lo;0;L;;;;;N;;;;; +16A0B;BAMUM LETTER PHASE-F RII;Lo;0;L;;;;;N;;;;; +16A0C;BAMUM LETTER PHASE-F RIEE;Lo;0;L;;;;;N;;;;; +16A0D;BAMUM LETTER PHASE-F MEEEE;Lo;0;L;;;;;N;;;;; +16A0E;BAMUM LETTER PHASE-F TAA;Lo;0;L;;;;;N;;;;; +16A0F;BAMUM LETTER PHASE-F NDAA;Lo;0;L;;;;;N;;;;; +16A10;BAMUM LETTER PHASE-F NJAEM;Lo;0;L;;;;;N;;;;; +16A11;BAMUM LETTER PHASE-F M;Lo;0;L;;;;;N;;;;; +16A12;BAMUM LETTER PHASE-F SUU;Lo;0;L;;;;;N;;;;; +16A13;BAMUM LETTER PHASE-F SHII;Lo;0;L;;;;;N;;;;; +16A14;BAMUM LETTER PHASE-F SI;Lo;0;L;;;;;N;;;;; +16A15;BAMUM LETTER PHASE-F SEUX;Lo;0;L;;;;;N;;;;; +16A16;BAMUM LETTER PHASE-F KYEE;Lo;0;L;;;;;N;;;;; +16A17;BAMUM LETTER PHASE-F KET;Lo;0;L;;;;;N;;;;; +16A18;BAMUM LETTER PHASE-F NUAE;Lo;0;L;;;;;N;;;;; +16A19;BAMUM LETTER PHASE-F NU;Lo;0;L;;;;;N;;;;; +16A1A;BAMUM LETTER PHASE-F NJUAE;Lo;0;L;;;;;N;;;;; +16A1B;BAMUM LETTER PHASE-F YOQ;Lo;0;L;;;;;N;;;;; +16A1C;BAMUM LETTER PHASE-F SHU;Lo;0;L;;;;;N;;;;; +16A1D;BAMUM LETTER PHASE-F YA;Lo;0;L;;;;;N;;;;; +16A1E;BAMUM LETTER PHASE-F NSHA;Lo;0;L;;;;;N;;;;; +16A1F;BAMUM LETTER PHASE-F PEUX;Lo;0;L;;;;;N;;;;; +16A20;BAMUM LETTER PHASE-F NTEE;Lo;0;L;;;;;N;;;;; +16A21;BAMUM LETTER PHASE-F WUE;Lo;0;L;;;;;N;;;;; +16A22;BAMUM LETTER PHASE-F PEE;Lo;0;L;;;;;N;;;;; +16A23;BAMUM LETTER PHASE-F RU;Lo;0;L;;;;;N;;;;; +16A24;BAMUM LETTER PHASE-F NI;Lo;0;L;;;;;N;;;;; +16A25;BAMUM LETTER PHASE-F REUX;Lo;0;L;;;;;N;;;;; +16A26;BAMUM LETTER PHASE-F KEN;Lo;0;L;;;;;N;;;;; +16A27;BAMUM LETTER PHASE-F NGKWAEN;Lo;0;L;;;;;N;;;;; +16A28;BAMUM LETTER PHASE-F NGGA;Lo;0;L;;;;;N;;;;; +16A29;BAMUM LETTER PHASE-F SHO;Lo;0;L;;;;;N;;;;; +16A2A;BAMUM LETTER PHASE-F PUAE;Lo;0;L;;;;;N;;;;; +16A2B;BAMUM LETTER PHASE-F FOM;Lo;0;L;;;;;N;;;;; +16A2C;BAMUM LETTER PHASE-F WA;Lo;0;L;;;;;N;;;;; +16A2D;BAMUM LETTER PHASE-F LI;Lo;0;L;;;;;N;;;;; +16A2E;BAMUM LETTER PHASE-F LOQ;Lo;0;L;;;;;N;;;;; +16A2F;BAMUM LETTER PHASE-F KO;Lo;0;L;;;;;N;;;;; +16A30;BAMUM LETTER PHASE-F MBEN;Lo;0;L;;;;;N;;;;; +16A31;BAMUM LETTER PHASE-F REN;Lo;0;L;;;;;N;;;;; +16A32;BAMUM LETTER PHASE-F MA;Lo;0;L;;;;;N;;;;; +16A33;BAMUM LETTER PHASE-F MO;Lo;0;L;;;;;N;;;;; +16A34;BAMUM LETTER PHASE-F MBAA;Lo;0;L;;;;;N;;;;; +16A35;BAMUM LETTER PHASE-F TET;Lo;0;L;;;;;N;;;;; +16A36;BAMUM LETTER PHASE-F KPA;Lo;0;L;;;;;N;;;;; +16A37;BAMUM LETTER PHASE-F SAMBA;Lo;0;L;;;;;N;;;;; +16A38;BAMUM LETTER PHASE-F VUEQ;Lo;0;L;;;;;N;;;;; +16A40;MRO LETTER TA;Lo;0;L;;;;;N;;;;; +16A41;MRO LETTER NGI;Lo;0;L;;;;;N;;;;; +16A42;MRO LETTER YO;Lo;0;L;;;;;N;;;;; +16A43;MRO LETTER MIM;Lo;0;L;;;;;N;;;;; +16A44;MRO LETTER BA;Lo;0;L;;;;;N;;;;; +16A45;MRO LETTER DA;Lo;0;L;;;;;N;;;;; +16A46;MRO LETTER A;Lo;0;L;;;;;N;;;;; +16A47;MRO LETTER PHI;Lo;0;L;;;;;N;;;;; +16A48;MRO LETTER KHAI;Lo;0;L;;;;;N;;;;; +16A49;MRO LETTER HAO;Lo;0;L;;;;;N;;;;; +16A4A;MRO LETTER DAI;Lo;0;L;;;;;N;;;;; +16A4B;MRO LETTER CHU;Lo;0;L;;;;;N;;;;; +16A4C;MRO LETTER KEAAE;Lo;0;L;;;;;N;;;;; +16A4D;MRO LETTER OL;Lo;0;L;;;;;N;;;;; +16A4E;MRO LETTER MAEM;Lo;0;L;;;;;N;;;;; +16A4F;MRO LETTER NIN;Lo;0;L;;;;;N;;;;; +16A50;MRO LETTER PA;Lo;0;L;;;;;N;;;;; +16A51;MRO LETTER OO;Lo;0;L;;;;;N;;;;; +16A52;MRO LETTER O;Lo;0;L;;;;;N;;;;; +16A53;MRO LETTER RO;Lo;0;L;;;;;N;;;;; +16A54;MRO LETTER SHI;Lo;0;L;;;;;N;;;;; +16A55;MRO LETTER THEA;Lo;0;L;;;;;N;;;;; +16A56;MRO LETTER EA;Lo;0;L;;;;;N;;;;; +16A57;MRO LETTER WA;Lo;0;L;;;;;N;;;;; +16A58;MRO LETTER E;Lo;0;L;;;;;N;;;;; +16A59;MRO LETTER KO;Lo;0;L;;;;;N;;;;; +16A5A;MRO LETTER LAN;Lo;0;L;;;;;N;;;;; +16A5B;MRO LETTER LA;Lo;0;L;;;;;N;;;;; +16A5C;MRO LETTER HAI;Lo;0;L;;;;;N;;;;; +16A5D;MRO LETTER RI;Lo;0;L;;;;;N;;;;; +16A5E;MRO LETTER TEK;Lo;0;L;;;;;N;;;;; +16A60;MRO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16A61;MRO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16A62;MRO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16A63;MRO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16A64;MRO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16A65;MRO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16A66;MRO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16A67;MRO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16A68;MRO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16A6E;MRO DANDA;Po;0;L;;;;;N;;;;; +16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;; +16A70;TANGSA LETTER OZ;Lo;0;L;;;;;N;;;;; +16A71;TANGSA LETTER OC;Lo;0;L;;;;;N;;;;; +16A72;TANGSA LETTER OQ;Lo;0;L;;;;;N;;;;; +16A73;TANGSA LETTER OX;Lo;0;L;;;;;N;;;;; +16A74;TANGSA LETTER AZ;Lo;0;L;;;;;N;;;;; +16A75;TANGSA LETTER AC;Lo;0;L;;;;;N;;;;; +16A76;TANGSA LETTER AQ;Lo;0;L;;;;;N;;;;; +16A77;TANGSA LETTER AX;Lo;0;L;;;;;N;;;;; +16A78;TANGSA LETTER VZ;Lo;0;L;;;;;N;;;;; +16A79;TANGSA LETTER VC;Lo;0;L;;;;;N;;;;; +16A7A;TANGSA LETTER VQ;Lo;0;L;;;;;N;;;;; +16A7B;TANGSA LETTER VX;Lo;0;L;;;;;N;;;;; +16A7C;TANGSA LETTER EZ;Lo;0;L;;;;;N;;;;; +16A7D;TANGSA LETTER EC;Lo;0;L;;;;;N;;;;; +16A7E;TANGSA LETTER EQ;Lo;0;L;;;;;N;;;;; +16A7F;TANGSA LETTER EX;Lo;0;L;;;;;N;;;;; +16A80;TANGSA LETTER IZ;Lo;0;L;;;;;N;;;;; +16A81;TANGSA LETTER IC;Lo;0;L;;;;;N;;;;; +16A82;TANGSA LETTER IQ;Lo;0;L;;;;;N;;;;; +16A83;TANGSA LETTER IX;Lo;0;L;;;;;N;;;;; +16A84;TANGSA LETTER UZ;Lo;0;L;;;;;N;;;;; +16A85;TANGSA LETTER UC;Lo;0;L;;;;;N;;;;; +16A86;TANGSA LETTER UQ;Lo;0;L;;;;;N;;;;; +16A87;TANGSA LETTER UX;Lo;0;L;;;;;N;;;;; +16A88;TANGSA LETTER AWZ;Lo;0;L;;;;;N;;;;; +16A89;TANGSA LETTER AWC;Lo;0;L;;;;;N;;;;; +16A8A;TANGSA LETTER AWQ;Lo;0;L;;;;;N;;;;; +16A8B;TANGSA LETTER AWX;Lo;0;L;;;;;N;;;;; +16A8C;TANGSA LETTER UIZ;Lo;0;L;;;;;N;;;;; +16A8D;TANGSA LETTER UIC;Lo;0;L;;;;;N;;;;; +16A8E;TANGSA LETTER UIQ;Lo;0;L;;;;;N;;;;; +16A8F;TANGSA LETTER UIX;Lo;0;L;;;;;N;;;;; +16A90;TANGSA LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +16A91;TANGSA LETTER LONG UEX;Lo;0;L;;;;;N;;;;; +16A92;TANGSA LETTER SHORT UEZ;Lo;0;L;;;;;N;;;;; +16A93;TANGSA LETTER SHORT AWX;Lo;0;L;;;;;N;;;;; +16A94;TANGSA LETTER UEC;Lo;0;L;;;;;N;;;;; +16A95;TANGSA LETTER UEZ;Lo;0;L;;;;;N;;;;; +16A96;TANGSA LETTER UEQ;Lo;0;L;;;;;N;;;;; +16A97;TANGSA LETTER UEX;Lo;0;L;;;;;N;;;;; +16A98;TANGSA LETTER UIUZ;Lo;0;L;;;;;N;;;;; +16A99;TANGSA LETTER UIUC;Lo;0;L;;;;;N;;;;; +16A9A;TANGSA LETTER UIUQ;Lo;0;L;;;;;N;;;;; +16A9B;TANGSA LETTER UIUX;Lo;0;L;;;;;N;;;;; +16A9C;TANGSA LETTER MZ;Lo;0;L;;;;;N;;;;; +16A9D;TANGSA LETTER MC;Lo;0;L;;;;;N;;;;; +16A9E;TANGSA LETTER MQ;Lo;0;L;;;;;N;;;;; +16A9F;TANGSA LETTER MX;Lo;0;L;;;;;N;;;;; +16AA0;TANGSA LETTER KA;Lo;0;L;;;;;N;;;;; +16AA1;TANGSA LETTER KHA;Lo;0;L;;;;;N;;;;; +16AA2;TANGSA LETTER GA;Lo;0;L;;;;;N;;;;; +16AA3;TANGSA LETTER NGA;Lo;0;L;;;;;N;;;;; +16AA4;TANGSA LETTER SA;Lo;0;L;;;;;N;;;;; +16AA5;TANGSA LETTER YA;Lo;0;L;;;;;N;;;;; +16AA6;TANGSA LETTER WA;Lo;0;L;;;;;N;;;;; +16AA7;TANGSA LETTER PA;Lo;0;L;;;;;N;;;;; +16AA8;TANGSA LETTER NYA;Lo;0;L;;;;;N;;;;; +16AA9;TANGSA LETTER PHA;Lo;0;L;;;;;N;;;;; +16AAA;TANGSA LETTER BA;Lo;0;L;;;;;N;;;;; +16AAB;TANGSA LETTER MA;Lo;0;L;;;;;N;;;;; +16AAC;TANGSA LETTER NA;Lo;0;L;;;;;N;;;;; +16AAD;TANGSA LETTER HA;Lo;0;L;;;;;N;;;;; +16AAE;TANGSA LETTER LA;Lo;0;L;;;;;N;;;;; +16AAF;TANGSA LETTER HTA;Lo;0;L;;;;;N;;;;; +16AB0;TANGSA LETTER TA;Lo;0;L;;;;;N;;;;; +16AB1;TANGSA LETTER DA;Lo;0;L;;;;;N;;;;; +16AB2;TANGSA LETTER RA;Lo;0;L;;;;;N;;;;; +16AB3;TANGSA LETTER NHA;Lo;0;L;;;;;N;;;;; +16AB4;TANGSA LETTER SHA;Lo;0;L;;;;;N;;;;; +16AB5;TANGSA LETTER CA;Lo;0;L;;;;;N;;;;; +16AB6;TANGSA LETTER TSA;Lo;0;L;;;;;N;;;;; +16AB7;TANGSA LETTER GHA;Lo;0;L;;;;;N;;;;; +16AB8;TANGSA LETTER HTTA;Lo;0;L;;;;;N;;;;; +16AB9;TANGSA LETTER THA;Lo;0;L;;;;;N;;;;; +16ABA;TANGSA LETTER XA;Lo;0;L;;;;;N;;;;; +16ABB;TANGSA LETTER FA;Lo;0;L;;;;;N;;;;; +16ABC;TANGSA LETTER DHA;Lo;0;L;;;;;N;;;;; +16ABD;TANGSA LETTER CHA;Lo;0;L;;;;;N;;;;; +16ABE;TANGSA LETTER ZA;Lo;0;L;;;;;N;;;;; +16AC0;TANGSA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16AC1;TANGSA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16AC2;TANGSA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16AC3;TANGSA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16AC4;TANGSA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16AC5;TANGSA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16AC6;TANGSA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16AC7;TANGSA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16AC8;TANGSA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16AC9;TANGSA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;; +16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;; +16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;; +16AD3;BASSA VAH LETTER FA;Lo;0;L;;;;;N;;;;; +16AD4;BASSA VAH LETTER MBE;Lo;0;L;;;;;N;;;;; +16AD5;BASSA VAH LETTER YIE;Lo;0;L;;;;;N;;;;; +16AD6;BASSA VAH LETTER GAH;Lo;0;L;;;;;N;;;;; +16AD7;BASSA VAH LETTER DHII;Lo;0;L;;;;;N;;;;; +16AD8;BASSA VAH LETTER KPAH;Lo;0;L;;;;;N;;;;; +16AD9;BASSA VAH LETTER JO;Lo;0;L;;;;;N;;;;; +16ADA;BASSA VAH LETTER HWAH;Lo;0;L;;;;;N;;;;; +16ADB;BASSA VAH LETTER WA;Lo;0;L;;;;;N;;;;; +16ADC;BASSA VAH LETTER ZO;Lo;0;L;;;;;N;;;;; +16ADD;BASSA VAH LETTER GBU;Lo;0;L;;;;;N;;;;; +16ADE;BASSA VAH LETTER DO;Lo;0;L;;;;;N;;;;; +16ADF;BASSA VAH LETTER CE;Lo;0;L;;;;;N;;;;; +16AE0;BASSA VAH LETTER UWU;Lo;0;L;;;;;N;;;;; +16AE1;BASSA VAH LETTER TO;Lo;0;L;;;;;N;;;;; +16AE2;BASSA VAH LETTER BA;Lo;0;L;;;;;N;;;;; +16AE3;BASSA VAH LETTER VU;Lo;0;L;;;;;N;;;;; +16AE4;BASSA VAH LETTER YEIN;Lo;0;L;;;;;N;;;;; +16AE5;BASSA VAH LETTER PA;Lo;0;L;;;;;N;;;;; +16AE6;BASSA VAH LETTER WADDA;Lo;0;L;;;;;N;;;;; +16AE7;BASSA VAH LETTER A;Lo;0;L;;;;;N;;;;; +16AE8;BASSA VAH LETTER O;Lo;0;L;;;;;N;;;;; +16AE9;BASSA VAH LETTER OO;Lo;0;L;;;;;N;;;;; +16AEA;BASSA VAH LETTER U;Lo;0;L;;;;;N;;;;; +16AEB;BASSA VAH LETTER EE;Lo;0;L;;;;;N;;;;; +16AEC;BASSA VAH LETTER E;Lo;0;L;;;;;N;;;;; +16AED;BASSA VAH LETTER I;Lo;0;L;;;;;N;;;;; +16AF0;BASSA VAH COMBINING HIGH TONE;Mn;1;NSM;;;;;N;;;;; +16AF1;BASSA VAH COMBINING LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF2;BASSA VAH COMBINING MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF3;BASSA VAH COMBINING LOW-MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF4;BASSA VAH COMBINING HIGH-LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF5;BASSA VAH FULL STOP;Po;0;L;;;;;N;;;;; +16B00;PAHAWH HMONG VOWEL KEEB;Lo;0;L;;;;;N;;;;; +16B01;PAHAWH HMONG VOWEL KEEV;Lo;0;L;;;;;N;;;;; +16B02;PAHAWH HMONG VOWEL KIB;Lo;0;L;;;;;N;;;;; +16B03;PAHAWH HMONG VOWEL KIV;Lo;0;L;;;;;N;;;;; +16B04;PAHAWH HMONG VOWEL KAUB;Lo;0;L;;;;;N;;;;; +16B05;PAHAWH HMONG VOWEL KAUV;Lo;0;L;;;;;N;;;;; +16B06;PAHAWH HMONG VOWEL KUB;Lo;0;L;;;;;N;;;;; +16B07;PAHAWH HMONG VOWEL KUV;Lo;0;L;;;;;N;;;;; +16B08;PAHAWH HMONG VOWEL KEB;Lo;0;L;;;;;N;;;;; +16B09;PAHAWH HMONG VOWEL KEV;Lo;0;L;;;;;N;;;;; +16B0A;PAHAWH HMONG VOWEL KAIB;Lo;0;L;;;;;N;;;;; +16B0B;PAHAWH HMONG VOWEL KAIV;Lo;0;L;;;;;N;;;;; +16B0C;PAHAWH HMONG VOWEL KOOB;Lo;0;L;;;;;N;;;;; +16B0D;PAHAWH HMONG VOWEL KOOV;Lo;0;L;;;;;N;;;;; +16B0E;PAHAWH HMONG VOWEL KAWB;Lo;0;L;;;;;N;;;;; +16B0F;PAHAWH HMONG VOWEL KAWV;Lo;0;L;;;;;N;;;;; +16B10;PAHAWH HMONG VOWEL KUAB;Lo;0;L;;;;;N;;;;; +16B11;PAHAWH HMONG VOWEL KUAV;Lo;0;L;;;;;N;;;;; +16B12;PAHAWH HMONG VOWEL KOB;Lo;0;L;;;;;N;;;;; +16B13;PAHAWH HMONG VOWEL KOV;Lo;0;L;;;;;N;;;;; +16B14;PAHAWH HMONG VOWEL KIAB;Lo;0;L;;;;;N;;;;; +16B15;PAHAWH HMONG VOWEL KIAV;Lo;0;L;;;;;N;;;;; +16B16;PAHAWH HMONG VOWEL KAB;Lo;0;L;;;;;N;;;;; +16B17;PAHAWH HMONG VOWEL KAV;Lo;0;L;;;;;N;;;;; +16B18;PAHAWH HMONG VOWEL KWB;Lo;0;L;;;;;N;;;;; +16B19;PAHAWH HMONG VOWEL KWV;Lo;0;L;;;;;N;;;;; +16B1A;PAHAWH HMONG VOWEL KAAB;Lo;0;L;;;;;N;;;;; +16B1B;PAHAWH HMONG VOWEL KAAV;Lo;0;L;;;;;N;;;;; +16B1C;PAHAWH HMONG CONSONANT VAU;Lo;0;L;;;;;N;;;;; +16B1D;PAHAWH HMONG CONSONANT NTSAU;Lo;0;L;;;;;N;;;;; +16B1E;PAHAWH HMONG CONSONANT LAU;Lo;0;L;;;;;N;;;;; +16B1F;PAHAWH HMONG CONSONANT HAU;Lo;0;L;;;;;N;;;;; +16B20;PAHAWH HMONG CONSONANT NLAU;Lo;0;L;;;;;N;;;;; +16B21;PAHAWH HMONG CONSONANT RAU;Lo;0;L;;;;;N;;;;; +16B22;PAHAWH HMONG CONSONANT NKAU;Lo;0;L;;;;;N;;;;; +16B23;PAHAWH HMONG CONSONANT QHAU;Lo;0;L;;;;;N;;;;; +16B24;PAHAWH HMONG CONSONANT YAU;Lo;0;L;;;;;N;;;;; +16B25;PAHAWH HMONG CONSONANT HLAU;Lo;0;L;;;;;N;;;;; +16B26;PAHAWH HMONG CONSONANT MAU;Lo;0;L;;;;;N;;;;; +16B27;PAHAWH HMONG CONSONANT CHAU;Lo;0;L;;;;;N;;;;; +16B28;PAHAWH HMONG CONSONANT NCHAU;Lo;0;L;;;;;N;;;;; +16B29;PAHAWH HMONG CONSONANT HNAU;Lo;0;L;;;;;N;;;;; +16B2A;PAHAWH HMONG CONSONANT PLHAU;Lo;0;L;;;;;N;;;;; +16B2B;PAHAWH HMONG CONSONANT NTHAU;Lo;0;L;;;;;N;;;;; +16B2C;PAHAWH HMONG CONSONANT NAU;Lo;0;L;;;;;N;;;;; +16B2D;PAHAWH HMONG CONSONANT AU;Lo;0;L;;;;;N;;;;; +16B2E;PAHAWH HMONG CONSONANT XAU;Lo;0;L;;;;;N;;;;; +16B2F;PAHAWH HMONG CONSONANT CAU;Lo;0;L;;;;;N;;;;; +16B30;PAHAWH HMONG MARK CIM TUB;Mn;230;NSM;;;;;N;;;;; +16B31;PAHAWH HMONG MARK CIM SO;Mn;230;NSM;;;;;N;;;;; +16B32;PAHAWH HMONG MARK CIM KES;Mn;230;NSM;;;;;N;;;;; +16B33;PAHAWH HMONG MARK CIM KHAV;Mn;230;NSM;;;;;N;;;;; +16B34;PAHAWH HMONG MARK CIM SUAM;Mn;230;NSM;;;;;N;;;;; +16B35;PAHAWH HMONG MARK CIM HOM;Mn;230;NSM;;;;;N;;;;; +16B36;PAHAWH HMONG MARK CIM TAUM;Mn;230;NSM;;;;;N;;;;; +16B37;PAHAWH HMONG SIGN VOS THOM;Po;0;L;;;;;N;;;;; +16B38;PAHAWH HMONG SIGN VOS TSHAB CEEB;Po;0;L;;;;;N;;;;; +16B39;PAHAWH HMONG SIGN CIM CHEEM;Po;0;L;;;;;N;;;;; +16B3A;PAHAWH HMONG SIGN VOS THIAB;Po;0;L;;;;;N;;;;; +16B3B;PAHAWH HMONG SIGN VOS FEEM;Po;0;L;;;;;N;;;;; +16B3C;PAHAWH HMONG SIGN XYEEM NTXIV;So;0;L;;;;;N;;;;; +16B3D;PAHAWH HMONG SIGN XYEEM RHO;So;0;L;;;;;N;;;;; +16B3E;PAHAWH HMONG SIGN XYEEM TOV;So;0;L;;;;;N;;;;; +16B3F;PAHAWH HMONG SIGN XYEEM FAIB;So;0;L;;;;;N;;;;; +16B40;PAHAWH HMONG SIGN VOS SEEV;Lm;0;L;;;;;N;;;;; +16B41;PAHAWH HMONG SIGN MEEJ SUAB;Lm;0;L;;;;;N;;;;; +16B42;PAHAWH HMONG SIGN VOS NRUA;Lm;0;L;;;;;N;;;;; +16B43;PAHAWH HMONG SIGN IB YAM;Lm;0;L;;;;;N;;;;; +16B44;PAHAWH HMONG SIGN XAUS;Po;0;L;;;;;N;;;;; +16B45;PAHAWH HMONG SIGN CIM TSOV ROG;So;0;L;;;;;N;;;;; +16B50;PAHAWH HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16B51;PAHAWH HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16B52;PAHAWH HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16B53;PAHAWH HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16B54;PAHAWH HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16B55;PAHAWH HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16B56;PAHAWH HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16B57;PAHAWH HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16B58;PAHAWH HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16B59;PAHAWH HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16B5B;PAHAWH HMONG NUMBER TENS;No;0;L;;;;10;N;;;;; +16B5C;PAHAWH HMONG NUMBER HUNDREDS;No;0;L;;;;100;N;;;;; +16B5D;PAHAWH HMONG NUMBER TEN THOUSANDS;No;0;L;;;;10000;N;;;;; +16B5E;PAHAWH HMONG NUMBER MILLIONS;No;0;L;;;;1000000;N;;;;; +16B5F;PAHAWH HMONG NUMBER HUNDRED MILLIONS;No;0;L;;;;100000000;N;;;;; +16B60;PAHAWH HMONG NUMBER TEN BILLIONS;No;0;L;;;;10000000000;N;;;;; +16B61;PAHAWH HMONG NUMBER TRILLIONS;No;0;L;;;;1000000000000;N;;;;; +16B63;PAHAWH HMONG SIGN VOS LUB;Lo;0;L;;;;;N;;;;; +16B64;PAHAWH HMONG SIGN XYOO;Lo;0;L;;;;;N;;;;; +16B65;PAHAWH HMONG SIGN HLI;Lo;0;L;;;;;N;;;;; +16B66;PAHAWH HMONG SIGN THIRD-STAGE HLI;Lo;0;L;;;;;N;;;;; +16B67;PAHAWH HMONG SIGN ZWJ THAJ;Lo;0;L;;;;;N;;;;; +16B68;PAHAWH HMONG SIGN HNUB;Lo;0;L;;;;;N;;;;; +16B69;PAHAWH HMONG SIGN NQIG;Lo;0;L;;;;;N;;;;; +16B6A;PAHAWH HMONG SIGN XIAB;Lo;0;L;;;;;N;;;;; +16B6B;PAHAWH HMONG SIGN NTUJ;Lo;0;L;;;;;N;;;;; +16B6C;PAHAWH HMONG SIGN AV;Lo;0;L;;;;;N;;;;; +16B6D;PAHAWH HMONG SIGN TXHEEJ CEEV;Lo;0;L;;;;;N;;;;; +16B6E;PAHAWH HMONG SIGN MEEJ TSEEB;Lo;0;L;;;;;N;;;;; +16B6F;PAHAWH HMONG SIGN TAU;Lo;0;L;;;;;N;;;;; +16B70;PAHAWH HMONG SIGN LOS;Lo;0;L;;;;;N;;;;; +16B71;PAHAWH HMONG SIGN MUS;Lo;0;L;;;;;N;;;;; +16B72;PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG;Lo;0;L;;;;;N;;;;; +16B73;PAHAWH HMONG SIGN CIM CUAM TSHOOJ;Lo;0;L;;;;;N;;;;; +16B74;PAHAWH HMONG SIGN CIM TXWV;Lo;0;L;;;;;N;;;;; +16B75;PAHAWH HMONG SIGN CIM TXWV CHWV;Lo;0;L;;;;;N;;;;; +16B76;PAHAWH HMONG SIGN CIM PUB DAWB;Lo;0;L;;;;;N;;;;; +16B77;PAHAWH HMONG SIGN CIM NRES TOS;Lo;0;L;;;;;N;;;;; +16B7D;PAHAWH HMONG CLAN SIGN TSHEEJ;Lo;0;L;;;;;N;;;;; +16B7E;PAHAWH HMONG CLAN SIGN YEEG;Lo;0;L;;;;;N;;;;; +16B7F;PAHAWH HMONG CLAN SIGN LIS;Lo;0;L;;;;;N;;;;; +16B80;PAHAWH HMONG CLAN SIGN LAUJ;Lo;0;L;;;;;N;;;;; +16B81;PAHAWH HMONG CLAN SIGN XYOOJ;Lo;0;L;;;;;N;;;;; +16B82;PAHAWH HMONG CLAN SIGN KOO;Lo;0;L;;;;;N;;;;; +16B83;PAHAWH HMONG CLAN SIGN HAWJ;Lo;0;L;;;;;N;;;;; +16B84;PAHAWH HMONG CLAN SIGN MUAS;Lo;0;L;;;;;N;;;;; +16B85;PAHAWH HMONG CLAN SIGN THOJ;Lo;0;L;;;;;N;;;;; +16B86;PAHAWH HMONG CLAN SIGN TSAB;Lo;0;L;;;;;N;;;;; +16B87;PAHAWH HMONG CLAN SIGN PHAB;Lo;0;L;;;;;N;;;;; +16B88;PAHAWH HMONG CLAN SIGN KHAB;Lo;0;L;;;;;N;;;;; +16B89;PAHAWH HMONG CLAN SIGN HAM;Lo;0;L;;;;;N;;;;; +16B8A;PAHAWH HMONG CLAN SIGN VAJ;Lo;0;L;;;;;N;;;;; +16B8B;PAHAWH HMONG CLAN SIGN FAJ;Lo;0;L;;;;;N;;;;; +16B8C;PAHAWH HMONG CLAN SIGN YAJ;Lo;0;L;;;;;N;;;;; +16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;; +16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;; +16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;; +16D40;KIRAT RAI SIGN ANUSVARA;Lm;0;L;;;;;N;;;;; +16D41;KIRAT RAI SIGN TONPI;Lm;0;L;;;;;N;;;;; +16D42;KIRAT RAI SIGN VISARGA;Lm;0;L;;;;;N;;;;; +16D43;KIRAT RAI LETTER A;Lo;0;L;;;;;N;;;;; +16D44;KIRAT RAI LETTER KA;Lo;0;L;;;;;N;;;;; +16D45;KIRAT RAI LETTER KHA;Lo;0;L;;;;;N;;;;; +16D46;KIRAT RAI LETTER GA;Lo;0;L;;;;;N;;;;; +16D47;KIRAT RAI LETTER GHA;Lo;0;L;;;;;N;;;;; +16D48;KIRAT RAI LETTER NGA;Lo;0;L;;;;;N;;;;; +16D49;KIRAT RAI LETTER CA;Lo;0;L;;;;;N;;;;; +16D4A;KIRAT RAI LETTER CHA;Lo;0;L;;;;;N;;;;; +16D4B;KIRAT RAI LETTER JA;Lo;0;L;;;;;N;;;;; +16D4C;KIRAT RAI LETTER JHA;Lo;0;L;;;;;N;;;;; +16D4D;KIRAT RAI LETTER NYA;Lo;0;L;;;;;N;;;;; +16D4E;KIRAT RAI LETTER TTA;Lo;0;L;;;;;N;;;;; +16D4F;KIRAT RAI LETTER TTHA;Lo;0;L;;;;;N;;;;; +16D50;KIRAT RAI LETTER DDA;Lo;0;L;;;;;N;;;;; +16D51;KIRAT RAI LETTER DDHA;Lo;0;L;;;;;N;;;;; +16D52;KIRAT RAI LETTER TA;Lo;0;L;;;;;N;;;;; +16D53;KIRAT RAI LETTER THA;Lo;0;L;;;;;N;;;;; +16D54;KIRAT RAI LETTER DA;Lo;0;L;;;;;N;;;;; +16D55;KIRAT RAI LETTER DHA;Lo;0;L;;;;;N;;;;; +16D56;KIRAT RAI LETTER NA;Lo;0;L;;;;;N;;;;; +16D57;KIRAT RAI LETTER PA;Lo;0;L;;;;;N;;;;; +16D58;KIRAT RAI LETTER PHA;Lo;0;L;;;;;N;;;;; +16D59;KIRAT RAI LETTER BA;Lo;0;L;;;;;N;;;;; +16D5A;KIRAT RAI LETTER BHA;Lo;0;L;;;;;N;;;;; +16D5B;KIRAT RAI LETTER MA;Lo;0;L;;;;;N;;;;; +16D5C;KIRAT RAI LETTER YA;Lo;0;L;;;;;N;;;;; +16D5D;KIRAT RAI LETTER RA;Lo;0;L;;;;;N;;;;; +16D5E;KIRAT RAI LETTER LA;Lo;0;L;;;;;N;;;;; +16D5F;KIRAT RAI LETTER VA;Lo;0;L;;;;;N;;;;; +16D60;KIRAT RAI LETTER SA;Lo;0;L;;;;;N;;;;; +16D61;KIRAT RAI LETTER SHA;Lo;0;L;;;;;N;;;;; +16D62;KIRAT RAI LETTER HA;Lo;0;L;;;;;N;;;;; +16D63;KIRAT RAI VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +16D64;KIRAT RAI VOWEL SIGN I;Lo;0;L;;;;;N;;;;; +16D65;KIRAT RAI VOWEL SIGN U;Lo;0;L;;;;;N;;;;; +16D66;KIRAT RAI VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; +16D67;KIRAT RAI VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +16D68;KIRAT RAI VOWEL SIGN AI;Lo;0;L;16D67 16D67;;;;N;;;;; +16D69;KIRAT RAI VOWEL SIGN O;Lo;0;L;16D63 16D67;;;;N;;;;; +16D6A;KIRAT RAI VOWEL SIGN AU;Lo;0;L;16D69 16D67;;;;N;;;;; +16D6B;KIRAT RAI SIGN VIRAMA;Lm;0;L;;;;;N;;;;; +16D6C;KIRAT RAI SIGN SAAT;Lm;0;L;;;;;N;;;;; +16D6D;KIRAT RAI SIGN YUPI;Po;0;L;;;;;N;;;;; +16D6E;KIRAT RAI DANDA;Po;0;L;;;;;N;;;;; +16D6F;KIRAT RAI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +16D70;KIRAT RAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16D71;KIRAT RAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16D72;KIRAT RAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16D73;KIRAT RAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16D74;KIRAT RAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16D75;KIRAT RAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16D76;KIRAT RAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16D77;KIRAT RAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16D78;KIRAT RAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16D79;KIRAT RAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16E40;MEDEFAIDRIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;16E60; +16E41;MEDEFAIDRIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;16E61; +16E42;MEDEFAIDRIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;16E62; +16E43;MEDEFAIDRIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;16E63; +16E44;MEDEFAIDRIN CAPITAL LETTER ATIU;Lu;0;L;;;;;N;;;;16E64; +16E45;MEDEFAIDRIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;16E65; +16E46;MEDEFAIDRIN CAPITAL LETTER KP;Lu;0;L;;;;;N;;;;16E66; +16E47;MEDEFAIDRIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;16E67; +16E48;MEDEFAIDRIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;16E68; +16E49;MEDEFAIDRIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;16E69; +16E4A;MEDEFAIDRIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;16E6A; +16E4B;MEDEFAIDRIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;16E6B; +16E4C;MEDEFAIDRIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;16E6C; +16E4D;MEDEFAIDRIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;16E6D; +16E4E;MEDEFAIDRIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;16E6E; +16E4F;MEDEFAIDRIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;16E6F; +16E50;MEDEFAIDRIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;16E70; +16E51;MEDEFAIDRIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;16E71; +16E52;MEDEFAIDRIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;16E72; +16E53;MEDEFAIDRIN CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;16E73; +16E54;MEDEFAIDRIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;16E74; +16E55;MEDEFAIDRIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;16E75; +16E56;MEDEFAIDRIN CAPITAL LETTER HP;Lu;0;L;;;;;N;;;;16E76; +16E57;MEDEFAIDRIN CAPITAL LETTER NY;Lu;0;L;;;;;N;;;;16E77; +16E58;MEDEFAIDRIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;16E78; +16E59;MEDEFAIDRIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;16E79; +16E5A;MEDEFAIDRIN CAPITAL LETTER OE;Lu;0;L;;;;;N;;;;16E7A; +16E5B;MEDEFAIDRIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;16E7B; +16E5C;MEDEFAIDRIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;16E7C; +16E5D;MEDEFAIDRIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;16E7D; +16E5E;MEDEFAIDRIN CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;16E7E; +16E5F;MEDEFAIDRIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;16E7F; +16E60;MEDEFAIDRIN SMALL LETTER M;Ll;0;L;;;;;N;;;16E40;;16E40 +16E61;MEDEFAIDRIN SMALL LETTER S;Ll;0;L;;;;;N;;;16E41;;16E41 +16E62;MEDEFAIDRIN SMALL LETTER V;Ll;0;L;;;;;N;;;16E42;;16E42 +16E63;MEDEFAIDRIN SMALL LETTER W;Ll;0;L;;;;;N;;;16E43;;16E43 +16E64;MEDEFAIDRIN SMALL LETTER ATIU;Ll;0;L;;;;;N;;;16E44;;16E44 +16E65;MEDEFAIDRIN SMALL LETTER Z;Ll;0;L;;;;;N;;;16E45;;16E45 +16E66;MEDEFAIDRIN SMALL LETTER KP;Ll;0;L;;;;;N;;;16E46;;16E46 +16E67;MEDEFAIDRIN SMALL LETTER P;Ll;0;L;;;;;N;;;16E47;;16E47 +16E68;MEDEFAIDRIN SMALL LETTER T;Ll;0;L;;;;;N;;;16E48;;16E48 +16E69;MEDEFAIDRIN SMALL LETTER G;Ll;0;L;;;;;N;;;16E49;;16E49 +16E6A;MEDEFAIDRIN SMALL LETTER F;Ll;0;L;;;;;N;;;16E4A;;16E4A +16E6B;MEDEFAIDRIN SMALL LETTER I;Ll;0;L;;;;;N;;;16E4B;;16E4B +16E6C;MEDEFAIDRIN SMALL LETTER K;Ll;0;L;;;;;N;;;16E4C;;16E4C +16E6D;MEDEFAIDRIN SMALL LETTER A;Ll;0;L;;;;;N;;;16E4D;;16E4D +16E6E;MEDEFAIDRIN SMALL LETTER J;Ll;0;L;;;;;N;;;16E4E;;16E4E +16E6F;MEDEFAIDRIN SMALL LETTER E;Ll;0;L;;;;;N;;;16E4F;;16E4F +16E70;MEDEFAIDRIN SMALL LETTER B;Ll;0;L;;;;;N;;;16E50;;16E50 +16E71;MEDEFAIDRIN SMALL LETTER C;Ll;0;L;;;;;N;;;16E51;;16E51 +16E72;MEDEFAIDRIN SMALL LETTER U;Ll;0;L;;;;;N;;;16E52;;16E52 +16E73;MEDEFAIDRIN SMALL LETTER YU;Ll;0;L;;;;;N;;;16E53;;16E53 +16E74;MEDEFAIDRIN SMALL LETTER L;Ll;0;L;;;;;N;;;16E54;;16E54 +16E75;MEDEFAIDRIN SMALL LETTER Q;Ll;0;L;;;;;N;;;16E55;;16E55 +16E76;MEDEFAIDRIN SMALL LETTER HP;Ll;0;L;;;;;N;;;16E56;;16E56 +16E77;MEDEFAIDRIN SMALL LETTER NY;Ll;0;L;;;;;N;;;16E57;;16E57 +16E78;MEDEFAIDRIN SMALL LETTER X;Ll;0;L;;;;;N;;;16E58;;16E58 +16E79;MEDEFAIDRIN SMALL LETTER D;Ll;0;L;;;;;N;;;16E59;;16E59 +16E7A;MEDEFAIDRIN SMALL LETTER OE;Ll;0;L;;;;;N;;;16E5A;;16E5A +16E7B;MEDEFAIDRIN SMALL LETTER N;Ll;0;L;;;;;N;;;16E5B;;16E5B +16E7C;MEDEFAIDRIN SMALL LETTER R;Ll;0;L;;;;;N;;;16E5C;;16E5C +16E7D;MEDEFAIDRIN SMALL LETTER O;Ll;0;L;;;;;N;;;16E5D;;16E5D +16E7E;MEDEFAIDRIN SMALL LETTER AI;Ll;0;L;;;;;N;;;16E5E;;16E5E +16E7F;MEDEFAIDRIN SMALL LETTER Y;Ll;0;L;;;;;N;;;16E5F;;16E5F +16E80;MEDEFAIDRIN DIGIT ZERO;No;0;L;;;;0;N;;;;; +16E81;MEDEFAIDRIN DIGIT ONE;No;0;L;;;;1;N;;;;; +16E82;MEDEFAIDRIN DIGIT TWO;No;0;L;;;;2;N;;;;; +16E83;MEDEFAIDRIN DIGIT THREE;No;0;L;;;;3;N;;;;; +16E84;MEDEFAIDRIN DIGIT FOUR;No;0;L;;;;4;N;;;;; +16E85;MEDEFAIDRIN DIGIT FIVE;No;0;L;;;;5;N;;;;; +16E86;MEDEFAIDRIN DIGIT SIX;No;0;L;;;;6;N;;;;; +16E87;MEDEFAIDRIN DIGIT SEVEN;No;0;L;;;;7;N;;;;; +16E88;MEDEFAIDRIN DIGIT EIGHT;No;0;L;;;;8;N;;;;; +16E89;MEDEFAIDRIN DIGIT NINE;No;0;L;;;;9;N;;;;; +16E8A;MEDEFAIDRIN NUMBER TEN;No;0;L;;;;10;N;;;;; +16E8B;MEDEFAIDRIN NUMBER ELEVEN;No;0;L;;;;11;N;;;;; +16E8C;MEDEFAIDRIN NUMBER TWELVE;No;0;L;;;;12;N;;;;; +16E8D;MEDEFAIDRIN NUMBER THIRTEEN;No;0;L;;;;13;N;;;;; +16E8E;MEDEFAIDRIN NUMBER FOURTEEN;No;0;L;;;;14;N;;;;; +16E8F;MEDEFAIDRIN NUMBER FIFTEEN;No;0;L;;;;15;N;;;;; +16E90;MEDEFAIDRIN NUMBER SIXTEEN;No;0;L;;;;16;N;;;;; +16E91;MEDEFAIDRIN NUMBER SEVENTEEN;No;0;L;;;;17;N;;;;; +16E92;MEDEFAIDRIN NUMBER EIGHTEEN;No;0;L;;;;18;N;;;;; +16E93;MEDEFAIDRIN NUMBER NINETEEN;No;0;L;;;;19;N;;;;; +16E94;MEDEFAIDRIN DIGIT ONE ALTERNATE FORM;No;0;L;;;;1;N;;;;; +16E95;MEDEFAIDRIN DIGIT TWO ALTERNATE FORM;No;0;L;;;;2;N;;;;; +16E96;MEDEFAIDRIN DIGIT THREE ALTERNATE FORM;No;0;L;;;;3;N;;;;; +16E97;MEDEFAIDRIN COMMA;Po;0;L;;;;;N;;;;; +16E98;MEDEFAIDRIN FULL STOP;Po;0;L;;;;;N;;;;; +16E99;MEDEFAIDRIN SYMBOL AIVA;Po;0;L;;;;;N;;;;; +16E9A;MEDEFAIDRIN EXCLAMATION OH;Po;0;L;;;;;N;;;;; +16EA0;BERIA ERFE CAPITAL LETTER ARKAB;Lu;0;L;;;;;N;;;;16EBB; +16EA1;BERIA ERFE CAPITAL LETTER BASIGNA;Lu;0;L;;;;;N;;;;16EBC; +16EA2;BERIA ERFE CAPITAL LETTER DARBAI;Lu;0;L;;;;;N;;;;16EBD; +16EA3;BERIA ERFE CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;16EBE; +16EA4;BERIA ERFE CAPITAL LETTER FITKO;Lu;0;L;;;;;N;;;;16EBF; +16EA5;BERIA ERFE CAPITAL LETTER GOWAY;Lu;0;L;;;;;N;;;;16EC0; +16EA6;BERIA ERFE CAPITAL LETTER HIRDEABO;Lu;0;L;;;;;N;;;;16EC1; +16EA7;BERIA ERFE CAPITAL LETTER I;Lu;0;L;;;;;N;;;;16EC2; +16EA8;BERIA ERFE CAPITAL LETTER DJAI;Lu;0;L;;;;;N;;;;16EC3; +16EA9;BERIA ERFE CAPITAL LETTER KOBO;Lu;0;L;;;;;N;;;;16EC4; +16EAA;BERIA ERFE CAPITAL LETTER LAKKO;Lu;0;L;;;;;N;;;;16EC5; +16EAB;BERIA ERFE CAPITAL LETTER MERI;Lu;0;L;;;;;N;;;;16EC6; +16EAC;BERIA ERFE CAPITAL LETTER NINI;Lu;0;L;;;;;N;;;;16EC7; +16EAD;BERIA ERFE CAPITAL LETTER GNA;Lu;0;L;;;;;N;;;;16EC8; +16EAE;BERIA ERFE CAPITAL LETTER NGAY;Lu;0;L;;;;;N;;;;16EC9; +16EAF;BERIA ERFE CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;16ECA; +16EB0;BERIA ERFE CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;16ECB; +16EB1;BERIA ERFE CAPITAL LETTER ERIGO;Lu;0;L;;;;;N;;;;16ECC; +16EB2;BERIA ERFE CAPITAL LETTER ERIGO TAMURA;Lu;0;L;;;;;N;;;;16ECD; +16EB3;BERIA ERFE CAPITAL LETTER SERI;Lu;0;L;;;;;N;;;;16ECE; +16EB4;BERIA ERFE CAPITAL LETTER SHEP;Lu;0;L;;;;;N;;;;16ECF; +16EB5;BERIA ERFE CAPITAL LETTER TATASOUE;Lu;0;L;;;;;N;;;;16ED0; +16EB6;BERIA ERFE CAPITAL LETTER UI;Lu;0;L;;;;;N;;;;16ED1; +16EB7;BERIA ERFE CAPITAL LETTER WASSE;Lu;0;L;;;;;N;;;;16ED2; +16EB8;BERIA ERFE CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;16ED3; +16EBB;BERIA ERFE SMALL LETTER ARKAB;Ll;0;L;;;;;N;;;16EA0;;16EA0 +16EBC;BERIA ERFE SMALL LETTER BASIGNA;Ll;0;L;;;;;N;;;16EA1;;16EA1 +16EBD;BERIA ERFE SMALL LETTER DARBAI;Ll;0;L;;;;;N;;;16EA2;;16EA2 +16EBE;BERIA ERFE SMALL LETTER EH;Ll;0;L;;;;;N;;;16EA3;;16EA3 +16EBF;BERIA ERFE SMALL LETTER FITKO;Ll;0;L;;;;;N;;;16EA4;;16EA4 +16EC0;BERIA ERFE SMALL LETTER GOWAY;Ll;0;L;;;;;N;;;16EA5;;16EA5 +16EC1;BERIA ERFE SMALL LETTER HIRDEABO;Ll;0;L;;;;;N;;;16EA6;;16EA6 +16EC2;BERIA ERFE SMALL LETTER I;Ll;0;L;;;;;N;;;16EA7;;16EA7 +16EC3;BERIA ERFE SMALL LETTER DJAI;Ll;0;L;;;;;N;;;16EA8;;16EA8 +16EC4;BERIA ERFE SMALL LETTER KOBO;Ll;0;L;;;;;N;;;16EA9;;16EA9 +16EC5;BERIA ERFE SMALL LETTER LAKKO;Ll;0;L;;;;;N;;;16EAA;;16EAA +16EC6;BERIA ERFE SMALL LETTER MERI;Ll;0;L;;;;;N;;;16EAB;;16EAB +16EC7;BERIA ERFE SMALL LETTER NINI;Ll;0;L;;;;;N;;;16EAC;;16EAC +16EC8;BERIA ERFE SMALL LETTER GNA;Ll;0;L;;;;;N;;;16EAD;;16EAD +16EC9;BERIA ERFE SMALL LETTER NGAY;Ll;0;L;;;;;N;;;16EAE;;16EAE +16ECA;BERIA ERFE SMALL LETTER OI;Ll;0;L;;;;;N;;;16EAF;;16EAF +16ECB;BERIA ERFE SMALL LETTER PI;Ll;0;L;;;;;N;;;16EB0;;16EB0 +16ECC;BERIA ERFE SMALL LETTER ERIGO;Ll;0;L;;;;;N;;;16EB1;;16EB1 +16ECD;BERIA ERFE SMALL LETTER ERIGO TAMURA;Ll;0;L;;;;;N;;;16EB2;;16EB2 +16ECE;BERIA ERFE SMALL LETTER SERI;Ll;0;L;;;;;N;;;16EB3;;16EB3 +16ECF;BERIA ERFE SMALL LETTER SHEP;Ll;0;L;;;;;N;;;16EB4;;16EB4 +16ED0;BERIA ERFE SMALL LETTER TATASOUE;Ll;0;L;;;;;N;;;16EB5;;16EB5 +16ED1;BERIA ERFE SMALL LETTER UI;Ll;0;L;;;;;N;;;16EB6;;16EB6 +16ED2;BERIA ERFE SMALL LETTER WASSE;Ll;0;L;;;;;N;;;16EB7;;16EB7 +16ED3;BERIA ERFE SMALL LETTER AY;Ll;0;L;;;;;N;;;16EB8;;16EB8 +16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;; +16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;; +16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;; +16F03;MIAO LETTER PLA;Lo;0;L;;;;;N;;;;; +16F04;MIAO LETTER MA;Lo;0;L;;;;;N;;;;; +16F05;MIAO LETTER MHA;Lo;0;L;;;;;N;;;;; +16F06;MIAO LETTER ARCHAIC MA;Lo;0;L;;;;;N;;;;; +16F07;MIAO LETTER FA;Lo;0;L;;;;;N;;;;; +16F08;MIAO LETTER VA;Lo;0;L;;;;;N;;;;; +16F09;MIAO LETTER VFA;Lo;0;L;;;;;N;;;;; +16F0A;MIAO LETTER TA;Lo;0;L;;;;;N;;;;; +16F0B;MIAO LETTER DA;Lo;0;L;;;;;N;;;;; +16F0C;MIAO LETTER YI TTA;Lo;0;L;;;;;N;;;;; +16F0D;MIAO LETTER YI TA;Lo;0;L;;;;;N;;;;; +16F0E;MIAO LETTER TTA;Lo;0;L;;;;;N;;;;; +16F0F;MIAO LETTER DDA;Lo;0;L;;;;;N;;;;; +16F10;MIAO LETTER NA;Lo;0;L;;;;;N;;;;; +16F11;MIAO LETTER NHA;Lo;0;L;;;;;N;;;;; +16F12;MIAO LETTER YI NNA;Lo;0;L;;;;;N;;;;; +16F13;MIAO LETTER ARCHAIC NA;Lo;0;L;;;;;N;;;;; +16F14;MIAO LETTER NNA;Lo;0;L;;;;;N;;;;; +16F15;MIAO LETTER NNHA;Lo;0;L;;;;;N;;;;; +16F16;MIAO LETTER LA;Lo;0;L;;;;;N;;;;; +16F17;MIAO LETTER LYA;Lo;0;L;;;;;N;;;;; +16F18;MIAO LETTER LHA;Lo;0;L;;;;;N;;;;; +16F19;MIAO LETTER LHYA;Lo;0;L;;;;;N;;;;; +16F1A;MIAO LETTER TLHA;Lo;0;L;;;;;N;;;;; +16F1B;MIAO LETTER DLHA;Lo;0;L;;;;;N;;;;; +16F1C;MIAO LETTER TLHYA;Lo;0;L;;;;;N;;;;; +16F1D;MIAO LETTER DLHYA;Lo;0;L;;;;;N;;;;; +16F1E;MIAO LETTER KA;Lo;0;L;;;;;N;;;;; +16F1F;MIAO LETTER GA;Lo;0;L;;;;;N;;;;; +16F20;MIAO LETTER YI KA;Lo;0;L;;;;;N;;;;; +16F21;MIAO LETTER QA;Lo;0;L;;;;;N;;;;; +16F22;MIAO LETTER QGA;Lo;0;L;;;;;N;;;;; +16F23;MIAO LETTER NGA;Lo;0;L;;;;;N;;;;; +16F24;MIAO LETTER NGHA;Lo;0;L;;;;;N;;;;; +16F25;MIAO LETTER ARCHAIC NGA;Lo;0;L;;;;;N;;;;; +16F26;MIAO LETTER HA;Lo;0;L;;;;;N;;;;; +16F27;MIAO LETTER XA;Lo;0;L;;;;;N;;;;; +16F28;MIAO LETTER GHA;Lo;0;L;;;;;N;;;;; +16F29;MIAO LETTER GHHA;Lo;0;L;;;;;N;;;;; +16F2A;MIAO LETTER TSSA;Lo;0;L;;;;;N;;;;; +16F2B;MIAO LETTER DZZA;Lo;0;L;;;;;N;;;;; +16F2C;MIAO LETTER NYA;Lo;0;L;;;;;N;;;;; +16F2D;MIAO LETTER NYHA;Lo;0;L;;;;;N;;;;; +16F2E;MIAO LETTER TSHA;Lo;0;L;;;;;N;;;;; +16F2F;MIAO LETTER DZHA;Lo;0;L;;;;;N;;;;; +16F30;MIAO LETTER YI TSHA;Lo;0;L;;;;;N;;;;; +16F31;MIAO LETTER YI DZHA;Lo;0;L;;;;;N;;;;; +16F32;MIAO LETTER REFORMED TSHA;Lo;0;L;;;;;N;;;;; +16F33;MIAO LETTER SHA;Lo;0;L;;;;;N;;;;; +16F34;MIAO LETTER SSA;Lo;0;L;;;;;N;;;;; +16F35;MIAO LETTER ZHA;Lo;0;L;;;;;N;;;;; +16F36;MIAO LETTER ZSHA;Lo;0;L;;;;;N;;;;; +16F37;MIAO LETTER TSA;Lo;0;L;;;;;N;;;;; +16F38;MIAO LETTER DZA;Lo;0;L;;;;;N;;;;; +16F39;MIAO LETTER YI TSA;Lo;0;L;;;;;N;;;;; +16F3A;MIAO LETTER SA;Lo;0;L;;;;;N;;;;; +16F3B;MIAO LETTER ZA;Lo;0;L;;;;;N;;;;; +16F3C;MIAO LETTER ZSA;Lo;0;L;;;;;N;;;;; +16F3D;MIAO LETTER ZZA;Lo;0;L;;;;;N;;;;; +16F3E;MIAO LETTER ZZSA;Lo;0;L;;;;;N;;;;; +16F3F;MIAO LETTER ARCHAIC ZZA;Lo;0;L;;;;;N;;;;; +16F40;MIAO LETTER ZZYA;Lo;0;L;;;;;N;;;;; +16F41;MIAO LETTER ZZSYA;Lo;0;L;;;;;N;;;;; +16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;; +16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;; +16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;; +16F45;MIAO LETTER BRI;Lo;0;L;;;;;N;;;;; +16F46;MIAO LETTER SYI;Lo;0;L;;;;;N;;;;; +16F47;MIAO LETTER DZYI;Lo;0;L;;;;;N;;;;; +16F48;MIAO LETTER TE;Lo;0;L;;;;;N;;;;; +16F49;MIAO LETTER TSE;Lo;0;L;;;;;N;;;;; +16F4A;MIAO LETTER RTE;Lo;0;L;;;;;N;;;;; +16F4F;MIAO SIGN CONSONANT MODIFIER BAR;Mn;0;NSM;;;;;N;;;;; +16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;; +16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;; +16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;; +16F53;MIAO SIGN REFORMED ASPIRATION;Mc;0;L;;;;;N;;;;; +16F54;MIAO VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +16F55;MIAO VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +16F56;MIAO VOWEL SIGN AHH;Mc;0;L;;;;;N;;;;; +16F57;MIAO VOWEL SIGN AN;Mc;0;L;;;;;N;;;;; +16F58;MIAO VOWEL SIGN ANG;Mc;0;L;;;;;N;;;;; +16F59;MIAO VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +16F5A;MIAO VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +16F5B;MIAO VOWEL SIGN WO;Mc;0;L;;;;;N;;;;; +16F5C;MIAO VOWEL SIGN W;Mc;0;L;;;;;N;;;;; +16F5D;MIAO VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +16F5E;MIAO VOWEL SIGN EN;Mc;0;L;;;;;N;;;;; +16F5F;MIAO VOWEL SIGN ENG;Mc;0;L;;;;;N;;;;; +16F60;MIAO VOWEL SIGN OEY;Mc;0;L;;;;;N;;;;; +16F61;MIAO VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +16F62;MIAO VOWEL SIGN IA;Mc;0;L;;;;;N;;;;; +16F63;MIAO VOWEL SIGN IAN;Mc;0;L;;;;;N;;;;; +16F64;MIAO VOWEL SIGN IANG;Mc;0;L;;;;;N;;;;; +16F65;MIAO VOWEL SIGN IO;Mc;0;L;;;;;N;;;;; +16F66;MIAO VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +16F67;MIAO VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +16F68;MIAO VOWEL SIGN IU;Mc;0;L;;;;;N;;;;; +16F69;MIAO VOWEL SIGN ING;Mc;0;L;;;;;N;;;;; +16F6A;MIAO VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +16F6B;MIAO VOWEL SIGN UA;Mc;0;L;;;;;N;;;;; +16F6C;MIAO VOWEL SIGN UAN;Mc;0;L;;;;;N;;;;; +16F6D;MIAO VOWEL SIGN UANG;Mc;0;L;;;;;N;;;;; +16F6E;MIAO VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +16F6F;MIAO VOWEL SIGN UEI;Mc;0;L;;;;;N;;;;; +16F70;MIAO VOWEL SIGN UNG;Mc;0;L;;;;;N;;;;; +16F71;MIAO VOWEL SIGN Y;Mc;0;L;;;;;N;;;;; +16F72;MIAO VOWEL SIGN YI;Mc;0;L;;;;;N;;;;; +16F73;MIAO VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +16F74;MIAO VOWEL SIGN AEE;Mc;0;L;;;;;N;;;;; +16F75;MIAO VOWEL SIGN ERR;Mc;0;L;;;;;N;;;;; +16F76;MIAO VOWEL SIGN ROUNDED ERR;Mc;0;L;;;;;N;;;;; +16F77;MIAO VOWEL SIGN ER;Mc;0;L;;;;;N;;;;; +16F78;MIAO VOWEL SIGN ROUNDED ER;Mc;0;L;;;;;N;;;;; +16F79;MIAO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +16F7A;MIAO VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; +16F7B;MIAO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;; +16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;; +16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;; +16F7F;MIAO VOWEL SIGN UOG;Mc;0;L;;;;;N;;;;; +16F80;MIAO VOWEL SIGN YUI;Mc;0;L;;;;;N;;;;; +16F81;MIAO VOWEL SIGN OG;Mc;0;L;;;;;N;;;;; +16F82;MIAO VOWEL SIGN OER;Mc;0;L;;;;;N;;;;; +16F83;MIAO VOWEL SIGN VW;Mc;0;L;;;;;N;;;;; +16F84;MIAO VOWEL SIGN IG;Mc;0;L;;;;;N;;;;; +16F85;MIAO VOWEL SIGN EA;Mc;0;L;;;;;N;;;;; +16F86;MIAO VOWEL SIGN IONG;Mc;0;L;;;;;N;;;;; +16F87;MIAO VOWEL SIGN UI;Mc;0;L;;;;;N;;;;; +16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;; +16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;; +16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;; +16F92;MIAO TONE BELOW;Mn;0;NSM;;;;;N;;;;; +16F93;MIAO LETTER TONE-2;Lm;0;L;;;;;N;;;;; +16F94;MIAO LETTER TONE-3;Lm;0;L;;;;;N;;;;; +16F95;MIAO LETTER TONE-4;Lm;0;L;;;;;N;;;;; +16F96;MIAO LETTER TONE-5;Lm;0;L;;;;;N;;;;; +16F97;MIAO LETTER TONE-6;Lm;0;L;;;;;N;;;;; +16F98;MIAO LETTER TONE-7;Lm;0;L;;;;;N;;;;; +16F99;MIAO LETTER TONE-8;Lm;0;L;;;;;N;;;;; +16F9A;MIAO LETTER REFORMED TONE-1;Lm;0;L;;;;;N;;;;; +16F9B;MIAO LETTER REFORMED TONE-2;Lm;0;L;;;;;N;;;;; +16F9C;MIAO LETTER REFORMED TONE-4;Lm;0;L;;;;;N;;;;; +16F9D;MIAO LETTER REFORMED TONE-5;Lm;0;L;;;;;N;;;;; +16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; +16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; +16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE1;NUSHU ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE2;OLD CHINESE HOOK MARK;Po;0;ON;;;;;N;;;;; +16FE3;OLD CHINESE ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE4;KHITAN SMALL SCRIPT FILLER;Mn;0;NSM;;;;;N;;;;; +16FF0;VIETNAMESE ALTERNATE READING MARK CA;Mc;6;L;;;;;N;;;;; +16FF1;VIETNAMESE ALTERNATE READING MARK NHAY;Mc;6;L;;;;;N;;;;; +16FF2;CHINESE SMALL SIMPLIFIED ER;Lm;0;L;;;;;N;;;;; +16FF3;CHINESE SMALL TRADITIONAL ER;Lm;0;L;;;;;N;;;;; +16FF4;YANGQIN SIGN SLOW ONE BEAT;Nl;0;L;;;;1;N;;;;; +16FF5;YANGQIN SIGN SLOW THREE HALF BEATS;Nl;0;L;;;;3/2;N;;;;; +16FF6;YANGQIN SIGN SLOW TWO BEATS;Nl;0;L;;;;2;N;;;;; +17000;;Lo;0;L;;;;;N;;;;; +187FF;;Lo;0;L;;;;;N;;;;; +18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;; +18801;TANGUT COMPONENT-002;Lo;0;L;;;;;N;;;;; +18802;TANGUT COMPONENT-003;Lo;0;L;;;;;N;;;;; +18803;TANGUT COMPONENT-004;Lo;0;L;;;;;N;;;;; +18804;TANGUT COMPONENT-005;Lo;0;L;;;;;N;;;;; +18805;TANGUT COMPONENT-006;Lo;0;L;;;;;N;;;;; +18806;TANGUT COMPONENT-007;Lo;0;L;;;;;N;;;;; +18807;TANGUT COMPONENT-008;Lo;0;L;;;;;N;;;;; +18808;TANGUT COMPONENT-009;Lo;0;L;;;;;N;;;;; +18809;TANGUT COMPONENT-010;Lo;0;L;;;;;N;;;;; +1880A;TANGUT COMPONENT-011;Lo;0;L;;;;;N;;;;; +1880B;TANGUT COMPONENT-012;Lo;0;L;;;;;N;;;;; +1880C;TANGUT COMPONENT-013;Lo;0;L;;;;;N;;;;; +1880D;TANGUT COMPONENT-014;Lo;0;L;;;;;N;;;;; +1880E;TANGUT COMPONENT-015;Lo;0;L;;;;;N;;;;; +1880F;TANGUT COMPONENT-016;Lo;0;L;;;;;N;;;;; +18810;TANGUT COMPONENT-017;Lo;0;L;;;;;N;;;;; +18811;TANGUT COMPONENT-018;Lo;0;L;;;;;N;;;;; +18812;TANGUT COMPONENT-019;Lo;0;L;;;;;N;;;;; +18813;TANGUT COMPONENT-020;Lo;0;L;;;;;N;;;;; +18814;TANGUT COMPONENT-021;Lo;0;L;;;;;N;;;;; +18815;TANGUT COMPONENT-022;Lo;0;L;;;;;N;;;;; +18816;TANGUT COMPONENT-023;Lo;0;L;;;;;N;;;;; +18817;TANGUT COMPONENT-024;Lo;0;L;;;;;N;;;;; +18818;TANGUT COMPONENT-025;Lo;0;L;;;;;N;;;;; +18819;TANGUT COMPONENT-026;Lo;0;L;;;;;N;;;;; +1881A;TANGUT COMPONENT-027;Lo;0;L;;;;;N;;;;; +1881B;TANGUT COMPONENT-028;Lo;0;L;;;;;N;;;;; +1881C;TANGUT COMPONENT-029;Lo;0;L;;;;;N;;;;; +1881D;TANGUT COMPONENT-030;Lo;0;L;;;;;N;;;;; +1881E;TANGUT COMPONENT-031;Lo;0;L;;;;;N;;;;; +1881F;TANGUT COMPONENT-032;Lo;0;L;;;;;N;;;;; +18820;TANGUT COMPONENT-033;Lo;0;L;;;;;N;;;;; +18821;TANGUT COMPONENT-034;Lo;0;L;;;;;N;;;;; +18822;TANGUT COMPONENT-035;Lo;0;L;;;;;N;;;;; +18823;TANGUT COMPONENT-036;Lo;0;L;;;;;N;;;;; +18824;TANGUT COMPONENT-037;Lo;0;L;;;;;N;;;;; +18825;TANGUT COMPONENT-038;Lo;0;L;;;;;N;;;;; +18826;TANGUT COMPONENT-039;Lo;0;L;;;;;N;;;;; +18827;TANGUT COMPONENT-040;Lo;0;L;;;;;N;;;;; +18828;TANGUT COMPONENT-041;Lo;0;L;;;;;N;;;;; +18829;TANGUT COMPONENT-042;Lo;0;L;;;;;N;;;;; +1882A;TANGUT COMPONENT-043;Lo;0;L;;;;;N;;;;; +1882B;TANGUT COMPONENT-044;Lo;0;L;;;;;N;;;;; +1882C;TANGUT COMPONENT-045;Lo;0;L;;;;;N;;;;; +1882D;TANGUT COMPONENT-046;Lo;0;L;;;;;N;;;;; +1882E;TANGUT COMPONENT-047;Lo;0;L;;;;;N;;;;; +1882F;TANGUT COMPONENT-048;Lo;0;L;;;;;N;;;;; +18830;TANGUT COMPONENT-049;Lo;0;L;;;;;N;;;;; +18831;TANGUT COMPONENT-050;Lo;0;L;;;;;N;;;;; +18832;TANGUT COMPONENT-051;Lo;0;L;;;;;N;;;;; +18833;TANGUT COMPONENT-052;Lo;0;L;;;;;N;;;;; +18834;TANGUT COMPONENT-053;Lo;0;L;;;;;N;;;;; +18835;TANGUT COMPONENT-054;Lo;0;L;;;;;N;;;;; +18836;TANGUT COMPONENT-055;Lo;0;L;;;;;N;;;;; +18837;TANGUT COMPONENT-056;Lo;0;L;;;;;N;;;;; +18838;TANGUT COMPONENT-057;Lo;0;L;;;;;N;;;;; +18839;TANGUT COMPONENT-058;Lo;0;L;;;;;N;;;;; +1883A;TANGUT COMPONENT-059;Lo;0;L;;;;;N;;;;; +1883B;TANGUT COMPONENT-060;Lo;0;L;;;;;N;;;;; +1883C;TANGUT COMPONENT-061;Lo;0;L;;;;;N;;;;; +1883D;TANGUT COMPONENT-062;Lo;0;L;;;;;N;;;;; +1883E;TANGUT COMPONENT-063;Lo;0;L;;;;;N;;;;; +1883F;TANGUT COMPONENT-064;Lo;0;L;;;;;N;;;;; +18840;TANGUT COMPONENT-065;Lo;0;L;;;;;N;;;;; +18841;TANGUT COMPONENT-066;Lo;0;L;;;;;N;;;;; +18842;TANGUT COMPONENT-067;Lo;0;L;;;;;N;;;;; +18843;TANGUT COMPONENT-068;Lo;0;L;;;;;N;;;;; +18844;TANGUT COMPONENT-069;Lo;0;L;;;;;N;;;;; +18845;TANGUT COMPONENT-070;Lo;0;L;;;;;N;;;;; +18846;TANGUT COMPONENT-071;Lo;0;L;;;;;N;;;;; +18847;TANGUT COMPONENT-072;Lo;0;L;;;;;N;;;;; +18848;TANGUT COMPONENT-073;Lo;0;L;;;;;N;;;;; +18849;TANGUT COMPONENT-074;Lo;0;L;;;;;N;;;;; +1884A;TANGUT COMPONENT-075;Lo;0;L;;;;;N;;;;; +1884B;TANGUT COMPONENT-076;Lo;0;L;;;;;N;;;;; +1884C;TANGUT COMPONENT-077;Lo;0;L;;;;;N;;;;; +1884D;TANGUT COMPONENT-078;Lo;0;L;;;;;N;;;;; +1884E;TANGUT COMPONENT-079;Lo;0;L;;;;;N;;;;; +1884F;TANGUT COMPONENT-080;Lo;0;L;;;;;N;;;;; +18850;TANGUT COMPONENT-081;Lo;0;L;;;;;N;;;;; +18851;TANGUT COMPONENT-082;Lo;0;L;;;;;N;;;;; +18852;TANGUT COMPONENT-083;Lo;0;L;;;;;N;;;;; +18853;TANGUT COMPONENT-084;Lo;0;L;;;;;N;;;;; +18854;TANGUT COMPONENT-085;Lo;0;L;;;;;N;;;;; +18855;TANGUT COMPONENT-086;Lo;0;L;;;;;N;;;;; +18856;TANGUT COMPONENT-087;Lo;0;L;;;;;N;;;;; +18857;TANGUT COMPONENT-088;Lo;0;L;;;;;N;;;;; +18858;TANGUT COMPONENT-089;Lo;0;L;;;;;N;;;;; +18859;TANGUT COMPONENT-090;Lo;0;L;;;;;N;;;;; +1885A;TANGUT COMPONENT-091;Lo;0;L;;;;;N;;;;; +1885B;TANGUT COMPONENT-092;Lo;0;L;;;;;N;;;;; +1885C;TANGUT COMPONENT-093;Lo;0;L;;;;;N;;;;; +1885D;TANGUT COMPONENT-094;Lo;0;L;;;;;N;;;;; +1885E;TANGUT COMPONENT-095;Lo;0;L;;;;;N;;;;; +1885F;TANGUT COMPONENT-096;Lo;0;L;;;;;N;;;;; +18860;TANGUT COMPONENT-097;Lo;0;L;;;;;N;;;;; +18861;TANGUT COMPONENT-098;Lo;0;L;;;;;N;;;;; +18862;TANGUT COMPONENT-099;Lo;0;L;;;;;N;;;;; +18863;TANGUT COMPONENT-100;Lo;0;L;;;;;N;;;;; +18864;TANGUT COMPONENT-101;Lo;0;L;;;;;N;;;;; +18865;TANGUT COMPONENT-102;Lo;0;L;;;;;N;;;;; +18866;TANGUT COMPONENT-103;Lo;0;L;;;;;N;;;;; +18867;TANGUT COMPONENT-104;Lo;0;L;;;;;N;;;;; +18868;TANGUT COMPONENT-105;Lo;0;L;;;;;N;;;;; +18869;TANGUT COMPONENT-106;Lo;0;L;;;;;N;;;;; +1886A;TANGUT COMPONENT-107;Lo;0;L;;;;;N;;;;; +1886B;TANGUT COMPONENT-108;Lo;0;L;;;;;N;;;;; +1886C;TANGUT COMPONENT-109;Lo;0;L;;;;;N;;;;; +1886D;TANGUT COMPONENT-110;Lo;0;L;;;;;N;;;;; +1886E;TANGUT COMPONENT-111;Lo;0;L;;;;;N;;;;; +1886F;TANGUT COMPONENT-112;Lo;0;L;;;;;N;;;;; +18870;TANGUT COMPONENT-113;Lo;0;L;;;;;N;;;;; +18871;TANGUT COMPONENT-114;Lo;0;L;;;;;N;;;;; +18872;TANGUT COMPONENT-115;Lo;0;L;;;;;N;;;;; +18873;TANGUT COMPONENT-116;Lo;0;L;;;;;N;;;;; +18874;TANGUT COMPONENT-117;Lo;0;L;;;;;N;;;;; +18875;TANGUT COMPONENT-118;Lo;0;L;;;;;N;;;;; +18876;TANGUT COMPONENT-119;Lo;0;L;;;;;N;;;;; +18877;TANGUT COMPONENT-120;Lo;0;L;;;;;N;;;;; +18878;TANGUT COMPONENT-121;Lo;0;L;;;;;N;;;;; +18879;TANGUT COMPONENT-122;Lo;0;L;;;;;N;;;;; +1887A;TANGUT COMPONENT-123;Lo;0;L;;;;;N;;;;; +1887B;TANGUT COMPONENT-124;Lo;0;L;;;;;N;;;;; +1887C;TANGUT COMPONENT-125;Lo;0;L;;;;;N;;;;; +1887D;TANGUT COMPONENT-126;Lo;0;L;;;;;N;;;;; +1887E;TANGUT COMPONENT-127;Lo;0;L;;;;;N;;;;; +1887F;TANGUT COMPONENT-128;Lo;0;L;;;;;N;;;;; +18880;TANGUT COMPONENT-129;Lo;0;L;;;;;N;;;;; +18881;TANGUT COMPONENT-130;Lo;0;L;;;;;N;;;;; +18882;TANGUT COMPONENT-131;Lo;0;L;;;;;N;;;;; +18883;TANGUT COMPONENT-132;Lo;0;L;;;;;N;;;;; +18884;TANGUT COMPONENT-133;Lo;0;L;;;;;N;;;;; +18885;TANGUT COMPONENT-134;Lo;0;L;;;;;N;;;;; +18886;TANGUT COMPONENT-135;Lo;0;L;;;;;N;;;;; +18887;TANGUT COMPONENT-136;Lo;0;L;;;;;N;;;;; +18888;TANGUT COMPONENT-137;Lo;0;L;;;;;N;;;;; +18889;TANGUT COMPONENT-138;Lo;0;L;;;;;N;;;;; +1888A;TANGUT COMPONENT-139;Lo;0;L;;;;;N;;;;; +1888B;TANGUT COMPONENT-140;Lo;0;L;;;;;N;;;;; +1888C;TANGUT COMPONENT-141;Lo;0;L;;;;;N;;;;; +1888D;TANGUT COMPONENT-142;Lo;0;L;;;;;N;;;;; +1888E;TANGUT COMPONENT-143;Lo;0;L;;;;;N;;;;; +1888F;TANGUT COMPONENT-144;Lo;0;L;;;;;N;;;;; +18890;TANGUT COMPONENT-145;Lo;0;L;;;;;N;;;;; +18891;TANGUT COMPONENT-146;Lo;0;L;;;;;N;;;;; +18892;TANGUT COMPONENT-147;Lo;0;L;;;;;N;;;;; +18893;TANGUT COMPONENT-148;Lo;0;L;;;;;N;;;;; +18894;TANGUT COMPONENT-149;Lo;0;L;;;;;N;;;;; +18895;TANGUT COMPONENT-150;Lo;0;L;;;;;N;;;;; +18896;TANGUT COMPONENT-151;Lo;0;L;;;;;N;;;;; +18897;TANGUT COMPONENT-152;Lo;0;L;;;;;N;;;;; +18898;TANGUT COMPONENT-153;Lo;0;L;;;;;N;;;;; +18899;TANGUT COMPONENT-154;Lo;0;L;;;;;N;;;;; +1889A;TANGUT COMPONENT-155;Lo;0;L;;;;;N;;;;; +1889B;TANGUT COMPONENT-156;Lo;0;L;;;;;N;;;;; +1889C;TANGUT COMPONENT-157;Lo;0;L;;;;;N;;;;; +1889D;TANGUT COMPONENT-158;Lo;0;L;;;;;N;;;;; +1889E;TANGUT COMPONENT-159;Lo;0;L;;;;;N;;;;; +1889F;TANGUT COMPONENT-160;Lo;0;L;;;;;N;;;;; +188A0;TANGUT COMPONENT-161;Lo;0;L;;;;;N;;;;; +188A1;TANGUT COMPONENT-162;Lo;0;L;;;;;N;;;;; +188A2;TANGUT COMPONENT-163;Lo;0;L;;;;;N;;;;; +188A3;TANGUT COMPONENT-164;Lo;0;L;;;;;N;;;;; +188A4;TANGUT COMPONENT-165;Lo;0;L;;;;;N;;;;; +188A5;TANGUT COMPONENT-166;Lo;0;L;;;;;N;;;;; +188A6;TANGUT COMPONENT-167;Lo;0;L;;;;;N;;;;; +188A7;TANGUT COMPONENT-168;Lo;0;L;;;;;N;;;;; +188A8;TANGUT COMPONENT-169;Lo;0;L;;;;;N;;;;; +188A9;TANGUT COMPONENT-170;Lo;0;L;;;;;N;;;;; +188AA;TANGUT COMPONENT-171;Lo;0;L;;;;;N;;;;; +188AB;TANGUT COMPONENT-172;Lo;0;L;;;;;N;;;;; +188AC;TANGUT COMPONENT-173;Lo;0;L;;;;;N;;;;; +188AD;TANGUT COMPONENT-174;Lo;0;L;;;;;N;;;;; +188AE;TANGUT COMPONENT-175;Lo;0;L;;;;;N;;;;; +188AF;TANGUT COMPONENT-176;Lo;0;L;;;;;N;;;;; +188B0;TANGUT COMPONENT-177;Lo;0;L;;;;;N;;;;; +188B1;TANGUT COMPONENT-178;Lo;0;L;;;;;N;;;;; +188B2;TANGUT COMPONENT-179;Lo;0;L;;;;;N;;;;; +188B3;TANGUT COMPONENT-180;Lo;0;L;;;;;N;;;;; +188B4;TANGUT COMPONENT-181;Lo;0;L;;;;;N;;;;; +188B5;TANGUT COMPONENT-182;Lo;0;L;;;;;N;;;;; +188B6;TANGUT COMPONENT-183;Lo;0;L;;;;;N;;;;; +188B7;TANGUT COMPONENT-184;Lo;0;L;;;;;N;;;;; +188B8;TANGUT COMPONENT-185;Lo;0;L;;;;;N;;;;; +188B9;TANGUT COMPONENT-186;Lo;0;L;;;;;N;;;;; +188BA;TANGUT COMPONENT-187;Lo;0;L;;;;;N;;;;; +188BB;TANGUT COMPONENT-188;Lo;0;L;;;;;N;;;;; +188BC;TANGUT COMPONENT-189;Lo;0;L;;;;;N;;;;; +188BD;TANGUT COMPONENT-190;Lo;0;L;;;;;N;;;;; +188BE;TANGUT COMPONENT-191;Lo;0;L;;;;;N;;;;; +188BF;TANGUT COMPONENT-192;Lo;0;L;;;;;N;;;;; +188C0;TANGUT COMPONENT-193;Lo;0;L;;;;;N;;;;; +188C1;TANGUT COMPONENT-194;Lo;0;L;;;;;N;;;;; +188C2;TANGUT COMPONENT-195;Lo;0;L;;;;;N;;;;; +188C3;TANGUT COMPONENT-196;Lo;0;L;;;;;N;;;;; +188C4;TANGUT COMPONENT-197;Lo;0;L;;;;;N;;;;; +188C5;TANGUT COMPONENT-198;Lo;0;L;;;;;N;;;;; +188C6;TANGUT COMPONENT-199;Lo;0;L;;;;;N;;;;; +188C7;TANGUT COMPONENT-200;Lo;0;L;;;;;N;;;;; +188C8;TANGUT COMPONENT-201;Lo;0;L;;;;;N;;;;; +188C9;TANGUT COMPONENT-202;Lo;0;L;;;;;N;;;;; +188CA;TANGUT COMPONENT-203;Lo;0;L;;;;;N;;;;; +188CB;TANGUT COMPONENT-204;Lo;0;L;;;;;N;;;;; +188CC;TANGUT COMPONENT-205;Lo;0;L;;;;;N;;;;; +188CD;TANGUT COMPONENT-206;Lo;0;L;;;;;N;;;;; +188CE;TANGUT COMPONENT-207;Lo;0;L;;;;;N;;;;; +188CF;TANGUT COMPONENT-208;Lo;0;L;;;;;N;;;;; +188D0;TANGUT COMPONENT-209;Lo;0;L;;;;;N;;;;; +188D1;TANGUT COMPONENT-210;Lo;0;L;;;;;N;;;;; +188D2;TANGUT COMPONENT-211;Lo;0;L;;;;;N;;;;; +188D3;TANGUT COMPONENT-212;Lo;0;L;;;;;N;;;;; +188D4;TANGUT COMPONENT-213;Lo;0;L;;;;;N;;;;; +188D5;TANGUT COMPONENT-214;Lo;0;L;;;;;N;;;;; +188D6;TANGUT COMPONENT-215;Lo;0;L;;;;;N;;;;; +188D7;TANGUT COMPONENT-216;Lo;0;L;;;;;N;;;;; +188D8;TANGUT COMPONENT-217;Lo;0;L;;;;;N;;;;; +188D9;TANGUT COMPONENT-218;Lo;0;L;;;;;N;;;;; +188DA;TANGUT COMPONENT-219;Lo;0;L;;;;;N;;;;; +188DB;TANGUT COMPONENT-220;Lo;0;L;;;;;N;;;;; +188DC;TANGUT COMPONENT-221;Lo;0;L;;;;;N;;;;; +188DD;TANGUT COMPONENT-222;Lo;0;L;;;;;N;;;;; +188DE;TANGUT COMPONENT-223;Lo;0;L;;;;;N;;;;; +188DF;TANGUT COMPONENT-224;Lo;0;L;;;;;N;;;;; +188E0;TANGUT COMPONENT-225;Lo;0;L;;;;;N;;;;; +188E1;TANGUT COMPONENT-226;Lo;0;L;;;;;N;;;;; +188E2;TANGUT COMPONENT-227;Lo;0;L;;;;;N;;;;; +188E3;TANGUT COMPONENT-228;Lo;0;L;;;;;N;;;;; +188E4;TANGUT COMPONENT-229;Lo;0;L;;;;;N;;;;; +188E5;TANGUT COMPONENT-230;Lo;0;L;;;;;N;;;;; +188E6;TANGUT COMPONENT-231;Lo;0;L;;;;;N;;;;; +188E7;TANGUT COMPONENT-232;Lo;0;L;;;;;N;;;;; +188E8;TANGUT COMPONENT-233;Lo;0;L;;;;;N;;;;; +188E9;TANGUT COMPONENT-234;Lo;0;L;;;;;N;;;;; +188EA;TANGUT COMPONENT-235;Lo;0;L;;;;;N;;;;; +188EB;TANGUT COMPONENT-236;Lo;0;L;;;;;N;;;;; +188EC;TANGUT COMPONENT-237;Lo;0;L;;;;;N;;;;; +188ED;TANGUT COMPONENT-238;Lo;0;L;;;;;N;;;;; +188EE;TANGUT COMPONENT-239;Lo;0;L;;;;;N;;;;; +188EF;TANGUT COMPONENT-240;Lo;0;L;;;;;N;;;;; +188F0;TANGUT COMPONENT-241;Lo;0;L;;;;;N;;;;; +188F1;TANGUT COMPONENT-242;Lo;0;L;;;;;N;;;;; +188F2;TANGUT COMPONENT-243;Lo;0;L;;;;;N;;;;; +188F3;TANGUT COMPONENT-244;Lo;0;L;;;;;N;;;;; +188F4;TANGUT COMPONENT-245;Lo;0;L;;;;;N;;;;; +188F5;TANGUT COMPONENT-246;Lo;0;L;;;;;N;;;;; +188F6;TANGUT COMPONENT-247;Lo;0;L;;;;;N;;;;; +188F7;TANGUT COMPONENT-248;Lo;0;L;;;;;N;;;;; +188F8;TANGUT COMPONENT-249;Lo;0;L;;;;;N;;;;; +188F9;TANGUT COMPONENT-250;Lo;0;L;;;;;N;;;;; +188FA;TANGUT COMPONENT-251;Lo;0;L;;;;;N;;;;; +188FB;TANGUT COMPONENT-252;Lo;0;L;;;;;N;;;;; +188FC;TANGUT COMPONENT-253;Lo;0;L;;;;;N;;;;; +188FD;TANGUT COMPONENT-254;Lo;0;L;;;;;N;;;;; +188FE;TANGUT COMPONENT-255;Lo;0;L;;;;;N;;;;; +188FF;TANGUT COMPONENT-256;Lo;0;L;;;;;N;;;;; +18900;TANGUT COMPONENT-257;Lo;0;L;;;;;N;;;;; +18901;TANGUT COMPONENT-258;Lo;0;L;;;;;N;;;;; +18902;TANGUT COMPONENT-259;Lo;0;L;;;;;N;;;;; +18903;TANGUT COMPONENT-260;Lo;0;L;;;;;N;;;;; +18904;TANGUT COMPONENT-261;Lo;0;L;;;;;N;;;;; +18905;TANGUT COMPONENT-262;Lo;0;L;;;;;N;;;;; +18906;TANGUT COMPONENT-263;Lo;0;L;;;;;N;;;;; +18907;TANGUT COMPONENT-264;Lo;0;L;;;;;N;;;;; +18908;TANGUT COMPONENT-265;Lo;0;L;;;;;N;;;;; +18909;TANGUT COMPONENT-266;Lo;0;L;;;;;N;;;;; +1890A;TANGUT COMPONENT-267;Lo;0;L;;;;;N;;;;; +1890B;TANGUT COMPONENT-268;Lo;0;L;;;;;N;;;;; +1890C;TANGUT COMPONENT-269;Lo;0;L;;;;;N;;;;; +1890D;TANGUT COMPONENT-270;Lo;0;L;;;;;N;;;;; +1890E;TANGUT COMPONENT-271;Lo;0;L;;;;;N;;;;; +1890F;TANGUT COMPONENT-272;Lo;0;L;;;;;N;;;;; +18910;TANGUT COMPONENT-273;Lo;0;L;;;;;N;;;;; +18911;TANGUT COMPONENT-274;Lo;0;L;;;;;N;;;;; +18912;TANGUT COMPONENT-275;Lo;0;L;;;;;N;;;;; +18913;TANGUT COMPONENT-276;Lo;0;L;;;;;N;;;;; +18914;TANGUT COMPONENT-277;Lo;0;L;;;;;N;;;;; +18915;TANGUT COMPONENT-278;Lo;0;L;;;;;N;;;;; +18916;TANGUT COMPONENT-279;Lo;0;L;;;;;N;;;;; +18917;TANGUT COMPONENT-280;Lo;0;L;;;;;N;;;;; +18918;TANGUT COMPONENT-281;Lo;0;L;;;;;N;;;;; +18919;TANGUT COMPONENT-282;Lo;0;L;;;;;N;;;;; +1891A;TANGUT COMPONENT-283;Lo;0;L;;;;;N;;;;; +1891B;TANGUT COMPONENT-284;Lo;0;L;;;;;N;;;;; +1891C;TANGUT COMPONENT-285;Lo;0;L;;;;;N;;;;; +1891D;TANGUT COMPONENT-286;Lo;0;L;;;;;N;;;;; +1891E;TANGUT COMPONENT-287;Lo;0;L;;;;;N;;;;; +1891F;TANGUT COMPONENT-288;Lo;0;L;;;;;N;;;;; +18920;TANGUT COMPONENT-289;Lo;0;L;;;;;N;;;;; +18921;TANGUT COMPONENT-290;Lo;0;L;;;;;N;;;;; +18922;TANGUT COMPONENT-291;Lo;0;L;;;;;N;;;;; +18923;TANGUT COMPONENT-292;Lo;0;L;;;;;N;;;;; +18924;TANGUT COMPONENT-293;Lo;0;L;;;;;N;;;;; +18925;TANGUT COMPONENT-294;Lo;0;L;;;;;N;;;;; +18926;TANGUT COMPONENT-295;Lo;0;L;;;;;N;;;;; +18927;TANGUT COMPONENT-296;Lo;0;L;;;;;N;;;;; +18928;TANGUT COMPONENT-297;Lo;0;L;;;;;N;;;;; +18929;TANGUT COMPONENT-298;Lo;0;L;;;;;N;;;;; +1892A;TANGUT COMPONENT-299;Lo;0;L;;;;;N;;;;; +1892B;TANGUT COMPONENT-300;Lo;0;L;;;;;N;;;;; +1892C;TANGUT COMPONENT-301;Lo;0;L;;;;;N;;;;; +1892D;TANGUT COMPONENT-302;Lo;0;L;;;;;N;;;;; +1892E;TANGUT COMPONENT-303;Lo;0;L;;;;;N;;;;; +1892F;TANGUT COMPONENT-304;Lo;0;L;;;;;N;;;;; +18930;TANGUT COMPONENT-305;Lo;0;L;;;;;N;;;;; +18931;TANGUT COMPONENT-306;Lo;0;L;;;;;N;;;;; +18932;TANGUT COMPONENT-307;Lo;0;L;;;;;N;;;;; +18933;TANGUT COMPONENT-308;Lo;0;L;;;;;N;;;;; +18934;TANGUT COMPONENT-309;Lo;0;L;;;;;N;;;;; +18935;TANGUT COMPONENT-310;Lo;0;L;;;;;N;;;;; +18936;TANGUT COMPONENT-311;Lo;0;L;;;;;N;;;;; +18937;TANGUT COMPONENT-312;Lo;0;L;;;;;N;;;;; +18938;TANGUT COMPONENT-313;Lo;0;L;;;;;N;;;;; +18939;TANGUT COMPONENT-314;Lo;0;L;;;;;N;;;;; +1893A;TANGUT COMPONENT-315;Lo;0;L;;;;;N;;;;; +1893B;TANGUT COMPONENT-316;Lo;0;L;;;;;N;;;;; +1893C;TANGUT COMPONENT-317;Lo;0;L;;;;;N;;;;; +1893D;TANGUT COMPONENT-318;Lo;0;L;;;;;N;;;;; +1893E;TANGUT COMPONENT-319;Lo;0;L;;;;;N;;;;; +1893F;TANGUT COMPONENT-320;Lo;0;L;;;;;N;;;;; +18940;TANGUT COMPONENT-321;Lo;0;L;;;;;N;;;;; +18941;TANGUT COMPONENT-322;Lo;0;L;;;;;N;;;;; +18942;TANGUT COMPONENT-323;Lo;0;L;;;;;N;;;;; +18943;TANGUT COMPONENT-324;Lo;0;L;;;;;N;;;;; +18944;TANGUT COMPONENT-325;Lo;0;L;;;;;N;;;;; +18945;TANGUT COMPONENT-326;Lo;0;L;;;;;N;;;;; +18946;TANGUT COMPONENT-327;Lo;0;L;;;;;N;;;;; +18947;TANGUT COMPONENT-328;Lo;0;L;;;;;N;;;;; +18948;TANGUT COMPONENT-329;Lo;0;L;;;;;N;;;;; +18949;TANGUT COMPONENT-330;Lo;0;L;;;;;N;;;;; +1894A;TANGUT COMPONENT-331;Lo;0;L;;;;;N;;;;; +1894B;TANGUT COMPONENT-332;Lo;0;L;;;;;N;;;;; +1894C;TANGUT COMPONENT-333;Lo;0;L;;;;;N;;;;; +1894D;TANGUT COMPONENT-334;Lo;0;L;;;;;N;;;;; +1894E;TANGUT COMPONENT-335;Lo;0;L;;;;;N;;;;; +1894F;TANGUT COMPONENT-336;Lo;0;L;;;;;N;;;;; +18950;TANGUT COMPONENT-337;Lo;0;L;;;;;N;;;;; +18951;TANGUT COMPONENT-338;Lo;0;L;;;;;N;;;;; +18952;TANGUT COMPONENT-339;Lo;0;L;;;;;N;;;;; +18953;TANGUT COMPONENT-340;Lo;0;L;;;;;N;;;;; +18954;TANGUT COMPONENT-341;Lo;0;L;;;;;N;;;;; +18955;TANGUT COMPONENT-342;Lo;0;L;;;;;N;;;;; +18956;TANGUT COMPONENT-343;Lo;0;L;;;;;N;;;;; +18957;TANGUT COMPONENT-344;Lo;0;L;;;;;N;;;;; +18958;TANGUT COMPONENT-345;Lo;0;L;;;;;N;;;;; +18959;TANGUT COMPONENT-346;Lo;0;L;;;;;N;;;;; +1895A;TANGUT COMPONENT-347;Lo;0;L;;;;;N;;;;; +1895B;TANGUT COMPONENT-348;Lo;0;L;;;;;N;;;;; +1895C;TANGUT COMPONENT-349;Lo;0;L;;;;;N;;;;; +1895D;TANGUT COMPONENT-350;Lo;0;L;;;;;N;;;;; +1895E;TANGUT COMPONENT-351;Lo;0;L;;;;;N;;;;; +1895F;TANGUT COMPONENT-352;Lo;0;L;;;;;N;;;;; +18960;TANGUT COMPONENT-353;Lo;0;L;;;;;N;;;;; +18961;TANGUT COMPONENT-354;Lo;0;L;;;;;N;;;;; +18962;TANGUT COMPONENT-355;Lo;0;L;;;;;N;;;;; +18963;TANGUT COMPONENT-356;Lo;0;L;;;;;N;;;;; +18964;TANGUT COMPONENT-357;Lo;0;L;;;;;N;;;;; +18965;TANGUT COMPONENT-358;Lo;0;L;;;;;N;;;;; +18966;TANGUT COMPONENT-359;Lo;0;L;;;;;N;;;;; +18967;TANGUT COMPONENT-360;Lo;0;L;;;;;N;;;;; +18968;TANGUT COMPONENT-361;Lo;0;L;;;;;N;;;;; +18969;TANGUT COMPONENT-362;Lo;0;L;;;;;N;;;;; +1896A;TANGUT COMPONENT-363;Lo;0;L;;;;;N;;;;; +1896B;TANGUT COMPONENT-364;Lo;0;L;;;;;N;;;;; +1896C;TANGUT COMPONENT-365;Lo;0;L;;;;;N;;;;; +1896D;TANGUT COMPONENT-366;Lo;0;L;;;;;N;;;;; +1896E;TANGUT COMPONENT-367;Lo;0;L;;;;;N;;;;; +1896F;TANGUT COMPONENT-368;Lo;0;L;;;;;N;;;;; +18970;TANGUT COMPONENT-369;Lo;0;L;;;;;N;;;;; +18971;TANGUT COMPONENT-370;Lo;0;L;;;;;N;;;;; +18972;TANGUT COMPONENT-371;Lo;0;L;;;;;N;;;;; +18973;TANGUT COMPONENT-372;Lo;0;L;;;;;N;;;;; +18974;TANGUT COMPONENT-373;Lo;0;L;;;;;N;;;;; +18975;TANGUT COMPONENT-374;Lo;0;L;;;;;N;;;;; +18976;TANGUT COMPONENT-375;Lo;0;L;;;;;N;;;;; +18977;TANGUT COMPONENT-376;Lo;0;L;;;;;N;;;;; +18978;TANGUT COMPONENT-377;Lo;0;L;;;;;N;;;;; +18979;TANGUT COMPONENT-378;Lo;0;L;;;;;N;;;;; +1897A;TANGUT COMPONENT-379;Lo;0;L;;;;;N;;;;; +1897B;TANGUT COMPONENT-380;Lo;0;L;;;;;N;;;;; +1897C;TANGUT COMPONENT-381;Lo;0;L;;;;;N;;;;; +1897D;TANGUT COMPONENT-382;Lo;0;L;;;;;N;;;;; +1897E;TANGUT COMPONENT-383;Lo;0;L;;;;;N;;;;; +1897F;TANGUT COMPONENT-384;Lo;0;L;;;;;N;;;;; +18980;TANGUT COMPONENT-385;Lo;0;L;;;;;N;;;;; +18981;TANGUT COMPONENT-386;Lo;0;L;;;;;N;;;;; +18982;TANGUT COMPONENT-387;Lo;0;L;;;;;N;;;;; +18983;TANGUT COMPONENT-388;Lo;0;L;;;;;N;;;;; +18984;TANGUT COMPONENT-389;Lo;0;L;;;;;N;;;;; +18985;TANGUT COMPONENT-390;Lo;0;L;;;;;N;;;;; +18986;TANGUT COMPONENT-391;Lo;0;L;;;;;N;;;;; +18987;TANGUT COMPONENT-392;Lo;0;L;;;;;N;;;;; +18988;TANGUT COMPONENT-393;Lo;0;L;;;;;N;;;;; +18989;TANGUT COMPONENT-394;Lo;0;L;;;;;N;;;;; +1898A;TANGUT COMPONENT-395;Lo;0;L;;;;;N;;;;; +1898B;TANGUT COMPONENT-396;Lo;0;L;;;;;N;;;;; +1898C;TANGUT COMPONENT-397;Lo;0;L;;;;;N;;;;; +1898D;TANGUT COMPONENT-398;Lo;0;L;;;;;N;;;;; +1898E;TANGUT COMPONENT-399;Lo;0;L;;;;;N;;;;; +1898F;TANGUT COMPONENT-400;Lo;0;L;;;;;N;;;;; +18990;TANGUT COMPONENT-401;Lo;0;L;;;;;N;;;;; +18991;TANGUT COMPONENT-402;Lo;0;L;;;;;N;;;;; +18992;TANGUT COMPONENT-403;Lo;0;L;;;;;N;;;;; +18993;TANGUT COMPONENT-404;Lo;0;L;;;;;N;;;;; +18994;TANGUT COMPONENT-405;Lo;0;L;;;;;N;;;;; +18995;TANGUT COMPONENT-406;Lo;0;L;;;;;N;;;;; +18996;TANGUT COMPONENT-407;Lo;0;L;;;;;N;;;;; +18997;TANGUT COMPONENT-408;Lo;0;L;;;;;N;;;;; +18998;TANGUT COMPONENT-409;Lo;0;L;;;;;N;;;;; +18999;TANGUT COMPONENT-410;Lo;0;L;;;;;N;;;;; +1899A;TANGUT COMPONENT-411;Lo;0;L;;;;;N;;;;; +1899B;TANGUT COMPONENT-412;Lo;0;L;;;;;N;;;;; +1899C;TANGUT COMPONENT-413;Lo;0;L;;;;;N;;;;; +1899D;TANGUT COMPONENT-414;Lo;0;L;;;;;N;;;;; +1899E;TANGUT COMPONENT-415;Lo;0;L;;;;;N;;;;; +1899F;TANGUT COMPONENT-416;Lo;0;L;;;;;N;;;;; +189A0;TANGUT COMPONENT-417;Lo;0;L;;;;;N;;;;; +189A1;TANGUT COMPONENT-418;Lo;0;L;;;;;N;;;;; +189A2;TANGUT COMPONENT-419;Lo;0;L;;;;;N;;;;; +189A3;TANGUT COMPONENT-420;Lo;0;L;;;;;N;;;;; +189A4;TANGUT COMPONENT-421;Lo;0;L;;;;;N;;;;; +189A5;TANGUT COMPONENT-422;Lo;0;L;;;;;N;;;;; +189A6;TANGUT COMPONENT-423;Lo;0;L;;;;;N;;;;; +189A7;TANGUT COMPONENT-424;Lo;0;L;;;;;N;;;;; +189A8;TANGUT COMPONENT-425;Lo;0;L;;;;;N;;;;; +189A9;TANGUT COMPONENT-426;Lo;0;L;;;;;N;;;;; +189AA;TANGUT COMPONENT-427;Lo;0;L;;;;;N;;;;; +189AB;TANGUT COMPONENT-428;Lo;0;L;;;;;N;;;;; +189AC;TANGUT COMPONENT-429;Lo;0;L;;;;;N;;;;; +189AD;TANGUT COMPONENT-430;Lo;0;L;;;;;N;;;;; +189AE;TANGUT COMPONENT-431;Lo;0;L;;;;;N;;;;; +189AF;TANGUT COMPONENT-432;Lo;0;L;;;;;N;;;;; +189B0;TANGUT COMPONENT-433;Lo;0;L;;;;;N;;;;; +189B1;TANGUT COMPONENT-434;Lo;0;L;;;;;N;;;;; +189B2;TANGUT COMPONENT-435;Lo;0;L;;;;;N;;;;; +189B3;TANGUT COMPONENT-436;Lo;0;L;;;;;N;;;;; +189B4;TANGUT COMPONENT-437;Lo;0;L;;;;;N;;;;; +189B5;TANGUT COMPONENT-438;Lo;0;L;;;;;N;;;;; +189B6;TANGUT COMPONENT-439;Lo;0;L;;;;;N;;;;; +189B7;TANGUT COMPONENT-440;Lo;0;L;;;;;N;;;;; +189B8;TANGUT COMPONENT-441;Lo;0;L;;;;;N;;;;; +189B9;TANGUT COMPONENT-442;Lo;0;L;;;;;N;;;;; +189BA;TANGUT COMPONENT-443;Lo;0;L;;;;;N;;;;; +189BB;TANGUT COMPONENT-444;Lo;0;L;;;;;N;;;;; +189BC;TANGUT COMPONENT-445;Lo;0;L;;;;;N;;;;; +189BD;TANGUT COMPONENT-446;Lo;0;L;;;;;N;;;;; +189BE;TANGUT COMPONENT-447;Lo;0;L;;;;;N;;;;; +189BF;TANGUT COMPONENT-448;Lo;0;L;;;;;N;;;;; +189C0;TANGUT COMPONENT-449;Lo;0;L;;;;;N;;;;; +189C1;TANGUT COMPONENT-450;Lo;0;L;;;;;N;;;;; +189C2;TANGUT COMPONENT-451;Lo;0;L;;;;;N;;;;; +189C3;TANGUT COMPONENT-452;Lo;0;L;;;;;N;;;;; +189C4;TANGUT COMPONENT-453;Lo;0;L;;;;;N;;;;; +189C5;TANGUT COMPONENT-454;Lo;0;L;;;;;N;;;;; +189C6;TANGUT COMPONENT-455;Lo;0;L;;;;;N;;;;; +189C7;TANGUT COMPONENT-456;Lo;0;L;;;;;N;;;;; +189C8;TANGUT COMPONENT-457;Lo;0;L;;;;;N;;;;; +189C9;TANGUT COMPONENT-458;Lo;0;L;;;;;N;;;;; +189CA;TANGUT COMPONENT-459;Lo;0;L;;;;;N;;;;; +189CB;TANGUT COMPONENT-460;Lo;0;L;;;;;N;;;;; +189CC;TANGUT COMPONENT-461;Lo;0;L;;;;;N;;;;; +189CD;TANGUT COMPONENT-462;Lo;0;L;;;;;N;;;;; +189CE;TANGUT COMPONENT-463;Lo;0;L;;;;;N;;;;; +189CF;TANGUT COMPONENT-464;Lo;0;L;;;;;N;;;;; +189D0;TANGUT COMPONENT-465;Lo;0;L;;;;;N;;;;; +189D1;TANGUT COMPONENT-466;Lo;0;L;;;;;N;;;;; +189D2;TANGUT COMPONENT-467;Lo;0;L;;;;;N;;;;; +189D3;TANGUT COMPONENT-468;Lo;0;L;;;;;N;;;;; +189D4;TANGUT COMPONENT-469;Lo;0;L;;;;;N;;;;; +189D5;TANGUT COMPONENT-470;Lo;0;L;;;;;N;;;;; +189D6;TANGUT COMPONENT-471;Lo;0;L;;;;;N;;;;; +189D7;TANGUT COMPONENT-472;Lo;0;L;;;;;N;;;;; +189D8;TANGUT COMPONENT-473;Lo;0;L;;;;;N;;;;; +189D9;TANGUT COMPONENT-474;Lo;0;L;;;;;N;;;;; +189DA;TANGUT COMPONENT-475;Lo;0;L;;;;;N;;;;; +189DB;TANGUT COMPONENT-476;Lo;0;L;;;;;N;;;;; +189DC;TANGUT COMPONENT-477;Lo;0;L;;;;;N;;;;; +189DD;TANGUT COMPONENT-478;Lo;0;L;;;;;N;;;;; +189DE;TANGUT COMPONENT-479;Lo;0;L;;;;;N;;;;; +189DF;TANGUT COMPONENT-480;Lo;0;L;;;;;N;;;;; +189E0;TANGUT COMPONENT-481;Lo;0;L;;;;;N;;;;; +189E1;TANGUT COMPONENT-482;Lo;0;L;;;;;N;;;;; +189E2;TANGUT COMPONENT-483;Lo;0;L;;;;;N;;;;; +189E3;TANGUT COMPONENT-484;Lo;0;L;;;;;N;;;;; +189E4;TANGUT COMPONENT-485;Lo;0;L;;;;;N;;;;; +189E5;TANGUT COMPONENT-486;Lo;0;L;;;;;N;;;;; +189E6;TANGUT COMPONENT-487;Lo;0;L;;;;;N;;;;; +189E7;TANGUT COMPONENT-488;Lo;0;L;;;;;N;;;;; +189E8;TANGUT COMPONENT-489;Lo;0;L;;;;;N;;;;; +189E9;TANGUT COMPONENT-490;Lo;0;L;;;;;N;;;;; +189EA;TANGUT COMPONENT-491;Lo;0;L;;;;;N;;;;; +189EB;TANGUT COMPONENT-492;Lo;0;L;;;;;N;;;;; +189EC;TANGUT COMPONENT-493;Lo;0;L;;;;;N;;;;; +189ED;TANGUT COMPONENT-494;Lo;0;L;;;;;N;;;;; +189EE;TANGUT COMPONENT-495;Lo;0;L;;;;;N;;;;; +189EF;TANGUT COMPONENT-496;Lo;0;L;;;;;N;;;;; +189F0;TANGUT COMPONENT-497;Lo;0;L;;;;;N;;;;; +189F1;TANGUT COMPONENT-498;Lo;0;L;;;;;N;;;;; +189F2;TANGUT COMPONENT-499;Lo;0;L;;;;;N;;;;; +189F3;TANGUT COMPONENT-500;Lo;0;L;;;;;N;;;;; +189F4;TANGUT COMPONENT-501;Lo;0;L;;;;;N;;;;; +189F5;TANGUT COMPONENT-502;Lo;0;L;;;;;N;;;;; +189F6;TANGUT COMPONENT-503;Lo;0;L;;;;;N;;;;; +189F7;TANGUT COMPONENT-504;Lo;0;L;;;;;N;;;;; +189F8;TANGUT COMPONENT-505;Lo;0;L;;;;;N;;;;; +189F9;TANGUT COMPONENT-506;Lo;0;L;;;;;N;;;;; +189FA;TANGUT COMPONENT-507;Lo;0;L;;;;;N;;;;; +189FB;TANGUT COMPONENT-508;Lo;0;L;;;;;N;;;;; +189FC;TANGUT COMPONENT-509;Lo;0;L;;;;;N;;;;; +189FD;TANGUT COMPONENT-510;Lo;0;L;;;;;N;;;;; +189FE;TANGUT COMPONENT-511;Lo;0;L;;;;;N;;;;; +189FF;TANGUT COMPONENT-512;Lo;0;L;;;;;N;;;;; +18A00;TANGUT COMPONENT-513;Lo;0;L;;;;;N;;;;; +18A01;TANGUT COMPONENT-514;Lo;0;L;;;;;N;;;;; +18A02;TANGUT COMPONENT-515;Lo;0;L;;;;;N;;;;; +18A03;TANGUT COMPONENT-516;Lo;0;L;;;;;N;;;;; +18A04;TANGUT COMPONENT-517;Lo;0;L;;;;;N;;;;; +18A05;TANGUT COMPONENT-518;Lo;0;L;;;;;N;;;;; +18A06;TANGUT COMPONENT-519;Lo;0;L;;;;;N;;;;; +18A07;TANGUT COMPONENT-520;Lo;0;L;;;;;N;;;;; +18A08;TANGUT COMPONENT-521;Lo;0;L;;;;;N;;;;; +18A09;TANGUT COMPONENT-522;Lo;0;L;;;;;N;;;;; +18A0A;TANGUT COMPONENT-523;Lo;0;L;;;;;N;;;;; +18A0B;TANGUT COMPONENT-524;Lo;0;L;;;;;N;;;;; +18A0C;TANGUT COMPONENT-525;Lo;0;L;;;;;N;;;;; +18A0D;TANGUT COMPONENT-526;Lo;0;L;;;;;N;;;;; +18A0E;TANGUT COMPONENT-527;Lo;0;L;;;;;N;;;;; +18A0F;TANGUT COMPONENT-528;Lo;0;L;;;;;N;;;;; +18A10;TANGUT COMPONENT-529;Lo;0;L;;;;;N;;;;; +18A11;TANGUT COMPONENT-530;Lo;0;L;;;;;N;;;;; +18A12;TANGUT COMPONENT-531;Lo;0;L;;;;;N;;;;; +18A13;TANGUT COMPONENT-532;Lo;0;L;;;;;N;;;;; +18A14;TANGUT COMPONENT-533;Lo;0;L;;;;;N;;;;; +18A15;TANGUT COMPONENT-534;Lo;0;L;;;;;N;;;;; +18A16;TANGUT COMPONENT-535;Lo;0;L;;;;;N;;;;; +18A17;TANGUT COMPONENT-536;Lo;0;L;;;;;N;;;;; +18A18;TANGUT COMPONENT-537;Lo;0;L;;;;;N;;;;; +18A19;TANGUT COMPONENT-538;Lo;0;L;;;;;N;;;;; +18A1A;TANGUT COMPONENT-539;Lo;0;L;;;;;N;;;;; +18A1B;TANGUT COMPONENT-540;Lo;0;L;;;;;N;;;;; +18A1C;TANGUT COMPONENT-541;Lo;0;L;;;;;N;;;;; +18A1D;TANGUT COMPONENT-542;Lo;0;L;;;;;N;;;;; +18A1E;TANGUT COMPONENT-543;Lo;0;L;;;;;N;;;;; +18A1F;TANGUT COMPONENT-544;Lo;0;L;;;;;N;;;;; +18A20;TANGUT COMPONENT-545;Lo;0;L;;;;;N;;;;; +18A21;TANGUT COMPONENT-546;Lo;0;L;;;;;N;;;;; +18A22;TANGUT COMPONENT-547;Lo;0;L;;;;;N;;;;; +18A23;TANGUT COMPONENT-548;Lo;0;L;;;;;N;;;;; +18A24;TANGUT COMPONENT-549;Lo;0;L;;;;;N;;;;; +18A25;TANGUT COMPONENT-550;Lo;0;L;;;;;N;;;;; +18A26;TANGUT COMPONENT-551;Lo;0;L;;;;;N;;;;; +18A27;TANGUT COMPONENT-552;Lo;0;L;;;;;N;;;;; +18A28;TANGUT COMPONENT-553;Lo;0;L;;;;;N;;;;; +18A29;TANGUT COMPONENT-554;Lo;0;L;;;;;N;;;;; +18A2A;TANGUT COMPONENT-555;Lo;0;L;;;;;N;;;;; +18A2B;TANGUT COMPONENT-556;Lo;0;L;;;;;N;;;;; +18A2C;TANGUT COMPONENT-557;Lo;0;L;;;;;N;;;;; +18A2D;TANGUT COMPONENT-558;Lo;0;L;;;;;N;;;;; +18A2E;TANGUT COMPONENT-559;Lo;0;L;;;;;N;;;;; +18A2F;TANGUT COMPONENT-560;Lo;0;L;;;;;N;;;;; +18A30;TANGUT COMPONENT-561;Lo;0;L;;;;;N;;;;; +18A31;TANGUT COMPONENT-562;Lo;0;L;;;;;N;;;;; +18A32;TANGUT COMPONENT-563;Lo;0;L;;;;;N;;;;; +18A33;TANGUT COMPONENT-564;Lo;0;L;;;;;N;;;;; +18A34;TANGUT COMPONENT-565;Lo;0;L;;;;;N;;;;; +18A35;TANGUT COMPONENT-566;Lo;0;L;;;;;N;;;;; +18A36;TANGUT COMPONENT-567;Lo;0;L;;;;;N;;;;; +18A37;TANGUT COMPONENT-568;Lo;0;L;;;;;N;;;;; +18A38;TANGUT COMPONENT-569;Lo;0;L;;;;;N;;;;; +18A39;TANGUT COMPONENT-570;Lo;0;L;;;;;N;;;;; +18A3A;TANGUT COMPONENT-571;Lo;0;L;;;;;N;;;;; +18A3B;TANGUT COMPONENT-572;Lo;0;L;;;;;N;;;;; +18A3C;TANGUT COMPONENT-573;Lo;0;L;;;;;N;;;;; +18A3D;TANGUT COMPONENT-574;Lo;0;L;;;;;N;;;;; +18A3E;TANGUT COMPONENT-575;Lo;0;L;;;;;N;;;;; +18A3F;TANGUT COMPONENT-576;Lo;0;L;;;;;N;;;;; +18A40;TANGUT COMPONENT-577;Lo;0;L;;;;;N;;;;; +18A41;TANGUT COMPONENT-578;Lo;0;L;;;;;N;;;;; +18A42;TANGUT COMPONENT-579;Lo;0;L;;;;;N;;;;; +18A43;TANGUT COMPONENT-580;Lo;0;L;;;;;N;;;;; +18A44;TANGUT COMPONENT-581;Lo;0;L;;;;;N;;;;; +18A45;TANGUT COMPONENT-582;Lo;0;L;;;;;N;;;;; +18A46;TANGUT COMPONENT-583;Lo;0;L;;;;;N;;;;; +18A47;TANGUT COMPONENT-584;Lo;0;L;;;;;N;;;;; +18A48;TANGUT COMPONENT-585;Lo;0;L;;;;;N;;;;; +18A49;TANGUT COMPONENT-586;Lo;0;L;;;;;N;;;;; +18A4A;TANGUT COMPONENT-587;Lo;0;L;;;;;N;;;;; +18A4B;TANGUT COMPONENT-588;Lo;0;L;;;;;N;;;;; +18A4C;TANGUT COMPONENT-589;Lo;0;L;;;;;N;;;;; +18A4D;TANGUT COMPONENT-590;Lo;0;L;;;;;N;;;;; +18A4E;TANGUT COMPONENT-591;Lo;0;L;;;;;N;;;;; +18A4F;TANGUT COMPONENT-592;Lo;0;L;;;;;N;;;;; +18A50;TANGUT COMPONENT-593;Lo;0;L;;;;;N;;;;; +18A51;TANGUT COMPONENT-594;Lo;0;L;;;;;N;;;;; +18A52;TANGUT COMPONENT-595;Lo;0;L;;;;;N;;;;; +18A53;TANGUT COMPONENT-596;Lo;0;L;;;;;N;;;;; +18A54;TANGUT COMPONENT-597;Lo;0;L;;;;;N;;;;; +18A55;TANGUT COMPONENT-598;Lo;0;L;;;;;N;;;;; +18A56;TANGUT COMPONENT-599;Lo;0;L;;;;;N;;;;; +18A57;TANGUT COMPONENT-600;Lo;0;L;;;;;N;;;;; +18A58;TANGUT COMPONENT-601;Lo;0;L;;;;;N;;;;; +18A59;TANGUT COMPONENT-602;Lo;0;L;;;;;N;;;;; +18A5A;TANGUT COMPONENT-603;Lo;0;L;;;;;N;;;;; +18A5B;TANGUT COMPONENT-604;Lo;0;L;;;;;N;;;;; +18A5C;TANGUT COMPONENT-605;Lo;0;L;;;;;N;;;;; +18A5D;TANGUT COMPONENT-606;Lo;0;L;;;;;N;;;;; +18A5E;TANGUT COMPONENT-607;Lo;0;L;;;;;N;;;;; +18A5F;TANGUT COMPONENT-608;Lo;0;L;;;;;N;;;;; +18A60;TANGUT COMPONENT-609;Lo;0;L;;;;;N;;;;; +18A61;TANGUT COMPONENT-610;Lo;0;L;;;;;N;;;;; +18A62;TANGUT COMPONENT-611;Lo;0;L;;;;;N;;;;; +18A63;TANGUT COMPONENT-612;Lo;0;L;;;;;N;;;;; +18A64;TANGUT COMPONENT-613;Lo;0;L;;;;;N;;;;; +18A65;TANGUT COMPONENT-614;Lo;0;L;;;;;N;;;;; +18A66;TANGUT COMPONENT-615;Lo;0;L;;;;;N;;;;; +18A67;TANGUT COMPONENT-616;Lo;0;L;;;;;N;;;;; +18A68;TANGUT COMPONENT-617;Lo;0;L;;;;;N;;;;; +18A69;TANGUT COMPONENT-618;Lo;0;L;;;;;N;;;;; +18A6A;TANGUT COMPONENT-619;Lo;0;L;;;;;N;;;;; +18A6B;TANGUT COMPONENT-620;Lo;0;L;;;;;N;;;;; +18A6C;TANGUT COMPONENT-621;Lo;0;L;;;;;N;;;;; +18A6D;TANGUT COMPONENT-622;Lo;0;L;;;;;N;;;;; +18A6E;TANGUT COMPONENT-623;Lo;0;L;;;;;N;;;;; +18A6F;TANGUT COMPONENT-624;Lo;0;L;;;;;N;;;;; +18A70;TANGUT COMPONENT-625;Lo;0;L;;;;;N;;;;; +18A71;TANGUT COMPONENT-626;Lo;0;L;;;;;N;;;;; +18A72;TANGUT COMPONENT-627;Lo;0;L;;;;;N;;;;; +18A73;TANGUT COMPONENT-628;Lo;0;L;;;;;N;;;;; +18A74;TANGUT COMPONENT-629;Lo;0;L;;;;;N;;;;; +18A75;TANGUT COMPONENT-630;Lo;0;L;;;;;N;;;;; +18A76;TANGUT COMPONENT-631;Lo;0;L;;;;;N;;;;; +18A77;TANGUT COMPONENT-632;Lo;0;L;;;;;N;;;;; +18A78;TANGUT COMPONENT-633;Lo;0;L;;;;;N;;;;; +18A79;TANGUT COMPONENT-634;Lo;0;L;;;;;N;;;;; +18A7A;TANGUT COMPONENT-635;Lo;0;L;;;;;N;;;;; +18A7B;TANGUT COMPONENT-636;Lo;0;L;;;;;N;;;;; +18A7C;TANGUT COMPONENT-637;Lo;0;L;;;;;N;;;;; +18A7D;TANGUT COMPONENT-638;Lo;0;L;;;;;N;;;;; +18A7E;TANGUT COMPONENT-639;Lo;0;L;;;;;N;;;;; +18A7F;TANGUT COMPONENT-640;Lo;0;L;;;;;N;;;;; +18A80;TANGUT COMPONENT-641;Lo;0;L;;;;;N;;;;; +18A81;TANGUT COMPONENT-642;Lo;0;L;;;;;N;;;;; +18A82;TANGUT COMPONENT-643;Lo;0;L;;;;;N;;;;; +18A83;TANGUT COMPONENT-644;Lo;0;L;;;;;N;;;;; +18A84;TANGUT COMPONENT-645;Lo;0;L;;;;;N;;;;; +18A85;TANGUT COMPONENT-646;Lo;0;L;;;;;N;;;;; +18A86;TANGUT COMPONENT-647;Lo;0;L;;;;;N;;;;; +18A87;TANGUT COMPONENT-648;Lo;0;L;;;;;N;;;;; +18A88;TANGUT COMPONENT-649;Lo;0;L;;;;;N;;;;; +18A89;TANGUT COMPONENT-650;Lo;0;L;;;;;N;;;;; +18A8A;TANGUT COMPONENT-651;Lo;0;L;;;;;N;;;;; +18A8B;TANGUT COMPONENT-652;Lo;0;L;;;;;N;;;;; +18A8C;TANGUT COMPONENT-653;Lo;0;L;;;;;N;;;;; +18A8D;TANGUT COMPONENT-654;Lo;0;L;;;;;N;;;;; +18A8E;TANGUT COMPONENT-655;Lo;0;L;;;;;N;;;;; +18A8F;TANGUT COMPONENT-656;Lo;0;L;;;;;N;;;;; +18A90;TANGUT COMPONENT-657;Lo;0;L;;;;;N;;;;; +18A91;TANGUT COMPONENT-658;Lo;0;L;;;;;N;;;;; +18A92;TANGUT COMPONENT-659;Lo;0;L;;;;;N;;;;; +18A93;TANGUT COMPONENT-660;Lo;0;L;;;;;N;;;;; +18A94;TANGUT COMPONENT-661;Lo;0;L;;;;;N;;;;; +18A95;TANGUT COMPONENT-662;Lo;0;L;;;;;N;;;;; +18A96;TANGUT COMPONENT-663;Lo;0;L;;;;;N;;;;; +18A97;TANGUT COMPONENT-664;Lo;0;L;;;;;N;;;;; +18A98;TANGUT COMPONENT-665;Lo;0;L;;;;;N;;;;; +18A99;TANGUT COMPONENT-666;Lo;0;L;;;;;N;;;;; +18A9A;TANGUT COMPONENT-667;Lo;0;L;;;;;N;;;;; +18A9B;TANGUT COMPONENT-668;Lo;0;L;;;;;N;;;;; +18A9C;TANGUT COMPONENT-669;Lo;0;L;;;;;N;;;;; +18A9D;TANGUT COMPONENT-670;Lo;0;L;;;;;N;;;;; +18A9E;TANGUT COMPONENT-671;Lo;0;L;;;;;N;;;;; +18A9F;TANGUT COMPONENT-672;Lo;0;L;;;;;N;;;;; +18AA0;TANGUT COMPONENT-673;Lo;0;L;;;;;N;;;;; +18AA1;TANGUT COMPONENT-674;Lo;0;L;;;;;N;;;;; +18AA2;TANGUT COMPONENT-675;Lo;0;L;;;;;N;;;;; +18AA3;TANGUT COMPONENT-676;Lo;0;L;;;;;N;;;;; +18AA4;TANGUT COMPONENT-677;Lo;0;L;;;;;N;;;;; +18AA5;TANGUT COMPONENT-678;Lo;0;L;;;;;N;;;;; +18AA6;TANGUT COMPONENT-679;Lo;0;L;;;;;N;;;;; +18AA7;TANGUT COMPONENT-680;Lo;0;L;;;;;N;;;;; +18AA8;TANGUT COMPONENT-681;Lo;0;L;;;;;N;;;;; +18AA9;TANGUT COMPONENT-682;Lo;0;L;;;;;N;;;;; +18AAA;TANGUT COMPONENT-683;Lo;0;L;;;;;N;;;;; +18AAB;TANGUT COMPONENT-684;Lo;0;L;;;;;N;;;;; +18AAC;TANGUT COMPONENT-685;Lo;0;L;;;;;N;;;;; +18AAD;TANGUT COMPONENT-686;Lo;0;L;;;;;N;;;;; +18AAE;TANGUT COMPONENT-687;Lo;0;L;;;;;N;;;;; +18AAF;TANGUT COMPONENT-688;Lo;0;L;;;;;N;;;;; +18AB0;TANGUT COMPONENT-689;Lo;0;L;;;;;N;;;;; +18AB1;TANGUT COMPONENT-690;Lo;0;L;;;;;N;;;;; +18AB2;TANGUT COMPONENT-691;Lo;0;L;;;;;N;;;;; +18AB3;TANGUT COMPONENT-692;Lo;0;L;;;;;N;;;;; +18AB4;TANGUT COMPONENT-693;Lo;0;L;;;;;N;;;;; +18AB5;TANGUT COMPONENT-694;Lo;0;L;;;;;N;;;;; +18AB6;TANGUT COMPONENT-695;Lo;0;L;;;;;N;;;;; +18AB7;TANGUT COMPONENT-696;Lo;0;L;;;;;N;;;;; +18AB8;TANGUT COMPONENT-697;Lo;0;L;;;;;N;;;;; +18AB9;TANGUT COMPONENT-698;Lo;0;L;;;;;N;;;;; +18ABA;TANGUT COMPONENT-699;Lo;0;L;;;;;N;;;;; +18ABB;TANGUT COMPONENT-700;Lo;0;L;;;;;N;;;;; +18ABC;TANGUT COMPONENT-701;Lo;0;L;;;;;N;;;;; +18ABD;TANGUT COMPONENT-702;Lo;0;L;;;;;N;;;;; +18ABE;TANGUT COMPONENT-703;Lo;0;L;;;;;N;;;;; +18ABF;TANGUT COMPONENT-704;Lo;0;L;;;;;N;;;;; +18AC0;TANGUT COMPONENT-705;Lo;0;L;;;;;N;;;;; +18AC1;TANGUT COMPONENT-706;Lo;0;L;;;;;N;;;;; +18AC2;TANGUT COMPONENT-707;Lo;0;L;;;;;N;;;;; +18AC3;TANGUT COMPONENT-708;Lo;0;L;;;;;N;;;;; +18AC4;TANGUT COMPONENT-709;Lo;0;L;;;;;N;;;;; +18AC5;TANGUT COMPONENT-710;Lo;0;L;;;;;N;;;;; +18AC6;TANGUT COMPONENT-711;Lo;0;L;;;;;N;;;;; +18AC7;TANGUT COMPONENT-712;Lo;0;L;;;;;N;;;;; +18AC8;TANGUT COMPONENT-713;Lo;0;L;;;;;N;;;;; +18AC9;TANGUT COMPONENT-714;Lo;0;L;;;;;N;;;;; +18ACA;TANGUT COMPONENT-715;Lo;0;L;;;;;N;;;;; +18ACB;TANGUT COMPONENT-716;Lo;0;L;;;;;N;;;;; +18ACC;TANGUT COMPONENT-717;Lo;0;L;;;;;N;;;;; +18ACD;TANGUT COMPONENT-718;Lo;0;L;;;;;N;;;;; +18ACE;TANGUT COMPONENT-719;Lo;0;L;;;;;N;;;;; +18ACF;TANGUT COMPONENT-720;Lo;0;L;;;;;N;;;;; +18AD0;TANGUT COMPONENT-721;Lo;0;L;;;;;N;;;;; +18AD1;TANGUT COMPONENT-722;Lo;0;L;;;;;N;;;;; +18AD2;TANGUT COMPONENT-723;Lo;0;L;;;;;N;;;;; +18AD3;TANGUT COMPONENT-724;Lo;0;L;;;;;N;;;;; +18AD4;TANGUT COMPONENT-725;Lo;0;L;;;;;N;;;;; +18AD5;TANGUT COMPONENT-726;Lo;0;L;;;;;N;;;;; +18AD6;TANGUT COMPONENT-727;Lo;0;L;;;;;N;;;;; +18AD7;TANGUT COMPONENT-728;Lo;0;L;;;;;N;;;;; +18AD8;TANGUT COMPONENT-729;Lo;0;L;;;;;N;;;;; +18AD9;TANGUT COMPONENT-730;Lo;0;L;;;;;N;;;;; +18ADA;TANGUT COMPONENT-731;Lo;0;L;;;;;N;;;;; +18ADB;TANGUT COMPONENT-732;Lo;0;L;;;;;N;;;;; +18ADC;TANGUT COMPONENT-733;Lo;0;L;;;;;N;;;;; +18ADD;TANGUT COMPONENT-734;Lo;0;L;;;;;N;;;;; +18ADE;TANGUT COMPONENT-735;Lo;0;L;;;;;N;;;;; +18ADF;TANGUT COMPONENT-736;Lo;0;L;;;;;N;;;;; +18AE0;TANGUT COMPONENT-737;Lo;0;L;;;;;N;;;;; +18AE1;TANGUT COMPONENT-738;Lo;0;L;;;;;N;;;;; +18AE2;TANGUT COMPONENT-739;Lo;0;L;;;;;N;;;;; +18AE3;TANGUT COMPONENT-740;Lo;0;L;;;;;N;;;;; +18AE4;TANGUT COMPONENT-741;Lo;0;L;;;;;N;;;;; +18AE5;TANGUT COMPONENT-742;Lo;0;L;;;;;N;;;;; +18AE6;TANGUT COMPONENT-743;Lo;0;L;;;;;N;;;;; +18AE7;TANGUT COMPONENT-744;Lo;0;L;;;;;N;;;;; +18AE8;TANGUT COMPONENT-745;Lo;0;L;;;;;N;;;;; +18AE9;TANGUT COMPONENT-746;Lo;0;L;;;;;N;;;;; +18AEA;TANGUT COMPONENT-747;Lo;0;L;;;;;N;;;;; +18AEB;TANGUT COMPONENT-748;Lo;0;L;;;;;N;;;;; +18AEC;TANGUT COMPONENT-749;Lo;0;L;;;;;N;;;;; +18AED;TANGUT COMPONENT-750;Lo;0;L;;;;;N;;;;; +18AEE;TANGUT COMPONENT-751;Lo;0;L;;;;;N;;;;; +18AEF;TANGUT COMPONENT-752;Lo;0;L;;;;;N;;;;; +18AF0;TANGUT COMPONENT-753;Lo;0;L;;;;;N;;;;; +18AF1;TANGUT COMPONENT-754;Lo;0;L;;;;;N;;;;; +18AF2;TANGUT COMPONENT-755;Lo;0;L;;;;;N;;;;; +18AF3;TANGUT COMPONENT-756;Lo;0;L;;;;;N;;;;; +18AF4;TANGUT COMPONENT-757;Lo;0;L;;;;;N;;;;; +18AF5;TANGUT COMPONENT-758;Lo;0;L;;;;;N;;;;; +18AF6;TANGUT COMPONENT-759;Lo;0;L;;;;;N;;;;; +18AF7;TANGUT COMPONENT-760;Lo;0;L;;;;;N;;;;; +18AF8;TANGUT COMPONENT-761;Lo;0;L;;;;;N;;;;; +18AF9;TANGUT COMPONENT-762;Lo;0;L;;;;;N;;;;; +18AFA;TANGUT COMPONENT-763;Lo;0;L;;;;;N;;;;; +18AFB;TANGUT COMPONENT-764;Lo;0;L;;;;;N;;;;; +18AFC;TANGUT COMPONENT-765;Lo;0;L;;;;;N;;;;; +18AFD;TANGUT COMPONENT-766;Lo;0;L;;;;;N;;;;; +18AFE;TANGUT COMPONENT-767;Lo;0;L;;;;;N;;;;; +18AFF;TANGUT COMPONENT-768;Lo;0;L;;;;;N;;;;; +18B00;KHITAN SMALL SCRIPT CHARACTER-18B00;Lo;0;L;;;;;N;;;;; +18B01;KHITAN SMALL SCRIPT CHARACTER-18B01;Lo;0;L;;;;;N;;;;; +18B02;KHITAN SMALL SCRIPT CHARACTER-18B02;Lo;0;L;;;;;N;;;;; +18B03;KHITAN SMALL SCRIPT CHARACTER-18B03;Lo;0;L;;;;;N;;;;; +18B04;KHITAN SMALL SCRIPT CHARACTER-18B04;Lo;0;L;;;;;N;;;;; +18B05;KHITAN SMALL SCRIPT CHARACTER-18B05;Lo;0;L;;;;;N;;;;; +18B06;KHITAN SMALL SCRIPT CHARACTER-18B06;Lo;0;L;;;;;N;;;;; +18B07;KHITAN SMALL SCRIPT CHARACTER-18B07;Lo;0;L;;;;;N;;;;; +18B08;KHITAN SMALL SCRIPT CHARACTER-18B08;Lo;0;L;;;;;N;;;;; +18B09;KHITAN SMALL SCRIPT CHARACTER-18B09;Lo;0;L;;;;;N;;;;; +18B0A;KHITAN SMALL SCRIPT CHARACTER-18B0A;Lo;0;L;;;;;N;;;;; +18B0B;KHITAN SMALL SCRIPT CHARACTER-18B0B;Lo;0;L;;;;;N;;;;; +18B0C;KHITAN SMALL SCRIPT CHARACTER-18B0C;Lo;0;L;;;;;N;;;;; +18B0D;KHITAN SMALL SCRIPT CHARACTER-18B0D;Lo;0;L;;;;;N;;;;; +18B0E;KHITAN SMALL SCRIPT CHARACTER-18B0E;Lo;0;L;;;;;N;;;;; +18B0F;KHITAN SMALL SCRIPT CHARACTER-18B0F;Lo;0;L;;;;;N;;;;; +18B10;KHITAN SMALL SCRIPT CHARACTER-18B10;Lo;0;L;;;;;N;;;;; +18B11;KHITAN SMALL SCRIPT CHARACTER-18B11;Lo;0;L;;;;;N;;;;; +18B12;KHITAN SMALL SCRIPT CHARACTER-18B12;Lo;0;L;;;;;N;;;;; +18B13;KHITAN SMALL SCRIPT CHARACTER-18B13;Lo;0;L;;;;;N;;;;; +18B14;KHITAN SMALL SCRIPT CHARACTER-18B14;Lo;0;L;;;;;N;;;;; +18B15;KHITAN SMALL SCRIPT CHARACTER-18B15;Lo;0;L;;;;;N;;;;; +18B16;KHITAN SMALL SCRIPT CHARACTER-18B16;Lo;0;L;;;;;N;;;;; +18B17;KHITAN SMALL SCRIPT CHARACTER-18B17;Lo;0;L;;;;;N;;;;; +18B18;KHITAN SMALL SCRIPT CHARACTER-18B18;Lo;0;L;;;;;N;;;;; +18B19;KHITAN SMALL SCRIPT CHARACTER-18B19;Lo;0;L;;;;;N;;;;; +18B1A;KHITAN SMALL SCRIPT CHARACTER-18B1A;Lo;0;L;;;;;N;;;;; +18B1B;KHITAN SMALL SCRIPT CHARACTER-18B1B;Lo;0;L;;;;;N;;;;; +18B1C;KHITAN SMALL SCRIPT CHARACTER-18B1C;Lo;0;L;;;;;N;;;;; +18B1D;KHITAN SMALL SCRIPT CHARACTER-18B1D;Lo;0;L;;;;;N;;;;; +18B1E;KHITAN SMALL SCRIPT CHARACTER-18B1E;Lo;0;L;;;;;N;;;;; +18B1F;KHITAN SMALL SCRIPT CHARACTER-18B1F;Lo;0;L;;;;;N;;;;; +18B20;KHITAN SMALL SCRIPT CHARACTER-18B20;Lo;0;L;;;;;N;;;;; +18B21;KHITAN SMALL SCRIPT CHARACTER-18B21;Lo;0;L;;;;;N;;;;; +18B22;KHITAN SMALL SCRIPT CHARACTER-18B22;Lo;0;L;;;;;N;;;;; +18B23;KHITAN SMALL SCRIPT CHARACTER-18B23;Lo;0;L;;;;;N;;;;; +18B24;KHITAN SMALL SCRIPT CHARACTER-18B24;Lo;0;L;;;;;N;;;;; +18B25;KHITAN SMALL SCRIPT CHARACTER-18B25;Lo;0;L;;;;;N;;;;; +18B26;KHITAN SMALL SCRIPT CHARACTER-18B26;Lo;0;L;;;;;N;;;;; +18B27;KHITAN SMALL SCRIPT CHARACTER-18B27;Lo;0;L;;;;;N;;;;; +18B28;KHITAN SMALL SCRIPT CHARACTER-18B28;Lo;0;L;;;;;N;;;;; +18B29;KHITAN SMALL SCRIPT CHARACTER-18B29;Lo;0;L;;;;;N;;;;; +18B2A;KHITAN SMALL SCRIPT CHARACTER-18B2A;Lo;0;L;;;;;N;;;;; +18B2B;KHITAN SMALL SCRIPT CHARACTER-18B2B;Lo;0;L;;;;;N;;;;; +18B2C;KHITAN SMALL SCRIPT CHARACTER-18B2C;Lo;0;L;;;;;N;;;;; +18B2D;KHITAN SMALL SCRIPT CHARACTER-18B2D;Lo;0;L;;;;;N;;;;; +18B2E;KHITAN SMALL SCRIPT CHARACTER-18B2E;Lo;0;L;;;;;N;;;;; +18B2F;KHITAN SMALL SCRIPT CHARACTER-18B2F;Lo;0;L;;;;;N;;;;; +18B30;KHITAN SMALL SCRIPT CHARACTER-18B30;Lo;0;L;;;;;N;;;;; +18B31;KHITAN SMALL SCRIPT CHARACTER-18B31;Lo;0;L;;;;;N;;;;; +18B32;KHITAN SMALL SCRIPT CHARACTER-18B32;Lo;0;L;;;;;N;;;;; +18B33;KHITAN SMALL SCRIPT CHARACTER-18B33;Lo;0;L;;;;;N;;;;; +18B34;KHITAN SMALL SCRIPT CHARACTER-18B34;Lo;0;L;;;;;N;;;;; +18B35;KHITAN SMALL SCRIPT CHARACTER-18B35;Lo;0;L;;;;;N;;;;; +18B36;KHITAN SMALL SCRIPT CHARACTER-18B36;Lo;0;L;;;;;N;;;;; +18B37;KHITAN SMALL SCRIPT CHARACTER-18B37;Lo;0;L;;;;;N;;;;; +18B38;KHITAN SMALL SCRIPT CHARACTER-18B38;Lo;0;L;;;;;N;;;;; +18B39;KHITAN SMALL SCRIPT CHARACTER-18B39;Lo;0;L;;;;;N;;;;; +18B3A;KHITAN SMALL SCRIPT CHARACTER-18B3A;Lo;0;L;;;;;N;;;;; +18B3B;KHITAN SMALL SCRIPT CHARACTER-18B3B;Lo;0;L;;;;;N;;;;; +18B3C;KHITAN SMALL SCRIPT CHARACTER-18B3C;Lo;0;L;;;;;N;;;;; +18B3D;KHITAN SMALL SCRIPT CHARACTER-18B3D;Lo;0;L;;;;;N;;;;; +18B3E;KHITAN SMALL SCRIPT CHARACTER-18B3E;Lo;0;L;;;;;N;;;;; +18B3F;KHITAN SMALL SCRIPT CHARACTER-18B3F;Lo;0;L;;;;;N;;;;; +18B40;KHITAN SMALL SCRIPT CHARACTER-18B40;Lo;0;L;;;;;N;;;;; +18B41;KHITAN SMALL SCRIPT CHARACTER-18B41;Lo;0;L;;;;;N;;;;; +18B42;KHITAN SMALL SCRIPT CHARACTER-18B42;Lo;0;L;;;;;N;;;;; +18B43;KHITAN SMALL SCRIPT CHARACTER-18B43;Lo;0;L;;;;;N;;;;; +18B44;KHITAN SMALL SCRIPT CHARACTER-18B44;Lo;0;L;;;;;N;;;;; +18B45;KHITAN SMALL SCRIPT CHARACTER-18B45;Lo;0;L;;;;;N;;;;; +18B46;KHITAN SMALL SCRIPT CHARACTER-18B46;Lo;0;L;;;;;N;;;;; +18B47;KHITAN SMALL SCRIPT CHARACTER-18B47;Lo;0;L;;;;;N;;;;; +18B48;KHITAN SMALL SCRIPT CHARACTER-18B48;Lo;0;L;;;;;N;;;;; +18B49;KHITAN SMALL SCRIPT CHARACTER-18B49;Lo;0;L;;;;;N;;;;; +18B4A;KHITAN SMALL SCRIPT CHARACTER-18B4A;Lo;0;L;;;;;N;;;;; +18B4B;KHITAN SMALL SCRIPT CHARACTER-18B4B;Lo;0;L;;;;;N;;;;; +18B4C;KHITAN SMALL SCRIPT CHARACTER-18B4C;Lo;0;L;;;;;N;;;;; +18B4D;KHITAN SMALL SCRIPT CHARACTER-18B4D;Lo;0;L;;;;;N;;;;; +18B4E;KHITAN SMALL SCRIPT CHARACTER-18B4E;Lo;0;L;;;;;N;;;;; +18B4F;KHITAN SMALL SCRIPT CHARACTER-18B4F;Lo;0;L;;;;;N;;;;; +18B50;KHITAN SMALL SCRIPT CHARACTER-18B50;Lo;0;L;;;;;N;;;;; +18B51;KHITAN SMALL SCRIPT CHARACTER-18B51;Lo;0;L;;;;;N;;;;; +18B52;KHITAN SMALL SCRIPT CHARACTER-18B52;Lo;0;L;;;;;N;;;;; +18B53;KHITAN SMALL SCRIPT CHARACTER-18B53;Lo;0;L;;;;;N;;;;; +18B54;KHITAN SMALL SCRIPT CHARACTER-18B54;Lo;0;L;;;;;N;;;;; +18B55;KHITAN SMALL SCRIPT CHARACTER-18B55;Lo;0;L;;;;;N;;;;; +18B56;KHITAN SMALL SCRIPT CHARACTER-18B56;Lo;0;L;;;;;N;;;;; +18B57;KHITAN SMALL SCRIPT CHARACTER-18B57;Lo;0;L;;;;;N;;;;; +18B58;KHITAN SMALL SCRIPT CHARACTER-18B58;Lo;0;L;;;;;N;;;;; +18B59;KHITAN SMALL SCRIPT CHARACTER-18B59;Lo;0;L;;;;;N;;;;; +18B5A;KHITAN SMALL SCRIPT CHARACTER-18B5A;Lo;0;L;;;;;N;;;;; +18B5B;KHITAN SMALL SCRIPT CHARACTER-18B5B;Lo;0;L;;;;;N;;;;; +18B5C;KHITAN SMALL SCRIPT CHARACTER-18B5C;Lo;0;L;;;;;N;;;;; +18B5D;KHITAN SMALL SCRIPT CHARACTER-18B5D;Lo;0;L;;;;;N;;;;; +18B5E;KHITAN SMALL SCRIPT CHARACTER-18B5E;Lo;0;L;;;;;N;;;;; +18B5F;KHITAN SMALL SCRIPT CHARACTER-18B5F;Lo;0;L;;;;;N;;;;; +18B60;KHITAN SMALL SCRIPT CHARACTER-18B60;Lo;0;L;;;;;N;;;;; +18B61;KHITAN SMALL SCRIPT CHARACTER-18B61;Lo;0;L;;;;;N;;;;; +18B62;KHITAN SMALL SCRIPT CHARACTER-18B62;Lo;0;L;;;;;N;;;;; +18B63;KHITAN SMALL SCRIPT CHARACTER-18B63;Lo;0;L;;;;;N;;;;; +18B64;KHITAN SMALL SCRIPT CHARACTER-18B64;Lo;0;L;;;;;N;;;;; +18B65;KHITAN SMALL SCRIPT CHARACTER-18B65;Lo;0;L;;;;;N;;;;; +18B66;KHITAN SMALL SCRIPT CHARACTER-18B66;Lo;0;L;;;;;N;;;;; +18B67;KHITAN SMALL SCRIPT CHARACTER-18B67;Lo;0;L;;;;;N;;;;; +18B68;KHITAN SMALL SCRIPT CHARACTER-18B68;Lo;0;L;;;;;N;;;;; +18B69;KHITAN SMALL SCRIPT CHARACTER-18B69;Lo;0;L;;;;;N;;;;; +18B6A;KHITAN SMALL SCRIPT CHARACTER-18B6A;Lo;0;L;;;;;N;;;;; +18B6B;KHITAN SMALL SCRIPT CHARACTER-18B6B;Lo;0;L;;;;;N;;;;; +18B6C;KHITAN SMALL SCRIPT CHARACTER-18B6C;Lo;0;L;;;;;N;;;;; +18B6D;KHITAN SMALL SCRIPT CHARACTER-18B6D;Lo;0;L;;;;;N;;;;; +18B6E;KHITAN SMALL SCRIPT CHARACTER-18B6E;Lo;0;L;;;;;N;;;;; +18B6F;KHITAN SMALL SCRIPT CHARACTER-18B6F;Lo;0;L;;;;;N;;;;; +18B70;KHITAN SMALL SCRIPT CHARACTER-18B70;Lo;0;L;;;;;N;;;;; +18B71;KHITAN SMALL SCRIPT CHARACTER-18B71;Lo;0;L;;;;;N;;;;; +18B72;KHITAN SMALL SCRIPT CHARACTER-18B72;Lo;0;L;;;;;N;;;;; +18B73;KHITAN SMALL SCRIPT CHARACTER-18B73;Lo;0;L;;;;;N;;;;; +18B74;KHITAN SMALL SCRIPT CHARACTER-18B74;Lo;0;L;;;;;N;;;;; +18B75;KHITAN SMALL SCRIPT CHARACTER-18B75;Lo;0;L;;;;;N;;;;; +18B76;KHITAN SMALL SCRIPT CHARACTER-18B76;Lo;0;L;;;;;N;;;;; +18B77;KHITAN SMALL SCRIPT CHARACTER-18B77;Lo;0;L;;;;;N;;;;; +18B78;KHITAN SMALL SCRIPT CHARACTER-18B78;Lo;0;L;;;;;N;;;;; +18B79;KHITAN SMALL SCRIPT CHARACTER-18B79;Lo;0;L;;;;;N;;;;; +18B7A;KHITAN SMALL SCRIPT CHARACTER-18B7A;Lo;0;L;;;;;N;;;;; +18B7B;KHITAN SMALL SCRIPT CHARACTER-18B7B;Lo;0;L;;;;;N;;;;; +18B7C;KHITAN SMALL SCRIPT CHARACTER-18B7C;Lo;0;L;;;;;N;;;;; +18B7D;KHITAN SMALL SCRIPT CHARACTER-18B7D;Lo;0;L;;;;;N;;;;; +18B7E;KHITAN SMALL SCRIPT CHARACTER-18B7E;Lo;0;L;;;;;N;;;;; +18B7F;KHITAN SMALL SCRIPT CHARACTER-18B7F;Lo;0;L;;;;;N;;;;; +18B80;KHITAN SMALL SCRIPT CHARACTER-18B80;Lo;0;L;;;;;N;;;;; +18B81;KHITAN SMALL SCRIPT CHARACTER-18B81;Lo;0;L;;;;;N;;;;; +18B82;KHITAN SMALL SCRIPT CHARACTER-18B82;Lo;0;L;;;;;N;;;;; +18B83;KHITAN SMALL SCRIPT CHARACTER-18B83;Lo;0;L;;;;;N;;;;; +18B84;KHITAN SMALL SCRIPT CHARACTER-18B84;Lo;0;L;;;;;N;;;;; +18B85;KHITAN SMALL SCRIPT CHARACTER-18B85;Lo;0;L;;;;;N;;;;; +18B86;KHITAN SMALL SCRIPT CHARACTER-18B86;Lo;0;L;;;;;N;;;;; +18B87;KHITAN SMALL SCRIPT CHARACTER-18B87;Lo;0;L;;;;;N;;;;; +18B88;KHITAN SMALL SCRIPT CHARACTER-18B88;Lo;0;L;;;;;N;;;;; +18B89;KHITAN SMALL SCRIPT CHARACTER-18B89;Lo;0;L;;;;;N;;;;; +18B8A;KHITAN SMALL SCRIPT CHARACTER-18B8A;Lo;0;L;;;;;N;;;;; +18B8B;KHITAN SMALL SCRIPT CHARACTER-18B8B;Lo;0;L;;;;;N;;;;; +18B8C;KHITAN SMALL SCRIPT CHARACTER-18B8C;Lo;0;L;;;;;N;;;;; +18B8D;KHITAN SMALL SCRIPT CHARACTER-18B8D;Lo;0;L;;;;;N;;;;; +18B8E;KHITAN SMALL SCRIPT CHARACTER-18B8E;Lo;0;L;;;;;N;;;;; +18B8F;KHITAN SMALL SCRIPT CHARACTER-18B8F;Lo;0;L;;;;;N;;;;; +18B90;KHITAN SMALL SCRIPT CHARACTER-18B90;Lo;0;L;;;;;N;;;;; +18B91;KHITAN SMALL SCRIPT CHARACTER-18B91;Lo;0;L;;;;;N;;;;; +18B92;KHITAN SMALL SCRIPT CHARACTER-18B92;Lo;0;L;;;;;N;;;;; +18B93;KHITAN SMALL SCRIPT CHARACTER-18B93;Lo;0;L;;;;;N;;;;; +18B94;KHITAN SMALL SCRIPT CHARACTER-18B94;Lo;0;L;;;;;N;;;;; +18B95;KHITAN SMALL SCRIPT CHARACTER-18B95;Lo;0;L;;;;;N;;;;; +18B96;KHITAN SMALL SCRIPT CHARACTER-18B96;Lo;0;L;;;;;N;;;;; +18B97;KHITAN SMALL SCRIPT CHARACTER-18B97;Lo;0;L;;;;;N;;;;; +18B98;KHITAN SMALL SCRIPT CHARACTER-18B98;Lo;0;L;;;;;N;;;;; +18B99;KHITAN SMALL SCRIPT CHARACTER-18B99;Lo;0;L;;;;;N;;;;; +18B9A;KHITAN SMALL SCRIPT CHARACTER-18B9A;Lo;0;L;;;;;N;;;;; +18B9B;KHITAN SMALL SCRIPT CHARACTER-18B9B;Lo;0;L;;;;;N;;;;; +18B9C;KHITAN SMALL SCRIPT CHARACTER-18B9C;Lo;0;L;;;;;N;;;;; +18B9D;KHITAN SMALL SCRIPT CHARACTER-18B9D;Lo;0;L;;;;;N;;;;; +18B9E;KHITAN SMALL SCRIPT CHARACTER-18B9E;Lo;0;L;;;;;N;;;;; +18B9F;KHITAN SMALL SCRIPT CHARACTER-18B9F;Lo;0;L;;;;;N;;;;; +18BA0;KHITAN SMALL SCRIPT CHARACTER-18BA0;Lo;0;L;;;;;N;;;;; +18BA1;KHITAN SMALL SCRIPT CHARACTER-18BA1;Lo;0;L;;;;;N;;;;; +18BA2;KHITAN SMALL SCRIPT CHARACTER-18BA2;Lo;0;L;;;;;N;;;;; +18BA3;KHITAN SMALL SCRIPT CHARACTER-18BA3;Lo;0;L;;;;;N;;;;; +18BA4;KHITAN SMALL SCRIPT CHARACTER-18BA4;Lo;0;L;;;;;N;;;;; +18BA5;KHITAN SMALL SCRIPT CHARACTER-18BA5;Lo;0;L;;;;;N;;;;; +18BA6;KHITAN SMALL SCRIPT CHARACTER-18BA6;Lo;0;L;;;;;N;;;;; +18BA7;KHITAN SMALL SCRIPT CHARACTER-18BA7;Lo;0;L;;;;;N;;;;; +18BA8;KHITAN SMALL SCRIPT CHARACTER-18BA8;Lo;0;L;;;;;N;;;;; +18BA9;KHITAN SMALL SCRIPT CHARACTER-18BA9;Lo;0;L;;;;;N;;;;; +18BAA;KHITAN SMALL SCRIPT CHARACTER-18BAA;Lo;0;L;;;;;N;;;;; +18BAB;KHITAN SMALL SCRIPT CHARACTER-18BAB;Lo;0;L;;;;;N;;;;; +18BAC;KHITAN SMALL SCRIPT CHARACTER-18BAC;Lo;0;L;;;;;N;;;;; +18BAD;KHITAN SMALL SCRIPT CHARACTER-18BAD;Lo;0;L;;;;;N;;;;; +18BAE;KHITAN SMALL SCRIPT CHARACTER-18BAE;Lo;0;L;;;;;N;;;;; +18BAF;KHITAN SMALL SCRIPT CHARACTER-18BAF;Lo;0;L;;;;;N;;;;; +18BB0;KHITAN SMALL SCRIPT CHARACTER-18BB0;Lo;0;L;;;;;N;;;;; +18BB1;KHITAN SMALL SCRIPT CHARACTER-18BB1;Lo;0;L;;;;;N;;;;; +18BB2;KHITAN SMALL SCRIPT CHARACTER-18BB2;Lo;0;L;;;;;N;;;;; +18BB3;KHITAN SMALL SCRIPT CHARACTER-18BB3;Lo;0;L;;;;;N;;;;; +18BB4;KHITAN SMALL SCRIPT CHARACTER-18BB4;Lo;0;L;;;;;N;;;;; +18BB5;KHITAN SMALL SCRIPT CHARACTER-18BB5;Lo;0;L;;;;;N;;;;; +18BB6;KHITAN SMALL SCRIPT CHARACTER-18BB6;Lo;0;L;;;;;N;;;;; +18BB7;KHITAN SMALL SCRIPT CHARACTER-18BB7;Lo;0;L;;;;;N;;;;; +18BB8;KHITAN SMALL SCRIPT CHARACTER-18BB8;Lo;0;L;;;;;N;;;;; +18BB9;KHITAN SMALL SCRIPT CHARACTER-18BB9;Lo;0;L;;;;;N;;;;; +18BBA;KHITAN SMALL SCRIPT CHARACTER-18BBA;Lo;0;L;;;;;N;;;;; +18BBB;KHITAN SMALL SCRIPT CHARACTER-18BBB;Lo;0;L;;;;;N;;;;; +18BBC;KHITAN SMALL SCRIPT CHARACTER-18BBC;Lo;0;L;;;;;N;;;;; +18BBD;KHITAN SMALL SCRIPT CHARACTER-18BBD;Lo;0;L;;;;;N;;;;; +18BBE;KHITAN SMALL SCRIPT CHARACTER-18BBE;Lo;0;L;;;;;N;;;;; +18BBF;KHITAN SMALL SCRIPT CHARACTER-18BBF;Lo;0;L;;;;;N;;;;; +18BC0;KHITAN SMALL SCRIPT CHARACTER-18BC0;Lo;0;L;;;;;N;;;;; +18BC1;KHITAN SMALL SCRIPT CHARACTER-18BC1;Lo;0;L;;;;;N;;;;; +18BC2;KHITAN SMALL SCRIPT CHARACTER-18BC2;Lo;0;L;;;;;N;;;;; +18BC3;KHITAN SMALL SCRIPT CHARACTER-18BC3;Lo;0;L;;;;;N;;;;; +18BC4;KHITAN SMALL SCRIPT CHARACTER-18BC4;Lo;0;L;;;;;N;;;;; +18BC5;KHITAN SMALL SCRIPT CHARACTER-18BC5;Lo;0;L;;;;;N;;;;; +18BC6;KHITAN SMALL SCRIPT CHARACTER-18BC6;Lo;0;L;;;;;N;;;;; +18BC7;KHITAN SMALL SCRIPT CHARACTER-18BC7;Lo;0;L;;;;;N;;;;; +18BC8;KHITAN SMALL SCRIPT CHARACTER-18BC8;Lo;0;L;;;;;N;;;;; +18BC9;KHITAN SMALL SCRIPT CHARACTER-18BC9;Lo;0;L;;;;;N;;;;; +18BCA;KHITAN SMALL SCRIPT CHARACTER-18BCA;Lo;0;L;;;;;N;;;;; +18BCB;KHITAN SMALL SCRIPT CHARACTER-18BCB;Lo;0;L;;;;;N;;;;; +18BCC;KHITAN SMALL SCRIPT CHARACTER-18BCC;Lo;0;L;;;;;N;;;;; +18BCD;KHITAN SMALL SCRIPT CHARACTER-18BCD;Lo;0;L;;;;;N;;;;; +18BCE;KHITAN SMALL SCRIPT CHARACTER-18BCE;Lo;0;L;;;;;N;;;;; +18BCF;KHITAN SMALL SCRIPT CHARACTER-18BCF;Lo;0;L;;;;;N;;;;; +18BD0;KHITAN SMALL SCRIPT CHARACTER-18BD0;Lo;0;L;;;;;N;;;;; +18BD1;KHITAN SMALL SCRIPT CHARACTER-18BD1;Lo;0;L;;;;;N;;;;; +18BD2;KHITAN SMALL SCRIPT CHARACTER-18BD2;Lo;0;L;;;;;N;;;;; +18BD3;KHITAN SMALL SCRIPT CHARACTER-18BD3;Lo;0;L;;;;;N;;;;; +18BD4;KHITAN SMALL SCRIPT CHARACTER-18BD4;Lo;0;L;;;;;N;;;;; +18BD5;KHITAN SMALL SCRIPT CHARACTER-18BD5;Lo;0;L;;;;;N;;;;; +18BD6;KHITAN SMALL SCRIPT CHARACTER-18BD6;Lo;0;L;;;;;N;;;;; +18BD7;KHITAN SMALL SCRIPT CHARACTER-18BD7;Lo;0;L;;;;;N;;;;; +18BD8;KHITAN SMALL SCRIPT CHARACTER-18BD8;Lo;0;L;;;;;N;;;;; +18BD9;KHITAN SMALL SCRIPT CHARACTER-18BD9;Lo;0;L;;;;;N;;;;; +18BDA;KHITAN SMALL SCRIPT CHARACTER-18BDA;Lo;0;L;;;;;N;;;;; +18BDB;KHITAN SMALL SCRIPT CHARACTER-18BDB;Lo;0;L;;;;;N;;;;; +18BDC;KHITAN SMALL SCRIPT CHARACTER-18BDC;Lo;0;L;;;;;N;;;;; +18BDD;KHITAN SMALL SCRIPT CHARACTER-18BDD;Lo;0;L;;;;;N;;;;; +18BDE;KHITAN SMALL SCRIPT CHARACTER-18BDE;Lo;0;L;;;;;N;;;;; +18BDF;KHITAN SMALL SCRIPT CHARACTER-18BDF;Lo;0;L;;;;;N;;;;; +18BE0;KHITAN SMALL SCRIPT CHARACTER-18BE0;Lo;0;L;;;;;N;;;;; +18BE1;KHITAN SMALL SCRIPT CHARACTER-18BE1;Lo;0;L;;;;;N;;;;; +18BE2;KHITAN SMALL SCRIPT CHARACTER-18BE2;Lo;0;L;;;;;N;;;;; +18BE3;KHITAN SMALL SCRIPT CHARACTER-18BE3;Lo;0;L;;;;;N;;;;; +18BE4;KHITAN SMALL SCRIPT CHARACTER-18BE4;Lo;0;L;;;;;N;;;;; +18BE5;KHITAN SMALL SCRIPT CHARACTER-18BE5;Lo;0;L;;;;;N;;;;; +18BE6;KHITAN SMALL SCRIPT CHARACTER-18BE6;Lo;0;L;;;;;N;;;;; +18BE7;KHITAN SMALL SCRIPT CHARACTER-18BE7;Lo;0;L;;;;;N;;;;; +18BE8;KHITAN SMALL SCRIPT CHARACTER-18BE8;Lo;0;L;;;;;N;;;;; +18BE9;KHITAN SMALL SCRIPT CHARACTER-18BE9;Lo;0;L;;;;;N;;;;; +18BEA;KHITAN SMALL SCRIPT CHARACTER-18BEA;Lo;0;L;;;;;N;;;;; +18BEB;KHITAN SMALL SCRIPT CHARACTER-18BEB;Lo;0;L;;;;;N;;;;; +18BEC;KHITAN SMALL SCRIPT CHARACTER-18BEC;Lo;0;L;;;;;N;;;;; +18BED;KHITAN SMALL SCRIPT CHARACTER-18BED;Lo;0;L;;;;;N;;;;; +18BEE;KHITAN SMALL SCRIPT CHARACTER-18BEE;Lo;0;L;;;;;N;;;;; +18BEF;KHITAN SMALL SCRIPT CHARACTER-18BEF;Lo;0;L;;;;;N;;;;; +18BF0;KHITAN SMALL SCRIPT CHARACTER-18BF0;Lo;0;L;;;;;N;;;;; +18BF1;KHITAN SMALL SCRIPT CHARACTER-18BF1;Lo;0;L;;;;;N;;;;; +18BF2;KHITAN SMALL SCRIPT CHARACTER-18BF2;Lo;0;L;;;;;N;;;;; +18BF3;KHITAN SMALL SCRIPT CHARACTER-18BF3;Lo;0;L;;;;;N;;;;; +18BF4;KHITAN SMALL SCRIPT CHARACTER-18BF4;Lo;0;L;;;;;N;;;;; +18BF5;KHITAN SMALL SCRIPT CHARACTER-18BF5;Lo;0;L;;;;;N;;;;; +18BF6;KHITAN SMALL SCRIPT CHARACTER-18BF6;Lo;0;L;;;;;N;;;;; +18BF7;KHITAN SMALL SCRIPT CHARACTER-18BF7;Lo;0;L;;;;;N;;;;; +18BF8;KHITAN SMALL SCRIPT CHARACTER-18BF8;Lo;0;L;;;;;N;;;;; +18BF9;KHITAN SMALL SCRIPT CHARACTER-18BF9;Lo;0;L;;;;;N;;;;; +18BFA;KHITAN SMALL SCRIPT CHARACTER-18BFA;Lo;0;L;;;;;N;;;;; +18BFB;KHITAN SMALL SCRIPT CHARACTER-18BFB;Lo;0;L;;;;;N;;;;; +18BFC;KHITAN SMALL SCRIPT CHARACTER-18BFC;Lo;0;L;;;;;N;;;;; +18BFD;KHITAN SMALL SCRIPT CHARACTER-18BFD;Lo;0;L;;;;;N;;;;; +18BFE;KHITAN SMALL SCRIPT CHARACTER-18BFE;Lo;0;L;;;;;N;;;;; +18BFF;KHITAN SMALL SCRIPT CHARACTER-18BFF;Lo;0;L;;;;;N;;;;; +18C00;KHITAN SMALL SCRIPT CHARACTER-18C00;Lo;0;L;;;;;N;;;;; +18C01;KHITAN SMALL SCRIPT CHARACTER-18C01;Lo;0;L;;;;;N;;;;; +18C02;KHITAN SMALL SCRIPT CHARACTER-18C02;Lo;0;L;;;;;N;;;;; +18C03;KHITAN SMALL SCRIPT CHARACTER-18C03;Lo;0;L;;;;;N;;;;; +18C04;KHITAN SMALL SCRIPT CHARACTER-18C04;Lo;0;L;;;;;N;;;;; +18C05;KHITAN SMALL SCRIPT CHARACTER-18C05;Lo;0;L;;;;;N;;;;; +18C06;KHITAN SMALL SCRIPT CHARACTER-18C06;Lo;0;L;;;;;N;;;;; +18C07;KHITAN SMALL SCRIPT CHARACTER-18C07;Lo;0;L;;;;;N;;;;; +18C08;KHITAN SMALL SCRIPT CHARACTER-18C08;Lo;0;L;;;;;N;;;;; +18C09;KHITAN SMALL SCRIPT CHARACTER-18C09;Lo;0;L;;;;;N;;;;; +18C0A;KHITAN SMALL SCRIPT CHARACTER-18C0A;Lo;0;L;;;;;N;;;;; +18C0B;KHITAN SMALL SCRIPT CHARACTER-18C0B;Lo;0;L;;;;;N;;;;; +18C0C;KHITAN SMALL SCRIPT CHARACTER-18C0C;Lo;0;L;;;;;N;;;;; +18C0D;KHITAN SMALL SCRIPT CHARACTER-18C0D;Lo;0;L;;;;;N;;;;; +18C0E;KHITAN SMALL SCRIPT CHARACTER-18C0E;Lo;0;L;;;;;N;;;;; +18C0F;KHITAN SMALL SCRIPT CHARACTER-18C0F;Lo;0;L;;;;;N;;;;; +18C10;KHITAN SMALL SCRIPT CHARACTER-18C10;Lo;0;L;;;;;N;;;;; +18C11;KHITAN SMALL SCRIPT CHARACTER-18C11;Lo;0;L;;;;;N;;;;; +18C12;KHITAN SMALL SCRIPT CHARACTER-18C12;Lo;0;L;;;;;N;;;;; +18C13;KHITAN SMALL SCRIPT CHARACTER-18C13;Lo;0;L;;;;;N;;;;; +18C14;KHITAN SMALL SCRIPT CHARACTER-18C14;Lo;0;L;;;;;N;;;;; +18C15;KHITAN SMALL SCRIPT CHARACTER-18C15;Lo;0;L;;;;;N;;;;; +18C16;KHITAN SMALL SCRIPT CHARACTER-18C16;Lo;0;L;;;;;N;;;;; +18C17;KHITAN SMALL SCRIPT CHARACTER-18C17;Lo;0;L;;;;;N;;;;; +18C18;KHITAN SMALL SCRIPT CHARACTER-18C18;Lo;0;L;;;;;N;;;;; +18C19;KHITAN SMALL SCRIPT CHARACTER-18C19;Lo;0;L;;;;;N;;;;; +18C1A;KHITAN SMALL SCRIPT CHARACTER-18C1A;Lo;0;L;;;;;N;;;;; +18C1B;KHITAN SMALL SCRIPT CHARACTER-18C1B;Lo;0;L;;;;;N;;;;; +18C1C;KHITAN SMALL SCRIPT CHARACTER-18C1C;Lo;0;L;;;;;N;;;;; +18C1D;KHITAN SMALL SCRIPT CHARACTER-18C1D;Lo;0;L;;;;;N;;;;; +18C1E;KHITAN SMALL SCRIPT CHARACTER-18C1E;Lo;0;L;;;;;N;;;;; +18C1F;KHITAN SMALL SCRIPT CHARACTER-18C1F;Lo;0;L;;;;;N;;;;; +18C20;KHITAN SMALL SCRIPT CHARACTER-18C20;Lo;0;L;;;;;N;;;;; +18C21;KHITAN SMALL SCRIPT CHARACTER-18C21;Lo;0;L;;;;;N;;;;; +18C22;KHITAN SMALL SCRIPT CHARACTER-18C22;Lo;0;L;;;;;N;;;;; +18C23;KHITAN SMALL SCRIPT CHARACTER-18C23;Lo;0;L;;;;;N;;;;; +18C24;KHITAN SMALL SCRIPT CHARACTER-18C24;Lo;0;L;;;;;N;;;;; +18C25;KHITAN SMALL SCRIPT CHARACTER-18C25;Lo;0;L;;;;;N;;;;; +18C26;KHITAN SMALL SCRIPT CHARACTER-18C26;Lo;0;L;;;;;N;;;;; +18C27;KHITAN SMALL SCRIPT CHARACTER-18C27;Lo;0;L;;;;;N;;;;; +18C28;KHITAN SMALL SCRIPT CHARACTER-18C28;Lo;0;L;;;;;N;;;;; +18C29;KHITAN SMALL SCRIPT CHARACTER-18C29;Lo;0;L;;;;;N;;;;; +18C2A;KHITAN SMALL SCRIPT CHARACTER-18C2A;Lo;0;L;;;;;N;;;;; +18C2B;KHITAN SMALL SCRIPT CHARACTER-18C2B;Lo;0;L;;;;;N;;;;; +18C2C;KHITAN SMALL SCRIPT CHARACTER-18C2C;Lo;0;L;;;;;N;;;;; +18C2D;KHITAN SMALL SCRIPT CHARACTER-18C2D;Lo;0;L;;;;;N;;;;; +18C2E;KHITAN SMALL SCRIPT CHARACTER-18C2E;Lo;0;L;;;;;N;;;;; +18C2F;KHITAN SMALL SCRIPT CHARACTER-18C2F;Lo;0;L;;;;;N;;;;; +18C30;KHITAN SMALL SCRIPT CHARACTER-18C30;Lo;0;L;;;;;N;;;;; +18C31;KHITAN SMALL SCRIPT CHARACTER-18C31;Lo;0;L;;;;;N;;;;; +18C32;KHITAN SMALL SCRIPT CHARACTER-18C32;Lo;0;L;;;;;N;;;;; +18C33;KHITAN SMALL SCRIPT CHARACTER-18C33;Lo;0;L;;;;;N;;;;; +18C34;KHITAN SMALL SCRIPT CHARACTER-18C34;Lo;0;L;;;;;N;;;;; +18C35;KHITAN SMALL SCRIPT CHARACTER-18C35;Lo;0;L;;;;;N;;;;; +18C36;KHITAN SMALL SCRIPT CHARACTER-18C36;Lo;0;L;;;;;N;;;;; +18C37;KHITAN SMALL SCRIPT CHARACTER-18C37;Lo;0;L;;;;;N;;;;; +18C38;KHITAN SMALL SCRIPT CHARACTER-18C38;Lo;0;L;;;;;N;;;;; +18C39;KHITAN SMALL SCRIPT CHARACTER-18C39;Lo;0;L;;;;;N;;;;; +18C3A;KHITAN SMALL SCRIPT CHARACTER-18C3A;Lo;0;L;;;;;N;;;;; +18C3B;KHITAN SMALL SCRIPT CHARACTER-18C3B;Lo;0;L;;;;;N;;;;; +18C3C;KHITAN SMALL SCRIPT CHARACTER-18C3C;Lo;0;L;;;;;N;;;;; +18C3D;KHITAN SMALL SCRIPT CHARACTER-18C3D;Lo;0;L;;;;;N;;;;; +18C3E;KHITAN SMALL SCRIPT CHARACTER-18C3E;Lo;0;L;;;;;N;;;;; +18C3F;KHITAN SMALL SCRIPT CHARACTER-18C3F;Lo;0;L;;;;;N;;;;; +18C40;KHITAN SMALL SCRIPT CHARACTER-18C40;Lo;0;L;;;;;N;;;;; +18C41;KHITAN SMALL SCRIPT CHARACTER-18C41;Lo;0;L;;;;;N;;;;; +18C42;KHITAN SMALL SCRIPT CHARACTER-18C42;Lo;0;L;;;;;N;;;;; +18C43;KHITAN SMALL SCRIPT CHARACTER-18C43;Lo;0;L;;;;;N;;;;; +18C44;KHITAN SMALL SCRIPT CHARACTER-18C44;Lo;0;L;;;;;N;;;;; +18C45;KHITAN SMALL SCRIPT CHARACTER-18C45;Lo;0;L;;;;;N;;;;; +18C46;KHITAN SMALL SCRIPT CHARACTER-18C46;Lo;0;L;;;;;N;;;;; +18C47;KHITAN SMALL SCRIPT CHARACTER-18C47;Lo;0;L;;;;;N;;;;; +18C48;KHITAN SMALL SCRIPT CHARACTER-18C48;Lo;0;L;;;;;N;;;;; +18C49;KHITAN SMALL SCRIPT CHARACTER-18C49;Lo;0;L;;;;;N;;;;; +18C4A;KHITAN SMALL SCRIPT CHARACTER-18C4A;Lo;0;L;;;;;N;;;;; +18C4B;KHITAN SMALL SCRIPT CHARACTER-18C4B;Lo;0;L;;;;;N;;;;; +18C4C;KHITAN SMALL SCRIPT CHARACTER-18C4C;Lo;0;L;;;;;N;;;;; +18C4D;KHITAN SMALL SCRIPT CHARACTER-18C4D;Lo;0;L;;;;;N;;;;; +18C4E;KHITAN SMALL SCRIPT CHARACTER-18C4E;Lo;0;L;;;;;N;;;;; +18C4F;KHITAN SMALL SCRIPT CHARACTER-18C4F;Lo;0;L;;;;;N;;;;; +18C50;KHITAN SMALL SCRIPT CHARACTER-18C50;Lo;0;L;;;;;N;;;;; +18C51;KHITAN SMALL SCRIPT CHARACTER-18C51;Lo;0;L;;;;;N;;;;; +18C52;KHITAN SMALL SCRIPT CHARACTER-18C52;Lo;0;L;;;;;N;;;;; +18C53;KHITAN SMALL SCRIPT CHARACTER-18C53;Lo;0;L;;;;;N;;;;; +18C54;KHITAN SMALL SCRIPT CHARACTER-18C54;Lo;0;L;;;;;N;;;;; +18C55;KHITAN SMALL SCRIPT CHARACTER-18C55;Lo;0;L;;;;;N;;;;; +18C56;KHITAN SMALL SCRIPT CHARACTER-18C56;Lo;0;L;;;;;N;;;;; +18C57;KHITAN SMALL SCRIPT CHARACTER-18C57;Lo;0;L;;;;;N;;;;; +18C58;KHITAN SMALL SCRIPT CHARACTER-18C58;Lo;0;L;;;;;N;;;;; +18C59;KHITAN SMALL SCRIPT CHARACTER-18C59;Lo;0;L;;;;;N;;;;; +18C5A;KHITAN SMALL SCRIPT CHARACTER-18C5A;Lo;0;L;;;;;N;;;;; +18C5B;KHITAN SMALL SCRIPT CHARACTER-18C5B;Lo;0;L;;;;;N;;;;; +18C5C;KHITAN SMALL SCRIPT CHARACTER-18C5C;Lo;0;L;;;;;N;;;;; +18C5D;KHITAN SMALL SCRIPT CHARACTER-18C5D;Lo;0;L;;;;;N;;;;; +18C5E;KHITAN SMALL SCRIPT CHARACTER-18C5E;Lo;0;L;;;;;N;;;;; +18C5F;KHITAN SMALL SCRIPT CHARACTER-18C5F;Lo;0;L;;;;;N;;;;; +18C60;KHITAN SMALL SCRIPT CHARACTER-18C60;Lo;0;L;;;;;N;;;;; +18C61;KHITAN SMALL SCRIPT CHARACTER-18C61;Lo;0;L;;;;;N;;;;; +18C62;KHITAN SMALL SCRIPT CHARACTER-18C62;Lo;0;L;;;;;N;;;;; +18C63;KHITAN SMALL SCRIPT CHARACTER-18C63;Lo;0;L;;;;;N;;;;; +18C64;KHITAN SMALL SCRIPT CHARACTER-18C64;Lo;0;L;;;;;N;;;;; +18C65;KHITAN SMALL SCRIPT CHARACTER-18C65;Lo;0;L;;;;;N;;;;; +18C66;KHITAN SMALL SCRIPT CHARACTER-18C66;Lo;0;L;;;;;N;;;;; +18C67;KHITAN SMALL SCRIPT CHARACTER-18C67;Lo;0;L;;;;;N;;;;; +18C68;KHITAN SMALL SCRIPT CHARACTER-18C68;Lo;0;L;;;;;N;;;;; +18C69;KHITAN SMALL SCRIPT CHARACTER-18C69;Lo;0;L;;;;;N;;;;; +18C6A;KHITAN SMALL SCRIPT CHARACTER-18C6A;Lo;0;L;;;;;N;;;;; +18C6B;KHITAN SMALL SCRIPT CHARACTER-18C6B;Lo;0;L;;;;;N;;;;; +18C6C;KHITAN SMALL SCRIPT CHARACTER-18C6C;Lo;0;L;;;;;N;;;;; +18C6D;KHITAN SMALL SCRIPT CHARACTER-18C6D;Lo;0;L;;;;;N;;;;; +18C6E;KHITAN SMALL SCRIPT CHARACTER-18C6E;Lo;0;L;;;;;N;;;;; +18C6F;KHITAN SMALL SCRIPT CHARACTER-18C6F;Lo;0;L;;;;;N;;;;; +18C70;KHITAN SMALL SCRIPT CHARACTER-18C70;Lo;0;L;;;;;N;;;;; +18C71;KHITAN SMALL SCRIPT CHARACTER-18C71;Lo;0;L;;;;;N;;;;; +18C72;KHITAN SMALL SCRIPT CHARACTER-18C72;Lo;0;L;;;;;N;;;;; +18C73;KHITAN SMALL SCRIPT CHARACTER-18C73;Lo;0;L;;;;;N;;;;; +18C74;KHITAN SMALL SCRIPT CHARACTER-18C74;Lo;0;L;;;;;N;;;;; +18C75;KHITAN SMALL SCRIPT CHARACTER-18C75;Lo;0;L;;;;;N;;;;; +18C76;KHITAN SMALL SCRIPT CHARACTER-18C76;Lo;0;L;;;;;N;;;;; +18C77;KHITAN SMALL SCRIPT CHARACTER-18C77;Lo;0;L;;;;;N;;;;; +18C78;KHITAN SMALL SCRIPT CHARACTER-18C78;Lo;0;L;;;;;N;;;;; +18C79;KHITAN SMALL SCRIPT CHARACTER-18C79;Lo;0;L;;;;;N;;;;; +18C7A;KHITAN SMALL SCRIPT CHARACTER-18C7A;Lo;0;L;;;;;N;;;;; +18C7B;KHITAN SMALL SCRIPT CHARACTER-18C7B;Lo;0;L;;;;;N;;;;; +18C7C;KHITAN SMALL SCRIPT CHARACTER-18C7C;Lo;0;L;;;;;N;;;;; +18C7D;KHITAN SMALL SCRIPT CHARACTER-18C7D;Lo;0;L;;;;;N;;;;; +18C7E;KHITAN SMALL SCRIPT CHARACTER-18C7E;Lo;0;L;;;;;N;;;;; +18C7F;KHITAN SMALL SCRIPT CHARACTER-18C7F;Lo;0;L;;;;;N;;;;; +18C80;KHITAN SMALL SCRIPT CHARACTER-18C80;Lo;0;L;;;;;N;;;;; +18C81;KHITAN SMALL SCRIPT CHARACTER-18C81;Lo;0;L;;;;;N;;;;; +18C82;KHITAN SMALL SCRIPT CHARACTER-18C82;Lo;0;L;;;;;N;;;;; +18C83;KHITAN SMALL SCRIPT CHARACTER-18C83;Lo;0;L;;;;;N;;;;; +18C84;KHITAN SMALL SCRIPT CHARACTER-18C84;Lo;0;L;;;;;N;;;;; +18C85;KHITAN SMALL SCRIPT CHARACTER-18C85;Lo;0;L;;;;;N;;;;; +18C86;KHITAN SMALL SCRIPT CHARACTER-18C86;Lo;0;L;;;;;N;;;;; +18C87;KHITAN SMALL SCRIPT CHARACTER-18C87;Lo;0;L;;;;;N;;;;; +18C88;KHITAN SMALL SCRIPT CHARACTER-18C88;Lo;0;L;;;;;N;;;;; +18C89;KHITAN SMALL SCRIPT CHARACTER-18C89;Lo;0;L;;;;;N;;;;; +18C8A;KHITAN SMALL SCRIPT CHARACTER-18C8A;Lo;0;L;;;;;N;;;;; +18C8B;KHITAN SMALL SCRIPT CHARACTER-18C8B;Lo;0;L;;;;;N;;;;; +18C8C;KHITAN SMALL SCRIPT CHARACTER-18C8C;Lo;0;L;;;;;N;;;;; +18C8D;KHITAN SMALL SCRIPT CHARACTER-18C8D;Lo;0;L;;;;;N;;;;; +18C8E;KHITAN SMALL SCRIPT CHARACTER-18C8E;Lo;0;L;;;;;N;;;;; +18C8F;KHITAN SMALL SCRIPT CHARACTER-18C8F;Lo;0;L;;;;;N;;;;; +18C90;KHITAN SMALL SCRIPT CHARACTER-18C90;Lo;0;L;;;;;N;;;;; +18C91;KHITAN SMALL SCRIPT CHARACTER-18C91;Lo;0;L;;;;;N;;;;; +18C92;KHITAN SMALL SCRIPT CHARACTER-18C92;Lo;0;L;;;;;N;;;;; +18C93;KHITAN SMALL SCRIPT CHARACTER-18C93;Lo;0;L;;;;;N;;;;; +18C94;KHITAN SMALL SCRIPT CHARACTER-18C94;Lo;0;L;;;;;N;;;;; +18C95;KHITAN SMALL SCRIPT CHARACTER-18C95;Lo;0;L;;;;;N;;;;; +18C96;KHITAN SMALL SCRIPT CHARACTER-18C96;Lo;0;L;;;;;N;;;;; +18C97;KHITAN SMALL SCRIPT CHARACTER-18C97;Lo;0;L;;;;;N;;;;; +18C98;KHITAN SMALL SCRIPT CHARACTER-18C98;Lo;0;L;;;;;N;;;;; +18C99;KHITAN SMALL SCRIPT CHARACTER-18C99;Lo;0;L;;;;;N;;;;; +18C9A;KHITAN SMALL SCRIPT CHARACTER-18C9A;Lo;0;L;;;;;N;;;;; +18C9B;KHITAN SMALL SCRIPT CHARACTER-18C9B;Lo;0;L;;;;;N;;;;; +18C9C;KHITAN SMALL SCRIPT CHARACTER-18C9C;Lo;0;L;;;;;N;;;;; +18C9D;KHITAN SMALL SCRIPT CHARACTER-18C9D;Lo;0;L;;;;;N;;;;; +18C9E;KHITAN SMALL SCRIPT CHARACTER-18C9E;Lo;0;L;;;;;N;;;;; +18C9F;KHITAN SMALL SCRIPT CHARACTER-18C9F;Lo;0;L;;;;;N;;;;; +18CA0;KHITAN SMALL SCRIPT CHARACTER-18CA0;Lo;0;L;;;;;N;;;;; +18CA1;KHITAN SMALL SCRIPT CHARACTER-18CA1;Lo;0;L;;;;;N;;;;; +18CA2;KHITAN SMALL SCRIPT CHARACTER-18CA2;Lo;0;L;;;;;N;;;;; +18CA3;KHITAN SMALL SCRIPT CHARACTER-18CA3;Lo;0;L;;;;;N;;;;; +18CA4;KHITAN SMALL SCRIPT CHARACTER-18CA4;Lo;0;L;;;;;N;;;;; +18CA5;KHITAN SMALL SCRIPT CHARACTER-18CA5;Lo;0;L;;;;;N;;;;; +18CA6;KHITAN SMALL SCRIPT CHARACTER-18CA6;Lo;0;L;;;;;N;;;;; +18CA7;KHITAN SMALL SCRIPT CHARACTER-18CA7;Lo;0;L;;;;;N;;;;; +18CA8;KHITAN SMALL SCRIPT CHARACTER-18CA8;Lo;0;L;;;;;N;;;;; +18CA9;KHITAN SMALL SCRIPT CHARACTER-18CA9;Lo;0;L;;;;;N;;;;; +18CAA;KHITAN SMALL SCRIPT CHARACTER-18CAA;Lo;0;L;;;;;N;;;;; +18CAB;KHITAN SMALL SCRIPT CHARACTER-18CAB;Lo;0;L;;;;;N;;;;; +18CAC;KHITAN SMALL SCRIPT CHARACTER-18CAC;Lo;0;L;;;;;N;;;;; +18CAD;KHITAN SMALL SCRIPT CHARACTER-18CAD;Lo;0;L;;;;;N;;;;; +18CAE;KHITAN SMALL SCRIPT CHARACTER-18CAE;Lo;0;L;;;;;N;;;;; +18CAF;KHITAN SMALL SCRIPT CHARACTER-18CAF;Lo;0;L;;;;;N;;;;; +18CB0;KHITAN SMALL SCRIPT CHARACTER-18CB0;Lo;0;L;;;;;N;;;;; +18CB1;KHITAN SMALL SCRIPT CHARACTER-18CB1;Lo;0;L;;;;;N;;;;; +18CB2;KHITAN SMALL SCRIPT CHARACTER-18CB2;Lo;0;L;;;;;N;;;;; +18CB3;KHITAN SMALL SCRIPT CHARACTER-18CB3;Lo;0;L;;;;;N;;;;; +18CB4;KHITAN SMALL SCRIPT CHARACTER-18CB4;Lo;0;L;;;;;N;;;;; +18CB5;KHITAN SMALL SCRIPT CHARACTER-18CB5;Lo;0;L;;;;;N;;;;; +18CB6;KHITAN SMALL SCRIPT CHARACTER-18CB6;Lo;0;L;;;;;N;;;;; +18CB7;KHITAN SMALL SCRIPT CHARACTER-18CB7;Lo;0;L;;;;;N;;;;; +18CB8;KHITAN SMALL SCRIPT CHARACTER-18CB8;Lo;0;L;;;;;N;;;;; +18CB9;KHITAN SMALL SCRIPT CHARACTER-18CB9;Lo;0;L;;;;;N;;;;; +18CBA;KHITAN SMALL SCRIPT CHARACTER-18CBA;Lo;0;L;;;;;N;;;;; +18CBB;KHITAN SMALL SCRIPT CHARACTER-18CBB;Lo;0;L;;;;;N;;;;; +18CBC;KHITAN SMALL SCRIPT CHARACTER-18CBC;Lo;0;L;;;;;N;;;;; +18CBD;KHITAN SMALL SCRIPT CHARACTER-18CBD;Lo;0;L;;;;;N;;;;; +18CBE;KHITAN SMALL SCRIPT CHARACTER-18CBE;Lo;0;L;;;;;N;;;;; +18CBF;KHITAN SMALL SCRIPT CHARACTER-18CBF;Lo;0;L;;;;;N;;;;; +18CC0;KHITAN SMALL SCRIPT CHARACTER-18CC0;Lo;0;L;;;;;N;;;;; +18CC1;KHITAN SMALL SCRIPT CHARACTER-18CC1;Lo;0;L;;;;;N;;;;; +18CC2;KHITAN SMALL SCRIPT CHARACTER-18CC2;Lo;0;L;;;;;N;;;;; +18CC3;KHITAN SMALL SCRIPT CHARACTER-18CC3;Lo;0;L;;;;;N;;;;; +18CC4;KHITAN SMALL SCRIPT CHARACTER-18CC4;Lo;0;L;;;;;N;;;;; +18CC5;KHITAN SMALL SCRIPT CHARACTER-18CC5;Lo;0;L;;;;;N;;;;; +18CC6;KHITAN SMALL SCRIPT CHARACTER-18CC6;Lo;0;L;;;;;N;;;;; +18CC7;KHITAN SMALL SCRIPT CHARACTER-18CC7;Lo;0;L;;;;;N;;;;; +18CC8;KHITAN SMALL SCRIPT CHARACTER-18CC8;Lo;0;L;;;;;N;;;;; +18CC9;KHITAN SMALL SCRIPT CHARACTER-18CC9;Lo;0;L;;;;;N;;;;; +18CCA;KHITAN SMALL SCRIPT CHARACTER-18CCA;Lo;0;L;;;;;N;;;;; +18CCB;KHITAN SMALL SCRIPT CHARACTER-18CCB;Lo;0;L;;;;;N;;;;; +18CCC;KHITAN SMALL SCRIPT CHARACTER-18CCC;Lo;0;L;;;;;N;;;;; +18CCD;KHITAN SMALL SCRIPT CHARACTER-18CCD;Lo;0;L;;;;;N;;;;; +18CCE;KHITAN SMALL SCRIPT CHARACTER-18CCE;Lo;0;L;;;;;N;;;;; +18CCF;KHITAN SMALL SCRIPT CHARACTER-18CCF;Lo;0;L;;;;;N;;;;; +18CD0;KHITAN SMALL SCRIPT CHARACTER-18CD0;Lo;0;L;;;;;N;;;;; +18CD1;KHITAN SMALL SCRIPT CHARACTER-18CD1;Lo;0;L;;;;;N;;;;; +18CD2;KHITAN SMALL SCRIPT CHARACTER-18CD2;Lo;0;L;;;;;N;;;;; +18CD3;KHITAN SMALL SCRIPT CHARACTER-18CD3;Lo;0;L;;;;;N;;;;; +18CD4;KHITAN SMALL SCRIPT CHARACTER-18CD4;Lo;0;L;;;;;N;;;;; +18CD5;KHITAN SMALL SCRIPT CHARACTER-18CD5;Lo;0;L;;;;;N;;;;; +18CFF;KHITAN SMALL SCRIPT CHARACTER-18CFF;Lo;0;L;;;;;N;;;;; +18D00;;Lo;0;L;;;;;N;;;;; +18D1E;;Lo;0;L;;;;;N;;;;; +18D80;TANGUT COMPONENT-769;Lo;0;L;;;;;N;;;;; +18D81;TANGUT COMPONENT-770;Lo;0;L;;;;;N;;;;; +18D82;TANGUT COMPONENT-771;Lo;0;L;;;;;N;;;;; +18D83;TANGUT COMPONENT-772;Lo;0;L;;;;;N;;;;; +18D84;TANGUT COMPONENT-773;Lo;0;L;;;;;N;;;;; +18D85;TANGUT COMPONENT-774;Lo;0;L;;;;;N;;;;; +18D86;TANGUT COMPONENT-775;Lo;0;L;;;;;N;;;;; +18D87;TANGUT COMPONENT-776;Lo;0;L;;;;;N;;;;; +18D88;TANGUT COMPONENT-777;Lo;0;L;;;;;N;;;;; +18D89;TANGUT COMPONENT-778;Lo;0;L;;;;;N;;;;; +18D8A;TANGUT COMPONENT-779;Lo;0;L;;;;;N;;;;; +18D8B;TANGUT COMPONENT-780;Lo;0;L;;;;;N;;;;; +18D8C;TANGUT COMPONENT-781;Lo;0;L;;;;;N;;;;; +18D8D;TANGUT COMPONENT-782;Lo;0;L;;;;;N;;;;; +18D8E;TANGUT COMPONENT-783;Lo;0;L;;;;;N;;;;; +18D8F;TANGUT COMPONENT-784;Lo;0;L;;;;;N;;;;; +18D90;TANGUT COMPONENT-785;Lo;0;L;;;;;N;;;;; +18D91;TANGUT COMPONENT-786;Lo;0;L;;;;;N;;;;; +18D92;TANGUT COMPONENT-787;Lo;0;L;;;;;N;;;;; +18D93;TANGUT COMPONENT-788;Lo;0;L;;;;;N;;;;; +18D94;TANGUT COMPONENT-789;Lo;0;L;;;;;N;;;;; +18D95;TANGUT COMPONENT-790;Lo;0;L;;;;;N;;;;; +18D96;TANGUT COMPONENT-791;Lo;0;L;;;;;N;;;;; +18D97;TANGUT COMPONENT-792;Lo;0;L;;;;;N;;;;; +18D98;TANGUT COMPONENT-793;Lo;0;L;;;;;N;;;;; +18D99;TANGUT COMPONENT-794;Lo;0;L;;;;;N;;;;; +18D9A;TANGUT COMPONENT-795;Lo;0;L;;;;;N;;;;; +18D9B;TANGUT COMPONENT-796;Lo;0;L;;;;;N;;;;; +18D9C;TANGUT COMPONENT-797;Lo;0;L;;;;;N;;;;; +18D9D;TANGUT COMPONENT-798;Lo;0;L;;;;;N;;;;; +18D9E;TANGUT COMPONENT-799;Lo;0;L;;;;;N;;;;; +18D9F;TANGUT COMPONENT-800;Lo;0;L;;;;;N;;;;; +18DA0;TANGUT COMPONENT-801;Lo;0;L;;;;;N;;;;; +18DA1;TANGUT COMPONENT-802;Lo;0;L;;;;;N;;;;; +18DA2;TANGUT COMPONENT-803;Lo;0;L;;;;;N;;;;; +18DA3;TANGUT COMPONENT-804;Lo;0;L;;;;;N;;;;; +18DA4;TANGUT COMPONENT-805;Lo;0;L;;;;;N;;;;; +18DA5;TANGUT COMPONENT-806;Lo;0;L;;;;;N;;;;; +18DA6;TANGUT COMPONENT-807;Lo;0;L;;;;;N;;;;; +18DA7;TANGUT COMPONENT-808;Lo;0;L;;;;;N;;;;; +18DA8;TANGUT COMPONENT-809;Lo;0;L;;;;;N;;;;; +18DA9;TANGUT COMPONENT-810;Lo;0;L;;;;;N;;;;; +18DAA;TANGUT COMPONENT-811;Lo;0;L;;;;;N;;;;; +18DAB;TANGUT COMPONENT-812;Lo;0;L;;;;;N;;;;; +18DAC;TANGUT COMPONENT-813;Lo;0;L;;;;;N;;;;; +18DAD;TANGUT COMPONENT-814;Lo;0;L;;;;;N;;;;; +18DAE;TANGUT COMPONENT-815;Lo;0;L;;;;;N;;;;; +18DAF;TANGUT COMPONENT-816;Lo;0;L;;;;;N;;;;; +18DB0;TANGUT COMPONENT-817;Lo;0;L;;;;;N;;;;; +18DB1;TANGUT COMPONENT-818;Lo;0;L;;;;;N;;;;; +18DB2;TANGUT COMPONENT-819;Lo;0;L;;;;;N;;;;; +18DB3;TANGUT COMPONENT-820;Lo;0;L;;;;;N;;;;; +18DB4;TANGUT COMPONENT-821;Lo;0;L;;;;;N;;;;; +18DB5;TANGUT COMPONENT-822;Lo;0;L;;;;;N;;;;; +18DB6;TANGUT COMPONENT-823;Lo;0;L;;;;;N;;;;; +18DB7;TANGUT COMPONENT-824;Lo;0;L;;;;;N;;;;; +18DB8;TANGUT COMPONENT-825;Lo;0;L;;;;;N;;;;; +18DB9;TANGUT COMPONENT-826;Lo;0;L;;;;;N;;;;; +18DBA;TANGUT COMPONENT-827;Lo;0;L;;;;;N;;;;; +18DBB;TANGUT COMPONENT-828;Lo;0;L;;;;;N;;;;; +18DBC;TANGUT COMPONENT-829;Lo;0;L;;;;;N;;;;; +18DBD;TANGUT COMPONENT-830;Lo;0;L;;;;;N;;;;; +18DBE;TANGUT COMPONENT-831;Lo;0;L;;;;;N;;;;; +18DBF;TANGUT COMPONENT-832;Lo;0;L;;;;;N;;;;; +18DC0;TANGUT COMPONENT-833;Lo;0;L;;;;;N;;;;; +18DC1;TANGUT COMPONENT-834;Lo;0;L;;;;;N;;;;; +18DC2;TANGUT COMPONENT-835;Lo;0;L;;;;;N;;;;; +18DC3;TANGUT COMPONENT-836;Lo;0;L;;;;;N;;;;; +18DC4;TANGUT COMPONENT-837;Lo;0;L;;;;;N;;;;; +18DC5;TANGUT COMPONENT-838;Lo;0;L;;;;;N;;;;; +18DC6;TANGUT COMPONENT-839;Lo;0;L;;;;;N;;;;; +18DC7;TANGUT COMPONENT-840;Lo;0;L;;;;;N;;;;; +18DC8;TANGUT COMPONENT-841;Lo;0;L;;;;;N;;;;; +18DC9;TANGUT COMPONENT-842;Lo;0;L;;;;;N;;;;; +18DCA;TANGUT COMPONENT-843;Lo;0;L;;;;;N;;;;; +18DCB;TANGUT COMPONENT-844;Lo;0;L;;;;;N;;;;; +18DCC;TANGUT COMPONENT-845;Lo;0;L;;;;;N;;;;; +18DCD;TANGUT COMPONENT-846;Lo;0;L;;;;;N;;;;; +18DCE;TANGUT COMPONENT-847;Lo;0;L;;;;;N;;;;; +18DCF;TANGUT COMPONENT-848;Lo;0;L;;;;;N;;;;; +18DD0;TANGUT COMPONENT-849;Lo;0;L;;;;;N;;;;; +18DD1;TANGUT COMPONENT-850;Lo;0;L;;;;;N;;;;; +18DD2;TANGUT COMPONENT-851;Lo;0;L;;;;;N;;;;; +18DD3;TANGUT COMPONENT-852;Lo;0;L;;;;;N;;;;; +18DD4;TANGUT COMPONENT-853;Lo;0;L;;;;;N;;;;; +18DD5;TANGUT COMPONENT-854;Lo;0;L;;;;;N;;;;; +18DD6;TANGUT COMPONENT-855;Lo;0;L;;;;;N;;;;; +18DD7;TANGUT COMPONENT-856;Lo;0;L;;;;;N;;;;; +18DD8;TANGUT COMPONENT-857;Lo;0;L;;;;;N;;;;; +18DD9;TANGUT COMPONENT-858;Lo;0;L;;;;;N;;;;; +18DDA;TANGUT COMPONENT-859;Lo;0;L;;;;;N;;;;; +18DDB;TANGUT COMPONENT-860;Lo;0;L;;;;;N;;;;; +18DDC;TANGUT COMPONENT-861;Lo;0;L;;;;;N;;;;; +18DDD;TANGUT COMPONENT-862;Lo;0;L;;;;;N;;;;; +18DDE;TANGUT COMPONENT-863;Lo;0;L;;;;;N;;;;; +18DDF;TANGUT COMPONENT-864;Lo;0;L;;;;;N;;;;; +18DE0;TANGUT COMPONENT-865;Lo;0;L;;;;;N;;;;; +18DE1;TANGUT COMPONENT-866;Lo;0;L;;;;;N;;;;; +18DE2;TANGUT COMPONENT-867;Lo;0;L;;;;;N;;;;; +18DE3;TANGUT COMPONENT-868;Lo;0;L;;;;;N;;;;; +18DE4;TANGUT COMPONENT-869;Lo;0;L;;;;;N;;;;; +18DE5;TANGUT COMPONENT-870;Lo;0;L;;;;;N;;;;; +18DE6;TANGUT COMPONENT-871;Lo;0;L;;;;;N;;;;; +18DE7;TANGUT COMPONENT-872;Lo;0;L;;;;;N;;;;; +18DE8;TANGUT COMPONENT-873;Lo;0;L;;;;;N;;;;; +18DE9;TANGUT COMPONENT-874;Lo;0;L;;;;;N;;;;; +18DEA;TANGUT COMPONENT-875;Lo;0;L;;;;;N;;;;; +18DEB;TANGUT COMPONENT-876;Lo;0;L;;;;;N;;;;; +18DEC;TANGUT COMPONENT-877;Lo;0;L;;;;;N;;;;; +18DED;TANGUT COMPONENT-878;Lo;0;L;;;;;N;;;;; +18DEE;TANGUT COMPONENT-879;Lo;0;L;;;;;N;;;;; +18DEF;TANGUT COMPONENT-880;Lo;0;L;;;;;N;;;;; +18DF0;TANGUT COMPONENT-881;Lo;0;L;;;;;N;;;;; +18DF1;TANGUT COMPONENT-882;Lo;0;L;;;;;N;;;;; +18DF2;TANGUT COMPONENT-883;Lo;0;L;;;;;N;;;;; +1AFF0;KATAKANA LETTER MINNAN TONE-2;Lm;0;L;;;;;N;;;;; +1AFF1;KATAKANA LETTER MINNAN TONE-3;Lm;0;L;;;;;N;;;;; +1AFF2;KATAKANA LETTER MINNAN TONE-4;Lm;0;L;;;;;N;;;;; +1AFF3;KATAKANA LETTER MINNAN TONE-5;Lm;0;L;;;;;N;;;;; +1AFF5;KATAKANA LETTER MINNAN TONE-7;Lm;0;L;;;;;N;;;;; +1AFF6;KATAKANA LETTER MINNAN TONE-8;Lm;0;L;;;;;N;;;;; +1AFF7;KATAKANA LETTER MINNAN NASALIZED TONE-1;Lm;0;L;;;;;N;;;;; +1AFF8;KATAKANA LETTER MINNAN NASALIZED TONE-2;Lm;0;L;;;;;N;;;;; +1AFF9;KATAKANA LETTER MINNAN NASALIZED TONE-3;Lm;0;L;;;;;N;;;;; +1AFFA;KATAKANA LETTER MINNAN NASALIZED TONE-4;Lm;0;L;;;;;N;;;;; +1AFFB;KATAKANA LETTER MINNAN NASALIZED TONE-5;Lm;0;L;;;;;N;;;;; +1AFFD;KATAKANA LETTER MINNAN NASALIZED TONE-7;Lm;0;L;;;;;N;;;;; +1AFFE;KATAKANA LETTER MINNAN NASALIZED TONE-8;Lm;0;L;;;;;N;;;;; +1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; +1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; +1B002;HENTAIGANA LETTER A-1;Lo;0;L;;;;;N;;;;; +1B003;HENTAIGANA LETTER A-2;Lo;0;L;;;;;N;;;;; +1B004;HENTAIGANA LETTER A-3;Lo;0;L;;;;;N;;;;; +1B005;HENTAIGANA LETTER A-WO;Lo;0;L;;;;;N;;;;; +1B006;HENTAIGANA LETTER I-1;Lo;0;L;;;;;N;;;;; +1B007;HENTAIGANA LETTER I-2;Lo;0;L;;;;;N;;;;; +1B008;HENTAIGANA LETTER I-3;Lo;0;L;;;;;N;;;;; +1B009;HENTAIGANA LETTER I-4;Lo;0;L;;;;;N;;;;; +1B00A;HENTAIGANA LETTER U-1;Lo;0;L;;;;;N;;;;; +1B00B;HENTAIGANA LETTER U-2;Lo;0;L;;;;;N;;;;; +1B00C;HENTAIGANA LETTER U-3;Lo;0;L;;;;;N;;;;; +1B00D;HENTAIGANA LETTER U-4;Lo;0;L;;;;;N;;;;; +1B00E;HENTAIGANA LETTER U-5;Lo;0;L;;;;;N;;;;; +1B00F;HENTAIGANA LETTER E-2;Lo;0;L;;;;;N;;;;; +1B010;HENTAIGANA LETTER E-3;Lo;0;L;;;;;N;;;;; +1B011;HENTAIGANA LETTER E-4;Lo;0;L;;;;;N;;;;; +1B012;HENTAIGANA LETTER E-5;Lo;0;L;;;;;N;;;;; +1B013;HENTAIGANA LETTER E-6;Lo;0;L;;;;;N;;;;; +1B014;HENTAIGANA LETTER O-1;Lo;0;L;;;;;N;;;;; +1B015;HENTAIGANA LETTER O-2;Lo;0;L;;;;;N;;;;; +1B016;HENTAIGANA LETTER O-3;Lo;0;L;;;;;N;;;;; +1B017;HENTAIGANA LETTER KA-1;Lo;0;L;;;;;N;;;;; +1B018;HENTAIGANA LETTER KA-2;Lo;0;L;;;;;N;;;;; +1B019;HENTAIGANA LETTER KA-3;Lo;0;L;;;;;N;;;;; +1B01A;HENTAIGANA LETTER KA-4;Lo;0;L;;;;;N;;;;; +1B01B;HENTAIGANA LETTER KA-5;Lo;0;L;;;;;N;;;;; +1B01C;HENTAIGANA LETTER KA-6;Lo;0;L;;;;;N;;;;; +1B01D;HENTAIGANA LETTER KA-7;Lo;0;L;;;;;N;;;;; +1B01E;HENTAIGANA LETTER KA-8;Lo;0;L;;;;;N;;;;; +1B01F;HENTAIGANA LETTER KA-9;Lo;0;L;;;;;N;;;;; +1B020;HENTAIGANA LETTER KA-10;Lo;0;L;;;;;N;;;;; +1B021;HENTAIGANA LETTER KA-11;Lo;0;L;;;;;N;;;;; +1B022;HENTAIGANA LETTER KA-KE;Lo;0;L;;;;;N;;;;; +1B023;HENTAIGANA LETTER KI-1;Lo;0;L;;;;;N;;;;; +1B024;HENTAIGANA LETTER KI-2;Lo;0;L;;;;;N;;;;; +1B025;HENTAIGANA LETTER KI-3;Lo;0;L;;;;;N;;;;; +1B026;HENTAIGANA LETTER KI-4;Lo;0;L;;;;;N;;;;; +1B027;HENTAIGANA LETTER KI-5;Lo;0;L;;;;;N;;;;; +1B028;HENTAIGANA LETTER KI-6;Lo;0;L;;;;;N;;;;; +1B029;HENTAIGANA LETTER KI-7;Lo;0;L;;;;;N;;;;; +1B02A;HENTAIGANA LETTER KI-8;Lo;0;L;;;;;N;;;;; +1B02B;HENTAIGANA LETTER KU-1;Lo;0;L;;;;;N;;;;; +1B02C;HENTAIGANA LETTER KU-2;Lo;0;L;;;;;N;;;;; +1B02D;HENTAIGANA LETTER KU-3;Lo;0;L;;;;;N;;;;; +1B02E;HENTAIGANA LETTER KU-4;Lo;0;L;;;;;N;;;;; +1B02F;HENTAIGANA LETTER KU-5;Lo;0;L;;;;;N;;;;; +1B030;HENTAIGANA LETTER KU-6;Lo;0;L;;;;;N;;;;; +1B031;HENTAIGANA LETTER KU-7;Lo;0;L;;;;;N;;;;; +1B032;HENTAIGANA LETTER KE-1;Lo;0;L;;;;;N;;;;; +1B033;HENTAIGANA LETTER KE-2;Lo;0;L;;;;;N;;;;; +1B034;HENTAIGANA LETTER KE-3;Lo;0;L;;;;;N;;;;; +1B035;HENTAIGANA LETTER KE-4;Lo;0;L;;;;;N;;;;; +1B036;HENTAIGANA LETTER KE-5;Lo;0;L;;;;;N;;;;; +1B037;HENTAIGANA LETTER KE-6;Lo;0;L;;;;;N;;;;; +1B038;HENTAIGANA LETTER KO-1;Lo;0;L;;;;;N;;;;; +1B039;HENTAIGANA LETTER KO-2;Lo;0;L;;;;;N;;;;; +1B03A;HENTAIGANA LETTER KO-3;Lo;0;L;;;;;N;;;;; +1B03B;HENTAIGANA LETTER KO-KI;Lo;0;L;;;;;N;;;;; +1B03C;HENTAIGANA LETTER SA-1;Lo;0;L;;;;;N;;;;; +1B03D;HENTAIGANA LETTER SA-2;Lo;0;L;;;;;N;;;;; +1B03E;HENTAIGANA LETTER SA-3;Lo;0;L;;;;;N;;;;; +1B03F;HENTAIGANA LETTER SA-4;Lo;0;L;;;;;N;;;;; +1B040;HENTAIGANA LETTER SA-5;Lo;0;L;;;;;N;;;;; +1B041;HENTAIGANA LETTER SA-6;Lo;0;L;;;;;N;;;;; +1B042;HENTAIGANA LETTER SA-7;Lo;0;L;;;;;N;;;;; +1B043;HENTAIGANA LETTER SA-8;Lo;0;L;;;;;N;;;;; +1B044;HENTAIGANA LETTER SI-1;Lo;0;L;;;;;N;;;;; +1B045;HENTAIGANA LETTER SI-2;Lo;0;L;;;;;N;;;;; +1B046;HENTAIGANA LETTER SI-3;Lo;0;L;;;;;N;;;;; +1B047;HENTAIGANA LETTER SI-4;Lo;0;L;;;;;N;;;;; +1B048;HENTAIGANA LETTER SI-5;Lo;0;L;;;;;N;;;;; +1B049;HENTAIGANA LETTER SI-6;Lo;0;L;;;;;N;;;;; +1B04A;HENTAIGANA LETTER SU-1;Lo;0;L;;;;;N;;;;; +1B04B;HENTAIGANA LETTER SU-2;Lo;0;L;;;;;N;;;;; +1B04C;HENTAIGANA LETTER SU-3;Lo;0;L;;;;;N;;;;; +1B04D;HENTAIGANA LETTER SU-4;Lo;0;L;;;;;N;;;;; +1B04E;HENTAIGANA LETTER SU-5;Lo;0;L;;;;;N;;;;; +1B04F;HENTAIGANA LETTER SU-6;Lo;0;L;;;;;N;;;;; +1B050;HENTAIGANA LETTER SU-7;Lo;0;L;;;;;N;;;;; +1B051;HENTAIGANA LETTER SU-8;Lo;0;L;;;;;N;;;;; +1B052;HENTAIGANA LETTER SE-1;Lo;0;L;;;;;N;;;;; +1B053;HENTAIGANA LETTER SE-2;Lo;0;L;;;;;N;;;;; +1B054;HENTAIGANA LETTER SE-3;Lo;0;L;;;;;N;;;;; +1B055;HENTAIGANA LETTER SE-4;Lo;0;L;;;;;N;;;;; +1B056;HENTAIGANA LETTER SE-5;Lo;0;L;;;;;N;;;;; +1B057;HENTAIGANA LETTER SO-1;Lo;0;L;;;;;N;;;;; +1B058;HENTAIGANA LETTER SO-2;Lo;0;L;;;;;N;;;;; +1B059;HENTAIGANA LETTER SO-3;Lo;0;L;;;;;N;;;;; +1B05A;HENTAIGANA LETTER SO-4;Lo;0;L;;;;;N;;;;; +1B05B;HENTAIGANA LETTER SO-5;Lo;0;L;;;;;N;;;;; +1B05C;HENTAIGANA LETTER SO-6;Lo;0;L;;;;;N;;;;; +1B05D;HENTAIGANA LETTER SO-7;Lo;0;L;;;;;N;;;;; +1B05E;HENTAIGANA LETTER TA-1;Lo;0;L;;;;;N;;;;; +1B05F;HENTAIGANA LETTER TA-2;Lo;0;L;;;;;N;;;;; +1B060;HENTAIGANA LETTER TA-3;Lo;0;L;;;;;N;;;;; +1B061;HENTAIGANA LETTER TA-4;Lo;0;L;;;;;N;;;;; +1B062;HENTAIGANA LETTER TI-1;Lo;0;L;;;;;N;;;;; +1B063;HENTAIGANA LETTER TI-2;Lo;0;L;;;;;N;;;;; +1B064;HENTAIGANA LETTER TI-3;Lo;0;L;;;;;N;;;;; +1B065;HENTAIGANA LETTER TI-4;Lo;0;L;;;;;N;;;;; +1B066;HENTAIGANA LETTER TI-5;Lo;0;L;;;;;N;;;;; +1B067;HENTAIGANA LETTER TI-6;Lo;0;L;;;;;N;;;;; +1B068;HENTAIGANA LETTER TI-7;Lo;0;L;;;;;N;;;;; +1B069;HENTAIGANA LETTER TU-1;Lo;0;L;;;;;N;;;;; +1B06A;HENTAIGANA LETTER TU-2;Lo;0;L;;;;;N;;;;; +1B06B;HENTAIGANA LETTER TU-3;Lo;0;L;;;;;N;;;;; +1B06C;HENTAIGANA LETTER TU-4;Lo;0;L;;;;;N;;;;; +1B06D;HENTAIGANA LETTER TU-TO;Lo;0;L;;;;;N;;;;; +1B06E;HENTAIGANA LETTER TE-1;Lo;0;L;;;;;N;;;;; +1B06F;HENTAIGANA LETTER TE-2;Lo;0;L;;;;;N;;;;; +1B070;HENTAIGANA LETTER TE-3;Lo;0;L;;;;;N;;;;; +1B071;HENTAIGANA LETTER TE-4;Lo;0;L;;;;;N;;;;; +1B072;HENTAIGANA LETTER TE-5;Lo;0;L;;;;;N;;;;; +1B073;HENTAIGANA LETTER TE-6;Lo;0;L;;;;;N;;;;; +1B074;HENTAIGANA LETTER TE-7;Lo;0;L;;;;;N;;;;; +1B075;HENTAIGANA LETTER TE-8;Lo;0;L;;;;;N;;;;; +1B076;HENTAIGANA LETTER TE-9;Lo;0;L;;;;;N;;;;; +1B077;HENTAIGANA LETTER TO-1;Lo;0;L;;;;;N;;;;; +1B078;HENTAIGANA LETTER TO-2;Lo;0;L;;;;;N;;;;; +1B079;HENTAIGANA LETTER TO-3;Lo;0;L;;;;;N;;;;; +1B07A;HENTAIGANA LETTER TO-4;Lo;0;L;;;;;N;;;;; +1B07B;HENTAIGANA LETTER TO-5;Lo;0;L;;;;;N;;;;; +1B07C;HENTAIGANA LETTER TO-6;Lo;0;L;;;;;N;;;;; +1B07D;HENTAIGANA LETTER TO-RA;Lo;0;L;;;;;N;;;;; +1B07E;HENTAIGANA LETTER NA-1;Lo;0;L;;;;;N;;;;; +1B07F;HENTAIGANA LETTER NA-2;Lo;0;L;;;;;N;;;;; +1B080;HENTAIGANA LETTER NA-3;Lo;0;L;;;;;N;;;;; +1B081;HENTAIGANA LETTER NA-4;Lo;0;L;;;;;N;;;;; +1B082;HENTAIGANA LETTER NA-5;Lo;0;L;;;;;N;;;;; +1B083;HENTAIGANA LETTER NA-6;Lo;0;L;;;;;N;;;;; +1B084;HENTAIGANA LETTER NA-7;Lo;0;L;;;;;N;;;;; +1B085;HENTAIGANA LETTER NA-8;Lo;0;L;;;;;N;;;;; +1B086;HENTAIGANA LETTER NA-9;Lo;0;L;;;;;N;;;;; +1B087;HENTAIGANA LETTER NI-1;Lo;0;L;;;;;N;;;;; +1B088;HENTAIGANA LETTER NI-2;Lo;0;L;;;;;N;;;;; +1B089;HENTAIGANA LETTER NI-3;Lo;0;L;;;;;N;;;;; +1B08A;HENTAIGANA LETTER NI-4;Lo;0;L;;;;;N;;;;; +1B08B;HENTAIGANA LETTER NI-5;Lo;0;L;;;;;N;;;;; +1B08C;HENTAIGANA LETTER NI-6;Lo;0;L;;;;;N;;;;; +1B08D;HENTAIGANA LETTER NI-7;Lo;0;L;;;;;N;;;;; +1B08E;HENTAIGANA LETTER NI-TE;Lo;0;L;;;;;N;;;;; +1B08F;HENTAIGANA LETTER NU-1;Lo;0;L;;;;;N;;;;; +1B090;HENTAIGANA LETTER NU-2;Lo;0;L;;;;;N;;;;; +1B091;HENTAIGANA LETTER NU-3;Lo;0;L;;;;;N;;;;; +1B092;HENTAIGANA LETTER NE-1;Lo;0;L;;;;;N;;;;; +1B093;HENTAIGANA LETTER NE-2;Lo;0;L;;;;;N;;;;; +1B094;HENTAIGANA LETTER NE-3;Lo;0;L;;;;;N;;;;; +1B095;HENTAIGANA LETTER NE-4;Lo;0;L;;;;;N;;;;; +1B096;HENTAIGANA LETTER NE-5;Lo;0;L;;;;;N;;;;; +1B097;HENTAIGANA LETTER NE-6;Lo;0;L;;;;;N;;;;; +1B098;HENTAIGANA LETTER NE-KO;Lo;0;L;;;;;N;;;;; +1B099;HENTAIGANA LETTER NO-1;Lo;0;L;;;;;N;;;;; +1B09A;HENTAIGANA LETTER NO-2;Lo;0;L;;;;;N;;;;; +1B09B;HENTAIGANA LETTER NO-3;Lo;0;L;;;;;N;;;;; +1B09C;HENTAIGANA LETTER NO-4;Lo;0;L;;;;;N;;;;; +1B09D;HENTAIGANA LETTER NO-5;Lo;0;L;;;;;N;;;;; +1B09E;HENTAIGANA LETTER HA-1;Lo;0;L;;;;;N;;;;; +1B09F;HENTAIGANA LETTER HA-2;Lo;0;L;;;;;N;;;;; +1B0A0;HENTAIGANA LETTER HA-3;Lo;0;L;;;;;N;;;;; +1B0A1;HENTAIGANA LETTER HA-4;Lo;0;L;;;;;N;;;;; +1B0A2;HENTAIGANA LETTER HA-5;Lo;0;L;;;;;N;;;;; +1B0A3;HENTAIGANA LETTER HA-6;Lo;0;L;;;;;N;;;;; +1B0A4;HENTAIGANA LETTER HA-7;Lo;0;L;;;;;N;;;;; +1B0A5;HENTAIGANA LETTER HA-8;Lo;0;L;;;;;N;;;;; +1B0A6;HENTAIGANA LETTER HA-9;Lo;0;L;;;;;N;;;;; +1B0A7;HENTAIGANA LETTER HA-10;Lo;0;L;;;;;N;;;;; +1B0A8;HENTAIGANA LETTER HA-11;Lo;0;L;;;;;N;;;;; +1B0A9;HENTAIGANA LETTER HI-1;Lo;0;L;;;;;N;;;;; +1B0AA;HENTAIGANA LETTER HI-2;Lo;0;L;;;;;N;;;;; +1B0AB;HENTAIGANA LETTER HI-3;Lo;0;L;;;;;N;;;;; +1B0AC;HENTAIGANA LETTER HI-4;Lo;0;L;;;;;N;;;;; +1B0AD;HENTAIGANA LETTER HI-5;Lo;0;L;;;;;N;;;;; +1B0AE;HENTAIGANA LETTER HI-6;Lo;0;L;;;;;N;;;;; +1B0AF;HENTAIGANA LETTER HI-7;Lo;0;L;;;;;N;;;;; +1B0B0;HENTAIGANA LETTER HU-1;Lo;0;L;;;;;N;;;;; +1B0B1;HENTAIGANA LETTER HU-2;Lo;0;L;;;;;N;;;;; +1B0B2;HENTAIGANA LETTER HU-3;Lo;0;L;;;;;N;;;;; +1B0B3;HENTAIGANA LETTER HE-1;Lo;0;L;;;;;N;;;;; +1B0B4;HENTAIGANA LETTER HE-2;Lo;0;L;;;;;N;;;;; +1B0B5;HENTAIGANA LETTER HE-3;Lo;0;L;;;;;N;;;;; +1B0B6;HENTAIGANA LETTER HE-4;Lo;0;L;;;;;N;;;;; +1B0B7;HENTAIGANA LETTER HE-5;Lo;0;L;;;;;N;;;;; +1B0B8;HENTAIGANA LETTER HE-6;Lo;0;L;;;;;N;;;;; +1B0B9;HENTAIGANA LETTER HE-7;Lo;0;L;;;;;N;;;;; +1B0BA;HENTAIGANA LETTER HO-1;Lo;0;L;;;;;N;;;;; +1B0BB;HENTAIGANA LETTER HO-2;Lo;0;L;;;;;N;;;;; +1B0BC;HENTAIGANA LETTER HO-3;Lo;0;L;;;;;N;;;;; +1B0BD;HENTAIGANA LETTER HO-4;Lo;0;L;;;;;N;;;;; +1B0BE;HENTAIGANA LETTER HO-5;Lo;0;L;;;;;N;;;;; +1B0BF;HENTAIGANA LETTER HO-6;Lo;0;L;;;;;N;;;;; +1B0C0;HENTAIGANA LETTER HO-7;Lo;0;L;;;;;N;;;;; +1B0C1;HENTAIGANA LETTER HO-8;Lo;0;L;;;;;N;;;;; +1B0C2;HENTAIGANA LETTER MA-1;Lo;0;L;;;;;N;;;;; +1B0C3;HENTAIGANA LETTER MA-2;Lo;0;L;;;;;N;;;;; +1B0C4;HENTAIGANA LETTER MA-3;Lo;0;L;;;;;N;;;;; +1B0C5;HENTAIGANA LETTER MA-4;Lo;0;L;;;;;N;;;;; +1B0C6;HENTAIGANA LETTER MA-5;Lo;0;L;;;;;N;;;;; +1B0C7;HENTAIGANA LETTER MA-6;Lo;0;L;;;;;N;;;;; +1B0C8;HENTAIGANA LETTER MA-7;Lo;0;L;;;;;N;;;;; +1B0C9;HENTAIGANA LETTER MI-1;Lo;0;L;;;;;N;;;;; +1B0CA;HENTAIGANA LETTER MI-2;Lo;0;L;;;;;N;;;;; +1B0CB;HENTAIGANA LETTER MI-3;Lo;0;L;;;;;N;;;;; +1B0CC;HENTAIGANA LETTER MI-4;Lo;0;L;;;;;N;;;;; +1B0CD;HENTAIGANA LETTER MI-5;Lo;0;L;;;;;N;;;;; +1B0CE;HENTAIGANA LETTER MI-6;Lo;0;L;;;;;N;;;;; +1B0CF;HENTAIGANA LETTER MI-7;Lo;0;L;;;;;N;;;;; +1B0D0;HENTAIGANA LETTER MU-1;Lo;0;L;;;;;N;;;;; +1B0D1;HENTAIGANA LETTER MU-2;Lo;0;L;;;;;N;;;;; +1B0D2;HENTAIGANA LETTER MU-3;Lo;0;L;;;;;N;;;;; +1B0D3;HENTAIGANA LETTER MU-4;Lo;0;L;;;;;N;;;;; +1B0D4;HENTAIGANA LETTER ME-1;Lo;0;L;;;;;N;;;;; +1B0D5;HENTAIGANA LETTER ME-2;Lo;0;L;;;;;N;;;;; +1B0D6;HENTAIGANA LETTER ME-MA;Lo;0;L;;;;;N;;;;; +1B0D7;HENTAIGANA LETTER MO-1;Lo;0;L;;;;;N;;;;; +1B0D8;HENTAIGANA LETTER MO-2;Lo;0;L;;;;;N;;;;; +1B0D9;HENTAIGANA LETTER MO-3;Lo;0;L;;;;;N;;;;; +1B0DA;HENTAIGANA LETTER MO-4;Lo;0;L;;;;;N;;;;; +1B0DB;HENTAIGANA LETTER MO-5;Lo;0;L;;;;;N;;;;; +1B0DC;HENTAIGANA LETTER MO-6;Lo;0;L;;;;;N;;;;; +1B0DD;HENTAIGANA LETTER YA-1;Lo;0;L;;;;;N;;;;; +1B0DE;HENTAIGANA LETTER YA-2;Lo;0;L;;;;;N;;;;; +1B0DF;HENTAIGANA LETTER YA-3;Lo;0;L;;;;;N;;;;; +1B0E0;HENTAIGANA LETTER YA-4;Lo;0;L;;;;;N;;;;; +1B0E1;HENTAIGANA LETTER YA-5;Lo;0;L;;;;;N;;;;; +1B0E2;HENTAIGANA LETTER YA-YO;Lo;0;L;;;;;N;;;;; +1B0E3;HENTAIGANA LETTER YU-1;Lo;0;L;;;;;N;;;;; +1B0E4;HENTAIGANA LETTER YU-2;Lo;0;L;;;;;N;;;;; +1B0E5;HENTAIGANA LETTER YU-3;Lo;0;L;;;;;N;;;;; +1B0E6;HENTAIGANA LETTER YU-4;Lo;0;L;;;;;N;;;;; +1B0E7;HENTAIGANA LETTER YO-1;Lo;0;L;;;;;N;;;;; +1B0E8;HENTAIGANA LETTER YO-2;Lo;0;L;;;;;N;;;;; +1B0E9;HENTAIGANA LETTER YO-3;Lo;0;L;;;;;N;;;;; +1B0EA;HENTAIGANA LETTER YO-4;Lo;0;L;;;;;N;;;;; +1B0EB;HENTAIGANA LETTER YO-5;Lo;0;L;;;;;N;;;;; +1B0EC;HENTAIGANA LETTER YO-6;Lo;0;L;;;;;N;;;;; +1B0ED;HENTAIGANA LETTER RA-1;Lo;0;L;;;;;N;;;;; +1B0EE;HENTAIGANA LETTER RA-2;Lo;0;L;;;;;N;;;;; +1B0EF;HENTAIGANA LETTER RA-3;Lo;0;L;;;;;N;;;;; +1B0F0;HENTAIGANA LETTER RA-4;Lo;0;L;;;;;N;;;;; +1B0F1;HENTAIGANA LETTER RI-1;Lo;0;L;;;;;N;;;;; +1B0F2;HENTAIGANA LETTER RI-2;Lo;0;L;;;;;N;;;;; +1B0F3;HENTAIGANA LETTER RI-3;Lo;0;L;;;;;N;;;;; +1B0F4;HENTAIGANA LETTER RI-4;Lo;0;L;;;;;N;;;;; +1B0F5;HENTAIGANA LETTER RI-5;Lo;0;L;;;;;N;;;;; +1B0F6;HENTAIGANA LETTER RI-6;Lo;0;L;;;;;N;;;;; +1B0F7;HENTAIGANA LETTER RI-7;Lo;0;L;;;;;N;;;;; +1B0F8;HENTAIGANA LETTER RU-1;Lo;0;L;;;;;N;;;;; +1B0F9;HENTAIGANA LETTER RU-2;Lo;0;L;;;;;N;;;;; +1B0FA;HENTAIGANA LETTER RU-3;Lo;0;L;;;;;N;;;;; +1B0FB;HENTAIGANA LETTER RU-4;Lo;0;L;;;;;N;;;;; +1B0FC;HENTAIGANA LETTER RU-5;Lo;0;L;;;;;N;;;;; +1B0FD;HENTAIGANA LETTER RU-6;Lo;0;L;;;;;N;;;;; +1B0FE;HENTAIGANA LETTER RE-1;Lo;0;L;;;;;N;;;;; +1B0FF;HENTAIGANA LETTER RE-2;Lo;0;L;;;;;N;;;;; +1B100;HENTAIGANA LETTER RE-3;Lo;0;L;;;;;N;;;;; +1B101;HENTAIGANA LETTER RE-4;Lo;0;L;;;;;N;;;;; +1B102;HENTAIGANA LETTER RO-1;Lo;0;L;;;;;N;;;;; +1B103;HENTAIGANA LETTER RO-2;Lo;0;L;;;;;N;;;;; +1B104;HENTAIGANA LETTER RO-3;Lo;0;L;;;;;N;;;;; +1B105;HENTAIGANA LETTER RO-4;Lo;0;L;;;;;N;;;;; +1B106;HENTAIGANA LETTER RO-5;Lo;0;L;;;;;N;;;;; +1B107;HENTAIGANA LETTER RO-6;Lo;0;L;;;;;N;;;;; +1B108;HENTAIGANA LETTER WA-1;Lo;0;L;;;;;N;;;;; +1B109;HENTAIGANA LETTER WA-2;Lo;0;L;;;;;N;;;;; +1B10A;HENTAIGANA LETTER WA-3;Lo;0;L;;;;;N;;;;; +1B10B;HENTAIGANA LETTER WA-4;Lo;0;L;;;;;N;;;;; +1B10C;HENTAIGANA LETTER WA-5;Lo;0;L;;;;;N;;;;; +1B10D;HENTAIGANA LETTER WI-1;Lo;0;L;;;;;N;;;;; +1B10E;HENTAIGANA LETTER WI-2;Lo;0;L;;;;;N;;;;; +1B10F;HENTAIGANA LETTER WI-3;Lo;0;L;;;;;N;;;;; +1B110;HENTAIGANA LETTER WI-4;Lo;0;L;;;;;N;;;;; +1B111;HENTAIGANA LETTER WI-5;Lo;0;L;;;;;N;;;;; +1B112;HENTAIGANA LETTER WE-1;Lo;0;L;;;;;N;;;;; +1B113;HENTAIGANA LETTER WE-2;Lo;0;L;;;;;N;;;;; +1B114;HENTAIGANA LETTER WE-3;Lo;0;L;;;;;N;;;;; +1B115;HENTAIGANA LETTER WE-4;Lo;0;L;;;;;N;;;;; +1B116;HENTAIGANA LETTER WO-1;Lo;0;L;;;;;N;;;;; +1B117;HENTAIGANA LETTER WO-2;Lo;0;L;;;;;N;;;;; +1B118;HENTAIGANA LETTER WO-3;Lo;0;L;;;;;N;;;;; +1B119;HENTAIGANA LETTER WO-4;Lo;0;L;;;;;N;;;;; +1B11A;HENTAIGANA LETTER WO-5;Lo;0;L;;;;;N;;;;; +1B11B;HENTAIGANA LETTER WO-6;Lo;0;L;;;;;N;;;;; +1B11C;HENTAIGANA LETTER WO-7;Lo;0;L;;;;;N;;;;; +1B11D;HENTAIGANA LETTER N-MU-MO-1;Lo;0;L;;;;;N;;;;; +1B11E;HENTAIGANA LETTER N-MU-MO-2;Lo;0;L;;;;;N;;;;; +1B11F;HIRAGANA LETTER ARCHAIC WU;Lo;0;L;;;;;N;;;;; +1B120;KATAKANA LETTER ARCHAIC YI;Lo;0;L;;;;;N;;;;; +1B121;KATAKANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; +1B122;KATAKANA LETTER ARCHAIC WU;Lo;0;L;;;;;N;;;;; +1B132;HIRAGANA LETTER SMALL KO;Lo;0;L;;;;;N;;;;; +1B150;HIRAGANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;; +1B151;HIRAGANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;; +1B152;HIRAGANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;; +1B155;KATAKANA LETTER SMALL KO;Lo;0;L;;;;;N;;;;; +1B164;KATAKANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;; +1B165;KATAKANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;; +1B166;KATAKANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;; +1B167;KATAKANA LETTER SMALL N;Lo;0;L;;;;;N;;;;; +1B170;NUSHU CHARACTER-1B170;Lo;0;L;;;;;N;;;;; +1B171;NUSHU CHARACTER-1B171;Lo;0;L;;;;;N;;;;; +1B172;NUSHU CHARACTER-1B172;Lo;0;L;;;;;N;;;;; +1B173;NUSHU CHARACTER-1B173;Lo;0;L;;;;;N;;;;; +1B174;NUSHU CHARACTER-1B174;Lo;0;L;;;;;N;;;;; +1B175;NUSHU CHARACTER-1B175;Lo;0;L;;;;;N;;;;; +1B176;NUSHU CHARACTER-1B176;Lo;0;L;;;;;N;;;;; +1B177;NUSHU CHARACTER-1B177;Lo;0;L;;;;;N;;;;; +1B178;NUSHU CHARACTER-1B178;Lo;0;L;;;;;N;;;;; +1B179;NUSHU CHARACTER-1B179;Lo;0;L;;;;;N;;;;; +1B17A;NUSHU CHARACTER-1B17A;Lo;0;L;;;;;N;;;;; +1B17B;NUSHU CHARACTER-1B17B;Lo;0;L;;;;;N;;;;; +1B17C;NUSHU CHARACTER-1B17C;Lo;0;L;;;;;N;;;;; +1B17D;NUSHU CHARACTER-1B17D;Lo;0;L;;;;;N;;;;; +1B17E;NUSHU CHARACTER-1B17E;Lo;0;L;;;;;N;;;;; +1B17F;NUSHU CHARACTER-1B17F;Lo;0;L;;;;;N;;;;; +1B180;NUSHU CHARACTER-1B180;Lo;0;L;;;;;N;;;;; +1B181;NUSHU CHARACTER-1B181;Lo;0;L;;;;;N;;;;; +1B182;NUSHU CHARACTER-1B182;Lo;0;L;;;;;N;;;;; +1B183;NUSHU CHARACTER-1B183;Lo;0;L;;;;;N;;;;; +1B184;NUSHU CHARACTER-1B184;Lo;0;L;;;;;N;;;;; +1B185;NUSHU CHARACTER-1B185;Lo;0;L;;;;;N;;;;; +1B186;NUSHU CHARACTER-1B186;Lo;0;L;;;;;N;;;;; +1B187;NUSHU CHARACTER-1B187;Lo;0;L;;;;;N;;;;; +1B188;NUSHU CHARACTER-1B188;Lo;0;L;;;;;N;;;;; +1B189;NUSHU CHARACTER-1B189;Lo;0;L;;;;;N;;;;; +1B18A;NUSHU CHARACTER-1B18A;Lo;0;L;;;;;N;;;;; +1B18B;NUSHU CHARACTER-1B18B;Lo;0;L;;;;;N;;;;; +1B18C;NUSHU CHARACTER-1B18C;Lo;0;L;;;;;N;;;;; +1B18D;NUSHU CHARACTER-1B18D;Lo;0;L;;;;;N;;;;; +1B18E;NUSHU CHARACTER-1B18E;Lo;0;L;;;;;N;;;;; +1B18F;NUSHU CHARACTER-1B18F;Lo;0;L;;;;;N;;;;; +1B190;NUSHU CHARACTER-1B190;Lo;0;L;;;;;N;;;;; +1B191;NUSHU CHARACTER-1B191;Lo;0;L;;;;;N;;;;; +1B192;NUSHU CHARACTER-1B192;Lo;0;L;;;;;N;;;;; +1B193;NUSHU CHARACTER-1B193;Lo;0;L;;;;;N;;;;; +1B194;NUSHU CHARACTER-1B194;Lo;0;L;;;;;N;;;;; +1B195;NUSHU CHARACTER-1B195;Lo;0;L;;;;;N;;;;; +1B196;NUSHU CHARACTER-1B196;Lo;0;L;;;;;N;;;;; +1B197;NUSHU CHARACTER-1B197;Lo;0;L;;;;;N;;;;; +1B198;NUSHU CHARACTER-1B198;Lo;0;L;;;;;N;;;;; +1B199;NUSHU CHARACTER-1B199;Lo;0;L;;;;;N;;;;; +1B19A;NUSHU CHARACTER-1B19A;Lo;0;L;;;;;N;;;;; +1B19B;NUSHU CHARACTER-1B19B;Lo;0;L;;;;;N;;;;; +1B19C;NUSHU CHARACTER-1B19C;Lo;0;L;;;;;N;;;;; +1B19D;NUSHU CHARACTER-1B19D;Lo;0;L;;;;;N;;;;; +1B19E;NUSHU CHARACTER-1B19E;Lo;0;L;;;;;N;;;;; +1B19F;NUSHU CHARACTER-1B19F;Lo;0;L;;;;;N;;;;; +1B1A0;NUSHU CHARACTER-1B1A0;Lo;0;L;;;;;N;;;;; +1B1A1;NUSHU CHARACTER-1B1A1;Lo;0;L;;;;;N;;;;; +1B1A2;NUSHU CHARACTER-1B1A2;Lo;0;L;;;;;N;;;;; +1B1A3;NUSHU CHARACTER-1B1A3;Lo;0;L;;;;;N;;;;; +1B1A4;NUSHU CHARACTER-1B1A4;Lo;0;L;;;;;N;;;;; +1B1A5;NUSHU CHARACTER-1B1A5;Lo;0;L;;;;;N;;;;; +1B1A6;NUSHU CHARACTER-1B1A6;Lo;0;L;;;;;N;;;;; +1B1A7;NUSHU CHARACTER-1B1A7;Lo;0;L;;;;;N;;;;; +1B1A8;NUSHU CHARACTER-1B1A8;Lo;0;L;;;;;N;;;;; +1B1A9;NUSHU CHARACTER-1B1A9;Lo;0;L;;;;;N;;;;; +1B1AA;NUSHU CHARACTER-1B1AA;Lo;0;L;;;;;N;;;;; +1B1AB;NUSHU CHARACTER-1B1AB;Lo;0;L;;;;;N;;;;; +1B1AC;NUSHU CHARACTER-1B1AC;Lo;0;L;;;;;N;;;;; +1B1AD;NUSHU CHARACTER-1B1AD;Lo;0;L;;;;;N;;;;; +1B1AE;NUSHU CHARACTER-1B1AE;Lo;0;L;;;;;N;;;;; +1B1AF;NUSHU CHARACTER-1B1AF;Lo;0;L;;;;;N;;;;; +1B1B0;NUSHU CHARACTER-1B1B0;Lo;0;L;;;;;N;;;;; +1B1B1;NUSHU CHARACTER-1B1B1;Lo;0;L;;;;;N;;;;; +1B1B2;NUSHU CHARACTER-1B1B2;Lo;0;L;;;;;N;;;;; +1B1B3;NUSHU CHARACTER-1B1B3;Lo;0;L;;;;;N;;;;; +1B1B4;NUSHU CHARACTER-1B1B4;Lo;0;L;;;;;N;;;;; +1B1B5;NUSHU CHARACTER-1B1B5;Lo;0;L;;;;;N;;;;; +1B1B6;NUSHU CHARACTER-1B1B6;Lo;0;L;;;;;N;;;;; +1B1B7;NUSHU CHARACTER-1B1B7;Lo;0;L;;;;;N;;;;; +1B1B8;NUSHU CHARACTER-1B1B8;Lo;0;L;;;;;N;;;;; +1B1B9;NUSHU CHARACTER-1B1B9;Lo;0;L;;;;;N;;;;; +1B1BA;NUSHU CHARACTER-1B1BA;Lo;0;L;;;;;N;;;;; +1B1BB;NUSHU CHARACTER-1B1BB;Lo;0;L;;;;;N;;;;; +1B1BC;NUSHU CHARACTER-1B1BC;Lo;0;L;;;;;N;;;;; +1B1BD;NUSHU CHARACTER-1B1BD;Lo;0;L;;;;;N;;;;; +1B1BE;NUSHU CHARACTER-1B1BE;Lo;0;L;;;;;N;;;;; +1B1BF;NUSHU CHARACTER-1B1BF;Lo;0;L;;;;;N;;;;; +1B1C0;NUSHU CHARACTER-1B1C0;Lo;0;L;;;;;N;;;;; +1B1C1;NUSHU CHARACTER-1B1C1;Lo;0;L;;;;;N;;;;; +1B1C2;NUSHU CHARACTER-1B1C2;Lo;0;L;;;;;N;;;;; +1B1C3;NUSHU CHARACTER-1B1C3;Lo;0;L;;;;;N;;;;; +1B1C4;NUSHU CHARACTER-1B1C4;Lo;0;L;;;;;N;;;;; +1B1C5;NUSHU CHARACTER-1B1C5;Lo;0;L;;;;;N;;;;; +1B1C6;NUSHU CHARACTER-1B1C6;Lo;0;L;;;;;N;;;;; +1B1C7;NUSHU CHARACTER-1B1C7;Lo;0;L;;;;;N;;;;; +1B1C8;NUSHU CHARACTER-1B1C8;Lo;0;L;;;;;N;;;;; +1B1C9;NUSHU CHARACTER-1B1C9;Lo;0;L;;;;;N;;;;; +1B1CA;NUSHU CHARACTER-1B1CA;Lo;0;L;;;;;N;;;;; +1B1CB;NUSHU CHARACTER-1B1CB;Lo;0;L;;;;;N;;;;; +1B1CC;NUSHU CHARACTER-1B1CC;Lo;0;L;;;;;N;;;;; +1B1CD;NUSHU CHARACTER-1B1CD;Lo;0;L;;;;;N;;;;; +1B1CE;NUSHU CHARACTER-1B1CE;Lo;0;L;;;;;N;;;;; +1B1CF;NUSHU CHARACTER-1B1CF;Lo;0;L;;;;;N;;;;; +1B1D0;NUSHU CHARACTER-1B1D0;Lo;0;L;;;;;N;;;;; +1B1D1;NUSHU CHARACTER-1B1D1;Lo;0;L;;;;;N;;;;; +1B1D2;NUSHU CHARACTER-1B1D2;Lo;0;L;;;;;N;;;;; +1B1D3;NUSHU CHARACTER-1B1D3;Lo;0;L;;;;;N;;;;; +1B1D4;NUSHU CHARACTER-1B1D4;Lo;0;L;;;;;N;;;;; +1B1D5;NUSHU CHARACTER-1B1D5;Lo;0;L;;;;;N;;;;; +1B1D6;NUSHU CHARACTER-1B1D6;Lo;0;L;;;;;N;;;;; +1B1D7;NUSHU CHARACTER-1B1D7;Lo;0;L;;;;;N;;;;; +1B1D8;NUSHU CHARACTER-1B1D8;Lo;0;L;;;;;N;;;;; +1B1D9;NUSHU CHARACTER-1B1D9;Lo;0;L;;;;;N;;;;; +1B1DA;NUSHU CHARACTER-1B1DA;Lo;0;L;;;;;N;;;;; +1B1DB;NUSHU CHARACTER-1B1DB;Lo;0;L;;;;;N;;;;; +1B1DC;NUSHU CHARACTER-1B1DC;Lo;0;L;;;;;N;;;;; +1B1DD;NUSHU CHARACTER-1B1DD;Lo;0;L;;;;;N;;;;; +1B1DE;NUSHU CHARACTER-1B1DE;Lo;0;L;;;;;N;;;;; +1B1DF;NUSHU CHARACTER-1B1DF;Lo;0;L;;;;;N;;;;; +1B1E0;NUSHU CHARACTER-1B1E0;Lo;0;L;;;;;N;;;;; +1B1E1;NUSHU CHARACTER-1B1E1;Lo;0;L;;;;;N;;;;; +1B1E2;NUSHU CHARACTER-1B1E2;Lo;0;L;;;;;N;;;;; +1B1E3;NUSHU CHARACTER-1B1E3;Lo;0;L;;;;;N;;;;; +1B1E4;NUSHU CHARACTER-1B1E4;Lo;0;L;;;;;N;;;;; +1B1E5;NUSHU CHARACTER-1B1E5;Lo;0;L;;;;;N;;;;; +1B1E6;NUSHU CHARACTER-1B1E6;Lo;0;L;;;;;N;;;;; +1B1E7;NUSHU CHARACTER-1B1E7;Lo;0;L;;;;;N;;;;; +1B1E8;NUSHU CHARACTER-1B1E8;Lo;0;L;;;;;N;;;;; +1B1E9;NUSHU CHARACTER-1B1E9;Lo;0;L;;;;;N;;;;; +1B1EA;NUSHU CHARACTER-1B1EA;Lo;0;L;;;;;N;;;;; +1B1EB;NUSHU CHARACTER-1B1EB;Lo;0;L;;;;;N;;;;; +1B1EC;NUSHU CHARACTER-1B1EC;Lo;0;L;;;;;N;;;;; +1B1ED;NUSHU CHARACTER-1B1ED;Lo;0;L;;;;;N;;;;; +1B1EE;NUSHU CHARACTER-1B1EE;Lo;0;L;;;;;N;;;;; +1B1EF;NUSHU CHARACTER-1B1EF;Lo;0;L;;;;;N;;;;; +1B1F0;NUSHU CHARACTER-1B1F0;Lo;0;L;;;;;N;;;;; +1B1F1;NUSHU CHARACTER-1B1F1;Lo;0;L;;;;;N;;;;; +1B1F2;NUSHU CHARACTER-1B1F2;Lo;0;L;;;;;N;;;;; +1B1F3;NUSHU CHARACTER-1B1F3;Lo;0;L;;;;;N;;;;; +1B1F4;NUSHU CHARACTER-1B1F4;Lo;0;L;;;;;N;;;;; +1B1F5;NUSHU CHARACTER-1B1F5;Lo;0;L;;;;;N;;;;; +1B1F6;NUSHU CHARACTER-1B1F6;Lo;0;L;;;;;N;;;;; +1B1F7;NUSHU CHARACTER-1B1F7;Lo;0;L;;;;;N;;;;; +1B1F8;NUSHU CHARACTER-1B1F8;Lo;0;L;;;;;N;;;;; +1B1F9;NUSHU CHARACTER-1B1F9;Lo;0;L;;;;;N;;;;; +1B1FA;NUSHU CHARACTER-1B1FA;Lo;0;L;;;;;N;;;;; +1B1FB;NUSHU CHARACTER-1B1FB;Lo;0;L;;;;;N;;;;; +1B1FC;NUSHU CHARACTER-1B1FC;Lo;0;L;;;;;N;;;;; +1B1FD;NUSHU CHARACTER-1B1FD;Lo;0;L;;;;;N;;;;; +1B1FE;NUSHU CHARACTER-1B1FE;Lo;0;L;;;;;N;;;;; +1B1FF;NUSHU CHARACTER-1B1FF;Lo;0;L;;;;;N;;;;; +1B200;NUSHU CHARACTER-1B200;Lo;0;L;;;;;N;;;;; +1B201;NUSHU CHARACTER-1B201;Lo;0;L;;;;;N;;;;; +1B202;NUSHU CHARACTER-1B202;Lo;0;L;;;;;N;;;;; +1B203;NUSHU CHARACTER-1B203;Lo;0;L;;;;;N;;;;; +1B204;NUSHU CHARACTER-1B204;Lo;0;L;;;;;N;;;;; +1B205;NUSHU CHARACTER-1B205;Lo;0;L;;;;;N;;;;; +1B206;NUSHU CHARACTER-1B206;Lo;0;L;;;;;N;;;;; +1B207;NUSHU CHARACTER-1B207;Lo;0;L;;;;;N;;;;; +1B208;NUSHU CHARACTER-1B208;Lo;0;L;;;;;N;;;;; +1B209;NUSHU CHARACTER-1B209;Lo;0;L;;;;;N;;;;; +1B20A;NUSHU CHARACTER-1B20A;Lo;0;L;;;;;N;;;;; +1B20B;NUSHU CHARACTER-1B20B;Lo;0;L;;;;;N;;;;; +1B20C;NUSHU CHARACTER-1B20C;Lo;0;L;;;;;N;;;;; +1B20D;NUSHU CHARACTER-1B20D;Lo;0;L;;;;;N;;;;; +1B20E;NUSHU CHARACTER-1B20E;Lo;0;L;;;;;N;;;;; +1B20F;NUSHU CHARACTER-1B20F;Lo;0;L;;;;;N;;;;; +1B210;NUSHU CHARACTER-1B210;Lo;0;L;;;;;N;;;;; +1B211;NUSHU CHARACTER-1B211;Lo;0;L;;;;;N;;;;; +1B212;NUSHU CHARACTER-1B212;Lo;0;L;;;;;N;;;;; +1B213;NUSHU CHARACTER-1B213;Lo;0;L;;;;;N;;;;; +1B214;NUSHU CHARACTER-1B214;Lo;0;L;;;;;N;;;;; +1B215;NUSHU CHARACTER-1B215;Lo;0;L;;;;;N;;;;; +1B216;NUSHU CHARACTER-1B216;Lo;0;L;;;;;N;;;;; +1B217;NUSHU CHARACTER-1B217;Lo;0;L;;;;;N;;;;; +1B218;NUSHU CHARACTER-1B218;Lo;0;L;;;;;N;;;;; +1B219;NUSHU CHARACTER-1B219;Lo;0;L;;;;;N;;;;; +1B21A;NUSHU CHARACTER-1B21A;Lo;0;L;;;;;N;;;;; +1B21B;NUSHU CHARACTER-1B21B;Lo;0;L;;;;;N;;;;; +1B21C;NUSHU CHARACTER-1B21C;Lo;0;L;;;;;N;;;;; +1B21D;NUSHU CHARACTER-1B21D;Lo;0;L;;;;;N;;;;; +1B21E;NUSHU CHARACTER-1B21E;Lo;0;L;;;;;N;;;;; +1B21F;NUSHU CHARACTER-1B21F;Lo;0;L;;;;;N;;;;; +1B220;NUSHU CHARACTER-1B220;Lo;0;L;;;;;N;;;;; +1B221;NUSHU CHARACTER-1B221;Lo;0;L;;;;;N;;;;; +1B222;NUSHU CHARACTER-1B222;Lo;0;L;;;;;N;;;;; +1B223;NUSHU CHARACTER-1B223;Lo;0;L;;;;;N;;;;; +1B224;NUSHU CHARACTER-1B224;Lo;0;L;;;;;N;;;;; +1B225;NUSHU CHARACTER-1B225;Lo;0;L;;;;;N;;;;; +1B226;NUSHU CHARACTER-1B226;Lo;0;L;;;;;N;;;;; +1B227;NUSHU CHARACTER-1B227;Lo;0;L;;;;;N;;;;; +1B228;NUSHU CHARACTER-1B228;Lo;0;L;;;;;N;;;;; +1B229;NUSHU CHARACTER-1B229;Lo;0;L;;;;;N;;;;; +1B22A;NUSHU CHARACTER-1B22A;Lo;0;L;;;;;N;;;;; +1B22B;NUSHU CHARACTER-1B22B;Lo;0;L;;;;;N;;;;; +1B22C;NUSHU CHARACTER-1B22C;Lo;0;L;;;;;N;;;;; +1B22D;NUSHU CHARACTER-1B22D;Lo;0;L;;;;;N;;;;; +1B22E;NUSHU CHARACTER-1B22E;Lo;0;L;;;;;N;;;;; +1B22F;NUSHU CHARACTER-1B22F;Lo;0;L;;;;;N;;;;; +1B230;NUSHU CHARACTER-1B230;Lo;0;L;;;;;N;;;;; +1B231;NUSHU CHARACTER-1B231;Lo;0;L;;;;;N;;;;; +1B232;NUSHU CHARACTER-1B232;Lo;0;L;;;;;N;;;;; +1B233;NUSHU CHARACTER-1B233;Lo;0;L;;;;;N;;;;; +1B234;NUSHU CHARACTER-1B234;Lo;0;L;;;;;N;;;;; +1B235;NUSHU CHARACTER-1B235;Lo;0;L;;;;;N;;;;; +1B236;NUSHU CHARACTER-1B236;Lo;0;L;;;;;N;;;;; +1B237;NUSHU CHARACTER-1B237;Lo;0;L;;;;;N;;;;; +1B238;NUSHU CHARACTER-1B238;Lo;0;L;;;;;N;;;;; +1B239;NUSHU CHARACTER-1B239;Lo;0;L;;;;;N;;;;; +1B23A;NUSHU CHARACTER-1B23A;Lo;0;L;;;;;N;;;;; +1B23B;NUSHU CHARACTER-1B23B;Lo;0;L;;;;;N;;;;; +1B23C;NUSHU CHARACTER-1B23C;Lo;0;L;;;;;N;;;;; +1B23D;NUSHU CHARACTER-1B23D;Lo;0;L;;;;;N;;;;; +1B23E;NUSHU CHARACTER-1B23E;Lo;0;L;;;;;N;;;;; +1B23F;NUSHU CHARACTER-1B23F;Lo;0;L;;;;;N;;;;; +1B240;NUSHU CHARACTER-1B240;Lo;0;L;;;;;N;;;;; +1B241;NUSHU CHARACTER-1B241;Lo;0;L;;;;;N;;;;; +1B242;NUSHU CHARACTER-1B242;Lo;0;L;;;;;N;;;;; +1B243;NUSHU CHARACTER-1B243;Lo;0;L;;;;;N;;;;; +1B244;NUSHU CHARACTER-1B244;Lo;0;L;;;;;N;;;;; +1B245;NUSHU CHARACTER-1B245;Lo;0;L;;;;;N;;;;; +1B246;NUSHU CHARACTER-1B246;Lo;0;L;;;;;N;;;;; +1B247;NUSHU CHARACTER-1B247;Lo;0;L;;;;;N;;;;; +1B248;NUSHU CHARACTER-1B248;Lo;0;L;;;;;N;;;;; +1B249;NUSHU CHARACTER-1B249;Lo;0;L;;;;;N;;;;; +1B24A;NUSHU CHARACTER-1B24A;Lo;0;L;;;;;N;;;;; +1B24B;NUSHU CHARACTER-1B24B;Lo;0;L;;;;;N;;;;; +1B24C;NUSHU CHARACTER-1B24C;Lo;0;L;;;;;N;;;;; +1B24D;NUSHU CHARACTER-1B24D;Lo;0;L;;;;;N;;;;; +1B24E;NUSHU CHARACTER-1B24E;Lo;0;L;;;;;N;;;;; +1B24F;NUSHU CHARACTER-1B24F;Lo;0;L;;;;;N;;;;; +1B250;NUSHU CHARACTER-1B250;Lo;0;L;;;;;N;;;;; +1B251;NUSHU CHARACTER-1B251;Lo;0;L;;;;;N;;;;; +1B252;NUSHU CHARACTER-1B252;Lo;0;L;;;;;N;;;;; +1B253;NUSHU CHARACTER-1B253;Lo;0;L;;;;;N;;;;; +1B254;NUSHU CHARACTER-1B254;Lo;0;L;;;;;N;;;;; +1B255;NUSHU CHARACTER-1B255;Lo;0;L;;;;;N;;;;; +1B256;NUSHU CHARACTER-1B256;Lo;0;L;;;;;N;;;;; +1B257;NUSHU CHARACTER-1B257;Lo;0;L;;;;;N;;;;; +1B258;NUSHU CHARACTER-1B258;Lo;0;L;;;;;N;;;;; +1B259;NUSHU CHARACTER-1B259;Lo;0;L;;;;;N;;;;; +1B25A;NUSHU CHARACTER-1B25A;Lo;0;L;;;;;N;;;;; +1B25B;NUSHU CHARACTER-1B25B;Lo;0;L;;;;;N;;;;; +1B25C;NUSHU CHARACTER-1B25C;Lo;0;L;;;;;N;;;;; +1B25D;NUSHU CHARACTER-1B25D;Lo;0;L;;;;;N;;;;; +1B25E;NUSHU CHARACTER-1B25E;Lo;0;L;;;;;N;;;;; +1B25F;NUSHU CHARACTER-1B25F;Lo;0;L;;;;;N;;;;; +1B260;NUSHU CHARACTER-1B260;Lo;0;L;;;;;N;;;;; +1B261;NUSHU CHARACTER-1B261;Lo;0;L;;;;;N;;;;; +1B262;NUSHU CHARACTER-1B262;Lo;0;L;;;;;N;;;;; +1B263;NUSHU CHARACTER-1B263;Lo;0;L;;;;;N;;;;; +1B264;NUSHU CHARACTER-1B264;Lo;0;L;;;;;N;;;;; +1B265;NUSHU CHARACTER-1B265;Lo;0;L;;;;;N;;;;; +1B266;NUSHU CHARACTER-1B266;Lo;0;L;;;;;N;;;;; +1B267;NUSHU CHARACTER-1B267;Lo;0;L;;;;;N;;;;; +1B268;NUSHU CHARACTER-1B268;Lo;0;L;;;;;N;;;;; +1B269;NUSHU CHARACTER-1B269;Lo;0;L;;;;;N;;;;; +1B26A;NUSHU CHARACTER-1B26A;Lo;0;L;;;;;N;;;;; +1B26B;NUSHU CHARACTER-1B26B;Lo;0;L;;;;;N;;;;; +1B26C;NUSHU CHARACTER-1B26C;Lo;0;L;;;;;N;;;;; +1B26D;NUSHU CHARACTER-1B26D;Lo;0;L;;;;;N;;;;; +1B26E;NUSHU CHARACTER-1B26E;Lo;0;L;;;;;N;;;;; +1B26F;NUSHU CHARACTER-1B26F;Lo;0;L;;;;;N;;;;; +1B270;NUSHU CHARACTER-1B270;Lo;0;L;;;;;N;;;;; +1B271;NUSHU CHARACTER-1B271;Lo;0;L;;;;;N;;;;; +1B272;NUSHU CHARACTER-1B272;Lo;0;L;;;;;N;;;;; +1B273;NUSHU CHARACTER-1B273;Lo;0;L;;;;;N;;;;; +1B274;NUSHU CHARACTER-1B274;Lo;0;L;;;;;N;;;;; +1B275;NUSHU CHARACTER-1B275;Lo;0;L;;;;;N;;;;; +1B276;NUSHU CHARACTER-1B276;Lo;0;L;;;;;N;;;;; +1B277;NUSHU CHARACTER-1B277;Lo;0;L;;;;;N;;;;; +1B278;NUSHU CHARACTER-1B278;Lo;0;L;;;;;N;;;;; +1B279;NUSHU CHARACTER-1B279;Lo;0;L;;;;;N;;;;; +1B27A;NUSHU CHARACTER-1B27A;Lo;0;L;;;;;N;;;;; +1B27B;NUSHU CHARACTER-1B27B;Lo;0;L;;;;;N;;;;; +1B27C;NUSHU CHARACTER-1B27C;Lo;0;L;;;;;N;;;;; +1B27D;NUSHU CHARACTER-1B27D;Lo;0;L;;;;;N;;;;; +1B27E;NUSHU CHARACTER-1B27E;Lo;0;L;;;;;N;;;;; +1B27F;NUSHU CHARACTER-1B27F;Lo;0;L;;;;;N;;;;; +1B280;NUSHU CHARACTER-1B280;Lo;0;L;;;;;N;;;;; +1B281;NUSHU CHARACTER-1B281;Lo;0;L;;;;;N;;;;; +1B282;NUSHU CHARACTER-1B282;Lo;0;L;;;;;N;;;;; +1B283;NUSHU CHARACTER-1B283;Lo;0;L;;;;;N;;;;; +1B284;NUSHU CHARACTER-1B284;Lo;0;L;;;;;N;;;;; +1B285;NUSHU CHARACTER-1B285;Lo;0;L;;;;;N;;;;; +1B286;NUSHU CHARACTER-1B286;Lo;0;L;;;;;N;;;;; +1B287;NUSHU CHARACTER-1B287;Lo;0;L;;;;;N;;;;; +1B288;NUSHU CHARACTER-1B288;Lo;0;L;;;;;N;;;;; +1B289;NUSHU CHARACTER-1B289;Lo;0;L;;;;;N;;;;; +1B28A;NUSHU CHARACTER-1B28A;Lo;0;L;;;;;N;;;;; +1B28B;NUSHU CHARACTER-1B28B;Lo;0;L;;;;;N;;;;; +1B28C;NUSHU CHARACTER-1B28C;Lo;0;L;;;;;N;;;;; +1B28D;NUSHU CHARACTER-1B28D;Lo;0;L;;;;;N;;;;; +1B28E;NUSHU CHARACTER-1B28E;Lo;0;L;;;;;N;;;;; +1B28F;NUSHU CHARACTER-1B28F;Lo;0;L;;;;;N;;;;; +1B290;NUSHU CHARACTER-1B290;Lo;0;L;;;;;N;;;;; +1B291;NUSHU CHARACTER-1B291;Lo;0;L;;;;;N;;;;; +1B292;NUSHU CHARACTER-1B292;Lo;0;L;;;;;N;;;;; +1B293;NUSHU CHARACTER-1B293;Lo;0;L;;;;;N;;;;; +1B294;NUSHU CHARACTER-1B294;Lo;0;L;;;;;N;;;;; +1B295;NUSHU CHARACTER-1B295;Lo;0;L;;;;;N;;;;; +1B296;NUSHU CHARACTER-1B296;Lo;0;L;;;;;N;;;;; +1B297;NUSHU CHARACTER-1B297;Lo;0;L;;;;;N;;;;; +1B298;NUSHU CHARACTER-1B298;Lo;0;L;;;;;N;;;;; +1B299;NUSHU CHARACTER-1B299;Lo;0;L;;;;;N;;;;; +1B29A;NUSHU CHARACTER-1B29A;Lo;0;L;;;;;N;;;;; +1B29B;NUSHU CHARACTER-1B29B;Lo;0;L;;;;;N;;;;; +1B29C;NUSHU CHARACTER-1B29C;Lo;0;L;;;;;N;;;;; +1B29D;NUSHU CHARACTER-1B29D;Lo;0;L;;;;;N;;;;; +1B29E;NUSHU CHARACTER-1B29E;Lo;0;L;;;;;N;;;;; +1B29F;NUSHU CHARACTER-1B29F;Lo;0;L;;;;;N;;;;; +1B2A0;NUSHU CHARACTER-1B2A0;Lo;0;L;;;;;N;;;;; +1B2A1;NUSHU CHARACTER-1B2A1;Lo;0;L;;;;;N;;;;; +1B2A2;NUSHU CHARACTER-1B2A2;Lo;0;L;;;;;N;;;;; +1B2A3;NUSHU CHARACTER-1B2A3;Lo;0;L;;;;;N;;;;; +1B2A4;NUSHU CHARACTER-1B2A4;Lo;0;L;;;;;N;;;;; +1B2A5;NUSHU CHARACTER-1B2A5;Lo;0;L;;;;;N;;;;; +1B2A6;NUSHU CHARACTER-1B2A6;Lo;0;L;;;;;N;;;;; +1B2A7;NUSHU CHARACTER-1B2A7;Lo;0;L;;;;;N;;;;; +1B2A8;NUSHU CHARACTER-1B2A8;Lo;0;L;;;;;N;;;;; +1B2A9;NUSHU CHARACTER-1B2A9;Lo;0;L;;;;;N;;;;; +1B2AA;NUSHU CHARACTER-1B2AA;Lo;0;L;;;;;N;;;;; +1B2AB;NUSHU CHARACTER-1B2AB;Lo;0;L;;;;;N;;;;; +1B2AC;NUSHU CHARACTER-1B2AC;Lo;0;L;;;;;N;;;;; +1B2AD;NUSHU CHARACTER-1B2AD;Lo;0;L;;;;;N;;;;; +1B2AE;NUSHU CHARACTER-1B2AE;Lo;0;L;;;;;N;;;;; +1B2AF;NUSHU CHARACTER-1B2AF;Lo;0;L;;;;;N;;;;; +1B2B0;NUSHU CHARACTER-1B2B0;Lo;0;L;;;;;N;;;;; +1B2B1;NUSHU CHARACTER-1B2B1;Lo;0;L;;;;;N;;;;; +1B2B2;NUSHU CHARACTER-1B2B2;Lo;0;L;;;;;N;;;;; +1B2B3;NUSHU CHARACTER-1B2B3;Lo;0;L;;;;;N;;;;; +1B2B4;NUSHU CHARACTER-1B2B4;Lo;0;L;;;;;N;;;;; +1B2B5;NUSHU CHARACTER-1B2B5;Lo;0;L;;;;;N;;;;; +1B2B6;NUSHU CHARACTER-1B2B6;Lo;0;L;;;;;N;;;;; +1B2B7;NUSHU CHARACTER-1B2B7;Lo;0;L;;;;;N;;;;; +1B2B8;NUSHU CHARACTER-1B2B8;Lo;0;L;;;;;N;;;;; +1B2B9;NUSHU CHARACTER-1B2B9;Lo;0;L;;;;;N;;;;; +1B2BA;NUSHU CHARACTER-1B2BA;Lo;0;L;;;;;N;;;;; +1B2BB;NUSHU CHARACTER-1B2BB;Lo;0;L;;;;;N;;;;; +1B2BC;NUSHU CHARACTER-1B2BC;Lo;0;L;;;;;N;;;;; +1B2BD;NUSHU CHARACTER-1B2BD;Lo;0;L;;;;;N;;;;; +1B2BE;NUSHU CHARACTER-1B2BE;Lo;0;L;;;;;N;;;;; +1B2BF;NUSHU CHARACTER-1B2BF;Lo;0;L;;;;;N;;;;; +1B2C0;NUSHU CHARACTER-1B2C0;Lo;0;L;;;;;N;;;;; +1B2C1;NUSHU CHARACTER-1B2C1;Lo;0;L;;;;;N;;;;; +1B2C2;NUSHU CHARACTER-1B2C2;Lo;0;L;;;;;N;;;;; +1B2C3;NUSHU CHARACTER-1B2C3;Lo;0;L;;;;;N;;;;; +1B2C4;NUSHU CHARACTER-1B2C4;Lo;0;L;;;;;N;;;;; +1B2C5;NUSHU CHARACTER-1B2C5;Lo;0;L;;;;;N;;;;; +1B2C6;NUSHU CHARACTER-1B2C6;Lo;0;L;;;;;N;;;;; +1B2C7;NUSHU CHARACTER-1B2C7;Lo;0;L;;;;;N;;;;; +1B2C8;NUSHU CHARACTER-1B2C8;Lo;0;L;;;;;N;;;;; +1B2C9;NUSHU CHARACTER-1B2C9;Lo;0;L;;;;;N;;;;; +1B2CA;NUSHU CHARACTER-1B2CA;Lo;0;L;;;;;N;;;;; +1B2CB;NUSHU CHARACTER-1B2CB;Lo;0;L;;;;;N;;;;; +1B2CC;NUSHU CHARACTER-1B2CC;Lo;0;L;;;;;N;;;;; +1B2CD;NUSHU CHARACTER-1B2CD;Lo;0;L;;;;;N;;;;; +1B2CE;NUSHU CHARACTER-1B2CE;Lo;0;L;;;;;N;;;;; +1B2CF;NUSHU CHARACTER-1B2CF;Lo;0;L;;;;;N;;;;; +1B2D0;NUSHU CHARACTER-1B2D0;Lo;0;L;;;;;N;;;;; +1B2D1;NUSHU CHARACTER-1B2D1;Lo;0;L;;;;;N;;;;; +1B2D2;NUSHU CHARACTER-1B2D2;Lo;0;L;;;;;N;;;;; +1B2D3;NUSHU CHARACTER-1B2D3;Lo;0;L;;;;;N;;;;; +1B2D4;NUSHU CHARACTER-1B2D4;Lo;0;L;;;;;N;;;;; +1B2D5;NUSHU CHARACTER-1B2D5;Lo;0;L;;;;;N;;;;; +1B2D6;NUSHU CHARACTER-1B2D6;Lo;0;L;;;;;N;;;;; +1B2D7;NUSHU CHARACTER-1B2D7;Lo;0;L;;;;;N;;;;; +1B2D8;NUSHU CHARACTER-1B2D8;Lo;0;L;;;;;N;;;;; +1B2D9;NUSHU CHARACTER-1B2D9;Lo;0;L;;;;;N;;;;; +1B2DA;NUSHU CHARACTER-1B2DA;Lo;0;L;;;;;N;;;;; +1B2DB;NUSHU CHARACTER-1B2DB;Lo;0;L;;;;;N;;;;; +1B2DC;NUSHU CHARACTER-1B2DC;Lo;0;L;;;;;N;;;;; +1B2DD;NUSHU CHARACTER-1B2DD;Lo;0;L;;;;;N;;;;; +1B2DE;NUSHU CHARACTER-1B2DE;Lo;0;L;;;;;N;;;;; +1B2DF;NUSHU CHARACTER-1B2DF;Lo;0;L;;;;;N;;;;; +1B2E0;NUSHU CHARACTER-1B2E0;Lo;0;L;;;;;N;;;;; +1B2E1;NUSHU CHARACTER-1B2E1;Lo;0;L;;;;;N;;;;; +1B2E2;NUSHU CHARACTER-1B2E2;Lo;0;L;;;;;N;;;;; +1B2E3;NUSHU CHARACTER-1B2E3;Lo;0;L;;;;;N;;;;; +1B2E4;NUSHU CHARACTER-1B2E4;Lo;0;L;;;;;N;;;;; +1B2E5;NUSHU CHARACTER-1B2E5;Lo;0;L;;;;;N;;;;; +1B2E6;NUSHU CHARACTER-1B2E6;Lo;0;L;;;;;N;;;;; +1B2E7;NUSHU CHARACTER-1B2E7;Lo;0;L;;;;;N;;;;; +1B2E8;NUSHU CHARACTER-1B2E8;Lo;0;L;;;;;N;;;;; +1B2E9;NUSHU CHARACTER-1B2E9;Lo;0;L;;;;;N;;;;; +1B2EA;NUSHU CHARACTER-1B2EA;Lo;0;L;;;;;N;;;;; +1B2EB;NUSHU CHARACTER-1B2EB;Lo;0;L;;;;;N;;;;; +1B2EC;NUSHU CHARACTER-1B2EC;Lo;0;L;;;;;N;;;;; +1B2ED;NUSHU CHARACTER-1B2ED;Lo;0;L;;;;;N;;;;; +1B2EE;NUSHU CHARACTER-1B2EE;Lo;0;L;;;;;N;;;;; +1B2EF;NUSHU CHARACTER-1B2EF;Lo;0;L;;;;;N;;;;; +1B2F0;NUSHU CHARACTER-1B2F0;Lo;0;L;;;;;N;;;;; +1B2F1;NUSHU CHARACTER-1B2F1;Lo;0;L;;;;;N;;;;; +1B2F2;NUSHU CHARACTER-1B2F2;Lo;0;L;;;;;N;;;;; +1B2F3;NUSHU CHARACTER-1B2F3;Lo;0;L;;;;;N;;;;; +1B2F4;NUSHU CHARACTER-1B2F4;Lo;0;L;;;;;N;;;;; +1B2F5;NUSHU CHARACTER-1B2F5;Lo;0;L;;;;;N;;;;; +1B2F6;NUSHU CHARACTER-1B2F6;Lo;0;L;;;;;N;;;;; +1B2F7;NUSHU CHARACTER-1B2F7;Lo;0;L;;;;;N;;;;; +1B2F8;NUSHU CHARACTER-1B2F8;Lo;0;L;;;;;N;;;;; +1B2F9;NUSHU CHARACTER-1B2F9;Lo;0;L;;;;;N;;;;; +1B2FA;NUSHU CHARACTER-1B2FA;Lo;0;L;;;;;N;;;;; +1B2FB;NUSHU CHARACTER-1B2FB;Lo;0;L;;;;;N;;;;; +1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; +1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;; +1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;; +1BC03;DUPLOYAN LETTER T;Lo;0;L;;;;;N;;;;; +1BC04;DUPLOYAN LETTER F;Lo;0;L;;;;;N;;;;; +1BC05;DUPLOYAN LETTER K;Lo;0;L;;;;;N;;;;; +1BC06;DUPLOYAN LETTER L;Lo;0;L;;;;;N;;;;; +1BC07;DUPLOYAN LETTER B;Lo;0;L;;;;;N;;;;; +1BC08;DUPLOYAN LETTER D;Lo;0;L;;;;;N;;;;; +1BC09;DUPLOYAN LETTER V;Lo;0;L;;;;;N;;;;; +1BC0A;DUPLOYAN LETTER G;Lo;0;L;;;;;N;;;;; +1BC0B;DUPLOYAN LETTER R;Lo;0;L;;;;;N;;;;; +1BC0C;DUPLOYAN LETTER P N;Lo;0;L;;;;;N;;;;; +1BC0D;DUPLOYAN LETTER D S;Lo;0;L;;;;;N;;;;; +1BC0E;DUPLOYAN LETTER F N;Lo;0;L;;;;;N;;;;; +1BC0F;DUPLOYAN LETTER K M;Lo;0;L;;;;;N;;;;; +1BC10;DUPLOYAN LETTER R S;Lo;0;L;;;;;N;;;;; +1BC11;DUPLOYAN LETTER TH;Lo;0;L;;;;;N;;;;; +1BC12;DUPLOYAN LETTER SLOAN DH;Lo;0;L;;;;;N;;;;; +1BC13;DUPLOYAN LETTER DH;Lo;0;L;;;;;N;;;;; +1BC14;DUPLOYAN LETTER KK;Lo;0;L;;;;;N;;;;; +1BC15;DUPLOYAN LETTER SLOAN J;Lo;0;L;;;;;N;;;;; +1BC16;DUPLOYAN LETTER HL;Lo;0;L;;;;;N;;;;; +1BC17;DUPLOYAN LETTER LH;Lo;0;L;;;;;N;;;;; +1BC18;DUPLOYAN LETTER RH;Lo;0;L;;;;;N;;;;; +1BC19;DUPLOYAN LETTER M;Lo;0;L;;;;;N;;;;; +1BC1A;DUPLOYAN LETTER N;Lo;0;L;;;;;N;;;;; +1BC1B;DUPLOYAN LETTER J;Lo;0;L;;;;;N;;;;; +1BC1C;DUPLOYAN LETTER S;Lo;0;L;;;;;N;;;;; +1BC1D;DUPLOYAN LETTER M N;Lo;0;L;;;;;N;;;;; +1BC1E;DUPLOYAN LETTER N M;Lo;0;L;;;;;N;;;;; +1BC1F;DUPLOYAN LETTER J M;Lo;0;L;;;;;N;;;;; +1BC20;DUPLOYAN LETTER S J;Lo;0;L;;;;;N;;;;; +1BC21;DUPLOYAN LETTER M WITH DOT;Lo;0;L;;;;;N;;;;; +1BC22;DUPLOYAN LETTER N WITH DOT;Lo;0;L;;;;;N;;;;; +1BC23;DUPLOYAN LETTER J WITH DOT;Lo;0;L;;;;;N;;;;; +1BC24;DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE;Lo;0;L;;;;;N;;;;; +1BC25;DUPLOYAN LETTER S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC26;DUPLOYAN LETTER S WITH DOT BELOW;Lo;0;L;;;;;N;;;;; +1BC27;DUPLOYAN LETTER M S;Lo;0;L;;;;;N;;;;; +1BC28;DUPLOYAN LETTER N S;Lo;0;L;;;;;N;;;;; +1BC29;DUPLOYAN LETTER J S;Lo;0;L;;;;;N;;;;; +1BC2A;DUPLOYAN LETTER S S;Lo;0;L;;;;;N;;;;; +1BC2B;DUPLOYAN LETTER M N S;Lo;0;L;;;;;N;;;;; +1BC2C;DUPLOYAN LETTER N M S;Lo;0;L;;;;;N;;;;; +1BC2D;DUPLOYAN LETTER J M S;Lo;0;L;;;;;N;;;;; +1BC2E;DUPLOYAN LETTER S J S;Lo;0;L;;;;;N;;;;; +1BC2F;DUPLOYAN LETTER J S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC30;DUPLOYAN LETTER J N;Lo;0;L;;;;;N;;;;; +1BC31;DUPLOYAN LETTER J N S;Lo;0;L;;;;;N;;;;; +1BC32;DUPLOYAN LETTER S T;Lo;0;L;;;;;N;;;;; +1BC33;DUPLOYAN LETTER S T R;Lo;0;L;;;;;N;;;;; +1BC34;DUPLOYAN LETTER S P;Lo;0;L;;;;;N;;;;; +1BC35;DUPLOYAN LETTER S P R;Lo;0;L;;;;;N;;;;; +1BC36;DUPLOYAN LETTER T S;Lo;0;L;;;;;N;;;;; +1BC37;DUPLOYAN LETTER T R S;Lo;0;L;;;;;N;;;;; +1BC38;DUPLOYAN LETTER W;Lo;0;L;;;;;N;;;;; +1BC39;DUPLOYAN LETTER WH;Lo;0;L;;;;;N;;;;; +1BC3A;DUPLOYAN LETTER W R;Lo;0;L;;;;;N;;;;; +1BC3B;DUPLOYAN LETTER S N;Lo;0;L;;;;;N;;;;; +1BC3C;DUPLOYAN LETTER S M;Lo;0;L;;;;;N;;;;; +1BC3D;DUPLOYAN LETTER K R S;Lo;0;L;;;;;N;;;;; +1BC3E;DUPLOYAN LETTER G R S;Lo;0;L;;;;;N;;;;; +1BC3F;DUPLOYAN LETTER S K;Lo;0;L;;;;;N;;;;; +1BC40;DUPLOYAN LETTER S K R;Lo;0;L;;;;;N;;;;; +1BC41;DUPLOYAN LETTER A;Lo;0;L;;;;;N;;;;; +1BC42;DUPLOYAN LETTER SLOAN OW;Lo;0;L;;;;;N;;;;; +1BC43;DUPLOYAN LETTER OA;Lo;0;L;;;;;N;;;;; +1BC44;DUPLOYAN LETTER O;Lo;0;L;;;;;N;;;;; +1BC45;DUPLOYAN LETTER AOU;Lo;0;L;;;;;N;;;;; +1BC46;DUPLOYAN LETTER I;Lo;0;L;;;;;N;;;;; +1BC47;DUPLOYAN LETTER E;Lo;0;L;;;;;N;;;;; +1BC48;DUPLOYAN LETTER IE;Lo;0;L;;;;;N;;;;; +1BC49;DUPLOYAN LETTER SHORT I;Lo;0;L;;;;;N;;;;; +1BC4A;DUPLOYAN LETTER UI;Lo;0;L;;;;;N;;;;; +1BC4B;DUPLOYAN LETTER EE;Lo;0;L;;;;;N;;;;; +1BC4C;DUPLOYAN LETTER SLOAN EH;Lo;0;L;;;;;N;;;;; +1BC4D;DUPLOYAN LETTER ROMANIAN I;Lo;0;L;;;;;N;;;;; +1BC4E;DUPLOYAN LETTER SLOAN EE;Lo;0;L;;;;;N;;;;; +1BC4F;DUPLOYAN LETTER LONG I;Lo;0;L;;;;;N;;;;; +1BC50;DUPLOYAN LETTER YE;Lo;0;L;;;;;N;;;;; +1BC51;DUPLOYAN LETTER U;Lo;0;L;;;;;N;;;;; +1BC52;DUPLOYAN LETTER EU;Lo;0;L;;;;;N;;;;; +1BC53;DUPLOYAN LETTER XW;Lo;0;L;;;;;N;;;;; +1BC54;DUPLOYAN LETTER U N;Lo;0;L;;;;;N;;;;; +1BC55;DUPLOYAN LETTER LONG U;Lo;0;L;;;;;N;;;;; +1BC56;DUPLOYAN LETTER ROMANIAN U;Lo;0;L;;;;;N;;;;; +1BC57;DUPLOYAN LETTER UH;Lo;0;L;;;;;N;;;;; +1BC58;DUPLOYAN LETTER SLOAN U;Lo;0;L;;;;;N;;;;; +1BC59;DUPLOYAN LETTER OOH;Lo;0;L;;;;;N;;;;; +1BC5A;DUPLOYAN LETTER OW;Lo;0;L;;;;;N;;;;; +1BC5B;DUPLOYAN LETTER OU;Lo;0;L;;;;;N;;;;; +1BC5C;DUPLOYAN LETTER WA;Lo;0;L;;;;;N;;;;; +1BC5D;DUPLOYAN LETTER WO;Lo;0;L;;;;;N;;;;; +1BC5E;DUPLOYAN LETTER WI;Lo;0;L;;;;;N;;;;; +1BC5F;DUPLOYAN LETTER WEI;Lo;0;L;;;;;N;;;;; +1BC60;DUPLOYAN LETTER WOW;Lo;0;L;;;;;N;;;;; +1BC61;DUPLOYAN LETTER NASAL U;Lo;0;L;;;;;N;;;;; +1BC62;DUPLOYAN LETTER NASAL O;Lo;0;L;;;;;N;;;;; +1BC63;DUPLOYAN LETTER NASAL I;Lo;0;L;;;;;N;;;;; +1BC64;DUPLOYAN LETTER NASAL A;Lo;0;L;;;;;N;;;;; +1BC65;DUPLOYAN LETTER PERNIN AN;Lo;0;L;;;;;N;;;;; +1BC66;DUPLOYAN LETTER PERNIN AM;Lo;0;L;;;;;N;;;;; +1BC67;DUPLOYAN LETTER SLOAN EN;Lo;0;L;;;;;N;;;;; +1BC68;DUPLOYAN LETTER SLOAN AN;Lo;0;L;;;;;N;;;;; +1BC69;DUPLOYAN LETTER SLOAN ON;Lo;0;L;;;;;N;;;;; +1BC6A;DUPLOYAN LETTER VOCALIC M;Lo;0;L;;;;;N;;;;; +1BC70;DUPLOYAN AFFIX LEFT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC71;DUPLOYAN AFFIX MID HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC72;DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC73;DUPLOYAN AFFIX LOW VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC74;DUPLOYAN AFFIX MID VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC75;DUPLOYAN AFFIX HIGH VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC76;DUPLOYAN AFFIX ATTACHED SECANT;Lo;0;L;;;;;N;;;;; +1BC77;DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT;Lo;0;L;;;;;N;;;;; +1BC78;DUPLOYAN AFFIX ATTACHED TANGENT;Lo;0;L;;;;;N;;;;; +1BC79;DUPLOYAN AFFIX ATTACHED TAIL;Lo;0;L;;;;;N;;;;; +1BC7A;DUPLOYAN AFFIX ATTACHED E HOOK;Lo;0;L;;;;;N;;;;; +1BC7B;DUPLOYAN AFFIX ATTACHED I HOOK;Lo;0;L;;;;;N;;;;; +1BC7C;DUPLOYAN AFFIX ATTACHED TANGENT HOOK;Lo;0;L;;;;;N;;;;; +1BC80;DUPLOYAN AFFIX HIGH ACUTE;Lo;0;L;;;;;N;;;;; +1BC81;DUPLOYAN AFFIX HIGH TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC82;DUPLOYAN AFFIX HIGH GRAVE;Lo;0;L;;;;;N;;;;; +1BC83;DUPLOYAN AFFIX HIGH LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC84;DUPLOYAN AFFIX HIGH DOT;Lo;0;L;;;;;N;;;;; +1BC85;DUPLOYAN AFFIX HIGH CIRCLE;Lo;0;L;;;;;N;;;;; +1BC86;DUPLOYAN AFFIX HIGH LINE;Lo;0;L;;;;;N;;;;; +1BC87;DUPLOYAN AFFIX HIGH WAVE;Lo;0;L;;;;;N;;;;; +1BC88;DUPLOYAN AFFIX HIGH VERTICAL;Lo;0;L;;;;;N;;;;; +1BC90;DUPLOYAN AFFIX LOW ACUTE;Lo;0;L;;;;;N;;;;; +1BC91;DUPLOYAN AFFIX LOW TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC92;DUPLOYAN AFFIX LOW GRAVE;Lo;0;L;;;;;N;;;;; +1BC93;DUPLOYAN AFFIX LOW LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC94;DUPLOYAN AFFIX LOW DOT;Lo;0;L;;;;;N;;;;; +1BC95;DUPLOYAN AFFIX LOW CIRCLE;Lo;0;L;;;;;N;;;;; +1BC96;DUPLOYAN AFFIX LOW LINE;Lo;0;L;;;;;N;;;;; +1BC97;DUPLOYAN AFFIX LOW WAVE;Lo;0;L;;;;;N;;;;; +1BC98;DUPLOYAN AFFIX LOW VERTICAL;Lo;0;L;;;;;N;;;;; +1BC99;DUPLOYAN AFFIX LOW ARROW;Lo;0;L;;;;;N;;;;; +1BC9C;DUPLOYAN SIGN O WITH CROSS;So;0;L;;;;;N;;;;; +1BC9D;DUPLOYAN THICK LETTER SELECTOR;Mn;0;NSM;;;;;N;;;;; +1BC9E;DUPLOYAN DOUBLE MARK;Mn;1;NSM;;;;;N;;;;; +1BC9F;DUPLOYAN PUNCTUATION CHINOOK FULL STOP;Po;0;L;;;;;N;;;;; +1BCA0;SHORTHAND FORMAT LETTER OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;; +1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;; +1CC00;UP-POINTING GO-KART;So;0;ON;;;;;N;;;;; +1CC01;RIGHT-POINTING GO-KART;So;0;ON;;;;;N;;;;; +1CC02;LEFT-POINTING STICK FIGURE;So;0;ON;;;;;N;;;;; +1CC03;RIGHT-POINTING STICK FIGURE;So;0;ON;;;;;N;;;;; +1CC04;DOWN-POINTING STICK FIGURE;So;0;ON;;;;;N;;;;; +1CC05;LOWER HORIZONTAL RULER SEGMENT;So;0;ON;;;;;N;;;;; +1CC06;RIGHT VERTICAL RULER SEGMENT;So;0;ON;;;;;N;;;;; +1CC07;LOWER RIGHT RULER SEGMENT;So;0;ON;;;;;N;;;;; +1CC08;ANTENNA;So;0;ON;;;;;N;;;;; +1CC09;HORIZONTAL RESISTOR SEGMENT;So;0;ON;;;;;N;;;;; +1CC0A;VERTICAL RESISTOR SEGMENT;So;0;ON;;;;;N;;;;; +1CC0B;LEFT THIRD INDUCTOR;So;0;ON;;;;;N;;;;; +1CC0C;MIDDLE THIRD INDUCTOR;So;0;ON;;;;;N;;;;; +1CC0D;RIGHT THIRD INDUCTOR;So;0;ON;;;;;N;;;;; +1CC0E;LEFT-POINTING DIODE;So;0;ON;;;;;N;;;;; +1CC0F;RIGHT-POINTING DIODE;So;0;ON;;;;;N;;;;; +1CC10;NPN TRANSISTOR;So;0;ON;;;;;N;;;;; +1CC11;PNP TRANSISTOR;So;0;ON;;;;;N;;;;; +1CC12;RECEPTACLE;So;0;ON;;;;;N;;;;; +1CC13;HORIZONTAL CAPACITOR;So;0;ON;;;;;N;;;;; +1CC14;VERTICAL CAPACITOR;So;0;ON;;;;;N;;;;; +1CC15;LOGIC GATE OR;So;0;ON;;;;;N;;;;; +1CC16;LOGIC GATE AND;So;0;ON;;;;;N;;;;; +1CC17;LOGIC GATE INVERTED INPUTS;So;0;ON;;;;;N;;;;; +1CC18;LOGIC GATE INVERTED OUTPUT;So;0;ON;;;;;N;;;;; +1CC19;LOGIC GATE BUFFER;So;0;ON;;;;;N;;;;; +1CC1A;LOGIC GATE BUFFER WITH INVERTED INPUT;So;0;ON;;;;;N;;;;; +1CC1B;BOX DRAWINGS LIGHT HORIZONTAL AND UPPER RIGHT;So;0;ON;;;;;N;;;;; +1CC1C;BOX DRAWINGS LIGHT HORIZONTAL AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +1CC1D;BOX DRAWINGS LIGHT TOP AND UPPER LEFT;So;0;ON;;;;;N;;;;; +1CC1E;BOX DRAWINGS LIGHT BOTTOM AND LOWER LEFT;So;0;ON;;;;;N;;;;; +1CC1F;BOX DRAWINGS DOUBLE DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;;;;; +1CC20;BOX DRAWINGS DOUBLE DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1CC21;SEPARATED BLOCK QUADRANT-1;So;0;ON;;;;;N;;;;; +1CC22;SEPARATED BLOCK QUADRANT-2;So;0;ON;;;;;N;;;;; +1CC23;SEPARATED BLOCK QUADRANT-12;So;0;ON;;;;;N;;;;; +1CC24;SEPARATED BLOCK QUADRANT-3;So;0;ON;;;;;N;;;;; +1CC25;SEPARATED BLOCK QUADRANT-13;So;0;ON;;;;;N;;;;; +1CC26;SEPARATED BLOCK QUADRANT-23;So;0;ON;;;;;N;;;;; +1CC27;SEPARATED BLOCK QUADRANT-123;So;0;ON;;;;;N;;;;; +1CC28;SEPARATED BLOCK QUADRANT-4;So;0;ON;;;;;N;;;;; +1CC29;SEPARATED BLOCK QUADRANT-14;So;0;ON;;;;;N;;;;; +1CC2A;SEPARATED BLOCK QUADRANT-24;So;0;ON;;;;;N;;;;; +1CC2B;SEPARATED BLOCK QUADRANT-124;So;0;ON;;;;;N;;;;; +1CC2C;SEPARATED BLOCK QUADRANT-34;So;0;ON;;;;;N;;;;; +1CC2D;SEPARATED BLOCK QUADRANT-134;So;0;ON;;;;;N;;;;; +1CC2E;SEPARATED BLOCK QUADRANT-234;So;0;ON;;;;;N;;;;; +1CC2F;SEPARATED BLOCK QUADRANT-1234;So;0;ON;;;;;N;;;;; +1CC30;UPPER LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC31;UPPER CENTRE LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC32;UPPER CENTRE RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC33;UPPER RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC34;UPPER MIDDLE LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC35;UPPER LEFT QUARTER CIRCLE;So;0;ON;;;;;N;;;;; +1CC36;UPPER RIGHT QUARTER CIRCLE;So;0;ON;;;;;N;;;;; +1CC37;UPPER MIDDLE RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC38;LOWER MIDDLE LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC39;LOWER LEFT QUARTER CIRCLE;So;0;ON;;;;;N;;;;; +1CC3A;LOWER RIGHT QUARTER CIRCLE;So;0;ON;;;;;N;;;;; +1CC3B;LOWER MIDDLE RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC3C;LOWER LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC3D;LOWER CENTRE LEFT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC3E;LOWER CENTRE RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC3F;LOWER RIGHT TWELFTH CIRCLE;So;0;ON;;;;;N;;;;; +1CC40;SPARSE HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +1CC41;SPARSE VERTICAL FILL;So;0;ON;;;;;N;;;;; +1CC42;ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +1CC43;DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +1CC44;DENSE VERTICAL FILL;So;0;ON;;;;;N;;;;; +1CC45;DENSE HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +1CC46;SPECKLE FILL FRAME-1;So;0;ON;;;;;N;;;;; +1CC47;SPECKLE FILL FRAME-2;So;0;ON;;;;;N;;;;; +1CC48;LEFT-FACING BASSINET;So;0;ON;;;;;N;;;;; +1CC49;RIGHT-FACING BASSINET;So;0;ON;;;;;N;;;;; +1CC4A;FLYING SAUCER WITH BEAMS;So;0;ON;;;;;N;;;;; +1CC4B;FLYING SAUCER WITHOUT BEAMS;So;0;ON;;;;;N;;;;; +1CC4C;ALIEN MONSTER OPEN JAWS;So;0;ON;;;;;N;;;;; +1CC4D;ALIEN MONSTER CLOSED JAWS;So;0;ON;;;;;N;;;;; +1CC4E;ALIEN SQUID OPEN TENTACLES;So;0;ON;;;;;N;;;;; +1CC4F;ALIEN SQUID CLOSED TENTACLES;So;0;ON;;;;;N;;;;; +1CC50;ALIEN CRAB STEPPING RIGHT;So;0;ON;;;;;N;;;;; +1CC51;ALIEN CRAB STEPPING LEFT;So;0;ON;;;;;N;;;;; +1CC52;ALIEN SPIDER CROUCHING;So;0;ON;;;;;N;;;;; +1CC53;ALIEN SPIDER SPREAD;So;0;ON;;;;;N;;;;; +1CC54;ALIEN MONSTER STEP-1;So;0;ON;;;;;N;;;;; +1CC55;ALIEN MONSTER STEP-2;So;0;ON;;;;;N;;;;; +1CC56;LEFT-POINTING ROCKET SHIP;So;0;ON;;;;;N;;;;; +1CC57;UP-POINTING ROCKET SHIP;So;0;ON;;;;;N;;;;; +1CC58;RIGHT-POINTING ROCKET SHIP;So;0;ON;;;;;N;;;;; +1CC59;DOWN-POINTING ROCKET SHIP;So;0;ON;;;;;N;;;;; +1CC5A;TOP HALF LEFT-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC5B;TOP HALF FORWARD-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC5C;TOP HALF RIGHT-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC5D;BOTTOM HALF LEFT-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC5E;BOTTOM HALF FORWARD-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC5F;BOTTOM HALF RIGHT-FACING ROBOT;So;0;ON;;;;;N;;;;; +1CC60;LEFT-POINTING ATOMIC BOMB;So;0;ON;;;;;N;;;;; +1CC61;UP-POINTING ATOMIC BOMB;So;0;ON;;;;;N;;;;; +1CC62;RIGHT-POINTING ATOMIC BOMB;So;0;ON;;;;;N;;;;; +1CC63;DOWN-POINTING ATOMIC BOMB;So;0;ON;;;;;N;;;;; +1CC64;MUSHROOM CLOUD;So;0;ON;;;;;N;;;;; +1CC65;LEFT-POINTING RIFLE;So;0;ON;;;;;N;;;;; +1CC66;UP-POINTING RIFLE;So;0;ON;;;;;N;;;;; +1CC67;RIGHT-POINTING RIFLE;So;0;ON;;;;;N;;;;; +1CC68;DOWN-POINTING RIFLE;So;0;ON;;;;;N;;;;; +1CC69;EIGHT RAYS INWARD;So;0;ON;;;;;N;;;;; +1CC6A;EIGHT RAYS OUTWARD;So;0;ON;;;;;N;;;;; +1CC6B;BLACK LARGE CIRCLE MINUS LEFT QUARTER SECTION;So;0;ON;;;;;N;;;;; +1CC6C;BLACK LARGE CIRCLE MINUS UPPER QUARTER SECTION;So;0;ON;;;;;N;;;;; +1CC6D;BLACK LARGE CIRCLE MINUS RIGHT QUARTER SECTION;So;0;ON;;;;;N;;;;; +1CC6E;BLACK LARGE CIRCLE MINUS LOWER QUARTER SECTION;So;0;ON;;;;;N;;;;; +1CC6F;BLACK NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1CC70;LEFT-FACING SNAKE HEAD WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC71;UP-FACING SNAKE HEAD WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC72;RIGHT-FACING SNAKE HEAD WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC73;DOWN-FACING SNAKE HEAD WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC74;LEFT-FACING SNAKE HEAD WITH CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1CC75;UP-FACING SNAKE HEAD WITH CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1CC76;RIGHT-FACING SNAKE HEAD WITH CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1CC77;DOWN-FACING SNAKE HEAD WITH CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1CC78;LEFT-POINTING ENERGY WAVE;So;0;ON;;;;;N;;;;; +1CC79;UP-POINTING ENERGY WAVE;So;0;ON;;;;;N;;;;; +1CC7A;RIGHT-POINTING ENERGY WAVE;So;0;ON;;;;;N;;;;; +1CC7B;DOWN-POINTING ENERGY WAVE;So;0;ON;;;;;N;;;;; +1CC7C;SQUARE SPIRAL FROM TOP LEFT;So;0;ON;;;;;N;;;;; +1CC7D;SQUARE SPIRAL FROM TOP RIGHT;So;0;ON;;;;;N;;;;; +1CC7E;SQUARE SPIRAL FROM BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +1CC7F;SQUARE SPIRAL FROM BOTTOM LEFT;So;0;ON;;;;;N;;;;; +1CC80;STRIPED LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +1CC81;STRIPED UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +1CC82;STRIPED RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +1CC83;STRIPED DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +1CC84;VERTICAL LADDER;So;0;ON;;;;;N;;;;; +1CC85;HORIZONTAL LADDER;So;0;ON;;;;;N;;;;; +1CC86;WHITE LOWER LEFT POINTER;So;0;ON;;;;;N;;;;; +1CC87;WHITE LOWER RIGHT POINTER;So;0;ON;;;;;N;;;;; +1CC88;TWO RINGS ALIGNED HORIZONTALLY;So;0;ON;;;;;N;;;;; +1CC89;SQUARE FOUR CORNER SALTIRES;So;0;ON;;;;;N;;;;; +1CC8A;SQUARE FOUR CORNER DIAGONALS;So;0;ON;;;;;N;;;;; +1CC8B;SQUARE FOUR CORNER BLACK TRIANGLES;So;0;ON;;;;;N;;;;; +1CC8C;SQUARE APERTURE;So;0;ON;;;;;N;;;;; +1CC8D;INVERSE BLACK DIAMOND;So;0;ON;;;;;N;;;;; +1CC8E;LEFT AND UPPER ONE EIGHTH BLOCK CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +1CC8F;INVERSE BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +1CC90;VERTICAL LINE WITH FOUR TICK MARKS;So;0;ON;;;;;N;;;;; +1CC91;HORIZONTAL LINE WITH FOUR TICK MARKS;So;0;ON;;;;;N;;;;; +1CC92;LEFT-FACING FISH;So;0;ON;;;;;N;;;;; +1CC93;RIGHT-FACING FISH;So;0;ON;;;;;N;;;;; +1CC94;LEFT-FACING FISH WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC95;RIGHT-FACING FISH WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CC96;FLAPPING BIRD;So;0;ON;;;;;N;;;;; +1CC97;LEFT-POINTING RACING CAR;So;0;ON;;;;;N;;;;; +1CC98;UP-POINTING RACING CAR;So;0;ON;;;;;N;;;;; +1CC99;RIGHT-POINTING RACING CAR;So;0;ON;;;;;N;;;;; +1CC9A;DOWN-POINTING RACING CAR;So;0;ON;;;;;N;;;;; +1CC9B;HORIZONTAL RACING CAR;So;0;ON;;;;;N;;;;; +1CC9C;VERTICAL RACING CAR;So;0;ON;;;;;N;;;;; +1CC9D;VERTICAL GO-KART;So;0;ON;;;;;N;;;;; +1CC9E;LEFT-POINTING TANK;So;0;ON;;;;;N;;;;; +1CC9F;RIGHT-POINTING TANK;So;0;ON;;;;;N;;;;; +1CCA0;LEFT-POINTING ROCKET BOOSTER;So;0;ON;;;;;N;;;;; +1CCA1;RIGHT-POINTING ROCKET BOOSTER;So;0;ON;;;;;N;;;;; +1CCA2;LEFT-POINTING ROLLER COASTER CAR;So;0;ON;;;;;N;;;;; +1CCA3;RIGHT-POINTING ROLLER COASTER CAR;So;0;ON;;;;;N;;;;; +1CCA4;LEFT HALF FLYING SAUCER;So;0;ON;;;;;N;;;;; +1CCA5;RIGHT HALF FLYING SAUCER;So;0;ON;;;;;N;;;;; +1CCA6;UPPER LEFT QUADRANT FACE WITH OPEN EYES;So;0;ON;;;;;N;;;;; +1CCA7;UPPER RIGHT QUADRANT FACE WITH OPEN EYES;So;0;ON;;;;;N;;;;; +1CCA8;UPPER LEFT QUADRANT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1CCA9;UPPER RIGHT QUADRANT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1CCAA;LOWER LEFT QUADRANT SMILING FACE;So;0;ON;;;;;N;;;;; +1CCAB;LOWER RIGHT QUADRANT SMILING FACE;So;0;ON;;;;;N;;;;; +1CCAC;LOWER LEFT QUADRANT NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1CCAD;LOWER RIGHT QUADRANT NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1CCAE;LOWER LEFT QUADRANT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CCAF;LOWER RIGHT QUADRANT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1CCB0;LOWER LEFT QUADRANT FROWNING FACE;So;0;ON;;;;;N;;;;; +1CCB1;LOWER RIGHT QUADRANT FROWNING FACE;So;0;ON;;;;;N;;;;; +1CCB2;UPPER LEFT QUADRANT TELEVISION;So;0;ON;;;;;N;;;;; +1CCB3;UPPER RIGHT QUADRANT TELEVISION;So;0;ON;;;;;N;;;;; +1CCB4;LOWER LEFT QUADRANT TELEVISION;So;0;ON;;;;;N;;;;; +1CCB5;LOWER RIGHT QUADRANT TELEVISION;So;0;ON;;;;;N;;;;; +1CCB6;UPPER LEFT QUADRANT MICROCOMPUTER;So;0;ON;;;;;N;;;;; +1CCB7;UPPER RIGHT QUADRANT MICROCOMPUTER;So;0;ON;;;;;N;;;;; +1CCB8;LOWER LEFT QUADRANT MICROCOMPUTER;So;0;ON;;;;;N;;;;; +1CCB9;LOWER RIGHT QUADRANT MICROCOMPUTER;So;0;ON;;;;;N;;;;; +1CCBA;UPPER LEFT QUADRANT CHESS KING;So;0;ON;;;;;N;;;;; +1CCBB;UPPER RIGHT QUADRANT CHESS KING;So;0;ON;;;;;N;;;;; +1CCBC;LOWER LEFT QUADRANT CHESS KING;So;0;ON;;;;;N;;;;; +1CCBD;LOWER RIGHT QUADRANT CHESS KING;So;0;ON;;;;;N;;;;; +1CCBE;UPPER LEFT QUADRANT CHESS QUEEN;So;0;ON;;;;;N;;;;; +1CCBF;UPPER RIGHT QUADRANT CHESS QUEEN;So;0;ON;;;;;N;;;;; +1CCC0;LOWER LEFT QUADRANT CHESS QUEEN;So;0;ON;;;;;N;;;;; +1CCC1;LOWER RIGHT QUADRANT CHESS QUEEN;So;0;ON;;;;;N;;;;; +1CCC2;UPPER LEFT QUADRANT CHESS ROOK;So;0;ON;;;;;N;;;;; +1CCC3;UPPER RIGHT QUADRANT CHESS ROOK;So;0;ON;;;;;N;;;;; +1CCC4;LOWER LEFT QUADRANT CHESS ROOK;So;0;ON;;;;;N;;;;; +1CCC5;LOWER RIGHT QUADRANT CHESS ROOK;So;0;ON;;;;;N;;;;; +1CCC6;UPPER LEFT QUADRANT CHESS BISHOP;So;0;ON;;;;;N;;;;; +1CCC7;UPPER RIGHT QUADRANT CHESS BISHOP;So;0;ON;;;;;N;;;;; +1CCC8;LOWER LEFT QUADRANT CHESS BISHOP;So;0;ON;;;;;N;;;;; +1CCC9;LOWER RIGHT QUADRANT CHESS BISHOP;So;0;ON;;;;;N;;;;; +1CCCA;UPPER LEFT QUADRANT CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1CCCB;UPPER RIGHT QUADRANT CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1CCCC;LOWER LEFT QUADRANT CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1CCCD;LOWER RIGHT QUADRANT CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1CCCE;UPPER LEFT QUADRANT CHESS PAWN;So;0;ON;;;;;N;;;;; +1CCCF;UPPER RIGHT QUADRANT CHESS PAWN;So;0;ON;;;;;N;;;;; +1CCD0;LOWER LEFT QUADRANT CHESS PAWN;So;0;ON;;;;;N;;;;; +1CCD1;LOWER RIGHT QUADRANT CHESS PAWN;So;0;ON;;;;;N;;;;; +1CCD2;UPPER LEFT QUADRANT STANDING KNIGHT;So;0;ON;;;;;N;;;;; +1CCD3;UPPER RIGHT QUADRANT STANDING KNIGHT;So;0;ON;;;;;N;;;;; +1CCD4;LOWER LEFT QUADRANT STANDING KNIGHT;So;0;ON;;;;;N;;;;; +1CCD5;LOWER RIGHT QUADRANT STANDING KNIGHT;So;0;ON;;;;;N;;;;; +1CCD6;OUTLINED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;; +1CCD7;OUTLINED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;; +1CCD8;OUTLINED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; +1CCD9;OUTLINED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;; +1CCDA;OUTLINED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;; +1CCDB;OUTLINED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;; +1CCDC;OUTLINED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;; +1CCDD;OUTLINED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;; +1CCDE;OUTLINED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;; +1CCDF;OUTLINED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;; +1CCE0;OUTLINED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;; +1CCE1;OUTLINED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;; +1CCE2;OUTLINED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;; +1CCE3;OUTLINED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;; +1CCE4;OUTLINED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;; +1CCE5;OUTLINED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;; +1CCE6;OUTLINED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;; +1CCE7;OUTLINED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; +1CCE8;OUTLINED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;; +1CCE9;OUTLINED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;; +1CCEA;OUTLINED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;; +1CCEB;OUTLINED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;; +1CCEC;OUTLINED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;; +1CCED;OUTLINED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;; +1CCEE;OUTLINED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;; +1CCEF;OUTLINED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;; +1CCF0;OUTLINED DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1CCF1;OUTLINED DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1CCF2;OUTLINED DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1CCF3;OUTLINED DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1CCF4;OUTLINED DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1CCF5;OUTLINED DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1CCF6;OUTLINED DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1CCF7;OUTLINED DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1CCF8;OUTLINED DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1CCF9;OUTLINED DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1CCFA;SNAKE SYMBOL;So;0;ON;;;;;N;;;;; +1CCFB;FLYING SAUCER SYMBOL;So;0;ON;;;;;N;;;;; +1CCFC;NOSE SYMBOL;So;0;ON;;;;;N;;;;; +1CD00;BLOCK OCTANT-3;So;0;ON;;;;;N;;;;; +1CD01;BLOCK OCTANT-23;So;0;ON;;;;;N;;;;; +1CD02;BLOCK OCTANT-123;So;0;ON;;;;;N;;;;; +1CD03;BLOCK OCTANT-4;So;0;ON;;;;;N;;;;; +1CD04;BLOCK OCTANT-14;So;0;ON;;;;;N;;;;; +1CD05;BLOCK OCTANT-124;So;0;ON;;;;;N;;;;; +1CD06;BLOCK OCTANT-34;So;0;ON;;;;;N;;;;; +1CD07;BLOCK OCTANT-134;So;0;ON;;;;;N;;;;; +1CD08;BLOCK OCTANT-234;So;0;ON;;;;;N;;;;; +1CD09;BLOCK OCTANT-5;So;0;ON;;;;;N;;;;; +1CD0A;BLOCK OCTANT-15;So;0;ON;;;;;N;;;;; +1CD0B;BLOCK OCTANT-25;So;0;ON;;;;;N;;;;; +1CD0C;BLOCK OCTANT-125;So;0;ON;;;;;N;;;;; +1CD0D;BLOCK OCTANT-135;So;0;ON;;;;;N;;;;; +1CD0E;BLOCK OCTANT-235;So;0;ON;;;;;N;;;;; +1CD0F;BLOCK OCTANT-1235;So;0;ON;;;;;N;;;;; +1CD10;BLOCK OCTANT-45;So;0;ON;;;;;N;;;;; +1CD11;BLOCK OCTANT-145;So;0;ON;;;;;N;;;;; +1CD12;BLOCK OCTANT-245;So;0;ON;;;;;N;;;;; +1CD13;BLOCK OCTANT-1245;So;0;ON;;;;;N;;;;; +1CD14;BLOCK OCTANT-345;So;0;ON;;;;;N;;;;; +1CD15;BLOCK OCTANT-1345;So;0;ON;;;;;N;;;;; +1CD16;BLOCK OCTANT-2345;So;0;ON;;;;;N;;;;; +1CD17;BLOCK OCTANT-12345;So;0;ON;;;;;N;;;;; +1CD18;BLOCK OCTANT-6;So;0;ON;;;;;N;;;;; +1CD19;BLOCK OCTANT-16;So;0;ON;;;;;N;;;;; +1CD1A;BLOCK OCTANT-26;So;0;ON;;;;;N;;;;; +1CD1B;BLOCK OCTANT-126;So;0;ON;;;;;N;;;;; +1CD1C;BLOCK OCTANT-36;So;0;ON;;;;;N;;;;; +1CD1D;BLOCK OCTANT-136;So;0;ON;;;;;N;;;;; +1CD1E;BLOCK OCTANT-236;So;0;ON;;;;;N;;;;; +1CD1F;BLOCK OCTANT-1236;So;0;ON;;;;;N;;;;; +1CD20;BLOCK OCTANT-146;So;0;ON;;;;;N;;;;; +1CD21;BLOCK OCTANT-246;So;0;ON;;;;;N;;;;; +1CD22;BLOCK OCTANT-1246;So;0;ON;;;;;N;;;;; +1CD23;BLOCK OCTANT-346;So;0;ON;;;;;N;;;;; +1CD24;BLOCK OCTANT-1346;So;0;ON;;;;;N;;;;; +1CD25;BLOCK OCTANT-2346;So;0;ON;;;;;N;;;;; +1CD26;BLOCK OCTANT-12346;So;0;ON;;;;;N;;;;; +1CD27;BLOCK OCTANT-56;So;0;ON;;;;;N;;;;; +1CD28;BLOCK OCTANT-156;So;0;ON;;;;;N;;;;; +1CD29;BLOCK OCTANT-256;So;0;ON;;;;;N;;;;; +1CD2A;BLOCK OCTANT-1256;So;0;ON;;;;;N;;;;; +1CD2B;BLOCK OCTANT-356;So;0;ON;;;;;N;;;;; +1CD2C;BLOCK OCTANT-1356;So;0;ON;;;;;N;;;;; +1CD2D;BLOCK OCTANT-2356;So;0;ON;;;;;N;;;;; +1CD2E;BLOCK OCTANT-12356;So;0;ON;;;;;N;;;;; +1CD2F;BLOCK OCTANT-456;So;0;ON;;;;;N;;;;; +1CD30;BLOCK OCTANT-1456;So;0;ON;;;;;N;;;;; +1CD31;BLOCK OCTANT-2456;So;0;ON;;;;;N;;;;; +1CD32;BLOCK OCTANT-12456;So;0;ON;;;;;N;;;;; +1CD33;BLOCK OCTANT-3456;So;0;ON;;;;;N;;;;; +1CD34;BLOCK OCTANT-13456;So;0;ON;;;;;N;;;;; +1CD35;BLOCK OCTANT-23456;So;0;ON;;;;;N;;;;; +1CD36;BLOCK OCTANT-17;So;0;ON;;;;;N;;;;; +1CD37;BLOCK OCTANT-27;So;0;ON;;;;;N;;;;; +1CD38;BLOCK OCTANT-127;So;0;ON;;;;;N;;;;; +1CD39;BLOCK OCTANT-37;So;0;ON;;;;;N;;;;; +1CD3A;BLOCK OCTANT-137;So;0;ON;;;;;N;;;;; +1CD3B;BLOCK OCTANT-237;So;0;ON;;;;;N;;;;; +1CD3C;BLOCK OCTANT-1237;So;0;ON;;;;;N;;;;; +1CD3D;BLOCK OCTANT-47;So;0;ON;;;;;N;;;;; +1CD3E;BLOCK OCTANT-147;So;0;ON;;;;;N;;;;; +1CD3F;BLOCK OCTANT-247;So;0;ON;;;;;N;;;;; +1CD40;BLOCK OCTANT-1247;So;0;ON;;;;;N;;;;; +1CD41;BLOCK OCTANT-347;So;0;ON;;;;;N;;;;; +1CD42;BLOCK OCTANT-1347;So;0;ON;;;;;N;;;;; +1CD43;BLOCK OCTANT-2347;So;0;ON;;;;;N;;;;; +1CD44;BLOCK OCTANT-12347;So;0;ON;;;;;N;;;;; +1CD45;BLOCK OCTANT-157;So;0;ON;;;;;N;;;;; +1CD46;BLOCK OCTANT-257;So;0;ON;;;;;N;;;;; +1CD47;BLOCK OCTANT-1257;So;0;ON;;;;;N;;;;; +1CD48;BLOCK OCTANT-357;So;0;ON;;;;;N;;;;; +1CD49;BLOCK OCTANT-2357;So;0;ON;;;;;N;;;;; +1CD4A;BLOCK OCTANT-12357;So;0;ON;;;;;N;;;;; +1CD4B;BLOCK OCTANT-457;So;0;ON;;;;;N;;;;; +1CD4C;BLOCK OCTANT-1457;So;0;ON;;;;;N;;;;; +1CD4D;BLOCK OCTANT-12457;So;0;ON;;;;;N;;;;; +1CD4E;BLOCK OCTANT-3457;So;0;ON;;;;;N;;;;; +1CD4F;BLOCK OCTANT-13457;So;0;ON;;;;;N;;;;; +1CD50;BLOCK OCTANT-23457;So;0;ON;;;;;N;;;;; +1CD51;BLOCK OCTANT-67;So;0;ON;;;;;N;;;;; +1CD52;BLOCK OCTANT-167;So;0;ON;;;;;N;;;;; +1CD53;BLOCK OCTANT-267;So;0;ON;;;;;N;;;;; +1CD54;BLOCK OCTANT-1267;So;0;ON;;;;;N;;;;; +1CD55;BLOCK OCTANT-367;So;0;ON;;;;;N;;;;; +1CD56;BLOCK OCTANT-1367;So;0;ON;;;;;N;;;;; +1CD57;BLOCK OCTANT-2367;So;0;ON;;;;;N;;;;; +1CD58;BLOCK OCTANT-12367;So;0;ON;;;;;N;;;;; +1CD59;BLOCK OCTANT-467;So;0;ON;;;;;N;;;;; +1CD5A;BLOCK OCTANT-1467;So;0;ON;;;;;N;;;;; +1CD5B;BLOCK OCTANT-2467;So;0;ON;;;;;N;;;;; +1CD5C;BLOCK OCTANT-12467;So;0;ON;;;;;N;;;;; +1CD5D;BLOCK OCTANT-3467;So;0;ON;;;;;N;;;;; +1CD5E;BLOCK OCTANT-13467;So;0;ON;;;;;N;;;;; +1CD5F;BLOCK OCTANT-23467;So;0;ON;;;;;N;;;;; +1CD60;BLOCK OCTANT-123467;So;0;ON;;;;;N;;;;; +1CD61;BLOCK OCTANT-567;So;0;ON;;;;;N;;;;; +1CD62;BLOCK OCTANT-1567;So;0;ON;;;;;N;;;;; +1CD63;BLOCK OCTANT-2567;So;0;ON;;;;;N;;;;; +1CD64;BLOCK OCTANT-12567;So;0;ON;;;;;N;;;;; +1CD65;BLOCK OCTANT-3567;So;0;ON;;;;;N;;;;; +1CD66;BLOCK OCTANT-13567;So;0;ON;;;;;N;;;;; +1CD67;BLOCK OCTANT-23567;So;0;ON;;;;;N;;;;; +1CD68;BLOCK OCTANT-123567;So;0;ON;;;;;N;;;;; +1CD69;BLOCK OCTANT-4567;So;0;ON;;;;;N;;;;; +1CD6A;BLOCK OCTANT-14567;So;0;ON;;;;;N;;;;; +1CD6B;BLOCK OCTANT-24567;So;0;ON;;;;;N;;;;; +1CD6C;BLOCK OCTANT-124567;So;0;ON;;;;;N;;;;; +1CD6D;BLOCK OCTANT-34567;So;0;ON;;;;;N;;;;; +1CD6E;BLOCK OCTANT-134567;So;0;ON;;;;;N;;;;; +1CD6F;BLOCK OCTANT-234567;So;0;ON;;;;;N;;;;; +1CD70;BLOCK OCTANT-1234567;So;0;ON;;;;;N;;;;; +1CD71;BLOCK OCTANT-18;So;0;ON;;;;;N;;;;; +1CD72;BLOCK OCTANT-28;So;0;ON;;;;;N;;;;; +1CD73;BLOCK OCTANT-128;So;0;ON;;;;;N;;;;; +1CD74;BLOCK OCTANT-38;So;0;ON;;;;;N;;;;; +1CD75;BLOCK OCTANT-138;So;0;ON;;;;;N;;;;; +1CD76;BLOCK OCTANT-238;So;0;ON;;;;;N;;;;; +1CD77;BLOCK OCTANT-1238;So;0;ON;;;;;N;;;;; +1CD78;BLOCK OCTANT-48;So;0;ON;;;;;N;;;;; +1CD79;BLOCK OCTANT-148;So;0;ON;;;;;N;;;;; +1CD7A;BLOCK OCTANT-248;So;0;ON;;;;;N;;;;; +1CD7B;BLOCK OCTANT-1248;So;0;ON;;;;;N;;;;; +1CD7C;BLOCK OCTANT-348;So;0;ON;;;;;N;;;;; +1CD7D;BLOCK OCTANT-1348;So;0;ON;;;;;N;;;;; +1CD7E;BLOCK OCTANT-2348;So;0;ON;;;;;N;;;;; +1CD7F;BLOCK OCTANT-12348;So;0;ON;;;;;N;;;;; +1CD80;BLOCK OCTANT-58;So;0;ON;;;;;N;;;;; +1CD81;BLOCK OCTANT-158;So;0;ON;;;;;N;;;;; +1CD82;BLOCK OCTANT-258;So;0;ON;;;;;N;;;;; +1CD83;BLOCK OCTANT-1258;So;0;ON;;;;;N;;;;; +1CD84;BLOCK OCTANT-358;So;0;ON;;;;;N;;;;; +1CD85;BLOCK OCTANT-1358;So;0;ON;;;;;N;;;;; +1CD86;BLOCK OCTANT-2358;So;0;ON;;;;;N;;;;; +1CD87;BLOCK OCTANT-12358;So;0;ON;;;;;N;;;;; +1CD88;BLOCK OCTANT-458;So;0;ON;;;;;N;;;;; +1CD89;BLOCK OCTANT-1458;So;0;ON;;;;;N;;;;; +1CD8A;BLOCK OCTANT-2458;So;0;ON;;;;;N;;;;; +1CD8B;BLOCK OCTANT-12458;So;0;ON;;;;;N;;;;; +1CD8C;BLOCK OCTANT-3458;So;0;ON;;;;;N;;;;; +1CD8D;BLOCK OCTANT-13458;So;0;ON;;;;;N;;;;; +1CD8E;BLOCK OCTANT-23458;So;0;ON;;;;;N;;;;; +1CD8F;BLOCK OCTANT-123458;So;0;ON;;;;;N;;;;; +1CD90;BLOCK OCTANT-168;So;0;ON;;;;;N;;;;; +1CD91;BLOCK OCTANT-268;So;0;ON;;;;;N;;;;; +1CD92;BLOCK OCTANT-1268;So;0;ON;;;;;N;;;;; +1CD93;BLOCK OCTANT-368;So;0;ON;;;;;N;;;;; +1CD94;BLOCK OCTANT-2368;So;0;ON;;;;;N;;;;; +1CD95;BLOCK OCTANT-12368;So;0;ON;;;;;N;;;;; +1CD96;BLOCK OCTANT-468;So;0;ON;;;;;N;;;;; +1CD97;BLOCK OCTANT-1468;So;0;ON;;;;;N;;;;; +1CD98;BLOCK OCTANT-12468;So;0;ON;;;;;N;;;;; +1CD99;BLOCK OCTANT-3468;So;0;ON;;;;;N;;;;; +1CD9A;BLOCK OCTANT-13468;So;0;ON;;;;;N;;;;; +1CD9B;BLOCK OCTANT-23468;So;0;ON;;;;;N;;;;; +1CD9C;BLOCK OCTANT-568;So;0;ON;;;;;N;;;;; +1CD9D;BLOCK OCTANT-1568;So;0;ON;;;;;N;;;;; +1CD9E;BLOCK OCTANT-2568;So;0;ON;;;;;N;;;;; +1CD9F;BLOCK OCTANT-12568;So;0;ON;;;;;N;;;;; +1CDA0;BLOCK OCTANT-3568;So;0;ON;;;;;N;;;;; +1CDA1;BLOCK OCTANT-13568;So;0;ON;;;;;N;;;;; +1CDA2;BLOCK OCTANT-23568;So;0;ON;;;;;N;;;;; +1CDA3;BLOCK OCTANT-123568;So;0;ON;;;;;N;;;;; +1CDA4;BLOCK OCTANT-4568;So;0;ON;;;;;N;;;;; +1CDA5;BLOCK OCTANT-14568;So;0;ON;;;;;N;;;;; +1CDA6;BLOCK OCTANT-24568;So;0;ON;;;;;N;;;;; +1CDA7;BLOCK OCTANT-124568;So;0;ON;;;;;N;;;;; +1CDA8;BLOCK OCTANT-34568;So;0;ON;;;;;N;;;;; +1CDA9;BLOCK OCTANT-134568;So;0;ON;;;;;N;;;;; +1CDAA;BLOCK OCTANT-234568;So;0;ON;;;;;N;;;;; +1CDAB;BLOCK OCTANT-1234568;So;0;ON;;;;;N;;;;; +1CDAC;BLOCK OCTANT-178;So;0;ON;;;;;N;;;;; +1CDAD;BLOCK OCTANT-278;So;0;ON;;;;;N;;;;; +1CDAE;BLOCK OCTANT-1278;So;0;ON;;;;;N;;;;; +1CDAF;BLOCK OCTANT-378;So;0;ON;;;;;N;;;;; +1CDB0;BLOCK OCTANT-1378;So;0;ON;;;;;N;;;;; +1CDB1;BLOCK OCTANT-2378;So;0;ON;;;;;N;;;;; +1CDB2;BLOCK OCTANT-12378;So;0;ON;;;;;N;;;;; +1CDB3;BLOCK OCTANT-478;So;0;ON;;;;;N;;;;; +1CDB4;BLOCK OCTANT-1478;So;0;ON;;;;;N;;;;; +1CDB5;BLOCK OCTANT-2478;So;0;ON;;;;;N;;;;; +1CDB6;BLOCK OCTANT-12478;So;0;ON;;;;;N;;;;; +1CDB7;BLOCK OCTANT-3478;So;0;ON;;;;;N;;;;; +1CDB8;BLOCK OCTANT-13478;So;0;ON;;;;;N;;;;; +1CDB9;BLOCK OCTANT-23478;So;0;ON;;;;;N;;;;; +1CDBA;BLOCK OCTANT-123478;So;0;ON;;;;;N;;;;; +1CDBB;BLOCK OCTANT-578;So;0;ON;;;;;N;;;;; +1CDBC;BLOCK OCTANT-1578;So;0;ON;;;;;N;;;;; +1CDBD;BLOCK OCTANT-2578;So;0;ON;;;;;N;;;;; +1CDBE;BLOCK OCTANT-12578;So;0;ON;;;;;N;;;;; +1CDBF;BLOCK OCTANT-3578;So;0;ON;;;;;N;;;;; +1CDC0;BLOCK OCTANT-13578;So;0;ON;;;;;N;;;;; +1CDC1;BLOCK OCTANT-23578;So;0;ON;;;;;N;;;;; +1CDC2;BLOCK OCTANT-123578;So;0;ON;;;;;N;;;;; +1CDC3;BLOCK OCTANT-4578;So;0;ON;;;;;N;;;;; +1CDC4;BLOCK OCTANT-14578;So;0;ON;;;;;N;;;;; +1CDC5;BLOCK OCTANT-24578;So;0;ON;;;;;N;;;;; +1CDC6;BLOCK OCTANT-124578;So;0;ON;;;;;N;;;;; +1CDC7;BLOCK OCTANT-34578;So;0;ON;;;;;N;;;;; +1CDC8;BLOCK OCTANT-134578;So;0;ON;;;;;N;;;;; +1CDC9;BLOCK OCTANT-234578;So;0;ON;;;;;N;;;;; +1CDCA;BLOCK OCTANT-1234578;So;0;ON;;;;;N;;;;; +1CDCB;BLOCK OCTANT-678;So;0;ON;;;;;N;;;;; +1CDCC;BLOCK OCTANT-1678;So;0;ON;;;;;N;;;;; +1CDCD;BLOCK OCTANT-2678;So;0;ON;;;;;N;;;;; +1CDCE;BLOCK OCTANT-12678;So;0;ON;;;;;N;;;;; +1CDCF;BLOCK OCTANT-3678;So;0;ON;;;;;N;;;;; +1CDD0;BLOCK OCTANT-13678;So;0;ON;;;;;N;;;;; +1CDD1;BLOCK OCTANT-23678;So;0;ON;;;;;N;;;;; +1CDD2;BLOCK OCTANT-123678;So;0;ON;;;;;N;;;;; +1CDD3;BLOCK OCTANT-4678;So;0;ON;;;;;N;;;;; +1CDD4;BLOCK OCTANT-14678;So;0;ON;;;;;N;;;;; +1CDD5;BLOCK OCTANT-24678;So;0;ON;;;;;N;;;;; +1CDD6;BLOCK OCTANT-124678;So;0;ON;;;;;N;;;;; +1CDD7;BLOCK OCTANT-34678;So;0;ON;;;;;N;;;;; +1CDD8;BLOCK OCTANT-134678;So;0;ON;;;;;N;;;;; +1CDD9;BLOCK OCTANT-234678;So;0;ON;;;;;N;;;;; +1CDDA;BLOCK OCTANT-1234678;So;0;ON;;;;;N;;;;; +1CDDB;BLOCK OCTANT-15678;So;0;ON;;;;;N;;;;; +1CDDC;BLOCK OCTANT-25678;So;0;ON;;;;;N;;;;; +1CDDD;BLOCK OCTANT-125678;So;0;ON;;;;;N;;;;; +1CDDE;BLOCK OCTANT-35678;So;0;ON;;;;;N;;;;; +1CDDF;BLOCK OCTANT-235678;So;0;ON;;;;;N;;;;; +1CDE0;BLOCK OCTANT-1235678;So;0;ON;;;;;N;;;;; +1CDE1;BLOCK OCTANT-45678;So;0;ON;;;;;N;;;;; +1CDE2;BLOCK OCTANT-145678;So;0;ON;;;;;N;;;;; +1CDE3;BLOCK OCTANT-1245678;So;0;ON;;;;;N;;;;; +1CDE4;BLOCK OCTANT-1345678;So;0;ON;;;;;N;;;;; +1CDE5;BLOCK OCTANT-2345678;So;0;ON;;;;;N;;;;; +1CDE6;TOP HALF STANDING PERSON;So;0;ON;;;;;N;;;;; +1CDE7;BOTTOM HALF STANDING PERSON;So;0;ON;;;;;N;;;;; +1CDE8;TOP HALF RIGHT-FACING RUNNER FRAME-1;So;0;ON;;;;;N;;;;; +1CDE9;BOTTOM HALF RIGHT-FACING RUNNER FRAME-1;So;0;ON;;;;;N;;;;; +1CDEA;TOP HALF RIGHT-FACING RUNNER FRAME-2;So;0;ON;;;;;N;;;;; +1CDEB;BOTTOM HALF RIGHT-FACING RUNNER FRAME-2;So;0;ON;;;;;N;;;;; +1CDEC;TOP HALF LEFT-FACING RUNNER FRAME-1;So;0;ON;;;;;N;;;;; +1CDED;BOTTOM HALF LEFT-FACING RUNNER FRAME-1;So;0;ON;;;;;N;;;;; +1CDEE;TOP HALF LEFT-FACING RUNNER FRAME-2;So;0;ON;;;;;N;;;;; +1CDEF;BOTTOM HALF LEFT-FACING RUNNER FRAME-2;So;0;ON;;;;;N;;;;; +1CDF0;TOP HALF FORWARD-FACING RUNNER;So;0;ON;;;;;N;;;;; +1CDF1;BOTTOM HALF FORWARD-FACING RUNNER FRAME-1;So;0;ON;;;;;N;;;;; +1CDF2;BOTTOM HALF FORWARD-FACING RUNNER FRAME-2;So;0;ON;;;;;N;;;;; +1CDF3;BOTTOM HALF FORWARD-FACING RUNNER FRAME-3;So;0;ON;;;;;N;;;;; +1CDF4;BOTTOM HALF FORWARD-FACING RUNNER FRAME-4;So;0;ON;;;;;N;;;;; +1CDF5;MOON LANDER;So;0;ON;;;;;N;;;;; +1CDF6;TOP HALF FLAILING ROBOT FRAME-1;So;0;ON;;;;;N;;;;; +1CDF7;TOP HALF FLAILING ROBOT FRAME-2;So;0;ON;;;;;N;;;;; +1CDF8;DOWN-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1CDF9;LEFT-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1CDFA;SMALL UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1CDFB;UP-POINTING FROG;So;0;ON;;;;;N;;;;; +1CDFC;DOWN-POINTING FROG;So;0;ON;;;;;N;;;;; +1CDFD;EXPLOSION FRAME-1;So;0;ON;;;;;N;;;;; +1CDFE;EXPLOSION FRAME-2;So;0;ON;;;;;N;;;;; +1CDFF;EXPLOSION FRAME-3;So;0;ON;;;;;N;;;;; +1CE00;RIGHT HALF AND LEFT HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1CE01;LOWER HALF AND UPPER HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1CE02;EXPLOSION AT HORIZON;So;0;ON;;;;;N;;;;; +1CE03;UPPER HALF HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1CE04;LOWER HALF HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1CE05;HEAVY WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1CE06;WHITE VERTICAL RECTANGLE WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +1CE07;TOP LEFT BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;;;;; +1CE08;FUNNEL;So;0;ON;;;;;N;;;;; +1CE09;BOX DRAWINGS DOUBLE DIAGONAL LOWER LEFT TO MIDDLE CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1CE0A;BOX DRAWINGS DOUBLE DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1CE0B;LEFT HALF WHITE ELLIPSE;So;0;ON;;;;;N;;;;; +1CE0C;RIGHT HALF WHITE ELLIPSE;So;0;ON;;;;;N;;;;; +1CE0D;LEFT HALF TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;;;;; +1CE0E;RIGHT HALF TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;;;;; +1CE0F;HORIZONTAL LINE WITH TICK MARK;So;0;ON;;;;;N;;;;; +1CE10;LEFT HALF HORIZONTAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE11;RIGHT HALF HORIZONTAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE12;HORIZONTAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE13;LOWER HALF VERTICAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE14;UPPER HALF VERTICAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE15;VERTICAL LINE WITH THREE TICK MARKS;So;0;ON;;;;;N;;;;; +1CE16;BOX DRAWINGS LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; +1CE17;BOX DRAWINGS LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +1CE18;BOX DRAWINGS LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; +1CE19;BOX DRAWINGS LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; +1CE1A;LARGE TYPE PIECE UPPER LEFT ARC;So;0;ON;;;;;N;;;;; +1CE1B;LARGE TYPE PIECE UPPER LEFT CORNER;So;0;ON;;;;;N;;;;; +1CE1C;LARGE TYPE PIECE UPPER TERMINAL;So;0;ON;;;;;N;;;;; +1CE1D;LARGE TYPE PIECE UPPER LEFT CROTCH;So;0;ON;;;;;N;;;;; +1CE1E;LARGE TYPE PIECE LEFT ARM;So;0;ON;;;;;N;;;;; +1CE1F;LARGE TYPE PIECE CROSSBAR;So;0;ON;;;;;N;;;;; +1CE20;LARGE TYPE PIECE CROSSBAR WITH LOWER STEM;So;0;ON;;;;;N;;;;; +1CE21;LARGE TYPE PIECE UPPER HALF VERTEX OF M;So;0;ON;;;;;N;;;;; +1CE22;LARGE TYPE PIECE DIAGONAL LOWER LEFT;So;0;ON;;;;;N;;;;; +1CE23;LARGE TYPE PIECE SHORT UPPER TERMINAL;So;0;ON;;;;;N;;;;; +1CE24;LARGE TYPE PIECE UPPER RIGHT ARC;So;0;ON;;;;;N;;;;; +1CE25;LARGE TYPE PIECE RIGHT ARM;So;0;ON;;;;;N;;;;; +1CE26;LARGE TYPE PIECE UPPER RIGHT CROTCH;So;0;ON;;;;;N;;;;; +1CE27;LARGE TYPE PIECE UPPER RIGHT CORNER;So;0;ON;;;;;N;;;;; +1CE28;LARGE TYPE PIECE STEM WITH RIGHT CROSSBAR;So;0;ON;;;;;N;;;;; +1CE29;LARGE TYPE PIECE STEM;So;0;ON;;;;;N;;;;; +1CE2A;LARGE TYPE PIECE DIAGONAL UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +1CE2B;LARGE TYPE PIECE DIAGONAL UPPER RIGHT;So;0;ON;;;;;N;;;;; +1CE2C;LARGE TYPE PIECE DIAGONAL LOWER RIGHT;So;0;ON;;;;;N;;;;; +1CE2D;LARGE TYPE PIECE SHORT LOWER TERMINAL;So;0;ON;;;;;N;;;;; +1CE2E;LARGE TYPE PIECE LOWER LEFT AND UPPER LEFT ARC;So;0;ON;;;;;N;;;;; +1CE2F;LARGE TYPE PIECE CENTRE OF K;So;0;ON;;;;;N;;;;; +1CE30;LARGE TYPE PIECE LOWER HALF VERTEX OF M;So;0;ON;;;;;N;;;;; +1CE31;LARGE TYPE PIECE UPPER HALF VERTEX OF W;So;0;ON;;;;;N;;;;; +1CE32;LARGE TYPE PIECE CENTRE OF X;So;0;ON;;;;;N;;;;; +1CE33;LARGE TYPE PIECE CENTRE OF Y;So;0;ON;;;;;N;;;;; +1CE34;LARGE TYPE PIECE CENTRE OF Z WITH CROSSBAR;So;0;ON;;;;;N;;;;; +1CE35;LARGE TYPE PIECE RAISED UPPER LEFT ARC;So;0;ON;;;;;N;;;;; +1CE36;LARGE TYPE PIECE STEM WITH LEFT CROSSBAR;So;0;ON;;;;;N;;;;; +1CE37;LARGE TYPE PIECE LOWER RIGHT AND UPPER RIGHT ARC;So;0;ON;;;;;N;;;;; +1CE38;LARGE TYPE PIECE DIAGONAL UPPER LEFT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +1CE39;LARGE TYPE PIECE STEM WITH LEFT JOINT;So;0;ON;;;;;N;;;;; +1CE3A;LARGE TYPE PIECE STEM WITH CROSSBAR;So;0;ON;;;;;N;;;;; +1CE3B;LARGE TYPE PIECE DIAGONAL UPPER LEFT;So;0;ON;;;;;N;;;;; +1CE3C;LARGE TYPE PIECE LOWER TERMINAL;So;0;ON;;;;;N;;;;; +1CE3D;LARGE TYPE PIECE LOWER LEFT CORNER;So;0;ON;;;;;N;;;;; +1CE3E;LARGE TYPE PIECE LOWER LEFT ARC;So;0;ON;;;;;N;;;;; +1CE3F;LARGE TYPE PIECE LOWER LEFT CROTCH;So;0;ON;;;;;N;;;;; +1CE40;LARGE TYPE PIECE CROSSBAR WITH UPPER STEM;So;0;ON;;;;;N;;;;; +1CE41;LARGE TYPE PIECE VERTEX OF V;So;0;ON;;;;;N;;;;; +1CE42;LARGE TYPE PIECE LOWER HALF VERTEX OF W;So;0;ON;;;;;N;;;;; +1CE43;LARGE TYPE PIECE LOWER RIGHT ARC;So;0;ON;;;;;N;;;;; +1CE44;LARGE TYPE PIECE LOWER RIGHT CORNER;So;0;ON;;;;;N;;;;; +1CE45;LARGE TYPE PIECE LOWER RIGHT ARC WITH TAIL;So;0;ON;;;;;N;;;;; +1CE46;LARGE TYPE PIECE LOWER RIGHT CROTCH;So;0;ON;;;;;N;;;;; +1CE47;LARGE TYPE PIECE STEM-45;So;0;ON;;;;;N;;;;; +1CE48;LARGE TYPE PIECE STEM-2345;So;0;ON;;;;;N;;;;; +1CE49;LARGE TYPE PIECE STEM-4;So;0;ON;;;;;N;;;;; +1CE4A;LARGE TYPE PIECE STEM-34;So;0;ON;;;;;N;;;;; +1CE4B;LARGE TYPE PIECE STEM-234;So;0;ON;;;;;N;;;;; +1CE4C;LARGE TYPE PIECE STEM-1234;So;0;ON;;;;;N;;;;; +1CE4D;LARGE TYPE PIECE STEM-3;So;0;ON;;;;;N;;;;; +1CE4E;LARGE TYPE PIECE STEM-23;So;0;ON;;;;;N;;;;; +1CE4F;LARGE TYPE PIECE STEM-2;So;0;ON;;;;;N;;;;; +1CE50;LARGE TYPE PIECE STEM-12;So;0;ON;;;;;N;;;;; +1CE51;SEPARATED BLOCK SEXTANT-1;So;0;ON;;;;;N;;;;; +1CE52;SEPARATED BLOCK SEXTANT-2;So;0;ON;;;;;N;;;;; +1CE53;SEPARATED BLOCK SEXTANT-12;So;0;ON;;;;;N;;;;; +1CE54;SEPARATED BLOCK SEXTANT-3;So;0;ON;;;;;N;;;;; +1CE55;SEPARATED BLOCK SEXTANT-13;So;0;ON;;;;;N;;;;; +1CE56;SEPARATED BLOCK SEXTANT-23;So;0;ON;;;;;N;;;;; +1CE57;SEPARATED BLOCK SEXTANT-123;So;0;ON;;;;;N;;;;; +1CE58;SEPARATED BLOCK SEXTANT-4;So;0;ON;;;;;N;;;;; +1CE59;SEPARATED BLOCK SEXTANT-14;So;0;ON;;;;;N;;;;; +1CE5A;SEPARATED BLOCK SEXTANT-24;So;0;ON;;;;;N;;;;; +1CE5B;SEPARATED BLOCK SEXTANT-124;So;0;ON;;;;;N;;;;; +1CE5C;SEPARATED BLOCK SEXTANT-34;So;0;ON;;;;;N;;;;; +1CE5D;SEPARATED BLOCK SEXTANT-134;So;0;ON;;;;;N;;;;; +1CE5E;SEPARATED BLOCK SEXTANT-234;So;0;ON;;;;;N;;;;; +1CE5F;SEPARATED BLOCK SEXTANT-1234;So;0;ON;;;;;N;;;;; +1CE60;SEPARATED BLOCK SEXTANT-5;So;0;ON;;;;;N;;;;; +1CE61;SEPARATED BLOCK SEXTANT-15;So;0;ON;;;;;N;;;;; +1CE62;SEPARATED BLOCK SEXTANT-25;So;0;ON;;;;;N;;;;; +1CE63;SEPARATED BLOCK SEXTANT-125;So;0;ON;;;;;N;;;;; +1CE64;SEPARATED BLOCK SEXTANT-35;So;0;ON;;;;;N;;;;; +1CE65;SEPARATED BLOCK SEXTANT-135;So;0;ON;;;;;N;;;;; +1CE66;SEPARATED BLOCK SEXTANT-235;So;0;ON;;;;;N;;;;; +1CE67;SEPARATED BLOCK SEXTANT-1235;So;0;ON;;;;;N;;;;; +1CE68;SEPARATED BLOCK SEXTANT-45;So;0;ON;;;;;N;;;;; +1CE69;SEPARATED BLOCK SEXTANT-145;So;0;ON;;;;;N;;;;; +1CE6A;SEPARATED BLOCK SEXTANT-245;So;0;ON;;;;;N;;;;; +1CE6B;SEPARATED BLOCK SEXTANT-1245;So;0;ON;;;;;N;;;;; +1CE6C;SEPARATED BLOCK SEXTANT-345;So;0;ON;;;;;N;;;;; +1CE6D;SEPARATED BLOCK SEXTANT-1345;So;0;ON;;;;;N;;;;; +1CE6E;SEPARATED BLOCK SEXTANT-2345;So;0;ON;;;;;N;;;;; +1CE6F;SEPARATED BLOCK SEXTANT-12345;So;0;ON;;;;;N;;;;; +1CE70;SEPARATED BLOCK SEXTANT-6;So;0;ON;;;;;N;;;;; +1CE71;SEPARATED BLOCK SEXTANT-16;So;0;ON;;;;;N;;;;; +1CE72;SEPARATED BLOCK SEXTANT-26;So;0;ON;;;;;N;;;;; +1CE73;SEPARATED BLOCK SEXTANT-126;So;0;ON;;;;;N;;;;; +1CE74;SEPARATED BLOCK SEXTANT-36;So;0;ON;;;;;N;;;;; +1CE75;SEPARATED BLOCK SEXTANT-136;So;0;ON;;;;;N;;;;; +1CE76;SEPARATED BLOCK SEXTANT-236;So;0;ON;;;;;N;;;;; +1CE77;SEPARATED BLOCK SEXTANT-1236;So;0;ON;;;;;N;;;;; +1CE78;SEPARATED BLOCK SEXTANT-46;So;0;ON;;;;;N;;;;; +1CE79;SEPARATED BLOCK SEXTANT-146;So;0;ON;;;;;N;;;;; +1CE7A;SEPARATED BLOCK SEXTANT-246;So;0;ON;;;;;N;;;;; +1CE7B;SEPARATED BLOCK SEXTANT-1246;So;0;ON;;;;;N;;;;; +1CE7C;SEPARATED BLOCK SEXTANT-346;So;0;ON;;;;;N;;;;; +1CE7D;SEPARATED BLOCK SEXTANT-1346;So;0;ON;;;;;N;;;;; +1CE7E;SEPARATED BLOCK SEXTANT-2346;So;0;ON;;;;;N;;;;; +1CE7F;SEPARATED BLOCK SEXTANT-12346;So;0;ON;;;;;N;;;;; +1CE80;SEPARATED BLOCK SEXTANT-56;So;0;ON;;;;;N;;;;; +1CE81;SEPARATED BLOCK SEXTANT-156;So;0;ON;;;;;N;;;;; +1CE82;SEPARATED BLOCK SEXTANT-256;So;0;ON;;;;;N;;;;; +1CE83;SEPARATED BLOCK SEXTANT-1256;So;0;ON;;;;;N;;;;; +1CE84;SEPARATED BLOCK SEXTANT-356;So;0;ON;;;;;N;;;;; +1CE85;SEPARATED BLOCK SEXTANT-1356;So;0;ON;;;;;N;;;;; +1CE86;SEPARATED BLOCK SEXTANT-2356;So;0;ON;;;;;N;;;;; +1CE87;SEPARATED BLOCK SEXTANT-12356;So;0;ON;;;;;N;;;;; +1CE88;SEPARATED BLOCK SEXTANT-456;So;0;ON;;;;;N;;;;; +1CE89;SEPARATED BLOCK SEXTANT-1456;So;0;ON;;;;;N;;;;; +1CE8A;SEPARATED BLOCK SEXTANT-2456;So;0;ON;;;;;N;;;;; +1CE8B;SEPARATED BLOCK SEXTANT-12456;So;0;ON;;;;;N;;;;; +1CE8C;SEPARATED BLOCK SEXTANT-3456;So;0;ON;;;;;N;;;;; +1CE8D;SEPARATED BLOCK SEXTANT-13456;So;0;ON;;;;;N;;;;; +1CE8E;SEPARATED BLOCK SEXTANT-23456;So;0;ON;;;;;N;;;;; +1CE8F;SEPARATED BLOCK SEXTANT-123456;So;0;ON;;;;;N;;;;; +1CE90;UPPER LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE91;UPPER CENTRE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE92;UPPER CENTRE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE93;UPPER RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE94;UPPER MIDDLE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE95;UPPER MIDDLE CENTRE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE96;UPPER MIDDLE CENTRE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE97;UPPER MIDDLE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE98;LOWER MIDDLE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE99;LOWER MIDDLE CENTRE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9A;LOWER MIDDLE CENTRE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9B;LOWER MIDDLE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9C;LOWER LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9D;LOWER CENTRE LEFT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9E;LOWER CENTRE RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CE9F;LOWER RIGHT ONE SIXTEENTH BLOCK;So;0;ON;;;;;N;;;;; +1CEA0;RIGHT HALF LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA1;RIGHT THREE QUARTERS LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA2;LEFT THREE QUARTERS LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA3;LEFT HALF LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA4;LOWER HALF LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA5;LOWER THREE QUARTERS LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA6;UPPER THREE QUARTERS LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA7;UPPER HALF LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA8;LEFT HALF UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEA9;LEFT THREE QUARTERS UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAA;RIGHT THREE QUARTERS UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAB;RIGHT HALF UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAC;UPPER HALF RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAD;UPPER THREE QUARTERS RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAE;LOWER THREE QUARTERS RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEAF;LOWER HALF RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1CEB0;HORIZONTAL ZIGZAG LINE;So;0;ON;;;;;N;;;;; +1CEB1;KEYHOLE;So;0;ON;;;;;N;;;;; +1CEB2;OLD PERSONAL COMPUTER WITH MONITOR IN PORTRAIT ORIENTATION;So;0;ON;;;;;N;;;;; +1CEB3;BLACK RIGHT TRIANGLE CARET;So;0;ON;;;;;N;;;;; +1CEBA;FRAGILE SYMBOL;So;0;ON;;;;;N;;;;; +1CEBB;OFFICE BUILDING SYMBOL;So;0;ON;;;;;N;;;;; +1CEBC;TREE SYMBOL;So;0;ON;;;;;N;;;;; +1CEBD;APPLE SYMBOL;So;0;ON;;;;;N;;;;; +1CEBE;CHERRY SYMBOL;So;0;ON;;;;;N;;;;; +1CEBF;STRAWBERRY SYMBOL;So;0;ON;;;;;N;;;;; +1CEC0;HEBE;So;0;ON;;;;;N;;;;; +1CEC1;IRIS;So;0;ON;;;;;N;;;;; +1CEC2;FLORA;So;0;ON;;;;;N;;;;; +1CEC3;METIS;So;0;ON;;;;;N;;;;; +1CEC4;PARTHENOPE;So;0;ON;;;;;N;;;;; +1CEC5;VICTORIA;So;0;ON;;;;;N;;;;; +1CEC6;EGERIA;So;0;ON;;;;;N;;;;; +1CEC7;IRENE;So;0;ON;;;;;N;;;;; +1CEC8;EUNOMIA;So;0;ON;;;;;N;;;;; +1CEC9;PSYCHE;So;0;ON;;;;;N;;;;; +1CECA;THETIS;So;0;ON;;;;;N;;;;; +1CECB;MELPOMENE;So;0;ON;;;;;N;;;;; +1CECC;FORTUNA;So;0;ON;;;;;N;;;;; +1CECD;ASTRONOMICAL SYMBOL FOR ASTEROID PROSERPINA;So;0;ON;;;;;N;;;;; +1CECE;BELLONA;So;0;ON;;;;;N;;;;; +1CECF;AMPHITRITE;So;0;ON;;;;;N;;;;; +1CED0;LEUKOTHEA;So;0;ON;;;;;N;;;;; +1CEE0;GEOMANTIC FIGURE POPULUS;So;0;ON;;;;;N;;;;; +1CEE1;GEOMANTIC FIGURE TRISTITIA;So;0;ON;;;;;N;;;;; +1CEE2;GEOMANTIC FIGURE ALBUS;So;0;ON;;;;;N;;;;; +1CEE3;GEOMANTIC FIGURE FORTUNA MAJOR;So;0;ON;;;;;N;;;;; +1CEE4;GEOMANTIC FIGURE RUBEUS;So;0;ON;;;;;N;;;;; +1CEE5;GEOMANTIC FIGURE ACQUISITIO;So;0;ON;;;;;N;;;;; +1CEE6;GEOMANTIC FIGURE CONJUNCTIO;So;0;ON;;;;;N;;;;; +1CEE7;GEOMANTIC FIGURE CAPUT DRACONIS;So;0;ON;;;;;N;;;;; +1CEE8;GEOMANTIC FIGURE LAETITIA;So;0;ON;;;;;N;;;;; +1CEE9;GEOMANTIC FIGURE CARCER;So;0;ON;;;;;N;;;;; +1CEEA;GEOMANTIC FIGURE AMISSIO;So;0;ON;;;;;N;;;;; +1CEEB;GEOMANTIC FIGURE PUELLA;So;0;ON;;;;;N;;;;; +1CEEC;GEOMANTIC FIGURE FORTUNA MINOR;So;0;ON;;;;;N;;;;; +1CEED;GEOMANTIC FIGURE PUER;So;0;ON;;;;;N;;;;; +1CEEE;GEOMANTIC FIGURE CAUDA DRACONIS;So;0;ON;;;;;N;;;;; +1CEEF;GEOMANTIC FIGURE VIA;So;0;ON;;;;;N;;;;; +1CEF0;MEDIUM SMALL WHITE CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +1CF00;ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF01;ZNAMENNY COMBINING MARK NIZKO S KRYZHEM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF02;ZNAMENNY COMBINING MARK TSATA ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF03;ZNAMENNY COMBINING MARK GORAZDO NIZKO ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF04;ZNAMENNY COMBINING MARK NIZKO ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF05;ZNAMENNY COMBINING MARK SREDNE ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF06;ZNAMENNY COMBINING MARK MALO POVYSHE ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF07;ZNAMENNY COMBINING MARK POVYSHE ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF08;ZNAMENNY COMBINING MARK VYSOKO ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF09;ZNAMENNY COMBINING MARK MALO POVYSHE S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF0A;ZNAMENNY COMBINING MARK POVYSHE S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF0B;ZNAMENNY COMBINING MARK VYSOKO S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF0C;ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF0D;ZNAMENNY COMBINING MARK NIZKO S KRYZHEM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF0E;ZNAMENNY COMBINING MARK TSATA ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF0F;ZNAMENNY COMBINING MARK GORAZDO NIZKO ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF10;ZNAMENNY COMBINING MARK NIZKO ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF11;ZNAMENNY COMBINING MARK SREDNE ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF12;ZNAMENNY COMBINING MARK MALO POVYSHE ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF13;ZNAMENNY COMBINING MARK POVYSHE ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF14;ZNAMENNY COMBINING MARK VYSOKO ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF15;ZNAMENNY COMBINING MARK MALO POVYSHE S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF16;ZNAMENNY COMBINING MARK POVYSHE S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF17;ZNAMENNY COMBINING MARK VYSOKO S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF18;ZNAMENNY COMBINING MARK TSATA S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF19;ZNAMENNY COMBINING MARK MALO POVYSHE S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF1A;ZNAMENNY COMBINING MARK STRANNO MALO POVYSHE;Mn;0;NSM;;;;;N;;;;; +1CF1B;ZNAMENNY COMBINING MARK POVYSHE S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF1C;ZNAMENNY COMBINING MARK POVYSHE STRANNO;Mn;0;NSM;;;;;N;;;;; +1CF1D;ZNAMENNY COMBINING MARK VYSOKO S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF1E;ZNAMENNY COMBINING MARK MALO POVYSHE STRANNO;Mn;0;NSM;;;;;N;;;;; +1CF1F;ZNAMENNY COMBINING MARK GORAZDO VYSOKO;Mn;0;NSM;;;;;N;;;;; +1CF20;ZNAMENNY COMBINING MARK ZELO;Mn;0;NSM;;;;;N;;;;; +1CF21;ZNAMENNY COMBINING MARK ON;Mn;0;NSM;;;;;N;;;;; +1CF22;ZNAMENNY COMBINING MARK RAVNO;Mn;0;NSM;;;;;N;;;;; +1CF23;ZNAMENNY COMBINING MARK TIKHAYA;Mn;0;NSM;;;;;N;;;;; +1CF24;ZNAMENNY COMBINING MARK BORZAYA;Mn;0;NSM;;;;;N;;;;; +1CF25;ZNAMENNY COMBINING MARK UDARKA;Mn;0;NSM;;;;;N;;;;; +1CF26;ZNAMENNY COMBINING MARK PODVERTKA;Mn;0;NSM;;;;;N;;;;; +1CF27;ZNAMENNY COMBINING MARK LOMKA;Mn;0;NSM;;;;;N;;;;; +1CF28;ZNAMENNY COMBINING MARK KUPNAYA;Mn;0;NSM;;;;;N;;;;; +1CF29;ZNAMENNY COMBINING MARK KACHKA;Mn;0;NSM;;;;;N;;;;; +1CF2A;ZNAMENNY COMBINING MARK ZEVOK;Mn;0;NSM;;;;;N;;;;; +1CF2B;ZNAMENNY COMBINING MARK SKOBA;Mn;0;NSM;;;;;N;;;;; +1CF2C;ZNAMENNY COMBINING MARK RAZSEKA;Mn;0;NSM;;;;;N;;;;; +1CF2D;ZNAMENNY COMBINING MARK KRYZH ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF30;ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO;Mn;0;NSM;;;;;N;;;;; +1CF31;ZNAMENNY COMBINING TONAL RANGE MARK SVETLO;Mn;0;NSM;;;;;N;;;;; +1CF32;ZNAMENNY COMBINING TONAL RANGE MARK TRESVETLO;Mn;0;NSM;;;;;N;;;;; +1CF33;ZNAMENNY COMBINING MARK ZADERZHKA;Mn;0;NSM;;;;;N;;;;; +1CF34;ZNAMENNY COMBINING MARK DEMESTVENNY ZADERZHKA;Mn;0;NSM;;;;;N;;;;; +1CF35;ZNAMENNY COMBINING MARK OTSECHKA;Mn;0;NSM;;;;;N;;;;; +1CF36;ZNAMENNY COMBINING MARK PODCHASHIE;Mn;0;NSM;;;;;N;;;;; +1CF37;ZNAMENNY COMBINING MARK PODCHASHIE WITH VERTICAL STROKE;Mn;0;NSM;;;;;N;;;;; +1CF38;ZNAMENNY COMBINING MARK CHASHKA;Mn;0;NSM;;;;;N;;;;; +1CF39;ZNAMENNY COMBINING MARK CHASHKA POLNAYA;Mn;0;NSM;;;;;N;;;;; +1CF3A;ZNAMENNY COMBINING MARK OBLACHKO;Mn;0;NSM;;;;;N;;;;; +1CF3B;ZNAMENNY COMBINING MARK SOROCHYA NOZHKA;Mn;0;NSM;;;;;N;;;;; +1CF3C;ZNAMENNY COMBINING MARK TOCHKA;Mn;0;NSM;;;;;N;;;;; +1CF3D;ZNAMENNY COMBINING MARK DVOETOCHIE;Mn;0;NSM;;;;;N;;;;; +1CF3E;ZNAMENNY COMBINING ATTACHING VERTICAL OMET;Mn;0;NSM;;;;;N;;;;; +1CF3F;ZNAMENNY COMBINING MARK CURVED OMET;Mn;0;NSM;;;;;N;;;;; +1CF40;ZNAMENNY COMBINING MARK KRYZH;Mn;0;NSM;;;;;N;;;;; +1CF41;ZNAMENNY COMBINING LOWER TONAL RANGE INDICATOR;Mn;0;NSM;;;;;N;;;;; +1CF42;ZNAMENNY PRIZNAK MODIFIER LEVEL-2;Mn;0;NSM;;;;;N;;;;; +1CF43;ZNAMENNY PRIZNAK MODIFIER LEVEL-3;Mn;0;NSM;;;;;N;;;;; +1CF44;ZNAMENNY PRIZNAK MODIFIER DIRECTION FLIP;Mn;0;NSM;;;;;N;;;;; +1CF45;ZNAMENNY PRIZNAK MODIFIER KRYZH;Mn;0;NSM;;;;;N;;;;; +1CF46;ZNAMENNY PRIZNAK MODIFIER ROG;Mn;0;NSM;;;;;N;;;;; +1CF50;ZNAMENNY NEUME KRYUK;So;0;L;;;;;N;;;;; +1CF51;ZNAMENNY NEUME KRYUK TIKHY;So;0;L;;;;;N;;;;; +1CF52;ZNAMENNY NEUME PARAKLIT;So;0;L;;;;;N;;;;; +1CF53;ZNAMENNY NEUME DVA V CHELNU;So;0;L;;;;;N;;;;; +1CF54;ZNAMENNY NEUME KLYUCH;So;0;L;;;;;N;;;;; +1CF55;ZNAMENNY NEUME ZANOZHEK;So;0;L;;;;;N;;;;; +1CF56;ZNAMENNY NEUME STOPITSA;So;0;L;;;;;N;;;;; +1CF57;ZNAMENNY NEUME STOPITSA S OCHKOM;So;0;L;;;;;N;;;;; +1CF58;ZNAMENNY NEUME PEREVODKA;So;0;L;;;;;N;;;;; +1CF59;ZNAMENNY NEUME PEREVODKA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF5A;ZNAMENNY NEUME STOPITSA WITH SOROCHYA NOZHKA;So;0;L;;;;;N;;;;; +1CF5B;ZNAMENNY NEUME CHELYUSTKA;So;0;L;;;;;N;;;;; +1CF5C;ZNAMENNY NEUME PALKA;So;0;L;;;;;N;;;;; +1CF5D;ZNAMENNY NEUME ZAPYATAYA;So;0;L;;;;;N;;;;; +1CF5E;ZNAMENNY NEUME GOLUBCHIK BORZY;So;0;L;;;;;N;;;;; +1CF5F;ZNAMENNY NEUME GOLUBCHIK TIKHY;So;0;L;;;;;N;;;;; +1CF60;ZNAMENNY NEUME GOLUBCHIK MRACHNY;So;0;L;;;;;N;;;;; +1CF61;ZNAMENNY NEUME GOLUBCHIK SVETLY;So;0;L;;;;;N;;;;; +1CF62;ZNAMENNY NEUME GOLUBCHIK TRESVETLY;So;0;L;;;;;N;;;;; +1CF63;ZNAMENNY NEUME VRAKHIYA PROSTAYA;So;0;L;;;;;N;;;;; +1CF64;ZNAMENNY NEUME VRAKHIYA MRACHNAYA;So;0;L;;;;;N;;;;; +1CF65;ZNAMENNY NEUME VRAKHIYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF66;ZNAMENNY NEUME VRAKHIYA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CF67;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA PROSTAYA;So;0;L;;;;;N;;;;; +1CF68;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA MRACHNAYA;So;0;L;;;;;N;;;;; +1CF69;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF6A;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CF6B;ZNAMENNY NEUME DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CF6C;ZNAMENNY NEUME REVERSED CHELYUSTKA;So;0;L;;;;;N;;;;; +1CF6D;ZNAMENNY NEUME DERBITSA;So;0;L;;;;;N;;;;; +1CF6E;ZNAMENNY NEUME KHAMILO;So;0;L;;;;;N;;;;; +1CF6F;ZNAMENNY NEUME CHASHKA;So;0;L;;;;;N;;;;; +1CF70;ZNAMENNY NEUME PODCHASHIE;So;0;L;;;;;N;;;;; +1CF71;ZNAMENNY NEUME SKAMEYTSA MRACHNAYA;So;0;L;;;;;N;;;;; +1CF72;ZNAMENNY NEUME SKAMEYTSA SVETLAYA;So;0;L;;;;;N;;;;; +1CF73;ZNAMENNY NEUME SKAMEYTSA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CF74;ZNAMENNY NEUME SKAMEYTSA TIKHAYA;So;0;L;;;;;N;;;;; +1CF75;ZNAMENNY NEUME DEMESTVENNY KLYUCH;So;0;L;;;;;N;;;;; +1CF76;ZNAMENNY NEUME SKAMEYTSA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF77;ZNAMENNY NEUME SKAMEYTSA KLYUCHENEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF78;ZNAMENNY NEUME SKAMEYTSA KLYUCHEVAYA TIKHAYA;So;0;L;;;;;N;;;;; +1CF79;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA PROSTAYA;So;0;L;;;;;N;;;;; +1CF7A;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF7B;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF7C;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;; +1CF7D;ZNAMENNY NEUME SLOZHITIE;So;0;L;;;;;N;;;;; +1CF7E;ZNAMENNY NEUME SLOZHITIE S ZAPYATOY;So;0;L;;;;;N;;;;; +1CF7F;ZNAMENNY NEUME SLOZHITIE ZAKRYTOE;So;0;L;;;;;N;;;;; +1CF80;ZNAMENNY NEUME SLOZHITIE S KRYZHEM;So;0;L;;;;;N;;;;; +1CF81;ZNAMENNY NEUME KRYZH;So;0;L;;;;;N;;;;; +1CF82;ZNAMENNY NEUME ROG;So;0;L;;;;;N;;;;; +1CF83;ZNAMENNY NEUME FITA;So;0;L;;;;;N;;;;; +1CF84;ZNAMENNY NEUME KOBYLA;So;0;L;;;;;N;;;;; +1CF85;ZNAMENNY NEUME ZMEYTSA;So;0;L;;;;;N;;;;; +1CF86;ZNAMENNY NEUME STATYA;So;0;L;;;;;N;;;;; +1CF87;ZNAMENNY NEUME STATYA S ZAPYATOY;So;0;L;;;;;N;;;;; +1CF88;ZNAMENNY NEUME STATYA S KRYZHEM;So;0;L;;;;;N;;;;; +1CF89;ZNAMENNY NEUME STATYA S ZAPYATOY I KRYZHEM;So;0;L;;;;;N;;;;; +1CF8A;ZNAMENNY NEUME STATYA S KRYZHEM I ZAPYATOY;So;0;L;;;;;N;;;;; +1CF8B;ZNAMENNY NEUME STATYA ZAKRYTAYA;So;0;L;;;;;N;;;;; +1CF8C;ZNAMENNY NEUME STATYA ZAKRYTAYA S ZAPYATOY;So;0;L;;;;;N;;;;; +1CF8D;ZNAMENNY NEUME STATYA S ROGOM;So;0;L;;;;;N;;;;; +1CF8E;ZNAMENNY NEUME STATYA S DVUMYA ZAPYATYMI;So;0;L;;;;;N;;;;; +1CF8F;ZNAMENNY NEUME STATYA S ZAPYATOY I PODCHASHIEM;So;0;L;;;;;N;;;;; +1CF90;ZNAMENNY NEUME POLKULIZMY;So;0;L;;;;;N;;;;; +1CF91;ZNAMENNY NEUME STATYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF92;ZNAMENNY NEUME STRELA PROSTAYA;So;0;L;;;;;N;;;;; +1CF93;ZNAMENNY NEUME STRELA MRACHNOTIKHAYA;So;0;L;;;;;N;;;;; +1CF94;ZNAMENNY NEUME STRELA KRYZHEVAYA;So;0;L;;;;;N;;;;; +1CF95;ZNAMENNY NEUME STRELA POLUPOVODNAYA;So;0;L;;;;;N;;;;; +1CF96;ZNAMENNY NEUME STRELA POVODNAYA;So;0;L;;;;;N;;;;; +1CF97;ZNAMENNY NEUME STRELA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF98;ZNAMENNY NEUME STRELA KLYUCHEPOVODNAYA;So;0;L;;;;;N;;;;; +1CF99;ZNAMENNY NEUME STRELA KLYUCHENEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF9A;ZNAMENNY NEUME STRELA TIKHAYA PUTNAYA;So;0;L;;;;;N;;;;; +1CF9B;ZNAMENNY NEUME STRELA DVOECHELNAYA;So;0;L;;;;;N;;;;; +1CF9C;ZNAMENNY NEUME STRELA DVOECHELNOKRYZHEVAYA;So;0;L;;;;;N;;;;; +1CF9D;ZNAMENNY NEUME STRELA DVOECHELNOPOVODNAYA;So;0;L;;;;;N;;;;; +1CF9E;ZNAMENNY NEUME STRELA DVOECHELNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;; +1CF9F;ZNAMENNY NEUME STRELA DVOECHELNOPOVODNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;; +1CFA0;ZNAMENNY NEUME STRELA GROMNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFA1;ZNAMENNY NEUME STRELA GROMOPOVODNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFA2;ZNAMENNY NEUME STRELA GROMNAYA;So;0;L;;;;;N;;;;; +1CFA3;ZNAMENNY NEUME STRELA GROMOPOVODNAYA;So;0;L;;;;;N;;;;; +1CFA4;ZNAMENNY NEUME STRELA GROMOPOVODNAYA WITH DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFA5;ZNAMENNY NEUME STRELA GROMOKRYZHEVAYA;So;0;L;;;;;N;;;;; +1CFA6;ZNAMENNY NEUME STRELA GROMOKRYZHEVAYA POVODNAYA;So;0;L;;;;;N;;;;; +1CFA7;ZNAMENNY NEUME MECHIK;So;0;L;;;;;N;;;;; +1CFA8;ZNAMENNY NEUME MECHIK POVODNY;So;0;L;;;;;N;;;;; +1CFA9;ZNAMENNY NEUME MECHIK KLYUCHEVOY;So;0;L;;;;;N;;;;; +1CFAA;ZNAMENNY NEUME MECHIK KLYUCHEPOVODNY;So;0;L;;;;;N;;;;; +1CFAB;ZNAMENNY NEUME MECHIK KLYUCHENEPOSTOYANNY;So;0;L;;;;;N;;;;; +1CFAC;ZNAMENNY NEUME STRELA TRYASOGLASNAYA;So;0;L;;;;;N;;;;; +1CFAD;ZNAMENNY NEUME STRELA TRYASOPOVODNAYA;So;0;L;;;;;N;;;;; +1CFAE;ZNAMENNY NEUME STRELA TRYASOSTRELNAYA;So;0;L;;;;;N;;;;; +1CFAF;ZNAMENNY NEUME OSOKA;So;0;L;;;;;N;;;;; +1CFB0;ZNAMENNY NEUME OSOKA SVETLAYA;So;0;L;;;;;N;;;;; +1CFB1;ZNAMENNY NEUME OSOKA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CFB2;ZNAMENNY NEUME OSOKA KRYUKOVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CFB3;ZNAMENNY NEUME OSOKA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CFB4;ZNAMENNY NEUME OSOKA KLYUCHEVAYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CFB5;ZNAMENNY NEUME STRELA KRYUKOVAYA;So;0;L;;;;;N;;;;; +1CFB6;ZNAMENNY NEUME STRELA KRYUKOVAYA POVODNAYA;So;0;L;;;;;N;;;;; +1CFB7;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFB8;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFB9;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMNAYA;So;0;L;;;;;N;;;;; +1CFBA;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA;So;0;L;;;;;N;;;;; +1CFBB;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA WITH DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFBC;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOKRYZHEVAYA;So;0;L;;;;;N;;;;; +1CFBD;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOKRYZHEVAYA POVODNAYA;So;0;L;;;;;N;;;;; +1CFBE;ZNAMENNY NEUME STRELA KRYUKOVAYA TRYASKA;So;0;L;;;;;N;;;;; +1CFBF;ZNAMENNY NEUME KUFISMA;So;0;L;;;;;N;;;;; +1CFC0;ZNAMENNY NEUME OBLAKO;So;0;L;;;;;N;;;;; +1CFC1;ZNAMENNY NEUME DUDA;So;0;L;;;;;N;;;;; +1CFC2;ZNAMENNY NEUME NEMKA;So;0;L;;;;;N;;;;; +1CFC3;ZNAMENNY NEUME PAUK;So;0;L;;;;;N;;;;; +1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; +1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; +1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; +1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; +1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; +1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; +1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; +1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; +1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; +1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; +1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; +1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; +1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; +1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; +1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; +1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; +1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; +1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; +1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; +1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; +1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; +1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; +1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; +1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; +1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; +1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; +1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; +1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; +1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; +1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; +1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; +1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; +1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; +1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; +1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; +1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; +1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; +1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; +1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; +1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; +1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; +1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; +1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; +1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; +1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; +1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; +1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; +1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; +1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; +1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; +1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; +1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; +1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; +1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; +1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; +1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; +1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; +1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; +1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; +1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; +1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; +1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; +1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; +1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; +1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; +1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; +1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; +1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; +1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; +1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; +1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; +1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; +1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; +1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; +1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; +1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; +1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; +1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; +1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; +1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; +1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; +1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; +1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; +1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; +1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; +1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; +1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; +1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; +1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; +1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; +1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; +1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; +1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; +1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; +1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; +1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; +1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; +1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; +1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; +1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; +1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; +1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; +1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; +1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; +1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; +1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; +1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; +1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; +1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; +1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; +1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; +1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; +1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; +1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; +1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; +1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; +1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; +1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; +1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; +1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; +1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; +1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; +1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; +1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; +1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; +1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; +1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; +1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; +1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; +1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; +1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; +1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; +1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; +1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; +1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; +1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; +1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; +1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; +1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; +1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; +1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; +1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; +1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; +1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; +1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; +1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; +1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; +1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; +1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; +1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; +1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; +1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; +1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; +1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; +1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; +1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; +1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; +1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; +1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; +1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; +1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; +1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; +1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; +1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; +1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; +1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; +1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; +1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; +1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; +1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; +1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; +1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; +1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; +1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; +1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; +1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; +1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; +1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; +1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; +1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; +1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; +1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; +1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; +1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; +1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; +1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; +1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; +1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; +1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; +1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; +1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; +1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; +1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; +1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; +1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; +1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; +1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; +1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; +1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; +1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; +1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; +1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; +1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; +1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; +1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; +1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; +1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; +1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; +1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; +1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; +1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; +1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; +1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; +1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; +1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; +1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; +1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; +1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; +1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; +1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; +1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; +1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; +1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; +1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; +1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; +1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; +1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; +1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; +1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; +1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; +1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; +1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; +1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; +1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; +1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; +1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; +1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; +1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; +1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; +1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; +1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; +1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; +1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; +1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; +1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; +1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; +1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; +1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; +1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; +1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; +1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; +1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; +1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; +1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; +1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; +1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; +1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; +1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; +1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; +1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; +1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; +1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; +1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; +1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; +1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; +1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; +1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; +1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; +1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; +1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; +1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; +1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; +1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; +1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; +1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; +1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; +1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; +1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; +1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; +1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; +1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; +1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; +1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; +1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; +1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; +1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; +1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; +1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; +1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; +1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; +1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; +1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; +1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; +1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; +1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; +1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; +1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; +1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; +1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; +1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; +1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; +1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; +1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; +1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; +1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; +1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; +1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; +1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; +1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; +1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; +1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; +1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; +1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; +1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; +1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; +1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; +1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; +1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; +1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; +1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; +1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; +1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; +1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; +1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; +1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; +1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; +1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; +1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; +1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; +1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; +1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; +1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; +1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; +1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; +1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; +1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; +1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; +1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; +1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; +1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; +1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; +1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; +1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; +1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; +1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; +1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; +1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; +1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; +1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; +1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; +1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; +1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; +1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; +1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; +1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; +1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; +1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; +1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; +1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; +1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; +1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; +1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; +1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; +1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; +1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; +1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; +1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; +1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; +1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; +1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; +1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; +1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; +1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; +1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; +1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; +1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; +1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; +1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; +1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; +1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; +1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; +1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; +1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; +1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; +1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; +1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; +1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; +1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; +1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; +1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; +1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; +1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; +1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; +1D1DE;MUSICAL SYMBOL KIEVAN C CLEF;So;0;L;;;;;N;;;;; +1D1DF;MUSICAL SYMBOL KIEVAN END OF PIECE;So;0;L;;;;;N;;;;; +1D1E0;MUSICAL SYMBOL KIEVAN FINAL NOTE;So;0;L;;;;;N;;;;; +1D1E1;MUSICAL SYMBOL KIEVAN RECITATIVE MARK;So;0;L;;;;;N;;;;; +1D1E2;MUSICAL SYMBOL KIEVAN WHOLE NOTE;So;0;L;;;;;N;;;;; +1D1E3;MUSICAL SYMBOL KIEVAN HALF NOTE;So;0;L;;;;;N;;;;; +1D1E4;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E5;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;; +1D1E9;MUSICAL SYMBOL SORI;So;0;ON;;;;;N;;;;; +1D1EA;MUSICAL SYMBOL KORON;So;0;ON;;;;;N;;;;; +1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; +1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; +1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; +1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; +1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; +1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; +1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; +1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; +1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; +1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; +1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; +1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; +1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; +1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; +1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; +1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; +1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; +1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; +1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; +1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; +1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; +1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; +1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; +1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; +1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; +1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; +1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; +1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; +1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; +1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D2C0;KAKTOVIK NUMERAL ZERO;No;0;L;;;;0;N;;;;; +1D2C1;KAKTOVIK NUMERAL ONE;No;0;L;;;;1;N;;;;; +1D2C2;KAKTOVIK NUMERAL TWO;No;0;L;;;;2;N;;;;; +1D2C3;KAKTOVIK NUMERAL THREE;No;0;L;;;;3;N;;;;; +1D2C4;KAKTOVIK NUMERAL FOUR;No;0;L;;;;4;N;;;;; +1D2C5;KAKTOVIK NUMERAL FIVE;No;0;L;;;;5;N;;;;; +1D2C6;KAKTOVIK NUMERAL SIX;No;0;L;;;;6;N;;;;; +1D2C7;KAKTOVIK NUMERAL SEVEN;No;0;L;;;;7;N;;;;; +1D2C8;KAKTOVIK NUMERAL EIGHT;No;0;L;;;;8;N;;;;; +1D2C9;KAKTOVIK NUMERAL NINE;No;0;L;;;;9;N;;;;; +1D2CA;KAKTOVIK NUMERAL TEN;No;0;L;;;;10;N;;;;; +1D2CB;KAKTOVIK NUMERAL ELEVEN;No;0;L;;;;11;N;;;;; +1D2CC;KAKTOVIK NUMERAL TWELVE;No;0;L;;;;12;N;;;;; +1D2CD;KAKTOVIK NUMERAL THIRTEEN;No;0;L;;;;13;N;;;;; +1D2CE;KAKTOVIK NUMERAL FOURTEEN;No;0;L;;;;14;N;;;;; +1D2CF;KAKTOVIK NUMERAL FIFTEEN;No;0;L;;;;15;N;;;;; +1D2D0;KAKTOVIK NUMERAL SIXTEEN;No;0;L;;;;16;N;;;;; +1D2D1;KAKTOVIK NUMERAL SEVENTEEN;No;0;L;;;;17;N;;;;; +1D2D2;KAKTOVIK NUMERAL EIGHTEEN;No;0;L;;;;18;N;;;;; +1D2D3;KAKTOVIK NUMERAL NINETEEN;No;0;L;;;;19;N;;;;; +1D2E0;MAYAN NUMERAL ZERO;No;0;L;;;;0;N;;;;; +1D2E1;MAYAN NUMERAL ONE;No;0;L;;;;1;N;;;;; +1D2E2;MAYAN NUMERAL TWO;No;0;L;;;;2;N;;;;; +1D2E3;MAYAN NUMERAL THREE;No;0;L;;;;3;N;;;;; +1D2E4;MAYAN NUMERAL FOUR;No;0;L;;;;4;N;;;;; +1D2E5;MAYAN NUMERAL FIVE;No;0;L;;;;5;N;;;;; +1D2E6;MAYAN NUMERAL SIX;No;0;L;;;;6;N;;;;; +1D2E7;MAYAN NUMERAL SEVEN;No;0;L;;;;7;N;;;;; +1D2E8;MAYAN NUMERAL EIGHT;No;0;L;;;;8;N;;;;; +1D2E9;MAYAN NUMERAL NINE;No;0;L;;;;9;N;;;;; +1D2EA;MAYAN NUMERAL TEN;No;0;L;;;;10;N;;;;; +1D2EB;MAYAN NUMERAL ELEVEN;No;0;L;;;;11;N;;;;; +1D2EC;MAYAN NUMERAL TWELVE;No;0;L;;;;12;N;;;;; +1D2ED;MAYAN NUMERAL THIRTEEN;No;0;L;;;;13;N;;;;; +1D2EE;MAYAN NUMERAL FOURTEEN;No;0;L;;;;14;N;;;;; +1D2EF;MAYAN NUMERAL FIFTEEN;No;0;L;;;;15;N;;;;; +1D2F0;MAYAN NUMERAL SIXTEEN;No;0;L;;;;16;N;;;;; +1D2F1;MAYAN NUMERAL SEVENTEEN;No;0;L;;;;17;N;;;;; +1D2F2;MAYAN NUMERAL EIGHTEEN;No;0;L;;;;18;N;;;;; +1D2F3;MAYAN NUMERAL NINETEEN;No;0;L;;;;19;N;;;;; +1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; +1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; +1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; +1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; +1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; +1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; +1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; +1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; +1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; +1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; +1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; +1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; +1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; +1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; +1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; +1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; +1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; +1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; +1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; +1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; +1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; +1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; +1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; +1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; +1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; +1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; +1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; +1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; +1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; +1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; +1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; +1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; +1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; +1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; +1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; +1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; +1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; +1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; +1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; +1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; +1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; +1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; +1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; +1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; +1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; +1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; +1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; +1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; +1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; +1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; +1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; +1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; +1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; +1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; +1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; +1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; +1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; +1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; +1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; +1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; +1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; +1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; +1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; +1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; +1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; +1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; +1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; +1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; +1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; +1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; +1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; +1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; +1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; +1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; +1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; +1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; +1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; +1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; +1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; +1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; +1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; +1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; +1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; +1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; +1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; +1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; +1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; +1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; +1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; +1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; +1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; +1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; +1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; +1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; +1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; +1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; +1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; +1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; +1D372;IDEOGRAPHIC TALLY MARK ONE;No;0;L;;;;1;N;;;;; +1D373;IDEOGRAPHIC TALLY MARK TWO;No;0;L;;;;2;N;;;;; +1D374;IDEOGRAPHIC TALLY MARK THREE;No;0;L;;;;3;N;;;;; +1D375;IDEOGRAPHIC TALLY MARK FOUR;No;0;L;;;;4;N;;;;; +1D376;IDEOGRAPHIC TALLY MARK FIVE;No;0;L;;;;5;N;;;;; +1D377;TALLY MARK ONE;No;0;L;;;;1;N;;;;; +1D378;TALLY MARK FIVE;No;0;L;;;;5;N;;;;; +1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L; 0131;;;;N;;;;; +1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L; 0237;;;;N;;;;; +1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;ON; 2207;;;;N;;;;; +1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;ON; 2207;;;;N;;;;; +1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;ON; 2207;;;;N;;;;; +1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;ON; 2207;;;;N;;;;; +1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;ON; 2207;;;;N;;;;; +1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L; 03DC;;;;N;;;;; +1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L; 03DD;;;;N;;;;; +1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D800;SIGNWRITING HAND-FIST INDEX;So;0;L;;;;;N;;;;; +1D801;SIGNWRITING HAND-CIRCLE INDEX;So;0;L;;;;;N;;;;; +1D802;SIGNWRITING HAND-CUP INDEX;So;0;L;;;;;N;;;;; +1D803;SIGNWRITING HAND-OVAL INDEX;So;0;L;;;;;N;;;;; +1D804;SIGNWRITING HAND-HINGE INDEX;So;0;L;;;;;N;;;;; +1D805;SIGNWRITING HAND-ANGLE INDEX;So;0;L;;;;;N;;;;; +1D806;SIGNWRITING HAND-FIST INDEX BENT;So;0;L;;;;;N;;;;; +1D807;SIGNWRITING HAND-CIRCLE INDEX BENT;So;0;L;;;;;N;;;;; +1D808;SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT;So;0;L;;;;;N;;;;; +1D809;SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D80A;SIGNWRITING HAND-FIST INDEX CUPPED;So;0;L;;;;;N;;;;; +1D80B;SIGNWRITING HAND-FIST INDEX HINGED;So;0;L;;;;;N;;;;; +1D80C;SIGNWRITING HAND-FIST INDEX HINGED LOW;So;0;L;;;;;N;;;;; +1D80D;SIGNWRITING HAND-CIRCLE INDEX HINGE;So;0;L;;;;;N;;;;; +1D80E;SIGNWRITING HAND-FIST INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D80F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D810;SIGNWRITING HAND-FIST INDEX MIDDLE BENT;So;0;L;;;;;N;;;;; +1D811;SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D812;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D813;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D814;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP;So;0;L;;;;;N;;;;; +1D815;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D816;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT;So;0;L;;;;;N;;;;; +1D817;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT;So;0;L;;;;;N;;;;; +1D818;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED;So;0;L;;;;;N;;;;; +1D819;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D81A;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81B;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81C;SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX;So;0;L;;;;;N;;;;; +1D81D;SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE;So;0;L;;;;;N;;;;; +1D81E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D81F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D820;SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT;So;0;L;;;;;N;;;;; +1D821;SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT;So;0;L;;;;;N;;;;; +1D822;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT;So;0;L;;;;;N;;;;; +1D823;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE;So;0;L;;;;;N;;;;; +1D824;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D825;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D826;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D827;SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D828;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED;So;0;L;;;;;N;;;;; +1D829;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED;So;0;L;;;;;N;;;;; +1D82A;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED;So;0;L;;;;;N;;;;; +1D82B;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED;So;0;L;;;;;N;;;;; +1D82C;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT;So;0;L;;;;;N;;;;; +1D82D;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE;So;0;L;;;;;N;;;;; +1D82E;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D82F;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D830;SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP;So;0;L;;;;;N;;;;; +1D831;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP;So;0;L;;;;;N;;;;; +1D832;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D833;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE;So;0;L;;;;;N;;;;; +1D834;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D835;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D836;SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP;So;0;L;;;;;N;;;;; +1D837;SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP;So;0;L;;;;;N;;;;; +1D838;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP;So;0;L;;;;;N;;;;; +1D839;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED;So;0;L;;;;;N;;;;; +1D83A;SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP;So;0;L;;;;;N;;;;; +1D83B;SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP;So;0;L;;;;;N;;;;; +1D83C;SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP;So;0;L;;;;;N;;;;; +1D83D;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D83E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT;So;0;L;;;;;N;;;;; +1D83F;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED;So;0;L;;;;;N;;;;; +1D840;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP;So;0;L;;;;;N;;;;; +1D841;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED;So;0;L;;;;;N;;;;; +1D842;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP;So;0;L;;;;;N;;;;; +1D843;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D844;SIGNWRITING HAND-FLAT FOUR FINGERS;So;0;L;;;;;N;;;;; +1D845;SIGNWRITING HAND-FLAT FOUR FINGERS BENT;So;0;L;;;;;N;;;;; +1D846;SIGNWRITING HAND-FLAT FOUR FINGERS HINGED;So;0;L;;;;;N;;;;; +1D847;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D848;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT;So;0;L;;;;;N;;;;; +1D849;SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84A;SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT;So;0;L;;;;;N;;;;; +1D84B;SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84C;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84D;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84E;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D84F;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D850;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D851;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D852;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D853;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D854;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D855;SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D856;SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D857;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED;So;0;L;;;;;N;;;;; +1D858;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D859;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB;So;0;L;;;;;N;;;;; +1D85A;SIGNWRITING HAND-FLAT;So;0;L;;;;;N;;;;; +1D85B;SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS;So;0;L;;;;;N;;;;; +1D85C;SIGNWRITING HAND-FLAT HEEL;So;0;L;;;;;N;;;;; +1D85D;SIGNWRITING HAND-FLAT THUMB SIDE;So;0;L;;;;;N;;;;; +1D85E;SIGNWRITING HAND-FLAT HEEL THUMB SIDE;So;0;L;;;;;N;;;;; +1D85F;SIGNWRITING HAND-FLAT THUMB BENT;So;0;L;;;;;N;;;;; +1D860;SIGNWRITING HAND-FLAT THUMB FORWARD;So;0;L;;;;;N;;;;; +1D861;SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D862;SIGNWRITING HAND-FLAT SPLIT CENTRE;So;0;L;;;;;N;;;;; +1D863;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE;So;0;L;;;;;N;;;;; +1D864;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D865;SIGNWRITING HAND-FLAT SPLIT LITTLE;So;0;L;;;;;N;;;;; +1D866;SIGNWRITING HAND-CLAW;So;0;L;;;;;N;;;;; +1D867;SIGNWRITING HAND-CLAW THUMB SIDE;So;0;L;;;;;N;;;;; +1D868;SIGNWRITING HAND-CLAW NO THUMB;So;0;L;;;;;N;;;;; +1D869;SIGNWRITING HAND-CLAW THUMB FORWARD;So;0;L;;;;;N;;;;; +1D86A;SIGNWRITING HAND-HOOK CURLICUE;So;0;L;;;;;N;;;;; +1D86B;SIGNWRITING HAND-HOOK;So;0;L;;;;;N;;;;; +1D86C;SIGNWRITING HAND-CUP OPEN;So;0;L;;;;;N;;;;; +1D86D;SIGNWRITING HAND-CUP;So;0;L;;;;;N;;;;; +1D86E;SIGNWRITING HAND-CUP OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D86F;SIGNWRITING HAND-CUP THUMB SIDE;So;0;L;;;;;N;;;;; +1D870;SIGNWRITING HAND-CUP OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D871;SIGNWRITING HAND-CUP NO THUMB;So;0;L;;;;;N;;;;; +1D872;SIGNWRITING HAND-CUP OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D873;SIGNWRITING HAND-CUP THUMB FORWARD;So;0;L;;;;;N;;;;; +1D874;SIGNWRITING HAND-CURLICUE OPEN;So;0;L;;;;;N;;;;; +1D875;SIGNWRITING HAND-CURLICUE;So;0;L;;;;;N;;;;; +1D876;SIGNWRITING HAND-CIRCLE;So;0;L;;;;;N;;;;; +1D877;SIGNWRITING HAND-OVAL;So;0;L;;;;;N;;;;; +1D878;SIGNWRITING HAND-OVAL THUMB SIDE;So;0;L;;;;;N;;;;; +1D879;SIGNWRITING HAND-OVAL NO THUMB;So;0;L;;;;;N;;;;; +1D87A;SIGNWRITING HAND-OVAL THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87B;SIGNWRITING HAND-HINGE OPEN;So;0;L;;;;;N;;;;; +1D87C;SIGNWRITING HAND-HINGE OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87D;SIGNWRITING HAND-HINGE;So;0;L;;;;;N;;;;; +1D87E;SIGNWRITING HAND-HINGE SMALL;So;0;L;;;;;N;;;;; +1D87F;SIGNWRITING HAND-HINGE OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D880;SIGNWRITING HAND-HINGE THUMB SIDE;So;0;L;;;;;N;;;;; +1D881;SIGNWRITING HAND-HINGE OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D882;SIGNWRITING HAND-HINGE NO THUMB;So;0;L;;;;;N;;;;; +1D883;SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX;So;0;L;;;;;N;;;;; +1D884;SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D885;SIGNWRITING HAND-ANGLE;So;0;L;;;;;N;;;;; +1D886;SIGNWRITING HAND-FIST INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D887;SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D888;SIGNWRITING HAND-HINGE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D889;SIGNWRITING HAND-ANGLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D88A;SIGNWRITING HAND-HINGE LITTLE;So;0;L;;;;;N;;;;; +1D88B;SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT;So;0;L;;;;;N;;;;; +1D88C;SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88D;SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88E;SIGNWRITING HAND-FIST LITTLE DOWN;So;0;L;;;;;N;;;;; +1D88F;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT;So;0;L;;;;;N;;;;; +1D890;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED;So;0;L;;;;;N;;;;; +1D891;SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED;So;0;L;;;;;N;;;;; +1D892;SIGNWRITING HAND-FIST LITTLE UP;So;0;L;;;;;N;;;;; +1D893;SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP;So;0;L;;;;;N;;;;; +1D894;SIGNWRITING HAND-CIRCLE LITTLE UP;So;0;L;;;;;N;;;;; +1D895;SIGNWRITING HAND-OVAL LITTLE UP;So;0;L;;;;;N;;;;; +1D896;SIGNWRITING HAND-ANGLE LITTLE UP;So;0;L;;;;;N;;;;; +1D897;SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D898;SIGNWRITING HAND-FIST LITTLE BENT;So;0;L;;;;;N;;;;; +1D899;SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB;So;0;L;;;;;N;;;;; +1D89A;SIGNWRITING HAND-FIST LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89B;SIGNWRITING HAND-HINGE LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89C;SIGNWRITING HAND-FIST LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89D;SIGNWRITING HAND-HINGE LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89E;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D89F;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB;So;0;L;;;;;N;;;;; +1D8A0;SIGNWRITING HAND-FIST LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A1;SIGNWRITING HAND-CIRCLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A2;SIGNWRITING HAND-HINGE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A3;SIGNWRITING HAND-ANGLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A4;SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A5;SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A6;SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A7;SIGNWRITING HAND-HINGE RING;So;0;L;;;;;N;;;;; +1D8A8;SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A9;SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AA;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AB;SIGNWRITING HAND-FIST RING DOWN;So;0;L;;;;;N;;;;; +1D8AC;SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE;So;0;L;;;;;N;;;;; +1D8AD;SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS;So;0;L;;;;;N;;;;; +1D8AE;SIGNWRITING HAND-FIST RING UP;So;0;L;;;;;N;;;;; +1D8AF;SIGNWRITING HAND-FIST RING RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8B0;SIGNWRITING HAND-FIST RING LITTLE;So;0;L;;;;;N;;;;; +1D8B1;SIGNWRITING HAND-CIRCLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B2;SIGNWRITING HAND-OVAL RING LITTLE;So;0;L;;;;;N;;;;; +1D8B3;SIGNWRITING HAND-ANGLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B4;SIGNWRITING HAND-FIST RING MIDDLE;So;0;L;;;;;N;;;;; +1D8B5;SIGNWRITING HAND-FIST RING MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D8B6;SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D8B7;SIGNWRITING HAND-FIST RING INDEX;So;0;L;;;;;N;;;;; +1D8B8;SIGNWRITING HAND-FIST RING THUMB;So;0;L;;;;;N;;;;; +1D8B9;SIGNWRITING HAND-HOOK RING THUMB;So;0;L;;;;;N;;;;; +1D8BA;SIGNWRITING HAND-FIST INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BB;SIGNWRITING HAND-CIRCLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BC;SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8BD;SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8BE;SIGNWRITING HAND-HOOK INDEX RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8BF;SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER;So;0;L;;;;;N;;;;; +1D8C0;SIGNWRITING HAND-CUP INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C1;SIGNWRITING HAND-HINGE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C2;SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8C3;SIGNWRITING HAND-ANGLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C4;SIGNWRITING HAND-FIST MIDDLE DOWN;So;0;L;;;;;N;;;;; +1D8C5;SIGNWRITING HAND-HINGE MIDDLE;So;0;L;;;;;N;;;;; +1D8C6;SIGNWRITING HAND-FIST MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C7;SIGNWRITING HAND-CIRCLE MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C8;SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8C9;SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D8CA;SIGNWRITING HAND-HOOK MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D8CB;SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE;So;0;L;;;;;N;;;;; +1D8CC;SIGNWRITING HAND-FIST MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8CD;SIGNWRITING HAND-FIST MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CE;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CF;SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8D0;SIGNWRITING HAND-CUP MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D1;SIGNWRITING HAND-HINGE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D2;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8D3;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8D4;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D5;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT;So;0;L;;;;;N;;;;; +1D8D6;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8D7;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE;So;0;L;;;;;N;;;;; +1D8D8;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT;So;0;L;;;;;N;;;;; +1D8D9;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN;So;0;L;;;;;N;;;;; +1D8DA;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8DB;SIGNWRITING HAND-HINGE INDEX HINGED;So;0;L;;;;;N;;;;; +1D8DC;SIGNWRITING HAND-FIST INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DD;SIGNWRITING HAND-HINGE INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DE;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL;So;0;L;;;;;N;;;;; +1D8DF;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D8E0;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT;So;0;L;;;;;N;;;;; +1D8E1;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT;So;0;L;;;;;N;;;;; +1D8E2;SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT;So;0;L;;;;;N;;;;; +1D8E3;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE;So;0;L;;;;;N;;;;; +1D8E4;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT;So;0;L;;;;;N;;;;; +1D8E5;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT;So;0;L;;;;;N;;;;; +1D8E6;SIGNWRITING HAND-FIST INDEX THUMB HOOK;So;0;L;;;;;N;;;;; +1D8E7;SIGNWRITING HAND-FIST INDEX THUMB CURLICUE;So;0;L;;;;;N;;;;; +1D8E8;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8E9;SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8EA;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER;So;0;L;;;;;N;;;;; +1D8EB;SIGNWRITING HAND-FIST INDEX THUMB CIRCLE;So;0;L;;;;;N;;;;; +1D8EC;SIGNWRITING HAND-CUP INDEX THUMB;So;0;L;;;;;N;;;;; +1D8ED;SIGNWRITING HAND-CUP INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EE;SIGNWRITING HAND-HINGE INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EF;SIGNWRITING HAND-HINGE INDEX THUMB LARGE;So;0;L;;;;;N;;;;; +1D8F0;SIGNWRITING HAND-HINGE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F1;SIGNWRITING HAND-HINGE INDEX THUMB SMALL;So;0;L;;;;;N;;;;; +1D8F2;SIGNWRITING HAND-ANGLE INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D8F3;SIGNWRITING HAND-ANGLE INDEX THUMB IN;So;0;L;;;;;N;;;;; +1D8F4;SIGNWRITING HAND-ANGLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F5;SIGNWRITING HAND-FIST THUMB;So;0;L;;;;;N;;;;; +1D8F6;SIGNWRITING HAND-FIST THUMB HEEL;So;0;L;;;;;N;;;;; +1D8F7;SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL;So;0;L;;;;;N;;;;; +1D8F8;SIGNWRITING HAND-FIST THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D8F9;SIGNWRITING HAND-FIST THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D8FA;SIGNWRITING HAND-FIST THUMB FORWARD;So;0;L;;;;;N;;;;; +1D8FB;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D8FC;SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D8FD;SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE;So;0;L;;;;;N;;;;; +1D8FE;SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS;So;0;L;;;;;N;;;;; +1D8FF;SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS;So;0;L;;;;;N;;;;; +1D900;SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS;So;0;L;;;;;N;;;;; +1D901;SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS;So;0;L;;;;;N;;;;; +1D902;SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D903;SIGNWRITING HAND-FIST;So;0;L;;;;;N;;;;; +1D904;SIGNWRITING HAND-FIST HEEL;So;0;L;;;;;N;;;;; +1D905;SIGNWRITING TOUCH SINGLE;So;0;L;;;;;N;;;;; +1D906;SIGNWRITING TOUCH MULTIPLE;So;0;L;;;;;N;;;;; +1D907;SIGNWRITING TOUCH BETWEEN;So;0;L;;;;;N;;;;; +1D908;SIGNWRITING GRASP SINGLE;So;0;L;;;;;N;;;;; +1D909;SIGNWRITING GRASP MULTIPLE;So;0;L;;;;;N;;;;; +1D90A;SIGNWRITING GRASP BETWEEN;So;0;L;;;;;N;;;;; +1D90B;SIGNWRITING STRIKE SINGLE;So;0;L;;;;;N;;;;; +1D90C;SIGNWRITING STRIKE MULTIPLE;So;0;L;;;;;N;;;;; +1D90D;SIGNWRITING STRIKE BETWEEN;So;0;L;;;;;N;;;;; +1D90E;SIGNWRITING BRUSH SINGLE;So;0;L;;;;;N;;;;; +1D90F;SIGNWRITING BRUSH MULTIPLE;So;0;L;;;;;N;;;;; +1D910;SIGNWRITING BRUSH BETWEEN;So;0;L;;;;;N;;;;; +1D911;SIGNWRITING RUB SINGLE;So;0;L;;;;;N;;;;; +1D912;SIGNWRITING RUB MULTIPLE;So;0;L;;;;;N;;;;; +1D913;SIGNWRITING RUB BETWEEN;So;0;L;;;;;N;;;;; +1D914;SIGNWRITING SURFACE SYMBOLS;So;0;L;;;;;N;;;;; +1D915;SIGNWRITING SURFACE BETWEEN;So;0;L;;;;;N;;;;; +1D916;SIGNWRITING SQUEEZE LARGE SINGLE;So;0;L;;;;;N;;;;; +1D917;SIGNWRITING SQUEEZE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D918;SIGNWRITING SQUEEZE LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D919;SIGNWRITING SQUEEZE SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91A;SIGNWRITING SQUEEZE SEQUENTIAL;So;0;L;;;;;N;;;;; +1D91B;SIGNWRITING FLICK LARGE SINGLE;So;0;L;;;;;N;;;;; +1D91C;SIGNWRITING FLICK SMALL SINGLE;So;0;L;;;;;N;;;;; +1D91D;SIGNWRITING FLICK LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D91E;SIGNWRITING FLICK SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91F;SIGNWRITING FLICK SEQUENTIAL;So;0;L;;;;;N;;;;; +1D920;SIGNWRITING SQUEEZE FLICK ALTERNATING;So;0;L;;;;;N;;;;; +1D921;SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE;So;0;L;;;;;N;;;;; +1D922;SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL;So;0;L;;;;;N;;;;; +1D923;SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL;So;0;L;;;;;N;;;;; +1D924;SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL;So;0;L;;;;;N;;;;; +1D925;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE;So;0;L;;;;;N;;;;; +1D926;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL;So;0;L;;;;;N;;;;; +1D927;SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS;So;0;L;;;;;N;;;;; +1D928;SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D929;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D92A;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D92B;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D92C;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D92D;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D92E;SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D92F;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D930;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D931;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D932;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D933;SIGNWRITING MOVEMENT-WALLPLANE CROSS;So;0;L;;;;;N;;;;; +1D934;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D935;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D936;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING;So;0;L;;;;;N;;;;; +1D937;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D938;SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL;So;0;L;;;;;N;;;;; +1D939;SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM;So;0;L;;;;;N;;;;; +1D93A;SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE;So;0;L;;;;;N;;;;; +1D93B;SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D93C;SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D93D;SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D93E;SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION;So;0;L;;;;;N;;;;; +1D93F;SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL;So;0;L;;;;;N;;;;; +1D940;SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM;So;0;L;;;;;N;;;;; +1D941;SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE;So;0;L;;;;;N;;;;; +1D942;SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D943;SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D944;SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D945;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D946;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D947;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D948;SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D949;SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D94A;SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D94B;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94C;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D94D;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D94E;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94F;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D950;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D951;SIGNWRITING TRAVEL-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D952;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE;So;0;L;;;;;N;;;;; +1D953;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE;So;0;L;;;;;N;;;;; +1D954;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE;So;0;L;;;;;N;;;;; +1D955;SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL;So;0;L;;;;;N;;;;; +1D956;SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D957;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE;So;0;L;;;;;N;;;;; +1D958;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST;So;0;L;;;;;N;;;;; +1D959;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D95A;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D95B;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D95C;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D95D;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL;So;0;L;;;;;N;;;;; +1D95E;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D95F;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE;So;0;L;;;;;N;;;;; +1D960;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST;So;0;L;;;;;N;;;;; +1D961;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D962;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D963;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D964;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D965;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D966;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D967;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D968;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D969;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96A;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D96B;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96C;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D96D;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D96E;SIGNWRITING MOVEMENT-FLOORPLANE CROSS;So;0;L;;;;;N;;;;; +1D96F;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D970;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D971;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT;So;0;L;;;;;N;;;;; +1D972;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D973;SIGNWRITING MOVEMENT-FLOORPLANE BEND;So;0;L;;;;;N;;;;; +1D974;SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D975;SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D976;SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D977;SIGNWRITING MOVEMENT-FLOORPLANE CHECK;So;0;L;;;;;N;;;;; +1D978;SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D979;SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D97A;SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D97B;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D97C;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D97D;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D97E;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D97F;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D980;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D981;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D982;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D983;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D984;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D985;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D986;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D987;SIGNWRITING TRAVEL-FLOORPLANE SHAKING;So;0;L;;;;;N;;;;; +1D988;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL;So;0;L;;;;;N;;;;; +1D989;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM;So;0;L;;;;;N;;;;; +1D98A;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE;So;0;L;;;;;N;;;;; +1D98B;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST;So;0;L;;;;;N;;;;; +1D98C;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D98D;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D98E;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE;So;0;L;;;;;N;;;;; +1D98F;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST;So;0;L;;;;;N;;;;; +1D990;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D991;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D992;SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D993;SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM;So;0;L;;;;;N;;;;; +1D994;SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE;So;0;L;;;;;N;;;;; +1D995;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D996;SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM;So;0;L;;;;;N;;;;; +1D997;SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE;So;0;L;;;;;N;;;;; +1D998;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D999;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL;So;0;L;;;;;N;;;;; +1D99A;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM;So;0;L;;;;;N;;;;; +1D99B;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE;So;0;L;;;;;N;;;;; +1D99C;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL;So;0;L;;;;;N;;;;; +1D99D;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM;So;0;L;;;;;N;;;;; +1D99E;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE;So;0;L;;;;;N;;;;; +1D99F;SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT;So;0;L;;;;;N;;;;; +1D9A0;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL;So;0;L;;;;;N;;;;; +1D9A1;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM;So;0;L;;;;;N;;;;; +1D9A2;SIGNWRITING ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9A3;SIGNWRITING ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9A4;SIGNWRITING ROTATION-WALLPLANE ALTERNATE;So;0;L;;;;;N;;;;; +1D9A5;SIGNWRITING MOVEMENT-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D9A6;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A7;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A8;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A9;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AA;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AB;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AC;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AD;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AE;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AF;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B0;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B1;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B2;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B3;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B4;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL;So;0;L;;;;;N;;;;; +1D9B5;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM;So;0;L;;;;;N;;;;; +1D9B6;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE;So;0;L;;;;;N;;;;; +1D9B7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9B8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9B9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9BA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9BB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9BC;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9BD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9BE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9BF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C0;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9C1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9C2;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9C3;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C4;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C5;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9C7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9C8;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9CA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9CB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9CC;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9CD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9CE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9CF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9D0;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9D1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9D2;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D3;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D4;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D5;SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL;So;0;L;;;;;N;;;;; +1D9D6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM;So;0;L;;;;;N;;;;; +1D9D7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE;So;0;L;;;;;N;;;;; +1D9D8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST;So;0;L;;;;;N;;;;; +1D9D9;SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED;So;0;L;;;;;N;;;;; +1D9DA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D9DB;SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D9DC;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE;So;0;L;;;;;N;;;;; +1D9DD;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL;So;0;L;;;;;N;;;;; +1D9DE;SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE;So;0;L;;;;;N;;;;; +1D9DF;SIGNWRITING ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9E0;SIGNWRITING ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9E1;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D9E2;SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL;So;0;L;;;;;N;;;;; +1D9E3;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E4;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E5;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9E6;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9E7;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E8;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E9;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9EA;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9EB;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9EC;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9ED;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE;So;0;L;;;;;N;;;;; +1D9EE;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE;So;0;L;;;;;N;;;;; +1D9EF;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F0;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F1;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE;So;0;L;;;;;N;;;;; +1D9F2;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE;So;0;L;;;;;N;;;;; +1D9F3;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F4;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F5;SIGNWRITING DYNAMIC ARROWHEAD SMALL;So;0;L;;;;;N;;;;; +1D9F6;SIGNWRITING DYNAMIC ARROWHEAD LARGE;So;0;L;;;;;N;;;;; +1D9F7;SIGNWRITING DYNAMIC FAST;So;0;L;;;;;N;;;;; +1D9F8;SIGNWRITING DYNAMIC SLOW;So;0;L;;;;;N;;;;; +1D9F9;SIGNWRITING DYNAMIC TENSE;So;0;L;;;;;N;;;;; +1D9FA;SIGNWRITING DYNAMIC RELAXED;So;0;L;;;;;N;;;;; +1D9FB;SIGNWRITING DYNAMIC SIMULTANEOUS;So;0;L;;;;;N;;;;; +1D9FC;SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING;So;0;L;;;;;N;;;;; +1D9FD;SIGNWRITING DYNAMIC EVERY OTHER TIME;So;0;L;;;;;N;;;;; +1D9FE;SIGNWRITING DYNAMIC GRADUAL;So;0;L;;;;;N;;;;; +1D9FF;SIGNWRITING HEAD;So;0;L;;;;;N;;;;; +1DA00;SIGNWRITING HEAD RIM;Mn;0;NSM;;;;;N;;;;; +1DA01;SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA02;SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT;Mn;0;NSM;;;;;N;;;;; +1DA03;SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA04;SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA05;SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA06;SIGNWRITING HEAD MOVEMENT CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA07;SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING;Mn;0;NSM;;;;;N;;;;; +1DA08;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN;Mn;0;NSM;;;;;N;;;;; +1DA09;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING;Mn;0;NSM;;;;;N;;;;; +1DA0A;SIGNWRITING EYEBROWS STRAIGHT UP;Mn;0;NSM;;;;;N;;;;; +1DA0B;SIGNWRITING EYEBROWS STRAIGHT NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0C;SIGNWRITING EYEBROWS STRAIGHT DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0D;SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0E;SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0F;SIGNWRITING DREAMY EYEBROWS UP NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA10;SIGNWRITING DREAMY EYEBROWS NEUTRAL UP;Mn;0;NSM;;;;;N;;;;; +1DA11;SIGNWRITING FOREHEAD NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA12;SIGNWRITING FOREHEAD CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA13;SIGNWRITING FOREHEAD WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA14;SIGNWRITING EYES OPEN;Mn;0;NSM;;;;;N;;;;; +1DA15;SIGNWRITING EYES SQUEEZED;Mn;0;NSM;;;;;N;;;;; +1DA16;SIGNWRITING EYES CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA17;SIGNWRITING EYE BLINK SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA18;SIGNWRITING EYE BLINK MULTIPLE;Mn;0;NSM;;;;;N;;;;; +1DA19;SIGNWRITING EYES HALF OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1A;SIGNWRITING EYES WIDE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1B;SIGNWRITING EYES HALF CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA1C;SIGNWRITING EYES WIDENING MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA1D;SIGNWRITING EYE WINK;Mn;0;NSM;;;;;N;;;;; +1DA1E;SIGNWRITING EYELASHES UP;Mn;0;NSM;;;;;N;;;;; +1DA1F;SIGNWRITING EYELASHES DOWN;Mn;0;NSM;;;;;N;;;;; +1DA20;SIGNWRITING EYELASHES FLUTTERING;Mn;0;NSM;;;;;N;;;;; +1DA21;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA22;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA23;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA24;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA25;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA26;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA27;SIGNWRITING EYEGAZE-WALLPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA28;SIGNWRITING EYEGAZE-FLOORPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA29;SIGNWRITING EYEGAZE-WALLPLANE CIRCLING;Mn;0;NSM;;;;;N;;;;; +1DA2A;SIGNWRITING CHEEKS PUFFED;Mn;0;NSM;;;;;N;;;;; +1DA2B;SIGNWRITING CHEEKS NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA2C;SIGNWRITING CHEEKS SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA2D;SIGNWRITING TENSE CHEEKS HIGH;Mn;0;NSM;;;;;N;;;;; +1DA2E;SIGNWRITING TENSE CHEEKS MIDDLE;Mn;0;NSM;;;;;N;;;;; +1DA2F;SIGNWRITING TENSE CHEEKS LOW;Mn;0;NSM;;;;;N;;;;; +1DA30;SIGNWRITING EARS;Mn;0;NSM;;;;;N;;;;; +1DA31;SIGNWRITING NOSE NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA32;SIGNWRITING NOSE CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA33;SIGNWRITING NOSE WRINKLES;Mn;0;NSM;;;;;N;;;;; +1DA34;SIGNWRITING NOSE WIGGLES;Mn;0;NSM;;;;;N;;;;; +1DA35;SIGNWRITING AIR BLOWING OUT;Mn;0;NSM;;;;;N;;;;; +1DA36;SIGNWRITING AIR SUCKING IN;Mn;0;NSM;;;;;N;;;;; +1DA37;SIGNWRITING AIR BLOW SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA38;SIGNWRITING AIR SUCK SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA39;SIGNWRITING BREATH INHALE;So;0;L;;;;;N;;;;; +1DA3A;SIGNWRITING BREATH EXHALE;So;0;L;;;;;N;;;;; +1DA3B;SIGNWRITING MOUTH CLOSED NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA3C;SIGNWRITING MOUTH CLOSED FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA3D;SIGNWRITING MOUTH CLOSED CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA3E;SIGNWRITING MOUTH SMILE;Mn;0;NSM;;;;;N;;;;; +1DA3F;SIGNWRITING MOUTH SMILE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA40;SIGNWRITING MOUTH SMILE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA41;SIGNWRITING MOUTH FROWN;Mn;0;NSM;;;;;N;;;;; +1DA42;SIGNWRITING MOUTH FROWN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA43;SIGNWRITING MOUTH FROWN OPEN;Mn;0;NSM;;;;;N;;;;; +1DA44;SIGNWRITING MOUTH OPEN CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA45;SIGNWRITING MOUTH OPEN FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA46;SIGNWRITING MOUTH OPEN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA47;SIGNWRITING MOUTH OPEN OVAL;Mn;0;NSM;;;;;N;;;;; +1DA48;SIGNWRITING MOUTH OPEN OVAL WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA49;SIGNWRITING MOUTH OPEN OVAL YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4A;SIGNWRITING MOUTH OPEN RECTANGLE;Mn;0;NSM;;;;;N;;;;; +1DA4B;SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA4C;SIGNWRITING MOUTH OPEN RECTANGLE YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4D;SIGNWRITING MOUTH KISS;Mn;0;NSM;;;;;N;;;;; +1DA4E;SIGNWRITING MOUTH KISS FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA4F;SIGNWRITING MOUTH KISS WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA50;SIGNWRITING MOUTH TENSE;Mn;0;NSM;;;;;N;;;;; +1DA51;SIGNWRITING MOUTH TENSE FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA52;SIGNWRITING MOUTH TENSE SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA53;SIGNWRITING LIPS PRESSED TOGETHER;Mn;0;NSM;;;;;N;;;;; +1DA54;SIGNWRITING LIP LOWER OVER UPPER;Mn;0;NSM;;;;;N;;;;; +1DA55;SIGNWRITING LIP UPPER OVER LOWER;Mn;0;NSM;;;;;N;;;;; +1DA56;SIGNWRITING MOUTH CORNERS;Mn;0;NSM;;;;;N;;;;; +1DA57;SIGNWRITING MOUTH WRINKLES SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA58;SIGNWRITING MOUTH WRINKLES DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA59;SIGNWRITING TONGUE STICKING OUT FAR;Mn;0;NSM;;;;;N;;;;; +1DA5A;SIGNWRITING TONGUE LICKING LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5B;SIGNWRITING TONGUE TIP BETWEEN LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5C;SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA5D;SIGNWRITING TONGUE INSIDE MOUTH RELAXED;Mn;0;NSM;;;;;N;;;;; +1DA5E;SIGNWRITING TONGUE MOVES AGAINST CHEEK;Mn;0;NSM;;;;;N;;;;; +1DA5F;SIGNWRITING TONGUE CENTRE STICKING OUT;Mn;0;NSM;;;;;N;;;;; +1DA60;SIGNWRITING TONGUE CENTRE INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA61;SIGNWRITING TEETH;Mn;0;NSM;;;;;N;;;;; +1DA62;SIGNWRITING TEETH MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA63;SIGNWRITING TEETH ON TONGUE;Mn;0;NSM;;;;;N;;;;; +1DA64;SIGNWRITING TEETH ON TONGUE MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA65;SIGNWRITING TEETH ON LIPS;Mn;0;NSM;;;;;N;;;;; +1DA66;SIGNWRITING TEETH ON LIPS MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA67;SIGNWRITING TEETH BITE LIPS;Mn;0;NSM;;;;;N;;;;; +1DA68;SIGNWRITING MOVEMENT-WALLPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA69;SIGNWRITING MOVEMENT-FLOORPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA6A;SIGNWRITING NECK;Mn;0;NSM;;;;;N;;;;; +1DA6B;SIGNWRITING HAIR;Mn;0;NSM;;;;;N;;;;; +1DA6C;SIGNWRITING EXCITEMENT;Mn;0;NSM;;;;;N;;;;; +1DA6D;SIGNWRITING SHOULDER HIP SPINE;So;0;L;;;;;N;;;;; +1DA6E;SIGNWRITING SHOULDER HIP POSITIONS;So;0;L;;;;;N;;;;; +1DA6F;SIGNWRITING WALLPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA70;SIGNWRITING FLOORPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA71;SIGNWRITING SHOULDER TILTING FROM WAIST;So;0;L;;;;;N;;;;; +1DA72;SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH;So;0;L;;;;;N;;;;; +1DA73;SIGNWRITING TORSO-WALLPLANE CURVED BEND;So;0;L;;;;;N;;;;; +1DA74;SIGNWRITING TORSO-FLOORPLANE TWISTING;So;0;L;;;;;N;;;;; +1DA75;SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS;Mn;0;NSM;;;;;N;;;;; +1DA76;SIGNWRITING LIMB COMBINATION;So;0;L;;;;;N;;;;; +1DA77;SIGNWRITING LIMB LENGTH-1;So;0;L;;;;;N;;;;; +1DA78;SIGNWRITING LIMB LENGTH-2;So;0;L;;;;;N;;;;; +1DA79;SIGNWRITING LIMB LENGTH-3;So;0;L;;;;;N;;;;; +1DA7A;SIGNWRITING LIMB LENGTH-4;So;0;L;;;;;N;;;;; +1DA7B;SIGNWRITING LIMB LENGTH-5;So;0;L;;;;;N;;;;; +1DA7C;SIGNWRITING LIMB LENGTH-6;So;0;L;;;;;N;;;;; +1DA7D;SIGNWRITING LIMB LENGTH-7;So;0;L;;;;;N;;;;; +1DA7E;SIGNWRITING FINGER;So;0;L;;;;;N;;;;; +1DA7F;SIGNWRITING LOCATION-WALLPLANE SPACE;So;0;L;;;;;N;;;;; +1DA80;SIGNWRITING LOCATION-FLOORPLANE SPACE;So;0;L;;;;;N;;;;; +1DA81;SIGNWRITING LOCATION HEIGHT;So;0;L;;;;;N;;;;; +1DA82;SIGNWRITING LOCATION WIDTH;So;0;L;;;;;N;;;;; +1DA83;SIGNWRITING LOCATION DEPTH;So;0;L;;;;;N;;;;; +1DA84;SIGNWRITING LOCATION HEAD NECK;Mn;0;NSM;;;;;N;;;;; +1DA85;SIGNWRITING LOCATION TORSO;So;0;L;;;;;N;;;;; +1DA86;SIGNWRITING LOCATION LIMBS DIGITS;So;0;L;;;;;N;;;;; +1DA87;SIGNWRITING COMMA;Po;0;L;;;;;N;;;;; +1DA88;SIGNWRITING FULL STOP;Po;0;L;;;;;N;;;;; +1DA89;SIGNWRITING SEMICOLON;Po;0;L;;;;;N;;;;; +1DA8A;SIGNWRITING COLON;Po;0;L;;;;;N;;;;; +1DA8B;SIGNWRITING PARENTHESIS;Po;0;L;;;;;N;;;;; +1DA9B;SIGNWRITING FILL MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DA9C;SIGNWRITING FILL MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DA9D;SIGNWRITING FILL MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DA9E;SIGNWRITING FILL MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DA9F;SIGNWRITING FILL MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA1;SIGNWRITING ROTATION MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DAA2;SIGNWRITING ROTATION MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DAA3;SIGNWRITING ROTATION MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DAA4;SIGNWRITING ROTATION MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DAA5;SIGNWRITING ROTATION MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA6;SIGNWRITING ROTATION MODIFIER-7;Mn;0;NSM;;;;;N;;;;; +1DAA7;SIGNWRITING ROTATION MODIFIER-8;Mn;0;NSM;;;;;N;;;;; +1DAA8;SIGNWRITING ROTATION MODIFIER-9;Mn;0;NSM;;;;;N;;;;; +1DAA9;SIGNWRITING ROTATION MODIFIER-10;Mn;0;NSM;;;;;N;;;;; +1DAAA;SIGNWRITING ROTATION MODIFIER-11;Mn;0;NSM;;;;;N;;;;; +1DAAB;SIGNWRITING ROTATION MODIFIER-12;Mn;0;NSM;;;;;N;;;;; +1DAAC;SIGNWRITING ROTATION MODIFIER-13;Mn;0;NSM;;;;;N;;;;; +1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;; +1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;; +1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;; +1DF00;LATIN SMALL LETTER FENG DIGRAPH WITH TRILL;Ll;0;L;;;;;N;;;;; +1DF01;LATIN SMALL LETTER REVERSED SCRIPT G;Ll;0;L;;;;;N;;;;; +1DF02;LATIN LETTER SMALL CAPITAL TURNED G;Ll;0;L;;;;;N;;;;; +1DF03;LATIN SMALL LETTER REVERSED K;Ll;0;L;;;;;N;;;;; +1DF04;LATIN LETTER SMALL CAPITAL L WITH BELT;Ll;0;L;;;;;N;;;;; +1DF05;LATIN SMALL LETTER LEZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF06;LATIN SMALL LETTER TURNED Y WITH BELT;Ll;0;L;;;;;N;;;;; +1DF07;LATIN SMALL LETTER REVERSED ENG;Ll;0;L;;;;;N;;;;; +1DF08;LATIN SMALL LETTER TURNED R WITH LONG LEG AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF09;LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF0A;LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK;Lo;0;L;;;;;N;;;;; +1DF0B;LATIN SMALL LETTER ESH WITH DOUBLE BAR;Ll;0;L;;;;;N;;;;; +1DF0C;LATIN SMALL LETTER ESH WITH DOUBLE BAR AND CURL;Ll;0;L;;;;;N;;;;; +1DF0D;LATIN SMALL LETTER TURNED T WITH CURL;Ll;0;L;;;;;N;;;;; +1DF0E;LATIN LETTER INVERTED GLOTTAL STOP WITH CURL;Ll;0;L;;;;;N;;;;; +1DF0F;LATIN LETTER STRETCHED C WITH CURL;Ll;0;L;;;;;N;;;;; +1DF10;LATIN LETTER SMALL CAPITAL TURNED K;Ll;0;L;;;;;N;;;;; +1DF11;LATIN SMALL LETTER L WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +1DF12;LATIN SMALL LETTER DEZH DIGRAPH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF13;LATIN SMALL LETTER L WITH BELT AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF14;LATIN SMALL LETTER ENG WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF15;LATIN SMALL LETTER TURNED R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF16;LATIN SMALL LETTER R WITH FISHHOOK AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF17;LATIN SMALL LETTER TESH DIGRAPH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF18;LATIN SMALL LETTER EZH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF19;LATIN SMALL LETTER DEZH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1A;LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1B;LATIN SMALL LETTER O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1C;LATIN SMALL LETTER TESH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1D;LATIN SMALL LETTER C WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1E;LATIN SMALL LETTER S WITH CURL;Ll;0;L;;;;;N;;;;; +1DF25;LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF26;LATIN SMALL LETTER L WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF27;LATIN SMALL LETTER N WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF28;LATIN SMALL LETTER R WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF29;LATIN SMALL LETTER S WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF2A;LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1E000;COMBINING GLAGOLITIC LETTER AZU;Mn;230;NSM;;;;;N;;;;; +1E001;COMBINING GLAGOLITIC LETTER BUKY;Mn;230;NSM;;;;;N;;;;; +1E002;COMBINING GLAGOLITIC LETTER VEDE;Mn;230;NSM;;;;;N;;;;; +1E003;COMBINING GLAGOLITIC LETTER GLAGOLI;Mn;230;NSM;;;;;N;;;;; +1E004;COMBINING GLAGOLITIC LETTER DOBRO;Mn;230;NSM;;;;;N;;;;; +1E005;COMBINING GLAGOLITIC LETTER YESTU;Mn;230;NSM;;;;;N;;;;; +1E006;COMBINING GLAGOLITIC LETTER ZHIVETE;Mn;230;NSM;;;;;N;;;;; +1E008;COMBINING GLAGOLITIC LETTER ZEMLJA;Mn;230;NSM;;;;;N;;;;; +1E009;COMBINING GLAGOLITIC LETTER IZHE;Mn;230;NSM;;;;;N;;;;; +1E00A;COMBINING GLAGOLITIC LETTER INITIAL IZHE;Mn;230;NSM;;;;;N;;;;; +1E00B;COMBINING GLAGOLITIC LETTER I;Mn;230;NSM;;;;;N;;;;; +1E00C;COMBINING GLAGOLITIC LETTER DJERVI;Mn;230;NSM;;;;;N;;;;; +1E00D;COMBINING GLAGOLITIC LETTER KAKO;Mn;230;NSM;;;;;N;;;;; +1E00E;COMBINING GLAGOLITIC LETTER LJUDIJE;Mn;230;NSM;;;;;N;;;;; +1E00F;COMBINING GLAGOLITIC LETTER MYSLITE;Mn;230;NSM;;;;;N;;;;; +1E010;COMBINING GLAGOLITIC LETTER NASHI;Mn;230;NSM;;;;;N;;;;; +1E011;COMBINING GLAGOLITIC LETTER ONU;Mn;230;NSM;;;;;N;;;;; +1E012;COMBINING GLAGOLITIC LETTER POKOJI;Mn;230;NSM;;;;;N;;;;; +1E013;COMBINING GLAGOLITIC LETTER RITSI;Mn;230;NSM;;;;;N;;;;; +1E014;COMBINING GLAGOLITIC LETTER SLOVO;Mn;230;NSM;;;;;N;;;;; +1E015;COMBINING GLAGOLITIC LETTER TVRIDO;Mn;230;NSM;;;;;N;;;;; +1E016;COMBINING GLAGOLITIC LETTER UKU;Mn;230;NSM;;;;;N;;;;; +1E017;COMBINING GLAGOLITIC LETTER FRITU;Mn;230;NSM;;;;;N;;;;; +1E018;COMBINING GLAGOLITIC LETTER HERU;Mn;230;NSM;;;;;N;;;;; +1E01B;COMBINING GLAGOLITIC LETTER SHTA;Mn;230;NSM;;;;;N;;;;; +1E01C;COMBINING GLAGOLITIC LETTER TSI;Mn;230;NSM;;;;;N;;;;; +1E01D;COMBINING GLAGOLITIC LETTER CHRIVI;Mn;230;NSM;;;;;N;;;;; +1E01E;COMBINING GLAGOLITIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +1E01F;COMBINING GLAGOLITIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; +1E020;COMBINING GLAGOLITIC LETTER YERI;Mn;230;NSM;;;;;N;;;;; +1E021;COMBINING GLAGOLITIC LETTER YATI;Mn;230;NSM;;;;;N;;;;; +1E023;COMBINING GLAGOLITIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +1E024;COMBINING GLAGOLITIC LETTER SMALL YUS;Mn;230;NSM;;;;;N;;;;; +1E026;COMBINING GLAGOLITIC LETTER YO;Mn;230;NSM;;;;;N;;;;; +1E027;COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS;Mn;230;NSM;;;;;N;;;;; +1E028;COMBINING GLAGOLITIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +1E029;COMBINING GLAGOLITIC LETTER IOTATED BIG YUS;Mn;230;NSM;;;;;N;;;;; +1E02A;COMBINING GLAGOLITIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +1E030;MODIFIER LETTER CYRILLIC SMALL A;Lm;0;L; 0430;;;;N;;;;; +1E031;MODIFIER LETTER CYRILLIC SMALL BE;Lm;0;L; 0431;;;;N;;;;; +1E032;MODIFIER LETTER CYRILLIC SMALL VE;Lm;0;L; 0432;;;;N;;;;; +1E033;MODIFIER LETTER CYRILLIC SMALL GHE;Lm;0;L; 0433;;;;N;;;;; +1E034;MODIFIER LETTER CYRILLIC SMALL DE;Lm;0;L; 0434;;;;N;;;;; +1E035;MODIFIER LETTER CYRILLIC SMALL IE;Lm;0;L; 0435;;;;N;;;;; +1E036;MODIFIER LETTER CYRILLIC SMALL ZHE;Lm;0;L; 0436;;;;N;;;;; +1E037;MODIFIER LETTER CYRILLIC SMALL ZE;Lm;0;L; 0437;;;;N;;;;; +1E038;MODIFIER LETTER CYRILLIC SMALL I;Lm;0;L; 0438;;;;N;;;;; +1E039;MODIFIER LETTER CYRILLIC SMALL KA;Lm;0;L; 043A;;;;N;;;;; +1E03A;MODIFIER LETTER CYRILLIC SMALL EL;Lm;0;L; 043B;;;;N;;;;; +1E03B;MODIFIER LETTER CYRILLIC SMALL EM;Lm;0;L; 043C;;;;N;;;;; +1E03C;MODIFIER LETTER CYRILLIC SMALL O;Lm;0;L; 043E;;;;N;;;;; +1E03D;MODIFIER LETTER CYRILLIC SMALL PE;Lm;0;L; 043F;;;;N;;;;; +1E03E;MODIFIER LETTER CYRILLIC SMALL ER;Lm;0;L; 0440;;;;N;;;;; +1E03F;MODIFIER LETTER CYRILLIC SMALL ES;Lm;0;L; 0441;;;;N;;;;; +1E040;MODIFIER LETTER CYRILLIC SMALL TE;Lm;0;L; 0442;;;;N;;;;; +1E041;MODIFIER LETTER CYRILLIC SMALL U;Lm;0;L; 0443;;;;N;;;;; +1E042;MODIFIER LETTER CYRILLIC SMALL EF;Lm;0;L; 0444;;;;N;;;;; +1E043;MODIFIER LETTER CYRILLIC SMALL HA;Lm;0;L; 0445;;;;N;;;;; +1E044;MODIFIER LETTER CYRILLIC SMALL TSE;Lm;0;L; 0446;;;;N;;;;; +1E045;MODIFIER LETTER CYRILLIC SMALL CHE;Lm;0;L; 0447;;;;N;;;;; +1E046;MODIFIER LETTER CYRILLIC SMALL SHA;Lm;0;L; 0448;;;;N;;;;; +1E047;MODIFIER LETTER CYRILLIC SMALL YERU;Lm;0;L; 044B;;;;N;;;;; +1E048;MODIFIER LETTER CYRILLIC SMALL E;Lm;0;L; 044D;;;;N;;;;; +1E049;MODIFIER LETTER CYRILLIC SMALL YU;Lm;0;L; 044E;;;;N;;;;; +1E04A;MODIFIER LETTER CYRILLIC SMALL DZZE;Lm;0;L; A689;;;;N;;;;; +1E04B;MODIFIER LETTER CYRILLIC SMALL SCHWA;Lm;0;L; 04D9;;;;N;;;;; +1E04C;MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I;Lm;0;L; 0456;;;;N;;;;; +1E04D;MODIFIER LETTER CYRILLIC SMALL JE;Lm;0;L; 0458;;;;N;;;;; +1E04E;MODIFIER LETTER CYRILLIC SMALL BARRED O;Lm;0;L; 04E9;;;;N;;;;; +1E04F;MODIFIER LETTER CYRILLIC SMALL STRAIGHT U;Lm;0;L; 04AF;;;;N;;;;; +1E050;MODIFIER LETTER CYRILLIC SMALL PALOCHKA;Lm;0;L; 04CF;;;;N;;;;; +1E051;CYRILLIC SUBSCRIPT SMALL LETTER A;Lm;0;L; 0430;;;;N;;;;; +1E052;CYRILLIC SUBSCRIPT SMALL LETTER BE;Lm;0;L; 0431;;;;N;;;;; +1E053;CYRILLIC SUBSCRIPT SMALL LETTER VE;Lm;0;L; 0432;;;;N;;;;; +1E054;CYRILLIC SUBSCRIPT SMALL LETTER GHE;Lm;0;L; 0433;;;;N;;;;; +1E055;CYRILLIC SUBSCRIPT SMALL LETTER DE;Lm;0;L; 0434;;;;N;;;;; +1E056;CYRILLIC SUBSCRIPT SMALL LETTER IE;Lm;0;L; 0435;;;;N;;;;; +1E057;CYRILLIC SUBSCRIPT SMALL LETTER ZHE;Lm;0;L; 0436;;;;N;;;;; +1E058;CYRILLIC SUBSCRIPT SMALL LETTER ZE;Lm;0;L; 0437;;;;N;;;;; +1E059;CYRILLIC SUBSCRIPT SMALL LETTER I;Lm;0;L; 0438;;;;N;;;;; +1E05A;CYRILLIC SUBSCRIPT SMALL LETTER KA;Lm;0;L; 043A;;;;N;;;;; +1E05B;CYRILLIC SUBSCRIPT SMALL LETTER EL;Lm;0;L; 043B;;;;N;;;;; +1E05C;CYRILLIC SUBSCRIPT SMALL LETTER O;Lm;0;L; 043E;;;;N;;;;; +1E05D;CYRILLIC SUBSCRIPT SMALL LETTER PE;Lm;0;L; 043F;;;;N;;;;; +1E05E;CYRILLIC SUBSCRIPT SMALL LETTER ES;Lm;0;L; 0441;;;;N;;;;; +1E05F;CYRILLIC SUBSCRIPT SMALL LETTER U;Lm;0;L; 0443;;;;N;;;;; +1E060;CYRILLIC SUBSCRIPT SMALL LETTER EF;Lm;0;L; 0444;;;;N;;;;; +1E061;CYRILLIC SUBSCRIPT SMALL LETTER HA;Lm;0;L; 0445;;;;N;;;;; +1E062;CYRILLIC SUBSCRIPT SMALL LETTER TSE;Lm;0;L; 0446;;;;N;;;;; +1E063;CYRILLIC SUBSCRIPT SMALL LETTER CHE;Lm;0;L; 0447;;;;N;;;;; +1E064;CYRILLIC SUBSCRIPT SMALL LETTER SHA;Lm;0;L; 0448;;;;N;;;;; +1E065;CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN;Lm;0;L; 044A;;;;N;;;;; +1E066;CYRILLIC SUBSCRIPT SMALL LETTER YERU;Lm;0;L; 044B;;;;N;;;;; +1E067;CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN;Lm;0;L; 0491;;;;N;;;;; +1E068;CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Lm;0;L; 0456;;;;N;;;;; +1E069;CYRILLIC SUBSCRIPT SMALL LETTER DZE;Lm;0;L; 0455;;;;N;;;;; +1E06A;CYRILLIC SUBSCRIPT SMALL LETTER DZHE;Lm;0;L; 045F;;;;N;;;;; +1E06B;MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER;Lm;0;L; 04AB;;;;N;;;;; +1E06C;MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER;Lm;0;L; A651;;;;N;;;;; +1E06D;MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE;Lm;0;L; 04B1;;;;N;;;;; +1E08F;COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Mn;230;NSM;;;;;N;;;;; +1E100;NYIAKENG PUACHUE HMONG LETTER MA;Lo;0;L;;;;;N;;;;; +1E101;NYIAKENG PUACHUE HMONG LETTER TSA;Lo;0;L;;;;;N;;;;; +1E102;NYIAKENG PUACHUE HMONG LETTER NTA;Lo;0;L;;;;;N;;;;; +1E103;NYIAKENG PUACHUE HMONG LETTER TA;Lo;0;L;;;;;N;;;;; +1E104;NYIAKENG PUACHUE HMONG LETTER HA;Lo;0;L;;;;;N;;;;; +1E105;NYIAKENG PUACHUE HMONG LETTER NA;Lo;0;L;;;;;N;;;;; +1E106;NYIAKENG PUACHUE HMONG LETTER XA;Lo;0;L;;;;;N;;;;; +1E107;NYIAKENG PUACHUE HMONG LETTER NKA;Lo;0;L;;;;;N;;;;; +1E108;NYIAKENG PUACHUE HMONG LETTER CA;Lo;0;L;;;;;N;;;;; +1E109;NYIAKENG PUACHUE HMONG LETTER LA;Lo;0;L;;;;;N;;;;; +1E10A;NYIAKENG PUACHUE HMONG LETTER SA;Lo;0;L;;;;;N;;;;; +1E10B;NYIAKENG PUACHUE HMONG LETTER ZA;Lo;0;L;;;;;N;;;;; +1E10C;NYIAKENG PUACHUE HMONG LETTER NCA;Lo;0;L;;;;;N;;;;; +1E10D;NYIAKENG PUACHUE HMONG LETTER NTSA;Lo;0;L;;;;;N;;;;; +1E10E;NYIAKENG PUACHUE HMONG LETTER KA;Lo;0;L;;;;;N;;;;; +1E10F;NYIAKENG PUACHUE HMONG LETTER DA;Lo;0;L;;;;;N;;;;; +1E110;NYIAKENG PUACHUE HMONG LETTER NYA;Lo;0;L;;;;;N;;;;; +1E111;NYIAKENG PUACHUE HMONG LETTER NRA;Lo;0;L;;;;;N;;;;; +1E112;NYIAKENG PUACHUE HMONG LETTER VA;Lo;0;L;;;;;N;;;;; +1E113;NYIAKENG PUACHUE HMONG LETTER NTXA;Lo;0;L;;;;;N;;;;; +1E114;NYIAKENG PUACHUE HMONG LETTER TXA;Lo;0;L;;;;;N;;;;; +1E115;NYIAKENG PUACHUE HMONG LETTER FA;Lo;0;L;;;;;N;;;;; +1E116;NYIAKENG PUACHUE HMONG LETTER RA;Lo;0;L;;;;;N;;;;; +1E117;NYIAKENG PUACHUE HMONG LETTER QA;Lo;0;L;;;;;N;;;;; +1E118;NYIAKENG PUACHUE HMONG LETTER YA;Lo;0;L;;;;;N;;;;; +1E119;NYIAKENG PUACHUE HMONG LETTER NQA;Lo;0;L;;;;;N;;;;; +1E11A;NYIAKENG PUACHUE HMONG LETTER PA;Lo;0;L;;;;;N;;;;; +1E11B;NYIAKENG PUACHUE HMONG LETTER XYA;Lo;0;L;;;;;N;;;;; +1E11C;NYIAKENG PUACHUE HMONG LETTER NPA;Lo;0;L;;;;;N;;;;; +1E11D;NYIAKENG PUACHUE HMONG LETTER DLA;Lo;0;L;;;;;N;;;;; +1E11E;NYIAKENG PUACHUE HMONG LETTER NPLA;Lo;0;L;;;;;N;;;;; +1E11F;NYIAKENG PUACHUE HMONG LETTER HAH;Lo;0;L;;;;;N;;;;; +1E120;NYIAKENG PUACHUE HMONG LETTER MLA;Lo;0;L;;;;;N;;;;; +1E121;NYIAKENG PUACHUE HMONG LETTER PLA;Lo;0;L;;;;;N;;;;; +1E122;NYIAKENG PUACHUE HMONG LETTER GA;Lo;0;L;;;;;N;;;;; +1E123;NYIAKENG PUACHUE HMONG LETTER RRA;Lo;0;L;;;;;N;;;;; +1E124;NYIAKENG PUACHUE HMONG LETTER A;Lo;0;L;;;;;N;;;;; +1E125;NYIAKENG PUACHUE HMONG LETTER AA;Lo;0;L;;;;;N;;;;; +1E126;NYIAKENG PUACHUE HMONG LETTER I;Lo;0;L;;;;;N;;;;; +1E127;NYIAKENG PUACHUE HMONG LETTER U;Lo;0;L;;;;;N;;;;; +1E128;NYIAKENG PUACHUE HMONG LETTER O;Lo;0;L;;;;;N;;;;; +1E129;NYIAKENG PUACHUE HMONG LETTER OO;Lo;0;L;;;;;N;;;;; +1E12A;NYIAKENG PUACHUE HMONG LETTER E;Lo;0;L;;;;;N;;;;; +1E12B;NYIAKENG PUACHUE HMONG LETTER EE;Lo;0;L;;;;;N;;;;; +1E12C;NYIAKENG PUACHUE HMONG LETTER W;Lo;0;L;;;;;N;;;;; +1E130;NYIAKENG PUACHUE HMONG TONE-B;Mn;230;NSM;;;;;N;;;;; +1E131;NYIAKENG PUACHUE HMONG TONE-M;Mn;230;NSM;;;;;N;;;;; +1E132;NYIAKENG PUACHUE HMONG TONE-J;Mn;230;NSM;;;;;N;;;;; +1E133;NYIAKENG PUACHUE HMONG TONE-V;Mn;230;NSM;;;;;N;;;;; +1E134;NYIAKENG PUACHUE HMONG TONE-S;Mn;230;NSM;;;;;N;;;;; +1E135;NYIAKENG PUACHUE HMONG TONE-G;Mn;230;NSM;;;;;N;;;;; +1E136;NYIAKENG PUACHUE HMONG TONE-D;Mn;230;NSM;;;;;N;;;;; +1E137;NYIAKENG PUACHUE HMONG SIGN FOR PERSON;Lm;0;L;;;;;N;;;;; +1E138;NYIAKENG PUACHUE HMONG SIGN FOR THING;Lm;0;L;;;;;N;;;;; +1E139;NYIAKENG PUACHUE HMONG SIGN FOR LOCATION;Lm;0;L;;;;;N;;;;; +1E13A;NYIAKENG PUACHUE HMONG SIGN FOR ANIMAL;Lm;0;L;;;;;N;;;;; +1E13B;NYIAKENG PUACHUE HMONG SIGN FOR INVERTEBRATE;Lm;0;L;;;;;N;;;;; +1E13C;NYIAKENG PUACHUE HMONG SIGN XW XW;Lm;0;L;;;;;N;;;;; +1E13D;NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +1E140;NYIAKENG PUACHUE HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E141;NYIAKENG PUACHUE HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E142;NYIAKENG PUACHUE HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E143;NYIAKENG PUACHUE HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E144;NYIAKENG PUACHUE HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E145;NYIAKENG PUACHUE HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E146;NYIAKENG PUACHUE HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E147;NYIAKENG PUACHUE HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E148;NYIAKENG PUACHUE HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E149;NYIAKENG PUACHUE HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E14E;NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ;Lo;0;L;;;;;N;;;;; +1E14F;NYIAKENG PUACHUE HMONG CIRCLED CA;So;0;L;;;;;N;;;;; +1E290;TOTO LETTER PA;Lo;0;L;;;;;N;;;;; +1E291;TOTO LETTER BA;Lo;0;L;;;;;N;;;;; +1E292;TOTO LETTER TA;Lo;0;L;;;;;N;;;;; +1E293;TOTO LETTER DA;Lo;0;L;;;;;N;;;;; +1E294;TOTO LETTER KA;Lo;0;L;;;;;N;;;;; +1E295;TOTO LETTER GA;Lo;0;L;;;;;N;;;;; +1E296;TOTO LETTER MA;Lo;0;L;;;;;N;;;;; +1E297;TOTO LETTER NA;Lo;0;L;;;;;N;;;;; +1E298;TOTO LETTER NGA;Lo;0;L;;;;;N;;;;; +1E299;TOTO LETTER SA;Lo;0;L;;;;;N;;;;; +1E29A;TOTO LETTER CHA;Lo;0;L;;;;;N;;;;; +1E29B;TOTO LETTER YA;Lo;0;L;;;;;N;;;;; +1E29C;TOTO LETTER WA;Lo;0;L;;;;;N;;;;; +1E29D;TOTO LETTER JA;Lo;0;L;;;;;N;;;;; +1E29E;TOTO LETTER HA;Lo;0;L;;;;;N;;;;; +1E29F;TOTO LETTER RA;Lo;0;L;;;;;N;;;;; +1E2A0;TOTO LETTER LA;Lo;0;L;;;;;N;;;;; +1E2A1;TOTO LETTER I;Lo;0;L;;;;;N;;;;; +1E2A2;TOTO LETTER BREATHY I;Lo;0;L;;;;;N;;;;; +1E2A3;TOTO LETTER IU;Lo;0;L;;;;;N;;;;; +1E2A4;TOTO LETTER BREATHY IU;Lo;0;L;;;;;N;;;;; +1E2A5;TOTO LETTER U;Lo;0;L;;;;;N;;;;; +1E2A6;TOTO LETTER E;Lo;0;L;;;;;N;;;;; +1E2A7;TOTO LETTER BREATHY E;Lo;0;L;;;;;N;;;;; +1E2A8;TOTO LETTER EO;Lo;0;L;;;;;N;;;;; +1E2A9;TOTO LETTER BREATHY EO;Lo;0;L;;;;;N;;;;; +1E2AA;TOTO LETTER O;Lo;0;L;;;;;N;;;;; +1E2AB;TOTO LETTER AE;Lo;0;L;;;;;N;;;;; +1E2AC;TOTO LETTER BREATHY AE;Lo;0;L;;;;;N;;;;; +1E2AD;TOTO LETTER A;Lo;0;L;;;;;N;;;;; +1E2AE;TOTO SIGN RISING TONE;Mn;230;NSM;;;;;N;;;;; +1E2C0;WANCHO LETTER AA;Lo;0;L;;;;;N;;;;; +1E2C1;WANCHO LETTER A;Lo;0;L;;;;;N;;;;; +1E2C2;WANCHO LETTER BA;Lo;0;L;;;;;N;;;;; +1E2C3;WANCHO LETTER CA;Lo;0;L;;;;;N;;;;; +1E2C4;WANCHO LETTER DA;Lo;0;L;;;;;N;;;;; +1E2C5;WANCHO LETTER GA;Lo;0;L;;;;;N;;;;; +1E2C6;WANCHO LETTER YA;Lo;0;L;;;;;N;;;;; +1E2C7;WANCHO LETTER PHA;Lo;0;L;;;;;N;;;;; +1E2C8;WANCHO LETTER LA;Lo;0;L;;;;;N;;;;; +1E2C9;WANCHO LETTER NA;Lo;0;L;;;;;N;;;;; +1E2CA;WANCHO LETTER PA;Lo;0;L;;;;;N;;;;; +1E2CB;WANCHO LETTER TA;Lo;0;L;;;;;N;;;;; +1E2CC;WANCHO LETTER THA;Lo;0;L;;;;;N;;;;; +1E2CD;WANCHO LETTER FA;Lo;0;L;;;;;N;;;;; +1E2CE;WANCHO LETTER SA;Lo;0;L;;;;;N;;;;; +1E2CF;WANCHO LETTER SHA;Lo;0;L;;;;;N;;;;; +1E2D0;WANCHO LETTER JA;Lo;0;L;;;;;N;;;;; +1E2D1;WANCHO LETTER ZA;Lo;0;L;;;;;N;;;;; +1E2D2;WANCHO LETTER WA;Lo;0;L;;;;;N;;;;; +1E2D3;WANCHO LETTER VA;Lo;0;L;;;;;N;;;;; +1E2D4;WANCHO LETTER KA;Lo;0;L;;;;;N;;;;; +1E2D5;WANCHO LETTER O;Lo;0;L;;;;;N;;;;; +1E2D6;WANCHO LETTER AU;Lo;0;L;;;;;N;;;;; +1E2D7;WANCHO LETTER RA;Lo;0;L;;;;;N;;;;; +1E2D8;WANCHO LETTER MA;Lo;0;L;;;;;N;;;;; +1E2D9;WANCHO LETTER KHA;Lo;0;L;;;;;N;;;;; +1E2DA;WANCHO LETTER HA;Lo;0;L;;;;;N;;;;; +1E2DB;WANCHO LETTER E;Lo;0;L;;;;;N;;;;; +1E2DC;WANCHO LETTER I;Lo;0;L;;;;;N;;;;; +1E2DD;WANCHO LETTER NGA;Lo;0;L;;;;;N;;;;; +1E2DE;WANCHO LETTER U;Lo;0;L;;;;;N;;;;; +1E2DF;WANCHO LETTER LLHA;Lo;0;L;;;;;N;;;;; +1E2E0;WANCHO LETTER TSA;Lo;0;L;;;;;N;;;;; +1E2E1;WANCHO LETTER TRA;Lo;0;L;;;;;N;;;;; +1E2E2;WANCHO LETTER ONG;Lo;0;L;;;;;N;;;;; +1E2E3;WANCHO LETTER AANG;Lo;0;L;;;;;N;;;;; +1E2E4;WANCHO LETTER ANG;Lo;0;L;;;;;N;;;;; +1E2E5;WANCHO LETTER ING;Lo;0;L;;;;;N;;;;; +1E2E6;WANCHO LETTER ON;Lo;0;L;;;;;N;;;;; +1E2E7;WANCHO LETTER EN;Lo;0;L;;;;;N;;;;; +1E2E8;WANCHO LETTER AAN;Lo;0;L;;;;;N;;;;; +1E2E9;WANCHO LETTER NYA;Lo;0;L;;;;;N;;;;; +1E2EA;WANCHO LETTER UEN;Lo;0;L;;;;;N;;;;; +1E2EB;WANCHO LETTER YIH;Lo;0;L;;;;;N;;;;; +1E2EC;WANCHO TONE TUP;Mn;230;NSM;;;;;N;;;;; +1E2ED;WANCHO TONE TUPNI;Mn;230;NSM;;;;;N;;;;; +1E2EE;WANCHO TONE KOI;Mn;230;NSM;;;;;N;;;;; +1E2EF;WANCHO TONE KOINI;Mn;230;NSM;;;;;N;;;;; +1E2F0;WANCHO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E2F1;WANCHO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E2F2;WANCHO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E2F3;WANCHO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E2F4;WANCHO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E2F5;WANCHO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E2F6;WANCHO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E2F7;WANCHO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E2F8;WANCHO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E2F9;WANCHO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E2FF;WANCHO NGUN SIGN;Sc;0;ET;;;;;N;;;;; +1E4D0;NAG MUNDARI LETTER O;Lo;0;L;;;;;N;;;;; +1E4D1;NAG MUNDARI LETTER OP;Lo;0;L;;;;;N;;;;; +1E4D2;NAG MUNDARI LETTER OL;Lo;0;L;;;;;N;;;;; +1E4D3;NAG MUNDARI LETTER OY;Lo;0;L;;;;;N;;;;; +1E4D4;NAG MUNDARI LETTER ONG;Lo;0;L;;;;;N;;;;; +1E4D5;NAG MUNDARI LETTER A;Lo;0;L;;;;;N;;;;; +1E4D6;NAG MUNDARI LETTER AJ;Lo;0;L;;;;;N;;;;; +1E4D7;NAG MUNDARI LETTER AB;Lo;0;L;;;;;N;;;;; +1E4D8;NAG MUNDARI LETTER ANY;Lo;0;L;;;;;N;;;;; +1E4D9;NAG MUNDARI LETTER AH;Lo;0;L;;;;;N;;;;; +1E4DA;NAG MUNDARI LETTER I;Lo;0;L;;;;;N;;;;; +1E4DB;NAG MUNDARI LETTER IS;Lo;0;L;;;;;N;;;;; +1E4DC;NAG MUNDARI LETTER IDD;Lo;0;L;;;;;N;;;;; +1E4DD;NAG MUNDARI LETTER IT;Lo;0;L;;;;;N;;;;; +1E4DE;NAG MUNDARI LETTER IH;Lo;0;L;;;;;N;;;;; +1E4DF;NAG MUNDARI LETTER U;Lo;0;L;;;;;N;;;;; +1E4E0;NAG MUNDARI LETTER UC;Lo;0;L;;;;;N;;;;; +1E4E1;NAG MUNDARI LETTER UD;Lo;0;L;;;;;N;;;;; +1E4E2;NAG MUNDARI LETTER UK;Lo;0;L;;;;;N;;;;; +1E4E3;NAG MUNDARI LETTER UR;Lo;0;L;;;;;N;;;;; +1E4E4;NAG MUNDARI LETTER E;Lo;0;L;;;;;N;;;;; +1E4E5;NAG MUNDARI LETTER ENN;Lo;0;L;;;;;N;;;;; +1E4E6;NAG MUNDARI LETTER EG;Lo;0;L;;;;;N;;;;; +1E4E7;NAG MUNDARI LETTER EM;Lo;0;L;;;;;N;;;;; +1E4E8;NAG MUNDARI LETTER EN;Lo;0;L;;;;;N;;;;; +1E4E9;NAG MUNDARI LETTER ETT;Lo;0;L;;;;;N;;;;; +1E4EA;NAG MUNDARI LETTER ELL;Lo;0;L;;;;;N;;;;; +1E4EB;NAG MUNDARI SIGN OJOD;Lm;0;L;;;;;N;;;;; +1E4EC;NAG MUNDARI SIGN MUHOR;Mn;232;NSM;;;;;N;;;;; +1E4ED;NAG MUNDARI SIGN TOYOR;Mn;232;NSM;;;;;N;;;;; +1E4EE;NAG MUNDARI SIGN IKIR;Mn;220;NSM;;;;;N;;;;; +1E4EF;NAG MUNDARI SIGN SUTUH;Mn;230;NSM;;;;;N;;;;; +1E4F0;NAG MUNDARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E4F1;NAG MUNDARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E4F2;NAG MUNDARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E4F3;NAG MUNDARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E4F4;NAG MUNDARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E4F5;NAG MUNDARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E4F6;NAG MUNDARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E4F7;NAG MUNDARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E4F8;NAG MUNDARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E4F9;NAG MUNDARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E5D0;OL ONAL LETTER O;Lo;0;L;;;;;N;;;;; +1E5D1;OL ONAL LETTER OM;Lo;0;L;;;;;N;;;;; +1E5D2;OL ONAL LETTER ONG;Lo;0;L;;;;;N;;;;; +1E5D3;OL ONAL LETTER ORR;Lo;0;L;;;;;N;;;;; +1E5D4;OL ONAL LETTER OO;Lo;0;L;;;;;N;;;;; +1E5D5;OL ONAL LETTER OY;Lo;0;L;;;;;N;;;;; +1E5D6;OL ONAL LETTER A;Lo;0;L;;;;;N;;;;; +1E5D7;OL ONAL LETTER AD;Lo;0;L;;;;;N;;;;; +1E5D8;OL ONAL LETTER AB;Lo;0;L;;;;;N;;;;; +1E5D9;OL ONAL LETTER AH;Lo;0;L;;;;;N;;;;; +1E5DA;OL ONAL LETTER AL;Lo;0;L;;;;;N;;;;; +1E5DB;OL ONAL LETTER AW;Lo;0;L;;;;;N;;;;; +1E5DC;OL ONAL LETTER I;Lo;0;L;;;;;N;;;;; +1E5DD;OL ONAL LETTER IT;Lo;0;L;;;;;N;;;;; +1E5DE;OL ONAL LETTER IP;Lo;0;L;;;;;N;;;;; +1E5DF;OL ONAL LETTER ITT;Lo;0;L;;;;;N;;;;; +1E5E0;OL ONAL LETTER ID;Lo;0;L;;;;;N;;;;; +1E5E1;OL ONAL LETTER IN;Lo;0;L;;;;;N;;;;; +1E5E2;OL ONAL LETTER U;Lo;0;L;;;;;N;;;;; +1E5E3;OL ONAL LETTER UK;Lo;0;L;;;;;N;;;;; +1E5E4;OL ONAL LETTER UDD;Lo;0;L;;;;;N;;;;; +1E5E5;OL ONAL LETTER UJ;Lo;0;L;;;;;N;;;;; +1E5E6;OL ONAL LETTER UNY;Lo;0;L;;;;;N;;;;; +1E5E7;OL ONAL LETTER UR;Lo;0;L;;;;;N;;;;; +1E5E8;OL ONAL LETTER E;Lo;0;L;;;;;N;;;;; +1E5E9;OL ONAL LETTER ES;Lo;0;L;;;;;N;;;;; +1E5EA;OL ONAL LETTER EH;Lo;0;L;;;;;N;;;;; +1E5EB;OL ONAL LETTER EC;Lo;0;L;;;;;N;;;;; +1E5EC;OL ONAL LETTER ENN;Lo;0;L;;;;;N;;;;; +1E5ED;OL ONAL LETTER EG;Lo;0;L;;;;;N;;;;; +1E5EE;OL ONAL SIGN MU;Mn;230;NSM;;;;;N;;;;; +1E5EF;OL ONAL SIGN IKIR;Mn;220;NSM;;;;;N;;;;; +1E5F0;OL ONAL SIGN HODDOND;Lo;0;L;;;;;N;;;;; +1E5F1;OL ONAL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E5F2;OL ONAL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E5F3;OL ONAL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E5F4;OL ONAL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E5F5;OL ONAL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E5F6;OL ONAL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E5F7;OL ONAL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E5F8;OL ONAL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E5F9;OL ONAL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E5FA;OL ONAL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E5FF;OL ONAL ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +1E6C0;TAI YO LETTER LOW KO;Lo;0;L;;;;;N;;;;; +1E6C1;TAI YO LETTER HIGH KO;Lo;0;L;;;;;N;;;;; +1E6C2;TAI YO LETTER LOW KHO;Lo;0;L;;;;;N;;;;; +1E6C3;TAI YO LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; +1E6C4;TAI YO LETTER GO;Lo;0;L;;;;;N;;;;; +1E6C5;TAI YO LETTER NGO;Lo;0;L;;;;;N;;;;; +1E6C6;TAI YO LETTER CO;Lo;0;L;;;;;N;;;;; +1E6C7;TAI YO LETTER LOW XO;Lo;0;L;;;;;N;;;;; +1E6C8;TAI YO LETTER HIGH XO;Lo;0;L;;;;;N;;;;; +1E6C9;TAI YO LETTER LOW NYO;Lo;0;L;;;;;N;;;;; +1E6CA;TAI YO LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; +1E6CB;TAI YO LETTER DO;Lo;0;L;;;;;N;;;;; +1E6CC;TAI YO LETTER LOW TO;Lo;0;L;;;;;N;;;;; +1E6CD;TAI YO LETTER HIGH TO;Lo;0;L;;;;;N;;;;; +1E6CE;TAI YO LETTER THO;Lo;0;L;;;;;N;;;;; +1E6CF;TAI YO LETTER NO;Lo;0;L;;;;;N;;;;; +1E6D0;TAI YO LETTER BO;Lo;0;L;;;;;N;;;;; +1E6D1;TAI YO LETTER LOW PO;Lo;0;L;;;;;N;;;;; +1E6D2;TAI YO LETTER HIGH PO;Lo;0;L;;;;;N;;;;; +1E6D3;TAI YO LETTER PHO;Lo;0;L;;;;;N;;;;; +1E6D4;TAI YO LETTER LOW FO;Lo;0;L;;;;;N;;;;; +1E6D5;TAI YO LETTER HIGH FO;Lo;0;L;;;;;N;;;;; +1E6D6;TAI YO LETTER MO;Lo;0;L;;;;;N;;;;; +1E6D7;TAI YO LETTER YO;Lo;0;L;;;;;N;;;;; +1E6D8;TAI YO LETTER LO;Lo;0;L;;;;;N;;;;; +1E6D9;TAI YO LETTER VO;Lo;0;L;;;;;N;;;;; +1E6DA;TAI YO LETTER LOW HO;Lo;0;L;;;;;N;;;;; +1E6DB;TAI YO LETTER HIGH HO;Lo;0;L;;;;;N;;;;; +1E6DC;TAI YO LETTER QO;Lo;0;L;;;;;N;;;;; +1E6DD;TAI YO LETTER LOW KVO;Lo;0;L;;;;;N;;;;; +1E6DE;TAI YO LETTER HIGH KVO;Lo;0;L;;;;;N;;;;; +1E6E0;TAI YO LETTER AA;Lo;0;L;;;;;N;;;;; +1E6E1;TAI YO LETTER I;Lo;0;L;;;;;N;;;;; +1E6E2;TAI YO LETTER UE;Lo;0;L;;;;;N;;;;; +1E6E3;TAI YO SIGN UE;Mn;230;NSM;;;;;N;;;;; +1E6E4;TAI YO LETTER U;Lo;0;L;;;;;N;;;;; +1E6E5;TAI YO LETTER AE;Lo;0;L;;;;;N;;;;; +1E6E6;TAI YO SIGN AU;Mn;230;NSM;;;;;N;;;;; +1E6E7;TAI YO LETTER O;Lo;0;L;;;;;N;;;;; +1E6E8;TAI YO LETTER E;Lo;0;L;;;;;N;;;;; +1E6E9;TAI YO LETTER IA;Lo;0;L;;;;;N;;;;; +1E6EA;TAI YO LETTER UEA;Lo;0;L;;;;;N;;;;; +1E6EB;TAI YO LETTER UA;Lo;0;L;;;;;N;;;;; +1E6EC;TAI YO LETTER OO;Lo;0;L;;;;;N;;;;; +1E6ED;TAI YO LETTER AUE;Lo;0;L;;;;;N;;;;; +1E6EE;TAI YO SIGN AY;Mn;230;NSM;;;;;N;;;;; +1E6EF;TAI YO SIGN ANG;Mn;230;NSM;;;;;N;;;;; +1E6F0;TAI YO LETTER AN;Lo;0;L;;;;;N;;;;; +1E6F1;TAI YO LETTER AM;Lo;0;L;;;;;N;;;;; +1E6F2;TAI YO LETTER AK;Lo;0;L;;;;;N;;;;; +1E6F3;TAI YO LETTER AT;Lo;0;L;;;;;N;;;;; +1E6F4;TAI YO LETTER AP;Lo;0;L;;;;;N;;;;; +1E6F5;TAI YO SIGN OM;Mn;230;NSM;;;;;N;;;;; +1E6FE;TAI YO SYMBOL MUEANG;Lo;0;L;;;;;N;;;;; +1E6FF;TAI YO XAM LAI;Lm;0;L;;;;;N;;;;; +1E7E0;ETHIOPIC SYLLABLE HHYA;Lo;0;L;;;;;N;;;;; +1E7E1;ETHIOPIC SYLLABLE HHYU;Lo;0;L;;;;;N;;;;; +1E7E2;ETHIOPIC SYLLABLE HHYI;Lo;0;L;;;;;N;;;;; +1E7E3;ETHIOPIC SYLLABLE HHYAA;Lo;0;L;;;;;N;;;;; +1E7E4;ETHIOPIC SYLLABLE HHYEE;Lo;0;L;;;;;N;;;;; +1E7E5;ETHIOPIC SYLLABLE HHYE;Lo;0;L;;;;;N;;;;; +1E7E6;ETHIOPIC SYLLABLE HHYO;Lo;0;L;;;;;N;;;;; +1E7E8;ETHIOPIC SYLLABLE GURAGE HHWA;Lo;0;L;;;;;N;;;;; +1E7E9;ETHIOPIC SYLLABLE HHWI;Lo;0;L;;;;;N;;;;; +1E7EA;ETHIOPIC SYLLABLE HHWEE;Lo;0;L;;;;;N;;;;; +1E7EB;ETHIOPIC SYLLABLE HHWE;Lo;0;L;;;;;N;;;;; +1E7ED;ETHIOPIC SYLLABLE GURAGE MWI;Lo;0;L;;;;;N;;;;; +1E7EE;ETHIOPIC SYLLABLE GURAGE MWEE;Lo;0;L;;;;;N;;;;; +1E7F0;ETHIOPIC SYLLABLE GURAGE QWI;Lo;0;L;;;;;N;;;;; +1E7F1;ETHIOPIC SYLLABLE GURAGE QWEE;Lo;0;L;;;;;N;;;;; +1E7F2;ETHIOPIC SYLLABLE GURAGE QWE;Lo;0;L;;;;;N;;;;; +1E7F3;ETHIOPIC SYLLABLE GURAGE BWI;Lo;0;L;;;;;N;;;;; +1E7F4;ETHIOPIC SYLLABLE GURAGE BWEE;Lo;0;L;;;;;N;;;;; +1E7F5;ETHIOPIC SYLLABLE GURAGE KWI;Lo;0;L;;;;;N;;;;; +1E7F6;ETHIOPIC SYLLABLE GURAGE KWEE;Lo;0;L;;;;;N;;;;; +1E7F7;ETHIOPIC SYLLABLE GURAGE KWE;Lo;0;L;;;;;N;;;;; +1E7F8;ETHIOPIC SYLLABLE GURAGE GWI;Lo;0;L;;;;;N;;;;; +1E7F9;ETHIOPIC SYLLABLE GURAGE GWEE;Lo;0;L;;;;;N;;;;; +1E7FA;ETHIOPIC SYLLABLE GURAGE GWE;Lo;0;L;;;;;N;;;;; +1E7FB;ETHIOPIC SYLLABLE GURAGE FWI;Lo;0;L;;;;;N;;;;; +1E7FC;ETHIOPIC SYLLABLE GURAGE FWEE;Lo;0;L;;;;;N;;;;; +1E7FD;ETHIOPIC SYLLABLE GURAGE PWI;Lo;0;L;;;;;N;;;;; +1E7FE;ETHIOPIC SYLLABLE GURAGE PWEE;Lo;0;L;;;;;N;;;;; +1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; +1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; +1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; +1E803;MENDE KIKAKUI SYLLABLE M065 KEE;Lo;0;R;;;;;N;;;;; +1E804;MENDE KIKAKUI SYLLABLE M095 KE;Lo;0;R;;;;;N;;;;; +1E805;MENDE KIKAKUI SYLLABLE M076 KOO;Lo;0;R;;;;;N;;;;; +1E806;MENDE KIKAKUI SYLLABLE M048 KO;Lo;0;R;;;;;N;;;;; +1E807;MENDE KIKAKUI SYLLABLE M179 KUA;Lo;0;R;;;;;N;;;;; +1E808;MENDE KIKAKUI SYLLABLE M004 WI;Lo;0;R;;;;;N;;;;; +1E809;MENDE KIKAKUI SYLLABLE M005 WA;Lo;0;R;;;;;N;;;;; +1E80A;MENDE KIKAKUI SYLLABLE M006 WU;Lo;0;R;;;;;N;;;;; +1E80B;MENDE KIKAKUI SYLLABLE M126 WEE;Lo;0;R;;;;;N;;;;; +1E80C;MENDE KIKAKUI SYLLABLE M118 WE;Lo;0;R;;;;;N;;;;; +1E80D;MENDE KIKAKUI SYLLABLE M114 WOO;Lo;0;R;;;;;N;;;;; +1E80E;MENDE KIKAKUI SYLLABLE M045 WO;Lo;0;R;;;;;N;;;;; +1E80F;MENDE KIKAKUI SYLLABLE M194 WUI;Lo;0;R;;;;;N;;;;; +1E810;MENDE KIKAKUI SYLLABLE M143 WEI;Lo;0;R;;;;;N;;;;; +1E811;MENDE KIKAKUI SYLLABLE M061 WVI;Lo;0;R;;;;;N;;;;; +1E812;MENDE KIKAKUI SYLLABLE M049 WVA;Lo;0;R;;;;;N;;;;; +1E813;MENDE KIKAKUI SYLLABLE M139 WVE;Lo;0;R;;;;;N;;;;; +1E814;MENDE KIKAKUI SYLLABLE M007 MIN;Lo;0;R;;;;;N;;;;; +1E815;MENDE KIKAKUI SYLLABLE M008 MAN;Lo;0;R;;;;;N;;;;; +1E816;MENDE KIKAKUI SYLLABLE M009 MUN;Lo;0;R;;;;;N;;;;; +1E817;MENDE KIKAKUI SYLLABLE M059 MEN;Lo;0;R;;;;;N;;;;; +1E818;MENDE KIKAKUI SYLLABLE M094 MON;Lo;0;R;;;;;N;;;;; +1E819;MENDE KIKAKUI SYLLABLE M154 MUAN;Lo;0;R;;;;;N;;;;; +1E81A;MENDE KIKAKUI SYLLABLE M189 MUEN;Lo;0;R;;;;;N;;;;; +1E81B;MENDE KIKAKUI SYLLABLE M010 BI;Lo;0;R;;;;;N;;;;; +1E81C;MENDE KIKAKUI SYLLABLE M011 BA;Lo;0;R;;;;;N;;;;; +1E81D;MENDE KIKAKUI SYLLABLE M012 BU;Lo;0;R;;;;;N;;;;; +1E81E;MENDE KIKAKUI SYLLABLE M150 BEE;Lo;0;R;;;;;N;;;;; +1E81F;MENDE KIKAKUI SYLLABLE M097 BE;Lo;0;R;;;;;N;;;;; +1E820;MENDE KIKAKUI SYLLABLE M103 BOO;Lo;0;R;;;;;N;;;;; +1E821;MENDE KIKAKUI SYLLABLE M138 BO;Lo;0;R;;;;;N;;;;; +1E822;MENDE KIKAKUI SYLLABLE M013 I;Lo;0;R;;;;;N;;;;; +1E823;MENDE KIKAKUI SYLLABLE M014 A;Lo;0;R;;;;;N;;;;; +1E824;MENDE KIKAKUI SYLLABLE M015 U;Lo;0;R;;;;;N;;;;; +1E825;MENDE KIKAKUI SYLLABLE M163 EE;Lo;0;R;;;;;N;;;;; +1E826;MENDE KIKAKUI SYLLABLE M100 E;Lo;0;R;;;;;N;;;;; +1E827;MENDE KIKAKUI SYLLABLE M165 OO;Lo;0;R;;;;;N;;;;; +1E828;MENDE KIKAKUI SYLLABLE M147 O;Lo;0;R;;;;;N;;;;; +1E829;MENDE KIKAKUI SYLLABLE M137 EI;Lo;0;R;;;;;N;;;;; +1E82A;MENDE KIKAKUI SYLLABLE M131 IN;Lo;0;R;;;;;N;;;;; +1E82B;MENDE KIKAKUI SYLLABLE M135 IN;Lo;0;R;;;;;N;;;;; +1E82C;MENDE KIKAKUI SYLLABLE M195 AN;Lo;0;R;;;;;N;;;;; +1E82D;MENDE KIKAKUI SYLLABLE M178 EN;Lo;0;R;;;;;N;;;;; +1E82E;MENDE KIKAKUI SYLLABLE M019 SI;Lo;0;R;;;;;N;;;;; +1E82F;MENDE KIKAKUI SYLLABLE M020 SA;Lo;0;R;;;;;N;;;;; +1E830;MENDE KIKAKUI SYLLABLE M021 SU;Lo;0;R;;;;;N;;;;; +1E831;MENDE KIKAKUI SYLLABLE M162 SEE;Lo;0;R;;;;;N;;;;; +1E832;MENDE KIKAKUI SYLLABLE M116 SE;Lo;0;R;;;;;N;;;;; +1E833;MENDE KIKAKUI SYLLABLE M136 SOO;Lo;0;R;;;;;N;;;;; +1E834;MENDE KIKAKUI SYLLABLE M079 SO;Lo;0;R;;;;;N;;;;; +1E835;MENDE KIKAKUI SYLLABLE M196 SIA;Lo;0;R;;;;;N;;;;; +1E836;MENDE KIKAKUI SYLLABLE M025 LI;Lo;0;R;;;;;N;;;;; +1E837;MENDE KIKAKUI SYLLABLE M026 LA;Lo;0;R;;;;;N;;;;; +1E838;MENDE KIKAKUI SYLLABLE M027 LU;Lo;0;R;;;;;N;;;;; +1E839;MENDE KIKAKUI SYLLABLE M084 LEE;Lo;0;R;;;;;N;;;;; +1E83A;MENDE KIKAKUI SYLLABLE M073 LE;Lo;0;R;;;;;N;;;;; +1E83B;MENDE KIKAKUI SYLLABLE M054 LOO;Lo;0;R;;;;;N;;;;; +1E83C;MENDE KIKAKUI SYLLABLE M153 LO;Lo;0;R;;;;;N;;;;; +1E83D;MENDE KIKAKUI SYLLABLE M110 LONG LE;Lo;0;R;;;;;N;;;;; +1E83E;MENDE KIKAKUI SYLLABLE M016 DI;Lo;0;R;;;;;N;;;;; +1E83F;MENDE KIKAKUI SYLLABLE M017 DA;Lo;0;R;;;;;N;;;;; +1E840;MENDE KIKAKUI SYLLABLE M018 DU;Lo;0;R;;;;;N;;;;; +1E841;MENDE KIKAKUI SYLLABLE M089 DEE;Lo;0;R;;;;;N;;;;; +1E842;MENDE KIKAKUI SYLLABLE M180 DOO;Lo;0;R;;;;;N;;;;; +1E843;MENDE KIKAKUI SYLLABLE M181 DO;Lo;0;R;;;;;N;;;;; +1E844;MENDE KIKAKUI SYLLABLE M022 TI;Lo;0;R;;;;;N;;;;; +1E845;MENDE KIKAKUI SYLLABLE M023 TA;Lo;0;R;;;;;N;;;;; +1E846;MENDE KIKAKUI SYLLABLE M024 TU;Lo;0;R;;;;;N;;;;; +1E847;MENDE KIKAKUI SYLLABLE M091 TEE;Lo;0;R;;;;;N;;;;; +1E848;MENDE KIKAKUI SYLLABLE M055 TE;Lo;0;R;;;;;N;;;;; +1E849;MENDE KIKAKUI SYLLABLE M104 TOO;Lo;0;R;;;;;N;;;;; +1E84A;MENDE KIKAKUI SYLLABLE M069 TO;Lo;0;R;;;;;N;;;;; +1E84B;MENDE KIKAKUI SYLLABLE M028 JI;Lo;0;R;;;;;N;;;;; +1E84C;MENDE KIKAKUI SYLLABLE M029 JA;Lo;0;R;;;;;N;;;;; +1E84D;MENDE KIKAKUI SYLLABLE M030 JU;Lo;0;R;;;;;N;;;;; +1E84E;MENDE KIKAKUI SYLLABLE M157 JEE;Lo;0;R;;;;;N;;;;; +1E84F;MENDE KIKAKUI SYLLABLE M113 JE;Lo;0;R;;;;;N;;;;; +1E850;MENDE KIKAKUI SYLLABLE M160 JOO;Lo;0;R;;;;;N;;;;; +1E851;MENDE KIKAKUI SYLLABLE M063 JO;Lo;0;R;;;;;N;;;;; +1E852;MENDE KIKAKUI SYLLABLE M175 LONG JO;Lo;0;R;;;;;N;;;;; +1E853;MENDE KIKAKUI SYLLABLE M031 YI;Lo;0;R;;;;;N;;;;; +1E854;MENDE KIKAKUI SYLLABLE M032 YA;Lo;0;R;;;;;N;;;;; +1E855;MENDE KIKAKUI SYLLABLE M033 YU;Lo;0;R;;;;;N;;;;; +1E856;MENDE KIKAKUI SYLLABLE M109 YEE;Lo;0;R;;;;;N;;;;; +1E857;MENDE KIKAKUI SYLLABLE M080 YE;Lo;0;R;;;;;N;;;;; +1E858;MENDE KIKAKUI SYLLABLE M141 YOO;Lo;0;R;;;;;N;;;;; +1E859;MENDE KIKAKUI SYLLABLE M121 YO;Lo;0;R;;;;;N;;;;; +1E85A;MENDE KIKAKUI SYLLABLE M034 FI;Lo;0;R;;;;;N;;;;; +1E85B;MENDE KIKAKUI SYLLABLE M035 FA;Lo;0;R;;;;;N;;;;; +1E85C;MENDE KIKAKUI SYLLABLE M036 FU;Lo;0;R;;;;;N;;;;; +1E85D;MENDE KIKAKUI SYLLABLE M078 FEE;Lo;0;R;;;;;N;;;;; +1E85E;MENDE KIKAKUI SYLLABLE M075 FE;Lo;0;R;;;;;N;;;;; +1E85F;MENDE KIKAKUI SYLLABLE M133 FOO;Lo;0;R;;;;;N;;;;; +1E860;MENDE KIKAKUI SYLLABLE M088 FO;Lo;0;R;;;;;N;;;;; +1E861;MENDE KIKAKUI SYLLABLE M197 FUA;Lo;0;R;;;;;N;;;;; +1E862;MENDE KIKAKUI SYLLABLE M101 FAN;Lo;0;R;;;;;N;;;;; +1E863;MENDE KIKAKUI SYLLABLE M037 NIN;Lo;0;R;;;;;N;;;;; +1E864;MENDE KIKAKUI SYLLABLE M038 NAN;Lo;0;R;;;;;N;;;;; +1E865;MENDE KIKAKUI SYLLABLE M039 NUN;Lo;0;R;;;;;N;;;;; +1E866;MENDE KIKAKUI SYLLABLE M117 NEN;Lo;0;R;;;;;N;;;;; +1E867;MENDE KIKAKUI SYLLABLE M169 NON;Lo;0;R;;;;;N;;;;; +1E868;MENDE KIKAKUI SYLLABLE M176 HI;Lo;0;R;;;;;N;;;;; +1E869;MENDE KIKAKUI SYLLABLE M041 HA;Lo;0;R;;;;;N;;;;; +1E86A;MENDE KIKAKUI SYLLABLE M186 HU;Lo;0;R;;;;;N;;;;; +1E86B;MENDE KIKAKUI SYLLABLE M040 HEE;Lo;0;R;;;;;N;;;;; +1E86C;MENDE KIKAKUI SYLLABLE M096 HE;Lo;0;R;;;;;N;;;;; +1E86D;MENDE KIKAKUI SYLLABLE M042 HOO;Lo;0;R;;;;;N;;;;; +1E86E;MENDE KIKAKUI SYLLABLE M140 HO;Lo;0;R;;;;;N;;;;; +1E86F;MENDE KIKAKUI SYLLABLE M083 HEEI;Lo;0;R;;;;;N;;;;; +1E870;MENDE KIKAKUI SYLLABLE M128 HOOU;Lo;0;R;;;;;N;;;;; +1E871;MENDE KIKAKUI SYLLABLE M053 HIN;Lo;0;R;;;;;N;;;;; +1E872;MENDE KIKAKUI SYLLABLE M130 HAN;Lo;0;R;;;;;N;;;;; +1E873;MENDE KIKAKUI SYLLABLE M087 HUN;Lo;0;R;;;;;N;;;;; +1E874;MENDE KIKAKUI SYLLABLE M052 HEN;Lo;0;R;;;;;N;;;;; +1E875;MENDE KIKAKUI SYLLABLE M193 HON;Lo;0;R;;;;;N;;;;; +1E876;MENDE KIKAKUI SYLLABLE M046 HUAN;Lo;0;R;;;;;N;;;;; +1E877;MENDE KIKAKUI SYLLABLE M090 NGGI;Lo;0;R;;;;;N;;;;; +1E878;MENDE KIKAKUI SYLLABLE M043 NGGA;Lo;0;R;;;;;N;;;;; +1E879;MENDE KIKAKUI SYLLABLE M082 NGGU;Lo;0;R;;;;;N;;;;; +1E87A;MENDE KIKAKUI SYLLABLE M115 NGGEE;Lo;0;R;;;;;N;;;;; +1E87B;MENDE KIKAKUI SYLLABLE M146 NGGE;Lo;0;R;;;;;N;;;;; +1E87C;MENDE KIKAKUI SYLLABLE M156 NGGOO;Lo;0;R;;;;;N;;;;; +1E87D;MENDE KIKAKUI SYLLABLE M120 NGGO;Lo;0;R;;;;;N;;;;; +1E87E;MENDE KIKAKUI SYLLABLE M159 NGGAA;Lo;0;R;;;;;N;;;;; +1E87F;MENDE KIKAKUI SYLLABLE M127 NGGUA;Lo;0;R;;;;;N;;;;; +1E880;MENDE KIKAKUI SYLLABLE M086 LONG NGGE;Lo;0;R;;;;;N;;;;; +1E881;MENDE KIKAKUI SYLLABLE M106 LONG NGGOO;Lo;0;R;;;;;N;;;;; +1E882;MENDE KIKAKUI SYLLABLE M183 LONG NGGO;Lo;0;R;;;;;N;;;;; +1E883;MENDE KIKAKUI SYLLABLE M155 GI;Lo;0;R;;;;;N;;;;; +1E884;MENDE KIKAKUI SYLLABLE M111 GA;Lo;0;R;;;;;N;;;;; +1E885;MENDE KIKAKUI SYLLABLE M168 GU;Lo;0;R;;;;;N;;;;; +1E886;MENDE KIKAKUI SYLLABLE M190 GEE;Lo;0;R;;;;;N;;;;; +1E887;MENDE KIKAKUI SYLLABLE M166 GUEI;Lo;0;R;;;;;N;;;;; +1E888;MENDE KIKAKUI SYLLABLE M167 GUAN;Lo;0;R;;;;;N;;;;; +1E889;MENDE KIKAKUI SYLLABLE M184 NGEN;Lo;0;R;;;;;N;;;;; +1E88A;MENDE KIKAKUI SYLLABLE M057 NGON;Lo;0;R;;;;;N;;;;; +1E88B;MENDE KIKAKUI SYLLABLE M177 NGUAN;Lo;0;R;;;;;N;;;;; +1E88C;MENDE KIKAKUI SYLLABLE M068 PI;Lo;0;R;;;;;N;;;;; +1E88D;MENDE KIKAKUI SYLLABLE M099 PA;Lo;0;R;;;;;N;;;;; +1E88E;MENDE KIKAKUI SYLLABLE M050 PU;Lo;0;R;;;;;N;;;;; +1E88F;MENDE KIKAKUI SYLLABLE M081 PEE;Lo;0;R;;;;;N;;;;; +1E890;MENDE KIKAKUI SYLLABLE M051 PE;Lo;0;R;;;;;N;;;;; +1E891;MENDE KIKAKUI SYLLABLE M102 POO;Lo;0;R;;;;;N;;;;; +1E892;MENDE KIKAKUI SYLLABLE M066 PO;Lo;0;R;;;;;N;;;;; +1E893;MENDE KIKAKUI SYLLABLE M145 MBI;Lo;0;R;;;;;N;;;;; +1E894;MENDE KIKAKUI SYLLABLE M062 MBA;Lo;0;R;;;;;N;;;;; +1E895;MENDE KIKAKUI SYLLABLE M122 MBU;Lo;0;R;;;;;N;;;;; +1E896;MENDE KIKAKUI SYLLABLE M047 MBEE;Lo;0;R;;;;;N;;;;; +1E897;MENDE KIKAKUI SYLLABLE M188 MBEE;Lo;0;R;;;;;N;;;;; +1E898;MENDE KIKAKUI SYLLABLE M072 MBE;Lo;0;R;;;;;N;;;;; +1E899;MENDE KIKAKUI SYLLABLE M172 MBOO;Lo;0;R;;;;;N;;;;; +1E89A;MENDE KIKAKUI SYLLABLE M174 MBO;Lo;0;R;;;;;N;;;;; +1E89B;MENDE KIKAKUI SYLLABLE M187 MBUU;Lo;0;R;;;;;N;;;;; +1E89C;MENDE KIKAKUI SYLLABLE M161 LONG MBE;Lo;0;R;;;;;N;;;;; +1E89D;MENDE KIKAKUI SYLLABLE M105 LONG MBOO;Lo;0;R;;;;;N;;;;; +1E89E;MENDE KIKAKUI SYLLABLE M142 LONG MBO;Lo;0;R;;;;;N;;;;; +1E89F;MENDE KIKAKUI SYLLABLE M132 KPI;Lo;0;R;;;;;N;;;;; +1E8A0;MENDE KIKAKUI SYLLABLE M092 KPA;Lo;0;R;;;;;N;;;;; +1E8A1;MENDE KIKAKUI SYLLABLE M074 KPU;Lo;0;R;;;;;N;;;;; +1E8A2;MENDE KIKAKUI SYLLABLE M044 KPEE;Lo;0;R;;;;;N;;;;; +1E8A3;MENDE KIKAKUI SYLLABLE M108 KPE;Lo;0;R;;;;;N;;;;; +1E8A4;MENDE KIKAKUI SYLLABLE M112 KPOO;Lo;0;R;;;;;N;;;;; +1E8A5;MENDE KIKAKUI SYLLABLE M158 KPO;Lo;0;R;;;;;N;;;;; +1E8A6;MENDE KIKAKUI SYLLABLE M124 GBI;Lo;0;R;;;;;N;;;;; +1E8A7;MENDE KIKAKUI SYLLABLE M056 GBA;Lo;0;R;;;;;N;;;;; +1E8A8;MENDE KIKAKUI SYLLABLE M148 GBU;Lo;0;R;;;;;N;;;;; +1E8A9;MENDE KIKAKUI SYLLABLE M093 GBEE;Lo;0;R;;;;;N;;;;; +1E8AA;MENDE KIKAKUI SYLLABLE M107 GBE;Lo;0;R;;;;;N;;;;; +1E8AB;MENDE KIKAKUI SYLLABLE M071 GBOO;Lo;0;R;;;;;N;;;;; +1E8AC;MENDE KIKAKUI SYLLABLE M070 GBO;Lo;0;R;;;;;N;;;;; +1E8AD;MENDE KIKAKUI SYLLABLE M171 RA;Lo;0;R;;;;;N;;;;; +1E8AE;MENDE KIKAKUI SYLLABLE M123 NDI;Lo;0;R;;;;;N;;;;; +1E8AF;MENDE KIKAKUI SYLLABLE M129 NDA;Lo;0;R;;;;;N;;;;; +1E8B0;MENDE KIKAKUI SYLLABLE M125 NDU;Lo;0;R;;;;;N;;;;; +1E8B1;MENDE KIKAKUI SYLLABLE M191 NDEE;Lo;0;R;;;;;N;;;;; +1E8B2;MENDE KIKAKUI SYLLABLE M119 NDE;Lo;0;R;;;;;N;;;;; +1E8B3;MENDE KIKAKUI SYLLABLE M067 NDOO;Lo;0;R;;;;;N;;;;; +1E8B4;MENDE KIKAKUI SYLLABLE M064 NDO;Lo;0;R;;;;;N;;;;; +1E8B5;MENDE KIKAKUI SYLLABLE M152 NJA;Lo;0;R;;;;;N;;;;; +1E8B6;MENDE KIKAKUI SYLLABLE M192 NJU;Lo;0;R;;;;;N;;;;; +1E8B7;MENDE KIKAKUI SYLLABLE M149 NJEE;Lo;0;R;;;;;N;;;;; +1E8B8;MENDE KIKAKUI SYLLABLE M134 NJOO;Lo;0;R;;;;;N;;;;; +1E8B9;MENDE KIKAKUI SYLLABLE M182 VI;Lo;0;R;;;;;N;;;;; +1E8BA;MENDE KIKAKUI SYLLABLE M185 VA;Lo;0;R;;;;;N;;;;; +1E8BB;MENDE KIKAKUI SYLLABLE M151 VU;Lo;0;R;;;;;N;;;;; +1E8BC;MENDE KIKAKUI SYLLABLE M173 VEE;Lo;0;R;;;;;N;;;;; +1E8BD;MENDE KIKAKUI SYLLABLE M085 VE;Lo;0;R;;;;;N;;;;; +1E8BE;MENDE KIKAKUI SYLLABLE M144 VOO;Lo;0;R;;;;;N;;;;; +1E8BF;MENDE KIKAKUI SYLLABLE M077 VO;Lo;0;R;;;;;N;;;;; +1E8C0;MENDE KIKAKUI SYLLABLE M164 NYIN;Lo;0;R;;;;;N;;;;; +1E8C1;MENDE KIKAKUI SYLLABLE M058 NYAN;Lo;0;R;;;;;N;;;;; +1E8C2;MENDE KIKAKUI SYLLABLE M170 NYUN;Lo;0;R;;;;;N;;;;; +1E8C3;MENDE KIKAKUI SYLLABLE M098 NYEN;Lo;0;R;;;;;N;;;;; +1E8C4;MENDE KIKAKUI SYLLABLE M060 NYON;Lo;0;R;;;;;N;;;;; +1E8C7;MENDE KIKAKUI DIGIT ONE;No;0;R;;;;1;N;;;;; +1E8C8;MENDE KIKAKUI DIGIT TWO;No;0;R;;;;2;N;;;;; +1E8C9;MENDE KIKAKUI DIGIT THREE;No;0;R;;;;3;N;;;;; +1E8CA;MENDE KIKAKUI DIGIT FOUR;No;0;R;;;;4;N;;;;; +1E8CB;MENDE KIKAKUI DIGIT FIVE;No;0;R;;;;5;N;;;;; +1E8CC;MENDE KIKAKUI DIGIT SIX;No;0;R;;;;6;N;;;;; +1E8CD;MENDE KIKAKUI DIGIT SEVEN;No;0;R;;;;7;N;;;;; +1E8CE;MENDE KIKAKUI DIGIT EIGHT;No;0;R;;;;8;N;;;;; +1E8CF;MENDE KIKAKUI DIGIT NINE;No;0;R;;;;9;N;;;;; +1E8D0;MENDE KIKAKUI COMBINING NUMBER TEENS;Mn;220;NSM;;;;;N;;;;; +1E8D1;MENDE KIKAKUI COMBINING NUMBER TENS;Mn;220;NSM;;;;;N;;;;; +1E8D2;MENDE KIKAKUI COMBINING NUMBER HUNDREDS;Mn;220;NSM;;;;;N;;;;; +1E8D3;MENDE KIKAKUI COMBINING NUMBER THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D4;MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D5;MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D6;MENDE KIKAKUI COMBINING NUMBER MILLIONS;Mn;220;NSM;;;;;N;;;;; +1E900;ADLAM CAPITAL LETTER ALIF;Lu;0;R;;;;;N;;;;1E922; +1E901;ADLAM CAPITAL LETTER DAALI;Lu;0;R;;;;;N;;;;1E923; +1E902;ADLAM CAPITAL LETTER LAAM;Lu;0;R;;;;;N;;;;1E924; +1E903;ADLAM CAPITAL LETTER MIIM;Lu;0;R;;;;;N;;;;1E925; +1E904;ADLAM CAPITAL LETTER BA;Lu;0;R;;;;;N;;;;1E926; +1E905;ADLAM CAPITAL LETTER SINNYIIYHE;Lu;0;R;;;;;N;;;;1E927; +1E906;ADLAM CAPITAL LETTER PE;Lu;0;R;;;;;N;;;;1E928; +1E907;ADLAM CAPITAL LETTER BHE;Lu;0;R;;;;;N;;;;1E929; +1E908;ADLAM CAPITAL LETTER RA;Lu;0;R;;;;;N;;;;1E92A; +1E909;ADLAM CAPITAL LETTER E;Lu;0;R;;;;;N;;;;1E92B; +1E90A;ADLAM CAPITAL LETTER FA;Lu;0;R;;;;;N;;;;1E92C; +1E90B;ADLAM CAPITAL LETTER I;Lu;0;R;;;;;N;;;;1E92D; +1E90C;ADLAM CAPITAL LETTER O;Lu;0;R;;;;;N;;;;1E92E; +1E90D;ADLAM CAPITAL LETTER DHA;Lu;0;R;;;;;N;;;;1E92F; +1E90E;ADLAM CAPITAL LETTER YHE;Lu;0;R;;;;;N;;;;1E930; +1E90F;ADLAM CAPITAL LETTER WAW;Lu;0;R;;;;;N;;;;1E931; +1E910;ADLAM CAPITAL LETTER NUN;Lu;0;R;;;;;N;;;;1E932; +1E911;ADLAM CAPITAL LETTER KAF;Lu;0;R;;;;;N;;;;1E933; +1E912;ADLAM CAPITAL LETTER YA;Lu;0;R;;;;;N;;;;1E934; +1E913;ADLAM CAPITAL LETTER U;Lu;0;R;;;;;N;;;;1E935; +1E914;ADLAM CAPITAL LETTER JIIM;Lu;0;R;;;;;N;;;;1E936; +1E915;ADLAM CAPITAL LETTER CHI;Lu;0;R;;;;;N;;;;1E937; +1E916;ADLAM CAPITAL LETTER HA;Lu;0;R;;;;;N;;;;1E938; +1E917;ADLAM CAPITAL LETTER QAAF;Lu;0;R;;;;;N;;;;1E939; +1E918;ADLAM CAPITAL LETTER GA;Lu;0;R;;;;;N;;;;1E93A; +1E919;ADLAM CAPITAL LETTER NYA;Lu;0;R;;;;;N;;;;1E93B; +1E91A;ADLAM CAPITAL LETTER TU;Lu;0;R;;;;;N;;;;1E93C; +1E91B;ADLAM CAPITAL LETTER NHA;Lu;0;R;;;;;N;;;;1E93D; +1E91C;ADLAM CAPITAL LETTER VA;Lu;0;R;;;;;N;;;;1E93E; +1E91D;ADLAM CAPITAL LETTER KHA;Lu;0;R;;;;;N;;;;1E93F; +1E91E;ADLAM CAPITAL LETTER GBE;Lu;0;R;;;;;N;;;;1E940; +1E91F;ADLAM CAPITAL LETTER ZAL;Lu;0;R;;;;;N;;;;1E941; +1E920;ADLAM CAPITAL LETTER KPO;Lu;0;R;;;;;N;;;;1E942; +1E921;ADLAM CAPITAL LETTER SHA;Lu;0;R;;;;;N;;;;1E943; +1E922;ADLAM SMALL LETTER ALIF;Ll;0;R;;;;;N;;;1E900;;1E900 +1E923;ADLAM SMALL LETTER DAALI;Ll;0;R;;;;;N;;;1E901;;1E901 +1E924;ADLAM SMALL LETTER LAAM;Ll;0;R;;;;;N;;;1E902;;1E902 +1E925;ADLAM SMALL LETTER MIIM;Ll;0;R;;;;;N;;;1E903;;1E903 +1E926;ADLAM SMALL LETTER BA;Ll;0;R;;;;;N;;;1E904;;1E904 +1E927;ADLAM SMALL LETTER SINNYIIYHE;Ll;0;R;;;;;N;;;1E905;;1E905 +1E928;ADLAM SMALL LETTER PE;Ll;0;R;;;;;N;;;1E906;;1E906 +1E929;ADLAM SMALL LETTER BHE;Ll;0;R;;;;;N;;;1E907;;1E907 +1E92A;ADLAM SMALL LETTER RA;Ll;0;R;;;;;N;;;1E908;;1E908 +1E92B;ADLAM SMALL LETTER E;Ll;0;R;;;;;N;;;1E909;;1E909 +1E92C;ADLAM SMALL LETTER FA;Ll;0;R;;;;;N;;;1E90A;;1E90A +1E92D;ADLAM SMALL LETTER I;Ll;0;R;;;;;N;;;1E90B;;1E90B +1E92E;ADLAM SMALL LETTER O;Ll;0;R;;;;;N;;;1E90C;;1E90C +1E92F;ADLAM SMALL LETTER DHA;Ll;0;R;;;;;N;;;1E90D;;1E90D +1E930;ADLAM SMALL LETTER YHE;Ll;0;R;;;;;N;;;1E90E;;1E90E +1E931;ADLAM SMALL LETTER WAW;Ll;0;R;;;;;N;;;1E90F;;1E90F +1E932;ADLAM SMALL LETTER NUN;Ll;0;R;;;;;N;;;1E910;;1E910 +1E933;ADLAM SMALL LETTER KAF;Ll;0;R;;;;;N;;;1E911;;1E911 +1E934;ADLAM SMALL LETTER YA;Ll;0;R;;;;;N;;;1E912;;1E912 +1E935;ADLAM SMALL LETTER U;Ll;0;R;;;;;N;;;1E913;;1E913 +1E936;ADLAM SMALL LETTER JIIM;Ll;0;R;;;;;N;;;1E914;;1E914 +1E937;ADLAM SMALL LETTER CHI;Ll;0;R;;;;;N;;;1E915;;1E915 +1E938;ADLAM SMALL LETTER HA;Ll;0;R;;;;;N;;;1E916;;1E916 +1E939;ADLAM SMALL LETTER QAAF;Ll;0;R;;;;;N;;;1E917;;1E917 +1E93A;ADLAM SMALL LETTER GA;Ll;0;R;;;;;N;;;1E918;;1E918 +1E93B;ADLAM SMALL LETTER NYA;Ll;0;R;;;;;N;;;1E919;;1E919 +1E93C;ADLAM SMALL LETTER TU;Ll;0;R;;;;;N;;;1E91A;;1E91A +1E93D;ADLAM SMALL LETTER NHA;Ll;0;R;;;;;N;;;1E91B;;1E91B +1E93E;ADLAM SMALL LETTER VA;Ll;0;R;;;;;N;;;1E91C;;1E91C +1E93F;ADLAM SMALL LETTER KHA;Ll;0;R;;;;;N;;;1E91D;;1E91D +1E940;ADLAM SMALL LETTER GBE;Ll;0;R;;;;;N;;;1E91E;;1E91E +1E941;ADLAM SMALL LETTER ZAL;Ll;0;R;;;;;N;;;1E91F;;1E91F +1E942;ADLAM SMALL LETTER KPO;Ll;0;R;;;;;N;;;1E920;;1E920 +1E943;ADLAM SMALL LETTER SHA;Ll;0;R;;;;;N;;;1E921;;1E921 +1E944;ADLAM ALIF LENGTHENER;Mn;230;NSM;;;;;N;;;;; +1E945;ADLAM VOWEL LENGTHENER;Mn;230;NSM;;;;;N;;;;; +1E946;ADLAM GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1E947;ADLAM HAMZA;Mn;230;NSM;;;;;N;;;;; +1E948;ADLAM CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;; +1E949;ADLAM GEMINATE CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;; +1E94A;ADLAM NUKTA;Mn;7;NSM;;;;;N;;;;; +1E94B;ADLAM NASALIZATION MARK;Lm;0;R;;;;;N;;;;; +1E950;ADLAM DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +1E951;ADLAM DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +1E952;ADLAM DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +1E953;ADLAM DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +1E954;ADLAM DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +1E955;ADLAM DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +1E956;ADLAM DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +1E957;ADLAM DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +1E958;ADLAM DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +1E959;ADLAM DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +1E95E;ADLAM INITIAL EXCLAMATION MARK;Po;0;R;;;;;N;;;;; +1E95F;ADLAM INITIAL QUESTION MARK;Po;0;R;;;;;N;;;;; +1EC71;INDIC SIYAQ NUMBER ONE;No;0;AL;;;;1;N;;;;; +1EC72;INDIC SIYAQ NUMBER TWO;No;0;AL;;;;2;N;;;;; +1EC73;INDIC SIYAQ NUMBER THREE;No;0;AL;;;;3;N;;;;; +1EC74;INDIC SIYAQ NUMBER FOUR;No;0;AL;;;;4;N;;;;; +1EC75;INDIC SIYAQ NUMBER FIVE;No;0;AL;;;;5;N;;;;; +1EC76;INDIC SIYAQ NUMBER SIX;No;0;AL;;;;6;N;;;;; +1EC77;INDIC SIYAQ NUMBER SEVEN;No;0;AL;;;;7;N;;;;; +1EC78;INDIC SIYAQ NUMBER EIGHT;No;0;AL;;;;8;N;;;;; +1EC79;INDIC SIYAQ NUMBER NINE;No;0;AL;;;;9;N;;;;; +1EC7A;INDIC SIYAQ NUMBER TEN;No;0;AL;;;;10;N;;;;; +1EC7B;INDIC SIYAQ NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +1EC7C;INDIC SIYAQ NUMBER THIRTY;No;0;AL;;;;30;N;;;;; +1EC7D;INDIC SIYAQ NUMBER FORTY;No;0;AL;;;;40;N;;;;; +1EC7E;INDIC SIYAQ NUMBER FIFTY;No;0;AL;;;;50;N;;;;; +1EC7F;INDIC SIYAQ NUMBER SIXTY;No;0;AL;;;;60;N;;;;; +1EC80;INDIC SIYAQ NUMBER SEVENTY;No;0;AL;;;;70;N;;;;; +1EC81;INDIC SIYAQ NUMBER EIGHTY;No;0;AL;;;;80;N;;;;; +1EC82;INDIC SIYAQ NUMBER NINETY;No;0;AL;;;;90;N;;;;; +1EC83;INDIC SIYAQ NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +1EC84;INDIC SIYAQ NUMBER TWO HUNDRED;No;0;AL;;;;200;N;;;;; +1EC85;INDIC SIYAQ NUMBER THREE HUNDRED;No;0;AL;;;;300;N;;;;; +1EC86;INDIC SIYAQ NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;; +1EC87;INDIC SIYAQ NUMBER FIVE HUNDRED;No;0;AL;;;;500;N;;;;; +1EC88;INDIC SIYAQ NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;; +1EC89;INDIC SIYAQ NUMBER SEVEN HUNDRED;No;0;AL;;;;700;N;;;;; +1EC8A;INDIC SIYAQ NUMBER EIGHT HUNDRED;No;0;AL;;;;800;N;;;;; +1EC8B;INDIC SIYAQ NUMBER NINE HUNDRED;No;0;AL;;;;900;N;;;;; +1EC8C;INDIC SIYAQ NUMBER ONE THOUSAND;No;0;AL;;;;1000;N;;;;; +1EC8D;INDIC SIYAQ NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;; +1EC8E;INDIC SIYAQ NUMBER THREE THOUSAND;No;0;AL;;;;3000;N;;;;; +1EC8F;INDIC SIYAQ NUMBER FOUR THOUSAND;No;0;AL;;;;4000;N;;;;; +1EC90;INDIC SIYAQ NUMBER FIVE THOUSAND;No;0;AL;;;;5000;N;;;;; +1EC91;INDIC SIYAQ NUMBER SIX THOUSAND;No;0;AL;;;;6000;N;;;;; +1EC92;INDIC SIYAQ NUMBER SEVEN THOUSAND;No;0;AL;;;;7000;N;;;;; +1EC93;INDIC SIYAQ NUMBER EIGHT THOUSAND;No;0;AL;;;;8000;N;;;;; +1EC94;INDIC SIYAQ NUMBER NINE THOUSAND;No;0;AL;;;;9000;N;;;;; +1EC95;INDIC SIYAQ NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1EC96;INDIC SIYAQ NUMBER TWENTY THOUSAND;No;0;AL;;;;20000;N;;;;; +1EC97;INDIC SIYAQ NUMBER THIRTY THOUSAND;No;0;AL;;;;30000;N;;;;; +1EC98;INDIC SIYAQ NUMBER FORTY THOUSAND;No;0;AL;;;;40000;N;;;;; +1EC99;INDIC SIYAQ NUMBER FIFTY THOUSAND;No;0;AL;;;;50000;N;;;;; +1EC9A;INDIC SIYAQ NUMBER SIXTY THOUSAND;No;0;AL;;;;60000;N;;;;; +1EC9B;INDIC SIYAQ NUMBER SEVENTY THOUSAND;No;0;AL;;;;70000;N;;;;; +1EC9C;INDIC SIYAQ NUMBER EIGHTY THOUSAND;No;0;AL;;;;80000;N;;;;; +1EC9D;INDIC SIYAQ NUMBER NINETY THOUSAND;No;0;AL;;;;90000;N;;;;; +1EC9E;INDIC SIYAQ NUMBER LAKH;No;0;AL;;;;100000;N;;;;; +1EC9F;INDIC SIYAQ NUMBER LAKHAN;No;0;AL;;;;200000;N;;;;; +1ECA0;INDIC SIYAQ LAKH MARK;No;0;AL;;;;100000;N;;;;; +1ECA1;INDIC SIYAQ NUMBER KAROR;No;0;AL;;;;10000000;N;;;;; +1ECA2;INDIC SIYAQ NUMBER KARORAN;No;0;AL;;;;20000000;N;;;;; +1ECA3;INDIC SIYAQ NUMBER PREFIXED ONE;No;0;AL;;;;1;N;;;;; +1ECA4;INDIC SIYAQ NUMBER PREFIXED TWO;No;0;AL;;;;2;N;;;;; +1ECA5;INDIC SIYAQ NUMBER PREFIXED THREE;No;0;AL;;;;3;N;;;;; +1ECA6;INDIC SIYAQ NUMBER PREFIXED FOUR;No;0;AL;;;;4;N;;;;; +1ECA7;INDIC SIYAQ NUMBER PREFIXED FIVE;No;0;AL;;;;5;N;;;;; +1ECA8;INDIC SIYAQ NUMBER PREFIXED SIX;No;0;AL;;;;6;N;;;;; +1ECA9;INDIC SIYAQ NUMBER PREFIXED SEVEN;No;0;AL;;;;7;N;;;;; +1ECAA;INDIC SIYAQ NUMBER PREFIXED EIGHT;No;0;AL;;;;8;N;;;;; +1ECAB;INDIC SIYAQ NUMBER PREFIXED NINE;No;0;AL;;;;9;N;;;;; +1ECAC;INDIC SIYAQ PLACEHOLDER;So;0;AL;;;;;N;;;;; +1ECAD;INDIC SIYAQ FRACTION ONE QUARTER;No;0;AL;;;;1/4;N;;;;; +1ECAE;INDIC SIYAQ FRACTION ONE HALF;No;0;AL;;;;1/2;N;;;;; +1ECAF;INDIC SIYAQ FRACTION THREE QUARTERS;No;0;AL;;;;3/4;N;;;;; +1ECB0;INDIC SIYAQ RUPEE MARK;Sc;0;AL;;;;;N;;;;; +1ECB1;INDIC SIYAQ NUMBER ALTERNATE ONE;No;0;AL;;;;1;N;;;;; +1ECB2;INDIC SIYAQ NUMBER ALTERNATE TWO;No;0;AL;;;;2;N;;;;; +1ECB3;INDIC SIYAQ NUMBER ALTERNATE TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1ECB4;INDIC SIYAQ ALTERNATE LAKH MARK;No;0;AL;;;;100000;N;;;;; +1ED01;OTTOMAN SIYAQ NUMBER ONE;No;0;AL;;;;1;N;;;;; +1ED02;OTTOMAN SIYAQ NUMBER TWO;No;0;AL;;;;2;N;;;;; +1ED03;OTTOMAN SIYAQ NUMBER THREE;No;0;AL;;;;3;N;;;;; +1ED04;OTTOMAN SIYAQ NUMBER FOUR;No;0;AL;;;;4;N;;;;; +1ED05;OTTOMAN SIYAQ NUMBER FIVE;No;0;AL;;;;5;N;;;;; +1ED06;OTTOMAN SIYAQ NUMBER SIX;No;0;AL;;;;6;N;;;;; +1ED07;OTTOMAN SIYAQ NUMBER SEVEN;No;0;AL;;;;7;N;;;;; +1ED08;OTTOMAN SIYAQ NUMBER EIGHT;No;0;AL;;;;8;N;;;;; +1ED09;OTTOMAN SIYAQ NUMBER NINE;No;0;AL;;;;9;N;;;;; +1ED0A;OTTOMAN SIYAQ NUMBER TEN;No;0;AL;;;;10;N;;;;; +1ED0B;OTTOMAN SIYAQ NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +1ED0C;OTTOMAN SIYAQ NUMBER THIRTY;No;0;AL;;;;30;N;;;;; +1ED0D;OTTOMAN SIYAQ NUMBER FORTY;No;0;AL;;;;40;N;;;;; +1ED0E;OTTOMAN SIYAQ NUMBER FIFTY;No;0;AL;;;;50;N;;;;; +1ED0F;OTTOMAN SIYAQ NUMBER SIXTY;No;0;AL;;;;60;N;;;;; +1ED10;OTTOMAN SIYAQ NUMBER SEVENTY;No;0;AL;;;;70;N;;;;; +1ED11;OTTOMAN SIYAQ NUMBER EIGHTY;No;0;AL;;;;80;N;;;;; +1ED12;OTTOMAN SIYAQ NUMBER NINETY;No;0;AL;;;;90;N;;;;; +1ED13;OTTOMAN SIYAQ NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +1ED14;OTTOMAN SIYAQ NUMBER TWO HUNDRED;No;0;AL;;;;200;N;;;;; +1ED15;OTTOMAN SIYAQ NUMBER THREE HUNDRED;No;0;AL;;;;300;N;;;;; +1ED16;OTTOMAN SIYAQ NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;; +1ED17;OTTOMAN SIYAQ NUMBER FIVE HUNDRED;No;0;AL;;;;500;N;;;;; +1ED18;OTTOMAN SIYAQ NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;; +1ED19;OTTOMAN SIYAQ NUMBER SEVEN HUNDRED;No;0;AL;;;;700;N;;;;; +1ED1A;OTTOMAN SIYAQ NUMBER EIGHT HUNDRED;No;0;AL;;;;800;N;;;;; +1ED1B;OTTOMAN SIYAQ NUMBER NINE HUNDRED;No;0;AL;;;;900;N;;;;; +1ED1C;OTTOMAN SIYAQ NUMBER ONE THOUSAND;No;0;AL;;;;1000;N;;;;; +1ED1D;OTTOMAN SIYAQ NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;; +1ED1E;OTTOMAN SIYAQ NUMBER THREE THOUSAND;No;0;AL;;;;3000;N;;;;; +1ED1F;OTTOMAN SIYAQ NUMBER FOUR THOUSAND;No;0;AL;;;;4000;N;;;;; +1ED20;OTTOMAN SIYAQ NUMBER FIVE THOUSAND;No;0;AL;;;;5000;N;;;;; +1ED21;OTTOMAN SIYAQ NUMBER SIX THOUSAND;No;0;AL;;;;6000;N;;;;; +1ED22;OTTOMAN SIYAQ NUMBER SEVEN THOUSAND;No;0;AL;;;;7000;N;;;;; +1ED23;OTTOMAN SIYAQ NUMBER EIGHT THOUSAND;No;0;AL;;;;8000;N;;;;; +1ED24;OTTOMAN SIYAQ NUMBER NINE THOUSAND;No;0;AL;;;;9000;N;;;;; +1ED25;OTTOMAN SIYAQ NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1ED26;OTTOMAN SIYAQ NUMBER TWENTY THOUSAND;No;0;AL;;;;20000;N;;;;; +1ED27;OTTOMAN SIYAQ NUMBER THIRTY THOUSAND;No;0;AL;;;;30000;N;;;;; +1ED28;OTTOMAN SIYAQ NUMBER FORTY THOUSAND;No;0;AL;;;;40000;N;;;;; +1ED29;OTTOMAN SIYAQ NUMBER FIFTY THOUSAND;No;0;AL;;;;50000;N;;;;; +1ED2A;OTTOMAN SIYAQ NUMBER SIXTY THOUSAND;No;0;AL;;;;60000;N;;;;; +1ED2B;OTTOMAN SIYAQ NUMBER SEVENTY THOUSAND;No;0;AL;;;;70000;N;;;;; +1ED2C;OTTOMAN SIYAQ NUMBER EIGHTY THOUSAND;No;0;AL;;;;80000;N;;;;; +1ED2D;OTTOMAN SIYAQ NUMBER NINETY THOUSAND;No;0;AL;;;;90000;N;;;;; +1ED2E;OTTOMAN SIYAQ MARRATAN;So;0;AL;;;;;N;;;;; +1ED2F;OTTOMAN SIYAQ ALTERNATE NUMBER TWO;No;0;AL;;;;2;N;;;;; +1ED30;OTTOMAN SIYAQ ALTERNATE NUMBER THREE;No;0;AL;;;;3;N;;;;; +1ED31;OTTOMAN SIYAQ ALTERNATE NUMBER FOUR;No;0;AL;;;;4;N;;;;; +1ED32;OTTOMAN SIYAQ ALTERNATE NUMBER FIVE;No;0;AL;;;;5;N;;;;; +1ED33;OTTOMAN SIYAQ ALTERNATE NUMBER SIX;No;0;AL;;;;6;N;;;;; +1ED34;OTTOMAN SIYAQ ALTERNATE NUMBER SEVEN;No;0;AL;;;;7;N;;;;; +1ED35;OTTOMAN SIYAQ ALTERNATE NUMBER EIGHT;No;0;AL;;;;8;N;;;;; +1ED36;OTTOMAN SIYAQ ALTERNATE NUMBER NINE;No;0;AL;;;;9;N;;;;; +1ED37;OTTOMAN SIYAQ ALTERNATE NUMBER TEN;No;0;AL;;;;10;N;;;;; +1ED38;OTTOMAN SIYAQ ALTERNATE NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;; +1ED39;OTTOMAN SIYAQ ALTERNATE NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;; +1ED3A;OTTOMAN SIYAQ ALTERNATE NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;; +1ED3B;OTTOMAN SIYAQ ALTERNATE NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1ED3C;OTTOMAN SIYAQ FRACTION ONE HALF;No;0;AL;;;;1/2;N;;;;; +1ED3D;OTTOMAN SIYAQ FRACTION ONE SIXTH;No;0;AL;;;;1/6;N;;;;; +1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL; 0627;;;;N;;;;; +1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE03;ARABIC MATHEMATICAL DAL;Lo;0;AL; 062F;;;;N;;;;; +1EE05;ARABIC MATHEMATICAL WAW;Lo;0;AL; 0648;;;;N;;;;; +1EE06;ARABIC MATHEMATICAL ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EE07;ARABIC MATHEMATICAL HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE08;ARABIC MATHEMATICAL TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE09;ARABIC MATHEMATICAL YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE0A;ARABIC MATHEMATICAL KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE0B;ARABIC MATHEMATICAL LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE0C;ARABIC MATHEMATICAL MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE0D;ARABIC MATHEMATICAL NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE0E;ARABIC MATHEMATICAL SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE0F;ARABIC MATHEMATICAL AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE10;ARABIC MATHEMATICAL FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE11;ARABIC MATHEMATICAL SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE12;ARABIC MATHEMATICAL QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE13;ARABIC MATHEMATICAL REH;Lo;0;AL; 0631;;;;N;;;;; +1EE14;ARABIC MATHEMATICAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE15;ARABIC MATHEMATICAL TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE16;ARABIC MATHEMATICAL THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE17;ARABIC MATHEMATICAL KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE18;ARABIC MATHEMATICAL THAL;Lo;0;AL; 0630;;;;N;;;;; +1EE19;ARABIC MATHEMATICAL DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE1A;ARABIC MATHEMATICAL ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE1B;ARABIC MATHEMATICAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE1C;ARABIC MATHEMATICAL DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; +1EE1D;ARABIC MATHEMATICAL DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; +1EE1E;ARABIC MATHEMATICAL DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; +1EE1F;ARABIC MATHEMATICAL DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; +1EE21;ARABIC MATHEMATICAL INITIAL BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE22;ARABIC MATHEMATICAL INITIAL JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE24;ARABIC MATHEMATICAL INITIAL HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE27;ARABIC MATHEMATICAL INITIAL HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE29;ARABIC MATHEMATICAL INITIAL YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE2A;ARABIC MATHEMATICAL INITIAL KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE2B;ARABIC MATHEMATICAL INITIAL LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE2C;ARABIC MATHEMATICAL INITIAL MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE2D;ARABIC MATHEMATICAL INITIAL NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE2E;ARABIC MATHEMATICAL INITIAL SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE2F;ARABIC MATHEMATICAL INITIAL AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE30;ARABIC MATHEMATICAL INITIAL FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE31;ARABIC MATHEMATICAL INITIAL SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE32;ARABIC MATHEMATICAL INITIAL QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE34;ARABIC MATHEMATICAL INITIAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE35;ARABIC MATHEMATICAL INITIAL TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE36;ARABIC MATHEMATICAL INITIAL THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE37;ARABIC MATHEMATICAL INITIAL KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE39;ARABIC MATHEMATICAL INITIAL DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE3B;ARABIC MATHEMATICAL INITIAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE42;ARABIC MATHEMATICAL TAILED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE47;ARABIC MATHEMATICAL TAILED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE49;ARABIC MATHEMATICAL TAILED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE4B;ARABIC MATHEMATICAL TAILED LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE4D;ARABIC MATHEMATICAL TAILED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE4E;ARABIC MATHEMATICAL TAILED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE4F;ARABIC MATHEMATICAL TAILED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE51;ARABIC MATHEMATICAL TAILED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE52;ARABIC MATHEMATICAL TAILED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE54;ARABIC MATHEMATICAL TAILED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE57;ARABIC MATHEMATICAL TAILED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE59;ARABIC MATHEMATICAL TAILED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE5B;ARABIC MATHEMATICAL TAILED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE5D;ARABIC MATHEMATICAL TAILED DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; +1EE5F;ARABIC MATHEMATICAL TAILED DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; +1EE61;ARABIC MATHEMATICAL STRETCHED BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE62;ARABIC MATHEMATICAL STRETCHED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE64;ARABIC MATHEMATICAL STRETCHED HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE67;ARABIC MATHEMATICAL STRETCHED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE68;ARABIC MATHEMATICAL STRETCHED TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE69;ARABIC MATHEMATICAL STRETCHED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE6A;ARABIC MATHEMATICAL STRETCHED KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE6C;ARABIC MATHEMATICAL STRETCHED MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE6D;ARABIC MATHEMATICAL STRETCHED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE6E;ARABIC MATHEMATICAL STRETCHED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE6F;ARABIC MATHEMATICAL STRETCHED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE70;ARABIC MATHEMATICAL STRETCHED FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE71;ARABIC MATHEMATICAL STRETCHED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE72;ARABIC MATHEMATICAL STRETCHED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE74;ARABIC MATHEMATICAL STRETCHED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE75;ARABIC MATHEMATICAL STRETCHED TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE76;ARABIC MATHEMATICAL STRETCHED THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE77;ARABIC MATHEMATICAL STRETCHED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE79;ARABIC MATHEMATICAL STRETCHED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE7A;ARABIC MATHEMATICAL STRETCHED ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE7B;ARABIC MATHEMATICAL STRETCHED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE7C;ARABIC MATHEMATICAL STRETCHED DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; +1EE7E;ARABIC MATHEMATICAL STRETCHED DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; +1EE80;ARABIC MATHEMATICAL LOOPED ALEF;Lo;0;AL; 0627;;;;N;;;;; +1EE81;ARABIC MATHEMATICAL LOOPED BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE82;ARABIC MATHEMATICAL LOOPED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE83;ARABIC MATHEMATICAL LOOPED DAL;Lo;0;AL; 062F;;;;N;;;;; +1EE84;ARABIC MATHEMATICAL LOOPED HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE85;ARABIC MATHEMATICAL LOOPED WAW;Lo;0;AL; 0648;;;;N;;;;; +1EE86;ARABIC MATHEMATICAL LOOPED ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EE87;ARABIC MATHEMATICAL LOOPED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE88;ARABIC MATHEMATICAL LOOPED TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE89;ARABIC MATHEMATICAL LOOPED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE8B;ARABIC MATHEMATICAL LOOPED LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE8C;ARABIC MATHEMATICAL LOOPED MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE8D;ARABIC MATHEMATICAL LOOPED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE8E;ARABIC MATHEMATICAL LOOPED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE8F;ARABIC MATHEMATICAL LOOPED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE90;ARABIC MATHEMATICAL LOOPED FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE91;ARABIC MATHEMATICAL LOOPED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE92;ARABIC MATHEMATICAL LOOPED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE93;ARABIC MATHEMATICAL LOOPED REH;Lo;0;AL; 0631;;;;N;;;;; +1EE94;ARABIC MATHEMATICAL LOOPED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE95;ARABIC MATHEMATICAL LOOPED TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE96;ARABIC MATHEMATICAL LOOPED THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE97;ARABIC MATHEMATICAL LOOPED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE98;ARABIC MATHEMATICAL LOOPED THAL;Lo;0;AL; 0630;;;;N;;;;; +1EE99;ARABIC MATHEMATICAL LOOPED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE9A;ARABIC MATHEMATICAL LOOPED ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE9B;ARABIC MATHEMATICAL LOOPED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EEA1;ARABIC MATHEMATICAL DOUBLE-STRUCK BEH;Lo;0;AL; 0628;;;;N;;;;; +1EEA2;ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EEA3;ARABIC MATHEMATICAL DOUBLE-STRUCK DAL;Lo;0;AL; 062F;;;;N;;;;; +1EEA5;ARABIC MATHEMATICAL DOUBLE-STRUCK WAW;Lo;0;AL; 0648;;;;N;;;;; +1EEA6;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EEA7;ARABIC MATHEMATICAL DOUBLE-STRUCK HAH;Lo;0;AL; 062D;;;;N;;;;; +1EEA8;ARABIC MATHEMATICAL DOUBLE-STRUCK TAH;Lo;0;AL; 0637;;;;N;;;;; +1EEA9;ARABIC MATHEMATICAL DOUBLE-STRUCK YEH;Lo;0;AL; 064A;;;;N;;;;; +1EEAB;ARABIC MATHEMATICAL DOUBLE-STRUCK LAM;Lo;0;AL; 0644;;;;N;;;;; +1EEAC;ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EEAD;ARABIC MATHEMATICAL DOUBLE-STRUCK NOON;Lo;0;AL; 0646;;;;N;;;;; +1EEAE;ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EEAF;ARABIC MATHEMATICAL DOUBLE-STRUCK AIN;Lo;0;AL; 0639;;;;N;;;;; +1EEB0;ARABIC MATHEMATICAL DOUBLE-STRUCK FEH;Lo;0;AL; 0641;;;;N;;;;; +1EEB1;ARABIC MATHEMATICAL DOUBLE-STRUCK SAD;Lo;0;AL; 0635;;;;N;;;;; +1EEB2;ARABIC MATHEMATICAL DOUBLE-STRUCK QAF;Lo;0;AL; 0642;;;;N;;;;; +1EEB3;ARABIC MATHEMATICAL DOUBLE-STRUCK REH;Lo;0;AL; 0631;;;;N;;;;; +1EEB4;ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EEB5;ARABIC MATHEMATICAL DOUBLE-STRUCK TEH;Lo;0;AL; 062A;;;;N;;;;; +1EEB6;ARABIC MATHEMATICAL DOUBLE-STRUCK THEH;Lo;0;AL; 062B;;;;N;;;;; +1EEB7;ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EEB8;ARABIC MATHEMATICAL DOUBLE-STRUCK THAL;Lo;0;AL; 0630;;;;N;;;;; +1EEB9;ARABIC MATHEMATICAL DOUBLE-STRUCK DAD;Lo;0;AL; 0636;;;;N;;;;; +1EEBA;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EEBB;ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EEF0;ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL;Sm;0;ON;;;;;N;;;;; +1EEF1;ARABIC MATHEMATICAL OPERATOR HAH WITH DAL;Sm;0;ON;;;;;N;;;;; +1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; +1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; +1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; +1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; +1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; +1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; +1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; +1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; +1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; +1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; +1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; +1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; +1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; +1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; +1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; +1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; +1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; +1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; +1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; +1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; +1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; +1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; +1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; +1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; +1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; +1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; +1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; +1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; +1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; +1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; +1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; +1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; +1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; +1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; +1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; +1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; +1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; +1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; +1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; +1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; +1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; +1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; +1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; +1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; +1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; +1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; +1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; +1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; +1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; +1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; +1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; +1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; +1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; +1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; +1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; +1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; +1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; +1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; +1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; +1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; +1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; +1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; +1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; +1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; +1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; +1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; +1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; +1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; +1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; +1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; +1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; +1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; +1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; +1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; +1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; +1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; +1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; +1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; +1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; +1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; +1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; +1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; +1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; +1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; +1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; +1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; +1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; +1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; +1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; +1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; +1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; +1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; +1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; +1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; +1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; +1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; +1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; +1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; +1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; +1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; +1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; +1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; +1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; +1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; +1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; +1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; +1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; +1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; +1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; +1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; +1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; +1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; +1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; +1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; +1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; +1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; +1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; +1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; +1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; +1F0A0;PLAYING CARD BACK;So;0;ON;;;;;N;;;;; +1F0A1;PLAYING CARD ACE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A2;PLAYING CARD TWO OF SPADES;So;0;ON;;;;;N;;;;; +1F0A3;PLAYING CARD THREE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A4;PLAYING CARD FOUR OF SPADES;So;0;ON;;;;;N;;;;; +1F0A5;PLAYING CARD FIVE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A6;PLAYING CARD SIX OF SPADES;So;0;ON;;;;;N;;;;; +1F0A7;PLAYING CARD SEVEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0A8;PLAYING CARD EIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0A9;PLAYING CARD NINE OF SPADES;So;0;ON;;;;;N;;;;; +1F0AA;PLAYING CARD TEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AB;PLAYING CARD JACK OF SPADES;So;0;ON;;;;;N;;;;; +1F0AC;PLAYING CARD KNIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0AD;PLAYING CARD QUEEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AE;PLAYING CARD KING OF SPADES;So;0;ON;;;;;N;;;;; +1F0B1;PLAYING CARD ACE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B2;PLAYING CARD TWO OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B3;PLAYING CARD THREE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B4;PLAYING CARD FOUR OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B5;PLAYING CARD FIVE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B6;PLAYING CARD SIX OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B7;PLAYING CARD SEVEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B8;PLAYING CARD EIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B9;PLAYING CARD NINE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BA;PLAYING CARD TEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BB;PLAYING CARD JACK OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BC;PLAYING CARD KNIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BD;PLAYING CARD QUEEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BE;PLAYING CARD KING OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BF;PLAYING CARD RED JOKER;So;0;ON;;;;;N;;;;; +1F0C1;PLAYING CARD ACE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C2;PLAYING CARD TWO OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C3;PLAYING CARD THREE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C4;PLAYING CARD FOUR OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C5;PLAYING CARD FIVE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C6;PLAYING CARD SIX OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C7;PLAYING CARD SEVEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C8;PLAYING CARD EIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C9;PLAYING CARD NINE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CA;PLAYING CARD TEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CB;PLAYING CARD JACK OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CC;PLAYING CARD KNIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CD;PLAYING CARD QUEEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CE;PLAYING CARD KING OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CF;PLAYING CARD BLACK JOKER;So;0;ON;;;;;N;;;;; +1F0D1;PLAYING CARD ACE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D2;PLAYING CARD TWO OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D3;PLAYING CARD THREE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D4;PLAYING CARD FOUR OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D5;PLAYING CARD FIVE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D6;PLAYING CARD SIX OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D7;PLAYING CARD SEVEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D8;PLAYING CARD EIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D9;PLAYING CARD NINE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DA;PLAYING CARD TEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DB;PLAYING CARD JACK OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DC;PLAYING CARD KNIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DD;PLAYING CARD QUEEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DE;PLAYING CARD KING OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DF;PLAYING CARD WHITE JOKER;So;0;ON;;;;;N;;;;; +1F0E0;PLAYING CARD FOOL;So;0;ON;;;;;N;;;;; +1F0E1;PLAYING CARD TRUMP-1;So;0;ON;;;;;N;;;;; +1F0E2;PLAYING CARD TRUMP-2;So;0;ON;;;;;N;;;;; +1F0E3;PLAYING CARD TRUMP-3;So;0;ON;;;;;N;;;;; +1F0E4;PLAYING CARD TRUMP-4;So;0;ON;;;;;N;;;;; +1F0E5;PLAYING CARD TRUMP-5;So;0;ON;;;;;N;;;;; +1F0E6;PLAYING CARD TRUMP-6;So;0;ON;;;;;N;;;;; +1F0E7;PLAYING CARD TRUMP-7;So;0;ON;;;;;N;;;;; +1F0E8;PLAYING CARD TRUMP-8;So;0;ON;;;;;N;;;;; +1F0E9;PLAYING CARD TRUMP-9;So;0;ON;;;;;N;;;;; +1F0EA;PLAYING CARD TRUMP-10;So;0;ON;;;;;N;;;;; +1F0EB;PLAYING CARD TRUMP-11;So;0;ON;;;;;N;;;;; +1F0EC;PLAYING CARD TRUMP-12;So;0;ON;;;;;N;;;;; +1F0ED;PLAYING CARD TRUMP-13;So;0;ON;;;;;N;;;;; +1F0EE;PLAYING CARD TRUMP-14;So;0;ON;;;;;N;;;;; +1F0EF;PLAYING CARD TRUMP-15;So;0;ON;;;;;N;;;;; +1F0F0;PLAYING CARD TRUMP-16;So;0;ON;;;;;N;;;;; +1F0F1;PLAYING CARD TRUMP-17;So;0;ON;;;;;N;;;;; +1F0F2;PLAYING CARD TRUMP-18;So;0;ON;;;;;N;;;;; +1F0F3;PLAYING CARD TRUMP-19;So;0;ON;;;;;N;;;;; +1F0F4;PLAYING CARD TRUMP-20;So;0;ON;;;;;N;;;;; +1F0F5;PLAYING CARD TRUMP-21;So;0;ON;;;;;N;;;;; +1F100;DIGIT ZERO FULL STOP;No;0;EN; 0030 002E;;0;0;N;;;;; +1F101;DIGIT ZERO COMMA;No;0;EN; 0030 002C;;0;0;N;;;;; +1F102;DIGIT ONE COMMA;No;0;EN; 0031 002C;;1;1;N;;;;; +1F103;DIGIT TWO COMMA;No;0;EN; 0032 002C;;2;2;N;;;;; +1F104;DIGIT THREE COMMA;No;0;EN; 0033 002C;;3;3;N;;;;; +1F105;DIGIT FOUR COMMA;No;0;EN; 0034 002C;;4;4;N;;;;; +1F106;DIGIT FIVE COMMA;No;0;EN; 0035 002C;;5;5;N;;;;; +1F107;DIGIT SIX COMMA;No;0;EN; 0036 002C;;6;6;N;;;;; +1F108;DIGIT SEVEN COMMA;No;0;EN; 0037 002C;;7;7;N;;;;; +1F109;DIGIT EIGHT COMMA;No;0;EN; 0038 002C;;8;8;N;;;;; +1F10A;DIGIT NINE COMMA;No;0;EN; 0039 002C;;9;9;N;;;;; +1F10B;DINGBAT CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F10C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F10D;CIRCLED ZERO WITH SLASH;So;0;ON;;;;;N;;;;; +1F10E;CIRCLED ANTICLOCKWISE ARROW;So;0;ON;;;;;N;;;;; +1F10F;CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH;So;0;ON;;;;;N;;;;; +1F110;PARENTHESIZED LATIN CAPITAL LETTER A;So;0;L; 0028 0041 0029;;;;N;;;;; +1F111;PARENTHESIZED LATIN CAPITAL LETTER B;So;0;L; 0028 0042 0029;;;;N;;;;; +1F112;PARENTHESIZED LATIN CAPITAL LETTER C;So;0;L; 0028 0043 0029;;;;N;;;;; +1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L; 0028 0044 0029;;;;N;;;;; +1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L; 0028 0045 0029;;;;N;;;;; +1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L; 0028 0046 0029;;;;N;;;;; +1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L; 0028 0047 0029;;;;N;;;;; +1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L; 0028 0048 0029;;;;N;;;;; +1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L; 0028 0049 0029;;;;N;;;;; +1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L; 0028 004A 0029;;;;N;;;;; +1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L; 0028 004B 0029;;;;N;;;;; +1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L; 0028 004C 0029;;;;N;;;;; +1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L; 0028 004D 0029;;;;N;;;;; +1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L; 0028 004E 0029;;;;N;;;;; +1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L; 0028 004F 0029;;;;N;;;;; +1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L; 0028 0050 0029;;;;N;;;;; +1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L; 0028 0051 0029;;;;N;;;;; +1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L; 0028 0052 0029;;;;N;;;;; +1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L; 0028 0053 0029;;;;N;;;;; +1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L; 0028 0054 0029;;;;N;;;;; +1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L; 0028 0055 0029;;;;N;;;;; +1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L; 0028 0056 0029;;;;N;;;;; +1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L; 0028 0057 0029;;;;N;;;;; +1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L; 0028 0058 0029;;;;N;;;;; +1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L; 0028 0059 0029;;;;N;;;;; +1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L; 0028 005A 0029;;;;N;;;;; +1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L; 3014 0053 3015;;;;N;;;;; +1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; +1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; +1F12D;CIRCLED CD;So;0;L; 0043 0044;;;;N;;;;; +1F12E;CIRCLED WZ;So;0;L; 0057 005A;;;;N;;;;; +1F12F;COPYLEFT SYMBOL;So;0;ON;;;;;N;;;;; +1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;; +1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;; +1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; +1F133;SQUARED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;; +1F134;SQUARED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;; +1F135;SQUARED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;; +1F136;SQUARED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;; +1F137;SQUARED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;; +1F138;SQUARED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;; +1F139;SQUARED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;; +1F13A;SQUARED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;; +1F13B;SQUARED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;; +1F13C;SQUARED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;; +1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;; +1F13E;SQUARED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;; +1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;; +1F140;SQUARED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;; +1F141;SQUARED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; +1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;; +1F143;SQUARED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;; +1F144;SQUARED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;; +1F145;SQUARED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;; +1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;; +1F147;SQUARED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;; +1F148;SQUARED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;; +1F149;SQUARED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;; +1F14A;SQUARED HV;So;0;L; 0048 0056;;;;N;;;;; +1F14B;SQUARED MV;So;0;L; 004D 0056;;;;N;;;;; +1F14C;SQUARED SD;So;0;L; 0053 0044;;;;N;;;;; +1F14D;SQUARED SS;So;0;L; 0053 0053;;;;N;;;;; +1F14E;SQUARED PPV;So;0;L; 0050 0050 0056;;;;N;;;;; +1F14F;SQUARED WC;So;0;L; 0057 0043;;;;N;;;;; +1F150;NEGATIVE CIRCLED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F151;NEGATIVE CIRCLED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F152;NEGATIVE CIRCLED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F153;NEGATIVE CIRCLED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F154;NEGATIVE CIRCLED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F155;NEGATIVE CIRCLED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F156;NEGATIVE CIRCLED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F158;NEGATIVE CIRCLED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F159;NEGATIVE CIRCLED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F15A;NEGATIVE CIRCLED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F15B;NEGATIVE CIRCLED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F15C;NEGATIVE CIRCLED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F15D;NEGATIVE CIRCLED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F15E;NEGATIVE CIRCLED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F160;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F161;NEGATIVE CIRCLED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F162;NEGATIVE CIRCLED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F163;NEGATIVE CIRCLED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F164;NEGATIVE CIRCLED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F165;NEGATIVE CIRCLED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F166;NEGATIVE CIRCLED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F167;NEGATIVE CIRCLED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F168;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F16A;RAISED MC SIGN;So;0;ON; 004D 0043;;;;N;;;;; +1F16B;RAISED MD SIGN;So;0;ON; 004D 0044;;;;N;;;;; +1F16C;RAISED MR SIGN;So;0;ON; 004D 0052;;;;N;;;;; +1F16D;CIRCLED CC;So;0;ON;;;;;N;;;;; +1F16E;CIRCLED C WITH OVERLAID BACKSLASH;So;0;ON;;;;;N;;;;; +1F16F;CIRCLED HUMAN FIGURE;So;0;ON;;;;;N;;;;; +1F170;NEGATIVE SQUARED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F171;NEGATIVE SQUARED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F172;NEGATIVE SQUARED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F173;NEGATIVE SQUARED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F174;NEGATIVE SQUARED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F175;NEGATIVE SQUARED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F176;NEGATIVE SQUARED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F177;NEGATIVE SQUARED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F178;NEGATIVE SQUARED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F17A;NEGATIVE SQUARED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F17D;NEGATIVE SQUARED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F17E;NEGATIVE SQUARED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F180;NEGATIVE SQUARED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F181;NEGATIVE SQUARED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F182;NEGATIVE SQUARED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F183;NEGATIVE SQUARED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F184;NEGATIVE SQUARED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F185;NEGATIVE SQUARED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F186;NEGATIVE SQUARED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F187;NEGATIVE SQUARED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F188;NEGATIVE SQUARED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F189;NEGATIVE SQUARED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;; +1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;; +1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;; +1F18E;NEGATIVE SQUARED AB;So;0;L;;;;;N;;;;; +1F18F;NEGATIVE SQUARED WC;So;0;L;;;;;N;;;;; +1F190;SQUARE DJ;So;0;L; 0044 004A;;;;N;;;;; +1F191;SQUARED CL;So;0;L;;;;;N;;;;; +1F192;SQUARED COOL;So;0;L;;;;;N;;;;; +1F193;SQUARED FREE;So;0;L;;;;;N;;;;; +1F194;SQUARED ID;So;0;L;;;;;N;;;;; +1F195;SQUARED NEW;So;0;L;;;;;N;;;;; +1F196;SQUARED NG;So;0;L;;;;;N;;;;; +1F197;SQUARED OK;So;0;L;;;;;N;;;;; +1F198;SQUARED SOS;So;0;L;;;;;N;;;;; +1F199;SQUARED UP WITH EXCLAMATION MARK;So;0;L;;;;;N;;;;; +1F19A;SQUARED VS;So;0;L;;;;;N;;;;; +1F19B;SQUARED THREE D;So;0;L;;;;;N;;;;; +1F19C;SQUARED SECOND SCREEN;So;0;L;;;;;N;;;;; +1F19D;SQUARED TWO K;So;0;L;;;;;N;;;;; +1F19E;SQUARED FOUR K;So;0;L;;;;;N;;;;; +1F19F;SQUARED EIGHT K;So;0;L;;;;;N;;;;; +1F1A0;SQUARED FIVE POINT ONE;So;0;L;;;;;N;;;;; +1F1A1;SQUARED SEVEN POINT ONE;So;0;L;;;;;N;;;;; +1F1A2;SQUARED TWENTY-TWO POINT TWO;So;0;L;;;;;N;;;;; +1F1A3;SQUARED SIXTY P;So;0;L;;;;;N;;;;; +1F1A4;SQUARED ONE HUNDRED TWENTY P;So;0;L;;;;;N;;;;; +1F1A5;SQUARED LATIN SMALL LETTER D;So;0;L;;;;;N;;;;; +1F1A6;SQUARED HC;So;0;L;;;;;N;;;;; +1F1A7;SQUARED HDR;So;0;L;;;;;N;;;;; +1F1A8;SQUARED HI-RES;So;0;L;;;;;N;;;;; +1F1A9;SQUARED LOSSLESS;So;0;L;;;;;N;;;;; +1F1AA;SQUARED SHV;So;0;L;;;;;N;;;;; +1F1AB;SQUARED UHD;So;0;L;;;;;N;;;;; +1F1AC;SQUARED VOD;So;0;L;;;;;N;;;;; +1F1AD;MASK WORK SYMBOL;So;0;ON;;;;;N;;;;; +1F1E6;REGIONAL INDICATOR SYMBOL LETTER A;So;0;L;;;;;N;;;;; +1F1E7;REGIONAL INDICATOR SYMBOL LETTER B;So;0;L;;;;;N;;;;; +1F1E8;REGIONAL INDICATOR SYMBOL LETTER C;So;0;L;;;;;N;;;;; +1F1E9;REGIONAL INDICATOR SYMBOL LETTER D;So;0;L;;;;;N;;;;; +1F1EA;REGIONAL INDICATOR SYMBOL LETTER E;So;0;L;;;;;N;;;;; +1F1EB;REGIONAL INDICATOR SYMBOL LETTER F;So;0;L;;;;;N;;;;; +1F1EC;REGIONAL INDICATOR SYMBOL LETTER G;So;0;L;;;;;N;;;;; +1F1ED;REGIONAL INDICATOR SYMBOL LETTER H;So;0;L;;;;;N;;;;; +1F1EE;REGIONAL INDICATOR SYMBOL LETTER I;So;0;L;;;;;N;;;;; +1F1EF;REGIONAL INDICATOR SYMBOL LETTER J;So;0;L;;;;;N;;;;; +1F1F0;REGIONAL INDICATOR SYMBOL LETTER K;So;0;L;;;;;N;;;;; +1F1F1;REGIONAL INDICATOR SYMBOL LETTER L;So;0;L;;;;;N;;;;; +1F1F2;REGIONAL INDICATOR SYMBOL LETTER M;So;0;L;;;;;N;;;;; +1F1F3;REGIONAL INDICATOR SYMBOL LETTER N;So;0;L;;;;;N;;;;; +1F1F4;REGIONAL INDICATOR SYMBOL LETTER O;So;0;L;;;;;N;;;;; +1F1F5;REGIONAL INDICATOR SYMBOL LETTER P;So;0;L;;;;;N;;;;; +1F1F6;REGIONAL INDICATOR SYMBOL LETTER Q;So;0;L;;;;;N;;;;; +1F1F7;REGIONAL INDICATOR SYMBOL LETTER R;So;0;L;;;;;N;;;;; +1F1F8;REGIONAL INDICATOR SYMBOL LETTER S;So;0;L;;;;;N;;;;; +1F1F9;REGIONAL INDICATOR SYMBOL LETTER T;So;0;L;;;;;N;;;;; +1F1FA;REGIONAL INDICATOR SYMBOL LETTER U;So;0;L;;;;;N;;;;; +1F1FB;REGIONAL INDICATOR SYMBOL LETTER V;So;0;L;;;;;N;;;;; +1F1FC;REGIONAL INDICATOR SYMBOL LETTER W;So;0;L;;;;;N;;;;; +1F1FD;REGIONAL INDICATOR SYMBOL LETTER X;So;0;L;;;;;N;;;;; +1F1FE;REGIONAL INDICATOR SYMBOL LETTER Y;So;0;L;;;;;N;;;;; +1F1FF;REGIONAL INDICATOR SYMBOL LETTER Z;So;0;L;;;;;N;;;;; +1F200;SQUARE HIRAGANA HOKA;So;0;L; 307B 304B;;;;N;;;;; +1F201;SQUARED KATAKANA KOKO;So;0;L; 30B3 30B3;;;;N;;;;; +1F202;SQUARED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; +1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L; 624B;;;;N;;;;; +1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L; 5B57;;;;N;;;;; +1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L; 53CC;;;;N;;;;; +1F213;SQUARED KATAKANA DE;So;0;L; 30C7;;;;N;;;;; +1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 4E8C;;;;N;;;;; +1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L; 591A;;;;N;;;;; +1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L; 89E3;;;;N;;;;; +1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L; 5929;;;;N;;;;; +1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L; 4EA4;;;;N;;;;; +1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L; 6620;;;;N;;;;; +1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L; 7121;;;;N;;;;; +1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L; 6599;;;;N;;;;; +1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L; 524D;;;;N;;;;; +1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L; 5F8C;;;;N;;;;; +1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L; 518D;;;;N;;;;; +1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L; 65B0;;;;N;;;;; +1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L; 521D;;;;N;;;;; +1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L; 7D42;;;;N;;;;; +1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L; 751F;;;;N;;;;; +1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L; 8CA9;;;;N;;;;; +1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L; 58F0;;;;N;;;;; +1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L; 5439;;;;N;;;;; +1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L; 6F14;;;;N;;;;; +1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L; 6295;;;;N;;;;; +1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L; 6355;;;;N;;;;; +1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L; 4E00;;;;N;;;;; +1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 4E09;;;;N;;;;; +1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L; 904A;;;;N;;;;; +1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L; 5DE6;;;;N;;;;; +1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L; 4E2D;;;;N;;;;; +1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L; 53F3;;;;N;;;;; +1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L; 6307;;;;N;;;;; +1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L; 8D70;;;;N;;;;; +1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 6253;;;;N;;;;; +1F232;SQUARED CJK UNIFIED IDEOGRAPH-7981;So;0;L; 7981;;;;N;;;;; +1F233;SQUARED CJK UNIFIED IDEOGRAPH-7A7A;So;0;L; 7A7A;;;;N;;;;; +1F234;SQUARED CJK UNIFIED IDEOGRAPH-5408;So;0;L; 5408;;;;N;;;;; +1F235;SQUARED CJK UNIFIED IDEOGRAPH-6E80;So;0;L; 6E80;;;;N;;;;; +1F236;SQUARED CJK UNIFIED IDEOGRAPH-6709;So;0;L; 6709;;;;N;;;;; +1F237;SQUARED CJK UNIFIED IDEOGRAPH-6708;So;0;L; 6708;;;;N;;;;; +1F238;SQUARED CJK UNIFIED IDEOGRAPH-7533;So;0;L; 7533;;;;N;;;;; +1F239;SQUARED CJK UNIFIED IDEOGRAPH-5272;So;0;L; 5272;;;;N;;;;; +1F23A;SQUARED CJK UNIFIED IDEOGRAPH-55B6;So;0;L; 55B6;;;;N;;;;; +1F23B;SQUARED CJK UNIFIED IDEOGRAPH-914D;So;0;L; 914D;;;;N;;;;; +1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L; 3014 672C 3015;;;;N;;;;; +1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 3014 4E09 3015;;;;N;;;;; +1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 3014 4E8C 3015;;;;N;;;;; +1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L; 3014 5B89 3015;;;;N;;;;; +1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L; 3014 70B9 3015;;;;N;;;;; +1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 3014 6253 3015;;;;N;;;;; +1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L; 3014 76D7 3015;;;;N;;;;; +1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L; 3014 52DD 3015;;;;N;;;;; +1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L; 3014 6557 3015;;;;N;;;;; +1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L; 5F97;;;;N;;;;; +1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L; 53EF;;;;N;;;;; +1F260;ROUNDED SYMBOL FOR FU;So;0;ON;;;;;N;;;;; +1F261;ROUNDED SYMBOL FOR LU;So;0;ON;;;;;N;;;;; +1F262;ROUNDED SYMBOL FOR SHOU;So;0;ON;;;;;N;;;;; +1F263;ROUNDED SYMBOL FOR XI;So;0;ON;;;;;N;;;;; +1F264;ROUNDED SYMBOL FOR SHUANGXI;So;0;ON;;;;;N;;;;; +1F265;ROUNDED SYMBOL FOR CAI;So;0;ON;;;;;N;;;;; +1F300;CYCLONE;So;0;ON;;;;;N;;;;; +1F301;FOGGY;So;0;ON;;;;;N;;;;; +1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;; +1F303;NIGHT WITH STARS;So;0;ON;;;;;N;;;;; +1F304;SUNRISE OVER MOUNTAINS;So;0;ON;;;;;N;;;;; +1F305;SUNRISE;So;0;ON;;;;;N;;;;; +1F306;CITYSCAPE AT DUSK;So;0;ON;;;;;N;;;;; +1F307;SUNSET OVER BUILDINGS;So;0;ON;;;;;N;;;;; +1F308;RAINBOW;So;0;ON;;;;;N;;;;; +1F309;BRIDGE AT NIGHT;So;0;ON;;;;;N;;;;; +1F30A;WATER WAVE;So;0;ON;;;;;N;;;;; +1F30B;VOLCANO;So;0;ON;;;;;N;;;;; +1F30C;MILKY WAY;So;0;ON;;;;;N;;;;; +1F30D;EARTH GLOBE EUROPE-AFRICA;So;0;ON;;;;;N;;;;; +1F30E;EARTH GLOBE AMERICAS;So;0;ON;;;;;N;;;;; +1F30F;EARTH GLOBE ASIA-AUSTRALIA;So;0;ON;;;;;N;;;;; +1F310;GLOBE WITH MERIDIANS;So;0;ON;;;;;N;;;;; +1F311;NEW MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F312;WAXING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F313;FIRST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F314;WAXING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F315;FULL MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F316;WANING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F317;LAST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F318;WANING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F319;CRESCENT MOON;So;0;ON;;;;;N;;;;; +1F31A;NEW MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31B;FIRST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31C;LAST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31D;FULL MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31E;SUN WITH FACE;So;0;ON;;;;;N;;;;; +1F31F;GLOWING STAR;So;0;ON;;;;;N;;;;; +1F320;SHOOTING STAR;So;0;ON;;;;;N;;;;; +1F321;THERMOMETER;So;0;ON;;;;;N;;;;; +1F322;BLACK DROPLET;So;0;ON;;;;;N;;;;; +1F323;WHITE SUN;So;0;ON;;;;;N;;;;; +1F324;WHITE SUN WITH SMALL CLOUD;So;0;ON;;;;;N;;;;; +1F325;WHITE SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +1F326;WHITE SUN BEHIND CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F327;CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F328;CLOUD WITH SNOW;So;0;ON;;;;;N;;;;; +1F329;CLOUD WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; +1F32B;FOG;So;0;ON;;;;;N;;;;; +1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; +1F32D;HOT DOG;So;0;ON;;;;;N;;;;; +1F32E;TACO;So;0;ON;;;;;N;;;;; +1F32F;BURRITO;So;0;ON;;;;;N;;;;; +1F330;CHESTNUT;So;0;ON;;;;;N;;;;; +1F331;SEEDLING;So;0;ON;;;;;N;;;;; +1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; +1F333;DECIDUOUS TREE;So;0;ON;;;;;N;;;;; +1F334;PALM TREE;So;0;ON;;;;;N;;;;; +1F335;CACTUS;So;0;ON;;;;;N;;;;; +1F336;HOT PEPPER;So;0;ON;;;;;N;;;;; +1F337;TULIP;So;0;ON;;;;;N;;;;; +1F338;CHERRY BLOSSOM;So;0;ON;;;;;N;;;;; +1F339;ROSE;So;0;ON;;;;;N;;;;; +1F33A;HIBISCUS;So;0;ON;;;;;N;;;;; +1F33B;SUNFLOWER;So;0;ON;;;;;N;;;;; +1F33C;BLOSSOM;So;0;ON;;;;;N;;;;; +1F33D;EAR OF MAIZE;So;0;ON;;;;;N;;;;; +1F33E;EAR OF RICE;So;0;ON;;;;;N;;;;; +1F33F;HERB;So;0;ON;;;;;N;;;;; +1F340;FOUR LEAF CLOVER;So;0;ON;;;;;N;;;;; +1F341;MAPLE LEAF;So;0;ON;;;;;N;;;;; +1F342;FALLEN LEAF;So;0;ON;;;;;N;;;;; +1F343;LEAF FLUTTERING IN WIND;So;0;ON;;;;;N;;;;; +1F344;MUSHROOM;So;0;ON;;;;;N;;;;; +1F345;TOMATO;So;0;ON;;;;;N;;;;; +1F346;AUBERGINE;So;0;ON;;;;;N;;;;; +1F347;GRAPES;So;0;ON;;;;;N;;;;; +1F348;MELON;So;0;ON;;;;;N;;;;; +1F349;WATERMELON;So;0;ON;;;;;N;;;;; +1F34A;TANGERINE;So;0;ON;;;;;N;;;;; +1F34B;LEMON;So;0;ON;;;;;N;;;;; +1F34C;BANANA;So;0;ON;;;;;N;;;;; +1F34D;PINEAPPLE;So;0;ON;;;;;N;;;;; +1F34E;RED APPLE;So;0;ON;;;;;N;;;;; +1F34F;GREEN APPLE;So;0;ON;;;;;N;;;;; +1F350;PEAR;So;0;ON;;;;;N;;;;; +1F351;PEACH;So;0;ON;;;;;N;;;;; +1F352;CHERRIES;So;0;ON;;;;;N;;;;; +1F353;STRAWBERRY;So;0;ON;;;;;N;;;;; +1F354;HAMBURGER;So;0;ON;;;;;N;;;;; +1F355;SLICE OF PIZZA;So;0;ON;;;;;N;;;;; +1F356;MEAT ON BONE;So;0;ON;;;;;N;;;;; +1F357;POULTRY LEG;So;0;ON;;;;;N;;;;; +1F358;RICE CRACKER;So;0;ON;;;;;N;;;;; +1F359;RICE BALL;So;0;ON;;;;;N;;;;; +1F35A;COOKED RICE;So;0;ON;;;;;N;;;;; +1F35B;CURRY AND RICE;So;0;ON;;;;;N;;;;; +1F35C;STEAMING BOWL;So;0;ON;;;;;N;;;;; +1F35D;SPAGHETTI;So;0;ON;;;;;N;;;;; +1F35E;BREAD;So;0;ON;;;;;N;;;;; +1F35F;FRENCH FRIES;So;0;ON;;;;;N;;;;; +1F360;ROASTED SWEET POTATO;So;0;ON;;;;;N;;;;; +1F361;DANGO;So;0;ON;;;;;N;;;;; +1F362;ODEN;So;0;ON;;;;;N;;;;; +1F363;SUSHI;So;0;ON;;;;;N;;;;; +1F364;FRIED SHRIMP;So;0;ON;;;;;N;;;;; +1F365;FISH CAKE WITH SWIRL DESIGN;So;0;ON;;;;;N;;;;; +1F366;SOFT ICE CREAM;So;0;ON;;;;;N;;;;; +1F367;SHAVED ICE;So;0;ON;;;;;N;;;;; +1F368;ICE CREAM;So;0;ON;;;;;N;;;;; +1F369;DOUGHNUT;So;0;ON;;;;;N;;;;; +1F36A;COOKIE;So;0;ON;;;;;N;;;;; +1F36B;CHOCOLATE BAR;So;0;ON;;;;;N;;;;; +1F36C;CANDY;So;0;ON;;;;;N;;;;; +1F36D;LOLLIPOP;So;0;ON;;;;;N;;;;; +1F36E;CUSTARD;So;0;ON;;;;;N;;;;; +1F36F;HONEY POT;So;0;ON;;;;;N;;;;; +1F370;SHORTCAKE;So;0;ON;;;;;N;;;;; +1F371;BENTO BOX;So;0;ON;;;;;N;;;;; +1F372;POT OF FOOD;So;0;ON;;;;;N;;;;; +1F373;COOKING;So;0;ON;;;;;N;;;;; +1F374;FORK AND KNIFE;So;0;ON;;;;;N;;;;; +1F375;TEACUP WITHOUT HANDLE;So;0;ON;;;;;N;;;;; +1F376;SAKE BOTTLE AND CUP;So;0;ON;;;;;N;;;;; +1F377;WINE GLASS;So;0;ON;;;;;N;;;;; +1F378;COCKTAIL GLASS;So;0;ON;;;;;N;;;;; +1F379;TROPICAL DRINK;So;0;ON;;;;;N;;;;; +1F37A;BEER MUG;So;0;ON;;;;;N;;;;; +1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; +1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; +1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; +1F37E;BOTTLE WITH POPPING CORK;So;0;ON;;;;;N;;;;; +1F37F;POPCORN;So;0;ON;;;;;N;;;;; +1F380;RIBBON;So;0;ON;;;;;N;;;;; +1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; +1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; +1F383;JACK-O-LANTERN;So;0;ON;;;;;N;;;;; +1F384;CHRISTMAS TREE;So;0;ON;;;;;N;;;;; +1F385;FATHER CHRISTMAS;So;0;ON;;;;;N;;;;; +1F386;FIREWORKS;So;0;ON;;;;;N;;;;; +1F387;FIREWORK SPARKLER;So;0;ON;;;;;N;;;;; +1F388;BALLOON;So;0;ON;;;;;N;;;;; +1F389;PARTY POPPER;So;0;ON;;;;;N;;;;; +1F38A;CONFETTI BALL;So;0;ON;;;;;N;;;;; +1F38B;TANABATA TREE;So;0;ON;;;;;N;;;;; +1F38C;CROSSED FLAGS;So;0;ON;;;;;N;;;;; +1F38D;PINE DECORATION;So;0;ON;;;;;N;;;;; +1F38E;JAPANESE DOLLS;So;0;ON;;;;;N;;;;; +1F38F;CARP STREAMER;So;0;ON;;;;;N;;;;; +1F390;WIND CHIME;So;0;ON;;;;;N;;;;; +1F391;MOON VIEWING CEREMONY;So;0;ON;;;;;N;;;;; +1F392;SCHOOL SATCHEL;So;0;ON;;;;;N;;;;; +1F393;GRADUATION CAP;So;0;ON;;;;;N;;;;; +1F394;HEART WITH TIP ON THE LEFT;So;0;ON;;;;;N;;;;; +1F395;BOUQUET OF FLOWERS;So;0;ON;;;;;N;;;;; +1F396;MILITARY MEDAL;So;0;ON;;;;;N;;;;; +1F397;REMINDER RIBBON;So;0;ON;;;;;N;;;;; +1F398;MUSICAL KEYBOARD WITH JACKS;So;0;ON;;;;;N;;;;; +1F399;STUDIO MICROPHONE;So;0;ON;;;;;N;;;;; +1F39A;LEVEL SLIDER;So;0;ON;;;;;N;;;;; +1F39B;CONTROL KNOBS;So;0;ON;;;;;N;;;;; +1F39C;BEAMED ASCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39D;BEAMED DESCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39E;FILM FRAMES;So;0;ON;;;;;N;;;;; +1F39F;ADMISSION TICKETS;So;0;ON;;;;;N;;;;; +1F3A0;CAROUSEL HORSE;So;0;ON;;;;;N;;;;; +1F3A1;FERRIS WHEEL;So;0;ON;;;;;N;;;;; +1F3A2;ROLLER COASTER;So;0;ON;;;;;N;;;;; +1F3A3;FISHING POLE AND FISH;So;0;ON;;;;;N;;;;; +1F3A4;MICROPHONE;So;0;ON;;;;;N;;;;; +1F3A5;MOVIE CAMERA;So;0;ON;;;;;N;;;;; +1F3A6;CINEMA;So;0;ON;;;;;N;;;;; +1F3A7;HEADPHONE;So;0;ON;;;;;N;;;;; +1F3A8;ARTIST PALETTE;So;0;ON;;;;;N;;;;; +1F3A9;TOP HAT;So;0;ON;;;;;N;;;;; +1F3AA;CIRCUS TENT;So;0;ON;;;;;N;;;;; +1F3AB;TICKET;So;0;ON;;;;;N;;;;; +1F3AC;CLAPPER BOARD;So;0;ON;;;;;N;;;;; +1F3AD;PERFORMING ARTS;So;0;ON;;;;;N;;;;; +1F3AE;VIDEO GAME;So;0;ON;;;;;N;;;;; +1F3AF;DIRECT HIT;So;0;ON;;;;;N;;;;; +1F3B0;SLOT MACHINE;So;0;ON;;;;;N;;;;; +1F3B1;BILLIARDS;So;0;ON;;;;;N;;;;; +1F3B2;GAME DIE;So;0;ON;;;;;N;;;;; +1F3B3;BOWLING;So;0;ON;;;;;N;;;;; +1F3B4;FLOWER PLAYING CARDS;So;0;ON;;;;;N;;;;; +1F3B5;MUSICAL NOTE;So;0;ON;;;;;N;;;;; +1F3B6;MULTIPLE MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F3B7;SAXOPHONE;So;0;ON;;;;;N;;;;; +1F3B8;GUITAR;So;0;ON;;;;;N;;;;; +1F3B9;MUSICAL KEYBOARD;So;0;ON;;;;;N;;;;; +1F3BA;TRUMPET;So;0;ON;;;;;N;;;;; +1F3BB;VIOLIN;So;0;ON;;;;;N;;;;; +1F3BC;MUSICAL SCORE;So;0;ON;;;;;N;;;;; +1F3BD;RUNNING SHIRT WITH SASH;So;0;ON;;;;;N;;;;; +1F3BE;TENNIS RACQUET AND BALL;So;0;ON;;;;;N;;;;; +1F3BF;SKI AND SKI BOOT;So;0;ON;;;;;N;;;;; +1F3C0;BASKETBALL AND HOOP;So;0;ON;;;;;N;;;;; +1F3C1;CHEQUERED FLAG;So;0;ON;;;;;N;;;;; +1F3C2;SNOWBOARDER;So;0;ON;;;;;N;;;;; +1F3C3;RUNNER;So;0;ON;;;;;N;;;;; +1F3C4;SURFER;So;0;ON;;;;;N;;;;; +1F3C5;SPORTS MEDAL;So;0;ON;;;;;N;;;;; +1F3C6;TROPHY;So;0;ON;;;;;N;;;;; +1F3C7;HORSE RACING;So;0;ON;;;;;N;;;;; +1F3C8;AMERICAN FOOTBALL;So;0;ON;;;;;N;;;;; +1F3C9;RUGBY FOOTBALL;So;0;ON;;;;;N;;;;; +1F3CA;SWIMMER;So;0;ON;;;;;N;;;;; +1F3CB;WEIGHT LIFTER;So;0;ON;;;;;N;;;;; +1F3CC;GOLFER;So;0;ON;;;;;N;;;;; +1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; +1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; +1F3CF;CRICKET BAT AND BALL;So;0;ON;;;;;N;;;;; +1F3D0;VOLLEYBALL;So;0;ON;;;;;N;;;;; +1F3D1;FIELD HOCKEY STICK AND BALL;So;0;ON;;;;;N;;;;; +1F3D2;ICE HOCKEY STICK AND PUCK;So;0;ON;;;;;N;;;;; +1F3D3;TABLE TENNIS PADDLE AND BALL;So;0;ON;;;;;N;;;;; +1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; +1F3D5;CAMPING;So;0;ON;;;;;N;;;;; +1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; +1F3D7;BUILDING CONSTRUCTION;So;0;ON;;;;;N;;;;; +1F3D8;HOUSE BUILDINGS;So;0;ON;;;;;N;;;;; +1F3D9;CITYSCAPE;So;0;ON;;;;;N;;;;; +1F3DA;DERELICT HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3DB;CLASSICAL BUILDING;So;0;ON;;;;;N;;;;; +1F3DC;DESERT;So;0;ON;;;;;N;;;;; +1F3DD;DESERT ISLAND;So;0;ON;;;;;N;;;;; +1F3DE;NATIONAL PARK;So;0;ON;;;;;N;;;;; +1F3DF;STADIUM;So;0;ON;;;;;N;;;;; +1F3E0;HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3E1;HOUSE WITH GARDEN;So;0;ON;;;;;N;;;;; +1F3E2;OFFICE BUILDING;So;0;ON;;;;;N;;;;; +1F3E3;JAPANESE POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E4;EUROPEAN POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E5;HOSPITAL;So;0;ON;;;;;N;;;;; +1F3E6;BANK;So;0;ON;;;;;N;;;;; +1F3E7;AUTOMATED TELLER MACHINE;So;0;ON;;;;;N;;;;; +1F3E8;HOTEL;So;0;ON;;;;;N;;;;; +1F3E9;LOVE HOTEL;So;0;ON;;;;;N;;;;; +1F3EA;CONVENIENCE STORE;So;0;ON;;;;;N;;;;; +1F3EB;SCHOOL;So;0;ON;;;;;N;;;;; +1F3EC;DEPARTMENT STORE;So;0;ON;;;;;N;;;;; +1F3ED;FACTORY;So;0;ON;;;;;N;;;;; +1F3EE;IZAKAYA LANTERN;So;0;ON;;;;;N;;;;; +1F3EF;JAPANESE CASTLE;So;0;ON;;;;;N;;;;; +1F3F0;EUROPEAN CASTLE;So;0;ON;;;;;N;;;;; +1F3F1;WHITE PENNANT;So;0;ON;;;;;N;;;;; +1F3F2;BLACK PENNANT;So;0;ON;;;;;N;;;;; +1F3F3;WAVING WHITE FLAG;So;0;ON;;;;;N;;;;; +1F3F4;WAVING BLACK FLAG;So;0;ON;;;;;N;;;;; +1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; +1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; +1F3F7;LABEL;So;0;ON;;;;;N;;;;; +1F3F8;BADMINTON RACQUET AND SHUTTLECOCK;So;0;ON;;;;;N;;;;; +1F3F9;BOW AND ARROW;So;0;ON;;;;;N;;;;; +1F3FA;AMPHORA;So;0;ON;;;;;N;;;;; +1F3FB;EMOJI MODIFIER FITZPATRICK TYPE-1-2;Sk;0;ON;;;;;N;;;;; +1F3FC;EMOJI MODIFIER FITZPATRICK TYPE-3;Sk;0;ON;;;;;N;;;;; +1F3FD;EMOJI MODIFIER FITZPATRICK TYPE-4;Sk;0;ON;;;;;N;;;;; +1F3FE;EMOJI MODIFIER FITZPATRICK TYPE-5;Sk;0;ON;;;;;N;;;;; +1F3FF;EMOJI MODIFIER FITZPATRICK TYPE-6;Sk;0;ON;;;;;N;;;;; +1F400;RAT;So;0;ON;;;;;N;;;;; +1F401;MOUSE;So;0;ON;;;;;N;;;;; +1F402;OX;So;0;ON;;;;;N;;;;; +1F403;WATER BUFFALO;So;0;ON;;;;;N;;;;; +1F404;COW;So;0;ON;;;;;N;;;;; +1F405;TIGER;So;0;ON;;;;;N;;;;; +1F406;LEOPARD;So;0;ON;;;;;N;;;;; +1F407;RABBIT;So;0;ON;;;;;N;;;;; +1F408;CAT;So;0;ON;;;;;N;;;;; +1F409;DRAGON;So;0;ON;;;;;N;;;;; +1F40A;CROCODILE;So;0;ON;;;;;N;;;;; +1F40B;WHALE;So;0;ON;;;;;N;;;;; +1F40C;SNAIL;So;0;ON;;;;;N;;;;; +1F40D;SNAKE;So;0;ON;;;;;N;;;;; +1F40E;HORSE;So;0;ON;;;;;N;;;;; +1F40F;RAM;So;0;ON;;;;;N;;;;; +1F410;GOAT;So;0;ON;;;;;N;;;;; +1F411;SHEEP;So;0;ON;;;;;N;;;;; +1F412;MONKEY;So;0;ON;;;;;N;;;;; +1F413;ROOSTER;So;0;ON;;;;;N;;;;; +1F414;CHICKEN;So;0;ON;;;;;N;;;;; +1F415;DOG;So;0;ON;;;;;N;;;;; +1F416;PIG;So;0;ON;;;;;N;;;;; +1F417;BOAR;So;0;ON;;;;;N;;;;; +1F418;ELEPHANT;So;0;ON;;;;;N;;;;; +1F419;OCTOPUS;So;0;ON;;;;;N;;;;; +1F41A;SPIRAL SHELL;So;0;ON;;;;;N;;;;; +1F41B;BUG;So;0;ON;;;;;N;;;;; +1F41C;ANT;So;0;ON;;;;;N;;;;; +1F41D;HONEYBEE;So;0;ON;;;;;N;;;;; +1F41E;LADY BEETLE;So;0;ON;;;;;N;;;;; +1F41F;FISH;So;0;ON;;;;;N;;;;; +1F420;TROPICAL FISH;So;0;ON;;;;;N;;;;; +1F421;BLOWFISH;So;0;ON;;;;;N;;;;; +1F422;TURTLE;So;0;ON;;;;;N;;;;; +1F423;HATCHING CHICK;So;0;ON;;;;;N;;;;; +1F424;BABY CHICK;So;0;ON;;;;;N;;;;; +1F425;FRONT-FACING BABY CHICK;So;0;ON;;;;;N;;;;; +1F426;BIRD;So;0;ON;;;;;N;;;;; +1F427;PENGUIN;So;0;ON;;;;;N;;;;; +1F428;KOALA;So;0;ON;;;;;N;;;;; +1F429;POODLE;So;0;ON;;;;;N;;;;; +1F42A;DROMEDARY CAMEL;So;0;ON;;;;;N;;;;; +1F42B;BACTRIAN CAMEL;So;0;ON;;;;;N;;;;; +1F42C;DOLPHIN;So;0;ON;;;;;N;;;;; +1F42D;MOUSE FACE;So;0;ON;;;;;N;;;;; +1F42E;COW FACE;So;0;ON;;;;;N;;;;; +1F42F;TIGER FACE;So;0;ON;;;;;N;;;;; +1F430;RABBIT FACE;So;0;ON;;;;;N;;;;; +1F431;CAT FACE;So;0;ON;;;;;N;;;;; +1F432;DRAGON FACE;So;0;ON;;;;;N;;;;; +1F433;SPOUTING WHALE;So;0;ON;;;;;N;;;;; +1F434;HORSE FACE;So;0;ON;;;;;N;;;;; +1F435;MONKEY FACE;So;0;ON;;;;;N;;;;; +1F436;DOG FACE;So;0;ON;;;;;N;;;;; +1F437;PIG FACE;So;0;ON;;;;;N;;;;; +1F438;FROG FACE;So;0;ON;;;;;N;;;;; +1F439;HAMSTER FACE;So;0;ON;;;;;N;;;;; +1F43A;WOLF FACE;So;0;ON;;;;;N;;;;; +1F43B;BEAR FACE;So;0;ON;;;;;N;;;;; +1F43C;PANDA FACE;So;0;ON;;;;;N;;;;; +1F43D;PIG NOSE;So;0;ON;;;;;N;;;;; +1F43E;PAW PRINTS;So;0;ON;;;;;N;;;;; +1F43F;CHIPMUNK;So;0;ON;;;;;N;;;;; +1F440;EYES;So;0;ON;;;;;N;;;;; +1F441;EYE;So;0;ON;;;;;N;;;;; +1F442;EAR;So;0;ON;;;;;N;;;;; +1F443;NOSE;So;0;ON;;;;;N;;;;; +1F444;MOUTH;So;0;ON;;;;;N;;;;; +1F445;TONGUE;So;0;ON;;;;;N;;;;; +1F446;WHITE UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F447;WHITE DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F448;WHITE LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F449;WHITE RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F44A;FISTED HAND SIGN;So;0;ON;;;;;N;;;;; +1F44B;WAVING HAND SIGN;So;0;ON;;;;;N;;;;; +1F44C;OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F44D;THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F44E;THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F44F;CLAPPING HANDS SIGN;So;0;ON;;;;;N;;;;; +1F450;OPEN HANDS SIGN;So;0;ON;;;;;N;;;;; +1F451;CROWN;So;0;ON;;;;;N;;;;; +1F452;WOMANS HAT;So;0;ON;;;;;N;;;;; +1F453;EYEGLASSES;So;0;ON;;;;;N;;;;; +1F454;NECKTIE;So;0;ON;;;;;N;;;;; +1F455;T-SHIRT;So;0;ON;;;;;N;;;;; +1F456;JEANS;So;0;ON;;;;;N;;;;; +1F457;DRESS;So;0;ON;;;;;N;;;;; +1F458;KIMONO;So;0;ON;;;;;N;;;;; +1F459;BIKINI;So;0;ON;;;;;N;;;;; +1F45A;WOMANS CLOTHES;So;0;ON;;;;;N;;;;; +1F45B;PURSE;So;0;ON;;;;;N;;;;; +1F45C;HANDBAG;So;0;ON;;;;;N;;;;; +1F45D;POUCH;So;0;ON;;;;;N;;;;; +1F45E;MANS SHOE;So;0;ON;;;;;N;;;;; +1F45F;ATHLETIC SHOE;So;0;ON;;;;;N;;;;; +1F460;HIGH-HEELED SHOE;So;0;ON;;;;;N;;;;; +1F461;WOMANS SANDAL;So;0;ON;;;;;N;;;;; +1F462;WOMANS BOOTS;So;0;ON;;;;;N;;;;; +1F463;FOOTPRINTS;So;0;ON;;;;;N;;;;; +1F464;BUST IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F465;BUSTS IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F466;BOY;So;0;ON;;;;;N;;;;; +1F467;GIRL;So;0;ON;;;;;N;;;;; +1F468;MAN;So;0;ON;;;;;N;;;;; +1F469;WOMAN;So;0;ON;;;;;N;;;;; +1F46A;FAMILY;So;0;ON;;;;;N;;;;; +1F46B;MAN AND WOMAN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46C;TWO MEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46D;TWO WOMEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46E;POLICE OFFICER;So;0;ON;;;;;N;;;;; +1F46F;WOMAN WITH BUNNY EARS;So;0;ON;;;;;N;;;;; +1F470;BRIDE WITH VEIL;So;0;ON;;;;;N;;;;; +1F471;PERSON WITH BLOND HAIR;So;0;ON;;;;;N;;;;; +1F472;MAN WITH GUA PI MAO;So;0;ON;;;;;N;;;;; +1F473;MAN WITH TURBAN;So;0;ON;;;;;N;;;;; +1F474;OLDER MAN;So;0;ON;;;;;N;;;;; +1F475;OLDER WOMAN;So;0;ON;;;;;N;;;;; +1F476;BABY;So;0;ON;;;;;N;;;;; +1F477;CONSTRUCTION WORKER;So;0;ON;;;;;N;;;;; +1F478;PRINCESS;So;0;ON;;;;;N;;;;; +1F479;JAPANESE OGRE;So;0;ON;;;;;N;;;;; +1F47A;JAPANESE GOBLIN;So;0;ON;;;;;N;;;;; +1F47B;GHOST;So;0;ON;;;;;N;;;;; +1F47C;BABY ANGEL;So;0;ON;;;;;N;;;;; +1F47D;EXTRATERRESTRIAL ALIEN;So;0;ON;;;;;N;;;;; +1F47E;ALIEN MONSTER;So;0;ON;;;;;N;;;;; +1F47F;IMP;So;0;ON;;;;;N;;;;; +1F480;SKULL;So;0;ON;;;;;N;;;;; +1F481;INFORMATION DESK PERSON;So;0;ON;;;;;N;;;;; +1F482;GUARDSMAN;So;0;ON;;;;;N;;;;; +1F483;DANCER;So;0;ON;;;;;N;;;;; +1F484;LIPSTICK;So;0;ON;;;;;N;;;;; +1F485;NAIL POLISH;So;0;ON;;;;;N;;;;; +1F486;FACE MASSAGE;So;0;ON;;;;;N;;;;; +1F487;HAIRCUT;So;0;ON;;;;;N;;;;; +1F488;BARBER POLE;So;0;ON;;;;;N;;;;; +1F489;SYRINGE;So;0;ON;;;;;N;;;;; +1F48A;PILL;So;0;ON;;;;;N;;;;; +1F48B;KISS MARK;So;0;ON;;;;;N;;;;; +1F48C;LOVE LETTER;So;0;ON;;;;;N;;;;; +1F48D;RING;So;0;ON;;;;;N;;;;; +1F48E;GEM STONE;So;0;ON;;;;;N;;;;; +1F48F;KISS;So;0;ON;;;;;N;;;;; +1F490;BOUQUET;So;0;ON;;;;;N;;;;; +1F491;COUPLE WITH HEART;So;0;ON;;;;;N;;;;; +1F492;WEDDING;So;0;ON;;;;;N;;;;; +1F493;BEATING HEART;So;0;ON;;;;;N;;;;; +1F494;BROKEN HEART;So;0;ON;;;;;N;;;;; +1F495;TWO HEARTS;So;0;ON;;;;;N;;;;; +1F496;SPARKLING HEART;So;0;ON;;;;;N;;;;; +1F497;GROWING HEART;So;0;ON;;;;;N;;;;; +1F498;HEART WITH ARROW;So;0;ON;;;;;N;;;;; +1F499;BLUE HEART;So;0;ON;;;;;N;;;;; +1F49A;GREEN HEART;So;0;ON;;;;;N;;;;; +1F49B;YELLOW HEART;So;0;ON;;;;;N;;;;; +1F49C;PURPLE HEART;So;0;ON;;;;;N;;;;; +1F49D;HEART WITH RIBBON;So;0;ON;;;;;N;;;;; +1F49E;REVOLVING HEARTS;So;0;ON;;;;;N;;;;; +1F49F;HEART DECORATION;So;0;ON;;;;;N;;;;; +1F4A0;DIAMOND SHAPE WITH A DOT INSIDE;So;0;ON;;;;;N;;;;; +1F4A1;ELECTRIC LIGHT BULB;So;0;ON;;;;;N;;;;; +1F4A2;ANGER SYMBOL;So;0;ON;;;;;N;;;;; +1F4A3;BOMB;So;0;ON;;;;;N;;;;; +1F4A4;SLEEPING SYMBOL;So;0;ON;;;;;N;;;;; +1F4A5;COLLISION SYMBOL;So;0;ON;;;;;N;;;;; +1F4A6;SPLASHING SWEAT SYMBOL;So;0;ON;;;;;N;;;;; +1F4A7;DROPLET;So;0;ON;;;;;N;;;;; +1F4A8;DASH SYMBOL;So;0;ON;;;;;N;;;;; +1F4A9;PILE OF POO;So;0;ON;;;;;N;;;;; +1F4AA;FLEXED BICEPS;So;0;ON;;;;;N;;;;; +1F4AB;DIZZY SYMBOL;So;0;ON;;;;;N;;;;; +1F4AC;SPEECH BALLOON;So;0;ON;;;;;N;;;;; +1F4AD;THOUGHT BALLOON;So;0;ON;;;;;N;;;;; +1F4AE;WHITE FLOWER;So;0;ON;;;;;N;;;;; +1F4AF;HUNDRED POINTS SYMBOL;So;0;ON;;;;;N;;;;; +1F4B0;MONEY BAG;So;0;ON;;;;;N;;;;; +1F4B1;CURRENCY EXCHANGE;So;0;ON;;;;;N;;;;; +1F4B2;HEAVY DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B3;CREDIT CARD;So;0;ON;;;;;N;;;;; +1F4B4;BANKNOTE WITH YEN SIGN;So;0;ON;;;;;N;;;;; +1F4B5;BANKNOTE WITH DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B6;BANKNOTE WITH EURO SIGN;So;0;ON;;;;;N;;;;; +1F4B7;BANKNOTE WITH POUND SIGN;So;0;ON;;;;;N;;;;; +1F4B8;MONEY WITH WINGS;So;0;ON;;;;;N;;;;; +1F4B9;CHART WITH UPWARDS TREND AND YEN SIGN;So;0;ON;;;;;N;;;;; +1F4BA;SEAT;So;0;ON;;;;;N;;;;; +1F4BB;PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F4BC;BRIEFCASE;So;0;ON;;;;;N;;;;; +1F4BD;MINIDISC;So;0;ON;;;;;N;;;;; +1F4BE;FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F4BF;OPTICAL DISC;So;0;ON;;;;;N;;;;; +1F4C0;DVD;So;0;ON;;;;;N;;;;; +1F4C1;FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C2;OPEN FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C3;PAGE WITH CURL;So;0;ON;;;;;N;;;;; +1F4C4;PAGE FACING UP;So;0;ON;;;;;N;;;;; +1F4C5;CALENDAR;So;0;ON;;;;;N;;;;; +1F4C6;TEAR-OFF CALENDAR;So;0;ON;;;;;N;;;;; +1F4C7;CARD INDEX;So;0;ON;;;;;N;;;;; +1F4C8;CHART WITH UPWARDS TREND;So;0;ON;;;;;N;;;;; +1F4C9;CHART WITH DOWNWARDS TREND;So;0;ON;;;;;N;;;;; +1F4CA;BAR CHART;So;0;ON;;;;;N;;;;; +1F4CB;CLIPBOARD;So;0;ON;;;;;N;;;;; +1F4CC;PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CD;ROUND PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CE;PAPERCLIP;So;0;ON;;;;;N;;;;; +1F4CF;STRAIGHT RULER;So;0;ON;;;;;N;;;;; +1F4D0;TRIANGULAR RULER;So;0;ON;;;;;N;;;;; +1F4D1;BOOKMARK TABS;So;0;ON;;;;;N;;;;; +1F4D2;LEDGER;So;0;ON;;;;;N;;;;; +1F4D3;NOTEBOOK;So;0;ON;;;;;N;;;;; +1F4D4;NOTEBOOK WITH DECORATIVE COVER;So;0;ON;;;;;N;;;;; +1F4D5;CLOSED BOOK;So;0;ON;;;;;N;;;;; +1F4D6;OPEN BOOK;So;0;ON;;;;;N;;;;; +1F4D7;GREEN BOOK;So;0;ON;;;;;N;;;;; +1F4D8;BLUE BOOK;So;0;ON;;;;;N;;;;; +1F4D9;ORANGE BOOK;So;0;ON;;;;;N;;;;; +1F4DA;BOOKS;So;0;ON;;;;;N;;;;; +1F4DB;NAME BADGE;So;0;ON;;;;;N;;;;; +1F4DC;SCROLL;So;0;ON;;;;;N;;;;; +1F4DD;MEMO;So;0;ON;;;;;N;;;;; +1F4DE;TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F4DF;PAGER;So;0;ON;;;;;N;;;;; +1F4E0;FAX MACHINE;So;0;ON;;;;;N;;;;; +1F4E1;SATELLITE ANTENNA;So;0;ON;;;;;N;;;;; +1F4E2;PUBLIC ADDRESS LOUDSPEAKER;So;0;ON;;;;;N;;;;; +1F4E3;CHEERING MEGAPHONE;So;0;ON;;;;;N;;;;; +1F4E4;OUTBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E5;INBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E6;PACKAGE;So;0;ON;;;;;N;;;;; +1F4E7;E-MAIL SYMBOL;So;0;ON;;;;;N;;;;; +1F4E8;INCOMING ENVELOPE;So;0;ON;;;;;N;;;;; +1F4E9;ENVELOPE WITH DOWNWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F4EA;CLOSED MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EB;CLOSED MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4EC;OPEN MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4ED;OPEN MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EE;POSTBOX;So;0;ON;;;;;N;;;;; +1F4EF;POSTAL HORN;So;0;ON;;;;;N;;;;; +1F4F0;NEWSPAPER;So;0;ON;;;;;N;;;;; +1F4F1;MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F4F2;MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT;So;0;ON;;;;;N;;;;; +1F4F3;VIBRATION MODE;So;0;ON;;;;;N;;;;; +1F4F4;MOBILE PHONE OFF;So;0;ON;;;;;N;;;;; +1F4F5;NO MOBILE PHONES;So;0;ON;;;;;N;;;;; +1F4F6;ANTENNA WITH BARS;So;0;ON;;;;;N;;;;; +1F4F7;CAMERA;So;0;ON;;;;;N;;;;; +1F4F8;CAMERA WITH FLASH;So;0;ON;;;;;N;;;;; +1F4F9;VIDEO CAMERA;So;0;ON;;;;;N;;;;; +1F4FA;TELEVISION;So;0;ON;;;;;N;;;;; +1F4FB;RADIO;So;0;ON;;;;;N;;;;; +1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; +1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; +1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; +1F4FF;PRAYER BEADS;So;0;ON;;;;;N;;;;; +1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; +1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; +1F503;CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F504;ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F505;LOW BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F506;HIGH BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F507;SPEAKER WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F508;SPEAKER;So;0;ON;;;;;N;;;;; +1F509;SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F50A;SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F50B;BATTERY;So;0;ON;;;;;N;;;;; +1F50C;ELECTRIC PLUG;So;0;ON;;;;;N;;;;; +1F50D;LEFT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50E;RIGHT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50F;LOCK WITH INK PEN;So;0;ON;;;;;N;;;;; +1F510;CLOSED LOCK WITH KEY;So;0;ON;;;;;N;;;;; +1F511;KEY;So;0;ON;;;;;N;;;;; +1F512;LOCK;So;0;ON;;;;;N;;;;; +1F513;OPEN LOCK;So;0;ON;;;;;N;;;;; +1F514;BELL;So;0;ON;;;;;N;;;;; +1F515;BELL WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F516;BOOKMARK;So;0;ON;;;;;N;;;;; +1F517;LINK SYMBOL;So;0;ON;;;;;N;;;;; +1F518;RADIO BUTTON;So;0;ON;;;;;N;;;;; +1F519;BACK WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51A;END WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51B;ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51C;SOON WITH RIGHTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51D;TOP WITH UPWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51E;NO ONE UNDER EIGHTEEN SYMBOL;So;0;ON;;;;;N;;;;; +1F51F;KEYCAP TEN;So;0;ON;;;;;N;;;;; +1F520;INPUT SYMBOL FOR LATIN CAPITAL LETTERS;So;0;ON;;;;;N;;;;; +1F521;INPUT SYMBOL FOR LATIN SMALL LETTERS;So;0;ON;;;;;N;;;;; +1F522;INPUT SYMBOL FOR NUMBERS;So;0;ON;;;;;N;;;;; +1F523;INPUT SYMBOL FOR SYMBOLS;So;0;ON;;;;;N;;;;; +1F524;INPUT SYMBOL FOR LATIN LETTERS;So;0;ON;;;;;N;;;;; +1F525;FIRE;So;0;ON;;;;;N;;;;; +1F526;ELECTRIC TORCH;So;0;ON;;;;;N;;;;; +1F527;WRENCH;So;0;ON;;;;;N;;;;; +1F528;HAMMER;So;0;ON;;;;;N;;;;; +1F529;NUT AND BOLT;So;0;ON;;;;;N;;;;; +1F52A;HOCHO;So;0;ON;;;;;N;;;;; +1F52B;PISTOL;So;0;ON;;;;;N;;;;; +1F52C;MICROSCOPE;So;0;ON;;;;;N;;;;; +1F52D;TELESCOPE;So;0;ON;;;;;N;;;;; +1F52E;CRYSTAL BALL;So;0;ON;;;;;N;;;;; +1F52F;SIX POINTED STAR WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +1F530;JAPANESE SYMBOL FOR BEGINNER;So;0;ON;;;;;N;;;;; +1F531;TRIDENT EMBLEM;So;0;ON;;;;;N;;;;; +1F532;BLACK SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F533;WHITE SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F534;LARGE RED CIRCLE;So;0;ON;;;;;N;;;;; +1F535;LARGE BLUE CIRCLE;So;0;ON;;;;;N;;;;; +1F536;LARGE ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F537;LARGE BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F538;SMALL ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F539;SMALL BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F53A;UP-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53B;DOWN-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53C;UP-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53D;DOWN-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53E;LOWER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F53F;UPPER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F540;CIRCLED CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F541;CROSS POMMEE WITH HALF-CIRCLE BELOW;So;0;ON;;;;;N;;;;; +1F542;CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F543;NOTCHED LEFT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F544;NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F545;SYMBOL FOR MARKS CHAPTER;So;0;ON;;;;;N;;;;; +1F546;WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +1F547;HEAVY LATIN CROSS;So;0;ON;;;;;N;;;;; +1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; +1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; +1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; +1F54B;KAABA;So;0;ON;;;;;N;;;;; +1F54C;MOSQUE;So;0;ON;;;;;N;;;;; +1F54D;SYNAGOGUE;So;0;ON;;;;;N;;;;; +1F54E;MENORAH WITH NINE BRANCHES;So;0;ON;;;;;N;;;;; +1F54F;BOWL OF HYGIEIA;So;0;ON;;;;;N;;;;; +1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; +1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; +1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; +1F553;CLOCK FACE FOUR OCLOCK;So;0;ON;;;;;N;;;;; +1F554;CLOCK FACE FIVE OCLOCK;So;0;ON;;;;;N;;;;; +1F555;CLOCK FACE SIX OCLOCK;So;0;ON;;;;;N;;;;; +1F556;CLOCK FACE SEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F557;CLOCK FACE EIGHT OCLOCK;So;0;ON;;;;;N;;;;; +1F558;CLOCK FACE NINE OCLOCK;So;0;ON;;;;;N;;;;; +1F559;CLOCK FACE TEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55A;CLOCK FACE ELEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55B;CLOCK FACE TWELVE OCLOCK;So;0;ON;;;;;N;;;;; +1F55C;CLOCK FACE ONE-THIRTY;So;0;ON;;;;;N;;;;; +1F55D;CLOCK FACE TWO-THIRTY;So;0;ON;;;;;N;;;;; +1F55E;CLOCK FACE THREE-THIRTY;So;0;ON;;;;;N;;;;; +1F55F;CLOCK FACE FOUR-THIRTY;So;0;ON;;;;;N;;;;; +1F560;CLOCK FACE FIVE-THIRTY;So;0;ON;;;;;N;;;;; +1F561;CLOCK FACE SIX-THIRTY;So;0;ON;;;;;N;;;;; +1F562;CLOCK FACE SEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F563;CLOCK FACE EIGHT-THIRTY;So;0;ON;;;;;N;;;;; +1F564;CLOCK FACE NINE-THIRTY;So;0;ON;;;;;N;;;;; +1F565;CLOCK FACE TEN-THIRTY;So;0;ON;;;;;N;;;;; +1F566;CLOCK FACE ELEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F567;CLOCK FACE TWELVE-THIRTY;So;0;ON;;;;;N;;;;; +1F568;RIGHT SPEAKER;So;0;ON;;;;;N;;;;; +1F569;RIGHT SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F56A;RIGHT SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56B;BULLHORN;So;0;ON;;;;;N;;;;; +1F56C;BULLHORN WITH SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56D;RINGING BELL;So;0;ON;;;;;N;;;;; +1F56E;BOOK;So;0;ON;;;;;N;;;;; +1F56F;CANDLE;So;0;ON;;;;;N;;;;; +1F570;MANTELPIECE CLOCK;So;0;ON;;;;;N;;;;; +1F571;BLACK SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +1F572;NO PIRACY;So;0;ON;;;;;N;;;;; +1F573;HOLE;So;0;ON;;;;;N;;;;; +1F574;MAN IN BUSINESS SUIT LEVITATING;So;0;ON;;;;;N;;;;; +1F575;SLEUTH OR SPY;So;0;ON;;;;;N;;;;; +1F576;DARK SUNGLASSES;So;0;ON;;;;;N;;;;; +1F577;SPIDER;So;0;ON;;;;;N;;;;; +1F578;SPIDER WEB;So;0;ON;;;;;N;;;;; +1F579;JOYSTICK;So;0;ON;;;;;N;;;;; +1F57A;MAN DANCING;So;0;ON;;;;;N;;;;; +1F57B;LEFT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F57C;TELEPHONE RECEIVER WITH PAGE;So;0;ON;;;;;N;;;;; +1F57D;RIGHT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F57E;WHITE TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F57F;BLACK TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F580;TELEPHONE ON TOP OF MODEM;So;0;ON;;;;;N;;;;; +1F581;CLAMSHELL MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F582;BACK OF ENVELOPE;So;0;ON;;;;;N;;;;; +1F583;STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F584;ENVELOPE WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F585;FLYING ENVELOPE;So;0;ON;;;;;N;;;;; +1F586;PEN OVER STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F587;LINKED PAPERCLIPS;So;0;ON;;;;;N;;;;; +1F588;BLACK PUSHPIN;So;0;ON;;;;;N;;;;; +1F589;LOWER LEFT PENCIL;So;0;ON;;;;;N;;;;; +1F58A;LOWER LEFT BALLPOINT PEN;So;0;ON;;;;;N;;;;; +1F58B;LOWER LEFT FOUNTAIN PEN;So;0;ON;;;;;N;;;;; +1F58C;LOWER LEFT PAINTBRUSH;So;0;ON;;;;;N;;;;; +1F58D;LOWER LEFT CRAYON;So;0;ON;;;;;N;;;;; +1F58E;LEFT WRITING HAND;So;0;ON;;;;;N;;;;; +1F58F;TURNED OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F590;RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F591;REVERSED RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F592;REVERSED THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F593;REVERSED THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F594;REVERSED VICTORY HAND;So;0;ON;;;;;N;;;;; +1F595;REVERSED HAND WITH MIDDLE FINGER EXTENDED;So;0;ON;;;;;N;;;;; +1F596;RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS;So;0;ON;;;;;N;;;;; +1F597;WHITE DOWN POINTING LEFT HAND INDEX;So;0;ON;;;;;N;;;;; +1F598;SIDEWAYS WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F599;SIDEWAYS WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59A;SIDEWAYS BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59B;SIDEWAYS BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59C;BLACK LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59D;BLACK RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59E;SIDEWAYS WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59F;SIDEWAYS WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A0;SIDEWAYS BLACK UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A1;SIDEWAYS BLACK DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A2;BLACK UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A3;BLACK DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A4;BLACK HEART;So;0;ON;;;;;N;;;;; +1F5A5;DESKTOP COMPUTER;So;0;ON;;;;;N;;;;; +1F5A6;KEYBOARD AND MOUSE;So;0;ON;;;;;N;;;;; +1F5A7;THREE NETWORKED COMPUTERS;So;0;ON;;;;;N;;;;; +1F5A8;PRINTER;So;0;ON;;;;;N;;;;; +1F5A9;POCKET CALCULATOR;So;0;ON;;;;;N;;;;; +1F5AA;BLACK HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AB;WHITE HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AC;SOFT SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AD;TAPE CARTRIDGE;So;0;ON;;;;;N;;;;; +1F5AE;WIRED KEYBOARD;So;0;ON;;;;;N;;;;; +1F5AF;ONE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B0;TWO BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B1;THREE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B2;TRACKBALL;So;0;ON;;;;;N;;;;; +1F5B3;OLD PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F5B4;HARD DISK;So;0;ON;;;;;N;;;;; +1F5B5;SCREEN;So;0;ON;;;;;N;;;;; +1F5B6;PRINTER ICON;So;0;ON;;;;;N;;;;; +1F5B7;FAX ICON;So;0;ON;;;;;N;;;;; +1F5B8;OPTICAL DISC ICON;So;0;ON;;;;;N;;;;; +1F5B9;DOCUMENT WITH TEXT;So;0;ON;;;;;N;;;;; +1F5BA;DOCUMENT WITH TEXT AND PICTURE;So;0;ON;;;;;N;;;;; +1F5BB;DOCUMENT WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BC;FRAME WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BD;FRAME WITH TILES;So;0;ON;;;;;N;;;;; +1F5BE;FRAME WITH AN X;So;0;ON;;;;;N;;;;; +1F5BF;BLACK FOLDER;So;0;ON;;;;;N;;;;; +1F5C0;FOLDER;So;0;ON;;;;;N;;;;; +1F5C1;OPEN FOLDER;So;0;ON;;;;;N;;;;; +1F5C2;CARD INDEX DIVIDERS;So;0;ON;;;;;N;;;;; +1F5C3;CARD FILE BOX;So;0;ON;;;;;N;;;;; +1F5C4;FILE CABINET;So;0;ON;;;;;N;;;;; +1F5C5;EMPTY NOTE;So;0;ON;;;;;N;;;;; +1F5C6;EMPTY NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5C7;EMPTY NOTE PAD;So;0;ON;;;;;N;;;;; +1F5C8;NOTE;So;0;ON;;;;;N;;;;; +1F5C9;NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5CA;NOTE PAD;So;0;ON;;;;;N;;;;; +1F5CB;EMPTY DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CC;EMPTY PAGE;So;0;ON;;;;;N;;;;; +1F5CD;EMPTY PAGES;So;0;ON;;;;;N;;;;; +1F5CE;DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CF;PAGE;So;0;ON;;;;;N;;;;; +1F5D0;PAGES;So;0;ON;;;;;N;;;;; +1F5D1;WASTEBASKET;So;0;ON;;;;;N;;;;; +1F5D2;SPIRAL NOTE PAD;So;0;ON;;;;;N;;;;; +1F5D3;SPIRAL CALENDAR PAD;So;0;ON;;;;;N;;;;; +1F5D4;DESKTOP WINDOW;So;0;ON;;;;;N;;;;; +1F5D5;MINIMIZE;So;0;ON;;;;;N;;;;; +1F5D6;MAXIMIZE;So;0;ON;;;;;N;;;;; +1F5D7;OVERLAP;So;0;ON;;;;;N;;;;; +1F5D8;CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F5D9;CANCELLATION X;So;0;ON;;;;;N;;;;; +1F5DA;INCREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DB;DECREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DC;COMPRESSION;So;0;ON;;;;;N;;;;; +1F5DD;OLD KEY;So;0;ON;;;;;N;;;;; +1F5DE;ROLLED-UP NEWSPAPER;So;0;ON;;;;;N;;;;; +1F5DF;PAGE WITH CIRCLED TEXT;So;0;ON;;;;;N;;;;; +1F5E0;STOCK CHART;So;0;ON;;;;;N;;;;; +1F5E1;DAGGER KNIFE;So;0;ON;;;;;N;;;;; +1F5E2;LIPS;So;0;ON;;;;;N;;;;; +1F5E3;SPEAKING HEAD IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F5E4;THREE RAYS ABOVE;So;0;ON;;;;;N;;;;; +1F5E5;THREE RAYS BELOW;So;0;ON;;;;;N;;;;; +1F5E6;THREE RAYS LEFT;So;0;ON;;;;;N;;;;; +1F5E7;THREE RAYS RIGHT;So;0;ON;;;;;N;;;;; +1F5E8;LEFT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5E9;RIGHT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5EA;TWO SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EB;THREE SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EC;LEFT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5ED;RIGHT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5EE;LEFT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5EF;RIGHT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5F0;MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F1;LIGHTNING MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F2;LIGHTNING MOOD;So;0;ON;;;;;N;;;;; +1F5F3;BALLOT BOX WITH BALLOT;So;0;ON;;;;;N;;;;; +1F5F4;BALLOT SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F5;BALLOT BOX WITH SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F6;BALLOT BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F7;BALLOT BOX WITH BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F8;LIGHT CHECK MARK;So;0;ON;;;;;N;;;;; +1F5F9;BALLOT BOX WITH BOLD CHECK;So;0;ON;;;;;N;;;;; +1F5FA;WORLD MAP;So;0;ON;;;;;N;;;;; +1F5FB;MOUNT FUJI;So;0;ON;;;;;N;;;;; +1F5FC;TOKYO TOWER;So;0;ON;;;;;N;;;;; +1F5FD;STATUE OF LIBERTY;So;0;ON;;;;;N;;;;; +1F5FE;SILHOUETTE OF JAPAN;So;0;ON;;;;;N;;;;; +1F5FF;MOYAI;So;0;ON;;;;;N;;;;; +1F600;GRINNING FACE;So;0;ON;;;;;N;;;;; +1F601;GRINNING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F602;FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F603;SMILING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F604;SMILING FACE WITH OPEN MOUTH AND SMILING EYES;So;0;ON;;;;;N;;;;; +1F605;SMILING FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F606;SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F607;SMILING FACE WITH HALO;So;0;ON;;;;;N;;;;; +1F608;SMILING FACE WITH HORNS;So;0;ON;;;;;N;;;;; +1F609;WINKING FACE;So;0;ON;;;;;N;;;;; +1F60A;SMILING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F60B;FACE SAVOURING DELICIOUS FOOD;So;0;ON;;;;;N;;;;; +1F60C;RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F60D;SMILING FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F60E;SMILING FACE WITH SUNGLASSES;So;0;ON;;;;;N;;;;; +1F60F;SMIRKING FACE;So;0;ON;;;;;N;;;;; +1F610;NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1F611;EXPRESSIONLESS FACE;So;0;ON;;;;;N;;;;; +1F612;UNAMUSED FACE;So;0;ON;;;;;N;;;;; +1F613;FACE WITH COLD SWEAT;So;0;ON;;;;;N;;;;; +1F614;PENSIVE FACE;So;0;ON;;;;;N;;;;; +1F615;CONFUSED FACE;So;0;ON;;;;;N;;;;; +1F616;CONFOUNDED FACE;So;0;ON;;;;;N;;;;; +1F617;KISSING FACE;So;0;ON;;;;;N;;;;; +1F618;FACE THROWING A KISS;So;0;ON;;;;;N;;;;; +1F619;KISSING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F61A;KISSING FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61B;FACE WITH STUCK-OUT TONGUE;So;0;ON;;;;;N;;;;; +1F61C;FACE WITH STUCK-OUT TONGUE AND WINKING EYE;So;0;ON;;;;;N;;;;; +1F61D;FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61E;DISAPPOINTED FACE;So;0;ON;;;;;N;;;;; +1F61F;WORRIED FACE;So;0;ON;;;;;N;;;;; +1F620;ANGRY FACE;So;0;ON;;;;;N;;;;; +1F621;POUTING FACE;So;0;ON;;;;;N;;;;; +1F622;CRYING FACE;So;0;ON;;;;;N;;;;; +1F623;PERSEVERING FACE;So;0;ON;;;;;N;;;;; +1F624;FACE WITH LOOK OF TRIUMPH;So;0;ON;;;;;N;;;;; +1F625;DISAPPOINTED BUT RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F626;FROWNING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F627;ANGUISHED FACE;So;0;ON;;;;;N;;;;; +1F628;FEARFUL FACE;So;0;ON;;;;;N;;;;; +1F629;WEARY FACE;So;0;ON;;;;;N;;;;; +1F62A;SLEEPY FACE;So;0;ON;;;;;N;;;;; +1F62B;TIRED FACE;So;0;ON;;;;;N;;;;; +1F62C;GRIMACING FACE;So;0;ON;;;;;N;;;;; +1F62D;LOUDLY CRYING FACE;So;0;ON;;;;;N;;;;; +1F62E;FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F62F;HUSHED FACE;So;0;ON;;;;;N;;;;; +1F630;FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F631;FACE SCREAMING IN FEAR;So;0;ON;;;;;N;;;;; +1F632;ASTONISHED FACE;So;0;ON;;;;;N;;;;; +1F633;FLUSHED FACE;So;0;ON;;;;;N;;;;; +1F634;SLEEPING FACE;So;0;ON;;;;;N;;;;; +1F635;DIZZY FACE;So;0;ON;;;;;N;;;;; +1F636;FACE WITHOUT MOUTH;So;0;ON;;;;;N;;;;; +1F637;FACE WITH MEDICAL MASK;So;0;ON;;;;;N;;;;; +1F638;GRINNING CAT FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F639;CAT FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F63A;SMILING CAT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F63B;SMILING CAT FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F63C;CAT FACE WITH WRY SMILE;So;0;ON;;;;;N;;;;; +1F63D;KISSING CAT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F63E;POUTING CAT FACE;So;0;ON;;;;;N;;;;; +1F63F;CRYING CAT FACE;So;0;ON;;;;;N;;;;; +1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; +1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; +1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; +1F643;UPSIDE-DOWN FACE;So;0;ON;;;;;N;;;;; +1F644;FACE WITH ROLLING EYES;So;0;ON;;;;;N;;;;; +1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; +1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; +1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; +1F648;SEE-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F649;HEAR-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64A;SPEAK-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64B;HAPPY PERSON RAISING ONE HAND;So;0;ON;;;;;N;;;;; +1F64C;PERSON RAISING BOTH HANDS IN CELEBRATION;So;0;ON;;;;;N;;;;; +1F64D;PERSON FROWNING;So;0;ON;;;;;N;;;;; +1F64E;PERSON WITH POUTING FACE;So;0;ON;;;;;N;;;;; +1F64F;PERSON WITH FOLDED HANDS;So;0;ON;;;;;N;;;;; +1F650;NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F651;SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F652;NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F653;SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F654;TURNED NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F655;TURNED SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F656;TURNED NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F657;TURNED SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F658;NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F659;SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65A;NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65B;SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65C;HEAVY NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65D;HEAVY SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65E;HEAVY NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65F;HEAVY SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F660;NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F661;SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F662;NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F663;SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F664;HEAVY NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F665;HEAVY SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F666;HEAVY NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F667;HEAVY SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F668;HOLLOW QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F669;HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66A;SOLID QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F66B;SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66C;LEFTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66D;UPWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66E;RIGHTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66F;DOWNWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F670;SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F671;HEAVY SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F672;LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F673;HEAVY LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F674;HEAVY AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F675;SWASH AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F676;SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F677;SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F678;SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F679;HEAVY INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67A;SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67B;HEAVY SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67C;VERY HEAVY SOLIDUS;So;0;ON;;;;;N;;;;; +1F67D;VERY HEAVY REVERSE SOLIDUS;So;0;ON;;;;;N;;;;; +1F67E;CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F67F;REVERSE CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F680;ROCKET;So;0;ON;;;;;N;;;;; +1F681;HELICOPTER;So;0;ON;;;;;N;;;;; +1F682;STEAM LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F683;RAILWAY CAR;So;0;ON;;;;;N;;;;; +1F684;HIGH-SPEED TRAIN;So;0;ON;;;;;N;;;;; +1F685;HIGH-SPEED TRAIN WITH BULLET NOSE;So;0;ON;;;;;N;;;;; +1F686;TRAIN;So;0;ON;;;;;N;;;;; +1F687;METRO;So;0;ON;;;;;N;;;;; +1F688;LIGHT RAIL;So;0;ON;;;;;N;;;;; +1F689;STATION;So;0;ON;;;;;N;;;;; +1F68A;TRAM;So;0;ON;;;;;N;;;;; +1F68B;TRAM CAR;So;0;ON;;;;;N;;;;; +1F68C;BUS;So;0;ON;;;;;N;;;;; +1F68D;ONCOMING BUS;So;0;ON;;;;;N;;;;; +1F68E;TROLLEYBUS;So;0;ON;;;;;N;;;;; +1F68F;BUS STOP;So;0;ON;;;;;N;;;;; +1F690;MINIBUS;So;0;ON;;;;;N;;;;; +1F691;AMBULANCE;So;0;ON;;;;;N;;;;; +1F692;FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F693;POLICE CAR;So;0;ON;;;;;N;;;;; +1F694;ONCOMING POLICE CAR;So;0;ON;;;;;N;;;;; +1F695;TAXI;So;0;ON;;;;;N;;;;; +1F696;ONCOMING TAXI;So;0;ON;;;;;N;;;;; +1F697;AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F698;ONCOMING AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F699;RECREATIONAL VEHICLE;So;0;ON;;;;;N;;;;; +1F69A;DELIVERY TRUCK;So;0;ON;;;;;N;;;;; +1F69B;ARTICULATED LORRY;So;0;ON;;;;;N;;;;; +1F69C;TRACTOR;So;0;ON;;;;;N;;;;; +1F69D;MONORAIL;So;0;ON;;;;;N;;;;; +1F69E;MOUNTAIN RAILWAY;So;0;ON;;;;;N;;;;; +1F69F;SUSPENSION RAILWAY;So;0;ON;;;;;N;;;;; +1F6A0;MOUNTAIN CABLEWAY;So;0;ON;;;;;N;;;;; +1F6A1;AERIAL TRAMWAY;So;0;ON;;;;;N;;;;; +1F6A2;SHIP;So;0;ON;;;;;N;;;;; +1F6A3;ROWBOAT;So;0;ON;;;;;N;;;;; +1F6A4;SPEEDBOAT;So;0;ON;;;;;N;;;;; +1F6A5;HORIZONTAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A6;VERTICAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A7;CONSTRUCTION SIGN;So;0;ON;;;;;N;;;;; +1F6A8;POLICE CARS REVOLVING LIGHT;So;0;ON;;;;;N;;;;; +1F6A9;TRIANGULAR FLAG ON POST;So;0;ON;;;;;N;;;;; +1F6AA;DOOR;So;0;ON;;;;;N;;;;; +1F6AB;NO ENTRY SIGN;So;0;ON;;;;;N;;;;; +1F6AC;SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AD;NO SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AE;PUT LITTER IN ITS PLACE SYMBOL;So;0;ON;;;;;N;;;;; +1F6AF;DO NOT LITTER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B0;POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B1;NON-POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B2;BICYCLE;So;0;ON;;;;;N;;;;; +1F6B3;NO BICYCLES;So;0;ON;;;;;N;;;;; +1F6B4;BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B5;MOUNTAIN BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B6;PEDESTRIAN;So;0;ON;;;;;N;;;;; +1F6B7;NO PEDESTRIANS;So;0;ON;;;;;N;;;;; +1F6B8;CHILDREN CROSSING;So;0;ON;;;;;N;;;;; +1F6B9;MENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BA;WOMENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BB;RESTROOM;So;0;ON;;;;;N;;;;; +1F6BC;BABY SYMBOL;So;0;ON;;;;;N;;;;; +1F6BD;TOILET;So;0;ON;;;;;N;;;;; +1F6BE;WATER CLOSET;So;0;ON;;;;;N;;;;; +1F6BF;SHOWER;So;0;ON;;;;;N;;;;; +1F6C0;BATH;So;0;ON;;;;;N;;;;; +1F6C1;BATHTUB;So;0;ON;;;;;N;;;;; +1F6C2;PASSPORT CONTROL;So;0;ON;;;;;N;;;;; +1F6C3;CUSTOMS;So;0;ON;;;;;N;;;;; +1F6C4;BAGGAGE CLAIM;So;0;ON;;;;;N;;;;; +1F6C5;LEFT LUGGAGE;So;0;ON;;;;;N;;;;; +1F6C6;TRIANGLE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +1F6C7;PROHIBITED SIGN;So;0;ON;;;;;N;;;;; +1F6C8;CIRCLED INFORMATION SOURCE;So;0;ON;;;;;N;;;;; +1F6C9;BOYS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CA;GIRLS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CB;COUCH AND LAMP;So;0;ON;;;;;N;;;;; +1F6CC;SLEEPING ACCOMMODATION;So;0;ON;;;;;N;;;;; +1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;; +1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; +1F6CF;BED;So;0;ON;;;;;N;;;;; +1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; +1F6D1;OCTAGONAL SIGN;So;0;ON;;;;;N;;;;; +1F6D2;SHOPPING TROLLEY;So;0;ON;;;;;N;;;;; +1F6D3;STUPA;So;0;ON;;;;;N;;;;; +1F6D4;PAGODA;So;0;ON;;;;;N;;;;; +1F6D5;HINDU TEMPLE;So;0;ON;;;;;N;;;;; +1F6D6;HUT;So;0;ON;;;;;N;;;;; +1F6D7;ELEVATOR;So;0;ON;;;;;N;;;;; +1F6D8;LANDSLIDE;So;0;ON;;;;;N;;;;; +1F6DC;WIRELESS;So;0;ON;;;;;N;;;;; +1F6DD;PLAYGROUND SLIDE;So;0;ON;;;;;N;;;;; +1F6DE;WHEEL;So;0;ON;;;;;N;;;;; +1F6DF;RING BUOY;So;0;ON;;;;;N;;;;; +1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; +1F6E1;SHIELD;So;0;ON;;;;;N;;;;; +1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; +1F6E3;MOTORWAY;So;0;ON;;;;;N;;;;; +1F6E4;RAILWAY TRACK;So;0;ON;;;;;N;;;;; +1F6E5;MOTOR BOAT;So;0;ON;;;;;N;;;;; +1F6E6;UP-POINTING MILITARY AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E7;UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E8;UP-POINTING SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E9;SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EA;NORTHEAST-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EB;AIRPLANE DEPARTURE;So;0;ON;;;;;N;;;;; +1F6EC;AIRPLANE ARRIVING;So;0;ON;;;;;N;;;;; +1F6F0;SATELLITE;So;0;ON;;;;;N;;;;; +1F6F1;ONCOMING FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F6F2;DIESEL LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F6F3;PASSENGER SHIP;So;0;ON;;;;;N;;;;; +1F6F4;SCOOTER;So;0;ON;;;;;N;;;;; +1F6F5;MOTOR SCOOTER;So;0;ON;;;;;N;;;;; +1F6F6;CANOE;So;0;ON;;;;;N;;;;; +1F6F7;SLED;So;0;ON;;;;;N;;;;; +1F6F8;FLYING SAUCER;So;0;ON;;;;;N;;;;; +1F6F9;SKATEBOARD;So;0;ON;;;;;N;;;;; +1F6FA;AUTO RICKSHAW;So;0;ON;;;;;N;;;;; +1F6FB;PICKUP TRUCK;So;0;ON;;;;;N;;;;; +1F6FC;ROLLER SKATE;So;0;ON;;;;;N;;;;; +1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;; +1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;; +1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;; +1F703;ALCHEMICAL SYMBOL FOR EARTH;So;0;ON;;;;;N;;;;; +1F704;ALCHEMICAL SYMBOL FOR WATER;So;0;ON;;;;;N;;;;; +1F705;ALCHEMICAL SYMBOL FOR AQUAFORTIS;So;0;ON;;;;;N;;;;; +1F706;ALCHEMICAL SYMBOL FOR AQUA REGIA;So;0;ON;;;;;N;;;;; +1F707;ALCHEMICAL SYMBOL FOR AQUA REGIA-2;So;0;ON;;;;;N;;;;; +1F708;ALCHEMICAL SYMBOL FOR AQUA VITAE;So;0;ON;;;;;N;;;;; +1F709;ALCHEMICAL SYMBOL FOR AQUA VITAE-2;So;0;ON;;;;;N;;;;; +1F70A;ALCHEMICAL SYMBOL FOR VINEGAR;So;0;ON;;;;;N;;;;; +1F70B;ALCHEMICAL SYMBOL FOR VINEGAR-2;So;0;ON;;;;;N;;;;; +1F70C;ALCHEMICAL SYMBOL FOR VINEGAR-3;So;0;ON;;;;;N;;;;; +1F70D;ALCHEMICAL SYMBOL FOR SULFUR;So;0;ON;;;;;N;;;;; +1F70E;ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR;So;0;ON;;;;;N;;;;; +1F70F;ALCHEMICAL SYMBOL FOR BLACK SULFUR;So;0;ON;;;;;N;;;;; +1F710;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE;So;0;ON;;;;;N;;;;; +1F711;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2;So;0;ON;;;;;N;;;;; +1F712;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3;So;0;ON;;;;;N;;;;; +1F713;ALCHEMICAL SYMBOL FOR CINNABAR;So;0;ON;;;;;N;;;;; +1F714;ALCHEMICAL SYMBOL FOR SALT;So;0;ON;;;;;N;;;;; +1F715;ALCHEMICAL SYMBOL FOR NITRE;So;0;ON;;;;;N;;;;; +1F716;ALCHEMICAL SYMBOL FOR VITRIOL;So;0;ON;;;;;N;;;;; +1F717;ALCHEMICAL SYMBOL FOR VITRIOL-2;So;0;ON;;;;;N;;;;; +1F718;ALCHEMICAL SYMBOL FOR ROCK SALT;So;0;ON;;;;;N;;;;; +1F719;ALCHEMICAL SYMBOL FOR ROCK SALT-2;So;0;ON;;;;;N;;;;; +1F71A;ALCHEMICAL SYMBOL FOR GOLD;So;0;ON;;;;;N;;;;; +1F71B;ALCHEMICAL SYMBOL FOR SILVER;So;0;ON;;;;;N;;;;; +1F71C;ALCHEMICAL SYMBOL FOR IRON ORE;So;0;ON;;;;;N;;;;; +1F71D;ALCHEMICAL SYMBOL FOR IRON ORE-2;So;0;ON;;;;;N;;;;; +1F71E;ALCHEMICAL SYMBOL FOR CROCUS OF IRON;So;0;ON;;;;;N;;;;; +1F71F;ALCHEMICAL SYMBOL FOR REGULUS OF IRON;So;0;ON;;;;;N;;;;; +1F720;ALCHEMICAL SYMBOL FOR COPPER ORE;So;0;ON;;;;;N;;;;; +1F721;ALCHEMICAL SYMBOL FOR IRON-COPPER ORE;So;0;ON;;;;;N;;;;; +1F722;ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER;So;0;ON;;;;;N;;;;; +1F723;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER;So;0;ON;;;;;N;;;;; +1F724;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2;So;0;ON;;;;;N;;;;; +1F725;ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F726;ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F727;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER;So;0;ON;;;;;N;;;;; +1F728;ALCHEMICAL SYMBOL FOR VERDIGRIS;So;0;ON;;;;;N;;;;; +1F729;ALCHEMICAL SYMBOL FOR TIN ORE;So;0;ON;;;;;N;;;;; +1F72A;ALCHEMICAL SYMBOL FOR LEAD ORE;So;0;ON;;;;;N;;;;; +1F72B;ALCHEMICAL SYMBOL FOR ANTIMONY ORE;So;0;ON;;;;;N;;;;; +1F72C;ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72D;ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72E;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72F;ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F730;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F731;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2;So;0;ON;;;;;N;;;;; +1F732;ALCHEMICAL SYMBOL FOR REGULUS;So;0;ON;;;;;N;;;;; +1F733;ALCHEMICAL SYMBOL FOR REGULUS-2;So;0;ON;;;;;N;;;;; +1F734;ALCHEMICAL SYMBOL FOR REGULUS-3;So;0;ON;;;;;N;;;;; +1F735;ALCHEMICAL SYMBOL FOR REGULUS-4;So;0;ON;;;;;N;;;;; +1F736;ALCHEMICAL SYMBOL FOR ALKALI;So;0;ON;;;;;N;;;;; +1F737;ALCHEMICAL SYMBOL FOR ALKALI-2;So;0;ON;;;;;N;;;;; +1F738;ALCHEMICAL SYMBOL FOR MARCASITE;So;0;ON;;;;;N;;;;; +1F739;ALCHEMICAL SYMBOL FOR SAL-AMMONIAC;So;0;ON;;;;;N;;;;; +1F73A;ALCHEMICAL SYMBOL FOR ARSENIC;So;0;ON;;;;;N;;;;; +1F73B;ALCHEMICAL SYMBOL FOR REALGAR;So;0;ON;;;;;N;;;;; +1F73C;ALCHEMICAL SYMBOL FOR REALGAR-2;So;0;ON;;;;;N;;;;; +1F73D;ALCHEMICAL SYMBOL FOR AURIPIGMENT;So;0;ON;;;;;N;;;;; +1F73E;ALCHEMICAL SYMBOL FOR BISMUTH ORE;So;0;ON;;;;;N;;;;; +1F73F;ALCHEMICAL SYMBOL FOR TARTAR;So;0;ON;;;;;N;;;;; +1F740;ALCHEMICAL SYMBOL FOR TARTAR-2;So;0;ON;;;;;N;;;;; +1F741;ALCHEMICAL SYMBOL FOR QUICK LIME;So;0;ON;;;;;N;;;;; +1F742;ALCHEMICAL SYMBOL FOR BORAX;So;0;ON;;;;;N;;;;; +1F743;ALCHEMICAL SYMBOL FOR BORAX-2;So;0;ON;;;;;N;;;;; +1F744;ALCHEMICAL SYMBOL FOR BORAX-3;So;0;ON;;;;;N;;;;; +1F745;ALCHEMICAL SYMBOL FOR ALUM;So;0;ON;;;;;N;;;;; +1F746;ALCHEMICAL SYMBOL FOR OIL;So;0;ON;;;;;N;;;;; +1F747;ALCHEMICAL SYMBOL FOR SPIRIT;So;0;ON;;;;;N;;;;; +1F748;ALCHEMICAL SYMBOL FOR TINCTURE;So;0;ON;;;;;N;;;;; +1F749;ALCHEMICAL SYMBOL FOR GUM;So;0;ON;;;;;N;;;;; +1F74A;ALCHEMICAL SYMBOL FOR WAX;So;0;ON;;;;;N;;;;; +1F74B;ALCHEMICAL SYMBOL FOR POWDER;So;0;ON;;;;;N;;;;; +1F74C;ALCHEMICAL SYMBOL FOR CALX;So;0;ON;;;;;N;;;;; +1F74D;ALCHEMICAL SYMBOL FOR TUTTY;So;0;ON;;;;;N;;;;; +1F74E;ALCHEMICAL SYMBOL FOR CAPUT MORTUUM;So;0;ON;;;;;N;;;;; +1F74F;ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE;So;0;ON;;;;;N;;;;; +1F750;ALCHEMICAL SYMBOL FOR CADUCEUS;So;0;ON;;;;;N;;;;; +1F751;ALCHEMICAL SYMBOL FOR TRIDENT;So;0;ON;;;;;N;;;;; +1F752;ALCHEMICAL SYMBOL FOR STARRED TRIDENT;So;0;ON;;;;;N;;;;; +1F753;ALCHEMICAL SYMBOL FOR LODESTONE;So;0;ON;;;;;N;;;;; +1F754;ALCHEMICAL SYMBOL FOR SOAP;So;0;ON;;;;;N;;;;; +1F755;ALCHEMICAL SYMBOL FOR URINE;So;0;ON;;;;;N;;;;; +1F756;ALCHEMICAL SYMBOL FOR HORSE DUNG;So;0;ON;;;;;N;;;;; +1F757;ALCHEMICAL SYMBOL FOR ASHES;So;0;ON;;;;;N;;;;; +1F758;ALCHEMICAL SYMBOL FOR POT ASHES;So;0;ON;;;;;N;;;;; +1F759;ALCHEMICAL SYMBOL FOR BRICK;So;0;ON;;;;;N;;;;; +1F75A;ALCHEMICAL SYMBOL FOR POWDERED BRICK;So;0;ON;;;;;N;;;;; +1F75B;ALCHEMICAL SYMBOL FOR AMALGAM;So;0;ON;;;;;N;;;;; +1F75C;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM;So;0;ON;;;;;N;;;;; +1F75D;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2;So;0;ON;;;;;N;;;;; +1F75E;ALCHEMICAL SYMBOL FOR SUBLIMATION;So;0;ON;;;;;N;;;;; +1F75F;ALCHEMICAL SYMBOL FOR PRECIPITATE;So;0;ON;;;;;N;;;;; +1F760;ALCHEMICAL SYMBOL FOR DISTILL;So;0;ON;;;;;N;;;;; +1F761;ALCHEMICAL SYMBOL FOR DISSOLVE;So;0;ON;;;;;N;;;;; +1F762;ALCHEMICAL SYMBOL FOR DISSOLVE-2;So;0;ON;;;;;N;;;;; +1F763;ALCHEMICAL SYMBOL FOR PURIFY;So;0;ON;;;;;N;;;;; +1F764;ALCHEMICAL SYMBOL FOR PUTREFACTION;So;0;ON;;;;;N;;;;; +1F765;ALCHEMICAL SYMBOL FOR CRUCIBLE;So;0;ON;;;;;N;;;;; +1F766;ALCHEMICAL SYMBOL FOR CRUCIBLE-2;So;0;ON;;;;;N;;;;; +1F767;ALCHEMICAL SYMBOL FOR CRUCIBLE-3;So;0;ON;;;;;N;;;;; +1F768;ALCHEMICAL SYMBOL FOR CRUCIBLE-4;So;0;ON;;;;;N;;;;; +1F769;ALCHEMICAL SYMBOL FOR CRUCIBLE-5;So;0;ON;;;;;N;;;;; +1F76A;ALCHEMICAL SYMBOL FOR ALEMBIC;So;0;ON;;;;;N;;;;; +1F76B;ALCHEMICAL SYMBOL FOR BATH OF MARY;So;0;ON;;;;;N;;;;; +1F76C;ALCHEMICAL SYMBOL FOR BATH OF VAPOURS;So;0;ON;;;;;N;;;;; +1F76D;ALCHEMICAL SYMBOL FOR RETORT;So;0;ON;;;;;N;;;;; +1F76E;ALCHEMICAL SYMBOL FOR HOUR;So;0;ON;;;;;N;;;;; +1F76F;ALCHEMICAL SYMBOL FOR NIGHT;So;0;ON;;;;;N;;;;; +1F770;ALCHEMICAL SYMBOL FOR DAY-NIGHT;So;0;ON;;;;;N;;;;; +1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;; +1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;; +1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;; +1F774;LOT OF FORTUNE;So;0;ON;;;;;N;;;;; +1F775;OCCULTATION;So;0;ON;;;;;N;;;;; +1F776;LUNAR ECLIPSE;So;0;ON;;;;;N;;;;; +1F777;VESTA FORM TWO;So;0;ON;;;;;N;;;;; +1F778;ASTRAEA FORM TWO;So;0;ON;;;;;N;;;;; +1F779;HYGIEA FORM TWO;So;0;ON;;;;;N;;;;; +1F77A;PARTHENOPE FORM TWO;So;0;ON;;;;;N;;;;; +1F77B;HAUMEA;So;0;ON;;;;;N;;;;; +1F77C;MAKEMAKE;So;0;ON;;;;;N;;;;; +1F77D;GONGGONG;So;0;ON;;;;;N;;;;; +1F77E;QUAOAR;So;0;ON;;;;;N;;;;; +1F77F;ORCUS;So;0;ON;;;;;N;;;;; +1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F783;BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F784;BLACK SLIGHTLY SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F785;MEDIUM BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F786;BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F787;HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F788;VERY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F789;EXTREMELY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F78A;WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F78B;ROUND TARGET;So;0;ON;;;;;N;;;;; +1F78C;BLACK TINY SQUARE;So;0;ON;;;;;N;;;;; +1F78D;BLACK SLIGHTLY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F78E;LIGHT WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F78F;MEDIUM WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F790;BOLD WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F791;HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F792;VERY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F793;EXTREMELY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F794;WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F795;WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE;So;0;ON;;;;;N;;;;; +1F796;SQUARE TARGET;So;0;ON;;;;;N;;;;; +1F797;BLACK TINY DIAMOND;So;0;ON;;;;;N;;;;; +1F798;BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F799;BLACK MEDIUM SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79A;WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79B;WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +1F79C;DIAMOND TARGET;So;0;ON;;;;;N;;;;; +1F79D;BLACK TINY LOZENGE;So;0;ON;;;;;N;;;;; +1F79E;BLACK VERY SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F79F;BLACK MEDIUM SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A0;WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A1;THIN GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A2;LIGHT GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A3;MEDIUM GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A4;BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A5;VERY BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A6;VERY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A7;EXTREMELY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A8;THIN SALTIRE;So;0;ON;;;;;N;;;;; +1F7A9;LIGHT SALTIRE;So;0;ON;;;;;N;;;;; +1F7AA;MEDIUM SALTIRE;So;0;ON;;;;;N;;;;; +1F7AB;BOLD SALTIRE;So;0;ON;;;;;N;;;;; +1F7AC;HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AD;VERY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AE;EXTREMELY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AF;LIGHT FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B0;MEDIUM FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B1;BOLD FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B2;HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B3;VERY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B4;EXTREMELY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B5;LIGHT SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B6;MEDIUM SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B7;BOLD SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B8;HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B9;VERY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BA;EXTREMELY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BB;LIGHT EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BC;MEDIUM EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BD;BOLD EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BE;HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BF;VERY HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7C0;LIGHT THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C1;MEDIUM THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C2;THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C3;MEDIUM THREE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C4;LIGHT FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C5;MEDIUM FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C6;FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C7;MEDIUM FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C8;REVERSE LIGHT FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C9;LIGHT FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CA;HEAVY FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CB;MEDIUM SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CC;HEAVY SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CD;SIX POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7CE;MEDIUM EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CF;HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D0;VERY HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D1;HEAVY EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7D5;CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;; +1F7D6;NEGATIVE CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;; +1F7D7;CIRCLED SQUARE;So;0;ON;;;;;N;;;;; +1F7D8;NEGATIVE CIRCLED SQUARE;So;0;ON;;;;;N;;;;; +1F7D9;NINE POINTED WHITE STAR;So;0;ON;;;;;N;;;;; +1F7E0;LARGE ORANGE CIRCLE;So;0;ON;;;;;N;;;;; +1F7E1;LARGE YELLOW CIRCLE;So;0;ON;;;;;N;;;;; +1F7E2;LARGE GREEN CIRCLE;So;0;ON;;;;;N;;;;; +1F7E3;LARGE PURPLE CIRCLE;So;0;ON;;;;;N;;;;; +1F7E4;LARGE BROWN CIRCLE;So;0;ON;;;;;N;;;;; +1F7E5;LARGE RED SQUARE;So;0;ON;;;;;N;;;;; +1F7E6;LARGE BLUE SQUARE;So;0;ON;;;;;N;;;;; +1F7E7;LARGE ORANGE SQUARE;So;0;ON;;;;;N;;;;; +1F7E8;LARGE YELLOW SQUARE;So;0;ON;;;;;N;;;;; +1F7E9;LARGE GREEN SQUARE;So;0;ON;;;;;N;;;;; +1F7EA;LARGE PURPLE SQUARE;So;0;ON;;;;;N;;;;; +1F7EB;LARGE BROWN SQUARE;So;0;ON;;;;;N;;;;; +1F7F0;HEAVY EQUALS SIGN;So;0;ON;;;;;N;;;;; +1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F803;DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F804;LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F805;UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F806;RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F807;DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F808;LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F809;UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80A;RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80B;DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F810;LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F811;UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F812;RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F813;DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F814;LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F815;UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F816;RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F817;DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F818;HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F819;HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81A;HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81B;HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81C;HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81D;HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81E;HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81F;HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F820;LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F821;UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F822;RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F823;DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F824;LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F825;UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F826;RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F827;DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F828;LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F829;UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82A;RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82B;DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82C;LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82D;UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82E;RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82F;DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F830;LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F831;UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F832;RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F833;DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F834;LEFTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F835;UPWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F836;RIGHTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F837;DOWNWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F838;LEFTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F839;UPWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83A;RIGHTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83B;DOWNWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83C;LEFTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83D;UPWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83E;RIGHTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83F;DOWNWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F840;LEFTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F841;UPWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F842;RIGHTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F843;DOWNWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F844;LEFTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F845;UPWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F846;RIGHTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F847;DOWNWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F850;LEFTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F851;UPWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F852;RIGHTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F853;DOWNWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F854;NORTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F855;NORTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F856;SOUTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F857;SOUTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F858;LEFT RIGHT SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F859;UP DOWN SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F860;WIDE-HEADED LEFTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F861;WIDE-HEADED UPWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F862;WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F863;WIDE-HEADED DOWNWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F864;WIDE-HEADED NORTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F865;WIDE-HEADED NORTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F866;WIDE-HEADED SOUTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F867;WIDE-HEADED SOUTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F868;WIDE-HEADED LEFTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F869;WIDE-HEADED UPWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86A;WIDE-HEADED RIGHTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86B;WIDE-HEADED DOWNWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86C;WIDE-HEADED NORTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86D;WIDE-HEADED NORTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86E;WIDE-HEADED SOUTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86F;WIDE-HEADED SOUTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F870;WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F871;WIDE-HEADED UPWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F872;WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F873;WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F874;WIDE-HEADED NORTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F875;WIDE-HEADED NORTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F876;WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F877;WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F878;WIDE-HEADED LEFTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F879;WIDE-HEADED UPWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87A;WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87B;WIDE-HEADED DOWNWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87C;WIDE-HEADED NORTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87D;WIDE-HEADED NORTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87E;WIDE-HEADED SOUTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87F;WIDE-HEADED SOUTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F880;WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F881;WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F882;WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F883;WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F884;WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F885;WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F886;WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F887;WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F890;LEFTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F891;UPWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F892;RIGHTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F893;DOWNWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F894;LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F895;UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F896;RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F897;DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F898;LEFTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F899;UPWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89A;RIGHTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89B;DOWNWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89C;HEAVY ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F89D;HEAVY ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F89E;HEAVY ARROW SHAFT WIDTH ONE HALF;So;0;ON;;;;;N;;;;; +1F89F;HEAVY ARROW SHAFT WIDTH ONE THIRD;So;0;ON;;;;;N;;;;; +1F8A0;LEFTWARDS BOTTOM-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A1;RIGHTWARDS BOTTOM SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A2;LEFTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A3;RIGHTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A4;LEFTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A5;RIGHTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A6;LEFTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A7;RIGHTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A8;LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A9;RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AA;LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F8B0;ARROW POINTING UPWARDS THEN NORTH WEST;So;0;ON;;;;;N;;;;; +1F8B1;ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST;So;0;ON;;;;;N;;;;; +1F8B2;RIGHTWARDS ARROW WITH LOWER HOOK;So;0;ON;;;;;N;;;;; +1F8B3;DOWNWARDS BLACK ARROW TO BAR;So;0;ON;;;;;N;;;;; +1F8B4;NEGATIVE SQUARED LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8B5;NEGATIVE SQUARED UPWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8B6;NEGATIVE SQUARED RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8B7;NEGATIVE SQUARED DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8B8;NORTH WEST ARROW FROM BAR;So;0;ON;;;;;N;;;;; +1F8B9;NORTH EAST ARROW FROM BAR;So;0;ON;;;;;N;;;;; +1F8BA;SOUTH EAST ARROW FROM BAR;So;0;ON;;;;;N;;;;; +1F8BB;SOUTH WEST ARROW FROM BAR;So;0;ON;;;;;N;;;;; +1F8C0;LEFTWARDS ARROW FROM DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8C1;RIGHTWARDS ARROW FROM DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +1F8D0;LONG RIGHTWARDS ARROW OVER LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +1F8D1;LONG RIGHTWARDS HARPOON OVER LONG LEFTWARDS HARPOON;Sm;0;ON;;;;;N;;;;; +1F8D2;LONG RIGHTWARDS HARPOON ABOVE SHORT LEFTWARDS HARPOON;Sm;0;ON;;;;;N;;;;; +1F8D3;SHORT RIGHTWARDS HARPOON ABOVE LONG LEFTWARDS HARPOON;Sm;0;ON;;;;;N;;;;; +1F8D4;LONG LEFTWARDS HARPOON ABOVE SHORT RIGHTWARDS HARPOON;Sm;0;ON;;;;;N;;;;; +1F8D5;SHORT LEFTWARDS HARPOON ABOVE LONG RIGHTWARDS HARPOON;Sm;0;ON;;;;;N;;;;; +1F8D6;LONG RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +1F8D7;LONG RIGHTWARDS ARROW WITH DOUBLE SLASH;Sm;0;ON;;;;;N;;;;; +1F8D8;LONG LEFT RIGHT ARROW WITH DEPENDENT LOBE;Sm;0;ON;;;;;N;;;;; +1F900;CIRCLED CROSS FORMEE WITH FOUR DOTS;So;0;ON;;;;;N;;;;; +1F901;CIRCLED CROSS FORMEE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +1F902;CIRCLED CROSS FORMEE;So;0;ON;;;;;N;;;;; +1F903;LEFT HALF CIRCLE WITH FOUR DOTS;So;0;ON;;;;;N;;;;; +1F904;LEFT HALF CIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F905;LEFT HALF CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +1F906;LEFT HALF CIRCLE WITH DOT;So;0;ON;;;;;N;;;;; +1F907;LEFT HALF CIRCLE;So;0;ON;;;;;N;;;;; +1F908;DOWNWARD FACING HOOK;So;0;ON;;;;;N;;;;; +1F909;DOWNWARD FACING NOTCHED HOOK;So;0;ON;;;;;N;;;;; +1F90A;DOWNWARD FACING HOOK WITH DOT;So;0;ON;;;;;N;;;;; +1F90B;DOWNWARD FACING NOTCHED HOOK WITH DOT;So;0;ON;;;;;N;;;;; +1F90C;PINCHED FINGERS;So;0;ON;;;;;N;;;;; +1F90D;WHITE HEART;So;0;ON;;;;;N;;;;; +1F90E;BROWN HEART;So;0;ON;;;;;N;;;;; +1F90F;PINCHING HAND;So;0;ON;;;;;N;;;;; +1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;; +1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;; +1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;; +1F913;NERD FACE;So;0;ON;;;;;N;;;;; +1F914;THINKING FACE;So;0;ON;;;;;N;;;;; +1F915;FACE WITH HEAD-BANDAGE;So;0;ON;;;;;N;;;;; +1F916;ROBOT FACE;So;0;ON;;;;;N;;;;; +1F917;HUGGING FACE;So;0;ON;;;;;N;;;;; +1F918;SIGN OF THE HORNS;So;0;ON;;;;;N;;;;; +1F919;CALL ME HAND;So;0;ON;;;;;N;;;;; +1F91A;RAISED BACK OF HAND;So;0;ON;;;;;N;;;;; +1F91B;LEFT-FACING FIST;So;0;ON;;;;;N;;;;; +1F91C;RIGHT-FACING FIST;So;0;ON;;;;;N;;;;; +1F91D;HANDSHAKE;So;0;ON;;;;;N;;;;; +1F91E;HAND WITH INDEX AND MIDDLE FINGERS CROSSED;So;0;ON;;;;;N;;;;; +1F91F;I LOVE YOU HAND SIGN;So;0;ON;;;;;N;;;;; +1F920;FACE WITH COWBOY HAT;So;0;ON;;;;;N;;;;; +1F921;CLOWN FACE;So;0;ON;;;;;N;;;;; +1F922;NAUSEATED FACE;So;0;ON;;;;;N;;;;; +1F923;ROLLING ON THE FLOOR LAUGHING;So;0;ON;;;;;N;;;;; +1F924;DROOLING FACE;So;0;ON;;;;;N;;;;; +1F925;LYING FACE;So;0;ON;;;;;N;;;;; +1F926;FACE PALM;So;0;ON;;;;;N;;;;; +1F927;SNEEZING FACE;So;0;ON;;;;;N;;;;; +1F928;FACE WITH ONE EYEBROW RAISED;So;0;ON;;;;;N;;;;; +1F929;GRINNING FACE WITH STAR EYES;So;0;ON;;;;;N;;;;; +1F92A;GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE;So;0;ON;;;;;N;;;;; +1F92B;FACE WITH FINGER COVERING CLOSED LIPS;So;0;ON;;;;;N;;;;; +1F92C;SERIOUS FACE WITH SYMBOLS COVERING MOUTH;So;0;ON;;;;;N;;;;; +1F92D;SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH;So;0;ON;;;;;N;;;;; +1F92E;FACE WITH OPEN MOUTH VOMITING;So;0;ON;;;;;N;;;;; +1F92F;SHOCKED FACE WITH EXPLODING HEAD;So;0;ON;;;;;N;;;;; +1F930;PREGNANT WOMAN;So;0;ON;;;;;N;;;;; +1F931;BREAST-FEEDING;So;0;ON;;;;;N;;;;; +1F932;PALMS UP TOGETHER;So;0;ON;;;;;N;;;;; +1F933;SELFIE;So;0;ON;;;;;N;;;;; +1F934;PRINCE;So;0;ON;;;;;N;;;;; +1F935;MAN IN TUXEDO;So;0;ON;;;;;N;;;;; +1F936;MOTHER CHRISTMAS;So;0;ON;;;;;N;;;;; +1F937;SHRUG;So;0;ON;;;;;N;;;;; +1F938;PERSON DOING CARTWHEEL;So;0;ON;;;;;N;;;;; +1F939;JUGGLING;So;0;ON;;;;;N;;;;; +1F93A;FENCER;So;0;ON;;;;;N;;;;; +1F93B;MODERN PENTATHLON;So;0;ON;;;;;N;;;;; +1F93C;WRESTLERS;So;0;ON;;;;;N;;;;; +1F93D;WATER POLO;So;0;ON;;;;;N;;;;; +1F93E;HANDBALL;So;0;ON;;;;;N;;;;; +1F93F;DIVING MASK;So;0;ON;;;;;N;;;;; +1F940;WILTED FLOWER;So;0;ON;;;;;N;;;;; +1F941;DRUM WITH DRUMSTICKS;So;0;ON;;;;;N;;;;; +1F942;CLINKING GLASSES;So;0;ON;;;;;N;;;;; +1F943;TUMBLER GLASS;So;0;ON;;;;;N;;;;; +1F944;SPOON;So;0;ON;;;;;N;;;;; +1F945;GOAL NET;So;0;ON;;;;;N;;;;; +1F946;RIFLE;So;0;ON;;;;;N;;;;; +1F947;FIRST PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F948;SECOND PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F949;THIRD PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F94A;BOXING GLOVE;So;0;ON;;;;;N;;;;; +1F94B;MARTIAL ARTS UNIFORM;So;0;ON;;;;;N;;;;; +1F94C;CURLING STONE;So;0;ON;;;;;N;;;;; +1F94D;LACROSSE STICK AND BALL;So;0;ON;;;;;N;;;;; +1F94E;SOFTBALL;So;0;ON;;;;;N;;;;; +1F94F;FLYING DISC;So;0;ON;;;;;N;;;;; +1F950;CROISSANT;So;0;ON;;;;;N;;;;; +1F951;AVOCADO;So;0;ON;;;;;N;;;;; +1F952;CUCUMBER;So;0;ON;;;;;N;;;;; +1F953;BACON;So;0;ON;;;;;N;;;;; +1F954;POTATO;So;0;ON;;;;;N;;;;; +1F955;CARROT;So;0;ON;;;;;N;;;;; +1F956;BAGUETTE BREAD;So;0;ON;;;;;N;;;;; +1F957;GREEN SALAD;So;0;ON;;;;;N;;;;; +1F958;SHALLOW PAN OF FOOD;So;0;ON;;;;;N;;;;; +1F959;STUFFED FLATBREAD;So;0;ON;;;;;N;;;;; +1F95A;EGG;So;0;ON;;;;;N;;;;; +1F95B;GLASS OF MILK;So;0;ON;;;;;N;;;;; +1F95C;PEANUTS;So;0;ON;;;;;N;;;;; +1F95D;KIWIFRUIT;So;0;ON;;;;;N;;;;; +1F95E;PANCAKES;So;0;ON;;;;;N;;;;; +1F95F;DUMPLING;So;0;ON;;;;;N;;;;; +1F960;FORTUNE COOKIE;So;0;ON;;;;;N;;;;; +1F961;TAKEOUT BOX;So;0;ON;;;;;N;;;;; +1F962;CHOPSTICKS;So;0;ON;;;;;N;;;;; +1F963;BOWL WITH SPOON;So;0;ON;;;;;N;;;;; +1F964;CUP WITH STRAW;So;0;ON;;;;;N;;;;; +1F965;COCONUT;So;0;ON;;;;;N;;;;; +1F966;BROCCOLI;So;0;ON;;;;;N;;;;; +1F967;PIE;So;0;ON;;;;;N;;;;; +1F968;PRETZEL;So;0;ON;;;;;N;;;;; +1F969;CUT OF MEAT;So;0;ON;;;;;N;;;;; +1F96A;SANDWICH;So;0;ON;;;;;N;;;;; +1F96B;CANNED FOOD;So;0;ON;;;;;N;;;;; +1F96C;LEAFY GREEN;So;0;ON;;;;;N;;;;; +1F96D;MANGO;So;0;ON;;;;;N;;;;; +1F96E;MOON CAKE;So;0;ON;;;;;N;;;;; +1F96F;BAGEL;So;0;ON;;;;;N;;;;; +1F970;SMILING FACE WITH SMILING EYES AND THREE HEARTS;So;0;ON;;;;;N;;;;; +1F971;YAWNING FACE;So;0;ON;;;;;N;;;;; +1F972;SMILING FACE WITH TEAR;So;0;ON;;;;;N;;;;; +1F973;FACE WITH PARTY HORN AND PARTY HAT;So;0;ON;;;;;N;;;;; +1F974;FACE WITH UNEVEN EYES AND WAVY MOUTH;So;0;ON;;;;;N;;;;; +1F975;OVERHEATED FACE;So;0;ON;;;;;N;;;;; +1F976;FREEZING FACE;So;0;ON;;;;;N;;;;; +1F977;NINJA;So;0;ON;;;;;N;;;;; +1F978;DISGUISED FACE;So;0;ON;;;;;N;;;;; +1F979;FACE HOLDING BACK TEARS;So;0;ON;;;;;N;;;;; +1F97A;FACE WITH PLEADING EYES;So;0;ON;;;;;N;;;;; +1F97B;SARI;So;0;ON;;;;;N;;;;; +1F97C;LAB COAT;So;0;ON;;;;;N;;;;; +1F97D;GOGGLES;So;0;ON;;;;;N;;;;; +1F97E;HIKING BOOT;So;0;ON;;;;;N;;;;; +1F97F;FLAT SHOE;So;0;ON;;;;;N;;;;; +1F980;CRAB;So;0;ON;;;;;N;;;;; +1F981;LION FACE;So;0;ON;;;;;N;;;;; +1F982;SCORPION;So;0;ON;;;;;N;;;;; +1F983;TURKEY;So;0;ON;;;;;N;;;;; +1F984;UNICORN FACE;So;0;ON;;;;;N;;;;; +1F985;EAGLE;So;0;ON;;;;;N;;;;; +1F986;DUCK;So;0;ON;;;;;N;;;;; +1F987;BAT;So;0;ON;;;;;N;;;;; +1F988;SHARK;So;0;ON;;;;;N;;;;; +1F989;OWL;So;0;ON;;;;;N;;;;; +1F98A;FOX FACE;So;0;ON;;;;;N;;;;; +1F98B;BUTTERFLY;So;0;ON;;;;;N;;;;; +1F98C;DEER;So;0;ON;;;;;N;;;;; +1F98D;GORILLA;So;0;ON;;;;;N;;;;; +1F98E;LIZARD;So;0;ON;;;;;N;;;;; +1F98F;RHINOCEROS;So;0;ON;;;;;N;;;;; +1F990;SHRIMP;So;0;ON;;;;;N;;;;; +1F991;SQUID;So;0;ON;;;;;N;;;;; +1F992;GIRAFFE FACE;So;0;ON;;;;;N;;;;; +1F993;ZEBRA FACE;So;0;ON;;;;;N;;;;; +1F994;HEDGEHOG;So;0;ON;;;;;N;;;;; +1F995;SAUROPOD;So;0;ON;;;;;N;;;;; +1F996;T-REX;So;0;ON;;;;;N;;;;; +1F997;CRICKET;So;0;ON;;;;;N;;;;; +1F998;KANGAROO;So;0;ON;;;;;N;;;;; +1F999;LLAMA;So;0;ON;;;;;N;;;;; +1F99A;PEACOCK;So;0;ON;;;;;N;;;;; +1F99B;HIPPOPOTAMUS;So;0;ON;;;;;N;;;;; +1F99C;PARROT;So;0;ON;;;;;N;;;;; +1F99D;RACCOON;So;0;ON;;;;;N;;;;; +1F99E;LOBSTER;So;0;ON;;;;;N;;;;; +1F99F;MOSQUITO;So;0;ON;;;;;N;;;;; +1F9A0;MICROBE;So;0;ON;;;;;N;;;;; +1F9A1;BADGER;So;0;ON;;;;;N;;;;; +1F9A2;SWAN;So;0;ON;;;;;N;;;;; +1F9A3;MAMMOTH;So;0;ON;;;;;N;;;;; +1F9A4;DODO;So;0;ON;;;;;N;;;;; +1F9A5;SLOTH;So;0;ON;;;;;N;;;;; +1F9A6;OTTER;So;0;ON;;;;;N;;;;; +1F9A7;ORANGUTAN;So;0;ON;;;;;N;;;;; +1F9A8;SKUNK;So;0;ON;;;;;N;;;;; +1F9A9;FLAMINGO;So;0;ON;;;;;N;;;;; +1F9AA;OYSTER;So;0;ON;;;;;N;;;;; +1F9AB;BEAVER;So;0;ON;;;;;N;;;;; +1F9AC;BISON;So;0;ON;;;;;N;;;;; +1F9AD;SEAL;So;0;ON;;;;;N;;;;; +1F9AE;GUIDE DOG;So;0;ON;;;;;N;;;;; +1F9AF;PROBING CANE;So;0;ON;;;;;N;;;;; +1F9B0;EMOJI COMPONENT RED HAIR;So;0;ON;;;;;N;;;;; +1F9B1;EMOJI COMPONENT CURLY HAIR;So;0;ON;;;;;N;;;;; +1F9B2;EMOJI COMPONENT BALD;So;0;ON;;;;;N;;;;; +1F9B3;EMOJI COMPONENT WHITE HAIR;So;0;ON;;;;;N;;;;; +1F9B4;BONE;So;0;ON;;;;;N;;;;; +1F9B5;LEG;So;0;ON;;;;;N;;;;; +1F9B6;FOOT;So;0;ON;;;;;N;;;;; +1F9B7;TOOTH;So;0;ON;;;;;N;;;;; +1F9B8;SUPERHERO;So;0;ON;;;;;N;;;;; +1F9B9;SUPERVILLAIN;So;0;ON;;;;;N;;;;; +1F9BA;SAFETY VEST;So;0;ON;;;;;N;;;;; +1F9BB;EAR WITH HEARING AID;So;0;ON;;;;;N;;;;; +1F9BC;MOTORIZED WHEELCHAIR;So;0;ON;;;;;N;;;;; +1F9BD;MANUAL WHEELCHAIR;So;0;ON;;;;;N;;;;; +1F9BE;MECHANICAL ARM;So;0;ON;;;;;N;;;;; +1F9BF;MECHANICAL LEG;So;0;ON;;;;;N;;;;; +1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; +1F9C1;CUPCAKE;So;0;ON;;;;;N;;;;; +1F9C2;SALT SHAKER;So;0;ON;;;;;N;;;;; +1F9C3;BEVERAGE BOX;So;0;ON;;;;;N;;;;; +1F9C4;GARLIC;So;0;ON;;;;;N;;;;; +1F9C5;ONION;So;0;ON;;;;;N;;;;; +1F9C6;FALAFEL;So;0;ON;;;;;N;;;;; +1F9C7;WAFFLE;So;0;ON;;;;;N;;;;; +1F9C8;BUTTER;So;0;ON;;;;;N;;;;; +1F9C9;MATE DRINK;So;0;ON;;;;;N;;;;; +1F9CA;ICE CUBE;So;0;ON;;;;;N;;;;; +1F9CB;BUBBLE TEA;So;0;ON;;;;;N;;;;; +1F9CC;TROLL;So;0;ON;;;;;N;;;;; +1F9CD;STANDING PERSON;So;0;ON;;;;;N;;;;; +1F9CE;KNEELING PERSON;So;0;ON;;;;;N;;;;; +1F9CF;DEAF PERSON;So;0;ON;;;;;N;;;;; +1F9D0;FACE WITH MONOCLE;So;0;ON;;;;;N;;;;; +1F9D1;ADULT;So;0;ON;;;;;N;;;;; +1F9D2;CHILD;So;0;ON;;;;;N;;;;; +1F9D3;OLDER ADULT;So;0;ON;;;;;N;;;;; +1F9D4;BEARDED PERSON;So;0;ON;;;;;N;;;;; +1F9D5;PERSON WITH HEADSCARF;So;0;ON;;;;;N;;;;; +1F9D6;PERSON IN STEAMY ROOM;So;0;ON;;;;;N;;;;; +1F9D7;PERSON CLIMBING;So;0;ON;;;;;N;;;;; +1F9D8;PERSON IN LOTUS POSITION;So;0;ON;;;;;N;;;;; +1F9D9;MAGE;So;0;ON;;;;;N;;;;; +1F9DA;FAIRY;So;0;ON;;;;;N;;;;; +1F9DB;VAMPIRE;So;0;ON;;;;;N;;;;; +1F9DC;MERPERSON;So;0;ON;;;;;N;;;;; +1F9DD;ELF;So;0;ON;;;;;N;;;;; +1F9DE;GENIE;So;0;ON;;;;;N;;;;; +1F9DF;ZOMBIE;So;0;ON;;;;;N;;;;; +1F9E0;BRAIN;So;0;ON;;;;;N;;;;; +1F9E1;ORANGE HEART;So;0;ON;;;;;N;;;;; +1F9E2;BILLED CAP;So;0;ON;;;;;N;;;;; +1F9E3;SCARF;So;0;ON;;;;;N;;;;; +1F9E4;GLOVES;So;0;ON;;;;;N;;;;; +1F9E5;COAT;So;0;ON;;;;;N;;;;; +1F9E6;SOCKS;So;0;ON;;;;;N;;;;; +1F9E7;RED GIFT ENVELOPE;So;0;ON;;;;;N;;;;; +1F9E8;FIRECRACKER;So;0;ON;;;;;N;;;;; +1F9E9;JIGSAW PUZZLE PIECE;So;0;ON;;;;;N;;;;; +1F9EA;TEST TUBE;So;0;ON;;;;;N;;;;; +1F9EB;PETRI DISH;So;0;ON;;;;;N;;;;; +1F9EC;DNA DOUBLE HELIX;So;0;ON;;;;;N;;;;; +1F9ED;COMPASS;So;0;ON;;;;;N;;;;; +1F9EE;ABACUS;So;0;ON;;;;;N;;;;; +1F9EF;FIRE EXTINGUISHER;So;0;ON;;;;;N;;;;; +1F9F0;TOOLBOX;So;0;ON;;;;;N;;;;; +1F9F1;BRICK;So;0;ON;;;;;N;;;;; +1F9F2;MAGNET;So;0;ON;;;;;N;;;;; +1F9F3;LUGGAGE;So;0;ON;;;;;N;;;;; +1F9F4;LOTION BOTTLE;So;0;ON;;;;;N;;;;; +1F9F5;SPOOL OF THREAD;So;0;ON;;;;;N;;;;; +1F9F6;BALL OF YARN;So;0;ON;;;;;N;;;;; +1F9F7;SAFETY PIN;So;0;ON;;;;;N;;;;; +1F9F8;TEDDY BEAR;So;0;ON;;;;;N;;;;; +1F9F9;BROOM;So;0;ON;;;;;N;;;;; +1F9FA;BASKET;So;0;ON;;;;;N;;;;; +1F9FB;ROLL OF PAPER;So;0;ON;;;;;N;;;;; +1F9FC;BAR OF SOAP;So;0;ON;;;;;N;;;;; +1F9FD;SPONGE;So;0;ON;;;;;N;;;;; +1F9FE;RECEIPT;So;0;ON;;;;;N;;;;; +1F9FF;NAZAR AMULET;So;0;ON;;;;;N;;;;; +1FA00;NEUTRAL CHESS KING;So;0;ON;;;;;N;;;;; +1FA01;NEUTRAL CHESS QUEEN;So;0;ON;;;;;N;;;;; +1FA02;NEUTRAL CHESS ROOK;So;0;ON;;;;;N;;;;; +1FA03;NEUTRAL CHESS BISHOP;So;0;ON;;;;;N;;;;; +1FA04;NEUTRAL CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1FA05;NEUTRAL CHESS PAWN;So;0;ON;;;;;N;;;;; +1FA06;WHITE CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA07;BLACK CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA08;NEUTRAL CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA09;WHITE CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0A;WHITE CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0B;WHITE CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0C;WHITE CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0D;WHITE CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0E;WHITE CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0F;BLACK CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA10;BLACK CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA11;BLACK CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA12;BLACK CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA13;BLACK CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA14;BLACK CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA15;NEUTRAL CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA16;NEUTRAL CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA17;NEUTRAL CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA18;NEUTRAL CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA19;NEUTRAL CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA1A;NEUTRAL CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA1B;WHITE CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA1C;BLACK CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA1D;NEUTRAL CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA1E;WHITE CHESS TURNED KING;So;0;ON;;;;;N;;;;; +1FA1F;WHITE CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;; +1FA20;WHITE CHESS TURNED ROOK;So;0;ON;;;;;N;;;;; +1FA21;WHITE CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;; +1FA22;WHITE CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;; +1FA23;WHITE CHESS TURNED PAWN;So;0;ON;;;;;N;;;;; +1FA24;BLACK CHESS TURNED KING;So;0;ON;;;;;N;;;;; +1FA25;BLACK CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;; +1FA26;BLACK CHESS TURNED ROOK;So;0;ON;;;;;N;;;;; +1FA27;BLACK CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;; +1FA28;BLACK CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;; +1FA29;BLACK CHESS TURNED PAWN;So;0;ON;;;;;N;;;;; +1FA2A;NEUTRAL CHESS TURNED KING;So;0;ON;;;;;N;;;;; +1FA2B;NEUTRAL CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;; +1FA2C;NEUTRAL CHESS TURNED ROOK;So;0;ON;;;;;N;;;;; +1FA2D;NEUTRAL CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;; +1FA2E;NEUTRAL CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;; +1FA2F;NEUTRAL CHESS TURNED PAWN;So;0;ON;;;;;N;;;;; +1FA30;WHITE CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA31;BLACK CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA32;NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA33;WHITE CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA34;WHITE CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA35;WHITE CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA36;WHITE CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA37;WHITE CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA38;WHITE CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA39;BLACK CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3A;BLACK CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3B;BLACK CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3C;BLACK CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3D;BLACK CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3E;BLACK CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3F;NEUTRAL CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA40;NEUTRAL CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA41;NEUTRAL CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA42;NEUTRAL CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA43;NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA44;NEUTRAL CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA45;WHITE CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;; +1FA46;BLACK CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;; +1FA47;NEUTRAL CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;; +1FA48;WHITE CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;; +1FA49;BLACK CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;; +1FA4A;NEUTRAL CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;; +1FA4B;WHITE CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA4C;BLACK CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA4D;NEUTRAL CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA4E;WHITE CHESS KNIGHT-QUEEN;So;0;ON;;;;;N;;;;; +1FA4F;WHITE CHESS KNIGHT-ROOK;So;0;ON;;;;;N;;;;; +1FA50;WHITE CHESS KNIGHT-BISHOP;So;0;ON;;;;;N;;;;; +1FA51;BLACK CHESS KNIGHT-QUEEN;So;0;ON;;;;;N;;;;; +1FA52;BLACK CHESS KNIGHT-ROOK;So;0;ON;;;;;N;;;;; +1FA53;BLACK CHESS KNIGHT-BISHOP;So;0;ON;;;;;N;;;;; +1FA54;WHITE CHESS FERZ;So;0;ON;;;;;N;;;;; +1FA55;WHITE CHESS ALFIL;So;0;ON;;;;;N;;;;; +1FA56;BLACK CHESS FERZ;So;0;ON;;;;;N;;;;; +1FA57;BLACK CHESS ALFIL;So;0;ON;;;;;N;;;;; +1FA60;XIANGQI RED GENERAL;So;0;ON;;;;;N;;;;; +1FA61;XIANGQI RED MANDARIN;So;0;ON;;;;;N;;;;; +1FA62;XIANGQI RED ELEPHANT;So;0;ON;;;;;N;;;;; +1FA63;XIANGQI RED HORSE;So;0;ON;;;;;N;;;;; +1FA64;XIANGQI RED CHARIOT;So;0;ON;;;;;N;;;;; +1FA65;XIANGQI RED CANNON;So;0;ON;;;;;N;;;;; +1FA66;XIANGQI RED SOLDIER;So;0;ON;;;;;N;;;;; +1FA67;XIANGQI BLACK GENERAL;So;0;ON;;;;;N;;;;; +1FA68;XIANGQI BLACK MANDARIN;So;0;ON;;;;;N;;;;; +1FA69;XIANGQI BLACK ELEPHANT;So;0;ON;;;;;N;;;;; +1FA6A;XIANGQI BLACK HORSE;So;0;ON;;;;;N;;;;; +1FA6B;XIANGQI BLACK CHARIOT;So;0;ON;;;;;N;;;;; +1FA6C;XIANGQI BLACK CANNON;So;0;ON;;;;;N;;;;; +1FA6D;XIANGQI BLACK SOLDIER;So;0;ON;;;;;N;;;;; +1FA70;BALLET SHOES;So;0;ON;;;;;N;;;;; +1FA71;ONE-PIECE SWIMSUIT;So;0;ON;;;;;N;;;;; +1FA72;BRIEFS;So;0;ON;;;;;N;;;;; +1FA73;SHORTS;So;0;ON;;;;;N;;;;; +1FA74;THONG SANDAL;So;0;ON;;;;;N;;;;; +1FA75;LIGHT BLUE HEART;So;0;ON;;;;;N;;;;; +1FA76;GREY HEART;So;0;ON;;;;;N;;;;; +1FA77;PINK HEART;So;0;ON;;;;;N;;;;; +1FA78;DROP OF BLOOD;So;0;ON;;;;;N;;;;; +1FA79;ADHESIVE BANDAGE;So;0;ON;;;;;N;;;;; +1FA7A;STETHOSCOPE;So;0;ON;;;;;N;;;;; +1FA7B;X-RAY;So;0;ON;;;;;N;;;;; +1FA7C;CRUTCH;So;0;ON;;;;;N;;;;; +1FA80;YO-YO;So;0;ON;;;;;N;;;;; +1FA81;KITE;So;0;ON;;;;;N;;;;; +1FA82;PARACHUTE;So;0;ON;;;;;N;;;;; +1FA83;BOOMERANG;So;0;ON;;;;;N;;;;; +1FA84;MAGIC WAND;So;0;ON;;;;;N;;;;; +1FA85;PINATA;So;0;ON;;;;;N;;;;; +1FA86;NESTING DOLLS;So;0;ON;;;;;N;;;;; +1FA87;MARACAS;So;0;ON;;;;;N;;;;; +1FA88;FLUTE;So;0;ON;;;;;N;;;;; +1FA89;HARP;So;0;ON;;;;;N;;;;; +1FA8A;TROMBONE;So;0;ON;;;;;N;;;;; +1FA8E;TREASURE CHEST;So;0;ON;;;;;N;;;;; +1FA8F;SHOVEL;So;0;ON;;;;;N;;;;; +1FA90;RINGED PLANET;So;0;ON;;;;;N;;;;; +1FA91;CHAIR;So;0;ON;;;;;N;;;;; +1FA92;RAZOR;So;0;ON;;;;;N;;;;; +1FA93;AXE;So;0;ON;;;;;N;;;;; +1FA94;DIYA LAMP;So;0;ON;;;;;N;;;;; +1FA95;BANJO;So;0;ON;;;;;N;;;;; +1FA96;MILITARY HELMET;So;0;ON;;;;;N;;;;; +1FA97;ACCORDION;So;0;ON;;;;;N;;;;; +1FA98;LONG DRUM;So;0;ON;;;;;N;;;;; +1FA99;COIN;So;0;ON;;;;;N;;;;; +1FA9A;CARPENTRY SAW;So;0;ON;;;;;N;;;;; +1FA9B;SCREWDRIVER;So;0;ON;;;;;N;;;;; +1FA9C;LADDER;So;0;ON;;;;;N;;;;; +1FA9D;HOOK;So;0;ON;;;;;N;;;;; +1FA9E;MIRROR;So;0;ON;;;;;N;;;;; +1FA9F;WINDOW;So;0;ON;;;;;N;;;;; +1FAA0;PLUNGER;So;0;ON;;;;;N;;;;; +1FAA1;SEWING NEEDLE;So;0;ON;;;;;N;;;;; +1FAA2;KNOT;So;0;ON;;;;;N;;;;; +1FAA3;BUCKET;So;0;ON;;;;;N;;;;; +1FAA4;MOUSE TRAP;So;0;ON;;;;;N;;;;; +1FAA5;TOOTHBRUSH;So;0;ON;;;;;N;;;;; +1FAA6;HEADSTONE;So;0;ON;;;;;N;;;;; +1FAA7;PLACARD;So;0;ON;;;;;N;;;;; +1FAA8;ROCK;So;0;ON;;;;;N;;;;; +1FAA9;MIRROR BALL;So;0;ON;;;;;N;;;;; +1FAAA;IDENTIFICATION CARD;So;0;ON;;;;;N;;;;; +1FAAB;LOW BATTERY;So;0;ON;;;;;N;;;;; +1FAAC;HAMSA;So;0;ON;;;;;N;;;;; +1FAAD;FOLDING HAND FAN;So;0;ON;;;;;N;;;;; +1FAAE;HAIR PICK;So;0;ON;;;;;N;;;;; +1FAAF;KHANDA;So;0;ON;;;;;N;;;;; +1FAB0;FLY;So;0;ON;;;;;N;;;;; +1FAB1;WORM;So;0;ON;;;;;N;;;;; +1FAB2;BEETLE;So;0;ON;;;;;N;;;;; +1FAB3;COCKROACH;So;0;ON;;;;;N;;;;; +1FAB4;POTTED PLANT;So;0;ON;;;;;N;;;;; +1FAB5;WOOD;So;0;ON;;;;;N;;;;; +1FAB6;FEATHER;So;0;ON;;;;;N;;;;; +1FAB7;LOTUS;So;0;ON;;;;;N;;;;; +1FAB8;CORAL;So;0;ON;;;;;N;;;;; +1FAB9;EMPTY NEST;So;0;ON;;;;;N;;;;; +1FABA;NEST WITH EGGS;So;0;ON;;;;;N;;;;; +1FABB;HYACINTH;So;0;ON;;;;;N;;;;; +1FABC;JELLYFISH;So;0;ON;;;;;N;;;;; +1FABD;WING;So;0;ON;;;;;N;;;;; +1FABE;LEAFLESS TREE;So;0;ON;;;;;N;;;;; +1FABF;GOOSE;So;0;ON;;;;;N;;;;; +1FAC0;ANATOMICAL HEART;So;0;ON;;;;;N;;;;; +1FAC1;LUNGS;So;0;ON;;;;;N;;;;; +1FAC2;PEOPLE HUGGING;So;0;ON;;;;;N;;;;; +1FAC3;PREGNANT MAN;So;0;ON;;;;;N;;;;; +1FAC4;PREGNANT PERSON;So;0;ON;;;;;N;;;;; +1FAC5;PERSON WITH CROWN;So;0;ON;;;;;N;;;;; +1FAC6;FINGERPRINT;So;0;ON;;;;;N;;;;; +1FAC8;HAIRY CREATURE;So;0;ON;;;;;N;;;;; +1FACD;ORCA;So;0;ON;;;;;N;;;;; +1FACE;MOOSE;So;0;ON;;;;;N;;;;; +1FACF;DONKEY;So;0;ON;;;;;N;;;;; +1FAD0;BLUEBERRIES;So;0;ON;;;;;N;;;;; +1FAD1;BELL PEPPER;So;0;ON;;;;;N;;;;; +1FAD2;OLIVE;So;0;ON;;;;;N;;;;; +1FAD3;FLATBREAD;So;0;ON;;;;;N;;;;; +1FAD4;TAMALE;So;0;ON;;;;;N;;;;; +1FAD5;FONDUE;So;0;ON;;;;;N;;;;; +1FAD6;TEAPOT;So;0;ON;;;;;N;;;;; +1FAD7;POURING LIQUID;So;0;ON;;;;;N;;;;; +1FAD8;BEANS;So;0;ON;;;;;N;;;;; +1FAD9;JAR;So;0;ON;;;;;N;;;;; +1FADA;GINGER ROOT;So;0;ON;;;;;N;;;;; +1FADB;PEA POD;So;0;ON;;;;;N;;;;; +1FADC;ROOT VEGETABLE;So;0;ON;;;;;N;;;;; +1FADF;SPLATTER;So;0;ON;;;;;N;;;;; +1FAE0;MELTING FACE;So;0;ON;;;;;N;;;;; +1FAE1;SALUTING FACE;So;0;ON;;;;;N;;;;; +1FAE2;FACE WITH OPEN EYES AND HAND OVER MOUTH;So;0;ON;;;;;N;;;;; +1FAE3;FACE WITH PEEKING EYE;So;0;ON;;;;;N;;;;; +1FAE4;FACE WITH DIAGONAL MOUTH;So;0;ON;;;;;N;;;;; +1FAE5;DOTTED LINE FACE;So;0;ON;;;;;N;;;;; +1FAE6;BITING LIP;So;0;ON;;;;;N;;;;; +1FAE7;BUBBLES;So;0;ON;;;;;N;;;;; +1FAE8;SHAKING FACE;So;0;ON;;;;;N;;;;; +1FAE9;FACE WITH BAGS UNDER EYES;So;0;ON;;;;;N;;;;; +1FAEA;DISTORTED FACE;So;0;ON;;;;;N;;;;; +1FAEF;FIGHT CLOUD;So;0;ON;;;;;N;;;;; +1FAF0;HAND WITH INDEX FINGER AND THUMB CROSSED;So;0;ON;;;;;N;;;;; +1FAF1;RIGHTWARDS HAND;So;0;ON;;;;;N;;;;; +1FAF2;LEFTWARDS HAND;So;0;ON;;;;;N;;;;; +1FAF3;PALM DOWN HAND;So;0;ON;;;;;N;;;;; +1FAF4;PALM UP HAND;So;0;ON;;;;;N;;;;; +1FAF5;INDEX POINTING AT THE VIEWER;So;0;ON;;;;;N;;;;; +1FAF6;HEART HANDS;So;0;ON;;;;;N;;;;; +1FAF7;LEFTWARDS PUSHING HAND;So;0;ON;;;;;N;;;;; +1FAF8;RIGHTWARDS PUSHING HAND;So;0;ON;;;;;N;;;;; +1FB00;BLOCK SEXTANT-1;So;0;ON;;;;;N;;;;; +1FB01;BLOCK SEXTANT-2;So;0;ON;;;;;N;;;;; +1FB02;BLOCK SEXTANT-12;So;0;ON;;;;;N;;;;; +1FB03;BLOCK SEXTANT-3;So;0;ON;;;;;N;;;;; +1FB04;BLOCK SEXTANT-13;So;0;ON;;;;;N;;;;; +1FB05;BLOCK SEXTANT-23;So;0;ON;;;;;N;;;;; +1FB06;BLOCK SEXTANT-123;So;0;ON;;;;;N;;;;; +1FB07;BLOCK SEXTANT-4;So;0;ON;;;;;N;;;;; +1FB08;BLOCK SEXTANT-14;So;0;ON;;;;;N;;;;; +1FB09;BLOCK SEXTANT-24;So;0;ON;;;;;N;;;;; +1FB0A;BLOCK SEXTANT-124;So;0;ON;;;;;N;;;;; +1FB0B;BLOCK SEXTANT-34;So;0;ON;;;;;N;;;;; +1FB0C;BLOCK SEXTANT-134;So;0;ON;;;;;N;;;;; +1FB0D;BLOCK SEXTANT-234;So;0;ON;;;;;N;;;;; +1FB0E;BLOCK SEXTANT-1234;So;0;ON;;;;;N;;;;; +1FB0F;BLOCK SEXTANT-5;So;0;ON;;;;;N;;;;; +1FB10;BLOCK SEXTANT-15;So;0;ON;;;;;N;;;;; +1FB11;BLOCK SEXTANT-25;So;0;ON;;;;;N;;;;; +1FB12;BLOCK SEXTANT-125;So;0;ON;;;;;N;;;;; +1FB13;BLOCK SEXTANT-35;So;0;ON;;;;;N;;;;; +1FB14;BLOCK SEXTANT-235;So;0;ON;;;;;N;;;;; +1FB15;BLOCK SEXTANT-1235;So;0;ON;;;;;N;;;;; +1FB16;BLOCK SEXTANT-45;So;0;ON;;;;;N;;;;; +1FB17;BLOCK SEXTANT-145;So;0;ON;;;;;N;;;;; +1FB18;BLOCK SEXTANT-245;So;0;ON;;;;;N;;;;; +1FB19;BLOCK SEXTANT-1245;So;0;ON;;;;;N;;;;; +1FB1A;BLOCK SEXTANT-345;So;0;ON;;;;;N;;;;; +1FB1B;BLOCK SEXTANT-1345;So;0;ON;;;;;N;;;;; +1FB1C;BLOCK SEXTANT-2345;So;0;ON;;;;;N;;;;; +1FB1D;BLOCK SEXTANT-12345;So;0;ON;;;;;N;;;;; +1FB1E;BLOCK SEXTANT-6;So;0;ON;;;;;N;;;;; +1FB1F;BLOCK SEXTANT-16;So;0;ON;;;;;N;;;;; +1FB20;BLOCK SEXTANT-26;So;0;ON;;;;;N;;;;; +1FB21;BLOCK SEXTANT-126;So;0;ON;;;;;N;;;;; +1FB22;BLOCK SEXTANT-36;So;0;ON;;;;;N;;;;; +1FB23;BLOCK SEXTANT-136;So;0;ON;;;;;N;;;;; +1FB24;BLOCK SEXTANT-236;So;0;ON;;;;;N;;;;; +1FB25;BLOCK SEXTANT-1236;So;0;ON;;;;;N;;;;; +1FB26;BLOCK SEXTANT-46;So;0;ON;;;;;N;;;;; +1FB27;BLOCK SEXTANT-146;So;0;ON;;;;;N;;;;; +1FB28;BLOCK SEXTANT-1246;So;0;ON;;;;;N;;;;; +1FB29;BLOCK SEXTANT-346;So;0;ON;;;;;N;;;;; +1FB2A;BLOCK SEXTANT-1346;So;0;ON;;;;;N;;;;; +1FB2B;BLOCK SEXTANT-2346;So;0;ON;;;;;N;;;;; +1FB2C;BLOCK SEXTANT-12346;So;0;ON;;;;;N;;;;; +1FB2D;BLOCK SEXTANT-56;So;0;ON;;;;;N;;;;; +1FB2E;BLOCK SEXTANT-156;So;0;ON;;;;;N;;;;; +1FB2F;BLOCK SEXTANT-256;So;0;ON;;;;;N;;;;; +1FB30;BLOCK SEXTANT-1256;So;0;ON;;;;;N;;;;; +1FB31;BLOCK SEXTANT-356;So;0;ON;;;;;N;;;;; +1FB32;BLOCK SEXTANT-1356;So;0;ON;;;;;N;;;;; +1FB33;BLOCK SEXTANT-2356;So;0;ON;;;;;N;;;;; +1FB34;BLOCK SEXTANT-12356;So;0;ON;;;;;N;;;;; +1FB35;BLOCK SEXTANT-456;So;0;ON;;;;;N;;;;; +1FB36;BLOCK SEXTANT-1456;So;0;ON;;;;;N;;;;; +1FB37;BLOCK SEXTANT-2456;So;0;ON;;;;;N;;;;; +1FB38;BLOCK SEXTANT-12456;So;0;ON;;;;;N;;;;; +1FB39;BLOCK SEXTANT-3456;So;0;ON;;;;;N;;;;; +1FB3A;BLOCK SEXTANT-13456;So;0;ON;;;;;N;;;;; +1FB3B;BLOCK SEXTANT-23456;So;0;ON;;;;;N;;;;; +1FB3C;LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB3D;LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB3E;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB3F;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB40;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB41;LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB42;LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB43;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB44;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB45;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB46;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB47;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB48;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB49;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4A;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4B;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB4C;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4D;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4E;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4F;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB50;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB51;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB52;UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB53;UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB54;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB55;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB56;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB57;UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB58;UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB59;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB5A;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB5B;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB5C;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB5D;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB5E;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB5F;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB60;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB61;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB62;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB63;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB64;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB65;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB66;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB67;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB68;UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB69;LEFT AND LOWER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB6A;UPPER AND LEFT AND LOWER TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB6B;LEFT AND UPPER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB6C;LEFT TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB6D;UPPER TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB6E;RIGHT TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB6F;LOWER TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB70;VERTICAL ONE EIGHTH BLOCK-2;So;0;ON;;;;;N;;;;; +1FB71;VERTICAL ONE EIGHTH BLOCK-3;So;0;ON;;;;;N;;;;; +1FB72;VERTICAL ONE EIGHTH BLOCK-4;So;0;ON;;;;;N;;;;; +1FB73;VERTICAL ONE EIGHTH BLOCK-5;So;0;ON;;;;;N;;;;; +1FB74;VERTICAL ONE EIGHTH BLOCK-6;So;0;ON;;;;;N;;;;; +1FB75;VERTICAL ONE EIGHTH BLOCK-7;So;0;ON;;;;;N;;;;; +1FB76;HORIZONTAL ONE EIGHTH BLOCK-2;So;0;ON;;;;;N;;;;; +1FB77;HORIZONTAL ONE EIGHTH BLOCK-3;So;0;ON;;;;;N;;;;; +1FB78;HORIZONTAL ONE EIGHTH BLOCK-4;So;0;ON;;;;;N;;;;; +1FB79;HORIZONTAL ONE EIGHTH BLOCK-5;So;0;ON;;;;;N;;;;; +1FB7A;HORIZONTAL ONE EIGHTH BLOCK-6;So;0;ON;;;;;N;;;;; +1FB7B;HORIZONTAL ONE EIGHTH BLOCK-7;So;0;ON;;;;;N;;;;; +1FB7C;LEFT AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB7D;LEFT AND UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB7E;RIGHT AND UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB7F;RIGHT AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB80;UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB81;HORIZONTAL ONE EIGHTH BLOCK-1358;So;0;ON;;;;;N;;;;; +1FB82;UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB83;UPPER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB84;UPPER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB85;UPPER THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB86;UPPER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB87;RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB88;RIGHT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB89;RIGHT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB8A;RIGHT THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB8B;RIGHT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB8C;LEFT HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB8D;RIGHT HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB8E;UPPER HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB8F;LOWER HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB90;INVERSE MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB91;UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB92;UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB94;LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB95;CHECKER BOARD FILL;So;0;ON;;;;;N;;;;; +1FB96;INVERSE CHECKER BOARD FILL;So;0;ON;;;;;N;;;;; +1FB97;HEAVY HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +1FB98;UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +1FB99;UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +1FB9A;UPPER AND LOWER TRIANGULAR HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB9B;LEFT AND RIGHT TRIANGULAR HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB9C;UPPER LEFT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB9D;UPPER RIGHT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB9E;LOWER RIGHT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB9F;LOWER LEFT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FBA0;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT;So;0;ON;;;;;N;;;;; +1FBA1;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBA2;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA3;BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA4;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA5;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA6;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBA7;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBA8;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT AND MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA9;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT AND MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBAA;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE TO MIDDLE LEFT;So;0;ON;;;;;N;;;;; +1FBAB;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBAC;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBAD;BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBAE;BOX DRAWINGS LIGHT DIAGONAL DIAMOND;So;0;ON;;;;;N;;;;; +1FBAF;BOX DRAWINGS LIGHT HORIZONTAL WITH VERTICAL STROKE;So;0;ON;;;;;N;;;;; +1FBB0;ARROWHEAD-SHAPED POINTER;So;0;ON;;;;;N;;;;; +1FBB1;INVERSE CHECK MARK;So;0;ON;;;;;N;;;;; +1FBB2;LEFT HALF RUNNING MAN;So;0;ON;;;;;N;;;;; +1FBB3;RIGHT HALF RUNNING MAN;So;0;ON;;;;;N;;;;; +1FBB4;INVERSE DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +1FBB5;LEFTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB6;RIGHTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB7;DOWNWARDS ARROW AND RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB8;UPWARDS ARROW AND RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB9;LEFT HALF FOLDER;So;0;ON;;;;;N;;;;; +1FBBA;RIGHT HALF FOLDER;So;0;ON;;;;;N;;;;; +1FBBB;VOIDED GREEK CROSS;So;0;ON;;;;;N;;;;; +1FBBC;RIGHT OPEN SQUARED DOT;So;0;ON;;;;;N;;;;; +1FBBD;NEGATIVE DIAGONAL CROSS;So;0;ON;;;;;N;;;;; +1FBBE;NEGATIVE DIAGONAL MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBBF;NEGATIVE DIAGONAL DIAMOND;So;0;ON;;;;;N;;;;; +1FBC0;WHITE HEAVY SALTIRE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +1FBC1;LEFT THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1FBC2;MIDDLE THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1FBC3;RIGHT THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1FBC4;NEGATIVE SQUARED QUESTION MARK;So;0;ON;;;;;N;;;;; +1FBC5;STICK FIGURE;So;0;ON;;;;;N;;;;; +1FBC6;STICK FIGURE WITH ARMS RAISED;So;0;ON;;;;;N;;;;; +1FBC7;STICK FIGURE LEANING LEFT;So;0;ON;;;;;N;;;;; +1FBC8;STICK FIGURE LEANING RIGHT;So;0;ON;;;;;N;;;;; +1FBC9;STICK FIGURE WITH DRESS;So;0;ON;;;;;N;;;;; +1FBCA;WHITE UP-POINTING CHEVRON;So;0;ON;;;;;N;;;;; +1FBCB;WHITE CROSS MARK;So;0;ON;;;;;N;;;;; +1FBCC;RAISED SMALL LEFT SQUARE BRACKET;So;0;ON;;;;;N;;;;; +1FBCD;BLACK SMALL UP-POINTING CHEVRON;So;0;ON;;;;;N;;;;; +1FBCE;LEFT TWO THIRDS BLOCK;So;0;ON;;;;;N;;;;; +1FBCF;LEFT ONE THIRD BLOCK;So;0;ON;;;;;N;;;;; +1FBD0;BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER LEFT;So;0;ON;;;;;N;;;;; +1FBD1;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT;So;0;ON;;;;;N;;;;; +1FBD2;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBD3;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBD4;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBD5;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBD6;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBD7;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER LEFT;So;0;ON;;;;;N;;;;; +1FBD8;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FBD9;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBDA;BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO MIDDLE CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBDB;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO LOWER LEFT;So;0;ON;;;;;N;;;;; +1FBDC;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FBDD;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBDE;BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FBDF;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT TO LOWER LEFT;So;0;ON;;;;;N;;;;; +1FBE0;TOP JUSTIFIED LOWER HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1FBE1;RIGHT JUSTIFIED LEFT HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1FBE2;BOTTOM JUSTIFIED UPPER HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1FBE3;LEFT JUSTIFIED RIGHT HALF WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1FBE4;UPPER CENTRE ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FBE5;LOWER CENTRE ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FBE6;MIDDLE LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FBE7;MIDDLE RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FBE8;TOP JUSTIFIED LOWER HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBE9;RIGHT JUSTIFIED LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBEA;BOTTOM JUSTIFIED UPPER HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBEB;LEFT JUSTIFIED RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBEC;TOP RIGHT JUSTIFIED LOWER LEFT QUARTER BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBED;BOTTOM LEFT JUSTIFIED UPPER RIGHT QUARTER BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBEE;BOTTOM RIGHT JUSTIFIED UPPER LEFT QUARTER BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBEF;TOP LEFT JUSTIFIED LOWER RIGHT QUARTER BLACK CIRCLE;So;0;ON;;;;;N;;;;; +1FBF0;SEGMENTED DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1FBF1;SEGMENTED DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1FBF2;SEGMENTED DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1FBF3;SEGMENTED DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1FBF4;SEGMENTED DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1FBF5;SEGMENTED DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1FBF6;SEGMENTED DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1FBF7;SEGMENTED DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1FBF8;SEGMENTED DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1FBF9;SEGMENTED DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1FBFA;ALARM BELL SYMBOL;So;0;ON;;;;;N;;;;; +20000;;Lo;0;L;;;;;N;;;;; +2A6DF;;Lo;0;L;;;;;N;;;;; +2A700;;Lo;0;L;;;;;N;;;;; +2B73F;;Lo;0;L;;;;;N;;;;; +2B740;;Lo;0;L;;;;;N;;;;; +2B81D;;Lo;0;L;;;;;N;;;;; +2B820;;Lo;0;L;;;;;N;;;;; +2CEAD;;Lo;0;L;;;;;N;;;;; +2CEB0;;Lo;0;L;;;;;N;;;;; +2EBE0;;Lo;0;L;;;;;N;;;;; +2EBF0;;Lo;0;L;;;;;N;;;;; +2EE5D;;Lo;0;L;;;;;N;;;;; +2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; +2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; +2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; +2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; +2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; +2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; +2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; +2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; +2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; +2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; +2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; +2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; +2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; +2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; +2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; +2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; +2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; +2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; +2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; +2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; +2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; +2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; +2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; +2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; +2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; +2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; +2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; +2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; +2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; +2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; +2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; +2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; +2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; +2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; +2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; +2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; +2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; +2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; +2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; +2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; +2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; +2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; +2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; +2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; +2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; +2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; +2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; +2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; +2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; +2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; +2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; +2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; +2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; +2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; +2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; +2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; +2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; +2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; +2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; +2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; +2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; +2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; +2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; +2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; +2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; +2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; +2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; +2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; +2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; +2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; +2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; +2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; +2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; +2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; +2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; +2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; +2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; +2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; +2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; +2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; +2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; +2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; +2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; +2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; +2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; +2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; +2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; +2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; +2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; +2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; +2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; +2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; +2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; +2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; +2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; +2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; +2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; +2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; +2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; +2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; +2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; +2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; +2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; +2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; +2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;; +2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; +2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; +2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; +2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; +2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; +2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; +2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; +2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; +2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; +2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; +2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; +2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;; +2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; +2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; +2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; +2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; +2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; +2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; +2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; +2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; +2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; +2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; +2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; +2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; +2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; +2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; +2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; +2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; +2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; +2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; +2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; +2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; +2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; +2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; +2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; +2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; +2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; +2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; +2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; +2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; +2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; +2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; +2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; +2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; +2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; +2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; +2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; +2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; +2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; +2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; +2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; +2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; +2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; +2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; +2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; +2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; +2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; +2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; +2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; +2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; +2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; +2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; +2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; +2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; +2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; +2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; +2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; +2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; +2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; +2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; +2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; +2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; +2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; +2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; +2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; +2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; +2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; +2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; +2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; +2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; +2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; +2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; +2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; +2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; +2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; +2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; +2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; +2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; +2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; +2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; +2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; +2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; +2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; +2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; +2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; +2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; +2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; +2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; +2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; +2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; +2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; +2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; +2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; +2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; +2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; +2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; +2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; +2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; +2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; +2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; +2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; +2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; +2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; +2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; +2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; +2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; +2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; +2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; +2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; +2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; +2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; +2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; +2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; +2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; +2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; +2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; +2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; +2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; +2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; +2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; +2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; +2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; +2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; +2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; +2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; +2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; +2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; +2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; +2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; +2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; +2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; +2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; +2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; +2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; +2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; +2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; +2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; +2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; +2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; +2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; +2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; +2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; +2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; +2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; +2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; +2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; +2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; +2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; +2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; +2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; +2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; +2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; +2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; +2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; +2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; +2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; +2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; +2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; +2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; +2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; +2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; +2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; +2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; +2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; +2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; +2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; +2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; +2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; +2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; +2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; +2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; +2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; +2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;; +2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; +2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; +2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; +2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; +2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; +2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; +2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; +2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; +2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; +2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; +2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; +2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; +2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; +2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; +2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; +2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; +2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; +2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; +2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; +2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; +2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; +2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; +2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; +2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; +2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; +2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; +2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; +2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; +2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; +2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; +2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; +2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; +2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; +2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; +2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; +2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; +2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; +2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; +2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; +2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; +2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; +2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; +2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; +2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; +2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; +2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; +2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; +2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; +2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; +2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; +2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; +2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; +2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; +2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; +2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; +2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; +2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; +2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; +2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; +2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; +2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; +2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; +2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; +2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;; +2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; +2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; +2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; +2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; +2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; +2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; +2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; +2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; +2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; +2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; +2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; +2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; +2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; +2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; +2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; +2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; +2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; +2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; +2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; +2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; +2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; +2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; +2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; +2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; +2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; +2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; +2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; +2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; +2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; +2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; +2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; +2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; +2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; +2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; +2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; +2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; +2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; +2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; +2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; +2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; +2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; +2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; +2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; +2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; +2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; +2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; +2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; +2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; +2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; +2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; +2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; +2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; +2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; +2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; +2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; +2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; +2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; +2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; +2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; +2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; +2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; +2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; +2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; +2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; +2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; +2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; +2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; +2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; +2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; +2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; +2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; +2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; +2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; +2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; +2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; +2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; +2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; +2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; +2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; +2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; +2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; +2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; +2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; +2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; +2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; +2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; +2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; +2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; +2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; +2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; +2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; +2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; +2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; +2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; +2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; +2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;; +2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; +2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; +2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; +2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; +2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; +2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; +2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; +2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; +2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; +2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; +2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; +2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; +2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; +2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; +2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; +2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; +2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; +2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; +2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; +2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; +2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; +2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; +2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; +2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; +2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; +2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; +2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; +2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; +2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; +2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; +2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; +2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; +2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; +2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; +2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; +2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; +2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; +2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; +2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; +2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; +2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; +2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; +2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; +2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; +2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; +2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; +2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; +2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; +2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; +2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; +2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; +2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; +2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; +2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; +2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; +2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; +2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; +2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; +2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; +2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; +2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; +2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; +2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; +2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; +2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; +2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; +2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; +2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; +2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; +2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; +2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; +2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; +2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; +2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; +2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; +2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; +2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; +2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; +2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; +2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; +2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; +2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; +2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; +2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; +2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; +2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; +2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; +2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; +2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; +2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; +2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; +2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; +2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; +2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; +30000;;Lo;0;L;;;;;N;;;;; +3134A;;Lo;0;L;;;;;N;;;;; +31350;;Lo;0;L;;;;;N;;;;; +323AF;;Lo;0;L;;;;;N;;;;; +323B0;;Lo;0;L;;;;;N;;;;; +33479;;Lo;0;L;;;;;N;;;;; +E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; +E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; +E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; +E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;; +E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;; +E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;; +E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;; +E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;; +E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;; +E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;; +E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;; +E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;; +E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;; +E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;; +E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;; +E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;; +E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;; +E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;; +E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;; +E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;; +E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;; +E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;; +E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;; +E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;; +E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;; +E003A;TAG COLON;Cf;0;BN;;;;;N;;;;; +E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;; +E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;; +E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;; +E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;; +E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;; +E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;; +E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;; +E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;; +E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;; +E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;; +E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;; +E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;; +E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;; +E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;; +E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;; +E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;; +E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;; +E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;; +E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;; +E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;; +E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;; +E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;; +E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;; +E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;; +E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;; +E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;; +E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;; +E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;; +E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;; +E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;; +E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;; +E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;; +E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;; +E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;; +E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;; +E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;; +E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;; +E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;; +E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;; +E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;; +E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;; +E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;; +E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;; +E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;; +E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;; +E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;; +E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;; +E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;; +E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;; +E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;; +E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;; +E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;; +E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;; +E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;; +E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;; +E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;; +E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;; +E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;; +E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;; +E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;; +E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;; +E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;; +E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;; +E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;; +E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;; +E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;; +E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;; +E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;; +E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;; +E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;; +E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;; +E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;; +E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;; +E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;; +E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;; +E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;; +E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;; +E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;; +E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;; +E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;; +E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;; +E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;; +E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;; +E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;; +E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;; +E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;; +E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;; +E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;; +E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;; +E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;; +E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;; +E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;; +E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;; +E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;; +E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;; +E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;; +E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;; +E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;; +E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;; +E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;; +E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;; +E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;; +E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;; +E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;; +E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;; +E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;; +E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;; +E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;; +E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;; +E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;; +E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;; +E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;; +E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;; +E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;; +E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;; +E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;; +E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;; +E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;; +E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;; +E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;; +E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;; +E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;; +E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;; +E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;; +E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;; +E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;; +E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;; +E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;; +E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;; +E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;; +E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;; +E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;; +E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;; +E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;; +E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;; +E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;; +E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;; +E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;; +E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;; +E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;; +E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;; +E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;; +E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;; +E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;; +E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;; +E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;; +E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;; +E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;; +E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;; +E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;; +E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;; +E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;; +E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;; +E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;; +E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;; +E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;; +E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;; +E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;; +E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;; +E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;; +E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;; +E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;; +E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;; +E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;; +E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;; +E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;; +E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;; +E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;; +E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;; +E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;; +E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;; +E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;; +E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;; +E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;; +E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;; +E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;; +E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;; +E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;; +E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;; +E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;; +E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;; +E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;; +E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;; +E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;; +E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;; +E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;; +E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;; +E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;; +E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;; +E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;; +E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;; +E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;; +E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;; +E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;; +E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;; +E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;; +E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;; +E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;; +E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;; +E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;; +E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;; +E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;; +E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;; +E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;; +E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;; +E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;; +E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;; +E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;; +E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;; +E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;; +E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;; +E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;; +E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;; +E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;; +E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;; +E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;; +E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;; +E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;; +E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;; +E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;; +E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;; +E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;; +E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;; +E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;; +E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;; +E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;; +E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;; +E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;; +E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;; +E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;; +E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;; +E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;; +E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;; +E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;; +E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;; +E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;; +E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;; +E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;; +E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;; +E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;; +E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;; +E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;; +E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;; +E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;; +E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;; +E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;; +E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;; +E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;; +E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;; +E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;; +E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;; +E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;; +E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;; +E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;; +E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;; +E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;; +E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;; +E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;; +E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;; +E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;; +E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;; +E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;; +E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;; +E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;; +E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;; +E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;; +E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;; +E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;; +E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;; +E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;; +E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;; +E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;; +E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;; +E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;; +E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;; +E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;; +E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;; +E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;; +E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;; +E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;; +E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;; +E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;; +E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;; +E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;; +E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;; +E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;; +E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;; +E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;; +E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;; +E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;; +E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;; +E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;; +E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;; +E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;; +E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;; +E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;; +E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;; +E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;; +E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;; +E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;; +E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;; +F0000;;Co;0;L;;;;;N;;;;; +FFFFD;;Co;0;L;;;;;N;;;;; +100000;;Co;0;L;;;;;N;;;;; +10FFFD;;Co;0;L;;;;;N;;;;; diff --git a/tests/core/assets/UCD/license.txt b/tests/core/assets/UCD/license.txt new file mode 100644 index 000000000..56da58912 --- /dev/null +++ b/tests/core/assets/UCD/license.txt @@ -0,0 +1,39 @@ +UNICODE LICENSE V3 + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2026 Unicode, Inc. + +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR +SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT +DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of data files and any associated documentation (the "Data Files") or +software and any associated documentation (the "Software") to deal in the +Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Data Files or Software, and to permit persons to whom the +Data Files or Software are furnished to do so, provided that either (a) +this copyright and permission notice appear with all copies of the Data +Files or Software, or (b) this copyright and permission notice appear in +associated Documentation. + +THE DATA FILES AND SOFTWARE ARE 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 OF +THIRD PARTY RIGHTS. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA +FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in these Data Files or Software without prior written +authorization of the copyright holder. From 8f579d1f3bea095dc188c33d95b5e685b4c1e807 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 17:34:37 -0500 Subject: [PATCH 051/273] Added program to generate Unicode Table This adds a program that will generate tables for use by the `core/unicode` package. The table generated file will be `core/unicode/generated.odin` It may be better to incorporate this into `generate_entity_table.odin`. This can easily be accomplised if desired. --- core/unicode/tools/generate_unicode.odin | 325 +++++++++++ core/unicode/tools/ucd/iterator.odin | 70 +++ core/unicode/tools/ucd/string_to.odin | 396 +++++++++++++ core/unicode/tools/ucd/types.odin | 702 +++++++++++++++++++++++ core/unicode/tools/ucd/ucd.odin | 307 ++++++++++ 5 files changed, 1800 insertions(+) create mode 100644 core/unicode/tools/generate_unicode.odin create mode 100644 core/unicode/tools/ucd/iterator.odin create mode 100644 core/unicode/tools/ucd/string_to.odin create mode 100644 core/unicode/tools/ucd/types.odin create mode 100644 core/unicode/tools/ucd/ucd.odin diff --git a/core/unicode/tools/generate_unicode.odin b/core/unicode/tools/generate_unicode.odin new file mode 100644 index 000000000..5962a269c --- /dev/null +++ b/core/unicode/tools/generate_unicode.odin @@ -0,0 +1,325 @@ +package main +import "core:fmt" +import path "core:path/filepath" +import "core:os" +import "core:strings" +import "base:runtime" +import "core:mem" +import "core:io" +import "core:log" +import "ucd" + +// Table 2-3. Types of Code Points +// Table 4-4. General_Category Values page 229 + +// Reference https://www.unicode.org/reports/tr44/ + + +/* +Formats a ucd.Dynamic_Range into a set of fixed length arrays and writes +corresponding to a io.Writer. The value of the parameter `name`will be used as a +prefix to the array names. If a dynamic array contained in the `range` is empty, +no corresponding fixed length array will be written. + +Inputs: +- writer: The io.Writer to be written to. +- name: Prefix to add to any array that is written to `writer` +- range: The ucd.Dynamic_Range to format and write to writer. +*/ +write_range_arrays :: proc( + writer: io.Writer, + name: string, + range : ucd.Dynamic_Range, +) -> int { + n_written : int + if len(range.single_16) > 0 { + n_written += fmt.wprintln(writer, "@(rodata)") + n_written += fmt.wprintf(writer, "%s_singles16 := [?]u16{{", name) + line_length := 100 + for v in range.single_16 { + str_buffer : [32]byte + str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) + + if line_length + len(str) > 80 { + n_written += fmt.wprintf(writer, "\n") + line_length = fmt.wprintf(writer, "\t0x%4X,",v) + n_written += line_length + } else { + temp, _ := io.write_string(writer, str) + line_length += temp + n_written += temp + } + } + n_written += fmt.wprintln(writer, "\n}\n") + } + + if len(range.ranges_16) > 0 { + n_written += fmt.wprintln(writer, "@(rodata)") + n_written += fmt.wprintfln(writer, "%s_ranges16 := [?]u16{{", name) + for v in range.ranges_16 { + n_written += fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) + } + n_written += fmt.wprintln(writer, "}\n") + } + + if len(range.single_32) > 0 { + n_written += fmt.wprintln(writer, "@(rodata)") + n_written += fmt.wprintf(writer, "%s_singles32 := [?]i32{{", name) + line_length := 100 + for v in range.single_32 { + str_buffer : [32]byte + str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) + + if line_length + len(str) > 80 { + n_written += fmt.wprint(writer, "\n") + line_length = fmt.wprintf(writer, "\t0x%4X,",v) + n_written += line_length + } else { + temp, _ := io.write_string(writer, str) + line_length += temp + n_written += temp + } + } + n_written += fmt.wprintln(writer, "\n}\n") + } + + if len(range.ranges_32) > 0 { + n_written += fmt.wprintln(writer, "@(rodata)") + n_written += fmt.wprintfln(writer, "%s_ranges32 := [?]i32{{", name) + for v in range.ranges_32 { + n_written += fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) + } + n_written += fmt.wprintln(writer, "}\n") + } + + return n_written +} + +write_range :: proc( + writer: io.Writer, + name: union{string, + ucd.General_Category}, + range: ucd.Dynamic_Range, +) -> (n_written: int) { + buffer: [128]byte + str: string + + switch n in name{ + case string: + assert(len(n) <= len(buffer)) + runtime.mem_copy(&buffer[0], raw_data(n), len(n)) + str = transmute(string) buffer[0:len(n)] + + case ucd.General_Category: + str = fmt.bprintf(buffer[:], "%s", n) + } + + for &b in buffer[0:len(str)] { + if b >= 'A' && b <= 'Z' { + b += ('a' - 'A') + } + } + + n_written = write_range_arrays(writer, str, range) + + n_written += fmt.wprintfln(writer, "%s_ranges := Range{{", str) + if len(range.single_16) > 0 { + n_written += fmt.wprintfln(writer, "\tsingle_16 = %s_singles16[:],", str) + } + if len(range.ranges_16) > 0 { + n_written += fmt.wprintfln(writer, "\tranges_16 = %s_ranges16[:],", str) + } + if len(range.single_32) > 0 { + n_written += fmt.wprintfln(writer, "\tsingle_32 = %s_singles32[:],", str) + } + if len(range.ranges_32) > 0 { + n_written += fmt.wprintfln(writer, "\tranges_32 = %s_ranges32[:],", str) + } + n_written += fmt.wprintln(writer, "}\n") + + return +} + +GENERATED :: `/* + ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ +*/ +` + +MESSAGE :: `/* + This file is generated from UnicodeData.txt and PropList.txt. These files + are part of the Unicode Database (UCD) and are covered by the license + listed further down. They may be downloaded from the following locations; + + https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt + https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt + https://www.unicode.org/license.txt + + ------------------------------------------------------------------------------ + UNICODE LICENSE V3 + + COPYRIGHT AND PERMISSION NOTICE + + Copyright © 1991-2026 Unicode, Inc. + + NOTICE TO USER: Carefully read the following legal agreement. BY + DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR + SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE + TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT + DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of data files and any associated documentation (the "Data Files") or + software and any associated documentation (the "Software") to deal in the + Data Files or Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, and/or sell + copies of the Data Files or Software, and to permit persons to whom the + Data Files or Software are furnished to do so, provided that either (a) + this copyright and permission notice appear with all copies of the Data + Files or Software, or (b) this copyright and permission notice appear in + associated Documentation. + + THE DATA FILES AND SOFTWARE ARE 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 OF + THIRD PARTY RIGHTS. + + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE + BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, + OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA + FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder shall + not be used in advertising or otherwise to promote the sale, use or other + dealings in these Data Files or Software without prior written + authorization of the copyright holder. + +*/ +` + +main :: proc() { + track: mem.Tracking_Allocator + + mem.tracking_allocator_init(&track, context.allocator) + defer { + if len(track.allocation_map) > 0 { + fmt.eprintf("=== %v allocations not freed: ===\n", len(track.allocation_map)) + for _, entry in track.allocation_map { + fmt.eprintf("- %v bytes @ %v\n", entry.size, entry.location) + } + } + mem.tracking_allocator_destroy(&track) + } + + context.allocator = mem.tracking_allocator(&track) + + context.logger = log.create_console_logger() + defer log.destroy_console_logger(context.logger) + + ucd_path, _ := path.join({ODIN_ROOT, + "tests","core","assets","UCD","UnicodeData.txt"}, context.allocator) + defer delete(ucd_path) + + unicode_data, ucd_err := ucd.load_unicode_data(ucd_path) + if ucd_err != nil { + log.errorf("Error loading Unicode data. %s", ucd_err) + } + defer ucd.destroy_unicode_data(unicode_data) + + general_category_ranges := ucd.gc_ranges(&unicode_data) + defer ucd.destroy_general_category_ranges(general_category_ranges) + + extra_digits := ucd.extra_digits(&unicode_data) + defer ucd.destroy_dynamic_range(extra_digits) + + + proplist_path, _ := path.join({ODIN_ROOT, + "tests","core","assets","UCD","PropList.txt"}, context.allocator) + defer delete(proplist_path) + proplist, proplist_err := ucd.load_protperty_list(proplist_path) + if proplist_err != nil { + log.errorf("Error loading PropList.txt. %s", proplist_err) + return + } + defer ucd.destroy_protperty_list(proplist) + + + + sb := strings.builder_make_len_cap(0, 1024*32) + defer strings.builder_destroy(&sb) + + + writer := strings.to_writer(&sb) + + fmt.wprintfln(writer, "package unicode\n") + fmt.wprintln(writer, GENERATED) + fmt.wprintln(writer, MESSAGE) + + Range_Type :: "Range :: struct {\n" + + "\tsingle_16 : []u16,\n" + + "\tranges_16 : []u16,\n" + + "\tsingle_32 : []i32,\n" + + "\tranges_32 : []i32,\n" + + "}\n" + + fmt.wprintfln(writer, "%s", Range_Type) + + //List of the general categories to skip when generating the code for + //core/unicode/generated.txt. + to_exclude := [?]ucd.General_Category{ + .Cc, // Control, a C0 or C1 control code + .Cf, // Format, a format control character + .Cn, // Unassigned, a reserved unassigned code point or a noncharacter + .Co, // Private_Use, a private-use character + .Cs, // Surrogate, a surrogate code point + // .Ll, // Lowercase_Letter, a lowercase letter + // .Lm, // Modifier_Letter, a modifier letter + // .Lo, // Other_Letter, other letters, including syllables and ideographs + // .Lt, // Titlecase_Letter, a digraph encoded as a single character, with first part uppercase + // .Lu, // Uppercase_Letter, an uppercase letter + .Mc, // Spacing_Mark, a spacing combining mark (positive advance width) + .Me, // Enclosing_Mark, an enclosing combining mark + .Mn, // Nonspacing_Mark, a nonspacing combining mark (zero advance width) + //.Nd, // Decimal_Number, a decimal digit + //.Nl, // Letter_Number, a letterlike numeric character + //.No, // Other_Number, a numeric character of other type + .Pc, // Connector_Punctuation, a connecting punctuation mark, like a tie + .Pd, // Dash_Punctuation, a dash or hyphen punctuation mark + .Pe, // Close_Punctuation, a closing punctuation mark (of a pair) + .Pf, // Final_Punctuation, a final quotation mark + .Pi, // Initial_Punctuation, an initial quotation mark + .Po, // Other_Punctuation, a punctuation mark of other type + .Ps, // Open_Punctuation, an opening punctuation mark (of a pair) + .Sc, // Currency_Symbol, a currency sign + .Sk, // Modifier_Symbol, a non-letterlike modifier symbol + .Sm, // Math_Symbol, a symbol of mathematical use + .So, // Other_Symbol, a symbol of other type + .Zl, // Line_Separator, U+2028 LINE SEPARATOR only + .Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only + .Zs, // Space_Separator, a space character (of various non-zero widths) + } + + write_loop : for gc, i in general_category_ranges { + for excluded in to_exclude { + if i == excluded do continue write_loop + } + write_range(writer, i, gc) + } + + write_range(writer, "extra_digits", extra_digits ) + + write_range(writer,"other_lowercase", proplist[.Other_Lowercase]) + write_range(writer,"other_uppercase", proplist[.Other_Uppercase]) + + file_name, _ := path.join({ODIN_ROOT, "core", "unicode", "generated.odin"}, context.allocator) + defer delete(file_name) + + str := strings.to_string(sb) + + write_error := os.write_entire_file_from_string(file_name, str) + if write_error != nil { + log.errorf("Error writting %s. %s", file_name, write_error) + } +} + diff --git a/core/unicode/tools/ucd/iterator.odin b/core/unicode/tools/ucd/iterator.odin new file mode 100644 index 000000000..53424466f --- /dev/null +++ b/core/unicode/tools/ucd/iterator.odin @@ -0,0 +1,70 @@ +package ucd + +/* +An iterator that allows simple iterating over the lines of of a slice of bytes, []byte, +without allocating. Each line must end in a new line, i.e., '\n' +*/ +Line_Iterator :: struct { + index: int, // current location in data + data: []byte, // Data over which to iterate + line_counter: int, // line number storage +} + +line_iterator :: proc(it: ^Line_Iterator) -> (line: []byte, line_number: int, more: bool) { + more = it.index < len(it.data) + if more { + it.line_counter += 1 + line_number = it.line_counter + } else { + return + } + start:= it.index + for it.index < len(it.data) && it.data[it.index] != '\n' && it.data[it.index] != '#' do it.index += 1 + line = it.data[start:it.index] + //index = start + + if it.index < len(it.data) && it.data[it.index] == '#' { + for it.index < len(it.data) && it.data[it.index] != '\n' do it.index += 1 + } + if it.index < len(it.data) && it.data[it.index] == '\n' do it.index += 1 + return +} + +Field_Iterator :: struct { + index: int, + field_counter: int, + line: []byte, +} + +field_iterator :: proc(it: ^Field_Iterator) -> (field: []byte, field_count: int, valid: bool) { + valid = it.index < len(it.line) && it.line[it.index] != '\n' && it.line[it.index] != '#' + if !valid do return + + if it.index < len(it.line) && it.index != 0 && it.line[it.index] == ';' do it. index += 1 + + start := it.index + for it.index < len(it.line) && it.line[it.index] != ';' && it.line[it.index] != '#' do it.index += 1 + + field = it.line[start:it.index] + temp := field + + // Remove leading spaces + for b, i in temp { + if b != ' ' { + field = temp[i:] + break + } + } + + // Remove trailing spaces + temp = field + for b, i in temp { + if b != ' ' { + field = temp[0:i+1] + } + } + + field_count = it.field_counter + it.field_counter += 1 + return +} diff --git a/core/unicode/tools/ucd/string_to.odin b/core/unicode/tools/ucd/string_to.odin new file mode 100644 index 000000000..5ca0f40fe --- /dev/null +++ b/core/unicode/tools/ucd/string_to.odin @@ -0,0 +1,396 @@ +package ucd + +string_to_general_category :: proc "contextless"( + str: string, +) -> (gc: General_Category, err: Error) { + switch str { + case "Lu": + gc = .Lu + case "Ll": + gc = .Ll + case "Lt": + gc = .Lt + case "Lm": + gc = .Lm + case "Lo": + gc = .Lo + case "Mn": + gc = .Mn + case "Mc": + gc = .Mc + case "Me": + gc = .Me + case "Nd": + gc = .Nd + case "Nl": + gc = .Nl + case "No": + gc = .No + case "Pc": + gc = .Pc + case "Pd": + gc = .Pd + case "Ps": + gc = .Ps + case "Pe": + gc = .Pe + case "Pi": + gc = .Pi + case "Pf": + gc = .Pf + case "Po": + gc = .Po + case "Sm": + gc = .Sm + case "Sc": + gc = .Sc + case "Sk": + gc = .Sk + case "So": + gc = .So + case "Zs": + gc = .Zs + case "Zl": + gc = .Zl + case "Zp": + gc = .Zp + case "Cc": + gc = .Cc + case "Cf": + gc = .Cf + case "Cs": + gc = .Cs + case "Co": + gc = .Co + case "Cn": + gc = .Cn + case: + err = UCD_Error.Invalid_General_Category + } + return +} + + +string_to_age :: proc "contextless" ( + str: string, +) -> (age: Age, err: Error) { + switch str { + case "1.1": + age = .Age_1_1 + return + + case "2.0": + age = .Age_2_0 + return + + case "2.1": + age = .Age_2_1 + return + + case "3.0": + age = .Age_3_0 + return + + case "3.1": + age = .Age_3_1 + return + + case "3.2": + age = .Age_3_2 + return + + case "4.0": + age = .Age_4_0 + return + + case "4.1": + age = .Age_4_1 + return + + case "5.0": + age = .Age_5_0 + return + + case "5.1": + age = .Age_5_1 + return + + case "5.2": + age = .Age_5_2 + return + + case "6.0": + age = .Age_6_0 + return + + case "6.1": + age = .Age_6_1 + return + + case "6.2": + age = .Age_6_2 + return + + case "6.3": + age = .Age_6_3 + return + + case "7.0": + age = .Age_7_0 + return + + case "8.0": + age = .Age_8_0 + return + + case "9.0": + age = .Age_9_0 + return + + case "10.0": + age = .Age_10_0 + return + + case "11.0": + age = .Age_11_0 + return + + case "12.0": + age = .Age_12_0 + return + + case "12.1": + age = .Age_12_1 + return + + case "13.0": + age = .Age_13_0 + return + + case "14.0": + age = .Age_14_0 + return + + case "15.0": + age = .Age_15_0 + return + + case "15.1": + age = .Age_15_1 + return + + case "16.0": + age = .Age_16_0 + return + + case "17.0": + age = .Age_17_0 + return + + case "unassigned": + age = .Age_Unassigned + return + + case: + // NOTE: Should this return an error instead? + unreachable() + } +} + + +string_to_paired_bracket_type :: proc "contextless"(str: string) -> Paired_Brack_Type { + switch str { + case "o": + return .Open + case "c": + return .Close + case "n": + return .None + case: + // TODO: Add error for this + unreachable() + } +} + +string_to_bidi_class :: proc "contextless"(str: string) -> Bidi_Class { + switch str { + case "AL": + return .AL + case "AN": + return .AN + case "B": + return .B + case "BN": + return .BN + case "CS": + return .CS + case "EN": + return .EN + case "ES": + return .ES + case "ET": + return .ET + case "FSI": + return .FSI + case "L": + return .L + case "LRE": + return .LRE + case "LRI": + return .LRI + case "LRO": + return .LRO + case "NSM": + return .NSM + case "ON": + return .ON + case "PDF": + return .PDF + case "PDI": + return .PDI + case "R": + return .R + case "RLE": + return .RLE + case "RLI": + return .RLI + case "RLO": + return .RLO + case "S": + return .S + case "WS": + return .WS + case: + // TODO: Add error for this + unreachable() + } +} + +string_to_proplist_property :: proc(str: string) -> ( + prop: PropList_Property, + err: UCD_Error, +) { + + switch str { + case "White_Space": + prop = .White_Space + + case "Bidi_Control": + prop = .Bidi_Control + + case "Join_Control": + prop = .Join_Control + + case "Dash": + prop = .Dash + + case "Hyphen": + prop = .Hyphen + + case "Quotation_Mark": + prop = .Quotation_Mark + + case "Terminal_Punctuation": + prop = .Terminal_Punctuation + + case "Other_Math": + prop = .Other_Math + + case "Hex_Digit": + prop = .Hex_Digit + + case "ASCII_Hex_Digit": + prop = .ASCII_Hex_Digit + + case "Other_Alphabetic": + prop = .Other_Alphabetic + + case "Ideographic": + prop = .Ideographic + + case "Diacritic": + prop = .Diacritic + + case "Extender": + prop = .Extender + + case "Other_Lowercase": + prop = .Other_Lowercase + + case "Other_Uppercase": + prop = .Other_Uppercase + + + case "Noncharacter_Code_Point": + prop = .Noncharacter_Code_Point + + case "Other_Grapheme_Extend": + prop = .Other_Grapheme_Extend + + case "IDS_Binary_Operator": + prop = .IDS_Binary_Operator + + case "IDS_Trinary_Operator": + prop = .IDS_Trinary_Operator + + case "IDS_Unary_Operator": + prop = .IDS_Unary_Operator + + case "Radical": + prop = .Radical + + case "Unified_Ideograph": + prop = .Unified_Ideograph + + case "Other_Default_Ignorable_Code_Point": + prop = .Other_Default_Ignorable_Code_Point + + case "Deprecated": + prop = .Deprecated + + case "Soft_Dotted": + prop = .Soft_Dotted + + case "Logical_Order_Exception": + prop = .Logical_Order_Exception + + case "Other_ID_Start": + prop = .Other_ID_Start + + case "Other_ID_Continue": + prop = .Other_ID_Continue + + case "ID_Compat_Math_Continue": + prop = .ID_Compat_Math_Continue + + case "ID_Compat_Math_Start": + prop = .ID_Compat_Math_Start + + case "Sentence_Terminal": + prop = .Sentence_Terminal + + case "Variation_Selector": + prop = .Variation_Selector + + case "Pattern_White_Space": + prop = .Pattern_White_Space + + case "Pattern_Syntax": + prop = .Pattern_Syntax + + case "Prepended_Concatenation_Mark": + prop = .Prepended_Concatenation_Mark + + case "Regional_Indicator": + prop = .Regional_Indicator + + case "Modifier_Combining_Mark": + prop = .Modifier_Combining_Mark + + case: + err = .Unknown_Property + return + } + + return +} diff --git a/core/unicode/tools/ucd/types.odin b/core/unicode/tools/ucd/types.odin new file mode 100644 index 000000000..0ba6f8909 --- /dev/null +++ b/core/unicode/tools/ucd/types.odin @@ -0,0 +1,702 @@ +package ucd + +import "core:os" + +Age :: enum byte { + Nil = 0, + Age_1_1, + Age_2_0, + Age_2_1, + Age_3_0, + Age_3_1, + Age_3_2, + Age_4_0, + Age_4_1, + Age_5_0, + Age_5_1, + Age_5_2, + Age_6_0, + Age_6_1, + Age_6_2, + Age_6_3, + Age_7_0, + Age_8_0, + Age_9_0, + Age_10_0, + Age_11_0, + Age_12_0, + Age_12_1, + Age_13_0, + Age_14_0, + Age_15_0, + Age_15_1, + Age_16_0, + Age_17_0, + Age_Unassigned, +} + +General_Category :: enum { + Cc, // Control, a C0 or C1 control code + Cf, // Format, a format control character + Cn, // Unassigned, a reserved unassigned code point or a noncharacter + Co, // Private_Use, a private-use character + Cs, // Surrogate, a surrogate code point + Ll, // Lowercase_Letter, a lowercase letter + Lm, // Modifier_Letter, a modifier letter + Lo, // Other_Letter, other letters, including syllables and ideographs + Lt, // Titlecase_Letter, a digraph encoded as a single character, with first part uppercase + Lu, // Uppercase_Letter, an uppercase letter + Mc, // Spacing_Mark, a spacing combining mark (positive advance width) + Me, // Enclosing_Mark, an enclosing combining mark + Mn, // Nonspacing_Mark, a nonspacing combining mark (zero advance width) + Nd, // Decimal_Number, a decimal digit + Nl, // Letter_Number, a letterlike numeric character + No, // Other_Number, a numeric character of other type + Pc, // Connector_Punctuation, a connecting punctuation mark, like a tie + Pd, // Dash_Punctuation, a dash or hyphen punctuation mark + Pe, // Close_Punctuation, a closing punctuation mark (of a pair) + Pf, // Final_Punctuation, a final quotation mark + Pi, // Initial_Punctuation, an initial quotation mark + Po, // Other_Punctuation, a punctuation mark of other type + Ps, // Open_Punctuation, an opening punctuation mark (of a pair) + Sc, // Currency_Symbol, a currency sign + Sk, // Modifier_Symbol, a non-letterlike modifier symbol + Sm, // Math_Symbol, a symbol of mathematical use + So, // Other_Symbol, a symbol of other type + Zl, // Line_Separator, U+2028 LINE SEPARATOR only + Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only + Zs, // Space_Separator, a space character (of various non-zero widths) +} + +Block :: enum { + Nil = 0, + Adlam, + Aegean_Numbers, + Ahom, + Alchemical, + Alphabetic_PF, + Anatolian_Hieroglyphs, + Ancient_Greek_Music, + Ancient_Greek_Numbers, + Ancient_Symbols, + Arabic, + Arabic_Ext_A, + Arabic_Ext_B, + Arabic_Ext_C, + Arabic_Math, + Arabic_PF_A, + Arabic_PF_B, + Arabic_Sup, + Armenian, + Arrows, + ASCII, + Avestan, + Balinese, + Bamum, + Bamum_Sup, + Bassa_Vah, + Batak, + Bengali, + Beria_Erfe, + Bhaiksuki, + Block_Elements, + Bopomofo, + Bopomofo_Ext, + Box_Drawing, + Brahmi, + Braille, + Buginese, + Buhid, + Byzantine_Music, + Carian, + Caucasian_Albanian, + Chakma, + Cham, + Cherokee, + Cherokee_Sup, + Chess_Symbols, + Chorasmian, + CJK, + CJK_Compat, + CJK_Compat_Forms, + CJK_Compat_Ideographs, + CJK_Compat_Ideographs_Sup, + CJK_Ext_A, + CJK_Ext_B, + CJK_Ext_C, + CJK_Ext_D, + CJK_Ext_E, + CJK_Ext_F, + CJK_Ext_G, + CJK_Ext_H, + CJK_Ext_I, + CJK_Ext_J, + CJK_Radicals_Sup, + CJK_Strokes, + CJK_Symbols, + Compat_Jamo, + Control_Pictures, + Coptic, + Coptic_Epact_Numbers, + Counting_Rod, + Cuneiform, + Cuneiform_Numbers, + Currency_Symbols, + Cypriot_Syllabary, + Cypro_Minoan, + Cyrillic, + Cyrillic_Ext_A, + Cyrillic_Ext_B, + Cyrillic_Ext_C, + Cyrillic_Ext_D, + Cyrillic_Sup, + Deseret, + Devanagari, + Devanagari_Ext, + Devanagari_Ext_A, + Diacriticals, + Diacriticals_Ext, + Diacriticals_For_Symbols, + Diacriticals_Sup, + Dingbats, + Dives_Akuru, + Dogra, + Domino, + Duployan, + Early_Dynastic_Cuneiform, + Egyptian_Hieroglyph_Format_Controls, + Egyptian_Hieroglyphs, + Egyptian_Hieroglyphs_Ext_A, + Elbasan, + Elymaic, + Emoticons, + Enclosed_Alphanum, + Enclosed_Alphanum_Sup, + Enclosed_CJK, + Enclosed_Ideographic_Sup, + Ethiopic, + Ethiopic_Ext, + Ethiopic_Ext_A, + Ethiopic_Ext_B, + Ethiopic_Sup, + Garay, + Geometric_Shapes, + Geometric_Shapes_Ext, + Georgian, + Georgian_Ext, + Georgian_Sup, + Glagolitic, + Glagolitic_Sup, + Gothic, + Grantha, + Greek, + Greek_Ext, + Gujarati, + Gunjala_Gondi, + Gurmukhi, + Gurung_Khema, + Half_And_Full_Forms, + Half_Marks, + Hangul, + Hanifi_Rohingya, + Hanunoo, + Hatran, + Hebrew, + High_PU_Surrogates, + High_Surrogates, + Hiragana, + IDC, + Ideographic_Symbols, + Imperial_Aramaic, + Indic_Number_Forms, + Indic_Siyaq_Numbers, + Inscriptional_Pahlavi, + Inscriptional_Parthian, + IPA_Ext, + Jamo, + Jamo_Ext_A, + Jamo_Ext_B, + Javanese, + Kaithi, + Kaktovik_Numerals, + Kana_Ext_A, + Kana_Ext_B, + Kana_Sup, + Kanbun, + Kangxi, + Kannada, + Katakana, + Katakana_Ext, + Kawi, + Kayah_Li, + Kharoshthi, + Khitan_Small_Script, + Khmer, + Khmer_Symbols, + Khojki, + Khudawadi, + Kirat_Rai, + Lao, + Latin_1_Sup, + Latin_Ext_A, + Latin_Ext_Additional, + Latin_Ext_B, + Latin_Ext_C, + Latin_Ext_D, + Latin_Ext_E, + Latin_Ext_F, + Latin_Ext_G, + Lepcha, + Letterlike_Symbols, + Limbu, + Linear_A, + Linear_B_Ideograms, + Linear_B_Syllabary, + Lisu, + Lisu_Sup, + Low_Surrogates, + Lycian, + Lydian, + Mahajani, + Mahjong, + Makasar, + Malayalam, + Mandaic, + Manichaean, + Marchen, + Masaram_Gondi, + Math_Alphanum, + Math_Operators, + Mayan_Numerals, + Medefaidrin, + Meetei_Mayek, + Meetei_Mayek_Ext, + Mende_Kikakui, + Meroitic_Cursive, + Meroitic_Hieroglyphs, + Miao, + Misc_Arrows, + Misc_Math_Symbols_A, + Misc_Math_Symbols_B, + Misc_Pictographs, + Misc_Symbols, + Misc_Symbols_Sup, + Misc_Technical, + Modi, + Modifier_Letters, + Modifier_Tone_Letters, + Mongolian, + Mongolian_Sup, + Mro, + Multani, + Music, + Myanmar, + Myanmar_Ext_A, + Myanmar_Ext_B, + Myanmar_Ext_C, + Nabataean, + Nag_Mundari, + Nandinagari, + NB, + New_Tai_Lue, + Newa, + NKo, + Number_Forms, + Nushu, + Nyiakeng_Puachue_Hmong, + OCR, + Ogham, + Ol_Chiki, + Ol_Onal, + Old_Hungarian, + Old_Italic, + Old_North_Arabian, + Old_Permic, + Old_Persian, + Old_Sogdian, + Old_South_Arabian, + Old_Turkic, + Old_Uyghur, + Oriya, + Ornamental_Dingbats, + Osage, + Osmanya, + Ottoman_Siyaq_Numbers, + Pahawh_Hmong, + Palmyrene, + Pau_Cin_Hau, + Phags_Pa, + Phaistos, + Phoenician, + Phonetic_Ext, + Phonetic_Ext_Sup, + Playing_Cards, + Psalter_Pahlavi, + PUA, + Punctuation, + Rejang, + Rumi, + Runic, + Samaritan, + Saurashtra, + Sharada, + Sharada_Sup, + Shavian, + Shorthand_Format_Controls, + Siddham, + Sidetic, + Sinhala, + Sinhala_Archaic_Numbers, + Small_Forms, + Small_Kana_Ext, + Sogdian, + Sora_Sompeng, + Soyombo, + Specials, + Sundanese, + Sundanese_Sup, + Sunuwar, + Sup_Arrows_A, + Sup_Arrows_B, + Sup_Arrows_C, + Sup_Math_Operators, + Sup_PUA_A, + Sup_PUA_B, + Sup_Punctuation, + Sup_Symbols_And_Pictographs, + Super_And_Sub, + Sutton_SignWriting, + Syloti_Nagri, + Symbols_And_Pictographs_Ext_A, + Symbols_For_Legacy_Computing, + Symbols_For_Legacy_Computing_Sup, + Syriac, + Syriac_Sup, + Tagalog, + Tagbanwa, + Tags, + Tai_Le, + Tai_Tham, + Tai_Viet, + Tai_Xuan_Jing, + Tai_Yo, + Takri, + Tamil, + Tamil_Sup, + Tangsa, + Tangut, + Tangut_Components, + Tangut_Components_Sup, + Tangut_Sup, + Telugu, + Thaana, + Thai, + Tibetan, + Tifinagh, + Tirhuta, + Todhri, + Tolong_Siki, + Toto, + Transport_And_Map, + Tulu_Tigalari, + UCAS, + UCAS_Ext, + UCAS_Ext_A, + Ugaritic, + Vai, + Vedic_Ext, + Vertical_Forms, + Vithkuqi, + VS, + VS_Sup, + Wancho, + Warang_Citi, + Yezidi, + Yi_Radicals, + Yi_Syllables, + Yijing, + Zanabazar_Square, + Znamenny_Music, +} + +Combining_Class :: distinct byte + +Paired_Brack_Type :: enum { + Nil, + Open, + Close, + None, +} + +Bidi_Class :: enum { + Nil, // + L, // Left-to-Right LRM + R, // Right-to-Left RLM + AL, // Right-to-Left Arabic ALM + EN, // European Number + ES, // European Number Separator + ET, // European Number Terminator + AN, // Arabic Number + CS, // Common Number Separator + NSM, // Nonspacing Mark + BN, // Boundary Neutral + B, // Paragraph Separator + S, // Segment Separator + WS, // Whitespace + ON, // Other Neutrals + LRE, // Left-to-Right Embedding LRE + LRO, // Left-to-Right Override LRO + RLE, // Right-to-Left Embedding RLE + RLO, // Right-to-Left Override RLO + PDF, // Pop Directional Format PDF + LRI, // Left-to-Right Isolate LRI + RLI, // Right-to-Left Isolate RLI + FSI, // First Strong Isolate FSI + PDI, // Pop Directional Isolate PDI +} + + +Bidi :: struct { + bc: Bidi_Class, + bmg: Maybe(rune), // mirrored glyph + m: bool, // Bidi mirrored + c: bool, // Bidi control property + bpt : Paired_Brack_Type, // bidi paired bracket type + bpb : rune, // bidi paired bracket properties +} + + +Decomposition_Type :: enum { + Nil = 0, + can, + com, + enc, + fin, + font, + fra, + init, + iso, + med, + nar, + nb, + sml, + sqr, + sub, + sup, + vert, + wid, + none, +} + +Trinary_Bool :: enum { + Maybe = -1, + False = 0, + True = 1, +} + +Decomposition_Mapping :: distinct [dynamic]rune + +Decomposition :: struct { + dt: Decomposition_Type, // Decomposition type + dm: Decomposition_Mapping, // Decomposition Mapping + ce: bool, // Composition Exclusion + comp_ex: bool, // Full Composition Exclusion + nfc_quick_check: Trinary_Bool, + nfd_quick_check: bool, + nfkc_quick_check: Trinary_Bool, + nfkd_quick_check: bool, +} + +Numeric_Type :: enum { + None = 0, // None + Decimal, // De + Digit, // Di + Numeric, // Nu +} + +/* +Note: Value is NAN when numberator and denominator ar 0 +*/ +Numberic_Value :: struct { + numerator: int, + denominator: int, +} + +Char :: struct { + cp: rune, + name: string, + gc: General_Category, + ccc: Combining_Class, + bc: Bidi_Class, + dt: Decomposition_Type, + dm: Decomposition_Mapping, + nt: Numeric_Type, + nv: Numberic_Value, + bm: bool, + name1: string, + sum: string, // Simple uppercase mapping + slm: string, // Simple lowercase mapping + stm: string, // Simple titlecase_mapping +} + +Char_Range :: struct { + first_cp: rune, + last_cp: rune, + name: string, + gc: General_Category, + ccc: Combining_Class, + bc: Bidi_Class, + dt: Decomposition_Type, + dm: Decomposition_Mapping, + nt: Numeric_Type, + nv: Numberic_Value, + bm: bool, + name1: string, + sum: string, // Simple uppercase mapping + slm: string, // Simple lowercase mapping + stm: string, // Simple titlecase_mapping +} + +Chars :: union { + Char, + Char_Range, +} + +Unicode_Data :: distinct [dynamic]Chars + + +PropList_Property :: enum { + White_Space, + Bidi_Control, + Join_Control, + Dash, + Hyphen, + Quotation_Mark, + Terminal_Punctuation, + Other_Math, + Hex_Digit, + ASCII_Hex_Digit, + Other_Alphabetic, + Ideographic, + Diacritic, + Extender, + Other_Lowercase, + Other_Uppercase, + Noncharacter_Code_Point, + Other_Grapheme_Extend, + IDS_Binary_Operator, + IDS_Trinary_Operator, + IDS_Unary_Operator, + Radical, + Unified_Ideograph, + Other_Default_Ignorable_Code_Point, + Deprecated, + Soft_Dotted, + Logical_Order_Exception, + Other_ID_Start, + Other_ID_Continue, + ID_Compat_Math_Continue, + ID_Compat_Math_Start, + Sentence_Terminal, + Variation_Selector, + Pattern_White_Space, + Pattern_Syntax, + Prepended_Concatenation_Mark, + Regional_Indicator, + Modifier_Combining_Mark, +} + +UCD_Error :: enum { + XML_LOAD_ERROR, + XML_Not_UCD, + Nil_XML_Document, + Element_Not_Repertoire, + Extra_Fields, + Unknown_Property, + + NO_REPERTOIRE, + UNEXPECTED_STRING, + Invalid_Hex_Number, + Invalid_General_Category, + UnicodeData_6_Too_Long, + UnicodeData_6_Invalid, + UnicodeData_7_Too_Long, + UnicodeData_7_Invalid, +} + + +Error :: union #shared_nil { + UCD_Error, + os.Error, +} + +Range_u16 :: struct { + first: u16, + last: u16, +} + +Range_i32 :: struct { + first: i32, + last: i32, +} + +Range_Rune :: struct { + first: rune, + last: rune, +} + +Dynamic_Range :: struct { + single_16 : [dynamic]u16, + ranges_16 : [dynamic]Range_u16, + single_32 : [dynamic]i32, + ranges_32 : [dynamic]Range_i32, +} + +append_to_dynamic_range :: proc( + dr: ^Dynamic_Range, + range: Range_Rune, + allocator := context.allocator, +) { + if range.first == range.last && range.first <= 0xFFFF { + if len(dr.single_16) == 0 { + dr.single_16 = make([dynamic]u16, 0, 512, allocator) + } + append(&dr.single_16, cast(u16) range.first) + } else if range.first == range.last { + if len(dr.single_32) == 0 { + dr.single_32 = make([dynamic]i32, 0, 512, allocator) + } + append(&dr.single_32, cast(i32) range.first) + + } else if range.first <= 0xFFFF && range.last <= 0xFFFF { + if len(dr.ranges_16) == 0 { + dr.ranges_16 = make([dynamic]Range_u16, 0, 128, allocator) + } + r := Range_u16{ cast(u16)range.first, cast(u16) range.last} + append(&dr.ranges_16, r) + + } else { + if len(dr.ranges_32) == 0 { + dr.ranges_32 = make([dynamic]Range_i32, 0, 128, allocator) + } + r := Range_i32{ cast(i32)range.first, cast(i32) range.last} + append(&dr.ranges_32, r) + } +} + +destroy_dynamic_range :: proc ( + dr: Dynamic_Range, +){ + delete(dr.ranges_16) + delete(dr.ranges_32) + delete(dr.single_16) + delete(dr.single_32) +} + +destroy_general_category_ranges :: proc( + gcr: [General_Category]Dynamic_Range, +){ + for r in gcr { + destroy_dynamic_range(r) + } +} diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin new file mode 100644 index 000000000..d46ae37cb --- /dev/null +++ b/core/unicode/tools/ucd/ucd.odin @@ -0,0 +1,307 @@ +package ucd + +import "core:strings" +import "core:os" + +load_unicode_data :: proc( + filename: string, + allocator := context.allocator, +) -> (unicode_data : Unicode_Data, err: Error) { + + data, os_error := os.read_entire_file(filename, context.temp_allocator) + if os_error != nil { + err = os_error + return + } + defer free_all(context.temp_allocator) + + line_iter := Line_Iterator{data = data } + first_cp: rune + + line_loop: for line, line_num in line_iterator(&line_iter) { + // Skip empty lines + if len(line) == 0 do continue + + field_iter := Field_Iterator{line = line} + is_range := false + cp: rune + name: string + gc: General_Category + + num_6 : string + num_7 : string + nt := Numeric_Type.None + nv : Numberic_Value + + for field, field_num in field_iterator(&field_iter) { + switch field_num { + case 0: // Code point + cp = 0 + + for c in field { + if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') do break + cp *= 16 + cp += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') + cp += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + } + + case 1: // Name + if len(field) > 9 && field[0] == '<' && strings.ends_with(transmute(string) field, ", First>") { + first_cp = cp + continue line_loop + } + + if len(field) > 9 && field[0] == '<' && strings.ends_with(transmute(string) field, ", Last>") { + name = strings.clone_from_bytes(field[1:len(field)-7], allocator) + is_range = true + } else { + name = strings.clone_from_bytes(field[:], allocator) + } + + case 2: // General_Category + // NOTE: This is currently igorning a possible error it should probably be fixed + gc, _ = string_to_general_category(transmute(string)field) + + case 3: // Canonical_Combining_Class + case 4: // Bidi Class + case 5: // Decomposition_Type and Decomposition_Mapping + // Numeric_Type and Numberic_Value + case 6: + num_6 = transmute(string)field + + case 7: + num_7 = transmute(string)field + + case 8: + switch { + case num_6 != "" && num_7 != "" && transmute(string) field != "" : + nt = .Decimal + + case num_6 == "" && num_7 != "" && transmute(string) field != "" : + nt = .Digit + + case num_6 == "" && num_7 == "" && transmute(string) field != "" : + nt = .Numeric + + case: + nt = .None + } + + case 9: // Bidi mirrored + case 10: // Unicode 1 Name (Obsolete as of 6.2.0) + case 11: // should be null + case 12: + case 13: + case 14: + case: + unreachable() + } + } + + if is_range { + cr : Char_Range + cr.gc = gc + cr.first_cp = first_cp + cr.last_cp = cp + cr.name = name + cr.nt = nt + append(&unicode_data, cr) + } else { + c : Char + c.gc = gc + c.cp = cp + c.name = name + c.nt = nt + append(&unicode_data, c) + } + } + return +} + +destroy_unicode_data :: proc(unicode_data: Unicode_Data){ + for point in unicode_data { + switch p in point { + case Char: + delete(p.name) + case Char_Range: + delete(p.name) + } + } + delete(unicode_data) +} + + +gc_ranges :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (lst: [General_Category]Dynamic_Range) { + range := Range_Rune { + first = -1, + last = -1, + } + gc: General_Category + + for point in ud { + switch p in point { + case Char: + if range.first != -1 && (p.cp != range.last + 1 || p.gc != gc) { + append_to_dynamic_range(&lst[gc], range, allocator) + range.first = -1 + range.last = -1 + } + + range.first = transmute(rune) min(transmute(u32)range.first, transmute(u32)p.cp) + gc = p.gc + range.last = p.cp + + case Char_Range: + if range.first != -1 do append_to_dynamic_range(&lst[gc], range, allocator) + + range.first = p.first_cp + range.last = p.last_cp + append_to_dynamic_range(&lst[p.gc], range ,allocator) + range.first = -1 + range.last = -1 + } + } + if range.first != -1 do append_to_dynamic_range(&lst[gc], range, allocator) + + return +} + + +extra_digits :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (Dynamic_Range) { + range := Range_Rune { + first = -1, + last = -1, + } + + exd: Dynamic_Range + for point in ud { + switch p in point { + + case Char: + exd_type := p.gc != .Nd && (p.nt == .Decimal || p.nt == .Digit) + + if range.first != -1 && (p.cp != range.last + 1 || !exd_type) { + append_to_dynamic_range(&exd, range, allocator) + range.first = -1 + range.last = -1 + } + + if exd_type { + range.first = transmute(rune) min(transmute(u32)range.first, transmute(u32)p.cp) + range.last = p.cp + } + + case Char_Range: + exd_type := p.gc != .Nd && (p.nt == .Decimal || p.nt == .Digit) + + if range.first != -1 do append_to_dynamic_range(&exd, range, allocator) + + if exd_type { + range.first = p.first_cp + range.last = p.last_cp + append_to_dynamic_range(&exd, range ,allocator) + } + range.first = -1 + range.last = -1 + } + } + if range.first != -1 do append_to_dynamic_range(&exd, range, allocator) + + return exd +} + +/* +Data containted in the Unicode fiel PropList.txt + +A `PropList` is the data containted in the Unicode Database (UCD) file +PropList.txt. It is created with the procedure `load_property_list` and +destroy with the procedure `destroy_property_list`. +*/ +PropList ::[PropList_Property]Dynamic_Range + +/* +This function destroys a `PropList` created by `load_property_list`. + +Inputs: +- props: The PropList to destroy +*/ +destroy_protperty_list :: proc( + props: [PropList_Property]Dynamic_Range, +){ + for r in props { + delete(r.ranges_16) + delete(r.ranges_32) + delete(r.single_16) + delete(r.single_32) + } +} + +load_protperty_list :: proc ( + filename : string, + allocator := context.allocator, +) -> (props: [PropList_Property]Dynamic_Range, err: Error) { + + data, os_error := os.read_entire_file(filename, allocator) + if os_error != nil { + err = os_error + return + } + defer delete(data) + + line_iter := Line_Iterator{ + data = data + } + for line in line_iterator(&line_iter) { + if len(line) == 0 do continue + field_iter := Field_Iterator{ line = line} + + is_range: bool + + rr : Range_Rune + + prop: PropList_Property + for field, i in field_iterator(&field_iter) { + switch i { + case 0: // Code point or code point range + for c in field { + if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') { + if c == '.' { + is_range = true + continue + } else { + err = UCD_Error.Invalid_Hex_Number + return + } + } + if is_range { + rr.first *= 16 + rr.first += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') + rr.first += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + rr.last = rr.first + } else { + rr.last *= 16 + rr.last += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') + rr.last += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + } + } + + case 1: + prop, err = string_to_proplist_property(transmute(string)field) + if err != nil { + return + } + + case: + err = UCD_Error.Extra_Fields + return + } + } + + append_to_dynamic_range(&props[prop], rr, allocator) + } + + return +} + + + From 9d038b23ec00b722f549fb6c86bf48d3aef5d319 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 17:41:55 -0500 Subject: [PATCH 052/273] Add generated tables to core/unicode --- core/unicode/generated.odin | 1272 +++++++++++++++++++++++++++++++++++ 1 file changed, 1272 insertions(+) create mode 100644 core/unicode/generated.odin diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin new file mode 100644 index 000000000..28d2cf7e1 --- /dev/null +++ b/core/unicode/generated.odin @@ -0,0 +1,1272 @@ +package unicode + +/* + ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ +*/ + +/* + This file is generated from UnicodeData.txt and PropList.txt. These files + are part of the Unicode Database (UCD) and are covered by the license + listed further down. They may be downloaded from the following locations; + + https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt + https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt + https://www.unicode.org/license.txt + + ------------------------------------------------------------------------------ + UNICODE LICENSE V3 + + COPYRIGHT AND PERMISSION NOTICE + + Copyright © 1991-2026 Unicode, Inc. + + NOTICE TO USER: Carefully read the following legal agreement. BY + DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR + SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE + TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT + DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of data files and any associated documentation (the "Data Files") or + software and any associated documentation (the "Software") to deal in the + Data Files or Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, and/or sell + copies of the Data Files or Software, and to permit persons to whom the + Data Files or Software are furnished to do so, provided that either (a) + this copyright and permission notice appear with all copies of the Data + Files or Software, or (b) this copyright and permission notice appear in + associated Documentation. + + THE DATA FILES AND SOFTWARE ARE 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 OF + THIRD PARTY RIGHTS. + + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE + BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, + OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA + FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder shall + not be used in advertising or otherwise to promote the sale, use or other + dealings in these Data Files or Software without prior written + authorization of the copyright holder. + +*/ + +Range :: struct { + single_16 : []u16, + ranges_16 : []u16, + single_32 : []i32, + ranges_32 : []i32, +} + +@(rodata) +ll_singles16 := [?]u16{ + 0x00B5, 0x0101, 0x0103, 0x0105, 0x0107, 0x0109, 0x010B, 0x010D, 0x010F, 0x0111, + 0x0113, 0x0115, 0x0117, 0x0119, 0x011B, 0x011D, 0x011F, 0x0121, 0x0123, 0x0125, + 0x0127, 0x0129, 0x012B, 0x012D, 0x012F, 0x0131, 0x0133, 0x0135, 0x013A, 0x013C, + 0x013E, 0x0140, 0x0142, 0x0144, 0x0146, 0x014B, 0x014D, 0x014F, 0x0151, 0x0153, + 0x0155, 0x0157, 0x0159, 0x015B, 0x015D, 0x015F, 0x0161, 0x0163, 0x0165, 0x0167, + 0x0169, 0x016B, 0x016D, 0x016F, 0x0171, 0x0173, 0x0175, 0x0177, 0x017A, 0x017C, + 0x0183, 0x0185, 0x0188, 0x0192, 0x0195, 0x019E, 0x01A1, 0x01A3, 0x01A5, 0x01A8, + 0x01AD, 0x01B0, 0x01B4, 0x01B6, 0x01C6, 0x01C9, 0x01CC, 0x01CE, 0x01D0, 0x01D2, + 0x01D4, 0x01D6, 0x01D8, 0x01DA, 0x01DF, 0x01E1, 0x01E3, 0x01E5, 0x01E7, 0x01E9, + 0x01EB, 0x01ED, 0x01F3, 0x01F5, 0x01F9, 0x01FB, 0x01FD, 0x01FF, 0x0201, 0x0203, + 0x0205, 0x0207, 0x0209, 0x020B, 0x020D, 0x020F, 0x0211, 0x0213, 0x0215, 0x0217, + 0x0219, 0x021B, 0x021D, 0x021F, 0x0221, 0x0223, 0x0225, 0x0227, 0x0229, 0x022B, + 0x022D, 0x022F, 0x0231, 0x023C, 0x0242, 0x0247, 0x0249, 0x024B, 0x024D, 0x0371, + 0x0373, 0x0377, 0x0390, 0x03D9, 0x03DB, 0x03DD, 0x03DF, 0x03E1, 0x03E3, 0x03E5, + 0x03E7, 0x03E9, 0x03EB, 0x03ED, 0x03F5, 0x03F8, 0x0461, 0x0463, 0x0465, 0x0467, + 0x0469, 0x046B, 0x046D, 0x046F, 0x0471, 0x0473, 0x0475, 0x0477, 0x0479, 0x047B, + 0x047D, 0x047F, 0x0481, 0x048B, 0x048D, 0x048F, 0x0491, 0x0493, 0x0495, 0x0497, + 0x0499, 0x049B, 0x049D, 0x049F, 0x04A1, 0x04A3, 0x04A5, 0x04A7, 0x04A9, 0x04AB, + 0x04AD, 0x04AF, 0x04B1, 0x04B3, 0x04B5, 0x04B7, 0x04B9, 0x04BB, 0x04BD, 0x04BF, + 0x04C2, 0x04C4, 0x04C6, 0x04C8, 0x04CA, 0x04CC, 0x04D1, 0x04D3, 0x04D5, 0x04D7, + 0x04D9, 0x04DB, 0x04DD, 0x04DF, 0x04E1, 0x04E3, 0x04E5, 0x04E7, 0x04E9, 0x04EB, + 0x04ED, 0x04EF, 0x04F1, 0x04F3, 0x04F5, 0x04F7, 0x04F9, 0x04FB, 0x04FD, 0x04FF, + 0x0501, 0x0503, 0x0505, 0x0507, 0x0509, 0x050B, 0x050D, 0x050F, 0x0511, 0x0513, + 0x0515, 0x0517, 0x0519, 0x051B, 0x051D, 0x051F, 0x0521, 0x0523, 0x0525, 0x0527, + 0x0529, 0x052B, 0x052D, 0x052F, 0x1C8A, 0x1E01, 0x1E03, 0x1E05, 0x1E07, 0x1E09, + 0x1E0B, 0x1E0D, 0x1E0F, 0x1E11, 0x1E13, 0x1E15, 0x1E17, 0x1E19, 0x1E1B, 0x1E1D, + 0x1E1F, 0x1E21, 0x1E23, 0x1E25, 0x1E27, 0x1E29, 0x1E2B, 0x1E2D, 0x1E2F, 0x1E31, + 0x1E33, 0x1E35, 0x1E37, 0x1E39, 0x1E3B, 0x1E3D, 0x1E3F, 0x1E41, 0x1E43, 0x1E45, + 0x1E47, 0x1E49, 0x1E4B, 0x1E4D, 0x1E4F, 0x1E51, 0x1E53, 0x1E55, 0x1E57, 0x1E59, + 0x1E5B, 0x1E5D, 0x1E5F, 0x1E61, 0x1E63, 0x1E65, 0x1E67, 0x1E69, 0x1E6B, 0x1E6D, + 0x1E6F, 0x1E71, 0x1E73, 0x1E75, 0x1E77, 0x1E79, 0x1E7B, 0x1E7D, 0x1E7F, 0x1E81, + 0x1E83, 0x1E85, 0x1E87, 0x1E89, 0x1E8B, 0x1E8D, 0x1E8F, 0x1E91, 0x1E93, 0x1E9F, + 0x1EA1, 0x1EA3, 0x1EA5, 0x1EA7, 0x1EA9, 0x1EAB, 0x1EAD, 0x1EAF, 0x1EB1, 0x1EB3, + 0x1EB5, 0x1EB7, 0x1EB9, 0x1EBB, 0x1EBD, 0x1EBF, 0x1EC1, 0x1EC3, 0x1EC5, 0x1EC7, + 0x1EC9, 0x1ECB, 0x1ECD, 0x1ECF, 0x1ED1, 0x1ED3, 0x1ED5, 0x1ED7, 0x1ED9, 0x1EDB, + 0x1EDD, 0x1EDF, 0x1EE1, 0x1EE3, 0x1EE5, 0x1EE7, 0x1EE9, 0x1EEB, 0x1EED, 0x1EEF, + 0x1EF1, 0x1EF3, 0x1EF5, 0x1EF7, 0x1EF9, 0x1EFB, 0x1EFD, 0x1FBE, 0x210A, 0x2113, + 0x212F, 0x2134, 0x2139, 0x214E, 0x2184, 0x2C61, 0x2C68, 0x2C6A, 0x2C6C, 0x2C71, + 0x2C81, 0x2C83, 0x2C85, 0x2C87, 0x2C89, 0x2C8B, 0x2C8D, 0x2C8F, 0x2C91, 0x2C93, + 0x2C95, 0x2C97, 0x2C99, 0x2C9B, 0x2C9D, 0x2C9F, 0x2CA1, 0x2CA3, 0x2CA5, 0x2CA7, + 0x2CA9, 0x2CAB, 0x2CAD, 0x2CAF, 0x2CB1, 0x2CB3, 0x2CB5, 0x2CB7, 0x2CB9, 0x2CBB, + 0x2CBD, 0x2CBF, 0x2CC1, 0x2CC3, 0x2CC5, 0x2CC7, 0x2CC9, 0x2CCB, 0x2CCD, 0x2CCF, + 0x2CD1, 0x2CD3, 0x2CD5, 0x2CD7, 0x2CD9, 0x2CDB, 0x2CDD, 0x2CDF, 0x2CE1, 0x2CEC, + 0x2CEE, 0x2CF3, 0x2D27, 0x2D2D, 0xA641, 0xA643, 0xA645, 0xA647, 0xA649, 0xA64B, + 0xA64D, 0xA64F, 0xA651, 0xA653, 0xA655, 0xA657, 0xA659, 0xA65B, 0xA65D, 0xA65F, + 0xA661, 0xA663, 0xA665, 0xA667, 0xA669, 0xA66B, 0xA66D, 0xA681, 0xA683, 0xA685, + 0xA687, 0xA689, 0xA68B, 0xA68D, 0xA68F, 0xA691, 0xA693, 0xA695, 0xA697, 0xA699, + 0xA69B, 0xA723, 0xA725, 0xA727, 0xA729, 0xA72B, 0xA72D, 0xA733, 0xA735, 0xA737, + 0xA739, 0xA73B, 0xA73D, 0xA73F, 0xA741, 0xA743, 0xA745, 0xA747, 0xA749, 0xA74B, + 0xA74D, 0xA74F, 0xA751, 0xA753, 0xA755, 0xA757, 0xA759, 0xA75B, 0xA75D, 0xA75F, + 0xA761, 0xA763, 0xA765, 0xA767, 0xA769, 0xA76B, 0xA76D, 0xA76F, 0xA77A, 0xA77C, + 0xA77F, 0xA781, 0xA783, 0xA785, 0xA787, 0xA78C, 0xA78E, 0xA791, 0xA797, 0xA799, + 0xA79B, 0xA79D, 0xA79F, 0xA7A1, 0xA7A3, 0xA7A5, 0xA7A7, 0xA7A9, 0xA7AF, 0xA7B5, + 0xA7B7, 0xA7B9, 0xA7BB, 0xA7BD, 0xA7BF, 0xA7C1, 0xA7C3, 0xA7C8, 0xA7CA, 0xA7CD, + 0xA7CF, 0xA7D1, 0xA7D3, 0xA7D5, 0xA7D7, 0xA7D9, 0xA7DB, 0xA7F6, 0xA7FA, +} + +@(rodata) +ll_ranges16 := [?]u16{ + 0x0061, 0x007A, + 0x00DF, 0x00F6, + 0x00F8, 0x00FF, + 0x0137, 0x0138, + 0x0148, 0x0149, + 0x017E, 0x0180, + 0x018C, 0x018D, + 0x0199, 0x019B, + 0x01AA, 0x01AB, + 0x01B9, 0x01BA, + 0x01BD, 0x01BF, + 0x01DC, 0x01DD, + 0x01EF, 0x01F0, + 0x0233, 0x0239, + 0x023F, 0x0240, + 0x024F, 0x0293, + 0x0296, 0x02AF, + 0x037B, 0x037D, + 0x03AC, 0x03CE, + 0x03D0, 0x03D1, + 0x03D5, 0x03D7, + 0x03EF, 0x03F3, + 0x03FB, 0x03FC, + 0x0430, 0x045F, + 0x04CE, 0x04CF, + 0x0560, 0x0588, + 0x10D0, 0x10FA, + 0x10FD, 0x10FF, + 0x13F8, 0x13FD, + 0x1C80, 0x1C88, + 0x1D00, 0x1D2B, + 0x1D6B, 0x1D77, + 0x1D79, 0x1D9A, + 0x1E95, 0x1E9D, + 0x1EFF, 0x1F07, + 0x1F10, 0x1F15, + 0x1F20, 0x1F27, + 0x1F30, 0x1F37, + 0x1F40, 0x1F45, + 0x1F50, 0x1F57, + 0x1F60, 0x1F67, + 0x1F70, 0x1F7D, + 0x1F80, 0x1F87, + 0x1F90, 0x1F97, + 0x1FA0, 0x1FA7, + 0x1FB0, 0x1FB4, + 0x1FB6, 0x1FB7, + 0x1FC2, 0x1FC4, + 0x1FC6, 0x1FC7, + 0x1FD0, 0x1FD3, + 0x1FD6, 0x1FD7, + 0x1FE0, 0x1FE7, + 0x1FF2, 0x1FF4, + 0x1FF6, 0x1FF7, + 0x210E, 0x210F, + 0x213C, 0x213D, + 0x2146, 0x2149, + 0x2C30, 0x2C5F, + 0x2C65, 0x2C66, + 0x2C73, 0x2C74, + 0x2C76, 0x2C7B, + 0x2CE3, 0x2CE4, + 0x2D00, 0x2D25, + 0xA72F, 0xA731, + 0xA771, 0xA778, + 0xA793, 0xA795, + 0xAB30, 0xAB5A, + 0xAB60, 0xAB68, + 0xAB70, 0xABBF, + 0xFB00, 0xFB06, + 0xFB13, 0xFB17, + 0xFF41, 0xFF5A, +} + +@(rodata) +ll_singles32 := [?]i32{ + 0x1D4BB, 0x1D7CB, +} + +@(rodata) +ll_ranges32 := [?]i32{ + 0x10428, 0x1044F, + 0x104D8, 0x104FB, + 0x10597, 0x105A1, + 0x105A3, 0x105B1, + 0x105B3, 0x105B9, + 0x105BB, 0x105BC, + 0x10CC0, 0x10CF2, + 0x10D70, 0x10D85, + 0x118C0, 0x118DF, + 0x16E60, 0x16E7F, + 0x16EBB, 0x16ED3, + 0x1D41A, 0x1D433, + 0x1D44E, 0x1D454, + 0x1D456, 0x1D467, + 0x1D482, 0x1D49B, + 0x1D4B6, 0x1D4B9, + 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D4CF, + 0x1D4EA, 0x1D503, + 0x1D51E, 0x1D537, + 0x1D552, 0x1D56B, + 0x1D586, 0x1D59F, + 0x1D5BA, 0x1D5D3, + 0x1D5EE, 0x1D607, + 0x1D622, 0x1D63B, + 0x1D656, 0x1D66F, + 0x1D68A, 0x1D6A5, + 0x1D6C2, 0x1D6DA, + 0x1D6DC, 0x1D6E1, + 0x1D6FC, 0x1D714, + 0x1D716, 0x1D71B, + 0x1D736, 0x1D74E, + 0x1D750, 0x1D755, + 0x1D770, 0x1D788, + 0x1D78A, 0x1D78F, + 0x1D7AA, 0x1D7C2, + 0x1D7C4, 0x1D7C9, + 0x1DF00, 0x1DF09, + 0x1DF0B, 0x1DF1E, + 0x1DF25, 0x1DF2A, + 0x1E922, 0x1E943, +} + +ll_ranges := Range{ + single_16 = ll_singles16[:], + ranges_16 = ll_ranges16[:], + single_32 = ll_singles32[:], + ranges_32 = ll_ranges32[:], +} + +@(rodata) +lm_singles16 := [?]u16{ + 0x02EC, 0x02EE, 0x0374, 0x037A, 0x0559, 0x0640, 0x07FA, 0x081A, 0x0824, 0x0828, + 0x08C9, 0x0971, 0x0E46, 0x0EC6, 0x10FC, 0x17D7, 0x1843, 0x1AA7, 0x1D78, 0x2071, + 0x207F, 0x2D6F, 0x2E2F, 0x3005, 0x303B, 0xA015, 0xA60C, 0xA67F, 0xA770, 0xA788, + 0xA9CF, 0xA9E6, 0xAA70, 0xAADD, 0xAB69, 0xFF70, +} + +@(rodata) +lm_ranges16 := [?]u16{ + 0x02B0, 0x02C1, + 0x02C6, 0x02D1, + 0x02E0, 0x02E4, + 0x06E5, 0x06E6, + 0x07F4, 0x07F5, + 0x1C78, 0x1C7D, + 0x1D2C, 0x1D6A, + 0x1D9B, 0x1DBF, + 0x2090, 0x209C, + 0x2C7C, 0x2C7D, + 0x3031, 0x3035, + 0x309D, 0x309E, + 0x30FC, 0x30FE, + 0xA4F8, 0xA4FD, + 0xA69C, 0xA69D, + 0xA717, 0xA71F, + 0xA7F1, 0xA7F4, + 0xA7F8, 0xA7F9, + 0xAAF3, 0xAAF4, + 0xAB5C, 0xAB5F, + 0xFF9E, 0xFF9F, +} + +@(rodata) +lm_singles32 := [?]i32{ + 0x10D4E, 0x10D6F, 0x10EC5, 0x11DD9, 0x16FE3, 0x1E4EB, 0x1E6FF, 0x1E94B, +} + +@(rodata) +lm_ranges32 := [?]i32{ + 0x10780, 0x10785, + 0x10787, 0x107B0, + 0x107B2, 0x107BA, + 0x16B40, 0x16B43, + 0x16D40, 0x16D42, + 0x16D6B, 0x16D6C, + 0x16F93, 0x16F9F, + 0x16FE0, 0x16FE1, + 0x16FF2, 0x16FF3, + 0x1AFF0, 0x1AFF3, + 0x1AFF5, 0x1AFFB, + 0x1AFFD, 0x1AFFE, + 0x1E030, 0x1E06D, + 0x1E137, 0x1E13D, +} + +lm_ranges := Range{ + single_16 = lm_singles16[:], + ranges_16 = lm_ranges16[:], + single_32 = lm_singles32[:], + ranges_32 = lm_ranges32[:], +} + +@(rodata) +lo_singles16 := [?]u16{ + 0x00AA, 0x00BA, 0x01BB, 0x06D5, 0x06FF, 0x0710, 0x07B1, 0x093D, 0x0950, 0x09B2, + 0x09BD, 0x09CE, 0x09FC, 0x0A5E, 0x0ABD, 0x0AD0, 0x0AF9, 0x0B3D, 0x0B71, 0x0B83, + 0x0B9C, 0x0BD0, 0x0C3D, 0x0C80, 0x0CBD, 0x0D3D, 0x0D4E, 0x0DBD, 0x0E84, 0x0EA5, + 0x0EBD, 0x0F00, 0x103F, 0x1061, 0x108E, 0x1258, 0x12C0, 0x17DC, 0x18AA, 0x1CFA, + 0x3006, 0x303C, 0x309F, 0x30FF, 0xA66E, 0xA78F, 0xA7F7, 0xA8FB, 0xAA7A, 0xAAB1, + 0xAAC0, 0xAAC2, 0xAAF2, 0xFB1D, 0xFB3E, +} + +@(rodata) +lo_ranges16 := [?]u16{ + 0x01C0, 0x01C3, + 0x0294, 0x0295, + 0x05D0, 0x05EA, + 0x05EF, 0x05F2, + 0x0620, 0x063F, + 0x0641, 0x064A, + 0x066E, 0x066F, + 0x0671, 0x06D3, + 0x06EE, 0x06EF, + 0x06FA, 0x06FC, + 0x0712, 0x072F, + 0x074D, 0x07A5, + 0x07CA, 0x07EA, + 0x0800, 0x0815, + 0x0840, 0x0858, + 0x0860, 0x086A, + 0x0870, 0x0887, + 0x0889, 0x088F, + 0x08A0, 0x08C8, + 0x0904, 0x0939, + 0x0958, 0x0961, + 0x0972, 0x0980, + 0x0985, 0x098C, + 0x098F, 0x0990, + 0x0993, 0x09A8, + 0x09AA, 0x09B0, + 0x09B6, 0x09B9, + 0x09DC, 0x09DD, + 0x09DF, 0x09E1, + 0x09F0, 0x09F1, + 0x0A05, 0x0A0A, + 0x0A0F, 0x0A10, + 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, + 0x0A32, 0x0A33, + 0x0A35, 0x0A36, + 0x0A38, 0x0A39, + 0x0A59, 0x0A5C, + 0x0A72, 0x0A74, + 0x0A85, 0x0A8D, + 0x0A8F, 0x0A91, + 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, + 0x0AB2, 0x0AB3, + 0x0AB5, 0x0AB9, + 0x0AE0, 0x0AE1, + 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, + 0x0B13, 0x0B28, + 0x0B2A, 0x0B30, + 0x0B32, 0x0B33, + 0x0B35, 0x0B39, + 0x0B5C, 0x0B5D, + 0x0B5F, 0x0B61, + 0x0B85, 0x0B8A, + 0x0B8E, 0x0B90, + 0x0B92, 0x0B95, + 0x0B99, 0x0B9A, + 0x0B9E, 0x0B9F, + 0x0BA3, 0x0BA4, + 0x0BA8, 0x0BAA, + 0x0BAE, 0x0BB9, + 0x0C05, 0x0C0C, + 0x0C0E, 0x0C10, + 0x0C12, 0x0C28, + 0x0C2A, 0x0C39, + 0x0C58, 0x0C5A, + 0x0C5C, 0x0C5D, + 0x0C60, 0x0C61, + 0x0C85, 0x0C8C, + 0x0C8E, 0x0C90, + 0x0C92, 0x0CA8, + 0x0CAA, 0x0CB3, + 0x0CB5, 0x0CB9, + 0x0CDC, 0x0CDE, + 0x0CE0, 0x0CE1, + 0x0CF1, 0x0CF2, + 0x0D04, 0x0D0C, + 0x0D0E, 0x0D10, + 0x0D12, 0x0D3A, + 0x0D54, 0x0D56, + 0x0D5F, 0x0D61, + 0x0D7A, 0x0D7F, + 0x0D85, 0x0D96, + 0x0D9A, 0x0DB1, + 0x0DB3, 0x0DBB, + 0x0DC0, 0x0DC6, + 0x0E01, 0x0E30, + 0x0E32, 0x0E33, + 0x0E40, 0x0E45, + 0x0E81, 0x0E82, + 0x0E86, 0x0E8A, + 0x0E8C, 0x0EA3, + 0x0EA7, 0x0EB0, + 0x0EB2, 0x0EB3, + 0x0EC0, 0x0EC4, + 0x0EDC, 0x0EDF, + 0x0F40, 0x0F47, + 0x0F49, 0x0F6C, + 0x0F88, 0x0F8C, + 0x1000, 0x102A, + 0x1050, 0x1055, + 0x105A, 0x105D, + 0x1065, 0x1066, + 0x106E, 0x1070, + 0x1075, 0x1081, + 0x1100, 0x1248, + 0x124A, 0x124D, + 0x1250, 0x1256, + 0x125A, 0x125D, + 0x1260, 0x1288, + 0x128A, 0x128D, + 0x1290, 0x12B0, + 0x12B2, 0x12B5, + 0x12B8, 0x12BE, + 0x12C2, 0x12C5, + 0x12C8, 0x12D6, + 0x12D8, 0x1310, + 0x1312, 0x1315, + 0x1318, 0x135A, + 0x1380, 0x138F, + 0x1401, 0x166C, + 0x166F, 0x167F, + 0x1681, 0x169A, + 0x16A0, 0x16EA, + 0x16F1, 0x16F8, + 0x1700, 0x1711, + 0x171F, 0x1731, + 0x1740, 0x1751, + 0x1760, 0x176C, + 0x176E, 0x1770, + 0x1780, 0x17B3, + 0x1820, 0x1842, + 0x1844, 0x1878, + 0x1880, 0x1884, + 0x1887, 0x18A8, + 0x18B0, 0x18F5, + 0x1900, 0x191E, + 0x1950, 0x196D, + 0x1970, 0x1974, + 0x1980, 0x19AB, + 0x19B0, 0x19C9, + 0x1A00, 0x1A16, + 0x1A20, 0x1A54, + 0x1B05, 0x1B33, + 0x1B45, 0x1B4C, + 0x1B83, 0x1BA0, + 0x1BAE, 0x1BAF, + 0x1BBA, 0x1BE5, + 0x1C00, 0x1C23, + 0x1C4D, 0x1C4F, + 0x1C5A, 0x1C77, + 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, + 0x1CF5, 0x1CF6, + 0x2135, 0x2138, + 0x2D30, 0x2D67, + 0x2D80, 0x2D96, + 0x2DA0, 0x2DA6, + 0x2DA8, 0x2DAE, + 0x2DB0, 0x2DB6, + 0x2DB8, 0x2DBE, + 0x2DC0, 0x2DC6, + 0x2DC8, 0x2DCE, + 0x2DD0, 0x2DD6, + 0x2DD8, 0x2DDE, + 0x3041, 0x3096, + 0x30A1, 0x30FA, + 0x3105, 0x312F, + 0x3131, 0x318E, + 0x31A0, 0x31BF, + 0x31F0, 0x31FF, + 0x3400, 0x4DBF, + 0x4E00, 0x9FFF, + 0xA000, 0xA014, + 0xA016, 0xA48C, + 0xA4D0, 0xA4F7, + 0xA500, 0xA60B, + 0xA610, 0xA61F, + 0xA62A, 0xA62B, + 0xA6A0, 0xA6E5, + 0xA7FB, 0xA801, + 0xA803, 0xA805, + 0xA807, 0xA80A, + 0xA80C, 0xA822, + 0xA840, 0xA873, + 0xA882, 0xA8B3, + 0xA8F2, 0xA8F7, + 0xA8FD, 0xA8FE, + 0xA90A, 0xA925, + 0xA930, 0xA946, + 0xA960, 0xA97C, + 0xA984, 0xA9B2, + 0xA9E0, 0xA9E4, + 0xA9E7, 0xA9EF, + 0xA9FA, 0xA9FE, + 0xAA00, 0xAA28, + 0xAA40, 0xAA42, + 0xAA44, 0xAA4B, + 0xAA60, 0xAA6F, + 0xAA71, 0xAA76, + 0xAA7E, 0xAAAF, + 0xAAB5, 0xAAB6, + 0xAAB9, 0xAABD, + 0xAADB, 0xAADC, + 0xAAE0, 0xAAEA, + 0xAB01, 0xAB06, + 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, + 0xAB20, 0xAB26, + 0xAB28, 0xAB2E, + 0xABC0, 0xABE2, + 0xAC00, 0xD7A3, + 0xD7B0, 0xD7C6, + 0xD7CB, 0xD7FB, + 0xF900, 0xFA6D, + 0xFA70, 0xFAD9, + 0xFB1F, 0xFB28, + 0xFB2A, 0xFB36, + 0xFB38, 0xFB3C, + 0xFB40, 0xFB41, + 0xFB43, 0xFB44, + 0xFB46, 0xFBB1, + 0xFBD3, 0xFD3D, + 0xFD50, 0xFD8F, + 0xFD92, 0xFDC7, + 0xFDF0, 0xFDFB, + 0xFE70, 0xFE74, + 0xFE76, 0xFEFC, + 0xFF66, 0xFF6F, + 0xFF71, 0xFF9D, + 0xFFA0, 0xFFBE, + 0xFFC2, 0xFFC7, + 0xFFCA, 0xFFCF, + 0xFFD2, 0xFFD7, + 0xFFDA, 0xFFDC, +} + +@(rodata) +lo_singles32 := [?]i32{ + 0x10808, 0x1083C, 0x10A00, 0x10D4F, 0x10F27, 0x11075, 0x11144, 0x11147, + 0x11176, 0x111DA, 0x111DC, 0x11288, 0x1133D, 0x11350, 0x1138B, 0x1138E, + 0x113B7, 0x113D1, 0x113D3, 0x114C7, 0x11644, 0x116B8, 0x11909, 0x1193F, + 0x11941, 0x119E1, 0x119E3, 0x11A00, 0x11A3A, 0x11A50, 0x11A9D, 0x11C40, + 0x11D46, 0x11D98, 0x11F02, 0x11FB0, 0x16F50, 0x18CFF, 0x1B132, 0x1B155, + 0x1DF0A, 0x1E14E, 0x1E5F0, 0x1E6FE, 0x1EE24, 0x1EE27, 0x1EE39, 0x1EE3B, + 0x1EE42, 0x1EE47, 0x1EE49, 0x1EE4B, 0x1EE54, 0x1EE57, 0x1EE59, 0x1EE5B, + 0x1EE5D, 0x1EE5F, 0x1EE64, 0x1EE7E, +} + +@(rodata) +lo_ranges32 := [?]i32{ + 0x10000, 0x1000B, + 0x1000D, 0x10026, + 0x10028, 0x1003A, + 0x1003C, 0x1003D, + 0x1003F, 0x1004D, + 0x10050, 0x1005D, + 0x10080, 0x100FA, + 0x10280, 0x1029C, + 0x102A0, 0x102D0, + 0x10300, 0x1031F, + 0x1032D, 0x10340, + 0x10342, 0x10349, + 0x10350, 0x10375, + 0x10380, 0x1039D, + 0x103A0, 0x103C3, + 0x103C8, 0x103CF, + 0x10450, 0x1049D, + 0x10500, 0x10527, + 0x10530, 0x10563, + 0x105C0, 0x105F3, + 0x10600, 0x10736, + 0x10740, 0x10755, + 0x10760, 0x10767, + 0x10800, 0x10805, + 0x1080A, 0x10835, + 0x10837, 0x10838, + 0x1083F, 0x10855, + 0x10860, 0x10876, + 0x10880, 0x1089E, + 0x108E0, 0x108F2, + 0x108F4, 0x108F5, + 0x10900, 0x10915, + 0x10920, 0x10939, + 0x10940, 0x10959, + 0x10980, 0x109B7, + 0x109BE, 0x109BF, + 0x10A10, 0x10A13, + 0x10A15, 0x10A17, + 0x10A19, 0x10A35, + 0x10A60, 0x10A7C, + 0x10A80, 0x10A9C, + 0x10AC0, 0x10AC7, + 0x10AC9, 0x10AE4, + 0x10B00, 0x10B35, + 0x10B40, 0x10B55, + 0x10B60, 0x10B72, + 0x10B80, 0x10B91, + 0x10C00, 0x10C48, + 0x10D00, 0x10D23, + 0x10D4A, 0x10D4D, + 0x10E80, 0x10EA9, + 0x10EB0, 0x10EB1, + 0x10EC2, 0x10EC4, + 0x10EC6, 0x10EC7, + 0x10F00, 0x10F1C, + 0x10F30, 0x10F45, + 0x10F70, 0x10F81, + 0x10FB0, 0x10FC4, + 0x10FE0, 0x10FF6, + 0x11003, 0x11037, + 0x11071, 0x11072, + 0x11083, 0x110AF, + 0x110D0, 0x110E8, + 0x11103, 0x11126, + 0x11150, 0x11172, + 0x11183, 0x111B2, + 0x111C1, 0x111C4, + 0x11200, 0x11211, + 0x11213, 0x1122B, + 0x1123F, 0x11240, + 0x11280, 0x11286, + 0x1128A, 0x1128D, + 0x1128F, 0x1129D, + 0x1129F, 0x112A8, + 0x112B0, 0x112DE, + 0x11305, 0x1130C, + 0x1130F, 0x11310, + 0x11313, 0x11328, + 0x1132A, 0x11330, + 0x11332, 0x11333, + 0x11335, 0x11339, + 0x1135D, 0x11361, + 0x11380, 0x11389, + 0x11390, 0x113B5, + 0x11400, 0x11434, + 0x11447, 0x1144A, + 0x1145F, 0x11461, + 0x11480, 0x114AF, + 0x114C4, 0x114C5, + 0x11580, 0x115AE, + 0x115D8, 0x115DB, + 0x11600, 0x1162F, + 0x11680, 0x116AA, + 0x11700, 0x1171A, + 0x11740, 0x11746, + 0x11800, 0x1182B, + 0x118FF, 0x11906, + 0x1190C, 0x11913, + 0x11915, 0x11916, + 0x11918, 0x1192F, + 0x119A0, 0x119A7, + 0x119AA, 0x119D0, + 0x11A0B, 0x11A32, + 0x11A5C, 0x11A89, + 0x11AB0, 0x11AF8, + 0x11BC0, 0x11BE0, + 0x11C00, 0x11C08, + 0x11C0A, 0x11C2E, + 0x11C72, 0x11C8F, + 0x11D00, 0x11D06, + 0x11D08, 0x11D09, + 0x11D0B, 0x11D30, + 0x11D60, 0x11D65, + 0x11D67, 0x11D68, + 0x11D6A, 0x11D89, + 0x11DB0, 0x11DD8, + 0x11DDA, 0x11DDB, + 0x11EE0, 0x11EF2, + 0x11F04, 0x11F10, + 0x11F12, 0x11F33, + 0x12000, 0x12399, + 0x12480, 0x12543, + 0x12F90, 0x12FF0, + 0x13000, 0x1342F, + 0x13441, 0x13446, + 0x13460, 0x143FA, + 0x14400, 0x14646, + 0x16100, 0x1611D, + 0x16800, 0x16A38, + 0x16A40, 0x16A5E, + 0x16A70, 0x16ABE, + 0x16AD0, 0x16AED, + 0x16B00, 0x16B2F, + 0x16B63, 0x16B77, + 0x16B7D, 0x16B8F, + 0x16D43, 0x16D6A, + 0x16F00, 0x16F4A, + 0x17000, 0x187FF, + 0x18800, 0x18CD5, + 0x18D00, 0x18D1E, + 0x18D80, 0x18DF2, + 0x1B000, 0x1B122, + 0x1B150, 0x1B152, + 0x1B164, 0x1B167, + 0x1B170, 0x1B2FB, + 0x1BC00, 0x1BC6A, + 0x1BC70, 0x1BC7C, + 0x1BC80, 0x1BC88, + 0x1BC90, 0x1BC99, + 0x1E100, 0x1E12C, + 0x1E290, 0x1E2AD, + 0x1E2C0, 0x1E2EB, + 0x1E4D0, 0x1E4EA, + 0x1E5D0, 0x1E5ED, + 0x1E6C0, 0x1E6DE, + 0x1E6E0, 0x1E6E2, + 0x1E6E4, 0x1E6E5, + 0x1E6E7, 0x1E6ED, + 0x1E6F0, 0x1E6F4, + 0x1E7E0, 0x1E7E6, + 0x1E7E8, 0x1E7EB, + 0x1E7ED, 0x1E7EE, + 0x1E7F0, 0x1E7FE, + 0x1E800, 0x1E8C4, + 0x1EE00, 0x1EE03, + 0x1EE05, 0x1EE1F, + 0x1EE21, 0x1EE22, + 0x1EE29, 0x1EE32, + 0x1EE34, 0x1EE37, + 0x1EE4D, 0x1EE4F, + 0x1EE51, 0x1EE52, + 0x1EE61, 0x1EE62, + 0x1EE67, 0x1EE6A, + 0x1EE6C, 0x1EE72, + 0x1EE74, 0x1EE77, + 0x1EE79, 0x1EE7C, + 0x1EE80, 0x1EE89, + 0x1EE8B, 0x1EE9B, + 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, + 0x1EEAB, 0x1EEBB, + 0x20000, 0x2A6DF, + 0x2A700, 0x2B73F, + 0x2B740, 0x2B81D, + 0x2B820, 0x2CEAD, + 0x2CEB0, 0x2EBE0, + 0x2EBF0, 0x2EE5D, + 0x2F800, 0x2FA1D, + 0x30000, 0x3134A, + 0x31350, 0x323AF, + 0x323B0, 0x33479, +} + +lo_ranges := Range{ + single_16 = lo_singles16[:], + ranges_16 = lo_ranges16[:], + single_32 = lo_singles32[:], + ranges_32 = lo_ranges32[:], +} + +@(rodata) +lt_singles16 := [?]u16{ + 0x01C5, 0x01C8, 0x01CB, 0x01F2, 0x1FBC, 0x1FCC, 0x1FFC, +} + +@(rodata) +lt_ranges16 := [?]u16{ + 0x1F88, 0x1F8F, + 0x1F98, 0x1F9F, + 0x1FA8, 0x1FAF, +} + +lt_ranges := Range{ + single_16 = lt_singles16[:], + ranges_16 = lt_ranges16[:], +} + +@(rodata) +lu_singles16 := [?]u16{ + 0x0100, 0x0102, 0x0104, 0x0106, 0x0108, 0x010A, 0x010C, 0x010E, 0x0110, 0x0112, + 0x0114, 0x0116, 0x0118, 0x011A, 0x011C, 0x011E, 0x0120, 0x0122, 0x0124, 0x0126, + 0x0128, 0x012A, 0x012C, 0x012E, 0x0130, 0x0132, 0x0134, 0x0136, 0x0139, 0x013B, + 0x013D, 0x013F, 0x0141, 0x0143, 0x0145, 0x0147, 0x014A, 0x014C, 0x014E, 0x0150, + 0x0152, 0x0154, 0x0156, 0x0158, 0x015A, 0x015C, 0x015E, 0x0160, 0x0162, 0x0164, + 0x0166, 0x0168, 0x016A, 0x016C, 0x016E, 0x0170, 0x0172, 0x0174, 0x0176, 0x017B, + 0x017D, 0x0184, 0x01A2, 0x01A4, 0x01A9, 0x01AC, 0x01B5, 0x01BC, 0x01C4, 0x01C7, + 0x01CA, 0x01CD, 0x01CF, 0x01D1, 0x01D3, 0x01D5, 0x01D7, 0x01D9, 0x01DB, 0x01DE, + 0x01E0, 0x01E2, 0x01E4, 0x01E6, 0x01E8, 0x01EA, 0x01EC, 0x01EE, 0x01F1, 0x01F4, + 0x01FA, 0x01FC, 0x01FE, 0x0200, 0x0202, 0x0204, 0x0206, 0x0208, 0x020A, 0x020C, + 0x020E, 0x0210, 0x0212, 0x0214, 0x0216, 0x0218, 0x021A, 0x021C, 0x021E, 0x0220, + 0x0222, 0x0224, 0x0226, 0x0228, 0x022A, 0x022C, 0x022E, 0x0230, 0x0232, 0x0241, + 0x0248, 0x024A, 0x024C, 0x024E, 0x0370, 0x0372, 0x0376, 0x037F, 0x0386, 0x038C, + 0x03CF, 0x03D8, 0x03DA, 0x03DC, 0x03DE, 0x03E0, 0x03E2, 0x03E4, 0x03E6, 0x03E8, + 0x03EA, 0x03EC, 0x03EE, 0x03F4, 0x03F7, 0x0460, 0x0462, 0x0464, 0x0466, 0x0468, + 0x046A, 0x046C, 0x046E, 0x0470, 0x0472, 0x0474, 0x0476, 0x0478, 0x047A, 0x047C, + 0x047E, 0x0480, 0x048A, 0x048C, 0x048E, 0x0490, 0x0492, 0x0494, 0x0496, 0x0498, + 0x049A, 0x049C, 0x049E, 0x04A0, 0x04A2, 0x04A4, 0x04A6, 0x04A8, 0x04AA, 0x04AC, + 0x04AE, 0x04B0, 0x04B2, 0x04B4, 0x04B6, 0x04B8, 0x04BA, 0x04BC, 0x04BE, 0x04C3, + 0x04C5, 0x04C7, 0x04C9, 0x04CB, 0x04CD, 0x04D0, 0x04D2, 0x04D4, 0x04D6, 0x04D8, + 0x04DA, 0x04DC, 0x04DE, 0x04E0, 0x04E2, 0x04E4, 0x04E6, 0x04E8, 0x04EA, 0x04EC, + 0x04EE, 0x04F0, 0x04F2, 0x04F4, 0x04F6, 0x04F8, 0x04FA, 0x04FC, 0x04FE, 0x0500, + 0x0502, 0x0504, 0x0506, 0x0508, 0x050A, 0x050C, 0x050E, 0x0510, 0x0512, 0x0514, + 0x0516, 0x0518, 0x051A, 0x051C, 0x051E, 0x0520, 0x0522, 0x0524, 0x0526, 0x0528, + 0x052A, 0x052C, 0x052E, 0x10C7, 0x10CD, 0x1C89, 0x1E00, 0x1E02, 0x1E04, 0x1E06, + 0x1E08, 0x1E0A, 0x1E0C, 0x1E0E, 0x1E10, 0x1E12, 0x1E14, 0x1E16, 0x1E18, 0x1E1A, + 0x1E1C, 0x1E1E, 0x1E20, 0x1E22, 0x1E24, 0x1E26, 0x1E28, 0x1E2A, 0x1E2C, 0x1E2E, + 0x1E30, 0x1E32, 0x1E34, 0x1E36, 0x1E38, 0x1E3A, 0x1E3C, 0x1E3E, 0x1E40, 0x1E42, + 0x1E44, 0x1E46, 0x1E48, 0x1E4A, 0x1E4C, 0x1E4E, 0x1E50, 0x1E52, 0x1E54, 0x1E56, + 0x1E58, 0x1E5A, 0x1E5C, 0x1E5E, 0x1E60, 0x1E62, 0x1E64, 0x1E66, 0x1E68, 0x1E6A, + 0x1E6C, 0x1E6E, 0x1E70, 0x1E72, 0x1E74, 0x1E76, 0x1E78, 0x1E7A, 0x1E7C, 0x1E7E, + 0x1E80, 0x1E82, 0x1E84, 0x1E86, 0x1E88, 0x1E8A, 0x1E8C, 0x1E8E, 0x1E90, 0x1E92, + 0x1E94, 0x1E9E, 0x1EA0, 0x1EA2, 0x1EA4, 0x1EA6, 0x1EA8, 0x1EAA, 0x1EAC, 0x1EAE, + 0x1EB0, 0x1EB2, 0x1EB4, 0x1EB6, 0x1EB8, 0x1EBA, 0x1EBC, 0x1EBE, 0x1EC0, 0x1EC2, + 0x1EC4, 0x1EC6, 0x1EC8, 0x1ECA, 0x1ECC, 0x1ECE, 0x1ED0, 0x1ED2, 0x1ED4, 0x1ED6, + 0x1ED8, 0x1EDA, 0x1EDC, 0x1EDE, 0x1EE0, 0x1EE2, 0x1EE4, 0x1EE6, 0x1EE8, 0x1EEA, + 0x1EEC, 0x1EEE, 0x1EF0, 0x1EF2, 0x1EF4, 0x1EF6, 0x1EF8, 0x1EFA, 0x1EFC, 0x1EFE, + 0x1F59, 0x1F5B, 0x1F5D, 0x1F5F, 0x2102, 0x2107, 0x2115, 0x2124, 0x2126, 0x2128, + 0x2145, 0x2183, 0x2C60, 0x2C67, 0x2C69, 0x2C6B, 0x2C72, 0x2C75, 0x2C82, 0x2C84, + 0x2C86, 0x2C88, 0x2C8A, 0x2C8C, 0x2C8E, 0x2C90, 0x2C92, 0x2C94, 0x2C96, 0x2C98, + 0x2C9A, 0x2C9C, 0x2C9E, 0x2CA0, 0x2CA2, 0x2CA4, 0x2CA6, 0x2CA8, 0x2CAA, 0x2CAC, + 0x2CAE, 0x2CB0, 0x2CB2, 0x2CB4, 0x2CB6, 0x2CB8, 0x2CBA, 0x2CBC, 0x2CBE, 0x2CC0, + 0x2CC2, 0x2CC4, 0x2CC6, 0x2CC8, 0x2CCA, 0x2CCC, 0x2CCE, 0x2CD0, 0x2CD2, 0x2CD4, + 0x2CD6, 0x2CD8, 0x2CDA, 0x2CDC, 0x2CDE, 0x2CE0, 0x2CE2, 0x2CEB, 0x2CED, 0x2CF2, + 0xA640, 0xA642, 0xA644, 0xA646, 0xA648, 0xA64A, 0xA64C, 0xA64E, 0xA650, 0xA652, + 0xA654, 0xA656, 0xA658, 0xA65A, 0xA65C, 0xA65E, 0xA660, 0xA662, 0xA664, 0xA666, + 0xA668, 0xA66A, 0xA66C, 0xA680, 0xA682, 0xA684, 0xA686, 0xA688, 0xA68A, 0xA68C, + 0xA68E, 0xA690, 0xA692, 0xA694, 0xA696, 0xA698, 0xA69A, 0xA722, 0xA724, 0xA726, + 0xA728, 0xA72A, 0xA72C, 0xA72E, 0xA732, 0xA734, 0xA736, 0xA738, 0xA73A, 0xA73C, + 0xA73E, 0xA740, 0xA742, 0xA744, 0xA746, 0xA748, 0xA74A, 0xA74C, 0xA74E, 0xA750, + 0xA752, 0xA754, 0xA756, 0xA758, 0xA75A, 0xA75C, 0xA75E, 0xA760, 0xA762, 0xA764, + 0xA766, 0xA768, 0xA76A, 0xA76C, 0xA76E, 0xA779, 0xA77B, 0xA780, 0xA782, 0xA784, + 0xA786, 0xA78B, 0xA78D, 0xA790, 0xA792, 0xA796, 0xA798, 0xA79A, 0xA79C, 0xA79E, + 0xA7A0, 0xA7A2, 0xA7A4, 0xA7A6, 0xA7A8, 0xA7B6, 0xA7B8, 0xA7BA, 0xA7BC, 0xA7BE, + 0xA7C0, 0xA7C2, 0xA7C9, 0xA7CE, 0xA7D0, 0xA7D2, 0xA7D4, 0xA7D6, 0xA7D8, 0xA7DA, + 0xA7DC, 0xA7F5, +} + +@(rodata) +lu_ranges16 := [?]u16{ + 0x0041, 0x005A, + 0x00C0, 0x00D6, + 0x00D8, 0x00DE, + 0x0178, 0x0179, + 0x0181, 0x0182, + 0x0186, 0x0187, + 0x0189, 0x018B, + 0x018E, 0x0191, + 0x0193, 0x0194, + 0x0196, 0x0198, + 0x019C, 0x019D, + 0x019F, 0x01A0, + 0x01A6, 0x01A7, + 0x01AE, 0x01AF, + 0x01B1, 0x01B3, + 0x01B7, 0x01B8, + 0x01F6, 0x01F8, + 0x023A, 0x023B, + 0x023D, 0x023E, + 0x0243, 0x0246, + 0x0388, 0x038A, + 0x038E, 0x038F, + 0x0391, 0x03A1, + 0x03A3, 0x03AB, + 0x03D2, 0x03D4, + 0x03F9, 0x03FA, + 0x03FD, 0x042F, + 0x04C0, 0x04C1, + 0x0531, 0x0556, + 0x10A0, 0x10C5, + 0x13A0, 0x13F5, + 0x1C90, 0x1CBA, + 0x1CBD, 0x1CBF, + 0x1F08, 0x1F0F, + 0x1F18, 0x1F1D, + 0x1F28, 0x1F2F, + 0x1F38, 0x1F3F, + 0x1F48, 0x1F4D, + 0x1F68, 0x1F6F, + 0x1FB8, 0x1FBB, + 0x1FC8, 0x1FCB, + 0x1FD8, 0x1FDB, + 0x1FE8, 0x1FEC, + 0x1FF8, 0x1FFB, + 0x210B, 0x210D, + 0x2110, 0x2112, + 0x2119, 0x211D, + 0x212A, 0x212D, + 0x2130, 0x2133, + 0x213E, 0x213F, + 0x2C00, 0x2C2F, + 0x2C62, 0x2C64, + 0x2C6D, 0x2C70, + 0x2C7E, 0x2C80, + 0xA77D, 0xA77E, + 0xA7AA, 0xA7AE, + 0xA7B0, 0xA7B4, + 0xA7C4, 0xA7C7, + 0xA7CB, 0xA7CC, + 0xFF21, 0xFF3A, +} + +@(rodata) +lu_singles32 := [?]i32{ + 0x1D49C, 0x1D4A2, 0x1D546, 0x1D7CA, +} + +@(rodata) +lu_ranges32 := [?]i32{ + 0x10400, 0x10427, + 0x104B0, 0x104D3, + 0x10570, 0x1057A, + 0x1057C, 0x1058A, + 0x1058C, 0x10592, + 0x10594, 0x10595, + 0x10C80, 0x10CB2, + 0x10D50, 0x10D65, + 0x118A0, 0x118BF, + 0x16E40, 0x16E5F, + 0x16EA0, 0x16EB8, + 0x1D400, 0x1D419, + 0x1D434, 0x1D44D, + 0x1D468, 0x1D481, + 0x1D49E, 0x1D49F, + 0x1D4A5, 0x1D4A6, + 0x1D4A9, 0x1D4AC, + 0x1D4AE, 0x1D4B5, + 0x1D4D0, 0x1D4E9, + 0x1D504, 0x1D505, + 0x1D507, 0x1D50A, + 0x1D50D, 0x1D514, + 0x1D516, 0x1D51C, + 0x1D538, 0x1D539, + 0x1D53B, 0x1D53E, + 0x1D540, 0x1D544, + 0x1D54A, 0x1D550, + 0x1D56C, 0x1D585, + 0x1D5A0, 0x1D5B9, + 0x1D5D4, 0x1D5ED, + 0x1D608, 0x1D621, + 0x1D63C, 0x1D655, + 0x1D670, 0x1D689, + 0x1D6A8, 0x1D6C0, + 0x1D6E2, 0x1D6FA, + 0x1D71C, 0x1D734, + 0x1D756, 0x1D76E, + 0x1D790, 0x1D7A8, + 0x1E900, 0x1E921, +} + +lu_ranges := Range{ + single_16 = lu_singles16[:], + ranges_16 = lu_ranges16[:], + single_32 = lu_singles32[:], + ranges_32 = lu_ranges32[:], +} + +@(rodata) +nd_ranges16 := [?]u16{ + 0x0030, 0x0039, + 0x0660, 0x0669, + 0x06F0, 0x06F9, + 0x07C0, 0x07C9, + 0x0966, 0x096F, + 0x09E6, 0x09EF, + 0x0A66, 0x0A6F, + 0x0AE6, 0x0AEF, + 0x0B66, 0x0B6F, + 0x0BE6, 0x0BEF, + 0x0C66, 0x0C6F, + 0x0CE6, 0x0CEF, + 0x0D66, 0x0D6F, + 0x0DE6, 0x0DEF, + 0x0E50, 0x0E59, + 0x0ED0, 0x0ED9, + 0x0F20, 0x0F29, + 0x1040, 0x1049, + 0x1090, 0x1099, + 0x17E0, 0x17E9, + 0x1810, 0x1819, + 0x1946, 0x194F, + 0x19D0, 0x19D9, + 0x1A80, 0x1A89, + 0x1A90, 0x1A99, + 0x1B50, 0x1B59, + 0x1BB0, 0x1BB9, + 0x1C40, 0x1C49, + 0x1C50, 0x1C59, + 0xA620, 0xA629, + 0xA8D0, 0xA8D9, + 0xA900, 0xA909, + 0xA9D0, 0xA9D9, + 0xA9F0, 0xA9F9, + 0xAA50, 0xAA59, + 0xABF0, 0xABF9, + 0xFF10, 0xFF19, +} + +@(rodata) +nd_ranges32 := [?]i32{ + 0x104A0, 0x104A9, + 0x10D30, 0x10D39, + 0x10D40, 0x10D49, + 0x11066, 0x1106F, + 0x110F0, 0x110F9, + 0x11136, 0x1113F, + 0x111D0, 0x111D9, + 0x112F0, 0x112F9, + 0x11450, 0x11459, + 0x114D0, 0x114D9, + 0x11650, 0x11659, + 0x116C0, 0x116C9, + 0x116D0, 0x116E3, + 0x11730, 0x11739, + 0x118E0, 0x118E9, + 0x11950, 0x11959, + 0x11BF0, 0x11BF9, + 0x11C50, 0x11C59, + 0x11D50, 0x11D59, + 0x11DA0, 0x11DA9, + 0x11DE0, 0x11DE9, + 0x11F50, 0x11F59, + 0x16130, 0x16139, + 0x16A60, 0x16A69, + 0x16AC0, 0x16AC9, + 0x16B50, 0x16B59, + 0x16D70, 0x16D79, + 0x1CCF0, 0x1CCF9, + 0x1D7CE, 0x1D7FF, + 0x1E140, 0x1E149, + 0x1E2F0, 0x1E2F9, + 0x1E4F0, 0x1E4F9, + 0x1E5F1, 0x1E5FA, + 0x1E950, 0x1E959, + 0x1FBF0, 0x1FBF9, +} + +nd_ranges := Range{ + ranges_16 = nd_ranges16[:], + ranges_32 = nd_ranges32[:], +} + +@(rodata) +nl_singles16 := [?]u16{ + 0x3007, +} + +@(rodata) +nl_ranges16 := [?]u16{ + 0x16EE, 0x16F0, + 0x2160, 0x2182, + 0x2185, 0x2188, + 0x3021, 0x3029, + 0x3038, 0x303A, + 0xA6E6, 0xA6EF, +} + +@(rodata) +nl_singles32 := [?]i32{ + 0x10341, 0x1034A, +} + +@(rodata) +nl_ranges32 := [?]i32{ + 0x10140, 0x10174, + 0x103D1, 0x103D5, + 0x12400, 0x1246E, + 0x16FF4, 0x16FF6, +} + +nl_ranges := Range{ + single_16 = nl_singles16[:], + ranges_16 = nl_ranges16[:], + single_32 = nl_singles32[:], + ranges_32 = nl_ranges32[:], +} + +@(rodata) +no_singles16 := [?]u16{ + 0x00B9, 0x19DA, 0x2070, 0x2189, 0x2CFD, +} + +@(rodata) +no_ranges16 := [?]u16{ + 0x00B2, 0x00B3, + 0x00BC, 0x00BE, + 0x09F4, 0x09F9, + 0x0B72, 0x0B77, + 0x0BF0, 0x0BF2, + 0x0C78, 0x0C7E, + 0x0D58, 0x0D5E, + 0x0D70, 0x0D78, + 0x0F2A, 0x0F33, + 0x1369, 0x137C, + 0x17F0, 0x17F9, + 0x2074, 0x2079, + 0x2080, 0x2089, + 0x2150, 0x215F, + 0x2460, 0x249B, + 0x24EA, 0x24FF, + 0x2776, 0x2793, + 0x3192, 0x3195, + 0x3220, 0x3229, + 0x3248, 0x324F, + 0x3251, 0x325F, + 0x3280, 0x3289, + 0x32B1, 0x32BF, + 0xA830, 0xA835, +} + +@(rodata) +no_ranges32 := [?]i32{ + 0x10107, 0x10133, + 0x10175, 0x10178, + 0x1018A, 0x1018B, + 0x102E1, 0x102FB, + 0x10320, 0x10323, + 0x10858, 0x1085F, + 0x10879, 0x1087F, + 0x108A7, 0x108AF, + 0x108FB, 0x108FF, + 0x10916, 0x1091B, + 0x109BC, 0x109BD, + 0x109C0, 0x109CF, + 0x109D2, 0x109FF, + 0x10A40, 0x10A48, + 0x10A7D, 0x10A7E, + 0x10A9D, 0x10A9F, + 0x10AEB, 0x10AEF, + 0x10B58, 0x10B5F, + 0x10B78, 0x10B7F, + 0x10BA9, 0x10BAF, + 0x10CFA, 0x10CFF, + 0x10E60, 0x10E7E, + 0x10F1D, 0x10F26, + 0x10F51, 0x10F54, + 0x10FC5, 0x10FCB, + 0x11052, 0x11065, + 0x111E1, 0x111F4, + 0x1173A, 0x1173B, + 0x118EA, 0x118F2, + 0x11C5A, 0x11C6C, + 0x11FC0, 0x11FD4, + 0x16B5B, 0x16B61, + 0x16E80, 0x16E96, + 0x1D2C0, 0x1D2D3, + 0x1D2E0, 0x1D2F3, + 0x1D360, 0x1D378, + 0x1E8C7, 0x1E8CF, + 0x1EC71, 0x1ECAB, + 0x1ECAD, 0x1ECAF, + 0x1ECB1, 0x1ECB4, + 0x1ED01, 0x1ED2D, + 0x1ED2F, 0x1ED3D, + 0x1F100, 0x1F10C, +} + +no_ranges := Range{ + single_16 = no_singles16[:], + ranges_16 = no_ranges16[:], + ranges_32 = no_ranges32[:], +} + +@(rodata) +extra_digits_singles16 := [?]u16{ + 0x00B9, 0x19DA, 0x2070, 0x24EA, 0x24FF, +} + +@(rodata) +extra_digits_ranges16 := [?]u16{ + 0x00B2, 0x00B3, + 0x1369, 0x1371, + 0x2074, 0x2079, + 0x2080, 0x2089, + 0x2460, 0x2468, + 0x2474, 0x247C, + 0x2488, 0x2490, + 0x24F5, 0x24FD, + 0x2776, 0x277E, + 0x2780, 0x2788, + 0x278A, 0x2792, +} + +@(rodata) +extra_digits_ranges32 := [?]i32{ + 0x10A40, 0x10A43, + 0x10E60, 0x10E68, + 0x11052, 0x1105A, + 0x1F100, 0x1F10A, +} + +extra_digits_ranges := Range{ + single_16 = extra_digits_singles16[:], + ranges_16 = extra_digits_ranges16[:], + ranges_32 = extra_digits_ranges32[:], +} + +@(rodata) +other_lowercase_singles16 := [?]u16{ + 0x02B8, 0x02C1, 0x02E4, 0x1D6A, 0x1DBF, 0x209C, 0x217F, 0x24E9, 0x2C7D, 0xA69D, + 0xA7F4, 0xA7F9, 0xAB5F, +} + +@(rodata) +other_lowercase_ranges16 := [?]u16{ + 0x0000, 0x00AA, + 0x0000, 0x00BA, + 0x0000, 0x0345, + 0x0000, 0x037A, + 0x0000, 0x10FC, + 0x0000, 0x1D78, + 0x0000, 0x2071, + 0x0000, 0x207F, + 0x0000, 0xA770, + 0x0000, 0xAB69, +} + +@(rodata) +other_lowercase_singles32 := [?]i32{ + 0x10785, 0x107B0, 0x107BA, 0x1E06D, +} + +@(rodata) +other_lowercase_ranges32 := [?]i32{ + 0x0000, 0x10780, +} + +other_lowercase_ranges := Range{ + single_16 = other_lowercase_singles16[:], + ranges_16 = other_lowercase_ranges16[:], + single_32 = other_lowercase_singles32[:], + ranges_32 = other_lowercase_ranges32[:], +} + +@(rodata) +other_uppercase_singles16 := [?]u16{ + 0x216F, 0x24CF, +} + +@(rodata) +other_uppercase_singles32 := [?]i32{ + 0x1F149, 0x1F169, 0x1F189, +} + +other_uppercase_ranges := Range{ + single_16 = other_uppercase_singles16[:], + single_32 = other_uppercase_singles32[:], +} + From 673adf30c3d4af273224804667a93aba63c25598 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 18:01:09 -0500 Subject: [PATCH 053/273] Add searing of generated tables, Fixed in_digit This adds the functino `unicode.in_range` to search for a run in the `Range` type used in `core/unicode/generated.odin`. This also modifies `unicode.binary_search` so it will support searching types other than i32 by making it support implicit parametric polymorphism. `unicode.in_digit` has been modified to use the generated tables. --- core/unicode/inrange.odin | 39 +++++++++++++++++++++++++++++++++++++++ core/unicode/letter.odin | 9 +++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 core/unicode/inrange.odin diff --git a/core/unicode/inrange.odin b/core/unicode/inrange.odin new file mode 100644 index 000000000..15f7de745 --- /dev/null +++ b/core/unicode/inrange.odin @@ -0,0 +1,39 @@ +package unicode + +/* +Check to see if the rune `r` is in `range` +*/ +in_range :: proc(r: rune, range: Range) -> bool { + + if r <= 0xFFFF { + r16 := cast(u16) r + + length := len(range.ranges_16) + index := binary_search(r16, range.ranges_16, length/2, 2) if length > 0 else -1 + if index >= 0 && range.ranges_16[index] <= r16 && range.ranges_16[index+1] >= r16 do return true + + length = len(range.single_16) + index = binary_search(r16, range.single_16, length, 1) if length > 0 else -1 + if index >= 0 && range.single_16[index] == r16 { + return true + } + } + + r32 := cast(i32) r + + length := len(range.ranges_32) + index := binary_search(r32, range.ranges_32, length/2, 2) if length >0 else -1 + if index >= 0 && range.ranges_32[index] <= r32 && range.ranges_32[index+1] >= r32 do return true + + length = len(range.single_32) + index = binary_search(r32, range.single_32, length, 1) if length > 0 else -1 + if index >= 0 && range.single_32[index] == r32 do return true + + + return false +} + + + + + diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 5191dd900..84be04cfc 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -13,7 +13,7 @@ ZERO_WIDTH_JOINER :: '\u200D' WORD_JOINER :: '\u2060' @(require_results) -binary_search :: proc(c: i32, table: []i32, length, stride: int, loc := #caller_location) -> int #no_bounds_check { +binary_search :: proc(c: $T, table: []T, length, stride: int, loc := #caller_location) -> int #no_bounds_check { runtime.bounds_check_error_loc(loc, length*stride-1, len(table)) n := length t := 0 @@ -134,8 +134,13 @@ is_title :: proc(r: rune) -> bool { @(require_results) is_digit :: proc(r: rune) -> bool { if r <= MAX_LATIN1 { - return '0' <= r && r <= '9' + return ('0' <= r && r <= '9') || r == 0x00B9 || (r >= 0x00B2 && r <= 0x0B3) } + + if in_range(r, nd_ranges) do return true + + if in_range(r, extra_digits_ranges) do return true + return false } From 263bc8cc7ed4479b474783c298ec12613f61612e Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 18:13:04 -0500 Subject: [PATCH 054/273] Added comment to is_digit --- core/unicode/letter.odin | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 84be04cfc..d0d6ec634 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -131,6 +131,17 @@ is_title :: proc(r: rune) -> bool { return is_upper(r) && is_lower(r) } +/* +This function determincs if a rune is a digit. To be a digit the +charage either has a Numeric_Type of Digit or Decimal. + +Inputs: +- r: The rune to check if it is a digit. + +Returns: +`true` if the rune `r` is a digit, `false` in all other cases + +*/ @(require_results) is_digit :: proc(r: rune) -> bool { if r <= MAX_LATIN1 { From e5b1f1bf94379a4c68ab4b2979fd055a7dc9435b Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 18:18:47 -0500 Subject: [PATCH 055/273] Add procedure `is_decimal` This adds the function `is_decimal` to `core/unicode` --- core/unicode/letter.odin | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index d0d6ec634..ade35e16e 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -131,6 +131,20 @@ is_title :: proc(r: rune) -> bool { return is_upper(r) && is_lower(r) } +/* +Returns true if the rune `r` is in the General Category Nd + +Inputs: +- r: The run to check if it is in the general category Nd. + +Returns: +`true` if the rune is in the general category Nd and `false` otherwise + +*/ +is_decimal :: proc(r: rune) -> bool { + return in_range(r, nd_ranges) +} + /* This function determincs if a rune is a digit. To be a digit the charage either has a Numeric_Type of Digit or Decimal. From 090dedda1b32921fa10fa29a589b63b28233f649 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 18:28:34 -0500 Subject: [PATCH 056/273] is_number now searches generate tables --- core/unicode/letter.odin | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index ade35e16e..636b1bdb2 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -225,12 +225,25 @@ is_control :: proc(r: rune) -> bool #no_bounds_check { return false } +/* +Checks to see if the rune `r` is a number. This means the rune is a member +of the general category Nd, Nl, or No. + +Inputs: +r: The rune to check if it is number. + +Returns: +`true` if the ruen belongs to the general category Nd, Nl, or No. `false` +is return in all other cases. + +*/ @(require_results) is_number :: proc(r: rune) -> bool #no_bounds_check { if u32(r) <= MAX_LATIN1 { return char_properties[u8(r)]&pN != 0 } - return false + + return in_range(r, nd_ranges) || in_range(r, nl_ranges) || in_range(r, no_ranges) } @(require_results) From b4d70d3c5b35a66e58b551e85a0586ae5d9cd5fd Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 19:19:04 -0500 Subject: [PATCH 057/273] Corrected issue with PropList.txt ranges --- core/unicode/generated.odin | 48 +++++++++++++++++++-------------- core/unicode/tools/ucd/ucd.odin | 9 ++++--- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index 28d2cf7e1..63f6b2436 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -1220,32 +1220,37 @@ extra_digits_ranges := Range{ @(rodata) other_lowercase_singles16 := [?]u16{ - 0x02B8, 0x02C1, 0x02E4, 0x1D6A, 0x1DBF, 0x209C, 0x217F, 0x24E9, 0x2C7D, 0xA69D, - 0xA7F4, 0xA7F9, 0xAB5F, + 0x00AA, 0x00BA, 0x0345, 0x037A, 0x10FC, 0x1D78, 0x2071, 0x207F, 0xA770, 0xAB69, } @(rodata) other_lowercase_ranges16 := [?]u16{ - 0x0000, 0x00AA, - 0x0000, 0x00BA, - 0x0000, 0x0345, - 0x0000, 0x037A, - 0x0000, 0x10FC, - 0x0000, 0x1D78, - 0x0000, 0x2071, - 0x0000, 0x207F, - 0x0000, 0xA770, - 0x0000, 0xAB69, + 0x02B0, 0x02B8, + 0x02C0, 0x02C1, + 0x02E0, 0x02E4, + 0x1D2C, 0x1D6A, + 0x1D9B, 0x1DBF, + 0x2090, 0x209C, + 0x2170, 0x217F, + 0x24D0, 0x24E9, + 0x2C7C, 0x2C7D, + 0xA69C, 0xA69D, + 0xA7F1, 0xA7F4, + 0xA7F8, 0xA7F9, + 0xAB5C, 0xAB5F, } @(rodata) other_lowercase_singles32 := [?]i32{ - 0x10785, 0x107B0, 0x107BA, 0x1E06D, + 0x10780, } @(rodata) other_lowercase_ranges32 := [?]i32{ - 0x0000, 0x10780, + 0x10783, 0x10785, + 0x10787, 0x107B0, + 0x107B2, 0x107BA, + 0x1E030, 0x1E06D, } other_lowercase_ranges := Range{ @@ -1256,17 +1261,20 @@ other_lowercase_ranges := Range{ } @(rodata) -other_uppercase_singles16 := [?]u16{ - 0x216F, 0x24CF, +other_uppercase_ranges16 := [?]u16{ + 0x2160, 0x216F, + 0x24B6, 0x24CF, } @(rodata) -other_uppercase_singles32 := [?]i32{ - 0x1F149, 0x1F169, 0x1F189, +other_uppercase_ranges32 := [?]i32{ + 0x1F130, 0x1F149, + 0x1F150, 0x1F169, + 0x1F170, 0x1F189, } other_uppercase_ranges := Range{ - single_16 = other_uppercase_singles16[:], - single_32 = other_uppercase_singles32[:], + ranges_16 = other_uppercase_ranges16[:], + ranges_32 = other_uppercase_ranges32[:], } diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index d46ae37cb..9f815d386 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -267,6 +267,7 @@ load_protperty_list :: proc ( if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') { if c == '.' { is_range = true + rr.last = 0 continue } else { err = UCD_Error.Invalid_Hex_Number @@ -274,14 +275,14 @@ load_protperty_list :: proc ( } } if is_range { + rr.last *= 16 + rr.last += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') + rr.last += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + } else { rr.first *= 16 rr.first += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') rr.first += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) rr.last = rr.first - } else { - rr.last *= 16 - rr.last += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') - rr.last += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) } } From 69c04b696a3864790dba3fd0fc5f924c3bbb37d1 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sat, 7 Mar 2026 19:23:16 -0500 Subject: [PATCH 058/273] islower now used the generated tables --- core/unicode/letter.odin | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 636b1bdb2..2fc1fa1be 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -75,16 +75,7 @@ is_lower :: proc(r: rune) -> bool #no_bounds_check { if r <= MAX_ASCII { return u32(r)-'a' < 26 } - c := i32(r) - p := binary_search(c, to_upper_ranges[:], len(to_upper_ranges)/3, 3) - if p >= 0 && to_upper_ranges[p] <= c && c <= to_upper_ranges[p+1] { - return true - } - p = binary_search(c, to_upper_singlets[:], len(to_upper_singlets)/2, 2) - if p >= 0 && c == to_upper_singlets[p] { - return true - } - return false + return in_range(r, ll_ranges) || in_range(r, other_lowercase_ranges) } @(require_results) From e9943e61453ada4e4fd9b3df9478c8701bb875eb Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 11:40:05 -0400 Subject: [PATCH 059/273] is_letter now uses generated tables unicode.is_letter has been modified to use the generated unicode tables. --- core/unicode/letter.odin | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 2fc1fa1be..a7e2c6c9f 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -83,19 +83,22 @@ is_upper :: proc(r: rune) -> bool #no_bounds_check { if r <= MAX_ASCII { return u32(r)-'A' < 26 } - c := i32(r) - p := binary_search(c, to_lower_ranges[:], len(to_lower_ranges)/3, 3) - if p >= 0 && to_lower_ranges[p] <= c && c <= to_lower_ranges[p+1] { - return true - } - p = binary_search(c, to_lower_singlets[:], len(to_lower_singlets)/2, 2) - if p >= 0 && c == to_lower_singlets[p] { - return true - } - return false + return in_range(r, lu_ranges) || in_range(r, other_uppercase_ranges) } is_alpha :: is_letter + +/* +Return true if the rune `r` is a letter. Being a letter means that the rune has +the Unicode general category property of L. In practice, the character will have +a general category property of Ll, Lm, Lo, Lt, or Lu. + +Inputs: +- r: The rune which will be check for having the property of being a letter. + +Returns: +`true` when the rune `r` is a letter. `false` will be returned in all other cases. +*/ @(require_results) is_letter :: proc(r: rune) -> bool #no_bounds_check { if u32(r) <= MAX_LATIN1 { @@ -105,16 +108,9 @@ is_letter :: proc(r: rune) -> bool #no_bounds_check { return true } - c := i32(r) - p := binary_search(c, alpha_ranges[:], len(alpha_ranges)/2, 2) - if p >= 0 && alpha_ranges[p] <= c && c <= alpha_ranges[p+1] { - return true - } - p = binary_search(c, alpha_singlets[:], len(alpha_singlets), 1) - if p >= 0 && c == alpha_singlets[p] { - return true - } - return false + ll_lu := in_range(r, ll_ranges) || in_range(r, lu_ranges) + + return ll_lu || in_range(r, lo_ranges) || in_range(r, lt_ranges) || in_range(r, lm_ranges) } @(require_results) From 9b38bdf849e51657b7f91511f4f812cba11a8878 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 11:58:50 -0400 Subject: [PATCH 060/273] Refactor to remove the us of if do --- core/unicode/inrange.odin | 12 +++++++++--- core/unicode/letter.odin | 8 ++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/core/unicode/inrange.odin b/core/unicode/inrange.odin index 15f7de745..fa433a741 100644 --- a/core/unicode/inrange.odin +++ b/core/unicode/inrange.odin @@ -10,7 +10,9 @@ in_range :: proc(r: rune, range: Range) -> bool { length := len(range.ranges_16) index := binary_search(r16, range.ranges_16, length/2, 2) if length > 0 else -1 - if index >= 0 && range.ranges_16[index] <= r16 && range.ranges_16[index+1] >= r16 do return true + if index >= 0 && range.ranges_16[index] <= r16 && range.ranges_16[index+1] >= r16 { + return true + } length = len(range.single_16) index = binary_search(r16, range.single_16, length, 1) if length > 0 else -1 @@ -23,11 +25,15 @@ in_range :: proc(r: rune, range: Range) -> bool { length := len(range.ranges_32) index := binary_search(r32, range.ranges_32, length/2, 2) if length >0 else -1 - if index >= 0 && range.ranges_32[index] <= r32 && range.ranges_32[index+1] >= r32 do return true + if index >= 0 && range.ranges_32[index] <= r32 && range.ranges_32[index+1] >= r32 { + return true + } length = len(range.single_32) index = binary_search(r32, range.single_32, length, 1) if length > 0 else -1 - if index >= 0 && range.single_32[index] == r32 do return true + if index >= 0 && range.single_32[index] == r32 { + return true + } return false diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index a7e2c6c9f..29ea86ca9 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -149,9 +149,13 @@ is_digit :: proc(r: rune) -> bool { return ('0' <= r && r <= '9') || r == 0x00B9 || (r >= 0x00B2 && r <= 0x0B3) } - if in_range(r, nd_ranges) do return true + if in_range(r, nd_ranges) { + return true + } - if in_range(r, extra_digits_ranges) do return true + if in_range(r, extra_digits_ranges) { + return true + } return false } From 3bfa01d4a82c944dabaef0e93b9ad65dcc893503 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 12:19:38 -0400 Subject: [PATCH 061/273] Generate Unicode Punctuation Tables --- core/unicode/generated.odin | 258 +++++++++++++++++++++++ core/unicode/tools/generate_unicode.odin | 14 +- 2 files changed, 265 insertions(+), 7 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index 63f6b2436..c2a26ae2e 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -1184,6 +1184,264 @@ no_ranges := Range{ ranges_32 = no_ranges32[:], } +@(rodata) +pc_singles16 := [?]u16{ + 0x005F, 0x2054, 0xFF3F, +} + +@(rodata) +pc_ranges16 := [?]u16{ + 0x203F, 0x2040, + 0xFE33, 0xFE34, + 0xFE4D, 0xFE4F, +} + +pc_ranges := Range{ + single_16 = pc_singles16[:], + ranges_16 = pc_ranges16[:], +} + +@(rodata) +pd_singles16 := [?]u16{ + 0x002D, 0x058A, 0x05BE, 0x1400, 0x1806, 0x2E17, 0x2E1A, 0x2E40, 0x2E5D, 0x301C, + 0x3030, 0x30A0, 0xFE58, 0xFE63, 0xFF0D, +} + +@(rodata) +pd_ranges16 := [?]u16{ + 0x2010, 0x2015, + 0x2E3A, 0x2E3B, + 0xFE31, 0xFE32, +} + +@(rodata) +pd_singles32 := [?]i32{ + 0x10D6E, 0x10EAD, +} + +pd_ranges := Range{ + single_16 = pd_singles16[:], + ranges_16 = pd_ranges16[:], + single_32 = pd_singles32[:], +} + +@(rodata) +pe_singles16 := [?]u16{ + 0x0029, 0x005D, 0x007D, 0x0F3B, 0x0F3D, 0x169C, 0x2046, 0x207E, 0x208E, 0x2309, + 0x230B, 0x232A, 0x2769, 0x276B, 0x276D, 0x276F, 0x2771, 0x2773, 0x2775, 0x27C6, + 0x27E7, 0x27E9, 0x27EB, 0x27ED, 0x27EF, 0x2984, 0x2986, 0x2988, 0x298A, 0x298C, + 0x298E, 0x2990, 0x2992, 0x2994, 0x2996, 0x2998, 0x29D9, 0x29DB, 0x29FD, 0x2E23, + 0x2E25, 0x2E27, 0x2E29, 0x2E56, 0x2E58, 0x2E5A, 0x2E5C, 0x3009, 0x300B, 0x300D, + 0x300F, 0x3011, 0x3015, 0x3017, 0x3019, 0x301B, 0xFD3E, 0xFE18, 0xFE36, 0xFE38, + 0xFE3A, 0xFE3C, 0xFE3E, 0xFE40, 0xFE42, 0xFE44, 0xFE48, 0xFE5A, 0xFE5C, 0xFE5E, + 0xFF09, 0xFF3D, 0xFF5D, 0xFF60, 0xFF63, +} + +@(rodata) +pe_ranges16 := [?]u16{ + 0x301E, 0x301F, +} + +pe_ranges := Range{ + single_16 = pe_singles16[:], + ranges_16 = pe_ranges16[:], +} + +@(rodata) +pf_singles16 := [?]u16{ + 0x00BB, 0x2019, 0x201D, 0x203A, 0x2E03, 0x2E05, 0x2E0A, 0x2E0D, 0x2E1D, 0x2E21, +} + +pf_ranges := Range{ + single_16 = pf_singles16[:], +} + +@(rodata) +pi_singles16 := [?]u16{ + 0x00AB, 0x2018, 0x201F, 0x2039, 0x2E02, 0x2E04, 0x2E09, 0x2E0C, 0x2E1C, 0x2E20, +} + +@(rodata) +pi_ranges16 := [?]u16{ + 0x201B, 0x201C, +} + +pi_ranges := Range{ + single_16 = pi_singles16[:], + ranges_16 = pi_ranges16[:], +} + +@(rodata) +po_singles16 := [?]u16{ + 0x002A, 0x002C, 0x005C, 0x00A1, 0x00A7, 0x00BF, 0x037E, 0x0387, 0x0589, 0x05C0, + 0x05C3, 0x05C6, 0x061B, 0x06D4, 0x085E, 0x0970, 0x09FD, 0x0A76, 0x0AF0, 0x0C77, + 0x0C84, 0x0DF4, 0x0E4F, 0x0F14, 0x0F85, 0x10FB, 0x166E, 0x1CD3, 0x2053, 0x2D70, + 0x2E0B, 0x2E1B, 0x2E41, 0x303D, 0x30FB, 0xA673, 0xA67E, 0xA8FC, 0xA95F, 0xABEB, + 0xFE19, 0xFE30, 0xFE68, 0xFF0A, 0xFF0C, 0xFF3C, 0xFF61, +} + +@(rodata) +po_ranges16 := [?]u16{ + 0x0021, 0x0023, + 0x0025, 0x0027, + 0x002E, 0x002F, + 0x003A, 0x003B, + 0x003F, 0x0040, + 0x00B6, 0x00B7, + 0x055A, 0x055F, + 0x05F3, 0x05F4, + 0x0609, 0x060A, + 0x060C, 0x060D, + 0x061D, 0x061F, + 0x066A, 0x066D, + 0x0700, 0x070D, + 0x07F7, 0x07F9, + 0x0830, 0x083E, + 0x0964, 0x0965, + 0x0E5A, 0x0E5B, + 0x0F04, 0x0F12, + 0x0FD0, 0x0FD4, + 0x0FD9, 0x0FDA, + 0x104A, 0x104F, + 0x1360, 0x1368, + 0x16EB, 0x16ED, + 0x1735, 0x1736, + 0x17D4, 0x17D6, + 0x17D8, 0x17DA, + 0x1800, 0x1805, + 0x1807, 0x180A, + 0x1944, 0x1945, + 0x1A1E, 0x1A1F, + 0x1AA0, 0x1AA6, + 0x1AA8, 0x1AAD, + 0x1B4E, 0x1B4F, + 0x1B5A, 0x1B60, + 0x1B7D, 0x1B7F, + 0x1BFC, 0x1BFF, + 0x1C3B, 0x1C3F, + 0x1C7E, 0x1C7F, + 0x1CC0, 0x1CC7, + 0x2016, 0x2017, + 0x2020, 0x2027, + 0x2030, 0x2038, + 0x203B, 0x203E, + 0x2041, 0x2043, + 0x2047, 0x2051, + 0x2055, 0x205E, + 0x2CF9, 0x2CFC, + 0x2CFE, 0x2CFF, + 0x2E00, 0x2E01, + 0x2E06, 0x2E08, + 0x2E0E, 0x2E16, + 0x2E18, 0x2E19, + 0x2E1E, 0x2E1F, + 0x2E2A, 0x2E2E, + 0x2E30, 0x2E39, + 0x2E3C, 0x2E3F, + 0x2E43, 0x2E4F, + 0x2E52, 0x2E54, + 0x3001, 0x3003, + 0xA4FE, 0xA4FF, + 0xA60D, 0xA60F, + 0xA6F2, 0xA6F7, + 0xA874, 0xA877, + 0xA8CE, 0xA8CF, + 0xA8F8, 0xA8FA, + 0xA92E, 0xA92F, + 0xA9C1, 0xA9CD, + 0xA9DE, 0xA9DF, + 0xAA5C, 0xAA5F, + 0xAADE, 0xAADF, + 0xAAF0, 0xAAF1, + 0xFE10, 0xFE16, + 0xFE45, 0xFE46, + 0xFE49, 0xFE4C, + 0xFE50, 0xFE52, + 0xFE54, 0xFE57, + 0xFE5F, 0xFE61, + 0xFE6A, 0xFE6B, + 0xFF01, 0xFF03, + 0xFF05, 0xFF07, + 0xFF0E, 0xFF0F, + 0xFF1A, 0xFF1B, + 0xFF1F, 0xFF20, + 0xFF64, 0xFF65, +} + +@(rodata) +po_singles32 := [?]i32{ + 0x1039F, 0x103D0, 0x1056F, 0x10857, 0x1091F, 0x1093F, 0x10A7F, 0x10ED0, + 0x111CD, 0x111DB, 0x112A9, 0x1145D, 0x114C6, 0x116B9, 0x1183B, 0x119E2, + 0x11BE1, 0x11FFF, 0x16AF5, 0x16B44, 0x16FE2, 0x1BC9F, 0x1E5FF, +} + +@(rodata) +po_ranges32 := [?]i32{ + 0x10100, 0x10102, + 0x10A50, 0x10A58, + 0x10AF0, 0x10AF6, + 0x10B39, 0x10B3F, + 0x10B99, 0x10B9C, + 0x10F55, 0x10F59, + 0x10F86, 0x10F89, + 0x11047, 0x1104D, + 0x110BB, 0x110BC, + 0x110BE, 0x110C1, + 0x11140, 0x11143, + 0x11174, 0x11175, + 0x111C5, 0x111C8, + 0x111DD, 0x111DF, + 0x11238, 0x1123D, + 0x113D4, 0x113D5, + 0x113D7, 0x113D8, + 0x1144B, 0x1144F, + 0x1145A, 0x1145B, + 0x115C1, 0x115D7, + 0x11641, 0x11643, + 0x11660, 0x1166C, + 0x1173C, 0x1173E, + 0x11944, 0x11946, + 0x11A3F, 0x11A46, + 0x11A9A, 0x11A9C, + 0x11A9E, 0x11AA2, + 0x11B00, 0x11B09, + 0x11C41, 0x11C45, + 0x11C70, 0x11C71, + 0x11EF7, 0x11EF8, + 0x11F43, 0x11F4F, + 0x12470, 0x12474, + 0x12FF1, 0x12FF2, + 0x16A6E, 0x16A6F, + 0x16B37, 0x16B3B, + 0x16D6D, 0x16D6F, + 0x16E97, 0x16E9A, + 0x1DA87, 0x1DA8B, + 0x1E95E, 0x1E95F, +} + +po_ranges := Range{ + single_16 = po_singles16[:], + ranges_16 = po_ranges16[:], + single_32 = po_singles32[:], + ranges_32 = po_ranges32[:], +} + +@(rodata) +ps_singles16 := [?]u16{ + 0x0028, 0x005B, 0x007B, 0x0F3A, 0x0F3C, 0x169B, 0x201A, 0x201E, 0x2045, 0x207D, + 0x208D, 0x2308, 0x230A, 0x2329, 0x2768, 0x276A, 0x276C, 0x276E, 0x2770, 0x2772, + 0x2774, 0x27C5, 0x27E6, 0x27E8, 0x27EA, 0x27EC, 0x27EE, 0x2983, 0x2985, 0x2987, + 0x2989, 0x298B, 0x298D, 0x298F, 0x2991, 0x2993, 0x2995, 0x2997, 0x29D8, 0x29DA, + 0x29FC, 0x2E22, 0x2E24, 0x2E26, 0x2E28, 0x2E42, 0x2E55, 0x2E57, 0x2E59, 0x2E5B, + 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016, 0x3018, 0x301A, 0x301D, + 0xFD3F, 0xFE17, 0xFE35, 0xFE37, 0xFE39, 0xFE3B, 0xFE3D, 0xFE3F, 0xFE41, 0xFE43, + 0xFE47, 0xFE59, 0xFE5B, 0xFE5D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F, 0xFF62, +} + +ps_ranges := Range{ + single_16 = ps_singles16[:], +} + @(rodata) extra_digits_singles16 := [?]u16{ 0x00B9, 0x19DA, 0x2070, 0x24EA, 0x24FF, diff --git a/core/unicode/tools/generate_unicode.odin b/core/unicode/tools/generate_unicode.odin index 5962a269c..489b778ac 100644 --- a/core/unicode/tools/generate_unicode.odin +++ b/core/unicode/tools/generate_unicode.odin @@ -284,13 +284,13 @@ main :: proc() { //.Nd, // Decimal_Number, a decimal digit //.Nl, // Letter_Number, a letterlike numeric character //.No, // Other_Number, a numeric character of other type - .Pc, // Connector_Punctuation, a connecting punctuation mark, like a tie - .Pd, // Dash_Punctuation, a dash or hyphen punctuation mark - .Pe, // Close_Punctuation, a closing punctuation mark (of a pair) - .Pf, // Final_Punctuation, a final quotation mark - .Pi, // Initial_Punctuation, an initial quotation mark - .Po, // Other_Punctuation, a punctuation mark of other type - .Ps, // Open_Punctuation, an opening punctuation mark (of a pair) + // .Pc, // Connector_Punctuation, a connecting punctuation mark, like a tie + // .Pd, // Dash_Punctuation, a dash or hyphen punctuation mark + // .Pe, // Close_Punctuation, a closing punctuation mark (of a pair) + // .Pf, // Final_Punctuation, a final quotation mark + // .Pi, // Initial_Punctuation, an initial quotation mark + // .Po, // Other_Punctuation, a punctuation mark of other type + // .Ps, // Open_Punctuation, an opening punctuation mark (of a pair) .Sc, // Currency_Symbol, a currency sign .Sk, // Modifier_Symbol, a non-letterlike modifier symbol .Sm, // Math_Symbol, a symbol of mathematical use From 8f5f1ee1cc55a9ccaccfe9740bed7605685fa3d9 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 16:00:34 -0400 Subject: [PATCH 062/273] is_punct now searches generated tables --- core/unicode/letter.odin | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 29ea86ca9..6df645484 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -242,7 +242,16 @@ is_punct :: proc(r: rune) -> bool #no_bounds_check { if u32(r) <= MAX_LATIN1 { return char_properties[u8(r)]&pP != 0 } - return false + + if in_range(r, pc_ranges) || in_range(r, pd_ranges) || in_range(r, pe_ranges) { + return true + } + + if in_range(r, pf_ranges) || in_range(r, pi_ranges) || in_range(r, po_ranges) { + return true + } + + return in_range(r, ps_ranges) } @(require_results) From 65d0e5c82f1a6284ac925b84fac120531a123de7 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 16:20:35 -0400 Subject: [PATCH 063/273] is_symbol uses generated Unicode tables Tables for Sm, Sc, Sk, So are now being generated. These tables are now being searched by is_symbol --- core/unicode/generated.odin | 301 +++++++++++++++++++++++ core/unicode/letter.odin | 7 + core/unicode/tools/generate_unicode.odin | 8 +- 3 files changed, 312 insertions(+), 4 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index c2a26ae2e..d35aa020c 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -1442,6 +1442,307 @@ ps_ranges := Range{ single_16 = ps_singles16[:], } +@(rodata) +sc_singles16 := [?]u16{ + 0x0024, 0x058F, 0x060B, 0x09FB, 0x0AF1, 0x0BF9, 0x0E3F, 0x17DB, 0xA838, 0xFDFC, + 0xFE69, 0xFF04, +} + +@(rodata) +sc_ranges16 := [?]u16{ + 0x00A2, 0x00A5, + 0x07FE, 0x07FF, + 0x09F2, 0x09F3, + 0x20A0, 0x20C1, + 0xFFE0, 0xFFE1, + 0xFFE5, 0xFFE6, +} + +@(rodata) +sc_singles32 := [?]i32{ + 0x1E2FF, 0x1ECB0, +} + +@(rodata) +sc_ranges32 := [?]i32{ + 0x11FDD, 0x11FE0, +} + +sc_ranges := Range{ + single_16 = sc_singles16[:], + ranges_16 = sc_ranges16[:], + single_32 = sc_singles32[:], + ranges_32 = sc_ranges32[:], +} + +@(rodata) +sk_singles16 := [?]u16{ + 0x005E, 0x0060, 0x00A8, 0x00AF, 0x00B4, 0x00B8, 0x02ED, 0x0375, 0x0888, 0x1FBD, + 0xAB5B, 0xFF3E, 0xFF40, 0xFFE3, +} + +@(rodata) +sk_ranges16 := [?]u16{ + 0x02C2, 0x02C5, + 0x02D2, 0x02DF, + 0x02E5, 0x02EB, + 0x02EF, 0x02FF, + 0x0384, 0x0385, + 0x1FBF, 0x1FC1, + 0x1FCD, 0x1FCF, + 0x1FDD, 0x1FDF, + 0x1FED, 0x1FEF, + 0x1FFD, 0x1FFE, + 0x309B, 0x309C, + 0xA700, 0xA716, + 0xA720, 0xA721, + 0xA789, 0xA78A, + 0xAB6A, 0xAB6B, + 0xFBB2, 0xFBC2, +} + +@(rodata) +sk_ranges32 := [?]i32{ + 0x1F3FB, 0x1F3FF, +} + +sk_ranges := Range{ + single_16 = sk_singles16[:], + ranges_16 = sk_ranges16[:], + ranges_32 = sk_ranges32[:], +} + +@(rodata) +sm_singles16 := [?]u16{ + 0x002B, 0x007C, 0x007E, 0x00AC, 0x00B1, 0x00D7, 0x00F7, 0x03F6, 0x2044, 0x2052, + 0x2118, 0x214B, 0x21A0, 0x21A3, 0x21A6, 0x21AE, 0x21D2, 0x21D4, 0x237C, 0x25B7, + 0x25C1, 0x266F, 0xFB29, 0xFE62, 0xFF0B, 0xFF5C, 0xFF5E, 0xFFE2, +} + +@(rodata) +sm_ranges16 := [?]u16{ + 0x003C, 0x003E, + 0x0606, 0x0608, + 0x207A, 0x207C, + 0x208A, 0x208C, + 0x2140, 0x2144, + 0x2190, 0x2194, + 0x219A, 0x219B, + 0x21CE, 0x21CF, + 0x21F4, 0x22FF, + 0x2320, 0x2321, + 0x239B, 0x23B3, + 0x23DC, 0x23E1, + 0x25F8, 0x25FF, + 0x27C0, 0x27C4, + 0x27C7, 0x27E5, + 0x27F0, 0x27FF, + 0x2900, 0x2982, + 0x2999, 0x29D7, + 0x29DC, 0x29FB, + 0x29FE, 0x2AFF, + 0x2B30, 0x2B44, + 0x2B47, 0x2B4C, + 0xFE64, 0xFE66, + 0xFF1C, 0xFF1E, + 0xFFE9, 0xFFEC, +} + +@(rodata) +sm_singles32 := [?]i32{ + 0x1CEF0, 0x1D6C1, 0x1D6DB, 0x1D6FB, 0x1D715, 0x1D735, 0x1D74F, 0x1D76F, + 0x1D789, 0x1D7A9, 0x1D7C3, +} + +@(rodata) +sm_ranges32 := [?]i32{ + 0x10D8E, 0x10D8F, + 0x1EEF0, 0x1EEF1, + 0x1F8D0, 0x1F8D8, +} + +sm_ranges := Range{ + single_16 = sm_singles16[:], + ranges_16 = sm_ranges16[:], + single_32 = sm_singles32[:], + ranges_32 = sm_ranges32[:], +} + +@(rodata) +so_singles16 := [?]u16{ + 0x00A6, 0x00A9, 0x00AE, 0x00B0, 0x0482, 0x06DE, 0x06E9, 0x07F6, 0x09FA, 0x0B70, + 0x0BFA, 0x0C7F, 0x0D4F, 0x0D79, 0x0F13, 0x0F34, 0x0F36, 0x0F38, 0x166D, 0x1940, + 0x2114, 0x2125, 0x2127, 0x2129, 0x212E, 0x214A, 0x214F, 0x21D3, 0x3004, 0x3020, + 0x31EF, 0x3250, 0xA839, 0xFFE4, 0xFFE8, +} + +@(rodata) +so_ranges16 := [?]u16{ + 0x058D, 0x058E, + 0x060E, 0x060F, + 0x06FD, 0x06FE, + 0x0BF3, 0x0BF8, + 0x0F01, 0x0F03, + 0x0F15, 0x0F17, + 0x0F1A, 0x0F1F, + 0x0FBE, 0x0FC5, + 0x0FC7, 0x0FCC, + 0x0FCE, 0x0FCF, + 0x0FD5, 0x0FD8, + 0x109E, 0x109F, + 0x1390, 0x1399, + 0x19DE, 0x19FF, + 0x1B61, 0x1B6A, + 0x1B74, 0x1B7C, + 0x2100, 0x2101, + 0x2103, 0x2106, + 0x2108, 0x2109, + 0x2116, 0x2117, + 0x211E, 0x2123, + 0x213A, 0x213B, + 0x214C, 0x214D, + 0x218A, 0x218B, + 0x2195, 0x2199, + 0x219C, 0x219F, + 0x21A1, 0x21A2, + 0x21A4, 0x21A5, + 0x21A7, 0x21AD, + 0x21AF, 0x21CD, + 0x21D0, 0x21D1, + 0x21D5, 0x21F3, + 0x2300, 0x2307, + 0x230C, 0x231F, + 0x2322, 0x2328, + 0x232B, 0x237B, + 0x237D, 0x239A, + 0x23B4, 0x23DB, + 0x23E2, 0x2429, + 0x2440, 0x244A, + 0x249C, 0x24E9, + 0x2500, 0x25B6, + 0x25B8, 0x25C0, + 0x25C2, 0x25F7, + 0x2600, 0x266E, + 0x2670, 0x2767, + 0x2794, 0x27BF, + 0x2800, 0x28FF, + 0x2B00, 0x2B2F, + 0x2B45, 0x2B46, + 0x2B4D, 0x2B73, + 0x2B76, 0x2BFF, + 0x2CE5, 0x2CEA, + 0x2E50, 0x2E51, + 0x2E80, 0x2E99, + 0x2E9B, 0x2EF3, + 0x2F00, 0x2FD5, + 0x2FF0, 0x2FFF, + 0x3012, 0x3013, + 0x3036, 0x3037, + 0x303E, 0x303F, + 0x3190, 0x3191, + 0x3196, 0x319F, + 0x31C0, 0x31E5, + 0x3200, 0x321E, + 0x322A, 0x3247, + 0x3260, 0x327F, + 0x328A, 0x32B0, + 0x32C0, 0x33FF, + 0x4DC0, 0x4DFF, + 0xA490, 0xA4C6, + 0xA828, 0xA82B, + 0xA836, 0xA837, + 0xAA77, 0xAA79, + 0xFBC3, 0xFBD2, + 0xFD40, 0xFD4F, + 0xFD90, 0xFD91, + 0xFDC8, 0xFDCF, + 0xFDFD, 0xFDFF, + 0xFFED, 0xFFEE, + 0xFFFC, 0xFFFD, +} + +@(rodata) +so_singles32 := [?]i32{ + 0x101A0, 0x10AC8, 0x1173F, 0x16B45, 0x1BC9C, 0x1D245, 0x1E14F, 0x1ECAC, + 0x1ED2E, 0x1F7F0, 0x1FAC8, 0x1FBFA, +} + +@(rodata) +so_ranges32 := [?]i32{ + 0x10137, 0x1013F, + 0x10179, 0x10189, + 0x1018C, 0x1018E, + 0x10190, 0x1019C, + 0x101D0, 0x101FC, + 0x10877, 0x10878, + 0x10ED1, 0x10ED8, + 0x11FD5, 0x11FDC, + 0x11FE1, 0x11FF1, + 0x16B3C, 0x16B3F, + 0x1CC00, 0x1CCEF, + 0x1CCFA, 0x1CCFC, + 0x1CD00, 0x1CEB3, + 0x1CEBA, 0x1CED0, + 0x1CEE0, 0x1CEEF, + 0x1CF50, 0x1CFC3, + 0x1D000, 0x1D0F5, + 0x1D100, 0x1D126, + 0x1D129, 0x1D164, + 0x1D16A, 0x1D16C, + 0x1D183, 0x1D184, + 0x1D18C, 0x1D1A9, + 0x1D1AE, 0x1D1EA, + 0x1D200, 0x1D241, + 0x1D300, 0x1D356, + 0x1D800, 0x1D9FF, + 0x1DA37, 0x1DA3A, + 0x1DA6D, 0x1DA74, + 0x1DA76, 0x1DA83, + 0x1DA85, 0x1DA86, + 0x1F000, 0x1F02B, + 0x1F030, 0x1F093, + 0x1F0A0, 0x1F0AE, + 0x1F0B1, 0x1F0BF, + 0x1F0C1, 0x1F0CF, + 0x1F0D1, 0x1F0F5, + 0x1F10D, 0x1F1AD, + 0x1F1E6, 0x1F202, + 0x1F210, 0x1F23B, + 0x1F240, 0x1F248, + 0x1F250, 0x1F251, + 0x1F260, 0x1F265, + 0x1F300, 0x1F3FA, + 0x1F400, 0x1F6D8, + 0x1F6DC, 0x1F6EC, + 0x1F6F0, 0x1F6FC, + 0x1F700, 0x1F7D9, + 0x1F7E0, 0x1F7EB, + 0x1F800, 0x1F80B, + 0x1F810, 0x1F847, + 0x1F850, 0x1F859, + 0x1F860, 0x1F887, + 0x1F890, 0x1F8AD, + 0x1F8B0, 0x1F8BB, + 0x1F8C0, 0x1F8C1, + 0x1F900, 0x1FA57, + 0x1FA60, 0x1FA6D, + 0x1FA70, 0x1FA7C, + 0x1FA80, 0x1FA8A, + 0x1FA8E, 0x1FAC6, + 0x1FACD, 0x1FADC, + 0x1FADF, 0x1FAEA, + 0x1FAEF, 0x1FAF8, + 0x1FB00, 0x1FB92, + 0x1FB94, 0x1FBEF, +} + +so_ranges := Range{ + single_16 = so_singles16[:], + ranges_16 = so_ranges16[:], + single_32 = so_singles32[:], + ranges_32 = so_ranges32[:], +} + @(rodata) extra_digits_singles16 := [?]u16{ 0x00B9, 0x19DA, 0x2070, 0x24EA, 0x24FF, diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index 6df645484..c6df96f3f 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -259,6 +259,13 @@ is_symbol :: proc(r: rune) -> bool #no_bounds_check { if u32(r) <= MAX_LATIN1 { return char_properties[u8(r)]&pS != 0 } + + s := in_range(r, sc_ranges) || in_range(r, sm_ranges) + + if s || in_range(r, so_ranges) || in_range(r, sk_ranges) { + return true + } + return false } diff --git a/core/unicode/tools/generate_unicode.odin b/core/unicode/tools/generate_unicode.odin index 489b778ac..27cee0012 100644 --- a/core/unicode/tools/generate_unicode.odin +++ b/core/unicode/tools/generate_unicode.odin @@ -291,10 +291,10 @@ main :: proc() { // .Pi, // Initial_Punctuation, an initial quotation mark // .Po, // Other_Punctuation, a punctuation mark of other type // .Ps, // Open_Punctuation, an opening punctuation mark (of a pair) - .Sc, // Currency_Symbol, a currency sign - .Sk, // Modifier_Symbol, a non-letterlike modifier symbol - .Sm, // Math_Symbol, a symbol of mathematical use - .So, // Other_Symbol, a symbol of other type + // .Sc, // Currency_Symbol, a currency sign + // .Sk, // Modifier_Symbol, a non-letterlike modifier symbol + // .Sm, // Math_Symbol, a symbol of mathematical use + // .So, // Other_Symbol, a symbol of other type .Zl, // Line_Separator, U+2028 LINE SEPARATOR only .Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only .Zs, // Space_Separator, a space character (of various non-zero widths) From 1d0510d27f8ebbc1101a4a9c473a6d994a4fde44 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Sun, 8 Mar 2026 19:00:06 -0400 Subject: [PATCH 064/273] is_graphic now uses the generated Unicode tables unicode.is_graphic has been modified to use the generted Unicode tables. The tables Me, Mn, Mc, and Zs were add as needed by is_graphic. --- core/unicode/generated.odin | 454 +++++++++++++++++++++++ core/unicode/letter.odin | 9 + core/unicode/tools/generate_unicode.odin | 12 +- 3 files changed, 469 insertions(+), 6 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index d35aa020c..85d4e9e8b 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -978,6 +978,445 @@ lu_ranges := Range{ ranges_32 = lu_ranges32[:], } +@(rodata) +mc_singles16 := [?]u16{ + 0x0903, 0x093B, 0x09D7, 0x0A03, 0x0A83, 0x0AC9, 0x0B3E, 0x0B40, 0x0B57, 0x0BD7, + 0x0CBE, 0x0CF3, 0x0D57, 0x0F7F, 0x1031, 0x1038, 0x108F, 0x1715, 0x1734, 0x17B6, + 0x1A55, 0x1A57, 0x1A61, 0x1B04, 0x1B35, 0x1B3B, 0x1B82, 0x1BA1, 0x1BAA, 0x1BE7, + 0x1BEE, 0x1CE1, 0x1CF7, 0xA827, 0xA983, 0xAA4D, 0xAA7B, 0xAA7D, 0xAAEB, 0xAAF5, + 0xABEC, +} + +@(rodata) +mc_ranges16 := [?]u16{ + 0x093E, 0x0940, + 0x0949, 0x094C, + 0x094E, 0x094F, + 0x0982, 0x0983, + 0x09BE, 0x09C0, + 0x09C7, 0x09C8, + 0x09CB, 0x09CC, + 0x0A3E, 0x0A40, + 0x0ABE, 0x0AC0, + 0x0ACB, 0x0ACC, + 0x0B02, 0x0B03, + 0x0B47, 0x0B48, + 0x0B4B, 0x0B4C, + 0x0BBE, 0x0BBF, + 0x0BC1, 0x0BC2, + 0x0BC6, 0x0BC8, + 0x0BCA, 0x0BCC, + 0x0C01, 0x0C03, + 0x0C41, 0x0C44, + 0x0C82, 0x0C83, + 0x0CC0, 0x0CC4, + 0x0CC7, 0x0CC8, + 0x0CCA, 0x0CCB, + 0x0CD5, 0x0CD6, + 0x0D02, 0x0D03, + 0x0D3E, 0x0D40, + 0x0D46, 0x0D48, + 0x0D4A, 0x0D4C, + 0x0D82, 0x0D83, + 0x0DCF, 0x0DD1, + 0x0DD8, 0x0DDF, + 0x0DF2, 0x0DF3, + 0x0F3E, 0x0F3F, + 0x102B, 0x102C, + 0x103B, 0x103C, + 0x1056, 0x1057, + 0x1062, 0x1064, + 0x1067, 0x106D, + 0x1083, 0x1084, + 0x1087, 0x108C, + 0x109A, 0x109C, + 0x17BE, 0x17C5, + 0x17C7, 0x17C8, + 0x1923, 0x1926, + 0x1929, 0x192B, + 0x1930, 0x1931, + 0x1933, 0x1938, + 0x1A19, 0x1A1A, + 0x1A63, 0x1A64, + 0x1A6D, 0x1A72, + 0x1B3D, 0x1B41, + 0x1B43, 0x1B44, + 0x1BA6, 0x1BA7, + 0x1BEA, 0x1BEC, + 0x1BF2, 0x1BF3, + 0x1C24, 0x1C2B, + 0x1C34, 0x1C35, + 0x302E, 0x302F, + 0xA823, 0xA824, + 0xA880, 0xA881, + 0xA8B4, 0xA8C3, + 0xA952, 0xA953, + 0xA9B4, 0xA9B5, + 0xA9BA, 0xA9BB, + 0xA9BE, 0xA9C0, + 0xAA2F, 0xAA30, + 0xAA33, 0xAA34, + 0xAAEE, 0xAAEF, + 0xABE3, 0xABE4, + 0xABE6, 0xABE7, + 0xABE9, 0xABEA, +} + +@(rodata) +mc_singles32 := [?]i32{ + 0x11000, 0x11002, 0x11082, 0x1112C, 0x11182, 0x111CE, 0x11235, 0x11357, + 0x113C2, 0x113C5, 0x113CF, 0x11445, 0x114B9, 0x114C1, 0x115BE, 0x1163E, + 0x116AC, 0x116B6, 0x1171E, 0x11726, 0x11838, 0x1193D, 0x11940, 0x11942, + 0x119E4, 0x11A39, 0x11A97, 0x11B61, 0x11B65, 0x11B67, 0x11C2F, 0x11C3E, + 0x11CA9, 0x11CB1, 0x11CB4, 0x11D96, 0x11F03, 0x11F41, +} + +@(rodata) +mc_ranges32 := [?]i32{ + 0x110B0, 0x110B2, + 0x110B7, 0x110B8, + 0x11145, 0x11146, + 0x111B3, 0x111B5, + 0x111BF, 0x111C0, + 0x1122C, 0x1122E, + 0x11232, 0x11233, + 0x112E0, 0x112E2, + 0x11302, 0x11303, + 0x1133E, 0x1133F, + 0x11341, 0x11344, + 0x11347, 0x11348, + 0x1134B, 0x1134D, + 0x11362, 0x11363, + 0x113B8, 0x113BA, + 0x113C7, 0x113CA, + 0x113CC, 0x113CD, + 0x11435, 0x11437, + 0x11440, 0x11441, + 0x114B0, 0x114B2, + 0x114BB, 0x114BE, + 0x115AF, 0x115B1, + 0x115B8, 0x115BB, + 0x11630, 0x11632, + 0x1163B, 0x1163C, + 0x116AE, 0x116AF, + 0x11720, 0x11721, + 0x1182C, 0x1182E, + 0x11930, 0x11935, + 0x11937, 0x11938, + 0x119D1, 0x119D3, + 0x119DC, 0x119DF, + 0x11A57, 0x11A58, + 0x11D8A, 0x11D8E, + 0x11D93, 0x11D94, + 0x11EF5, 0x11EF6, + 0x11F34, 0x11F35, + 0x11F3E, 0x11F3F, + 0x1612A, 0x1612C, + 0x16F51, 0x16F87, + 0x16FF0, 0x16FF1, + 0x1D165, 0x1D166, + 0x1D16D, 0x1D172, +} + +mc_ranges := Range{ + single_16 = mc_singles16[:], + ranges_16 = mc_ranges16[:], + single_32 = mc_singles32[:], + ranges_32 = mc_ranges32[:], +} + +@(rodata) +me_singles16 := [?]u16{ + 0x1ABE, +} + +@(rodata) +me_ranges16 := [?]u16{ + 0x0488, 0x0489, + 0x20DD, 0x20E0, + 0x20E2, 0x20E4, + 0xA670, 0xA672, +} + +me_ranges := Range{ + single_16 = me_singles16[:], + ranges_16 = me_ranges16[:], +} + +@(rodata) +mn_singles16 := [?]u16{ + 0x05BF, 0x05C7, 0x0670, 0x0711, 0x07FD, 0x093A, 0x093C, 0x094D, 0x0981, 0x09BC, + 0x09CD, 0x09FE, 0x0A3C, 0x0A51, 0x0A75, 0x0ABC, 0x0ACD, 0x0B01, 0x0B3C, 0x0B3F, + 0x0B4D, 0x0B82, 0x0BC0, 0x0BCD, 0x0C00, 0x0C04, 0x0C3C, 0x0C81, 0x0CBC, 0x0CBF, + 0x0CC6, 0x0D4D, 0x0D81, 0x0DCA, 0x0DD6, 0x0E31, 0x0EB1, 0x0F35, 0x0F37, 0x0F39, + 0x0FC6, 0x1082, 0x108D, 0x109D, 0x17C6, 0x17DD, 0x180F, 0x18A9, 0x1932, 0x1A1B, + 0x1A56, 0x1A60, 0x1A62, 0x1A7F, 0x1B34, 0x1B3C, 0x1B42, 0x1BE6, 0x1BED, 0x1CED, + 0x1CF4, 0x20E1, 0x2D7F, 0xA66F, 0xA802, 0xA806, 0xA80B, 0xA82C, 0xA8FF, 0xA9B3, + 0xA9E5, 0xAA43, 0xAA4C, 0xAA7C, 0xAAB0, 0xAAC1, 0xAAF6, 0xABE5, 0xABE8, 0xABED, + 0xFB1E, +} + +@(rodata) +mn_ranges16 := [?]u16{ + 0x0300, 0x036F, + 0x0483, 0x0487, + 0x0591, 0x05BD, + 0x05C1, 0x05C2, + 0x05C4, 0x05C5, + 0x0610, 0x061A, + 0x064B, 0x065F, + 0x06D6, 0x06DC, + 0x06DF, 0x06E4, + 0x06E7, 0x06E8, + 0x06EA, 0x06ED, + 0x0730, 0x074A, + 0x07A6, 0x07B0, + 0x07EB, 0x07F3, + 0x0816, 0x0819, + 0x081B, 0x0823, + 0x0825, 0x0827, + 0x0829, 0x082D, + 0x0859, 0x085B, + 0x0897, 0x089F, + 0x08CA, 0x08E1, + 0x08E3, 0x0902, + 0x0941, 0x0948, + 0x0951, 0x0957, + 0x0962, 0x0963, + 0x09C1, 0x09C4, + 0x09E2, 0x09E3, + 0x0A01, 0x0A02, + 0x0A41, 0x0A42, + 0x0A47, 0x0A48, + 0x0A4B, 0x0A4D, + 0x0A70, 0x0A71, + 0x0A81, 0x0A82, + 0x0AC1, 0x0AC5, + 0x0AC7, 0x0AC8, + 0x0AE2, 0x0AE3, + 0x0AFA, 0x0AFF, + 0x0B41, 0x0B44, + 0x0B55, 0x0B56, + 0x0B62, 0x0B63, + 0x0C3E, 0x0C40, + 0x0C46, 0x0C48, + 0x0C4A, 0x0C4D, + 0x0C55, 0x0C56, + 0x0C62, 0x0C63, + 0x0CCC, 0x0CCD, + 0x0CE2, 0x0CE3, + 0x0D00, 0x0D01, + 0x0D3B, 0x0D3C, + 0x0D41, 0x0D44, + 0x0D62, 0x0D63, + 0x0DD2, 0x0DD4, + 0x0E34, 0x0E3A, + 0x0E47, 0x0E4E, + 0x0EB4, 0x0EBC, + 0x0EC8, 0x0ECE, + 0x0F18, 0x0F19, + 0x0F71, 0x0F7E, + 0x0F80, 0x0F84, + 0x0F86, 0x0F87, + 0x0F8D, 0x0F97, + 0x0F99, 0x0FBC, + 0x102D, 0x1030, + 0x1032, 0x1037, + 0x1039, 0x103A, + 0x103D, 0x103E, + 0x1058, 0x1059, + 0x105E, 0x1060, + 0x1071, 0x1074, + 0x1085, 0x1086, + 0x135D, 0x135F, + 0x1712, 0x1714, + 0x1732, 0x1733, + 0x1752, 0x1753, + 0x1772, 0x1773, + 0x17B4, 0x17B5, + 0x17B7, 0x17BD, + 0x17C9, 0x17D3, + 0x180B, 0x180D, + 0x1885, 0x1886, + 0x1920, 0x1922, + 0x1927, 0x1928, + 0x1939, 0x193B, + 0x1A17, 0x1A18, + 0x1A58, 0x1A5E, + 0x1A65, 0x1A6C, + 0x1A73, 0x1A7C, + 0x1AB0, 0x1ABD, + 0x1ABF, 0x1ADD, + 0x1AE0, 0x1AEB, + 0x1B00, 0x1B03, + 0x1B36, 0x1B3A, + 0x1B6B, 0x1B73, + 0x1B80, 0x1B81, + 0x1BA2, 0x1BA5, + 0x1BA8, 0x1BA9, + 0x1BAB, 0x1BAD, + 0x1BE8, 0x1BE9, + 0x1BEF, 0x1BF1, + 0x1C2C, 0x1C33, + 0x1C36, 0x1C37, + 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CE0, + 0x1CE2, 0x1CE8, + 0x1CF8, 0x1CF9, + 0x1DC0, 0x1DFF, + 0x20D0, 0x20DC, + 0x20E5, 0x20F0, + 0x2CEF, 0x2CF1, + 0x2DE0, 0x2DFF, + 0x302A, 0x302D, + 0x3099, 0x309A, + 0xA674, 0xA67D, + 0xA69E, 0xA69F, + 0xA6F0, 0xA6F1, + 0xA825, 0xA826, + 0xA8C4, 0xA8C5, + 0xA8E0, 0xA8F1, + 0xA926, 0xA92D, + 0xA947, 0xA951, + 0xA980, 0xA982, + 0xA9B6, 0xA9B9, + 0xA9BC, 0xA9BD, + 0xAA29, 0xAA2E, + 0xAA31, 0xAA32, + 0xAA35, 0xAA36, + 0xAAB2, 0xAAB4, + 0xAAB7, 0xAAB8, + 0xAABE, 0xAABF, + 0xAAEC, 0xAAED, + 0xFE00, 0xFE0F, + 0xFE20, 0xFE2F, +} + +@(rodata) +mn_singles32 := [?]i32{ + 0x101FD, 0x102E0, 0x10A3F, 0x11001, 0x11070, 0x110C2, 0x11173, 0x111CF, + 0x11234, 0x1123E, 0x11241, 0x112DF, 0x11340, 0x113CE, 0x113D0, 0x113D2, + 0x11446, 0x1145E, 0x114BA, 0x1163D, 0x116AB, 0x116AD, 0x116B7, 0x1171D, + 0x1171F, 0x1193E, 0x11943, 0x119E0, 0x11A47, 0x11B60, 0x11B66, 0x11C3F, + 0x11D3A, 0x11D47, 0x11D95, 0x11D97, 0x11F40, 0x11F42, 0x11F5A, 0x13440, + 0x16F4F, 0x16FE4, 0x1DA75, 0x1DA84, 0x1E08F, 0x1E2AE, 0x1E6E3, 0x1E6E6, + 0x1E6F5, +} + +@(rodata) +mn_ranges32 := [?]i32{ + 0x10376, 0x1037A, + 0x10A01, 0x10A03, + 0x10A05, 0x10A06, + 0x10A0C, 0x10A0F, + 0x10A38, 0x10A3A, + 0x10AE5, 0x10AE6, + 0x10D24, 0x10D27, + 0x10D69, 0x10D6D, + 0x10EAB, 0x10EAC, + 0x10EFA, 0x10EFF, + 0x10F46, 0x10F50, + 0x10F82, 0x10F85, + 0x11038, 0x11046, + 0x11073, 0x11074, + 0x1107F, 0x11081, + 0x110B3, 0x110B6, + 0x110B9, 0x110BA, + 0x11100, 0x11102, + 0x11127, 0x1112B, + 0x1112D, 0x11134, + 0x11180, 0x11181, + 0x111B6, 0x111BE, + 0x111C9, 0x111CC, + 0x1122F, 0x11231, + 0x11236, 0x11237, + 0x112E3, 0x112EA, + 0x11300, 0x11301, + 0x1133B, 0x1133C, + 0x11366, 0x1136C, + 0x11370, 0x11374, + 0x113BB, 0x113C0, + 0x113E1, 0x113E2, + 0x11438, 0x1143F, + 0x11442, 0x11444, + 0x114B3, 0x114B8, + 0x114BF, 0x114C0, + 0x114C2, 0x114C3, + 0x115B2, 0x115B5, + 0x115BC, 0x115BD, + 0x115BF, 0x115C0, + 0x115DC, 0x115DD, + 0x11633, 0x1163A, + 0x1163F, 0x11640, + 0x116B0, 0x116B5, + 0x11722, 0x11725, + 0x11727, 0x1172B, + 0x1182F, 0x11837, + 0x11839, 0x1183A, + 0x1193B, 0x1193C, + 0x119D4, 0x119D7, + 0x119DA, 0x119DB, + 0x11A01, 0x11A0A, + 0x11A33, 0x11A38, + 0x11A3B, 0x11A3E, + 0x11A51, 0x11A56, + 0x11A59, 0x11A5B, + 0x11A8A, 0x11A96, + 0x11A98, 0x11A99, + 0x11B62, 0x11B64, + 0x11C30, 0x11C36, + 0x11C38, 0x11C3D, + 0x11C92, 0x11CA7, + 0x11CAA, 0x11CB0, + 0x11CB2, 0x11CB3, + 0x11CB5, 0x11CB6, + 0x11D31, 0x11D36, + 0x11D3C, 0x11D3D, + 0x11D3F, 0x11D45, + 0x11D90, 0x11D91, + 0x11EF3, 0x11EF4, + 0x11F00, 0x11F01, + 0x11F36, 0x11F3A, + 0x13447, 0x13455, + 0x1611E, 0x16129, + 0x1612D, 0x1612F, + 0x16AF0, 0x16AF4, + 0x16B30, 0x16B36, + 0x16F8F, 0x16F92, + 0x1BC9D, 0x1BC9E, + 0x1CF00, 0x1CF2D, + 0x1CF30, 0x1CF46, + 0x1D167, 0x1D169, + 0x1D17B, 0x1D182, + 0x1D185, 0x1D18B, + 0x1D1AA, 0x1D1AD, + 0x1D242, 0x1D244, + 0x1DA00, 0x1DA36, + 0x1DA3B, 0x1DA6C, + 0x1DA9B, 0x1DA9F, + 0x1DAA1, 0x1DAAF, + 0x1E000, 0x1E006, + 0x1E008, 0x1E018, + 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, + 0x1E026, 0x1E02A, + 0x1E130, 0x1E136, + 0x1E2EC, 0x1E2EF, + 0x1E4EC, 0x1E4EF, + 0x1E5EE, 0x1E5EF, + 0x1E6EE, 0x1E6EF, + 0x1E8D0, 0x1E8D6, + 0x1E944, 0x1E94A, + 0xE0100, 0xE01EF, +} + +mn_ranges := Range{ + single_16 = mn_singles16[:], + ranges_16 = mn_ranges16[:], + single_32 = mn_singles32[:], + ranges_32 = mn_ranges32[:], +} + @(rodata) nd_ranges16 := [?]u16{ 0x0030, 0x0039, @@ -1743,6 +2182,21 @@ so_ranges := Range{ ranges_32 = so_ranges32[:], } +@(rodata) +zs_singles16 := [?]u16{ + 0x0020, 0x00A0, 0x1680, 0x202F, 0x205F, 0x3000, +} + +@(rodata) +zs_ranges16 := [?]u16{ + 0x2000, 0x200A, +} + +zs_ranges := Range{ + single_16 = zs_singles16[:], + ranges_16 = zs_ranges16[:], +} + @(rodata) extra_digits_singles16 := [?]u16{ 0x00B9, 0x19DA, 0x2070, 0x24EA, 0x24FF, diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index c6df96f3f..92aee9a68 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -197,6 +197,15 @@ is_graphic :: proc(r: rune) -> bool { if u32(r) <= MAX_LATIN1 { return char_properties[u8(r)]&pg != 0 } + + if is_letter(r) || is_number(r) || is_punct(r) || is_symbol(r) || in_range(r, zs_ranges) { + return true + } + + if in_range(r, mc_ranges) || in_range(r, me_ranges) || in_range(r, mn_ranges) { + return true + } + return false } diff --git a/core/unicode/tools/generate_unicode.odin b/core/unicode/tools/generate_unicode.odin index 27cee0012..f2d07442a 100644 --- a/core/unicode/tools/generate_unicode.odin +++ b/core/unicode/tools/generate_unicode.odin @@ -278,9 +278,9 @@ main :: proc() { // .Lo, // Other_Letter, other letters, including syllables and ideographs // .Lt, // Titlecase_Letter, a digraph encoded as a single character, with first part uppercase // .Lu, // Uppercase_Letter, an uppercase letter - .Mc, // Spacing_Mark, a spacing combining mark (positive advance width) - .Me, // Enclosing_Mark, an enclosing combining mark - .Mn, // Nonspacing_Mark, a nonspacing combining mark (zero advance width) + // .Mc, // Spacing_Mark, a spacing combining mark (positive advance width) + // .Me, // Enclosing_Mark, an enclosing combining mark + // .Mn, // Nonspacing_Mark, a nonspacing combining mark (zero advance width) //.Nd, // Decimal_Number, a decimal digit //.Nl, // Letter_Number, a letterlike numeric character //.No, // Other_Number, a numeric character of other type @@ -295,9 +295,9 @@ main :: proc() { // .Sk, // Modifier_Symbol, a non-letterlike modifier symbol // .Sm, // Math_Symbol, a symbol of mathematical use // .So, // Other_Symbol, a symbol of other type - .Zl, // Line_Separator, U+2028 LINE SEPARATOR only - .Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only - .Zs, // Space_Separator, a space character (of various non-zero widths) + .Zl, // Line_Separator, U+2028 LINE SEPARATOR only + .Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only + //.Zs, // Space_Separator, a space character (of various non-zero widths) } write_loop : for gc, i in general_category_ranges { From 3f330752cdbdca68d76385e712b5d8d8e7e1cb6d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Mar 2026 16:25:35 +0100 Subject: [PATCH 065/273] Replace iterators; fixes line ending handling --- .../tools/{ => ucd}/generate_unicode.odin | 34 ++++----- core/unicode/tools/ucd/iterator.odin | 70 ------------------- core/unicode/tools/ucd/ucd.odin | 44 ++++++++---- 3 files changed, 47 insertions(+), 101 deletions(-) rename core/unicode/tools/{ => ucd}/generate_unicode.odin (93%) delete mode 100644 core/unicode/tools/ucd/iterator.odin diff --git a/core/unicode/tools/generate_unicode.odin b/core/unicode/tools/ucd/generate_unicode.odin similarity index 93% rename from core/unicode/tools/generate_unicode.odin rename to core/unicode/tools/ucd/generate_unicode.odin index f2d07442a..36b6e2ac4 100644 --- a/core/unicode/tools/generate_unicode.odin +++ b/core/unicode/tools/ucd/generate_unicode.odin @@ -1,4 +1,5 @@ -package main +package ucd + import "core:fmt" import path "core:path/filepath" import "core:os" @@ -7,7 +8,6 @@ import "base:runtime" import "core:mem" import "core:io" import "core:log" -import "ucd" // Table 2-3. Types of Code Points // Table 4-4. General_Category Values page 229 @@ -16,7 +16,7 @@ import "ucd" /* -Formats a ucd.Dynamic_Range into a set of fixed length arrays and writes +Formats a Dynamic_Range into a set of fixed length arrays and writes corresponding to a io.Writer. The value of the parameter `name`will be used as a prefix to the array names. If a dynamic array contained in the `range` is empty, no corresponding fixed length array will be written. @@ -24,12 +24,12 @@ no corresponding fixed length array will be written. Inputs: - writer: The io.Writer to be written to. - name: Prefix to add to any array that is written to `writer` -- range: The ucd.Dynamic_Range to format and write to writer. +- range: The Dynamic_Range to format and write to writer. */ write_range_arrays :: proc( writer: io.Writer, name: string, - range : ucd.Dynamic_Range, + range : Dynamic_Range, ) -> int { n_written : int if len(range.single_16) > 0 { @@ -98,8 +98,8 @@ write_range_arrays :: proc( write_range :: proc( writer: io.Writer, name: union{string, - ucd.General_Category}, - range: ucd.Dynamic_Range, + General_Category}, + range: Dynamic_Range, ) -> (n_written: int) { buffer: [128]byte str: string @@ -110,7 +110,7 @@ write_range :: proc( runtime.mem_copy(&buffer[0], raw_data(n), len(n)) str = transmute(string) buffer[0:len(n)] - case ucd.General_Category: + case General_Category: str = fmt.bprintf(buffer[:], "%s", n) } @@ -221,28 +221,28 @@ main :: proc() { "tests","core","assets","UCD","UnicodeData.txt"}, context.allocator) defer delete(ucd_path) - unicode_data, ucd_err := ucd.load_unicode_data(ucd_path) + unicode_data, ucd_err := load_unicode_data(ucd_path) if ucd_err != nil { log.errorf("Error loading Unicode data. %s", ucd_err) } - defer ucd.destroy_unicode_data(unicode_data) + defer destroy_unicode_data(unicode_data) - general_category_ranges := ucd.gc_ranges(&unicode_data) - defer ucd.destroy_general_category_ranges(general_category_ranges) + general_category_ranges := gc_ranges(&unicode_data) + defer destroy_general_category_ranges(general_category_ranges) - extra_digits := ucd.extra_digits(&unicode_data) - defer ucd.destroy_dynamic_range(extra_digits) + extra_digits := extra_digits(&unicode_data) + defer destroy_dynamic_range(extra_digits) proplist_path, _ := path.join({ODIN_ROOT, "tests","core","assets","UCD","PropList.txt"}, context.allocator) defer delete(proplist_path) - proplist, proplist_err := ucd.load_protperty_list(proplist_path) + proplist, proplist_err := load_protperty_list(proplist_path) if proplist_err != nil { log.errorf("Error loading PropList.txt. %s", proplist_err) return } - defer ucd.destroy_protperty_list(proplist) + defer destroy_protperty_list(proplist) @@ -267,7 +267,7 @@ main :: proc() { //List of the general categories to skip when generating the code for //core/unicode/generated.txt. - to_exclude := [?]ucd.General_Category{ + to_exclude := [?]General_Category{ .Cc, // Control, a C0 or C1 control code .Cf, // Format, a format control character .Cn, // Unassigned, a reserved unassigned code point or a noncharacter diff --git a/core/unicode/tools/ucd/iterator.odin b/core/unicode/tools/ucd/iterator.odin deleted file mode 100644 index 53424466f..000000000 --- a/core/unicode/tools/ucd/iterator.odin +++ /dev/null @@ -1,70 +0,0 @@ -package ucd - -/* -An iterator that allows simple iterating over the lines of of a slice of bytes, []byte, -without allocating. Each line must end in a new line, i.e., '\n' -*/ -Line_Iterator :: struct { - index: int, // current location in data - data: []byte, // Data over which to iterate - line_counter: int, // line number storage -} - -line_iterator :: proc(it: ^Line_Iterator) -> (line: []byte, line_number: int, more: bool) { - more = it.index < len(it.data) - if more { - it.line_counter += 1 - line_number = it.line_counter - } else { - return - } - start:= it.index - for it.index < len(it.data) && it.data[it.index] != '\n' && it.data[it.index] != '#' do it.index += 1 - line = it.data[start:it.index] - //index = start - - if it.index < len(it.data) && it.data[it.index] == '#' { - for it.index < len(it.data) && it.data[it.index] != '\n' do it.index += 1 - } - if it.index < len(it.data) && it.data[it.index] == '\n' do it.index += 1 - return -} - -Field_Iterator :: struct { - index: int, - field_counter: int, - line: []byte, -} - -field_iterator :: proc(it: ^Field_Iterator) -> (field: []byte, field_count: int, valid: bool) { - valid = it.index < len(it.line) && it.line[it.index] != '\n' && it.line[it.index] != '#' - if !valid do return - - if it.index < len(it.line) && it.index != 0 && it.line[it.index] == ';' do it. index += 1 - - start := it.index - for it.index < len(it.line) && it.line[it.index] != ';' && it.line[it.index] != '#' do it.index += 1 - - field = it.line[start:it.index] - temp := field - - // Remove leading spaces - for b, i in temp { - if b != ' ' { - field = temp[i:] - break - } - } - - // Remove trailing spaces - temp = field - for b, i in temp { - if b != ' ' { - field = temp[0:i+1] - } - } - - field_count = it.field_counter - it.field_counter += 1 - return -} diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index 9f815d386..0a6641b4a 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -15,14 +15,17 @@ load_unicode_data :: proc( } defer free_all(context.temp_allocator) - line_iter := Line_Iterator{data = data } + // line_iter := Line_Iterator{data = data } first_cp: rune - line_loop: for line, line_num in line_iterator(&line_iter) { - // Skip empty lines + str := string(data) + line_no := 1 + line_loop: for _line in strings.split_lines_iterator(&str) { + defer line_no += 1 + line, _, _ := strings.partition(_line, "#") if len(line) == 0 do continue - field_iter := Field_Iterator{line = line} + // field_iter := Field_Iterator{line = line} is_range := false cp: rune name: string @@ -33,7 +36,11 @@ load_unicode_data :: proc( nt := Numeric_Type.None nv : Numberic_Value - for field, field_num in field_iterator(&field_iter) { + field_num := 0 + for field in strings.split_iterator(&line, ";") { + defer field_num += 1 + field := strings.trim_space(field) + switch field_num { case 0: // Code point cp = 0 @@ -52,10 +59,10 @@ load_unicode_data :: proc( } if len(field) > 9 && field[0] == '<' && strings.ends_with(transmute(string) field, ", Last>") { - name = strings.clone_from_bytes(field[1:len(field)-7], allocator) + name = strings.clone(field[1:len(field)-7], allocator) is_range = true } else { - name = strings.clone_from_bytes(field[:], allocator) + name = strings.clone(field[:], allocator) } case 2: // General_Category @@ -236,6 +243,8 @@ destroy_protperty_list :: proc( } } +import "core:fmt" + load_protperty_list :: proc ( filename : string, allocator := context.allocator, @@ -251,16 +260,26 @@ load_protperty_list :: proc ( line_iter := Line_Iterator{ data = data } - for line in line_iterator(&line_iter) { + + str := string(data) + line_no := 1 + for _line in strings.split_lines_iterator(&str) { + defer line_no += 1 + line, _, _ := strings.partition(_line, "#") if len(line) == 0 do continue - field_iter := Field_Iterator{ line = line} + fmt.printfln("%d: %q", line_no, line) is_range: bool rr : Range_Rune prop: PropList_Property - for field, i in field_iterator(&field_iter) { + i := 0 + for field in strings.split_iterator(&line, ";") { + defer i += 1 + field := strings.trim_space(field) + fmt.printfln("%d: %q", i, field) + switch i { case 0: // Code point or code point range for c in field { @@ -302,7 +321,4 @@ load_protperty_list :: proc ( } return -} - - - +} \ No newline at end of file From 7b79f28522698150f8f8a87e687cc19e77a582b6 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Mar 2026 16:47:53 +0100 Subject: [PATCH 066/273] Allow compiling with `-vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do` Support the same strict flags as used throughout the CI tests. --- core/unicode/generated.odin | 16 +-- core/unicode/tools/ucd/generate_unicode.odin | 129 ++++++++----------- core/unicode/tools/ucd/string_to.odin | 50 ++++--- core/unicode/tools/ucd/ucd.odin | 115 +++++++---------- 4 files changed, 133 insertions(+), 177 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index 85d4e9e8b..7a29e56ce 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -4,7 +4,7 @@ package unicode ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ DO NOT EDIT ------ GENERATED ------ */ -/* +/* This file is generated from UnicodeData.txt and PropList.txt. These files are part of the Unicode Database (UCD) and are covered by the license listed further down. They may be downloaded from the following locations; @@ -15,17 +15,17 @@ package unicode ------------------------------------------------------------------------------ UNICODE LICENSE V3 - + COPYRIGHT AND PERMISSION NOTICE - + Copyright © 1991-2026 Unicode, Inc. - + NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. - + Permission is hereby granted, free of charge, to any person obtaining a copy of data files and any associated documentation (the "Data Files") or software and any associated documentation (the "Software") to deal in the @@ -36,19 +36,19 @@ package unicode this copyright and permission notice appear with all copies of the Data Files or Software, or (b) this copyright and permission notice appear in associated Documentation. - + THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. - + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. - + Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written diff --git a/core/unicode/tools/ucd/generate_unicode.odin b/core/unicode/tools/ucd/generate_unicode.odin index 36b6e2ac4..ffa8a3be3 100644 --- a/core/unicode/tools/ucd/generate_unicode.odin +++ b/core/unicode/tools/ucd/generate_unicode.odin @@ -1,7 +1,6 @@ package ucd import "core:fmt" -import path "core:path/filepath" import "core:os" import "core:strings" import "base:runtime" @@ -26,16 +25,12 @@ Inputs: - name: Prefix to add to any array that is written to `writer` - range: The Dynamic_Range to format and write to writer. */ -write_range_arrays :: proc( - writer: io.Writer, - name: string, - range : Dynamic_Range, -) -> int { +write_range_arrays :: proc(writer: io.Writer, name: string, range: Dynamic_Range) -> int { n_written : int - if len(range.single_16) > 0 { + if len(range.single_16) > 0 { n_written += fmt.wprintln(writer, "@(rodata)") n_written += fmt.wprintf(writer, "%s_singles16 := [?]u16{{", name) - line_length := 100 + line_length := 100 for v in range.single_16 { str_buffer : [32]byte str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) @@ -52,7 +47,7 @@ write_range_arrays :: proc( } n_written += fmt.wprintln(writer, "\n}\n") } - + if len(range.ranges_16) > 0 { n_written += fmt.wprintln(writer, "@(rodata)") n_written += fmt.wprintfln(writer, "%s_ranges16 := [?]u16{{", name) @@ -70,7 +65,7 @@ write_range_arrays :: proc( str_buffer : [32]byte str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) - if line_length + len(str) > 80 { + if line_length + len(str) > 80 { n_written += fmt.wprint(writer, "\n") line_length = fmt.wprintf(writer, "\t0x%4X,",v) n_written += line_length @@ -95,12 +90,7 @@ write_range_arrays :: proc( return n_written } -write_range :: proc( - writer: io.Writer, - name: union{string, - General_Category}, - range: Dynamic_Range, -) -> (n_written: int) { +write_range :: proc(writer: io.Writer, name: union{string, General_Category}, range: Dynamic_Range) -> (n_written: int) { buffer: [128]byte str: string @@ -124,16 +114,16 @@ write_range :: proc( n_written += fmt.wprintfln(writer, "%s_ranges := Range{{", str) if len(range.single_16) > 0 { - n_written += fmt.wprintfln(writer, "\tsingle_16 = %s_singles16[:],", str) + n_written += fmt.wprintfln(writer, "\tsingle_16 = %s_singles16[:],", str) } if len(range.ranges_16) > 0 { - n_written += fmt.wprintfln(writer, "\tranges_16 = %s_ranges16[:],", str) + n_written += fmt.wprintfln(writer, "\tranges_16 = %s_ranges16[:],", str) } if len(range.single_32) > 0 { - n_written += fmt.wprintfln(writer, "\tsingle_32 = %s_singles32[:],", str) + n_written += fmt.wprintfln(writer, "\tsingle_32 = %s_singles32[:],", str) } if len(range.ranges_32) > 0 { - n_written += fmt.wprintfln(writer, "\tranges_32 = %s_ranges32[:],", str) + n_written += fmt.wprintfln(writer, "\tranges_32 = %s_ranges32[:],", str) } n_written += fmt.wprintln(writer, "}\n") @@ -145,7 +135,7 @@ GENERATED :: `/* */ ` -MESSAGE :: `/* +MESSAGE :: `/* This file is generated from UnicodeData.txt and PropList.txt. These files are part of the Unicode Database (UCD) and are covered by the license listed further down. They may be downloaded from the following locations; @@ -156,17 +146,17 @@ MESSAGE :: `/* ------------------------------------------------------------------------------ UNICODE LICENSE V3 - + COPYRIGHT AND PERMISSION NOTICE - + Copyright © 1991-2026 Unicode, Inc. - + NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. - + Permission is hereby granted, free of charge, to any person obtaining a copy of data files and any associated documentation (the "Data Files") or software and any associated documentation (the "Software") to deal in the @@ -177,19 +167,19 @@ MESSAGE :: `/* this copyright and permission notice appear with all copies of the Data Files or Software, or (b) this copyright and permission notice appear in associated Documentation. - + THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. - + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. - + Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written @@ -217,9 +207,7 @@ main :: proc() { context.logger = log.create_console_logger() defer log.destroy_console_logger(context.logger) - ucd_path, _ := path.join({ODIN_ROOT, - "tests","core","assets","UCD","UnicodeData.txt"}, context.allocator) - defer delete(ucd_path) + ucd_path := ODIN_ROOT + "tests/core/assets/UCD/UnicodeData.txt" unicode_data, ucd_err := load_unicode_data(ucd_path) if ucd_err != nil { @@ -234,39 +222,34 @@ main :: proc() { defer destroy_dynamic_range(extra_digits) - proplist_path, _ := path.join({ODIN_ROOT, - "tests","core","assets","UCD","PropList.txt"}, context.allocator) - defer delete(proplist_path) - proplist, proplist_err := load_protperty_list(proplist_path) + proplist_path := ODIN_ROOT + "tests/core/assets/UCD/PropList.txt" + proplist, proplist_err := load_property_list(proplist_path) if proplist_err != nil { log.errorf("Error loading PropList.txt. %s", proplist_err) return } - defer destroy_protperty_list(proplist) + defer destroy_property_list(proplist) + sb := strings.builder_make_len_cap(0, 1024*32) + defer strings.builder_destroy(&sb) + writer := strings.to_writer(&sb) - sb := strings.builder_make_len_cap(0, 1024*32) - defer strings.builder_destroy(&sb) - - - writer := strings.to_writer(&sb) - - fmt.wprintfln(writer, "package unicode\n") - fmt.wprintln(writer, GENERATED) - fmt.wprintln(writer, MESSAGE) - - Range_Type :: "Range :: struct {\n" + - "\tsingle_16 : []u16,\n" + - "\tranges_16 : []u16,\n" + - "\tsingle_32 : []i32,\n" + - "\tranges_32 : []i32,\n" + - "}\n" - - fmt.wprintfln(writer, "%s", Range_Type) + fmt.wprintfln(writer, "package unicode\n") + fmt.wprintln(writer, GENERATED) + fmt.wprintln(writer, MESSAGE) + + Range_Type :: "Range :: struct {\n" + + "\tsingle_16 : []u16,\n" + + "\tranges_16 : []u16,\n" + + "\tsingle_32 : []i32,\n" + + "\tranges_32 : []i32,\n" + + "}\n" + + fmt.wprintfln(writer, "%s", Range_Type) //List of the general categories to skip when generating the code for - //core/unicode/generated.txt. + //core/unicode/generated.txt. to_exclude := [?]General_Category{ .Cc, // Control, a C0 or C1 control code .Cf, // Format, a format control character @@ -299,27 +282,23 @@ main :: proc() { .Zp, // Paragraph_Separator, U+2029 PARAGRAPH SEPARATOR only //.Zs, // Space_Separator, a space character (of various non-zero widths) } - - write_loop : for gc, i in general_category_ranges { - for excluded in to_exclude { - if i == excluded do continue write_loop - } - write_range(writer, i, gc) - } - write_range(writer, "extra_digits", extra_digits ) - - write_range(writer,"other_lowercase", proplist[.Other_Lowercase]) - write_range(writer,"other_uppercase", proplist[.Other_Uppercase]) + write_loop : for gc, i in general_category_ranges { + for excluded in to_exclude { + if i == excluded { + continue write_loop + } + } + write_range(writer, i, gc) + } - file_name, _ := path.join({ODIN_ROOT, "core", "unicode", "generated.odin"}, context.allocator) - defer delete(file_name) - - str := strings.to_string(sb) + write_range(writer, "extra_digits", extra_digits) + write_range(writer, "other_lowercase", proplist[.Other_Lowercase]) + write_range(writer, "other_uppercase", proplist[.Other_Uppercase]) - write_error := os.write_entire_file_from_string(file_name, str) - if write_error != nil { - log.errorf("Error writting %s. %s", file_name, write_error) - } -} + file_name := ODIN_ROOT + "core/unicode/generated.odin" + if write_error := os.write_entire_file_from_string(file_name, strings.to_string(sb)); write_error != nil { + log.errorf("Error %v writing %q", write_error, file_name) + } +} \ No newline at end of file diff --git a/core/unicode/tools/ucd/string_to.odin b/core/unicode/tools/ucd/string_to.odin index 5ca0f40fe..7c9115f21 100644 --- a/core/unicode/tools/ucd/string_to.odin +++ b/core/unicode/tools/ucd/string_to.odin @@ -214,55 +214,53 @@ string_to_paired_bracket_type :: proc "contextless"(str: string) -> Paired_Brack string_to_bidi_class :: proc "contextless"(str: string) -> Bidi_Class { switch str { - case "AL": + case "AL": return .AL - case "AN": + case "AN": return .AN - case "B": + case "B": return .B - case "BN": + case "BN": return .BN - case "CS": + case "CS": return .CS - case "EN": + case "EN": return .EN - case "ES": + case "ES": return .ES - case "ET": + case "ET": return .ET - case "FSI": + case "FSI": return .FSI - case "L": + case "L": return .L - case "LRE": + case "LRE": return .LRE - case "LRI": + case "LRI": return .LRI - case "LRO": + case "LRO": return .LRO - case "NSM": + case "NSM": return .NSM - case "ON": + case "ON": return .ON - case "PDF": + case "PDF": return .PDF - case "PDI": + case "PDI": return .PDI - case "R": + case "R": return .R - case "RLE": + case "RLE": return .RLE - case "RLI": + case "RLI": return .RLI - case "RLO": + case "RLO": return .RLO - case "S": + case "S": return .S - case "WS": + case "WS": return .WS - case: - // TODO: Add error for this - unreachable() + case: unreachable() // TODO: Add error for this } } diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index 0a6641b4a..0277b5b15 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -2,20 +2,12 @@ package ucd import "core:strings" import "core:os" +// import "core:fmt" -load_unicode_data :: proc( - filename: string, - allocator := context.allocator, -) -> (unicode_data : Unicode_Data, err: Error) { - - data, os_error := os.read_entire_file(filename, context.temp_allocator) - if os_error != nil { - err = os_error - return - } +load_unicode_data :: proc(filename: string, allocator := context.allocator) -> (unicode_data: Unicode_Data, err: Error) { + data := os.read_entire_file(filename, context.temp_allocator) or_return defer free_all(context.temp_allocator) - // line_iter := Line_Iterator{data = data } first_cp: rune str := string(data) @@ -23,7 +15,7 @@ load_unicode_data :: proc( line_loop: for _line in strings.split_lines_iterator(&str) { defer line_no += 1 line, _, _ := strings.partition(_line, "#") - if len(line) == 0 do continue + if len(line) == 0 { continue } // field_iter := Field_Iterator{line = line} is_range := false @@ -34,31 +26,29 @@ load_unicode_data :: proc( num_6 : string num_7 : string nt := Numeric_Type.None - nv : Numberic_Value field_num := 0 - for field in strings.split_iterator(&line, ";") { + for _field in strings.split_iterator(&line, ";") { defer field_num += 1 - field := strings.trim_space(field) + field := strings.trim_space(_field) switch field_num { case 0: // Code point cp = 0 for c in field { - if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') do break + if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') { break } cp *= 16 - cp += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') - cp += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + cp += (c - '0') if c >= '0' && c <= '9' else (c - 'A' + 10) } case 1: // Name - if len(field) > 9 && field[0] == '<' && strings.ends_with(transmute(string) field, ", First>") { + if len(field) > 9 && field[0] == '<' && strings.ends_with(field, ", First>") { first_cp = cp continue line_loop } - if len(field) > 9 && field[0] == '<' && strings.ends_with(transmute(string) field, ", Last>") { + if len(field) > 9 && field[0] == '<' && strings.ends_with(field, ", Last>") { name = strings.clone(field[1:len(field)-7], allocator) is_range = true } else { @@ -67,27 +57,27 @@ load_unicode_data :: proc( case 2: // General_Category // NOTE: This is currently igorning a possible error it should probably be fixed - gc, _ = string_to_general_category(transmute(string)field) + gc, _ = string_to_general_category(field) case 3: // Canonical_Combining_Class case 4: // Bidi Class case 5: // Decomposition_Type and Decomposition_Mapping // Numeric_Type and Numberic_Value case 6: - num_6 = transmute(string)field + num_6 = field case 7: - num_7 = transmute(string)field + num_7 = field case 8: switch { - case num_6 != "" && num_7 != "" && transmute(string) field != "" : + case num_6 != "" && num_7 != "" && field != "" : nt = .Decimal - case num_6 == "" && num_7 != "" && transmute(string) field != "" : + case num_6 == "" && num_7 != "" && field != "" : nt = .Digit - case num_6 == "" && num_7 == "" && transmute(string) field != "" : + case num_6 == "" && num_7 == "" && field != "" : nt = .Numeric case: @@ -154,12 +144,14 @@ gc_ranges :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (lst: [G range.last = -1 } - range.first = transmute(rune) min(transmute(u32)range.first, transmute(u32)p.cp) + range.first = rune(min(u32(range.first), u32(p.cp))) gc = p.gc range.last = p.cp case Char_Range: - if range.first != -1 do append_to_dynamic_range(&lst[gc], range, allocator) + if range.first != -1 { + append_to_dynamic_range(&lst[gc], range, allocator) + } range.first = p.first_cp range.last = p.last_cp @@ -168,7 +160,9 @@ gc_ranges :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (lst: [G range.last = -1 } } - if range.first != -1 do append_to_dynamic_range(&lst[gc], range, allocator) + if range.first != -1 { + append_to_dynamic_range(&lst[gc], range, allocator) + } return } @@ -194,14 +188,16 @@ extra_digits :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (Dyna } if exd_type { - range.first = transmute(rune) min(transmute(u32)range.first, transmute(u32)p.cp) + range.first = rune(min(u32(range.first), u32(p.cp))) range.last = p.cp } case Char_Range: exd_type := p.gc != .Nd && (p.nt == .Decimal || p.nt == .Digit) - if range.first != -1 do append_to_dynamic_range(&exd, range, allocator) + if range.first != -1 { + append_to_dynamic_range(&exd, range, allocator) + } if exd_type { range.first = p.first_cp @@ -212,29 +208,28 @@ extra_digits :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (Dyna range.last = -1 } } - if range.first != -1 do append_to_dynamic_range(&exd, range, allocator) + if range.first != -1 { + append_to_dynamic_range(&exd, range, allocator) + } return exd } /* -Data containted in the Unicode fiel PropList.txt +Data contained in the Unicode fiel PropList.txt -A `PropList` is the data containted in the Unicode Database (UCD) file -PropList.txt. It is created with the procedure `load_property_list` and -destroy with the procedure `destroy_property_list`. +A `Prop_List` is the data contained in the Unicode Database (UCD) file `PropList.txt`. +It is created with the procedure `load_property_list` and destroyed with the procedure `destroy_property_list`. */ -PropList ::[PropList_Property]Dynamic_Range +Prop_List :: [PropList_Property]Dynamic_Range /* -This function destroys a `PropList` created by `load_property_list`. +This function destroys a `Prop_List` created by `load_property_list`. Inputs: -- props: The PropList to destroy +- props: The Prop_List to destroy */ -destroy_protperty_list :: proc( - props: [PropList_Property]Dynamic_Range, -){ +destroy_property_list :: proc(props: Prop_List) { for r in props { delete(r.ranges_16) delete(r.ranges_32) @@ -243,31 +238,18 @@ destroy_protperty_list :: proc( } } -import "core:fmt" -load_protperty_list :: proc ( - filename : string, - allocator := context.allocator, -) -> (props: [PropList_Property]Dynamic_Range, err: Error) { - data, os_error := os.read_entire_file(filename, allocator) - if os_error != nil { - err = os_error - return - } +load_property_list :: proc(filename: string, allocator := context.allocator) -> (props: Prop_List, err: Error) { + data := os.read_entire_file(filename, allocator) or_return defer delete(data) - line_iter := Line_Iterator{ - data = data - } - str := string(data) - line_no := 1 for _line in strings.split_lines_iterator(&str) { - defer line_no += 1 line, _, _ := strings.partition(_line, "#") - if len(line) == 0 do continue - fmt.printfln("%d: %q", line_no, line) + if len(line) == 0 { + continue + } is_range: bool @@ -275,10 +257,9 @@ load_protperty_list :: proc ( prop: PropList_Property i := 0 - for field in strings.split_iterator(&line, ";") { + for _field in strings.split_iterator(&line, ";") { defer i += 1 - field := strings.trim_space(field) - fmt.printfln("%d: %q", i, field) + field := strings.trim_space(_field) switch i { case 0: // Code point or code point range @@ -295,18 +276,16 @@ load_protperty_list :: proc ( } if is_range { rr.last *= 16 - rr.last += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') - rr.last += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + rr.last += (c - '0') if (c >= '0' && c <= '9') else (c - 'A' + 10) } else { rr.first *= 16 - rr.first += cast(rune)(c >= '0' && c <= '9') * cast(rune)(c - '0') - rr.first += cast(rune)(c >= 'A' && c <= 'F') * cast(rune)(c - 'A' + 10) + rr.first += (c - '0') if (c >= '0' && c <= '9') else (c - 'A' + 10) rr.last = rr.first } } case 1: - prop, err = string_to_proplist_property(transmute(string)field) + prop, err = string_to_proplist_property(field) if err != nil { return } From 7928d1b92c2c57253e96320a7cb60aa1a43d81da Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Mar 2026 17:22:23 +0100 Subject: [PATCH 067/273] Simplify --- core/unicode/tools/ucd/ucd.odin | 70 ++++++++++++++------------------- 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index 0277b5b15..27eb1ebb7 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -2,7 +2,28 @@ package ucd import "core:strings" import "core:os" -// import "core:fmt" +import "core:strconv" + +decode_rune :: proc(str: string) -> (cp1, cp2: rune, err: Error) { + head, _, tail := strings.partition(str, "..") + + if _cp1, _ok := strconv.parse_int(head, 16); !_ok { + return 0, 0, .Invalid_Hex_Number + } else { + cp1 = rune(_cp1) + } + + if len(tail) == 0 { + return cp1, cp1, nil + } + + if _cp2, _ok := strconv.parse_int(tail, 16); !_ok { + return 0, 0, .Invalid_Hex_Number + } else { + cp2 = rune(_cp2) + } + return +} load_unicode_data :: proc(filename: string, allocator := context.allocator) -> (unicode_data: Unicode_Data, err: Error) { data := os.read_entire_file(filename, context.temp_allocator) or_return @@ -11,13 +32,12 @@ load_unicode_data :: proc(filename: string, allocator := context.allocator) -> ( first_cp: rune str := string(data) - line_no := 1 line_loop: for _line in strings.split_lines_iterator(&str) { - defer line_no += 1 line, _, _ := strings.partition(_line, "#") - if len(line) == 0 { continue } + if len(line) == 0 { + continue + } - // field_iter := Field_Iterator{line = line} is_range := false cp: rune name: string @@ -34,13 +54,7 @@ load_unicode_data :: proc(filename: string, allocator := context.allocator) -> ( switch field_num { case 0: // Code point - cp = 0 - - for c in field { - if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') { break } - cp *= 16 - cp += (c - '0') if c >= '0' && c <= '9' else (c - 'A' + 10) - } + cp, _ = decode_rune(field) or_return case 1: // Name if len(field) > 9 && field[0] == '<' && strings.ends_with(field, ", First>") { @@ -251,11 +265,9 @@ load_property_list :: proc(filename: string, allocator := context.allocator) -> continue } - is_range: bool + rr: Range_Rune + prop: PropList_Property - rr : Range_Rune - - prop: PropList_Property i := 0 for _field in strings.split_iterator(&line, ";") { defer i += 1 @@ -263,32 +275,10 @@ load_property_list :: proc(filename: string, allocator := context.allocator) -> switch i { case 0: // Code point or code point range - for c in field { - if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'F') { - if c == '.' { - is_range = true - rr.last = 0 - continue - } else { - err = UCD_Error.Invalid_Hex_Number - return - } - } - if is_range { - rr.last *= 16 - rr.last += (c - '0') if (c >= '0' && c <= '9') else (c - 'A' + 10) - } else { - rr.first *= 16 - rr.first += (c - '0') if (c >= '0' && c <= '9') else (c - 'A' + 10) - rr.last = rr.first - } - } + rr.first, rr.last = decode_rune(field) or_return case 1: - prop, err = string_to_proplist_property(field) - if err != nil { - return - } + prop = string_to_proplist_property(field) or_return case: err = UCD_Error.Extra_Fields From df0d74efbe7ee84aef3880e5fb6b8d5a74281d7a Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Mar 2026 18:38:49 +0100 Subject: [PATCH 068/273] Simplify table writer --- core/unicode/generated.odin | 380 ++++++++++--------- core/unicode/tools/ucd/generate_unicode.odin | 111 +++--- core/unicode/tools/ucd/ucd.odin | 20 +- 3 files changed, 268 insertions(+), 243 deletions(-) diff --git a/core/unicode/generated.odin b/core/unicode/generated.odin index 7a29e56ce..bfea47a87 100644 --- a/core/unicode/generated.odin +++ b/core/unicode/generated.odin @@ -65,61 +65,75 @@ Range :: struct { @(rodata) ll_singles16 := [?]u16{ - 0x00B5, 0x0101, 0x0103, 0x0105, 0x0107, 0x0109, 0x010B, 0x010D, 0x010F, 0x0111, - 0x0113, 0x0115, 0x0117, 0x0119, 0x011B, 0x011D, 0x011F, 0x0121, 0x0123, 0x0125, - 0x0127, 0x0129, 0x012B, 0x012D, 0x012F, 0x0131, 0x0133, 0x0135, 0x013A, 0x013C, - 0x013E, 0x0140, 0x0142, 0x0144, 0x0146, 0x014B, 0x014D, 0x014F, 0x0151, 0x0153, - 0x0155, 0x0157, 0x0159, 0x015B, 0x015D, 0x015F, 0x0161, 0x0163, 0x0165, 0x0167, - 0x0169, 0x016B, 0x016D, 0x016F, 0x0171, 0x0173, 0x0175, 0x0177, 0x017A, 0x017C, - 0x0183, 0x0185, 0x0188, 0x0192, 0x0195, 0x019E, 0x01A1, 0x01A3, 0x01A5, 0x01A8, - 0x01AD, 0x01B0, 0x01B4, 0x01B6, 0x01C6, 0x01C9, 0x01CC, 0x01CE, 0x01D0, 0x01D2, - 0x01D4, 0x01D6, 0x01D8, 0x01DA, 0x01DF, 0x01E1, 0x01E3, 0x01E5, 0x01E7, 0x01E9, - 0x01EB, 0x01ED, 0x01F3, 0x01F5, 0x01F9, 0x01FB, 0x01FD, 0x01FF, 0x0201, 0x0203, - 0x0205, 0x0207, 0x0209, 0x020B, 0x020D, 0x020F, 0x0211, 0x0213, 0x0215, 0x0217, - 0x0219, 0x021B, 0x021D, 0x021F, 0x0221, 0x0223, 0x0225, 0x0227, 0x0229, 0x022B, - 0x022D, 0x022F, 0x0231, 0x023C, 0x0242, 0x0247, 0x0249, 0x024B, 0x024D, 0x0371, - 0x0373, 0x0377, 0x0390, 0x03D9, 0x03DB, 0x03DD, 0x03DF, 0x03E1, 0x03E3, 0x03E5, - 0x03E7, 0x03E9, 0x03EB, 0x03ED, 0x03F5, 0x03F8, 0x0461, 0x0463, 0x0465, 0x0467, - 0x0469, 0x046B, 0x046D, 0x046F, 0x0471, 0x0473, 0x0475, 0x0477, 0x0479, 0x047B, - 0x047D, 0x047F, 0x0481, 0x048B, 0x048D, 0x048F, 0x0491, 0x0493, 0x0495, 0x0497, - 0x0499, 0x049B, 0x049D, 0x049F, 0x04A1, 0x04A3, 0x04A5, 0x04A7, 0x04A9, 0x04AB, - 0x04AD, 0x04AF, 0x04B1, 0x04B3, 0x04B5, 0x04B7, 0x04B9, 0x04BB, 0x04BD, 0x04BF, - 0x04C2, 0x04C4, 0x04C6, 0x04C8, 0x04CA, 0x04CC, 0x04D1, 0x04D3, 0x04D5, 0x04D7, - 0x04D9, 0x04DB, 0x04DD, 0x04DF, 0x04E1, 0x04E3, 0x04E5, 0x04E7, 0x04E9, 0x04EB, - 0x04ED, 0x04EF, 0x04F1, 0x04F3, 0x04F5, 0x04F7, 0x04F9, 0x04FB, 0x04FD, 0x04FF, - 0x0501, 0x0503, 0x0505, 0x0507, 0x0509, 0x050B, 0x050D, 0x050F, 0x0511, 0x0513, - 0x0515, 0x0517, 0x0519, 0x051B, 0x051D, 0x051F, 0x0521, 0x0523, 0x0525, 0x0527, - 0x0529, 0x052B, 0x052D, 0x052F, 0x1C8A, 0x1E01, 0x1E03, 0x1E05, 0x1E07, 0x1E09, - 0x1E0B, 0x1E0D, 0x1E0F, 0x1E11, 0x1E13, 0x1E15, 0x1E17, 0x1E19, 0x1E1B, 0x1E1D, - 0x1E1F, 0x1E21, 0x1E23, 0x1E25, 0x1E27, 0x1E29, 0x1E2B, 0x1E2D, 0x1E2F, 0x1E31, - 0x1E33, 0x1E35, 0x1E37, 0x1E39, 0x1E3B, 0x1E3D, 0x1E3F, 0x1E41, 0x1E43, 0x1E45, - 0x1E47, 0x1E49, 0x1E4B, 0x1E4D, 0x1E4F, 0x1E51, 0x1E53, 0x1E55, 0x1E57, 0x1E59, - 0x1E5B, 0x1E5D, 0x1E5F, 0x1E61, 0x1E63, 0x1E65, 0x1E67, 0x1E69, 0x1E6B, 0x1E6D, - 0x1E6F, 0x1E71, 0x1E73, 0x1E75, 0x1E77, 0x1E79, 0x1E7B, 0x1E7D, 0x1E7F, 0x1E81, - 0x1E83, 0x1E85, 0x1E87, 0x1E89, 0x1E8B, 0x1E8D, 0x1E8F, 0x1E91, 0x1E93, 0x1E9F, - 0x1EA1, 0x1EA3, 0x1EA5, 0x1EA7, 0x1EA9, 0x1EAB, 0x1EAD, 0x1EAF, 0x1EB1, 0x1EB3, - 0x1EB5, 0x1EB7, 0x1EB9, 0x1EBB, 0x1EBD, 0x1EBF, 0x1EC1, 0x1EC3, 0x1EC5, 0x1EC7, - 0x1EC9, 0x1ECB, 0x1ECD, 0x1ECF, 0x1ED1, 0x1ED3, 0x1ED5, 0x1ED7, 0x1ED9, 0x1EDB, - 0x1EDD, 0x1EDF, 0x1EE1, 0x1EE3, 0x1EE5, 0x1EE7, 0x1EE9, 0x1EEB, 0x1EED, 0x1EEF, - 0x1EF1, 0x1EF3, 0x1EF5, 0x1EF7, 0x1EF9, 0x1EFB, 0x1EFD, 0x1FBE, 0x210A, 0x2113, - 0x212F, 0x2134, 0x2139, 0x214E, 0x2184, 0x2C61, 0x2C68, 0x2C6A, 0x2C6C, 0x2C71, - 0x2C81, 0x2C83, 0x2C85, 0x2C87, 0x2C89, 0x2C8B, 0x2C8D, 0x2C8F, 0x2C91, 0x2C93, - 0x2C95, 0x2C97, 0x2C99, 0x2C9B, 0x2C9D, 0x2C9F, 0x2CA1, 0x2CA3, 0x2CA5, 0x2CA7, - 0x2CA9, 0x2CAB, 0x2CAD, 0x2CAF, 0x2CB1, 0x2CB3, 0x2CB5, 0x2CB7, 0x2CB9, 0x2CBB, - 0x2CBD, 0x2CBF, 0x2CC1, 0x2CC3, 0x2CC5, 0x2CC7, 0x2CC9, 0x2CCB, 0x2CCD, 0x2CCF, - 0x2CD1, 0x2CD3, 0x2CD5, 0x2CD7, 0x2CD9, 0x2CDB, 0x2CDD, 0x2CDF, 0x2CE1, 0x2CEC, - 0x2CEE, 0x2CF3, 0x2D27, 0x2D2D, 0xA641, 0xA643, 0xA645, 0xA647, 0xA649, 0xA64B, - 0xA64D, 0xA64F, 0xA651, 0xA653, 0xA655, 0xA657, 0xA659, 0xA65B, 0xA65D, 0xA65F, - 0xA661, 0xA663, 0xA665, 0xA667, 0xA669, 0xA66B, 0xA66D, 0xA681, 0xA683, 0xA685, - 0xA687, 0xA689, 0xA68B, 0xA68D, 0xA68F, 0xA691, 0xA693, 0xA695, 0xA697, 0xA699, - 0xA69B, 0xA723, 0xA725, 0xA727, 0xA729, 0xA72B, 0xA72D, 0xA733, 0xA735, 0xA737, - 0xA739, 0xA73B, 0xA73D, 0xA73F, 0xA741, 0xA743, 0xA745, 0xA747, 0xA749, 0xA74B, - 0xA74D, 0xA74F, 0xA751, 0xA753, 0xA755, 0xA757, 0xA759, 0xA75B, 0xA75D, 0xA75F, - 0xA761, 0xA763, 0xA765, 0xA767, 0xA769, 0xA76B, 0xA76D, 0xA76F, 0xA77A, 0xA77C, - 0xA77F, 0xA781, 0xA783, 0xA785, 0xA787, 0xA78C, 0xA78E, 0xA791, 0xA797, 0xA799, - 0xA79B, 0xA79D, 0xA79F, 0xA7A1, 0xA7A3, 0xA7A5, 0xA7A7, 0xA7A9, 0xA7AF, 0xA7B5, - 0xA7B7, 0xA7B9, 0xA7BB, 0xA7BD, 0xA7BF, 0xA7C1, 0xA7C3, 0xA7C8, 0xA7CA, 0xA7CD, - 0xA7CF, 0xA7D1, 0xA7D3, 0xA7D5, 0xA7D7, 0xA7D9, 0xA7DB, 0xA7F6, 0xA7FA, + 0x00B5, 0x0101, 0x0103, 0x0105, 0x0107, 0x0109, 0x010B, 0x010D, + 0x010F, 0x0111, 0x0113, 0x0115, 0x0117, 0x0119, 0x011B, 0x011D, + 0x011F, 0x0121, 0x0123, 0x0125, 0x0127, 0x0129, 0x012B, 0x012D, + 0x012F, 0x0131, 0x0133, 0x0135, 0x013A, 0x013C, 0x013E, 0x0140, + 0x0142, 0x0144, 0x0146, 0x014B, 0x014D, 0x014F, 0x0151, 0x0153, + 0x0155, 0x0157, 0x0159, 0x015B, 0x015D, 0x015F, 0x0161, 0x0163, + 0x0165, 0x0167, 0x0169, 0x016B, 0x016D, 0x016F, 0x0171, 0x0173, + 0x0175, 0x0177, 0x017A, 0x017C, 0x0183, 0x0185, 0x0188, 0x0192, + 0x0195, 0x019E, 0x01A1, 0x01A3, 0x01A5, 0x01A8, 0x01AD, 0x01B0, + 0x01B4, 0x01B6, 0x01C6, 0x01C9, 0x01CC, 0x01CE, 0x01D0, 0x01D2, + 0x01D4, 0x01D6, 0x01D8, 0x01DA, 0x01DF, 0x01E1, 0x01E3, 0x01E5, + 0x01E7, 0x01E9, 0x01EB, 0x01ED, 0x01F3, 0x01F5, 0x01F9, 0x01FB, + 0x01FD, 0x01FF, 0x0201, 0x0203, 0x0205, 0x0207, 0x0209, 0x020B, + 0x020D, 0x020F, 0x0211, 0x0213, 0x0215, 0x0217, 0x0219, 0x021B, + 0x021D, 0x021F, 0x0221, 0x0223, 0x0225, 0x0227, 0x0229, 0x022B, + 0x022D, 0x022F, 0x0231, 0x023C, 0x0242, 0x0247, 0x0249, 0x024B, + 0x024D, 0x0371, 0x0373, 0x0377, 0x0390, 0x03D9, 0x03DB, 0x03DD, + 0x03DF, 0x03E1, 0x03E3, 0x03E5, 0x03E7, 0x03E9, 0x03EB, 0x03ED, + 0x03F5, 0x03F8, 0x0461, 0x0463, 0x0465, 0x0467, 0x0469, 0x046B, + 0x046D, 0x046F, 0x0471, 0x0473, 0x0475, 0x0477, 0x0479, 0x047B, + 0x047D, 0x047F, 0x0481, 0x048B, 0x048D, 0x048F, 0x0491, 0x0493, + 0x0495, 0x0497, 0x0499, 0x049B, 0x049D, 0x049F, 0x04A1, 0x04A3, + 0x04A5, 0x04A7, 0x04A9, 0x04AB, 0x04AD, 0x04AF, 0x04B1, 0x04B3, + 0x04B5, 0x04B7, 0x04B9, 0x04BB, 0x04BD, 0x04BF, 0x04C2, 0x04C4, + 0x04C6, 0x04C8, 0x04CA, 0x04CC, 0x04D1, 0x04D3, 0x04D5, 0x04D7, + 0x04D9, 0x04DB, 0x04DD, 0x04DF, 0x04E1, 0x04E3, 0x04E5, 0x04E7, + 0x04E9, 0x04EB, 0x04ED, 0x04EF, 0x04F1, 0x04F3, 0x04F5, 0x04F7, + 0x04F9, 0x04FB, 0x04FD, 0x04FF, 0x0501, 0x0503, 0x0505, 0x0507, + 0x0509, 0x050B, 0x050D, 0x050F, 0x0511, 0x0513, 0x0515, 0x0517, + 0x0519, 0x051B, 0x051D, 0x051F, 0x0521, 0x0523, 0x0525, 0x0527, + 0x0529, 0x052B, 0x052D, 0x052F, 0x1C8A, 0x1E01, 0x1E03, 0x1E05, + 0x1E07, 0x1E09, 0x1E0B, 0x1E0D, 0x1E0F, 0x1E11, 0x1E13, 0x1E15, + 0x1E17, 0x1E19, 0x1E1B, 0x1E1D, 0x1E1F, 0x1E21, 0x1E23, 0x1E25, + 0x1E27, 0x1E29, 0x1E2B, 0x1E2D, 0x1E2F, 0x1E31, 0x1E33, 0x1E35, + 0x1E37, 0x1E39, 0x1E3B, 0x1E3D, 0x1E3F, 0x1E41, 0x1E43, 0x1E45, + 0x1E47, 0x1E49, 0x1E4B, 0x1E4D, 0x1E4F, 0x1E51, 0x1E53, 0x1E55, + 0x1E57, 0x1E59, 0x1E5B, 0x1E5D, 0x1E5F, 0x1E61, 0x1E63, 0x1E65, + 0x1E67, 0x1E69, 0x1E6B, 0x1E6D, 0x1E6F, 0x1E71, 0x1E73, 0x1E75, + 0x1E77, 0x1E79, 0x1E7B, 0x1E7D, 0x1E7F, 0x1E81, 0x1E83, 0x1E85, + 0x1E87, 0x1E89, 0x1E8B, 0x1E8D, 0x1E8F, 0x1E91, 0x1E93, 0x1E9F, + 0x1EA1, 0x1EA3, 0x1EA5, 0x1EA7, 0x1EA9, 0x1EAB, 0x1EAD, 0x1EAF, + 0x1EB1, 0x1EB3, 0x1EB5, 0x1EB7, 0x1EB9, 0x1EBB, 0x1EBD, 0x1EBF, + 0x1EC1, 0x1EC3, 0x1EC5, 0x1EC7, 0x1EC9, 0x1ECB, 0x1ECD, 0x1ECF, + 0x1ED1, 0x1ED3, 0x1ED5, 0x1ED7, 0x1ED9, 0x1EDB, 0x1EDD, 0x1EDF, + 0x1EE1, 0x1EE3, 0x1EE5, 0x1EE7, 0x1EE9, 0x1EEB, 0x1EED, 0x1EEF, + 0x1EF1, 0x1EF3, 0x1EF5, 0x1EF7, 0x1EF9, 0x1EFB, 0x1EFD, 0x1FBE, + 0x210A, 0x2113, 0x212F, 0x2134, 0x2139, 0x214E, 0x2184, 0x2C61, + 0x2C68, 0x2C6A, 0x2C6C, 0x2C71, 0x2C81, 0x2C83, 0x2C85, 0x2C87, + 0x2C89, 0x2C8B, 0x2C8D, 0x2C8F, 0x2C91, 0x2C93, 0x2C95, 0x2C97, + 0x2C99, 0x2C9B, 0x2C9D, 0x2C9F, 0x2CA1, 0x2CA3, 0x2CA5, 0x2CA7, + 0x2CA9, 0x2CAB, 0x2CAD, 0x2CAF, 0x2CB1, 0x2CB3, 0x2CB5, 0x2CB7, + 0x2CB9, 0x2CBB, 0x2CBD, 0x2CBF, 0x2CC1, 0x2CC3, 0x2CC5, 0x2CC7, + 0x2CC9, 0x2CCB, 0x2CCD, 0x2CCF, 0x2CD1, 0x2CD3, 0x2CD5, 0x2CD7, + 0x2CD9, 0x2CDB, 0x2CDD, 0x2CDF, 0x2CE1, 0x2CEC, 0x2CEE, 0x2CF3, + 0x2D27, 0x2D2D, 0xA641, 0xA643, 0xA645, 0xA647, 0xA649, 0xA64B, + 0xA64D, 0xA64F, 0xA651, 0xA653, 0xA655, 0xA657, 0xA659, 0xA65B, + 0xA65D, 0xA65F, 0xA661, 0xA663, 0xA665, 0xA667, 0xA669, 0xA66B, + 0xA66D, 0xA681, 0xA683, 0xA685, 0xA687, 0xA689, 0xA68B, 0xA68D, + 0xA68F, 0xA691, 0xA693, 0xA695, 0xA697, 0xA699, 0xA69B, 0xA723, + 0xA725, 0xA727, 0xA729, 0xA72B, 0xA72D, 0xA733, 0xA735, 0xA737, + 0xA739, 0xA73B, 0xA73D, 0xA73F, 0xA741, 0xA743, 0xA745, 0xA747, + 0xA749, 0xA74B, 0xA74D, 0xA74F, 0xA751, 0xA753, 0xA755, 0xA757, + 0xA759, 0xA75B, 0xA75D, 0xA75F, 0xA761, 0xA763, 0xA765, 0xA767, + 0xA769, 0xA76B, 0xA76D, 0xA76F, 0xA77A, 0xA77C, 0xA77F, 0xA781, + 0xA783, 0xA785, 0xA787, 0xA78C, 0xA78E, 0xA791, 0xA797, 0xA799, + 0xA79B, 0xA79D, 0xA79F, 0xA7A1, 0xA7A3, 0xA7A5, 0xA7A7, 0xA7A9, + 0xA7AF, 0xA7B5, 0xA7B7, 0xA7B9, 0xA7BB, 0xA7BD, 0xA7BF, 0xA7C1, + 0xA7C3, 0xA7C8, 0xA7CA, 0xA7CD, 0xA7CF, 0xA7D1, 0xA7D3, 0xA7D5, + 0xA7D7, 0xA7D9, 0xA7DB, 0xA7F6, 0xA7FA, } @(rodata) @@ -257,10 +271,11 @@ ll_ranges := Range{ @(rodata) lm_singles16 := [?]u16{ - 0x02EC, 0x02EE, 0x0374, 0x037A, 0x0559, 0x0640, 0x07FA, 0x081A, 0x0824, 0x0828, - 0x08C9, 0x0971, 0x0E46, 0x0EC6, 0x10FC, 0x17D7, 0x1843, 0x1AA7, 0x1D78, 0x2071, - 0x207F, 0x2D6F, 0x2E2F, 0x3005, 0x303B, 0xA015, 0xA60C, 0xA67F, 0xA770, 0xA788, - 0xA9CF, 0xA9E6, 0xAA70, 0xAADD, 0xAB69, 0xFF70, + 0x02EC, 0x02EE, 0x0374, 0x037A, 0x0559, 0x0640, 0x07FA, 0x081A, + 0x0824, 0x0828, 0x08C9, 0x0971, 0x0E46, 0x0EC6, 0x10FC, 0x17D7, + 0x1843, 0x1AA7, 0x1D78, 0x2071, 0x207F, 0x2D6F, 0x2E2F, 0x3005, + 0x303B, 0xA015, 0xA60C, 0xA67F, 0xA770, 0xA788, 0xA9CF, 0xA9E6, + 0xAA70, 0xAADD, 0xAB69, 0xFF70, } @(rodata) @@ -320,12 +335,13 @@ lm_ranges := Range{ @(rodata) lo_singles16 := [?]u16{ - 0x00AA, 0x00BA, 0x01BB, 0x06D5, 0x06FF, 0x0710, 0x07B1, 0x093D, 0x0950, 0x09B2, - 0x09BD, 0x09CE, 0x09FC, 0x0A5E, 0x0ABD, 0x0AD0, 0x0AF9, 0x0B3D, 0x0B71, 0x0B83, - 0x0B9C, 0x0BD0, 0x0C3D, 0x0C80, 0x0CBD, 0x0D3D, 0x0D4E, 0x0DBD, 0x0E84, 0x0EA5, - 0x0EBD, 0x0F00, 0x103F, 0x1061, 0x108E, 0x1258, 0x12C0, 0x17DC, 0x18AA, 0x1CFA, - 0x3006, 0x303C, 0x309F, 0x30FF, 0xA66E, 0xA78F, 0xA7F7, 0xA8FB, 0xAA7A, 0xAAB1, - 0xAAC0, 0xAAC2, 0xAAF2, 0xFB1D, 0xFB3E, + 0x00AA, 0x00BA, 0x01BB, 0x06D5, 0x06FF, 0x0710, 0x07B1, 0x093D, + 0x0950, 0x09B2, 0x09BD, 0x09CE, 0x09FC, 0x0A5E, 0x0ABD, 0x0AD0, + 0x0AF9, 0x0B3D, 0x0B71, 0x0B83, 0x0B9C, 0x0BD0, 0x0C3D, 0x0C80, + 0x0CBD, 0x0D3D, 0x0D4E, 0x0DBD, 0x0E84, 0x0EA5, 0x0EBD, 0x0F00, + 0x103F, 0x1061, 0x108E, 0x1258, 0x12C0, 0x17DC, 0x18AA, 0x1CFA, + 0x3006, 0x303C, 0x309F, 0x30FF, 0xA66E, 0xA78F, 0xA7F7, 0xA8FB, + 0xAA7A, 0xAAB1, 0xAAC0, 0xAAC2, 0xAAF2, 0xFB1D, 0xFB3E, } @(rodata) @@ -801,62 +817,75 @@ lt_ranges := Range{ @(rodata) lu_singles16 := [?]u16{ - 0x0100, 0x0102, 0x0104, 0x0106, 0x0108, 0x010A, 0x010C, 0x010E, 0x0110, 0x0112, - 0x0114, 0x0116, 0x0118, 0x011A, 0x011C, 0x011E, 0x0120, 0x0122, 0x0124, 0x0126, - 0x0128, 0x012A, 0x012C, 0x012E, 0x0130, 0x0132, 0x0134, 0x0136, 0x0139, 0x013B, - 0x013D, 0x013F, 0x0141, 0x0143, 0x0145, 0x0147, 0x014A, 0x014C, 0x014E, 0x0150, - 0x0152, 0x0154, 0x0156, 0x0158, 0x015A, 0x015C, 0x015E, 0x0160, 0x0162, 0x0164, - 0x0166, 0x0168, 0x016A, 0x016C, 0x016E, 0x0170, 0x0172, 0x0174, 0x0176, 0x017B, - 0x017D, 0x0184, 0x01A2, 0x01A4, 0x01A9, 0x01AC, 0x01B5, 0x01BC, 0x01C4, 0x01C7, - 0x01CA, 0x01CD, 0x01CF, 0x01D1, 0x01D3, 0x01D5, 0x01D7, 0x01D9, 0x01DB, 0x01DE, - 0x01E0, 0x01E2, 0x01E4, 0x01E6, 0x01E8, 0x01EA, 0x01EC, 0x01EE, 0x01F1, 0x01F4, - 0x01FA, 0x01FC, 0x01FE, 0x0200, 0x0202, 0x0204, 0x0206, 0x0208, 0x020A, 0x020C, - 0x020E, 0x0210, 0x0212, 0x0214, 0x0216, 0x0218, 0x021A, 0x021C, 0x021E, 0x0220, - 0x0222, 0x0224, 0x0226, 0x0228, 0x022A, 0x022C, 0x022E, 0x0230, 0x0232, 0x0241, - 0x0248, 0x024A, 0x024C, 0x024E, 0x0370, 0x0372, 0x0376, 0x037F, 0x0386, 0x038C, - 0x03CF, 0x03D8, 0x03DA, 0x03DC, 0x03DE, 0x03E0, 0x03E2, 0x03E4, 0x03E6, 0x03E8, - 0x03EA, 0x03EC, 0x03EE, 0x03F4, 0x03F7, 0x0460, 0x0462, 0x0464, 0x0466, 0x0468, - 0x046A, 0x046C, 0x046E, 0x0470, 0x0472, 0x0474, 0x0476, 0x0478, 0x047A, 0x047C, - 0x047E, 0x0480, 0x048A, 0x048C, 0x048E, 0x0490, 0x0492, 0x0494, 0x0496, 0x0498, - 0x049A, 0x049C, 0x049E, 0x04A0, 0x04A2, 0x04A4, 0x04A6, 0x04A8, 0x04AA, 0x04AC, - 0x04AE, 0x04B0, 0x04B2, 0x04B4, 0x04B6, 0x04B8, 0x04BA, 0x04BC, 0x04BE, 0x04C3, - 0x04C5, 0x04C7, 0x04C9, 0x04CB, 0x04CD, 0x04D0, 0x04D2, 0x04D4, 0x04D6, 0x04D8, - 0x04DA, 0x04DC, 0x04DE, 0x04E0, 0x04E2, 0x04E4, 0x04E6, 0x04E8, 0x04EA, 0x04EC, - 0x04EE, 0x04F0, 0x04F2, 0x04F4, 0x04F6, 0x04F8, 0x04FA, 0x04FC, 0x04FE, 0x0500, - 0x0502, 0x0504, 0x0506, 0x0508, 0x050A, 0x050C, 0x050E, 0x0510, 0x0512, 0x0514, - 0x0516, 0x0518, 0x051A, 0x051C, 0x051E, 0x0520, 0x0522, 0x0524, 0x0526, 0x0528, - 0x052A, 0x052C, 0x052E, 0x10C7, 0x10CD, 0x1C89, 0x1E00, 0x1E02, 0x1E04, 0x1E06, - 0x1E08, 0x1E0A, 0x1E0C, 0x1E0E, 0x1E10, 0x1E12, 0x1E14, 0x1E16, 0x1E18, 0x1E1A, - 0x1E1C, 0x1E1E, 0x1E20, 0x1E22, 0x1E24, 0x1E26, 0x1E28, 0x1E2A, 0x1E2C, 0x1E2E, - 0x1E30, 0x1E32, 0x1E34, 0x1E36, 0x1E38, 0x1E3A, 0x1E3C, 0x1E3E, 0x1E40, 0x1E42, - 0x1E44, 0x1E46, 0x1E48, 0x1E4A, 0x1E4C, 0x1E4E, 0x1E50, 0x1E52, 0x1E54, 0x1E56, - 0x1E58, 0x1E5A, 0x1E5C, 0x1E5E, 0x1E60, 0x1E62, 0x1E64, 0x1E66, 0x1E68, 0x1E6A, - 0x1E6C, 0x1E6E, 0x1E70, 0x1E72, 0x1E74, 0x1E76, 0x1E78, 0x1E7A, 0x1E7C, 0x1E7E, - 0x1E80, 0x1E82, 0x1E84, 0x1E86, 0x1E88, 0x1E8A, 0x1E8C, 0x1E8E, 0x1E90, 0x1E92, - 0x1E94, 0x1E9E, 0x1EA0, 0x1EA2, 0x1EA4, 0x1EA6, 0x1EA8, 0x1EAA, 0x1EAC, 0x1EAE, - 0x1EB0, 0x1EB2, 0x1EB4, 0x1EB6, 0x1EB8, 0x1EBA, 0x1EBC, 0x1EBE, 0x1EC0, 0x1EC2, - 0x1EC4, 0x1EC6, 0x1EC8, 0x1ECA, 0x1ECC, 0x1ECE, 0x1ED0, 0x1ED2, 0x1ED4, 0x1ED6, - 0x1ED8, 0x1EDA, 0x1EDC, 0x1EDE, 0x1EE0, 0x1EE2, 0x1EE4, 0x1EE6, 0x1EE8, 0x1EEA, - 0x1EEC, 0x1EEE, 0x1EF0, 0x1EF2, 0x1EF4, 0x1EF6, 0x1EF8, 0x1EFA, 0x1EFC, 0x1EFE, - 0x1F59, 0x1F5B, 0x1F5D, 0x1F5F, 0x2102, 0x2107, 0x2115, 0x2124, 0x2126, 0x2128, - 0x2145, 0x2183, 0x2C60, 0x2C67, 0x2C69, 0x2C6B, 0x2C72, 0x2C75, 0x2C82, 0x2C84, - 0x2C86, 0x2C88, 0x2C8A, 0x2C8C, 0x2C8E, 0x2C90, 0x2C92, 0x2C94, 0x2C96, 0x2C98, - 0x2C9A, 0x2C9C, 0x2C9E, 0x2CA0, 0x2CA2, 0x2CA4, 0x2CA6, 0x2CA8, 0x2CAA, 0x2CAC, - 0x2CAE, 0x2CB0, 0x2CB2, 0x2CB4, 0x2CB6, 0x2CB8, 0x2CBA, 0x2CBC, 0x2CBE, 0x2CC0, - 0x2CC2, 0x2CC4, 0x2CC6, 0x2CC8, 0x2CCA, 0x2CCC, 0x2CCE, 0x2CD0, 0x2CD2, 0x2CD4, - 0x2CD6, 0x2CD8, 0x2CDA, 0x2CDC, 0x2CDE, 0x2CE0, 0x2CE2, 0x2CEB, 0x2CED, 0x2CF2, - 0xA640, 0xA642, 0xA644, 0xA646, 0xA648, 0xA64A, 0xA64C, 0xA64E, 0xA650, 0xA652, - 0xA654, 0xA656, 0xA658, 0xA65A, 0xA65C, 0xA65E, 0xA660, 0xA662, 0xA664, 0xA666, - 0xA668, 0xA66A, 0xA66C, 0xA680, 0xA682, 0xA684, 0xA686, 0xA688, 0xA68A, 0xA68C, - 0xA68E, 0xA690, 0xA692, 0xA694, 0xA696, 0xA698, 0xA69A, 0xA722, 0xA724, 0xA726, - 0xA728, 0xA72A, 0xA72C, 0xA72E, 0xA732, 0xA734, 0xA736, 0xA738, 0xA73A, 0xA73C, - 0xA73E, 0xA740, 0xA742, 0xA744, 0xA746, 0xA748, 0xA74A, 0xA74C, 0xA74E, 0xA750, - 0xA752, 0xA754, 0xA756, 0xA758, 0xA75A, 0xA75C, 0xA75E, 0xA760, 0xA762, 0xA764, - 0xA766, 0xA768, 0xA76A, 0xA76C, 0xA76E, 0xA779, 0xA77B, 0xA780, 0xA782, 0xA784, - 0xA786, 0xA78B, 0xA78D, 0xA790, 0xA792, 0xA796, 0xA798, 0xA79A, 0xA79C, 0xA79E, - 0xA7A0, 0xA7A2, 0xA7A4, 0xA7A6, 0xA7A8, 0xA7B6, 0xA7B8, 0xA7BA, 0xA7BC, 0xA7BE, - 0xA7C0, 0xA7C2, 0xA7C9, 0xA7CE, 0xA7D0, 0xA7D2, 0xA7D4, 0xA7D6, 0xA7D8, 0xA7DA, - 0xA7DC, 0xA7F5, + 0x0100, 0x0102, 0x0104, 0x0106, 0x0108, 0x010A, 0x010C, 0x010E, + 0x0110, 0x0112, 0x0114, 0x0116, 0x0118, 0x011A, 0x011C, 0x011E, + 0x0120, 0x0122, 0x0124, 0x0126, 0x0128, 0x012A, 0x012C, 0x012E, + 0x0130, 0x0132, 0x0134, 0x0136, 0x0139, 0x013B, 0x013D, 0x013F, + 0x0141, 0x0143, 0x0145, 0x0147, 0x014A, 0x014C, 0x014E, 0x0150, + 0x0152, 0x0154, 0x0156, 0x0158, 0x015A, 0x015C, 0x015E, 0x0160, + 0x0162, 0x0164, 0x0166, 0x0168, 0x016A, 0x016C, 0x016E, 0x0170, + 0x0172, 0x0174, 0x0176, 0x017B, 0x017D, 0x0184, 0x01A2, 0x01A4, + 0x01A9, 0x01AC, 0x01B5, 0x01BC, 0x01C4, 0x01C7, 0x01CA, 0x01CD, + 0x01CF, 0x01D1, 0x01D3, 0x01D5, 0x01D7, 0x01D9, 0x01DB, 0x01DE, + 0x01E0, 0x01E2, 0x01E4, 0x01E6, 0x01E8, 0x01EA, 0x01EC, 0x01EE, + 0x01F1, 0x01F4, 0x01FA, 0x01FC, 0x01FE, 0x0200, 0x0202, 0x0204, + 0x0206, 0x0208, 0x020A, 0x020C, 0x020E, 0x0210, 0x0212, 0x0214, + 0x0216, 0x0218, 0x021A, 0x021C, 0x021E, 0x0220, 0x0222, 0x0224, + 0x0226, 0x0228, 0x022A, 0x022C, 0x022E, 0x0230, 0x0232, 0x0241, + 0x0248, 0x024A, 0x024C, 0x024E, 0x0370, 0x0372, 0x0376, 0x037F, + 0x0386, 0x038C, 0x03CF, 0x03D8, 0x03DA, 0x03DC, 0x03DE, 0x03E0, + 0x03E2, 0x03E4, 0x03E6, 0x03E8, 0x03EA, 0x03EC, 0x03EE, 0x03F4, + 0x03F7, 0x0460, 0x0462, 0x0464, 0x0466, 0x0468, 0x046A, 0x046C, + 0x046E, 0x0470, 0x0472, 0x0474, 0x0476, 0x0478, 0x047A, 0x047C, + 0x047E, 0x0480, 0x048A, 0x048C, 0x048E, 0x0490, 0x0492, 0x0494, + 0x0496, 0x0498, 0x049A, 0x049C, 0x049E, 0x04A0, 0x04A2, 0x04A4, + 0x04A6, 0x04A8, 0x04AA, 0x04AC, 0x04AE, 0x04B0, 0x04B2, 0x04B4, + 0x04B6, 0x04B8, 0x04BA, 0x04BC, 0x04BE, 0x04C3, 0x04C5, 0x04C7, + 0x04C9, 0x04CB, 0x04CD, 0x04D0, 0x04D2, 0x04D4, 0x04D6, 0x04D8, + 0x04DA, 0x04DC, 0x04DE, 0x04E0, 0x04E2, 0x04E4, 0x04E6, 0x04E8, + 0x04EA, 0x04EC, 0x04EE, 0x04F0, 0x04F2, 0x04F4, 0x04F6, 0x04F8, + 0x04FA, 0x04FC, 0x04FE, 0x0500, 0x0502, 0x0504, 0x0506, 0x0508, + 0x050A, 0x050C, 0x050E, 0x0510, 0x0512, 0x0514, 0x0516, 0x0518, + 0x051A, 0x051C, 0x051E, 0x0520, 0x0522, 0x0524, 0x0526, 0x0528, + 0x052A, 0x052C, 0x052E, 0x10C7, 0x10CD, 0x1C89, 0x1E00, 0x1E02, + 0x1E04, 0x1E06, 0x1E08, 0x1E0A, 0x1E0C, 0x1E0E, 0x1E10, 0x1E12, + 0x1E14, 0x1E16, 0x1E18, 0x1E1A, 0x1E1C, 0x1E1E, 0x1E20, 0x1E22, + 0x1E24, 0x1E26, 0x1E28, 0x1E2A, 0x1E2C, 0x1E2E, 0x1E30, 0x1E32, + 0x1E34, 0x1E36, 0x1E38, 0x1E3A, 0x1E3C, 0x1E3E, 0x1E40, 0x1E42, + 0x1E44, 0x1E46, 0x1E48, 0x1E4A, 0x1E4C, 0x1E4E, 0x1E50, 0x1E52, + 0x1E54, 0x1E56, 0x1E58, 0x1E5A, 0x1E5C, 0x1E5E, 0x1E60, 0x1E62, + 0x1E64, 0x1E66, 0x1E68, 0x1E6A, 0x1E6C, 0x1E6E, 0x1E70, 0x1E72, + 0x1E74, 0x1E76, 0x1E78, 0x1E7A, 0x1E7C, 0x1E7E, 0x1E80, 0x1E82, + 0x1E84, 0x1E86, 0x1E88, 0x1E8A, 0x1E8C, 0x1E8E, 0x1E90, 0x1E92, + 0x1E94, 0x1E9E, 0x1EA0, 0x1EA2, 0x1EA4, 0x1EA6, 0x1EA8, 0x1EAA, + 0x1EAC, 0x1EAE, 0x1EB0, 0x1EB2, 0x1EB4, 0x1EB6, 0x1EB8, 0x1EBA, + 0x1EBC, 0x1EBE, 0x1EC0, 0x1EC2, 0x1EC4, 0x1EC6, 0x1EC8, 0x1ECA, + 0x1ECC, 0x1ECE, 0x1ED0, 0x1ED2, 0x1ED4, 0x1ED6, 0x1ED8, 0x1EDA, + 0x1EDC, 0x1EDE, 0x1EE0, 0x1EE2, 0x1EE4, 0x1EE6, 0x1EE8, 0x1EEA, + 0x1EEC, 0x1EEE, 0x1EF0, 0x1EF2, 0x1EF4, 0x1EF6, 0x1EF8, 0x1EFA, + 0x1EFC, 0x1EFE, 0x1F59, 0x1F5B, 0x1F5D, 0x1F5F, 0x2102, 0x2107, + 0x2115, 0x2124, 0x2126, 0x2128, 0x2145, 0x2183, 0x2C60, 0x2C67, + 0x2C69, 0x2C6B, 0x2C72, 0x2C75, 0x2C82, 0x2C84, 0x2C86, 0x2C88, + 0x2C8A, 0x2C8C, 0x2C8E, 0x2C90, 0x2C92, 0x2C94, 0x2C96, 0x2C98, + 0x2C9A, 0x2C9C, 0x2C9E, 0x2CA0, 0x2CA2, 0x2CA4, 0x2CA6, 0x2CA8, + 0x2CAA, 0x2CAC, 0x2CAE, 0x2CB0, 0x2CB2, 0x2CB4, 0x2CB6, 0x2CB8, + 0x2CBA, 0x2CBC, 0x2CBE, 0x2CC0, 0x2CC2, 0x2CC4, 0x2CC6, 0x2CC8, + 0x2CCA, 0x2CCC, 0x2CCE, 0x2CD0, 0x2CD2, 0x2CD4, 0x2CD6, 0x2CD8, + 0x2CDA, 0x2CDC, 0x2CDE, 0x2CE0, 0x2CE2, 0x2CEB, 0x2CED, 0x2CF2, + 0xA640, 0xA642, 0xA644, 0xA646, 0xA648, 0xA64A, 0xA64C, 0xA64E, + 0xA650, 0xA652, 0xA654, 0xA656, 0xA658, 0xA65A, 0xA65C, 0xA65E, + 0xA660, 0xA662, 0xA664, 0xA666, 0xA668, 0xA66A, 0xA66C, 0xA680, + 0xA682, 0xA684, 0xA686, 0xA688, 0xA68A, 0xA68C, 0xA68E, 0xA690, + 0xA692, 0xA694, 0xA696, 0xA698, 0xA69A, 0xA722, 0xA724, 0xA726, + 0xA728, 0xA72A, 0xA72C, 0xA72E, 0xA732, 0xA734, 0xA736, 0xA738, + 0xA73A, 0xA73C, 0xA73E, 0xA740, 0xA742, 0xA744, 0xA746, 0xA748, + 0xA74A, 0xA74C, 0xA74E, 0xA750, 0xA752, 0xA754, 0xA756, 0xA758, + 0xA75A, 0xA75C, 0xA75E, 0xA760, 0xA762, 0xA764, 0xA766, 0xA768, + 0xA76A, 0xA76C, 0xA76E, 0xA779, 0xA77B, 0xA780, 0xA782, 0xA784, + 0xA786, 0xA78B, 0xA78D, 0xA790, 0xA792, 0xA796, 0xA798, 0xA79A, + 0xA79C, 0xA79E, 0xA7A0, 0xA7A2, 0xA7A4, 0xA7A6, 0xA7A8, 0xA7B6, + 0xA7B8, 0xA7BA, 0xA7BC, 0xA7BE, 0xA7C0, 0xA7C2, 0xA7C9, 0xA7CE, + 0xA7D0, 0xA7D2, 0xA7D4, 0xA7D6, 0xA7D8, 0xA7DA, 0xA7DC, 0xA7F5, } @(rodata) @@ -980,10 +1009,11 @@ lu_ranges := Range{ @(rodata) mc_singles16 := [?]u16{ - 0x0903, 0x093B, 0x09D7, 0x0A03, 0x0A83, 0x0AC9, 0x0B3E, 0x0B40, 0x0B57, 0x0BD7, - 0x0CBE, 0x0CF3, 0x0D57, 0x0F7F, 0x1031, 0x1038, 0x108F, 0x1715, 0x1734, 0x17B6, - 0x1A55, 0x1A57, 0x1A61, 0x1B04, 0x1B35, 0x1B3B, 0x1B82, 0x1BA1, 0x1BAA, 0x1BE7, - 0x1BEE, 0x1CE1, 0x1CF7, 0xA827, 0xA983, 0xAA4D, 0xAA7B, 0xAA7D, 0xAAEB, 0xAAF5, + 0x0903, 0x093B, 0x09D7, 0x0A03, 0x0A83, 0x0AC9, 0x0B3E, 0x0B40, + 0x0B57, 0x0BD7, 0x0CBE, 0x0CF3, 0x0D57, 0x0F7F, 0x1031, 0x1038, + 0x108F, 0x1715, 0x1734, 0x17B6, 0x1A55, 0x1A57, 0x1A61, 0x1B04, + 0x1B35, 0x1B3B, 0x1B82, 0x1BA1, 0x1BAA, 0x1BE7, 0x1BEE, 0x1CE1, + 0x1CF7, 0xA827, 0xA983, 0xAA4D, 0xAA7B, 0xAA7D, 0xAAEB, 0xAAF5, 0xABEC, } @@ -1145,14 +1175,16 @@ me_ranges := Range{ @(rodata) mn_singles16 := [?]u16{ - 0x05BF, 0x05C7, 0x0670, 0x0711, 0x07FD, 0x093A, 0x093C, 0x094D, 0x0981, 0x09BC, - 0x09CD, 0x09FE, 0x0A3C, 0x0A51, 0x0A75, 0x0ABC, 0x0ACD, 0x0B01, 0x0B3C, 0x0B3F, - 0x0B4D, 0x0B82, 0x0BC0, 0x0BCD, 0x0C00, 0x0C04, 0x0C3C, 0x0C81, 0x0CBC, 0x0CBF, - 0x0CC6, 0x0D4D, 0x0D81, 0x0DCA, 0x0DD6, 0x0E31, 0x0EB1, 0x0F35, 0x0F37, 0x0F39, - 0x0FC6, 0x1082, 0x108D, 0x109D, 0x17C6, 0x17DD, 0x180F, 0x18A9, 0x1932, 0x1A1B, - 0x1A56, 0x1A60, 0x1A62, 0x1A7F, 0x1B34, 0x1B3C, 0x1B42, 0x1BE6, 0x1BED, 0x1CED, - 0x1CF4, 0x20E1, 0x2D7F, 0xA66F, 0xA802, 0xA806, 0xA80B, 0xA82C, 0xA8FF, 0xA9B3, - 0xA9E5, 0xAA43, 0xAA4C, 0xAA7C, 0xAAB0, 0xAAC1, 0xAAF6, 0xABE5, 0xABE8, 0xABED, + 0x05BF, 0x05C7, 0x0670, 0x0711, 0x07FD, 0x093A, 0x093C, 0x094D, + 0x0981, 0x09BC, 0x09CD, 0x09FE, 0x0A3C, 0x0A51, 0x0A75, 0x0ABC, + 0x0ACD, 0x0B01, 0x0B3C, 0x0B3F, 0x0B4D, 0x0B82, 0x0BC0, 0x0BCD, + 0x0C00, 0x0C04, 0x0C3C, 0x0C81, 0x0CBC, 0x0CBF, 0x0CC6, 0x0D4D, + 0x0D81, 0x0DCA, 0x0DD6, 0x0E31, 0x0EB1, 0x0F35, 0x0F37, 0x0F39, + 0x0FC6, 0x1082, 0x108D, 0x109D, 0x17C6, 0x17DD, 0x180F, 0x18A9, + 0x1932, 0x1A1B, 0x1A56, 0x1A60, 0x1A62, 0x1A7F, 0x1B34, 0x1B3C, + 0x1B42, 0x1BE6, 0x1BED, 0x1CED, 0x1CF4, 0x20E1, 0x2D7F, 0xA66F, + 0xA802, 0xA806, 0xA80B, 0xA82C, 0xA8FF, 0xA9B3, 0xA9E5, 0xAA43, + 0xAA4C, 0xAA7C, 0xAAB0, 0xAAC1, 0xAAF6, 0xABE5, 0xABE8, 0xABED, 0xFB1E, } @@ -1642,8 +1674,8 @@ pc_ranges := Range{ @(rodata) pd_singles16 := [?]u16{ - 0x002D, 0x058A, 0x05BE, 0x1400, 0x1806, 0x2E17, 0x2E1A, 0x2E40, 0x2E5D, 0x301C, - 0x3030, 0x30A0, 0xFE58, 0xFE63, 0xFF0D, + 0x002D, 0x058A, 0x05BE, 0x1400, 0x1806, 0x2E17, 0x2E1A, 0x2E40, + 0x2E5D, 0x301C, 0x3030, 0x30A0, 0xFE58, 0xFE63, 0xFF0D, } @(rodata) @@ -1666,14 +1698,16 @@ pd_ranges := Range{ @(rodata) pe_singles16 := [?]u16{ - 0x0029, 0x005D, 0x007D, 0x0F3B, 0x0F3D, 0x169C, 0x2046, 0x207E, 0x208E, 0x2309, - 0x230B, 0x232A, 0x2769, 0x276B, 0x276D, 0x276F, 0x2771, 0x2773, 0x2775, 0x27C6, - 0x27E7, 0x27E9, 0x27EB, 0x27ED, 0x27EF, 0x2984, 0x2986, 0x2988, 0x298A, 0x298C, - 0x298E, 0x2990, 0x2992, 0x2994, 0x2996, 0x2998, 0x29D9, 0x29DB, 0x29FD, 0x2E23, - 0x2E25, 0x2E27, 0x2E29, 0x2E56, 0x2E58, 0x2E5A, 0x2E5C, 0x3009, 0x300B, 0x300D, - 0x300F, 0x3011, 0x3015, 0x3017, 0x3019, 0x301B, 0xFD3E, 0xFE18, 0xFE36, 0xFE38, - 0xFE3A, 0xFE3C, 0xFE3E, 0xFE40, 0xFE42, 0xFE44, 0xFE48, 0xFE5A, 0xFE5C, 0xFE5E, - 0xFF09, 0xFF3D, 0xFF5D, 0xFF60, 0xFF63, + 0x0029, 0x005D, 0x007D, 0x0F3B, 0x0F3D, 0x169C, 0x2046, 0x207E, + 0x208E, 0x2309, 0x230B, 0x232A, 0x2769, 0x276B, 0x276D, 0x276F, + 0x2771, 0x2773, 0x2775, 0x27C6, 0x27E7, 0x27E9, 0x27EB, 0x27ED, + 0x27EF, 0x2984, 0x2986, 0x2988, 0x298A, 0x298C, 0x298E, 0x2990, + 0x2992, 0x2994, 0x2996, 0x2998, 0x29D9, 0x29DB, 0x29FD, 0x2E23, + 0x2E25, 0x2E27, 0x2E29, 0x2E56, 0x2E58, 0x2E5A, 0x2E5C, 0x3009, + 0x300B, 0x300D, 0x300F, 0x3011, 0x3015, 0x3017, 0x3019, 0x301B, + 0xFD3E, 0xFE18, 0xFE36, 0xFE38, 0xFE3A, 0xFE3C, 0xFE3E, 0xFE40, + 0xFE42, 0xFE44, 0xFE48, 0xFE5A, 0xFE5C, 0xFE5E, 0xFF09, 0xFF3D, + 0xFF5D, 0xFF60, 0xFF63, } @(rodata) @@ -1688,7 +1722,8 @@ pe_ranges := Range{ @(rodata) pf_singles16 := [?]u16{ - 0x00BB, 0x2019, 0x201D, 0x203A, 0x2E03, 0x2E05, 0x2E0A, 0x2E0D, 0x2E1D, 0x2E21, + 0x00BB, 0x2019, 0x201D, 0x203A, 0x2E03, 0x2E05, 0x2E0A, 0x2E0D, + 0x2E1D, 0x2E21, } pf_ranges := Range{ @@ -1697,7 +1732,8 @@ pf_ranges := Range{ @(rodata) pi_singles16 := [?]u16{ - 0x00AB, 0x2018, 0x201F, 0x2039, 0x2E02, 0x2E04, 0x2E09, 0x2E0C, 0x2E1C, 0x2E20, + 0x00AB, 0x2018, 0x201F, 0x2039, 0x2E02, 0x2E04, 0x2E09, 0x2E0C, + 0x2E1C, 0x2E20, } @(rodata) @@ -1712,10 +1748,11 @@ pi_ranges := Range{ @(rodata) po_singles16 := [?]u16{ - 0x002A, 0x002C, 0x005C, 0x00A1, 0x00A7, 0x00BF, 0x037E, 0x0387, 0x0589, 0x05C0, - 0x05C3, 0x05C6, 0x061B, 0x06D4, 0x085E, 0x0970, 0x09FD, 0x0A76, 0x0AF0, 0x0C77, - 0x0C84, 0x0DF4, 0x0E4F, 0x0F14, 0x0F85, 0x10FB, 0x166E, 0x1CD3, 0x2053, 0x2D70, - 0x2E0B, 0x2E1B, 0x2E41, 0x303D, 0x30FB, 0xA673, 0xA67E, 0xA8FC, 0xA95F, 0xABEB, + 0x002A, 0x002C, 0x005C, 0x00A1, 0x00A7, 0x00BF, 0x037E, 0x0387, + 0x0589, 0x05C0, 0x05C3, 0x05C6, 0x061B, 0x06D4, 0x085E, 0x0970, + 0x09FD, 0x0A76, 0x0AF0, 0x0C77, 0x0C84, 0x0DF4, 0x0E4F, 0x0F14, + 0x0F85, 0x10FB, 0x166E, 0x1CD3, 0x2053, 0x2D70, 0x2E0B, 0x2E1B, + 0x2E41, 0x303D, 0x30FB, 0xA673, 0xA67E, 0xA8FC, 0xA95F, 0xABEB, 0xFE19, 0xFE30, 0xFE68, 0xFF0A, 0xFF0C, 0xFF3C, 0xFF61, } @@ -1867,14 +1904,16 @@ po_ranges := Range{ @(rodata) ps_singles16 := [?]u16{ - 0x0028, 0x005B, 0x007B, 0x0F3A, 0x0F3C, 0x169B, 0x201A, 0x201E, 0x2045, 0x207D, - 0x208D, 0x2308, 0x230A, 0x2329, 0x2768, 0x276A, 0x276C, 0x276E, 0x2770, 0x2772, - 0x2774, 0x27C5, 0x27E6, 0x27E8, 0x27EA, 0x27EC, 0x27EE, 0x2983, 0x2985, 0x2987, - 0x2989, 0x298B, 0x298D, 0x298F, 0x2991, 0x2993, 0x2995, 0x2997, 0x29D8, 0x29DA, - 0x29FC, 0x2E22, 0x2E24, 0x2E26, 0x2E28, 0x2E42, 0x2E55, 0x2E57, 0x2E59, 0x2E5B, - 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016, 0x3018, 0x301A, 0x301D, - 0xFD3F, 0xFE17, 0xFE35, 0xFE37, 0xFE39, 0xFE3B, 0xFE3D, 0xFE3F, 0xFE41, 0xFE43, - 0xFE47, 0xFE59, 0xFE5B, 0xFE5D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F, 0xFF62, + 0x0028, 0x005B, 0x007B, 0x0F3A, 0x0F3C, 0x169B, 0x201A, 0x201E, + 0x2045, 0x207D, 0x208D, 0x2308, 0x230A, 0x2329, 0x2768, 0x276A, + 0x276C, 0x276E, 0x2770, 0x2772, 0x2774, 0x27C5, 0x27E6, 0x27E8, + 0x27EA, 0x27EC, 0x27EE, 0x2983, 0x2985, 0x2987, 0x2989, 0x298B, + 0x298D, 0x298F, 0x2991, 0x2993, 0x2995, 0x2997, 0x29D8, 0x29DA, + 0x29FC, 0x2E22, 0x2E24, 0x2E26, 0x2E28, 0x2E42, 0x2E55, 0x2E57, + 0x2E59, 0x2E5B, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, + 0x3016, 0x3018, 0x301A, 0x301D, 0xFD3F, 0xFE17, 0xFE35, 0xFE37, + 0xFE39, 0xFE3B, 0xFE3D, 0xFE3F, 0xFE41, 0xFE43, 0xFE47, 0xFE59, + 0xFE5B, 0xFE5D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F, 0xFF62, } ps_ranges := Range{ @@ -1883,8 +1922,8 @@ ps_ranges := Range{ @(rodata) sc_singles16 := [?]u16{ - 0x0024, 0x058F, 0x060B, 0x09FB, 0x0AF1, 0x0BF9, 0x0E3F, 0x17DB, 0xA838, 0xFDFC, - 0xFE69, 0xFF04, + 0x0024, 0x058F, 0x060B, 0x09FB, 0x0AF1, 0x0BF9, 0x0E3F, 0x17DB, + 0xA838, 0xFDFC, 0xFE69, 0xFF04, } @(rodata) @@ -1916,8 +1955,8 @@ sc_ranges := Range{ @(rodata) sk_singles16 := [?]u16{ - 0x005E, 0x0060, 0x00A8, 0x00AF, 0x00B4, 0x00B8, 0x02ED, 0x0375, 0x0888, 0x1FBD, - 0xAB5B, 0xFF3E, 0xFF40, 0xFFE3, + 0x005E, 0x0060, 0x00A8, 0x00AF, 0x00B4, 0x00B8, 0x02ED, 0x0375, + 0x0888, 0x1FBD, 0xAB5B, 0xFF3E, 0xFF40, 0xFFE3, } @(rodata) @@ -1953,9 +1992,10 @@ sk_ranges := Range{ @(rodata) sm_singles16 := [?]u16{ - 0x002B, 0x007C, 0x007E, 0x00AC, 0x00B1, 0x00D7, 0x00F7, 0x03F6, 0x2044, 0x2052, - 0x2118, 0x214B, 0x21A0, 0x21A3, 0x21A6, 0x21AE, 0x21D2, 0x21D4, 0x237C, 0x25B7, - 0x25C1, 0x266F, 0xFB29, 0xFE62, 0xFF0B, 0xFF5C, 0xFF5E, 0xFFE2, + 0x002B, 0x007C, 0x007E, 0x00AC, 0x00B1, 0x00D7, 0x00F7, 0x03F6, + 0x2044, 0x2052, 0x2118, 0x214B, 0x21A0, 0x21A3, 0x21A6, 0x21AE, + 0x21D2, 0x21D4, 0x237C, 0x25B7, 0x25C1, 0x266F, 0xFB29, 0xFE62, + 0xFF0B, 0xFF5C, 0xFF5E, 0xFFE2, } @(rodata) @@ -2009,10 +2049,11 @@ sm_ranges := Range{ @(rodata) so_singles16 := [?]u16{ - 0x00A6, 0x00A9, 0x00AE, 0x00B0, 0x0482, 0x06DE, 0x06E9, 0x07F6, 0x09FA, 0x0B70, - 0x0BFA, 0x0C7F, 0x0D4F, 0x0D79, 0x0F13, 0x0F34, 0x0F36, 0x0F38, 0x166D, 0x1940, - 0x2114, 0x2125, 0x2127, 0x2129, 0x212E, 0x214A, 0x214F, 0x21D3, 0x3004, 0x3020, - 0x31EF, 0x3250, 0xA839, 0xFFE4, 0xFFE8, + 0x00A6, 0x00A9, 0x00AE, 0x00B0, 0x0482, 0x06DE, 0x06E9, 0x07F6, + 0x09FA, 0x0B70, 0x0BFA, 0x0C7F, 0x0D4F, 0x0D79, 0x0F13, 0x0F34, + 0x0F36, 0x0F38, 0x166D, 0x1940, 0x2114, 0x2125, 0x2127, 0x2129, + 0x212E, 0x214A, 0x214F, 0x21D3, 0x3004, 0x3020, 0x31EF, 0x3250, + 0xA839, 0xFFE4, 0xFFE8, } @(rodata) @@ -2233,7 +2274,8 @@ extra_digits_ranges := Range{ @(rodata) other_lowercase_singles16 := [?]u16{ - 0x00AA, 0x00BA, 0x0345, 0x037A, 0x10FC, 0x1D78, 0x2071, 0x207F, 0xA770, 0xAB69, + 0x00AA, 0x00BA, 0x0345, 0x037A, 0x10FC, 0x1D78, 0x2071, 0x207F, + 0xA770, 0xAB69, } @(rodata) diff --git a/core/unicode/tools/ucd/generate_unicode.odin b/core/unicode/tools/ucd/generate_unicode.odin index ffa8a3be3..9494674a1 100644 --- a/core/unicode/tools/ucd/generate_unicode.odin +++ b/core/unicode/tools/ucd/generate_unicode.odin @@ -3,129 +3,112 @@ package ucd import "core:fmt" import "core:os" import "core:strings" -import "base:runtime" import "core:mem" import "core:io" import "core:log" // Table 2-3. Types of Code Points // Table 4-4. General_Category Values page 229 - // Reference https://www.unicode.org/reports/tr44/ - /* -Formats a Dynamic_Range into a set of fixed length arrays and writes -corresponding to a io.Writer. The value of the parameter `name`will be used as a -prefix to the array names. If a dynamic array contained in the `range` is empty, -no corresponding fixed length array will be written. +Formats a `Dynamic_Range` into a set of fixed length arrays and writes them to an `io.Writer`. +The value of the parameter `name` will be used as a prefix to the array names. + +If a dynamic array contained in the `range` is empty, no corresponding fixed length array will be written. Inputs: -- writer: The io.Writer to be written to. +- writer: The `io.Writer` to be written to. - name: Prefix to add to any array that is written to `writer` -- range: The Dynamic_Range to format and write to writer. +- range: `The Dynamic_Range` to format and write to writer. */ -write_range_arrays :: proc(writer: io.Writer, name: string, range: Dynamic_Range) -> int { - n_written : int +write_range_arrays :: proc(writer: io.Writer, name: string, range: Dynamic_Range) { if len(range.single_16) > 0 { - n_written += fmt.wprintln(writer, "@(rodata)") - n_written += fmt.wprintf(writer, "%s_singles16 := [?]u16{{", name) - line_length := 100 - for v in range.single_16 { - str_buffer : [32]byte - str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) - - if line_length + len(str) > 80 { - n_written += fmt.wprintf(writer, "\n") - line_length = fmt.wprintf(writer, "\t0x%4X,",v) - n_written += line_length + fmt.wprintln(writer, "@(rodata)") + fmt.wprintf(writer, "%s_singles16 := [?]u16{{", name) + for v, count in range.single_16 { + if count % 8 == 0 { + fmt.wprintf(writer, "\n\t0x%4X,", v) + continue } else { - temp, _ := io.write_string(writer, str) - line_length += temp - n_written += temp + fmt.wprintf(writer, " 0x%4X,", v) } } - n_written += fmt.wprintln(writer, "\n}\n") + fmt.wprintln(writer, "\n}\n") } if len(range.ranges_16) > 0 { - n_written += fmt.wprintln(writer, "@(rodata)") - n_written += fmt.wprintfln(writer, "%s_ranges16 := [?]u16{{", name) + fmt.wprintln(writer, "@(rodata)") + fmt.wprintfln(writer, "%s_ranges16 := [?]u16{{", name) for v in range.ranges_16 { - n_written += fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) + fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) } - n_written += fmt.wprintln(writer, "}\n") + fmt.wprintln(writer, "}\n") } if len(range.single_32) > 0 { - n_written += fmt.wprintln(writer, "@(rodata)") - n_written += fmt.wprintf(writer, "%s_singles32 := [?]i32{{", name) - line_length := 100 - for v in range.single_32 { - str_buffer : [32]byte - str := fmt.bprintf(str_buffer[:], " 0x%4X,",v) - - if line_length + len(str) > 80 { - n_written += fmt.wprint(writer, "\n") - line_length = fmt.wprintf(writer, "\t0x%4X,",v) - n_written += line_length + fmt.wprintln(writer, "@(rodata)") + fmt.wprintf(writer, "%s_singles32 := [?]i32{{", name) + for v, count in range.single_32 { + if count % 8 == 0 { + fmt.wprintf(writer, "\n\t0x%4X,", v) + continue } else { - temp, _ := io.write_string(writer, str) - line_length += temp - n_written += temp + fmt.wprintf(writer, " 0x%4X,", v) } } - n_written += fmt.wprintln(writer, "\n}\n") + fmt.wprintln(writer, "\n}\n") } if len(range.ranges_32) > 0 { - n_written += fmt.wprintln(writer, "@(rodata)") - n_written += fmt.wprintfln(writer, "%s_ranges32 := [?]i32{{", name) + fmt.wprintln(writer, "@(rodata)") + fmt.wprintfln(writer, "%s_ranges32 := [?]i32{{", name) for v in range.ranges_32 { - n_written += fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) + fmt.wprintfln(writer, "\t0x%4X, 0x%4X,", v.first, v.last) } - n_written += fmt.wprintln(writer, "}\n") + fmt.wprintln(writer, "}\n") } - return n_written + return } -write_range :: proc(writer: io.Writer, name: union{string, General_Category}, range: Dynamic_Range) -> (n_written: int) { +write_range :: proc(writer: io.Writer, name: union{string, General_Category}, range: Dynamic_Range) { buffer: [128]byte str: string - switch n in name{ + switch n in name { case string: assert(len(n) <= len(buffer)) - runtime.mem_copy(&buffer[0], raw_data(n), len(n)) - str = transmute(string) buffer[0:len(n)] + copy(buffer[:], n) + str = string(buffer[:len(n)]) case General_Category: str = fmt.bprintf(buffer[:], "%s", n) } + // lowercase table names for &b in buffer[0:len(str)] { if b >= 'A' && b <= 'Z' { b += ('a' - 'A') } } - n_written = write_range_arrays(writer, str, range) + write_range_arrays(writer, str, range) - n_written += fmt.wprintfln(writer, "%s_ranges := Range{{", str) + fmt.wprintfln(writer, "%s_ranges := Range{{", str) if len(range.single_16) > 0 { - n_written += fmt.wprintfln(writer, "\tsingle_16 = %s_singles16[:],", str) + fmt.wprintfln(writer, "\tsingle_16 = %s_singles16[:],", str) } if len(range.ranges_16) > 0 { - n_written += fmt.wprintfln(writer, "\tranges_16 = %s_ranges16[:],", str) + fmt.wprintfln(writer, "\tranges_16 = %s_ranges16[:],", str) } if len(range.single_32) > 0 { - n_written += fmt.wprintfln(writer, "\tsingle_32 = %s_singles32[:],", str) + fmt.wprintfln(writer, "\tsingle_32 = %s_singles32[:],", str) } if len(range.ranges_32) > 0 { - n_written += fmt.wprintfln(writer, "\tranges_32 = %s_ranges32[:],", str) + fmt.wprintfln(writer, "\tranges_32 = %s_ranges32[:],", str) } - n_written += fmt.wprintln(writer, "}\n") + fmt.wprintln(writer, "}\n") return } @@ -283,13 +266,13 @@ main :: proc() { //.Zs, // Space_Separator, a space character (of various non-zero widths) } - write_loop : for gc, i in general_category_ranges { + write_loop: for range, category in general_category_ranges { for excluded in to_exclude { - if i == excluded { + if category == excluded { continue write_loop } } - write_range(writer, i, gc) + write_range(writer, category, range) } write_range(writer, "extra_digits", extra_digits) diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index 27eb1ebb7..ea6283343 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -33,18 +33,18 @@ load_unicode_data :: proc(filename: string, allocator := context.allocator) -> ( str := string(data) line_loop: for _line in strings.split_lines_iterator(&str) { + // Ignore any comments line, _, _ := strings.partition(_line, "#") - if len(line) == 0 { - continue - } + + // Skip empty lines + if len(line) == 0 { continue } is_range := false - cp: rune - name: string - gc: General_Category - - num_6 : string - num_7 : string + cp: rune + name: string + gc: General_Category + num_6: string + num_7: string nt := Numeric_Type.None field_num := 0 @@ -76,7 +76,7 @@ load_unicode_data :: proc(filename: string, allocator := context.allocator) -> ( case 3: // Canonical_Combining_Class case 4: // Bidi Class case 5: // Decomposition_Type and Decomposition_Mapping - // Numeric_Type and Numberic_Value + // Numeric_Type and Numeric_Value case 6: num_6 = field From d880404b84506e61cea3d104aa954b10be6440c3 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 9 Mar 2026 19:40:10 +0100 Subject: [PATCH 069/273] Style --- core/unicode/tools/ucd/string_to.odin | 514 +++++++------------------- core/unicode/tools/ucd/types.odin | 188 +++++----- core/unicode/tools/ucd/ucd.odin | 53 ++- 3 files changed, 256 insertions(+), 499 deletions(-) diff --git a/core/unicode/tools/ucd/string_to.odin b/core/unicode/tools/ucd/string_to.odin index 7c9115f21..4f07d7e67 100644 --- a/core/unicode/tools/ucd/string_to.odin +++ b/core/unicode/tools/ucd/string_to.odin @@ -1,394 +1,162 @@ package ucd -string_to_general_category :: proc "contextless"( - str: string, -) -> (gc: General_Category, err: Error) { +string_to_general_category :: proc "contextless" (str: string) -> (gc: General_Category, err: Error) { switch str { - case "Lu": - gc = .Lu - case "Ll": - gc = .Ll - case "Lt": - gc = .Lt - case "Lm": - gc = .Lm - case "Lo": - gc = .Lo - case "Mn": - gc = .Mn - case "Mc": - gc = .Mc - case "Me": - gc = .Me - case "Nd": - gc = .Nd - case "Nl": - gc = .Nl - case "No": - gc = .No - case "Pc": - gc = .Pc - case "Pd": - gc = .Pd - case "Ps": - gc = .Ps - case "Pe": - gc = .Pe - case "Pi": - gc = .Pi - case "Pf": - gc = .Pf - case "Po": - gc = .Po - case "Sm": - gc = .Sm - case "Sc": - gc = .Sc - case "Sk": - gc = .Sk - case "So": - gc = .So - case "Zs": - gc = .Zs - case "Zl": - gc = .Zl - case "Zp": - gc = .Zp - case "Cc": - gc = .Cc - case "Cf": - gc = .Cf - case "Cs": - gc = .Cs - case "Co": - gc = .Co - case "Cn": - gc = .Cn - case: - err = UCD_Error.Invalid_General_Category + case "Lu": gc = .Lu + case "Ll": gc = .Ll + case "Lt": gc = .Lt + case "Lm": gc = .Lm + case "Lo": gc = .Lo + case "Mn": gc = .Mn + case "Mc": gc = .Mc + case "Me": gc = .Me + case "Nd": gc = .Nd + case "Nl": gc = .Nl + case "No": gc = .No + case "Pc": gc = .Pc + case "Pd": gc = .Pd + case "Ps": gc = .Ps + case "Pe": gc = .Pe + case "Pi": gc = .Pi + case "Pf": gc = .Pf + case "Po": gc = .Po + case "Sm": gc = .Sm + case "Sc": gc = .Sc + case "Sk": gc = .Sk + case "So": gc = .So + case "Zs": gc = .Zs + case "Zl": gc = .Zl + case "Zp": gc = .Zp + case "Cc": gc = .Cc + case "Cf": gc = .Cf + case "Cs": gc = .Cs + case "Co": gc = .Co + case "Cn": gc = .Cn + case: err = .Invalid_General_Category } return } - -string_to_age :: proc "contextless" ( - str: string, -) -> (age: Age, err: Error) { +string_to_proplist_property :: proc(str: string) -> (prop: Prop_List_Property) { switch str { - case "1.1": - age = .Age_1_1 - return - - case "2.0": - age = .Age_2_0 - return - - case "2.1": - age = .Age_2_1 - return - - case "3.0": - age = .Age_3_0 - return - - case "3.1": - age = .Age_3_1 - return - - case "3.2": - age = .Age_3_2 - return - - case "4.0": - age = .Age_4_0 - return - - case "4.1": - age = .Age_4_1 - return - - case "5.0": - age = .Age_5_0 - return - - case "5.1": - age = .Age_5_1 - return - - case "5.2": - age = .Age_5_2 - return - - case "6.0": - age = .Age_6_0 - return - - case "6.1": - age = .Age_6_1 - return - - case "6.2": - age = .Age_6_2 - return - - case "6.3": - age = .Age_6_3 - return - - case "7.0": - age = .Age_7_0 - return - - case "8.0": - age = .Age_8_0 - return - - case "9.0": - age = .Age_9_0 - return - - case "10.0": - age = .Age_10_0 - return - - case "11.0": - age = .Age_11_0 - return - - case "12.0": - age = .Age_12_0 - return - - case "12.1": - age = .Age_12_1 - return - - case "13.0": - age = .Age_13_0 - return - - case "14.0": - age = .Age_14_0 - return - - case "15.0": - age = .Age_15_0 - return - - case "15.1": - age = .Age_15_1 - return - - case "16.0": - age = .Age_16_0 - return - - case "17.0": - age = .Age_17_0 - return - - case "unassigned": - age = .Age_Unassigned - return - - case: - // NOTE: Should this return an error instead? - unreachable() + case "White_Space": prop = .White_Space + case "Bidi_Control": prop = .Bidi_Control + case "Join_Control": prop = .Join_Control + case "Dash": prop = .Dash + case "Hyphen": prop = .Hyphen + case "Quotation_Mark": prop = .Quotation_Mark + case "Terminal_Punctuation": prop = .Terminal_Punctuation + case "Other_Math": prop = .Other_Math + case "Hex_Digit": prop = .Hex_Digit + case "ASCII_Hex_Digit": prop = .ASCII_Hex_Digit + case "Other_Alphabetic": prop = .Other_Alphabetic + case "Ideographic": prop = .Ideographic + case "Diacritic": prop = .Diacritic + case "Extender": prop = .Extender + case "Other_Lowercase": prop = .Other_Lowercase + case "Other_Uppercase": prop = .Other_Uppercase + case "Noncharacter_Code_Point": prop = .Noncharacter_Code_Point + case "Other_Grapheme_Extend": prop = .Other_Grapheme_Extend + case "IDS_Binary_Operator": prop = .IDS_Binary_Operator + case "IDS_Trinary_Operator": prop = .IDS_Trinary_Operator + case "IDS_Unary_Operator": prop = .IDS_Unary_Operator + case "Radical": prop = .Radical + case "Unified_Ideograph": prop = .Unified_Ideograph + case "Other_Default_Ignorable_Code_Point": prop = .Other_Default_Ignorable_Code_Point + case "Deprecated": prop = .Deprecated + case "Soft_Dotted": prop = .Soft_Dotted + case "Logical_Order_Exception": prop = .Logical_Order_Exception + case "Other_ID_Start": prop = .Other_ID_Start + case "Other_ID_Continue": prop = .Other_ID_Continue + case "ID_Compat_Math_Continue": prop = .ID_Compat_Math_Continue + case "ID_Compat_Math_Start": prop = .ID_Compat_Math_Start + case "Sentence_Terminal": prop = .Sentence_Terminal + case "Variation_Selector": prop = .Variation_Selector + case "Pattern_White_Space": prop = .Pattern_White_Space + case "Pattern_Syntax": prop = .Pattern_Syntax + case "Prepended_Concatenation_Mark": prop = .Prepended_Concatenation_Mark + case "Regional_Indicator": prop = .Regional_Indicator + case "Modifier_Combining_Mark": prop = .Modifier_Combining_Mark + case: prop = .Unknown_Property } + return } - -string_to_paired_bracket_type :: proc "contextless"(str: string) -> Paired_Brack_Type { +@(deprecated="Unused?") +string_to_age :: proc "contextless" (str: string) -> (age: Age) { switch str { - case "o": - return .Open - case "c": - return .Close - case "n": - return .None - case: - // TODO: Add error for this - unreachable() + case "1.1": age = .Age_1_1 + case "2.0": age = .Age_2_0 + case "2.1": age = .Age_2_1 + case "3.0": age = .Age_3_0 + case "3.1": age = .Age_3_1 + case "3.2": age = .Age_3_2 + case "4.0": age = .Age_4_0 + case "4.1": age = .Age_4_1 + case "5.0": age = .Age_5_0 + case "5.1": age = .Age_5_1 + case "5.2": age = .Age_5_2 + case "6.0": age = .Age_6_0 + case "6.1": age = .Age_6_1 + case "6.2": age = .Age_6_2 + case "6.3": age = .Age_6_3 + case "7.0": age = .Age_7_0 + case "8.0": age = .Age_8_0 + case "9.0": age = .Age_9_0 + case "10.0": age = .Age_10_0 + case "11.0": age = .Age_11_0 + case "12.0": age = .Age_12_0 + case "12.1": age = .Age_12_1 + case "13.0": age = .Age_13_0 + case "14.0": age = .Age_14_0 + case "15.0": age = .Age_15_0 + case "15.1": age = .Age_15_1 + case "16.0": age = .Age_16_0 + case "17.0": age = .Age_17_0 + case "unassigned": age = .Age_Unassigned + case: age = .Age_Unknown } + return } -string_to_bidi_class :: proc "contextless"(str: string) -> Bidi_Class { +@(deprecated="Unused?") +string_to_paired_bracket_type :: proc "contextless" (str: string) -> (pbt: Paired_Bracket_Type) { switch str { - case "AL": - return .AL - case "AN": - return .AN - case "B": - return .B - case "BN": - return .BN - case "CS": - return .CS - case "EN": - return .EN - case "ES": - return .ES - case "ET": - return .ET - case "FSI": - return .FSI - case "L": - return .L - case "LRE": - return .LRE - case "LRI": - return .LRI - case "LRO": - return .LRO - case "NSM": - return .NSM - case "ON": - return .ON - case "PDF": - return .PDF - case "PDI": - return .PDI - case "R": - return .R - case "RLE": - return .RLE - case "RLI": - return .RLI - case "RLO": - return .RLO - case "S": - return .S - case "WS": - return .WS - case: unreachable() // TODO: Add error for this + case "o": pbt = .Open + case "c": pbt = .Close + case "n": pbt = .None + case: pbt = .Unknown } + return } -string_to_proplist_property :: proc(str: string) -> ( - prop: PropList_Property, - err: UCD_Error, -) { - +@(deprecated="Unused?") +string_to_bidi_class :: proc "contextless" (str: string) -> (class: Bidi_Class) { switch str { - case "White_Space": - prop = .White_Space - - case "Bidi_Control": - prop = .Bidi_Control - - case "Join_Control": - prop = .Join_Control - - case "Dash": - prop = .Dash - - case "Hyphen": - prop = .Hyphen - - case "Quotation_Mark": - prop = .Quotation_Mark - - case "Terminal_Punctuation": - prop = .Terminal_Punctuation - - case "Other_Math": - prop = .Other_Math - - case "Hex_Digit": - prop = .Hex_Digit - - case "ASCII_Hex_Digit": - prop = .ASCII_Hex_Digit - - case "Other_Alphabetic": - prop = .Other_Alphabetic - - case "Ideographic": - prop = .Ideographic - - case "Diacritic": - prop = .Diacritic - - case "Extender": - prop = .Extender - - case "Other_Lowercase": - prop = .Other_Lowercase - - case "Other_Uppercase": - prop = .Other_Uppercase - - - case "Noncharacter_Code_Point": - prop = .Noncharacter_Code_Point - - case "Other_Grapheme_Extend": - prop = .Other_Grapheme_Extend - - case "IDS_Binary_Operator": - prop = .IDS_Binary_Operator - - case "IDS_Trinary_Operator": - prop = .IDS_Trinary_Operator - - case "IDS_Unary_Operator": - prop = .IDS_Unary_Operator - - case "Radical": - prop = .Radical - - case "Unified_Ideograph": - prop = .Unified_Ideograph - - case "Other_Default_Ignorable_Code_Point": - prop = .Other_Default_Ignorable_Code_Point - - case "Deprecated": - prop = .Deprecated - - case "Soft_Dotted": - prop = .Soft_Dotted - - case "Logical_Order_Exception": - prop = .Logical_Order_Exception - - case "Other_ID_Start": - prop = .Other_ID_Start - - case "Other_ID_Continue": - prop = .Other_ID_Continue - - case "ID_Compat_Math_Continue": - prop = .ID_Compat_Math_Continue - - case "ID_Compat_Math_Start": - prop = .ID_Compat_Math_Start - - case "Sentence_Terminal": - prop = .Sentence_Terminal - - case "Variation_Selector": - prop = .Variation_Selector - - case "Pattern_White_Space": - prop = .Pattern_White_Space - - case "Pattern_Syntax": - prop = .Pattern_Syntax - - case "Prepended_Concatenation_Mark": - prop = .Prepended_Concatenation_Mark - - case "Regional_Indicator": - prop = .Regional_Indicator - - case "Modifier_Combining_Mark": - prop = .Modifier_Combining_Mark - - case: - err = .Unknown_Property - return + case "AL": class = .AL + case "AN": class = .AN + case "B": class = .B + case "BN": class = .BN + case "CS": class = .CS + case "EN": class = .EN + case "ES": class = .ES + case "ET": class = .ET + case "FSI": class = .FSI + case "L": class = .L + case "LRE": class = .LRE + case "LRI": class = .LRI + case "LRO": class = .LRO + case "NSM": class = .NSM + case "ON": class = .ON + case "PDF": class = .PDF + case "PDI": class = .PDI + case "R": class = .R + case "RLE": class = .RLE + case "RLI": class = .RLI + case "RLO": class = .RLO + case "S": class = .S + case "WS": class = .WS + case: class = .Unknown } - - return -} + return +} \ No newline at end of file diff --git a/core/unicode/tools/ucd/types.odin b/core/unicode/tools/ucd/types.odin index 0ba6f8909..5b87f96f8 100644 --- a/core/unicode/tools/ucd/types.odin +++ b/core/unicode/tools/ucd/types.odin @@ -3,7 +3,7 @@ package ucd import "core:os" Age :: enum byte { - Nil = 0, + Age_Unknown = 0, Age_1_1, Age_2_0, Age_2_1, @@ -421,51 +421,49 @@ Block :: enum { Combining_Class :: distinct byte -Paired_Brack_Type :: enum { - Nil, +Paired_Bracket_Type :: enum { + Unknown, Open, Close, None, } Bidi_Class :: enum { - Nil, // - L, // Left-to-Right LRM - R, // Right-to-Left RLM - AL, // Right-to-Left Arabic ALM - EN, // European Number - ES, // European Number Separator - ET, // European Number Terminator - AN, // Arabic Number - CS, // Common Number Separator - NSM, // Nonspacing Mark - BN, // Boundary Neutral - B, // Paragraph Separator - S, // Segment Separator - WS, // Whitespace - ON, // Other Neutrals - LRE, // Left-to-Right Embedding LRE - LRO, // Left-to-Right Override LRO - RLE, // Right-to-Left Embedding RLE - RLO, // Right-to-Left Override RLO - PDF, // Pop Directional Format PDF - LRI, // Left-to-Right Isolate LRI - RLI, // Right-to-Left Isolate RLI - FSI, // First Strong Isolate FSI - PDI, // Pop Directional Isolate PDI + Unknown, // + L, // Left-to-Right LRM + R, // Right-to-Left RLM + AL, // Right-to-Left Arabic ALM + EN, // European Number + ES, // European Number Separator + ET, // European Number Terminator + AN, // Arabic Number + CS, // Common Number Separator + NSM, // Nonspacing Mark + BN, // Boundary Neutral + B, // Paragraph Separator + S, // Segment Separator + WS, // Whitespace + ON, // Other Neutrals + LRE, // Left-to-Right Embedding LRE + LRO, // Left-to-Right Override LRO + RLE, // Right-to-Left Embedding RLE + RLO, // Right-to-Left Override RLO + PDF, // Pop Directional Format PDF + LRI, // Left-to-Right Isolate LRI + RLI, // Right-to-Left Isolate RLI + FSI, // First Strong Isolate FSI + PDI, // Pop Directional Isolate PDI } - Bidi :: struct { - bc: Bidi_Class, + bc: Bidi_Class, bmg: Maybe(rune), // mirrored glyph - m: bool, // Bidi mirrored - c: bool, // Bidi control property - bpt : Paired_Brack_Type, // bidi paired bracket type - bpb : rune, // bidi paired bracket properties + m: bool, // Bidi mirrored + c: bool, // Bidi control property + pb: Paired_Bracket_Type, // bidi paired bracket type + bpb: rune, // bidi paired bracket properties } - Decomposition_Type :: enum { Nil = 0, can, @@ -490,71 +488,71 @@ Decomposition_Type :: enum { Trinary_Bool :: enum { Maybe = -1, - False = 0, - True = 1, + False = 0, + True = 1, } Decomposition_Mapping :: distinct [dynamic]rune Decomposition :: struct { - dt: Decomposition_Type, // Decomposition type - dm: Decomposition_Mapping, // Decomposition Mapping - ce: bool, // Composition Exclusion - comp_ex: bool, // Full Composition Exclusion - nfc_quick_check: Trinary_Bool, - nfd_quick_check: bool, + dt: Decomposition_Type, // Decomposition type + dm: Decomposition_Mapping, // Decomposition Mapping + ce: bool, // Composition Exclusion + comp_ex: bool, // Full Composition Exclusion + nfc_quick_check: Trinary_Bool, + nfd_quick_check: bool, nfkc_quick_check: Trinary_Bool, nfkd_quick_check: bool, } Numeric_Type :: enum { - None = 0, // None - Decimal, // De - Digit, // Di - Numeric, // Nu + None = 0, // None + Decimal, // De + Digit, // Di + Numeric, // Nu } /* Note: Value is NAN when numberator and denominator ar 0 */ Numberic_Value :: struct { - numerator: int, + numerator: int, denominator: int, } Char :: struct { - cp: rune, - name: string, - gc: General_Category, - ccc: Combining_Class, - bc: Bidi_Class, - dt: Decomposition_Type, - dm: Decomposition_Mapping, - nt: Numeric_Type, - nv: Numberic_Value, - bm: bool, + cp: rune, + name: string, + gc: General_Category, + ccc: Combining_Class, + bc: Bidi_Class, + dt: Decomposition_Type, + dm: Decomposition_Mapping, + nt: Numeric_Type, + nv: Numberic_Value, + bm: bool, name1: string, - sum: string, // Simple uppercase mapping - slm: string, // Simple lowercase mapping - stm: string, // Simple titlecase_mapping + sum: string, // Simple uppercase mapping + slm: string, // Simple lowercase mapping + stm: string, // Simple titlecase_mapping } Char_Range :: struct { first_cp: rune, - last_cp: rune, - name: string, - gc: General_Category, - ccc: Combining_Class, - bc: Bidi_Class, - dt: Decomposition_Type, - dm: Decomposition_Mapping, - nt: Numeric_Type, - nv: Numberic_Value, - bm: bool, - name1: string, - sum: string, // Simple uppercase mapping - slm: string, // Simple lowercase mapping - stm: string, // Simple titlecase_mapping + last_cp: rune, + name: string, + gc: General_Category, + ccc: Combining_Class, + bc: Bidi_Class, + dt: Decomposition_Type, + dm: Decomposition_Mapping, + nt: Numeric_Type, + nv: Numberic_Value, + bm: bool, + name1: string, + sum: string, // Simple uppercase mapping + slm: string, // Simple lowercase mapping + stm: string, // Simple titlecase_mapping } Chars :: union { @@ -565,7 +563,8 @@ Chars :: union { Unicode_Data :: distinct [dynamic]Chars -PropList_Property :: enum { +Prop_List_Property :: enum { + Unknown, White_Space, Bidi_Control, Join_Control, @@ -613,6 +612,7 @@ UCD_Error :: enum { Element_Not_Repertoire, Extra_Fields, Unknown_Property, + Unknown_Bidi_Class, NO_REPERTOIRE, UNEXPECTED_STRING, @@ -632,71 +632,63 @@ Error :: union #shared_nil { Range_u16 :: struct { first: u16, - last: u16, + last: u16, } Range_i32 :: struct { first: i32, - last: i32, + last: i32, } Range_Rune :: struct { first: rune, - last: rune, + last: rune, } Dynamic_Range :: struct { - single_16 : [dynamic]u16, - ranges_16 : [dynamic]Range_u16, - single_32 : [dynamic]i32, - ranges_32 : [dynamic]Range_i32, + single_16: [dynamic]u16, + ranges_16: [dynamic]Range_u16, + single_32: [dynamic]i32, + ranges_32: [dynamic]Range_i32, } -append_to_dynamic_range :: proc( - dr: ^Dynamic_Range, - range: Range_Rune, - allocator := context.allocator, -) { +append_to_dynamic_range :: proc(dr: ^Dynamic_Range, range: Range_Rune, allocator := context.allocator) { if range.first == range.last && range.first <= 0xFFFF { if len(dr.single_16) == 0 { dr.single_16 = make([dynamic]u16, 0, 512, allocator) } - append(&dr.single_16, cast(u16) range.first) + append(&dr.single_16, cast(u16)range.first) } else if range.first == range.last { if len(dr.single_32) == 0 { dr.single_32 = make([dynamic]i32, 0, 512, allocator) } - append(&dr.single_32, cast(i32) range.first) + append(&dr.single_32, cast(i32)range.first) } else if range.first <= 0xFFFF && range.last <= 0xFFFF { if len(dr.ranges_16) == 0 { dr.ranges_16 = make([dynamic]Range_u16, 0, 128, allocator) } - r := Range_u16{ cast(u16)range.first, cast(u16) range.last} + r := Range_u16{ cast(u16)range.first, cast(u16)range.last} append(&dr.ranges_16, r) } else { if len(dr.ranges_32) == 0 { dr.ranges_32 = make([dynamic]Range_i32, 0, 128, allocator) } - r := Range_i32{ cast(i32)range.first, cast(i32) range.last} + r := Range_i32{ cast(i32)range.first, cast(i32)range.last} append(&dr.ranges_32, r) } } -destroy_dynamic_range :: proc ( - dr: Dynamic_Range, -){ +destroy_dynamic_range :: proc(dr: Dynamic_Range) { delete(dr.ranges_16) delete(dr.ranges_32) delete(dr.single_16) delete(dr.single_32) } -destroy_general_category_ranges :: proc( - gcr: [General_Category]Dynamic_Range, -){ +destroy_general_category_ranges :: proc(gcr: [General_Category]Dynamic_Range) { for r in gcr { destroy_dynamic_range(r) } -} +} \ No newline at end of file diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index ea6283343..328fe06b8 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -98,38 +98,39 @@ load_unicode_data :: proc(filename: string, allocator := context.allocator) -> ( nt = .None } - case 9: // Bidi mirrored + case 9: // Bidi mirrored case 10: // Unicode 1 Name (Obsolete as of 6.2.0) case 11: // should be null case 12: case 13: case 14: - case: - unreachable() + case: + err = .Extra_Fields + return } } if is_range { - cr : Char_Range - cr.gc = gc - cr.first_cp = first_cp - cr.last_cp = cp - cr.name = name - cr.nt = nt - append(&unicode_data, cr) + append(&unicode_data, Char_Range { + gc = gc, + first_cp = first_cp, + last_cp = cp, + name = name, + nt = nt, + }) } else { - c : Char - c.gc = gc - c.cp = cp - c.name = name - c.nt = nt - append(&unicode_data, c) + append(&unicode_data, Char{ + gc = gc, + cp = cp, + name = name, + nt = nt, + }) } } return } -destroy_unicode_data :: proc(unicode_data: Unicode_Data){ +destroy_unicode_data :: proc(unicode_data: Unicode_Data) { for point in unicode_data { switch p in point { case Char: @@ -143,9 +144,9 @@ destroy_unicode_data :: proc(unicode_data: Unicode_Data){ gc_ranges :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (lst: [General_Category]Dynamic_Range) { - range := Range_Rune { + range := Range_Rune{ first = -1, - last = -1, + last = -1, } gc: General_Category @@ -174,6 +175,7 @@ gc_ranges :: proc(ud: ^Unicode_Data, allocator := context.allocator) -> (lst: [G range.last = -1 } } + if range.first != -1 { append_to_dynamic_range(&lst[gc], range, allocator) } @@ -274,15 +276,10 @@ load_property_list :: proc(filename: string, allocator := context.allocator) -> field := strings.trim_space(_field) switch i { - case 0: // Code point or code point range - rr.first, rr.last = decode_rune(field) or_return - - case 1: - prop = string_to_proplist_property(field) or_return - - case: - err = UCD_Error.Extra_Fields - return + // Code point or code point range + case 0: rr.first, rr.last = decode_rune(field) or_return + case 1: prop = string_to_proplist_property(field) or_return + case: return {}, .Extra_Fields } } From e119b9883f9ac846078b71c8da3568a4afa8d0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tar=C4=B1k=20B=2E?= Date: Tue, 10 Mar 2026 00:05:46 +0100 Subject: [PATCH 070/273] Use fi.space instead of fi.hash --- core/fmt/fmt.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index e955141fc..f1601f278 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2592,7 +2592,7 @@ fmt_named_buitlin_custom_formatters :: proc(fi: ^Info, v: any, verb: rune, info: prec = 6 buf[w] = 'm' } - if fi.hash { + if fi.space { w -= 1 buf[w] = ' ' } @@ -2601,7 +2601,7 @@ fmt_named_buitlin_custom_formatters :: proc(fi: ^Info, v: any, verb: rune, info: } else { w -= 1 buf[w] = 's' - if fi.hash { + if fi.space { w -= 1 buf[w] = ' ' } From 20b4d5757f5152f6519826dbfd19006fdd064805 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Mon, 9 Mar 2026 19:25:00 -0400 Subject: [PATCH 071/273] Corrected type name Prop_List_Property --- core/unicode/tools/ucd/string_to.odin | 4 ++-- core/unicode/tools/ucd/ucd.odin | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/unicode/tools/ucd/string_to.odin b/core/unicode/tools/ucd/string_to.odin index 4f07d7e67..26093a3a9 100644 --- a/core/unicode/tools/ucd/string_to.odin +++ b/core/unicode/tools/ucd/string_to.odin @@ -77,7 +77,7 @@ string_to_proplist_property :: proc(str: string) -> (prop: Prop_List_Property) { case "Prepended_Concatenation_Mark": prop = .Prepended_Concatenation_Mark case "Regional_Indicator": prop = .Regional_Indicator case "Modifier_Combining_Mark": prop = .Modifier_Combining_Mark - case: prop = .Unknown_Property + case: prop = .Unknown } return } @@ -159,4 +159,4 @@ string_to_bidi_class :: proc "contextless" (str: string) -> (class: Bidi_Class) case: class = .Unknown } return -} \ No newline at end of file +} diff --git a/core/unicode/tools/ucd/ucd.odin b/core/unicode/tools/ucd/ucd.odin index 328fe06b8..165147bbd 100644 --- a/core/unicode/tools/ucd/ucd.odin +++ b/core/unicode/tools/ucd/ucd.odin @@ -237,7 +237,7 @@ Data contained in the Unicode fiel PropList.txt A `Prop_List` is the data contained in the Unicode Database (UCD) file `PropList.txt`. It is created with the procedure `load_property_list` and destroyed with the procedure `destroy_property_list`. */ -Prop_List :: [PropList_Property]Dynamic_Range +Prop_List :: [Prop_List_Property]Dynamic_Range /* This function destroys a `Prop_List` created by `load_property_list`. @@ -268,7 +268,7 @@ load_property_list :: proc(filename: string, allocator := context.allocator) -> } rr: Range_Rune - prop: PropList_Property + prop: Prop_List_Property i := 0 for _field in strings.split_iterator(&line, ";") { @@ -287,4 +287,4 @@ load_property_list :: proc(filename: string, allocator := context.allocator) -> } return -} \ No newline at end of file +} From d3a71c5dc64a3afdd7e7ebbc0660218c5623e485 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Mon, 9 Mar 2026 19:32:27 -0400 Subject: [PATCH 072/273] string_to_proplist_property returns error string_to_proplist_property was being used with an or_return but did not return an error. The function now returns an error when it cannot identify a property. --- core/unicode/tools/ucd/string_to.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/unicode/tools/ucd/string_to.odin b/core/unicode/tools/ucd/string_to.odin index 26093a3a9..873c162b7 100644 --- a/core/unicode/tools/ucd/string_to.odin +++ b/core/unicode/tools/ucd/string_to.odin @@ -37,7 +37,7 @@ string_to_general_category :: proc "contextless" (str: string) -> (gc: General_C return } -string_to_proplist_property :: proc(str: string) -> (prop: Prop_List_Property) { +string_to_proplist_property :: proc(str: string) -> (prop: Prop_List_Property, err: Error) { switch str { case "White_Space": prop = .White_Space case "Bidi_Control": prop = .Bidi_Control @@ -78,6 +78,7 @@ string_to_proplist_property :: proc(str: string) -> (prop: Prop_List_Property) { case "Regional_Indicator": prop = .Regional_Indicator case "Modifier_Combining_Mark": prop = .Modifier_Combining_Mark case: prop = .Unknown + err = UCD_Error.Unknown_Property } return } From 72db43f2d6b03fe99570eff706212be427aa44e8 Mon Sep 17 00:00:00 2001 From: turu Date: Mon, 9 Mar 2026 21:33:23 -0500 Subject: [PATCH 073/273] correcting SIMD shr examples documentation --- core/simd/simd.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/simd/simd.odin b/core/simd/simd.odin index e2373d3e2..52c97cc45 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -493,7 +493,7 @@ Example: +-------+-------+-------+-------+ res: +-------+-------+-------+--------+ - | 0x04 | 0x2a | 0 | 0xff | + | 0x04 | 0x2a | 0 | 0x7f | +-------+-------+-------+--------+ */ shr :: intrinsics.simd_shr @@ -581,7 +581,7 @@ Example: +-------+-------+-------+-------+ res: +-------+-------+-------+--------+ - | 0x04 | 0x2a | 0x01 | 0xff | + | 0x04 | 0x2a | 0x01 | 0x7f | +-------+-------+-------+--------+ */ shr_masked :: intrinsics.simd_shr_masked From 5a82f06ba10dcdcb3cf384d30e0f3c879cb05ef1 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Mon, 9 Mar 2026 14:51:35 -0400 Subject: [PATCH 074/273] Add virtual arena tests for bug #5821 --- tests/core/mem/test_core_mem.odin | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/core/mem/test_core_mem.odin b/tests/core/mem/test_core_mem.odin index 9d64e50a3..3afd49a06 100644 --- a/tests/core/mem/test_core_mem.odin +++ b/tests/core/mem/test_core_mem.odin @@ -57,6 +57,33 @@ test_align_bumping_block_limit :: proc(t: ^testing.T) { testing.expect(t, len(data) == 896) } +@(test) +test_large_minimum_block_size :: proc(t: ^testing.T) { + a: virtual.Arena + defer virtual.arena_destroy(&a) + + init_err := virtual.arena_init_growing(&a, 16*mem.Megabyte) + testing.expect_value(t, init_err, nil) + + align : uint = 4 + for _ in 0..<6 { + data, err := virtual.arena_alloc(&a, 18874368, align) + testing.expect_value(t, err, nil) + testing.expect(t, len(data) == 18874368) + testing.expect(t, uintptr(raw_data(data)) & uintptr(align-1) == 0) + align *= 2 + virtual.arena_free_all(&a) + } + + align = 4 + for _ in 0..<32 { + data, err := virtual.arena_alloc(&a, 1048576, align) + testing.expect_value(t, err, nil) + testing.expect(t, len(data) == 1048576) + testing.expect(t, uintptr(raw_data(data)) & uintptr(align-1) == 0) + } +} + @(test) tlsf_test_overlap_and_zero :: proc(t: ^testing.T) { default_allocator := context.allocator From 5d80809dc845b890f75288b3e2b644ada42c4498 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Mon, 9 Mar 2026 14:58:58 -0400 Subject: [PATCH 075/273] Fix virtual arena memory block overcommit bug #5821 --- core/mem/virtual/arena.odin | 4 ++-- core/mem/virtual/virtual.odin | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/mem/virtual/arena.odin b/core/mem/virtual/arena.odin index b515aa3cf..bcf3ee702 100644 --- a/core/mem/virtual/arena.odin +++ b/core/mem/virtual/arena.odin @@ -141,9 +141,9 @@ arena_alloc_unguarded :: proc(arena: ^Arena, size: uint, alignment: uint, loc := needed := mem.align_forward_uint(size, alignment) needed = max(needed, arena.default_commit_size) - block_size := max(needed, arena.minimum_block_size) + block_size := max(needed, arena.minimum_block_size) + alignment - new_block := memory_block_alloc(needed, block_size, alignment, {}) or_return + new_block := memory_block_alloc(needed, block_size) or_return new_block.prev = arena.curr_block arena.curr_block = new_block arena.total_reserved += new_block.reserved diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin index 3f388acf3..d37c61267 100644 --- a/core/mem/virtual/virtual.odin +++ b/core/mem/virtual/virtual.odin @@ -154,7 +154,7 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: uint, pmblock.committed = platform_total_commit block.committed = pmblock.committed - base_offset - + assert(block.committed <= block.reserved) } return } @@ -174,7 +174,7 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: uint, err = .Out_Of_Memory return } - assert(block.committed <= block.reserved) + do_commit_if_necessary(block, size, default_commit_size) or_return data = block.base[block.used+alignment_offset:][:min_size] From c9e55d3add43d5627478b4aa4bf87a22bc1c9b91 Mon Sep 17 00:00:00 2001 From: bymehul Date: Tue, 10 Mar 2026 23:21:19 +0530 Subject: [PATCH 076/273] fix: handle full-width bit_field literal masks --- src/llvm_backend_expr.cpp | 26 +++++++++++--------------- tests/issues/run.sh | 1 + tests/issues/test_issue_6396.odin | 23 +++++++++++++++++++++++ 3 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 tests/issues/test_issue_6396.odin diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 81d7a4e36..1685f9627 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1,5 +1,14 @@ gb_internal lbValue lb_emit_arith_matrix(lbProcedure *p, TokenKind op, lbValue lhs, lbValue rhs, Type *type, bool component_wise); +gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) { + GB_ASSERT(bit_count <= 64); + if (bit_count == 0) { + return LLVMConstInt(type, 0, false); + } + u64 mask = bit_count == 64 ? ~0ull : (1ull<module; @@ -5148,13 +5157,7 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { for (isize i = 0; i < fields.count; i++) { auto const &f = fields[i]; - LLVMValueRef mask = LLVMConstInt(lit, 1, false); - #if LLVM_VERSION_MAJOR >= 19 - mask = LLVMBuildShl(p->builder, mask, LLVMConstInt(lit, f.bit_size, false), ""); - #else - mask = LLVMConstShl(mask, LLVMConstInt(lit, f.bit_size, false)); - #endif - mask = LLVMConstSub(mask, LLVMConstInt(lit, 1, false)); + LLVMValueRef mask = lb_const_low_bits_mask(lit, f.bit_size); LLVMValueRef elem = values[i].value; if (lb_sizeof(lit) < lb_sizeof(LLVMTypeOf(elem))) { @@ -5200,13 +5203,7 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { GB_ASSERT(mask_width > 0); bits_to_set -= mask_width; - LLVMValueRef mask = LLVMConstInt(vt, 1, false); - #if LLVM_VERSION_MAJOR >= 19 - mask = LLVMBuildShl(p->builder, mask, LLVMConstInt(vt, mask_width, false), ""); - #else - mask = LLVMConstShl(mask, LLVMConstInt(vt, mask_width, false)); - #endif - mask = LLVMConstSub(mask, LLVMConstInt(vt, 1, false)); + LLVMValueRef mask = lb_const_low_bits_mask(vt, mask_width); LLVMValueRef to_set = LLVMBuildAnd(p->builder, val, mask, ""); @@ -6076,4 +6073,3 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { return {}; } - diff --git a/tests/issues/run.sh b/tests/issues/run.sh index 6c6796e28..e2e45dbfa 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -36,6 +36,7 @@ $ODIN test ../test_issue_5699.odin $COMMON $ODIN test ../test_issue_6068.odin $COMMON $ODIN test ../test_issue_6101.odin $COMMON $ODIN test ../test_issue_6165.odin $COMMON +$ODIN test ../test_issue_6396.odin $COMMON if [[ $($ODIN build ../test_issue_6240.odin $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 3 ]] ; then echo "SUCCESSFUL 1/1" else diff --git a/tests/issues/test_issue_6396.odin b/tests/issues/test_issue_6396.odin new file mode 100644 index 000000000..5a0e7527c --- /dev/null +++ b/tests/issues/test_issue_6396.odin @@ -0,0 +1,23 @@ +// Tests issue #6396 https://github.com/odin-lang/Odin/issues/6396 +package test_issues + +import "core:testing" + +Issue6396_Full_Width_Field :: bit_field u32 { + a: u32 | 32, +} + +@test +test_issue_6396_full_width_bit_field_literal :: proc(t: ^testing.T) { + f0: Issue6396_Full_Width_Field = {a = 7} + testing.expect_value(t, f0.a, u32(7)) + + f0 = {a = 3} + testing.expect_value(t, f0.a, u32(3)) + + f0 = Issue6396_Full_Width_Field{a = 11} + testing.expect_value(t, f0.a, u32(11)) + + f0.a = 12 + testing.expect_value(t, f0.a, u32(12)) +} From 763c8d3a428994f7474a8234497936aed0438e6b Mon Sep 17 00:00:00 2001 From: bymehul Date: Wed, 11 Mar 2026 03:04:26 +0530 Subject: [PATCH 077/273] Fix generic cycle deadlock in struct layout --- src/types.cpp | 5 +++-- tests/issues/run.bat | 1 + tests/issues/run.sh | 6 ++++++ tests/issues/test_issue_6401.odin | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 tests/issues/test_issue_6401.odin diff --git a/src/types.cpp b/src/types.cpp index 0ecce1adc..b11e95452 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -4201,8 +4201,9 @@ gb_internal i64 type_align_of_internal(Type *t, TypePath *path) { if (t->Struct.is_packed) { return 1; } - - type_set_offsets(t); + // Avoid forcing offset computation here. The caller's type-path state must + // be able to detect recursive field cycles before any nested struct tries to + // re-enter this struct's offset mutex. i64 max = 1; for_array(i, t->Struct.fields) { diff --git a/tests/issues/run.bat b/tests/issues/run.bat index 9e722886d..3db9d48c2 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -31,6 +31,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_6101.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_6165.odin %COMMON% || exit /b ..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b +..\..\..\odin build ..\test_issue_6401.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index e2e45dbfa..01e6a6a28 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -43,6 +43,12 @@ else echo "SUCCESSFUL 0/1" exit 1 fi +if [[ $($ODIN build ../test_issue_6401.odin $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 3 ]] ; then + echo "SUCCESSFUL 1/1" +else + echo "SUCCESSFUL 0/1" + exit 1 +fi set +x popd diff --git a/tests/issues/test_issue_6401.odin b/tests/issues/test_issue_6401.odin new file mode 100644 index 000000000..0f7cd58b6 --- /dev/null +++ b/tests/issues/test_issue_6401.odin @@ -0,0 +1,16 @@ +// Tests issue #6401 https://github.com/odin-lang/Odin/issues/6401 +package test_issues + +Wrapper :: struct(T: typeid) { + value: T, +} + +A :: struct { + value: Wrapper(B), +} + +B :: struct { + value: A, +} + +main :: proc() {} From 8b4cd5a3f303d1e13a1a5e14cecf993a4b9b5578 Mon Sep 17 00:00:00 2001 From: Michael Freundorfer Date: Wed, 11 Mar 2026 10:07:26 +0100 Subject: [PATCH 078/273] Fix auto reset event signal deadlock The status variables need to be updated every iteration, otherwise the thread will spin forever, if another thread waits on the event between the load and the compare exchange, because the old value is never updated. --- core/sync/extended.odin | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/sync/extended.odin b/core/sync/extended.odin index 8566eccc8..58344b740 100644 --- a/core/sync/extended.odin +++ b/core/sync/extended.odin @@ -222,9 +222,10 @@ thread. */ auto_reset_event_signal :: proc "contextless" (e: ^Auto_Reset_Event) { old_status := atomic_load_explicit(&e.status, .Relaxed) - new_status := old_status + 1 if old_status < 1 else 1 for { - if _, ok := atomic_compare_exchange_weak_explicit(&e.status, old_status, new_status, .Release, .Relaxed); ok { + new_status := old_status + 1 if old_status < 1 else 1 + ok: bool + if old_status, ok = atomic_compare_exchange_weak_explicit(&e.status, old_status, new_status, .Release, .Relaxed); ok { break } cpu_relax() From 461486ef6c59c866029a4f3425825775a3d2a75d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Mar 2026 13:41:27 +0000 Subject: [PATCH 079/273] Fix comments which used `///` instead of `//` --- core/simd/x86/types.odin | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/simd/x86/types.odin b/core/simd/x86/types.odin index ea0eff534..1b52f22f1 100644 --- a/core/simd/x86/types.odin +++ b/core/simd/x86/types.odin @@ -22,25 +22,25 @@ __m256bh :: #simd[16]bf16 __m512bh :: #simd[32]bf16 -/// The `__mmask64` type used in AVX-512 intrinsics, a 64-bit integer +// The `__mmask64` type used in AVX-512 intrinsics, a 64-bit integer __mmask64 :: u64 -/// The `__mmask32` type used in AVX-512 intrinsics, a 32-bit integer +// The `__mmask32` type used in AVX-512 intrinsics, a 32-bit integer __mmask32 :: u32 -/// The `__mmask16` type used in AVX-512 intrinsics, a 16-bit integer +// The `__mmask16` type used in AVX-512 intrinsics, a 16-bit integer __mmask16 :: u16 -/// The `__mmask8` type used in AVX-512 intrinsics, a 8-bit integer +// The `__mmask8` type used in AVX-512 intrinsics, a 8-bit integer __mmask8 :: u8 -/// The `_MM_CMPINT_ENUM` type used to specify comparison operations in AVX-512 intrinsics. +// The `_MM_CMPINT_ENUM` type used to specify comparison operations in AVX-512 intrinsics. _MM_CMPINT_ENUM :: i32 -/// The `MM_MANTISSA_NORM_ENUM` type used to specify mantissa normalized operations in AVX-512 intrinsics. +// The `MM_MANTISSA_NORM_ENUM` type used to specify mantissa normalized operations in AVX-512 intrinsics. _MM_MANTISSA_NORM_ENUM :: i32 -/// The `MM_MANTISSA_SIGN_ENUM` type used to specify mantissa signed operations in AVX-512 intrinsics. +// The `MM_MANTISSA_SIGN_ENUM` type used to specify mantissa signed operations in AVX-512 intrinsics. _MM_MANTISSA_SIGN_ENUM :: i32 _MM_PERM_ENUM :: i32 From b7bb7a1dc471e07a603718d7940b04ea7a1077d7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Mar 2026 14:22:36 +0000 Subject: [PATCH 080/273] Use `scope_reserve` call directly --- src/build_settings.cpp | 2 +- src/checker.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index f46b7d247..c2ef7b259 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -388,7 +388,7 @@ u64 get_feature_flag_from_name(String const &name) { } if (name == "using-stmt") { return OptInFeatureFlag_UsingStmt; - } + } if (name == "force-type-assert") { return OptInFeatureFlag_ForceTypeAssert; } diff --git a/src/checker.cpp b/src/checker.cpp index 71ccfebc4..8acc5f4ae 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -238,8 +238,7 @@ gb_internal Scope *create_scope_from_file(CheckerInfo *info, AstFile *f) { isize init_elements_capacity = gb_max(DEFAULT_SCOPE_CAPACITY, 2*f->total_file_decl_count); Scope *s = create_scope(info, f->pkg->scope); - string_map_init(&s->elements, init_elements_capacity); - + scope_reserve(s, init_elements_capacity); s->flags |= ScopeFlag_File; s->file = f; From f1dbe9c242b44e02d8420b06486a7c061181efe9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Mar 2026 16:46:33 +0000 Subject: [PATCH 081/273] `[dynamic; N]T` proof of concept: fixed capacity dynamic array (akin to `small_array.Small_Array(N, T)`) --- base/runtime/core.odin | 14 ++++ base/runtime/core_builtin.odin | 80 ++++++++++++++++++ base/runtime/print.odin | 12 +++ core/fmt/fmt.odin | 15 ++++ core/odin/ast/ast.odin | 12 +++ core/odin/ast/clone.odin | 6 ++ core/odin/ast/walk.odin | 6 ++ core/odin/parser/parser.odin | 16 ++++ core/reflect/reflect.odin | 128 +++++++++++++++++------------ core/reflect/types.odin | 11 +++ src/check_builtin.cpp | 11 +++ src/check_expr.cpp | 32 ++++++++ src/check_type.cpp | 25 ++++++ src/checker.cpp | 11 +++ src/llvm_backend.hpp | 1 + src/llvm_backend_debug.cpp | 64 +++++++++++++++ src/llvm_backend_expr.cpp | 44 ++++++++++ src/llvm_backend_general.cpp | 20 +++++ src/llvm_backend_proc.cpp | 4 + src/llvm_backend_type.cpp | 16 ++++ src/llvm_backend_utility.cpp | 10 +++ src/name_canonicalization.cpp | 4 + src/parser.cpp | 41 +++++++++- src/parser.hpp | 10 ++- src/types.cpp | 145 ++++++++++++++++++++++++++++++++- 25 files changed, 677 insertions(+), 61 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 983f104e3..52993286a 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -206,6 +206,14 @@ Type_Info_Bit_Field :: struct { field_count: int, } +Type_Info_Fixed_Capacity_Dynamic_Array :: struct { + elem: ^Type_Info, + elem_size: int, + capacity: int, + len_offset: uintptr, +} + + Type_Info_Flag :: enum u8 { Comparable = 0, Simple_Compare = 1, @@ -246,6 +254,7 @@ Type_Info :: struct { Type_Info_Matrix, Type_Info_Soa_Pointer, Type_Info_Bit_Field, + Type_Info_Fixed_Capacity_Dynamic_Array, }, } @@ -425,6 +434,11 @@ Raw_Dynamic_Array :: struct { allocator: Allocator, } +Raw_Fixed_Capacity_Dynamic_Array :: struct($Capacity: uint, $T: typeid) { + data: [Capacity]T, + len: int, +} + // The raw, type-erased representation of a map. // // 32-bytes on 64-bit diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 974b2f048..7a1a38f9a 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -254,6 +254,7 @@ non_zero_reserve :: proc{ @builtin resize :: proc{ resize_dynamic_array, + resize_fixed_capacity_dynamic_array, resize_soa, } @@ -261,6 +262,7 @@ resize :: proc{ @builtin non_zero_resize :: proc{ non_zero_resize_dynamic_array, + non_zero_resize_fixed_capacity_dynamic_array, non_zero_resize_soa, } @@ -686,6 +688,43 @@ append_string :: proc(array: ^$T/[dynamic]$E/u8, args: ..string, loc := #caller_ return } + +// `append_fixed_capacity_elem` appends an element to the end of a fixed capacity dynamic array. Returns 0 on failure +@builtin +append_fixed_capacity_elem :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast arg: E) -> (n: int) { + Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) + + if (^Raw)(array).len >= N { + return 0 + } + + when size_of(E) != 0 { + #no_bounds_check (^Raw)(array).data[(^Raw)(array).len] = arg + } + (^Raw)(array).len += 1 + return 1 +} + + +// `append_fixed_capacity_elem` appends an element to the end of a fixed capacity dynamic array. Returns 0 on failure +@builtin +append_fixed_capacity_elems :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast args: ..E) -> (n: int) { + Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) + raw := (^Raw)(array) + + n = min(N - len(args), len(args)) + + when size_of(E) != 0 { + for i in 0.. bool { + if array == nil { + return false + } + raw := (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array) + if raw.len < length { + size_of_elem :: size_of(E) + + num_reused := min(N, length) - a.len + intrinsics.mem_zero(([^]byte)(a.data)[a.len*size_of_elem:], num_reused*size_of_elem) + } + new_length := clamp(length, 0, N) + raw.len = new_length + return true +} + +// `non_zero_resize_fixed_capacity_dynamic_array` will try to resize memory of a passed fixed capacity dynamic array or map to the requested element count (setting the `len`, and possibly `cap`). +// +// Note: Prefer the procedure group `resize` +@builtin +non_zero_resize_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int length: int) -> bool { + if array == nil { + return false + } + raw := (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array) + new_length := clamp(length, 0, N) + raw.len = new_length + return true +} + // Shrinks the capacity of a dynamic array down to the current length, or the given capacity. // // If `new_cap` is negative, then `len(array)` is used. diff --git a/base/runtime/print.odin b/base/runtime/print.odin index 6569ece6c..ad205d887 100644 --- a/base/runtime/print.odin +++ b/base/runtime/print.odin @@ -392,6 +392,12 @@ print_type :: #force_no_inline proc "contextless" (ti: ^Type_Info) { print_string("[]") print_type(info.elem) + case Type_Info_Fixed_Capacity_Dynamic_Array: + print_string("[dynamic; ") + print_u64(u64(info.capacity)) + print_string("]") + print_type(info.elem) + case Type_Info_Map: print_string("map[") print_type(info.key) @@ -807,6 +813,12 @@ write_write_type :: #force_no_inline proc "contextless" (i: ^int, buf: []byte, t write_string (i, buf, "[]") or_return write_write_type(i, buf, info.elem) or_return + case Type_Info_Fixed_Capacity_Dynamic_Array: + write_string (i, buf, "[dynamic; ") or_return + write_u64 (i, buf, u64(info.capacity)) or_return + write_string (i, buf, "]") or_return + write_write_type(i, buf, info.elem) or_return + case Type_Info_Map: write_string (i, buf, "map[") or_return write_write_type(i, buf, info.key) or_return diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index f1601f278..4ecb19c21 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -3246,6 +3246,21 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) { } fmt_array(fi, ptr, n, info.elem_size, info.elem, verb) + + case runtime.Type_Info_Fixed_Capacity_Dynamic_Array: + n := (^int)(uintptr(v.data) + info.len_offset)^ + + ptr := v.data // data is stored at the start + if ol, ok := fi.optional_len.?; ok { + fi.optional_len = nil + n = min(n, ol) + } else if fi.use_nul_termination { + fi.use_nul_termination = false + fmt_array_nul_terminated(fi, ptr, n, info.elem_size, info.elem, verb) + return + } + fmt_array(fi, ptr, n, info.elem_size, info.elem, verb) + case runtime.Type_Info_Simd_Vector: io.write_byte(fi.writer, '<', &fi.n) defer io.write_byte(fi.writer, '>', &fi.n) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 2cee6e385..8f5f466cb 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -786,6 +786,16 @@ Dynamic_Array_Type :: struct { elem: ^Expr, } +Fixed_Capacity_Dynamic_Array_Type :: struct { + using node: Expr, + tag: ^Expr, // possibly nil + open: tokenizer.Pos, + dynamic_pos: tokenizer.Pos, + capacity: ^Expr, + close: tokenizer.Pos, + elem: ^Expr, +} + Struct_Type :: struct { using node: Expr, tok_pos: tokenizer.Pos, @@ -931,6 +941,7 @@ Any_Node :: union { ^Multi_Pointer_Type, ^Array_Type, ^Dynamic_Array_Type, + ^Fixed_Capacity_Dynamic_Array_Type, ^Struct_Type, ^Union_Type, ^Enum_Type, @@ -1017,6 +1028,7 @@ Any_Expr :: union { ^Multi_Pointer_Type, ^Array_Type, ^Dynamic_Array_Type, + ^Fixed_Capacity_Dynamic_Array_Type, ^Struct_Type, ^Union_Type, ^Enum_Type, diff --git a/core/odin/ast/clone.odin b/core/odin/ast/clone.odin index df3e1df0d..163485840 100644 --- a/core/odin/ast/clone.odin +++ b/core/odin/ast/clone.odin @@ -311,10 +311,16 @@ clone_node :: proc(node: ^Node) -> ^Node { case ^Multi_Pointer_Type: r.elem = clone(r.elem) case ^Array_Type: + r.tag = clone(r.tag) r.len = clone(r.len) r.elem = clone(r.elem) case ^Dynamic_Array_Type: + r.tag = clone(r.tag) r.elem = clone(r.elem) + case ^Fixed_Capacity_Dynamic_Array_Type: + r.tag = clone(r.tag) + r.capacity = clone(r.capacity) + r.elem = clone(r.elem) case ^Struct_Type: r.poly_params = auto_cast clone(r.poly_params) r.align = clone(r.align) diff --git a/core/odin/ast/walk.odin b/core/odin/ast/walk.odin index 5b9340c62..d3824c213 100644 --- a/core/odin/ast/walk.odin +++ b/core/odin/ast/walk.odin @@ -380,6 +380,12 @@ walk :: proc(v: ^Visitor, node: ^Node) { walk(v, n.tag) } walk(v, n.elem) + case ^Fixed_Capacity_Dynamic_Array_Type: + if n.tag != nil { + walk(v, n.tag) + } + walk(v, n.capacity) + walk(v, n.elem) case ^Struct_Type: if n.poly_params != nil { walk(v, n.poly_params) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 643673c69..0f3ac78b2 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2389,6 +2389,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { case ^ast.Array_Type: t.tag = bd case ^ast.Dynamic_Array_Type: t.tag = bd case ^ast.Pointer_Type: t.tag = bd + case ^ast.Fixed_Capacity_Dynamic_Array_Type: t.tag = bd case: error(p, original_type.pos, "expected an array or pointer type after #%s", name.text) } @@ -2626,6 +2627,20 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { return t case .Dynamic: tok := expect_token(p, .Dynamic) + if allow_token(p, .Semicolon) { + capacity := parse_expr(p, false) + close := expect_token(p, .Close_Bracket) + elem := parse_type(p) + + da := ast.new(ast.Fixed_Capacity_Dynamic_Array_Type, open.pos, elem) + da.open = open.pos + da.dynamic_pos = tok.pos + da.capacity = capacity + da.close = close.pos + da.elem = elem + return da + } + close := expect_token(p, .Close_Bracket) elem := parse_type(p) da := ast.new(ast.Dynamic_Array_Type, open.pos, elem) @@ -3107,6 +3122,7 @@ is_literal_type :: proc(expr: ^ast.Expr) -> bool { ^ast.Union_Type, ^ast.Enum_Type, ^ast.Dynamic_Array_Type, + ^ast.Fixed_Capacity_Dynamic_Array_Type, ^ast.Map_Type, ^ast.Bit_Set_Type, ^ast.Matrix_Type, diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index b39c6ac6b..924120464 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -6,33 +6,34 @@ _ :: intrinsics Type_Info :: runtime.Type_Info -Type_Info_Named :: runtime.Type_Info_Named -Type_Info_Integer :: runtime.Type_Info_Integer -Type_Info_Rune :: runtime.Type_Info_Rune -Type_Info_Float :: runtime.Type_Info_Float -Type_Info_Complex :: runtime.Type_Info_Complex -Type_Info_Quaternion :: runtime.Type_Info_Quaternion -Type_Info_String :: runtime.Type_Info_String -Type_Info_Boolean :: runtime.Type_Info_Boolean -Type_Info_Any :: runtime.Type_Info_Any -Type_Info_Type_Id :: runtime.Type_Info_Type_Id -Type_Info_Pointer :: runtime.Type_Info_Pointer -Type_Info_Multi_Pointer :: runtime.Type_Info_Multi_Pointer -Type_Info_Procedure :: runtime.Type_Info_Procedure -Type_Info_Array :: runtime.Type_Info_Array -Type_Info_Enumerated_Array :: runtime.Type_Info_Enumerated_Array -Type_Info_Dynamic_Array :: runtime.Type_Info_Dynamic_Array -Type_Info_Slice :: runtime.Type_Info_Slice -Type_Info_Parameters :: runtime.Type_Info_Parameters -Type_Info_Struct :: runtime.Type_Info_Struct -Type_Info_Union :: runtime.Type_Info_Union -Type_Info_Enum :: runtime.Type_Info_Enum -Type_Info_Map :: runtime.Type_Info_Map -Type_Info_Bit_Set :: runtime.Type_Info_Bit_Set -Type_Info_Simd_Vector :: runtime.Type_Info_Simd_Vector -Type_Info_Matrix :: runtime.Type_Info_Matrix -Type_Info_Soa_Pointer :: runtime.Type_Info_Soa_Pointer -Type_Info_Bit_Field :: runtime.Type_Info_Bit_Field +Type_Info_Named :: runtime.Type_Info_Named +Type_Info_Integer :: runtime.Type_Info_Integer +Type_Info_Rune :: runtime.Type_Info_Rune +Type_Info_Float :: runtime.Type_Info_Float +Type_Info_Complex :: runtime.Type_Info_Complex +Type_Info_Quaternion :: runtime.Type_Info_Quaternion +Type_Info_String :: runtime.Type_Info_String +Type_Info_Boolean :: runtime.Type_Info_Boolean +Type_Info_Any :: runtime.Type_Info_Any +Type_Info_Type_Id :: runtime.Type_Info_Type_Id +Type_Info_Pointer :: runtime.Type_Info_Pointer +Type_Info_Multi_Pointer :: runtime.Type_Info_Multi_Pointer +Type_Info_Procedure :: runtime.Type_Info_Procedure +Type_Info_Array :: runtime.Type_Info_Array +Type_Info_Enumerated_Array :: runtime.Type_Info_Enumerated_Array +Type_Info_Dynamic_Array :: runtime.Type_Info_Dynamic_Array +Type_Info_Slice :: runtime.Type_Info_Slice +Type_Info_Parameters :: runtime.Type_Info_Parameters +Type_Info_Struct :: runtime.Type_Info_Struct +Type_Info_Union :: runtime.Type_Info_Union +Type_Info_Enum :: runtime.Type_Info_Enum +Type_Info_Map :: runtime.Type_Info_Map +Type_Info_Bit_Set :: runtime.Type_Info_Bit_Set +Type_Info_Simd_Vector :: runtime.Type_Info_Simd_Vector +Type_Info_Matrix :: runtime.Type_Info_Matrix +Type_Info_Soa_Pointer :: runtime.Type_Info_Soa_Pointer +Type_Info_Bit_Field :: runtime.Type_Info_Bit_Field +Type_Info_Fixed_Capacity_Dynamic_Array :: runtime.Type_Info_Fixed_Capacity_Dynamic_Array Type_Info_Enum_Value :: runtime.Type_Info_Enum_Value @@ -67,6 +68,7 @@ Type_Kind :: enum { Matrix, Soa_Pointer, Bit_Field, + Fixed_Capacity_Dynamic_Array, } @@ -76,33 +78,34 @@ type_kind :: proc(T: typeid) -> Type_Kind { ti := type_info_of(T) if ti != nil { switch _ in ti.variant { - case Type_Info_Named: return .Named - case Type_Info_Integer: return .Integer - case Type_Info_Rune: return .Rune - case Type_Info_Float: return .Float - case Type_Info_Complex: return .Complex - case Type_Info_Quaternion: return .Quaternion - case Type_Info_String: return .String - case Type_Info_Boolean: return .Boolean - case Type_Info_Any: return .Any - case Type_Info_Type_Id: return .Type_Id - case Type_Info_Pointer: return .Pointer - case Type_Info_Multi_Pointer: return .Multi_Pointer - case Type_Info_Procedure: return .Procedure - case Type_Info_Array: return .Array - case Type_Info_Enumerated_Array: return .Enumerated_Array - case Type_Info_Dynamic_Array: return .Dynamic_Array - case Type_Info_Slice: return .Slice - case Type_Info_Parameters: return .Parameters - case Type_Info_Struct: return .Struct - case Type_Info_Union: return .Union - case Type_Info_Enum: return .Enum - case Type_Info_Map: return .Map - case Type_Info_Bit_Set: return .Bit_Set - case Type_Info_Simd_Vector: return .Simd_Vector - case Type_Info_Matrix: return .Matrix - case Type_Info_Soa_Pointer: return .Soa_Pointer - case Type_Info_Bit_Field: return .Bit_Field + case Type_Info_Named: return .Named + case Type_Info_Integer: return .Integer + case Type_Info_Rune: return .Rune + case Type_Info_Float: return .Float + case Type_Info_Complex: return .Complex + case Type_Info_Quaternion: return .Quaternion + case Type_Info_String: return .String + case Type_Info_Boolean: return .Boolean + case Type_Info_Any: return .Any + case Type_Info_Type_Id: return .Type_Id + case Type_Info_Pointer: return .Pointer + case Type_Info_Multi_Pointer: return .Multi_Pointer + case Type_Info_Procedure: return .Procedure + case Type_Info_Array: return .Array + case Type_Info_Enumerated_Array: return .Enumerated_Array + case Type_Info_Dynamic_Array: return .Dynamic_Array + case Type_Info_Slice: return .Slice + case Type_Info_Parameters: return .Parameters + case Type_Info_Struct: return .Struct + case Type_Info_Union: return .Union + case Type_Info_Enum: return .Enum + case Type_Info_Map: return .Map + case Type_Info_Bit_Set: return .Bit_Set + case Type_Info_Simd_Vector: return .Simd_Vector + case Type_Info_Matrix: return .Matrix + case Type_Info_Soa_Pointer: return .Soa_Pointer + case Type_Info_Bit_Field: return .Bit_Field + case Type_Info_Fixed_Capacity_Dynamic_Array: return .Fixed_Capacity_Dynamic_Array } } @@ -1919,6 +1922,23 @@ equal :: proc(a, b: any, including_indirect_array_recursion := false, recursion_ } } return true + case Type_Info_Fixed_Capacity_Dynamic_Array: + a_count := (^int)(uintptr(a.data) + v.len_offset)^ + b_count := (^int)(uintptr(b.data) + v.len_offset)^ + if a_count != b_count { + return false + } + + for i in 0.. bool { y := b.variant.(Type_Info_Slice) or_return return are_types_identical(x.elem, y.elem) + case Type_Info_Fixed_Capacity_Dynamic_Array: + y := b.variant.(Type_Info_Fixed_Capacity_Dynamic_Array) or_return + if x.capacity != y.capacity { return false } + return are_types_identical(x.elem, y.elem) + case Type_Info_Parameters: y := b.variant.(Type_Info_Parameters) or_return if len(x.types) != len(y.types) { return false } @@ -661,6 +666,12 @@ write_type_writer :: #force_no_inline proc(w: io.Writer, ti: ^Type_Info, n_writt io.write_string(w, "[]", &n) or_return write_type(w, info.elem, &n) or_return + case Type_Info_Fixed_Capacity_Dynamic_Array: + io.write_string(w, "[dynamic;", &n) or_return + io.write_i64(w, i64(info.capacity), 10, &n) or_return + io.write_string(w, "]", &n) or_return + write_type(w, info.elem, &n) or_return + case Type_Info_Map: io.write_string(w, "map[", &n) or_return write_type(w, info.key, &n) or_return diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 1a094c1f0..02826a209 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -2634,6 +2634,16 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As mode = Addressing_Constant; value = exact_value_i64(at->Array.count); type = t_untyped_integer; + } else if (is_type_fixed_capacity_dynamic_array(op_type)) { + Type *at = core_type(op_type); + if (id == BuiltinProc_cap) { + mode = Addressing_Constant; + value = exact_value_i64(at->FixedCapacityDynamicArray.capacity); + type = t_untyped_integer; + } else { + GB_ASSERT(id == BuiltinProc_len); + mode = Addressing_Value; + } } else if (is_type_enumerated_array(op_type) && id == BuiltinProc_len) { Type *at = core_type(op_type); mode = Addressing_Constant; @@ -5167,6 +5177,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As case Type_Array: case Type_EnumeratedArray: case Type_SimdVector: + case Type_FixedCapacityDynamicArray: operand->type = alloc_type_multi_pointer(base_array_type(base)); break; case Type_Matrix: diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 80df35edc..9f66f8fec 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1490,6 +1490,22 @@ gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, T return is_polymorphic_type_assignable(c, poly->DynamicArray.elem, source->DynamicArray.elem, true, modify_type); } return false; + + case Type_FixedCapacityDynamicArray: + if (source->kind == Type_FixedCapacityDynamicArray) { + if (poly->FixedCapacityDynamicArray.generic_capacity != nullptr) { + if (!polymorphic_assign_index(&poly->FixedCapacityDynamicArray.generic_capacity, + &poly->FixedCapacityDynamicArray.capacity, + source->FixedCapacityDynamicArray.capacity)) { + return false; + } + } + if (poly->FixedCapacityDynamicArray.capacity == source->FixedCapacityDynamicArray.capacity) { + return is_polymorphic_type_assignable(c, poly->FixedCapacityDynamicArray.elem, source->FixedCapacityDynamicArray.elem, true, modify_type); + } + } + return false; + case Type_Slice: if (source->kind == Type_Slice) { return is_polymorphic_type_assignable(c, poly->Slice.elem, source->Slice.elem, true, modify_type); @@ -8761,6 +8777,14 @@ gb_internal bool check_set_index_data(Operand *o, Type *t, bool indirection, i64 o->mode = Addressing_Variable; } return true; + + case Type_FixedCapacityDynamicArray: + o->type = t->FixedCapacityDynamicArray.elem; + if (o->mode != Addressing_Constant) { + o->mode = Addressing_Variable; + } + return true; + case Type_Struct: if (t->Struct.soa_kind != StructSoa_None) { if (t->Struct.soa_kind == StructSoa_Fixed) { @@ -11410,6 +11434,8 @@ gb_internal ExprKind check_index_expr(CheckerContext *c, Operand *o, Ast *node, // Okay } else if (is_type_enumerated_array(t)) { // Okay + } else if (is_type_fixed_capacity_dynamic_array(t)) { + // Okay } else if (is_type_string(t)) { // Okay } else if (is_type_matrix(t)) { @@ -11556,6 +11582,11 @@ gb_internal ExprKind check_slice_expr(CheckerContext *c, Operand *o, Ast *node, o->type = alloc_type_slice(t->DynamicArray.elem); break; + case Type_FixedCapacityDynamicArray: + valid = true; + o->type = alloc_type_slice(t->FixedCapacityDynamicArray.elem); + break; + case Type_Struct: if (is_type_soa_struct(t)) { valid = true; @@ -12110,6 +12141,7 @@ gb_internal ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast case Ast_MultiPointerType: case Ast_ArrayType: case Ast_DynamicArrayType: + case Ast_FixedCapacityDynamicArrayType: case Ast_StructType: case Ast_UnionType: case Ast_EnumType: diff --git a/src/check_type.cpp b/src/check_type.cpp index 82e70dd33..5cfc24981 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -3642,6 +3642,31 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T return true; case_end; + case_ast_node(dat, FixedCapacityDynamicArrayType, e); + Operand o = {}; + i64 capacity = check_array_count(ctx, &o, dat->capacity); + Type *generic_type = nullptr; + if (o.mode == Addressing_Type && o.type->kind == Type_Generic) { + generic_type = o.type; + } + + if (capacity < 0) { + error(dat->capacity, "? can only be used in conjunction with compound literals of fixed-length arrays"); + capacity = 0; + } + + + Type *elem = check_type(ctx, dat->elem); + if (dat->tag != nullptr) { + GB_ASSERT(dat->tag->kind == Ast_BasicDirective); + String name = dat->tag->BasicDirective.name.string; + error(dat->tag, "Invalid tag applied to fixed capacity dynamic array, got #%.*s", LIT(name)); + } + *type = alloc_type_fixed_capacity_dynamic_array(elem, capacity, generic_type); + set_base_type(named_type, *type); + return true; + case_end; + case_ast_node(st, StructType, e); CheckerContext c = *ctx; c.in_polymorphic_specialization = false; diff --git a/src/checker.cpp b/src/checker.cpp index 8acc5f4ae..2ac5aa62d 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2276,6 +2276,11 @@ gb_internal void add_type_info_type_internal(CheckerContext *c, Type *t) { add_type_info_type_internal(c, t_int); break; + case Type_FixedCapacityDynamicArray: + add_type_info_type_internal(c, bt->FixedCapacityDynamicArray.elem); + add_type_info_type_internal(c, t_allocator); + break; + case Type_Enum: add_type_info_type_internal(c, bt->Enum.base_type); break; @@ -2514,6 +2519,10 @@ gb_internal void add_min_dep_type_info(Checker *c, Type *t) { add_min_dep_type_info(c, t_int); break; + case Type_FixedCapacityDynamicArray: + add_min_dep_type_info(c, bt->FixedCapacityDynamicArray.elem); + add_min_dep_type_info(c, t_int); + case Type_Enum: add_min_dep_type_info(c, bt->Enum.base_type); break; @@ -3350,6 +3359,7 @@ gb_internal void init_core_type_info(Checker *c) { t_type_info_matrix = find_core_type(c, str_lit("Type_Info_Matrix")); t_type_info_soa_pointer = find_core_type(c, str_lit("Type_Info_Soa_Pointer")); t_type_info_bit_field = find_core_type(c, str_lit("Type_Info_Bit_Field")); + t_type_info_fixed_capacity_dynamic_array = find_core_type(c, str_lit("Type_Info_Fixed_Capacity_Dynamic_Array")); t_type_info_named_ptr = alloc_type_pointer(t_type_info_named); t_type_info_integer_ptr = alloc_type_pointer(t_type_info_integer); @@ -3378,6 +3388,7 @@ gb_internal void init_core_type_info(Checker *c) { t_type_info_matrix_ptr = alloc_type_pointer(t_type_info_matrix); t_type_info_soa_pointer_ptr = alloc_type_pointer(t_type_info_soa_pointer); t_type_info_bit_field_ptr = alloc_type_pointer(t_type_info_bit_field); + t_type_info_fixed_capacity_dynamic_array_ptr = alloc_type_pointer(t_type_info_fixed_capacity_dynamic_array); } gb_internal void init_mem_allocator(Checker *c) { diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 0f199907d..48c5be546 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -533,6 +533,7 @@ gb_internal lbValue lb_dynamic_array_elem(lbProcedure *p, lbValue da); gb_internal lbValue lb_dynamic_array_len(lbProcedure *p, lbValue da); gb_internal lbValue lb_dynamic_array_cap(lbProcedure *p, lbValue da); gb_internal lbValue lb_dynamic_array_allocator(lbProcedure *p, lbValue da); +gb_internal lbValue lb_fixed_capacity_dynamic_array_len(lbProcedure *p, lbValue da); gb_internal lbValue lb_map_len(lbProcedure *p, lbValue value); gb_internal lbValue lb_map_cap(lbProcedure *p, lbValue value); gb_internal lbValue lb_soa_struct_len(lbProcedure *p, lbValue value); diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index e9b0f72cb..4b09d3d5e 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -409,6 +409,69 @@ gb_internal LLVMMetadataRef lb_debug_dynamic_array(lbModule *m, Type *type, Stri return final_decl; } +gb_internal LLVMMetadataRef lb_debug_fixed_capacity_dynamic_array(lbModule *m, Type *type, String name, LLVMMetadataRef scope, LLVMMetadataRef file, unsigned line) { + Type *bt = base_type(type); + GB_ASSERT(bt->kind == Type_FixedCapacityDynamicArray); + + unsigned const int_bits = cast(unsigned)(8*build_context.int_size); + + u64 size_in_bits = 8*type_size_of(bt); + u32 align_in_bits = 8*cast(u32)type_align_of(bt); + + LLVMMetadataRef temp_forward_decl = LLVMDIBuilderCreateReplaceableCompositeType( + m->debug_builder, DW_TAG_structure_type, + cast(char const *)name.text, cast(size_t)name.len, + scope, file, line, 0, size_in_bits, align_in_bits, LLVMDIFlagZero, "", 0 + ); + + lb_set_llvm_metadata(m, type, temp_forward_decl); + + unsigned element_count = 2; + LLVMMetadataRef elements[2]; + + // LLVMMetadataRef member_scope = lb_get_llvm_metadata(m, bt->DynamicArray.scope); + LLVMMetadataRef member_scope = nullptr; + + Type *elem_type = alloc_type_array(bt->FixedCapacityDynamicArray.elem, bt->FixedCapacityDynamicArray.capacity); + elements[0] = LLVMDIBuilderCreateMemberType( + m->debug_builder, member_scope, + "data", 4, + file, line, + 8*cast(u64)type_size_of(elem_type), 8*cast(u32)type_align_of(elem_type), + 0, + LLVMDIFlagZero, lb_debug_type(m, elem_type) + ); + + i64 len_offset = type_offset_of(bt, 1); + + elements[1] = LLVMDIBuilderCreateMemberType( + m->debug_builder, member_scope, + "len", 3, + file, line, + int_bits, int_bits, + len_offset, + LLVMDIFlagZero, lb_debug_type(m, t_int) + ); + + LLVMMetadataRef final_decl = LLVMDIBuilderCreateStructType( + m->debug_builder, scope, + cast(char const *)name.text, cast(size_t)name.len, + file, line, + size_in_bits, align_in_bits, + LLVMDIFlagZero, + nullptr, + elements, element_count, + 0, + nullptr, + "", 0 + ); + + LLVMMetadataReplaceAllUsesWith(temp_forward_decl, final_decl); + lb_set_llvm_metadata(m, type, final_decl); + return final_decl; +} + + gb_internal LLVMMetadataRef lb_debug_union(lbModule *m, Type *type, String name, LLVMMetadataRef scope, LLVMMetadataRef file, unsigned line) { Type *bt = base_type(type); GB_ASSERT(bt->kind == Type_Union); @@ -899,6 +962,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { case Type_BitSet: return lb_debug_bitset( m, type, type_to_canonical_string(temporary_allocator(), type), nullptr, nullptr, 0); case Type_Enum: return lb_debug_enum( m, type, type_to_canonical_string(temporary_allocator(), type), nullptr, nullptr, 0); case Type_BitField: return lb_debug_bitfield( m, type, type_to_canonical_string(temporary_allocator(), type), nullptr, nullptr, 0); + case Type_FixedCapacityDynamicArray: return lb_debug_fixed_capacity_dynamic_array(m, type, type_to_canonical_string(temporary_allocator(), type), nullptr, nullptr, 0); case Type_Tuple: if (type->Tuple.variables.count == 1) { diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 1685f9627..e352a33e9 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -4700,6 +4700,25 @@ gb_internal lbAddr lb_build_addr_index_expr(lbProcedure *p, Ast *expr) { return lb_addr(elem); } + case Type_FixedCapacityDynamicArray: { + lbValue array = {}; + array = lb_build_addr_ptr(p, ie->expr); + if (deref) { + array = lb_emit_load(p, array); + } + lbValue index = lb_build_expr(p, ie->index); + index = lb_emit_conv(p, index, t_int); + + lbValue array_ptr = lb_emit_struct_ep(p, array, 0); + lbValue elem = lb_emit_array_ep(p, array_ptr, index); + + auto index_tv = type_and_value_of_expr(ie->index); + lbValue len = lb_emit_struct_ep(p, array, 1); + len = lb_emit_load(p, len); + lb_emit_bounds_check(p, ast_token(ie->index), index, len); + return lb_addr(elem); + } + case Type_EnumeratedArray: { lbValue array = {}; array = lb_build_addr_ptr(p, ie->expr); @@ -4943,6 +4962,31 @@ gb_internal lbAddr lb_build_addr_slice_expr(lbProcedure *p, Ast *expr) { return slice; } + case Type_FixedCapacityDynamicArray: { + Type *elem_type = type->FixedCapacityDynamicArray.elem; + Type *slice_type = alloc_type_slice(elem_type); + + lbValue len = lb_fixed_capacity_dynamic_array_len(p, base); + if (high.value == nullptr) high = len; + + bool low_const = type_and_value_of_expr(se->low).mode == Addressing_Constant; + bool high_const = type_and_value_of_expr(se->high).mode == Addressing_Constant; + + if (!low_const || !high_const) { + if (!no_indices) { + lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); + } + } + lbValue data_ptr = lb_addr_get_ptr(p, addr); + lbValue array_ptr = lb_emit_struct_ep(p, data_ptr, 0); + lbValue elem = lb_emit_ptr_offset(p, lb_array_elem(p, array_ptr), low); + lbValue new_len = lb_emit_arith(p, Token_Sub, high, low, t_int); + + lbAddr slice = lb_add_local_generated(p, slice_type, false); + lb_fill_slice(p, slice, elem, new_len); + return slice; + } + case Type_Basic: { if (is_type_string16(type)) { GB_ASSERT_MSG(are_types_identical(type, t_string16), "got %s", type_to_string(type)); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 572e3990c..32a669235 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -2234,6 +2234,26 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) { } break; + case Type_FixedCapacityDynamicArray: + { + unsigned field_count = 0; + + LLVMTypeRef fields[3] = {}; + m->internal_type_level += 1; + fields[field_count++] = llvm_array_type(lb_type(m, type->FixedCapacityDynamicArray.elem), type->FixedCapacityDynamicArray.capacity); + m->internal_type_level -= 1; + + gb_unused(type_size_of(type)); + if (type->FixedCapacityDynamicArray.padding_needed > 0) { + fields[field_count++] = lb_type_padding_filler(m, type->FixedCapacityDynamicArray.padding_needed, 1); // padding + } + + fields[field_count++] = lb_type(m, t_int); // len + + return LLVMStructTypeInContext(ctx, fields, field_count, false); + } + break; + case Type_Map: init_map_internal_debug_types(type); GB_ASSERT(t_raw_map != nullptr); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index f72726af1..840bbfb19 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2323,6 +2323,8 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu return lb_slice_len(p, v); } else if (is_type_dynamic_array(t)) { return lb_dynamic_array_len(p, v); + } else if (is_type_fixed_capacity_dynamic_array(t)) { + return lb_fixed_capacity_dynamic_array_len(p, v); } else if (is_type_map(t)) { return lb_map_len(p, v); } else if (is_type_soa_struct(t)) { @@ -2344,6 +2346,8 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu GB_PANIC("Unreachable"); } else if (is_type_array(t)) { GB_PANIC("Array lengths are constant"); + } else if (is_type_fixed_capacity_dynamic_array(t)) { + GB_PANIC("Fixed capacity dynamic array capacities are constant"); } else if (is_type_slice(t)) { return lb_slice_len(p, v); } else if (is_type_dynamic_array(t)) { diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 89c671f7d..82156d32a 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -69,6 +69,7 @@ gb_internal u64 lb_typeid_kind(lbModule *m, Type *type, u64 id=0) { case Type_SimdVector: kind = Typeid_Simd_Vector; break; case Type_SoaPointer: kind = Typeid_SoaPointer; break; case Type_BitField: kind = Typeid_Bit_Field; break; + case Type_FixedCapacityDynamicArray: kind = Typeid_Fixed_Capacity_Dynamic_Array; break; } return kind; @@ -644,6 +645,21 @@ gb_internal void lb_setup_type_info_data_giant_array(lbModule *m, i64 global_typ variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); break; } + case Type_FixedCapacityDynamicArray: { + tag_type = t_type_info_fixed_capacity_dynamic_array; + + i64 len_offset = type_offset_of(t, 1); + + LLVMValueRef vals[4] = { + get_type_info_ptr(m, t->FixedCapacityDynamicArray.elem), + lb_const_int(m, t_int, type_size_of(t->FixedCapacityDynamicArray.elem)).value, + lb_const_int(m, t_int, t->FixedCapacityDynamicArray.capacity).value, + lb_const_int(m, t_uintptr, len_offset).value, + }; + + variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); + break; + } case Type_Slice: { tag_type = t_type_info_slice; diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 8a7bced59..b4ab5e4d6 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1234,6 +1234,11 @@ gb_internal lbValue lb_emit_struct_ep(lbProcedure *p, lbValue s, i32 index) { case 2: result_type = t_int; break; case 3: result_type = t_allocator; break; } + } else if (is_type_fixed_capacity_dynamic_array(t)) { + switch (index) { + case 0: result_type = alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity); break; + case 1: result_type = t_int; break; + } } else if (is_type_map(t)) { init_map_internal_debug_types(t); Type *itp = alloc_type_pointer(t_raw_map); @@ -1749,6 +1754,11 @@ gb_internal lbValue lb_dynamic_array_cap(lbProcedure *p, lbValue da) { return lb_emit_struct_ev(p, da, 2); } +gb_internal lbValue lb_fixed_capacity_dynamic_array_len(lbProcedure *p, lbValue da) { + GB_ASSERT(is_type_fixed_capacity_dynamic_array(da.type)); + return lb_emit_struct_ev(p, da, 1); +} + gb_internal lbValue lb_map_len(lbProcedure *p, lbValue value) { GB_ASSERT_MSG(is_type_map(value.type) || are_types_identical(value.type, t_raw_map), "%s", type_to_string(value.type)); lbValue len = lb_emit_struct_ev(p, value, 1); diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index efe115c89..6d5f54cf8 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -788,6 +788,10 @@ gb_internal void write_type_to_canonical_string(TypeWriter *w, Type *type) { type_writer_appendc(w, "[dynamic]"); write_type_to_canonical_string(w, type->DynamicArray.elem); return; + case Type_FixedCapacityDynamicArray: + type_writer_append_fmt(w, "[dynamic;%lld]", cast(long long)type->FixedCapacityDynamicArray.capacity); + write_type_to_canonical_string(w, type->FixedCapacityDynamicArray.elem); + return; case Type_SimdVector: type_writer_append_fmt(w, "#simd[%lld]", cast(long long)type->SimdVector.count); write_type_to_canonical_string(w, type->SimdVector.elem); diff --git a/src/parser.cpp b/src/parser.cpp index ca81159b4..b302c935d 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -456,6 +456,12 @@ gb_internal Ast *clone_ast(Ast *node, AstFile *f) { break; case Ast_DynamicArrayType: n->DynamicArrayType.elem = clone_ast(n->DynamicArrayType.elem, f); + n->DynamicArrayType.tag = clone_ast(n->DynamicArrayType.tag, f); + break; + case Ast_FixedCapacityDynamicArrayType: + n->FixedCapacityDynamicArrayType.elem = clone_ast(n->FixedCapacityDynamicArrayType.elem, f); + n->FixedCapacityDynamicArrayType.capacity = clone_ast(n->FixedCapacityDynamicArrayType.capacity, f); + n->FixedCapacityDynamicArrayType.tag = clone_ast(n->FixedCapacityDynamicArrayType.tag, f); break; case Ast_StructType: n->StructType.fields = clone_ast_array(n->StructType.fields, f); @@ -1254,6 +1260,14 @@ gb_internal Ast *ast_dynamic_array_type(AstFile *f, Token token, Ast *elem) { return result; } +gb_internal Ast *ast_fixed_capacity_dynamic_array_type(AstFile *f, Token token, Ast *capacity, Ast *elem) { + Ast *result = alloc_ast_node(f, Ast_FixedCapacityDynamicArrayType); + result->FixedCapacityDynamicArrayType.token = token; + result->FixedCapacityDynamicArrayType.capacity = capacity; + result->FixedCapacityDynamicArrayType.elem = elem; + return result; +} + gb_internal Ast *ast_struct_type(AstFile *f, Token token, Slice fields, isize field_count, Ast *polymorphic_params, bool is_packed, bool is_raw_union, bool is_all_or_none, bool is_simple, Ast *align, Ast *min_field_align, Ast *max_field_align, @@ -2470,9 +2484,10 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { Ast *original_type = parse_type(f); Ast *type = unparen_expr(original_type); switch (type->kind) { - case Ast_ArrayType: type->ArrayType.tag = tag; break; - case Ast_DynamicArrayType: type->DynamicArrayType.tag = tag; break; - case Ast_PointerType: type->PointerType.tag = tag; break; + case Ast_ArrayType: type->ArrayType.tag = tag; break; + case Ast_DynamicArrayType: type->DynamicArrayType.tag = tag; break; + case Ast_PointerType: type->PointerType.tag = tag; break; + case Ast_FixedCapacityDynamicArrayType: type->FixedCapacityDynamicArrayType.tag = tag; break; default: syntax_error(type, "Expected an array or pointer type after #%.*s, got %.*s", LIT(name.string), LIT(ast_strings[type->kind])); break; @@ -2702,8 +2717,25 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { } else if (f->curr_token.kind == Token_Question) { count_expr = ast_unary_expr(f, expect_token(f, Token_Question), nullptr); } else if (allow_token(f, Token_dynamic)) { + Ast *capacity = nullptr; + if (f->curr_token.kind == Token_Semicolon && f->curr_token.string == ";") { + expect_token(f, Token_Semicolon); + capacity = parse_expr(f, false); + } else if (allow_token(f, Token_Comma) || allow_token(f, Token_Semicolon)) { + String p = token_to_string(f->prev_token); + syntax_error(token_end_of_line(f, f->prev_token), "Expected a semicolon, got a %.*s", LIT(p)); + + capacity = parse_expr(f, false); + } expect_token(f, Token_CloseBracket); - return ast_dynamic_array_type(f, token, parse_type(f)); + + Ast *elem = parse_type(f); + + if (capacity == nullptr) { + return ast_dynamic_array_type(f, token, elem); + } else { + return ast_fixed_capacity_dynamic_array_type(f, token, capacity, elem); + } } else if (f->curr_token.kind != Token_CloseBracket) { f->expr_level++; count_expr = parse_expr(f, false); @@ -3186,6 +3218,7 @@ gb_internal bool is_literal_type(Ast *node) { case Ast_StructType: case Ast_UnionType: case Ast_EnumType: + case Ast_FixedCapacityDynamicArrayType: case Ast_DynamicArrayType: case Ast_MapType: case Ast_BitSetType: diff --git a/src/parser.hpp b/src/parser.hpp index d3527285d..c68b3614f 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -764,8 +764,14 @@ AST_KIND(_TypeBegin, "", bool) \ }) \ AST_KIND(DynamicArrayType, "dynamic array type", struct { \ Token token; \ - Ast *elem; \ - Ast *tag; \ + Ast *elem; \ + Ast *tag; \ + }) \ + AST_KIND(FixedCapacityDynamicArrayType, "fixed capacity dynamic array type", struct { \ + Token token; \ + Ast *capacity; \ + Ast *elem; \ + Ast *tag; \ }) \ AST_KIND(StructType, "struct type", struct { \ Scope *scope; \ diff --git a/src/types.cpp b/src/types.cpp index b11e95452..418a64b04 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -248,6 +248,12 @@ struct TypeNamed { }) \ TYPE_KIND(Slice, struct { Type *elem; }) \ TYPE_KIND(DynamicArray, struct { Type *elem; }) \ + TYPE_KIND(FixedCapacityDynamicArray, struct { \ + i64 capacity; \ + Type *generic_capacity; \ + Type *elem; \ + i64 padding_needed; /*-1 if unknown*/ \ + }) \ TYPE_KIND(Map, struct { \ Type *key; \ Type *value; \ @@ -378,6 +384,7 @@ enum Typeid_Kind : u8 { Typeid_Matrix, Typeid_SoaPointer, Typeid_Bit_Field, + Typeid_Fixed_Capacity_Dynamic_Array, Typeid__COUNT @@ -698,6 +705,7 @@ gb_global Type *t_type_info_simd_vector = nullptr; gb_global Type *t_type_info_matrix = nullptr; gb_global Type *t_type_info_soa_pointer = nullptr; gb_global Type *t_type_info_bit_field = nullptr; +gb_global Type *t_type_info_fixed_capacity_dynamic_array = nullptr; gb_global Type *t_type_info_named_ptr = nullptr; gb_global Type *t_type_info_integer_ptr = nullptr; @@ -726,6 +734,7 @@ gb_global Type *t_type_info_simd_vector_ptr = nullptr; gb_global Type *t_type_info_matrix_ptr = nullptr; gb_global Type *t_type_info_soa_pointer_ptr = nullptr; gb_global Type *t_type_info_bit_field_ptr = nullptr; +gb_global Type *t_type_info_fixed_capacity_dynamic_array_ptr = nullptr; gb_global Type *t_allocator = nullptr; gb_global Type *t_allocator_ptr = nullptr; @@ -1094,6 +1103,23 @@ gb_internal Type *alloc_type_dynamic_array(Type *elem) { return t; } +gb_internal Type *alloc_type_fixed_capacity_dynamic_array(Type *elem, i64 capacity, Type *generic_capacity = nullptr) { + if (generic_capacity != nullptr) { + Type *t = alloc_type(Type_FixedCapacityDynamicArray); + t->FixedCapacityDynamicArray.elem = elem; + t->FixedCapacityDynamicArray.capacity = capacity; + t->FixedCapacityDynamicArray.generic_capacity = generic_capacity; + t->FixedCapacityDynamicArray.padding_needed = 0; + return t; + } + Type *t = alloc_type(Type_FixedCapacityDynamicArray); + t->FixedCapacityDynamicArray.elem = elem; + t->FixedCapacityDynamicArray.capacity = capacity; + t->FixedCapacityDynamicArray.padding_needed = 0; + return t; +} + + gb_internal Type *alloc_type_struct() { Type *t = alloc_type(Type_Struct); @@ -1658,6 +1684,11 @@ gb_internal bool is_type_dynamic_array(Type *t) { if (t == nullptr) { return false; } return t->kind == Type_DynamicArray; } +gb_internal bool is_type_fixed_capacity_dynamic_array(Type *t) { + t = base_type(t); + if (t == nullptr) { return false; } + return t->kind == Type_FixedCapacityDynamicArray; +} gb_internal bool is_type_slice(Type *t) { t = base_type(t); if (t == nullptr) { return false; } @@ -1687,6 +1718,8 @@ gb_internal Type *base_array_type(Type *t) { return bt->EnumeratedArray.elem; } else if (is_type_simd_vector(bt)) { return bt->SimdVector.elem; + } else if (is_type_fixed_capacity_dynamic_array(bt)) { + return bt->FixedCapacityDynamicArray.elem; } else if (is_type_matrix(bt)) { return bt->Matrix.elem; } @@ -1702,6 +1735,8 @@ gb_internal Type *base_any_array_type(Type *t) { return bt->Slice.elem; } else if (is_type_dynamic_array(bt)) { return bt->DynamicArray.elem; + } else if (is_type_fixed_capacity_dynamic_array(bt)) { + return bt->FixedCapacityDynamicArray.elem; } else if (is_type_enumerated_array(bt)) { return bt->EnumeratedArray.elem; } else if (is_type_simd_vector(bt)) { @@ -2234,6 +2269,7 @@ gb_internal bool is_type_indexable(Type *t) { case Type_Array: case Type_Slice: case Type_DynamicArray: + case Type_FixedCapacityDynamicArray: case Type_Map: return true; case Type_MultiPointer: @@ -2254,6 +2290,7 @@ gb_internal bool is_type_sliceable(Type *t) { case Type_Array: case Type_Slice: case Type_DynamicArray: + case Type_FixedCapacityDynamicArray: return true; case Type_EnumeratedArray: return false; @@ -2394,6 +2431,11 @@ gb_internal bool is_type_polymorphic(Type *t, bool or_specialized=false) { return is_type_polymorphic(t->SimdVector.elem, or_specialized); case Type_DynamicArray: return is_type_polymorphic(t->DynamicArray.elem, or_specialized); + case Type_FixedCapacityDynamicArray: + if (t->FixedCapacityDynamicArray.generic_capacity != nullptr) { + return true; + } + return is_type_polymorphic(t->FixedCapacityDynamicArray.elem, or_specialized); case Type_Slice: return is_type_polymorphic(t->Slice.elem, or_specialized); @@ -2515,6 +2557,11 @@ gb_internal bool type_has_nil(Type *t) { case Type_DynamicArray: case Type_Map: return true; + + case Type_FixedCapacityDynamicArray: + // TODO(bill): should it have `nil`? + return false; + case Type_Union: return t->Union.kind != UnionType_no_nil; case Type_Struct: @@ -2642,6 +2689,9 @@ gb_internal bool is_type_comparable(Type *t) { case Type_Matrix: return is_type_comparable(t->Matrix.elem); + case Type_FixedCapacityDynamicArray: + return false; + case Type_BitSet: return true; @@ -2688,6 +2738,10 @@ gb_internal bool is_type_simple_compare(Type *t) { case Type_EnumeratedArray: return is_type_simple_compare(t->EnumeratedArray.elem); + case Type_FixedCapacityDynamicArray: + return false; + // return is_type_simple_compare(t->FixedCapacityDynamicArray.elem); + case Type_Basic: if (t->Basic.flags & BasicFlag_SimpleCompare) { return true; @@ -2758,6 +2812,10 @@ gb_internal bool is_type_nearly_simple_compare(Type *t) { case Type_EnumeratedArray: return is_type_nearly_simple_compare(t->EnumeratedArray.elem); + case Type_FixedCapacityDynamicArray: + return false; + // return is_type_nearly_simple_compare(t->FixedCapacityDynamicArray.elem); + case Type_Basic: if (t->Basic.flags & (BasicFlag_SimpleCompare|BasicFlag_Numeric)) { return true; @@ -2838,6 +2896,7 @@ gb_internal bool is_type_load_safe(Type *type) { case Type_DynamicArray: case Type_Proc: case Type_SoaPointer: + case Type_FixedCapacityDynamicArray: return false; case Type_Enum: @@ -3047,6 +3106,10 @@ gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple case Type_DynamicArray: return are_types_identical(x->DynamicArray.elem, y->DynamicArray.elem); + case Type_FixedCapacityDynamicArray: + return (x->FixedCapacityDynamicArray.capacity == y->FixedCapacityDynamicArray.capacity) && + are_types_identical(x->FixedCapacityDynamicArray.elem, y->FixedCapacityDynamicArray.elem); + case Type_Slice: return are_types_identical(x->Slice.elem, y->Slice.elem); @@ -4144,9 +4207,22 @@ gb_internal i64 type_align_of_internal(Type *t, TypePath *path) { } case Type_DynamicArray: - // data, count, capacity, allocator + // data, len, cap, allocator return build_context.int_size; + case Type_FixedCapacityDynamicArray: + // data, len + { + Type *elem = t->FixedCapacityDynamicArray.elem; + bool pop = type_path_push(path, elem); + if (path->failure) { + return FAILURE_ALIGNMENT; + } + i64 align = type_align_of_internal(elem, path); + if (pop) type_path_pop(path); + return gb_max(build_context.int_size, align); + } + case Type_Slice: return build_context.int_size; @@ -4419,6 +4495,34 @@ gb_internal i64 type_size_of_internal(Type *t, TypePath *path) { // data + len + cap + allocator(procedure+data) return 3*build_context.int_size + 2*build_context.ptr_size; + case Type_FixedCapacityDynamicArray: + { + // data + len + i64 capacity = t->FixedCapacityDynamicArray.capacity; + Type *elem = t->FixedCapacityDynamicArray.elem; + i64 align = type_align_of_internal(elem, path); + if (path->failure) { + return FAILURE_SIZE; + } + align = gb_max(build_context.int_size, align); + + i64 size = type_size_of(elem); + size *= capacity; + + i64 old_size = size; + size = align_formula(size, build_context.int_size); + + i64 padding = size - old_size; + if (t->FixedCapacityDynamicArray.padding_needed >= 0) { + GB_ASSERT(t->FixedCapacityDynamicArray.padding_needed == padding); + } + t->FixedCapacityDynamicArray.padding_needed = padding; + + size += 1*build_context.int_size; + size = align_formula(size, align); + return size; + } + case Type_Map: /* struct { @@ -4644,6 +4748,23 @@ gb_internal i64 type_offset_of(Type *t, i64 index, Type **field_type_) { return 3*build_context.int_size; // allocator } break; + + case Type_FixedCapacityDynamicArray: + switch (index) { + case 0: + if (field_type_) *field_type_ = alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity); + return 0; // data + + case 1: // len + if (field_type_) *field_type_ = t_int; + { + i64 offset = 0; + offset = type_size_of(alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity)); + offset = align_formula(offset, build_context.int_size); + return offset; + } + } + break; case Type_Union: if (!is_type_union_maybe_pointer(t)) { /* i64 s = */ type_size_of(t); @@ -4711,6 +4832,12 @@ gb_internal i64 type_offset_of_from_selection(Type *type, Selection sel) { case 3: t = t_allocator; break; } break; + case Type_FixedCapacityDynamicArray: + switch (index) { + case 0: t = alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity); break; + case 1: t = t_int; break; + } + break; } } } @@ -4970,6 +5097,15 @@ gb_internal Type *type_internal_index(Type *t, isize index) { default: GB_PANIC("invalid raw dynamic array index"); }; } + + case Type_FixedCapacityDynamicArray: + { + switch (index) { + case 0: t = alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity); break; + case 1: return t_int; + default: GB_PANIC("invalid raw fixed capacity dynamic array index"); + }; + } case Type_Struct: return get_struct_field_type(bt, index); case Type_Union: @@ -5068,6 +5204,13 @@ gb_internal gbString write_type_to_string(gbString str, Type *type, bool shortha str = write_type_to_string(str, type->DynamicArray.elem, shorthand, allow_polymorphic); break; + case Type_FixedCapacityDynamicArray: + str = gb_string_appendc(str, "[dynamic; "); + str = gb_string_appendc(str, gb_bprintf("%lld", cast(long long)type->FixedCapacityDynamicArray.capacity)); + str = gb_string_appendc(str, "]"); + str = write_type_to_string(str, type->FixedCapacityDynamicArray.elem, shorthand, allow_polymorphic); + break; + case Type_Enum: str = gb_string_appendc(str, "enum"); if (type->Enum.base_type != nullptr) { From 4df2de057bd45d9ebd809fe3d34b978869df7a3e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Mar 2026 18:43:01 +0000 Subject: [PATCH 082/273] Add `Type_Info_Fixed_Capacity_Dynamic_Array` to `json` --- core/encoding/json/marshal.odin | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index 011fc6f91..a38c6b6d9 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -320,6 +320,16 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: } opt_write_end(w, opt, ']') or_return + case runtime.Type_Info_Fixed_Capacity_Dynamic_Array: + opt_write_start(w, opt, '[') or_return + len := (^int)(uintptr(v.data) + info.len_offset)^ + for i in 0.. Date: Sat, 10 Jan 2026 10:21:00 -0500 Subject: [PATCH 083/273] Add support for other Android architectures --- src/build_settings.cpp | 30 ++++++++++++++++++++++++++++-- src/linker.cpp | 9 +++++---- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index f46b7d247..bcaf72f90 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1683,7 +1683,20 @@ gb_internal void init_android_values(bool with_sdk) { gb_exit(1); } - bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB = concatenate_strings(permanent_allocator(), bc->ODIN_ANDROID_NDK_TOOLCHAIN, str_lit("sysroot/usr/lib/aarch64-linux-android/")); + switch (bc->metrics.arch) { + case TargetArch_arm64: + bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB = str_lit("aarch64-linux-android"); + break; + case TargetArch_arm32: + bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB = str_lit("arm-linux-androideabi"); + break; + case TargetArch_amd64: + bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB = str_lit("x86_64-linux-android"); + break; + case TargetArch_i386: + bc->ODIN_ANDROID_NDK_TOOLCHAIN_LIB = str_lit("i686-linux-android"); + break; + } char buf[32] = {}; gb_snprintf(buf, gb_size_of(buf), "%d/", bc->ODIN_ANDROID_API_LEVEL); @@ -1958,9 +1971,22 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta } else if (metrics->os == TargetOs_linux && subtarget == Subtarget_Android) { switch (metrics->arch) { case TargetArch_arm64: - bc->metrics.target_triplet = str_lit("aarch64-none-linux-android"); + bc->metrics.target_triplet = str_lit("aarch64-linux-android"); bc->reloc_mode = RelocMode_PIC; break; + case TargetArch_arm32: + bc->metrics.target_triplet = str_lit("armv7a-linux-androideabi"); + bc->reloc_mode = RelocMode_PIC; + break; + case TargetArch_amd64: + bc->metrics.target_triplet = str_lit("x86_64-linux-android"); + bc->reloc_mode = RelocMode_PIC; + break; + case TargetArch_i386: + bc->metrics.target_triplet = str_lit("i686-linux-android"); + bc->reloc_mode = RelocMode_PIC; + break; + default: GB_PANIC("Unknown architecture for -subtarget:android"); } diff --git a/src/linker.cpp b/src/linker.cpp index e48486d9a..12f016cea 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -676,7 +676,7 @@ try_cross_linking:; defer (gb_string_free(glue)); glue = gb_string_append_fmt(glue, "bin/clang"); - glue = gb_string_append_fmt(glue, " --target=aarch64-linux-android%d ", ODIN_ANDROID_API_LEVEL); + glue = gb_string_append_fmt(glue, " --target=%s%d ", build_context.metrics.target_triplet, ODIN_ANDROID_API_LEVEL); glue = gb_string_appendc(glue, "-c \""); glue = gb_string_append_length(glue, ODIN_ANDROID_NDK.text, ODIN_ANDROID_NDK.len); glue = gb_string_appendc(glue, "sources/android/native_app_glue/android_native_app_glue.c"); @@ -697,8 +697,9 @@ try_cross_linking:; glue = gb_string_appendc(glue, "\"-I"); glue = gb_string_append_length(glue, ODIN_ANDROID_NDK_TOOLCHAIN.text, ODIN_ANDROID_NDK_TOOLCHAIN.len); - glue = gb_string_appendc(glue, "sysroot/usr/include/aarch64-linux-android/"); - glue = gb_string_appendc(glue, "\" "); + glue = gb_string_appendc(glue, "sysroot/usr/include/"); + glue = gb_string_append_length(glue, ODIN_ANDROID_NDK_TOOLCHAIN_LIB.text, ODIN_ANDROID_NDK_TOOLCHAIN_LIB.len); + glue = gb_string_appendc(glue, "/\" "); glue = gb_string_appendc(glue, "-Wno-macro-redefined "); @@ -969,7 +970,7 @@ try_cross_linking:; gbString ndk_bin_directory = gb_string_make_length(temporary_allocator(), ODIN_ANDROID_NDK_TOOLCHAIN.text, ODIN_ANDROID_NDK_TOOLCHAIN.len); link_command_line = gb_string_appendc(link_command_line, ndk_bin_directory); link_command_line = gb_string_appendc(link_command_line, "bin/clang"); - link_command_line = gb_string_append_fmt(link_command_line, " --target=aarch64-linux-android%d ", ODIN_ANDROID_API_LEVEL); + link_command_line = gb_string_append_fmt(link_command_line, " --target=%s%d ", build_context.metrics.target_triplet, ODIN_ANDROID_API_LEVEL); } else { link_command_line = gb_string_appendc(link_command_line, clang_path); } From 273ab7e3bb49a0b09d46f42041b58316196a8ee8 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Mar 2026 22:16:35 +0100 Subject: [PATCH 084/273] nbio: fix posix big send/recv wrongly check if done --- core/nbio/impl_posix.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index 8469c9ade..3ecb5d8a3 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -805,7 +805,7 @@ send_exec :: proc(op: ^Operation) -> Op_Result { op.send.sent += n - if op.send.sent < total { + if n < total { return send_exec(op) } @@ -869,7 +869,7 @@ recv_exec :: proc(op: ^Operation) -> Op_Result { assert(is_tcp || op.recv.received == 0) op.recv.received += n - if is_tcp && n != 0 && op.recv.received < total { + if is_tcp && n != 0 && n < total { return recv_exec(op) } From 535b70b82e086dcc7de258844d334d570ee971ff Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 09:37:27 +0000 Subject: [PATCH 085/273] Add other `@builtin` procedures for fixed capacity dynamic arrays --- base/runtime/core_builtin.odin | 317 +++++++++++++++++++++++++++++++-- 1 file changed, 301 insertions(+), 16 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 7a1a38f9a..bcb00f0f9 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -165,28 +165,50 @@ remove_range :: proc(array: ^$D/[dynamic]$T, #any_int lo, hi: int, loc := #calle } -// `pop` will remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. +// `pop_dynamic_array` will remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. // // Note: If the dynamic array has no elements (`len(array) == 0`), this procedure will panic. @builtin -pop :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) #no_bounds_check { +pop_dynamic_array :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) #no_bounds_check { assert(len(array) > 0, loc=loc) - _pop_type_erased(&res, (^Raw_Dynamic_Array)(array), size_of(E)) + _pop_dynamic_array_type_erased(&res, (^Raw_Dynamic_Array)(array), size_of(E)) return res } -_pop_type_erased :: proc(res: rawptr, array: ^Raw_Dynamic_Array, elem_size: int, loc := #caller_location) { +_pop_dynamic_array_type_erased :: proc(res: rawptr, array: ^Raw_Dynamic_Array, elem_size: int) { end := rawptr(uintptr(array.data) + uintptr(elem_size*(array.len-1))) intrinsics.mem_copy_non_overlapping(res, end, elem_size) array.len -= 1 } +// `pop_fixed_capacity_dynamic_array` will remove and return the end value of fixed capacity dynamic array `array` and reduces the length of `array` by 1. +// +// Note: If the fixed capacity dynamic array has no elements (`len(array) == 0`), this procedure will panic. +@builtin +pop_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, loc := #caller_location) -> (res: E) #no_bounds_check { + assert(len(array) > 0, loc=loc) -// `pop_safe` trys to remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. + elem_size :: size_of(E) + end := rawptr(uintptr(array) + uintptr(elem_size*(len(array)-1))) + intrinsics.mem_copy_non_overlapping(&res, end, elem_size) + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 +} + + +// `pop` will remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. +// +// Note: If the dynamic array has no elements (`len(array) == 0`), this procedure will panic. +@builtin +pop :: proc{ + pop_dynamic_array, + pop_fixed_capacity_dynamic_array, +} + +// `pop_safe_dynamic_array` trys to remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. // If the operation is not possible, it will return false. @builtin -pop_safe :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #no_bounds_check { +pop_safe_dynamic_array :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #no_bounds_check { if len(array) == 0 { return } @@ -195,11 +217,32 @@ pop_safe :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #n return } -// `pop_front` will remove and return the first value of dynamic array `array` and reduces the length of `array` by 1. +// `pop_safe_fixed_capacity_dynamic_array` trys to remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. +// If the operation is not possible, it will return false. +@builtin +pop_safe_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E) -> (res: E, ok: bool) #no_bounds_check { + if len(array) == 0 { + return + } + res, ok = array[len(array)-1], true + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 + return +} + +// `pop_safe` trys to remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. +// If the operation is not possible, it will return false. +@builtin +pop_safe :: proc{ + pop_safe_dynamic_array, + pop_safe_fixed_capacity_dynamic_array, +} + + +// `pop_front_dynamic_array` will remove and return the first value of dynamic array `array` and reduces the length of `array` by 1. // // Note: If the dynamic array as no elements (`len(array) == 0`), this procedure will panic. @builtin -pop_front :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) #no_bounds_check { +pop_front_dynamic_array :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) #no_bounds_check { assert(len(array) > 0, loc=loc) res = array[0] if len(array) > 1 { @@ -209,10 +252,35 @@ pop_front :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) # return res } -// `pop_front_safe` trys to return and remove the first value of dynamic array `array` and reduces the length of `array` by 1. +// `pop_front_fixed_capacity_dynamic_array` will remove and return the first value of fixed capacity dynamic array `array` and reduces the length of `array` by 1. +// +// Note: If the fixed capacity dynamic array as no elements (`len(array) == 0`), this procedure will panic. +@builtin +pop_front_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, loc := #caller_location) -> (res: E) #no_bounds_check { + assert(len(array) > 0, loc=loc) + res = array[0] + if len(array) > 1 { + copy(array[0:], array[1:]) + } + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 + return res +} + + +// `pop_front` will remove and return the first value of dynamic array `array` and reduces the length of `array` by 1. +// +// Note: If the dynamic array as no elements (`len(array) == 0`), this procedure will panic. +@builtin +pop_front :: proc{ + pop_front_dynamic_array, + pop_front_fixed_capacity_dynamic_array, +} + + +// `pop_front_safe_dynamic_array` trys to return and remove the first value of dynamic array `array` and reduces the length of `array` by 1. // If the operation is not possible, it will return false. @builtin -pop_front_safe :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #no_bounds_check { +pop_front_safe_dynamic_array :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #no_bounds_check { if len(array) == 0 { return } @@ -224,12 +292,37 @@ pop_front_safe :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: E, ok: bo return } +// `pop_front_safe_fixed_capacity_dynamic_array` trys to return and remove the first value of dynamic array `array` and reduces the length of `array` by 1. +// If the operation is not possible, it will return false. +@builtin +pop_front_safe_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E) -> (res: E, ok: bool) #no_bounds_check { + if len(array) == 0 { + return + } + res, ok = array[0], true + if len(array) > 1 { + copy(array[0:], array[1:]) + } + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 + return +} + +// `pop_front_safe` trys to return and remove the first value of dynamic array `array` and reduces the length of `array` by 1. +// If the operation is not possible, it will return false. +@builtin +pop_front_safe :: proc { + pop_front_safe_dynamic_array, + pop_front_safe_fixed_capacity_dynamic_array, +} + + // `clear` will set the length of a passed dynamic array or map to `0` @builtin clear :: proc{ clear_dynamic_array, clear_map, + clear_fixed_capacity_dynamic_array, clear_soa_dynamic_array, } @@ -671,6 +764,15 @@ non_zero_append_elem_string :: proc(array: ^$T/[dynamic]$E/u8, arg: $A/string, l return _append_elem_string(array, arg, false, loc) } +// `non_zero_append_elem_fixed_capacity_string` appends a string to the end of a dynamic array of bytes, without zeroing any reserved memory +// +// Note: Prefer using the procedure group `non_zero_append`. +@builtin +non_zero_append_elem_fixed_capacity_string :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, arg: $A/string) -> (n: int) { + return append_fixed_capacity_elem(array, transmute([]byte)arg) +} + + // The append_string built-in procedure appends multiple strings to the end of a [dynamic]u8 like type // @@ -691,7 +793,7 @@ append_string :: proc(array: ^$T/[dynamic]$E/u8, args: ..string, loc := #caller_ // `append_fixed_capacity_elem` appends an element to the end of a fixed capacity dynamic array. Returns 0 on failure @builtin -append_fixed_capacity_elem :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast arg: E) -> (n: int) { +append_fixed_capacity_elem :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #no_broadcast arg: E) -> (n: int) { Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) if (^Raw)(array).len >= N { @@ -708,7 +810,7 @@ append_fixed_capacity_elem :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast arg // `append_fixed_capacity_elem` appends an element to the end of a fixed capacity dynamic array. Returns 0 on failure @builtin -append_fixed_capacity_elems :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast args: ..E) -> (n: int) { +append_fixed_capacity_elems :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #no_broadcast args: ..E) -> (n: int) { Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) raw := (^Raw)(array) @@ -724,6 +826,22 @@ append_fixed_capacity_elems :: proc(array: ^$T/[dynamic; $N]$E, #no_broadcast ar return n } +// The append_fixed_capacity_string built-in procedure appends multiple strings to the end of a [dynamic]u8 like type +// +// Note: Prefer using the procedure group `append`. +@builtin +append_fixed_capacity_string :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, args: ..string, loc := #caller_location) -> (n: int) { + n_arg: int + for arg in args { + n_arg = append_fixed_capacity_elems(array, ..transmute([]E)(arg), loc=loc) + n += n_arg + if n_arg < len(arg) { + return + } + } + return +} + // The append built-in procedure appends elements to the end of a dynamic array @builtin @@ -734,6 +852,7 @@ append :: proc{ append_fixed_capacity_elem, append_fixed_capacity_elems, + append_fixed_capacity_string, append_soa_elem, append_soa_elems, @@ -746,6 +865,7 @@ non_zero_append :: proc{ non_zero_append_elem_string, append_fixed_capacity_elem, + non_zero_append_elem_fixed_capacity_string, non_zero_append_soa_elem, non_zero_append_soa_elems, @@ -755,7 +875,7 @@ non_zero_append :: proc{ // `append_nothing` appends an empty value to a dynamic array. It returns `1, nil` if successful, and `0, err` when it was not possible, // whatever `err` happens to be. @builtin -append_nothing :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +append_nothing_dynamic_array :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { if array == nil { return 0, nil } @@ -764,6 +884,27 @@ append_nothing :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (n: i return len(array)-prev_len, nil } +// `append_nothing` appends an empty value to a dynamic array. It returns `1, nil` if successful, and `0, err` when it was not possible, +// whatever `err` happens to be. +@builtin +append_nothing_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E) -> (n: int, ok: bool) { + if array == nil { + return 0, true + } + prev_len := len(array) + resize_fixed_capacity_dynamic_array(array, len(array)+1) or_return + return len(array)-prev_len, true +} + + +// `append_nothing` appends an empty value to a dynamic array. It returns `1, nil` if successful, and `0, err` when it was not possible, +// whatever `err` happens to be. +@builtin +append_nothing :: proc{ + append_nothing_dynamic_array, + append_nothing_fixed_capacity_dynamic_array, +} + // `inject_at_elem` injects an element in a dynamic array at a specified index and moves the previous elements after that index "across" @builtin @@ -839,11 +980,87 @@ inject_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, ar return } + +// `inject_at_elem_fixed_capacity_dynamic_array` injects an element in a dynamic array at a specified index and moves the previous elements after that index "across" +@builtin +inject_at_elem_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int index: int, #no_broadcast arg: E, loc := #caller_location) -> (ok: bool) #no_bounds_check { + when !ODIN_NO_BOUNDS_CHECK { + ensure(index >= 0, "Index must be positive.", loc) + } + if array == nil { + return false + } + n := max(len(array), index) + m :: 1 + new_size := n + m + + resize(array, new_size, loc) or_return + when size_of(E) != 0 { + copy(array[index + m:], array[index:]) + array[index] = arg + } + return true +} + +// `inject_at_elems_fixed_capacity_dynamic_array` injects multiple elements in a dynamic array at a specified index and moves the previous elements after that index "across" +@builtin +inject_at_elems_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int index: int, #no_broadcast args: ..E, loc := #caller_location) -> (ok: bool) #no_bounds_check { + when !ODIN_NO_BOUNDS_CHECK { + ensure(index >= 0, "Index must be positive.", loc) + } + if array == nil { + return false + } + if len(args) == 0 { + return true + } + + n := max(len(array), index) + m := len(args) + new_size := n + m + + resize(array, new_size, loc) or_return + when size_of(E) != 0 { + copy(array[index + m:], array[index:]) + copy(array[index:], args) + } + return true +} + +// `inject_at_elem_string_fixed_capacity_dynamic_array` injects a string into a dynamic array at a specified index and moves the previous elements after that index "across" +@builtin +inject_at_elem_string_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E/u8, #any_int index: int, arg: string, loc := #caller_location) -> (ok: bool) #no_bounds_check { + when !ODIN_NO_BOUNDS_CHECK { + ensure(index >= 0, "Index must be positive.", loc) + } + if array == nil { + return false + } + if len(arg) == 0 { + return true + } + + n := max(len(array), index) + m := len(arg) + new_size := n + m + + resize(array, new_size, loc) or_return + copy(array[index+m:], array[index:]) + copy(array[index:], arg) + return true +} + + // `inject_at` injects something into a dynamic array at a specified index and moves the previous elements after that index "across" -@builtin inject_at :: proc{ +@builtin +inject_at :: proc{ inject_at_elem, inject_at_elems, inject_at_elem_string, + + inject_at_elem_fixed_capacity_dynamic_array, + inject_at_elems_fixed_capacity_dynamic_array, + inject_at_elem_string_fixed_capacity_dynamic_array, } @@ -900,6 +1117,60 @@ assign_at_elem_string :: proc(array: ^$T/[dynamic]$E/u8, #any_int index: int, ar return } + +// `assign_at_elem_fixed_capacity_dynamic_array` assigns a value at a given index. If the requested index is past the end of the current +// size of the dynamic array, it will attempt to `resize` the a new length of `index+1` and then assign as `index`. +@builtin +assign_at_elem_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #any_int index: int, arg: E) -> (ok: bool) #no_bounds_check { + if index < len(array) { + array[index] = arg + ok = true + } else { + resize(array, index+1, loc) or_return + array[index] = arg + ok = true + } + return +} + + +// `assign_at_elems_fixed_capacity_dynamic_array` assigns a values at a given index. If the requested index is past the end of the current +// size of the dynamic array, it will attempt to `resize` the a new length of `index+len(args)` and then assign as `index`. +@builtin +assign_at_elems_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #any_int index: int, #no_broadcast args: ..E) -> (ok: bool) #no_bounds_check { + new_size := index + len(args) + if len(args) == 0 { + ok = true + } else if new_size < len(array) { + copy(array[index:], args) + ok = true + } else { + resize(array, new_size, loc) or_return + copy(array[index:], args) + ok = true + } + return +} + +// `assign_at_elem_string_fixed_capacity_dynamic_array` assigns a string at a given index. If the requested index is past the end of the current +// size of the dynamic array, it will attempt to `resize` the a new length of `index+len(arg)` and then assign as `index`. +@builtin +assign_at_elem_string_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, #any_int index: int, arg: string) -> (ok: bool) #no_bounds_check { + new_size := index + len(arg) + if len(arg) == 0 { + ok = true + } else if new_size < len(array) { + copy(array[index:], arg) + ok = true + } else { + resize(array, new_size, loc) or_return + copy(array[index:], arg) + ok = true + } + return +} + + // `assign_at` assigns a value at a given index. If the requested index is past the end of the current // size of the dynamic array, it will attempt to `resize` the a new length of `index+size_needed` and then assign as `index`. @builtin @@ -907,6 +1178,10 @@ assign_at :: proc{ assign_at_elem, assign_at_elems, assign_at_elem_string, + + assign_at_elem_fixed_capacity_dynamic_array, + assign_at_elems_fixed_capacity_dynamic_array, + assign_at_elem_string_fixed_capacity_dynamic_array, } @@ -921,6 +1196,16 @@ clear_dynamic_array :: proc "contextless" (array: ^$T/[dynamic]$E) { } } +// `clear_fixed_capacity_dynamic_array` will set the length of a passed dynamic array to `0` +// +// Note: Prefer the procedure group `clear`. +@builtin +clear_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E) { + if array != nil { + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len = 0 + } +} + // `reserve_dynamic_array` will try to reserve memory of a passed dynamic array or map to the requested element count (setting the `cap`). // // When a memory resize allocation is required, the memory will be asked to be zeroed (i.e. it calls `mem_resize`). @@ -1046,7 +1331,7 @@ non_zero_resize_dynamic_array :: proc(array: ^$T/[dynamic]$E, #any_int length: i // // Note: Prefer the procedure group `resize` @builtin -resize_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int length: int) -> bool { +resize_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #any_int length: int) -> bool { if array == nil { return false } @@ -1066,7 +1351,7 @@ resize_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int // // Note: Prefer the procedure group `resize` @builtin -non_zero_resize_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, #any_int length: int) -> bool { +non_zero_resize_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #any_int length: int) -> bool { if array == nil { return false } From 6a03cf5d683870317fe0236d552ee4c1bb6ff951 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 09:40:31 +0000 Subject: [PATCH 086/273] Add "remove" procedures to fixed capacity dynamic arrays --- base/runtime/core_builtin.odin | 77 +++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index bcb00f0f9..0a59167b2 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -119,14 +119,14 @@ copy :: proc{copy_slice, copy_from_string, copy_from_string16} -// `unordered_remove` removed the element at the specified `index`. It does so by replacing the current end value +// `unordered_remove_dynamic_array` removed the element at the specified `index`. It does so by replacing the current end value // with the old value, and reducing the length of the dynamic array by 1. // // Note: This is an O(1) operation. // Note: If you want the elements to remain in their order, use `ordered_remove`. // Note: If the index is out of bounds, this procedure will panic. @builtin -unordered_remove :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { +unordered_remove_dynamic_array :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { bounds_check_error_loc(loc, index, len(array)) n := len(array)-1 if index != n { @@ -134,13 +134,13 @@ unordered_remove :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #ca } (^Raw_Dynamic_Array)(array).len -= 1 } -// `ordered_remove` removed the element at the specified `index` whilst keeping the order of the other elements. +// `ordered_remove_dynamic_array` removed the element at the specified `index` whilst keeping the order of the other elements. // // Note: This is an O(N) operation. // Note: If the elements do not have to remain in their order, prefer `unordered_remove`. // Note: If the index is out of bounds, this procedure will panic. @builtin -ordered_remove :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { +ordered_remove_dynamic_array :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { bounds_check_error_loc(loc, index, len(array)) if index+1 < len(array) { copy(array[index:], array[index+1:]) @@ -148,12 +148,12 @@ ordered_remove :: proc(array: ^$D/[dynamic]$T, #any_int index: int, loc := #call (^Raw_Dynamic_Array)(array).len -= 1 } -// `remove_range` removes a range of elements specified by the range `lo` and `hi`, whilst keeping the order of the other elements. +// `remove_range_dynamic_array` removes a range of elements specified by the range `lo` and `hi`, whilst keeping the order of the other elements. // // Note: This is an O(N) operation. // Note: If the range is out of bounds, this procedure will panic. @builtin -remove_range :: proc(array: ^$D/[dynamic]$T, #any_int lo, hi: int, loc := #caller_location) #no_bounds_check { +remove_range_dynamic_array :: proc(array: ^$D/[dynamic]$T, #any_int lo, hi: int, loc := #caller_location) #no_bounds_check { slice_expr_error_lo_hi_loc(loc, lo, hi, len(array)) n := max(hi-lo, 0) if n > 0 { @@ -164,6 +164,71 @@ remove_range :: proc(array: ^$D/[dynamic]$T, #any_int lo, hi: int, loc := #calle } } +// `unordered_remove_fixed_capacity_dynamic_array` removed the element at the specified `index`. It does so by replacing the current end value +// with the old value, and reducing the length of the dynamic array by 1. +// +// Note: This is an O(1) operation. +// Note: If you want the elements to remain in their order, use `ordered_remove`. +// Note: If the index is out of bounds, this procedure will panic. +@builtin +unordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { + bounds_check_error_loc(loc, index, len(array)) + n := len(array)-1 + if index != n { + array[index] = array[n] + } + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 +} +// `ordered_remove_fixed_capacity_dynamic_array` removed the element at the specified `index` whilst keeping the order of the other elements. +// +// Note: This is an O(N) operation. +// Note: If the elements do not have to remain in their order, prefer `unordered_remove`. +// Note: If the index is out of bounds, this procedure will panic. +@builtin +ordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { + bounds_check_error_loc(loc, index, len(array)) + if index+1 < len(array) { + copy(array[index:], array[index+1:]) + } + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 +} + +// `remove_range_fixed_capacity_dynamic_array` removes a range of elements specified by the range `lo` and `hi`, whilst keeping the order of the other elements. +// +// Note: This is an O(N) operation. +// Note: If the range is out of bounds, this procedure will panic. +@builtin +remove_range_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int lo, hi: int, loc := #caller_location) #no_bounds_check { + slice_expr_error_lo_hi_loc(loc, lo, hi, len(array)) + n := max(hi-lo, 0) + if n > 0 { + if hi != len(array) { + copy(array[lo:], array[hi:]) + } + (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= n + } +} + +@builtin +unordered_remove :: proc{ + unordered_remove_dynamic_array, + unordered_remove_fixed_capacity_dynamic_array, +} + + +@builtin +ordered_remove :: proc{ + ordered_remove_dynamic_array, + ordered_remove_fixed_capacity_dynamic_array, +} + +@builtin +remove_range :: proc{ + remove_range_dynamic_array, + remove_range_fixed_capacity_dynamic_array, +} + + // `pop_dynamic_array` will remove and return the end value of dynamic array `array` and reduces the length of `array` by 1. // From 8ff07d29be715c5daf6983a336024d3aebef80b2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 09:42:46 +0000 Subject: [PATCH 087/273] Fix parser position for fixed capacity dynamic arrays --- src/parser_pos.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/parser_pos.cpp b/src/parser_pos.cpp index 1ffd3a82f..1d2b5090a 100644 --- a/src/parser_pos.cpp +++ b/src/parser_pos.cpp @@ -107,6 +107,7 @@ gb_internal Token ast_token(Ast *node) { case Ast_MultiPointerType: return node->MultiPointerType.token; case Ast_ArrayType: return node->ArrayType.token; case Ast_DynamicArrayType: return node->DynamicArrayType.token; + case Ast_FixedCapacityDynamicArrayType: return node->FixedCapacityDynamicArrayType.token; case Ast_StructType: return node->StructType.token; case Ast_UnionType: return node->UnionType.token; case Ast_EnumType: return node->EnumType.token; @@ -342,6 +343,7 @@ Token ast_end_token(Ast *node) { case Ast_MultiPointerType: return ast_end_token(node->MultiPointerType.type); case Ast_ArrayType: return ast_end_token(node->ArrayType.elem); case Ast_DynamicArrayType: return ast_end_token(node->DynamicArrayType.elem); + case Ast_FixedCapacityDynamicArrayType: return ast_end_token(node->FixedCapacityDynamicArrayType.elem); case Ast_StructType: if (node->StructType.fields.count > 0) { return ast_end_token(node->StructType.fields[node->StructType.fields.count-1]); From a6160770ff550426ad1b475d29a5356a51f6facb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 10:03:58 +0000 Subject: [PATCH 088/273] Support compound literals for fixed capacity dynamic arrays --- src/check_expr.cpp | 5 ++ src/llvm_backend_const.cpp | 124 +++++++++++++++++++++++++++++++++++ src/llvm_backend_expr.cpp | 33 ++++++++-- src/llvm_backend_utility.cpp | 15 ++++- src/types.cpp | 7 +- 5 files changed, 171 insertions(+), 13 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 9f66f8fec..39af640d8 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -10321,6 +10321,7 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * case Type_DynamicArray: case Type_SimdVector: case Type_Matrix: + case Type_FixedCapacityDynamicArray: { Type *elem_type = nullptr; String context_name = {}; @@ -10351,6 +10352,10 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * elem_type = t->DynamicArray.elem; context_name = str_lit("dynamic array literal"); is_constant = false; + } else if (t->kind == Type_FixedCapacityDynamicArray) { + elem_type = t->FixedCapacityDynamicArray.elem; + context_name = str_lit("fixed capacity dynamic array literal"); + max_type_count = t->FixedCapacityDynamicArray.capacity; } else if (t->kind == Type_SimdVector) { elem_type = t->SimdVector.elem; context_name = str_lit("simd vector literal"); diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 9f2052960..289d3daa2 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -694,6 +694,28 @@ gb_internal void lb_const_array_spread(lbModule *m, lbConstContext cc, Type *arr res->value = llvm_const_array(m, lb_type(m, elem), elems, cast(unsigned)count); } +gb_internal LLVMValueRef lb_fill_fixed_capacity_dynamic_array(lbModule *m, i64 elem_count, Type *original_type, LLVMValueRef *values, lbConstContext cc) { + Type *bt = base_type(original_type); + GB_ASSERT(bt->kind == Type_FixedCapacityDynamicArray); + Type *elem_type = bt->FixedCapacityDynamicArray.elem; + i64 capacity = bt->FixedCapacityDynamicArray.capacity; + + Type *array_backing_type = alloc_type_array(elem_type, capacity); + LLVMValueRef array_backing = lb_build_constant_array_values(m, array_backing_type, elem_type, cast(isize)capacity, values, cc); + LLVMValueRef array_len = lb_const_int(m, t_int, elem_count).value; + + isize svalue_count = 0; + LLVMValueRef svalues[3] = {}; + svalues[svalue_count++] = array_backing; + i64 padding = bt->FixedCapacityDynamicArray.padding_needed; + if (padding > 0) { + svalues[svalue_count++] = LLVMConstNull(lb_type_padding_filler(m, padding, 1)); + } + svalues[svalue_count++] = array_len; + + return llvm_const_named_struct(m, original_type, svalues, svalue_count); +} + gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lbConstContext cc, Type *value_type) { if (cc.allow_local) { cc.is_rodata = false; @@ -1554,6 +1576,108 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb res.value = lb_build_constant_array_values(m, type, elem_type, cast(isize)type->EnumeratedArray.count, values, cc); return res; } + } else if (is_type_fixed_capacity_dynamic_array(type)) { + ast_node(cl, CompoundLit, value.value_compound); + Type *elem_type = type->FixedCapacityDynamicArray.elem; + i64 capacity = type->FixedCapacityDynamicArray.capacity; + isize elem_count = cl->elems.count; + if (elem_count == 0 || !elem_type_can_be_constant(elem_type)) { + return lb_const_nil(m, original_type); + } + if (cl->elems[0]->kind == Ast_FieldValue) { + // TODO(bill): This is O(N*M) and will be quite slow; it should probably be sorted before hand + LLVMValueRef *values = gb_alloc_array(temporary_allocator(), LLVMValueRef, cast(isize)capacity); + + i64 max_index = -1; + isize value_index = 0; + for (i64 i = 0; i < capacity; i++) { + bool found = false; + + for (isize j = 0; j < elem_count; j++) { + Ast *elem = cl->elems[j]; + ast_node(fv, FieldValue, elem); + if (is_ast_range(fv->field)) { + ast_node(ie, BinaryExpr, fv->field); + TypeAndValue lo_tav = ie->left->tav; + TypeAndValue hi_tav = ie->right->tav; + GB_ASSERT(lo_tav.mode == Addressing_Constant); + GB_ASSERT(hi_tav.mode == Addressing_Constant); + + TokenKind op = ie->op.kind; + i64 lo = exact_value_to_i64(lo_tav.value); + i64 hi = exact_value_to_i64(hi_tav.value); + if (op != Token_RangeHalf) { + hi += 1; + } + max_index = gb_max(max_index, hi-1); + + if (lo == i) { + TypeAndValue tav = fv->value->tav; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + for (i64 k = lo; k < hi; k++) { + values[value_index++] = val; + } + + found = true; + i += (hi-lo-1); + break; + } + } else { + TypeAndValue index_tav = fv->field->tav; + GB_ASSERT(index_tav.mode == Addressing_Constant); + i64 index = exact_value_to_i64(index_tav.value); + + max_index = gb_max(max_index, index); + + if (index == i) { + TypeAndValue tav = fv->value->tav; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + values[value_index++] = val; + found = true; + break; + } + } + } + + if (!found) { + values[value_index++] = LLVMConstNull(lb_type(m, elem_type)); + } + } + + i64 count = max_index+1; + GB_ASSERT(0 < count); + GB_ASSERT(count <= capacity); + + res.value = lb_fill_fixed_capacity_dynamic_array(m, count, original_type, values, cc); + return res; + } else if (are_types_identical(value.value_compound->tav.type, elem_type)) { + // Compound is of array item type; expand its value to all items in array. + LLVMValueRef* values = gb_alloc_array(temporary_allocator(), LLVMValueRef, cast(isize)capacity); + + for (isize i = 0; i < capacity; i++) { + values[i] = lb_const_value(m, elem_type, value, cc, elem_type).value; + } + + res.value = lb_fill_fixed_capacity_dynamic_array(m, capacity, original_type, values, cc); + return res; + } else { + // Assume that compound value is an array literal + GB_ASSERT_MSG(elem_count <= capacity, "%td <= %td", elem_count, capacity); + + LLVMValueRef *values = gb_alloc_array(temporary_allocator(), LLVMValueRef, cast(isize)capacity); + + for (isize i = 0; i < elem_count; i++) { + TypeAndValue tav = cl->elems[i]->tav; + GB_ASSERT(tav.mode != Addressing_Invalid); + values[i] = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + } + for (isize i = elem_count; i < capacity; i++) { + values[i] = LLVMConstNull(lb_type(m, elem_type)); + } + + res.value = lb_fill_fixed_capacity_dynamic_array(m, elem_count, original_type, values, cc); + return res; + } } else if (is_type_simd_vector(type)) { ast_node(cl, CompoundLit, value.value_compound); diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index e352a33e9..af498214e 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -4495,6 +4495,7 @@ gb_internal void lb_build_addr_compound_lit_populate(lbProcedure *p, SliceDynamicArray.elem; break; case Type_SimdVector: et = bt->SimdVector.elem; break; case Type_Matrix: et = bt->Matrix.elem; break; + case Type_FixedCapacityDynamicArray: et = bt->FixedCapacityDynamicArray.elem; break; } GB_ASSERT(et != nullptr); @@ -5102,12 +5103,13 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { Type *et = nullptr; switch (bt->kind) { - case Type_Array: et = bt->Array.elem; break; - case Type_EnumeratedArray: et = bt->EnumeratedArray.elem; break; - case Type_Slice: et = bt->Slice.elem; break; - case Type_BitSet: et = bt->BitSet.elem; break; - case Type_SimdVector: et = bt->SimdVector.elem; break; - case Type_Matrix: et = bt->Matrix.elem; break; + case Type_Array: et = bt->Array.elem; break; + case Type_EnumeratedArray: et = bt->EnumeratedArray.elem; break; + case Type_Slice: et = bt->Slice.elem; break; + case Type_BitSet: et = bt->BitSet.elem; break; + case Type_SimdVector: et = bt->SimdVector.elem; break; + case Type_Matrix: et = bt->Matrix.elem; break; + case Type_FixedCapacityDynamicArray: et = bt->FixedCapacityDynamicArray.elem; break; } String proc_name = {}; @@ -5489,6 +5491,25 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { break; } + case Type_FixedCapacityDynamicArray: { + if (cl->elems.count > 0) { + lb_addr_store(p, v, lb_const_value(p->module, type, exact_value_compound(expr))); + + auto temp_data = array_make(temporary_allocator(), 0, cl->elems.count); + + lb_build_addr_compound_lit_populate(p, cl->elems, &temp_data, type); + + lbValue dst_ptr = lb_addr_get_ptr(p, v); + for_array(i, temp_data) { + i32 index = cast(i32)(temp_data[i].elem_index); + temp_data[i].gep = lb_emit_array_epi(p, dst_ptr, index); + } + + lb_build_addr_compound_lit_assign_array(p, temp_data); + } + break; + } + case Type_DynamicArray: { if (cl->elems.count == 0) { break; diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index b4ab5e4d6..349e8c85b 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1567,16 +1567,27 @@ gb_internal lbValue lb_emit_array_epi(lbProcedure *p, lbValue s, isize index) { Type *t = s.type; GB_ASSERT(is_type_pointer(t)); Type *st = base_type(type_deref(t)); - GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); + GB_ASSERT(0 <= index); + if (is_type_fixed_capacity_dynamic_array(st)) { + lbValue data = lb_emit_struct_ep(p, s, 0); + return lb_emit_epi(p, data, index); + } + + GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); return lb_emit_epi(p, s, index); } gb_internal lbValue lb_emit_array_epi(lbModule *m, lbValue s, isize index) { Type *t = s.type; GB_ASSERT(is_type_pointer(t)); Type *st = base_type(type_deref(t)); - GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); GB_ASSERT(0 <= index); + if (is_type_fixed_capacity_dynamic_array(st)) { + lbValue data = lb_emit_epi(m, s, 0); + return lb_emit_epi(m, data, index); + } + + GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); return lb_emit_epi(m, s, index); } diff --git a/src/types.cpp b/src/types.cpp index 418a64b04..73563968d 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -1109,13 +1109,13 @@ gb_internal Type *alloc_type_fixed_capacity_dynamic_array(Type *elem, i64 capaci t->FixedCapacityDynamicArray.elem = elem; t->FixedCapacityDynamicArray.capacity = capacity; t->FixedCapacityDynamicArray.generic_capacity = generic_capacity; - t->FixedCapacityDynamicArray.padding_needed = 0; + t->FixedCapacityDynamicArray.padding_needed = -1; return t; } Type *t = alloc_type(Type_FixedCapacityDynamicArray); t->FixedCapacityDynamicArray.elem = elem; t->FixedCapacityDynamicArray.capacity = capacity; - t->FixedCapacityDynamicArray.padding_needed = 0; + t->FixedCapacityDynamicArray.padding_needed = -1; return t; } @@ -4513,9 +4513,6 @@ gb_internal i64 type_size_of_internal(Type *t, TypePath *path) { size = align_formula(size, build_context.int_size); i64 padding = size - old_size; - if (t->FixedCapacityDynamicArray.padding_needed >= 0) { - GB_ASSERT(t->FixedCapacityDynamicArray.padding_needed == padding); - } t->FixedCapacityDynamicArray.padding_needed = padding; size += 1*build_context.int_size; From bc636e4b368dceb073ea2756a3503378f3ac04aa Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 12:56:00 +0000 Subject: [PATCH 089/273] raddbg debug view for fixed capacity dynamic arrays --- src/llvm_backend.cpp | 1 + src/llvm_backend_debug.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 931813f42..a4259b01e 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3583,6 +3583,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { lb_add_raddbg_string(m, "type_view: {type: \"[]?\", expr: \"array(data, len)\"}"); lb_add_raddbg_string(m, "type_view: {type: \"string\", expr: \"array(data, len)\"}"); lb_add_raddbg_string(m, "type_view: {type: \"[dynamic]?\", expr: \"rows($, array(data, len), len, cap, allocator)\"}"); + lb_add_raddbg_string(m, "type_view: {type: \"[dynamic;?]?\", expr: \"rows($, array(data, len), len)\"}"); // column major matrices lb_add_raddbg_string(m, "type_view: {type: \"matrix[1, ?]?\", expr: \"columns($.data, $[0])\"}"); diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index 4b09d3d5e..d3e63cbf7 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -442,14 +442,14 @@ gb_internal LLVMMetadataRef lb_debug_fixed_capacity_dynamic_array(lbModule *m, T LLVMDIFlagZero, lb_debug_type(m, elem_type) ); - i64 len_offset = type_offset_of(bt, 1); + i64 len_offset_in_bits = 8*type_offset_of(bt, 1); elements[1] = LLVMDIBuilderCreateMemberType( m->debug_builder, member_scope, "len", 3, file, line, int_bits, int_bits, - len_offset, + len_offset_in_bits, LLVMDIFlagZero, lb_debug_type(m, t_int) ); From e485d82c9d0b2cb526a9f94cff6718e0d2ef49f9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 13:01:29 +0000 Subject: [PATCH 090/273] cbor support for fixed capacity dynamic arrays --- core/encoding/cbor/marshal.odin | 26 +++++++++++++++++++++++++ core/encoding/cbor/unmarshal.odin | 32 +++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/core/encoding/cbor/marshal.odin b/core/encoding/cbor/marshal.odin index b23087c90..366473bcc 100644 --- a/core/encoding/cbor/marshal.odin +++ b/core/encoding/cbor/marshal.odin @@ -285,6 +285,32 @@ _marshal_into_encoder :: proc(e: Encoder, v: any, ti: ^runtime.Type_Info) -> (er } return + + case runtime.Type_Info_Fixed_Capacity_Dynamic_Array: + if info.elem.id == byte { + raw := (^[dynamic]byte)(v.data) + return err_conv(_encode_bytes(e, raw[:])) + } + + array_len := (^int)(uintptr(v.data) + info.len_offset)^ + array_data := uintptr(v.data) + err_conv(_encode_u64(e, u64(array_len), .Array)) or_return + + if impl, ok := _tag_implementations_type[info.elem.id]; ok { + for i in 0..marshal(e, any{rawptr(data), info.elem.id}) or_return + } + return + } + + elem_ti := runtime.type_info_core(type_info_of(info.elem.id)) + for i in 0.. t.capacity { return _unsupported(v, hdr) } + + // Copy into array type, delete original. + slice := ([^]byte)(v.data)[:len(bytes)] + n := copy(slice, bytes) + assert(n == len(bytes)) + (^int)(uintptr(v.data) + t.len_offset)^ = n + return } return _unsupported(v, hdr) @@ -553,6 +570,21 @@ _unmarshal_array :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header if out_of_space { return _unsupported(v, hdr) } return + case reflect.Type_Info_Fixed_Capacity_Dynamic_Array: + length, _ := err_conv(_decode_len_container(d, add)) or_return + if length > t.capacity { + return _unsupported(v, hdr) + } + + da := mem.Raw_Dynamic_Array{rawptr(v.data), 0, length, allocator } + + out_of_space := assign_array(d, &da, t.elem, length, growable=false) or_return + if out_of_space { return _unsupported(v, hdr) } + + (^int)(uintptr(v.data) + t.len_offset)^ = length + + return + case reflect.Type_Info_Complex: length, _ := err_conv(_decode_len_container(d, add)) or_return if length > 2 { From b4405d01f86d35d916e8b21704e2d0c2a6b17116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Vaeng=20R=C3=B8tnes?= Date: Thu, 12 Mar 2026 16:37:05 +0100 Subject: [PATCH 091/273] Fix typo in error message for using statement Change "It you do require..." to "If you do require..." --- src/check_type.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 82e70dd33..ed0d6528e 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1853,7 +1853,7 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para if (is_using && (feature_flags & OptInFeatureFlag_UsingStmt) == 0) { ERROR_BLOCK(); error(param, "'using' has been disallowed as it is considered bad practice to use as a statement/procedure parameter outside of immediate refactoring"); - error_line("\tIt you do require it for refactoring purposes or legacy code, it can be enabled on a per-file basis with '#+feature using-stmt'\n"); + error_line("\tIf you do require it for refactoring purposes or legacy code, it can be enabled on a per-file basis with '#+feature using-stmt'\n"); } if (type_expr == nullptr) { From 43d8c2bb344be20d9f4849e5e075cf5699f3a077 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 16:41:24 +0000 Subject: [PATCH 092/273] Add basic tests I know this is not the best place to put them but since `[dynamic; N]T` is meant to a replacement for `small_array.Small_Array(N, T)`, I thought it would be fine for the time being. --- .../test_fixed_capacity_dynamic_array.odin | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 tests/core/container/test_fixed_capacity_dynamic_array.odin diff --git a/tests/core/container/test_fixed_capacity_dynamic_array.odin b/tests/core/container/test_fixed_capacity_dynamic_array.odin new file mode 100644 index 000000000..91639fec6 --- /dev/null +++ b/tests/core/container/test_fixed_capacity_dynamic_array.odin @@ -0,0 +1,75 @@ +package test_core_container + +import "core:testing" + +@(test) +test_fixed_capacity_dynamic_array_removes :: proc(t: ^testing.T) { + array: [dynamic; 10]int + append(&array, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) + + ordered_remove(&array, 0) + testing.expect(t, slice_equal(array[:], []int { 1, 2, 3, 4, 5, 6, 7, 8, 9 })) + ordered_remove(&array, 5) + testing.expect(t, slice_equal(array[:], []int { 1, 2, 3, 4, 5, 7, 8, 9 })) + ordered_remove(&array, 6) + testing.expect(t, slice_equal(array[:], []int { 1, 2, 3, 4, 5, 7, 9 })) + unordered_remove(&array, 0) + testing.expect(t, slice_equal(array[:], []int { 9, 2, 3, 4, 5, 7 })) + unordered_remove(&array, 2) + testing.expect(t, slice_equal(array[:], []int { 9, 2, 7, 4, 5 })) + unordered_remove(&array, 4) + testing.expect(t, slice_equal(array[:], []int { 9, 2, 7, 4 })) +} + +@(test) +test_fixed_capacity_dynamic_array_inject_at :: proc(t: ^testing.T) { + array: [dynamic; 13]int + append(&array, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) + + testing.expect(t, inject_at(&array, 0, 0), "Expected to be able to inject into small array") + testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 })) + testing.expect(t, inject_at(&array, 0, 5), "Expected to be able to inject into small array") + testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9 })) + testing.expect(t, inject_at(&array, 0, len(array)), "Expected to be able to inject into small array") + testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 0 })) +} + +@(test) +test_fixed_capacity_dynamic_array_push_back_elems :: proc(t: ^testing.T) { + array: [dynamic; 2]int + testing.expect(t, slice_equal(array[:], []int { })) + testing.expect(t, append(&array, 0), "Expected to be able to append to empty small array") + testing.expect(t, slice_equal(array[:], []int { 0 })) + testing.expect(t, append(&array, 1, 2) == false, "Expected to fail appending multiple elements beyond capacity of small array") + testing.expect(t, append(&array, 1), "Expected to be able to append to small array") + testing.expect(t, slice_equal(array[:], []int { 0, 1 })) + testing.expect(t, append(&array, 1) == false, "Expected to fail appending to full small array") + testing.expect(t, append(&array, 1, 2) == false, "Expected to fail appending multiple elements to full small array") + clear(&array) + testing.expect(t, slice_equal(array[:], []int { })) + testing.expect(t, append(&array, 1, 2, 3) == false, "Expected to fail appending multiple elements to empty small array") + testing.expect(t, slice_equal(array[:], []int { })) + testing.expect(t, append(&array, 1, 2), "Expected to be able to append multiple elements to empty small array") + testing.expect(t, slice_equal(array[:], []int { 1, 2 })) +} + +@(test) +test_fixed_capacity_dynamic_array_resize :: proc(t: ^testing.T) { + + array: [dynamic; 4]int + + for i in 0..<4 { + append(&array, i+1) + } + testing.expect(t, slice_equal(array[:], []int{1, 2, 3, 4}), "Expected to initialize the array with 1, 2, 3, 4") + + clear(&array) + testing.expect(t, slice_equal(array[:], []int{}), "Expected to clear the array") + + non_zero_resize(&array, 4) + testing.expect(t, slice_equal(array[:], []int{1, 2, 3, 4}), "Expected non_zero_resize to set length 4 with previous values") + + clear(&array) + resize(&array, 4) + testing.expect(t, slice_equal(array[:], []int{0, 0, 0, 0}), "Expected resize to set length 4 with zeroed values") +} From 6898cbe678496a5cb71d3192354ac9a92169f273 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 16:46:51 +0000 Subject: [PATCH 093/273] Replace usage of `Small_Array(N; T)` with `[dynamic; N]T` in `core:nbio` for posix systems --- core/nbio/impl_posix.odin | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index 8469c9ade..3845882da 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -11,7 +11,6 @@ import "core:strings" import "core:sys/posix" import "core:time" import kq "core:sys/kqueue" -import sa "core:container/small_array" @(private="package") _FULLY_SUPPORTED :: true @@ -23,7 +22,7 @@ _Event_Loop :: struct { // that would be the same (ident, filter) pair we need to bundle the operations under one kevent. submitted: map[Queue_Identifier]^Operation, // Holds all events we want to flush. Flushing is done each tick at which point this is emptied. - pending: sa.Small_Array(QUEUE_SIZE, kq.KEvent), + pending: [dynamic; QUEUE_SIZE]kq.KEvent, // Holds what should be in `pending` but didn't fit. // When `pending`is flushed these are moved to `pending`. overflow: queue.Queue(kq.KEvent), @@ -116,7 +115,7 @@ _init :: proc(l: ^Event_Loop, allocator: mem.Allocator) -> (rerr: General_Error) l.kqueue = kqueue - sa.append(&l.pending, kq.KEvent{ + append(&l.pending, kq.KEvent{ ident = IDENT_WAKE_UP, filter = .User, flags = {.Add, .Enable, .Clear}, @@ -150,7 +149,7 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> General_Error { } if NBIO_DEBUG { - npending := sa.len(l.pending) + npending := len(l.pending) if npending > 0 { debug("queueing", npending, "new events, there are", int(len(l.submitted)), "events pending") } else { @@ -177,9 +176,9 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> General_Error { results_buf: [128]kq.KEvent results := kevent(l, results_buf[:], ts_pointer) or_return - sa.clear(&l.pending) + clear(&l.pending) for overflow in queue.pop_front_safe(&l.overflow) { - sa.append(&l.pending, overflow) or_break + (append(&l.pending, overflow) != 0) or_break } l.now = time.now() @@ -202,7 +201,7 @@ __tick :: proc(l: ^Event_Loop, timeout: time.Duration) -> General_Error { kevent :: proc(l: ^Event_Loop, buf: []kq.KEvent, ts: ^posix.timespec) -> ([]kq.KEvent, General_Error) { for { - new_events, err := kq.kevent(l.kqueue, sa.slice(&l.pending), buf, ts) + new_events, err := kq.kevent(l.kqueue, l.pending[:], buf, ts) #partial switch err { case nil: assert(new_events >= 0) @@ -1188,7 +1187,7 @@ add_pending :: proc(op: ^Operation, filter: kq.Filter, ident: uintptr) { } append_pending :: #force_inline proc(l: ^Event_Loop, ev: kq.KEvent) { - if !sa.append(&l.pending, ev) { + if append(&l.pending, ev) == 0 { warn("queue is full, adding to overflow, should QUEUE_SIZE be increased?") _, err := queue.append(&l.overflow, ev) ensure(err == nil, "allocation failure") @@ -1325,7 +1324,7 @@ timeout_and_delete :: proc(target: ^Operation) { flags = {.Add, .Enable, .One_Shot}, udata = target._impl.next, } - if !sa.append(&target.l.pending, ev) { + if append(&target.l.pending, ev) == 0 { warn("just removed the head operation of a list of multiple, and the queue is full, have to force this update through inefficiently") // This has to happen the next time we submit or we could have udata pointing wrong. // Very inefficient but probably never hit. From 6e9d6bfbe5f85a5cc0a9cd7dcd9b865b1d672543 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 16:55:46 +0000 Subject: [PATCH 094/273] Fixed tests --- base/runtime/core_builtin.odin | 4 ++-- .../test_fixed_capacity_dynamic_array.odin | 23 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 0a59167b2..7fa9ab4c8 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -1404,8 +1404,8 @@ resize_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; if raw.len < length { size_of_elem :: size_of(E) - num_reused := min(N, length) - a.len - intrinsics.mem_zero(([^]byte)(a.data)[a.len*size_of_elem:], num_reused*size_of_elem) + num_reused := min(N, length) - raw.len + intrinsics.mem_zero(([^]byte)(a.data)[raw.len*size_of_elem:], num_reused*size_of_elem) } new_length := clamp(length, 0, N) raw.len = new_length diff --git a/tests/core/container/test_fixed_capacity_dynamic_array.odin b/tests/core/container/test_fixed_capacity_dynamic_array.odin index 91639fec6..bca4e20f3 100644 --- a/tests/core/container/test_fixed_capacity_dynamic_array.odin +++ b/tests/core/container/test_fixed_capacity_dynamic_array.odin @@ -26,11 +26,11 @@ test_fixed_capacity_dynamic_array_inject_at :: proc(t: ^testing.T) { array: [dynamic; 13]int append(&array, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) - testing.expect(t, inject_at(&array, 0, 0), "Expected to be able to inject into small array") + testing.expect(t, inject_at(&array, 0, 0), "Expected to be able to inject into fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 })) - testing.expect(t, inject_at(&array, 0, 5), "Expected to be able to inject into small array") + testing.expect(t, inject_at(&array, 0, 5), "Expected to be able to inject into fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9 })) - testing.expect(t, inject_at(&array, 0, len(array)), "Expected to be able to inject into small array") + testing.expect(t, inject_at(&array, 0, len(array)), "Expected to be able to inject into fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 0 })) } @@ -38,18 +38,21 @@ test_fixed_capacity_dynamic_array_inject_at :: proc(t: ^testing.T) { test_fixed_capacity_dynamic_array_push_back_elems :: proc(t: ^testing.T) { array: [dynamic; 2]int testing.expect(t, slice_equal(array[:], []int { })) - testing.expect(t, append(&array, 0), "Expected to be able to append to empty small array") + testing.expect(t, append(&array, 0) == 1, "Expected to be able to append to empty fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 0 })) - testing.expect(t, append(&array, 1, 2) == false, "Expected to fail appending multiple elements beyond capacity of small array") - testing.expect(t, append(&array, 1), "Expected to be able to append to small array") + testing.expect(t, append(&array, 1) == 1, "Expected to be able to append to fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 0, 1 })) - testing.expect(t, append(&array, 1) == false, "Expected to fail appending to full small array") - testing.expect(t, append(&array, 1, 2) == false, "Expected to fail appending multiple elements to full small array") + testing.expect(t, append(&array, 1, 2) == 1, "Expected to fail appending multiple elements beyond capacity of fixed capacity dynamic array") + clear(&array) + testing.expect(t, append(&array, 1) == 1, "Expected to be able to append to fixed capacity dynamic array") + testing.expect(t, append(&array, 2) == 1, "Expected to be able to append to fixed capacity dynamic array") + testing.expect(t, append(&array, 1) != 1, "Expected to fail appending to full fixed capacity dynamic array") + testing.expect(t, append(&array, 1, 2) != 2, "Expected to fail appending multiple elements to full fixed capacity dynamic array") clear(&array) testing.expect(t, slice_equal(array[:], []int { })) - testing.expect(t, append(&array, 1, 2, 3) == false, "Expected to fail appending multiple elements to empty small array") + testing.expect(t, append(&array, 1, 2, 3) != 3, "Expected to fail appending multiple elements to empty fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { })) - testing.expect(t, append(&array, 1, 2), "Expected to be able to append multiple elements to empty small array") + testing.expect(t, append(&array, 1, 2) == 2, "Expected to be able to append multiple elements to empty fixed capacity dynamic array") testing.expect(t, slice_equal(array[:], []int { 1, 2 })) } From fac847101983b2f9402ab419937bba51e531cbfc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 16:59:11 +0000 Subject: [PATCH 095/273] Fix typos --- base/runtime/core_builtin.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 7fa9ab4c8..268ac6d33 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -171,7 +171,7 @@ remove_range_dynamic_array :: proc(array: ^$D/[dynamic]$T, #any_int lo, hi: int, // Note: If you want the elements to remain in their order, use `ordered_remove`. // Note: If the index is out of bounds, this procedure will panic. @builtin -unordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { +unordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$E, #any_int index: int, loc := #caller_location) #no_bounds_check { bounds_check_error_loc(loc, index, len(array)) n := len(array)-1 if index != n { @@ -185,7 +185,7 @@ unordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T // Note: If the elements do not have to remain in their order, prefer `unordered_remove`. // Note: If the index is out of bounds, this procedure will panic. @builtin -ordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int index: int, loc := #caller_location) #no_bounds_check { +ordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$E, #any_int index: int, loc := #caller_location) #no_bounds_check { bounds_check_error_loc(loc, index, len(array)) if index+1 < len(array) { copy(array[index:], array[index+1:]) @@ -198,7 +198,7 @@ ordered_remove_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, // Note: This is an O(N) operation. // Note: If the range is out of bounds, this procedure will panic. @builtin -remove_range_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$T, #any_int lo, hi: int, loc := #caller_location) #no_bounds_check { +remove_range_fixed_capacity_dynamic_array :: proc(array: ^$D/[dynamic; $N]$E, #any_int lo, hi: int, loc := #caller_location) #no_bounds_check { slice_expr_error_lo_hi_loc(loc, lo, hi, len(array)) n := max(hi-lo, 0) if n > 0 { @@ -1405,7 +1405,7 @@ resize_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; size_of_elem :: size_of(E) num_reused := min(N, length) - raw.len - intrinsics.mem_zero(([^]byte)(a.data)[raw.len*size_of_elem:], num_reused*size_of_elem) + intrinsics.mem_zero(([^]byte)(raw.data)[raw.len*size_of_elem:], num_reused*size_of_elem) } new_length := clamp(length, 0, N) raw.len = new_length From 6c61b1d46ca4492915876cfbe06ec0ed7b422e24 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 16:59:58 +0000 Subject: [PATCH 096/273] Remove `loc` being passed --- base/runtime/core_builtin.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 268ac6d33..9bc476d1f 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -1059,7 +1059,7 @@ inject_at_elem_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, m :: 1 new_size := n + m - resize(array, new_size, loc) or_return + resize(array, new_size) or_return when size_of(E) != 0 { copy(array[index + m:], array[index:]) array[index] = arg @@ -1084,7 +1084,7 @@ inject_at_elems_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, m := len(args) new_size := n + m - resize(array, new_size, loc) or_return + resize(array, new_size) or_return when size_of(E) != 0 { copy(array[index + m:], array[index:]) copy(array[index:], args) @@ -1109,7 +1109,7 @@ inject_at_elem_string_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; m := len(arg) new_size := n + m - resize(array, new_size, loc) or_return + resize(array, new_size) or_return copy(array[index+m:], array[index:]) copy(array[index:], arg) return true From 26eb58b589e36689c37217c4c70fa566cf7afa41 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 17:03:07 +0000 Subject: [PATCH 097/273] Move `raw` closer to usage --- base/runtime/core_builtin.odin | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 9bc476d1f..99705b0c3 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -1400,13 +1400,14 @@ resize_fixed_capacity_dynamic_array :: proc "contextless" (array: ^$T/[dynamic; if array == nil { return false } - raw := (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array) - if raw.len < length { + if len(array) < length { size_of_elem :: size_of(E) - num_reused := min(N, length) - raw.len - intrinsics.mem_zero(([^]byte)(raw.data)[raw.len*size_of_elem:], num_reused*size_of_elem) + num_reused := min(N, length) - len(array) + intrinsics.mem_zero(([^]byte)(array)[len(array)*size_of_elem:], num_reused*size_of_elem) } + + raw := (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array) new_length := clamp(length, 0, N) raw.len = new_length return true From c7308d86d4fb5ddd066c1bc97629b2bb44259063 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 17:33:54 +0000 Subject: [PATCH 098/273] Fix tests as they are not direct matches to `small_array` --- base/runtime/core_builtin.odin | 2 +- .../container/test_fixed_capacity_dynamic_array.odin | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 99705b0c3..ad3420770 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -879,7 +879,7 @@ append_fixed_capacity_elems :: proc "contextless" (array: ^$T/[dynamic; $N]$E, # Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) raw := (^Raw)(array) - n = min(N - len(args), len(args)) + n = min(N - len(array), len(args)) when size_of(E) != 0 { for i in 0.. Date: Thu, 12 Mar 2026 17:39:44 +0000 Subject: [PATCH 099/273] Add intrinsics `type_fixed_capacity_dynamic_array_len_offset` and `type_is_fixed_capacity_dynamic_array` --- base/intrinsics/intrinsics.odin | 3 +++ src/check_builtin.cpp | 26 ++++++++++++++++++++++++++ src/checker_builtin_procs.hpp | 6 ++++++ src/types.cpp | 3 ++- 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index f06dbdfbf..a4a761f44 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -180,6 +180,7 @@ type_is_bit_set :: proc($T: typeid) -> bool --- type_is_bit_field :: proc($T: typeid) -> bool --- type_is_simd_vector :: proc($T: typeid) -> bool --- type_is_matrix :: proc($T: typeid) -> bool --- +type_is_fixed_capacity_dynamic_array :: proc($T: typeid) -> bool --- type_has_nil :: proc($T: typeid) -> bool --- @@ -222,6 +223,8 @@ type_is_superset_of :: proc($Super, $Sub: typeid) -> bool --- type_field_index_of :: proc($T: typeid, $name: string) -> uintptr --- +type_fixed_capacity_dynamic_array_len_offset :: proc($T: typeid/[dynamic; $N]$E) -> uintptr --- + // "Contiguous" means that the set of enum constants, when sorted, have a difference of either 0 or 1 between consecutive values. // This is the exact opposite of "sparse". type_enum_is_contiguous :: proc($T: typeid) -> bool where type_is_enum(T) --- diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 02826a209..186c0bd67 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -58,6 +58,7 @@ gb_global BuiltinTypeIsProc *builtin_type_is_procs[BuiltinProc__type_simple_bool is_type_simd_vector, is_type_matrix, is_type_raw_union, + is_type_fixed_capacity_dynamic_array, is_type_polymorphic_record_specialized, is_type_polymorphic_record_unspecialized, @@ -7628,6 +7629,31 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } break; + case BuiltinProc_type_fixed_capacity_dynamic_array_len_offset: + { + Operand op = {}; + Type *bt = check_type(c, ce->args[0]); + Type *type = base_type(bt); + if (type == nullptr || type == t_invalid) { + error(ce->args[0], "Expected a fixed capacity dynamic array type for '%.*s'", LIT(builtin_name)); + return false; + } + if (!is_type_fixed_capacity_dynamic_array(type)) { + error(ce->args[0], "Expected a fixed capacity dynamic array type for '%.*s'", LIT(builtin_name)); + return false; + } + + i64 sz = type_size_of(type); + gb_unused(sz); + i64 offset = type_offset_of(type, 1); + + operand->mode = Addressing_Constant; + operand->value = exact_value_u64(cast(u64)offset); + operand->type = t_uintptr; + break; + } + break; + case BuiltinProc_type_bit_set_backing_type: { Operand op = {}; diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index a13ffc3cd..107f333fd 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -297,6 +297,7 @@ BuiltinProc__type_simple_boolean_begin, BuiltinProc_type_is_simd_vector, BuiltinProc_type_is_matrix, BuiltinProc_type_is_raw_union, + BuiltinProc_type_is_fixed_capacity_dynamic_array, BuiltinProc_type_is_specialized_polymorphic_record, @@ -342,6 +343,8 @@ BuiltinProc__type_simple_boolean_end, BuiltinProc_type_field_index_of, + BuiltinProc_type_fixed_capacity_dynamic_array_len_offset, + BuiltinProc_type_bit_set_backing_type, BuiltinProc_type_enum_is_contiguous, @@ -674,6 +677,7 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("type_is_simd_vector"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_matrix"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_raw_union"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("type_is_fixed_capacity_dynamic_array"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_specialized_polymorphic_record"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_unspecialized_polymorphic_record"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, @@ -717,6 +721,8 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("type_field_index_of"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("type_fixed_capacity_dynamic_array_len_offset"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("type_bit_set_backing_type"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_enum_is_contiguous"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics }, diff --git a/src/types.cpp b/src/types.cpp index 73563968d..1fb274f6a 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -4755,8 +4755,9 @@ gb_internal i64 type_offset_of(Type *t, i64 index, Type **field_type_) { case 1: // len if (field_type_) *field_type_ = t_int; { + i64 elem_size = type_size_of(t->FixedCapacityDynamicArray.elem); i64 offset = 0; - offset = type_size_of(alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity)); + offset = elem_size * t->FixedCapacityDynamicArray.capacity; offset = align_formula(offset, build_context.int_size); return offset; } From fa72a38036f89b3dae8856868e349c9e72ac347e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2026 17:44:05 +0000 Subject: [PATCH 100/273] Add fixed capacity dynamic array stuff to `core:reflect` --- core/reflect/iterator.odin | 9 +++++++++ core/reflect/reflect.odin | 18 ++++++++++++++++++ core/reflect/types.odin | 9 +++++++++ 3 files changed, 36 insertions(+) diff --git a/core/reflect/iterator.odin b/core/reflect/iterator.odin index e96019f68..d283f190f 100644 --- a/core/reflect/iterator.odin +++ b/core/reflect/iterator.odin @@ -44,6 +44,15 @@ iterate_array :: proc(val: any, it: ^int) -> (elem: any, index: int, ok: bool) { index = it^ it^ += 1 } + case Type_Info_Fixed_Capacity_Dynamic_Array: + count := (^int)(uintptr(val.data) + info.len_offset)^ + if it^ < count { + elem.data = rawptr(uintptr(val.data) + uintptr(it^ * info.elem_size)) + elem.id = info.elem.id + ok = true + index = it^ + it^ += 1 + } } return diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index 924120464..a0cc468f2 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -218,6 +218,7 @@ typeid_elem :: proc(id: typeid) -> typeid { case Type_Info_Slice: return v.elem.id case Type_Info_Dynamic_Array: return v.elem.id case Type_Info_Simd_Vector: return v.elem.id + case Type_Info_Fixed_Capacity_Dynamic_Array: return v.elem.id } return id } @@ -308,6 +309,9 @@ length :: proc(val: any) -> int { case Type_Info_Dynamic_Array: return (^runtime.Raw_Dynamic_Array)(val.data).len + case Type_Info_Fixed_Capacity_Dynamic_Array: + return (^int)(uintptr(val.data) + a.len_offset)^ + case Type_Info_Map: return runtime.map_len((^runtime.Raw_Map)(val.data)^) @@ -360,6 +364,9 @@ capacity :: proc(val: any) -> int { case Type_Info_Dynamic_Array: return (^runtime.Raw_Dynamic_Array)(val.data).cap + case Type_Info_Fixed_Capacity_Dynamic_Array: + return a.capacity + case Type_Info_Map: return runtime.map_cap((^runtime.Raw_Map)(val.data)^) @@ -420,6 +427,13 @@ index :: proc(val: any, i: int, loc := #caller_location) -> any { data := rawptr(uintptr(raw.data) + offset) return any{data, a.elem.id} + case Type_Info_Fixed_Capacity_Dynamic_Array: + count := (^int)(uintptr(val.data) + a.len_offset)^ + runtime.bounds_check_error_loc(loc, i, count) + offset := uintptr(a.elem.size * i) + data := rawptr(uintptr(val.data) + offset) + return any{data, a.elem.id} + case Type_Info_String: if a.is_cstring { return nil } @@ -1776,6 +1790,10 @@ as_raw_data :: proc(a: any) -> (value: rawptr, valid: bool) { valid = true value = (^runtime.Raw_Slice)(a.data).data + case Type_Info_Fixed_Capacity_Dynamic_Array: + valid = true + value = a.data + case Type_Info_Dynamic_Array: valid = true value = (^runtime.Raw_Dynamic_Array)(a.data).data diff --git a/core/reflect/types.odin b/core/reflect/types.odin index ff78708e3..079a4a172 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -433,6 +433,13 @@ is_simd_vector :: proc(info: ^Type_Info) -> bool { _, ok := type_info_base(info).variant.(Type_Info_Simd_Vector) return ok } +// Returns true when the type is a dynamic-array type ([dynamic]T), false otherwise. +@(require_results) +is_fixed_capacity_dynamic_array :: proc(info: ^Type_Info) -> bool { + if info == nil { return false } + _, ok := type_info_base(info).variant.(Type_Info_Fixed_Capacity_Dynamic_Array) + return ok +} // Returns true when the core-type is represented with a platform-native endian type, and returns false otherwise. @@ -840,6 +847,8 @@ has_no_indirections :: proc(ti: ^Type_Info) -> bool { return has_no_indirections(info.elem) case Type_Info_Enumerated_Array: return has_no_indirections(info.elem) + case Type_Info_Fixed_Capacity_Dynamic_Array: + return has_no_indirections(info.elem) case Type_Info_Simd_Vector: return true From 27667ce36bf76e39aad3becf469a6fbcbb2d85fe Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 13 Mar 2026 11:54:15 +0100 Subject: [PATCH 101/273] =?UTF-8?q?`iff`=20->=20`if=20and=20only=20if=20(?= =?UTF-8?q?=E2=9F=BA)`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/runtime/core.odin | 2 +- base/runtime/core_builtin.odin | 8 ++++---- .../random_generator_chacha8_simd256.odin | 2 +- core/bufio/reader.odin | 2 +- core/bufio/writer.odin | 2 +- core/bytes/bytes.odin | 4 ++-- core/container/avl/avl.odin | 18 ++++++++--------- core/container/rbtree/rbtree.odin | 20 +++++++++---------- core/crypto/_aes/hw_intel/api.odin | 2 +- .../_chacha20/simd128/chacha20_simd128.odin | 2 +- .../_chacha20/simd256/chacha20_simd256.odin | 2 +- core/crypto/_fiat/field_p256r1/field.odin | 2 +- core/crypto/_fiat/field_p384r1/field.odin | 2 +- core/crypto/_subtle/subtle.odin | 10 +++++----- core/crypto/aead/aead.odin | 2 +- core/crypto/aead/low_level.odin | 2 +- core/crypto/aegis/aegis.odin | 2 +- core/crypto/aegis/aegis_impl_hw_gen.odin | 2 +- core/crypto/aegis/aegis_impl_hw_intel.odin | 2 +- core/crypto/aes/aes_gcm.odin | 2 +- core/crypto/aes/aes_impl_hw_gen.odin | 2 +- core/crypto/aes/aes_impl_hw_intel.odin | 2 +- core/crypto/blake2b/blake2b.odin | 2 +- core/crypto/blake2s/blake2s.odin | 2 +- .../chacha20poly1305/chacha20poly1305.odin | 2 +- core/crypto/crypto.odin | 14 ++++++------- core/crypto/deoxysii/deoxysii.odin | 2 +- .../crypto/deoxysii/deoxysii_impl_hw_gen.odin | 2 +- .../deoxysii/deoxysii_impl_hw_intel.odin | 2 +- core/crypto/ecdh/ecdh.odin | 10 +++++----- core/crypto/ecdsa/ecdsa.odin | 10 +++++----- core/crypto/ecdsa/ecdsa_asn1.odin | 2 +- core/crypto/ecdsa/ecdsa_verify.odin | 4 ++-- core/crypto/ed25519/ed25519.odin | 10 +++++----- core/crypto/hash/low_level.odin | 2 +- core/crypto/hmac/hmac.odin | 2 +- core/crypto/kmac/kmac.odin | 2 +- core/crypto/legacy/keccak/keccak.odin | 2 +- core/crypto/legacy/md5/md5.odin | 2 +- core/crypto/legacy/sha1/sha1.odin | 2 +- core/crypto/pbkdf2/pbkdf2.odin | 2 +- core/crypto/poly1305/poly1305.odin | 2 +- core/crypto/ristretto255/ristretto255.odin | 10 +++++----- .../ristretto255/ristretto255_scalar.odin | 4 ++-- core/crypto/sha2/sha2.odin | 2 +- core/crypto/sha2/sha2_impl_hw_gen.odin | 2 +- core/crypto/sha2/sha2_impl_hw_intel.odin | 2 +- core/crypto/sha3/sha3.odin | 2 +- core/crypto/sm3/sm3.odin | 2 +- core/crypto/tuplehash/tuplehash.odin | 2 +- core/io/io.odin | 2 +- core/sys/darwin/Foundation/NSBlock.odin | 2 +- src/check_expr.cpp | 6 +++--- src/llvm_backend_expr.cpp | 4 ++-- vendor/lua/5.4/include/luaconf.h | 2 +- vendor/portmidi/portmidi.odin | 4 ++-- 56 files changed, 109 insertions(+), 109 deletions(-) diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 983f104e3..e2ed78452 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -141,7 +141,7 @@ Type_Info_Struct :: struct { flags: Type_Info_Struct_Flags, - // These are only set iff this structure is an SOA structure + // These are only set if and only if (⟺) this structure is an SOA structure soa_kind: Type_Info_Struct_Soa_Kind, soa_len: i32, soa_base_type: ^Type_Info, diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 974b2f048..4d8b493f7 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -1094,7 +1094,7 @@ card :: proc "contextless" (s: $S/bit_set[$E; $U]) -> int { -// Evaluates the condition and panics the program iff the condition is false. +// Evaluates the condition and panics the program if and only if (⟺) the condition is false. // This uses the `context.assertion_failure_procedure` to assert. // // This routine will be ignored when `ODIN_DISABLE_ASSERT` is true. @@ -1118,7 +1118,7 @@ assert :: proc(condition: bool, message := #caller_expression(condition), loc := } } -// Evaluates the condition and panics the program iff the condition is false. +// Evaluates the condition and panics the program if and only if (⟺) the condition is false. // This uses the `context.assertion_failure_procedure` to assert. // This routine ignores `ODIN_DISABLE_ASSERT`, and will always execute. @builtin @@ -1158,7 +1158,7 @@ unimplemented :: proc(message := "", loc := #caller_location) -> ! { p("not yet implemented", message, loc) } -// Evaluates the condition and panics the program iff the condition is false. +// Evaluates the condition and panics the program if and only if (⟺) the condition is false. // This uses the `default_assertion_contextless_failure_proc` to assert. // // This routine will be ignored when `ODIN_DISABLE_ASSERT` is true. @@ -1178,7 +1178,7 @@ assert_contextless :: proc "contextless" (condition: bool, message := #caller_ex } } -// Evaluates the condition and panics the program iff the condition is false. +// Evaluates the condition and panics the program if and only if (⟺) the condition is false. // This uses the `default_assertion_contextless_failure_proc` to assert. @builtin ensure_contextless :: proc "contextless" (condition: bool, message := #caller_expression(condition), loc := #caller_location) { diff --git a/base/runtime/random_generator_chacha8_simd256.odin b/base/runtime/random_generator_chacha8_simd256.odin index c0985f456..f2ccb6934 100644 --- a/base/runtime/random_generator_chacha8_simd256.odin +++ b/base/runtime/random_generator_chacha8_simd256.odin @@ -136,7 +136,7 @@ chacha8rand_refill_simd256 :: proc(r: ^Default_Random_State) { // // LLVM appears not to consider "this instruction is totally // awful on the given microarchitcture", which leads to - // `VPCOMPRESSED` being generated iff AVX512 support is + // `VPCOMPRESSED` being generated if and only if (⟺) AVX512 support is // enabled for `intrinsics.simd_masked_compress_store`. // On Zen 4, this leads to a 50% performance regression vs // the 128-bit SIMD code. diff --git a/core/bufio/reader.odin b/core/bufio/reader.odin index 8e30542f1..e361612d2 100644 --- a/core/bufio/reader.odin +++ b/core/bufio/reader.odin @@ -45,7 +45,7 @@ reader_init_with_buf :: proc(b: ^Reader, rd: io.Reader, buf: []byte) { b.buf = buf } -// reader_destroy destroys the underlying buffer with its associated allocator IFF that allocator has been set +// reader_destroy destroys the underlying buffer with its associated allocator if and only if (⟺) that allocator has been set reader_destroy :: proc(b: ^Reader) { delete(b.buf, b.buf_allocator) b^ = {} diff --git a/core/bufio/writer.odin b/core/bufio/writer.odin index 666c05b67..9d5ef3481 100644 --- a/core/bufio/writer.odin +++ b/core/bufio/writer.odin @@ -35,7 +35,7 @@ writer_init_with_buf :: proc(b: ^Writer, wr: io.Writer, buf: []byte) { b.buf = buf } -// writer_destroy destroys the underlying buffer with its associated allocator IFF that allocator has been set +// writer_destroy destroys the underlying buffer with its associated allocator if and only if (⟺) that allocator has been set writer_destroy :: proc(b: ^Writer) { delete(b.buf, b.buf_allocator) b^ = {} diff --git a/core/bytes/bytes.odin b/core/bytes/bytes.odin index 33978b3df..55eca5386 100644 --- a/core/bytes/bytes.odin +++ b/core/bytes/bytes.odin @@ -1460,7 +1460,7 @@ fields_proc :: proc(s: []byte, f: proc(rune) -> bool, allocator := context.alloc return subslices[:] } -// alias returns true iff a and b have a non-zero length, and any part of +// alias returns true if and only if (⟺) a and b have a non-zero length, and any part of // a overlaps with b. alias :: proc "contextless" (a, b: []byte) -> bool { a_len, b_len := len(a), len(b) @@ -1474,7 +1474,7 @@ alias :: proc "contextless" (a, b: []byte) -> bool { return a_start <= b_end && b_start <= a_end } -// alias_inexactly returns true iff a and b have a non-zero length, +// alias_inexactly returns true if and only if (⟺) a and b have a non-zero length, // the base pointer of a and b are NOT equal, and any part of a overlaps // with b (ie: `alias(a, b)` with an exception that returns false for // `a == b`, `b = a[:len(a)-69]` and similar conditions). diff --git a/core/container/avl/avl.odin b/core/container/avl/avl.odin index 6c7216c29..1208cd213 100644 --- a/core/container/avl/avl.odin +++ b/core/container/avl/avl.odin @@ -100,20 +100,20 @@ len :: proc "contextless" (t: ^$T/Tree($Value)) -> int { return t._size } -// first returns the first node in the tree (in-order) or nil iff +// first returns the first node in the tree (in-order) or nil if and only if (⟺) // the tree is empty. first :: proc "contextless" (t: ^$T/Tree($Value)) -> ^Node(Value) { return tree_first_or_last_in_order(t, Direction.Backward) } -// last returns the last element in the tree (in-order) or nil iff +// last returns the last element in the tree (in-order) or nil if and only if (⟺) // the tree is empty. last :: proc "contextless" (t: ^$T/Tree($Value)) -> ^Node(Value) { return tree_first_or_last_in_order(t, Direction.Forward) } // find finds the value in the tree, and returns the corresponding -// node or nil iff the value is not present. +// node or nil if and only if (⟺) the value is not present. find :: proc(t: ^$T/Tree($Value), value: Value) -> ^Node(Value) { cur := t._root descend_loop: for cur != nil { @@ -168,7 +168,7 @@ find_or_insert :: proc( return } -// remove removes a node or value from the tree, and returns true iff the +// remove removes a node or value from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's value will be left intact, // the node itself will be freed via the tree's node allocator. remove :: proc { @@ -176,7 +176,7 @@ remove :: proc { remove_node, } -// remove_value removes a value from the tree, and returns true iff the +// remove_value removes a value from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's value will be left intact, // the node itself will be freed via the tree's node allocator. remove_value :: proc(t: ^$T/Tree($Value), value: Value, call_on_remove: bool = true) -> bool { @@ -187,7 +187,7 @@ remove_value :: proc(t: ^$T/Tree($Value), value: Value, call_on_remove: bool = t return remove_node(t, n, call_on_remove) } -// remove_node removes a node from the tree, and returns true iff the +// remove_node removes a node from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's value will be left intact, // the node itself will be freed via the tree's node allocator. remove_node :: proc(t: ^$T/Tree($Value), node: ^Node(Value), call_on_remove: bool = true) -> bool { @@ -281,14 +281,14 @@ iterator_from_pos :: proc "contextless" ( } // iterator_get returns the node currently pointed to by the iterator, -// or nil iff the node has been removed, the tree is empty, or the end +// or nil if and only if (⟺) the node has been removed, the tree is empty, or the end // of the tree has been reached. iterator_get :: proc "contextless" (it: ^$I/Iterator($Value)) -> ^Node(Value) { return it._cur } // iterator_remove removes the node currently pointed to by the iterator, -// and returns true iff the removal was successful. Semantics are the +// and returns true if and only if (⟺) the removal was successful. Semantics are the // same as the Tree remove. iterator_remove :: proc(it: ^$I/Iterator($Value), call_on_remove: bool = true) -> bool { if it._cur == nil { @@ -304,7 +304,7 @@ iterator_remove :: proc(it: ^$I/Iterator($Value), call_on_remove: bool = true) - } // iterator_next advances the iterator and returns the (node, true) or -// or (nil, false) iff the end of the tree has been reached. +// or (nil, false) if and only if (⟺) the end of the tree has been reached. // // Note: The first call to iterator_next will return the first node instead // of advancing the iterator. diff --git a/core/container/rbtree/rbtree.odin b/core/container/rbtree/rbtree.odin index e892188d7..c138838df 100644 --- a/core/container/rbtree/rbtree.odin +++ b/core/container/rbtree/rbtree.odin @@ -95,19 +95,19 @@ len :: proc "contextless" (t: $T/Tree($Key, $Value)) -> (node_count: int) { return t._size } -// first returns the first node in the tree (in-order) or nil iff +// first returns the first node in the tree (in-order) or nil if and only if (⟺) // the tree is empty. first :: proc "contextless" (t: ^$T/Tree($Key, $Value)) -> ^Node(Key, Value) { return tree_first_or_last_in_order(t, Direction.Backward) } -// last returns the last element in the tree (in-order) or nil iff +// last returns the last element in the tree (in-order) or nil if and only if (⟺) // the tree is empty. last :: proc "contextless" (t: ^$T/Tree($Key, $Value)) -> ^Node(Key, Value) { return tree_first_or_last_in_order(t, Direction.Forward) } -// find finds the key in the tree, and returns the corresponding node, or nil iff the value is not present. +// find finds the key in the tree, and returns the corresponding node, or nil if and only if (⟺) the value is not present. find :: proc(t: $T/Tree($Key, $Value), key: Key) -> (node: ^Node(Key, Value)) { node = t._root for node != nil { @@ -120,7 +120,7 @@ find :: proc(t: $T/Tree($Key, $Value), key: Key) -> (node: ^Node(Key, Value)) { return node } -// find_value finds the key in the tree, and returns the corresponding value, or nil iff the value is not present. +// find_value finds the key in the tree, and returns the corresponding value, or nil if and only if (⟺) the value is not present. find_value :: proc(t: $T/Tree($Key, $Value), key: Key) -> (value: Value, ok: bool) #optional_ok { if n := find(t, key); n != nil { return n.value, true @@ -154,7 +154,7 @@ find_or_insert :: proc(t: ^$T/Tree($Key, $Value), key: Key, value: Value) -> (n: return n, true, nil } -// remove removes a node or value from the tree, and returns true iff the +// remove removes a node or value from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's value will be left intact, // the node itself will be freed via the tree's node allocator. remove :: proc { @@ -162,7 +162,7 @@ remove :: proc { remove_node, } -// remove_value removes a value from the tree, and returns true iff the +// remove_value removes a value from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's key + value will be left intact, // the node itself will be freed via the tree's node allocator. remove_key :: proc(t: ^$T/Tree($Key, $Value), key: Key, call_on_remove := true) -> bool { @@ -173,7 +173,7 @@ remove_key :: proc(t: ^$T/Tree($Key, $Value), key: Key, call_on_remove := true) return remove_node(t, n, call_on_remove) } -// remove_node removes a node from the tree, and returns true iff the +// remove_node removes a node from the tree, and returns true if and only if (⟺) the // removal was successful. While the node's key + value will be left intact, // the node itself will be freed via the tree's node allocator. remove_node :: proc(t: ^$T/Tree($Key, $Value), node: ^$N/Node(Key, Value), call_on_remove := true) -> (found: bool) { @@ -235,14 +235,14 @@ iterator_from_pos :: proc "contextless" (t: ^$T/Tree($Key, $Value), pos: ^Node(K } // iterator_get returns the node currently pointed to by the iterator, -// or nil iff the node has been removed, the tree is empty, or the end +// or nil if and only if (⟺) the node has been removed, the tree is empty, or the end // of the tree has been reached. iterator_get :: proc "contextless" (it: ^$I/Iterator($Key, $Value)) -> ^Node(Key, Value) { return it._cur } // iterator_remove removes the node currently pointed to by the iterator, -// and returns true iff the removal was successful. Semantics are the +// and returns true if and only if (⟺) the removal was successful. Semantics are the // same as the Tree remove. iterator_remove :: proc(it: ^$I/Iterator($Key, $Value), call_on_remove: bool = true) -> bool { if it._cur == nil { @@ -258,7 +258,7 @@ iterator_remove :: proc(it: ^$I/Iterator($Key, $Value), call_on_remove: bool = t } // iterator_next advances the iterator and returns the (node, true) or -// or (nil, false) iff the end of the tree has been reached. +// or (nil, false) if and only if (⟺) the end of the tree has been reached. // // Note: The first call to iterator_next will return the first node instead // of advancing the iterator. diff --git a/core/crypto/_aes/hw_intel/api.odin b/core/crypto/_aes/hw_intel/api.odin index ce769fc10..9547d8f84 100644 --- a/core/crypto/_aes/hw_intel/api.odin +++ b/core/crypto/_aes/hw_intel/api.odin @@ -3,7 +3,7 @@ package aes_hw_intel import "core:sys/info" -// is_supported returns true iff hardware accelerated AES +// is_supported returns true if and only if (⟺) hardware accelerated AES // is supported. is_supported :: proc "contextless" () -> bool { // Note: Everything with AES-NI and PCLMULQDQ has support for diff --git a/core/crypto/_chacha20/simd128/chacha20_simd128.odin b/core/crypto/_chacha20/simd128/chacha20_simd128.odin index 9da0a54ea..fd48074df 100644 --- a/core/crypto/_chacha20/simd128/chacha20_simd128.odin +++ b/core/crypto/_chacha20/simd128/chacha20_simd128.odin @@ -215,7 +215,7 @@ _store_simd128 :: #force_inline proc "contextless" ( intrinsics.unaligned_store((^simd.u32x4)(dst[3:]), v3) } -// is_performant returns true iff the target and current host both support +// is_performant returns true if and only if (⟺) the target and current host both support // "enough" 128-bit SIMD to make this implementation performant. is_performant :: proc "contextless" () -> bool { when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32 || ODIN_ARCH == .amd64 || ODIN_ARCH == .i386 || ODIN_ARCH == .riscv64 { diff --git a/core/crypto/_chacha20/simd256/chacha20_simd256.odin b/core/crypto/_chacha20/simd256/chacha20_simd256.odin index 407fbac56..c2f709aec 100644 --- a/core/crypto/_chacha20/simd256/chacha20_simd256.odin +++ b/core/crypto/_chacha20/simd256/chacha20_simd256.odin @@ -36,7 +36,7 @@ _VEC_ZERO_ONE: simd.u64x4 : {0, 0, 1, 0} @(private = "file") _VEC_TWO: simd.u64x4 : {2, 0, 2, 0} -// is_performant returns true iff the target and current host both support +// is_performant returns true if and only if (⟺) the target and current host both support // "enough" SIMD to make this implementation performant. is_performant :: proc "contextless" () -> bool { req_features :: info.CPU_Features{.avx, .avx2} diff --git a/core/crypto/_fiat/field_p256r1/field.odin b/core/crypto/_fiat/field_p256r1/field.odin index f39bee4a9..f7dd978aa 100644 --- a/core/crypto/_fiat/field_p256r1/field.odin +++ b/core/crypto/_fiat/field_p256r1/field.odin @@ -69,7 +69,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> tmp: Montgomery_Domain_Field_Element = --- fe_sub(&tmp, arg1, arg2) - // This will only underflow iff arg1 == arg2, and we return the borrow, + // This will only underflow if and only if (⟺) arg1 == arg2, and we return the borrow, // which will be 1. is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) diff --git a/core/crypto/_fiat/field_p384r1/field.odin b/core/crypto/_fiat/field_p384r1/field.odin index 5cb5cd05e..2bddff18c 100644 --- a/core/crypto/_fiat/field_p384r1/field.odin +++ b/core/crypto/_fiat/field_p384r1/field.odin @@ -75,7 +75,7 @@ fe_equal :: proc "contextless" (arg1, arg2: ^Montgomery_Domain_Field_Element) -> tmp: Montgomery_Domain_Field_Element = --- fe_sub(&tmp, arg1, arg2) - // This will only underflow iff arg1 == arg2, and we return the borrow, + // This will only underflow if and only if (⟺) arg1 == arg2, and we return the borrow, // which will be 1. is_eq := subtle.u64_is_zero(fe_non_zero(&tmp)) diff --git a/core/crypto/_subtle/subtle.odin b/core/crypto/_subtle/subtle.odin index 89328072c..454066e4a 100644 --- a/core/crypto/_subtle/subtle.odin +++ b/core/crypto/_subtle/subtle.odin @@ -5,17 +5,17 @@ package _subtle import "core:math/bits" -// byte_eq returns 1 iff a == b, 0 otherwise. +// byte_eq returns 1 if and only if (⟺) a == b, 0 otherwise. @(optimization_mode="none") byte_eq :: proc "contextless" (a, b: byte) -> int { v := a ~ b - // v == 0 iff a == b. The subtraction will underflow, setting the + // v == 0 if and only if (⟺) a == b. The subtraction will underflow, setting the // sign bit, which will get returned. return int((u32(v)-1) >> 31) } -// u64_eq returns 1 iff a == b, 0 otherwise. +// u64_eq returns 1 if and only if (⟺) a == b, 0 otherwise. @(optimization_mode="none") u64_eq :: proc "contextless" (a, b: u64) -> u64 { _, borrow := bits.sub_u64(0, a ~ b, 0) @@ -27,14 +27,14 @@ eq :: proc { u64_eq, } -// u64_is_zero returns 1 iff a == 0, 0 otherwise. +// u64_is_zero returns 1 if and only if (⟺) a == 0, 0 otherwise. @(optimization_mode="none") u64_is_zero :: proc "contextless" (a: u64) -> u64 { _, borrow := bits.sub_u64(a, 1, 0) return borrow } -// u64_is_non_zero returns 1 iff a != 0, 0 otherwise. +// u64_is_non_zero returns 1 if and only if (⟺) a != 0, 0 otherwise. @(optimization_mode="none") u64_is_non_zero :: proc "contextless" (a: u64) -> u64 { is_zero := u64_is_zero(a) diff --git a/core/crypto/aead/aead.odin b/core/crypto/aead/aead.odin index c8f324929..ed14a41f3 100644 --- a/core/crypto/aead/aead.odin +++ b/core/crypto/aead/aead.odin @@ -13,7 +13,7 @@ seal_oneshot :: proc(algo: Algorithm, dst, tag, key, iv, aad, plaintext: []byte, // open authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided algorithm, key, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and ciphertext MUST alias exactly or not at all. diff --git a/core/crypto/aead/low_level.odin b/core/crypto/aead/low_level.odin index c80574a0d..c89d85823 100644 --- a/core/crypto/aead/low_level.odin +++ b/core/crypto/aead/low_level.odin @@ -183,7 +183,7 @@ seal_ctx :: proc(ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) { // open_ctx authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided Context, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and plaintext MUST alias exactly or not at all. diff --git a/core/crypto/aegis/aegis.odin b/core/crypto/aegis/aegis.odin index fbb19f1ae..5aee61767 100644 --- a/core/crypto/aegis/aegis.odin +++ b/core/crypto/aegis/aegis.odin @@ -144,7 +144,7 @@ seal :: proc(ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) { // open authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided Context, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and plaintext MUST alias exactly or not at all. diff --git a/core/crypto/aegis/aegis_impl_hw_gen.odin b/core/crypto/aegis/aegis_impl_hw_gen.odin index 5ec2f3d6e..db38e71bc 100644 --- a/core/crypto/aegis/aegis_impl_hw_gen.odin +++ b/core/crypto/aegis/aegis_impl_hw_gen.odin @@ -7,7 +7,7 @@ ERR_HW_NOT_SUPPORTED :: "crypto/aegis: hardware implementation unsupported" @(private) State_HW :: struct {} -// is_hardware_accelerated returns true iff hardware accelerated AEGIS +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AEGIS // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return false diff --git a/core/crypto/aegis/aegis_impl_hw_intel.odin b/core/crypto/aegis/aegis_impl_hw_intel.odin index 7673b6b28..8b767908c 100644 --- a/core/crypto/aegis/aegis_impl_hw_intel.odin +++ b/core/crypto/aegis/aegis_impl_hw_intel.odin @@ -20,7 +20,7 @@ State_HW :: struct { rate: int, } -// is_hardware_accelerated returns true iff hardware accelerated AEGIS +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AEGIS // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return aes.is_hardware_accelerated() diff --git a/core/crypto/aes/aes_gcm.odin b/core/crypto/aes/aes_gcm.odin index bb87788ac..0acd95d2f 100644 --- a/core/crypto/aes/aes_gcm.odin +++ b/core/crypto/aes/aes_gcm.odin @@ -65,7 +65,7 @@ seal_gcm :: proc(ctx: ^Context_GCM, dst, tag, iv, aad, plaintext: []byte) { // open_gcm authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided Context_GCM, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and plaintext MUST alias exactly or not at all. diff --git a/core/crypto/aes/aes_impl_hw_gen.odin b/core/crypto/aes/aes_impl_hw_gen.odin index 0c9ec6edc..506298751 100644 --- a/core/crypto/aes/aes_impl_hw_gen.odin +++ b/core/crypto/aes/aes_impl_hw_gen.odin @@ -4,7 +4,7 @@ package aes @(private = "file") ERR_HW_NOT_SUPPORTED :: "crypto/aes: hardware implementation unsupported" -// is_hardware_accelerated returns true iff hardware accelerated AES +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AES // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return false diff --git a/core/crypto/aes/aes_impl_hw_intel.odin b/core/crypto/aes/aes_impl_hw_intel.odin index 0f1fa6143..96a1811f3 100644 --- a/core/crypto/aes/aes_impl_hw_intel.odin +++ b/core/crypto/aes/aes_impl_hw_intel.odin @@ -3,7 +3,7 @@ package aes import "core:crypto/_aes/hw_intel" -// is_hardware_accelerated returns true iff hardware accelerated AES +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AES // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return hw_intel.is_supported() diff --git a/core/crypto/blake2b/blake2b.odin b/core/crypto/blake2b/blake2b.odin index 6c2c5c1e9..8cce6dac8 100644 --- a/core/crypto/blake2b/blake2b.odin +++ b/core/crypto/blake2b/blake2b.odin @@ -54,7 +54,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { _blake2.final(ctx, hash, finalize_clone) diff --git a/core/crypto/blake2s/blake2s.odin b/core/crypto/blake2s/blake2s.odin index 902f992b3..35e278f72 100644 --- a/core/crypto/blake2s/blake2s.odin +++ b/core/crypto/blake2s/blake2s.odin @@ -54,7 +54,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { _blake2.final(ctx, hash, finalize_clone) diff --git a/core/crypto/chacha20poly1305/chacha20poly1305.odin b/core/crypto/chacha20poly1305/chacha20poly1305.odin index 0504acab0..c405a2736 100644 --- a/core/crypto/chacha20poly1305/chacha20poly1305.odin +++ b/core/crypto/chacha20poly1305/chacha20poly1305.odin @@ -136,7 +136,7 @@ seal :: proc(ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) { // open authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided Context, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and plaintext MUST alias exactly or not at all. diff --git a/core/crypto/crypto.odin b/core/crypto/crypto.odin index b36bc2004..f4ddbfbe7 100644 --- a/core/crypto/crypto.odin +++ b/core/crypto/crypto.odin @@ -8,15 +8,15 @@ import subtle "core:crypto/_subtle" // Omit large precomputed tables, trading off performance for size. COMPACT_IMPLS: bool : #config(ODIN_CRYPTO_COMPACT, false) -// HAS_RAND_BYTES is true iff the runtime provides a cryptographic +// HAS_RAND_BYTES is true if and only if (⟺) the runtime provides a cryptographic // entropy source. HAS_RAND_BYTES :: runtime.HAS_RAND_BYTES -// compare_constant_time returns 1 iff a and b are equal, 0 otherwise. +// compare_constant_time returns 1 if and only if (⟺) a and b are equal, 0 otherwise. // // The execution time of this routine is constant regardless of the contents // of the slices being compared, as long as the length of the slices is equal. -// If the length of the two slices is different, it will early-return 0. +// If the length of the two slices is dif and only if (⟺)erent, it will early-return 0. compare_constant_time :: proc "contextless" (a, b: []byte) -> int { // If the length of the slices is different, early return. // @@ -31,7 +31,7 @@ compare_constant_time :: proc "contextless" (a, b: []byte) -> int { return compare_byte_ptrs_constant_time(raw_data(a), raw_data(b), n) } -// compare_byte_ptrs_constant_time returns 1 iff the bytes pointed to by +// compare_byte_ptrs_constant_time returns 1 if and only if (⟺) the bytes pointed to by // a and b are equal, 0 otherwise. // // The execution time of this routine is constant regardless of the @@ -46,12 +46,12 @@ compare_byte_ptrs_constant_time :: proc "contextless" (a, b: ^byte, n: int) -> i v |= x[i] ~ y[i] } - // After the loop, v == 0 iff a == b. The subtraction will underflow - // iff v == 0, setting the sign-bit, which gets returned. + // After the loop, v == 0 if and only if (⟺) a == b. The subtraction will underflow + // if and only if (⟺) v == 0, setting the sign-bit, which gets returned. return subtle.eq(0, v) } -// is_zero_constant_time returns 1 iff b is all 0s, 0 otherwise. +// is_zero_constant_time returns 1 if and only if (⟺) b is all 0s, 0 otherwise. is_zero_constant_time :: proc "contextless" (b: []byte) -> int { v: byte for b_ in b { diff --git a/core/crypto/deoxysii/deoxysii.odin b/core/crypto/deoxysii/deoxysii.odin index 829d3d3ad..ffe9b4b32 100644 --- a/core/crypto/deoxysii/deoxysii.odin +++ b/core/crypto/deoxysii/deoxysii.odin @@ -122,7 +122,7 @@ seal :: proc(ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) { // open authenticates the aad and ciphertext, and decrypts the ciphertext, // with the provided Context, iv, and tag, and stores the output in dst, -// returning true iff the authentication was successful. If authentication +// returning true if and only if (⟺) the authentication was successful. If authentication // fails, the destination buffer will be zeroed. // // dst and plaintext MUST alias exactly or not at all. diff --git a/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin b/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin index b0705ca62..89dae7229 100644 --- a/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin +++ b/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin @@ -4,7 +4,7 @@ package deoxysii @(private = "file") ERR_HW_NOT_SUPPORTED :: "crypto/deoxysii: hardware implementation unsupported" -// is_hardware_accelerated returns true iff hardware accelerated Deoxys-II +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated Deoxys-II // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return false diff --git a/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin b/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin index cdad16f42..88c569d53 100644 --- a/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin +++ b/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin @@ -21,7 +21,7 @@ _PREFIX_MSG_BLOCK :: x86.__m128i{PREFIX_MSG_BLOCK << PREFIX_SHIFT, 0} @(private = "file") _PREFIX_MSG_FINAL :: x86.__m128i{PREFIX_MSG_FINAL << PREFIX_SHIFT, 0} -// is_hardware_accelerated returns true iff hardware accelerated Deoxys-II +// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated Deoxys-II // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { return aes.is_hardware_accelerated() diff --git a/core/crypto/ecdh/ecdh.odin b/core/crypto/ecdh/ecdh.odin index af60f5649..6a8f6e466 100644 --- a/core/crypto/ecdh/ecdh.odin +++ b/core/crypto/ecdh/ecdh.odin @@ -104,7 +104,7 @@ Public_Key :: struct { } // private_key_generate uses the system entropy source to generate a new -// Private_Key. This will only fail iff the system entropy source is +// Private_Key. This will only fail if and only if (⟺) the system entropy source is // missing or broken. private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { private_key_clear(priv_key) @@ -142,7 +142,7 @@ private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { } // private_key_set_bytes decodes a byte-encoded private key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. private_key_set_bytes :: proc(priv_key: ^Private_Key, curve: Curve, b: []byte) -> bool { private_key_clear(priv_key) @@ -245,7 +245,7 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { } } -// private_key_equal returns true iff the private keys are equal, +// private_key_equal returns true if and only if (⟺) the private keys are equal, // in constant time. private_key_equal :: proc(p, q: ^Private_Key) -> bool { if p._curve != q._curve { @@ -276,7 +276,7 @@ private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { } // public_key_set_bytes decodes a byte-encoded public key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. public_key_set_bytes :: proc(pub_key: ^Public_Key, curve: Curve, b: []byte) -> bool { public_key_clear(pub_key) @@ -365,7 +365,7 @@ public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { } } -// public_key_equal returns true iff the public keys are equal, +// public_key_equal returns true if and only if (⟺) the public keys are equal, // in constant time. public_key_equal :: proc(p, q: ^Public_Key) -> bool { if p._curve != q._curve { diff --git a/core/crypto/ecdsa/ecdsa.odin b/core/crypto/ecdsa/ecdsa.odin index 241d50987..6c71feef7 100644 --- a/core/crypto/ecdsa/ecdsa.odin +++ b/core/crypto/ecdsa/ecdsa.odin @@ -79,7 +79,7 @@ Public_Key :: struct { } // private_key_generate uses the system entropy source to generate a new -// Private_Key. This will only fail iff the system entropy source is +// Private_Key. This will only fail if and only if (⟺) the system entropy source is // missing or broken. private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { private_key_clear(priv_key) @@ -111,7 +111,7 @@ private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { } // private_key_set_bytes decodes a byte-encoded private key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. private_key_set_bytes :: proc(priv_key: ^Private_Key, curve: Curve, b: []byte) -> bool { private_key_clear(priv_key) @@ -194,7 +194,7 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { } } -// private_key_equal returns true iff the private keys are equal, +// private_key_equal returns true if and only if (⟺) the private keys are equal, // in constant time. private_key_equal :: proc(p, q: ^Private_Key) -> bool { if p._curve != q._curve { @@ -219,7 +219,7 @@ private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { } // public_key_set_bytes decodes a byte-encoded public key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. public_key_set_bytes :: proc(pub_key: ^Public_Key, curve: Curve, b: []byte) -> bool { public_key_clear(pub_key) @@ -296,7 +296,7 @@ public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { } } -// public_key_equal returns true iff the public keys are equal, +// public_key_equal returns true if and only if (⟺) the public keys are equal, // in constant time. public_key_equal :: proc(p, q: ^Public_Key) -> bool { if p._curve != q._curve { diff --git a/core/crypto/ecdsa/ecdsa_asn1.odin b/core/crypto/ecdsa/ecdsa_asn1.odin index 0b423286d..74c9d65e6 100644 --- a/core/crypto/ecdsa/ecdsa_asn1.odin +++ b/core/crypto/ecdsa/ecdsa_asn1.odin @@ -141,7 +141,7 @@ parse_asn1_sig :: proc(sig: []byte) -> (r, s: []byte, ok: bool) { return nil, nil, false } - // DER requires a leading 0 iff the sign bit of the leading byte + // DER requires a leading 0 if and only if (⟺) the sign bit of the leading byte // is set to distinguish between positive and negative integers, // and the minimal length representation. `r` and `s` are always // going to be unsigned, so we validate malformed DER and strip diff --git a/core/crypto/ecdsa/ecdsa_verify.odin b/core/crypto/ecdsa/ecdsa_verify.odin index 6b4e3dd4a..bd973a8df 100644 --- a/core/crypto/ecdsa/ecdsa_verify.odin +++ b/core/crypto/ecdsa/ecdsa_verify.odin @@ -3,7 +3,7 @@ package ecdsa import "core:crypto/hash" import secec "core:crypto/_weierstrass" -// verify_raw returns true iff sig is a valid signature by pub_key over +// verify_raw returns true if and only if (⟺) sig is a valid signature by pub_key over // msg, hased using hash_algo, per the verification procedure specifed // in SEC 1, Version 2.0, Section 4.1.4. // @@ -33,7 +33,7 @@ verify_raw :: proc(pub_key: ^Public_Key, hash_algo: hash.Algorithm, msg, sig: [] panic("crypto/ecdsa: invalid curve") } -// verify_asn1 returns true iff sig is a valid signature by pub_key over +// verify_asn1 returns true if and only if (⟺) sig is a valid signature by pub_key over // msg, hased using hash_algo, per the verification procedure specifed // in SEC 1, Version 2.0, Section 4.1.4. // diff --git a/core/crypto/ed25519/ed25519.odin b/core/crypto/ed25519/ed25519.odin index 817c8d34b..2020c0633 100644 --- a/core/crypto/ed25519/ed25519.odin +++ b/core/crypto/ed25519/ed25519.odin @@ -48,7 +48,7 @@ Public_Key :: struct { } // private_key_generate uses the system entropy source to generate a new -// Private_Key. This will only fail iff the system entropy source is +// Private_Key. This will only fail if and only if (⟺) the system entropy source is // missing or broken. private_key_generate :: proc(priv_key: ^Private_Key) -> bool { private_key_clear(priv_key) @@ -67,7 +67,7 @@ private_key_generate :: proc(priv_key: ^Private_Key) -> bool { } // private_key_set_bytes decodes a byte-encoded private key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. private_key_set_bytes :: proc(priv_key: ^Private_Key, b: []byte) -> bool { if len(b) != PRIVATE_KEY_SIZE { return false @@ -167,7 +167,7 @@ sign :: proc(priv_key: ^Private_Key, msg, sig: []byte) { } // public_key_set_bytes decodes a byte-encoded public key, and returns -// true iff the operation was successful. +// true if and only if (⟺) the operation was successful. public_key_set_bytes :: proc "contextless" (pub_key: ^Public_Key, b: []byte) -> bool { if len(b) != PUBLIC_KEY_SIZE { return false @@ -205,14 +205,14 @@ public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { copy(dst, pub_key._b[:]) } -// public_key_equal returns true iff pub_key is equal to other. +// public_key_equal returns true if and only if (⟺) pub_key is equal to other. public_key_equal :: proc(pub_key, other: ^Public_Key) -> bool { ensure(pub_key._is_initialized && other._is_initialized, "crypto/ed25519: uninitialized public key") return crypto.compare_constant_time(pub_key._b[:], other._b[:]) == 1 } -// verify returns true iff sig is a valid signature by pub_key over msg. +// verify returns true if and only if (⟺) sig is a valid signature by pub_key over msg. // // The optional `allow_small_order_A` parameter will make this // implementation strictly compatible with FIPS 186-5, at the expense of diff --git a/core/crypto/hash/low_level.odin b/core/crypto/hash/low_level.odin index 242eadd5f..44b2a8100 100644 --- a/core/crypto/hash/low_level.odin +++ b/core/crypto/hash/low_level.odin @@ -235,7 +235,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { switch &impl in ctx._impl { diff --git a/core/crypto/hmac/hmac.odin b/core/crypto/hmac/hmac.odin index d28c03b5b..56decc0ef 100644 --- a/core/crypto/hmac/hmac.odin +++ b/core/crypto/hmac/hmac.odin @@ -21,7 +21,7 @@ sum :: proc(algorithm: hash.Algorithm, dst, msg, key: []byte) { } // verify will verify the HMAC tag computed with the specified algorithm -// and key over msg and return true iff the tag is valid. It requires +// and key over msg and return true if and only if (⟺) the tag is valid. It requires // that the tag is correctly sized. verify :: proc(algorithm: hash.Algorithm, tag, msg, key: []byte) -> bool { tag_buf: [hash.MAX_DIGEST_SIZE]byte diff --git a/core/crypto/kmac/kmac.odin b/core/crypto/kmac/kmac.odin index 4ecff4f12..f0c27739a 100644 --- a/core/crypto/kmac/kmac.odin +++ b/core/crypto/kmac/kmac.odin @@ -32,7 +32,7 @@ sum :: proc(sec_strength: int, dst, msg, key, domain_sep: []byte) { } // verify will verify the KMAC tag computed with the specified security -// strength, key and domain separator over msg and return true iff the +// strength, key and domain separator over msg and return true if and only if (⟺) the // tag is valid. verify :: proc(sec_strength: int, tag, msg, key, domain_sep: []byte, allocator := context.temp_allocator) -> bool { derived_tag := make([]byte, len(tag), allocator) diff --git a/core/crypto/legacy/keccak/keccak.odin b/core/crypto/legacy/keccak/keccak.odin index ec6af2565..ffca1c95c 100644 --- a/core/crypto/legacy/keccak/keccak.odin +++ b/core/crypto/legacy/keccak/keccak.odin @@ -77,7 +77,7 @@ update :: proc "contextless" (ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc "contextless" (ctx: ^Context, hash: []byte, finalize_clone: bool = false) { _sha3.final((^_sha3.Context)(ctx), hash, finalize_clone) diff --git a/core/crypto/legacy/md5/md5.odin b/core/crypto/legacy/md5/md5.odin index 399a789ed..4bbc5d32a 100644 --- a/core/crypto/legacy/md5/md5.odin +++ b/core/crypto/legacy/md5/md5.odin @@ -69,7 +69,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { ensure(ctx.is_initialized) diff --git a/core/crypto/legacy/sha1/sha1.odin b/core/crypto/legacy/sha1/sha1.odin index f9adcc3d1..892f893a6 100644 --- a/core/crypto/legacy/sha1/sha1.odin +++ b/core/crypto/legacy/sha1/sha1.odin @@ -76,7 +76,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { ensure(ctx.is_initialized) diff --git a/core/crypto/pbkdf2/pbkdf2.odin b/core/crypto/pbkdf2/pbkdf2.odin index 9d8394031..c27ec4aa2 100644 --- a/core/crypto/pbkdf2/pbkdf2.odin +++ b/core/crypto/pbkdf2/pbkdf2.odin @@ -66,7 +66,7 @@ derive :: proc( dst_blk = dst_blk[h_len:] } - // Instead of rounding l up, just proceass the one extra block iff + // Instead of rounding l up, just proceass the one extra block if and only if (⟺) // r != 0. if r > 0 { tmp: [hash.MAX_DIGEST_SIZE]byte diff --git a/core/crypto/poly1305/poly1305.odin b/core/crypto/poly1305/poly1305.odin index 69e2e3ad3..ed2bec82d 100644 --- a/core/crypto/poly1305/poly1305.odin +++ b/core/crypto/poly1305/poly1305.odin @@ -33,7 +33,7 @@ sum :: proc(dst, msg, key: []byte) { } // verify will verify the Poly1305 tag computed with the key over msg and -// return true iff the tag is valid. It requires that the tag is correctly +// return true if and only if (⟺) the tag is valid. It requires that the tag is correctly // sized. verify :: proc(tag, msg, key: []byte) -> bool { ctx: Context = --- diff --git a/core/crypto/ristretto255/ristretto255.odin b/core/crypto/ristretto255/ristretto255.odin index 3724aee7a..ef899d1da 100644 --- a/core/crypto/ristretto255/ristretto255.odin +++ b/core/crypto/ristretto255/ristretto255.odin @@ -360,7 +360,7 @@ ge_double_scalarmult_generator_vartime :: proc( ge._is_initialized = true } -// ge_cond_negate sets `ge = a` iff `ctrl == 0` and `ge = -a` iff `ctrl == 1`. +// ge_cond_negate sets `ge = a` if and only if (⟺) `ctrl == 0` and `ge = -a` if and only if (⟺) `ctrl == 1`. // Behavior for all other values of ctrl are undefined, ge_cond_negate :: proc(ge, a: ^Group_Element, ctrl: int) { _ge_ensure_initialized([]^Group_Element{a}) @@ -369,7 +369,7 @@ ge_cond_negate :: proc(ge, a: ^Group_Element, ctrl: int) { ge._is_initialized = true } -// ge_cond_assign sets `ge = ge` iff `ctrl == 0` and `ge = a` iff `ctrl == 1`. +// ge_cond_assign sets `ge = ge` if and only if (⟺) `ctrl == 0` and `ge = a` if and only if (⟺) `ctrl == 1`. // Behavior for all other values of ctrl are undefined, ge_cond_assign :: proc(ge, a: ^Group_Element, ctrl: int) { _ge_ensure_initialized([]^Group_Element{ge, a}) @@ -377,7 +377,7 @@ ge_cond_assign :: proc(ge, a: ^Group_Element, ctrl: int) { grp.ge_cond_assign(&ge._p, &a._p, ctrl) } -// ge_cond_select sets `ge = a` iff `ctrl == 0` and `ge = b` iff `ctrl == 1`. +// ge_cond_select sets `ge = a` if and only if (⟺) `ctrl == 0` and `ge = b` if and only if (⟺) `ctrl == 1`. // Behavior for all other values of ctrl are undefined, ge_cond_select :: proc(ge, a, b: ^Group_Element, ctrl: int) { _ge_ensure_initialized([]^Group_Element{a, b}) @@ -386,7 +386,7 @@ ge_cond_select :: proc(ge, a, b: ^Group_Element, ctrl: int) { ge._is_initialized = true } -// ge_equal returns 1 iff `a == b`, and 0 otherwise. +// ge_equal returns 1 if and only if (⟺) `a == b`, and 0 otherwise. @(require_results) ge_equal :: proc(a, b: ^Group_Element) -> int { _ge_ensure_initialized([]^Group_Element{a, b}) @@ -405,7 +405,7 @@ ge_equal :: proc(a, b: ^Group_Element) -> int { return ret } -// ge_is_identity returns 1 iff `ge` is the identity element, and 0 otherwise. +// ge_is_identity returns 1 if and only if (⟺) `ge` is the identity element, and 0 otherwise. @(require_results) ge_is_identity :: proc(ge: ^Group_Element) -> int { return ge_equal(ge, &GE_IDENTITY) diff --git a/core/crypto/ristretto255/ristretto255_scalar.odin b/core/crypto/ristretto255/ristretto255_scalar.odin index 75844b3f4..743e02ef3 100644 --- a/core/crypto/ristretto255/ristretto255_scalar.odin +++ b/core/crypto/ristretto255/ristretto255_scalar.odin @@ -80,13 +80,13 @@ sc_square :: proc "contextless" (sc, a: ^Scalar) { grp.sc_square(sc, a) } -// sc_cond_assign sets `sc = sc` iff `ctrl == 0` and `sc = a` iff `ctrl == 1`. +// sc_cond_assign sets `sc = sc` if and only if (⟺) `ctrl == 0` and `sc = a` if and only if (⟺) `ctrl == 1`. // Behavior for all other values of ctrl are undefined, sc_cond_assign :: proc(sc, a: ^Scalar, ctrl: int) { grp.sc_cond_assign(sc, a, ctrl) } -// sc_equal returns 1 iff `a == b`, and 0 otherwise. +// sc_equal returns 1 if and only if (⟺) `a == b`, and 0 otherwise. @(require_results) sc_equal :: proc(a, b: ^Scalar) -> int { return grp.sc_equal(a, b) diff --git a/core/crypto/sha2/sha2.odin b/core/crypto/sha2/sha2.odin index 36fa4aa02..dc41462e4 100644 --- a/core/crypto/sha2/sha2.odin +++ b/core/crypto/sha2/sha2.odin @@ -191,7 +191,7 @@ update :: proc(ctx: ^$T, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^$T, hash: []byte, finalize_clone: bool = false) { ensure(ctx.is_initialized) diff --git a/core/crypto/sha2/sha2_impl_hw_gen.odin b/core/crypto/sha2/sha2_impl_hw_gen.odin index 85c7f8b28..837d0656d 100644 --- a/core/crypto/sha2/sha2_impl_hw_gen.odin +++ b/core/crypto/sha2/sha2_impl_hw_gen.odin @@ -4,7 +4,7 @@ package sha2 @(private = "file") ERR_HW_NOT_SUPPORTED :: "crypto/sha2: hardware implementation unsupported" -// is_hardware_accelerated_256 returns true iff hardware accelerated +// is_hardware_accelerated_256 returns true if and only if (⟺) hardware accelerated // SHA-224/SHA-256 is supported. is_hardware_accelerated_256 :: proc "contextless" () -> bool { return false diff --git a/core/crypto/sha2/sha2_impl_hw_intel.odin b/core/crypto/sha2/sha2_impl_hw_intel.odin index 83ef58a12..3f6ebb746 100644 --- a/core/crypto/sha2/sha2_impl_hw_intel.odin +++ b/core/crypto/sha2/sha2_impl_hw_intel.odin @@ -49,7 +49,7 @@ K_14 :: simd.u64x2{0x78a5636f748f82ee, 0x8cc7020884c87814} K_15 :: simd.u64x2{0xa4506ceb90befffa, 0xc67178f2bef9a3f7} -// is_hardware_accelerated_256 returns true iff hardware accelerated +// is_hardware_accelerated_256 returns true if and only if (⟺) hardware accelerated // SHA-224/SHA-256 is supported. is_hardware_accelerated_256 :: proc "contextless" () -> bool { req_features :: info.CPU_Features{ diff --git a/core/crypto/sha3/sha3.odin b/core/crypto/sha3/sha3.odin index 2ca70963a..2f8d95092 100644 --- a/core/crypto/sha3/sha3.odin +++ b/core/crypto/sha3/sha3.odin @@ -79,7 +79,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { _sha3.final((^_sha3.Context)(ctx), hash, finalize_clone) diff --git a/core/crypto/sm3/sm3.odin b/core/crypto/sm3/sm3.odin index ac38ca417..6f1d788e0 100644 --- a/core/crypto/sm3/sm3.odin +++ b/core/crypto/sm3/sm3.odin @@ -80,7 +80,7 @@ update :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { ensure(ctx.is_initialized) diff --git a/core/crypto/tuplehash/tuplehash.odin b/core/crypto/tuplehash/tuplehash.odin index 5c8d8e39b..a45c1b120 100644 --- a/core/crypto/tuplehash/tuplehash.odin +++ b/core/crypto/tuplehash/tuplehash.odin @@ -31,7 +31,7 @@ write_element :: proc(ctx: ^Context, data: []byte) { // final finalizes the Context, writes the digest to hash, and calls // reset on the Context. // -// Iff finalize_clone is set, final will work on a copy of the Context, +// If and only if (⟺) finalize_clone is set, final will work on a copy of the Context, // which is useful for for calculating rolling digests. final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { _sha3.final_cshake((^_sha3.Context)(ctx), hash, finalize_clone) diff --git a/core/io/io.odin b/core/io/io.odin index 9fae30946..631a232aa 100644 --- a/core/io/io.odin +++ b/core/io/io.odin @@ -436,7 +436,7 @@ copy_buffer :: proc(dst: Writer, src: Reader, buf: []byte) -> (written: i64, err // copy_n copies n bytes (or till an error) from src to dst. // It returns the number of bytes copied and the first error that occurred whilst copying, if any. -// On return, written == n IFF err == nil +// On return, written == n if and only if (⟺) err == nil copy_n :: proc(dst: Writer, src: Reader, n: i64) -> (written: i64, err: Error) { nsrc := limited_reader_init(&Limited_Reader{}, src, n) written, err = copy(dst, nsrc) diff --git a/core/sys/darwin/Foundation/NSBlock.odin b/core/sys/darwin/Foundation/NSBlock.odin index 34e562d75..a5b99abc5 100644 --- a/core/sys/darwin/Foundation/NSBlock.odin +++ b/core/sys/darwin/Foundation/NSBlock.odin @@ -82,7 +82,7 @@ internal_block_literal_make :: proc (is_global: bool, user_data: rawptr, user_pr BLOCK_HAS_COPY_DISPOSE :: 1 << 25 BLOCK_HAS_CTOR :: 1 << 26 // helpers have C++ code BLOCK_IS_GLOBAL :: 1 << 28 - BLOCK_HAS_STRET :: 1 << 29 // IFF BLOCK_HAS_SIGNATURE + BLOCK_HAS_STRET :: 1 << 29 // if and only if (⟺) BLOCK_HAS_SIGNATURE BLOCK_HAS_SIGNATURE :: 1 << 30 bl.isa = is_global ? &_NSConcreteGlobalBlock : &_NSConcreteStackBlock diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 80df35edc..3dd4808c3 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4460,9 +4460,9 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ truncated: r = a - b*trunc(a/b) floored: r = a - b*floor(a/b) - IFF a/0 == 0, then (a%0 == a) or (a%%0 == a) - IFF a/0 == a, then (a%0 == 0) or (a%%0 == 0) - IFF a/0 == 0b111..., then (a%0 == a) or (a%%0 == a) + If and only if (⟺) a/0 == 0, then (a%0 == a) or (a%%0 == a) + If and only if (⟺) a/0 == a, then (a%0 == 0) or (a%%0 == 0) + If and only if (⟺) a/0 == 0b111..., then (a%0 == a) or (a%%0 == a) */ switch (zero_behaviour) { diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 1685f9627..fc68561b3 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1424,8 +1424,8 @@ gb_internal LLVMValueRef lb_integer_modulo(lbProcedure *p, LLVMValueRef lhs, LLV truncated: r = a - b*trunc(a/b) floored: r = a - b*floor(a/b) - IFF a/0 == 0, then (a%0 == a) or (a%%0 == a) - IFF a/0 == a, then (a%0 == 0) or (a%%0 == 0) + If and only if (⟺) a/0 == 0, then (a%0 == a) or (a%%0 == a) + If and only if (⟺) a/0 == a, then (a%0 == 0) or (a%%0 == 0) */ switch (behaviour) { diff --git a/vendor/lua/5.4/include/luaconf.h b/vendor/lua/5.4/include/luaconf.h index 3ad294e4f..fbfa5781b 100644 --- a/vendor/lua/5.4/include/luaconf.h +++ b/vendor/lua/5.4/include/luaconf.h @@ -71,7 +71,7 @@ /* -@@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits. +@@ LUAI_IS32INT is true if and only if (⟺) 'int' has (at least) 32 bits. */ #define LUAI_IS32INT ((UINT_MAX >> 30) >= 3) diff --git a/vendor/portmidi/portmidi.odin b/vendor/portmidi/portmidi.odin index 58d7c2ec2..1f2aca286 100644 --- a/vendor/portmidi/portmidi.odin +++ b/vendor/portmidi/portmidi.odin @@ -119,8 +119,8 @@ DeviceInfo :: struct { structVersion: c.int, /**< this internal structure version */ interf: cstring, /**< underlying MIDI API, e.g. MMSystem or DirectX */ name: cstring, /**< device name, e.g. USB MidiSport 1x1 */ - input: b32, /**< true iff input is available */ - output: b32, /**< true iff output is available */ + input: b32, /**< true if and only if (⟺) input is available */ + output: b32, /**< true if and only if (⟺) output is available */ opened: b32, /**< used by generic PortMidi code to do error checking on arguments */ } From 987aa04d6ca99883483fa5a7098c24e6c6606512 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 13 Mar 2026 11:08:50 +0000 Subject: [PATCH 102/273] Minor formatting improvements, and more use of `or_return` --- core/reflect/types.odin | 113 ++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 56 deletions(-) diff --git a/core/reflect/types.odin b/core/reflect/types.odin index 079a4a172..bda2209ff 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -32,36 +32,36 @@ are_types_identical :: proc(a, b: ^Type_Info) -> bool { return x.signed == y.signed && x.endianness == y.endianness case Type_Info_Rune: - _, ok := b.variant.(Type_Info_Rune) - return ok + _ = b.variant.(Type_Info_Rune) or_return + return true case Type_Info_Float: - _, ok := b.variant.(Type_Info_Float) - return ok + y := b.variant.(Type_Info_Float) or_return + return x.endianness == y.endianness case Type_Info_Complex: - _, ok := b.variant.(Type_Info_Complex) - return ok + _ = b.variant.(Type_Info_Complex) or_return + return true case Type_Info_Quaternion: - _, ok := b.variant.(Type_Info_Quaternion) - return ok + _ = b.variant.(Type_Info_Quaternion) or_return + return true case Type_Info_Type_Id: - _, ok := b.variant.(Type_Info_Type_Id) - return ok + _ = b.variant.(Type_Info_Type_Id) or_return + return true case Type_Info_String: - _, ok := b.variant.(Type_Info_String) - return ok + y := b.variant.(Type_Info_String) or_return + return x.is_cstring == y.is_cstring && x.encoding == y.encoding case Type_Info_Boolean: - _, ok := b.variant.(Type_Info_Boolean) - return ok + _ = b.variant.(Type_Info_Boolean) or_return + return true case Type_Info_Any: - _, ok := b.variant.(Type_Info_Any) - return ok + _ = b.variant.(Type_Info_Any) or_return + return true case Type_Info_Pointer: y := b.variant.(Type_Info_Pointer) or_return @@ -78,22 +78,19 @@ are_types_identical :: proc(a, b: ^Type_Info) -> bool { case Type_Info_Procedure: y := b.variant.(Type_Info_Procedure) or_return - switch { - case x.variadic != y.variadic, - x.convention != y.convention: - return false - } + (x.variadic == y.variadic) or_return + (x.convention == y.convention) or_return return are_types_identical(x.params, y.params) && are_types_identical(x.results, y.results) case Type_Info_Array: y := b.variant.(Type_Info_Array) or_return - if x.count != y.count { return false } + (x.count == y.count) or_return return are_types_identical(x.elem, y.elem) case Type_Info_Enumerated_Array: y := b.variant.(Type_Info_Enumerated_Array) or_return - if x.count != y.count { return false } + (x.count == y.count) or_return return are_types_identical(x.index, y.index) && are_types_identical(x.elem, y.elem) @@ -107,17 +104,15 @@ are_types_identical :: proc(a, b: ^Type_Info) -> bool { case Type_Info_Fixed_Capacity_Dynamic_Array: y := b.variant.(Type_Info_Fixed_Capacity_Dynamic_Array) or_return - if x.capacity != y.capacity { return false } + (x.capacity == y.capacity) or_return return are_types_identical(x.elem, y.elem) case Type_Info_Parameters: y := b.variant.(Type_Info_Parameters) or_return - if len(x.types) != len(y.types) { return false } + (len(x.types) == len(y.types)) or_return for _, i in x.types { xt, yt := x.types[i], y.types[i] - if !are_types_identical(xt, yt) { - return false - } + are_types_identical(xt, yt) or_return } return true @@ -136,59 +131,64 @@ are_types_identical :: proc(a, b: ^Type_Info) -> bool { xt, yt := x.types[i], y.types[i] xl, yl := x.tags[i], y.tags[i] - if xn != yn { return false } - if !are_types_identical(xt, yt) { return false } - if xl != yl { return false } + (xn == yn) or_return + are_types_identical(xt, yt) or_return + (xl == yl) or_return } return true case Type_Info_Union: - y := b.variant.(Type_Info_Union) or_return - if len(x.variants) != len(y.variants) { return false } + y := b.variant.(Type_Info_Union) or_return + (len(x.variants) == len(y.variants)) or_return for _, i in x.variants { xv, yv := x.variants[i], y.variants[i] - if !are_types_identical(xv, yv) { return false } + are_types_identical(xv, yv) or_return } return true case Type_Info_Enum: - // NOTE(bill): Should be handled above - return false + y := b.variant.(Type_Info_Enum) or_return + are_types_identical(x.base, y.base) or_return + (len(x.names) == len(y.names)) or_return + + for _, i in x.names { + (x.names[i] == y.names[i]) or_return + (x.values[i] == y.values[i]) or_return + } + return true case Type_Info_Map: y := b.variant.(Type_Info_Map) or_return return are_types_identical(x.key, y.key) && are_types_identical(x.value, y.value) case Type_Info_Bit_Set: - y := b.variant.(Type_Info_Bit_Set) or_return - return x.elem == y.elem && x.lower == y.lower && x.upper == y.upper + y := b.variant.(Type_Info_Bit_Set) or_return + are_types_identical(x.underlying, y.underlying) or_return + are_types_identical(x.elem, y.elem) or_return + + return x.lower == y.lower && x.upper == y.upper case Type_Info_Simd_Vector: y := b.variant.(Type_Info_Simd_Vector) or_return return x.count == y.count && x.elem == y.elem case Type_Info_Matrix: - y := b.variant.(Type_Info_Matrix) or_return - if x.row_count != y.row_count { return false } - if x.column_count != y.column_count { return false } - if x.layout != y.layout { return false } + y := b.variant.(Type_Info_Matrix) or_return + (x.row_count == y.row_count) or_return + (x.column_count == y.column_count) or_return + (x.layout == y.layout) or_return return are_types_identical(x.elem, y.elem) case Type_Info_Bit_Field: - y := b.variant.(Type_Info_Bit_Field) or_return - if !are_types_identical(x.backing_type, y.backing_type) { return false } - if x.field_count != y.field_count { return false } + y := b.variant.(Type_Info_Bit_Field) or_return + are_types_identical(x.backing_type, y.backing_type) or_return + (x.field_count == y.field_count) or_return + for _, i in x.names[:x.field_count] { - if x.names[i] != y.names[i] { - return false - } - if !are_types_identical(x.types[i], y.types[i]) { - return false - } - if x.bit_sizes[i] != y.bit_sizes[i] { - return false - } + (x.names[i] == y.names[i]) or_return + are_types_identical(x.types[i], y.types[i]) or_return + (x.bit_sizes[i] == y.bit_sizes[i]) or_return } return true } @@ -334,7 +334,8 @@ is_soa_pointer :: proc(info: ^Type_Info) -> bool { is_pointer_internally :: proc(info: ^Type_Info) -> bool { if info == nil { return false } #partial switch v in type_info_base(info).variant { - case Type_Info_Pointer, Type_Info_Multi_Pointer, + case Type_Info_Pointer, + Type_Info_Multi_Pointer, Type_Info_Procedure: return true case Type_Info_String: @@ -674,7 +675,7 @@ write_type_writer :: #force_no_inline proc(w: io.Writer, ti: ^Type_Info, n_writt write_type(w, info.elem, &n) or_return case Type_Info_Fixed_Capacity_Dynamic_Array: - io.write_string(w, "[dynamic;", &n) or_return + io.write_string(w, "[dynamic; ", &n) or_return io.write_i64(w, i64(info.capacity), 10, &n) or_return io.write_string(w, "]", &n) or_return write_type(w, info.elem, &n) or_return From b5801ea5c1402894de66dfef1f2d0b6aae4ae947 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 13 Mar 2026 11:10:28 +0000 Subject: [PATCH 103/273] Handle endianness for floats --- core/reflect/types.odin | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/reflect/types.odin b/core/reflect/types.odin index bda2209ff..c6400eb63 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -454,6 +454,8 @@ is_endian_platform :: proc(info: ^Type_Info) -> bool { #partial switch v in info.variant { case Type_Info_Integer: return v.endianness == .Platform + case Type_Info_Float: + return v.endianness == .Platform case Type_Info_Bit_Set: return is_endian_platform(v.underlying) case Type_Info_Pointer: @@ -476,6 +478,11 @@ is_endian_little :: proc(info: ^Type_Info) -> bool { return ODIN_ENDIAN == .Little } return v.endianness == .Little + case Type_Info_Float: + if v.endianness == .Platform { + return ODIN_ENDIAN == .Little + } + return v.endianness == .Little case Type_Info_Bit_Set: return is_endian_little(v.underlying) case Type_Info_Pointer: @@ -498,6 +505,11 @@ is_endian_big :: proc(info: ^Type_Info) -> bool { return ODIN_ENDIAN == .Big } return v.endianness == .Big + case Type_Info_Float: + if v.endianness == .Platform { + return ODIN_ENDIAN == .Big + } + return v.endianness == .Big case Type_Info_Bit_Set: return is_endian_big(v.underlying) case Type_Info_Pointer: From 004a65e3826740230a4e65a77c1c2273befb3549 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 12 Mar 2026 02:40:20 +0900 Subject: [PATCH 104/273] core/crypto/_aes/hw_intel: Remove a copy of zero_explicit --- .../_aes/hw_intel/hw_intel_keysched.odin | 26 ++----------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin b/core/crypto/_aes/hw_intel/hw_intel_keysched.odin index 96108442d..7b339c5f5 100644 --- a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin +++ b/core/crypto/_aes/hw_intel/hw_intel_keysched.odin @@ -24,6 +24,7 @@ package aes_hw_intel import "base:intrinsics" +import "core:crypto" import "core:crypto/_aes" import "core:simd/x86" @@ -173,28 +174,5 @@ keysched :: proc(ctx: ^Context, key: []byte) { ctx._num_rounds = num_rounds - zero_explicit(&sks, size_of(sks)) + crypto.zero_explicit(&sks, size_of(sks)) } - -/* -Set each byte of a memory range to zero. - -This procedure copies the value `0` into the `len` bytes of a memory range, -starting at address `data`. - -This procedure returns the pointer to `data`. - -Unlike the `zero()` procedure, which can be optimized away or reordered by the -compiler under certain circumstances, `zero_explicit()` procedure can not be -optimized away or reordered with other memory access operations, and the -compiler assumes volatile semantics of the memory. -*/ -zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { - // This routine tries to avoid the compiler optimizing away the call, - // so that it is always executed. It is intended to provide - // equivalent semantics to those provided by the C11 Annex K 3.7.4.1 - // memset_s call. - intrinsics.mem_zero_volatile(data, len) // Use the volatile mem_zero - intrinsics.atomic_thread_fence(.Seq_Cst) // Prevent reordering - return data -} \ No newline at end of file From 48b1f3b8301ad3e0977555bd4e0a4cc8434f4216 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 12 Mar 2026 02:44:21 +0900 Subject: [PATCH 105/273] core/simd/arm: Initial import --- core/simd/arm/aes.odin | 34 ++++++++++++++++++++++++++++++++++ core/simd/arm/doc.odin | 2 ++ core/simd/arm/types.odin | 5 +++++ 3 files changed, 41 insertions(+) create mode 100644 core/simd/arm/aes.odin create mode 100644 core/simd/arm/doc.odin create mode 100644 core/simd/arm/types.odin diff --git a/core/simd/arm/aes.odin b/core/simd/arm/aes.odin new file mode 100644 index 000000000..acafb9f1e --- /dev/null +++ b/core/simd/arm/aes.odin @@ -0,0 +1,34 @@ +#+build arm64,arm32 +package simd_arm + +@(require_results,enable_target_feature="aes") +vaeseq_u8 :: #force_inline proc "c" (data, key: uint8x16_t) -> uint8x16_t { + return _vaeseq_u8(data, key) +} + +@(require_results,enable_target_feature="aes") +vaesdq_u8 :: #force_inline proc "c" (data, key: uint8x16_t) -> uint8x16_t { + return _vaesdq_u8(data, key) +} + +@(require_results,enable_target_feature="aes") +vaesmcq_u8 :: #force_inline proc "c" (data: uint8x16_t) -> uint8x16_t { + return _vaesmcq_u8(data) +} + +@(require_results,enable_target_feature="aes") +vaesimcq_u8 :: #force_inline proc "c" (data: uint8x16_t) -> uint8x16_t { + return _vaesimcq_u8(data) +} + +@(private,default_calling_convention="none") +foreign _ { + @(link_name = "llvm.aarch64.crypto.aese" when ODIN_ARCH == .arm64 else "llvm.arm.neon.aese") + _vaeseq_u8 :: proc(data, key: uint8x16_t) -> uint8x16_t --- + @(link_name = "llvm.aarch64.crypto.aesd" when ODIN_ARCH == .arm64 else "llvm.arm.neon.aesd") + _vaesdq_u8 :: proc(data, key: uint8x16_t) -> uint8x16_t --- + @(link_name = "llvm.aarch64.crypto.aesmc" when ODIN_ARCH == .arm64 else "llvm.arm.neon.aesmc") + _vaesmcq_u8 :: proc(data: uint8x16_t) -> uint8x16_t --- + @(link_name = "llvm.aarch64.crypto.aesimc" when ODIN_ARCH == .arm64 else "llvm.arm.neon.aesimc") + _vaesimcq_u8 :: proc(data: uint8x16_t) -> uint8x16_t --- +} diff --git a/core/simd/arm/doc.odin b/core/simd/arm/doc.odin new file mode 100644 index 000000000..ecedc7bac --- /dev/null +++ b/core/simd/arm/doc.odin @@ -0,0 +1,2 @@ +// `SIMD` intrinsics specific to ARMv8 `arm32` and `arm64` architectures. +package simd_arm \ No newline at end of file diff --git a/core/simd/arm/types.odin b/core/simd/arm/types.odin new file mode 100644 index 000000000..7c86483a7 --- /dev/null +++ b/core/simd/arm/types.odin @@ -0,0 +1,5 @@ +#+build arm64,arm32 +package simd_arm + +uint8x16_t :: #simd[16]u8 +uint32x4_t :: #simd[4]u32 From 6aeed0e20e05ff2c17c7fc17b10fcc9518f3395a Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 12 Mar 2026 20:35:55 +0900 Subject: [PATCH 106/273] core/crypto/_aes/hw: Initial import --- core/crypto/_aes/hw/api.odin | 69 +++++++ .../ghash.odin => hw/ghash_intel.odin} | 2 +- core/crypto/_aes/hw/intrinsics_arm.odin | 115 +++++++++++ core/crypto/_aes/hw/intrinsics_intel.odin | 55 ++++++ core/crypto/_aes/hw/keysched_hw.odin | 181 ++++++++++++++++++ core/crypto/_aes/hw/unsupported.odin | 11 ++ core/crypto/_aes/hw_intel/api.odin | 38 ---- .../_aes/hw_intel/hw_intel_keysched.odin | 178 ----------------- core/crypto/aes/aes_gcm_hw_intel.odin | 20 +- core/crypto/aes/aes_impl_hw_intel.odin | 8 +- 10 files changed, 446 insertions(+), 231 deletions(-) create mode 100644 core/crypto/_aes/hw/api.odin rename core/crypto/_aes/{hw_intel/ghash.odin => hw/ghash_intel.odin} (99%) create mode 100644 core/crypto/_aes/hw/intrinsics_arm.odin create mode 100644 core/crypto/_aes/hw/intrinsics_intel.odin create mode 100644 core/crypto/_aes/hw/keysched_hw.odin create mode 100644 core/crypto/_aes/hw/unsupported.odin delete mode 100644 core/crypto/_aes/hw_intel/api.odin delete mode 100644 core/crypto/_aes/hw_intel/hw_intel_keysched.odin diff --git a/core/crypto/_aes/hw/api.odin b/core/crypto/_aes/hw/api.odin new file mode 100644 index 000000000..09f674657 --- /dev/null +++ b/core/crypto/_aes/hw/api.odin @@ -0,0 +1,69 @@ +package aes_hw + +@(require) import "core:sys/info" + +// is_supported returns true if and only if (⟺) hardware accelerated AES +// is supported. +is_supported :: proc "contextless" () -> bool { + when ODIN_ARCH == .amd64 { + // Note: Everything with AES-NI has support for + // the required SSE extxtensions. + req_features :: info.CPU_Features{ + .sse2, + .ssse3, + .sse41, + .aes, + } + return info.cpu_features() >= req_features + } else when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32 { + req_features :: info.CPU_Features{ + .asimd, + .aes, + } + return info.cpu_features() >= req_features + } else { + return false + } +} + +// is_ghash_supported returns true if and only if (⟺) hardware accelerated +// GHASH is supported. +is_ghash_supported :: proc "contextless" () -> bool { + // Just having hardware GHASH is silly. + if !is_supported() { + return false + } + + when ODIN_ARCH == .amd64 { + return info.cpu_features() >= info.CPU_Features{ + .pclmulqdq, + } + } else when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32{ + // Once we can actually use this, we can re-enable this. + // + // return info.cpu_features() >= info.CPU_Features{ + // .pmull, + // } + return false + } else { + return false + } +} + +// Context is a keyed AES (ECB) instance. +Context :: struct { + // Note: The ideal thing to do is for the expanded round keys to be + // arrays of `u8x16`, however that implies alignment (or using AVX). + // + // All the people using e-waste processors that don't support an + // instruction set that has been around for over 10 years are why + // we can't have nice things. + _sk_exp_enc: [15][16]byte, + _sk_exp_dec: [15][16]byte, + _num_rounds: int, +} + +// init initializes a context for AES with the provided key. +init :: proc(ctx: ^Context, key: []byte) { + keysched(ctx, key) +} diff --git a/core/crypto/_aes/hw_intel/ghash.odin b/core/crypto/_aes/hw/ghash_intel.odin similarity index 99% rename from core/crypto/_aes/hw_intel/ghash.odin rename to core/crypto/_aes/hw/ghash_intel.odin index 5f51b614b..d80816d5d 100644 --- a/core/crypto/_aes/hw_intel/ghash.odin +++ b/core/crypto/_aes/hw/ghash_intel.odin @@ -21,7 +21,7 @@ // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #+build amd64 -package aes_hw_intel +package aes_hw import "base:intrinsics" import "core:crypto/_aes" diff --git a/core/crypto/_aes/hw/intrinsics_arm.odin b/core/crypto/_aes/hw/intrinsics_arm.odin new file mode 100644 index 000000000..ccd8efa8f --- /dev/null +++ b/core/crypto/_aes/hw/intrinsics_arm.odin @@ -0,0 +1,115 @@ +#+build arm64,arm32 +package aes_hw + +import "core:simd" +import "core:simd/arm" + +// https://blog.michaelbrase.com/2018/05/08/emulating-x86-aes-intrinsics-on-armv8-a/ + +TARGET_FEATURES :: "neon,aes" +HAS_GHASH :: false // Temporary + +@(require_results, enable_target_feature = "aes") +aesdec :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return simd.bit_xor(arm.vaesimcq_u8(arm.vaesdq_u8(data, simd.u8x16{})), key) +} + +@(require_results, enable_target_feature = "aes") +aesdeclast :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return simd.bit_xor(arm.vaesdq_u8(data, simd.u8x16{}), key) +} + +@(require_results, enable_target_feature = "aes") +aesenc :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return simd.bit_xor(arm.vaesmcq_u8(arm.vaeseq_u8(data, simd.u8x16{})), key) +} + +@(require_results, enable_target_feature = "aes") +aesenclast :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return simd.bit_xor(arm.vaeseq_u8(data, simd.u8x16{}), key) +} + +aesimc :: arm.vaesimcq_u8 + +@(require_results, enable_target_feature = "aes") +aeskeygenassist :: #force_inline proc "c" (data: simd.u8x16, $IMM8: u8) -> simd.u8x16 { + a := arm.vaeseq_u8(data, simd.u8x16{}) // AESE does ShiftRows and SubBytes on A + + // Undo ShiftRows step from AESE and extract X1 and X3 + dest := simd.swizzle( + a, + 0x04, 0x01, 0x0e, 0x0b, // SubBytes(X1) + 0x01, 0x0e, 0x0b, 0x04, // ROT(SubBytes(X1)) + 0x0c, 0x09, 0x06, 0x03, // SubBytes(X3) + 0x09, 0x06, 0x03, 0x0c, // ROT(SubBytes(X3)) + ) + + rcons := simd.u8x16{ + 0, 0, 0, 0, + IMM8, 0, 0, 0, + 0, 0, 0, 0, + IMM8, 0, 0, 0, + } + + return simd.bit_xor(dest, rcons) +} + +// The keyschedule implementation is easier to read with some extra +// Intel intrinsics that are emulated by built-in LLVM ops anyway. + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_slli_si128 :: #force_inline proc "c" (a: simd.u8x16, $IMM8: u32) -> simd.u8x16 { + shift :: IMM8 & 0xff + + // This needs to emit behavior identical to PSLLDQ which is as follows: + // + // TEMP := COUNT + // IF (TEMP > 15) THEN TEMP := 16; FI + // DEST := DEST << (TEMP * 8) + // DEST[MAXVL-1:128] (Unmodified) + + return simd.shuffle( + simd.u8x16{}, + a, + 0 when shift > 15 else (16 - shift + 0), + 1 when shift > 15 else (16 - shift + 1), + 2 when shift > 15 else (16 - shift + 2), + 3 when shift > 15 else (16 - shift + 3), + 4 when shift > 15 else (16 - shift + 4), + 5 when shift > 15 else (16 - shift + 5), + 6 when shift > 15 else (16 - shift + 6), + 7 when shift > 15 else (16 - shift + 7), + 8 when shift > 15 else (16 - shift + 8), + 9 when shift > 15 else (16 - shift + 9), + 10 when shift > 15 else (16 - shift + 10), + 11 when shift > 15 else (16 - shift + 11), + 12 when shift > 15 else (16 - shift + 12), + 13 when shift > 15 else (16 - shift + 13), + 14 when shift > 15 else (16 - shift + 14), + 15 when shift > 15 else (16 - shift + 15), + ) +} + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_shuffle_epi32 :: #force_inline proc "c" (a: simd.u8x16, $IMM8: u32) -> simd.u8x16 { + v := transmute(simd.i32x4)a + return transmute(simd.u8x16)simd.shuffle( + v, + v, + IMM8 & 0b11, + (IMM8 >> 2) & 0b11, + (IMM8 >> 4) & 0b11, + (IMM8 >> 6) & 0b11, + ) +} + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_shuffle_ps :: #force_inline proc "c" (a, b: simd.u8x16, $MASK: u32) -> simd.u8x16 { + return transmute(simd.u8x16)simd.shuffle( + transmute(simd.u32x4)(a), + transmute(simd.u32x4)(b), + u32(MASK) & 0b11, + (u32(MASK)>>2) & 0b11, + ((u32(MASK)>>4) & 0b11)+4, + ((u32(MASK)>>6) & 0b11)+4) +} diff --git a/core/crypto/_aes/hw/intrinsics_intel.odin b/core/crypto/_aes/hw/intrinsics_intel.odin new file mode 100644 index 000000000..25399dfae --- /dev/null +++ b/core/crypto/_aes/hw/intrinsics_intel.odin @@ -0,0 +1,55 @@ +#+build amd64 +package aes_hw + +import "core:simd" +import "core:simd/x86" + +// Intel/RISC-V semantics. + +TARGET_FEATURES :: "sse,sse2,ssse3,sse4.1,aes" +HAS_GHASH :: true + +@(require_results, enable_target_feature = "aes") +aesdec :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aesdec_si128(transmute(x86.__m128i)(data), transmute(x86.__m128i)(key))) +} + +@(require_results, enable_target_feature = "aes") +aesdeclast :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aesdeclast_si128(transmute(x86.__m128i)(data), transmute(x86.__m128i)(key))) +} + +@(require_results, enable_target_feature = "aes") +aesenc :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aesenc_si128(transmute(x86.__m128i)(data), transmute(x86.__m128i)(key))) +} + +@(require_results, enable_target_feature = "aes") +aesenclast :: #force_inline proc "c" (data, key: simd.u8x16) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aesenclast_si128(transmute(x86.__m128i)(data), transmute(x86.__m128i)(key))) +} + +@(require_results, enable_target_feature = "aes") +aesimc :: #force_inline proc "c" (data: simd.u8x16) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aesimc_si128(transmute(x86.__m128i)(data))) +} + +@(require_results, enable_target_feature = "aes") +aeskeygenassist :: #force_inline proc "c" (data: simd.u8x16, $IMM8: u8) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_aeskeygenassist_si128(transmute(x86.__m128i)(data), IMM8)) +} + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_slli_si128 :: #force_inline proc "c" (a: simd.u8x16, $IMM8: u32) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_slli_si128(transmute(x86.__m128i)(a), IMM8)) +} + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_shuffle_epi32 :: #force_inline proc "c" (a: simd.u8x16, $IMM8: u32) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_shuffle_epi32(transmute(x86.__m128i)(a), IMM8)) +} + +@(private, require_results, enable_target_feature = TARGET_FEATURES) +_mm_shuffle_ps :: #force_inline proc "c" (a, b: simd.u8x16, $MASK: u32) -> simd.u8x16 { + return transmute(simd.u8x16)(x86._mm_shuffle_ps(transmute(x86.__m128)(a), transmute(x86.__m128)(b), MASK)) +} diff --git a/core/crypto/_aes/hw/keysched_hw.odin b/core/crypto/_aes/hw/keysched_hw.odin new file mode 100644 index 000000000..7d85c43b7 --- /dev/null +++ b/core/crypto/_aes/hw/keysched_hw.odin @@ -0,0 +1,181 @@ +// Copyright (c) 2017 Thomas Pornin +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHORS “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 AUTHORS 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. + +#+build amd64,arm64,arm32 +package aes_hw + +import "base:intrinsics" +import "core:crypto" +import "core:crypto/_aes" +import "core:simd" + +// Inspiration taken from BearSSL's AES-NI implementation. +// +// Note: This assumes that the SROA optimization pass is enabled to be +// anything resembling performant otherwise, LLVM will not elide a massive +// number of redundant loads/stores it generates for every intrinsic call. + +@(private = "file", require_results, enable_target_feature = TARGET_FEATURES) +expand_step128 :: #force_inline proc(k1, k2: simd.u8x16) -> simd.u8x16 { + k1, k2 := k1, k2 + + k2 = _mm_shuffle_epi32(k2, 0xff) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + return simd.bit_xor(k1, k2) +} + +@(private = "file", require_results, enable_target_feature = TARGET_FEATURES) +expand_step192a :: #force_inline proc (k1_, k2_: ^simd.u8x16, k3: simd.u8x16) -> (simd.u8x16, simd.u8x16) { + k1, k2, k3 := k1_^, k2_^, k3 + + k3 = _mm_shuffle_epi32(k3, 0x55) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, k3) + + tmp := k2 + k2 = simd.bit_xor(k2, _mm_slli_si128(k2, 0x04)) + k2 = simd.bit_xor(k2, _mm_shuffle_epi32(k1, 0xff)) + + k1_, k2_ := k1_, k2_ + k1_^, k2_^ = k1, k2 + + r1 := _mm_shuffle_ps(tmp, k1, 0x44) + r2 := _mm_shuffle_ps(k1, k2, 0x4e) + + return r1, r2 +} + +@(private = "file", require_results, enable_target_feature = TARGET_FEATURES) +expand_step192b :: #force_inline proc (k1_, k2_: ^simd.u8x16, k3: simd.u8x16) -> simd.u8x16 { + k1, k2, k3 := k1_^, k2_^, k3 + + k3 = _mm_shuffle_epi32(k3, 0x55) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, k3) + + k2 = simd.bit_xor(k2, _mm_slli_si128(k2, 0x04)) + k2 = simd.bit_xor(k2, _mm_shuffle_epi32(k1, 0xff)) + + k1_, k2_ := k1_, k2_ + k1_^, k2_^ = k1, k2 + + return k1 +} + +@(private = "file", require_results, enable_target_feature = TARGET_FEATURES) +expand_step256b :: #force_inline proc(k1, k2: simd.u8x16) -> simd.u8x16 { + k1, k2 := k1, k2 + + k2 = _mm_shuffle_epi32(k2, 0xaa) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + k1 = simd.bit_xor(k1, _mm_slli_si128(k1, 0x04)) + return simd.bit_xor(k1, k2) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +derive_dec_keys :: proc(ctx: ^Context, sks: ^[15]simd.u8x16, num_rounds: int) { + intrinsics.unaligned_store((^simd.u8x16)(&ctx._sk_exp_dec[0]), sks[num_rounds]) + for i in 1 ..< num_rounds { + tmp := aesimc(sks[i]) + intrinsics.unaligned_store((^simd.u8x16)(&ctx._sk_exp_dec[num_rounds - i]), tmp) + } + intrinsics.unaligned_store((^simd.u8x16)(&ctx._sk_exp_dec[num_rounds]), sks[0]) +} + +@(private, enable_target_feature = TARGET_FEATURES) +keysched :: proc(ctx: ^Context, key: []byte) { + sks: [15]simd.u8x16 = --- + + // Compute the encryption keys. + num_rounds, key_len := 0, len(key) + switch key_len { + case _aes.KEY_SIZE_128: + sks[0] = intrinsics.unaligned_load((^simd.u8x16)(raw_data(key))) + sks[1] = expand_step128(sks[0], aeskeygenassist(sks[0], 0x01)) + sks[2] = expand_step128(sks[1], aeskeygenassist(sks[1], 0x02)) + sks[3] = expand_step128(sks[2], aeskeygenassist(sks[2], 0x04)) + sks[4] = expand_step128(sks[3], aeskeygenassist(sks[3], 0x08)) + sks[5] = expand_step128(sks[4], aeskeygenassist(sks[4], 0x10)) + sks[6] = expand_step128(sks[5], aeskeygenassist(sks[5], 0x20)) + sks[7] = expand_step128(sks[6], aeskeygenassist(sks[6], 0x40)) + sks[8] = expand_step128(sks[7], aeskeygenassist(sks[7], 0x80)) + sks[9] = expand_step128(sks[8], aeskeygenassist(sks[8], 0x1b)) + sks[10] = expand_step128(sks[9], aeskeygenassist(sks[9], 0x36)) + num_rounds = _aes.ROUNDS_128 + case _aes.KEY_SIZE_192: + k0 := intrinsics.unaligned_load((^simd.u8x16)(raw_data(key))) + + k1_tmp: [16]byte + copy(k1_tmp[:], key[16:24]) + k1 := intrinsics.unaligned_load((^simd.u8x16)(&k1_tmp)) + crypto.zero_explicit(&k1_tmp, size_of(k1_tmp)) + + sks[0] = k0 + sks[1], sks[2] = expand_step192a(&k0, &k1, aeskeygenassist(k1, 0x01)) + sks[3] = expand_step192b(&k0, &k1, aeskeygenassist(k1, 0x02)) + sks[4], sks[5] = expand_step192a(&k0, &k1, aeskeygenassist(k1, 0x04)) + sks[6] = expand_step192b(&k0, &k1, aeskeygenassist(k1, 0x08)) + sks[7], sks[8] = expand_step192a(&k0, &k1, aeskeygenassist(k1, 0x10)) + sks[9] = expand_step192b(&k0, &k1, aeskeygenassist(k1, 0x20)) + sks[10], sks[11] = expand_step192a(&k0, &k1, aeskeygenassist(k1, 0x40)) + sks[12] = expand_step192b(&k0, &k1, aeskeygenassist(k1, 0x80)) + num_rounds = _aes.ROUNDS_192 + + case _aes.KEY_SIZE_256: + sks[0] = intrinsics.unaligned_load((^simd.u8x16)(raw_data(key))) + sks[1] = intrinsics.unaligned_load((^simd.u8x16)(raw_data(key[16:]))) + sks[2] = expand_step128(sks[0], aeskeygenassist(sks[1], 0x01)) + sks[3] = expand_step256b(sks[1], aeskeygenassist(sks[2], 0x01)) + sks[4] = expand_step128(sks[2], aeskeygenassist(sks[3], 0x02)) + sks[5] = expand_step256b(sks[3], aeskeygenassist(sks[4], 0x02)) + sks[6] = expand_step128(sks[4], aeskeygenassist(sks[5], 0x04)) + sks[7] = expand_step256b(sks[5], aeskeygenassist(sks[6], 0x04)) + sks[8] = expand_step128(sks[6], aeskeygenassist(sks[7], 0x08)) + sks[9] = expand_step256b(sks[7], aeskeygenassist(sks[8], 0x08)) + sks[10] = expand_step128(sks[8], aeskeygenassist(sks[9], 0x10)) + sks[11] = expand_step256b(sks[9], aeskeygenassist(sks[10], 0x10)) + sks[12] = expand_step128(sks[10], aeskeygenassist(sks[11], 0x20)) + sks[13] = expand_step256b(sks[11], aeskeygenassist(sks[12], 0x20)) + sks[14] = expand_step128(sks[12], aeskeygenassist(sks[13], 0x40)) + num_rounds = _aes.ROUNDS_256 + case: + panic("crypto/aes: invalid AES key size") + } + for i in 0 ..= num_rounds { + intrinsics.unaligned_store((^simd.u8x16)(&ctx._sk_exp_enc[i]), sks[i]) + } + + // Compute the decryption keys. GCM and CTR do not need this, however + // ECB, CBC, OCB3, etc do. + derive_dec_keys(ctx, &sks, num_rounds) + + ctx._num_rounds = num_rounds + + crypto.zero_explicit(&sks, size_of(sks)) +} diff --git a/core/crypto/_aes/hw/unsupported.odin b/core/crypto/_aes/hw/unsupported.odin new file mode 100644 index 000000000..3fb31b6b8 --- /dev/null +++ b/core/crypto/_aes/hw/unsupported.odin @@ -0,0 +1,11 @@ +#+build !amd64 +#+build !arm64 +#+build !arm32 +package aes_hw + +HAS_GHASH :: false + +@(private) +keysched :: proc(ctx: ^Context, key: []byte) { + panic("crypto/aes: hardware implementation unsupported") +} diff --git a/core/crypto/_aes/hw_intel/api.odin b/core/crypto/_aes/hw_intel/api.odin deleted file mode 100644 index 9547d8f84..000000000 --- a/core/crypto/_aes/hw_intel/api.odin +++ /dev/null @@ -1,38 +0,0 @@ -#+build amd64 -package aes_hw_intel - -import "core:sys/info" - -// is_supported returns true if and only if (⟺) hardware accelerated AES -// is supported. -is_supported :: proc "contextless" () -> bool { - // Note: Everything with AES-NI and PCLMULQDQ has support for - // the required SSE extxtensions. - req_features :: info.CPU_Features{ - .sse2, - .ssse3, - .sse41, - .aes, - .pclmulqdq, - } - return info.cpu_features() >= req_features -} - -// Context is a keyed AES (ECB) instance. -Context :: struct { - // Note: The ideal thing to do is for the expanded round keys to be - // arrays of `__m128i`, however that implies alignment (or using AVX). - // - // All the people using e-waste processors that don't support an - // insturction set that has been around for over 10 years are why - // we can't have nice things. - _sk_exp_enc: [15][16]byte, - _sk_exp_dec: [15][16]byte, - _num_rounds: int, -} - -// init initializes a context for AES with the provided key. -init :: proc(ctx: ^Context, key: []byte) { - keysched(ctx, key) -} - diff --git a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin b/core/crypto/_aes/hw_intel/hw_intel_keysched.odin deleted file mode 100644 index 7b339c5f5..000000000 --- a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright (c) 2017 Thomas Pornin -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHORS “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 AUTHORS 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. - -#+build amd64 -package aes_hw_intel - -import "base:intrinsics" -import "core:crypto" -import "core:crypto/_aes" -import "core:simd/x86" - -// Intel AES-NI based implementation. Inspiration taken from BearSSL. -// -// Note: This assumes that the SROA optimization pass is enabled to be -// anything resembling performat otherwise, LLVM will not elide a massive -// number of redundant loads/stores it generates for every intrinsic call. - -@(private = "file", require_results, enable_target_feature = "sse2") -expand_step128 :: #force_inline proc(k1, k2: x86.__m128i) -> x86.__m128i { - k1, k2 := k1, k2 - - k2 = x86._mm_shuffle_epi32(k2, 0xff) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - return x86._mm_xor_si128(k1, k2) -} - -@(private = "file", require_results, enable_target_feature = "sse,sse2") -expand_step192a :: #force_inline proc (k1_, k2_: ^x86.__m128i, k3: x86.__m128i) -> (x86.__m128i, x86.__m128i) { - k1, k2, k3 := k1_^, k2_^, k3 - - k3 = x86._mm_shuffle_epi32(k3, 0x55) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, k3) - - tmp := k2 - k2 = x86._mm_xor_si128(k2, x86._mm_slli_si128(k2, 0x04)) - k2 = x86._mm_xor_si128(k2, x86._mm_shuffle_epi32(k1, 0xff)) - - k1_, k2_ := k1_, k2_ - k1_^, k2_^ = k1, k2 - - r1 := transmute(x86.__m128i)(x86._mm_shuffle_ps(transmute(x86.__m128)(tmp), transmute(x86.__m128)(k1), 0x44)) - r2 := transmute(x86.__m128i)(x86._mm_shuffle_ps(transmute(x86.__m128)(k1), transmute(x86.__m128)(k2), 0x4e)) - - return r1, r2 -} - -@(private = "file", require_results, enable_target_feature = "sse2") -expand_step192b :: #force_inline proc (k1_, k2_: ^x86.__m128i, k3: x86.__m128i) -> x86.__m128i { - k1, k2, k3 := k1_^, k2_^, k3 - - k3 = x86._mm_shuffle_epi32(k3, 0x55) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, k3) - - k2 = x86._mm_xor_si128(k2, x86._mm_slli_si128(k2, 0x04)) - k2 = x86._mm_xor_si128(k2, x86._mm_shuffle_epi32(k1, 0xff)) - - k1_, k2_ := k1_, k2_ - k1_^, k2_^ = k1, k2 - - return k1 -} - -@(private = "file", require_results, enable_target_feature = "sse2") -expand_step256b :: #force_inline proc(k1, k2: x86.__m128i) -> x86.__m128i { - k1, k2 := k1, k2 - - k2 = x86._mm_shuffle_epi32(k2, 0xaa) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - k1 = x86._mm_xor_si128(k1, x86._mm_slli_si128(k1, 0x04)) - return x86._mm_xor_si128(k1, k2) -} - -@(private = "file", enable_target_feature = "aes") -derive_dec_keys :: proc(ctx: ^Context, sks: ^[15]x86.__m128i, num_rounds: int) { - intrinsics.unaligned_store((^x86.__m128i)(&ctx._sk_exp_dec[0]), sks[num_rounds]) - for i in 1 ..< num_rounds { - tmp := x86._mm_aesimc_si128(sks[i]) - intrinsics.unaligned_store((^x86.__m128i)(&ctx._sk_exp_dec[num_rounds - i]), tmp) - } - intrinsics.unaligned_store((^x86.__m128i)(&ctx._sk_exp_dec[num_rounds]), sks[0]) -} - -@(private, enable_target_feature = "sse,sse2,aes") -keysched :: proc(ctx: ^Context, key: []byte) { - sks: [15]x86.__m128i = --- - - // Compute the encryption keys. - num_rounds, key_len := 0, len(key) - switch key_len { - case _aes.KEY_SIZE_128: - sks[0] = intrinsics.unaligned_load((^x86.__m128i)(raw_data(key))) - sks[1] = expand_step128(sks[0], x86._mm_aeskeygenassist_si128(sks[0], 0x01)) - sks[2] = expand_step128(sks[1], x86._mm_aeskeygenassist_si128(sks[1], 0x02)) - sks[3] = expand_step128(sks[2], x86._mm_aeskeygenassist_si128(sks[2], 0x04)) - sks[4] = expand_step128(sks[3], x86._mm_aeskeygenassist_si128(sks[3], 0x08)) - sks[5] = expand_step128(sks[4], x86._mm_aeskeygenassist_si128(sks[4], 0x10)) - sks[6] = expand_step128(sks[5], x86._mm_aeskeygenassist_si128(sks[5], 0x20)) - sks[7] = expand_step128(sks[6], x86._mm_aeskeygenassist_si128(sks[6], 0x40)) - sks[8] = expand_step128(sks[7], x86._mm_aeskeygenassist_si128(sks[7], 0x80)) - sks[9] = expand_step128(sks[8], x86._mm_aeskeygenassist_si128(sks[8], 0x1b)) - sks[10] = expand_step128(sks[9], x86._mm_aeskeygenassist_si128(sks[9], 0x36)) - num_rounds = _aes.ROUNDS_128 - case _aes.KEY_SIZE_192: - k0 := intrinsics.unaligned_load((^x86.__m128i)(raw_data(key))) - k1 := x86.__m128i{ - intrinsics.unaligned_load((^i64)(raw_data(key[16:]))), - 0, - } - sks[0] = k0 - sks[1], sks[2] = expand_step192a(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x01)) - sks[3] = expand_step192b(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x02)) - sks[4], sks[5] = expand_step192a(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x04)) - sks[6] = expand_step192b(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x08)) - sks[7], sks[8] = expand_step192a(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x10)) - sks[9] = expand_step192b(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x20)) - sks[10], sks[11] = expand_step192a(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x40)) - sks[12] = expand_step192b(&k0, &k1, x86._mm_aeskeygenassist_si128(k1, 0x80)) - num_rounds = _aes.ROUNDS_192 - case _aes.KEY_SIZE_256: - sks[0] = intrinsics.unaligned_load((^x86.__m128i)(raw_data(key))) - sks[1] = intrinsics.unaligned_load((^x86.__m128i)(raw_data(key[16:]))) - sks[2] = expand_step128(sks[0], x86._mm_aeskeygenassist_si128(sks[1], 0x01)) - sks[3] = expand_step256b(sks[1], x86._mm_aeskeygenassist_si128(sks[2], 0x01)) - sks[4] = expand_step128(sks[2], x86._mm_aeskeygenassist_si128(sks[3], 0x02)) - sks[5] = expand_step256b(sks[3], x86._mm_aeskeygenassist_si128(sks[4], 0x02)) - sks[6] = expand_step128(sks[4], x86._mm_aeskeygenassist_si128(sks[5], 0x04)) - sks[7] = expand_step256b(sks[5], x86._mm_aeskeygenassist_si128(sks[6], 0x04)) - sks[8] = expand_step128(sks[6], x86._mm_aeskeygenassist_si128(sks[7], 0x08)) - sks[9] = expand_step256b(sks[7], x86._mm_aeskeygenassist_si128(sks[8], 0x08)) - sks[10] = expand_step128(sks[8], x86._mm_aeskeygenassist_si128(sks[9], 0x10)) - sks[11] = expand_step256b(sks[9], x86._mm_aeskeygenassist_si128(sks[10], 0x10)) - sks[12] = expand_step128(sks[10], x86._mm_aeskeygenassist_si128(sks[11], 0x20)) - sks[13] = expand_step256b(sks[11], x86._mm_aeskeygenassist_si128(sks[12], 0x20)) - sks[14] = expand_step128(sks[12], x86._mm_aeskeygenassist_si128(sks[13], 0x40)) - num_rounds = _aes.ROUNDS_256 - case: - panic("crypto/aes: invalid AES key size") - } - for i in 0 ..= num_rounds { - intrinsics.unaligned_store((^x86.__m128i)(&ctx._sk_exp_enc[i]), sks[i]) - } - - // Compute the decryption keys. GCM and CTR do not need this, however - // ECB, CBC, OCB3, etc do. - derive_dec_keys(ctx, &sks, num_rounds) - - ctx._num_rounds = num_rounds - - crypto.zero_explicit(&sks, size_of(sks)) -} diff --git a/core/crypto/aes/aes_gcm_hw_intel.odin b/core/crypto/aes/aes_gcm_hw_intel.odin index c6e564773..75c97be80 100644 --- a/core/crypto/aes/aes_gcm_hw_intel.odin +++ b/core/crypto/aes/aes_gcm_hw_intel.odin @@ -4,7 +4,7 @@ package aes import "base:intrinsics" import "core:crypto" import "core:crypto/_aes" -import "core:crypto/_aes/hw_intel" +import aes_hw "core:crypto/_aes/hw" import "core:encoding/endian" import "core:simd/x86" @@ -17,7 +17,7 @@ gcm_seal_hw :: proc(ctx: ^Context_Impl_Hardware, dst, tag, iv, aad, plaintext: [ init_ghash_hw(ctx, &h, &j0, &j0_enc, iv) // Note: Our GHASH implementation handles appending padding. - hw_intel.ghash(s[:], h[:], aad) + aes_hw.ghash(s[:], h[:], aad) gctr_hw(ctx, dst, &s, plaintext, &h, &j0, true) final_ghash_hw(&s, &h, &j0_enc, len(aad), len(plaintext)) copy(tag, s[:]) @@ -35,7 +35,7 @@ gcm_open_hw :: proc(ctx: ^Context_Impl_Hardware, dst, iv, aad, ciphertext, tag: s: [_aes.GHASH_TAG_SIZE]byte init_ghash_hw(ctx, &h, &j0, &j0_enc, iv) - hw_intel.ghash(s[:], h[:], aad) + aes_hw.ghash(s[:], h[:], aad) gctr_hw(ctx, dst, &s, ciphertext, &h, &j0, false) final_ghash_hw(&s, &h, &j0_enc, len(aad), len(ciphertext)) @@ -71,11 +71,11 @@ init_ghash_hw :: proc( } else { // If len(IV) != 96, then let s = 128 ceil(len(IV)/128) - len(IV), // and let J0 = GHASHH(IV || 0^(s+64) || ceil(len(IV))^64). - hw_intel.ghash(j0[:], h[:], iv) + aes_hw.ghash(j0[:], h[:], iv) tmp: [_aes.GHASH_BLOCK_SIZE]byte endian.unchecked_put_u64be(tmp[8:], u64(l) * 8) - hw_intel.ghash(j0[:], h[:], tmp[:]) + aes_hw.ghash(j0[:], h[:], tmp[:]) } // ECB encrypt j0, so that we can just XOR with the tag. @@ -94,7 +94,7 @@ final_ghash_hw :: proc( endian.unchecked_put_u64be(blk[0:], u64(a_len) * 8) endian.unchecked_put_u64be(blk[8:], u64(t_len) * 8) - hw_intel.ghash(s[:], h[:], blk[:]) + aes_hw.ghash(s[:], h[:], blk[:]) j0_vec := intrinsics.unaligned_load((^x86.__m128i)(j0)) s_vec := intrinsics.unaligned_load((^x86.__m128i)(s)) s_vec = x86._mm_xor_si128(s_vec, j0_vec) @@ -131,7 +131,7 @@ gctr_hw :: proc( nr_blocks := len(src) / BLOCK_SIZE for nr_blocks >= CTR_STRIDE_HW { if !is_seal { - hw_intel.ghash(s[:], h[:], src[:CTR_STRIDE_BYTES_HW]) + aes_hw.ghash(s[:], h[:], src[:CTR_STRIDE_BYTES_HW]) } #unroll for i in 0 ..< CTR_STRIDE_HW { @@ -174,7 +174,7 @@ gctr_hw :: proc( xor_blocks_hw(dst, src, blks[:]) if is_seal { - hw_intel.ghash(s[:], h[:], dst[:CTR_STRIDE_BYTES_HW]) + aes_hw.ghash(s[:], h[:], dst[:CTR_STRIDE_BYTES_HW]) } src = src[CTR_STRIDE_BYTES_HW:] @@ -186,7 +186,7 @@ gctr_hw :: proc( for n := len(src); n > 0; { l := min(n, BLOCK_SIZE) if !is_seal { - hw_intel.ghash(s[:], h[:], src[:l]) + aes_hw.ghash(s[:], h[:], src[:l]) } blks[0], ctr = hw_inc_ctr32(&ctr_blk, ctr) @@ -219,7 +219,7 @@ gctr_hw :: proc( copy(dst, blk[:l]) } if is_seal { - hw_intel.ghash(s[:], h[:], dst[:l]) + aes_hw.ghash(s[:], h[:], dst[:l]) } dst = dst[l:] diff --git a/core/crypto/aes/aes_impl_hw_intel.odin b/core/crypto/aes/aes_impl_hw_intel.odin index 96a1811f3..fe3849eda 100644 --- a/core/crypto/aes/aes_impl_hw_intel.odin +++ b/core/crypto/aes/aes_impl_hw_intel.odin @@ -1,18 +1,18 @@ #+build amd64 package aes -import "core:crypto/_aes/hw_intel" +import aes_hw "core:crypto/_aes/hw" // is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AES // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { - return hw_intel.is_supported() + return aes_hw.is_supported() } @(private) -Context_Impl_Hardware :: hw_intel.Context +Context_Impl_Hardware :: aes_hw.Context @(private, enable_target_feature = "sse2,aes") init_impl_hw :: proc(ctx: ^Context_Impl_Hardware, key: []byte) { - hw_intel.init(ctx, key) + aes_hw.init(ctx, key) } From df1a9661008607f0cb3612cd0b3d78ad0787ceb3 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Thu, 12 Mar 2026 22:06:22 +0900 Subject: [PATCH 107/273] core/crypto/aegis: Migrate to generic SIMD + HW AES --- core/crypto/aegis/aegis_impl_hw.odin | 397 +++++++++++++++++++++ core/crypto/aegis/aegis_impl_hw_gen.odin | 2 + core/crypto/aegis/aegis_impl_hw_intel.odin | 389 -------------------- 3 files changed, 399 insertions(+), 389 deletions(-) create mode 100644 core/crypto/aegis/aegis_impl_hw.odin delete mode 100644 core/crypto/aegis/aegis_impl_hw_intel.odin diff --git a/core/crypto/aegis/aegis_impl_hw.odin b/core/crypto/aegis/aegis_impl_hw.odin new file mode 100644 index 000000000..4a39b341c --- /dev/null +++ b/core/crypto/aegis/aegis_impl_hw.odin @@ -0,0 +1,397 @@ +#+build amd64,arm64,arm32 +package aegis + +import "base:intrinsics" +import "core:crypto" +import aes_hw "core:crypto/_aes/hw" +import "core:encoding/endian" +import "core:simd" + +@(private) +State_HW :: struct { + s0: simd.u8x16, + s1: simd.u8x16, + s2: simd.u8x16, + s3: simd.u8x16, + s4: simd.u8x16, + s5: simd.u8x16, + s6: simd.u8x16, + s7: simd.u8x16, + rate: int, +} + +when ODIN_ARCH == .amd64 { + @(private="file") + TARGET_FEATURES :: "sse2,aes" +} else when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32 { + @(private="file") + TARGET_FEATURES :: "neon,aes" +} + +// is_hardware_accelerated returns true if and only if (⟺) hardware +// accelerated AEGIS is supported. +is_hardware_accelerated :: proc "contextless" () -> bool { + return aes_hw.is_supported() +} + +@(private, enable_target_feature = TARGET_FEATURES) +init_hw :: proc "contextless" (ctx: ^Context, st: ^State_HW, iv: []byte) { + switch ctx._key_len { + case KEY_SIZE_128L: + key := intrinsics.unaligned_load((^simd.u8x16)(&ctx._key[0])) + iv := intrinsics.unaligned_load((^simd.u8x16)(raw_data(iv))) + + st.s0 = simd.bit_xor(key, iv) + st.s1 = intrinsics.unaligned_load((^simd.u8x16)(&_C1[0])) + st.s2 = intrinsics.unaligned_load((^simd.u8x16)(&_C0[0])) + st.s3 = st.s1 + st.s4 = st.s0 + st.s5 = simd.bit_xor(key, st.s2) // key ^ C0 + st.s6 = simd.bit_xor(key, st.s1) // key ^ C1 + st.s7 = st.s5 + st.rate = _RATE_128L + + for _ in 0 ..< 10 { + update_hw_128l(st, iv, key) + } + case KEY_SIZE_256: + k0 := intrinsics.unaligned_load((^simd.u8x16)(&ctx._key[0])) + k1 := intrinsics.unaligned_load((^simd.u8x16)(&ctx._key[16])) + n0 := intrinsics.unaligned_load((^simd.u8x16)(&iv[0])) + n1 := intrinsics.unaligned_load((^simd.u8x16)(&iv[16])) + + st.s0 = simd.bit_xor(k0, n0) + st.s1 = simd.bit_xor(k1, n1) + st.s2 = intrinsics.unaligned_load((^simd.u8x16)(&_C1[0])) + st.s3 = intrinsics.unaligned_load((^simd.u8x16)(&_C0[0])) + st.s4 = simd.bit_xor(k0, st.s3) // k0 ^ C0 + st.s5 = simd.bit_xor(k1, st.s2) // k1 ^ C1 + st.rate = _RATE_256 + + u0, u1 := st.s0, st.s1 + for _ in 0 ..< 4 { + update_hw_256(st, k0) + update_hw_256(st, k1) + update_hw_256(st, u0) + update_hw_256(st, u1) + } + } +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +update_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, m0, m1: simd.u8x16) { + s0_ := aes_hw.aesenc(st.s7, simd.bit_xor(st.s0, m0)) + s1_ := aes_hw.aesenc(st.s0, st.s1) + s2_ := aes_hw.aesenc(st.s1, st.s2) + s3_ := aes_hw.aesenc(st.s2, st.s3) + s4_ := aes_hw.aesenc(st.s3, simd.bit_xor(st.s4, m1)) + s5_ := aes_hw.aesenc(st.s4, st.s5) + s6_ := aes_hw.aesenc(st.s5, st.s6) + s7_ := aes_hw.aesenc(st.s6, st.s7) + st.s0, st.s1, st.s2, st.s3, st.s4, st.s5, st.s6, st.s7 = s0_, s1_, s2_, s3_, s4_, s5_, s6_, s7_ +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +update_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, m: simd.u8x16) { + s0_ := aes_hw.aesenc(st.s5, simd.bit_xor(st.s0, m)) + s1_ := aes_hw.aesenc(st.s0, st.s1) + s2_ := aes_hw.aesenc(st.s1, st.s2) + s3_ := aes_hw.aesenc(st.s2, st.s3) + s4_ := aes_hw.aesenc(st.s3, st.s4) + s5_ := aes_hw.aesenc(st.s4, st.s5) + st.s0, st.s1, st.s2, st.s3, st.s4, st.s5 = s0_, s1_, s2_, s3_, s4_, s5_ +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +absorb_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, ai: []byte) { + t0 := intrinsics.unaligned_load((^simd.u8x16)(&ai[0])) + t1 := intrinsics.unaligned_load((^simd.u8x16)(&ai[16])) + update_hw_128l(st, t0, t1) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +absorb_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, ai: []byte) { + m := intrinsics.unaligned_load((^simd.u8x16)(&ai[0])) + update_hw_256(st, m) +} + +@(private, enable_target_feature = TARGET_FEATURES) +absorb_hw :: proc "contextless" (st: ^State_HW, aad: []byte) #no_bounds_check { + ai, l := aad, len(aad) + + switch st.rate { + case _RATE_128L: + for l >= _RATE_128L { + absorb_hw_128l(st, ai) + ai = ai[_RATE_128L:] + l -= _RATE_128L + } + case _RATE_256: + for l >= _RATE_256 { + absorb_hw_256(st, ai) + + ai = ai[_RATE_256:] + l -= _RATE_256 + } + } + + // Pad out the remainder with `0`s till it is rate sized. + if l > 0 { + tmp: [_RATE_MAX]byte // AAD is not confidential. + copy(tmp[:], ai) + switch st.rate { + case _RATE_128L: + absorb_hw_128l(st, tmp[:]) + case _RATE_256: + absorb_hw_256(st, tmp[:]) + } + } +} + +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) +z_hw_128l :: #force_inline proc "contextless" (st: ^State_HW) -> (simd.u8x16, simd.u8x16) { + z0 := simd.bit_xor( + st.s6, + simd.bit_xor( + st.s1, + simd.bit_and(st.s2, st.s3), + ), + ) + z1 := simd.bit_xor( + st.s2, + simd.bit_xor( + st.s5, + simd.bit_and(st.s6, st.s7), + ), + ) + return z0, z1 +} + +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) +z_hw_256 :: #force_inline proc "contextless" (st: ^State_HW) -> simd.u8x16 { + return simd.bit_xor( + st.s1, + simd.bit_xor( + st.s4, + simd.bit_xor( + st.s5, + simd.bit_and(st.s2, st.s3), + ), + ), + ) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +enc_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, ci, xi: []byte) #no_bounds_check { + z0, z1 := z_hw_128l(st) + + t0 := intrinsics.unaligned_load((^simd.u8x16)(&xi[0])) + t1 := intrinsics.unaligned_load((^simd.u8x16)(&xi[16])) + update_hw_128l(st, t0, t1) + + out0 := simd.bit_xor(t0, z0) + out1 := simd.bit_xor(t1, z1) + intrinsics.unaligned_store((^simd.u8x16)(&ci[0]), out0) + intrinsics.unaligned_store((^simd.u8x16)(&ci[16]), out1) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +enc_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, ci, xi: []byte) #no_bounds_check { + z := z_hw_256(st) + + xi_ := intrinsics.unaligned_load((^simd.u8x16)(raw_data(xi))) + update_hw_256(st, xi_) + + ci_ := simd.bit_xor(xi_, z) + intrinsics.unaligned_store((^simd.u8x16)(raw_data(ci)), ci_) +} + +@(private, enable_target_feature = TARGET_FEATURES) +enc_hw :: proc "contextless" (st: ^State_HW, dst, src: []byte) #no_bounds_check { + ci, xi, l := dst, src, len(src) + + switch st.rate { + case _RATE_128L: + for l >= _RATE_128L { + enc_hw_128l(st, ci, xi) + ci = ci[_RATE_128L:] + xi = xi[_RATE_128L:] + l -= _RATE_128L + } + case _RATE_256: + for l >= _RATE_256 { + enc_hw_256(st, ci, xi) + ci = ci[_RATE_256:] + xi = xi[_RATE_256:] + l -= _RATE_256 + } + } + + // Pad out the remainder with `0`s till it is rate sized. + if l > 0 { + tmp: [_RATE_MAX]byte // Ciphertext is not confidential. + copy(tmp[:], xi) + switch st.rate { + case _RATE_128L: + enc_hw_128l(st, tmp[:], tmp[:]) + case _RATE_256: + enc_hw_256(st, tmp[:], tmp[:]) + } + copy(ci, tmp[:l]) + } +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +dec_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, xi, ci: []byte) #no_bounds_check { + z0, z1 := z_hw_128l(st) + + t0 := intrinsics.unaligned_load((^simd.u8x16)(&ci[0])) + t1 := intrinsics.unaligned_load((^simd.u8x16)(&ci[16])) + out0 := simd.bit_xor(t0, z0) + out1 := simd.bit_xor(t1, z1) + + update_hw_128l(st, out0, out1) + intrinsics.unaligned_store((^simd.u8x16)(&xi[0]), out0) + intrinsics.unaligned_store((^simd.u8x16)(&xi[16]), out1) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +dec_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, xi, ci: []byte) #no_bounds_check { + z := z_hw_256(st) + + ci_ := intrinsics.unaligned_load((^simd.u8x16)(raw_data(ci))) + xi_ := simd.bit_xor(ci_, z) + + update_hw_256(st, xi_) + intrinsics.unaligned_store((^simd.u8x16)(raw_data(xi)), xi_) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +dec_partial_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: []byte) #no_bounds_check { + tmp: [_RATE_128L]byte + defer crypto.zero_explicit(&tmp, size_of(tmp)) + + z0, z1 := z_hw_128l(st) + copy(tmp[:], cn) + + t0 := intrinsics.unaligned_load((^simd.u8x16)(&tmp[0])) + t1 := intrinsics.unaligned_load((^simd.u8x16)(&tmp[16])) + out0 := simd.bit_xor(t0, z0) + out1 := simd.bit_xor(t1, z1) + + intrinsics.unaligned_store((^simd.u8x16)(&tmp[0]), out0) + intrinsics.unaligned_store((^simd.u8x16)(&tmp[16]), out1) + copy(xn, tmp[:]) + + for off := len(xn); off < _RATE_128L; off += 1 { + tmp[off] = 0 + } + out0 = intrinsics.unaligned_load((^simd.u8x16)(&tmp[0])) // v0 + out1 = intrinsics.unaligned_load((^simd.u8x16)(&tmp[16])) // v1 + update_hw_128l(st, out0, out1) +} + +@(private = "file", enable_target_feature = TARGET_FEATURES) +dec_partial_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: []byte) #no_bounds_check { + tmp: [_RATE_256]byte + defer crypto.zero_explicit(&tmp, size_of(tmp)) + + z := z_hw_256(st) + copy(tmp[:], cn) + + cn_ := intrinsics.unaligned_load((^simd.u8x16)(&tmp[0])) + xn_ := simd.bit_xor(cn_, z) + + intrinsics.unaligned_store((^simd.u8x16)(&tmp[0]), xn_) + copy(xn, tmp[:]) + + for off := len(xn); off < _RATE_256; off += 1 { + tmp[off] = 0 + } + xn_ = intrinsics.unaligned_load((^simd.u8x16)(&tmp[0])) + update_hw_256(st, xn_) +} + +@(private, enable_target_feature = TARGET_FEATURES) +dec_hw :: proc "contextless" (st: ^State_HW, dst, src: []byte) #no_bounds_check { + xi, ci, l := dst, src, len(src) + + switch st.rate { + case _RATE_128L: + for l >= _RATE_128L { + dec_hw_128l(st, xi, ci) + xi = xi[_RATE_128L:] + ci = ci[_RATE_128L:] + l -= _RATE_128L + } + case _RATE_256: + for l >= _RATE_256 { + dec_hw_256(st, xi, ci) + xi = xi[_RATE_256:] + ci = ci[_RATE_256:] + l -= _RATE_256 + } + } + + // Process the remainder. + if l > 0 { + switch st.rate { + case _RATE_128L: + dec_partial_hw_128l(st, xi, ci) + case _RATE_256: + dec_partial_hw_256(st, xi, ci) + } + } +} + +@(private, enable_target_feature = TARGET_FEATURES) +finalize_hw :: proc "contextless" (st: ^State_HW, tag: []byte, ad_len, msg_len: int) { + tmp: [16]byte + endian.unchecked_put_u64le(tmp[0:], u64(ad_len) * 8) + endian.unchecked_put_u64le(tmp[8:], u64(msg_len) * 8) + + t := intrinsics.unaligned_load((^simd.u8x16)(&tmp[0])) + + t0, t1: simd.u8x16 = ---, --- + switch st.rate { + case _RATE_128L: + t = simd.bit_xor(st.s2, t) + for _ in 0 ..< 7 { + update_hw_128l(st, t, t) + } + + t0 = simd.bit_xor(st.s0, st.s1) + t0 = simd.bit_xor(t0, st.s2) + t0 = simd.bit_xor(t0, st.s3) + + t1 = simd.bit_xor(st.s4, st.s5) + t1 = simd.bit_xor(t1, st.s6) + if len(tag) == TAG_SIZE_256 { + t1 = simd.bit_xor(t1, st.s7) + } + case _RATE_256: + t = simd.bit_xor(st.s3, t) + for _ in 0 ..< 7 { + update_hw_256(st, t) + } + + t0 = simd.bit_xor(st.s0, st.s1) + t0 = simd.bit_xor(t0, st.s2) + + t1 = simd.bit_xor(st.s3, st.s4) + t1 = simd.bit_xor(t1, st.s5) + } + switch len(tag) { + case TAG_SIZE_128: + t0 = simd.bit_xor(t0, t1) + intrinsics.unaligned_store((^simd.u8x16)(&tag[0]), t0) + case TAG_SIZE_256: + intrinsics.unaligned_store((^simd.u8x16)(&tag[0]), t0) + intrinsics.unaligned_store((^simd.u8x16)(&tag[16]), t1) + } +} + +@(private) +reset_state_hw :: proc "contextless" (st: ^State_HW) { + crypto.zero_explicit(st, size_of(st^)) +} diff --git a/core/crypto/aegis/aegis_impl_hw_gen.odin b/core/crypto/aegis/aegis_impl_hw_gen.odin index db38e71bc..8f8b4c5da 100644 --- a/core/crypto/aegis/aegis_impl_hw_gen.odin +++ b/core/crypto/aegis/aegis_impl_hw_gen.odin @@ -1,4 +1,6 @@ #+build !amd64 +#+build !arm64 +#+build !arm32 package aegis @(private = "file") diff --git a/core/crypto/aegis/aegis_impl_hw_intel.odin b/core/crypto/aegis/aegis_impl_hw_intel.odin deleted file mode 100644 index 8b767908c..000000000 --- a/core/crypto/aegis/aegis_impl_hw_intel.odin +++ /dev/null @@ -1,389 +0,0 @@ -#+build amd64 -package aegis - -import "base:intrinsics" -import "core:crypto" -import "core:crypto/aes" -import "core:encoding/endian" -import "core:simd/x86" - -@(private) -State_HW :: struct { - s0: x86.__m128i, - s1: x86.__m128i, - s2: x86.__m128i, - s3: x86.__m128i, - s4: x86.__m128i, - s5: x86.__m128i, - s6: x86.__m128i, - s7: x86.__m128i, - rate: int, -} - -// is_hardware_accelerated returns true if and only if (⟺) hardware accelerated AEGIS -// is supported. -is_hardware_accelerated :: proc "contextless" () -> bool { - return aes.is_hardware_accelerated() -} - -@(private, enable_target_feature = "sse2,aes") -init_hw :: proc "contextless" (ctx: ^Context, st: ^State_HW, iv: []byte) { - switch ctx._key_len { - case KEY_SIZE_128L: - key := intrinsics.unaligned_load((^x86.__m128i)(&ctx._key[0])) - iv := intrinsics.unaligned_load((^x86.__m128i)(raw_data(iv))) - - st.s0 = x86._mm_xor_si128(key, iv) - st.s1 = intrinsics.unaligned_load((^x86.__m128i)(&_C1[0])) - st.s2 = intrinsics.unaligned_load((^x86.__m128i)(&_C0[0])) - st.s3 = st.s1 - st.s4 = st.s0 - st.s5 = x86._mm_xor_si128(key, st.s2) // key ^ C0 - st.s6 = x86._mm_xor_si128(key, st.s1) // key ^ C1 - st.s7 = st.s5 - st.rate = _RATE_128L - - for _ in 0 ..< 10 { - update_hw_128l(st, iv, key) - } - case KEY_SIZE_256: - k0 := intrinsics.unaligned_load((^x86.__m128i)(&ctx._key[0])) - k1 := intrinsics.unaligned_load((^x86.__m128i)(&ctx._key[16])) - n0 := intrinsics.unaligned_load((^x86.__m128i)(&iv[0])) - n1 := intrinsics.unaligned_load((^x86.__m128i)(&iv[16])) - - st.s0 = x86._mm_xor_si128(k0, n0) - st.s1 = x86._mm_xor_si128(k1, n1) - st.s2 = intrinsics.unaligned_load((^x86.__m128i)(&_C1[0])) - st.s3 = intrinsics.unaligned_load((^x86.__m128i)(&_C0[0])) - st.s4 = x86._mm_xor_si128(k0, st.s3) // k0 ^ C0 - st.s5 = x86._mm_xor_si128(k1, st.s2) // k1 ^ C1 - st.rate = _RATE_256 - - u0, u1 := st.s0, st.s1 - for _ in 0 ..< 4 { - update_hw_256(st, k0) - update_hw_256(st, k1) - update_hw_256(st, u0) - update_hw_256(st, u1) - } - } -} - -@(private = "file", enable_target_feature = "sse2,aes") -update_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, m0, m1: x86.__m128i) { - s0_ := x86._mm_aesenc_si128(st.s7, x86._mm_xor_si128(st.s0, m0)) - s1_ := x86._mm_aesenc_si128(st.s0, st.s1) - s2_ := x86._mm_aesenc_si128(st.s1, st.s2) - s3_ := x86._mm_aesenc_si128(st.s2, st.s3) - s4_ := x86._mm_aesenc_si128(st.s3, x86._mm_xor_si128(st.s4, m1)) - s5_ := x86._mm_aesenc_si128(st.s4, st.s5) - s6_ := x86._mm_aesenc_si128(st.s5, st.s6) - s7_ := x86._mm_aesenc_si128(st.s6, st.s7) - st.s0, st.s1, st.s2, st.s3, st.s4, st.s5, st.s6, st.s7 = s0_, s1_, s2_, s3_, s4_, s5_, s6_, s7_ -} - -@(private = "file", enable_target_feature = "sse2,aes") -update_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, m: x86.__m128i) { - s0_ := x86._mm_aesenc_si128(st.s5, x86._mm_xor_si128(st.s0, m)) - s1_ := x86._mm_aesenc_si128(st.s0, st.s1) - s2_ := x86._mm_aesenc_si128(st.s1, st.s2) - s3_ := x86._mm_aesenc_si128(st.s2, st.s3) - s4_ := x86._mm_aesenc_si128(st.s3, st.s4) - s5_ := x86._mm_aesenc_si128(st.s4, st.s5) - st.s0, st.s1, st.s2, st.s3, st.s4, st.s5 = s0_, s1_, s2_, s3_, s4_, s5_ -} - -@(private = "file", enable_target_feature = "sse2,aes") -absorb_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, ai: []byte) { - t0 := intrinsics.unaligned_load((^x86.__m128i)(&ai[0])) - t1 := intrinsics.unaligned_load((^x86.__m128i)(&ai[16])) - update_hw_128l(st, t0, t1) -} - -@(private = "file", enable_target_feature = "sse2,aes") -absorb_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, ai: []byte) { - m := intrinsics.unaligned_load((^x86.__m128i)(&ai[0])) - update_hw_256(st, m) -} - -@(private, enable_target_feature = "sse2,aes") -absorb_hw :: proc "contextless" (st: ^State_HW, aad: []byte) #no_bounds_check { - ai, l := aad, len(aad) - - switch st.rate { - case _RATE_128L: - for l >= _RATE_128L { - absorb_hw_128l(st, ai) - ai = ai[_RATE_128L:] - l -= _RATE_128L - } - case _RATE_256: - for l >= _RATE_256 { - absorb_hw_256(st, ai) - - ai = ai[_RATE_256:] - l -= _RATE_256 - } - } - - // Pad out the remainder with `0`s till it is rate sized. - if l > 0 { - tmp: [_RATE_MAX]byte // AAD is not confidential. - copy(tmp[:], ai) - switch st.rate { - case _RATE_128L: - absorb_hw_128l(st, tmp[:]) - case _RATE_256: - absorb_hw_256(st, tmp[:]) - } - } -} - -@(private = "file", enable_target_feature = "sse2", require_results) -z_hw_128l :: #force_inline proc "contextless" (st: ^State_HW) -> (x86.__m128i, x86.__m128i) { - z0 := x86._mm_xor_si128( - st.s6, - x86._mm_xor_si128( - st.s1, - x86._mm_and_si128(st.s2, st.s3), - ), - ) - z1 := x86._mm_xor_si128( - st.s2, - x86._mm_xor_si128( - st.s5, - x86._mm_and_si128(st.s6, st.s7), - ), - ) - return z0, z1 -} - -@(private = "file", enable_target_feature = "sse2", require_results) -z_hw_256 :: #force_inline proc "contextless" (st: ^State_HW) -> x86.__m128i { - return x86._mm_xor_si128( - st.s1, - x86._mm_xor_si128( - st.s4, - x86._mm_xor_si128( - st.s5, - x86._mm_and_si128(st.s2, st.s3), - ), - ), - ) -} - -@(private = "file", enable_target_feature = "sse2,aes") -enc_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, ci, xi: []byte) #no_bounds_check { - z0, z1 := z_hw_128l(st) - - t0 := intrinsics.unaligned_load((^x86.__m128i)(&xi[0])) - t1 := intrinsics.unaligned_load((^x86.__m128i)(&xi[16])) - update_hw_128l(st, t0, t1) - - out0 := x86._mm_xor_si128(t0, z0) - out1 := x86._mm_xor_si128(t1, z1) - intrinsics.unaligned_store((^x86.__m128i)(&ci[0]), out0) - intrinsics.unaligned_store((^x86.__m128i)(&ci[16]), out1) -} - -@(private = "file", enable_target_feature = "sse2,aes") -enc_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, ci, xi: []byte) #no_bounds_check { - z := z_hw_256(st) - - xi_ := intrinsics.unaligned_load((^x86.__m128i)(raw_data(xi))) - update_hw_256(st, xi_) - - ci_ := x86._mm_xor_si128(xi_, z) - intrinsics.unaligned_store((^x86.__m128i)(raw_data(ci)), ci_) -} - -@(private, enable_target_feature = "sse2,aes") -enc_hw :: proc "contextless" (st: ^State_HW, dst, src: []byte) #no_bounds_check { - ci, xi, l := dst, src, len(src) - - switch st.rate { - case _RATE_128L: - for l >= _RATE_128L { - enc_hw_128l(st, ci, xi) - ci = ci[_RATE_128L:] - xi = xi[_RATE_128L:] - l -= _RATE_128L - } - case _RATE_256: - for l >= _RATE_256 { - enc_hw_256(st, ci, xi) - ci = ci[_RATE_256:] - xi = xi[_RATE_256:] - l -= _RATE_256 - } - } - - // Pad out the remainder with `0`s till it is rate sized. - if l > 0 { - tmp: [_RATE_MAX]byte // Ciphertext is not confidential. - copy(tmp[:], xi) - switch st.rate { - case _RATE_128L: - enc_hw_128l(st, tmp[:], tmp[:]) - case _RATE_256: - enc_hw_256(st, tmp[:], tmp[:]) - } - copy(ci, tmp[:l]) - } -} - -@(private = "file", enable_target_feature = "sse2,aes") -dec_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, xi, ci: []byte) #no_bounds_check { - z0, z1 := z_hw_128l(st) - - t0 := intrinsics.unaligned_load((^x86.__m128i)(&ci[0])) - t1 := intrinsics.unaligned_load((^x86.__m128i)(&ci[16])) - out0 := x86._mm_xor_si128(t0, z0) - out1 := x86._mm_xor_si128(t1, z1) - - update_hw_128l(st, out0, out1) - intrinsics.unaligned_store((^x86.__m128i)(&xi[0]), out0) - intrinsics.unaligned_store((^x86.__m128i)(&xi[16]), out1) -} - -@(private = "file", enable_target_feature = "sse2,aes") -dec_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, xi, ci: []byte) #no_bounds_check { - z := z_hw_256(st) - - ci_ := intrinsics.unaligned_load((^x86.__m128i)(raw_data(ci))) - xi_ := x86._mm_xor_si128(ci_, z) - - update_hw_256(st, xi_) - intrinsics.unaligned_store((^x86.__m128i)(raw_data(xi)), xi_) -} - -@(private = "file", enable_target_feature = "sse2,aes") -dec_partial_hw_128l :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: []byte) #no_bounds_check { - tmp: [_RATE_128L]byte - defer crypto.zero_explicit(&tmp, size_of(tmp)) - - z0, z1 := z_hw_128l(st) - copy(tmp[:], cn) - - t0 := intrinsics.unaligned_load((^x86.__m128i)(&tmp[0])) - t1 := intrinsics.unaligned_load((^x86.__m128i)(&tmp[16])) - out0 := x86._mm_xor_si128(t0, z0) - out1 := x86._mm_xor_si128(t1, z1) - - intrinsics.unaligned_store((^x86.__m128i)(&tmp[0]), out0) - intrinsics.unaligned_store((^x86.__m128i)(&tmp[16]), out1) - copy(xn, tmp[:]) - - for off := len(xn); off < _RATE_128L; off += 1 { - tmp[off] = 0 - } - out0 = intrinsics.unaligned_load((^x86.__m128i)(&tmp[0])) // v0 - out1 = intrinsics.unaligned_load((^x86.__m128i)(&tmp[16])) // v1 - update_hw_128l(st, out0, out1) -} - -@(private = "file", enable_target_feature = "sse2,aes") -dec_partial_hw_256 :: #force_inline proc "contextless" (st: ^State_HW, xn, cn: []byte) #no_bounds_check { - tmp: [_RATE_256]byte - defer crypto.zero_explicit(&tmp, size_of(tmp)) - - z := z_hw_256(st) - copy(tmp[:], cn) - - cn_ := intrinsics.unaligned_load((^x86.__m128i)(&tmp[0])) - xn_ := x86._mm_xor_si128(cn_, z) - - intrinsics.unaligned_store((^x86.__m128i)(&tmp[0]), xn_) - copy(xn, tmp[:]) - - for off := len(xn); off < _RATE_256; off += 1 { - tmp[off] = 0 - } - xn_ = intrinsics.unaligned_load((^x86.__m128i)(&tmp[0])) - update_hw_256(st, xn_) -} - -@(private, enable_target_feature = "sse2,aes") -dec_hw :: proc "contextless" (st: ^State_HW, dst, src: []byte) #no_bounds_check { - xi, ci, l := dst, src, len(src) - - switch st.rate { - case _RATE_128L: - for l >= _RATE_128L { - dec_hw_128l(st, xi, ci) - xi = xi[_RATE_128L:] - ci = ci[_RATE_128L:] - l -= _RATE_128L - } - case _RATE_256: - for l >= _RATE_256 { - dec_hw_256(st, xi, ci) - xi = xi[_RATE_256:] - ci = ci[_RATE_256:] - l -= _RATE_256 - } - } - - // Process the remainder. - if l > 0 { - switch st.rate { - case _RATE_128L: - dec_partial_hw_128l(st, xi, ci) - case _RATE_256: - dec_partial_hw_256(st, xi, ci) - } - } -} - -@(private, enable_target_feature = "sse2,aes") -finalize_hw :: proc "contextless" (st: ^State_HW, tag: []byte, ad_len, msg_len: int) { - tmp: [16]byte - endian.unchecked_put_u64le(tmp[0:], u64(ad_len) * 8) - endian.unchecked_put_u64le(tmp[8:], u64(msg_len) * 8) - - t := intrinsics.unaligned_load((^x86.__m128i)(&tmp[0])) - - t0, t1: x86.__m128i = ---, --- - switch st.rate { - case _RATE_128L: - t = x86._mm_xor_si128(st.s2, t) - for _ in 0 ..< 7 { - update_hw_128l(st, t, t) - } - - t0 = x86._mm_xor_si128(st.s0, st.s1) - t0 = x86._mm_xor_si128(t0, st.s2) - t0 = x86._mm_xor_si128(t0, st.s3) - - t1 = x86._mm_xor_si128(st.s4, st.s5) - t1 = x86._mm_xor_si128(t1, st.s6) - if len(tag) == TAG_SIZE_256 { - t1 = x86._mm_xor_si128(t1, st.s7) - } - case _RATE_256: - t = x86._mm_xor_si128(st.s3, t) - for _ in 0 ..< 7 { - update_hw_256(st, t) - } - - t0 = x86._mm_xor_si128(st.s0, st.s1) - t0 = x86._mm_xor_si128(t0, st.s2) - - t1 = x86._mm_xor_si128(st.s3, st.s4) - t1 = x86._mm_xor_si128(t1, st.s5) - } - switch len(tag) { - case TAG_SIZE_128: - t0 = x86._mm_xor_si128(t0, t1) - intrinsics.unaligned_store((^x86.__m128i)(&tag[0]), t0) - case TAG_SIZE_256: - intrinsics.unaligned_store((^x86.__m128i)(&tag[0]), t0) - intrinsics.unaligned_store((^x86.__m128i)(&tag[16]), t1) - } -} - -@(private) -reset_state_hw :: proc "contextless" (st: ^State_HW) { - crypto.zero_explicit(st, size_of(st^)) -} From e09923f585dc11a644a58903044dcec3574c89c7 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Fri, 13 Mar 2026 02:04:41 +0900 Subject: [PATCH 108/273] core/crypto/deoxysii: Migrate to generic SIMD + HW AES --- ...pl_hw_intel.odin => deoxysii_impl_hw.odin} | 241 ++++++++++-------- .../crypto/deoxysii/deoxysii_impl_hw_gen.odin | 2 + 2 files changed, 138 insertions(+), 105 deletions(-) rename core/crypto/deoxysii/{deoxysii_impl_hw_intel.odin => deoxysii_impl_hw.odin} (58%) diff --git a/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin b/core/crypto/deoxysii/deoxysii_impl_hw.odin similarity index 58% rename from core/crypto/deoxysii/deoxysii_impl_hw_intel.odin rename to core/crypto/deoxysii/deoxysii_impl_hw.odin index 88c569d53..47f9ab55f 100644 --- a/core/crypto/deoxysii/deoxysii_impl_hw_intel.odin +++ b/core/crypto/deoxysii/deoxysii_impl_hw.odin @@ -1,152 +1,183 @@ -#+build amd64 +#+build amd64,arm64,arm32 package deoxysii import "base:intrinsics" import "core:crypto" -import "core:crypto/aes" +import aes_hw "core:crypto/_aes/hw" import "core:simd" -import "core:simd/x86" // This processes a maximum of 4 blocks at a time, as that is suitable // for most current hardware that doesn't say "Xeon". +// +// TODO/perf: ARM should be able to do 8 at a time. + +when ODIN_ARCH == .amd64 { + @(private="file") + TARGET_FEATURES :: "sse2,ssse3,aes" +} else when ODIN_ARCH == .arm64 || ODIN_ARCH == .arm32 { + @(private="file") + TARGET_FEATURES :: "neon,aes" +} @(private = "file") -_BIT_ENC :: x86.__m128i{0x80, 0} +_BIT_ENC :: simd.u8x16{0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} @(private = "file") -_PREFIX_AD_BLOCK :: x86.__m128i{PREFIX_AD_BLOCK << PREFIX_SHIFT, 0} +_PREFIX_AD_BLOCK :: simd.u8x16{ + PREFIX_AD_BLOCK << PREFIX_SHIFT, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +} @(private = "file") -_PREFIX_AD_FINAL :: x86.__m128i{PREFIX_AD_FINAL << PREFIX_SHIFT, 0} +_PREFIX_AD_FINAL :: simd.u8x16{ + PREFIX_AD_FINAL << PREFIX_SHIFT, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +} @(private = "file") -_PREFIX_MSG_BLOCK :: x86.__m128i{PREFIX_MSG_BLOCK << PREFIX_SHIFT, 0} +_PREFIX_MSG_BLOCK :: simd.u8x16{ + PREFIX_MSG_BLOCK << PREFIX_SHIFT, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +} @(private = "file") -_PREFIX_MSG_FINAL :: x86.__m128i{PREFIX_MSG_FINAL << PREFIX_SHIFT, 0} +_PREFIX_MSG_FINAL :: simd.u8x16{ + PREFIX_MSG_FINAL << PREFIX_SHIFT, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +} // is_hardware_accelerated returns true if and only if (⟺) hardware accelerated Deoxys-II // is supported. is_hardware_accelerated :: proc "contextless" () -> bool { - return aes.is_hardware_accelerated() + return aes_hw.is_supported() } -@(private = "file", enable_target_feature = "sse4.1", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) auth_tweak :: #force_inline proc "contextless" ( - prefix: x86.__m128i, + prefix: simd.u8x16, block_nr: int, -) -> x86.__m128i { - return x86._mm_insert_epi64(prefix, i64(intrinsics.byte_swap(u64(block_nr))), 1) -} +) -> simd.u8x16 { + when ODIN_ENDIAN == .Little { + block_nr_u64 := intrinsics.byte_swap(u64(block_nr)) + } else { + block_nr_u64 := u64(block_nr) + } -@(private = "file", enable_target_feature = "sse2", require_results) -enc_tweak :: #force_inline proc "contextless" ( - tag: x86.__m128i, - block_nr: int, -) -> x86.__m128i { - return x86._mm_xor_si128( - x86._mm_or_si128(tag, _BIT_ENC), - x86.__m128i{0, i64(intrinsics.byte_swap(u64(block_nr)))}, + return simd.bit_or( + prefix, + transmute(simd.u8x16)(simd.u64x2{0, block_nr_u64}), ) } -@(private = "file", enable_target_feature = "ssse3", require_results) -h_ :: #force_inline proc "contextless" (tk1: x86.__m128i) -> x86.__m128i { - return transmute(x86.__m128i)h(transmute(simd.u8x16)tk1) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) +enc_tweak :: #force_inline proc "contextless" ( + tag: simd.u8x16, + block_nr: int, +) -> simd.u8x16 { + when ODIN_ENDIAN == .Little { + block_nr_u64 := intrinsics.byte_swap(u64(block_nr)) + } else { + block_nr_u64 := u64(block_nr) + } + + return simd.bit_xor( + simd.bit_or(tag, _BIT_ENC), + transmute(simd.u8x16)(simd.u64x2{0, block_nr_u64}), + ) } -@(private = "file", enable_target_feature = "sse2,ssse3,aes", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) bc_x4 :: #force_inline proc "contextless" ( ctx: ^Context, - s_0, s_1, s_2, s_3: x86.__m128i, - tweak_0, tweak_1, tweak_2, tweak_3: x86.__m128i, -) -> (x86.__m128i, x86.__m128i, x86.__m128i, x86.__m128i) #no_bounds_check { + s_0, s_1, s_2, s_3: simd.u8x16, + tweak_0, tweak_1, tweak_2, tweak_3: simd.u8x16, +) -> (simd.u8x16, simd.u8x16, simd.u8x16, simd.u8x16) #no_bounds_check { s_0, s_1, s_2, s_3 := s_0, s_1, s_2, s_3 tk1_0, tk1_1, tk1_2, tk1_3 := tweak_0, tweak_1, tweak_2, tweak_3 - sk := intrinsics.unaligned_load((^x86.__m128i)(&ctx._subkeys[0])) - stk_0 := x86._mm_xor_si128(tk1_0, sk) - stk_1 := x86._mm_xor_si128(tk1_1, sk) - stk_2 := x86._mm_xor_si128(tk1_2, sk) - stk_3 := x86._mm_xor_si128(tk1_3, sk) + sk := intrinsics.unaligned_load((^simd.u8x16)(&ctx._subkeys[0])) + stk_0 := simd.bit_xor(tk1_0, sk) + stk_1 := simd.bit_xor(tk1_1, sk) + stk_2 := simd.bit_xor(tk1_2, sk) + stk_3 := simd.bit_xor(tk1_3, sk) - s_0 = x86._mm_xor_si128(s_0, stk_0) - s_1 = x86._mm_xor_si128(s_1, stk_1) - s_2 = x86._mm_xor_si128(s_2, stk_2) - s_3 = x86._mm_xor_si128(s_3, stk_3) + s_0 = simd.bit_xor(s_0, stk_0) + s_1 = simd.bit_xor(s_1, stk_1) + s_2 = simd.bit_xor(s_2, stk_2) + s_3 = simd.bit_xor(s_3, stk_3) for i in 1 ..= BC_ROUNDS { - sk = intrinsics.unaligned_load((^x86.__m128i)(&ctx._subkeys[i])) + sk = intrinsics.unaligned_load((^simd.u8x16)(&ctx._subkeys[i])) - tk1_0 = h_(tk1_0) - tk1_1 = h_(tk1_1) - tk1_2 = h_(tk1_2) - tk1_3 = h_(tk1_3) + tk1_0 = h(tk1_0) + tk1_1 = h(tk1_1) + tk1_2 = h(tk1_2) + tk1_3 = h(tk1_3) - stk_0 = x86._mm_xor_si128(tk1_0, sk) - stk_1 = x86._mm_xor_si128(tk1_1, sk) - stk_2 = x86._mm_xor_si128(tk1_2, sk) - stk_3 = x86._mm_xor_si128(tk1_3, sk) + stk_0 = simd.bit_xor(tk1_0, sk) + stk_1 = simd.bit_xor(tk1_1, sk) + stk_2 = simd.bit_xor(tk1_2, sk) + stk_3 = simd.bit_xor(tk1_3, sk) - s_0 = x86._mm_aesenc_si128(s_0, stk_0) - s_1 = x86._mm_aesenc_si128(s_1, stk_1) - s_2 = x86._mm_aesenc_si128(s_2, stk_2) - s_3 = x86._mm_aesenc_si128(s_3, stk_3) + s_0 = aes_hw.aesenc(s_0, stk_0) + s_1 = aes_hw.aesenc(s_1, stk_1) + s_2 = aes_hw.aesenc(s_2, stk_2) + s_3 = aes_hw.aesenc(s_3, stk_3) } return s_0, s_1, s_2, s_3 } -@(private = "file", enable_target_feature = "sse2,ssse3,aes", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) bc_x1 :: #force_inline proc "contextless" ( ctx: ^Context, - s: x86.__m128i, - tweak: x86.__m128i, -) -> x86.__m128i #no_bounds_check { + s: simd.u8x16, + tweak: simd.u8x16, +) -> simd.u8x16 #no_bounds_check { s, tk1 := s, tweak - sk := intrinsics.unaligned_load((^x86.__m128i)(&ctx._subkeys[0])) - stk := x86._mm_xor_si128(tk1, sk) + sk := intrinsics.unaligned_load((^simd.u8x16)(&ctx._subkeys[0])) + stk := simd.bit_xor(tk1, sk) - s = x86._mm_xor_si128(s, stk) + s = simd.bit_xor(s, stk) for i in 1 ..= BC_ROUNDS { - sk = intrinsics.unaligned_load((^x86.__m128i)(&ctx._subkeys[i])) + sk = intrinsics.unaligned_load((^simd.u8x16)(&ctx._subkeys[i])) - tk1 = h_(tk1) + tk1 = h(tk1) - stk = x86._mm_xor_si128(tk1, sk) + stk = simd.bit_xor(tk1, sk) - s = x86._mm_aesenc_si128(s, stk) + s = aes_hw.aesenc(s, stk) } return s } -@(private = "file", enable_target_feature = "sse2,ssse3,sse4.1,aes", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) bc_absorb :: proc "contextless" ( ctx: ^Context, - tag: x86.__m128i, + tag: simd.u8x16, src: []byte, - tweak_prefix: x86.__m128i, + tweak_prefix: simd.u8x16, stk_block_nr: int, -) -> (x86.__m128i, int) #no_bounds_check { +) -> (simd.u8x16, int) #no_bounds_check { src, stk_block_nr, tag := src, stk_block_nr, tag nr_blocks := len(src) / BLOCK_SIZE for nr_blocks >= 4 { d_0, d_1, d_2, d_3 := bc_x4( ctx, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))), - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[BLOCK_SIZE:]))), - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[2*BLOCK_SIZE:]))), - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[3*BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[2*BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[3*BLOCK_SIZE:]))), auth_tweak(tweak_prefix, stk_block_nr), auth_tweak(tweak_prefix, stk_block_nr + 1), auth_tweak(tweak_prefix, stk_block_nr + 2), auth_tweak(tweak_prefix, stk_block_nr + 3), ) - tag = x86._mm_xor_si128(tag, d_0) - tag = x86._mm_xor_si128(tag, d_1) - tag = x86._mm_xor_si128(tag, d_2) - tag = x86._mm_xor_si128(tag, d_3) + tag = simd.bit_xor(tag, d_0) + tag = simd.bit_xor(tag, d_1) + tag = simd.bit_xor(tag, d_2) + tag = simd.bit_xor(tag, d_3) src = src[4*BLOCK_SIZE:] stk_block_nr += 4 @@ -156,11 +187,11 @@ bc_absorb :: proc "contextless" ( for nr_blocks > 0 { d := bc_x1( ctx, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))), auth_tweak(tweak_prefix, stk_block_nr), ) - tag = x86._mm_xor_si128(tag, d) + tag = simd.bit_xor(tag, d) src = src[BLOCK_SIZE:] stk_block_nr += 1 @@ -170,29 +201,29 @@ bc_absorb :: proc "contextless" ( return tag, stk_block_nr } -@(private = "file", enable_target_feature = "sse2,ssse3,aes", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) bc_final :: proc "contextless" ( ctx: ^Context, - tag: x86.__m128i, + tag: simd.u8x16, iv: []byte, -) -> x86.__m128i { +) -> simd.u8x16 { tmp: [BLOCK_SIZE]byte tmp[0] = PREFIX_TAG << PREFIX_SHIFT copy(tmp[1:], iv) - tweak := intrinsics.unaligned_load((^x86.__m128i)(&tmp)) + tweak := intrinsics.unaligned_load((^simd.u8x16)(&tmp)) return bc_x1(ctx, tag, tweak) } -@(private = "file", enable_target_feature = "sse2,ssse3,aes", require_results) +@(private = "file", enable_target_feature = TARGET_FEATURES, require_results) bc_encrypt :: proc "contextless" ( ctx: ^Context, dst: []byte, src: []byte, - iv: x86.__m128i, - tweak_tag: x86.__m128i, + iv: simd.u8x16, + tweak_tag: simd.u8x16, stk_block_nr: int, ) -> int { dst, src, stk_block_nr := dst, src, stk_block_nr @@ -209,31 +240,31 @@ bc_encrypt :: proc "contextless" ( ) intrinsics.unaligned_store( - (^x86.__m128i)(raw_data(dst)), - x86._mm_xor_si128( + (^simd.u8x16)(raw_data(dst)), + simd.bit_xor( d_0, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))), ), ) intrinsics.unaligned_store( - (^x86.__m128i)(raw_data(dst[BLOCK_SIZE:])), - x86._mm_xor_si128( + (^simd.u8x16)(raw_data(dst[BLOCK_SIZE:])), + simd.bit_xor( d_1, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[BLOCK_SIZE:]))), ), ) intrinsics.unaligned_store( - (^x86.__m128i)(raw_data(dst[2*BLOCK_SIZE:])), - x86._mm_xor_si128( + (^simd.u8x16)(raw_data(dst[2*BLOCK_SIZE:])), + simd.bit_xor( d_2, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[2*BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[2*BLOCK_SIZE:]))), ), ) intrinsics.unaligned_store( - (^x86.__m128i)(raw_data(dst[3*BLOCK_SIZE:])), - x86._mm_xor_si128( + (^simd.u8x16)(raw_data(dst[3*BLOCK_SIZE:])), + simd.bit_xor( d_3, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[3*BLOCK_SIZE:]))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[3*BLOCK_SIZE:]))), ), ) @@ -250,10 +281,10 @@ bc_encrypt :: proc "contextless" ( ) intrinsics.unaligned_store( - (^x86.__m128i)(raw_data(dst)), - x86._mm_xor_si128( + (^simd.u8x16)(raw_data(dst)), + simd.bit_xor( d, - intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))), + intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))), ), ) @@ -269,7 +300,7 @@ bc_encrypt :: proc "contextless" ( e_hw :: proc "contextless" (ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) #no_bounds_check { tmp: [BLOCK_SIZE]byte copy(tmp[1:], iv) - iv_ := intrinsics.unaligned_load((^x86.__m128i)(raw_data(&tmp))) + iv_ := intrinsics.unaligned_load((^simd.u8x16)(raw_data(&tmp))) // Algorithm 3 // @@ -282,7 +313,7 @@ e_hw :: proc "contextless" (ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) // if A_∗ != nil then // Auth <- Auth ^ EK(0110 || la, pad10∗(A_∗)) // end - auth: x86.__m128i + auth: simd.u8x16 n: int aad := aad @@ -341,14 +372,14 @@ e_hw :: proc "contextless" (ctx: ^Context, dst, tag, iv, aad, plaintext: []byte) copy(dst[n*BLOCK_SIZE:], m_star[:]) } - intrinsics.unaligned_store((^x86.__m128i)(raw_data(tag)), auth) + intrinsics.unaligned_store((^simd.u8x16)(raw_data(tag)), auth) } @(private, require_results) d_hw :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte) -> bool { tmp: [BLOCK_SIZE]byte copy(tmp[1:], iv) - iv_ := intrinsics.unaligned_load((^x86.__m128i)(raw_data(&tmp))) + iv_ := intrinsics.unaligned_load((^simd.u8x16)(raw_data(&tmp))) // Algorithm 4 // @@ -360,7 +391,7 @@ d_hw :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte // if C_∗ != nil then // M_∗ <- C_∗ ^ EK(1 || tag ^ l, 0^8 || N) // end - auth := intrinsics.unaligned_load((^x86.__m128i)(raw_data(tag))) + auth := intrinsics.unaligned_load((^simd.u8x16)(raw_data(tag))) m := ciphertext n := bc_encrypt(ctx, dst, m, iv_, auth, 0) @@ -385,7 +416,7 @@ d_hw :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte // if A∗ != nil then // Auth <- Auth ^ EK(0110| | l_a, pad10∗(A_∗)) // end - auth = x86.__m128i{0, 0} + auth = simd.u8x16{} aad := aad auth, n = bc_absorb(ctx, auth, aad, _PREFIX_AD_BLOCK, 0) aad = aad[BLOCK_SIZE*n:] @@ -424,7 +455,7 @@ d_hw :: proc "contextless" (ctx: ^Context, dst, iv, aad, ciphertext, tag: []byte // Tag verification // if tag0 = tag then return (M_1 || ... || M_l || M_∗) // else return false - intrinsics.unaligned_store((^x86.__m128i)(raw_data(&tmp)), auth) + intrinsics.unaligned_store((^simd.u8x16)(raw_data(&tmp)), auth) ok := crypto.compare_constant_time(tmp[:], tag) == 1 crypto.zero_explicit(&tmp, size_of(tmp)) diff --git a/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin b/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin index 89dae7229..7f5444535 100644 --- a/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin +++ b/core/crypto/deoxysii/deoxysii_impl_hw_gen.odin @@ -1,4 +1,6 @@ #+build !amd64 +#+build !arm64 +#+build !arm32 package deoxysii @(private = "file") From 3139b7e755a9cea4af922a0fef47e0a372f1fba6 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Fri, 13 Mar 2026 15:00:21 +0900 Subject: [PATCH 109/273] core/crypto/aes: Migrate to generic SIMD + HW AES --- ...{aes_ctr_hw_intel.odin => aes_ctr_hw.odin} | 62 ++++----- core/crypto/aes/aes_ecb_hw.odin | 59 +++++++++ core/crypto/aes/aes_ecb_hw_intel.odin | 58 --------- core/crypto/aes/aes_gcm.odin | 5 + ...{aes_gcm_hw_intel.odin => aes_gcm_hw.odin} | 122 ++++++++++++------ ...es_impl_hw_intel.odin => aes_impl_hw.odin} | 4 +- core/crypto/aes/aes_impl_hw_gen.odin | 2 + 7 files changed, 184 insertions(+), 128 deletions(-) rename core/crypto/aes/{aes_ctr_hw_intel.odin => aes_ctr_hw.odin} (62%) create mode 100644 core/crypto/aes/aes_ecb_hw.odin delete mode 100644 core/crypto/aes/aes_ecb_hw_intel.odin rename core/crypto/aes/{aes_gcm_hw_intel.odin => aes_gcm_hw.odin} (63%) rename core/crypto/aes/{aes_impl_hw_intel.odin => aes_impl_hw.odin} (81%) diff --git a/core/crypto/aes/aes_ctr_hw_intel.odin b/core/crypto/aes/aes_ctr_hw.odin similarity index 62% rename from core/crypto/aes/aes_ctr_hw_intel.odin rename to core/crypto/aes/aes_ctr_hw.odin index f30122c86..859b63a40 100644 --- a/core/crypto/aes/aes_ctr_hw_intel.odin +++ b/core/crypto/aes/aes_ctr_hw.odin @@ -1,30 +1,32 @@ -#+build amd64 +#+build amd64,arm64,arm32 package aes import "base:intrinsics" import "core:crypto/_aes" +import aes_hw "core:crypto/_aes/hw" +import "core:encoding/endian" import "core:math/bits" -import "core:simd/x86" +import "core:simd" @(private) CTR_STRIDE_HW :: 4 @(private) CTR_STRIDE_BYTES_HW :: CTR_STRIDE_HW * BLOCK_SIZE -@(private, enable_target_feature = "sse2,aes") +@(private, enable_target_feature = aes_hw.TARGET_FEATURES) ctr_blocks_hw :: proc(ctx: ^Context_CTR, dst, src: []byte, nr_blocks: int) #no_bounds_check { hw_ctx := ctx._impl.(Context_Impl_Hardware) - sks: [15]x86.__m128i = --- + sks: [15]simd.u8x16 = --- for i in 0 ..= hw_ctx._num_rounds { - sks[i] = intrinsics.unaligned_load((^x86.__m128i)(&hw_ctx._sk_exp_enc[i])) + sks[i] = intrinsics.unaligned_load((^simd.u8x16)(&hw_ctx._sk_exp_enc[i])) } - hw_inc_ctr := #force_inline proc "contextless" (hi, lo: u64) -> (x86.__m128i, u64, u64) { - ret := x86.__m128i{ - i64(intrinsics.byte_swap(hi)), - i64(intrinsics.byte_swap(lo)), - } + hw_inc_ctr := #force_inline proc "contextless" (hi, lo: u64) -> (simd.u8x16, u64, u64) { + buf: [BLOCK_SIZE]byte = --- + endian.unchecked_put_u64be(buf[0:], hi) + endian.unchecked_put_u64be(buf[8:], lo) + ret := intrinsics.unaligned_load((^simd.u8x16)(&buf)) hi, lo := hi, lo carry: u64 @@ -46,42 +48,42 @@ ctr_blocks_hw :: proc(ctx: ^Context_CTR, dst, src: []byte, nr_blocks: int) #no_b nr_blocks := nr_blocks ctr_hi, ctr_lo := ctx._ctr_hi, ctx._ctr_lo - blks: [CTR_STRIDE_HW]x86.__m128i = --- + blks: [CTR_STRIDE_HW]simd.u8x16 = --- for nr_blocks >= CTR_STRIDE_HW { #unroll for i in 0..< CTR_STRIDE_HW { blks[i], ctr_hi, ctr_lo = hw_inc_ctr(ctr_hi, ctr_lo) } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_xor_si128(blks[i], sks[0]) + blks[i] = simd.bit_xor(blks[i], sks[0]) } #unroll for i in 1 ..= 9 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } switch hw_ctx._num_rounds { case _aes.ROUNDS_128: #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[10]) + blks[i] = aes_hw.aesenclast(blks[i], sks[10]) } case _aes.ROUNDS_192: #unroll for i in 10 ..= 11 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[12]) + blks[i] = aes_hw.aesenclast(blks[i], sks[12]) } case _aes.ROUNDS_256: #unroll for i in 10 ..= 13 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[14]) + blks[i] = aes_hw.aesenclast(blks[i], sks[14]) } } @@ -98,23 +100,23 @@ ctr_blocks_hw :: proc(ctx: ^Context_CTR, dst, src: []byte, nr_blocks: int) #no_b for nr_blocks > 0 { blks[0], ctr_hi, ctr_lo = hw_inc_ctr(ctr_hi, ctr_lo) - blks[0] = x86._mm_xor_si128(blks[0], sks[0]) + blks[0] = simd.bit_xor(blks[0], sks[0]) #unroll for i in 1 ..= 9 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } switch hw_ctx._num_rounds { case _aes.ROUNDS_128: - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[10]) + blks[0] = aes_hw.aesenclast(blks[0], sks[10]) case _aes.ROUNDS_192: #unroll for i in 10 ..= 11 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[12]) + blks[0] = aes_hw.aesenclast(blks[0], sks[12]) case _aes.ROUNDS_256: #unroll for i in 10 ..= 13 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[14]) + blks[0] = aes_hw.aesenclast(blks[0], sks[14]) } xor_blocks_hw(dst, src, blks[:1]) @@ -133,18 +135,18 @@ ctr_blocks_hw :: proc(ctx: ^Context_CTR, dst, src: []byte, nr_blocks: int) #no_b zero_explicit(&sks, size_of(sks)) } -@(private, enable_target_feature = "sse2") -xor_blocks_hw :: proc(dst, src: []byte, blocks: []x86.__m128i) { +@(private, enable_target_feature = aes_hw.TARGET_FEATURES) +xor_blocks_hw :: proc(dst, src: []byte, blocks: []simd.u8x16) { #no_bounds_check { if src != nil { for i in 0 ..< len(blocks) { off := i * BLOCK_SIZE - tmp := intrinsics.unaligned_load((^x86.__m128i)(raw_data(src[off:]))) - blocks[i] = x86._mm_xor_si128(blocks[i], tmp) + tmp := intrinsics.unaligned_load((^simd.u8x16)(raw_data(src[off:]))) + blocks[i] = simd.bit_xor(blocks[i], tmp) } } for i in 0 ..< len(blocks) { - intrinsics.unaligned_store((^x86.__m128i)(raw_data(dst[i * BLOCK_SIZE:])), blocks[i]) + intrinsics.unaligned_store((^simd.u8x16)(raw_data(dst[i * BLOCK_SIZE:])), blocks[i]) } } } diff --git a/core/crypto/aes/aes_ecb_hw.odin b/core/crypto/aes/aes_ecb_hw.odin new file mode 100644 index 000000000..87a006d9b --- /dev/null +++ b/core/crypto/aes/aes_ecb_hw.odin @@ -0,0 +1,59 @@ +#+build amd64,arm64,arm32 +package aes + +import "base:intrinsics" +import "core:crypto/_aes" +import aes_hw "core:crypto/_aes/hw" +import "core:simd" + +@(private, enable_target_feature = aes_hw.TARGET_FEATURES) +encrypt_block_hw :: proc(ctx: ^Context_Impl_Hardware, dst, src: []byte) { + blk := intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))) + + blk = simd.bit_xor(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[0]))) + #unroll for i in 1 ..= 9 { + blk = aes_hw.aesenc(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[i]))) + } + switch ctx._num_rounds { + case _aes.ROUNDS_128: + blk = aes_hw.aesenclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[10]))) + case _aes.ROUNDS_192: + #unroll for i in 10 ..= 11 { + blk = aes_hw.aesenc(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[i]))) + } + blk = aes_hw.aesenclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[12]))) + case _aes.ROUNDS_256: + #unroll for i in 10 ..= 13 { + blk = aes_hw.aesenc(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[i]))) + } + blk = aes_hw.aesenclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[14]))) + } + + intrinsics.unaligned_store((^simd.u8x16)(raw_data(dst)), blk) +} + +@(private, enable_target_feature = aes_hw.TARGET_FEATURES) +decrypt_block_hw :: proc(ctx: ^Context_Impl_Hardware, dst, src: []byte) { + blk := intrinsics.unaligned_load((^simd.u8x16)(raw_data(src))) + + blk = simd.bit_xor(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[0]))) + #unroll for i in 1 ..= 9 { + blk = aes_hw.aesdec(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[i]))) + } + switch ctx._num_rounds { + case _aes.ROUNDS_128: + blk = aes_hw.aesdeclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[10]))) + case _aes.ROUNDS_192: + #unroll for i in 10 ..= 11 { + blk = aes_hw.aesdec(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[i]))) + } + blk = aes_hw.aesdeclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[12]))) + case _aes.ROUNDS_256: + #unroll for i in 10 ..= 13 { + blk = aes_hw.aesdec(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[i]))) + } + blk = aes_hw.aesdeclast(blk, intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_dec[14]))) + } + + intrinsics.unaligned_store((^simd.u8x16)(raw_data(dst)), blk) +} diff --git a/core/crypto/aes/aes_ecb_hw_intel.odin b/core/crypto/aes/aes_ecb_hw_intel.odin deleted file mode 100644 index f1d44a25f..000000000 --- a/core/crypto/aes/aes_ecb_hw_intel.odin +++ /dev/null @@ -1,58 +0,0 @@ -#+build amd64 -package aes - -import "base:intrinsics" -import "core:crypto/_aes" -import "core:simd/x86" - -@(private, enable_target_feature = "sse2,aes") -encrypt_block_hw :: proc(ctx: ^Context_Impl_Hardware, dst, src: []byte) { - blk := intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))) - - blk = x86._mm_xor_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[0]))) - #unroll for i in 1 ..= 9 { - blk = x86._mm_aesenc_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[i]))) - } - switch ctx._num_rounds { - case _aes.ROUNDS_128: - blk = x86._mm_aesenclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[10]))) - case _aes.ROUNDS_192: - #unroll for i in 10 ..= 11 { - blk = x86._mm_aesenc_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[i]))) - } - blk = x86._mm_aesenclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[12]))) - case _aes.ROUNDS_256: - #unroll for i in 10 ..= 13 { - blk = x86._mm_aesenc_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[i]))) - } - blk = x86._mm_aesenclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[14]))) - } - - intrinsics.unaligned_store((^x86.__m128i)(raw_data(dst)), blk) -} - -@(private, enable_target_feature = "sse2,aes") -decrypt_block_hw :: proc(ctx: ^Context_Impl_Hardware, dst, src: []byte) { - blk := intrinsics.unaligned_load((^x86.__m128i)(raw_data(src))) - - blk = x86._mm_xor_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[0]))) - #unroll for i in 1 ..= 9 { - blk = x86._mm_aesdec_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[i]))) - } - switch ctx._num_rounds { - case _aes.ROUNDS_128: - blk = x86._mm_aesdeclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[10]))) - case _aes.ROUNDS_192: - #unroll for i in 10 ..= 11 { - blk = x86._mm_aesdec_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[i]))) - } - blk = x86._mm_aesdeclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[12]))) - case _aes.ROUNDS_256: - #unroll for i in 10 ..= 13 { - blk = x86._mm_aesdec_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[i]))) - } - blk = x86._mm_aesdeclast_si128(blk, intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_dec[14]))) - } - - intrinsics.unaligned_store((^x86.__m128i)(raw_data(dst)), blk) -} diff --git a/core/crypto/aes/aes_gcm.odin b/core/crypto/aes/aes_gcm.odin index 0acd95d2f..531844a32 100644 --- a/core/crypto/aes/aes_gcm.odin +++ b/core/crypto/aes/aes_gcm.odin @@ -4,6 +4,7 @@ import "core:bytes" import "core:crypto" import "core:crypto/_aes" import "core:crypto/_aes/ct64" +import aes_hw "core:crypto/_aes/hw" import "core:encoding/endian" // GCM_IV_SIZE is the default size of the GCM IV in bytes. @@ -26,6 +27,10 @@ Context_GCM :: struct { // init_gcm initializes a Context_GCM with the provided key. init_gcm :: proc(ctx: ^Context_GCM, key: []byte, impl := DEFAULT_IMPLEMENTATION) { + when aes_hw.HAS_GHASH { + impl := aes_hw.is_ghash_supported() ? impl : .Portable + + } init_impl(&ctx._impl, key, impl) ctx._is_initialized = true } diff --git a/core/crypto/aes/aes_gcm_hw_intel.odin b/core/crypto/aes/aes_gcm_hw.odin similarity index 63% rename from core/crypto/aes/aes_gcm_hw_intel.odin rename to core/crypto/aes/aes_gcm_hw.odin index 75c97be80..13c035a20 100644 --- a/core/crypto/aes/aes_gcm_hw_intel.odin +++ b/core/crypto/aes/aes_gcm_hw.odin @@ -1,12 +1,13 @@ -#+build amd64 +#+build amd64,arm64,arm32 package aes import "base:intrinsics" import "core:crypto" import "core:crypto/_aes" +@(require) import "core:crypto/_aes/ct64" import aes_hw "core:crypto/_aes/hw" import "core:encoding/endian" -import "core:simd/x86" +import "core:simd" @(private) gcm_seal_hw :: proc(ctx: ^Context_Impl_Hardware, dst, tag, iv, aad, plaintext: []byte) { @@ -17,7 +18,11 @@ gcm_seal_hw :: proc(ctx: ^Context_Impl_Hardware, dst, tag, iv, aad, plaintext: [ init_ghash_hw(ctx, &h, &j0, &j0_enc, iv) // Note: Our GHASH implementation handles appending padding. - aes_hw.ghash(s[:], h[:], aad) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], aad) + } else { + ct64.ghash(s[:], h[:], aad) + } gctr_hw(ctx, dst, &s, plaintext, &h, &j0, true) final_ghash_hw(&s, &h, &j0_enc, len(aad), len(plaintext)) copy(tag, s[:]) @@ -35,7 +40,11 @@ gcm_open_hw :: proc(ctx: ^Context_Impl_Hardware, dst, iv, aad, ciphertext, tag: s: [_aes.GHASH_TAG_SIZE]byte init_ghash_hw(ctx, &h, &j0, &j0_enc, iv) - aes_hw.ghash(s[:], h[:], aad) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], aad) + } else { + ct64.ghash(s[:], h[:], aad) + } gctr_hw(ctx, dst, &s, ciphertext, &h, &j0, false) final_ghash_hw(&s, &h, &j0_enc, len(aad), len(ciphertext)) @@ -71,18 +80,26 @@ init_ghash_hw :: proc( } else { // If len(IV) != 96, then let s = 128 ceil(len(IV)/128) - len(IV), // and let J0 = GHASHH(IV || 0^(s+64) || ceil(len(IV))^64). - aes_hw.ghash(j0[:], h[:], iv) + when aes_hw.HAS_GHASH { + aes_hw.ghash(j0[:], h[:], iv) + } else { + ct64.ghash(j0[:], h[:], iv) + } tmp: [_aes.GHASH_BLOCK_SIZE]byte endian.unchecked_put_u64be(tmp[8:], u64(l) * 8) - aes_hw.ghash(j0[:], h[:], tmp[:]) + when aes_hw.HAS_GHASH { + aes_hw.ghash(j0[:], h[:], tmp[:]) + } else { + ct64.ghash(j0[:], h[:], tmp[:]) + } } // ECB encrypt j0, so that we can just XOR with the tag. encrypt_block_hw(ctx, j0_enc[:], j0[:]) } -@(private = "file", enable_target_feature = "sse2") +@(private = "file", enable_target_feature = aes_hw.TARGET_FEATURES) final_ghash_hw :: proc( s: ^[_aes.GHASH_BLOCK_SIZE]byte, h: ^[_aes.GHASH_KEY_SIZE]byte, @@ -94,14 +111,18 @@ final_ghash_hw :: proc( endian.unchecked_put_u64be(blk[0:], u64(a_len) * 8) endian.unchecked_put_u64be(blk[8:], u64(t_len) * 8) - aes_hw.ghash(s[:], h[:], blk[:]) - j0_vec := intrinsics.unaligned_load((^x86.__m128i)(j0)) - s_vec := intrinsics.unaligned_load((^x86.__m128i)(s)) - s_vec = x86._mm_xor_si128(s_vec, j0_vec) - intrinsics.unaligned_store((^x86.__m128i)(s), s_vec) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], blk[:]) + } else { + ct64.ghash(s[:], h[:], blk[:]) + } + j0_vec := intrinsics.unaligned_load((^simd.u8x16)(j0)) + s_vec := intrinsics.unaligned_load((^simd.u8x16)(s)) + s_vec = simd.bit_xor(s_vec, j0_vec) + intrinsics.unaligned_store((^simd.u8x16)(s), s_vec) } -@(private = "file", enable_target_feature = "sse2,sse4.1,aes") +@(private = "file", enable_target_feature = aes_hw.TARGET_FEATURES) gctr_hw :: proc( ctx: ^Context_Impl_Hardware, dst: []byte, @@ -111,13 +132,13 @@ gctr_hw :: proc( iv: ^[_aes.GHASH_BLOCK_SIZE]byte, is_seal: bool, ) #no_bounds_check { - sks: [15]x86.__m128i = --- + sks: [15]simd.u8x16 = --- for i in 0 ..= ctx._num_rounds { - sks[i] = intrinsics.unaligned_load((^x86.__m128i)(&ctx._sk_exp_enc[i])) + sks[i] = intrinsics.unaligned_load((^simd.u8x16)(&ctx._sk_exp_enc[i])) } // Setup the counter block - ctr_blk := intrinsics.unaligned_load((^x86.__m128i)(iv)) + ctr_blk := intrinsics.unaligned_load((^simd.u8x16)(iv)) ctr := endian.unchecked_get_u32be(iv[GCM_IV_SIZE:]) + 1 src, dst := src, dst @@ -127,11 +148,15 @@ gctr_hw :: proc( // This results in an unreadable mess, so we opt for simplicity // as performance is adequate. - blks: [CTR_STRIDE_HW]x86.__m128i = --- + blks: [CTR_STRIDE_HW]simd.u8x16 = --- nr_blocks := len(src) / BLOCK_SIZE for nr_blocks >= CTR_STRIDE_HW { if !is_seal { - aes_hw.ghash(s[:], h[:], src[:CTR_STRIDE_BYTES_HW]) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], src[:CTR_STRIDE_BYTES_HW]) + } else { + ct64.ghash(s[:], h[:], src[:CTR_STRIDE_BYTES_HW]) + } } #unroll for i in 0 ..< CTR_STRIDE_HW { @@ -139,42 +164,46 @@ gctr_hw :: proc( } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_xor_si128(blks[i], sks[0]) + blks[i] = simd.bit_xor(blks[i], sks[0]) } #unroll for i in 1 ..= 9 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } switch ctx._num_rounds { case _aes.ROUNDS_128: #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[10]) + blks[i] = aes_hw.aesenclast(blks[i], sks[10]) } case _aes.ROUNDS_192: #unroll for i in 10 ..= 11 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[12]) + blks[i] = aes_hw.aesenclast(blks[i], sks[12]) } case _aes.ROUNDS_256: #unroll for i in 10 ..= 13 { #unroll for j in 0 ..< CTR_STRIDE_HW { - blks[j] = x86._mm_aesenc_si128(blks[j], sks[i]) + blks[j] = aes_hw.aesenc(blks[j], sks[i]) } } #unroll for i in 0 ..< CTR_STRIDE_HW { - blks[i] = x86._mm_aesenclast_si128(blks[i], sks[14]) + blks[i] = aes_hw.aesenclast(blks[i], sks[14]) } } xor_blocks_hw(dst, src, blks[:]) if is_seal { - aes_hw.ghash(s[:], h[:], dst[:CTR_STRIDE_BYTES_HW]) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], dst[:CTR_STRIDE_BYTES_HW]) + } else { + ct64.ghash(s[:], h[:], dst[:CTR_STRIDE_BYTES_HW]) + } } src = src[CTR_STRIDE_BYTES_HW:] @@ -186,28 +215,32 @@ gctr_hw :: proc( for n := len(src); n > 0; { l := min(n, BLOCK_SIZE) if !is_seal { - aes_hw.ghash(s[:], h[:], src[:l]) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], src[:l]) + } else { + ct64.ghash(s[:], h[:], src[:l]) + } } blks[0], ctr = hw_inc_ctr32(&ctr_blk, ctr) - blks[0] = x86._mm_xor_si128(blks[0], sks[0]) + blks[0] = simd.bit_xor(blks[0], sks[0]) #unroll for i in 1 ..= 9 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } switch ctx._num_rounds { case _aes.ROUNDS_128: - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[10]) + blks[0] = aes_hw.aesenclast(blks[0], sks[10]) case _aes.ROUNDS_192: #unroll for i in 10 ..= 11 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[12]) + blks[0] = aes_hw.aesenclast(blks[0], sks[12]) case _aes.ROUNDS_256: #unroll for i in 10 ..= 13 { - blks[0] = x86._mm_aesenc_si128(blks[0], sks[i]) + blks[0] = aes_hw.aesenc(blks[0], sks[i]) } - blks[0] = x86._mm_aesenclast_si128(blks[0], sks[14]) + blks[0] = aes_hw.aesenclast(blks[0], sks[14]) } if l == BLOCK_SIZE { @@ -219,7 +252,11 @@ gctr_hw :: proc( copy(dst, blk[:l]) } if is_seal { - aes_hw.ghash(s[:], h[:], dst[:l]) + when aes_hw.HAS_GHASH { + aes_hw.ghash(s[:], h[:], dst[:l]) + } else { + ct64.ghash(s[:], h[:], dst[:l]) + } } dst = dst[l:] @@ -235,8 +272,17 @@ gctr_hw :: proc( // the compiler. // // src/check_expr.cpp(8104): Assertion Failure: `c->curr_proc_decl->entity` -@(private = "file", enable_target_feature = "sse4.1") -hw_inc_ctr32 :: #force_inline proc "contextless" (src: ^x86.__m128i, ctr: u32) -> (x86.__m128i, u32) { - ret := x86._mm_insert_epi32(src^, i32(intrinsics.byte_swap(ctr)), 3) +@(private = "file", enable_target_feature = aes_hw.TARGET_FEATURES) +hw_inc_ctr32 :: #force_inline proc "contextless" (src: ^simd.u8x16, ctr: u32) -> (simd.u8x16, u32) { + when ODIN_ENDIAN == .Little { + ctr_be := intrinsics.byte_swap(ctr) + } else { + ctr_be := ctr + } + + ret := transmute(simd.u8x16)( + simd.replace(transmute(simd.u32x4)(src^), 3, ctr_be) + ) + return ret, ctr + 1 } diff --git a/core/crypto/aes/aes_impl_hw_intel.odin b/core/crypto/aes/aes_impl_hw.odin similarity index 81% rename from core/crypto/aes/aes_impl_hw_intel.odin rename to core/crypto/aes/aes_impl_hw.odin index fe3849eda..fe93966f8 100644 --- a/core/crypto/aes/aes_impl_hw_intel.odin +++ b/core/crypto/aes/aes_impl_hw.odin @@ -1,4 +1,4 @@ -#+build amd64 +#+build amd64,arm64,arm32 package aes import aes_hw "core:crypto/_aes/hw" @@ -12,7 +12,7 @@ is_hardware_accelerated :: proc "contextless" () -> bool { @(private) Context_Impl_Hardware :: aes_hw.Context -@(private, enable_target_feature = "sse2,aes") +@(private, enable_target_feature = aes_hw.TARGET_FEATURES) init_impl_hw :: proc(ctx: ^Context_Impl_Hardware, key: []byte) { aes_hw.init(ctx, key) } diff --git a/core/crypto/aes/aes_impl_hw_gen.odin b/core/crypto/aes/aes_impl_hw_gen.odin index 506298751..10b08b7b5 100644 --- a/core/crypto/aes/aes_impl_hw_gen.odin +++ b/core/crypto/aes/aes_impl_hw_gen.odin @@ -1,4 +1,6 @@ #+build !amd64 +#+build !arm64 +#+build !arm32 package aes @(private = "file") From ee3d0ea0b59c3099075d72beeab9479c1706c635 Mon Sep 17 00:00:00 2001 From: Franz Date: Fri, 13 Mar 2026 14:21:18 +0100 Subject: [PATCH 110/273] Fix #6407 --- src/llvm_backend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 931813f42..912dcbd7c 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3406,7 +3406,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { cc.link_section = e->Variable.link_section; ExactValue v = tav.value; - lbValue init = lb_const_value(m, tav.type, v, cc); + lbValue init = lb_const_value(m, e->type, v, cc); LLVMDeleteGlobal(g.value); g.value = nullptr; From 411e85f02ef642705da80feb084cdca547b58709 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 13 Mar 2026 13:37:34 +0000 Subject: [PATCH 111/273] Fix copy-and-paste doc typo --- core/reflect/types.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/reflect/types.odin b/core/reflect/types.odin index c6400eb63..fa40c1d1b 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -434,7 +434,7 @@ is_simd_vector :: proc(info: ^Type_Info) -> bool { _, ok := type_info_base(info).variant.(Type_Info_Simd_Vector) return ok } -// Returns true when the type is a dynamic-array type ([dynamic]T), false otherwise. +// Returns true when the type is a fixed-capacity dynamic-array type ([dynamic; N]T), false otherwise. @(require_results) is_fixed_capacity_dynamic_array :: proc(info: ^Type_Info) -> bool { if info == nil { return false } From af8853473af19ee9c424d0974392b1e26d820441 Mon Sep 17 00:00:00 2001 From: Laytan Date: Tue, 11 Nov 2025 19:14:40 +0100 Subject: [PATCH 112/273] query host features instead of only host cpu for more accurate -microarch:native --- src/llvm_backend.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 931813f42..600df6a20 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -66,6 +66,19 @@ gb_internal String get_final_microarchitecture() { gb_internal String get_default_features() { BuildContext *bc = &build_context; + if (bc->microarch == str_lit("native")) { + String features = make_string_c(LLVMGetHostCPUFeatures()); + + // Update the features string so LLVM uses it later. + if (bc->target_features_string.len > 0) { + bc->target_features_string = concatenate3_strings(permanent_allocator(), features, str_lit(","), bc->target_features_string); + } else { + bc->target_features_string = features; + } + + return features; + } + int off = 0; for (int i = 0; i < bc->metrics.arch; i += 1) { off += target_microarch_counts[i]; From f56ec37d1b7f532a941d683181fe031fa7f74499 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 13 Mar 2026 20:43:03 +0100 Subject: [PATCH 113/273] fix type info of u16 could not be found --- src/checker.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 8acc5f4ae..f0ba94d24 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2240,7 +2240,7 @@ gb_internal void add_type_info_type_internal(CheckerContext *c, Type *t) { case Type_BitSet: add_type_info_type_internal(c, bt->BitSet.elem); - add_type_info_type_internal(c, bt->BitSet.underlying); + add_type_info_type_internal(c, bit_set_to_int(bt)); break; case Type_Pointer: @@ -2479,7 +2479,7 @@ gb_internal void add_min_dep_type_info(Checker *c, Type *t) { case Type_BitSet: add_min_dep_type_info(c, bt->BitSet.elem); - add_min_dep_type_info(c, bt->BitSet.underlying); + add_min_dep_type_info(c, bit_set_to_int(bt)); break; case Type_Pointer: From adb2890d2bf05b4f3764418cc7bd6a5c16f9e67e Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 14 Mar 2026 04:12:17 +0900 Subject: [PATCH 114/273] core/simd/arm: Formating fixes (NFC) --- core/simd/arm/aes.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/simd/arm/aes.odin b/core/simd/arm/aes.odin index acafb9f1e..b1f44e52c 100644 --- a/core/simd/arm/aes.odin +++ b/core/simd/arm/aes.odin @@ -1,27 +1,27 @@ #+build arm64,arm32 package simd_arm -@(require_results,enable_target_feature="aes") +@(require_results, enable_target_feature = "aes") vaeseq_u8 :: #force_inline proc "c" (data, key: uint8x16_t) -> uint8x16_t { return _vaeseq_u8(data, key) } -@(require_results,enable_target_feature="aes") +@(require_results, enable_target_feature = "aes") vaesdq_u8 :: #force_inline proc "c" (data, key: uint8x16_t) -> uint8x16_t { return _vaesdq_u8(data, key) } -@(require_results,enable_target_feature="aes") +@(require_results, enable_target_feature = "aes") vaesmcq_u8 :: #force_inline proc "c" (data: uint8x16_t) -> uint8x16_t { return _vaesmcq_u8(data) } -@(require_results,enable_target_feature="aes") +@(require_results,enable_target_feature = "aes") vaesimcq_u8 :: #force_inline proc "c" (data: uint8x16_t) -> uint8x16_t { return _vaesimcq_u8(data) } -@(private,default_calling_convention="none") +@(private, default_calling_convention = "none") foreign _ { @(link_name = "llvm.aarch64.crypto.aese" when ODIN_ARCH == .arm64 else "llvm.arm.neon.aese") _vaeseq_u8 :: proc(data, key: uint8x16_t) -> uint8x16_t --- From 3a59e8c84950eabf6c50a684a0e02dbde250ec22 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 14 Mar 2026 05:09:35 +0900 Subject: [PATCH 115/273] core/simd/arm: Add the SHA intrinsics The SHA3 ones aren't in the developer.arm.com documentation. --- core/simd/arm/sha.odin | 108 +++++++++++++++++++++++++++++++++++++++ core/simd/arm/types.odin | 4 ++ 2 files changed, 112 insertions(+) create mode 100644 core/simd/arm/sha.odin diff --git a/core/simd/arm/sha.odin b/core/simd/arm/sha.odin new file mode 100644 index 000000000..ca87c9795 --- /dev/null +++ b/core/simd/arm/sha.odin @@ -0,0 +1,108 @@ +#+build arm64,arm32 +package simd_arm + +@(require_results, enable_target_feature = "sha2") +vsha1cq_u32 :: #force_inline proc "c" (hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t { + return _vsha1cq_u32(hash_abcd, e, wk) +} + +@(require_results, enable_target_feature = "sha2") +vsha1pq_u32 :: #force_inline proc "c" (hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t { + return _vsha1pq_u32(hash_abcd, e, wk) +} + +@(require_results, enable_target_feature = "sha2") +vsha1mq_u32 :: #force_inline proc "c" (hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t { + return _vsha1mq_u32(hash_abcd, e, wk) +} + +@(require_results, enable_target_feature = "sha2") +vsha1h_u32 :: #force_inline proc "c" (e: uint32_t) -> uint32_t { + return _vsha1h_u32(e) +} + +@(require_results, enable_target_feature = "sha2") +vsha1su0q_u32 :: #force_inline proc "c" (w0_3, w4_7, w8_11: uint32x4_t) -> uint32x4_t { + return _vsha1su0q_u32(w0_3, w4_7, w8_11) +} + +@(require_results, enable_target_feature = "sha2") +vsha1su1q_u32 :: #force_inline proc "c" (tw0_3, w12_15: uint32x4_t) -> uint32x4_t { + return _vsha1su1q_u32(tw0_3, w12_15) +} + +@(require_results, enable_target_feature = "sha2") +vsha256hq_u32 :: #force_inline proc "c" (hash_abcd, hash_efgh, wk: uint32x4_t) -> uint32x4_t { + return _vsha256hq_u32(hash_abcd, hash_efgh, wk) +} + +@(require_results, enable_target_feature = "sha2") +vsha256h2q_u32 :: #force_inline proc "c" (hash_efgh, hash_abcd, wk: uint32x4_t) -> uint32x4_t { + return _vsha256h2q_u32(hash_efgh, hash_abcd, wk) +} + +@(require_results, enable_target_feature = "sha2") +vsha256su0q_u32 :: #force_inline proc "c" (w0_3, w4_7: uint32x4_t) -> uint32x4_t { + return _vsha256su0q_u32(w0_3, w4_7) +} + +@(require_results, enable_target_feature = "sha2") +vsha256su1q_u32 :: #force_inline proc "c" (tw0_3, w8_11, w12_15: uint32x4_t) -> uint32x4_t { + return _vsha256su1q_u32(tw0_3, w8_11, w12_15) +} + +// Note: The SHA512 instructions are part of the `sha3` feature set. + +@(require_results, enable_target_feature = "sha3") +vsha512hq_u64 :: #force_inline proc "c" (hash_ed, hash_gf, kwh_kwh2: uint64x2_t) -> uint64x2_t { + return _vsha512hq_u64(hash_ed, hash_gf, kwh_kwh2) +} + +@(require_results, enable_target_feature = "sha3") +vsha512h2q_u64 :: #force_inline proc "c" (sum_ab, hash_c_, hash_ab: uint64x2_t) -> uint64x2_t { + return _vsha512h2q_u64(sum_ab, hash_c_, hash_ab) +} + +@(require_results, enable_target_feature = "sha3") +vsha512su0q_u64 :: #force_inline proc "c" (w0_1, w2_: uint64x2_t) -> uint64x2_t { + return _vsha512su0q_u64(w0_1, w2_) +} + +@(require_results, enable_target_feature = "sha3") +vsha512su1q_u64 :: #force_inline proc "c" (s01_s02, w14_15, w9_10: uint64x2_t) -> uint64x2_t { + return _vsha512su1q_u64(s01_s02, w14_15, w9_10) +} + +@(private, default_calling_convention = "none") +foreign _ { + @(link_name = "llvm.aarch64.crypto.sha1c" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1c") + _vsha1cq_u32 :: proc(hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha1p" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1p") + _vsha1pq_u32 :: proc(hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha1m" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1m") + _vsha1mq_u32 :: proc(hash_abcd: uint32x4_t, e: uint32_t, wk: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha1h" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1h") + _vsha1h_u32 :: proc(e: uint32_t) -> uint32_t --- + @(link_name = "llvm.aarch64.crypto.sha1su0" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1su0") + _vsha1su0q_u32 :: proc(w0_3, w4_7, w8_11: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha1su1" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha1su1") + _vsha1su1q_u32 :: proc(tw0_3, w12_15: uint32x4_t) -> uint32x4_t --- + + @(link_name = "llvm.aarch64.crypto.sha256h" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha256h") + _vsha256hq_u32 :: proc(hash_abcd, hash_efgh, wk: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha256h2" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha256h2") + _vsha256h2q_u32 :: proc(hash_efgh, hash_abcd, wk: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha256su0" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha256su0") + _vsha256su0q_u32 :: proc(w0_3, w4_7: uint32x4_t) -> uint32x4_t --- + @(link_name = "llvm.aarch64.crypto.sha256su1" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha256su1") + _vsha256su1q_u32 :: proc(tw0_3, w8_11, w12_15: uint32x4_t) -> uint32x4_t --- + + @(link_name = "llvm.aarch64.crypto.sha512h" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha512h") + _vsha512hq_u64 :: proc(hash_ed, hash_gf, kwh_kwh2: uint64x2_t) -> uint64x2_t --- + @(link_name = "llvm.aarch64.crypto.sha512h2" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha512h2") + _vsha512h2q_u64 :: proc(sum_ab, hash_c_, hash_ab: uint64x2_t) -> uint64x2_t --- + @(link_name = "llvm.aarch64.crypto.sha512su0" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha512su0") + _vsha512su0q_u64 :: proc(w0_1, w2_: uint64x2_t) -> uint64x2_t --- + @(link_name = "llvm.aarch64.crypto.sha512su1" when ODIN_ARCH == .arm64 else "llvm.arm.neon.sha512su1") + _vsha512su1q_u64 :: proc(s01_s02, w14_15, w9_10: uint64x2_t) -> uint64x2_t --- +} diff --git a/core/simd/arm/types.odin b/core/simd/arm/types.odin index 7c86483a7..05e3540b6 100644 --- a/core/simd/arm/types.odin +++ b/core/simd/arm/types.odin @@ -1,5 +1,9 @@ #+build arm64,arm32 package simd_arm +// Type aliases to match `arm_neon.h`. +uint32_t :: u32 + uint8x16_t :: #simd[16]u8 uint32x4_t :: #simd[4]u32 +uint64x2_t :: #simd[2]u64 From ee667ec02bcf2ef954f7a3c551977bf42bb2f5cf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 14 Mar 2026 16:21:38 +0000 Subject: [PATCH 116/273] Update core/reflect/reflect.odin Co-authored-by: Laytan --- core/reflect/reflect.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index a0cc468f2..e7115fc96 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -1948,7 +1948,7 @@ equal :: proc(a, b: any, including_indirect_array_recursion := false, recursion_ } for i in 0.. Date: Sat, 14 Mar 2026 16:22:01 +0000 Subject: [PATCH 117/273] Update core/encoding/cbor/marshal.odin Co-authored-by: Laytan --- core/encoding/cbor/marshal.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/encoding/cbor/marshal.odin b/core/encoding/cbor/marshal.odin index 366473bcc..b9333bf2b 100644 --- a/core/encoding/cbor/marshal.odin +++ b/core/encoding/cbor/marshal.odin @@ -287,13 +287,13 @@ _marshal_into_encoder :: proc(e: Encoder, v: any, ti: ^runtime.Type_Info) -> (er case runtime.Type_Info_Fixed_Capacity_Dynamic_Array: + array_data := uintptr(v.data) + array_len := (^int)(array_data + info.len_offset)^ if info.elem.id == byte { - raw := (^[dynamic]byte)(v.data) - return err_conv(_encode_bytes(e, raw[:])) + raw := runtime.Raw_Slice{v.data, array_len} + return err_conv(_encode_bytes(e, transmute([]byte)raw)) } - array_len := (^int)(uintptr(v.data) + info.len_offset)^ - array_data := uintptr(v.data) err_conv(_encode_u64(e, u64(array_len), .Array)) or_return if impl, ok := _tag_implementations_type[info.elem.id]; ok { From 59bc428782717f4fc565e4d137df697d2dea961a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 14 Mar 2026 16:22:12 +0000 Subject: [PATCH 118/273] Update core/odin/ast/ast.odin Co-authored-by: Laytan --- core/odin/ast/ast.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 8f5f466cb..22139d7f9 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -787,7 +787,7 @@ Dynamic_Array_Type :: struct { } Fixed_Capacity_Dynamic_Array_Type :: struct { - using node: Expr, + using node: Expr, tag: ^Expr, // possibly nil open: tokenizer.Pos, dynamic_pos: tokenizer.Pos, From 0e6ea3884d4e6f36c981d858f5e9ff6e1484a939 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 14 Mar 2026 16:26:42 +0000 Subject: [PATCH 119/273] General improves --- src/checker.cpp | 4 +++- src/types.cpp | 2 +- .../test_fixed_capacity_dynamic_array.odin | 17 ++++++++++++++++- 3 files changed, 20 insertions(+), 3 deletions(-) rename tests/{core/container => internal}/test_fixed_capacity_dynamic_array.odin (94%) diff --git a/src/checker.cpp b/src/checker.cpp index 2ac5aa62d..cd5842b10 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2278,7 +2278,7 @@ gb_internal void add_type_info_type_internal(CheckerContext *c, Type *t) { case Type_FixedCapacityDynamicArray: add_type_info_type_internal(c, bt->FixedCapacityDynamicArray.elem); - add_type_info_type_internal(c, t_allocator); + add_type_info_type_internal(c, t_int); break; case Type_Enum: @@ -2521,6 +2521,8 @@ gb_internal void add_min_dep_type_info(Checker *c, Type *t) { case Type_FixedCapacityDynamicArray: add_min_dep_type_info(c, bt->FixedCapacityDynamicArray.elem); + add_min_dep_type_info(c, alloc_type_pointer(bt->FixedCapacityDynamicArray.elem)); + add_min_dep_type_info(c, alloc_type_array(bt->FixedCapacityDynamicArray.elem, bt->FixedCapacityDynamicArray.capacity)); add_min_dep_type_info(c, t_int); case Type_Enum: diff --git a/src/types.cpp b/src/types.cpp index 1fb274f6a..2f13ed1f1 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -2559,7 +2559,7 @@ gb_internal bool type_has_nil(Type *t) { return true; case Type_FixedCapacityDynamicArray: - // TODO(bill): should it have `nil`? + // it's like a normal array, so no, similar to `#soa[N]T return false; case Type_Union: diff --git a/tests/core/container/test_fixed_capacity_dynamic_array.odin b/tests/internal/test_fixed_capacity_dynamic_array.odin similarity index 94% rename from tests/core/container/test_fixed_capacity_dynamic_array.odin rename to tests/internal/test_fixed_capacity_dynamic_array.odin index 648938e6b..49cf3a8f9 100644 --- a/tests/core/container/test_fixed_capacity_dynamic_array.odin +++ b/tests/internal/test_fixed_capacity_dynamic_array.odin @@ -1,7 +1,22 @@ -package test_core_container +package test_internal import "core:testing" +@(private="file") +slice_equal :: proc(a, b: []int) -> bool { + if len(a) != len(b) { + return false + } + + for a, i in a { + if b[i] != a { + return false + } + } + return true +} + + @(test) test_fixed_capacity_dynamic_array_removes :: proc(t: ^testing.T) { array: [dynamic; 10]int From 84b38810f11802511101345daeefdd943a43d622 Mon Sep 17 00:00:00 2001 From: mlgudi Date: Sun, 15 Mar 2026 02:46:30 +0000 Subject: [PATCH 120/273] powmod: fix Montgomery branch calling Barrett implementation --- core/math/big/prime.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/math/big/prime.odin b/core/math/big/prime.odin index 1c772143b..7fa6d8e4a 100644 --- a/core/math/big/prime.odin +++ b/core/math/big/prime.odin @@ -101,7 +101,7 @@ internal_int_power_modulo :: proc(res, G, X, P: ^Int, allocator := context.alloc If the modulus is odd or dr != 0 use the montgomery method. */ if internal_int_is_odd(P) || dr != 0 { - return _private_int_exponent_mod(res, G, X, P, dr) + return _private_int_exponent_mod_fast(res, G, X, P, dr) } /* From 76da2c32334aefa69daa7f3c3a8ea6de3c0adf97 Mon Sep 17 00:00:00 2001 From: mlgudi Date: Sun, 15 Mar 2026 02:47:26 +0000 Subject: [PATCH 121/273] mul_high: fix aliasing bug when dest overlaps input --- core/math/big/private.odin | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/core/math/big/private.odin b/core/math/big/private.odin index 506f68165..1feb433b0 100644 --- a/core/math/big/private.odin +++ b/core/math/big/private.odin @@ -439,8 +439,14 @@ _private_int_mul_high :: proc(dest, a, b: ^Int, digits: int, allocator := contex return _private_int_mul_high_comba(dest, a, b, digits) } - internal_grow(dest, a.used + b.used + 1) or_return - dest.used = a.used + b.used + 1 + /* + Set up temporary output `Int`, which we'll swap for `dest` when done. + */ + + t := &Int{} + + internal_grow(t, a.used + b.used + 1) or_return + t.used = a.used + b.used + 1 pa := a.used pb := b.used @@ -451,20 +457,23 @@ _private_int_mul_high :: proc(dest, a, b: ^Int, digits: int, allocator := contex /* Calculate the double precision result. */ - r := _WORD(dest.digit[ix + iy]) + _WORD(a.digit[ix]) * _WORD(b.digit[iy]) + _WORD(carry) + r := _WORD(t.digit[ix + iy]) + _WORD(a.digit[ix]) * _WORD(b.digit[iy]) + _WORD(carry) /* Get the lower part. */ - dest.digit[ix + iy] = DIGIT(r & _WORD(_MASK)) + t.digit[ix + iy] = DIGIT(r & _WORD(_MASK)) /* Carry the carry. */ carry = DIGIT(r >> _WORD(_DIGIT_BITS)) } - dest.digit[ix + pb] = carry + t.digit[ix + pb] = carry } + + internal_swap(dest, t) + internal_destroy(t) return internal_clamp(dest) } From 9194b599ec5f3b3edbc88c31ef19ebc372cebdf2 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sun, 15 Mar 2026 00:09:25 +0900 Subject: [PATCH 122/273] core/crypto/sha2: Add ARMv8 SHA256 acceleration --- core/crypto/sha2/sha256_impl_hw_arm.odin | 224 ++++++++++++++++++ ...w_intel.odin => sha256_impl_hw_intel.odin} | 0 core/crypto/sha2/sha2_impl_hw_gen.odin | 2 + 3 files changed, 226 insertions(+) create mode 100644 core/crypto/sha2/sha256_impl_hw_arm.odin rename core/crypto/sha2/{sha2_impl_hw_intel.odin => sha256_impl_hw_intel.odin} (100%) diff --git a/core/crypto/sha2/sha256_impl_hw_arm.odin b/core/crypto/sha2/sha256_impl_hw_arm.odin new file mode 100644 index 000000000..618cc6fff --- /dev/null +++ b/core/crypto/sha2/sha256_impl_hw_arm.odin @@ -0,0 +1,224 @@ +#+build arm64,arm32 +package sha2 + +// Based on the public domain code by Jeffrey Walton, though +// realistically, there only is one sensible way to write this. +// +// See: https://github.com/noloader/SHA-Intrinsics + +import "base:intrinsics" +import "core:simd" +import "core:simd/arm" +import "core:sys/info" + +// is_hardware_accelerated_256 returns true if and only if (⟺) hardware +// accelerated SHA-224/SHA-256 is supported. +is_hardware_accelerated_256 :: proc "contextless" () -> bool { + req_features :: info.CPU_Features{ + .asimd, + .sha256, + } + return info.cpu_features() >= req_features +} + +@(private = "file") +K_0 :: simd.u32x4{0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5} +@(private = "file") +K_1 :: simd.u32x4{0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5} +@(private = "file") +K_2 :: simd.u32x4{0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3} +@(private = "file") +K_3 :: simd.u32x4{0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174} +@(private = "file") +K_4 :: simd.u32x4{0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC} +@(private = "file") +K_5 :: simd.u32x4{0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA} +@(private = "file") +K_6 :: simd.u32x4{0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7} +@(private = "file") +K_7 :: simd.u32x4{0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967} +@(private = "file") +K_8 :: simd.u32x4{0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13} +@(private = "file") +K_9 :: simd.u32x4{0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85} +@(private = "file") +K_10 :: simd.u32x4{0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3} +@(private = "file") +K_11 :: simd.u32x4{0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070} +@(private = "file") +K_12 :: simd.u32x4{0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5} +@(private = "file") +K_13 :: simd.u32x4{0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3} +@(private = "file") +K_14 :: simd.u32x4{0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208} +@(private = "file") +K_15 :: simd.u32x4{0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2} + +@(private, enable_target_feature = "neon,sha2") +sha256_transf_hw :: proc "contextless" (ctx: ^Context_256, data: []byte) #no_bounds_check { + state_0 := intrinsics.unaligned_load((^simd.u32x4)(&ctx.h[0])) + state_1 := intrinsics.unaligned_load((^simd.u32x4)(&ctx.h[4])) + + data := data + for len(data) >= BLOCK_SIZE_256 { + // Save state + abef_save, cdgh_save := state_0, state_1 + + // Load message + msg_0 := intrinsics.unaligned_load((^simd.u32x4)(raw_data(data))) + msg_1 := intrinsics.unaligned_load((^simd.u32x4)(raw_data(data[16:]))) + msg_2 := intrinsics.unaligned_load((^simd.u32x4)(raw_data(data[32:]))) + msg_3 := intrinsics.unaligned_load((^simd.u32x4)(raw_data(data[48:]))) + + // Reverse for little endian + when ODIN_ENDIAN == .Little { + msg_0 = byteswap_u32x4(msg_0) + msg_1 = byteswap_u32x4(msg_1) + msg_2 = byteswap_u32x4(msg_2) + msg_3 = byteswap_u32x4(msg_3) + } + + tmp_0 := simd.add(msg_0, K_0) + + // Rounds 0-3 + msg_0 = arm.vsha256su0q_u32(msg_0, msg_1) + tmp_2 := state_0 + tmp_1 := simd.add(msg_1, K_1) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_0 = arm.vsha256su1q_u32(msg_0, msg_2, msg_3) + + // Rounds 4-7 + msg_1 = arm.vsha256su0q_u32(msg_1, msg_2) + tmp_2 = state_0 + tmp_0 = simd.add(msg_2, K_2) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_1 = arm.vsha256su1q_u32(msg_1, msg_3, msg_0) + + // Rounds 8-11 + msg_2 = arm.vsha256su0q_u32(msg_2, msg_3) + tmp_2 = state_0 + tmp_1 = simd.add(msg_3, K_3) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_2 = arm.vsha256su1q_u32(msg_2, msg_0, msg_1) + + // Rounds 12-15 + msg_3 = arm.vsha256su0q_u32(msg_3, msg_0) + tmp_2 = state_0 + tmp_0 = simd.add(msg_0, K_4) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_3 = arm.vsha256su1q_u32(msg_3, msg_1, msg_2) + + // Rounds 16-19 + msg_0 = arm.vsha256su0q_u32(msg_0, msg_1) + tmp_2 = state_0 + tmp_1 = simd.add(msg_1, K_5) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_0 = arm.vsha256su1q_u32(msg_0, msg_2, msg_3) + + // Rounds 20-23 + msg_1 = arm.vsha256su0q_u32(msg_1, msg_2) + tmp_2 = state_0 + tmp_0 = simd.add(msg_2, K_6) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_1 = arm.vsha256su1q_u32(msg_1, msg_3, msg_0) + + // Rounds 24-27 + msg_2 = arm.vsha256su0q_u32(msg_2, msg_3) + tmp_2 = state_0 + tmp_1 = simd.add(msg_3, K_7) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_2 = arm.vsha256su1q_u32(msg_2, msg_0, msg_1) + + // Rounds 28-31 + msg_3 = arm.vsha256su0q_u32(msg_3, msg_0) + tmp_2 = state_0 + tmp_0 = simd.add(msg_0, K_8) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_3 = arm.vsha256su1q_u32(msg_3, msg_1, msg_2) + + // Rounds 32-35 + msg_0 = arm.vsha256su0q_u32(msg_0, msg_1) + tmp_2 = state_0 + tmp_1 = simd.add(msg_1, K_9) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_0 = arm.vsha256su1q_u32(msg_0, msg_2, msg_3) + + // Rounds 36-39 + msg_1 = arm.vsha256su0q_u32(msg_1, msg_2) + tmp_2 = state_0 + tmp_0 = simd.add(msg_2, K_10) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_1 = arm.vsha256su1q_u32(msg_1, msg_3, msg_0) + + // Rounds 40-43 + msg_2 = arm.vsha256su0q_u32(msg_2, msg_3) + tmp_2 = state_0 + tmp_1 = simd.add(msg_3, K_11) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + msg_2 = arm.vsha256su1q_u32(msg_2, msg_0, msg_1) + + // Rounds 44-47 + msg_3 = arm.vsha256su0q_u32(msg_3, msg_0) + tmp_2 = state_0 + tmp_0 = simd.add(msg_0, K_12) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + msg_3 = arm.vsha256su1q_u32(msg_3, msg_1, msg_2) + + // Rounds 48-51 + tmp_2 = state_0 + tmp_1 = simd.add(msg_1, K_13) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + + // Rounds 52-55 + tmp_2 = state_0 + tmp_0 = simd.add(msg_2, K_14) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + + // Rounds 56-59 + tmp_2 = state_0 + tmp_1 = simd.add(msg_3, K_15) + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_0) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_0) + + // Rounds 60-63 + tmp_2 = state_0 + state_0 = arm.vsha256hq_u32(state_0, state_1, tmp_1) + state_1 = arm.vsha256h2q_u32(state_1, tmp_2, tmp_1) + + // Combine state + state_0 = simd.add(state_0, abef_save) + state_1 = simd.add(state_1, cdgh_save) + + data = data[BLOCK_SIZE_256:] + } + + intrinsics.unaligned_store((^simd.u32x4)(&ctx.h[0]), state_0) + intrinsics.unaligned_store((^simd.u32x4)(&ctx.h[4]), state_1) +} + +when ODIN_ENDIAN == .Little { + @(private = "file", enable_target_feature = "neon") + byteswap_u32x4 :: #force_inline proc "contextless" (a: simd.u32x4) -> simd.u32x4 { + return transmute(simd.u32x4)( + simd.shuffle( + transmute(simd.u8x16)(a), + transmute(simd.u8x16)(a), + 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12, + ) + ) + } +} \ No newline at end of file diff --git a/core/crypto/sha2/sha2_impl_hw_intel.odin b/core/crypto/sha2/sha256_impl_hw_intel.odin similarity index 100% rename from core/crypto/sha2/sha2_impl_hw_intel.odin rename to core/crypto/sha2/sha256_impl_hw_intel.odin diff --git a/core/crypto/sha2/sha2_impl_hw_gen.odin b/core/crypto/sha2/sha2_impl_hw_gen.odin index 837d0656d..d735e3c61 100644 --- a/core/crypto/sha2/sha2_impl_hw_gen.odin +++ b/core/crypto/sha2/sha2_impl_hw_gen.odin @@ -1,4 +1,6 @@ #+build !amd64 +#+build !arm64 +#+build !arm32 package sha2 @(private = "file") From f82fbc94051955c2024d6a9e8299034a86b29b16 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 15 Mar 2026 11:06:22 +0100 Subject: [PATCH 123/273] -vet-tabs --- core/math/big/private.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/math/big/private.odin b/core/math/big/private.odin index 1feb433b0..1ca706c6d 100644 --- a/core/math/big/private.odin +++ b/core/math/big/private.odin @@ -472,7 +472,7 @@ _private_int_mul_high :: proc(dest, a, b: ^Int, digits: int, allocator := contex t.digit[ix + pb] = carry } - internal_swap(dest, t) + internal_swap(dest, t) internal_destroy(t) return internal_clamp(dest) } From ca73cd395f0eef92a618a12db67e1971dc922a6e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 10:33:52 +0000 Subject: [PATCH 124/273] Fix #6412 --- src/check_expr.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 80df35edc..aa3e26580 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2955,14 +2955,21 @@ gb_internal void check_comparison(CheckerContext *c, Ast *node, Operand *x, Oper if (check_is_assignable_to(c, x, y->type) || check_is_assignable_to(c, y, x->type)) { + if (x->type->failure || y->type->failure) { + // // skip any failures + x->mode = Addressing_Value; + x->type = t_untyped_bool; + return; + } + Type *err_type = x->type; bool defined = false; switch (op) { case Token_CmpEq: case Token_NotEq: - defined = (is_type_comparable(x->type) && is_type_comparable(y->type)) || - (is_operand_nil(*x) && type_has_nil(y->type)) || - (is_operand_nil(*y) && type_has_nil(x->type)); + defined = ((is_operand_nil(*x) && type_has_nil(y->type)) || + (is_operand_nil(*y) && type_has_nil(x->type)) || + is_type_comparable(x->type) && is_type_comparable(y->type)); break; case Token_Lt: case Token_Gt: From e5c7ab0660863a1e191aec546f9e8498d69dae57 Mon Sep 17 00:00:00 2001 From: Barinzaya Date: Sun, 15 Mar 2026 07:11:35 -0400 Subject: [PATCH 125/273] Add fmt field tags to core:container/small_array.Small_Array. This enables fmt (and other packages that use it, like log) to format Small_Arrays with only the used portion of the array. --- core/container/small_array/small_array.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/container/small_array/small_array.odin b/core/container/small_array/small_array.odin index 8498da852..901ed419e 100644 --- a/core/container/small_array/small_array.odin +++ b/core/container/small_array/small_array.odin @@ -21,7 +21,7 @@ Example: } */ Small_Array :: struct($N: int, $T: typeid) where N >= 0 { - data: [N]T, + data: [N]T `fmt:",len"`, len: int, } From 310def1e71ef37869f3c41da10bae8cd73beb096 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 11:42:24 +0000 Subject: [PATCH 126/273] Fix `append_fixed_capacity_elems` --- base/runtime/core_builtin.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 80c8f8752..20ce502b0 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -883,7 +883,7 @@ append_fixed_capacity_elems :: proc "contextless" (array: ^$T/[dynamic; $N]$E, # when size_of(E) != 0 { for i in 0.. Date: Sun, 15 Mar 2026 11:48:49 +0000 Subject: [PATCH 127/273] use `intrinsics.mem_copy` instead of a for-loop --- base/runtime/core_builtin.odin | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 20ce502b0..022778a24 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -881,10 +881,8 @@ append_fixed_capacity_elems :: proc "contextless" (array: ^$T/[dynamic; $N]$E, # n = min(N - len(array), len(args)) - when size_of(E) != 0 { - for i in 0.. (n: int) { +append_fixed_capacity_string :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, args: ..string) -> (n: int) { n_arg: int for arg in args { - n_arg = append_fixed_capacity_elems(array, ..transmute([]E)(arg), loc=loc) + n_arg = append_fixed_capacity_elems(array, ..transmute([]E)(arg)) n += n_arg if n_arg < len(arg) { return From 2f8da5ec677489ac67ae7f56cb979339e0e521c6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 11:55:04 +0000 Subject: [PATCH 128/273] Add fixed capacity dynamic array to the doc-format --- core/odin/doc-format/doc_format.odin | 113 ++++++++++++++------------- src/docs_format.cpp | 110 +++++++++++++------------- src/docs_writer.cpp | 6 ++ 3 files changed, 120 insertions(+), 109 deletions(-) diff --git a/core/odin/doc-format/doc_format.odin b/core/odin/doc-format/doc_format.odin index df36c1b55..3ae75a3f8 100644 --- a/core/odin/doc-format/doc_format.odin +++ b/core/odin/doc-format/doc_format.odin @@ -12,7 +12,7 @@ String :: distinct Array(byte) Version_Type_Major :: 0 Version_Type_Minor :: 3 -Version_Type_Patch :: 1 +Version_Type_Patch :: 2 Version_Type :: struct { major, minor, patch: u8, @@ -168,32 +168,33 @@ Attribute :: struct { } Type_Kind :: enum u32le { - Invalid = 0, - Basic = 1, - Named = 2, - Generic = 3, - Pointer = 4, - Array = 5, - Enumerated_Array = 6, - Slice = 7, - Dynamic_Array = 8, - Map = 9, - Struct = 10, - Union = 11, - Enum = 12, - Parameters = 13, - Proc = 14, - Bit_Set = 15, - Simd_Vector = 16, - SOA_Struct_Fixed = 17, - SOA_Struct_Slice = 18, - SOA_Struct_Dynamic = 19, - Relative_Pointer = 20, - Relative_Multi_Pointer = 21, - Multi_Pointer = 22, - Matrix = 23, - Soa_Pointer = 24, - Bit_Field = 25, + Invalid = 0, + Basic = 1, + Named = 2, + Generic = 3, + Pointer = 4, + Array = 5, + Enumerated_Array = 6, + Slice = 7, + Dynamic_Array = 8, + Map = 9, + Struct = 10, + Union = 11, + Enum = 12, + Parameters = 13, + Proc = 14, + Bit_Set = 15, + Simd_Vector = 16, + SOA_Struct_Fixed = 17, + SOA_Struct_Slice = 18, + SOA_Struct_Dynamic = 19, + Relative_Pointer = 20, + Relative_Multi_Pointer = 21, + Multi_Pointer = 22, + Matrix = 23, + Soa_Pointer = 24, + Bit_Field = 25, + Fixed_Capacity_Dynamic_Array = 26, } Type_Elems_Cap :: 4 @@ -219,13 +220,14 @@ Type :: struct { custom_align: String, // Used by: - // .Array - 1 count: 0=len - // .Enumerated_Array - 1 count: 0=len - // .SOA_Struct_Fixed - 1 count: 0=len - // .Bit_Set - 2 count: 0=lower, 1=upper - // .Simd_Vector - 1 count: 0=len - // .Matrix - 2 count: 0=row_count, 1=column_count - // .Struct - <=2 count: 0=min_field_align, 1=max_field_align + // .Array - 1 count: 0=len + // .Enumerated_Array - 1 count: 0=len + // .SOA_Struct_Fixed - 1 count: 0=len + // .Bit_Set - 2 count: 0=lower, 1=upper + // .Simd_Vector - 1 count: 0=len + // .Matrix - 2 count: 0=row_count, 1=column_count + // .Struct - <=2 count: 0=min_field_align, 1=max_field_align + // .Fixed_Capacity_Dynamic_Array - 1 count: 0=cap elem_count_len: u32le, elem_counts: [Type_Elems_Cap]i64le, @@ -234,27 +236,28 @@ Type :: struct { calling_convention: String, // Used by: - // .Named - 1 type: 0=base type - // .Generic - <1 type: 0=specialization - // .Pointer - 1 type: 0=element - // .Array - 1 type: 0=element - // .Enumerated_Array - 2 types: 0=index and 1=element - // .Slice - 1 type: 0=element - // .Dynamic_Array - 1 type: 0=element - // .Map - 2 types: 0=key, 1=value - // .SOA_Struct_Fixed - 1 type: underlying SOA struct element - // .SOA_Struct_Slice - 1 type: underlying SOA struct element - // .SOA_Struct_Dynamic - 1 type: underlying SOA struct element - // .Union - 0+ types: variants - // .Enum - <1 type: 0=base type - // .Proc - 2 types: 0=parameters, 1=results - // .Bit_Set - <=2 types: 0=element type, 1=underlying type (Underlying_Type flag will be set) - // .Simd_Vector - 1 type: 0=element - // .Relative_Pointer - 2 types: 0=pointer type, 1=base integer - // .Multi_Pointer - 1 type: 0=element - // .Matrix - 1 type: 0=element - // .Soa_Pointer - 1 type: 0=element - // .Bit_Field - 1 type: 0=backing type + // .Named - 1 type: 0=base type + // .Generic - <1 type: 0=specialization + // .Pointer - 1 type: 0=element + // .Array - 1 type: 0=element + // .Enumerated_Array - 2 types: 0=index and 1=element + // .Slice - 1 type: 0=element + // .Dynamic_Array - 1 type: 0=element + // .Map - 2 types: 0=key, 1=value + // .SOA_Struct_Fixed - 1 type: underlying SOA struct element + // .SOA_Struct_Slice - 1 type: underlying SOA struct element + // .SOA_Struct_Dynamic - 1 type: underlying SOA struct element + // .Union - 0+ types: variants + // .Enum - <1 type: 0=base type + // .Proc - 2 types: 0=parameters, 1=results + // .Bit_Set - <=2 types: 0=element type, 1=underlying type (Underlying_Type flag will be set) + // .Simd_Vector - 1 type: 0=element + // .Relative_Pointer - 2 types: 0=pointer type, 1=base integer + // .Multi_Pointer - 1 type: 0=element + // .Matrix - 1 type: 0=element + // .Soa_Pointer - 1 type: 0=element + // .Bit_Field - 1 type: 0=backing type + // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element types: Array(Type_Index), // Used by: diff --git a/src/docs_format.cpp b/src/docs_format.cpp index 2235789d5..4db85b481 100644 --- a/src/docs_format.cpp +++ b/src/docs_format.cpp @@ -15,7 +15,7 @@ struct OdinDocVersionType { #define OdinDocVersionType_Major 0 #define OdinDocVersionType_Minor 3 -#define OdinDocVersionType_Patch 1 +#define OdinDocVersionType_Patch 2 struct OdinDocHeaderBase { u8 magic[8]; @@ -59,31 +59,31 @@ struct OdinDocPosition { }; enum OdinDocTypeKind : u32 { - OdinDocType_Invalid = 0, - OdinDocType_Basic = 1, - OdinDocType_Named = 2, - OdinDocType_Generic = 3, - OdinDocType_Pointer = 4, - OdinDocType_Array = 5, - OdinDocType_EnumeratedArray = 6, - OdinDocType_Slice = 7, - OdinDocType_DynamicArray = 8, - OdinDocType_Map = 9, - OdinDocType_Struct = 10, - OdinDocType_Union = 11, - OdinDocType_Enum = 12, - OdinDocType_Tuple = 13, - OdinDocType_Proc = 14, - OdinDocType_BitSet = 15, - OdinDocType_SimdVector = 16, - OdinDocType_SOAStructFixed = 17, - OdinDocType_SOAStructSlice = 18, - OdinDocType_SOAStructDynamic = 19, - - OdinDocType_MultiPointer = 22, - OdinDocType_Matrix = 23, - OdinDocType_SoaPointer = 24, - OdinDocType_BitField = 25, + OdinDocType_Invalid = 0, + OdinDocType_Basic = 1, + OdinDocType_Named = 2, + OdinDocType_Generic = 3, + OdinDocType_Pointer = 4, + OdinDocType_Array = 5, + OdinDocType_EnumeratedArray = 6, + OdinDocType_Slice = 7, + OdinDocType_DynamicArray = 8, + OdinDocType_Map = 9, + OdinDocType_Struct = 10, + OdinDocType_Union = 11, + OdinDocType_Enum = 12, + OdinDocType_Tuple = 13, + OdinDocType_Proc = 14, + OdinDocType_BitSet = 15, + OdinDocType_SimdVector = 16, + OdinDocType_SOAStructFixed = 17, + OdinDocType_SOAStructSlice = 18, + OdinDocType_SOAStructDynamic = 19, + OdinDocType_MultiPointer = 22, + OdinDocType_Matrix = 23, + OdinDocType_SoaPointer = 24, + OdinDocType_BitField = 25, + OdinDocType_FixedCapacityDynamicArray = 26, }; enum OdinDocTypeFlag_Basic : u32 { @@ -144,13 +144,14 @@ struct OdinDocType { OdinDocString custom_align; // Used by: - // .Array - 1 count: 0=len - // .Enumerated_Array - 1 count: 0=len - // .SOA_Struct_Fixed - 1 count: 0=len - // .Bit_Set - 2 count: 0=lower, 1=upper - // .Simd_Vector - 1 count: 0=len - // .Matrix - 2 count: 0=row_count, 1=column_count - // .Struct - <=2 count: 0=min_field_align, 1=max_field_align + // .Array - 1 count: 0=len + // .Enumerated_Array - 1 count: 0=len + // .SOA_Struct_Fixed - 1 count: 0=len + // .Bit_Set - 2 count: 0=lower, 1=upper + // .Simd_Vector - 1 count: 0=len + // .Matrix - 2 count: 0=row_count, 1=column_count + // .Struct - <=2 count: 0=min_field_align, 1=max_field_align + // .Fixed_Capacity_Dynamic_Array - 1 count: 0=cap u32 elem_count_len; i64 elem_counts[OdinDocType_ElemsCap]; @@ -159,27 +160,28 @@ struct OdinDocType { OdinDocString calling_convention; // Used by: - // .Named - 1 type: 0=base type - // .Generic - <1 type: 0=specialization - // .Pointer - 1 type: 0=element - // .Array - 1 type: 0=element - // .Enumerated_Array - 2 types: 0=index and 1=element - // .Slice - 1 type: 0=element - // .Dynamic_Array - 1 type: 0=element - // .Map - 2 types: 0=key, 1=value - // .SOA_Struct_Fixed - 1 type: underlying SOA struct element - // .SOA_Struct_Slice - 1 type: underlying SOA struct element - // .SOA_Struct_Dynamic - 1 type: underlying SOA struct element - // .Union - 0+ types: variants - // .Enum - <1 type: 0=base type - // .Proc - 2 types: 0=parameters, 1=results - // .Bit_Set - <=2 types: 0=element type, 1=underlying type (Underlying_Type flag will be set) - // .Simd_Vector - 1 type: 0=element - // .Relative_Pointer - 2 types: 0=pointer type, 1=base integer - // .Multi_Pointer - 1 type: 0=element - // .Matrix - 1 type: 0=element - // .Soa_Pointer - 1 type: 0=element - // .Bit_Field - 1 type: 0=backing type + // .Named - 1 type: 0=base type + // .Generic - <1 type: 0=specialization + // .Pointer - 1 type: 0=element + // .Array - 1 type: 0=element + // .Enumerated_Array - 2 types: 0=index and 1=element + // .Slice - 1 type: 0=element + // .Dynamic_Array - 1 type: 0=element + // .Map - 2 types: 0=key, 1=value + // .SOA_Struct_Fixed - 1 type: underlying SOA struct element + // .SOA_Struct_Slice - 1 type: underlying SOA struct element + // .SOA_Struct_Dynamic - 1 type: underlying SOA struct element + // .Union - 0+ types: variants + // .Enum - <1 type: 0=base type + // .Proc - 2 types: 0=parameters, 1=results + // .Bit_Set - <=2 types: 0=element type, 1=underlying type (Underlying_Type flag will be set) + // .Simd_Vector - 1 type: 0=element + // .Relative_Pointer - 2 types: 0=pointer type, 1=base integer + // .Multi_Pointer - 1 type: 0=element + // .Matrix - 1 type: 0=element + // .Soa_Pointer - 1 type: 0=element + // .Bit_Field - 1 type: 0=backing type + // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element OdinDocArray types; // Used by: diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 3edd7da9d..d021b3fc2 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -576,6 +576,12 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca doc_type.kind = OdinDocType_DynamicArray; doc_type.types = odin_doc_type_as_slice(w, type->DynamicArray.elem); break; + case Type_FixedCapacityDynamicArray: + doc_type.kind = OdinDocType_FixedCapacityDynamicArray; + doc_type.elem_count_len = 1; + doc_type.elem_counts[0] = type->FixedCapacityDynamicArray.capacity; + doc_type.types = odin_doc_type_as_slice(w, type->FixedCapacityDynamicArray.elem); + break; case Type_Map: doc_type.kind = OdinDocType_Map; { From f123fb1e916bfe272bf800dd87beb30c05ee5a6c Mon Sep 17 00:00:00 2001 From: andzdroid Date: Sun, 15 Mar 2026 12:48:41 +0000 Subject: [PATCH 129/273] encoding/cbor: fix order-dependent partial unmarshals --- core/encoding/cbor/unmarshal.odin | 13 +------------ tests/core/encoding/cbor/test_core_cbor.odin | 2 ++ 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/core/encoding/cbor/unmarshal.odin b/core/encoding/cbor/unmarshal.odin index 043b2ec60..9a1e584fa 100644 --- a/core/encoding/cbor/unmarshal.odin +++ b/core/encoding/cbor/unmarshal.odin @@ -661,8 +661,7 @@ _unmarshal_map :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header, unknown := length == -1 fields := reflect.struct_fields_zipped(ti.id) - idx := 0 - for ; idx < len(fields) && (unknown || idx < length); idx += 1 { + for idx := 0; unknown || idx < length; idx += 1 { // Decode key, keys can only be strings. key: string if keyv, kerr := decode_key(d, v, context.temp_allocator); unknown && kerr == .Break { @@ -710,16 +709,6 @@ _unmarshal_map :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header, _unmarshal_value(d, fany, _decode_header(r) or_return) or_return } - // If there are fields left in the map that did not get decoded into the struct, decode and discard them. - if !unknown { - for _ in idx.. Date: Sun, 15 Mar 2026 15:25:54 +0100 Subject: [PATCH 130/273] Fix #6425 --- core/compress/common.odin | 2 -- core/compress/zlib/zlib.odin | 18 +++++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/core/compress/common.odin b/core/compress/common.odin index d78aec328..07ea7b71c 100644 --- a/core/compress/common.odin +++ b/core/compress/common.odin @@ -368,8 +368,6 @@ refill_lsb_from_memory :: #force_inline proc(z: ^Context_Memory_Input, width := if len(z.input_data) != 0 { b = u64(z.input_data[0]) z.input_data = z.input_data[1:] - } else { - b = 0 } z.code_buffer |= b << u8(z.num_bits) diff --git a/core/compress/zlib/zlib.odin b/core/compress/zlib/zlib.odin index e484a4958..72664846e 100644 --- a/core/compress/zlib/zlib.odin +++ b/core/compress/zlib/zlib.odin @@ -326,7 +326,7 @@ decode_huffman :: proc(z: ^$C, t: ^Huffman_Table) -> (r: u16, err: Error) #no_bo return 0, .Code_Buffer_Malformed } compress.refill_lsb(z) - if z.num_bits > 63 { + if z.code_buffer == 0 { return 0, .Stream_Too_Short } } @@ -491,7 +491,7 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all */ expected_output_size = max(max(expected_output_size, compress.COMPRESS_OUTPUT_ALLOCATE_MIN), 512) - // fmt.printf("\nZLIB: Expected Payload Size: %v\n\n", expected_output_size); + // fmt.printfln("ZLIB: Expected Payload Size: %v", expected_output_size) if expected_output_size > 0 && expected_output_size <= compress.COMPRESS_OUTPUT_ALLOCATE_MAX { /* @@ -522,11 +522,16 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all final := u32(0) type := u32(0) + defer if int(z.bytes_written) != len(z.output.buf) { + resize(&z.output.buf, int(z.bytes_written)) + } + for { final = compress.read_bits_lsb(z, 1) type = compress.read_bits_lsb(z, 2) - // fmt.printf("Final: %v | Type: %v\n", final, type) + // fmt.printfln("len(z): %v", len(z.input_data)) + // fmt.printfln("Final: %v | Type: %v", final, type) switch type { case 0: @@ -561,7 +566,6 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all case 3: return .BType_3 case: - // fmt.printf("Err: %v | Final: %v | Type: %v\n", err, final, type) if type == 1 { // Use fixed code lengths. build_huffman(z_repeat, Z_FIXED_LENGTH[:]) or_return @@ -590,7 +594,6 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all for n < ntot { c = decode_huffman(z, codelength_ht) or_return - if c < 0 || c >= 19 { return .Huffman_Bad_Code_Lengths } @@ -635,15 +638,12 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all } parse_huffman_block(z, z_repeat, z_offset) or_return } + if final == 1 { break } } - if int(z.bytes_written) != len(z.output.buf) { - resize(&z.output.buf, int(z.bytes_written)) or_return - } - return nil } From a0685f0511e9452e35cb77a7c125f2d190292d49 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 15:39:52 +0000 Subject: [PATCH 131/273] Add `intrinsics.likely` and `intrinsics.unlikely` --- base/intrinsics/intrinsics.odin | 4 +++- src/check_builtin.cpp | 27 +++++++++++++++++++++++++++ src/checker_builtin_procs.hpp | 6 +++++- src/llvm_backend_proc.cpp | 18 ++++++++++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index a4a761f44..ee99da1b3 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -77,7 +77,9 @@ prefetch_write_instruction :: proc(address: rawptr, #const locality: i32 /* 0..= prefetch_write_data :: proc(address: rawptr, #const locality: i32 /* 0..=3 */) --- // Compiler Hints -expect :: proc(val, expected_val: $T) -> T --- +expect :: proc(val, expected_val: $T) -> T --- +likely :: proc(val: $T) -> T where type_is_boolean(T) --- +unlikely :: proc(val: $T) -> T where type_is_boolean(T) --- // Linux and Darwin Only syscall :: proc(id: uintptr, args: ..uintptr) -> uintptr --- diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 186c0bd67..861d72fcb 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -6257,6 +6257,33 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As operand->type = x.type; } break; + + case BuiltinProc_likely: + case BuiltinProc_unlikely: + { + Operand x = {}; + check_expr(c, &x, ce->args[0]); + if (x.mode == Addressing_Invalid) { + return false; + } + if (!is_type_boolean(x.type)) { + gbString xt = type_to_string(x.type); + error(x.expr, "Expected a boolean expression to '%.*s', got %s", LIT(builtin_name), xt); + gb_string_free(xt); + *operand = x; // minimize error propagation + return true; + } + + if (x.mode == Addressing_Constant) { + // NOTE(bill): just completely ignore this intrinsic entirely + *operand = x; + return true; + } + + operand->mode = Addressing_Value; + operand->type = x.type; + } + break; case BuiltinProc_prefetch_read_instruction: case BuiltinProc_prefetch_read_data: diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index 107f333fd..f73422932 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -144,6 +144,8 @@ BuiltinProc__atomic_end, BuiltinProc_fixed_point_div_sat, BuiltinProc_expect, + BuiltinProc_likely, + BuiltinProc_unlikely, BuiltinProc__simd_begin, BuiltinProc_simd_add, @@ -527,7 +529,9 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("fixed_point_mul_sat"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("fixed_point_div_sat"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics}, - {STR_LIT("expect"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("expect"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("likely"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("unlikely"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT(""), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_add"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 840bbfb19..9e2429111 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -3369,6 +3369,24 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu return lb_emit_conv(p, res, t); } + case BuiltinProc_likely: + case BuiltinProc_unlikely: + { + Type *t = default_type(tv.type); + lbValue x = lb_emit_conv(p, lb_build_expr(p, ce->args[0]), t); + lbValue y = lb_const_bool(p->module, t, id == BuiltinProc_likely); + + char const *name = "llvm.expect"; + + LLVMTypeRef types[1] = {lb_type(p->module, t)}; + lbValue res = {}; + LLVMValueRef args[2] = { x.value, y.value }; + + res.value = lb_call_intrinsic(p, name, args, gb_count_of(args), types, gb_count_of(types)); + res.type = t; + return lb_emit_conv(p, res, t); + } + case BuiltinProc_prefetch_read_instruction: case BuiltinProc_prefetch_read_data: case BuiltinProc_prefetch_write_instruction: From c23d2793df60ec156f3fd8fe46d40fc5fd9b3893 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 15:45:29 +0000 Subject: [PATCH 132/273] Fix `lb_convert_struct_index` for FCD arrays --- src/llvm_backend_utility.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 349e8c85b..ed0b14273 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1061,6 +1061,17 @@ gb_internal i32 lb_convert_struct_index(lbModule *m, Type *t, i32 index) { break; } } + if (t->kind == Type_FixedCapacityDynamicArray) { + switch (index) { + case 0: return 0; // data + case 1: + if (t->FixedCapacityDynamicArray.padding_needed > 0) { + return 2; + } + return 1; + } + } + return index; } @@ -1404,6 +1415,12 @@ gb_internal lbValue lb_emit_struct_ev(lbProcedure *p, lbValue s, i32 index) { } break; + case Type_FixedCapacityDynamicArray: + switch (index) { + case 0: result_type = alloc_type_array(t->FixedCapacityDynamicArray.elem, t->FixedCapacityDynamicArray.capacity); break; + case 1: result_type = t_int; break; + } + case Type_Map: { init_map_internal_debug_types(t); From 55f398b7340ca10d0cc24a8756c142c7674f511d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 15:53:28 +0000 Subject: [PATCH 133/273] Add `#no_bounds_check` to appropriate procedures --- base/runtime/internal.odin | 8 ++--- core/strings/strings.odin | 68 ++++++++++++++++++------------------- core/unicode/utf8/utf8.odin | 20 +++++------ 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index cf96098b8..12f0dceca 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -718,7 +718,7 @@ quaternion256_eq :: #force_inline proc "contextless" (a, b: quaternion256) -> bo quaternion256_ne :: #force_inline proc "contextless" (a, b: quaternion256) -> bool { return real(a) != real(b) || imag(a) != imag(b) || jmag(a) != jmag(b) || kmag(a) != kmag(b) } -string_decode_rune :: proc "contextless" (s: string) -> (rune, int) { +string_decode_rune :: proc "contextless" (s: string) -> (rune, int) #no_bounds_check { // NOTE(bill): Duplicated here to remove dependency on package unicode/utf8 @(static, rodata) accept_sizes := [256]u8{ @@ -797,7 +797,7 @@ string_decode_rune :: proc "contextless" (s: string) -> (rune, int) { return rune(s0&MASK4)<<18 | rune(b1&MASKX)<<12 | rune(b2&MASKX)<<6 | rune(b3&MASKX), 4 } -string_decode_last_rune :: proc "contextless" (s: string) -> (rune, int) { +string_decode_last_rune :: proc "contextless" (s: string) -> (rune, int) #no_bounds_check { RUNE_ERROR :: '\ufffd' RUNE_SELF :: 0x80 UTF_MAX :: 4 @@ -833,7 +833,7 @@ string_decode_last_rune :: proc "contextless" (s: string) -> (rune, int) { } -string16_decode_rune :: proc "contextless" (s: string16) -> (rune, int) { +string16_decode_rune :: proc "contextless" (s: string16) -> (rune, int) #no_bounds_check { REPLACEMENT_CHAR :: '\ufffd' _surr1 :: 0xd800 _surr2 :: 0xdc00 @@ -861,7 +861,7 @@ string16_decode_rune :: proc "contextless" (s: string16) -> (rune, int) { return r, w } -string16_decode_last_rune :: proc "contextless" (s: string16) -> (rune, int) { +string16_decode_last_rune :: proc "contextless" (s: string16) -> (rune, int) #no_bounds_check { REPLACEMENT_CHAR :: '\ufffd' _surr1 :: 0xd800 _surr2 :: 0xdc00 diff --git a/core/strings/strings.odin b/core/strings/strings.odin index d55fea69e..40dc11e75 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -112,7 +112,7 @@ NOTE: Failure to find the byte results in returning the entire string. Returns: - res: The truncated string */ -truncate_to_byte :: proc "contextless" (str: string, b: byte) -> (res: string) { +truncate_to_byte :: proc "contextless" (str: string, b: byte) -> (res: string) #no_bounds_check { n := index_byte(str, b) if n < 0 { n = len(str) @@ -130,7 +130,7 @@ Inputs: Returns: - res: The truncated string */ -truncate_to_rune :: proc(str: string, r: rune) -> (res: string) { +truncate_to_rune :: proc(str: string, r: rune) -> (res: string) #no_bounds_check { n := index_rune(str, r) if n < 0 { n = len(str) @@ -152,7 +152,7 @@ Returns: - res: The cloned string from the byte array with a null-byte - err: An optional allocator error if one occured, `nil` otherwise */ -clone_from_bytes :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { +clone_from_bytes :: proc(s: []byte, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { c := make([]byte, len(s)+1, allocator, loc) or_return copy(c, s) c[len(s)] = 0 @@ -398,7 +398,7 @@ Output: false */ -equal_fold :: proc(u, v: string) -> (res: bool) { +equal_fold :: proc(u, v: string) -> (res: bool) #no_bounds_check { s, t := u, v loop: for s != "" && t != "" { sr, tr: rune @@ -483,7 +483,7 @@ prefix_length :: proc "contextless" (a, b: string) -> (n: int) { n = runtime.memory_prefix_length(raw_data(a), raw_data(b), min(len(a), len(b))) lim := max(n - UTF_MAX + 1, 0) - for l := n; l > lim; l -= 1 { + #no_bounds_check for l := n; l > lim; l -= 1 { r, _ := runtime.string_decode_rune(a[l - 1:]) if r != RUNE_ERROR { if l > 0 && (a[l - 1] & 0xc0 == 0xc0) { @@ -592,7 +592,7 @@ Output: true */ -has_suffix :: proc(s, suffix: string) -> (result: bool) { +has_suffix :: proc(s, suffix: string) -> (result: bool) #no_bounds_check { return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix } @@ -631,7 +631,7 @@ Output: a...b...c */ -join :: proc(a: []string, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { +join :: proc(a: []string, sep: string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { if len(a) == 0 { return "", nil } @@ -678,7 +678,7 @@ Output: abc */ -concatenate :: proc(a: []string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error { +concatenate :: proc(a: []string, allocator := context.allocator, loc := #caller_location) -> (res: string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { if len(a) == 0 { return "", nil } @@ -812,7 +812,7 @@ Returns: - err: An optional allocator error if one occured, `nil` otherwise */ @private -_split :: proc(s_, sep: string, sep_save, n_: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) { +_split :: proc(s_, sep: string, sep_save, n_: int, allocator := context.allocator, loc := #caller_location) -> (res: []string, err: runtime.Allocator_Error) #no_bounds_check { s, n := s_, n_ if n == 0 { @@ -1037,7 +1037,7 @@ _split_iterator :: proc(s: ^string, sep: string, sep_save: int) -> (res: string, } else { m = index(s^, sep) } - if m < 0 { + #no_bounds_check if m < 0 { // not found res = s[:] ok = res != "" @@ -1084,7 +1084,7 @@ Output: */ split_by_byte_iterator :: proc(s: ^string, sep: u8) -> (res: string, ok: bool) { m := index_byte(s^, sep) - if m < 0 { + #no_bounds_check if m < 0 { // not found res = s[:] ok = res != "" @@ -1181,7 +1181,7 @@ Returns: - res: The trimmed string as a slice of the original. */ @(private) -_trim_cr :: proc(s: string) -> (res: string) { +_trim_cr :: proc(s: string) -> (res: string) #no_bounds_check { n := len(s) if n > 0 { if s[n-1] == '\r' { @@ -1591,8 +1591,8 @@ Output: -1 */ -index :: proc "contextless" (s, substr: string) -> (res: int) { - hash_str_rabin_karp :: proc "contextless" (s: string) -> (hash: u32 = 0, pow: u32 = 1) { +index :: proc "contextless" (s, substr: string) -> (res: int) #no_bounds_check { + hash_str_rabin_karp :: proc "contextless" (s: string) -> (hash: u32 = 0, pow: u32 = 1) #no_bounds_check { for i := 0; i < len(s); i += 1 { hash = hash*PRIME_RABIN_KARP + u32(s[i]) } @@ -1671,8 +1671,8 @@ Output: -1 */ -last_index :: proc(s, substr: string) -> (res: int) { - hash_str_rabin_karp_reverse :: proc(s: string) -> (hash: u32 = 0, pow: u32 = 1) { +last_index :: proc(s, substr: string) -> (res: int) #no_bounds_check { + hash_str_rabin_karp_reverse :: proc "contextless" (s: string) -> (hash: u32 = 0, pow: u32 = 1) #no_bounds_check { for i := len(s) - 1; i >= 0; i -= 1 { hash = hash*PRIME_RABIN_KARP + u32(s[i]) } @@ -1751,7 +1751,7 @@ Output: -1 */ -index_any :: proc(s, chars: string) -> (res: int) { +index_any :: proc(s, chars: string) -> (res: int) #no_bounds_check { if chars == "" { return -1 } @@ -1815,7 +1815,7 @@ Output: -1 */ -last_index_any :: proc(s, chars: string) -> (res: int) { +last_index_any :: proc(s, chars: string) -> (res: int) #no_bounds_check { if chars == "" { return -1 } @@ -1876,7 +1876,7 @@ Returns: - idx: the index of the first matching substring - width: the length of the found substring */ -index_multi :: proc(s: string, substrs: []string) -> (idx: int, width: int) { +index_multi :: proc(s: string, substrs: []string) -> (idx: int, width: int) #no_bounds_check { idx = -1 if s == "" || len(substrs) <= 0 { return @@ -1939,7 +1939,7 @@ Output: 0 */ -count :: proc(s, substr: string) -> (res: int) { +count :: proc(s, substr: string) -> (res: int) #no_bounds_check { if len(substr) == 0 { // special case return rune_count(s) + 1 } @@ -2014,7 +2014,7 @@ repeat :: proc(s: string, count: int, allocator := context.allocator, loc := #ca b := make([]byte, len(s)*count, allocator, loc) or_return i := copy(b, s) - for i < len(b) { // 2^N trick to reduce the need to copy + #no_bounds_check for i < len(b) { // 2^N trick to reduce the need to copy copy(b[i:], b[:i]) i *= 2 } @@ -2121,7 +2121,7 @@ replace :: proc(s, old, new: string, n: int, allocator := context.allocator, loc w := 0 start := 0 - for i := 0; i < byte_count; i += 1 { + #no_bounds_check for i := 0; i < byte_count; i += 1 { j := start if len(old) == 0 { if i > 0 { @@ -2438,7 +2438,7 @@ Output: test */ -trim_right_proc :: proc(s: string, p: proc(rune) -> bool) -> (res: string) { +trim_right_proc :: proc(s: string, p: proc(rune) -> bool) -> (res: string) #no_bounds_check { i := last_index_proc(s, p, false) if i >= 0 && s[i] >= utf8.RUNE_SELF { _, w := utf8.decode_rune_in_string(s[i:]) @@ -2460,7 +2460,7 @@ Inputs: Returns: - res: The trimmed string as a slice of the original, empty when no match */ -trim_right_proc_with_state :: proc(s: string, p: proc(rawptr, rune) -> bool, state: rawptr) -> (res: string) { +trim_right_proc_with_state :: proc(s: string, p: proc(rawptr, rune) -> bool, state: rawptr) -> (res: string) #no_bounds_check { i := last_index_proc_with_state(s, p, state, false) if i >= 0 && s[i] >= utf8.RUNE_SELF { _, w := utf8.decode_rune_in_string(s[i:]) @@ -2635,7 +2635,7 @@ Output: testing */ -trim_prefix :: proc(s, prefix: string) -> (res: string) { +trim_prefix :: proc(s, prefix: string) -> (res: string) #no_bounds_check { if has_prefix(s, prefix) { return s[len(prefix):] } @@ -2668,7 +2668,7 @@ Output: todo.doc */ -trim_suffix :: proc(s, suffix: string) -> (res: string) { +trim_suffix :: proc(s, suffix: string) -> (res: string) #no_bounds_check { if has_suffix(s, suffix) { return s[:len(s)-len(suffix)] } @@ -2848,7 +2848,7 @@ scrub :: proc(s: string, replacement: string, allocator := context.allocator, lo cursor := 0 origin := str - for len(str) > 0 { + #no_bounds_check for len(str) > 0 { r, w := utf8.decode_rune_in_string(str) if r == utf8.RUNE_ERROR { @@ -2907,7 +2907,7 @@ reverse :: proc(s: string, allocator := context.allocator, loc := #caller_locati buf := make([]byte, n, allocator, loc) or_return i := n - for len(str) > 0 { + #no_bounds_check for len(str) > 0 { _, w := utf8.decode_rune_in_string(str) i -= w copy(buf[i:], str[:w]) @@ -2963,7 +2963,7 @@ expand_tabs :: proc(s: string, tab_size: int, allocator := context.allocator, lo str := s column: int - for len(str) > 0 { + #no_bounds_check for len(str) > 0 { r, w := utf8.decode_rune_in_string(str) if r == '\t' { @@ -3028,7 +3028,7 @@ Output: true */ -partition :: proc(str, sep: string) -> (head, match, tail: string) { +partition :: proc(str, sep: string) -> (head, match, tail: string) #no_bounds_check { i := index(str, sep) if i == -1 { head = str @@ -3166,14 +3166,14 @@ Inputs: write_pad_string :: proc(w: io.Writer, pad: string, pad_len, remains: int) { repeats := remains / pad_len - for i := 0; i < repeats; i += 1 { + for _ in 0.. (field: string, ok: bool) { +fields_iterator :: proc(s: ^string) -> (field: string, ok: bool) #no_bounds_check { start, end := -1, -1 for r, offset in s { end = offset @@ -3404,7 +3404,7 @@ levenshtein_distance :: proc(a, b: string, allocator := context.allocator, loc : } @(private) -internal_substring :: proc(s: string, rune_start: int, rune_end: int) -> (sub: string, ok: bool) { +internal_substring :: proc(s: string, rune_start: int, rune_end: int) -> (sub: string, ok: bool) #no_bounds_check { sub = s ok = true diff --git a/core/unicode/utf8/utf8.odin b/core/unicode/utf8/utf8.odin index 85687b749..c53b2e3a4 100644 --- a/core/unicode/utf8/utf8.odin +++ b/core/unicode/utf8/utf8.odin @@ -63,7 +63,7 @@ accept_sizes := [256]u8{ } @(require_results) -encode_rune :: proc "contextless" (c: rune) -> ([4]u8, int) { +encode_rune :: proc "contextless" (c: rune) -> ([4]u8, int) #no_bounds_check { r := c buf: [4]u8 @@ -109,7 +109,7 @@ decode_rune_in_string :: #force_inline proc "contextless" (s: string) -> (rune, return decode_rune_in_bytes(transmute([]u8)s) } @(require_results) -decode_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { +decode_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) #no_bounds_check { n := len(s) if n < 1 { return RUNE_ERROR, 0 @@ -147,7 +147,7 @@ decode_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { } @(require_results) -string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (runes: []rune, err: runtime.Allocator_Error) #optional_allocator_error { +string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (runes: []rune, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { n := rune_count_in_string(s) runes = make([]rune, n, allocator) or_return @@ -160,7 +160,7 @@ string_to_runes :: proc "odin" (s: string, allocator := context.allocator) -> (r } @(require_results) -runes_to_string :: proc "odin" (runes: []rune, allocator := context.allocator) -> (s: string, err: runtime.Allocator_Error) #optional_allocator_error { +runes_to_string :: proc "odin" (runes: []rune, allocator := context.allocator) -> (s: string, err: runtime.Allocator_Error) #optional_allocator_error #no_bounds_check { byte_count := 0 for r in runes { _, w := encode_rune(r) @@ -190,7 +190,7 @@ decode_last_rune_in_string :: #force_inline proc "contextless" (s: string) -> (r return decode_last_rune_in_bytes(transmute([]u8)s) } @(require_results) -decode_last_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) { +decode_last_rune_in_bytes :: proc "contextless" (s: []u8) -> (rune, int) #no_bounds_check { r: rune size: int start, end, limit: int @@ -239,7 +239,7 @@ rune_at_pos :: proc "contextless" (s: string, pos: int) -> rune { } @(require_results) -rune_string_at_pos :: proc "contextless" (s: string, pos: int) -> string { +rune_string_at_pos :: proc "contextless" (s: string, pos: int) -> string #no_bounds_check { if pos < 0 { return "" } @@ -256,7 +256,7 @@ rune_string_at_pos :: proc "contextless" (s: string, pos: int) -> string { } @(require_results) -rune_at :: proc "contextless" (s: string, byte_index: int) -> rune { +rune_at :: proc "contextless" (s: string, byte_index: int) -> rune #no_bounds_check { r, _ := decode_rune_in_string(s[byte_index:]) return r } @@ -292,7 +292,7 @@ valid_rune :: proc "contextless" (r: rune) -> bool { } @(require_results) -valid_string :: proc "contextless" (s: string) -> bool { +valid_string :: proc "contextless" (s: string) -> bool #no_bounds_check { n := len(s) for i := 0; i < n; { si := s[i] @@ -340,7 +340,7 @@ rune_count_in_string :: #force_inline proc(s: string) -> int { return rune_count_in_bytes(transmute([]u8)s) } @(require_results) -rune_count_in_bytes :: proc "contextless" (s: []u8) -> int { +rune_count_in_bytes :: proc "contextless" (s: []u8) -> int #no_bounds_check { count := 0 n := len(s) @@ -402,7 +402,7 @@ full_rune :: proc{ // full_rune_in_bytes reports if the bytes in b begin with a full utf-8 encoding of a rune or not // An invalid encoding is considered a full rune since it will convert as an error rune of width 1 (RUNE_ERROR) @(require_results) -full_rune_in_bytes :: proc "contextless" (b: []byte) -> bool { +full_rune_in_bytes :: proc "contextless" (b: []byte) -> bool #no_bounds_check { n := len(b) if n == 0 { return false From 0314c91a64ae105a85657b59c7f2010cb48f8e5d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 16:14:46 +0000 Subject: [PATCH 134/273] Add error message for `foo := Foo{&foo}` where the type of `foo` is not determined yet --- src/check_expr.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 492b38ffa..e66498b6d 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -12009,6 +12009,17 @@ gb_internal ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast if (o->mode != Addressing_Invalid) { check_unary_expr(c, o, ue->op, node); + } else { + ERROR_BLOCK(); + gbString s = expr_to_string(ue->expr); + defer (gb_string_free(s)); + + error(node, "Cannot address value '%s' as it has not got a determined type yet", s); + + Entity *e = entity_of_node(ue->expr); + if (e != nullptr && e->kind == Entity_Variable) { + error_line("\tSuggestion: Add an explicit type to the declaration of '%.*s' rather than relying on type inference", LIT(e->token.string)); + } } o->expr = node; return Expr_Expr; From c51391f8cb45111d7b7ed7e2ce86124505631054 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 17:15:16 +0000 Subject: [PATCH 135/273] Fix #5129 --- src/llvm_backend_const.cpp | 2 +- src/llvm_backend_expr.cpp | 15 ++++++++++++--- src/llvm_backend_general.cpp | 8 ++++++-- src/llvm_backend_type.cpp | 2 +- src/types.cpp | 19 +++++++++++++++++-- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 289d3daa2..954545db6 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -836,7 +836,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb Type *tag_type = union_tag_type(bt); LLVMTypeRef llvm_tag_type = lb_type(m, tag_type); - i64 tag_index = union_variant_index(bt, variant_type); + i64 tag_index = union_variant_index_checked(bt, variant_type); GB_ASSERT(tag_index >= 0); values[value_count++] = LLVMConstInt(llvm_tag_type, tag_index, false); i64 used_size = block_size + type_size_of(tag_type); diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index b3aa57f16..d700db866 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -5388,11 +5388,20 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { Type *fet = field_expr.type; GB_ASSERT(fet->kind != Type_Tuple); - // HACK TODO(bill): THIS IS A MASSIVE HACK!!!! if (is_type_union(ft) && !are_types_identical(fet, ft) && !is_type_untyped(fet)) { - GB_ASSERT_MSG(union_variant_index(ft, fet) >= 0, "%s", type_to_string(fet)); + if (union_is_variant_of(ft, fet)) { + // NOTE(bill, 2026-03-15): If it's a direct assignment for a variant to the + // direct union we can just assign it directly to minimize wasted code generation + // + // TODO(bill): Allow this for deeply nested unions too e.g. union{union{T}} + GB_ASSERT_MSG(union_variant_index_checked(ft, fet) >= 0, "%s", type_to_string(fet)); + GB_ASSERT(are_types_identical(type_deref(gep.type), ft)); - lb_emit_store_union_variant(p, gep, field_expr, fet); + lb_emit_store_union_variant(p, gep, field_expr, fet); + } else { + lbValue fv = lb_emit_conv(p, field_expr, ft); + lb_emit_store(p, gep, fv); + } } else { lbValue fv = lb_emit_conv(p, field_expr, ft); lb_emit_store(p, gep, fv); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 32a669235..fea4be7b2 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -1497,7 +1497,7 @@ gb_internal lbValue lb_addr_load(lbProcedure *p, lbAddr const &addr) { } gb_internal lbValue lb_const_union_tag(lbModule *m, Type *u, Type *v) { - return lb_const_value(m, union_tag_type(u), exact_value_i64(union_variant_index(u, v))); + return lb_const_value(m, union_tag_type(u), exact_value_i64(union_variant_index_checked(u, v))); } gb_internal lbValue lb_emit_union_tag_ptr(lbProcedure *p, lbValue u) { @@ -1540,13 +1540,17 @@ gb_internal void lb_emit_store_union_variant_tag(lbProcedure *p, lbValue parent, // No tag needed! } else { lbValue tag_ptr = lb_emit_union_tag_ptr(p, parent); - lb_emit_store(p, tag_ptr, lb_const_union_tag(p->module, t, variant_type)); + lbValue tag = lb_const_union_tag(p->module, t, variant_type); + lb_emit_store(p, tag_ptr, tag); } } gb_internal void lb_emit_store_union_variant(lbProcedure *p, lbValue parent, lbValue variant, Type *variant_type) { Type *pt = base_type(type_deref(parent.type)); GB_ASSERT(pt->kind == Type_Union); + + GB_ASSERT_MSG(union_is_variant_of(pt, variant_type), "%s %s", type_to_string(pt), type_to_string(variant_type)); + if (pt->Union.kind == UnionType_shared_nil) { GB_ASSERT(type_size_of(variant_type)); diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 82156d32a..b41ba2f15 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -1064,7 +1064,7 @@ gb_internal void lb_setup_type_info_data_giant_array(lbModule *m, i64 global_typ i64 tag_index = 0; if (tag_type != nullptr) { - tag_index = union_variant_index(ut, tag_type); + tag_index = union_variant_index_checked(ut, tag_type); } GB_ASSERT(tag_index <= Typeid__COUNT); diff --git a/src/types.cpp b/src/types.cpp index 2f13ed1f1..0f7aa2199 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3375,7 +3375,7 @@ gb_internal bool union_variant_index_types_equal(Type *v, Type *vt) { return false; } -gb_internal i64 union_variant_index(Type *u, Type *v) { +gb_internal i64 union_variant_index_checked(Type *u, Type *v) { u = base_type(u); GB_ASSERT(u->kind == Type_Union); @@ -3389,9 +3389,24 @@ gb_internal i64 union_variant_index(Type *u, Type *v) { } } } - return 0; + GB_PANIC("unfound variant -> %s %s", type_to_string(u), type_to_string(v)); + return -1; } +gb_internal bool union_is_variant_of(Type *u, Type *v) { + u = base_type(u); + GB_ASSERT(u->kind == Type_Union); + + for_array(i, u->Union.variants) { + Type *vt = u->Union.variants[i]; + if (union_variant_index_types_equal(v, vt)) { + return true; + } + } + return false; +} + + gb_internal i64 union_tag_size(Type *u) { u = base_type(u); GB_ASSERT(u->kind == Type_Union); From 70dd93db8fc31bcd16ca8ea085444d3298145c5e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 17:24:38 +0000 Subject: [PATCH 136/273] Correct `case nil:` handling for unions --- src/llvm_backend_stmt.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 98b45f646..df87e7703 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -2137,7 +2137,13 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss lbValue on_val = {}; if (switch_kind == TypeSwitch_Union) { Type *ut = base_type(type_deref(parent.type)); - on_val = lb_const_union_tag(m, ut, case_type); + if (is_type_untyped_nil(case_type)) { + GB_ASSERT(type_has_nil(ut)); + saw_nil = true; + on_val = lb_const_int(m, union_tag_type(ut), 0); + } else { + on_val = lb_const_union_tag(m, ut, case_type); + } } else if (switch_kind == TypeSwitch_Any) { if (is_type_untyped_nil(case_type)) { From c4ae436ba655c238d1e89134dd7f1923dad56c8d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 17:39:37 +0000 Subject: [PATCH 137/273] Add `This is a compiler error. Please report this.` to all assertions. --- src/gb/gb.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gb/gb.h b/src/gb/gb.h index c52f63cec..3c88ce6ed 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -2522,6 +2522,7 @@ void gb_assert_handler(char const *prefix, char const *condition, char const *fi va_end(va); } gb_printf_err("\n"); + gb_printf_err("This is a compiler error. Please report this.\n"); } b32 gb_is_power_of_two(isize x) { From 4b95e8a040447a2ab939e0faf6ed094701d0a10e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 18:18:02 +0000 Subject: [PATCH 138/273] Add generic count of arrays to to doc-format --- core/odin/doc-format/doc_format.odin | 4 ++-- src/docs_format.cpp | 4 ++-- src/docs_writer.cpp | 26 ++++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/core/odin/doc-format/doc_format.odin b/core/odin/doc-format/doc_format.odin index 3ae75a3f8..28552b346 100644 --- a/core/odin/doc-format/doc_format.odin +++ b/core/odin/doc-format/doc_format.odin @@ -239,7 +239,7 @@ Type :: struct { // .Named - 1 type: 0=base type // .Generic - <1 type: 0=specialization // .Pointer - 1 type: 0=element - // .Array - 1 type: 0=element + // .Array - 1 type: 0=element (and 1=generic index (if exists)) // .Enumerated_Array - 2 types: 0=index and 1=element // .Slice - 1 type: 0=element // .Dynamic_Array - 1 type: 0=element @@ -257,7 +257,7 @@ Type :: struct { // .Matrix - 1 type: 0=element // .Soa_Pointer - 1 type: 0=element // .Bit_Field - 1 type: 0=backing type - // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element + // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element (and 1=generic index (if exists)) types: Array(Type_Index), // Used by: diff --git a/src/docs_format.cpp b/src/docs_format.cpp index 4db85b481..30dcf40b9 100644 --- a/src/docs_format.cpp +++ b/src/docs_format.cpp @@ -163,7 +163,7 @@ struct OdinDocType { // .Named - 1 type: 0=base type // .Generic - <1 type: 0=specialization // .Pointer - 1 type: 0=element - // .Array - 1 type: 0=element + // .Array - 1 type: 0=element (and 1=generic index (if exists)) // .Enumerated_Array - 2 types: 0=index and 1=element // .Slice - 1 type: 0=element // .Dynamic_Array - 1 type: 0=element @@ -181,7 +181,7 @@ struct OdinDocType { // .Matrix - 1 type: 0=element // .Soa_Pointer - 1 type: 0=element // .Bit_Field - 1 type: 0=backing type - // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element + // .Fixed_Capacity_Dynamic_Array - 1 type: 0=element (and 1=generic index (if exists)) OdinDocArray types; // Used by: diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index d021b3fc2..5e9c25016 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -472,6 +472,14 @@ gb_internal OdinDocArray odin_doc_type_as_slice(OdinDocWriter return odin_write_item_as_slice(w, index); } +gb_internal OdinDocArray odin_doc_type2_as_slice(OdinDocWriter *w, Type *type0, Type *type1, bool cache=true) { + OdinDocTypeIndex indices[2] = {}; + indices[0] = odin_doc_type(w, type0, cache); + indices[1] = odin_doc_type(w, type1, cache); + + return odin_write_slice(w, indices, gb_count_of(indices)); +} + gb_internal OdinDocArray odin_doc_add_entity_as_slice(OdinDocWriter *w, Entity *e) { OdinDocEntityIndex index = odin_doc_add_entity(w, e); return odin_write_item_as_slice(w, index); @@ -555,7 +563,13 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca doc_type.kind = OdinDocType_Array; doc_type.elem_count_len = 1; doc_type.elem_counts[0] = type->Array.count; - doc_type.types = odin_doc_type_as_slice(w, type->Array.elem); + if (type->Array.generic_count != nullptr) { + doc_type.types = odin_doc_type2_as_slice(w, + type->Array.elem, + type->Array.generic_count); + } else { + doc_type.types = odin_doc_type_as_slice(w, type->Array.elem); + } break; case Type_EnumeratedArray: doc_type.kind = OdinDocType_EnumeratedArray; @@ -580,7 +594,15 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca doc_type.kind = OdinDocType_FixedCapacityDynamicArray; doc_type.elem_count_len = 1; doc_type.elem_counts[0] = type->FixedCapacityDynamicArray.capacity; - doc_type.types = odin_doc_type_as_slice(w, type->FixedCapacityDynamicArray.elem); + + if (type->FixedCapacityDynamicArray.generic_capacity != nullptr) { + doc_type.types = odin_doc_type2_as_slice(w, + type->FixedCapacityDynamicArray.elem, + type->FixedCapacityDynamicArray.generic_capacity); + + } else { + doc_type.types = odin_doc_type_as_slice(w, type->FixedCapacityDynamicArray.elem); + } break; case Type_Map: doc_type.kind = OdinDocType_Map; From 6fc80d95621bbe70920dccc762747557919fc48b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 18:33:20 +0000 Subject: [PATCH 139/273] Correct `write_type_to_canonical_string` for "untyped" types --- src/name_canonicalization.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index 6d5f54cf8..a99dec0af 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -748,8 +748,8 @@ gb_internal void write_type_to_canonical_string(TypeWriter *w, Type *type) { return; } - type = default_type(type); - GB_ASSERT(!is_type_untyped(type)); + // type = default_type(type); + // GB_ASSERT(!is_type_untyped(type)); switch (type->kind) { case Type_Basic: From 5f5c19fa2cfa85c69912bf45dffa1d2773606887 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 18:58:27 +0000 Subject: [PATCH 140/273] Add deprecation notice to small_array/doc.odin --- core/container/small_array/doc.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/container/small_array/doc.odin b/core/container/small_array/doc.odin index 21d000a10..5696ae58c 100644 --- a/core/container/small_array/doc.odin +++ b/core/container/small_array/doc.odin @@ -1,4 +1,6 @@ /* +Deprecation Notice: Prefer using `[dynamic; N]T` (fixed capacity dynamic arrays). + A dynamic array-like interface on a stack-allocated, fixed-size array. The `Small_Array` type is optimal for scenarios where you need From 55b3ea7c2dc83053a073b2da5e8361c1ea1c7717 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 18:58:48 +0000 Subject: [PATCH 141/273] Allow `@(deprecated=)` on types --- src/check_decl.cpp | 2 ++ src/checker.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 22a74f370..c0358cff7 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -518,6 +518,8 @@ gb_internal void check_type_decl(CheckerContext *ctx, Entity *e, Ast *init_expr, AttributeContext ac = {}; check_decl_attributes(ctx, decl->attributes, type_decl_attribute, &ac); + e->deprecated_message = ac.deprecated_message; + if (e->kind == Entity_TypeName && ac.objc_class != "") { e->TypeName.objc_class_name = ac.objc_class; diff --git a/src/checker.cpp b/src/checker.cpp index ec5abf067..720556a4f 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4282,6 +4282,20 @@ gb_internal DECL_ATTRIBUTE_PROC(type_decl_attribute) { error(elem, "Expected a string or no value for '%.*s'", LIT(name)); } return true; + } else if (name == "deprecated") { + ExactValue ev = check_decl_attribute_value(c, value); + + if (ev.kind == ExactValue_String) { + String msg = ev.value_string; + if (msg.len == 0) { + error(elem, "Deprecation message cannot be an empty string"); + } else { + ac->deprecated_message = msg; + } + } else { + error(elem, "Expected a string value for '%.*s'", LIT(name)); + } + return true; } return false; } From 20dcc8fd80c35f590219a95d940942b621b8fe35 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 19:09:45 +0000 Subject: [PATCH 142/273] Remove use of `@(init)` for checking if Windows has long path support and check on first usage instead --- core/os/path_windows.odin | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/core/os/path_windows.odin b/core/os/path_windows.odin index 1a0245c52..b471ab0b0 100644 --- a/core/os/path_windows.odin +++ b/core/os/path_windows.odin @@ -1,6 +1,7 @@ #+private package os +import "base:intrinsics" import "base:runtime" import "core:strings" import win32 "core:sys/windows" @@ -157,18 +158,30 @@ _get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err } } -@(private) -can_use_long_paths: bool -@(init) -init_long_path_support :: proc "contextless" () { +@(require_results) +has_long_path_support :: proc "contextless" () -> bool { + @(static) + can_use_long_paths_lock: win32.SRWLOCK + @(static) + can_use_long_paths_checked: bool // atomic + @(static) + can_use_long_paths: bool + + if intrinsics.atomic_load_explicit(&can_use_long_paths_checked, .Acquire) == true { + return can_use_long_paths + } + win32.AcquireSRWLockExclusive(&can_use_long_paths_lock) + defer win32.ReleaseSRWLockExclusive(&can_use_long_paths_lock) + defer intrinsics.atomic_store_explicit(&can_use_long_paths_checked, true, .Release) + can_use_long_paths = false key: win32.HKEY res := win32.RegOpenKeyExW(win32.HKEY_LOCAL_MACHINE, win32.L(`SYSTEM\CurrentControlSet\Control\FileSystem`), 0, win32.KEY_READ, &key) defer win32.RegCloseKey(key) if res != 0 { - return + return can_use_long_paths } value: u32 @@ -183,11 +196,13 @@ init_long_path_support :: proc "contextless" () { &size, ) if res != 0 { - return + return can_use_long_paths } if value == 1 { can_use_long_paths = true } + + return can_use_long_paths } @(require_results) @@ -202,10 +217,11 @@ _fix_long_path :: proc(path: string, allocator: runtime.Allocator) -> (win32.wst @(require_results) _fix_long_path_internal :: proc(path: string) -> string { - if can_use_long_paths { + if has_long_path_support() { return path } + // When using win32 to create a directory, the path // cannot be too long that you cannot append an 8.3 // file name, because MAX_PATH is 260, 260-12 = 248 From 0dbda038909ec36cc14a4c321752e74d5f544c59 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 19:40:57 +0000 Subject: [PATCH 143/273] Simplify slice creation as LLVM values --- src/llvm_backend_expr.cpp | 140 +++++++++++++++++++++++++++++++++++ src/llvm_backend_utility.cpp | 33 +++++++++ 2 files changed, 173 insertions(+) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index d700db866..29edf4d2d 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1,4 +1,5 @@ gb_internal lbValue lb_emit_arith_matrix(lbProcedure *p, TokenKind op, lbValue lhs, lbValue rhs, Type *type, bool component_wise); +gb_internal lbValue lb_build_slice_expr_value(lbProcedure *p, Ast *expr); gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) { GB_ASSERT(bit_count <= 64); @@ -4291,6 +4292,24 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { return lb_build_expr(p, se->expr); } } + { + Type *src_type = base_type(type_of_expr(se->expr)); + if (is_type_pointer(src_type)) { + src_type = base_type(type_deref(src_type)); + } + + if (is_type_slice(src_type) || + is_type_dynamic_array(src_type) || + is_type_string(src_type) || + is_type_string16(src_type)) { + return lb_build_slice_expr_value(p, expr); + } + + if (is_type_multi_pointer(src_type) && se->high != nullptr) { + return lb_build_slice_expr_value(p, expr); + } + } + return lb_addr_load(p, lb_build_addr(p, expr)); case_end; @@ -4853,6 +4872,127 @@ gb_internal lbAddr lb_build_addr_index_expr(lbProcedure *p, Ast *expr) { } +gb_internal lbValue lb_build_slice_expr_value(lbProcedure *p, Ast *expr) { + ast_node(se, SliceExpr, expr); + + lbValue base = lb_build_expr(p, se->expr); + Type *type = base_type(base.type); + + if (is_type_pointer(type)) { + type = base_type(type_deref(type)); + base = lb_emit_load(p, base); + } + + lbValue low = lb_const_int(p->module, t_int, 0); + lbValue high = {}; + + if (se->low != nullptr) { + low = lb_correct_endianness(p, lb_build_expr(p, se->low)); + } + if (se->high != nullptr) { + high = lb_correct_endianness(p, lb_build_expr(p, se->high)); + } + + bool no_indices = se->low == nullptr && se->high == nullptr; + + switch (type->kind) { + case Type_Slice: { + Type *slice_type = type; + lbValue len = lb_slice_len(p, base); + if (high.value == nullptr) high = len; + + if (!no_indices) { + lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); + } + + lbValue elem = lb_emit_ptr_offset(p, lb_slice_elem(p, base), low); + lbValue new_len = (se->low == nullptr) + ? lb_emit_conv(p, high, t_int) + : lb_emit_arith(p, Token_Sub, high, low, t_int); + + return lb_make_slice_value(p, slice_type, elem, new_len); + } + + case Type_DynamicArray: { + Type *elem_type = type->DynamicArray.elem; + Type *slice_type = alloc_type_slice(elem_type); + + lbValue len = lb_dynamic_array_len(p, base); + if (high.value == nullptr) high = len; + + if (!no_indices) { + lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); + } + + lbValue elem = lb_emit_ptr_offset(p, lb_dynamic_array_elem(p, base), low); + lbValue new_len = (se->low == nullptr) + ? lb_emit_conv(p, high, t_int) + : lb_emit_arith(p, Token_Sub, high, low, t_int); + + return lb_make_slice_value(p, slice_type, elem, new_len); + } + + case Type_Basic: { + if (is_type_string16(type)) { + GB_ASSERT_MSG(are_types_identical(type, t_string16), "got %s", type_to_string(type)); + lbValue len = lb_string_len(p, base); + if (high.value == nullptr) high = len; + + if (!no_indices) { + lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); + } + + lbValue elem = lb_emit_ptr_offset(p, lb_string_elem(p, base), low); + lbValue new_len = (se->low == nullptr) + ? lb_emit_conv(p, high, t_int) + : lb_emit_arith(p, Token_Sub, high, low, t_int); + + return lb_make_string_value(p, t_string16, elem, new_len); + } + GB_ASSERT_MSG(are_types_identical(type, t_string), "got %s", type_to_string(type)); + lbValue len = lb_string_len(p, base); + if (high.value == nullptr) high = len; + + if (!no_indices) { + lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); + } + + lbValue elem = lb_emit_ptr_offset(p, lb_string_elem(p, base), low); + lbValue new_len = (se->low == nullptr) + ? lb_emit_conv(p, high, t_int) + : lb_emit_arith(p, Token_Sub, high, low, t_int); + + return lb_make_string_value(p, t_string, elem, new_len); + } + + case Type_MultiPointer: { + GB_ASSERT(se->high != nullptr); + Type *elem_type = type->MultiPointer.elem; + Type *slice_type = alloc_type_slice(elem_type); + + low = lb_emit_conv(p, low, t_int); + high = lb_emit_conv(p, high, t_int); + + lb_emit_multi_pointer_slice_bounds_check(p, se->open, low, high); + + LLVMValueRef indices[1] = {low.value}; + lbValue ptr = {}; + ptr.value = LLVMBuildGEP2(p->builder, lb_type(p->module, elem_type), base.value, indices, 1, ""); + ptr.type = alloc_type_pointer(elem_type); + + lbValue new_len = (se->low == nullptr) + ? lb_emit_conv(p, high, t_int) + : lb_emit_arith(p, Token_Sub, high, low, t_int); + + return lb_make_slice_value(p, slice_type, ptr, new_len); + } + + default: + GB_PANIC("lb_build_slice_expr_value: unexpected type %s", type_to_string(base.type)); + return {}; + } +} + gb_internal lbAddr lb_build_addr_slice_expr(lbProcedure *p, Ast *expr) { ast_node(se, SliceExpr, expr); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index ed0b14273..3413fbdf9 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1724,6 +1724,39 @@ gb_internal void lb_fill_string(lbProcedure *p, lbAddr const &string, lbValue ba lb_emit_store(p, lb_emit_struct_ep(p, ptr, 1), len); } +gb_internal lbValue lb_emit_struct_iv(lbProcedure *p, lbValue agg, lbValue field, i32 index) { + Type *t = base_type(agg.type); + i32 mapped_index = lb_convert_struct_index(p->module, t, index); + lbValue res = {}; + res.value = LLVMBuildInsertValue(p->builder, agg.value, field.value, cast(unsigned)mapped_index, ""); + res.type = agg.type; + return res; +} + +gb_internal lbValue lb_build_struct_value(lbProcedure *p, Type *type, lbValue *fields, isize count) { + LLVMTypeRef llvm_type = lb_type(p->module, type); + lbValue agg = {}; + agg.value = LLVMGetPoison(llvm_type); + agg.type = type; + for (isize i = 0; i < count; i++) { + agg = lb_emit_struct_iv(p, agg, fields[i], cast(i32)i); + } + return agg; +} + +gb_internal lbValue lb_make_slice_value(lbProcedure *p, Type *slice_type, lbValue elem, lbValue len) { + GB_ASSERT(is_type_slice(slice_type)); + lbValue fields[2] = {elem, len}; + return lb_build_struct_value(p, slice_type, fields, 2); +} + +gb_internal lbValue lb_make_string_value(lbProcedure *p, Type *string_type, lbValue elem, lbValue len) { + GB_ASSERT(is_type_string(string_type)); + lbValue fields[2] = {elem, len}; + return lb_build_struct_value(p, string_type, fields, 2); +} + + gb_internal lbValue lb_string_elem(lbProcedure *p, lbValue string) { Type *t = base_type(string.type); if (t->kind == Type_Basic && t->Basic.kind == Basic_string16) { From bb2e42faa6ce6a26235c0607402430f67dff25df Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 19:49:26 +0000 Subject: [PATCH 144/273] More uses of SSA aggregation values --- src/llvm_backend_expr.cpp | 47 +++++++++--------------------------- src/llvm_backend_proc.cpp | 14 +++++------ src/llvm_backend_stmt.cpp | 25 +++++++------------ src/llvm_backend_utility.cpp | 3 ++- 4 files changed, 29 insertions(+), 60 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 29edf4d2d..2ff5a0191 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1495,7 +1495,6 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV } } - lbAddr res = lb_add_local_generated(p, type, false); // NOTE: initialized in full later lbValue a = lb_emit_struct_ev(p, lhs, 0); lbValue b = lb_emit_struct_ev(p, lhs, 1); lbValue c = lb_emit_struct_ev(p, rhs, 0); @@ -1533,10 +1532,9 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV } } - lb_emit_store(p, lb_emit_struct_ep(p, res.addr, 0), real); - lb_emit_store(p, lb_emit_struct_ep(p, res.addr, 1), imag); - return lb_addr_load(p, res); + lbValue fields[2] = {real, imag}; + return lb_build_struct_value(p, type, fields, gb_count_of(fields)); } else if (is_type_quaternion(type)) { lhs = lb_emit_conv(p, lhs, type); rhs = lb_emit_conv(p, rhs, type); @@ -1549,7 +1547,6 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV immediate_type = t_f32; } - lbAddr res = lb_add_local_generated(p, type, false); // NOTE: initialized in full later lbValue x0 = lb_emit_struct_ev(p, lhs, 0); lbValue x1 = lb_emit_struct_ev(p, lhs, 1); lbValue x2 = lb_emit_struct_ev(p, lhs, 2); @@ -1577,10 +1574,6 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV lbValue z2 = lb_emit_arith(p, op, x2, y2, immediate_type); lbValue z3 = lb_emit_arith(p, op, x3, y3, immediate_type); - lbValue d0 = lb_emit_struct_ep(p, res.addr, 0); - lbValue d1 = lb_emit_struct_ep(p, res.addr, 1); - lbValue d2 = lb_emit_struct_ep(p, res.addr, 2); - lbValue d3 = lb_emit_struct_ep(p, res.addr, 3); if (immediate_type != ft) { z0 = lb_emit_conv(p, z0, ft); @@ -1589,12 +1582,9 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV z3 = lb_emit_conv(p, z3, ft); } - lb_emit_store(p, d0, z0); - lb_emit_store(p, d1, z1); - lb_emit_store(p, d2, z2); - lb_emit_store(p, d3, z3); - return lb_addr_load(p, res); + lbValue fields[4] = {z0, z1, z2, z3}; + return lb_build_struct_value(p, type, fields, gb_count_of(fields)); } else if (op == Token_Mul) { TEMPORARY_ALLOCATOR_GUARD(); @@ -2232,29 +2222,23 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { if (is_type_complex(src) && is_type_complex(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, false); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft); lbValue imag = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 1), imag); - return lb_addr_load(p, gen); + + lbValue fields[2] = {real, imag}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_quaternion(src) && is_type_quaternion(dst)) { // @QuaternionLayout Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, false); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue q0 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft); lbValue q1 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft); lbValue q2 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 2), ft); lbValue q3 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 3), ft); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), q0); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 1), q1); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 2), q2); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 3), q3); - return lb_addr_load(p, gen); + + lbValue fields[4] = {q0, q1, q2, q2}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_integer(src) && is_type_complex(dst)) { @@ -2844,8 +2828,6 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { return lb_const_nil(p->module, t); } - lbAddr result = lb_add_local_generated(p, t, true); - Type *st = default_type(src_type); lbValue data = lb_address_from_load_or_generate_local(p, value); @@ -2854,13 +2836,8 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { data = lb_emit_conv(p, data, t_rawptr); lbValue id = lb_typeid(p->module, st); - lbValue any_data = lb_emit_struct_ep(p, result.addr, 0); - lbValue any_id = lb_emit_struct_ep(p, result.addr, 1); - - lb_emit_store(p, any_data, data); - lb_emit_store(p, any_id, id); - - return lb_addr_load(p, result); + lbValue fields[2] = {data, id}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 9e2429111..4033c12e8 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1028,15 +1028,14 @@ gb_internal lbValue lb_emit_conjugate(lbProcedure *p, lbValue val, Type *type) { lbValue res = {}; Type *t = val.type; if (is_type_complex(t)) { - res = lb_addr_get_ptr(p, lb_add_local_generated(p, type, false)); lbValue real = lb_emit_struct_ev(p, val, 0); lbValue imag = lb_emit_struct_ev(p, val, 1); imag = lb_emit_unary_arith(p, Token_Sub, imag, imag.type); - lb_emit_store(p, lb_emit_struct_ep(p, res, 0), real); - lb_emit_store(p, lb_emit_struct_ep(p, res, 1), imag); + + lbValue fields[2] = {real, imag}; + return lb_build_struct_value(p, type, fields, gb_count_of(fields)); } else if (is_type_quaternion(t)) { // @QuaternionLayout - res = lb_addr_get_ptr(p, lb_add_local_generated(p, type, false)); lbValue real = lb_emit_struct_ev(p, val, 3); lbValue imag = lb_emit_struct_ev(p, val, 0); lbValue jmag = lb_emit_struct_ev(p, val, 1); @@ -1044,10 +1043,9 @@ gb_internal lbValue lb_emit_conjugate(lbProcedure *p, lbValue val, Type *type) { imag = lb_emit_unary_arith(p, Token_Sub, imag, imag.type); jmag = lb_emit_unary_arith(p, Token_Sub, jmag, jmag.type); kmag = lb_emit_unary_arith(p, Token_Sub, kmag, kmag.type); - lb_emit_store(p, lb_emit_struct_ep(p, res, 3), real); - lb_emit_store(p, lb_emit_struct_ep(p, res, 0), imag); - lb_emit_store(p, lb_emit_struct_ep(p, res, 1), jmag); - lb_emit_store(p, lb_emit_struct_ep(p, res, 2), kmag); + + lbValue fields[4] = {imag, jmag, kmag, real}; + return lb_build_struct_value(p, type, fields, gb_count_of(fields)); } else if (is_type_array_like(t)) { res = lb_addr_get_ptr(p, lb_add_local_generated(p, type, true)); Type *elem_type = base_array_type(t); diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index df87e7703..77e5ec0d1 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -2537,33 +2537,26 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return } else { Type *ret_type = p->type->Proc.results; - // NOTE(bill): Doesn't need to be zero because it will be initialized in the loops - if (return_by_pointer) { - res = p->return_ptr.addr; - } else { - res = lb_add_local_generated(p, ret_type, false).addr; - } - auto result_values = slice_make(temporary_allocator(), results.count); - auto result_eps = slice_make(temporary_allocator(), results.count); - for_array(i, results) { result_values[i] = lb_emit_conv(p, results[i], tuple->variables[i]->type); } - for_array(i, results) { - result_eps[i] = lb_emit_struct_ep(p, res, cast(i32)i); - } - for_array(i, result_eps) { - lb_emit_store(p, result_eps[i], result_values[i]); - } if (return_by_pointer) { + res = p->return_ptr.addr; + auto result_eps = slice_make(temporary_allocator(), results.count); + for_array(i, results) { + result_eps[i] = lb_emit_struct_ep(p, res, cast(i32)i); + } + for_array(i, result_eps) { + lb_emit_store(p, result_eps[i], result_values[i]); + } lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr, pos); LLVMBuildRetVoid(p->builder); return; } - res = lb_emit_load(p, res); + res = lb_build_struct_value(p, ret_type, result_values.data, result_values.count); } } lb_build_return_stmt_internal(p, res, pos); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 3413fbdf9..3dec1b61c 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1736,7 +1736,8 @@ gb_internal lbValue lb_emit_struct_iv(lbProcedure *p, lbValue agg, lbValue field gb_internal lbValue lb_build_struct_value(lbProcedure *p, Type *type, lbValue *fields, isize count) { LLVMTypeRef llvm_type = lb_type(p->module, type); lbValue agg = {}; - agg.value = LLVMGetPoison(llvm_type); + // agg.value = LLVMGetPoison(llvm_type); + agg.value = LLVMConstNull(llvm_type); agg.type = type; for (isize i = 0; i < count; i++) { agg = lb_emit_struct_iv(p, agg, fields[i], cast(i32)i); From f70bceec84a7425a9dcd68fc21e4d64b0483f817 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 19:57:23 +0000 Subject: [PATCH 145/273] Add optimization for improving side-effect-free use of a `select` for ternary if. --- src/llvm_backend_expr.cpp | 49 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 2ff5a0191..819ad2330 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -10,6 +10,44 @@ gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) return LLVMConstInt(type, mask, false); } +gb_internal bool lb_is_expr_trivial(Ast *e) { + Type *type = default_type(type_of_expr(e)); + Type *bt = base_type(type); + if (is_type_integer(bt) || is_type_float(bt) || is_type_boolean(bt) || + is_type_pointer(bt) || is_type_enum(bt) || is_type_rune(bt) || is_type_typeid((bt))) { + e = unparen_expr(e); + TypeAndValue tav = type_and_value_of_expr(e); + if (tav.mode == Addressing_Constant) { + return true; + } + if (e->kind == Ast_Ident) { + return true; + } + if (e->kind == Ast_SelectorExpr) { + Ast *operand = unparen_expr(e->SelectorExpr.expr); + if (operand && operand->kind == Ast_Ident) { + // If the operand is a pointer, thus deferences it, disallow it + Type *ot = type_of_expr(operand); + if (ot == nullptr || is_type_pointer(ot)) { + return false; + } + return true; + } + } + if (e->kind == Ast_UnaryExpr && e->UnaryExpr.op.kind != Token_And) { + Ast *operand = unparen_expr(e->UnaryExpr.expr); + TypeAndValue otav = type_and_value_of_expr(operand); + if (otav.mode == Addressing_Constant) { + return true; + } + if (operand->kind == Ast_Ident) { + return true; + } + } + } + return false; +} + gb_internal lbValue lb_emit_logical_binary_expr(lbProcedure *p, TokenKind op, Ast *left, Ast *right, Type *final_type) { lbModule *m = p->module; @@ -4091,10 +4129,18 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { case_end; case_ast_node(te, TernaryIfExpr, expr); + GB_ASSERT(te->y != nullptr); + Type *type = default_type(type_of_expr(expr)); + if (lb_is_expr_trivial(te->x) && lb_is_expr_trivial(te->y)) { + lbValue cond = lb_build_expr(p, te->cond); + lbValue x = lb_emit_conv(p, lb_build_expr(p, te->x), type); + lbValue y = lb_emit_conv(p, lb_build_expr(p, te->y), type); + return lb_emit_select(p, cond, x, y); + } + LLVMValueRef incoming_values[2] = {}; LLVMBasicBlockRef incoming_blocks[2] = {}; - GB_ASSERT(te->y != nullptr); lbBlock *then = lb_create_block(p, "if.then"); lbBlock *done = lb_create_block(p, "if.done"); // NOTE(bill): Append later lbBlock *else_ = lb_create_block(p, "if.else"); @@ -4102,7 +4148,6 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { lb_build_cond(p, te->cond, then, else_); lb_start_block(p, then); - Type *type = default_type(type_of_expr(expr)); LLVMTypeRef llvm_type = lb_type(p->module, type); incoming_values[0] = lb_emit_conv(p, lb_build_expr(p, te->x), type).value; From a56c3da1497d64fd23e0e5d9157e7d076153c53f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 20:02:48 +0000 Subject: [PATCH 146/273] Support select fast path for `or_else` --- src/llvm_backend_expr.cpp | 38 --------------------------- src/llvm_backend_utility.cpp | 51 ++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 38 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 819ad2330..6fa259b0c 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -10,44 +10,6 @@ gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) return LLVMConstInt(type, mask, false); } -gb_internal bool lb_is_expr_trivial(Ast *e) { - Type *type = default_type(type_of_expr(e)); - Type *bt = base_type(type); - if (is_type_integer(bt) || is_type_float(bt) || is_type_boolean(bt) || - is_type_pointer(bt) || is_type_enum(bt) || is_type_rune(bt) || is_type_typeid((bt))) { - e = unparen_expr(e); - TypeAndValue tav = type_and_value_of_expr(e); - if (tav.mode == Addressing_Constant) { - return true; - } - if (e->kind == Ast_Ident) { - return true; - } - if (e->kind == Ast_SelectorExpr) { - Ast *operand = unparen_expr(e->SelectorExpr.expr); - if (operand && operand->kind == Ast_Ident) { - // If the operand is a pointer, thus deferences it, disallow it - Type *ot = type_of_expr(operand); - if (ot == nullptr || is_type_pointer(ot)) { - return false; - } - return true; - } - } - if (e->kind == Ast_UnaryExpr && e->UnaryExpr.op.kind != Token_And) { - Ast *operand = unparen_expr(e->UnaryExpr.expr); - TypeAndValue otav = type_and_value_of_expr(operand); - if (otav.mode == Addressing_Constant) { - return true; - } - if (operand->kind == Ast_Ident) { - return true; - } - } - } - return false; -} - gb_internal lbValue lb_emit_logical_binary_expr(lbProcedure *p, TokenKind op, Ast *left, Ast *right, Type *final_type) { lbModule *m = p->module; diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 3dec1b61c..944920135 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -438,6 +438,50 @@ gb_internal lbValue lb_emit_try_has_value(lbProcedure *p, lbValue rhs) { return has_value; } +gb_internal bool lb_is_type_trivial(Type *type) { + Type *bt = base_type(type); + if (is_type_integer(bt) || is_type_float(bt) || is_type_boolean(bt) || + is_type_pointer(bt) || is_type_enum(bt) || is_type_rune(bt) || is_type_typeid((bt))) { + return true; + } + return false; +} + +gb_internal bool lb_is_expr_trivial(Ast *e) { + Type *type = default_type(type_of_expr(e)); + if (lb_is_type_trivial(type)) { + e = unparen_expr(e); + TypeAndValue tav = type_and_value_of_expr(e); + if (tav.mode == Addressing_Constant) { + return true; + } + if (e->kind == Ast_Ident) { + return true; + } + if (e->kind == Ast_SelectorExpr) { + Ast *operand = unparen_expr(e->SelectorExpr.expr); + if (operand && operand->kind == Ast_Ident) { + // If the operand is a pointer, thus deferences it, disallow it + Type *ot = type_of_expr(operand); + if (ot == nullptr || is_type_pointer(ot)) { + return false; + } + return true; + } + } + if (e->kind == Ast_UnaryExpr && e->UnaryExpr.op.kind != Token_And) { + Ast *operand = unparen_expr(e->UnaryExpr.expr); + TypeAndValue otav = type_and_value_of_expr(operand); + if (otav.mode == Addressing_Constant) { + return true; + } + if (operand->kind == Ast_Ident) { + return true; + } + } + } + return false; +} gb_internal lbValue lb_emit_or_else(lbProcedure *p, Ast *arg, Ast *else_expr, TypeAndValue const &tv) { if (arg->state_flags & StateFlag_DirectiveWasFalse) { @@ -467,6 +511,13 @@ gb_internal lbValue lb_emit_or_else(lbProcedure *p, Ast *arg, Ast *else_expr, Ty lb_start_block(p, then); return lb_emit_conv(p, lhs, type); } else { + if (lb_is_type_trivial(type) && lb_is_expr_trivial(else_expr)) { + lbValue has_value = lb_emit_try_has_value(p, rhs); + lbValue then_val = lb_emit_conv(p, lhs, type); + lbValue else_val = lb_emit_conv(p, lb_build_expr(p, else_expr), type); + return lb_emit_select(p, has_value, then_val, else_val); + } + LLVMValueRef incoming_values[2] = {}; LLVMBasicBlockRef incoming_blocks[2] = {}; From f8f96905ae360bb022bac7d56da2c1e1e16c571c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 20:27:14 +0000 Subject: [PATCH 147/273] Fix typos --- src/llvm_backend_expr.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 6fa259b0c..434175c46 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -252,25 +252,18 @@ gb_internal lbValue lb_emit_unary_arith(lbProcedure *p, TokenKind op, lbValue x, LLVMValueRef v0 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 0, ""), ""); LLVMValueRef v1 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 1, ""), ""); - lbAddr addr = lb_add_local_generated(p, x.type, false); - LLVMTypeRef type = llvm_addr_type(p->module, addr.addr); - LLVMBuildStore(p->builder, v0, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 0, "")); - LLVMBuildStore(p->builder, v1, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 1, "")); - return lb_addr_load(p, addr); - + Type *et = base_complex_elem_type(x.type); + lbValue fields[2] = {{v0, et}, {v1, et}}; + return lb_build_struct_value(p, x.type, fields, gb_count_of(fields)); } else if (is_type_quaternion(x.type)) { LLVMValueRef v0 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 0, ""), ""); LLVMValueRef v1 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 1, ""), ""); LLVMValueRef v2 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 2, ""), ""); LLVMValueRef v3 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 3, ""), ""); - lbAddr addr = lb_add_local_generated(p, x.type, false); - LLVMTypeRef type = llvm_addr_type(p->module, addr.addr); - LLVMBuildStore(p->builder, v0, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 0, "")); - LLVMBuildStore(p->builder, v1, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 1, "")); - LLVMBuildStore(p->builder, v2, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 2, "")); - LLVMBuildStore(p->builder, v3, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 3, "")); - return lb_addr_load(p, addr); + Type *et = base_complex_elem_type(x.type); + lbValue fields[4] = {{v0, et}, {v1, et}, {v2, et}, {v3, et}}; + return lb_build_struct_value(p, x.type, fields, gb_count_of(fields)); } else if (is_type_simd_vector(x.type)) { Type *elem = base_array_type(x.type); if (is_type_float(elem)) { @@ -1547,6 +1540,8 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV immediate_type = t_f32; } + lbAddr res = lb_add_local_generated(p, type, false); + lbValue x0 = lb_emit_struct_ev(p, lhs, 0); lbValue x1 = lb_emit_struct_ev(p, lhs, 1); lbValue x2 = lb_emit_struct_ev(p, lhs, 2); @@ -1582,6 +1577,10 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV z3 = lb_emit_conv(p, z3, ft); } + lbValue d0 = lb_emit_struct_ep(p, res.addr, 0); + lbValue d1 = lb_emit_struct_ep(p, res.addr, 1); + lbValue d2 = lb_emit_struct_ep(p, res.addr, 2); + lbValue d3 = lb_emit_struct_ep(p, res.addr, 3); lbValue fields[4] = {z0, z1, z2, z3}; return lb_build_struct_value(p, type, fields, gb_count_of(fields)); @@ -2237,7 +2236,7 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { lbValue q2 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 2), ft); lbValue q3 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 3), ft); - lbValue fields[4] = {q0, q1, q2, q2}; + lbValue fields[4] = {q0, q1, q2, q3}; return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } From 12b06887a31a2c3fccef6996188c06d0aface0fa Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 20:36:02 +0000 Subject: [PATCH 148/273] Remove dead code --- src/llvm_backend_expr.cpp | 41 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 434175c46..8802cd5aa 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1540,8 +1540,6 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV immediate_type = t_f32; } - lbAddr res = lb_add_local_generated(p, type, false); - lbValue x0 = lb_emit_struct_ev(p, lhs, 0); lbValue x1 = lb_emit_struct_ev(p, lhs, 1); lbValue x2 = lb_emit_struct_ev(p, lhs, 2); @@ -1577,11 +1575,6 @@ gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbV z3 = lb_emit_conv(p, z3, ft); } - lbValue d0 = lb_emit_struct_ep(p, res.addr, 0); - lbValue d1 = lb_emit_struct_ep(p, res.addr, 1); - lbValue d2 = lb_emit_struct_ep(p, res.addr, 2); - lbValue d3 = lb_emit_struct_ep(p, res.addr, 3); - lbValue fields[4] = {z0, z1, z2, z3}; return lb_build_struct_value(p, type, fields, gb_count_of(fields)); } else if (op == Token_Mul) { @@ -2242,50 +2235,42 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { if (is_type_integer(src) && is_type_complex(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, true); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, value, ft); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real); - return lb_addr_load(p, gen); + lbValue fields[2] = {real, lb_const_nil(m, ft)}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_float(src) && is_type_complex(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, true); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, value, ft); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real); - return lb_addr_load(p, gen); + lbValue fields[2] = {real, lb_const_nil(m, ft)}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_integer(src) && is_type_quaternion(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, true); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, value, ft); + lbValue zero = lb_const_nil(m, ft); // @QuaternionLayout - lb_emit_store(p, lb_emit_struct_ep(p, gp, 3), real); - return lb_addr_load(p, gen); + lbValue fields[4] = {zero, zero, zero, real}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_float(src) && is_type_quaternion(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, true); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, value, ft); + lbValue zero = lb_const_nil(m, ft); // @QuaternionLayout - lb_emit_store(p, lb_emit_struct_ep(p, gp, 3), real); - return lb_addr_load(p, gen); + lbValue fields[4] = {zero, zero, zero, real}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } if (is_type_complex(src) && is_type_quaternion(dst)) { Type *ft = base_complex_elem_type(dst); - lbAddr gen = lb_add_local_generated(p, t, true); - lbValue gp = lb_addr_get_ptr(p, gen); lbValue real = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft); lbValue imag = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft); + lbValue zero = lb_const_nil(m, ft); // @QuaternionLayout - lb_emit_store(p, lb_emit_struct_ep(p, gp, 3), real); - lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), imag); - return lb_addr_load(p, gen); + lbValue fields[4] = {imag, zero, zero, real}; + return lb_build_struct_value(p, t, fields, gb_count_of(fields)); } // float <-> integer From 6b2853d9f110acc433b03057d0824c9dfcae242a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:03:31 +0000 Subject: [PATCH 149/273] Improve `matrix * vector` code gen --- src/llvm_backend_expr.cpp | 18 ++++++++++++++---- src/llvm_backend_utility.cpp | 25 ++++++++++++++++++------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 8802cd5aa..e385dc995 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -967,7 +967,7 @@ gb_internal lbValue lb_emit_matrix_mul_vector(lbProcedure *p, lbValue lhs, lbVal } for (unsigned row_index = 0; row_index < column_count; row_index++) { - LLVMValueRef value = lb_emit_struct_ev(p, rhs, row_index).value; + LLVMValueRef value = LLVMBuildExtractValue(p->builder, rhs.value, row_index, ""); LLVMValueRef row = llvm_vector_broadcast(p, value, row_count); v_rows[row_index] = row; } @@ -988,13 +988,19 @@ gb_internal lbValue lb_emit_matrix_mul_vector(lbProcedure *p, lbValue lhs, lbVal lbAddr res = lb_add_local_generated(p, type, true); + Type *vector_elem_type = base_array_type(rhs.type); + for (i64 i = 0; i < mt->Matrix.row_count; i++) { for (i64 j = 0; j < mt->Matrix.column_count; j++) { lbValue dst = lb_emit_matrix_epi(p, res.addr, i, 0); lbValue d0 = lb_emit_load(p, dst); lbValue a = lb_emit_matrix_ev(p, lhs, i, j); - lbValue b = lb_emit_struct_ev(p, rhs, cast(i32)j); + + + LLVMValueRef b_value = LLVMBuildExtractValue(p->builder, rhs.value, cast(unsigned)j, ""); + lbValue b = {b_value, vector_elem_type}; + lbValue c = lb_emit_mul_add(p, a, b, d0, elem); lb_emit_store(p, dst, c); } @@ -1043,7 +1049,7 @@ gb_internal lbValue lb_emit_vector_mul_matrix(lbProcedure *p, lbValue lhs, lbVal } for (unsigned column_index = 0; column_index < row_count; column_index++) { - LLVMValueRef value = lb_emit_struct_ev(p, lhs, column_index).value; + LLVMValueRef value = LLVMBuildExtractValue(p->builder, lhs.value, column_index, ""); LLVMValueRef row = llvm_vector_broadcast(p, value, column_count); v_rows[column_index] = row; } @@ -1072,12 +1078,16 @@ gb_internal lbValue lb_emit_vector_mul_matrix(lbProcedure *p, lbValue lhs, lbVal lbAddr res = lb_add_local_generated(p, type, true); + Type *vector_elem_type = base_array_type(rhs.type); + for (i64 j = 0; j < mt->Matrix.column_count; j++) { for (i64 k = 0; k < mt->Matrix.row_count; k++) { lbValue dst = lb_emit_matrix_epi(p, res.addr, 0, j); lbValue d0 = lb_emit_load(p, dst); - lbValue a = lb_emit_struct_ev(p, lhs, cast(i32)k); + LLVMValueRef a_value = LLVMBuildExtractValue(p->builder, lhs.value, cast(unsigned)k, ""); + lbValue a = {a_value, vector_elem_type}; + lbValue b = lb_emit_matrix_ev(p, rhs, k, j); lbValue c = lb_emit_mul_add(p, a, b, d0, elem); lb_emit_store(p, dst, c); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 944920135..3905adfcd 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1742,14 +1742,25 @@ gb_internal lbValue lb_emit_matrix_ep(lbProcedure *p, lbValue s, lbValue row, lb return res; } - gb_internal lbValue lb_emit_matrix_ev(lbProcedure *p, lbValue s, isize row, isize column) { - Type *st = base_type(s.type); - GB_ASSERT_MSG(is_type_matrix(st), "%s", type_to_string(st)); - - lbValue value = lb_address_from_load_or_generate_local(p, s); - lbValue ptr = lb_emit_matrix_epi(p, value, row, column); - return lb_emit_load(p, ptr); + Type *t = s.type; + Type *mt = base_type(t); + GB_ASSERT_MSG(is_type_matrix(mt), "%s", type_to_string(mt)); + + isize stride_elems = matrix_type_stride_in_elems(mt); + + isize index = -1; + + if (mt->Matrix.is_row_major) { + index = column + (row * stride_elems); + } else { + index = row + (column * stride_elems); + } + + lbValue res = {}; + res.value = LLVMBuildExtractValue(p->builder, s.value, cast(unsigned)index, ""); + res.type = base_array_type(mt); + return res; } gb_internal void lb_fill_slice(lbProcedure *p, lbAddr const &slice, lbValue base_elem, lbValue len) { From eecb67cb8968acdf22ff89f55ac9bac432e38a2d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:17:05 +0000 Subject: [PATCH 150/273] Implement fused nested slice chain optimizations `src[a:b][c:d][e:f]...` --- src/llvm_backend_expr.cpp | 89 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index e385dc995..1efc8f411 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -4853,6 +4853,95 @@ gb_internal lbAddr lb_build_addr_index_expr(lbProcedure *p, Ast *expr) { gb_internal lbValue lb_build_slice_expr_value(lbProcedure *p, Ast *expr) { ast_node(se, SliceExpr, expr); + if (true) { + // NOTE(bill): Fused nested slice chain: src[a:b][c:d][e:f]... + // Walk a chain of nested SliceExprs down to the root source, then apply + // each slice's bounds check and offset on raw (ptr, len) SSA values, + // building a single aggregate at the end. + + + Ast *inner_ast = unparen_expr(se->expr); + if (inner_ast->kind == Ast_SliceExpr) { + enum {MAX_CHAIN = 8}; // this is more than enough in practice + + // Collect the chain: slices[0] is innermost, slices[n-1] is outer-most `se`. + Ast *chain[MAX_CHAIN] = {}; // bounded depth + isize chain_count = 0; + chain[chain_count++] = expr; // outer-most + + Ast *root = inner_ast; + while (root->kind == Ast_SliceExpr && chain_count < MAX_CHAIN) { + chain[chain_count++] = root; + root = unparen_expr(root->SliceExpr.expr); + } + + Type *root_type = base_type(type_of_expr(root)); + if (is_type_pointer(root_type)) { + root_type = base_type(type_deref(root_type)); + } + if (is_type_slice(root_type) || + is_type_dynamic_array(root_type) || + is_type_string(root_type) || + is_type_string16(root_type)) { + lbModule *m = p->module; + + // Evaluate the root source and extract raw (ptr, len). + lbValue src = lb_build_expr(p, root); + Type *src_type = base_type(src.type); + if (is_type_pointer(src_type)) { + src_type = base_type(type_deref(src_type)); + src = lb_emit_load(p, src); + } + + lbValue cur_ptr = {}; + lbValue cur_len = {}; + if (is_type_slice(src_type)) { + cur_ptr = lb_slice_elem(p, src); + cur_len = lb_slice_len(p, src); + } else if (is_type_dynamic_array(src_type)) { + cur_ptr = lb_dynamic_array_elem(p, src); + cur_len = lb_dynamic_array_len(p, src); + } else { + GB_ASSERT(is_type_string(src_type) || is_type_string16(src_type)); + cur_ptr = lb_string_elem(p, src); + cur_len = lb_string_len(p, src); + } + + // Apply each slice innermost-first (reverse of collection order). + for (isize i = chain_count - 1; i >= 0; i--) { + AstSliceExpr *s = &chain[i]->SliceExpr; + + lbValue lo = lb_const_int(m, t_int, 0); + lbValue hi = {}; + if (s->low != nullptr) { + lo = lb_correct_endianness(p, lb_build_expr(p, s->low)); + } + if (s->high != nullptr) { + hi = lb_correct_endianness(p, lb_build_expr(p, s->high)); + } + if (hi.value == nullptr) { + hi = cur_len; + } + + bool no_indices = s->low == nullptr && s->high == nullptr; + if (!no_indices) { + lb_emit_slice_bounds_check(p, s->open, lo, hi, cur_len, s->low != nullptr); + } + + cur_ptr = (s->low == nullptr) ? cur_ptr : lb_emit_ptr_offset(p, cur_ptr, lo); + cur_len = (s->low == nullptr) ? lb_emit_conv(p, hi, t_int) : lb_emit_arith(p, Token_Sub, hi, lo, t_int); + } + + // Single aggregate construction. + Type *result_type = type_of_expr(expr); + if (is_type_string(result_type)) { + return lb_make_string_value(p, result_type, cur_ptr, cur_len); + } + return lb_make_slice_value(p, result_type, cur_ptr, cur_len); + } + } + } + lbValue base = lb_build_expr(p, se->expr); Type *type = base_type(base.type); From dc72e8210fc94cf70d30b7453447bc323dd9abb4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:28:58 +0000 Subject: [PATCH 151/273] Support `proc(q: $Q) -> type_of(Q{}.data[0])` in return types --- src/check_type.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 071e30c18..d8fd8d079 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2306,6 +2306,57 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para return tuple; } +// Check if an AST node references any polymorphic type parameters +// TODO(bill): is this even complete enough? +gb_internal bool ast_references_poly_params(Scope *scope, Ast *node) { + if (node == nullptr) { + return false; + } + switch (node->kind) { + case Ast_Ident: { + String name = node->Ident.token.string; + Entity *e = scope_lookup(scope, name); + if (e != nullptr && e->kind == Entity_TypeName && e->type != nullptr && e->type->kind == Type_Generic) { + return true; + } + return false; + } + case Ast_SelectorExpr: + return ast_references_poly_params(scope, node->SelectorExpr.expr); + case Ast_IndexExpr: + return ast_references_poly_params(scope, node->IndexExpr.expr); + case Ast_CallExpr: + for (Ast *arg : node->CallExpr.args) { + if (ast_references_poly_params(scope, arg)) { + return true; + } + } + return ast_references_poly_params(scope, node->CallExpr.proc); + case Ast_CompoundLit: + return ast_references_poly_params(scope, node->CompoundLit.type); + case Ast_UnaryExpr: + return ast_references_poly_params(scope, node->UnaryExpr.expr); + case Ast_ParenExpr: + return ast_references_poly_params(scope, node->ParenExpr.expr); + case Ast_DerefExpr: + return ast_references_poly_params(scope, node->DerefExpr.expr); + case Ast_PointerType: + return ast_references_poly_params(scope, node->PointerType.type); + case Ast_ArrayType: + return ast_references_poly_params(scope, node->ArrayType.elem) || + ast_references_poly_params(scope, node->ArrayType.count); + case Ast_FixedCapacityDynamicArrayType: + return ast_references_poly_params(scope, node->FixedCapacityDynamicArrayType.elem) || + ast_references_poly_params(scope, node->FixedCapacityDynamicArrayType.capacity); + case Ast_DynamicArrayType: + return ast_references_poly_params(scope, node->DynamicArrayType.elem); + case Ast_MapType: + return ast_references_poly_params(scope, node->MapType.key) || + ast_references_poly_params(scope, node->MapType.value); + } + return false; +} + gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_results) { if (_results == nullptr) { return nullptr; @@ -2340,7 +2391,12 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res if (field->type == nullptr) { param_value = handle_parameter_value(ctx, nullptr, &type, default_value, false); } else { - type = check_type(ctx, field->type); + if (ctx->allow_polymorphic_types && ast_references_poly_params(ctx->scope, field->type)) { + type = alloc_type_generic(ctx->scope, 0, str_lit("$deferred_return"), nullptr); + } else { + type = check_type(ctx, field->type); + } + if (default_value != nullptr) { param_value = handle_parameter_value(ctx, type, nullptr, default_value, false); From 2de214418c5eaf4b6da5e327f47b7d55935131f1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:29:54 +0000 Subject: [PATCH 152/273] Fix LTO with debug info by passing `-g` --- src/linker.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/linker.cpp b/src/linker.cpp index 12f016cea..76c795989 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -980,6 +980,10 @@ try_cross_linking:; link_command_line = gb_string_appendc(link_command_line, " -flto=thin"); link_command_line = gb_string_append_fmt(link_command_line, " -flto-jobs=%d ", build_context.thread_count); + if (build_context.ODIN_DEBUG) { + link_command_line = gb_string_appendc(link_command_line, " -g "); + } + if (is_osx && !build_context.minimum_os_version_string_given) { link_command_line = gb_string_appendc(link_command_line, " -Wno-override-module "); } From 38d7f45e64953f907132e9e784190e07cc63bab1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:35:02 +0000 Subject: [PATCH 153/273] Fix race condition with `code_gen_module` --- src/checker.hpp | 2 +- src/llvm_backend_general.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/checker.hpp b/src/checker.hpp index 374aaf10d..fd2fa2c7f 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -250,7 +250,7 @@ struct DeclInfo { i64 variadic_reuse_max_align; // NOTE(bill): this is to prevent a race condition since these procedure literals can be created anywhere at any time - struct lbModule *code_gen_module; + std::atomic code_gen_module; }; // ProcInfo stores the information needed for checking a procedure diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index fea4be7b2..dc647c1ab 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -498,10 +498,11 @@ gb_internal lbModule *lb_module_of_expr(lbGenerator *gen, Ast *expr) { gb_internal lbModule *lb_module_of_entity_internal(lbGenerator *gen, Entity *e, lbModule *curr_module) { lbModule **found = nullptr; - if (e->kind == Entity_Procedure && - e->decl_info && - e->decl_info->code_gen_module) { - return e->decl_info->code_gen_module; + if (e->kind == Entity_Procedure && e->decl_info) { + lbModule *mod = e->decl_info->code_gen_module.load(std::memory_order_relaxed); + if (mod) { + return mod; + } } if (e->file) { found = map_get(&gen->modules, cast(void *)e->file); From fa6109ca1ebba9b16c48ffe080ca618f5b641cb9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:35:26 +0000 Subject: [PATCH 154/273] Properly dispose of `LLVMTargetDataRef` --- src/llvm_backend.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 81596c9ec..929b056a3 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3187,7 +3187,9 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { code_mode); lbModule *m = entry.value; m->target_machine = target_machine; - LLVMSetModuleDataLayout(m->mod, LLVMCreateTargetDataLayout(target_machine)); + LLVMTargetDataRef data_layout = LLVMCreateTargetDataLayout(target_machine); + LLVMSetModuleDataLayout(m->mod, data_layout); + LLVMDisposeTargetData(data_layout); #if LLVM_VERSION_MAJOR >= 18 if (build_context.fast_isel) { From 5d165f70e1a9c5d554e87ccee373fdeb5395d15a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 21:53:38 +0000 Subject: [PATCH 155/273] Add loads of RVO optimizations for basic 1-value return cases --- src/llvm_backend.hpp | 6 +- src/llvm_backend_proc.cpp | 19 ++-- src/llvm_backend_stmt.cpp | 201 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 216 insertions(+), 10 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 48c5be546..7b7d5cc31 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -359,6 +359,7 @@ struct lbProcedure { std::atomic is_done; lbAddr return_ptr; + Entity * sret_rvo_entity; // Local aliases of `return_ptr` Array defer_stmts; Array blocks; Array branch_blocks; @@ -486,7 +487,7 @@ gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlo gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlock *block, Ast *node); gb_internal lbValue lb_emit_transmute(lbProcedure *p, lbValue value, Type *t); gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue right); -gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining = ProcInlining_none, ProcTailing tailing = ProcTailing_none); +gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining = ProcInlining_none, ProcTailing tailing = ProcTailing_none, lbValue *sret_dst = nullptr); gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t); gb_internal lbValue lb_emit_comp_against_nil(lbProcedure *p, TokenKind op_kind, lbValue x); @@ -494,11 +495,10 @@ gb_internal void lb_emit_jump(lbProcedure *p, lbBlock *target_block); gb_internal void lb_emit_if(lbProcedure *p, lbValue cond, lbBlock *true_block, lbBlock *false_block); gb_internal void lb_start_block(lbProcedure *p, lbBlock *b); -gb_internal lbValue lb_build_call_expr(lbProcedure *p, Ast *expr); +gb_internal lbValue lb_build_call_expr(lbProcedure *p, Ast *expr, lbValue *sret_dst = nullptr); gb_internal lbProcedure *lb_create_dummy_procedure(lbModule *m, String link_name, Type *type); gb_internal void lb_begin_procedure_body(lbProcedure *p); gb_internal void lb_end_procedure_body(lbProcedure *p); -gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining); gb_internal lbAddr lb_find_or_generate_context_ptr(lbProcedure *p); gb_internal lbContextData *lb_push_context_onto_stack(lbProcedure *p, lbAddr ctx); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 4033c12e8..88165f4d2 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1073,7 +1073,7 @@ gb_internal lbValue lb_emit_conjugate(lbProcedure *p, lbValue val, Type *type) { return lb_emit_load(p, res); } -gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining, ProcTailing tailing) { +gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining, ProcTailing tailing, lbValue *sret_dst) { lbModule *m = p->module; Type *pt = base_type(value.type); @@ -1195,7 +1195,12 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c } if (return_by_pointer) { - lbValue return_ptr = lb_add_local_generated(p, rt, true).addr; + lbValue return_ptr = {}; + if (sret_dst != nullptr) { + return_ptr = *sret_dst; + } else { + return_ptr = lb_add_local_generated(p, rt, true).addr; + } lb_emit_call_internal(p, value, return_ptr, processed_args, nullptr, context_ptr, inlining, tailing); result = lb_emit_load(p, return_ptr); } else if (rt != nullptr) { @@ -4126,13 +4131,13 @@ gb_internal lbValue lb_handle_param_value(lbProcedure *p, Type *parameter_type, } -gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr); +gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr, lbValue *sret_dst = nullptr); -gb_internal lbValue lb_build_call_expr(lbProcedure *p, Ast *expr) { +gb_internal lbValue lb_build_call_expr(lbProcedure *p, Ast *expr, lbValue *sret_dst) { expr = unparen_expr(expr); ast_node(ce, CallExpr, expr); - lbValue res = lb_build_call_expr_internal(p, expr); + lbValue res = lb_build_call_expr_internal(p, expr, sret_dst); if (ce->optional_ok_one) { GB_ASSERT(is_type_tuple(res.type)); @@ -4153,7 +4158,7 @@ gb_internal void lb_add_values_to_array(lbProcedure *p, Array *args, lb } } -gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { +gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr, lbValue *sret_dst) { lbModule *m = p->module; TypeAndValue tv = type_and_value_of_expr(expr); @@ -4479,6 +4484,6 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { } } - return lb_emit_call(p, value, call_args, inlining, tailing); + return lb_emit_call(p, value, call_args, inlining, tailing, sret_dst); } diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 77e5ec0d1..80d52ef5b 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1,3 +1,127 @@ +#define LB_ENABLE_RVO true + +// NOTE(bill): @RVO Check if a call expression returns by sret with a return type matching dst_type. +// Returns the callee's function type if eligible for copy elision, nullptr otherwise. +gb_internal lbFunctionType *lb_call_sret_eligible(lbProcedure *p, Ast *call_expr, Type *dst_type) { + GB_ASSERT(call_expr->kind == Ast_CallExpr); + Ast *proc_expr = unparen_expr(call_expr->CallExpr.proc); + TypeAndValue proc_tv = type_and_value_of_expr(proc_expr); + if (proc_tv.mode == Addressing_Type || proc_tv.mode == Addressing_Builtin) { + return nullptr; + } + Type *pt = base_type(proc_tv.type); + if (pt == nullptr || pt->kind != Type_Proc || pt->Proc.results == nullptr) { + return nullptr; + } + lbFunctionType *callee_ft = lb_get_function_type(p->module, pt); + if (callee_ft->ret.kind != lbArg_Indirect) { + return nullptr; + } + Type *callee_ret = reduce_tuple_to_single_type(pt->Proc.results); + if (callee_ret == nullptr || !are_types_identical(dst_type, callee_ret)) { + return nullptr; + } + return callee_ft; +} + +// NOTE(bill): @RVO `sret` scan for `x := call(); ...; return x` pattern. +// When matched, `x` alloca will be the sret pointer itself, eliminating +// the copy from `x` to the sret buffer on return. +gb_internal void lb_scan_for_sret_rvo(lbProcedure *p) { + if (p->body == nullptr || p->body->kind != Ast_BlockStmt) { + return; + } + Type *proc_type = p->type; + if (proc_type->Proc.result_count != 1 || proc_type->Proc.results == nullptr) { + return; + } + lbFunctionType *ft = lb_get_function_type(p->module, proc_type); + if (ft->ret.kind != lbArg_Indirect) { + return; + } + + Slice stmts = p->body->BlockStmt.stmts; + if (stmts.count < 2) { + return; + } + + // Last stmt must be `return x` where x is an identifier + Ast *last = stmts[stmts.count - 1]; + if (last->kind != Ast_ReturnStmt) { + return; + } + Slice results = last->ReturnStmt.results; + if (results.count != 1) { + return; + } + Ast *ret_expr = unparen_expr(results[0]); + if (ret_expr->kind != Ast_Ident) { + return; + } + Entity *ret_entity = entity_of_node(ret_expr); + if (ret_entity == nullptr || ret_entity->kind != Entity_Variable) { + return; + } + + Type *ret_type = reduce_tuple_to_single_type(proc_type->Proc.results); + if (ret_type == nullptr || !are_types_identical(ret_entity->type, ret_type)) { + return; + } + + // Walk backwards from the second-to-last stmt to find `x := call()` + // Everything between must be safe (no reassignment of x, no control flow) + i64 decl_index = -1; + for (i64 i = stmts.count - 2; i >= 0; i--) { + Ast *stmt = stmts[i]; + switch (stmt->kind) { + case Ast_ValueDecl: { + AstValueDecl *vd = &stmt->ValueDecl; + if (!vd->is_mutable) { + // constant decl — safe, keep scanning + continue; + } + if (vd->names.count == 1 && vd->values.count == 1) { + Entity *e = entity_of_node(vd->names[0]); + if (e == ret_entity) { + Ast *rhs = unparen_expr(vd->values[0]); + if (rhs->kind == Ast_CallExpr && lb_call_sret_eligible(p, rhs, e->type)) { + decl_index = i; + } + goto done_scanning; + } + } + // Some other mutable ValueDecl — safe as long as it doesn't involve ret_entity + for (Ast *name : vd->names) { + if (entity_of_node(name) == ret_entity) { + goto done_scanning; + } + } + continue; + } + case Ast_ExprStmt: + // Expression statements (reads, function calls) are safe + continue; + case Ast_AssignStmt: { + // Check if any lhs is our entity + for (Ast *lhs : stmt->AssignStmt.lhs) { + Ast *l = unparen_expr(lhs); + if (l->kind == Ast_Ident && entity_of_node(l) == ret_entity) { + goto done_scanning; + } + } + continue; + } + default: + // Control flow or anything else — bail + goto done_scanning; + } + } +done_scanning: + if (decl_index >= 0) { + p->sret_rvo_entity = ret_entity; + } +} + gb_internal void lb_build_constant_value_decl(lbProcedure *p, AstValueDecl *vd) { if (vd == nullptr || vd->is_mutable) { return; @@ -2438,6 +2562,45 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return if (return_count == 1) { Entity *e = tuple->variables[0]; + + if (LB_ENABLE_RVO && res_count == 1 && return_by_pointer) { + Ast *ret_expr = unparen_expr(return_results[0]); + + // NOTE(bill): @RVO for `return call()` in a procedure which uses `sret` and has no defers + // This forwards the sret pointer directly to the callee + if (p->defer_stmts.count == 0) { + if (ret_expr->kind == Ast_CallExpr && lb_call_sret_eligible(p, ret_expr, e->type)) { + lbValue sret_ptr = p->return_ptr.addr; + lb_build_call_expr(p, ret_expr, &sret_ptr); + if (p->type->Proc.has_named_results && e->token.string != "") { + res = lb_emit_load(p, p->return_ptr.addr); + rw_mutex_shared_lock(&p->module->values_mutex); + lbValue found = map_must_get(&p->module->values, e); + rw_mutex_shared_unlock(&p->module->values_mutex); + lb_emit_store(p, found, lb_emit_conv(p, res, e->type)); + } + LLVMBuildRetVoid(p->builder); + return; + } + } + + // NOTE(bill): @RVO for `x := call(); ...; return x` + if (p->sret_rvo_entity != nullptr) { + if (ret_expr->kind == Ast_Ident) { + Entity *ret_e = entity_of_node(ret_expr); + if (ret_e == p->sret_rvo_entity) { + lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr, pos); + LLVMValueRef instr = LLVMGetLastInstruction(p->curr_block->block); + if (!lb_is_instr_terminating(instr)) { + LLVMBuildRetVoid(p->builder); + } + return; + } + } + } + } + + if (res_count == 0) { rw_mutex_shared_lock(&p->module->values_mutex); lbValue found = map_must_get(&p->module->values, e); @@ -2865,6 +3028,23 @@ gb_internal void lb_build_assign_stmt_array(lbProcedure *p, TokenKind op, lbAddr } gb_internal void lb_build_assign_stmt(lbProcedure *p, AstAssignStmt *as) { if (as->op.kind == Token_Eq) { + if (LB_ENABLE_RVO) { + // @RVO for single assignments `x = call()` + if (as->lhs.count == 1 && as->rhs.count == 1 && !is_blank_ident(as->lhs[0])) { + Ast *rhs_expr = unparen_expr(as->rhs[0]); + if (rhs_expr->kind == Ast_CallExpr) { + lbAddr lval = lb_build_addr(p, as->lhs[0]); + if (LLVMIsAAllocaInst(lval.addr.value) && lval.kind == lbAddr_Default) { + if (lb_call_sret_eligible(p, rhs_expr, lb_addr_type(lval))) { + lbValue dst = lval.addr; + lb_build_call_expr(p, rhs_expr, &dst); + return; + } + } + } + } + } + auto lvals = array_make(permanent_allocator(), 0, as->lhs.count); for (Ast *lhs : as->lhs) { @@ -3050,6 +3230,27 @@ gb_internal void lb_build_stmt(lbProcedure *p, Ast *node) { } } } else { + if (LB_ENABLE_RVO) { + // @RVO: for `x := call()` + if (vd->names.count == 1 && values.count == 1 && !is_blank_ident(vd->names[0])) { + Ast *rhs_expr = unparen_expr(values[0]); + Entity *e = entity_of_node(vd->names[0]); + if (rhs_expr->kind == Ast_CallExpr && e != nullptr && lb_call_sret_eligible(p, rhs_expr, e->type)) { + lbValue dst = {}; + if (e == p->sret_rvo_entity) { + dst = p->return_ptr.addr; + lb_add_entity(p->module, e, dst); + lb_add_debug_local_variable(p, dst.value, e->type, e->token); + } else { + lbAddr local = lb_add_local(p, e->type, e, true); + dst = local.addr; + } + lb_build_call_expr(p, rhs_expr, &dst); + break; + } + } + } + auto lvals_preused = slice_make(temporary_allocator(), vd->names.count); auto lvals = slice_make(temporary_allocator(), vd->names.count); auto inits = array_make(temporary_allocator(), 0, lvals.count); From b3b31cdba76a3b23ea65a50632abe85768142c87 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 22:04:27 +0000 Subject: [PATCH 156/273] `-internal-llvm-mem2reg` --- src/build_settings.cpp | 1 + src/llvm_backend_passes.cpp | 3 +++ src/main.cpp | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 1d836b1ec..d57793819 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -577,6 +577,7 @@ struct BuildContext { bool internal_by_value; bool internal_weak_monomorphization; bool internal_ignore_llvm_verification; + bool internal_llvm_mem2reg; bool no_threaded_checker; diff --git a/src/llvm_backend_passes.cpp b/src/llvm_backend_passes.cpp index e9edbace7..744f6af61 100644 --- a/src/llvm_backend_passes.cpp +++ b/src/llvm_backend_passes.cpp @@ -4,6 +4,9 @@ break; case 0: array_add(&passes, "always-inline"); + if (build_context.internal_llvm_mem2reg) { + array_add(&passes, "function(mem2reg)"); + } array_add(&passes, "function(annotation-remarks)"); break; case 1: diff --git a/src/main.cpp b/src/main.cpp index fdafa0cf2..177592fe6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -411,6 +411,7 @@ enum BuildFlagKind { BuildFlag_InternalByValue, BuildFlag_InternalWeakMonomorphization, BuildFlag_InternalLLVMVerification, + BuildFlag_InternalLLVMMem2Reg, BuildFlag_Tilde, @@ -642,6 +643,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_InternalByValue, str_lit("internal-by-value"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalWeakMonomorphization, str_lit("internal-weak-monomorphization"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalLLVMVerification, str_lit("internal-ignore-llvm-verification"), BuildFlagParam_None, Command_all); + add_flag(&build_flags, BuildFlag_InternalLLVMMem2Reg, str_lit("internal-llvm-mem2reg"), BuildFlagParam_None, Command_all); #if ALLOW_TILDE add_flag(&build_flags, BuildFlag_Tilde, str_lit("tilde"), BuildFlagParam_None, Command__does_build); @@ -1634,6 +1636,9 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_InternalLLVMVerification: build_context.internal_ignore_llvm_verification = true; break; + case BuildFlag_InternalLLVMMem2Reg: + build_context.internal_llvm_mem2reg = true; + break; case BuildFlag_Tilde: From 5fa274cb6a92c8d16150e51df1039b6324906113 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 15 Mar 2026 22:10:03 +0000 Subject: [PATCH 157/273] `-internal-rvo` --- src/build_settings.cpp | 2 ++ src/llvm_backend_stmt.cpp | 2 +- src/main.cpp | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d57793819..d52553d65 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -579,6 +579,8 @@ struct BuildContext { bool internal_ignore_llvm_verification; bool internal_llvm_mem2reg; + bool enable_rvo; + bool no_threaded_checker; bool show_debug_messages; diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 80d52ef5b..f1b7175be 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1,4 +1,4 @@ -#define LB_ENABLE_RVO true +#define LB_ENABLE_RVO build_context.enable_rvo // NOTE(bill): @RVO Check if a call expression returns by sret with a return type matching dst_type. // Returns the callee's function type if eligible for copy elision, nullptr otherwise. diff --git a/src/main.cpp b/src/main.cpp index 177592fe6..d7288e5f4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -412,6 +412,7 @@ enum BuildFlagKind { BuildFlag_InternalWeakMonomorphization, BuildFlag_InternalLLVMVerification, BuildFlag_InternalLLVMMem2Reg, + BuildFlag_InternalEnableRVO, BuildFlag_Tilde, @@ -644,6 +645,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_InternalWeakMonomorphization, str_lit("internal-weak-monomorphization"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalLLVMVerification, str_lit("internal-ignore-llvm-verification"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalLLVMMem2Reg, str_lit("internal-llvm-mem2reg"), BuildFlagParam_None, Command_all); + add_flag(&build_flags, BuildFlag_InternalEnableRVO, str_lit("internal-enable-rvo"), BuildFlagParam_None, Command_all); #if ALLOW_TILDE add_flag(&build_flags, BuildFlag_Tilde, str_lit("tilde"), BuildFlagParam_None, Command__does_build); @@ -1639,6 +1641,10 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_InternalLLVMMem2Reg: build_context.internal_llvm_mem2reg = true; break; + case BuildFlag_InternalEnableRVO: + build_context.enable_rvo = true; + break; + case BuildFlag_Tilde: From af2d8ca679b95c2813c6af385a0746fb08caf07e Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Sun, 15 Mar 2026 21:45:44 -0400 Subject: [PATCH 158/273] FCD array proc group add _elems --- base/runtime/core_builtin.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 022778a24..511867feb 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -928,6 +928,7 @@ non_zero_append :: proc{ non_zero_append_elem_string, append_fixed_capacity_elem, + append_fixed_capacity_elems, non_zero_append_elem_fixed_capacity_string, non_zero_append_soa_elem, From 9051f5a0757de1b15f21c74e8dce38919775e2dd Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 16 Mar 2026 15:51:04 +0900 Subject: [PATCH 159/273] core/simd/x86: Fix _mm_blend_epi16 --- core/simd/x86/sse41.odin | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/simd/x86/sse41.odin b/core/simd/x86/sse41.odin index 81089ed63..510f5d8e9 100644 --- a/core/simd/x86/sse41.odin +++ b/core/simd/x86/sse41.odin @@ -26,7 +26,18 @@ _mm_blendv_epi8 :: #force_inline proc "c" (a, b, mask: __m128i) -> __m128i { } @(require_results, enable_target_feature="sse4.1") _mm_blend_epi16 :: #force_inline proc "c" (a, b: __m128i, $IMM8: u8) -> __m128i { - return transmute(__m128i)pblendw(transmute(i16x8)a, transmute(i16x8)b, IMM8) + return transmute(__m128i)simd.shuffle( + transmute(i16x8)b, + transmute(i16x8)a, + 0 when (IMM8 >> 0) & 1 == 1 else 8, + 1 when (IMM8 >> 1) & 1 == 1 else 9, + 2 when (IMM8 >> 2) & 1 == 1 else 10, + 3 when (IMM8 >> 3) & 1 == 1 else 11, + 4 when (IMM8 >> 4) & 1 == 1 else 12, + 5 when (IMM8 >> 5) & 1 == 1 else 13, + 6 when (IMM8 >> 6) & 1 == 1 else 14, + 7 when (IMM8 >> 7) & 1 == 1 else 15, + ) } @(require_results, enable_target_feature="sse4.1") _mm_blendv_pd :: #force_inline proc "c" (a, b, mask: __m128d) -> __m128d { @@ -303,8 +314,6 @@ foreign _ { blendpd :: proc(a, b: __m128d, #const imm2: u8) -> __m128d --- @(link_name = "llvm.x86.sse41.blendps") blendps :: proc(a, b: __m128, #const imm4: u8) -> __m128 --- - @(link_name = "llvm.x86.sse41.pblendw") - pblendw :: proc(a: i16x8, b: i16x8, #const imm8: u8) -> i16x8 --- @(link_name = "llvm.x86.sse41.insertps") insertps :: proc(a, b: __m128, #const imm8: u8) -> __m128 --- @(link_name = "llvm.x86.sse41.pmaxsb") From a030fb659672f5831bbcc9de7c864e5762fdeb7e Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 16 Mar 2026 15:51:54 +0900 Subject: [PATCH 160/273] core/crypto/sha2: Remove the broken Intel intrinsic kludge --- core/crypto/sha2/sha256_impl_hw_intel.odin | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/core/crypto/sha2/sha256_impl_hw_intel.odin b/core/crypto/sha2/sha256_impl_hw_intel.odin index 3f6ebb746..fcec80a3c 100644 --- a/core/crypto/sha2/sha256_impl_hw_intel.odin +++ b/core/crypto/sha2/sha256_impl_hw_intel.odin @@ -70,8 +70,7 @@ sha256_transf_hw :: proc "contextless" (ctx: ^Context_256, data: []byte) #no_bou tmp = x86._mm_shuffle_epi32(tmp, 0xb1) // CDAB state_1 = x86._mm_shuffle_epi32(state_1, 0x1b) // EFGH state_0 := x86._mm_alignr_epi8(tmp, state_1, 8) // ABEF - // state_1 = x86._mm_blend_epi16(state_1, tmp, 0xf0) // CDGH - state_1 = kludge_mm_blend_epi16_0xf0(state_1, tmp) + state_1 = x86._mm_blend_epi16(state_1, tmp, 0xf0) // CDGH data := data for len(data) >= BLOCK_SIZE_256 { @@ -238,18 +237,9 @@ sha256_transf_hw :: proc "contextless" (ctx: ^Context_256, data: []byte) #no_bou // Write back the updated state tmp = x86._mm_shuffle_epi32(state_0, 0x1b) // FEBA state_1 = x86._mm_shuffle_epi32(state_1, 0xb1) // DCHG - // state_0 = x86._mm_blend_epi16(tmp, state_1, 0xf0) // DCBA - state_0 = kludge_mm_blend_epi16_0xf0(tmp, state_1) + state_0 = x86._mm_blend_epi16(tmp, state_1, 0xf0) // DCBA state_1 = x86._mm_alignr_epi8(state_1, tmp, 8) // ABEF intrinsics.unaligned_store((^x86.__m128i)(&ctx.h[0]), state_0) intrinsics.unaligned_store((^x86.__m128i)(&ctx.h[4]), state_1) } - -@(private = "file") -kludge_mm_blend_epi16_0xf0 :: #force_inline proc "contextless"(a, b: x86.__m128i) -> x86.__m128i { - // HACK HACK HACK: LLVM got rid of `llvm.x86.sse41.pblendw`. - a_ := simd.to_array(a) - b_ := simd.to_array(b) - return x86.__m128i{a_[0], b_[1]} -} From ccb56de19a386532228baf2c83a7d06493fb8abc Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 16 Mar 2026 14:58:23 +0900 Subject: [PATCH 161/273] core/crypto/sha2: Add scaffolding for SHA512 acceleration --- core/crypto/sha2/sha2.odin | 20 ++++++++++++++++--- ...pl_hw_gen.odin => sha256_impl_hw_gen.odin} | 8 +++----- core/crypto/sha2/sha512_impl_hw_gen.odin | 12 +++++++++++ 3 files changed, 32 insertions(+), 8 deletions(-) rename core/crypto/sha2/{sha2_impl_hw_gen.odin => sha256_impl_hw_gen.odin} (68%) create mode 100644 core/crypto/sha2/sha512_impl_hw_gen.odin diff --git a/core/crypto/sha2/sha2.odin b/core/crypto/sha2/sha2.odin index dc41462e4..a878e1c2a 100644 --- a/core/crypto/sha2/sha2.odin +++ b/core/crypto/sha2/sha2.odin @@ -44,7 +44,8 @@ Context_256 :: struct { length: u64, md_bits: int, - is_initialized: bool, + is_hw_accelerated: bool, + is_initialized: bool, } // Context_512 is a SHA-384, SHA-512 or SHA-512/256 instance. @@ -55,7 +56,8 @@ Context_512 :: struct { length: u64, md_bits: int, - is_initialized: bool, + is_hw_accelerated: bool, + is_initialized: bool, } // init_224 initializes a Context_256 for SHA-224. @@ -88,6 +90,9 @@ init_512_256 :: proc(ctx: ^Context_512) { _init(ctx) } +@(private) +ERR_HW_NOT_SUPPORTED :: "crypto/sha2: hardware implementation unsupported" + @(private) _init :: proc(ctx: ^$T) { when T == Context_256 { @@ -113,6 +118,8 @@ _init :: proc(ctx: ^$T) { case: panic("crypto/sha2: invalid digest output length") } + + ctx.is_hw_accelerated = is_hardware_accelerated_256() } else when T == Context_512 { switch ctx.md_bits { case 256: @@ -148,6 +155,8 @@ _init :: proc(ctx: ^$T) { case: panic("crypto/sha2: invalid digest output length") } + + ctx.is_hw_accelerated = is_hardware_accelerated_512() } ctx.length = 0 @@ -399,7 +408,7 @@ SHA512_F4 :: #force_inline proc "contextless" (x: u64) -> u64 { @(private) sha2_transf :: proc "contextless" (ctx: ^$T, data: []byte) #no_bounds_check { when T == Context_256 { - if is_hardware_accelerated_256() { + if ctx.is_hw_accelerated { sha256_transf_hw(ctx, data) return } @@ -410,6 +419,11 @@ sha2_transf :: proc "contextless" (ctx: ^$T, data: []byte) #no_bounds_check { CURR_BLOCK_SIZE :: BLOCK_SIZE_256 } else when T == Context_512 { + if ctx.is_hw_accelerated { + sha512_transf_hw(ctx, data) + return + } + w: [SHA512_ROUNDS]u64 wv: [8]u64 t1, t2: u64 diff --git a/core/crypto/sha2/sha2_impl_hw_gen.odin b/core/crypto/sha2/sha256_impl_hw_gen.odin similarity index 68% rename from core/crypto/sha2/sha2_impl_hw_gen.odin rename to core/crypto/sha2/sha256_impl_hw_gen.odin index d735e3c61..ad384caaa 100644 --- a/core/crypto/sha2/sha2_impl_hw_gen.odin +++ b/core/crypto/sha2/sha256_impl_hw_gen.odin @@ -3,15 +3,13 @@ #+build !arm32 package sha2 -@(private = "file") -ERR_HW_NOT_SUPPORTED :: "crypto/sha2: hardware implementation unsupported" - -// is_hardware_accelerated_256 returns true if and only if (⟺) hardware accelerated -// SHA-224/SHA-256 is supported. +// is_hardware_accelerated_256 returns true if and only if (⟺) hardware +// accelerated SHA-224/SHA-256 is supported. is_hardware_accelerated_256 :: proc "contextless" () -> bool { return false } +@(private) sha256_transf_hw :: proc "contextless" (ctx: ^Context_256, data: []byte) { panic_contextless(ERR_HW_NOT_SUPPORTED) } diff --git a/core/crypto/sha2/sha512_impl_hw_gen.odin b/core/crypto/sha2/sha512_impl_hw_gen.odin new file mode 100644 index 000000000..5fd518d80 --- /dev/null +++ b/core/crypto/sha2/sha512_impl_hw_gen.odin @@ -0,0 +1,12 @@ +package sha2 + +// is_hardware_accelerated_512 returns true if and only if (⟺) hardware +// accelerated SHA-384/SHA-512/SHA-512/256 are supported. +is_hardware_accelerated_512 :: proc "contextless" () -> bool { + return false +} + +@(private) +sha512_transf_hw :: proc "contextless" (ctx: ^Context_512, data: []byte) { + panic_contextless(ERR_HW_NOT_SUPPORTED) +} From e87564b20580594da568008db754cbc467595fd0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 12:21:41 +0000 Subject: [PATCH 162/273] Support `for in` for FCD arrays --- src/check_stmt.cpp | 6 ++++++ src/llvm_backend_stmt.cpp | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index bfa68ca78..5e5c0e3f4 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1846,6 +1846,12 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) array_add(&vals, t_int); break; + case Type_FixedCapacityDynamicArray: + is_possibly_addressable = operand.mode == Addressing_Variable || is_ptr; + array_add(&vals, t->FixedCapacityDynamicArray.elem); + array_add(&vals, t_int); + break; + case Type_DynamicArray: is_possibly_addressable = true; array_add(&vals, t->DynamicArray.elem); diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index f1b7175be..cb2123fe1 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -486,6 +486,14 @@ gb_internal void lb_build_range_indexed(lbProcedure *p, lbValue expr, Type *val_ } break; } + case Type_FixedCapacityDynamicArray: { + if (val_type != nullptr) { + lbValue data = lb_emit_struct_ep(p, expr, 0); + val = lb_emit_load(p, lb_emit_array_ep(p, data, idx)); + } + break; + } + case Type_Slice: { if (val_type != nullptr) { lbValue elem = lb_slice_elem(p, expr); @@ -1365,6 +1373,15 @@ gb_internal void lb_build_range_stmt(lbProcedure *p, AstRangeStmt *rs, Scope *sc lb_build_range_indexed(p, array, val0_type, count_ptr.addr, &val, &key, &loop, &done, rs->reverse); break; } + case Type_FixedCapacityDynamicArray: { + lbValue array = lb_build_addr_ptr(p, expr); + if (is_type_pointer(type_deref(array.type))) { + array = lb_emit_load(p, array); + } + lbValue count_ptr = lb_emit_struct_ep(p, array, 1); + lb_build_range_indexed(p, array, val0_type, count_ptr, &val, &key, &loop, &done, rs->reverse); + break; + } case Type_DynamicArray: { lbValue count_ptr = {}; lbValue array = lb_build_addr_ptr(p, expr); From 93852df29ec837efd5834a907e99567a0f1d38e7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 12:28:18 +0000 Subject: [PATCH 163/273] Support `#unroll(N) for` for FCD arrays --- src/check_stmt.cpp | 17 +++++++++++++++-- src/llvm_backend_stmt.cpp | 13 +++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 5e5c0e3f4..857ec1492 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1018,15 +1018,28 @@ gb_internal void check_unroll_range_stmt(CheckerContext *ctx, Ast *node, u32 mod inline_for_depth = exact_value_i64(unroll_count); } break; + case Type_FixedCapacityDynamicArray: + if (unroll_count > 0) { + val0 = t->FixedCapacityDynamicArray.elem; + val1 = t_int; + inline_for_depth = exact_value_i64(unroll_count); + } + break; } } if (val0 == nullptr) { + ERROR_BLOCK(); gbString s = expr_to_string(operand.expr); gbString t = type_to_string(operand.type); + defer (gb_string_free(s)); + defer (gb_string_free(t)); error(operand.expr, "Cannot iterate over '%s' of type '%s' in an '#unroll for' statement", s, t); - gb_string_free(t); - gb_string_free(s); + + if (is_type_slice(operand.type) || is_type_dynamic_array(operand.type) || is_type_fixed_capacity_dynamic_array(operand.type)) { + error_line("\tSuggestion: An unroll count `#unroll(N)` must be specified with an array of a runtime-known length\n"); + } + } else if (operand.mode != Addressing_Constant && ( unroll_count <= 0 && compare_exact_values(Token_CmpEq, inline_for_depth, exact_value_i64(0)))) { diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index cb2123fe1..9f8c40e55 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1706,6 +1706,19 @@ gb_internal void lb_build_unroll_range_stmt(lbProcedure *p, AstUnrollRangeStmt * break; } + case Type_FixedCapacityDynamicArray: { + lbValue array = lb_build_expr(p, expr); + if (!is_type_pointer(array.type)) { + array = lb_address_from_load_or_generate_local(p, array); + } + GB_ASSERT(is_type_pointer(array.type)); + + count_ptr = lb_emit_struct_ep(p, array, 1); + + data_ptr = lb_emit_conv(p, array, alloc_type_pointer(t->FixedCapacityDynamicArray.elem)); + break; + } + case Type_Array: { lbValue array = lb_build_expr(p, expr); count_ptr = lb_add_local_generated(p, t_int, false).addr; From 0bf2d01a0444e994dad27915425d7832f312ec6f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 14:06:23 +0000 Subject: [PATCH 164/273] Work on improving bounds checking with constant known indices and `lb_add_local_generated` --- src/llvm_backend_expr.cpp | 21 ++++++++++++++- src/llvm_backend_general.cpp | 50 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 1efc8f411..c71409a8e 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2898,10 +2898,13 @@ gb_internal lbValue lb_emit_c_vararg(lbProcedure *p, lbValue arg, Type *type) { gb_internal lbValue lb_compare_records(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue right, Type *type) { GB_ASSERT((is_type_struct(type) || is_type_soa_pointer(type) || is_type_union(type)) && is_type_comparable(type)); + lbValue left_ptr = lb_address_from_load_or_generate_local(p, left); lbValue right_ptr = lb_address_from_load_or_generate_local(p, right); + i64 size = type_size_of(type); + lbValue res = {}; - if (type_size_of(type) == 0) { + if (size == 0) { switch (op_kind) { case Token_CmpEq: return lb_const_bool(p->module, t_bool, true); @@ -2910,8 +2913,23 @@ gb_internal lbValue lb_compare_records(lbProcedure *p, TokenKind op_kind, lbValu } GB_PANIC("invalid operator"); } + TEMPORARY_ALLOCATOR_GUARD(); + if (is_type_simple_compare(type)) { + // if (size <= 8) { + // LLVMTypeRef int_type = LLVMIntTypeInContext(p->module->ctx, cast(unsigned)(size*8)); + // LLVMValueRef l = OdinLLVMBuildLoad(p, int_type, LLVMBuildPointerCast(p->builder, left_ptr.value, LLVMPointerType(int_type, 0), "")); + // LLVMValueRef r = OdinLLVMBuildLoad(p, int_type, LLVMBuildPointerCast(p->builder, right_ptr.value, LLVMPointerType(int_type, 0), "")); + + // LLVMIntPredicate pred = (op_kind == Token_CmpEq) ? LLVMIntEQ : LLVMIntNE; + // LLVMValueRef cmp = LLVMBuildICmp(p->builder, pred, l, r, ""); + + // res.value = cmp; + // res.type = t_bool; + // return res; + // } + // TODO(bill): Test to see if this is actually faster!!!! auto args = array_make(temporary_allocator(), 3); args[0] = lb_emit_conv(p, left_ptr, t_rawptr); @@ -2925,6 +2943,7 @@ gb_internal lbValue lb_compare_records(lbProcedure *p, TokenKind op_kind, lbValu args[1] = lb_emit_conv(p, right_ptr, t_rawptr); res = lb_emit_call(p, value, args); } + if (op_kind == Token_NotEq) { res = lb_emit_unary_arith(p, Token_Not, res, res.type); } diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index dc647c1ab..9205e7325 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -709,6 +709,33 @@ gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index return; } + if (LLVMIsConstant(index.value) && LLVMIsConstant(len.value)) { + i64 i = LLVMConstIntGetSExtValue(index.value); + i64 n = LLVMConstIntGetSExtValue(len.value); + if (0<= i && i < n) { + return; + } + } + + if (LLVMIsAInstruction(index.value)) { + LLVMOpcode op = LLVMGetInstructionOpcode(index.value); + if (op == LLVMURem) { + LLVMValueRef divisor = LLVMGetOperand(index.value, 1); + if (divisor == len.value) { + return; + } + } else if (op == LLVMAnd) { + LLVMValueRef mask = LLVMGetOperand(index.value, 1); + if (LLVMIsConstant(mask) && LLVMIsConstant(len.value)) { + i64 m = LLVMConstIntGetSExtValue(mask); + i64 l = LLVMConstIntGetSExtValue(len.value); + if (l > 0 && (l & (l-1)) == 0 && m == l-1) { + return; + } + } + } + } + TEMPORARY_ALLOCATOR_GUARD(); index = lb_emit_conv(p, index, t_int); @@ -3567,7 +3594,30 @@ gb_internal lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e, bool zero } gb_internal lbAddr lb_add_local_generated(lbProcedure *p, Type *type, bool zero_init) { +#if 0 return lb_add_local(p, type, nullptr, zero_init); +#else + LLVMTypeRef llvm_type = lb_type(p->module, type); + + unsigned alignment = cast(unsigned)gb_max(type_align_of(type), lb_alignof(llvm_type)); + if (is_type_matrix(type)) { + alignment *= 2; // NOTE(bill): Just in case + } + + // This positions in the entry block, emits alloca, then restores position. + LLVMValueRef ptr = llvm_alloca(p, llvm_type, alignment, ""); + + if (zero_init) { + // Emit the zero-init store at the current position (not entry block) + // so it respects control flow. But the alloca itself is in entry. + lb_mem_zero_ptr(p, ptr, type, alignment); + } + + lbValue val = {}; + val.value = ptr; + val.type = alloc_type_pointer(type); + return lb_addr(val); +#endif } gb_internal lbAddr lb_add_local_generated_temp(lbProcedure *p, Type *type, i64 min_alignment) { From fc41e44140ebf5a5364812c27c8ec1b76bd5f5d1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 14:29:44 +0000 Subject: [PATCH 165/273] Improve bounds checking to minimize its need --- src/llvm_backend.hpp | 5 +++++ src/llvm_backend_general.cpp | 41 ++++++++++++++++++++++++++---------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 7b7d5cc31..e4297300f 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -648,6 +648,11 @@ gb_internal LLVMTypeRef llvm_array_type(LLVMTypeRef ElementType, uint64_t Elemen #endif } +gb_internal lbValue lb_emit_struct_iv(lbProcedure *p, lbValue agg, lbValue field, i32 index); +gb_internal lbValue lb_build_struct_value(lbProcedure *p, Type *type, lbValue *fields, isize count); +gb_internal lbValue lb_make_slice_value(lbProcedure *p, Type *slice_type, lbValue elem, lbValue len); +gb_internal lbValue lb_make_string_value(lbProcedure *p, Type *string_type, lbValue elem, lbValue len); + gb_internal String lb_internal_gen_name_from_type(char const *prefix, Type *type); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 9205e7325..6694f1a75 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -701,19 +701,19 @@ gb_internal void lb_set_file_line_col(lbProcedure *p, Array arr, TokenP arr[2] = lb_const_int(p->module, t_i32, col); } -gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index, lbValue len) { +gb_internal bool lb_bounds_check_short_circuit(lbProcedure *p, lbValue index, lbValue len) { if (build_context.no_bounds_check) { - return; + return true; } if ((p->state_flags & StateFlag_no_bounds_check) != 0) { - return; + return true; } if (LLVMIsConstant(index.value) && LLVMIsConstant(len.value)) { i64 i = LLVMConstIntGetSExtValue(index.value); i64 n = LLVMConstIntGetSExtValue(len.value); - if (0<= i && i < n) { - return; + if (0 <= i && i < n) { + return true; } } @@ -722,7 +722,7 @@ gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index if (op == LLVMURem) { LLVMValueRef divisor = LLVMGetOperand(index.value, 1); if (divisor == len.value) { - return; + return true; } } else if (op == LLVMAnd) { LLVMValueRef mask = LLVMGetOperand(index.value, 1); @@ -730,11 +730,18 @@ gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index i64 m = LLVMConstIntGetSExtValue(mask); i64 l = LLVMConstIntGetSExtValue(len.value); if (l > 0 && (l & (l-1)) == 0 && m == l-1) { - return; + return true; } } } } + return false; +} + +gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index, lbValue len) { + if (lb_bounds_check_short_circuit(p, index, len)) { + return; + } TEMPORARY_ALLOCATOR_GUARD(); @@ -783,6 +790,15 @@ gb_internal void lb_emit_multi_pointer_slice_bounds_check(lbProcedure *p, Token return; } + if (LLVMIsConstant(low.value) && LLVMIsConstant(high.value)) { + i64 i = LLVMConstIntGetSExtValue(low.value); + i64 n = LLVMConstIntGetSExtValue(high.value); + if (i < n) { + return; + } + } + + low = lb_emit_conv(p, low, t_int); high = lb_emit_conv(p, high, t_int); @@ -795,12 +811,15 @@ gb_internal void lb_emit_multi_pointer_slice_bounds_check(lbProcedure *p, Token } gb_internal void lb_emit_slice_bounds_check(lbProcedure *p, Token token, lbValue low, lbValue high, lbValue len, bool lower_value_used) { - if (build_context.no_bounds_check) { - return; - } - if ((p->state_flags & StateFlag_no_bounds_check) != 0) { + if (!lower_value_used && lb_bounds_check_short_circuit(p, high, len)) { return; } + // if (lower_value_used && + // lb_bounds_check_short_circuit(p, low, high) && + // lb_bounds_check_short_circuit(p, low, len) && + // lb_bounds_check_short_circuit(p, high, len)) { + // return; + // } high = lb_emit_conv(p, high, t_int); From ef36a18323370a0c14d79f4e8267bc56c94ca681 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 14:52:07 +0000 Subject: [PATCH 166/273] Enable some RVO by default --- src/llvm_backend_stmt.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 9f8c40e55..a93d3305e 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1,4 +1,5 @@ -#define LB_ENABLE_RVO build_context.enable_rvo +#define LB_ENABLE_BASIC_RVO true +#define LB_ENABLE_ADVANCED_RVO build_context.enable_rvo // NOTE(bill): @RVO Check if a call expression returns by sret with a return type matching dst_type. // Returns the callee's function type if eligible for copy elision, nullptr otherwise. @@ -2593,7 +2594,7 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return if (return_count == 1) { Entity *e = tuple->variables[0]; - if (LB_ENABLE_RVO && res_count == 1 && return_by_pointer) { + if (LB_ENABLE_BASIC_RVO && res_count == 1 && return_by_pointer) { Ast *ret_expr = unparen_expr(return_results[0]); // NOTE(bill): @RVO for `return call()` in a procedure which uses `sret` and has no defers @@ -3058,7 +3059,7 @@ gb_internal void lb_build_assign_stmt_array(lbProcedure *p, TokenKind op, lbAddr } gb_internal void lb_build_assign_stmt(lbProcedure *p, AstAssignStmt *as) { if (as->op.kind == Token_Eq) { - if (LB_ENABLE_RVO) { + if (LB_ENABLE_ADVANCED_RVO) { // @RVO for single assignments `x = call()` if (as->lhs.count == 1 && as->rhs.count == 1 && !is_blank_ident(as->lhs[0])) { Ast *rhs_expr = unparen_expr(as->rhs[0]); @@ -3260,7 +3261,7 @@ gb_internal void lb_build_stmt(lbProcedure *p, Ast *node) { } } } else { - if (LB_ENABLE_RVO) { + if (LB_ENABLE_ADVANCED_RVO) { // @RVO: for `x := call()` if (vd->names.count == 1 && values.count == 1 && !is_blank_ident(vd->names[0])) { Ast *rhs_expr = unparen_expr(values[0]); From 3dc68c2e089135a95928d7d2b6f8698cff3938f3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 15:50:13 +0000 Subject: [PATCH 167/273] In `PtrSet` `permanent_allocator` instead of `heap_allocator` --- src/ptr_set.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ptr_set.cpp b/src/ptr_set.cpp index 5b1d2cc19..21151c0aa 100644 --- a/src/ptr_set.cpp +++ b/src/ptr_set.cpp @@ -19,7 +19,8 @@ template gb_internal void ptr_set_clear (PtrSet *s); #define FOR_PTR_SET(element, set_) for (auto *it = &(set_).keys[0], element = it ? *it : nullptr; (set_).keys != nullptr && it < &(set_).keys[(set_).capacity]; it++) if (element = *it, (*it != nullptr && *it != cast(void *)~(uintptr)(0ull))) gb_internal gbAllocator ptr_set_allocator(void) { - return heap_allocator(); + // return heap_allocator(); + return permanent_allocator(); } template From 1744f57d011f7db8f8a6aced35a4bc8940fe9010 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 16:03:27 +0000 Subject: [PATCH 168/273] Use `permanent_alloc_item` directly rather than through the `gb_alloc_item` generic interface --- src/check_builtin.cpp | 11 +++++------ src/check_expr.cpp | 8 ++++---- src/check_type.cpp | 4 ++-- src/checker.cpp | 17 ++++++++--------- src/entity.cpp | 7 +++---- src/exact_value.cpp | 8 ++++---- src/llvm_abi.cpp | 16 ++++++++-------- src/llvm_backend.cpp | 6 +++--- src/llvm_backend_general.cpp | 12 ++++++------ src/llvm_backend_proc.cpp | 4 ++-- src/llvm_backend_stmt.cpp | 2 +- src/main.cpp | 6 +++--- src/parser.cpp | 14 +++++++------- src/queue.cpp | 2 +- src/types.cpp | 8 +++----- 15 files changed, 60 insertions(+), 65 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 861d72fcb..ea3ca8d3a 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1707,7 +1707,7 @@ gb_internal bool cache_load_file_directive(CheckerContext *c, Ast *call, String } defer ({ if (cache == nullptr) { - LoadFileCache *new_cache = gb_alloc_item(permanent_allocator(), LoadFileCache); + LoadFileCache *new_cache = permanent_alloc_item(); new_cache->path = path; new_cache->data = data; new_cache->file_error = file_error; @@ -1745,7 +1745,7 @@ gb_internal bool cache_load_file_directive(CheckerContext *c, Ast *call, String case LoadFileTier_Contents: { isize file_size = cast(isize)gb_file_size(&f); if (file_size > 0) { - u8 *ptr = cast(u8 *)gb_alloc(permanent_allocator(), file_size+1); + u8 *ptr = permanent_alloc_array(file_size+1); gb_file_read_at(&f, ptr, file_size, 0); ptr[file_size] = '\0'; data.text = ptr; @@ -1950,7 +1950,7 @@ gb_internal LoadDirectiveResult check_load_directory_directive(CheckerContext *c } defer ({ if (cache == nullptr) { - LoadDirectoryCache *new_cache = gb_alloc_item(permanent_allocator(), LoadDirectoryCache); + LoadDirectoryCache *new_cache = permanent_alloc_item(); new_cache->path = path; new_cache->files = file_caches; new_cache->file_error = file_error; @@ -3605,18 +3605,17 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As gb_string_free(type_str); return false; } - gbAllocator a = permanent_allocator(); Type *tuple = alloc_type_tuple(); if (is_type_struct(type)) { isize variable_count = type->Struct.fields.count; - slice_init(&tuple->Tuple.variables, a, variable_count); + tuple->Tuple.variables = permanent_slice_make(variable_count); // NOTE(bill): don't copy the entities, this should be good enough gb_memmove_array(tuple->Tuple.variables.data, type->Struct.fields.data, variable_count); } else if (is_type_array(type)) { isize variable_count = cast(isize)type->Array.count; - slice_init(&tuple->Tuple.variables, a, variable_count); + tuple->Tuple.variables = permanent_slice_make(variable_count); for (isize i = 0; i < variable_count; i++) { tuple->Tuple.variables[i] = alloc_entity_array_elem(nullptr, blank_token, type->Array.elem, cast(i32)i); } diff --git a/src/check_expr.cpp b/src/check_expr.cpp index e66498b6d..3b29d5f94 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -499,7 +499,7 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E rw_mutex_shared_unlock(&gen_procs->mutex); // @local-mutex } else { - gen_procs = gb_alloc_item(permanent_allocator(), GenProcsData); + gen_procs = permanent_alloc_item(); gen_procs->procs.allocator = heap_allocator(); base_entity->Procedure.gen_procs = gen_procs; mutex_unlock(&base_entity->Procedure.gen_procs_mutex); // @entity-mutex @@ -536,7 +536,7 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E DeclInfo *decl = other->decl_info; if (decl->proc_checked_state != ProcCheckedState_Checked) { - ProcInfo *proc_info = gb_alloc_item(permanent_allocator(), ProcInfo); + ProcInfo *proc_info = permanent_alloc_item(); proc_info->file = other->file; proc_info->token = other->token; proc_info->decl = decl; @@ -630,7 +630,7 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E array_add(&gen_procs->procs, entity); rw_mutex_unlock(&gen_procs->mutex); // @local-mutex - ProcInfo *proc_info = gb_alloc_item(permanent_allocator(), ProcInfo); + ProcInfo *proc_info = permanent_alloc_item(); proc_info->file = file; proc_info->token = token; proc_info->decl = d; @@ -7696,7 +7696,7 @@ gb_internal CallArgumentData check_call_arguments(CheckerContext *c, Operand *op } named_args = slice(ce->args, positional_args.count, ce->args.count); - auto split_args = gb_alloc_item(permanent_allocator(), AstSplitArgs); + auto split_args = permanent_alloc_item(); split_args->positional = positional_args; split_args->named = named_args; ce->split_args = split_args; diff --git a/src/check_type.cpp b/src/check_type.cpp index d8fd8d079..f780f82b0 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -272,7 +272,7 @@ gb_internal GenTypesData *ensure_polymorphic_record_entity_has_gen_types(Checker GB_ASSERT(original_type->kind == Type_Named); mutex_lock(&original_type->Named.gen_types_data_mutex); if (original_type->Named.gen_types_data == nullptr) { - GenTypesData *gen_types = gb_alloc_item(permanent_allocator(), GenTypesData); + GenTypesData *gen_types = permanent_alloc_item(); gen_types->types = array_make(heap_allocator()); original_type->Named.gen_types_data = gen_types; } @@ -3303,7 +3303,7 @@ gb_internal Type *make_soa_struct_internal(CheckerContext *ctx, Ast *array_typ_e add_type_info_type(ctx, soa_struct); wait_signal_set(&soa_struct->Struct.fields_wait_signal); } else { - SoaTypeWorkerData *wd = gb_alloc_item(permanent_allocator(), SoaTypeWorkerData); + SoaTypeWorkerData *wd = permanent_alloc_item(); wd->ctx = *ctx; wd->type = soa_struct; wd->wait_to_finish = true; diff --git a/src/checker.cpp b/src/checker.cpp index 720556a4f..5677b39b9 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -123,7 +123,7 @@ gb_internal void import_graph_node_set_add(ImportGraphNodeSet *s, ImportGraphNod // } gb_internal ImportGraphNode *import_graph_node_create(gbAllocator a, AstPackage *pkg) { - ImportGraphNode *n = gb_alloc_item(a, ImportGraphNode); + ImportGraphNode *n = permanent_alloc_item(); n->pkg = pkg; n->scope = pkg->scope; return n; @@ -163,7 +163,6 @@ gb_internal void import_graph_node_swap(ImportGraphNode **data, isize i, isize j gb_internal void init_decl_info(DeclInfo *d, Scope *scope, DeclInfo *parent) { - gb_zero_item(d); if (parent) { mutex_lock(&parent->next_mutex); d->next_sibling = parent->next_child; @@ -181,7 +180,7 @@ gb_internal void init_decl_info(DeclInfo *d, Scope *scope, DeclInfo *parent) { } gb_internal DeclInfo *make_decl_info(Scope *scope, DeclInfo *parent) { - DeclInfo *d = gb_alloc_item(permanent_allocator(), DeclInfo); + DeclInfo *d = permanent_alloc_item(); init_decl_info(d, scope, parent); return d; } @@ -214,7 +213,7 @@ gb_internal DeclInfo *make_decl_info(Scope *scope, DeclInfo *parent) { gb_internal Scope *create_scope(CheckerInfo *info, Scope *parent) { - Scope *s = gb_alloc_item(permanent_allocator(), Scope); + Scope *s = permanent_alloc_item(); s->parent = parent; if (parent != nullptr && parent != builtin_pkg->scope) { @@ -1018,7 +1017,7 @@ gb_internal void add_global_type_entity(String name, Type *type) { gb_internal AstPackage *create_builtin_package(char const *name) { gbAllocator a = permanent_allocator(); - AstPackage *pkg = gb_alloc_item(a, AstPackage); + AstPackage *pkg = permanent_alloc_item(); pkg->name = make_string_c(name); pkg->kind = Package_Builtin; @@ -2412,7 +2411,7 @@ gb_internal void check_procedure_later(Checker *c, ProcInfo *info) { } gb_internal void check_procedure_later(Checker *c, AstFile *file, Token token, DeclInfo *decl, Type *type, Ast *body, u64 tags) { - ProcInfo *info = gb_alloc_item(permanent_allocator(), ProcInfo); + ProcInfo *info = permanent_alloc_item(); info->file = file; info->token = token; info->decl = decl; @@ -3259,7 +3258,7 @@ gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String } gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator) { - auto *tp = gb_alloc_item(allocator, CheckerTypePath); + auto *tp = gb_alloc_item(heap_allocator(), CheckerTypePath); array_init(tp, allocator, 0, 16); return tp; } @@ -5016,7 +5015,7 @@ gb_internal void check_collect_entities(CheckerContext *c, Slice const &n } gb_internal CheckerContext *create_checker_context(Checker *c) { - CheckerContext *ctx = gb_alloc_item(permanent_allocator(), CheckerContext); + CheckerContext *ctx = permanent_alloc_item(); init_checker_context(ctx, c); return ctx; } @@ -6228,7 +6227,7 @@ gb_internal void check_procedure_later_from_entity(Checker *c, Entity *e, char c GB_ASSERT(e->decl_info != nullptr); - ProcInfo *pi = gb_alloc_item(permanent_allocator(), ProcInfo); + ProcInfo *pi = permanent_alloc_item(); pi->file = e->file; pi->token = e->token; pi->decl = e->decl_info; diff --git a/src/entity.cpp b/src/entity.cpp index 070b05462..1a01e0945 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -151,8 +151,8 @@ struct TypeNameObjCMetadata { }; gb_internal TypeNameObjCMetadata *create_type_name_obj_c_metadata() { - TypeNameObjCMetadata *md = gb_alloc_item(permanent_allocator(), TypeNameObjCMetadata); - md->mutex = gb_alloc_item(permanent_allocator(), BlockingMutex); + TypeNameObjCMetadata *md = permanent_alloc_item(); + md->mutex = permanent_alloc_item(); array_init(&md->type_entries, heap_allocator()); array_init(&md->value_entries, heap_allocator()); return md; @@ -345,8 +345,7 @@ gb_internal bool entity_has_deferred_procedure(Entity *e) { gb_global std::atomic global_entity_id; gb_internal Entity *alloc_entity(EntityKind kind, Scope *scope, Token token, Type *type) { - gbAllocator a = permanent_allocator(); - Entity *entity = gb_alloc_item(a, Entity); + Entity *entity = permanent_alloc_item(); entity->kind = kind; entity->state = EntityState_Unresolved; entity->scope = scope; diff --git a/src/exact_value.cpp b/src/exact_value.cpp index fa99ed3fe..525b8cb91 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -146,7 +146,7 @@ gb_internal ExactValue exact_value_float(f64 f) { gb_internal ExactValue exact_value_complex(f64 real, f64 imag) { ExactValue result = {ExactValue_Complex}; - result.value_complex = gb_alloc_item(permanent_allocator(), Complex128); + result.value_complex = permanent_alloc_item(); result.value_complex->real = real; result.value_complex->imag = imag; return result; @@ -154,7 +154,7 @@ gb_internal ExactValue exact_value_complex(f64 real, f64 imag) { gb_internal ExactValue exact_value_quaternion(f64 real, f64 imag, f64 jmag, f64 kmag) { ExactValue result = {ExactValue_Quaternion}; - result.value_quaternion = gb_alloc_item(permanent_allocator(), Quaternion256); + result.value_quaternion = permanent_alloc_item(); result.value_quaternion->real = real; result.value_quaternion->imag = imag; result.value_quaternion->jmag = jmag; @@ -438,7 +438,7 @@ gb_internal ExactValue exact_value_to_complex(ExactValue v) { // return exact_value_complex(v.value_quaternion.real, v.value_quaternion.imag); } ExactValue r = {ExactValue_Invalid}; - v.value_complex = gb_alloc_item(permanent_allocator(), Complex128); + v.value_complex = permanent_alloc_item(); return r; } gb_internal ExactValue exact_value_to_quaternion(ExactValue v) { @@ -453,7 +453,7 @@ gb_internal ExactValue exact_value_to_quaternion(ExactValue v) { return v; } ExactValue r = {ExactValue_Invalid}; - v.value_quaternion = gb_alloc_item(permanent_allocator(), Quaternion256); + v.value_quaternion = permanent_alloc_item(); return r; } diff --git a/src/llvm_abi.cpp b/src/llvm_abi.cpp index ec7c63b1a..6aabe456f 100644 --- a/src/llvm_abi.cpp +++ b/src/llvm_abi.cpp @@ -389,7 +389,7 @@ namespace lbAbi386 { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->args = compute_arg_types(c, arg_types, arg_count); ft->ret = compute_return_type(ft, c, return_type, return_is_defined, return_is_tuple); @@ -471,7 +471,7 @@ namespace lbAbiAmd64Win64 { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->args = compute_arg_types(c, arg_types, arg_count); ft->ret = compute_return_type(ft, c, return_type, return_is_defined, return_is_tuple); @@ -617,7 +617,7 @@ namespace lbAbiAmd64SysV { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->calling_convention = calling_convention; @@ -1128,7 +1128,7 @@ namespace lbAbiArm64 { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->args = compute_arg_types(c, arg_types, arg_count); ft->ret = compute_return_type(ft, c, return_type, return_is_defined, return_is_tuple); @@ -1349,7 +1349,7 @@ namespace lbAbiWasm { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->calling_convention = calling_convention; ft->args = compute_arg_types(c, arg_types, arg_count, calling_convention, original_type); @@ -1558,7 +1558,7 @@ namespace lbAbiArm32 { gb_internal LB_ABI_INFO(abi_info) { LLVMContextRef c = m->ctx; - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->args = compute_arg_types(c, arg_types, arg_count, calling_convention); ft->ret = compute_return_type(c, return_type, return_is_defined); @@ -1867,7 +1867,7 @@ namespace lbAbiRiscv64 { } gb_internal LB_ABI_INFO(abi_info) { - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = m->ctx; ft->calling_convention = calling_convention; @@ -1889,7 +1889,7 @@ gb_internal LB_ABI_INFO(lb_get_abi_info_internal) { case ProcCC_None: case ProcCC_InlineAsm: { - lbFunctionType *ft = gb_alloc_item(permanent_allocator(), lbFunctionType); + lbFunctionType *ft = permanent_alloc_item(); ft->ctx = c; ft->args = array_make(lb_function_type_args_allocator(), arg_count); for (unsigned i = 0; i < arg_count; i++) { diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 929b056a3..fac3e3354 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2647,7 +2647,7 @@ gb_internal void lb_llvm_module_passes_and_verification(lbGenerator *gen, bool d if (do_threading) { for (auto const &entry : gen->modules) { lbModule *m = entry.value; - auto wd = gb_alloc_item(permanent_allocator(), lbLLVMModulePassWorkerData); + auto wd = permanent_alloc_item(); wd->m = m; wd->target_machine = m->target_machine; wd->do_threading = true; @@ -2658,7 +2658,7 @@ gb_internal void lb_llvm_module_passes_and_verification(lbGenerator *gen, bool d } else { for (auto const &entry : gen->modules) { lbModule *m = entry.value; - auto wd = gb_alloc_item(permanent_allocator(), lbLLVMModulePassWorkerData); + auto wd = permanent_alloc_item(); wd->m = m; wd->target_machine = m->target_machine; wd->do_threading = false; @@ -2778,7 +2778,7 @@ gb_internal bool lb_llvm_object_generation(lbGenerator *gen, bool do_threading) array_add(&gen->output_object_paths, filepath_obj); array_add(&gen->output_temp_paths, filepath_ll); - auto *wd = gb_alloc_item(permanent_allocator(), lbLLVMEmitWorker); + auto *wd = permanent_alloc_item(); wd->target_machine = m->target_machine; wd->code_gen_file_type = code_gen_file_type; wd->filepath_obj = filepath_obj; diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 6694f1a75..35a0f5f65 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -166,7 +166,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { bool module_per_file = build_context.module_per_file && (build_context.optimization_level <= 0 || build_context.lto_kind != LTO_None); for (auto const &entry : gen->info->packages) { AstPackage *pkg = entry.value; - auto m = gb_alloc_item(permanent_allocator(), lbModule); + auto m = permanent_alloc_item(); m->pkg = pkg; m->gen = gen; m->checker = c; @@ -174,7 +174,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { lb_init_module(m, do_threading); if (LLVM_WEAK_MONOMORPHIZATION) { - auto pm = gb_alloc_item(permanent_allocator(), lbModule); + auto pm = permanent_alloc_item(); pm->pkg = pkg; pm->gen = gen; pm->checker = c; @@ -216,7 +216,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { } // NOTE(bill): Probably per file is not a good idea, so leave this for later for (AstFile *file : pkg->files) { - auto m = gb_alloc_item(permanent_allocator(), lbModule); + auto m = permanent_alloc_item(); m->file = file; m->pkg = pkg; m->gen = gen; @@ -226,7 +226,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { if (LLVM_WEAK_MONOMORPHIZATION) { - auto pm = gb_alloc_item(permanent_allocator(), lbModule); + auto pm = permanent_alloc_item(); pm->file = file; pm->pkg = pkg; pm->gen = gen; @@ -242,7 +242,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { } if (LLVM_WEAK_MONOMORPHIZATION) { - lbModule *m = gb_alloc_item(permanent_allocator(), lbModule); + lbModule *m = permanent_alloc_item(); gen->equal_module = m; m->gen = gen; m->checker = c; @@ -2728,7 +2728,7 @@ gb_internal void lb_add_edge(lbBlock *from, lbBlock *to) { gb_internal lbBlock *lb_create_block(lbProcedure *p, char const *name, bool append) { - lbBlock *b = gb_alloc_item(permanent_allocator(), lbBlock); + lbBlock *b = permanent_alloc_item(); b->block = LLVMCreateBasicBlockInContext(p->module->ctx, name); b->appended = false; if (append) { diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 88165f4d2..121b8c550 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -99,7 +99,7 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i } } - lbProcedure *p = gb_alloc_item(permanent_allocator(), lbProcedure); + lbProcedure *p = permanent_alloc_item(); p->module = m; entity->code_gen_module = m; @@ -395,7 +395,7 @@ gb_internal lbProcedure *lb_create_dummy_procedure(lbModule *m, String link_name GB_ASSERT_MSG(found == nullptr, "failed to create dummy procedure for: %.*s", LIT(link_name)); } - lbProcedure *p = gb_alloc_item(permanent_allocator(), lbProcedure); + lbProcedure *p = permanent_alloc_item(); p->module = m; p->name = link_name; diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index a93d3305e..fe09b26c8 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -260,7 +260,7 @@ gb_internal lbBranchBlocks lb_lookup_branch_blocks(lbProcedure *p, Ast *ident) { } gb_internal lbTargetList *lb_push_target_list(lbProcedure *p, Ast *label, lbBlock *break_, lbBlock *continue_, lbBlock *fallthrough_) { - lbTargetList *tl = gb_alloc_item(permanent_allocator(), lbTargetList); + lbTargetList *tl = permanent_alloc_item(); tl->prev = p->target_list; tl->break_ = break_; tl->continue_ = continue_; diff --git a/src/main.cpp b/src/main.cpp index d7288e5f4..ee3f42660 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4012,8 +4012,8 @@ int main(int arg_count, char const **arg_ptr) { init_universal(); // TODO(bill): prevent compiling without a linker - Parser *parser = gb_alloc_item(permanent_allocator(), Parser); - Checker *checker = gb_alloc_item(permanent_allocator(), Checker); + Parser * parser = permanent_alloc_item(); + Checker *checker = permanent_alloc_item(); bool failed_to_cache_parsing = false; MAIN_TIME_SECTION("parse files"); @@ -4151,7 +4151,7 @@ int main(int arg_count, char const **arg_ptr) { } else #endif { - lbGenerator *gen = gb_alloc_item(permanent_allocator(), lbGenerator); + lbGenerator *gen = permanent_alloc_item(); if (!lb_init_generator(gen, checker)) { return 1; } diff --git a/src/parser.cpp b/src/parser.cpp index b302c935d..f79287ceb 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1476,7 +1476,7 @@ gb_internal CommentGroup *consume_comment_group(AstFile *f, isize n, isize *end_ CommentGroup *comments = nullptr; if (list.count > 0) { - comments = gb_alloc_item(permanent_allocator(), CommentGroup); + comments = permanent_alloc_item(); comments->list = slice_from_array(list); array_add(&f->comments, comments); } @@ -5151,7 +5151,7 @@ gb_internal Ast *parse_import_decl(AstFile *f, ImportDeclKind kind) { } if (file_path.string == "\".\"") { - syntax_error(import_name, "Cannot cyclicly import packages"); + // syntax_error(import_name, "Cannot cyclicly import packages"); } expect_semicolon(f); @@ -5797,7 +5797,7 @@ gb_internal WORKER_TASK_PROC(parser_worker_proc) { ParserWorkerData *wd = cast(ParserWorkerData *)data; ParseFileError err = process_imported_file(wd->parser, wd->imported_file); if (err != ParseFile_None) { - auto *node = gb_alloc_item(permanent_allocator(), ParseFileErrorNode); + auto *node = permanent_alloc_item(); node->err = err; MUTEX_GUARD_BLOCK(&wd->parser->file_error_mutex) { @@ -5817,7 +5817,7 @@ gb_internal WORKER_TASK_PROC(parser_worker_proc) { gb_internal void parser_add_file_to_process(Parser *p, AstPackage *pkg, FileInfo fi, TokenPos pos) { ImportedFile f = {pkg, fi, pos, p->file_to_process_count++}; f.pos.file_id = cast(i32)(f.index+1); - auto wd = gb_alloc_item(permanent_allocator(), ParserWorkerData); + auto wd = permanent_alloc_item(); wd->parser = p; wd->imported_file = f; thread_pool_add_task(parser_worker_proc, wd); @@ -5854,7 +5854,7 @@ gb_internal void parser_add_foreign_file_to_process(Parser *p, AstPackage *pkg, // TODO(bill): Use a better allocator ImportedFile f = {pkg, fi, pos, p->file_to_process_count++}; f.pos.file_id = cast(i32)(f.index+1); - auto wd = gb_alloc_item(permanent_allocator(), ForeignFileWorkerData); + auto wd = permanent_alloc_item(); wd->parser = p; wd->imported_file = f; wd->foreign_kind = kind; @@ -5874,7 +5874,7 @@ gb_internal AstPackage *try_add_import_path(Parser *p, String path, String const path = copy_string(permanent_allocator(), path); - AstPackage *pkg = gb_alloc_item(permanent_allocator(), AstPackage); + AstPackage *pkg = permanent_alloc_item(); pkg->kind = kind; pkg->fullpath = path; array_init(&pkg->files, permanent_allocator()); @@ -6880,7 +6880,7 @@ gb_internal ParseFileError process_imported_file(Parser *p, ImportedFile importe FileInfo fi = imported_file.fi; TokenPos pos = imported_file.pos; - AstFile *file = gb_alloc_item(permanent_allocator(), AstFile); + AstFile *file = permanent_alloc_item(); file->pkg = pkg; file->id = cast(i32)(imported_file.index+1); TokenPos err_pos = {0}; diff --git a/src/queue.cpp b/src/queue.cpp index 82f82f3e1..563fbe69e 100644 --- a/src/queue.cpp +++ b/src/queue.cpp @@ -37,7 +37,7 @@ gb_internal void mpsc_destroy(MPSCQueue *q) { template gb_internal MPSCNode *mpsc_alloc_node(MPSCQueue *q, T const &value) { // auto new_node = gb_alloc_item(heap_allocator(), MPSCNode); - auto new_node = gb_alloc_item(permanent_allocator(), MPSCNode); + auto new_node = permanent_alloc_item >(); new_node->value = value; return new_node; } diff --git a/src/types.cpp b/src/types.cpp index 0f7aa2199..1ab759c9a 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -979,9 +979,7 @@ gb_internal void set_base_type(Type *t, Type *base) { gb_internal Type *alloc_type(TypeKind kind) { // gbAllocator a = heap_allocator(); - gbAllocator a = permanent_allocator(); - Type *t = gb_alloc_item(a, Type); - gb_zero_item(t); + Type *t = permanent_alloc_item(); t->kind = kind; t->cached_size = -1; t->cached_align = -1; @@ -1076,8 +1074,8 @@ gb_internal Type *alloc_type_enumerated_array(Type *elem, Type *index, ExactValu Type *t = alloc_type(Type_EnumeratedArray); t->EnumeratedArray.elem = elem; t->EnumeratedArray.index = index; - t->EnumeratedArray.min_value = gb_alloc_item(permanent_allocator(), ExactValue); - t->EnumeratedArray.max_value = gb_alloc_item(permanent_allocator(), ExactValue); + t->EnumeratedArray.min_value = permanent_alloc_item(); + t->EnumeratedArray.max_value = permanent_alloc_item(); gb_memmove(t->EnumeratedArray.min_value, min_value, gb_size_of(ExactValue)); gb_memmove(t->EnumeratedArray.max_value, max_value, gb_size_of(ExactValue)); t->EnumeratedArray.op = op; From 36d5a1911571a97894ad92bc897afba3efc0d218 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 17:41:58 +0000 Subject: [PATCH 169/273] Replace `Scope.elements` to use a custom hash map `ScopeMap` This hash map is robin hood based with a inline slot amount for small scopes --- src/big_int.cpp | 19 +++- src/check_decl.cpp | 3 +- src/check_expr.cpp | 2 +- src/check_stmt.cpp | 3 +- src/check_type.cpp | 30 ++++-- src/checker.cpp | 106 ++++++++++++-------- src/checker.hpp | 245 ++++++++++++++++++++++++++++++++++++++++++++- src/entity.cpp | 27 +++-- src/ptr_set.cpp | 18 ++-- src/types.cpp | 2 +- 10 files changed, 374 insertions(+), 81 deletions(-) diff --git a/src/big_int.cpp b/src/big_int.cpp index 7067a7c3d..141152913 100644 --- a/src/big_int.cpp +++ b/src/big_int.cpp @@ -16,14 +16,25 @@ void MP_FREE(void *mem, size_t size) { #else void *MP_MALLOC(size_t size) { - return gb_alloc(permanent_allocator(), cast(isize)size); + Arena *arena = get_arena(ThreadArena_Permanent); + return arena_alloc(arena, cast(isize)size, 16); } void *MP_REALLOC(void *mem, size_t oldsize, size_t newsize) { - return gb_resize(permanent_allocator(), mem, cast(isize)oldsize, cast(isize)newsize); + if (newsize < oldsize) { + return mem; + } + if (newsize == 0) { + return mem; + } + Arena *arena = get_arena(ThreadArena_Permanent); + void *new_mem = arena_alloc(arena, cast(isize)newsize, 16); + gb_memcopy(new_mem, mem, oldsize); + return new_mem; } void *MP_CALLOC(size_t nmemb, size_t size) { - size_t total = nmemb*size; - return gb_alloc(permanent_allocator(), cast(isize)total); + Arena *arena = get_arena(ThreadArena_Permanent); + isize total_size = cast(isize)(nmemb * size); + return arena_alloc(arena, total_size, 16); } void MP_FREE(void *mem, size_t size) { // DO NOTHING diff --git a/src/check_decl.cpp b/src/check_decl.cpp index c0358cff7..9c849d1e2 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -170,8 +170,9 @@ gb_internal void override_entity_in_scope(Entity *original_entity, Entity *new_e // Therefore two things can be done: the type can be assigned to state that it // has been "evaluated" and the variant data can be copied across + u32 hash = string_hash(original_name); rw_mutex_lock(&found_scope->mutex); - string_map_set(&found_scope->elements, original_name, new_entity); + scope_map_insert(&found_scope->elements, original_name, hash, new_entity); rw_mutex_unlock(&found_scope->mutex); original_entity->flags |= EntityFlag_Overridden; diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 3b29d5f94..152031fa7 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -514,7 +514,7 @@ gb_internal bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, E // NOTE(bill): Reset scope from the failed procedure type scope->head_child.store(nullptr, std::memory_order_relaxed); - string_map_clear(&scope->elements); + scope_map_clear(&scope->elements); ptr_set_clear(&scope->imported); // LEAK NOTE(bill): Cloning this AST may be leaky but this is not really an issue due to arena-based allocation diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 857ec1492..41ad7197b 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -790,10 +790,11 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, for (auto const &entry : scope->elements) { String name = entry.key; + u32 hash = entry.hash; Entity *decl = entry.value; if (!is_entity_exported(decl, true)) continue; - Entity *found = scope_insert_with_name(ctx->scope, name, decl); + Entity *found = scope_insert_with_name(ctx->scope, name, hash, decl); if (found != nullptr) { gbString expr_str = expr_to_string(expr); error(us->token, diff --git a/src/check_type.cpp b/src/check_type.cpp index f780f82b0..9612fc4f6 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -117,6 +117,10 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, Slice(variable_count); + isize entities_to_use_index = 0; + i32 field_src_index = 0; i32 field_group_index = -1; for_array(i, params) { @@ -165,7 +169,14 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, SliceIdent.token; - Entity *field = alloc_entity_field(ctx->scope, name_token, type, is_using, field_src_index); + // Entity *field = alloc_entity_field(ctx->scope, name_token, type, is_using, field_src_index); + Entity *field = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(field, Entity_Variable, ctx->scope, name_token, type); + field->state = EntityState_Unresolved; + field->flags |= EntityFlag_Field; + if (is_using) field->flags |= EntityFlag_Using; + field->Variable.field_index = field_src_index; + add_entity(ctx, ctx->scope, name, field); field->Variable.field_group_index = field_group_index; if (is_subtype) { @@ -636,7 +647,7 @@ gb_internal void check_struct_type(CheckerContext *ctx, Type *struct_type, Ast * isize min_field_count = 0; for_array(field_index, st->fields) { - Ast *field = st->fields[field_index]; + Ast *field = st->fields[field_index]; switch (field->kind) { case_ast_node(f, ValueDecl, field); min_field_count += f->names.count; @@ -887,6 +898,10 @@ gb_internal void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *nam scope_reserve(ctx->scope, et->fields.count); + // Allocate all at once + Entity *entities_to_use = permanent_alloc_array(et->fields.count); + isize entities_to_use_index = 0; + for_array(i, et->fields) { Ast *field = et->fields[i]; Ast *ident = nullptr; @@ -931,9 +946,6 @@ gb_internal void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *nam // NOTE(bill): Skip blank identifiers if (is_blank_ident(name)) { continue; - } else if (name == "names") { - error(field, "'names' is a reserved identifier for enumerations"); - continue; } if (min_value_set) { @@ -957,7 +969,11 @@ gb_internal void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *nam max_value_set = true; } - Entity *e = alloc_entity_constant(ctx->scope, ident->Ident.token, constant_type, iota); + // Entity *e = alloc_entity_constant(ctx->scope, ident->Ident.token, constant_type, iota); + Entity *e = &entities_to_use[entities_to_use_index++]; + Token token = ident->Ident.token; + INTERNAL_ENTITY_INIT(e, Entity_Constant, ctx->scope, token, constant_type); + e->Constant.value = iota; e->identifier = ident; e->flags |= EntityFlag_Visited; e->state = EntityState_Resolved; @@ -3205,7 +3221,7 @@ gb_internal Type *make_soa_struct_internal(CheckerContext *ctx, Ast *array_typ_e soa_struct->Struct.fields = permanent_slice_make(field_count+extra_field_count); soa_struct->Struct.tags = gb_alloc_array(permanent_allocator(), String, field_count+extra_field_count); - string_map_init(&scope->elements, 8); + scope_map_init(&scope->elements); String params_xyzw[4] = { str_lit("x"), diff --git a/src/checker.cpp b/src/checker.cpp index 5677b39b9..aca0e90a6 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -55,7 +55,8 @@ gb_internal bool check_rtti_type_disallowed(Ast *expr, Type *type, char const *f gb_internal void scope_reserve(Scope *scope, isize count) { - string_map_reserve(&scope->elements, 2*count); + scope_map_reserve(&scope->elements, 2*count); + // string_map_reserve(&scope->elements, 2*count); } gb_internal void entity_graph_node_set_destroy(EntityGraphNodeSet *s) { @@ -214,6 +215,7 @@ gb_internal DeclInfo *make_decl_info(Scope *scope, DeclInfo *parent) { gb_internal Scope *create_scope(CheckerInfo *info, Scope *parent) { Scope *s = permanent_alloc_item(); + scope_map_init(&s->elements); s->parent = parent; if (parent != nullptr && parent != builtin_pkg->scope) { @@ -254,9 +256,10 @@ gb_internal Scope *create_scope_from_package(CheckerContext *c, AstPackage *pkg) total_pkg_decl_count += file->total_file_decl_count; } - isize init_elements_capacity = gb_max(DEFAULT_SCOPE_CAPACITY, 2*total_pkg_decl_count); + // isize init_elements_capacity = gb_max(DEFAULT_SCOPE_CAPACITY, 2*total_pkg_decl_count); Scope *s = create_scope(c->info, builtin_pkg->scope); - string_map_init(&s->elements, init_elements_capacity); + scope_map_reserve(&s->elements, 2*total_pkg_decl_count); + // string_map_init(&s->elements, init_elements_capacity); s->flags |= ScopeFlag_Pkg; s->pkg = pkg; @@ -283,7 +286,7 @@ gb_internal void destroy_scope(Scope *scope) { destroy_scope(child); } - string_map_destroy(&scope->elements); + // string_map_destroy(&scope->elements); ptr_set_destroy(&scope->imported); // NOTE(bill): No need to free scope as it "should" be allocated in an arena (except for the global scope) @@ -369,10 +372,14 @@ gb_internal void check_close_scope(CheckerContext *c) { } -gb_internal Entity *scope_lookup_current(Scope *s, String const &name) { - Entity **found = string_map_get(&s->elements, name); +gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash) { + // Entity **found = string_map_get(&s->elements, name); + if (hash == 0) { + hash = string_hash(name); + } + Entity *found = scope_map_get(&s->elements, name, hash); if (found) { - return *found; + return found; } return nullptr; } @@ -385,20 +392,16 @@ gb_internal void scope_lookup_parent(Scope *scope, String const &name, Scope **s if (scope != nullptr) { bool gone_thru_proc = false; bool gone_thru_package = false; - StringHashKey key = {}; - if (hash) { - key.hash = hash; - key.string = name; - } else { - key = string_hash_string(name); + if (!hash) { + hash = string_hash(name); } for (Scope *s = scope; s != nullptr; s = s->parent) { - Entity **found = nullptr; + Entity *found = nullptr; if (!is_single_threaded) rw_mutex_shared_lock(&s->mutex); - found = string_map_get(&s->elements, key); + found = scope_map_get(&s->elements, name, hash); if (!is_single_threaded) rw_mutex_shared_unlock(&s->mutex); if (found) { - Entity *e = *found; + Entity *e = found; if (gone_thru_proc) { if (e->kind == Entity_Label) { continue; @@ -437,35 +440,34 @@ gb_internal Entity *scope_lookup(Scope *s, String const &name, u32 hash) { return entity; } -gb_internal Entity *scope_insert_with_name_no_mutex(Scope *s, String const &name, Entity *entity) { +gb_internal Entity *scope_insert_with_name_no_mutex(Scope *s, String const &name, u32 hash, Entity *entity) { if (name == "") { return nullptr; } - StringHashKey key = string_hash_string(name); - Entity **found = nullptr; + Entity *found = nullptr; Entity *result = nullptr; - found = string_map_get(&s->elements, key); + found = scope_map_get(&s->elements, name, hash); if (found) { - if (entity != *found) { - result = *found; + if (entity != found) { + result = found; } goto end; } if (s->parent != nullptr && (s->parent->flags & ScopeFlag_Proc) != 0) { - found = string_map_get(&s->parent->elements, key); + found = scope_map_get(&s->parent->elements, name, hash); if (found) { - if ((*found)->flags & EntityFlag_Result) { - if (entity != *found) { - result = *found; + if (found->flags & EntityFlag_Result) { + if (entity != found) { + result = found; } goto end; } } } - string_map_set(&s->elements, key, entity); + scope_map_insert(&s->elements, name, hash, entity); if (entity->scope == nullptr) { entity->scope = s; } @@ -474,31 +476,30 @@ end:; } -gb_internal Entity *scope_insert_with_name(Scope *s, String const &name, Entity *entity) { +gb_internal Entity *scope_insert_with_name(Scope *s, String const &name, u32 hash, Entity *entity) { if (name == "") { return nullptr; } - StringHashKey key = string_hash_string(name); - Entity **found = nullptr; + Entity *found = nullptr; Entity *result = nullptr; rw_mutex_lock(&s->mutex); - found = string_map_get(&s->elements, key); + found = scope_map_get(&s->elements, name, hash); if (found) { - if (entity != *found) { - result = *found; + if (entity != found) { + result = found; } goto end; } if (s->parent != nullptr && (s->parent->flags & ScopeFlag_Proc) != 0) { rw_mutex_shared_lock(&s->parent->mutex); - found = string_map_get(&s->parent->elements, key); + found = scope_map_get(&s->parent->elements, name, hash); if (found) { - if ((*found)->flags & EntityFlag_Result) { - if (entity != *found) { - result = *found; + if (found->flags & EntityFlag_Result) { + if (entity != found) { + result = found; } rw_mutex_shared_unlock(&s->parent->mutex); goto end; @@ -507,7 +508,7 @@ gb_internal Entity *scope_insert_with_name(Scope *s, String const &name, Entity rw_mutex_shared_unlock(&s->parent->mutex); } - string_map_set(&s->elements, key, entity); + scope_map_insert(&s->elements, name, hash, entity); if (entity->scope == nullptr) { entity->scope = s; } @@ -519,16 +520,32 @@ end:; gb_internal Entity *scope_insert(Scope *s, Entity *entity) { String name = entity->token.string; + u32 hash = 0; + Ast *ident = entity->identifier.load(std::memory_order_relaxed); + if (ident != nullptr) { + hash = ident->Ident.hash; + } + if (hash == 0) { + hash = string_hash(name); + } if (in_single_threaded_checker_stage.load(std::memory_order_relaxed)) { - return scope_insert_with_name_no_mutex(s, name, entity); + return scope_insert_with_name_no_mutex(s, name, hash, entity); } else { - return scope_insert_with_name(s, name, entity); + return scope_insert_with_name(s, name, hash, entity); } } gb_internal Entity *scope_insert_no_mutex(Scope *s, Entity *entity) { String name = entity->token.string; - return scope_insert_with_name_no_mutex(s, name, entity); + u32 hash = 0; + Ast *ident = entity->identifier.load(std::memory_order_relaxed); + if (ident != nullptr) { + hash = ident->Ident.hash; + } + if (hash == 0) { + hash = string_hash(name); + } + return scope_insert_with_name_no_mutex(s, name, hash, entity); } @@ -3258,6 +3275,7 @@ gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String } gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator) { + // TODO(bill): Cache to reuse `CheckerTypePath` auto *tp = gb_alloc_item(heap_allocator(), CheckerTypePath); array_init(tp, allocator, 0, 16); return tp; @@ -4882,9 +4900,9 @@ gb_internal bool correct_single_type_alias(CheckerContext *c, Entity *e) { gb_internal bool correct_type_alias_in_scope_backwards(CheckerContext *c, Scope *s) { bool correction = false; for (u32 n = s->elements.count, i = n-1; i < n; i--) { - auto const &entry = s->elements.entries[i]; - Entity *e = entry.value; - if (entry.hash && e != nullptr) { + auto const &slot = s->elements.slots[i]; + Entity *e = slot.value; + if (slot.hash && e != nullptr) { correction |= correct_single_type_alias(c, e); } } diff --git a/src/checker.hpp b/src/checker.hpp index fd2fa2c7f..9f4ee66d8 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -266,6 +266,246 @@ struct ProcInfo { }; +enum { DEFAULT_SCOPE_CAPACITY = 32 }; + + +struct ScopeMapSlot { + u32 hash; + u32 _pad; + String key; + Entity *value; +}; + +enum { SCOPE_MAP_INLINE_CAP = 16 }; + +struct ScopeMap { + ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; + ScopeMapSlot *slots; + u32 count; + u32 cap; +}; + +gb_internal gb_inline u32 scope_map_max_load(u32 cap) { + return cap - (cap>>2); // 75% +} + +gb_internal gb_inline void scope_map_init(ScopeMap *m) { + m->cap = SCOPE_MAP_INLINE_CAP; + m->slots = m->inline_slots; +} + + +gb_internal Entity *scope_map_insert_for_rehash( + ScopeMapSlot *slots, u32 mask, + String key, u32 hash, Entity *value) { + u32 pos = hash & mask; + u32 dist = 0; + + for (;;) { + ScopeMapSlot *s = &slots[pos]; + + if (s->hash == 0) { + s->key = key; + s->hash = hash; + s->value = value; + return nullptr; + } + + u32 existing_dist = (pos - s->hash) & mask; + + if (dist > existing_dist) { + String tmp_key = s->key; + u32 tmp_hash = s->hash; + Entity *tmp_value = s->value; + + s->key = key; + s->hash = hash; + s->value = value; + + hash = tmp_hash; + value = tmp_value; + key = tmp_key; + dist = existing_dist; + } + + dist += 1; + pos = (pos+1) & mask; + } +} + + +gb_internal void scope_map_grow(ScopeMap *m) { + u32 new_cap = m->cap << 1; + u32 new_mask = new_cap - 1; + + ScopeMapSlot *new_slots = permanent_alloc_array(new_cap); + + if (m->count > 0) { + for (u32 i = 0; i < m->cap; i++) { + if (m->slots[i].hash) { + scope_map_insert_for_rehash(new_slots, new_mask, + m->slots[i].key, m->slots[i].hash, m->slots[i].value); + } + } + } + + m->slots = new_slots; + m->cap = new_cap; +} + +gb_internal void scope_map_reserve(ScopeMap *m, isize capacity) { + if (m->slots == nullptr) { + scope_map_init(m); + } + u32 new_cap = next_pow2_u32(cast(u32)capacity); + if (m->cap < new_cap && new_cap > SCOPE_MAP_INLINE_CAP) { + m->slots = permanent_alloc_array(new_cap); + m->cap = new_cap; + } +} + + + +gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity *value) { + if (m->slots == nullptr) { + scope_map_init(m); + } + if (m->count >= scope_map_max_load(m->cap)) { + scope_map_grow(m); + } + + u32 mask = m->cap-1; + u32 pos = hash & mask; + u32 dist = 0; + + for (;;) { + ScopeMapSlot *s = &m->slots[pos]; + + if (s->hash == 0) { + s->key = key; + s->hash = hash; + s->value = value; + m->count += 1; + return nullptr; + } + + if (s->hash == hash && s->key == key) { + Entity *old = s->value; + s->value = value; + return old; + } + + u32 existing_dist = (pos - s->hash) & mask; + + if (dist > existing_dist) { + String tmp_key = s->key; + u32 tmp_hash = s->hash; + Entity *tmp_value = s->value; + + s->key = key; + s->hash = hash; + s->value = value; + + key = tmp_key; + hash = tmp_hash; + value = tmp_value; + dist = existing_dist; + } + + dist += 1; + pos = (pos+1) & mask; + } +} + +gb_internal Entity *scope_map_get(ScopeMap *m, String key, u32 hash) { + u32 mask = m->cap-1; + u32 pos = hash & mask; + u32 dist = 0; + for (;;) { + ScopeMapSlot *s = &m->slots[pos]; + if (s->hash == 0) { + return nullptr; + } + + u32 existing_dist = (pos - s->hash) & mask; + if (dist > existing_dist) { + return nullptr; + } + if (s->hash == hash && s->key == key) { + return s->value; + } + + dist += 1; + pos = (pos + 1) & mask; + } +} + +gb_internal void scope_map_clear(ScopeMap *m) { + gb_memset(m->slots, 0, gb_size_of(*m->slots) * m->cap); + m->count = 0; +} + +struct ScopeMapIterator { + ScopeMap const *map; + u32 index; + + ScopeMapIterator &operator++() noexcept { + for (;;) { + ++index; + if (map->cap == index) { + return *this; + } + ScopeMapSlot *s = map->slots+index; + if (s->hash) { + return *this; + } + } + } + + bool operator==(ScopeMapIterator const &other) const noexcept { + return this->map == other.map && this->index == other.index; + } + + operator ScopeMapSlot *() const { + return map->slots+index; + } +}; + + +gb_internal ScopeMapIterator end(ScopeMap &m) noexcept { + return ScopeMapIterator{&m, m.cap}; +} +gb_internal ScopeMapIterator const end(ScopeMap const &m) noexcept { + return ScopeMapIterator{&m, m.cap}; +} +gb_internal ScopeMapIterator begin(ScopeMap &m) noexcept { + if (m.count == 0) { + return end(m); + } + + u32 index = 0; + while (index < m.cap) { + if (m.slots[index].hash) { + break; + } + index++; + } + return ScopeMapIterator{&m, index}; +} +gb_internal ScopeMapIterator const begin(ScopeMap const &m) noexcept { + if (m.count == 0) { + return end(m); + } + + u32 index = 0; + while (index < m.cap) { + if (m.slots[index].hash) { + break; + } + index++; + } + return ScopeMapIterator{&m, index}; +} enum ScopeFlag : i32 { ScopeFlag_Pkg = 1<<1, @@ -281,7 +521,6 @@ enum ScopeFlag : i32 { ScopeFlag_ContextDefined = 1<<16, }; -enum { DEFAULT_SCOPE_CAPACITY = 32 }; struct Scope { Ast * node; @@ -292,7 +531,7 @@ struct Scope { i32 index; // within a procedure RwMutex mutex; - StringMap elements; + ScopeMap elements; PtrSet imported; DeclInfo *decl_info; @@ -625,7 +864,7 @@ gb_internal isize type_info_index (CheckerInfo *info, TypeInfoPair gb_internal Entity *entity_of_node(Ast *expr); -gb_internal Entity *scope_lookup_current(Scope *s, String const &name); +// gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash=0); gb_internal Entity *scope_lookup (Scope *s, String const &name, u32 hash=0); gb_internal void scope_lookup_parent (Scope *s, String const &name, Scope **scope_, Entity **entity_, u32 hash=0); gb_internal Entity *scope_insert (Scope *s, Entity *entity); diff --git a/src/entity.cpp b/src/entity.cpp index 1a01e0945..5fcd62071 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -344,17 +344,23 @@ gb_internal bool entity_has_deferred_procedure(Entity *e) { gb_global std::atomic global_entity_id; +// NOTE(bill): This exists to allow for bulk allocations of entities all at once to improve performance for type generation +#define INTERNAL_ENTITY_INIT(entity, kind_, scope_, token_, type_) do { \ + (entity)->kind = (kind_); \ + (entity)->state = EntityState_Unresolved; \ + (entity)->scope = (scope_); \ + (entity)->token = (token_); \ + (entity)->type = (type_); \ + (entity)->id = 1 + global_entity_id.fetch_add(1); \ + if ((token_).pos.file_id) { \ + entity->file = thread_unsafe_get_ast_file_from_id((token_).pos.file_id); \ + } \ +} while (0) + + gb_internal Entity *alloc_entity(EntityKind kind, Scope *scope, Token token, Type *type) { Entity *entity = permanent_alloc_item(); - entity->kind = kind; - entity->state = EntityState_Unresolved; - entity->scope = scope; - entity->token = token; - entity->type = type; - entity->id = 1 + global_entity_id.fetch_add(1); - if (token.pos.file_id) { - entity->file = thread_unsafe_get_ast_file_from_id(token.pos.file_id); - } + INTERNAL_ENTITY_INIT(entity, kind, scope, token, type); return entity; } @@ -411,11 +417,10 @@ gb_internal Entity *alloc_entity_const_param(Scope *scope, Token token, Type *ty gb_internal Entity *alloc_entity_field(Scope *scope, Token token, Type *type, bool is_using, i32 field_index, EntityState state = EntityState_Unresolved) { - Entity *entity = alloc_entity_variable(scope, token, type); + Entity *entity = alloc_entity_variable(scope, token, type, state); entity->Variable.field_index = field_index; if (is_using) entity->flags |= EntityFlag_Using; entity->flags |= EntityFlag_Field; - entity->state = state; return entity; } diff --git a/src/ptr_set.cpp b/src/ptr_set.cpp index 21151c0aa..1d8154be7 100644 --- a/src/ptr_set.cpp +++ b/src/ptr_set.cpp @@ -123,10 +123,11 @@ gb_internal bool ptr_set_update(PtrSet *s, T ptr) { // returns true if it pre usize hash_index = (cast(usize)hash) & mask; GB_ASSERT(hash_index < s->capacity); for (usize i = 0; i < s->capacity; i++) { - T *key = &s->keys[hash_index]; - GB_ASSERT(*key != ptr); - if (*key == (T)PtrSet::TOMBSTONE || *key == 0) { - *key = ptr; + T *key_ptr = &s->keys[hash_index]; + T key = *key_ptr; + GB_ASSERT(key != ptr); + if (key == (T)PtrSet::TOMBSTONE || key == 0) { + *key_ptr = ptr; s->count++; return false; } @@ -161,10 +162,11 @@ gb_internal bool ptr_set_update_with_mutex(PtrSet *s, T ptr, RWSpinLock *m) { usize hash_index = (cast(usize)hash) & mask; GB_ASSERT(hash_index < s->capacity); for (usize i = 0; i < s->capacity; i++) { - T *key = &s->keys[hash_index]; - GB_ASSERT(*key != ptr); - if (*key == (T)PtrSet::TOMBSTONE || *key == 0) { - *key = ptr; + T *key_ptr = &s->keys[hash_index]; + T key = *key_ptr; + GB_ASSERT(key != ptr); + if (key == (T)PtrSet::TOMBSTONE || key == 0) { + *key_ptr = ptr; s->count++; return false; } diff --git a/src/types.cpp b/src/types.cpp index 1ab759c9a..a431e470e 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3617,7 +3617,7 @@ gb_internal Selection lookup_field_from_index(Type *type, i64 index) { return empty_selection; } -gb_internal Entity *scope_lookup_current(Scope *s, String const &name); +gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash=0); gb_internal bool has_type_got_objc_class_attribute(Type *t); gb_internal Selection lookup_field_with_selection(Type *type_, String field_name, bool is_type, Selection sel, bool allow_blank_ident) { From cb7a87773bda811027149bb12a0b4025e4f7782c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 16 Mar 2026 18:04:25 +0000 Subject: [PATCH 170/273] Split keys and slots and allocate them both together --- src/check_stmt.cpp | 2 +- src/checker.hpp | 64 +++++++++++++++++++++++++++++---------------- src/docs_writer.cpp | 2 +- src/string.cpp | 5 ++-- 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 41ad7197b..bc7605e0d 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -789,7 +789,7 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, defer (rw_mutex_unlock(&scope->mutex)); for (auto const &entry : scope->elements) { - String name = entry.key; + String name = scope->elements.keys[entry.hash & (scope->elements.cap-1)]; u32 hash = entry.hash; Entity *decl = entry.value; if (!is_entity_exported(decl, true)) continue; diff --git a/src/checker.hpp b/src/checker.hpp index 9f4ee66d8..226a4ba6a 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -272,15 +272,16 @@ enum { DEFAULT_SCOPE_CAPACITY = 32 }; struct ScopeMapSlot { u32 hash; u32 _pad; - String key; Entity *value; }; enum { SCOPE_MAP_INLINE_CAP = 16 }; struct ScopeMap { - ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; + ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; + String inline_keys[SCOPE_MAP_INLINE_CAP]; ScopeMapSlot *slots; + String * keys; u32 count; u32 cap; }; @@ -292,11 +293,12 @@ gb_internal gb_inline u32 scope_map_max_load(u32 cap) { gb_internal gb_inline void scope_map_init(ScopeMap *m) { m->cap = SCOPE_MAP_INLINE_CAP; m->slots = m->inline_slots; + m->keys = m->inline_keys; } gb_internal Entity *scope_map_insert_for_rehash( - ScopeMapSlot *slots, u32 mask, + String *keys, ScopeMapSlot *slots, u32 mask, String key, u32 hash, Entity *value) { u32 pos = hash & mask; u32 dist = 0; @@ -305,22 +307,22 @@ gb_internal Entity *scope_map_insert_for_rehash( ScopeMapSlot *s = &slots[pos]; if (s->hash == 0) { - s->key = key; - s->hash = hash; - s->value = value; + keys[pos] = key; + s->hash = hash; + s->value = value; return nullptr; } u32 existing_dist = (pos - s->hash) & mask; if (dist > existing_dist) { - String tmp_key = s->key; + String tmp_key = keys[pos]; u32 tmp_hash = s->hash; Entity *tmp_value = s->value; - s->key = key; - s->hash = hash; - s->value = value; + keys[pos] = key; + s->hash = hash; + s->value = value; hash = tmp_hash; value = tmp_value; @@ -333,23 +335,38 @@ gb_internal Entity *scope_map_insert_for_rehash( } } +gb_internal gb_inline void scope_map_allocate_entries(u32 cap, String **keys, ScopeMapSlot **slots) { + Arena *arena = get_arena(ThreadArena_Permanent); + isize size = (gb_size_of(String) + gb_size_of(ScopeMapSlot)) * cap; + u8 *data = cast(u8 *)arena_alloc(arena, size, 8); + + *keys = cast(String *)data; + *slots = cast(ScopeMapSlot *)(*keys + cap); + + // *keys = permanent_alloc_array(cap); + // *slots = permanent_alloc_array(cap); +} + gb_internal void scope_map_grow(ScopeMap *m) { u32 new_cap = m->cap << 1; u32 new_mask = new_cap - 1; - ScopeMapSlot *new_slots = permanent_alloc_array(new_cap); + String * new_keys; + ScopeMapSlot *new_slots; + scope_map_allocate_entries(new_cap, &new_keys, &new_slots); if (m->count > 0) { for (u32 i = 0; i < m->cap; i++) { if (m->slots[i].hash) { - scope_map_insert_for_rehash(new_slots, new_mask, - m->slots[i].key, m->slots[i].hash, m->slots[i].value); + scope_map_insert_for_rehash(new_keys, new_slots, new_mask, + m->keys[i], m->slots[i].hash, m->slots[i].value); } } } m->slots = new_slots; + m->keys = new_keys; m->cap = new_cap; } @@ -359,7 +376,7 @@ gb_internal void scope_map_reserve(ScopeMap *m, isize capacity) { } u32 new_cap = next_pow2_u32(cast(u32)capacity); if (m->cap < new_cap && new_cap > SCOPE_MAP_INLINE_CAP) { - m->slots = permanent_alloc_array(new_cap); + scope_map_allocate_entries(new_cap, &m->keys, &m->slots); m->cap = new_cap; } } @@ -382,14 +399,14 @@ gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity * ScopeMapSlot *s = &m->slots[pos]; if (s->hash == 0) { - s->key = key; + m->keys[pos] = key; s->hash = hash; s->value = value; m->count += 1; return nullptr; } - if (s->hash == hash && s->key == key) { + if (s->hash == hash && m->keys[pos] == key) { Entity *old = s->value; s->value = value; return old; @@ -398,13 +415,13 @@ gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity * u32 existing_dist = (pos - s->hash) & mask; if (dist > existing_dist) { - String tmp_key = s->key; + String tmp_key = m->keys[pos]; u32 tmp_hash = s->hash; Entity *tmp_value = s->value; - s->key = key; - s->hash = hash; - s->value = value; + m->keys[pos] = key; + s->hash = hash; + s->value = value; key = tmp_key; hash = tmp_hash; @@ -423,15 +440,16 @@ gb_internal Entity *scope_map_get(ScopeMap *m, String key, u32 hash) { u32 dist = 0; for (;;) { ScopeMapSlot *s = &m->slots[pos]; - if (s->hash == 0) { + u32 curr_hash = s->hash; + if (curr_hash == 0) { return nullptr; } - u32 existing_dist = (pos - s->hash) & mask; + u32 existing_dist = (pos - curr_hash) & mask; if (dist > existing_dist) { return nullptr; } - if (s->hash == hash && s->key == key) { + if (curr_hash == hash && m->keys[pos] == key) { return s->value; } diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 5e9c25016..89b7802ae 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -1050,7 +1050,7 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit defer (array_free(&entries)); for (auto const &element : pkg->scope->elements) { - String name = element.key; + String name = pkg->scope->elements.keys[element.hash & (pkg->scope->elements.cap-1)]; Entity *e = element.value; switch (e->kind) { case Entity_Invalid: diff --git a/src/string.cpp b/src/string.cpp index c26457acf..09bce205e 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -182,8 +182,9 @@ gb_internal isize string_index_byte(String const &s, u8 x) { } gb_internal gb_inline bool str_eq(String const &a, String const &b) { - if (a.len != b.len) return false; - if (a.len == 0) return true; + if (a.len != b.len) return false; + if (a.len == 0) return true; + if (a.text == b.text) return true; return memcmp(a.text, b.text, a.len) == 0; } gb_internal gb_inline bool str_ne(String const &a, String const &b) { return !str_eq(a, b); } From 36a3f691c15c3bae16b23865c1bdd398b3d01ac5 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 16 Mar 2026 18:30:14 +0900 Subject: [PATCH 171/273] core/crypto/sha2: Add Aarch64 SHA512 acceleration --- core/crypto/sha2/sha2.odin | 30 +- core/crypto/sha2/sha512_impl_hw_arm.odin | 498 +++++++++++++++++++++++ core/crypto/sha2/sha512_impl_hw_gen.odin | 3 +- 3 files changed, 515 insertions(+), 16 deletions(-) create mode 100644 core/crypto/sha2/sha512_impl_hw_arm.odin diff --git a/core/crypto/sha2/sha2.odin b/core/crypto/sha2/sha2.odin index a878e1c2a..2eac9240b 100644 --- a/core/crypto/sha2/sha2.odin +++ b/core/crypto/sha2/sha2.odin @@ -276,7 +276,7 @@ reset :: proc(ctx: ^$T) { SHA2 implementation */ -@(private, rodata) +@(private = "file", rodata) SHA256_K := [64]u32 { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, @@ -296,7 +296,7 @@ SHA256_K := [64]u32 { 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, } -@(private, rodata) +@(private = "file", rodata) SHA512_K := [80]u64 { 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, @@ -345,67 +345,67 @@ SHA256_ROUNDS :: 64 @(private) SHA512_ROUNDS :: 80 -@(private) +@(private = "file") SHA256_CH :: #force_inline proc "contextless" (x, y, z: u32) -> u32 { return (x & y) ~ (~x & z) } -@(private) +@(private = "file") SHA256_MAJ :: #force_inline proc "contextless" (x, y, z: u32) -> u32 { return (x & y) ~ (x & z) ~ (y & z) } -@(private) +@(private = "file") SHA512_CH :: #force_inline proc "contextless" (x, y, z: u64) -> u64 { return (x & y) ~ (~x & z) } -@(private) +@(private = "file") SHA512_MAJ :: #force_inline proc "contextless" (x, y, z: u64) -> u64 { return (x & y) ~ (x & z) ~ (y & z) } -@(private) +@(private = "file") SHA256_F1 :: #force_inline proc "contextless" (x: u32) -> u32 { return bits.rotate_left32(x, 30) ~ bits.rotate_left32(x, 19) ~ bits.rotate_left32(x, 10) } -@(private) +@(private = "file") SHA256_F2 :: #force_inline proc "contextless" (x: u32) -> u32 { return bits.rotate_left32(x, 26) ~ bits.rotate_left32(x, 21) ~ bits.rotate_left32(x, 7) } -@(private) +@(private = "file") SHA256_F3 :: #force_inline proc "contextless" (x: u32) -> u32 { return bits.rotate_left32(x, 25) ~ bits.rotate_left32(x, 14) ~ (x >> 3) } -@(private) +@(private = "file") SHA256_F4 :: #force_inline proc "contextless" (x: u32) -> u32 { return bits.rotate_left32(x, 15) ~ bits.rotate_left32(x, 13) ~ (x >> 10) } -@(private) +@(private = "file") SHA512_F1 :: #force_inline proc "contextless" (x: u64) -> u64 { return bits.rotate_left64(x, 36) ~ bits.rotate_left64(x, 30) ~ bits.rotate_left64(x, 25) } -@(private) +@(private = "file") SHA512_F2 :: #force_inline proc "contextless" (x: u64) -> u64 { return bits.rotate_left64(x, 50) ~ bits.rotate_left64(x, 46) ~ bits.rotate_left64(x, 23) } -@(private) +@(private = "file") SHA512_F3 :: #force_inline proc "contextless" (x: u64) -> u64 { return bits.rotate_left64(x, 63) ~ bits.rotate_left64(x, 56) ~ (x >> 7) } -@(private) +@(private = "file") SHA512_F4 :: #force_inline proc "contextless" (x: u64) -> u64 { return bits.rotate_left64(x, 45) ~ bits.rotate_left64(x, 3) ~ (x >> 6) } -@(private) +@(private = "file") sha2_transf :: proc "contextless" (ctx: ^$T, data: []byte) #no_bounds_check { when T == Context_256 { if ctx.is_hw_accelerated { diff --git a/core/crypto/sha2/sha512_impl_hw_arm.odin b/core/crypto/sha2/sha512_impl_hw_arm.odin new file mode 100644 index 000000000..27ef83f5a --- /dev/null +++ b/core/crypto/sha2/sha512_impl_hw_arm.odin @@ -0,0 +1,498 @@ +// The round function's intrinsic calls are based on: +// https://github.com/LostInCompilation/HashMe/blob/main/src/SHA512_Hardware.cpp +// +// The zlib License +// +// Copyright (C) 2024 Marc Schöndorf +// +// This software is provided 'as-is', without any express or implied warranty. In +// no event will the authors be held liable for any damages arising from the use of +// this software. +// +// Permission is granted to anyone to use this software for any purpose, including +// commercial applications, and to alter it and redistribute it freely, subject to +// the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not claim +// that you wrote the original software. If you use this software in a product, +// an acknowledgment in the product documentation would be appreciated but is +// not required. +// +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. + +#+build arm64 +package sha2 + +import "base:intrinsics" +import "core:simd" +import "core:simd/arm" +import "core:sys/info" + +// is_hardware_accelerated_512 returns true if and only if (⟺) hardware +// accelerated SHA-384, SHA-512, and SHA-512/256 are supported. +is_hardware_accelerated_512 :: proc "contextless" () -> bool { + req_features :: info.CPU_Features{ + .asimd, + .sha512, + .sha3, // XXX: LLVM groups these under `sha3`. + } + return info.cpu_features() >= req_features +} + +@(private = "file") +K_0 :: simd.u64x2{0x428a2f98d728ae22, 0x7137449123ef65cd} +@(private = "file") +K_1 :: simd.u64x2{0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc} +@(private = "file") +K_2 :: simd.u64x2{0x3956c25bf348b538, 0x59f111f1b605d019} +@(private = "file") +K_3 :: simd.u64x2{0x923f82a4af194f9b, 0xab1c5ed5da6d8118} +@(private = "file") +K_4 :: simd.u64x2{0xd807aa98a3030242, 0x12835b0145706fbe} +@(private = "file") +K_5 :: simd.u64x2{0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2} +@(private = "file") +K_6 :: simd.u64x2{0x72be5d74f27b896f, 0x80deb1fe3b1696b1} +@(private = "file") +K_7 :: simd.u64x2{0x9bdc06a725c71235, 0xc19bf174cf692694} +@(private = "file") +K_8 :: simd.u64x2{0xe49b69c19ef14ad2, 0xefbe4786384f25e3} +@(private = "file") +K_9 :: simd.u64x2{0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65} +@(private = "file") +K_10 :: simd.u64x2{0x2de92c6f592b0275, 0x4a7484aa6ea6e483} +@(private = "file") +K_11 :: simd.u64x2{0x5cb0a9dcbd41fbd4, 0x76f988da831153b5} +@(private = "file") +K_12 :: simd.u64x2{0x983e5152ee66dfab, 0xa831c66d2db43210} +@(private = "file") +K_13 :: simd.u64x2{0xb00327c898fb213f, 0xbf597fc7beef0ee4} +@(private = "file") +K_14 :: simd.u64x2{0xc6e00bf33da88fc2, 0xd5a79147930aa725} +@(private = "file") +K_15 :: simd.u64x2{0x06ca6351e003826f, 0x142929670a0e6e70} +@(private = "file") +K_16 :: simd.u64x2{0x27b70a8546d22ffc, 0x2e1b21385c26c926} +@(private = "file") +K_17 :: simd.u64x2{0x4d2c6dfc5ac42aed, 0x53380d139d95b3df} +@(private = "file") +K_18 :: simd.u64x2{0x650a73548baf63de, 0x766a0abb3c77b2a8} +@(private = "file") +K_19 :: simd.u64x2{0x81c2c92e47edaee6, 0x92722c851482353b} +@(private = "file") +K_20 :: simd.u64x2{0xa2bfe8a14cf10364, 0xa81a664bbc423001} +@(private = "file") +K_21 :: simd.u64x2{0xc24b8b70d0f89791, 0xc76c51a30654be30} +@(private = "file") +K_22 :: simd.u64x2{0xd192e819d6ef5218, 0xd69906245565a910} +@(private = "file") +K_23 :: simd.u64x2{0xf40e35855771202a, 0x106aa07032bbd1b8} +@(private = "file") +K_24 :: simd.u64x2{0x19a4c116b8d2d0c8, 0x1e376c085141ab53} +@(private = "file") +K_25 :: simd.u64x2{0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8} +@(private = "file") +K_26 :: simd.u64x2{0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb} +@(private = "file") +K_27 :: simd.u64x2{0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3} +@(private = "file") +K_28 :: simd.u64x2{0x748f82ee5defb2fc, 0x78a5636f43172f60} +@(private = "file") +K_29 :: simd.u64x2{0x84c87814a1f0ab72, 0x8cc702081a6439ec} +@(private = "file") +K_30 :: simd.u64x2{0x90befffa23631e28, 0xa4506cebde82bde9} +@(private = "file") +K_31 :: simd.u64x2{0xbef9a3f7b2c67915, 0xc67178f2e372532b} +@(private = "file") +K_32 :: simd.u64x2{0xca273eceea26619c, 0xd186b8c721c0c207} +@(private = "file") +K_33 :: simd.u64x2{0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178} +@(private = "file") +K_34 :: simd.u64x2{0x06f067aa72176fba, 0x0a637dc5a2c898a6} +@(private = "file") +K_35 :: simd.u64x2{0x113f9804bef90dae, 0x1b710b35131c471b} +@(private = "file") +K_36 :: simd.u64x2{0x28db77f523047d84, 0x32caab7b40c72493} +@(private = "file") +K_37 :: simd.u64x2{0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c} +@(private = "file") +K_38 :: simd.u64x2{0x4cc5d4becb3e42b6, 0x597f299cfc657e2a} +@(private = "file") +K_39 :: simd.u64x2{0x5fcb6fab3ad6faec, 0x6c44198c4a475817} + +@(private, enable_target_feature = "neon,sha3") +sha512_transf_hw :: proc "contextless" (ctx: ^Context_512, data: []byte) #no_bounds_check { + state_0 := intrinsics.unaligned_load((^simd.u64x2)(&ctx.h[0])) + state_1 := intrinsics.unaligned_load((^simd.u64x2)(&ctx.h[2])) + state_2 := intrinsics.unaligned_load((^simd.u64x2)(&ctx.h[4])) + state_3 := intrinsics.unaligned_load((^simd.u64x2)(&ctx.h[6])) + + data := data + for len(data) >= BLOCK_SIZE_512 { + ab_save, cd_save, ef_save, gh_save := state_0, state_1, state_2, state_3 + + // Load message + msg_0 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data))) + msg_1 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[16:]))) + msg_2 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[32:]))) + msg_3 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[48:]))) + msg_4 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[64:]))) + msg_5 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[80:]))) + msg_6 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[96:]))) + msg_7 := intrinsics.unaligned_load((^simd.u64x2)(raw_data(data[112:]))) + + // Reverse for little endian + when ODIN_ENDIAN == .Little { + msg_0 = byteswap_u64x2(msg_0) + msg_1 = byteswap_u64x2(msg_1) + msg_2 = byteswap_u64x2(msg_2) + msg_3 = byteswap_u64x2(msg_3) + msg_4 = byteswap_u64x2(msg_4) + msg_5 = byteswap_u64x2(msg_5) + msg_6 = byteswap_u64x2(msg_6) + msg_7 = byteswap_u64x2(msg_7) + } + + // Rounds 0-1 + msg_k := simd.add(msg_0, K_0) + tmp_0 := simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 := arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_0 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_0, msg_1), msg_7, simd.shuffle(msg_4, msg_5, 1, 2)) + + // Rounds 2-3 + msg_k = simd.add(msg_1, K_1) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_1 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_1, msg_2), msg_0, simd.shuffle(msg_5, msg_6, 1, 2)) + + // Rounds 4-5 + msg_k = simd.add(msg_2, K_2) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_2 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_2, msg_3), msg_1, simd.shuffle(msg_6, msg_7, 1, 2)) + + // Rounds 6-7 + msg_k = simd.add(msg_3, K_3) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_3 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_3, msg_4), msg_2, simd.shuffle(msg_7, msg_0, 1, 2)) + + // Rounds 8-9 + msg_k = simd.add(msg_4, K_4) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_4 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_4, msg_5), msg_3, simd.shuffle(msg_0, msg_1, 1, 2)) + + // Rounds 10-11 + msg_k = simd.add(msg_5, K_5) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_5 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_5, msg_6), msg_4, simd.shuffle(msg_1, msg_2, 1, 2)) + + // Rounds 12-13 + msg_k = simd.add(msg_6, K_6) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_6 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_6, msg_7), msg_5, simd.shuffle(msg_2, msg_3, 1, 2)) + + // Rounds 14-15 + msg_k = simd.add(msg_7, K_7) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_7 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_7, msg_0), msg_6, simd.shuffle(msg_3, msg_4, 1, 2)) + + // Rounds 16-17 + msg_k = simd.add(msg_0, K_8) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_0 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_0, msg_1), msg_7, simd.shuffle(msg_4, msg_5, 1, 2)) + + // Rounds 18-19 + msg_k = simd.add(msg_1, K_9) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_1 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_1, msg_2), msg_0, simd.shuffle(msg_5, msg_6, 1, 2)) + + // Rounds 20-21 + msg_k = simd.add(msg_2, K_10) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_2 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_2, msg_3), msg_1, simd.shuffle(msg_6, msg_7, 1, 2)) + + // Rounds 22-23 + msg_k = simd.add(msg_3, K_11) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_3 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_3, msg_4), msg_2, simd.shuffle(msg_7, msg_0, 1, 2)) + + // Rounds 24-25 + msg_k = simd.add(msg_4, K_12) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_4 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_4, msg_5), msg_3, simd.shuffle(msg_0, msg_1, 1, 2)) + + // Rounds 26-27 + msg_k = simd.add(msg_5, K_13) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_5 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_5, msg_6), msg_4, simd.shuffle(msg_1, msg_2, 1, 2)) + + // Rounds 28-29 + msg_k = simd.add(msg_6, K_14) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_6 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_6, msg_7), msg_5, simd.shuffle(msg_2, msg_3, 1, 2)) + + // Rounds 30-31 + msg_k = simd.add(msg_7, K_15) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_7 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_7, msg_0), msg_6, simd.shuffle(msg_3, msg_4, 1, 2)) + + // Rounds 32-33 + msg_k = simd.add(msg_0, K_16) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_0 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_0, msg_1), msg_7, simd.shuffle(msg_4, msg_5, 1, 2)) + + // Rounds 34-35 + msg_k = simd.add(msg_1, K_17) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_1 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_1, msg_2), msg_0, simd.shuffle(msg_5, msg_6, 1, 2)) + + // Rounds 36-37 + msg_k = simd.add(msg_2, K_18) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_2 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_2, msg_3), msg_1, simd.shuffle(msg_6, msg_7, 1, 2)) + + // Rounds 38-39 + msg_k = simd.add(msg_3, K_19) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_3 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_3, msg_4), msg_2, simd.shuffle(msg_7, msg_0, 1, 2)) + + // Rounds 40-41 + msg_k = simd.add(msg_4, K_20) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_4 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_4, msg_5), msg_3, simd.shuffle(msg_0, msg_1, 1, 2)) + + // Rounds 42-43 + msg_k = simd.add(msg_5, K_21) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_5 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_5, msg_6), msg_4, simd.shuffle(msg_1, msg_2, 1, 2)) + + // Rounds 44-45 + msg_k = simd.add(msg_6, K_22) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_6 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_6, msg_7), msg_5, simd.shuffle(msg_2, msg_3, 1, 2)) + + // Rounds 46-47 + msg_k = simd.add(msg_7, K_23) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_7 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_7, msg_0), msg_6, simd.shuffle(msg_3, msg_4, 1, 2)) + + // Rounds 48-49 + msg_k = simd.add(msg_0, K_24) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_0 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_0, msg_1), msg_7, simd.shuffle(msg_4, msg_5, 1, 2)) + + // Rounds 50-51 + msg_k = simd.add(msg_1, K_25) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_1 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_1, msg_2), msg_0, simd.shuffle(msg_5, msg_6, 1, 2)) + + // Rounds 52-53 + msg_k = simd.add(msg_2, K_26) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_2 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_2, msg_3), msg_1, simd.shuffle(msg_6, msg_7, 1, 2)) + + // Rounds 54-55 + msg_k = simd.add(msg_3, K_27) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_3 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_3, msg_4), msg_2, simd.shuffle(msg_7, msg_0, 1, 2)) + + // Rounds 56-57 + msg_k = simd.add(msg_4, K_28) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + msg_4 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_4, msg_5), msg_3, simd.shuffle(msg_0, msg_1, 1, 2)) + + // Rounds 58-59 + msg_k = simd.add(msg_5, K_29) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + msg_5 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_5, msg_6), msg_4, simd.shuffle(msg_1, msg_2, 1, 2)) + + // Rounds 60-61 + msg_k = simd.add(msg_6, K_30) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + msg_6 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_6, msg_7), msg_5, simd.shuffle(msg_2, msg_3, 1, 2)) + + // Rounds 62-63 + msg_k = simd.add(msg_7, K_31) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + msg_7 = arm.vsha512su1q_u64(arm.vsha512su0q_u64(msg_7, msg_0), msg_6, simd.shuffle(msg_3, msg_4, 1, 2)) + + // Rounds 64-65 + msg_k = simd.add(msg_0, K_32) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + + // Rounds 66-67 + msg_k = simd.add(msg_1, K_33) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + + // Rounds 68-69 + msg_k = simd.add(msg_2, K_34) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + + // Rounds 70-71 + msg_k = simd.add(msg_3, K_35) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + + // Rounds 72-73 + msg_k = simd.add(msg_4, K_36) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_3) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_2, state_3, 1, 2), simd.shuffle(state_1, state_2, 1, 2)) + state_3 = arm.vsha512h2q_u64(tmp_1, state_1, state_0) + state_1 = simd.add(state_1, tmp_1) + + // Rounds 74-75 + msg_k = simd.add(msg_5, K_37) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_2) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_1, state_2, 1, 2), simd.shuffle(state_0, state_1, 1, 2)) + state_2 = arm.vsha512h2q_u64(tmp_1, state_0, state_3) + state_0 = simd.add(state_0, tmp_1) + + // Rounds 76-77 + msg_k = simd.add(msg_6, K_38) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_1) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_0, state_1, 1, 2), simd.shuffle(state_3, state_0, 1, 2)) + state_1 = arm.vsha512h2q_u64(tmp_1, state_3, state_2) + state_3 = simd.add(state_3, tmp_1) + + // Rounds 78-79 + msg_k = simd.add(msg_7, K_39) + tmp_0 = simd.add(simd.shuffle(msg_k, msg_k, 1, 2), state_0) + tmp_1 = arm.vsha512hq_u64(tmp_0, simd.shuffle(state_3, state_0, 1, 2), simd.shuffle(state_2, state_3, 1, 2)) + state_0 = arm.vsha512h2q_u64(tmp_1, state_2, state_1) + state_2 = simd.add(state_2, tmp_1) + + // Combine state + state_0 = simd.add(state_0, ab_save) + state_1 = simd.add(state_1, cd_save) + state_2 = simd.add(state_2, ef_save) + state_3 = simd.add(state_3, gh_save) + + data = data[BLOCK_SIZE_512:] + } + + intrinsics.unaligned_store((^simd.u64x2)(&ctx.h[0]), state_0) + intrinsics.unaligned_store((^simd.u64x2)(&ctx.h[2]), state_1) + intrinsics.unaligned_store((^simd.u64x2)(&ctx.h[4]), state_2) + intrinsics.unaligned_store((^simd.u64x2)(&ctx.h[6]), state_3) +} + +when ODIN_ENDIAN == .Little { + @(private = "file", enable_target_feature = "neon") + byteswap_u64x2 :: #force_inline proc "contextless" (a: simd.u64x2) -> simd.u64x2 { + return transmute(simd.u64x2)( + simd.shuffle( + transmute(simd.u8x16)(a), + transmute(simd.u8x16)(a), + 7, 6, 5, 4, 3, 2, 1, 0, + 15, 14, 13, 12, 11, 10, 9, 8, + ) + ) + } +} diff --git a/core/crypto/sha2/sha512_impl_hw_gen.odin b/core/crypto/sha2/sha512_impl_hw_gen.odin index 5fd518d80..701f82709 100644 --- a/core/crypto/sha2/sha512_impl_hw_gen.odin +++ b/core/crypto/sha2/sha512_impl_hw_gen.odin @@ -1,7 +1,8 @@ +#+build !arm64 package sha2 // is_hardware_accelerated_512 returns true if and only if (⟺) hardware -// accelerated SHA-384/SHA-512/SHA-512/256 are supported. +// accelerated SHA-384, SHA-512, and SHA-512/256 are supported. is_hardware_accelerated_512 :: proc "contextless" () -> bool { return false } From f7ede8632f59a6f3a2f34fbb81716a3b65ac759b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 08:10:13 +0000 Subject: [PATCH 172/273] Minor changes --- src/check_stmt.cpp | 4 ++-- src/checker.hpp | 4 ++-- src/types.cpp | 13 ++++++++++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index bc7605e0d..a690308cb 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -789,10 +789,10 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, defer (rw_mutex_unlock(&scope->mutex)); for (auto const &entry : scope->elements) { - String name = scope->elements.keys[entry.hash & (scope->elements.cap-1)]; - u32 hash = entry.hash; Entity *decl = entry.value; if (!is_entity_exported(decl, true)) continue; + String name = scope->elements.keys[entry.hash & (scope->elements.cap-1)]; + u32 hash = entry.hash; Entity *found = scope_insert_with_name(ctx->scope, name, hash, decl); if (found != nullptr) { diff --git a/src/checker.hpp b/src/checker.hpp index 226a4ba6a..ef68f9c74 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -278,10 +278,10 @@ struct ScopeMapSlot { enum { SCOPE_MAP_INLINE_CAP = 16 }; struct ScopeMap { + String inline_keys [SCOPE_MAP_INLINE_CAP]; ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; - String inline_keys[SCOPE_MAP_INLINE_CAP]; - ScopeMapSlot *slots; String * keys; + ScopeMapSlot *slots; u32 count; u32 cap; }; diff --git a/src/types.cpp b/src/types.cpp index a431e470e..f82e54802 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -978,7 +978,6 @@ gb_internal void set_base_type(Type *t, Type *base) { gb_internal Type *alloc_type(TypeKind kind) { - // gbAllocator a = heap_allocator(); Type *t = permanent_alloc_item(); t->kind = kind; t->cached_size = -1; @@ -1139,8 +1138,8 @@ gb_internal Type *alloc_type_union() { gb_internal Type *alloc_type_enum() { Type *t = alloc_type(Type_Enum); - t->Enum.min_value = gb_alloc_item(permanent_allocator(), ExactValue); - t->Enum.max_value = gb_alloc_item(permanent_allocator(), ExactValue); + t->Enum.min_value = permanent_alloc_item(); + t->Enum.max_value = permanent_alloc_item(); return t; } @@ -3049,6 +3048,10 @@ gb_internal bool are_types_identical_unique_tuples(Type *x, Type *y) { return false; } + if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { + return false; + } + // MUTEX_GUARD(&g_type_mutex); return are_types_identical_internal(x, y, true); } @@ -3063,6 +3066,10 @@ gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple return false; } + if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { + return false; + } + #if 0 if (x->kind == Type_Named) { Entity *e = x->Named.type_name; From 8f2fd4f8866e85118a72d3f70b9db17deca2abfd Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 08:21:13 +0000 Subject: [PATCH 173/273] Disable warning about padding when using `alignas` in C++ --- build.bat | 1 + 1 file changed, 1 insertion(+) diff --git a/build.bat b/build.bat index 32c2ae658..b6e8b890d 100644 --- a/build.bat +++ b/build.bat @@ -94,6 +94,7 @@ if %release_mode% EQU 0 ( rem Debug set compiler_warnings= ^ -W4 -WX ^ -wd4100 -wd4101 -wd4127 -wd4146 ^ + -wd4324 ^ -wd4505 ^ -wd4456 -wd4457 From a8c6ea7c8a1bc09e055daf71b49d7cedba23b7c0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 09:18:39 +0000 Subject: [PATCH 174/273] Implement a new `StringInterner` --- src/common.cpp | 43 +------- src/common_memory.cpp | 125 ++++++++++++++++++++--- src/main.cpp | 4 +- src/parser.cpp | 5 +- src/parser.hpp | 7 +- src/string_interner.cpp | 215 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 338 insertions(+), 61 deletions(-) create mode 100644 src/string_interner.cpp diff --git a/src/common.cpp b/src/common.cpp index d5fc1df4b..86ebb0fa8 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -366,6 +366,7 @@ gb_global bool global_module_path_set = false; #include "string_set.cpp" #include "priority_queue.cpp" #include "thread_pool.cpp" +#include "string_interner.cpp" gb_internal String obfuscate_string(String const &s, char const *prefix) { @@ -388,48 +389,6 @@ gb_internal i32 obfuscate_i32(i32 i) { } - -struct StringIntern { - StringIntern *next; - isize len; - char str[1]; -}; - -PtrMap string_intern_map = {}; // Key: u64 -gb_global Arena string_intern_arena = {}; - -gb_internal char const *string_intern(char const *text, isize len) { - u64 hash = gb_fnv64a(text, len); - uintptr key = cast(uintptr)(hash ? hash : 1); - StringIntern **found = map_get(&string_intern_map, key); - if (found) { - for (StringIntern *it = *found; it != nullptr; it = it->next) { - if (it->len == len && gb_strncmp(it->str, (char *)text, len) == 0) { - return it->str; - } - } - } - - StringIntern *new_intern = cast(StringIntern *)arena_alloc(&string_intern_arena, gb_offset_of(StringIntern, str) + len + 1, gb_align_of(StringIntern)); - new_intern->len = len; - new_intern->next = found ? *found : nullptr; - gb_memmove(new_intern->str, text, len); - new_intern->str[len] = 0; - map_set(&string_intern_map, key, new_intern); - return new_intern->str; -} - -gb_internal char const *string_intern(String const &string) { - return string_intern(cast(char const *)string.text, string.len); -} - -gb_internal void init_string_interner(void) { - map_init(&string_intern_map); -} - - - - gb_internal i32 next_pow2(i32 n) { if (n <= 0) { return 0; diff --git a/src/common_memory.cpp b/src/common_memory.cpp index addd43687..ba38720b3 100644 --- a/src/common_memory.cpp +++ b/src/common_memory.cpp @@ -40,6 +40,7 @@ struct MemoryBlock { u8 * base; isize size; isize used; + isize committed; }; struct Arena { @@ -48,13 +49,14 @@ struct Arena { // BlockingMutex mutex; isize temp_count; Thread * parent_thread; + bool custom_arena; }; enum { DEFAULT_MINIMUM_BLOCK_SIZE = 8ll*1024ll*1024ll }; gb_global isize DEFAULT_PAGE_SIZE = 4096; -gb_internal MemoryBlock *virtual_memory_alloc(isize size); +gb_internal MemoryBlock *virtual_memory_alloc(isize size, bool commit); gb_internal void virtual_memory_dealloc(MemoryBlock *block); gb_internal void *arena_alloc(Arena *arena, isize min_size, isize alignment); gb_internal void arena_free_all(Arena *arena); @@ -82,7 +84,7 @@ gb_internal void thread_init_arenas(Thread *t) { gb_internal void *arena_alloc(Arena *arena, isize min_size, isize alignment) { GB_ASSERT(gb_is_power_of_two(alignment)); - GB_ASSERT(arena->parent_thread == get_current_thread()); + GB_ASSERT(arena->custom_arena || arena->parent_thread == get_current_thread()); isize size = 0; if (arena->curr_block != nullptr) { @@ -95,7 +97,7 @@ gb_internal void *arena_alloc(Arena *arena, isize min_size, isize alignment) { isize block_size = gb_max(size, arena->minimum_block_size); - MemoryBlock *new_block = virtual_memory_alloc(block_size); + MemoryBlock *new_block = virtual_memory_alloc(block_size, true); new_block->prev = arena->curr_block; arena->curr_block = new_block; } @@ -113,6 +115,62 @@ gb_internal void *arena_alloc(Arena *arena, isize min_size, isize alignment) { return ptr; } +gb_internal void *platform_virtual_memory_alloc_internal(isize total_size, bool commit); +gb_internal bool platform_virtual_memory_commit_internal(void *data, isize commit_amount); + +struct StaticArena { + u8 * data; + isize used; + isize committed; + isize reserved; + isize commit_block_size; +}; + +enum {STATIC_ARENA_DEFAULT_COMMIT_BLOCK_SIZE = 8<<20}; + +gb_internal void static_arena_init(StaticArena *arena, isize reserve_size, isize commit_block_size) { + GB_ASSERT(gb_is_power_of_two(reserve_size)); + GB_ASSERT(gb_is_power_of_two(commit_block_size)); + GB_ASSERT(commit_block_size <= reserve_size); + arena->data = cast(u8 *)platform_virtual_memory_alloc_internal(reserve_size, false); + arena->reserved = reserve_size; + arena->commit_block_size = commit_block_size; +} + +gb_internal void static_arena_commit_memory(StaticArena *arena, isize amount) { + isize blocks = (amount + arena->commit_block_size-1)/arena->commit_block_size; + isize total_amount = blocks * arena->commit_block_size; + + if (total_amount > arena->reserved - arena->committed) { + total_amount = arena->reserved - arena->committed; + } + + platform_virtual_memory_commit_internal(arena->data + arena->committed, total_amount); + arena->committed += total_amount; +} + +gb_internal void *static_arena_alloc(StaticArena *arena, isize size, isize alignment) { + GB_ASSERT(gb_is_power_of_two(alignment)); + + size = align_formula_isize(size, alignment); + + u8 *curr = arena->data + arena->used; + curr = cast(u8 *)align_formula_ptr(curr, alignment); + + u8 *end = curr + size; + if (end-arena->data > arena->committed) { + isize needed = (end - arena->data) - arena->committed; + static_arena_commit_memory(arena, needed); + } + GB_ASSERT_MSG(end-arena->data <= arena->committed, "out of memory for the static arena"); + + arena->used = end - arena->data; + + return curr; +} + + + template gb_internal T *arena_alloc_item(Arena *arena) { @@ -138,10 +196,13 @@ struct PlatformMemoryBlock { gb_global std::atomic global_platform_memory_total_usage; gb_global PlatformMemoryBlock global_platform_memory_block_sentinel; -gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size); +gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size, bool commit); gb_internal void platform_virtual_memory_free(PlatformMemoryBlock *block); gb_internal void platform_virtual_memory_protect(void *memory, isize size); +gb_internal void *platform_virtual_memory_alloc_internal(isize total_size, bool commit); +gb_internal bool platform_virtual_memory_commit_internal(void *data, isize commit_amount); + #if defined(GB_SYSTEM_WINDOWS) gb_internal void platform_virtual_memory_init(void) { global_platform_memory_block_sentinel.prev = &global_platform_memory_block_sentinel; @@ -153,14 +214,20 @@ gb_internal void platform_virtual_memory_protect(void *memory, isize size); GB_ASSERT(gb_is_power_of_two(DEFAULT_PAGE_SIZE)); } - gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size) { - PlatformMemoryBlock *pmblock = (PlatformMemoryBlock *)VirtualAlloc(0, total_size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); - if (pmblock == nullptr) { + gb_internal void *platform_virtual_memory_alloc_internal(isize total_size, bool commit) { + DWORD flags = commit ? MEM_RESERVE|MEM_COMMIT : MEM_RESERVE; + void *mem = VirtualAlloc(0, total_size, flags, PAGE_READWRITE); + if (mem == nullptr) { gb_printf_err("Out of Virtual memory, oh no...\n"); gb_printf_err("Requested: %lld bytes\n", cast(long long)total_size); gb_printf_err("Total Usage: %lld bytes\n", cast(long long)global_platform_memory_total_usage); - GB_ASSERT_MSG(pmblock != nullptr, "Out of Virtual Memory, oh no..."); + GB_ASSERT_MSG(mem != nullptr, "Out of Virtual Memory, oh no..."); } + return mem; + } + + gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size, bool commit) { + PlatformMemoryBlock *pmblock = cast(PlatformMemoryBlock *)platform_virtual_memory_alloc_internal(total_size, commit); global_platform_memory_total_usage.fetch_add(total_size); return pmblock; } @@ -173,6 +240,16 @@ gb_internal void platform_virtual_memory_protect(void *memory, isize size); BOOL is_protected = VirtualProtect(memory, size, PAGE_NOACCESS, &old_protect); GB_ASSERT(is_protected); } + + gb_internal bool platform_virtual_memory_commit_internal(void *data, isize commit_amount) { + void *res = VirtualAlloc(data, commit_amount, MEM_COMMIT, PAGE_READWRITE); + if (res == nullptr) { + GB_PANIC("Out of Virtual Memory, oh no...\n"); + GB_ASSERT_MSG(res != nullptr, "Out of Virtual Memory, oh no..."); + return false; + } + return true; + } #else #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) #define MAP_ANONYMOUS MAP_ANON @@ -185,9 +262,20 @@ gb_internal void platform_virtual_memory_protect(void *memory, isize size); DEFAULT_PAGE_SIZE = gb_max(DEFAULT_PAGE_SIZE, cast(isize)sysconf(_SC_PAGE_SIZE)); GB_ASSERT(gb_is_power_of_two(DEFAULT_PAGE_SIZE)); } + + gb_internal void *platform_virtual_memory_alloc_internal(isize total_size, bool commit) { + void *mem = mmap(nullptr, total_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (mem == nullptr) { + gb_printf_err("Out of Virtual memory, oh no...\n"); + gb_printf_err("Requested: %lld bytes\n", cast(long long)total_size); + gb_printf_err("Total Usage: %lld bytes\n", cast(long long)global_platform_memory_total_usage); + GB_ASSERT_MSG(mem != nullptr, "Out of Virtual Memory, oh no..."); + } + return mem; + } - gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size) { - PlatformMemoryBlock *pmblock = (PlatformMemoryBlock *)mmap(nullptr, total_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc(isize total_size, bool commit) { + PlatformMemoryBlock *pmblock = cast(PlatformMemoryBlock *)platform_virtual_memory_alloc_internal(total_size, commit); if (pmblock == nullptr) { gb_printf_err("Out of Virtual memory, oh no...\n"); gb_printf_err("Requested: %lld bytes\n", cast(long long)total_size); @@ -197,6 +285,9 @@ gb_internal void platform_virtual_memory_protect(void *memory, isize size); global_platform_memory_total_usage.fetch_add(total_size); return pmblock; } + gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc_uncommited(isize total_size) { + return platform_virtual_memory_alloc(total_size); + } gb_internal void platform_virtual_memory_free(PlatformMemoryBlock *block) { isize size = block->total_size; global_platform_memory_total_usage.fetch_sub(size); @@ -206,9 +297,19 @@ gb_internal void platform_virtual_memory_protect(void *memory, isize size); int err = mprotect(memory, size, PROT_NONE); GB_ASSERT(err == 0); } + + gb_internal bool platform_virtual_memory_commit_internal(void *data, isize commit_amount) { + int err = mprotect(data, commit_amount, PROT_READ | PROT_WRITE) + if (err != 0) { + GB_PANIC("Out of Virtual Memory, oh no...\n"); + GB_ASSERT_MSG(err == 0, "Out of Virtual Memory, oh no..."); + return false; + } + return true; + } #endif -gb_internal MemoryBlock *virtual_memory_alloc(isize size) { +gb_internal MemoryBlock *virtual_memory_alloc(isize size, bool commit) { isize const page_size = DEFAULT_PAGE_SIZE; isize total_size = size + gb_size_of(PlatformMemoryBlock); @@ -224,7 +325,7 @@ gb_internal MemoryBlock *virtual_memory_alloc(isize size) { do_protection = true; } - PlatformMemoryBlock *pmblock = platform_virtual_memory_alloc(total_size); + PlatformMemoryBlock *pmblock = platform_virtual_memory_alloc(total_size, commit); GB_ASSERT_MSG(pmblock != nullptr, "Out of Virtual Memory, oh no..."); pmblock->block.base = cast(u8 *)pmblock + base_offset; diff --git a/src/main.cpp b/src/main.cpp index ee3f42660..1f0df6add 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1086,7 +1086,7 @@ gb_internal bool parse_build_flags(Array args) { break; } - char const *key = string_intern(name); + char const *key = string_intern_cstring(name); if (map_get(&build_context.defined_values, key) != nullptr) { gb_printf_err("Defined constant '%.*s' already exists\n", LIT(name)); @@ -3588,7 +3588,7 @@ int main(int arg_count, char const **arg_ptr) { MAIN_TIME_SECTION("initialization"); - init_string_interner(); + g_string_interner = string_interner_create(); init_global_error_collector(); init_keyword_hash_table(); init_terminal(); diff --git a/src/parser.cpp b/src/parser.cpp index f79287ceb..101167e45 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -773,8 +773,9 @@ gb_internal Ast *ast_matrix_index_expr(AstFile *f, Ast *expr, Token open, Token gb_internal Ast *ast_ident(AstFile *f, Token token) { Ast *result = alloc_ast_node(f, Ast_Ident); - result->Ident.token = token; - result->Ident.hash = string_hash(token.string); + result->Ident.token = token; + result->Ident.hash = string_hash(token.string); + result->Ident.interned = string_interner_insert(token.string); return result; } diff --git a/src/parser.hpp b/src/parser.hpp index c68b3614f..149cf6330 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -424,9 +424,10 @@ struct AstSplitArgs { #define AST_KINDS \ AST_KIND(Ident, "identifier", struct { \ - Token token; \ - std::atomic entity; \ - u32 hash; \ + Token token; \ + std::atomic entity; \ + u32 hash; \ + InternedString interned; \ }) \ AST_KIND(Implicit, "implicit", Token) \ AST_KIND(Uninit, "uninitialized value", Token) \ diff --git a/src/string_interner.cpp b/src/string_interner.cpp new file mode 100644 index 000000000..f8496e3b0 --- /dev/null +++ b/src/string_interner.cpp @@ -0,0 +1,215 @@ +#define STRING_INTERNER_CELL_WIDTH 8 +#define STRING_INTERNER_MUTEX_STRIPE_COUNT 1024 +#define STRING_INTERNER_MUTEX_STRIPE_MASK (STRING_INTERNER_MUTEX_STRIPE_COUNT - 1) +#define STRING_INTERNER_THREAD_LOCAL_SIZE (1024 * 1024 * 2) +#define STRING_INTERN_CACHE_LINE (2*GB_CACHE_LINE_SIZE) + +struct InternedString { + u32 value; + bool operator==(InternedString other) const { + return this->value == other.value; + } + + String load() const; + char const *load_cstring() const; +}; +struct alignas(STRING_INTERN_CACHE_LINE) StringInternCell { + std::atomic hashes [STRING_INTERNER_CELL_WIDTH]; + InternedString offsets[STRING_INTERNER_CELL_WIDTH]; + std::atomic next; +}; + +struct alignas(STRING_INTERN_CACHE_LINE) PaddedMutex { + BlockingMutex m; +}; + +struct alignas(STRING_INTERN_CACHE_LINE) PaddedI64 { + std::atomic value; +}; + +struct StringInterner { + StringInternCell *cells; + u64 cell_mask; + PaddedMutex mutexes[STRING_INTERNER_MUTEX_STRIPE_COUNT]; + StaticArena arena; + PaddedMutex arena_mutex; + bool track_count; + PaddedI64 count; +}; + +gb_internal StringInterner *string_interner_create(); +gb_internal InternedString string_interner_insert(String str, u32 hash=0); +gb_internal String string_interner_load(InternedString interned); + +gb_global StringInterner *g_string_interner; + +struct StringInternerThreadLocalArena { + u8 *data; + u64 cursor; +}; +gb_thread_local gb_global StringInternerThreadLocalArena g_interner_arena; + +gb_internal void string_interner_thread_local_arena_init(StringInternerThreadLocalArena *tl_arena); +gb_internal void *string_interner_thread_local_arena_alloc(StringInternerThreadLocalArena *tl_arena, isize size, isize alignment); + +gb_internal StringInterner *string_interner_create() { + StaticArena arena = {}; + static_arena_init(&arena, 1<<30, STATIC_ARENA_DEFAULT_COMMIT_BLOCK_SIZE); + + StringInterner *interner = cast(StringInterner *)static_arena_alloc(&arena, gb_size_of(StringInterner), STRING_INTERN_CACHE_LINE); + interner->arena = arena; + u64 cell_size = 1llu << 17llu; + u64 cell_mask = cell_size - 1; + interner->cell_mask = cell_mask; + interner->cells = cast(StringInternCell *)static_arena_alloc(&interner->arena, cell_size * gb_size_of(StringInternCell), STRING_INTERN_CACHE_LINE); + interner->track_count = false; + return interner; +} + +gb_internal String string_interner_load(InternedString interned) { + StringInterner* interner = g_string_interner; + if (interned.value == 0) { + return {}; + } + u8 *base = cast(u8 *)interner + interned.value; + u32 str_len = *cast(u32 *)base; + u8 *text = base + 4; + String str = { text, str_len }; + return str; +} + +gb_internal char const *string_interner_load_cstring(InternedString interned) { + StringInterner* interner = g_string_interner; + if (interned.value == 0) { + return ""; + } + u8 *base = cast(u8 *)interner + interned.value; + // u32 str_len = *cast(u32 *)base; + u8 *text = base + 4; + return cast(char const *)text; +} + +String InternedString::load() const { + return string_interner_load(*this); +} +char const *InternedString::load_cstring() const { + return string_interner_load_cstring(*this); +} + +gb_internal InternedString string_interner_insert(String str, u32 hash) { + StringInterner* interner = g_string_interner; + if (str.len == 0) { + return {}; + } + + if (hash == 0) { + hash = string_hash(str); + } + + u64 cell_idx = hash & interner->cell_mask; + StringInternCell *cell = &interner->cells[cell_idx]; + while (true) { + StringInternCell *next = cell->next.load(std::memory_order_acquire); + + for (i32 i = 0; i < STRING_INTERNER_CELL_WIDTH; i += 1) { + if (cell->hashes[i].load(std::memory_order_acquire) == hash) { + String to_compare = string_interner_load(cell->offsets[i]); + if (to_compare == str) { + return cell->offsets[i]; + } + } + } + if (next == nullptr) { + break; + } + cell = next; + } + + u64 mutex_cell = cell_idx & STRING_INTERNER_MUTEX_STRIPE_MASK; + PaddedMutex* m = &interner->mutexes[mutex_cell]; + MUTEX_GUARD(&m->m); + + StringInternCell *load_cell = nullptr; + while (cell) { + for (i32 i = 0; i < STRING_INTERNER_CELL_WIDTH; i += 1) { + if (cell->hashes[i].load(std::memory_order_relaxed) == hash) { + // string check + String to_compare = string_interner_load(cell->offsets[i]); + if (to_compare == str) { + return cell->offsets[i]; + } + } + } + load_cell = cell; + cell = cell->next.load(std::memory_order_relaxed); + } + + u64 data_to_allocate = 4 + str.len + 1; + u8 *data = cast(u8 *)string_interner_thread_local_arena_alloc(&g_interner_arena, data_to_allocate, 8); + u32 str_len = cast(u32)str.len; + gb_memcopy(data, &str_len, 4); + gb_memcopy(&data[4], str.text, str_len); + data[4+str_len] = 0; + InternedString offset = { cast(u32)(cast(u8 *)data - cast(u8 *)interner) }; + + for (i32 i = 0; i < STRING_INTERNER_CELL_WIDTH; i += 1) { + if (load_cell->hashes[i].load(std::memory_order_relaxed) == 0) { + load_cell->offsets[i] = offset; + load_cell->hashes[i].store(hash, std::memory_order_release); + if (interner->track_count) { + interner->count.value.fetch_add(1, std::memory_order_relaxed); + } + return offset; + } + } + + StringInternCell *new_cell = cast(StringInternCell *)string_interner_thread_local_arena_alloc(&g_interner_arena, gb_size_of(StringInternCell), STRING_INTERN_CACHE_LINE); + new_cell->offsets[0] = offset; + new_cell->hashes[0].store(hash, std::memory_order_relaxed); + load_cell->next.store(new_cell, std::memory_order_release); + + if (interner->track_count) { + interner->count.value.fetch_add(1, std::memory_order_relaxed); + } + + return offset; +} + +gb_internal char const *string_intern_cstring(String str) { + InternedString i = string_interner_insert(str, 0); + return string_interner_load_cstring(i); +} + + +gb_internal String string_intern_string(String str) { + InternedString i = string_interner_insert(str, 0); + return string_interner_load(i); +} + + + + +gb_internal void string_interner_thread_local_arena_init(StringInternerThreadLocalArena *tl_arena) { + *tl_arena = { + nullptr, + STRING_INTERNER_THREAD_LOCAL_SIZE, + }; +} + +gb_internal void *string_interner_thread_local_arena_alloc(StringInternerThreadLocalArena *tl_arena, isize size, isize alignment) { + if (tl_arena->data == nullptr) { + tl_arena->cursor = STRING_INTERNER_THREAD_LOCAL_SIZE; + } + isize new_head = align_formula_isize(tl_arena->cursor, alignment); + isize cursor = new_head + size; + if (cursor > STRING_INTERNER_THREAD_LOCAL_SIZE) { + mutex_lock(&g_string_interner->arena_mutex.m); + tl_arena->data = cast(u8 *)static_arena_alloc(&g_string_interner->arena, STRING_INTERNER_THREAD_LOCAL_SIZE, 4096); + tl_arena->cursor = 0; + mutex_unlock(&g_string_interner->arena_mutex.m); + return string_interner_thread_local_arena_alloc(tl_arena, size, alignment); + } + u8 *return_head = tl_arena->data + new_head; + tl_arena->cursor = cursor; + return return_head; +} \ No newline at end of file From 239b86c566bd63245faed9bcf90265b93850190c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 09:20:14 +0000 Subject: [PATCH 175/273] Fix typos --- src/common_memory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common_memory.cpp b/src/common_memory.cpp index ba38720b3..1590aac65 100644 --- a/src/common_memory.cpp +++ b/src/common_memory.cpp @@ -286,7 +286,7 @@ gb_internal bool platform_virtual_memory_commit_internal(void *data, isize comm return pmblock; } gb_internal PlatformMemoryBlock *platform_virtual_memory_alloc_uncommited(isize total_size) { - return platform_virtual_memory_alloc(total_size); + return platform_virtual_memory_alloc(total_size, false); } gb_internal void platform_virtual_memory_free(PlatformMemoryBlock *block) { isize size = block->total_size; @@ -299,7 +299,7 @@ gb_internal bool platform_virtual_memory_commit_internal(void *data, isize comm } gb_internal bool platform_virtual_memory_commit_internal(void *data, isize commit_amount) { - int err = mprotect(data, commit_amount, PROT_READ | PROT_WRITE) + int err = mprotect(data, commit_amount, PROT_READ | PROT_WRITE); if (err != 0) { GB_PANIC("Out of Virtual Memory, oh no...\n"); GB_ASSERT_MSG(err == 0, "Out of Virtual Memory, oh no..."); From d5a78a9cf15603ee8cc637113bcf14acc8bb0b47 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 09:43:16 +0000 Subject: [PATCH 176/273] Remove canonical hash shortcut --- src/parser.cpp | 2 ++ src/types.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 101167e45..584979064 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -792,6 +792,7 @@ gb_internal Ast *ast_uninit(AstFile *f, Token token) { gb_internal ExactValue exact_value_from_token(AstFile *f, Token const &token) { String s = token.string; + string_interner_insert(s); switch (token.kind) { case Token_Rune: if (!unquote_string(ast_allocator(f), &s, 0)) { @@ -848,6 +849,7 @@ gb_internal Ast *ast_basic_directive(AstFile *f, Token token, Token name) { Ast *result = alloc_ast_node(f, Ast_BasicDirective); result->BasicDirective.token = token; result->BasicDirective.name = name; + string_interner_insert(name.string); if (string_starts_with(name.string, str_lit("load"))) { f->seen_load_directive_count++; } diff --git a/src/types.cpp b/src/types.cpp index f82e54802..abe7b104c 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3048,9 +3048,9 @@ gb_internal bool are_types_identical_unique_tuples(Type *x, Type *y) { return false; } - if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { - return false; - } + // if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { + // return false; + // } // MUTEX_GUARD(&g_type_mutex); return are_types_identical_internal(x, y, true); @@ -3066,9 +3066,9 @@ gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple return false; } - if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { - return false; - } + // if (x->canonical_hash && y->canonical_hash && x->canonical_hash != y->canonical_hash) { + // return false; + // } #if 0 if (x->kind == Type_Named) { From 04cb889aedc3c96e0976202772c1ebccd9b3612d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 11:04:32 +0000 Subject: [PATCH 177/273] Begin interning `ScopeMap` strings --- src/check_builtin.cpp | 43 ++++++++-------- src/check_decl.cpp | 18 ++++--- src/check_expr.cpp | 42 ++++++++-------- src/check_stmt.cpp | 20 ++++---- src/check_type.cpp | 29 ++++++----- src/checker.cpp | 85 ++++++++++++++++--------------- src/checker.hpp | 38 +++++++------- src/docs_writer.cpp | 5 +- src/entity.cpp | 37 ++++++++++---- src/llvm_backend.cpp | 2 +- src/llvm_backend_const.cpp | 3 +- src/llvm_backend_expr.cpp | 22 ++++---- src/llvm_backend_general.cpp | 2 +- src/llvm_backend_proc.cpp | 2 +- src/main.cpp | 2 +- src/name_canonicalization.cpp | 4 +- src/string_interner.cpp | 40 ++++++++++----- src/types.cpp | 95 ++++++++++++++++++++--------------- 18 files changed, 277 insertions(+), 212 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index ea3ca8d3a..4b3e8807e 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -2413,13 +2413,14 @@ gb_internal bool check_builtin_procedure_directive(CheckerContext *c, Operand *o } String name = arg->Ident.token.string; + auto interned = arg->Ident.interned; operand->type = def.type; operand->mode = def.mode; operand->value = def.value; - Entity *found = scope_lookup_current(config_pkg->scope, name); + Entity *found = scope_lookup_current(config_pkg->scope, interned); if (found != nullptr) { if (found->kind != Entity_Constant) { error(arg, "'#config' entity '%.*s' found but expected a constant", LIT(name)); @@ -2804,7 +2805,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } GB_ASSERT(type != nullptr); - String field_name = {}; + InternedString field_name = {}; if (field_arg == nullptr) { error(call, "Expected an identifier for field argument"); @@ -2812,9 +2813,9 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } if (field_arg->kind == Ast_Ident) { - field_name = field_arg->Ident.token.string; + field_name = field_arg->Ident.interned; } - if (field_name.len == 0) { + if (field_name.value == 0) { error(field_arg, "Expected an identifier for field argument"); return false; } @@ -2847,19 +2848,19 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As ERROR_BLOCK(); gbString type_str = type_to_string_shorthand(type); error(ce->args[0], - "'%s' has no field named '%.*s'", type_str, LIT(field_name)); + "'%s' has no field named '%s'", type_str, field_name.cstring()); gb_string_free(type_str); Type *bt = base_type(type); if (bt->kind == Type_Struct) { - check_did_you_mean_type(field_name, bt->Struct.fields); + check_did_you_mean_type(field_name.string(), bt->Struct.fields); } return false; } if (sel.indirect) { gbString type_str = type_to_string_shorthand(type); error(ce->args[0], - "Field '%.*s' is embedded via a pointer in '%s'", LIT(field_name), type_str); + "Field '%s' is embedded via a pointer in '%s'", field_name.cstring(), type_str); gb_string_free(type_str); return false; } @@ -2891,7 +2892,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } GB_ASSERT(type != nullptr); - String field_name = {}; + InternedString field_name = {}; if (field_arg == nullptr) { error(call, "Expected a constant (not-empty) string for field argument"); @@ -2901,9 +2902,9 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As Operand x = {}; check_expr(c, &x, field_arg); if (x.mode == Addressing_Constant && x.value.kind == ExactValue_String) { - field_name = x.value.value_string; + field_name = string_interner_insert(x.value.value_string); } - if (field_name.len == 0) { + if (field_name.value == 0) { error(field_arg, "Expected a constant (non-empty) string for field argument"); return false; } @@ -2921,19 +2922,19 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As ERROR_BLOCK(); gbString type_str = type_to_string_shorthand(type); error(ce->args[0], - "'%s' has no field named '%.*s'", type_str, LIT(field_name)); + "'%s' has no field named '%s'", type_str, field_name.cstring()); gb_string_free(type_str); Type *bt = base_type(type); if (bt->kind == Type_Struct) { - check_did_you_mean_type(field_name, bt->Struct.fields); + check_did_you_mean_type(field_name.string(), bt->Struct.fields); } return false; } if (sel.indirect) { gbString type_str = type_to_string_shorthand(type); error(ce->args[0], - "Field '%.*s' is embedded via a pointer in '%s'", LIT(field_name), type_str); + "Field '%s' is embedded via a pointer in '%s'", field_name.string(), type_str); gb_string_free(type_str); return false; } @@ -4436,7 +4437,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } if (!fail && first_is_field_value) { for_array(i, names) { - Selection sel = lookup_field(et, names[i], false); + Selection sel = lookup_field(et, string_interner_insert(names[i]), false); if (sel.entity == nullptr) { goto soa_zip_end; } @@ -6785,7 +6786,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As return false; } - String field_name = x.value.value_string; + InternedString field_name = string_interner_insert(x.value.value_string); Selection sel = lookup_field(type, field_name, false); operand->mode = Addressing_Constant; @@ -6865,12 +6866,12 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As return false; } - String field_name = x.value.value_string; + InternedString field_name = string_interner_insert(x.value.value_string); Selection sel = lookup_field(type, field_name, false); if (sel.index.count == 0) { gbString t = type_to_string(type); - error(ce->args[1], "'%.*s' is not a field of type %s", LIT(field_name), t); + error(ce->args[1], "'%s' is not a field of type %s", field_name.cstring(), t); gb_string_free(t); return false; } @@ -7625,25 +7626,25 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As return false; } - String field_name = x.value.value_string; + InternedString field_name = string_interner_insert(x.value.value_string); Selection sel = lookup_field(type, field_name, false); if (sel.entity == nullptr) { ERROR_BLOCK(); gbString type_str = type_to_string(bt); error(ce->args[0], - "'%s' has no field named '%.*s'", type_str, LIT(field_name)); + "'%s' has no field named '%s'", type_str, field_name.cstring()); gb_string_free(type_str); if (bt->kind == Type_Struct) { - check_did_you_mean_type(field_name, bt->Struct.fields); + check_did_you_mean_type(field_name.string(), bt->Struct.fields); } return false; } if (sel.indirect) { gbString type_str = type_to_string(bt); error(ce->args[0], - "Field '%.*s' is embedded via a pointer in '%s'", LIT(field_name), type_str); + "Field '%s' is embedded via a pointer in '%s'", field_name.cstring(), type_str); gb_string_free(type_str); return false; } diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 9c849d1e2..4f224affa 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -156,9 +156,12 @@ gb_internal void override_entity_in_scope(Entity *original_entity, Entity *new_e // NOTE(bill): The original_entity's scope may not be same scope that it was inserted into // e.g. file entity inserted into its package scope String original_name = original_entity->token.string; + auto original_intern = entity_interned_name(original_entity); + u32 hash = original_entity->interned_name_hash.load(); + Scope *found_scope = nullptr; Entity *found_entity = nullptr; - scope_lookup_parent(original_entity->scope, original_name, &found_scope, &found_entity); + scope_lookup_parent(original_entity->scope, original_intern, &found_scope, &found_entity, hash); if (found_scope == nullptr) { return; } @@ -170,9 +173,8 @@ gb_internal void override_entity_in_scope(Entity *original_entity, Entity *new_e // Therefore two things can be done: the type can be assigned to state that it // has been "evaluated" and the variant data can be copied across - u32 hash = string_hash(original_name); rw_mutex_lock(&found_scope->mutex); - scope_map_insert(&found_scope->elements, original_name, hash, new_entity); + scope_map_insert(&found_scope->elements, original_intern, hash, new_entity); rw_mutex_unlock(&found_scope->mutex); original_entity->flags |= EntityFlag_Overridden; @@ -993,7 +995,7 @@ gb_internal Entity *init_entity_foreign_library(CheckerContext *ctx, Entity *e) error(ident, "foreign library names must be an identifier"); } else { String name = ident->Ident.token.string; - Entity *found = scope_lookup(ctx->scope, name, ident->Ident.hash); + Entity *found = scope_lookup(ctx->scope, ident->Ident.interned, ident->Ident.hash); if (found == nullptr) { if (is_blank_ident(name)) { @@ -1192,26 +1194,26 @@ gb_internal void check_objc_methods(CheckerContext *ctx, Entity *e, AttributeCon if (!ac.objc_is_class_method) { bool ok = true; for (TypeNameObjCMetadataEntry const &entry : md->value_entries) { - if (entry.name == ac.objc_name) { + if (entry.interned.string() == ac.objc_name) { error(e->token, "Previous declaration of @(objc_name=\"%.*s\")", LIT(ac.objc_name)); ok = false; break; } } if (ok) { - array_add(&md->value_entries, TypeNameObjCMetadataEntry{ac.objc_name, e}); + array_add(&md->value_entries, TypeNameObjCMetadataEntry{string_interner_insert(ac.objc_name), e}); } } else { bool ok = true; for (TypeNameObjCMetadataEntry const &entry : md->type_entries) { - if (entry.name == ac.objc_name) { + if (entry.interned.string() == ac.objc_name) { error(e->token, "Previous declaration of @(objc_name=\"%.*s\")", LIT(ac.objc_name)); ok = false; break; } } if (ok) { - array_add(&md->type_entries, TypeNameObjCMetadataEntry{ac.objc_name, e}); + array_add(&md->type_entries, TypeNameObjCMetadataEntry{string_interner_insert(ac.objc_name), e}); } } } diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 152031fa7..f02322430 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -183,11 +183,11 @@ gb_internal void populate_check_did_you_mean_objc_entity(StringSet *set, Entity if (is_type) { for (auto const &entry : objc_metadata->type_entries) { - string_set_add(set, entry.name); + string_set_add(set, entry.interned.string()); } } else { for (auto const &entry : objc_metadata->value_entries) { - string_set_add(set, entry.name); + string_set_add(set, entry.interned.string()); } } @@ -1329,7 +1329,7 @@ gb_internal bool polymorphic_assign_index(Type **gt_, i64 *dst_count, i64 source Type *gt = *gt_; GB_ASSERT(gt->kind == Type_Generic); - Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.name); + Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name); GB_ASSERT(e != nullptr); if (e->kind == Entity_TypeName) { *gt_ = nullptr; @@ -1430,7 +1430,7 @@ gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, T if (poly->Array.generic_count != nullptr) { Type *gt = poly->Array.generic_count; GB_ASSERT(gt->kind == Type_Generic); - Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.name); + Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name); GB_ASSERT(e != nullptr); if (e->kind == Entity_TypeName) { Type *index = source->EnumeratedArray.index; @@ -1770,9 +1770,9 @@ gb_internal Entity *check_ident(CheckerContext *c, Operand *o, Ast *n, Type *nam GB_ASSERT(n->kind == Ast_Ident); o->mode = Addressing_Invalid; o->expr = n; - String name = n->Ident.token.string; + auto name = n->Ident.token.string; - Entity *e = scope_lookup(c->scope, name, n->Ident.hash); + Entity *e = scope_lookup(c->scope, n->Ident.interned); if (e == nullptr) { if (is_blank_ident(name)) { error(n, "'_' cannot be used as a value"); @@ -5192,7 +5192,7 @@ gb_internal ExactValue get_constant_field_single(CheckerContext *c, ExactValue v continue; } ast_node(fv, FieldValue, elem); - String name = fv->field->Ident.token.string; + auto name = fv->field->Ident.interned; Selection sub_sel = lookup_field(node->tav.type, name, false); if (sub_sel.index.count > 0 && sub_sel.index[0] == index) { @@ -5459,7 +5459,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * } } else */if (node->kind == Ast_Ident) { String name = node->Ident.token.string; - return scope_lookup(c->scope, name, node->Ident.hash); + return scope_lookup(c->scope, node->Ident.interned); } else if (!ident_only) if (node->kind == Ast_SelectorExpr) { ast_node(se, SelectorExpr, node); if (se->token.kind == Token_ArrowRight) { @@ -5481,7 +5481,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * if (op_expr->kind == Ast_Ident) { String op_name = op_expr->Ident.token.string; - Entity *e = scope_lookup(c->scope, op_name, op_expr->Ident.hash); + Entity *e = scope_lookup(c->scope,op_expr->Ident.interned); if (e == nullptr) { return nullptr; } @@ -5494,7 +5494,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * // If you can clean this up, please do but be really careful String import_name = op_name; Scope *import_scope = e->ImportName.scope; - String entity_name = selector->Ident.token.string; + auto entity_name = selector->Ident.interned; check_op_expr = false; entity = scope_lookup_current(import_scope, entity_name); @@ -5520,7 +5520,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * } if (entity == nullptr && selector->kind == Ast_Ident) { - String field_name = selector->Ident.token.string; + auto field_name = selector->Ident.interned; if (is_type_dynamic_array(type_deref(operand.type))) { init_mem_allocator(c->checker); } @@ -5578,7 +5578,7 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod if (op_expr->kind == Ast_Ident) { String op_name = op_expr->Ident.token.string; - Entity *e = scope_lookup(c->scope, op_name, op_expr->Ident.hash); + Entity *e = scope_lookup(c->scope, op_expr->Ident.interned); add_entity_use(c, op_expr, e); expr_entity = e; @@ -5596,6 +5596,7 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod String import_name = op_name; Scope *import_scope = e->ImportName.scope; String entity_name = selector->Ident.token.string; + InternedString entity_name_interned = selector->Ident.interned; if (import_scope == nullptr) { ERROR_BLOCK(); @@ -5606,7 +5607,7 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod } check_op_expr = false; - entity = scope_lookup_current(import_scope, entity_name); + entity = scope_lookup_current(import_scope, entity_name_interned); bool allow_builtin = false; if (!is_entity_declared_for_selector(entity, import_scope, &allow_builtin)) { ERROR_BLOCK(); @@ -5654,7 +5655,7 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod } if (entity == nullptr && selector->kind == Ast_Ident) { - String field_name = selector->Ident.token.string; + auto field_name = selector->Ident.interned; Type *t = type_deref(operand->type); if (t == nullptr) { error(operand->expr, "Cannot use a selector expression on 0-value expression"); @@ -5993,15 +5994,14 @@ gb_internal bool is_type_valid_atomic_type(Type *elem) { gb_internal bool check_identifier_exists(Scope *s, Ast *node, bool nested = false, Scope **out_scope = nullptr) { switch (node->kind) { case_ast_node(i, Ident, node); - String name = i->token.string; if (nested) { - Entity *e = scope_lookup_current(s, name); + Entity *e = scope_lookup_current(s, i->interned, i->hash); if (e != nullptr) { if (out_scope) *out_scope = e->scope; return true; } } else { - Entity *e = scope_lookup(s, name, i->hash); + Entity *e = scope_lookup(s, i->interned); if (e != nullptr) { if (out_scope) *out_scope = e->scope; return true; @@ -8972,7 +8972,7 @@ gb_internal bool attempt_implicit_selector_expr(CheckerContext *c, Operand *o, A Type *enum_type = base_type(th); GB_ASSERT(enum_type->kind == Type_Enum); - String name = ise->selector->Ident.token.string; + auto name = ise->selector->Ident.interned; Entity *e = scope_lookup_current(enum_type->Enum.scope, name); if (e == nullptr) { @@ -9907,8 +9907,9 @@ gb_internal void check_compound_literal_field_values(CheckerContext *c, SliceIdent.token.string; + auto interned = ident->Ident.interned; - Selection sel = lookup_field(type, name, o->mode == Addressing_Type); + Selection sel = lookup_field(type, interned, o->mode == Addressing_Type); bool is_unknown = sel.entity == nullptr; if (is_unknown) { error(ident, "Unknown field '%.*s' in structure literal", LIT(name)); @@ -10863,8 +10864,9 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * continue; } String name = fv->field->Ident.token.string; + auto interned = fv->field->Ident.interned; - Selection sel = lookup_field(type, name, o->mode == Addressing_Type); + Selection sel = lookup_field(type, interned, o->mode == Addressing_Type); if (sel.entity == nullptr) { error(elem, "Unknown field '%.*s' in 'any' literal", LIT(name)); continue; diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index a690308cb..5775c3e53 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -484,7 +484,7 @@ gb_internal Type *check_assignment_variable(CheckerContext *ctx, Operand *lhs, O } if (ident_node != nullptr) { ast_node(i, Ident, ident_node); - e = scope_lookup(ctx->scope, i->token.string, i->hash); + e = scope_lookup(ctx->scope, i->interned, i->hash); if (e != nullptr && e->kind == Entity_Variable) { used = (e->flags & EntityFlag_Used) != 0; // NOTE(bill): Make backup just in case } @@ -791,10 +791,10 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, for (auto const &entry : scope->elements) { Entity *decl = entry.value; if (!is_entity_exported(decl, true)) continue; - String name = scope->elements.keys[entry.hash & (scope->elements.cap-1)]; u32 hash = entry.hash; + auto interned = scope->elements.keys[hash & (scope->elements.cap-1)]; - Entity *found = scope_insert_with_name(ctx->scope, name, hash, decl); + Entity *found = scope_insert_with_name(ctx->scope, interned, hash, decl); if (found != nullptr) { gbString expr_str = expr_to_string(expr); error(us->token, @@ -1067,7 +1067,7 @@ gb_internal void check_unroll_range_stmt(CheckerContext *ctx, Ast *node, u32 mod Entity *found = nullptr; if (!is_blank_ident(str)) { - found = scope_lookup_current(ctx->scope, str); + found = scope_lookup_current(ctx->scope, name->Ident.interned, name->Ident.hash); } if (found == nullptr) { entity = alloc_entity_variable(ctx->scope, token, type, EntityState_Resolved); @@ -1836,10 +1836,10 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) } if (rs->vals.count == 1 && rs->vals[0] && rs->vals[0]->kind == Ast_Ident) { AstIdent *ident = &rs->vals[0]->Ident; - String name = ident->token.string; - Entity *found = scope_lookup(ctx->scope, name, ident->hash); + Entity *found = scope_lookup(ctx->scope, ident->interned, ident->hash); if (found && are_types_identical(found->type, t->BitSet.elem)) { ERROR_BLOCK(); + String name = ident->token.string; gbString s = expr_to_string(expr); error(rs->vals[0], "'%.*s' shadows a previous declaration which might be ambiguous with 'for (%.*s in %s)'", LIT(name), LIT(name), s); error_line("\tSuggestion: Use a different identifier if iteration is wanted, or surround in parentheses if a normal for loop is wanted\n"); @@ -1888,10 +1888,10 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) } if (rs->vals.count == 1 && rs->vals[0] && rs->vals[0]->kind == Ast_Ident) { AstIdent *ident = &rs->vals[0]->Ident; - String name = ident->token.string; - Entity *found = scope_lookup(ctx->scope, name, ident->hash); + Entity *found = scope_lookup(ctx->scope, ident->interned, ident->hash); if (found && are_types_identical(found->type, t->Map.key)) { ERROR_BLOCK(); + String name = ident->token.string; gbString s = expr_to_string(expr); error(rs->vals[0], "'%.*s' shadows a previous declaration which might be ambiguous with 'for (%.*s in %s)'", LIT(name), LIT(name), s); error_line("\tSuggestion: Use a different identifier if iteration is wanted, or surround in parentheses if a normal for loop is wanted\n"); @@ -2032,7 +2032,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) Entity *found = nullptr; if (!is_blank_ident(str)) { - found = scope_lookup_current(ctx->scope, str); + found = scope_lookup_current(ctx->scope, name->Ident.interned, name->Ident.hash); } if (found == nullptr) { entity = alloc_entity_variable(ctx->scope, token, type, EntityState_Resolved); @@ -2126,7 +2126,7 @@ gb_internal void check_value_decl_stmt(CheckerContext *ctx, Ast *node, u32 mod_f Entity *found = nullptr; // NOTE(bill): Ignore assignments to '_' if (!is_blank_ident(str)) { - found = scope_lookup_current(ctx->scope, str); + found = scope_lookup_current(ctx->scope, name->Ident.interned, name->Ident.hash); new_name_count += 1; } if (found == nullptr) { diff --git a/src/check_type.cpp b/src/check_type.cpp index 9612fc4f6..bd86e7c3d 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -5,7 +5,9 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para gb_internal void populate_using_array_index(CheckerContext *ctx, Ast *node, AstField *field, Type *t, String name, i32 idx) { t = base_type(t); GB_ASSERT(t->kind == Type_Array); - Entity *e = scope_lookup_current(ctx->scope, name); + InternedString interned = string_interner_insert(name); + + Entity *e = scope_lookup_current(ctx->scope, interned); if (e != nullptr) { gbString str = nullptr; defer (gb_string_free(str)); @@ -47,7 +49,8 @@ gb_internal void populate_using_entity_scope(CheckerContext *ctx, Ast *node, Ast for (Entity *f : t->Struct.fields) { GB_ASSERT(f->kind == Entity_Variable); String name = f->token.string; - Entity *e = scope_lookup_current(ctx->scope, name); + InternedString interned = entity_interned_name(f); + Entity *e = scope_lookup_current(ctx->scope, interned); if (e != nullptr && name != "_") { gbString ot = type_to_string(original_type); // TODO(bill): Better type error @@ -423,7 +426,7 @@ gb_internal Type *check_record_polymorphic_params(CheckerContext *ctx, Ast *poly Ast *s = type_expr->TypeidType.specialization; specialization = check_type(ctx, s); } - type = alloc_type_generic(ctx->scope, 0, str_lit(""), specialization); + type = alloc_type_generic(ctx->scope, 0, string_interner_insert(str_lit("")), specialization); } else { type = check_type(ctx, type_expr); if (is_type_polymorphic(type)) { @@ -981,7 +984,9 @@ gb_internal void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *nam e->Constant.docs = docs; e->Constant.comment = comment; - if (scope_lookup_current(ctx->scope, name) != nullptr) { + auto interned = entity_interned_name(e); + + if (scope_lookup_current(ctx->scope, interned) != nullptr) { error(ident, "'%.*s' is already declared in this enumeration", LIT(name)); } else { add_entity(ctx, ctx->scope, nullptr, e); @@ -1043,6 +1048,7 @@ gb_internal void check_bit_field_type(CheckerContext *ctx, Type *bit_field_type, CommentGroup *comment = f->comment; String name = f->name->Ident.token.string; + InternedString interned = f->name->Ident.interned; if (f->type == nullptr) { error(field, "A bit_field's field must have a type"); @@ -1093,7 +1099,7 @@ gb_internal void check_bit_field_type(CheckerContext *ctx, Type *bit_field_type, gb_string_free(s); } - if (scope_lookup_current(ctx->scope, name) != nullptr) { + if (scope_lookup_current(ctx->scope, interned) != nullptr) { error(f->name, "'%.*s' is already declared in this bit_field", LIT(name)); } else { i64 bit_size_i64 = exact_value_to_i64(bit_size); @@ -1513,7 +1519,7 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { - Entity *e = scope_lookup(st->Generic.scope, st->Generic.name); + Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name); GB_ASSERT(e != nullptr); if (modify_type) { e->kind = Entity_Constant; @@ -1566,7 +1572,7 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { - Entity *e = scope_lookup(st->Generic.scope, st->Generic.name); + Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name); GB_ASSERT(e != nullptr); if (modify_type) { e->kind = Entity_Constant; @@ -1905,7 +1911,7 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para detemine_type_from_operand = true; type = t_invalid; } else { - type = alloc_type_generic(ctx->scope, 0, str_lit(""), specialization); + type = alloc_type_generic(ctx->scope, 0, string_interner_insert(str_lit("")), specialization); } } else { type = t_typeid; @@ -2330,8 +2336,7 @@ gb_internal bool ast_references_poly_params(Scope *scope, Ast *node) { } switch (node->kind) { case Ast_Ident: { - String name = node->Ident.token.string; - Entity *e = scope_lookup(scope, name); + Entity *e = scope_lookup(scope, node->Ident.interned, node->Ident.hash); if (e != nullptr && e->kind == Entity_TypeName && e->type != nullptr && e->type->kind == Type_Generic) { return true; } @@ -2408,7 +2413,7 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res param_value = handle_parameter_value(ctx, nullptr, &type, default_value, false); } else { if (ctx->allow_polymorphic_types && ast_references_poly_params(ctx->scope, field->type)) { - type = alloc_type_generic(ctx->scope, 0, str_lit("$deferred_return"), nullptr); + type = alloc_type_generic(ctx->scope, 0, string_interner_insert(str_lit("$deferred_return")), nullptr); } else { type = check_type(ctx, field->type); } @@ -3534,7 +3539,7 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T Ast *s = pt->specialization; specific = check_type(&c, s); } - Type *t = alloc_type_generic(ctx->scope, 0, token.string, specific); + Type *t = alloc_type_generic(ctx->scope, 0, ident->Ident.interned, specific); if (ctx->allow_polymorphic_types) { if (ctx->disallow_polymorphic_return_types) { error(ident, "Undeclared polymorphic parameter '%.*s' in return type", LIT(token.string)); diff --git a/src/checker.cpp b/src/checker.cpp index aca0e90a6..021b03dc9 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -372,10 +372,10 @@ gb_internal void check_close_scope(CheckerContext *c) { } -gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash) { +gb_internal Entity *scope_lookup_current(Scope *s, InternedString name, u32 hash) { // Entity **found = string_map_get(&s->elements, name); if (hash == 0) { - hash = string_hash(name); + hash = name.hash(); } Entity *found = scope_map_get(&s->elements, name, hash); if (found) { @@ -387,13 +387,13 @@ gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash) gb_global std::atomic in_single_threaded_checker_stage; -gb_internal void scope_lookup_parent(Scope *scope, String const &name, Scope **scope_, Entity **entity_, u32 hash) { +gb_internal void scope_lookup_parent(Scope *scope, InternedString name, Scope **scope_, Entity **entity_, u32 hash) { bool is_single_threaded = in_single_threaded_checker_stage.load(std::memory_order_relaxed); if (scope != nullptr) { bool gone_thru_proc = false; bool gone_thru_package = false; if (!hash) { - hash = string_hash(name); + hash = name.hash(); } for (Scope *s = scope; s != nullptr; s = s->parent) { Entity *found = nullptr; @@ -434,14 +434,14 @@ gb_internal void scope_lookup_parent(Scope *scope, String const &name, Scope **s if (scope_) *scope_ = nullptr; } -gb_internal Entity *scope_lookup(Scope *s, String const &name, u32 hash) { +gb_internal Entity *scope_lookup(Scope *s, InternedString interned, u32 hash) { Entity *entity = nullptr; - scope_lookup_parent(s, name, nullptr, &entity, hash); + scope_lookup_parent(s, interned, nullptr, &entity, hash); return entity; } -gb_internal Entity *scope_insert_with_name_no_mutex(Scope *s, String const &name, u32 hash, Entity *entity) { - if (name == "") { +gb_internal Entity *scope_insert_with_name_no_mutex(Scope *s, InternedString name, u32 hash, Entity *entity) { + if (name.value == 0) { return nullptr; } Entity *found = nullptr; @@ -476,8 +476,8 @@ end:; } -gb_internal Entity *scope_insert_with_name(Scope *s, String const &name, u32 hash, Entity *entity) { - if (name == "") { +gb_internal Entity *scope_insert_with_name(Scope *s, InternedString name, u32 hash, Entity *entity) { + if (name.value == 0) { return nullptr; } Entity *found = nullptr; @@ -519,15 +519,9 @@ end:; } gb_internal Entity *scope_insert(Scope *s, Entity *entity) { - String name = entity->token.string; - u32 hash = 0; - Ast *ident = entity->identifier.load(std::memory_order_relaxed); - if (ident != nullptr) { - hash = ident->Ident.hash; - } - if (hash == 0) { - hash = string_hash(name); - } + auto name = entity_interned_name(entity); + u32 hash = entity->interned_name_hash.load(std::memory_order_relaxed); + GB_ASSERT(hash != 0); if (in_single_threaded_checker_stage.load(std::memory_order_relaxed)) { return scope_insert_with_name_no_mutex(s, name, hash, entity); } else { @@ -536,15 +530,9 @@ gb_internal Entity *scope_insert(Scope *s, Entity *entity) { } gb_internal Entity *scope_insert_no_mutex(Scope *s, Entity *entity) { - String name = entity->token.string; - u32 hash = 0; - Ast *ident = entity->identifier.load(std::memory_order_relaxed); - if (ident != nullptr) { - hash = ident->Ident.hash; - } - if (hash == 0) { - hash = string_hash(name); - } + auto name = string_interner_insert(entity->token.string); + u32 hash = entity->interned_name_hash.load(std::memory_order_relaxed); + GB_ASSERT(hash != 0); return scope_insert_with_name_no_mutex(s, name, hash, entity); } @@ -679,7 +667,7 @@ gb_internal bool check_vet_shadowing(Checker *c, Entity *e, VettedEntity *ve) { return false; } - Entity *shadowed = scope_lookup(parent, name); + Entity *shadowed = scope_lookup(parent, entity_interned_name(e)); if (shadowed == nullptr) { return false; } @@ -961,8 +949,9 @@ gb_internal AstPackage *try_get_core_package(CheckerInfo *info, String name) { gb_internal void add_package_dependency(CheckerContext *c, char const *package_name, char const *name, bool required=false) { String n = make_string_c(name); + InternedString key = string_interner_insert(n); AstPackage *p = get_core_package(&c->checker->info, make_string_c(package_name)); - Entity *e = scope_lookup(p->scope, n); + Entity *e = scope_lookup(p->scope, key); GB_ASSERT_MSG(e != nullptr, "%s", name); GB_ASSERT(c->decl != nullptr); e->flags |= EntityFlag_Used; @@ -974,8 +963,9 @@ gb_internal void add_package_dependency(CheckerContext *c, char const *package_n gb_internal void try_to_add_package_dependency(CheckerContext *c, char const *package_name, char const *name) { String n = make_string_c(name); + InternedString key = string_interner_insert(n); AstPackage *p = get_core_package(&c->checker->info, make_string_c(package_name)); - Entity *e = scope_lookup(p->scope, n); + Entity *e = scope_lookup(p->scope, key); if (e == nullptr) { return; } @@ -1373,6 +1363,9 @@ gb_internal void init_universal(void) { BuiltinProcId id = cast(BuiltinProcId)i; String name = builtin_procs[i].name; if (name != "") { + u32 hash = 0; + InternedString interned = string_interner_insert(name, 0, &hash); + Entity *entity = alloc_entity(Entity_Builtin, nullptr, make_token_ident(name), t_invalid); entity->Builtin.id = id; switch (builtin_procs[i].pkg) { @@ -1381,7 +1374,7 @@ gb_internal void init_universal(void) { break; case BuiltinProcPkg_intrinsics: add_global_entity(entity, intrinsics_pkg->scope); - GB_ASSERT(scope_lookup_current(intrinsics_pkg->scope, name) != nullptr); + GB_ASSERT(scope_lookup_current(intrinsics_pkg->scope, interned, hash) != nullptr); break; } } @@ -2763,7 +2756,7 @@ gb_internal void add_dependency_to_set_threaded(Checker *c, Entity *entity) { gb_internal void force_add_dependency_entity(Checker *c, Scope *scope, String const &name) { - Entity *e = scope_lookup(scope, name); + Entity *e = scope_lookup(scope, string_interner_insert(name)); if (e == nullptr) { return; } @@ -2775,7 +2768,9 @@ gb_internal void force_add_dependency_entity(Checker *c, Scope *scope, String co gb_internal void collect_testing_procedures_of_package(Checker *c, AstPackage *pkg) { AstPackage *testing_package = get_core_package(&c->info, str_lit("testing")); Scope *testing_scope = testing_package->scope; - Entity *test_signature = scope_lookup_current(testing_scope, str_lit("Test_Signature")); + u32 hash = 0; + InternedString interned = string_interner_insert(str_lit("Test_Signature"), 0, &hash); + Entity *test_signature = scope_lookup_current(testing_scope, interned, hash); Scope *s = pkg->scope; for (auto const &entry : s->elements) { @@ -3229,7 +3224,9 @@ gb_internal void check_single_global_entity(Checker *c, Entity *e, DeclInfo *d); gb_internal Entity *find_core_entity(Checker *c, String name) { - Entity *e = scope_lookup_current(c->info.runtime_package->scope, name); + u32 hash = 0; + InternedString interned = string_interner_insert(name, 0, &hash); + Entity *e = scope_lookup_current(c->info.runtime_package->scope, interned, hash); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s'\n" , LIT(name)); @@ -3239,7 +3236,9 @@ gb_internal Entity *find_core_entity(Checker *c, String name) { } gb_internal Type *find_core_type(Checker *c, String name) { - Entity *e = scope_lookup_current(c->info.runtime_package->scope, name); + u32 hash = 0; + InternedString interned = string_interner_insert(name, 0, &hash); + Entity *e = scope_lookup_current(c->info.runtime_package->scope, interned, hash); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s'\n" , LIT(name)); @@ -3254,8 +3253,10 @@ gb_internal Type *find_core_type(Checker *c, String name) { gb_internal Entity *find_entity_in_pkg(CheckerInfo *info, String const &pkg, String const &name) { + u32 hash = 0; + InternedString interned = string_interner_insert(name, 0, &hash); AstPackage *package = get_core_package(info, pkg); - Entity *e = scope_lookup_current(package->scope, name); + Entity *e = scope_lookup_current(package->scope, interned, hash); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s.%.*s'\n", LIT(pkg), LIT(name)); // NOTE(bill): This will exit the program as it's cannot continue without it! @@ -3264,8 +3265,10 @@ gb_internal Entity *find_entity_in_pkg(CheckerInfo *info, String const &pkg, Str } gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String const &name) { + u32 hash = 0; + InternedString interned = string_interner_insert(name, 0, &hash); AstPackage *package = get_core_package(info, pkg); - Entity *e = scope_lookup_current(package->scope, name); + Entity *e = scope_lookup_current(package->scope, interned, hash); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s.%.*s'\n", LIT(pkg), LIT(name)); // NOTE(bill): This will exit the program as it's cannot continue without it! @@ -4558,7 +4561,9 @@ gb_internal void check_builtin_attributes(CheckerContext *ctx, Entity *e, Array< if (name == "builtin") { mutex_lock(&ctx->info->builtin_mutex); add_entity(ctx, builtin_pkg->scope, nullptr, e); - GB_ASSERT(scope_lookup(builtin_pkg->scope, e->token.string) != nullptr); + auto interned = entity_interned_name(e); + u32 hash = e->interned_name_hash.load(); + GB_ASSERT(scope_lookup(builtin_pkg->scope, interned, hash) != nullptr); if (value != nullptr) { error(value, "'builtin' cannot have a field value"); } @@ -7514,7 +7519,7 @@ gb_internal void check_parsed_files(Checker *c) { Scope *s = c->info.init_scope; GB_ASSERT(s != nullptr); GB_ASSERT(s->flags&ScopeFlag_Init); - Entity *e = scope_lookup_current(s, str_lit("main")); + Entity *e = scope_lookup_current(s, string_interner_insert(str_lit("main"))); if (e == nullptr) { Token token = {}; token.pos.file_id = 0; diff --git a/src/checker.hpp b/src/checker.hpp index ef68f9c74..335794535 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -278,12 +278,12 @@ struct ScopeMapSlot { enum { SCOPE_MAP_INLINE_CAP = 16 }; struct ScopeMap { - String inline_keys [SCOPE_MAP_INLINE_CAP]; - ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; - String * keys; - ScopeMapSlot *slots; - u32 count; - u32 cap; + InternedString inline_keys [SCOPE_MAP_INLINE_CAP]; + ScopeMapSlot inline_slots[SCOPE_MAP_INLINE_CAP]; + InternedString *keys; + ScopeMapSlot * slots; + u32 count; + u32 cap; }; gb_internal gb_inline u32 scope_map_max_load(u32 cap) { @@ -298,8 +298,8 @@ gb_internal gb_inline void scope_map_init(ScopeMap *m) { gb_internal Entity *scope_map_insert_for_rehash( - String *keys, ScopeMapSlot *slots, u32 mask, - String key, u32 hash, Entity *value) { + InternedString *keys, ScopeMapSlot *slots, u32 mask, + InternedString key, u32 hash, Entity *value) { u32 pos = hash & mask; u32 dist = 0; @@ -316,7 +316,7 @@ gb_internal Entity *scope_map_insert_for_rehash( u32 existing_dist = (pos - s->hash) & mask; if (dist > existing_dist) { - String tmp_key = keys[pos]; + auto tmp_key = keys[pos]; u32 tmp_hash = s->hash; Entity *tmp_value = s->value; @@ -335,12 +335,12 @@ gb_internal Entity *scope_map_insert_for_rehash( } } -gb_internal gb_inline void scope_map_allocate_entries(u32 cap, String **keys, ScopeMapSlot **slots) { +gb_internal gb_inline void scope_map_allocate_entries(u32 cap, InternedString **keys, ScopeMapSlot **slots) { Arena *arena = get_arena(ThreadArena_Permanent); - isize size = (gb_size_of(String) + gb_size_of(ScopeMapSlot)) * cap; + isize size = (gb_size_of(InternedString) + gb_size_of(ScopeMapSlot)) * cap; u8 *data = cast(u8 *)arena_alloc(arena, size, 8); - *keys = cast(String *)data; + *keys = cast(InternedString *)data; *slots = cast(ScopeMapSlot *)(*keys + cap); // *keys = permanent_alloc_array(cap); @@ -352,8 +352,8 @@ gb_internal void scope_map_grow(ScopeMap *m) { u32 new_cap = m->cap << 1; u32 new_mask = new_cap - 1; - String * new_keys; - ScopeMapSlot *new_slots; + InternedString *new_keys; + ScopeMapSlot * new_slots; scope_map_allocate_entries(new_cap, &new_keys, &new_slots); if (m->count > 0) { @@ -383,7 +383,7 @@ gb_internal void scope_map_reserve(ScopeMap *m, isize capacity) { -gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity *value) { +gb_internal Entity *scope_map_insert(ScopeMap *m, InternedString key, u32 hash, Entity *value) { if (m->slots == nullptr) { scope_map_init(m); } @@ -415,7 +415,7 @@ gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity * u32 existing_dist = (pos - s->hash) & mask; if (dist > existing_dist) { - String tmp_key = m->keys[pos]; + auto tmp_key = m->keys[pos]; u32 tmp_hash = s->hash; Entity *tmp_value = s->value; @@ -434,7 +434,7 @@ gb_internal Entity *scope_map_insert(ScopeMap *m, String key, u32 hash, Entity * } } -gb_internal Entity *scope_map_get(ScopeMap *m, String key, u32 hash) { +gb_internal Entity *scope_map_get(ScopeMap *m, InternedString key, u32 hash) { u32 mask = m->cap-1; u32 pos = hash & mask; u32 dist = 0; @@ -883,8 +883,8 @@ gb_internal Entity *entity_of_node(Ast *expr); // gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash=0); -gb_internal Entity *scope_lookup (Scope *s, String const &name, u32 hash=0); -gb_internal void scope_lookup_parent (Scope *s, String const &name, Scope **scope_, Entity **entity_, u32 hash=0); +gb_internal Entity *scope_lookup (Scope *s, InternedString interned, u32 hash=0); +gb_internal void scope_lookup_parent (Scope *s, InternedString name, Scope **scope_, Entity **entity_, u32 hash=0); gb_internal Entity *scope_insert (Scope *s, Entity *entity); diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 89b7802ae..3f5d4876a 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -1050,7 +1050,8 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit defer (array_free(&entries)); for (auto const &element : pkg->scope->elements) { - String name = pkg->scope->elements.keys[element.hash & (pkg->scope->elements.cap-1)]; + u32 hash = element.hash; + auto interned = pkg->scope->elements.keys[hash & (pkg->scope->elements.cap-1)]; Entity *e = element.value; switch (e->kind) { case Entity_Invalid: @@ -1079,7 +1080,7 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit } OdinDocScopeEntry entry = {}; - entry.name = odin_doc_write_string(w, name); + entry.name = odin_doc_write_string(w, interned.string()); entry.entity = odin_doc_add_entity(w, e); array_add(&entries, entry); } diff --git a/src/entity.cpp b/src/entity.cpp index 5fcd62071..2f0046972 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -141,7 +141,7 @@ enum ProcedureOptimizationMode : u8 { BlockingMutex global_type_name_objc_metadata_mutex; struct TypeNameObjCMetadataEntry { - String name; + InternedString interned; Entity *entity; }; struct TypeNameObjCMetadata { @@ -169,6 +169,10 @@ struct Entity { Scope * scope; Type * type; std::atomic identifier; // Can be nullptr + + std::atomic interned_name; + std::atomic interned_name_hash; + DeclInfo * decl_info; std::atomic parent_proc_decl; // nullptr if in file/global scope AstFile * file; @@ -300,6 +304,16 @@ struct Entity { }; }; +gb_internal InternedString entity_interned_name(Entity *entity) { + auto name = entity->interned_name.load(); + if (name.value == 0) { + name = string_interner_insert(entity->token.string); + entity->interned_name.store(name); + entity->interned_name_hash.store(name.hash()); + } + return name; +} + gb_internal bool is_entity_kind_exported(EntityKind kind, bool allow_builtin = false) { switch (kind) { case Entity_Builtin: @@ -345,16 +359,17 @@ gb_internal bool entity_has_deferred_procedure(Entity *e) { gb_global std::atomic global_entity_id; // NOTE(bill): This exists to allow for bulk allocations of entities all at once to improve performance for type generation -#define INTERNAL_ENTITY_INIT(entity, kind_, scope_, token_, type_) do { \ - (entity)->kind = (kind_); \ - (entity)->state = EntityState_Unresolved; \ - (entity)->scope = (scope_); \ - (entity)->token = (token_); \ - (entity)->type = (type_); \ - (entity)->id = 1 + global_entity_id.fetch_add(1); \ - if ((token_).pos.file_id) { \ - entity->file = thread_unsafe_get_ast_file_from_id((token_).pos.file_id); \ - } \ +#define INTERNAL_ENTITY_INIT(e_, kind_, scope_, token_, type_) do { \ + (e_)->kind = (kind_); \ + (e_)->state = EntityState_Unresolved; \ + (e_)->scope = (scope_); \ + (e_)->token = (token_); \ + (e_)->type = (type_); \ + (e_)->id = 1 + global_entity_id.fetch_add(1); \ + if ((token_).pos.file_id) { \ + e_->file = thread_unsafe_get_ast_file_from_id((token_).pos.file_id); \ + } \ + entity_interned_name(e_); \ } while (0) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index fac3e3354..b2246c90e 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2946,7 +2946,7 @@ gb_internal lbProcedure *lb_create_main_procedure(lbModule *m, lbProcedure *star AstPackage *pkg = get_runtime_package(m->info); String name = str_lit("exit"); - Entity *e = scope_lookup_current(pkg->scope, name); + Entity *e = scope_lookup_current(pkg->scope, string_interner_insert(name)); if (e == nullptr) { compiler_error("Could not find type declaration for '%.*s.%.*s'\n", LIT(pkg->name), LIT(name)); } diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 954545db6..762243ee3 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -1819,11 +1819,12 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb for (isize i = 0; i < elem_count; i++) { ast_node(fv, FieldValue, cl->elems[i]); String name = fv->field->Ident.token.string; + InternedString interned = fv->field->Ident.interned; TypeAndValue tav = fv->value->tav; GB_ASSERT(tav.mode != Addressing_Invalid); - Selection sel = lookup_field(type, name, false); + Selection sel = lookup_field(type, interned, false); GB_ASSERT(!sel.indirect); Entity *f = type->Struct.fields[sel.index[0]]; diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index c71409a8e..39cdcd54f 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -4362,9 +4362,9 @@ gb_internal lbAddr lb_get_soa_variable_addr(lbProcedure *p, Entity *e) { } gb_internal lbValue lb_get_using_variable(lbProcedure *p, Entity *e) { GB_ASSERT(e->kind == Entity_Variable && e->flags & EntityFlag_Using); - String name = e->token.string; + InternedString interned = entity_interned_name(e); Entity *parent = e->using_parent; - Selection sel = lookup_field(parent->type, name, false); + Selection sel = lookup_field(parent->type, interned, false); GB_ASSERT(sel.entity != nullptr); lbValue *pv = map_get(&p->module->values, parent); @@ -4379,7 +4379,7 @@ gb_internal lbValue lb_get_using_variable(lbProcedure *p, Entity *e) { } else if (pv != nullptr) { v = *pv; } else { - GB_ASSERT_MSG(e->using_expr != nullptr, "%.*s", LIT(name)); + GB_ASSERT_MSG(e->using_expr != nullptr, "%.*s", LIT(e->token.string)); v = lb_build_addr_ptr(p, e->using_expr); } GB_ASSERT(v.value != nullptr); @@ -5362,8 +5362,8 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { for (Ast *elem : cl->elems) { ast_node(fv, FieldValue, elem); - String name = fv->field->Ident.token.string; - Selection sel = lookup_field(bt, name, false); + InternedString interned = fv->field->Ident.interned; + Selection sel = lookup_field(bt, interned, false); GB_ASSERT(sel.is_bit_field); GB_ASSERT(!sel.indirect); GB_ASSERT(sel.index.count == 1); @@ -5556,8 +5556,8 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { if (elem->kind == Ast_FieldValue) { ast_node(fv, FieldValue, elem); - String name = fv->field->Ident.token.string; - Selection sel = lookup_field(bt, name, false); + InternedString interned = fv->field->Ident.interned; + Selection sel = lookup_field(bt, interned, false); GB_ASSERT(!sel.indirect); elem = fv->value; @@ -5811,12 +5811,12 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) { if (elem->kind == Ast_FieldValue) { ast_node(fv, FieldValue, elem); - Selection sel = lookup_field(bt, fv->field->Ident.token.string, false); + Selection sel = lookup_field(bt, fv->field->Ident.interned, false); index = sel.index[0]; elem = fv->value; } else { TypeAndValue tav = type_and_value_of_expr(elem); - Selection sel = lookup_field(bt, field_names[field_index], false); + Selection sel = lookup_field(bt, string_interner_insert(field_names[field_index]), false); index = sel.index[0]; } @@ -5958,7 +5958,7 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { case_ast_node(se, SelectorExpr, expr); Ast *sel_node = unparen_expr(se->selector); if (sel_node->kind == Ast_Ident) { - String selector = sel_node->Ident.token.string; + InternedString selector = sel_node->Ident.interned; TypeAndValue tav = type_and_value_of_expr(se->expr); if (tav.mode == Addressing_Invalid) { @@ -5978,7 +5978,7 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { GB_ASSERT(e->kind == Entity_Procedure); return lb_addr(lb_find_value_from_entity(p->module, e)); } - GB_PANIC("Unreachable %.*s", LIT(selector)); + GB_PANIC("Unreachable %s", selector.cstring()); } if (se->swizzle_count > 0) { diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 35a0f5f65..b15eb8333 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -3406,7 +3406,7 @@ gb_internal lbAddr lb_add_global_generated_from_procedure(lbProcedure *p, Type * gb_internal lbValue lb_find_runtime_value(lbModule *m, String const &name) { AstPackage *p = m->info->runtime_package; - Entity *e = scope_lookup_current(p->scope, name); + Entity *e = scope_lookup_current(p->scope, string_interner_insert(name)); return lb_find_value_from_entity(m, e); } gb_internal lbValue lb_find_package_value(lbModule *m, String const &pkg, String const &name) { diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 121b8c550..36d736b0f 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1012,7 +1012,7 @@ gb_internal lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue gb_internal lbValue lb_lookup_runtime_procedure(lbModule *m, String const &name) { AstPackage *pkg = m->info->runtime_package; - Entity *e = scope_lookup_current(pkg->scope, name); + Entity *e = scope_lookup_current(pkg->scope, string_interner_insert(name)); GB_ASSERT_MSG(e != nullptr, "Runtime procedure not found: %s", name); return lb_find_procedure_value_from_entity(m, e); } diff --git a/src/main.cpp b/src/main.cpp index 1f0df6add..4d68d3d73 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3588,7 +3588,7 @@ int main(int arg_count, char const **arg_ptr) { MAIN_TIME_SECTION("initialization"); - g_string_interner = string_interner_create(); + init_string_interner(); init_global_error_collector(); init_keyword_hash_table(); init_terminal(); diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index a99dec0af..1a4ca6439 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -559,6 +559,8 @@ gb_internal void write_canonical_parent_prefix(TypeWriter *w, Entity *e) { // no prefix return; } + InternedString interned = entity_interned_name(e); + if (e->parent_proc_decl.load(std::memory_order_relaxed)) { Entity *p = e->parent_proc_decl.load(std::memory_order_relaxed)->entity; write_canonical_parent_prefix(w, p); @@ -569,7 +571,7 @@ gb_internal void write_canonical_parent_prefix(TypeWriter *w, Entity *e) { } type_writer_appendc(w, CANONICAL_NAME_SEPARATOR); - } else if (e->pkg && (scope_lookup_current(e->pkg->scope, e->token.string) == e)) { + } else if (e->pkg && (scope_lookup_current(e->pkg->scope, interned) == e)) { type_writer_append(w, e->pkg->name.text, e->pkg->name.len); if (e->pkg->name == "llvm") { type_writer_appendc(w, "$"); diff --git a/src/string_interner.cpp b/src/string_interner.cpp index f8496e3b0..660dbc61d 100644 --- a/src/string_interner.cpp +++ b/src/string_interner.cpp @@ -10,8 +10,11 @@ struct InternedString { return this->value == other.value; } - String load() const; - char const *load_cstring() const; + String string() const; + char const *cstring() const; + u32 hash() const; + + bool is_blank() const; }; struct alignas(STRING_INTERN_CACHE_LINE) StringInternCell { std::atomic hashes [STRING_INTERNER_CELL_WIDTH]; @@ -38,10 +41,11 @@ struct StringInterner { }; gb_internal StringInterner *string_interner_create(); -gb_internal InternedString string_interner_insert(String str, u32 hash=0); +gb_internal InternedString string_interner_insert(String str, u32 hash=0, u32 *new_hash_=nullptr); gb_internal String string_interner_load(InternedString interned); gb_global StringInterner *g_string_interner; +gb_global InternedString g_interned_blank_ident; struct StringInternerThreadLocalArena { u8 *data; @@ -52,7 +56,7 @@ gb_thread_local gb_global StringInternerThreadLocalArena g_interner_arena; gb_internal void string_interner_thread_local_arena_init(StringInternerThreadLocalArena *tl_arena); gb_internal void *string_interner_thread_local_arena_alloc(StringInternerThreadLocalArena *tl_arena, isize size, isize alignment); -gb_internal StringInterner *string_interner_create() { +gb_internal void init_string_interner() { StaticArena arena = {}; static_arena_init(&arena, 1<<30, STATIC_ARENA_DEFAULT_COMMIT_BLOCK_SIZE); @@ -63,7 +67,10 @@ gb_internal StringInterner *string_interner_create() { interner->cell_mask = cell_mask; interner->cells = cast(StringInternCell *)static_arena_alloc(&interner->arena, cell_size * gb_size_of(StringInternCell), STRING_INTERN_CACHE_LINE); interner->track_count = false; - return interner; + + g_string_interner = interner; + + g_interned_blank_ident = string_interner_insert(str_lit("_")); } gb_internal String string_interner_load(InternedString interned) { @@ -89,22 +96,31 @@ gb_internal char const *string_interner_load_cstring(InternedString interned) { return cast(char const *)text; } -String InternedString::load() const { +String InternedString::string() const { return string_interner_load(*this); } -char const *InternedString::load_cstring() const { +char const *InternedString::cstring() const { return string_interner_load_cstring(*this); } +u32 InternedString::hash() const { + String s = string_interner_load(*this); + return string_hash(s); +} +bool InternedString::is_blank() const { + return this->value == g_interned_blank_ident.value; +} -gb_internal InternedString string_interner_insert(String str, u32 hash) { +gb_internal InternedString string_interner_insert(String str, u32 hash, u32 *new_hash_) { StringInterner* interner = g_string_interner; if (str.len == 0) { + if (new_hash_) *new_hash_ = string_hash(String{}); return {}; } if (hash == 0) { hash = string_hash(str); } + if (new_hash_) *new_hash_ = hash; u64 cell_idx = hash & interner->cell_mask; StringInternCell *cell = &interner->cells[cell_idx]; @@ -175,14 +191,14 @@ gb_internal InternedString string_interner_insert(String str, u32 hash) { return offset; } -gb_internal char const *string_intern_cstring(String str) { - InternedString i = string_interner_insert(str, 0); +gb_internal char const *string_intern_cstring(String str, u32 *hash_=nullptr) { + InternedString i = string_interner_insert(str, 0, hash_); return string_interner_load_cstring(i); } -gb_internal String string_intern_string(String str) { - InternedString i = string_interner_insert(str, 0); +gb_internal String string_intern_string(String str, u32 *hash_=nullptr) { + InternedString i = string_interner_insert(str, 0, hash_); return string_interner_load(i); } diff --git a/src/types.cpp b/src/types.cpp index abe7b104c..f4b708e57 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -226,6 +226,7 @@ struct TypeNamed { TYPE_KIND(Generic, struct { \ i64 id; \ String name; \ + InternedString interned_name; \ Type * specialized; \ Scope * scope; \ Entity *entity; \ @@ -986,10 +987,11 @@ gb_internal Type *alloc_type(TypeKind kind) { } -gb_internal Type *alloc_type_generic(Scope *scope, i64 id, String name, Type *specialized) { +gb_internal Type *alloc_type_generic(Scope *scope, i64 id, InternedString interned_name, Type *specialized) { Type *t = alloc_type(Type_Generic); t->Generic.id = id; - t->Generic.name = name; + t->Generic.name = interned_name.string(); + t->Generic.interned_name = interned_name; t->Generic.specialized = specialized; t->Generic.scope = scope; return t; @@ -3569,9 +3571,9 @@ gb_internal ProcTypeOverloadKind are_proc_types_overload_safe(Type *x, Type *y) -gb_internal Selection lookup_field_with_selection(Type *type_, String field_name, bool is_type, Selection sel, bool allow_blank_ident=false); +gb_internal Selection lookup_field_with_selection(Type *type_, InternedString field_name, bool is_type, Selection sel, bool allow_blank_ident=false); -gb_internal Selection lookup_field(Type *type_, String field_name, bool is_type, bool allow_blank_ident=false) { +gb_internal Selection lookup_field(Type *type_, InternedString field_name, bool is_type, bool allow_blank_ident=false) { return lookup_field_with_selection(type_, field_name, is_type, empty_selection, allow_blank_ident); } @@ -3624,13 +3626,13 @@ gb_internal Selection lookup_field_from_index(Type *type, i64 index) { return empty_selection; } -gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash=0); +gb_internal Entity *scope_lookup_current(Scope *s, InternedString name, u32 hash=0); gb_internal bool has_type_got_objc_class_attribute(Type *t); -gb_internal Selection lookup_field_with_selection(Type *type_, String field_name, bool is_type, Selection sel, bool allow_blank_ident) { +gb_internal Selection lookup_field_with_selection(Type *type_, InternedString field_name, bool is_type, Selection sel, bool allow_blank_ident) { GB_ASSERT(type_ != nullptr); - if (!allow_blank_ident && is_blank_ident(field_name)) { + if (!allow_blank_ident && field_name.is_blank()) { return empty_selection; } @@ -3652,7 +3654,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name defer (mutex_unlock(md->mutex)); for (TypeNameObjCMetadataEntry const &entry : md->type_entries) { GB_ASSERT(entry.entity->kind == Entity_Procedure || entry.entity->kind == Entity_ProcGroup); - if (entry.name == field_name) { + if (entry.interned == field_name) { sel.entity = entry.entity; sel.pseudo_field = true; return sel; @@ -3679,7 +3681,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name for_array(i, type->Enum.fields) { Entity *f = type->Enum.fields[i]; GB_ASSERT(f->kind == Entity_Constant); - String str = f->token.string; + auto str = entity_interned_name(f); if (field_name == str) { sel.entity = f; @@ -3730,7 +3732,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name defer (mutex_unlock(md->mutex)); for (TypeNameObjCMetadataEntry const &entry : md->value_entries) { GB_ASSERT(entry.entity->kind == Entity_Procedure || entry.entity->kind == Entity_ProcGroup); - if (entry.name == field_name) { + if (entry.interned == field_name) { sel.entity = entry.entity; sel.pseudo_field = true; return sel; @@ -3759,7 +3761,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name if (f->kind != Entity_Variable || (f->flags & EntityFlag_Field) == 0) { continue; } - String str = f->token.string; + auto str = entity_interned_name(f); if (field_name == str) { selection_add_index(&sel, i); // HACK(bill): Leaky memory sel.entity = f; @@ -3788,11 +3790,12 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name bool is_soa_of_array = is_soa && is_type_array(type->Struct.soa_elem); if (is_soa_of_array) { - String mapped_field_name = {}; - if (field_name == "r") mapped_field_name = str_lit("x"); - else if (field_name == "g") mapped_field_name = str_lit("y"); - else if (field_name == "b") mapped_field_name = str_lit("z"); - else if (field_name == "a") mapped_field_name = str_lit("w"); + InternedString mapped_field_name = {}; + String n = field_name.string(); + if (n == "r") mapped_field_name = string_interner_insert(str_lit("x")); + else if (n == "g") mapped_field_name = string_interner_insert(str_lit("y")); + else if (n == "b") mapped_field_name = string_interner_insert(str_lit("z")); + else if (n == "a") mapped_field_name = string_interner_insert(str_lit("w")); return lookup_field_with_selection(type, mapped_field_name, is_type, sel, allow_blank_ident); } } else if (type->kind == Type_BitField) { @@ -3801,7 +3804,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name if (f->kind != Entity_Variable || (f->flags & EntityFlag_Field) == 0) { continue; } - String str = f->token.string; + auto str = entity_interned_name(f); if (field_name == str) { selection_add_index(&sel, i); // HACK(bill): Leaky memory sel.entity = f; @@ -3819,11 +3822,12 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name gb_local_persist Entity *entity__any_data = alloc_entity_field(nullptr, make_token_ident(data_str), t_rawptr, false, 0); gb_local_persist Entity *entity__any_id = alloc_entity_field(nullptr, make_token_ident(id_str), t_typeid, false, 1); - if (field_name == data_str) { + String n = field_name.string(); + if (n == data_str) { selection_add_index(&sel, 0); sel.entity = entity__any_data; return sel; - } else if (field_name == id_str) { + } else if (n == id_str) { selection_add_index(&sel, 1); sel.entity = entity__any_id; return sel; @@ -3841,19 +3845,21 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name gb_local_persist Entity *entity__x = alloc_entity_field(nullptr, make_token_ident(x), t_f16, false, 0); gb_local_persist Entity *entity__y = alloc_entity_field(nullptr, make_token_ident(y), t_f16, false, 1); gb_local_persist Entity *entity__z = alloc_entity_field(nullptr, make_token_ident(z), t_f16, false, 2); - if (field_name == w) { + + String n = field_name.string(); + if (n == w) { selection_add_index(&sel, 3); sel.entity = entity__w; return sel; - } else if (field_name == x) { + } else if (n == x) { selection_add_index(&sel, 0); sel.entity = entity__x; return sel; - } else if (field_name == y) { + } else if (n == y) { selection_add_index(&sel, 1); sel.entity = entity__y; return sel; - } else if (field_name == z) { + } else if (n == z) { selection_add_index(&sel, 2); sel.entity = entity__z; return sel; @@ -3870,19 +3876,21 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name gb_local_persist Entity *entity__x = alloc_entity_field(nullptr, make_token_ident(x), t_f32, false, 0); gb_local_persist Entity *entity__y = alloc_entity_field(nullptr, make_token_ident(y), t_f32, false, 1); gb_local_persist Entity *entity__z = alloc_entity_field(nullptr, make_token_ident(z), t_f32, false, 2); - if (field_name == w) { + + String n = field_name.string(); + if (n == w) { selection_add_index(&sel, 3); sel.entity = entity__w; return sel; - } else if (field_name == x) { + } else if (n == x) { selection_add_index(&sel, 0); sel.entity = entity__x; return sel; - } else if (field_name == y) { + } else if (n == y) { selection_add_index(&sel, 1); sel.entity = entity__y; return sel; - } else if (field_name == z) { + } else if (n == z) { selection_add_index(&sel, 2); sel.entity = entity__z; return sel; @@ -3899,19 +3907,21 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name gb_local_persist Entity *entity__x = alloc_entity_field(nullptr, make_token_ident(x), t_f64, false, 0); gb_local_persist Entity *entity__y = alloc_entity_field(nullptr, make_token_ident(y), t_f64, false, 1); gb_local_persist Entity *entity__z = alloc_entity_field(nullptr, make_token_ident(z), t_f64, false, 2); - if (field_name == w) { + + String n = field_name.string(); + if (n == w) { selection_add_index(&sel, 3); sel.entity = entity__w; return sel; - } else if (field_name == x) { + } else if (n == x) { selection_add_index(&sel, 0); sel.entity = entity__x; return sel; - } else if (field_name == y) { + } else if (n == y) { selection_add_index(&sel, 1); sel.entity = entity__y; return sel; - } else if (field_name == z) { + } else if (n == z) { selection_add_index(&sel, 2); sel.entity = entity__z; return sel; @@ -3928,19 +3938,21 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name gb_local_persist Entity *entity__x = alloc_entity_field(nullptr, make_token_ident(x), t_untyped_float, false, 0); gb_local_persist Entity *entity__y = alloc_entity_field(nullptr, make_token_ident(y), t_untyped_float, false, 1); gb_local_persist Entity *entity__z = alloc_entity_field(nullptr, make_token_ident(z), t_untyped_float, false, 2); - if (field_name == w) { + + String n = field_name.string(); + if (n == w) { selection_add_index(&sel, 3); sel.entity = entity__w; return sel; - } else if (field_name == x) { + } else if (n == x) { selection_add_index(&sel, 0); sel.entity = entity__x; return sel; - } else if (field_name == y) { + } else if (n == y) { selection_add_index(&sel, 1); sel.entity = entity__y; return sel; - } else if (field_name == z) { + } else if (n == z) { selection_add_index(&sel, 2); sel.entity = entity__z; return sel; @@ -3955,7 +3967,8 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name String allocator_str = str_lit("allocator"); gb_local_persist Entity *entity__allocator = alloc_entity_field(nullptr, make_token_ident(allocator_str), t_allocator, false, 3); - if (field_name == allocator_str) { + String n = field_name.string(); + if (n == allocator_str) { selection_add_index(&sel, 3); sel.entity = entity__allocator; return sel; @@ -3965,7 +3978,8 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name String allocator_str = str_lit("allocator"); gb_local_persist Entity *entity__allocator = alloc_entity_field(nullptr, make_token_ident(allocator_str), t_allocator, false, 2); - if (field_name == allocator_str) { + String n = field_name.string(); + if (n == allocator_str) { selection_add_index(&sel, 2); sel.entity = entity__allocator; return sel; @@ -3973,7 +3987,7 @@ gb_internal Selection lookup_field_with_selection(Type *type_, String field_name #define _ARRAY_FIELD_CASE_IF(_length, _name) \ - if (field_name == (_name)) { \ + if (n == (_name)) { \ selection_add_index(&sel, (_length)-1); \ sel.entity = alloc_entity_array_elem(nullptr, make_token_ident(str_lit(_name)), elem, (_length)-1); \ return sel; \ @@ -3986,7 +4000,7 @@ case (_length): \ } else if (type->kind == Type_Array) { - + String n = field_name.string(); Type *elem = type->Array.elem; if (type->Array.count <= 4) { @@ -4001,8 +4015,9 @@ case (_length): \ } } } else if (type->kind == Type_SimdVector) { - + String n = field_name.string(); Type *elem = type->SimdVector.elem; + if (type->SimdVector.count <= 4) { // HACK(bill): Memory leak switch (type->SimdVector.count) { From b19e89578f6577b9ff582311b5d282d9ebc8eb28 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 11:42:03 +0000 Subject: [PATCH 178/273] Improve `check_struct_fields` performance; use `CheckerTypePath` free list --- src/check_expr.cpp | 14 +++++------ src/check_type.cpp | 22 +++++++++++----- src/checker.cpp | 63 ++++++++++++++++++++++++++++++++++++---------- src/checker.hpp | 4 +-- src/entity.cpp | 2 +- 5 files changed, 76 insertions(+), 29 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index f02322430..0ba316697 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1329,7 +1329,7 @@ gb_internal bool polymorphic_assign_index(Type **gt_, i64 *dst_count, i64 source Type *gt = *gt_; GB_ASSERT(gt->kind == Type_Generic); - Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name); + Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name, 0); GB_ASSERT(e != nullptr); if (e->kind == Entity_TypeName) { *gt_ = nullptr; @@ -1430,7 +1430,7 @@ gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, T if (poly->Array.generic_count != nullptr) { Type *gt = poly->Array.generic_count; GB_ASSERT(gt->kind == Type_Generic); - Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name); + Entity *e = scope_lookup(gt->Generic.scope, gt->Generic.interned_name, 0); GB_ASSERT(e != nullptr); if (e->kind == Entity_TypeName) { Type *index = source->EnumeratedArray.index; @@ -1772,7 +1772,7 @@ gb_internal Entity *check_ident(CheckerContext *c, Operand *o, Ast *n, Type *nam o->expr = n; auto name = n->Ident.token.string; - Entity *e = scope_lookup(c->scope, n->Ident.interned); + Entity *e = scope_lookup(c->scope, n->Ident.interned, n->Ident.hash); if (e == nullptr) { if (is_blank_ident(name)) { error(n, "'_' cannot be used as a value"); @@ -5459,7 +5459,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * } } else */if (node->kind == Ast_Ident) { String name = node->Ident.token.string; - return scope_lookup(c->scope, node->Ident.interned); + return scope_lookup(c->scope, node->Ident.interned, node->Ident.hash); } else if (!ident_only) if (node->kind == Ast_SelectorExpr) { ast_node(se, SelectorExpr, node); if (se->token.kind == Token_ArrowRight) { @@ -5481,7 +5481,7 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * if (op_expr->kind == Ast_Ident) { String op_name = op_expr->Ident.token.string; - Entity *e = scope_lookup(c->scope,op_expr->Ident.interned); + Entity *e = scope_lookup(c->scope, op_expr->Ident.interned, op_expr->Ident.hash); if (e == nullptr) { return nullptr; } @@ -5578,7 +5578,7 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod if (op_expr->kind == Ast_Ident) { String op_name = op_expr->Ident.token.string; - Entity *e = scope_lookup(c->scope, op_expr->Ident.interned); + Entity *e = scope_lookup(c->scope, op_expr->Ident.interned, op_expr->Ident.hash); add_entity_use(c, op_expr, e); expr_entity = e; @@ -6001,7 +6001,7 @@ gb_internal bool check_identifier_exists(Scope *s, Ast *node, bool nested = fals return true; } } else { - Entity *e = scope_lookup(s, i->interned); + Entity *e = scope_lookup(s, i->interned, i->hash); if (e != nullptr) { if (out_scope) *out_scope = e->scope; return true; diff --git a/src/check_type.cpp b/src/check_type.cpp index bd86e7c3d..a23033ef1 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -105,9 +105,6 @@ gb_internal bool does_field_type_allow_using(Type *t) { gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, Slice *fields, String **tags, Slice const ¶ms, isize init_field_capacity, Type *struct_type, String context) { - auto fields_array = array_make(heap_allocator(), 0, init_field_capacity); - auto tags_array = array_make(heap_allocator(), 0, init_field_capacity); - GB_ASSERT(node->kind == Ast_StructType); GB_ASSERT(struct_type->kind == Type_Struct); @@ -120,6 +117,12 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, Slice(permanent_allocator(), 0, init_field_capacity); + auto tags_array = array_make(permanent_allocator(), 0, init_field_capacity); + + defer (GB_ASSERT(fields_array.count == init_field_capacity)); + // Allocate all at once Entity *entities_to_use = permanent_alloc_array(variable_count); isize entities_to_use_index = 0; @@ -175,7 +178,10 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, Slicescope, name_token, type, is_using, field_src_index); Entity *field = &entities_to_use[entities_to_use_index++]; INTERNAL_ENTITY_INIT(field, Entity_Variable, ctx->scope, name_token, type); - field->state = EntityState_Unresolved; + + field->interned_name.store(name->Ident.interned); + field->interned_name_hash.store(name->Ident.hash); + field->flags |= EntityFlag_Field; if (is_using) field->flags |= EntityFlag_Using; field->Variable.field_index = field_src_index; @@ -976,6 +982,10 @@ gb_internal void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *nam Entity *e = &entities_to_use[entities_to_use_index++]; Token token = ident->Ident.token; INTERNAL_ENTITY_INIT(e, Entity_Constant, ctx->scope, token, constant_type); + + e->interned_name.store(ident->Ident.interned); + e->interned_name_hash.store(ident->Ident.hash); + e->Constant.value = iota; e->identifier = ident; e->flags |= EntityFlag_Visited; @@ -1519,7 +1529,7 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { - Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name); + Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name, 0); GB_ASSERT(e != nullptr); if (modify_type) { e->kind = Entity_Constant; @@ -1572,7 +1582,7 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { - Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name); + Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name, 0); GB_ASSERT(e != nullptr); if (modify_type) { e->kind = Entity_Constant; diff --git a/src/checker.cpp b/src/checker.cpp index 021b03dc9..0897fdbce 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -667,7 +667,8 @@ gb_internal bool check_vet_shadowing(Checker *c, Entity *e, VettedEntity *ve) { return false; } - Entity *shadowed = scope_lookup(parent, entity_interned_name(e)); + auto interned = entity_interned_name(e); + Entity *shadowed = scope_lookup(parent, interned, e->interned_name_hash.load()); if (shadowed == nullptr) { return false; } @@ -949,9 +950,10 @@ gb_internal AstPackage *try_get_core_package(CheckerInfo *info, String name) { gb_internal void add_package_dependency(CheckerContext *c, char const *package_name, char const *name, bool required=false) { String n = make_string_c(name); - InternedString key = string_interner_insert(n); + u32 hash = 0; + InternedString key = string_interner_insert(n, 0, &hash); AstPackage *p = get_core_package(&c->checker->info, make_string_c(package_name)); - Entity *e = scope_lookup(p->scope, key); + Entity *e = scope_lookup(p->scope, key, hash); GB_ASSERT_MSG(e != nullptr, "%s", name); GB_ASSERT(c->decl != nullptr); e->flags |= EntityFlag_Used; @@ -963,9 +965,10 @@ gb_internal void add_package_dependency(CheckerContext *c, char const *package_n gb_internal void try_to_add_package_dependency(CheckerContext *c, char const *package_name, char const *name) { String n = make_string_c(name); - InternedString key = string_interner_insert(n); + u32 hash = 0; + InternedString key = string_interner_insert(n, 0, &hash); AstPackage *p = get_core_package(&c->checker->info, make_string_c(package_name)); - Entity *e = scope_lookup(p->scope, key); + Entity *e = scope_lookup(p->scope, key, hash); if (e == nullptr) { return; } @@ -2756,7 +2759,9 @@ gb_internal void add_dependency_to_set_threaded(Checker *c, Entity *entity) { gb_internal void force_add_dependency_entity(Checker *c, Scope *scope, String const &name) { - Entity *e = scope_lookup(scope, string_interner_insert(name)); + u32 hash = 0; + auto interned = string_interner_insert(name, 0, &hash); + Entity *e = scope_lookup(scope, interned, hash); if (e == nullptr) { return; } @@ -3277,16 +3282,48 @@ gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String return e->type; } +struct CheckerTypePathStore { + CheckerTypePath path; + std::atomic next; +}; + +gb_internal gb_thread_local std::atomic checker_type_path_free_list; + gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator) { - // TODO(bill): Cache to reuse `CheckerTypePath` - auto *tp = gb_alloc_item(heap_allocator(), CheckerTypePath); - array_init(tp, allocator, 0, 16); - return tp; + // TODO(bill): Cache to reuse `CheckerTypePath + + CheckerTypePathStore *tp = nullptr; + + for (;;) { + tp = checker_type_path_free_list.load(std::memory_order_acquire); + if (tp == nullptr) { + tp = permanent_alloc_item(); + array_init(&tp->path, allocator, 0, 16); + return &tp->path; + } + + if (checker_type_path_free_list.compare_exchange_weak(tp, tp->next.load(std::memory_order_acquire), std::memory_order_acquire, std::memory_order_relaxed)) { + tp->next.store(nullptr); + return &tp->path; + } + + } } -gb_internal void destroy_checker_type_path(CheckerTypePath *tp, gbAllocator allocator) { - array_free(tp); - gb_free(allocator, tp); +gb_internal void destroy_checker_type_path(CheckerTypePath *path, gbAllocator allocator) { + auto *tp = cast(CheckerTypePathStore *)path; + array_clear(&tp->path); + + + for (;;) { + auto *head = checker_type_path_free_list.load(std::memory_order_relaxed); + tp->next.store(head); + if (checker_type_path_free_list.compare_exchange_weak(head, tp, std::memory_order_release, std::memory_order_relaxed)) { + return; + } + } + + // array_free(&tp->path); } gb_internal void check_type_path_push(CheckerContext *c, Entity *e) { diff --git a/src/checker.hpp b/src/checker.hpp index 335794535..a5f0ba704 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -883,8 +883,8 @@ gb_internal Entity *entity_of_node(Ast *expr); // gb_internal Entity *scope_lookup_current(Scope *s, String const &name, u32 hash=0); -gb_internal Entity *scope_lookup (Scope *s, InternedString interned, u32 hash=0); -gb_internal void scope_lookup_parent (Scope *s, InternedString name, Scope **scope_, Entity **entity_, u32 hash=0); +gb_internal Entity *scope_lookup (Scope *s, InternedString interned, u32 hash); +gb_internal void scope_lookup_parent (Scope *s, InternedString name, Scope **scope_, Entity **entity_, u32 hash); gb_internal Entity *scope_insert (Scope *s, Entity *entity); diff --git a/src/entity.cpp b/src/entity.cpp index 2f0046972..c6e091584 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -369,13 +369,13 @@ gb_global std::atomic global_entity_id; if ((token_).pos.file_id) { \ e_->file = thread_unsafe_get_ast_file_from_id((token_).pos.file_id); \ } \ - entity_interned_name(e_); \ } while (0) gb_internal Entity *alloc_entity(EntityKind kind, Scope *scope, Token token, Type *type) { Entity *entity = permanent_alloc_item(); INTERNAL_ENTITY_INIT(entity, kind, scope, token, type); + entity_interned_name(entity); return entity; } From 9ad3a23f27221890ba707f854246a10906608725 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 12:10:49 +0000 Subject: [PATCH 179/273] More improvements to performance; `AtomicFreelist` abstraction --- src/check_type.cpp | 9 +++------ src/checker.cpp | 42 +++++++++--------------------------------- src/threading.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 39 deletions(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index a23033ef1..9921ae6ae 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -39,11 +39,6 @@ gb_internal void populate_using_entity_scope(CheckerContext *ctx, Ast *node, Ast } Type *original_type = t; t = base_type(type_deref(t)); - gbString str = nullptr; - defer (gb_string_free(str)); - if (node != nullptr) { - str = expr_to_string(node); - } if (t->kind == Type_Struct) { for (Entity *f : t->Struct.fields) { @@ -54,8 +49,10 @@ gb_internal void populate_using_entity_scope(CheckerContext *ctx, Ast *node, Ast if (e != nullptr && name != "_") { gbString ot = type_to_string(original_type); // TODO(bill): Better type error - if (str != nullptr) { + if (node != nullptr) { + gbString str = expr_to_string(node); error(e->token, "'%.*s' is already declared in '%s', through 'using' from '%s'", LIT(name), str, ot); + gb_string_free(str); } else { error(e->token, "'%.*s' is already declared, through 'using' from '%s'", LIT(name), ot); } diff --git a/src/checker.cpp b/src/checker.cpp index 0897fdbce..ba6a392dd 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3282,48 +3282,24 @@ gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String return e->type; } -struct CheckerTypePathStore { - CheckerTypePath path; - std::atomic next; -}; - -gb_internal gb_thread_local std::atomic checker_type_path_free_list; +gb_internal gb_thread_local std::atomic *> checker_type_path_free_list; gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator) { // TODO(bill): Cache to reuse `CheckerTypePath - CheckerTypePathStore *tp = nullptr; - - for (;;) { - tp = checker_type_path_free_list.load(std::memory_order_acquire); - if (tp == nullptr) { - tp = permanent_alloc_item(); - array_init(&tp->path, allocator, 0, 16); - return &tp->path; - } - - if (checker_type_path_free_list.compare_exchange_weak(tp, tp->next.load(std::memory_order_acquire), std::memory_order_acquire, std::memory_order_relaxed)) { - tp->next.store(nullptr); - return &tp->path; - } - + auto *tp = atomic_freelist_get(checker_type_path_free_list); + if (tp == nullptr) { + tp = permanent_alloc_item >(); + array_init(&tp->value, allocator, 0, 16); } + return &tp->value; } gb_internal void destroy_checker_type_path(CheckerTypePath *path, gbAllocator allocator) { - auto *tp = cast(CheckerTypePathStore *)path; - array_clear(&tp->path); + auto *tp = cast(AtomicFreelist *)path; + array_clear(&tp->value); - - for (;;) { - auto *head = checker_type_path_free_list.load(std::memory_order_relaxed); - tp->next.store(head); - if (checker_type_path_free_list.compare_exchange_weak(head, tp, std::memory_order_release, std::memory_order_relaxed)) { - return; - } - } - - // array_free(&tp->path); + atomic_freelist_put(checker_type_path_free_list, tp); } gb_internal void check_type_path_push(CheckerContext *c, Entity *e) { diff --git a/src/threading.cpp b/src/threading.cpp index d8ae321f5..5dff13d2e 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -1201,3 +1201,41 @@ void futex_wait(Futex *f, Footex val) { #if defined(GB_SYSTEM_WINDOWS) #pragma warning(pop) #endif + + + +template +struct AtomicFreelist { + T value; + std::atomic *> next; +}; + +template +AtomicFreelist *atomic_freelist_get(std::atomic *> &head) { + AtomicFreelist *elem = nullptr; + + for (;;) { + elem = head.load(std::memory_order_acquire); + if (elem == nullptr) { + return nullptr; + } + + if (head.compare_exchange_weak(elem, elem->next.load(std::memory_order_acquire), std::memory_order_acquire, std::memory_order_relaxed)) { + elem->next.store(nullptr, std::memory_order_relaxed); + return elem; + } + + } +} + +template +void atomic_freelist_put(std::atomic *> &head_list, AtomicFreelist *elem) { + for (;;) { + auto *head = head_list.load(std::memory_order_relaxed); + elem->next.store(head, std::memory_order_relaxed); + if (head_list.compare_exchange_weak(head, elem, std::memory_order_release, std::memory_order_relaxed)) { + return; + } + + } +} \ No newline at end of file From e18b15e8f05d62b7bc8461dfe4bf4a8b92089752 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 12:16:44 +0000 Subject: [PATCH 180/273] Move error-only things to the error scopes --- src/check_expr.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 0ba316697..2155485f5 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1090,18 +1090,20 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ return; } - // Grab definite or indefinite article matching `context_name`, or "" if not found. - String article = error_article(context_name); if (is_type_untyped(operand->type)) { Type *target_type = type; if (type == nullptr || is_type_any(type)) { if (type == nullptr && is_type_untyped_uninit(operand->type)) { + String article = error_article(context_name); // Grab definite or indefinite article matching `context_name`, or "" if not found. + error(operand->expr, "Use of --- in %.*s%.*s", LIT(article), LIT(context_name)); operand->mode = Addressing_Invalid; return; } if (type == nullptr && is_type_untyped_nil(operand->type)) { + String article = error_article(context_name); // Grab definite or indefinite article matching `context_name`, or "" if not found. + error(operand->expr, "Use of untyped nil in %.*s%.*s", LIT(article), LIT(context_name)); operand->mode = Addressing_Invalid; return; @@ -1159,6 +1161,8 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ defer (gb_string_free(op_type_str)); defer (gb_string_free(expr_str)); + String article = error_article(context_name); // Grab definite or indefinite article matching `context_name`, or "" if not found. + // TODO(bill): is this a good enough error message? error(operand->expr, "Cannot assign overloaded procedure group '%s' to '%s' in %.*s%.*s", @@ -1187,6 +1191,8 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ defer (gb_string_free(op_type_str)); defer (gb_string_free(expr_str)); + String article = error_article(context_name); // Grab definite or indefinite article matching `context_name`, or "" if not found. + switch (operand->mode) { case Addressing_Builtin: error(operand->expr, From 46936e0e52b29cc877bf9944efd60fa0c0a3218e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 12:55:25 +0000 Subject: [PATCH 181/273] General improvements --- src/check_expr.cpp | 11 +++++--- src/check_type.cpp | 49 +++++++++++++++++++++++++++++---- src/checker.cpp | 10 +++---- src/checker.hpp | 4 +-- src/entity.cpp | 3 +- src/ptr_set.cpp | 68 ++++++++++++++++++++++++++++++++-------------- 6 files changed, 106 insertions(+), 39 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 2155485f5..c72e89bf2 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -7822,11 +7822,14 @@ gb_internal CallArgumentError check_polymorphic_record_type(CheckerContext *c, O { // NOTE(bill, 2019-10-26): Allow a cycle in the parameters but not in the fields themselves auto prev_type_path = c->type_path; + + c->type_path = new_checker_type_path(); + defer ({ + destroy_checker_type_path(c->type_path); + c->type_path = prev_type_path; + }); + TEMPORARY_ALLOCATOR_GUARD(); - - c->type_path = new_checker_type_path(temporary_allocator()); - defer (c->type_path = prev_type_path); - if (is_call_expr_field_value(ce)) { named_fields = true; operands = array_make(temporary_allocator(), ce->args.count); diff --git a/src/check_type.cpp b/src/check_type.cpp index 9921ae6ae..1ba2ee051 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1857,6 +1857,11 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para bool is_c_vararg = false; auto variables = array_make(permanent_allocator(), 0, variable_count); i32 field_group_index = -1; + + + Entity *entities_to_use = permanent_alloc_array(variable_count); + isize entities_to_use_index = 0; + for_array(i, params) { Ast *param = params[i]; if (param->kind != Ast_Field) { @@ -2096,7 +2101,12 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para p->flags &= ~FieldFlag_no_capture; } - param = alloc_entity_type_name(scope, name->Ident.token, type, EntityState_Resolved); + param = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(param, Entity_TypeName, scope, name->Ident.token, type); + param->state = EntityState_Resolved; + param->interned_name.store(name->Ident.interned); + param->interned_name_hash.store(name->Ident.hash); + param->TypeName.is_type_alias = true; } else { ExactValue poly_const = {}; @@ -2250,10 +2260,36 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para // failed } - param = alloc_entity_const_param(scope, name->Ident.token, type, poly_const, is_type_polymorphic(type)); + // param = alloc_entity_const_param(scope, name->Ident.token, type, poly_const, is_type_polymorphic(type)); + + param = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(param, Entity_Constant, scope, name->Ident.token, type); + + param->flags |= EntityFlag_Used|EntityFlag_Param; + if (is_type_polymorphic(type)) { + param->flags |= EntityFlag_PolyConst; + } + param->Constant.value = poly_const; + + param->interned_name.store(name->Ident.interned); + param->interned_name_hash.store(name->Ident.hash); + param->Constant.field_group_index = field_group_index; } else { - param = alloc_entity_param(scope, name->Ident.token, type, is_using, true); + // param = alloc_entity_param(scope, name->Ident.token, type, is_using, true); + + param = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(param, Entity_Variable, scope, name->Ident.token, type); + + param->state = EntityState_Resolved; + param->flags |= EntityFlag_Used|EntityFlag_Param|EntityFlag_Value; + if (is_using) { + param->flags |= EntityFlag_Using; + } + + param->interned_name.store(name->Ident.interned); + param->interned_name_hash.store(name->Ident.hash); + param->Variable.param_value = param_value; param->Variable.field_group_index = field_group_index; param->Variable.type_expr = type_expr; @@ -3627,7 +3663,8 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T CheckerContext c = *ctx; TEMPORARY_ALLOCATOR_GUARD(); - c.type_path = new_checker_type_path(temporary_allocator()); + c.type_path = new_checker_type_path(); + defer (destroy_checker_type_path(c.type_path)); Type *elem = t_invalid; Operand o = {}; @@ -3900,8 +3937,8 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T gb_internal Type *check_type(CheckerContext *ctx, Ast *e) { CheckerContext c = *ctx; - TEMPORARY_ALLOCATOR_GUARD(); - c.type_path = new_checker_type_path(temporary_allocator()); + c.type_path = new_checker_type_path(); + defer (destroy_checker_type_path(c.type_path)); return check_type_expr(&c, e, nullptr); } diff --git a/src/checker.cpp b/src/checker.cpp index ba6a392dd..ce8042b41 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1550,12 +1550,12 @@ gb_internal void init_checker_context(CheckerContext *ctx, Checker *c) { ctx->scope = builtin_pkg->scope; ctx->pkg = builtin_pkg; - ctx->type_path = new_checker_type_path(heap_allocator()); + ctx->type_path = new_checker_type_path(); ctx->type_level = 0; } gb_internal void destroy_checker_context(CheckerContext *ctx) { - destroy_checker_type_path(ctx->type_path, heap_allocator()); + destroy_checker_type_path(ctx->type_path); } gb_internal bool add_curr_ast_file(CheckerContext *ctx, AstFile *file) { @@ -3284,18 +3284,18 @@ gb_internal Type *find_type_in_pkg(CheckerInfo *info, String const &pkg, String gb_internal gb_thread_local std::atomic *> checker_type_path_free_list; -gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator) { +gb_internal CheckerTypePath *new_checker_type_path() { // TODO(bill): Cache to reuse `CheckerTypePath auto *tp = atomic_freelist_get(checker_type_path_free_list); if (tp == nullptr) { tp = permanent_alloc_item >(); - array_init(&tp->value, allocator, 0, 16); + array_init(&tp->value, permanent_allocator(), 0, 16); } return &tp->value; } -gb_internal void destroy_checker_type_path(CheckerTypePath *path, gbAllocator allocator) { +gb_internal void destroy_checker_type_path(CheckerTypePath *path) { auto *tp = cast(AtomicFreelist *)path; array_clear(&tp->value); diff --git a/src/checker.hpp b/src/checker.hpp index a5f0ba704..5e295dc84 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -909,8 +909,8 @@ gb_internal void check_collect_entities(CheckerContext *c, Slice const &n gb_internal void check_collect_entities_from_when_stmt(CheckerContext *c, AstWhenStmt *ws); gb_internal void check_delayed_file_import_entity(CheckerContext *c, Ast *decl); -gb_internal CheckerTypePath *new_checker_type_path(gbAllocator allocator); -gb_internal void destroy_checker_type_path(CheckerTypePath *tp, gbAllocator allocator); +gb_internal CheckerTypePath *new_checker_type_path(); +gb_internal void destroy_checker_type_path(CheckerTypePath *tp); gb_internal void check_type_path_push(CheckerContext *c, Entity *e); gb_internal Entity *check_type_path_pop (CheckerContext *c); diff --git a/src/entity.cpp b/src/entity.cpp index c6e091584..5062599de 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -412,10 +412,9 @@ gb_internal Entity *alloc_entity_type_name(Scope *scope, Token token, Type *type } gb_internal Entity *alloc_entity_param(Scope *scope, Token token, Type *type, bool is_using, bool is_value) { - Entity *entity = alloc_entity_variable(scope, token, type); + Entity *entity = alloc_entity_variable(scope, token, type, EntityState_Resolved); entity->flags |= EntityFlag_Used; entity->flags |= EntityFlag_Param; - entity->state = EntityState_Resolved; if (is_using) entity->flags |= EntityFlag_Using; if (is_value) entity->flags |= EntityFlag_Value; return entity; diff --git a/src/ptr_set.cpp b/src/ptr_set.cpp index 1d8154be7..3d30bb35e 100644 --- a/src/ptr_set.cpp +++ b/src/ptr_set.cpp @@ -1,11 +1,14 @@ +enum {PTR_SET_INLINE_CAP = 16}; + template struct PtrSet { static_assert(TypeIsPointer::value || TypeIsPtrSizedInteger::value, "PtrSet::T must be a pointer"); static constexpr uintptr TOMBSTONE = ~(uintptr)(0ull); - T * keys; - usize count; - usize capacity; + T * keys; + u32 count; + u32 capacity; + T inline_keys[PTR_SET_INLINE_CAP]; }; template gb_internal void ptr_set_init (PtrSet *s, isize capacity = 16); @@ -27,17 +30,23 @@ template gb_internal void ptr_set_init(PtrSet *s, isize capacity) { GB_ASSERT(s->keys == nullptr); if (capacity != 0) { - capacity = next_pow2_isize(gb_max(16, capacity)); - s->keys = gb_alloc_array(ptr_set_allocator(), T, capacity); + capacity = next_pow2_isize(gb_max(PTR_SET_INLINE_CAP, capacity)); + if (capacity > PTR_SET_INLINE_CAP) { + s->keys = gb_alloc_array(ptr_set_allocator(), T, capacity); + } else { + s->keys = s->inline_keys; + } // This memory will be zeroed, no need to explicitly zero it } s->count = 0; - s->capacity = capacity; + s->capacity = cast(u32)capacity; } template gb_internal void ptr_set_destroy(PtrSet *s) { - gb_free(ptr_set_allocator(), s->keys); + if (s->keys != s->inline_keys) { + gb_free(ptr_set_allocator(), s->keys); + } s->keys = nullptr; s->count = 0; s->capacity = 0; @@ -47,16 +56,10 @@ template gb_internal isize ptr_set__find(PtrSet *s, T ptr) { GB_ASSERT(ptr != 0); if (s->count != 0) { - #if 0 - for (usize i = 0; i < s->capacity; i++) { - if (s->keys[i] == ptr) { - return i; - } - } - #else u32 hash = ptr_map_hash_key(ptr); usize mask = s->capacity-1; usize hash_index = cast(usize)hash & mask; + for (usize i = 0; i < s->capacity; i++) { T key = s->keys[hash_index]; if (key == ptr) { @@ -66,14 +69,14 @@ gb_internal isize ptr_set__find(PtrSet *s, T ptr) { } hash_index = (hash_index+1)&mask; } - #endif } return -1; } template gb_internal bool ptr_set__full(PtrSet *s) { - return 0.75f * s->capacity <= s->count; + usize grow_at = s->capacity - (s->capacity>>2); + return s->count >= grow_at; } template @@ -187,11 +190,36 @@ gb_internal T ptr_set_add(PtrSet *s, T ptr) { template gb_internal void ptr_set_remove(PtrSet *s, T ptr) { isize index = ptr_set__find(s, ptr); - if (index >= 0) { - GB_ASSERT(s->count > 0); - s->keys[index] = (T)PtrSet::TOMBSTONE; - s->count--; + if (index < 0) { + return; } + +#if 0 + u32 mask = s->capacity-1; + u32 i = cast(u32)index; + s->count -= 1; + + for (;;) { + u32 next = (i + 1) & mask; + T key = s->keys[next]; + if (key == 0) { + break; + } + + u32 natural = ptr_map_hash_key(key) & mask; + + if (((next - natural) & mask) == 0) { + break; + } + s->keys[i] = key; + i = next; + } + s->keys[i] = 0; +#else + GB_ASSERT(s->count > 0); + s->keys[index] = (T)PtrSet::TOMBSTONE; + s->count--; +#endif } template From 1f2c9686527e70c547d63ec6643878f316355702 Mon Sep 17 00:00:00 2001 From: Nathan Chere <853261+nathanchere@users.noreply.github.com> Date: Tue, 17 Mar 2026 14:05:45 +0100 Subject: [PATCH 182/273] Update build_odin.shm to support LLVM 22 --- build_odin.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build_odin.sh b/build_odin.sh index 64bb4c799..ee891e41e 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -26,7 +26,7 @@ error() { exit 1 } -SUPPORTED_LLVM_VERSIONS="21 20 19 18 17 14" +SUPPORTED_LLVM_VERSIONS="22 21 20 19 18 17 14" # Brew advises people not to add llvm to their $PATH, so try and use brew to find it. if [ -z "$LLVM_CONFIG" ] && [ -n "$(command -v brew)" ]; then @@ -78,8 +78,8 @@ LLVM_VERSION_MAJOR="$(echo $LLVM_VERSION | awk -F. '{print $1}')" LLVM_VERSION_MINOR="$(echo $LLVM_VERSION | awk -F. '{print $2}')" LLVM_VERSION_PATCH="$(echo $LLVM_VERSION | awk -F. '{print $3}')" -if [ $LLVM_VERSION_MAJOR -lt 14 ] || ([ $LLVM_VERSION_MAJOR -gt 14 ] && [ $LLVM_VERSION_MAJOR -lt 17 ]) || [ $LLVM_VERSION_MAJOR -gt 21 ]; then - error "Invalid LLVM version $LLVM_VERSION: must be 14, 17, 18, 19, 20, or 21" +if [ $LLVM_VERSION_MAJOR -lt 14 ] || ([ $LLVM_VERSION_MAJOR -gt 14 ] && [ $LLVM_VERSION_MAJOR -lt 17 ]) || [ $LLVM_VERSION_MAJOR -gt 22 ]; then + error "Invalid LLVM version $LLVM_VERSION: must be 14, 17, 18, 19, 20, 21 or 22" fi case "$OS_NAME" in From 153a522228fb877a37e9483427d5bf929a8c19cf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 13:34:06 +0000 Subject: [PATCH 183/273] Use normal `i64` arithmetic instead of big-ints for hot path --- src/big_int.cpp | 7 +++++++ src/check_expr.cpp | 50 ++++++++++++++++++++++++++++++++++++---------- src/check_type.cpp | 23 ++++++++++++++++++--- 3 files changed, 66 insertions(+), 14 deletions(-) diff --git a/src/big_int.cpp b/src/big_int.cpp index 141152913..e2ebb5c76 100644 --- a/src/big_int.cpp +++ b/src/big_int.cpp @@ -57,6 +57,8 @@ gb_internal void big_int_dealloc(BigInt *dst) { mp_clear(dst); } +gb_internal bool big_int_can_be_represented_in_64_bits(BigInt const *x); + gb_internal BigInt big_int_make(BigInt const *b, bool abs=false); gb_internal BigInt big_int_make_abs(BigInt const *b); gb_internal BigInt big_int_make_u64(u64 x); @@ -293,6 +295,11 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success +gb_internal bool big_int_can_be_represented_in_64_bits(BigInt const *x) { + int bits_used = (x->used-1) * MP_DIGIT_BIT; + return bits_used <= 64; +} + gb_internal u64 big_int_to_u64(BigInt const *x) { GB_ASSERT(x->sign == 0); return mp_get_u64(x); diff --git a/src/check_expr.cpp b/src/check_expr.cpp index c72e89bf2..d634aa9c0 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2167,9 +2167,13 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i BigInt i = v.value_integer; i64 byte_size = type_size_of(type); - BigInt umax = {}; - BigInt imin = {}; - BigInt imax = {}; + BigInt umax; + BigInt imin; + BigInt imax; + + u64 umax_64 = 0; + i64 imin_64 = 0; + i64 imax_64 = 0; if (c->bit_field_bit_size > 0) { i64 bit_size = gb_min(cast(i64)(8*byte_size), cast(i64)c->bit_field_bit_size); @@ -2192,10 +2196,10 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i big_int_shl_eq(&imax, &bi); mp_decr(&imax); } else { - if (byte_size < 16) { - big_int_from_u64(&umax, unsigned_integer_maxs[byte_size]); - big_int_from_i64(&imin, signed_integer_mins[byte_size]); - big_int_from_i64(&imax, signed_integer_maxs[byte_size]); + if (byte_size <= 8) { + umax_64 = unsigned_integer_maxs[byte_size]; + imin_64 = signed_integer_mins[byte_size]; + imax_64 = signed_integer_maxs[byte_size]; } else { big_int_from_u64(&umax, 1); big_int_from_i64(&imin, 1); @@ -2223,16 +2227,27 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i case Basic_i16: case Basic_i32: case Basic_i64: - case Basic_i128: case Basic_int: case Basic_i16le: case Basic_i32le: case Basic_i64le: - case Basic_i128le: case Basic_i16be: case Basic_i32be: case Basic_i64be: + { + // return imin <= i && i <= imax; + if (!big_int_can_be_represented_in_64_bits(&i)) { + return false; + } + + i64 val64 = big_int_to_i64(&i); + + return imin_64 <= val64 && val64 <= imax_64; + } + + case Basic_i128le: + case Basic_i128: case Basic_i128be: { // return imin <= i && i <= imax; @@ -2245,17 +2260,30 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i case Basic_u16: case Basic_u32: case Basic_u64: - case Basic_u128: case Basic_uint: case Basic_uintptr: case Basic_u16le: case Basic_u32le: case Basic_u64le: - case Basic_u128le: case Basic_u16be: case Basic_u32be: case Basic_u64be: + { + if (big_int_is_neg(&i)) { + return false; + } + if (!big_int_can_be_represented_in_64_bits(&i)) { + return false; + } + u64 val64 = big_int_to_u64(&i); + + return val64 <= umax_64; + + } + + case Basic_u128: + case Basic_u128le: case Basic_u128be: { // return 0ull <= i && i <= umax; diff --git a/src/check_type.cpp b/src/check_type.cpp index 1ba2ee051..b625fb3d0 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2442,6 +2442,9 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res } } + Entity *entities_to_use = permanent_alloc_array(variable_count); + isize entities_to_use_index = 0; + auto variables = array_make(permanent_allocator(), 0, variable_count); i32 field_group_index = -1; for_array(i, results) { @@ -2480,7 +2483,12 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res if (field->names.count == 0) { Token token = ast_token(field->type); token.string = str_lit(""); - Entity *param = alloc_entity_param(scope, token, type, false, false); + // Entity *param = alloc_entity_param(scope, token, type, false, false); + Entity *param = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(param, Entity_Variable, scope, token, type); + param->state = EntityState_Resolved; + param->flags |= EntityFlag_Used|EntityFlag_Param|EntityFlag_Result; + param->Variable.param_value = param_value; param->Variable.field_group_index = -1; array_add(&variables, param); @@ -2503,8 +2511,17 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res error(name, "Result value cannot be a blank identifer `_`"); } - Entity *param = alloc_entity_param(scope, token, type, false, false); - param->flags |= EntityFlag_Result; + // Entity *param = alloc_entity_param(scope, token, type, false, false); + Entity *param = &entities_to_use[entities_to_use_index++]; + INTERNAL_ENTITY_INIT(param, Entity_Variable, scope, token, type); + param->state = EntityState_Resolved; + param->flags |= EntityFlag_Used|EntityFlag_Param|EntityFlag_Result; + + if (name->kind == Ast_Ident) { + param->interned_name.store(name->Ident.interned); + param->interned_name_hash.store(name->Ident.hash); + } + param->Variable.param_value = param_value; param->Variable.field_group_index = field_group_index; array_add(&variables, param); From 911f00521cf9cc8e22194bf1071dd95137b99165 Mon Sep 17 00:00:00 2001 From: pawelt Date: Tue, 17 Mar 2026 14:31:47 +0100 Subject: [PATCH 184/273] Handle OOM error in path_linux / _get_working_directory() --- core/os/path_linux.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/os/path_linux.odin b/core/os/path_linux.odin index cba4b4e98..8911e6986 100644 --- a/core/os/path_linux.odin +++ b/core/os/path_linux.odin @@ -71,7 +71,7 @@ _mkdir_all :: proc(path: string, perm: Permissions) -> Error { if errno != .NONE { return _get_platform_error(errno) } - + has_created: bool mkdirat(dfd, path_bytes, perm, &has_created) or_return return nil if has_created else .Exist @@ -147,13 +147,13 @@ _remove_all :: proc(path: string) -> Error { return _get_platform_error(linux.rmdir(path_cstr)) } -_get_working_directory :: proc(allocator: runtime.Allocator) -> (string, Error) { +_get_working_directory :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) { // NOTE(tetra): I would use PATH_MAX here, but I was not able to find // an authoritative value for it across all systems. // The largest value I could find was 4096, so might as well use the page size. // NOTE(jason): Avoiding libc, so just use 4096 directly PATH_MAX :: 4096 - buf := make([dynamic]u8, PATH_MAX, allocator) + buf := make([dynamic]u8, PATH_MAX, allocator) or_return for { #no_bounds_check n, errno := linux.getcwd(buf[:]) if errno == .NONE { @@ -162,7 +162,7 @@ _get_working_directory :: proc(allocator: runtime.Allocator) -> (string, Error) if errno != .ERANGE { return "", _get_platform_error(errno) } - resize(&buf, len(buf)+PATH_MAX) + resize(&buf, len(buf)+PATH_MAX) or_return } unreachable() } From d28e19c9572ee7a954dec9dbc2d1e268b5292e28 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 13:47:02 +0000 Subject: [PATCH 185/273] Minor improve to check if the entity was already there --- src/check_expr.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index d634aa9c0..9c9f99fc0 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -5492,6 +5492,10 @@ gb_internal Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast * return e; } } else */if (node->kind == Ast_Ident) { + Entity *e = node->Ident.entity.load(); + if (e != nullptr) { + return e; + } String name = node->Ident.token.string; return scope_lookup(c->scope, node->Ident.interned, node->Ident.hash); } else if (!ident_only) if (node->kind == Ast_SelectorExpr) { From 85c05b238e5d6f454754e70edae24872b0c573cc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 13:50:49 +0000 Subject: [PATCH 186/273] Handle bit fields separately --- src/check_expr.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 9c9f99fc0..9044d8346 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2235,7 +2235,7 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i case Basic_i16be: case Basic_i32be: case Basic_i64be: - { + if (c->bit_field_bit_size == 0) { // return imin <= i && i <= imax; if (!big_int_can_be_represented_in_64_bits(&i)) { return false; @@ -2245,7 +2245,7 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i return imin_64 <= val64 && val64 <= imax_64; } - + /*fallthrough*/ case Basic_i128le: case Basic_i128: case Basic_i128be: @@ -2269,7 +2269,7 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i case Basic_u16be: case Basic_u32be: case Basic_u64be: - { + if (c->bit_field_bit_size == 0) { if (big_int_is_neg(&i)) { return false; } @@ -2281,7 +2281,7 @@ gb_internal bool check_representable_as_constant(CheckerContext *c, ExactValue i return val64 <= umax_64; } - + /*fallthrough*/ case Basic_u128: case Basic_u128le: case Basic_u128be: From 1f9f2dc0da2849fe1da2cdfbe8afc9dece643f1a Mon Sep 17 00:00:00 2001 From: WojtaZam Date: Tue, 17 Mar 2026 20:19:46 +0100 Subject: [PATCH 187/273] fix Error: Missing return statement at the end of the procedure pop_fixed_capacity_dynamic_array --- base/runtime/core_builtin.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 511867feb..fe76ee5a5 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -258,6 +258,7 @@ pop_fixed_capacity_dynamic_array :: proc(array: ^$T/[dynamic; $N]$E, loc := #cal end := rawptr(uintptr(array) + uintptr(elem_size*(len(array)-1))) intrinsics.mem_copy_non_overlapping(&res, end, elem_size) (^Raw_Fixed_Capacity_Dynamic_Array(N, E))(array).len -= 1 + return res } From 72c1a9420b5875ee8af33c0d03f66cb2f4ab8af1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Fro=C5=82ow?= Date: Wed, 18 Mar 2026 12:54:07 +0100 Subject: [PATCH 188/273] No need to use f for print here --- examples/demo/demo.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index a5455846d..a12217548 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -2247,7 +2247,7 @@ arbitrary_precision_mathematics :: proc() { cb := big.internal_count_bits(a) if print_name { - fmt.printf(name) + fmt.print(name) } if err != nil { fmt.printf(" (Error: %v) ", err) From eddc8084f14f2008fdcee0b163f02742227acad5 Mon Sep 17 00:00:00 2001 From: Nathan Chere Date: Wed, 18 Mar 2026 18:30:39 +0100 Subject: [PATCH 189/273] update microarch table for LLVM 22 --- src/build_settings_microarch.cpp | 590 ++++++++++++++++++++++++++++++- 1 file changed, 589 insertions(+), 1 deletion(-) diff --git a/src/build_settings_microarch.cpp b/src/build_settings_microarch.cpp index 0755aa62d..d3010522d 100644 --- a/src/build_settings_microarch.cpp +++ b/src/build_settings_microarch.cpp @@ -2,7 +2,595 @@ #error "LLVM_VERSION_MAJOR is not defined!" #endif -#if LLVM_VERSION_MAJOR >= 21 + +#if LLVM_VERSION_MAJOR >= 22 +// Generated with the featuregen script in `misc/featuregen` +gb_global String target_microarch_list[TargetArch_COUNT] = { + // TargetArch_Invalid: + str_lit(""), + // TargetArch_amd64: + str_lit("alderlake,amdfam10,arrowlake,arrowlake-s,arrowlake_s,athlon,athlon-4,athlon-fx,athlon-mp,athlon-tbird,athlon-xp,athlon64,athlon64-sse3,atom,atom_sse4_2,atom_sse4_2_movbe,barcelona,bdver1,bdver2,bdver3,bdver4,bonnell,broadwell,btver1,btver2,c3,c3-2,cannonlake,cascadelake,clearwaterforest,cooperlake,core-avx-i,core-avx2,core2,core_2_duo_sse4_1,core_2_duo_ssse3,core_2nd_gen_avx,core_3rd_gen_avx,core_4th_gen_avx,core_4th_gen_avx_tsx,core_5th_gen_avx,core_5th_gen_avx_tsx,core_aes_pclmulqdq,core_i7_sse4_2,corei7,corei7-avx,diamondrapids,emeraldrapids,generic,geode,goldmont,goldmont-plus,goldmont_plus,gracemont,grandridge,graniterapids,graniterapids-d,graniterapids_d,haswell,i386,i486,i586,i686,icelake-client,icelake-server,icelake_client,icelake_server,ivybridge,k6,k6-2,k6-3,k8,k8-sse3,knl,knm,lakemont,lunarlake,meteorlake,mic_avx512,nehalem,nocona,novalake,opteron,opteron-sse3,pantherlake,penryn,pentium,pentium-m,pentium-mmx,pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium_4,pentium_4_sse3,pentium_ii,pentium_iii,pentium_iii_no_xmm_regs,pentium_m,pentium_mmx,pentium_pro,pentiumpro,prescott,raptorlake,rocketlake,sandybridge,sapphirerapids,sierraforest,silvermont,skx,skylake,skylake-avx512,skylake_avx512,slm,tigerlake,tremont,westmere,wildcatlake,winchip-c6,winchip2,x86-64,x86-64-v2,x86-64-v3,x86-64-v4,yonah,znver1,znver2,znver3,znver4,znver5"), + // TargetArch_i386: + str_lit("alderlake,amdfam10,arrowlake,arrowlake-s,arrowlake_s,athlon,athlon-4,athlon-fx,athlon-mp,athlon-tbird,athlon-xp,athlon64,athlon64-sse3,atom,atom_sse4_2,atom_sse4_2_movbe,barcelona,bdver1,bdver2,bdver3,bdver4,bonnell,broadwell,btver1,btver2,c3,c3-2,cannonlake,cascadelake,clearwaterforest,cooperlake,core-avx-i,core-avx2,core2,core_2_duo_sse4_1,core_2_duo_ssse3,core_2nd_gen_avx,core_3rd_gen_avx,core_4th_gen_avx,core_4th_gen_avx_tsx,core_5th_gen_avx,core_5th_gen_avx_tsx,core_aes_pclmulqdq,core_i7_sse4_2,corei7,corei7-avx,diamondrapids,emeraldrapids,generic,geode,goldmont,goldmont-plus,goldmont_plus,gracemont,grandridge,graniterapids,graniterapids-d,graniterapids_d,haswell,i386,i486,i586,i686,icelake-client,icelake-server,icelake_client,icelake_server,ivybridge,k6,k6-2,k6-3,k8,k8-sse3,knl,knm,lakemont,lunarlake,meteorlake,mic_avx512,nehalem,nocona,novalake,opteron,opteron-sse3,pantherlake,penryn,pentium,pentium-m,pentium-mmx,pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium_4,pentium_4_sse3,pentium_ii,pentium_iii,pentium_iii_no_xmm_regs,pentium_m,pentium_mmx,pentium_pro,pentiumpro,prescott,raptorlake,rocketlake,sandybridge,sapphirerapids,sierraforest,silvermont,skx,skylake,skylake-avx512,skylake_avx512,slm,tigerlake,tremont,westmere,wildcatlake,winchip-c6,winchip2,x86-64,x86-64-v2,x86-64-v3,x86-64-v4,yonah,znver1,znver2,znver3,znver4,znver5"), + // TargetArch_arm32: + str_lit("arm1020e,arm1020t,arm1022e,arm10e,arm10tdmi,arm1136j-s,arm1136jf-s,arm1156t2-s,arm1156t2f-s,arm1176jz-s,arm1176jzf-s,arm710t,arm720t,arm7tdmi,arm7tdmi-s,arm8,arm810,arm9,arm920,arm920t,arm922t,arm926ej-s,arm940t,arm946e-s,arm966e-s,arm968e-s,arm9e,arm9tdmi,cortex-a12,cortex-a15,cortex-a17,cortex-a32,cortex-a35,cortex-a5,cortex-a510,cortex-a53,cortex-a55,cortex-a57,cortex-a7,cortex-a710,cortex-a72,cortex-a73,cortex-a75,cortex-a76,cortex-a76ae,cortex-a77,cortex-a78,cortex-a78ae,cortex-a78c,cortex-a8,cortex-a9,cortex-m0,cortex-m0plus,cortex-m1,cortex-m23,cortex-m3,cortex-m33,cortex-m35p,cortex-m4,cortex-m52,cortex-m55,cortex-m7,cortex-m85,cortex-r4,cortex-r4f,cortex-r5,cortex-r52,cortex-r52plus,cortex-r7,cortex-r8,cortex-x1,cortex-x1c,cyclone,ep9312,exynos-m3,exynos-m4,exynos-m5,generic,iwmmxt,krait,kryo,mpcore,mpcorenovfp,neoverse-n1,neoverse-n2,neoverse-v1,sc000,sc300,star-mc1,star-mc3,strongarm,strongarm110,strongarm1100,strongarm1110,swift,xscale"), + // TargetArch_arm64: + str_lit("a64fx,ampere1,ampere1a,ampere1b,ampere1c,apple-a10,apple-a11,apple-a12,apple-a13,apple-a14,apple-a15,apple-a16,apple-a17,apple-a18,apple-a19,apple-a7,apple-a8,apple-a9,apple-m1,apple-m2,apple-m3,apple-m4,apple-m5,apple-s10,apple-s4,apple-s5,apple-s6,apple-s7,apple-s8,apple-s9,c1-nano,c1-premium,c1-pro,c1-ultra,carmel,cobalt-100,cortex-a320,cortex-a34,cortex-a35,cortex-a510,cortex-a520,cortex-a520ae,cortex-a53,cortex-a55,cortex-a57,cortex-a65,cortex-a65ae,cortex-a710,cortex-a715,cortex-a72,cortex-a720,cortex-a720ae,cortex-a725,cortex-a73,cortex-a75,cortex-a76,cortex-a76ae,cortex-a77,cortex-a78,cortex-a78ae,cortex-a78c,cortex-r82,cortex-r82ae,cortex-x1,cortex-x1c,cortex-x2,cortex-x3,cortex-x4,cortex-x925,cyclone,exynos-m3,exynos-m4,exynos-m5,falkor,fujitsu-monaka,gb10,generic,grace,kryo,neoverse-512tvb,neoverse-e1,neoverse-n1,neoverse-n2,neoverse-n3,neoverse-v1,neoverse-v2,neoverse-v3,neoverse-v3ae,olympus,oryon-1,saphira,thunderx,thunderx2t99,thunderx3t110,thunderxt81,thunderxt83,thunderxt88,tsv110"), + // TargetArch_wasm32: + str_lit("bleeding-edge,generic,lime1,mvp"), + // TargetArch_wasm64p32: + str_lit("bleeding-edge,generic,lime1,mvp"), + // TargetArch_riscv64: + str_lit("andes-45-series,andes-a25,andes-a45,andes-ax25,andes-ax45,andes-ax45mpv,andes-n45,andes-nx45,generic,generic-ooo,generic-rv32,generic-rv64,mips-p8700,rocket,rocket-rv32,rocket-rv64,rp2350-hazard3,sifive-7-series,sifive-e20,sifive-e21,sifive-e24,sifive-e31,sifive-e34,sifive-e76,sifive-p450,sifive-p470,sifive-p550,sifive-p670,sifive-p870,sifive-s21,sifive-s51,sifive-s54,sifive-s76,sifive-u54,sifive-u74,sifive-x280,sifive-x390,spacemit-x60,syntacore-scr1-base,syntacore-scr1-max,syntacore-scr3-rv32,syntacore-scr3-rv64,syntacore-scr4-rv32,syntacore-scr4-rv64,syntacore-scr5-rv32,syntacore-scr5-rv64,syntacore-scr7,tt-ascalon-d8,veyron-v1,xiangshan-kunminghu,xiangshan-nanhu"), +}; + +// Generated with the featuregen script in `misc/featuregen` +gb_global String target_features_list[TargetArch_COUNT] = { + // TargetArch_Invalid: + str_lit(""), + // TargetArch_amd64: + str_lit("16bit-mode,32bit-mode,64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-avx512,amx-bf16,amx-complex,amx-fp16,amx-fp8,amx-int8,amx-movrs,amx-tf32,amx-tile,avx,avx10.1,avx10.1-512,avx10.2,avx10.2-512,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,branch-hint,branchfusion,ccmp,cf,cldemote,clflushopt,clwb,clzero,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,ermsb,evex512,f16c,false-deps-getmant,false-deps-lzcnt-tzcnt,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-popcnt,false-deps-range,fast-11bytenop,fast-15bytenop,fast-7bytenop,fast-bextr,fast-dpwssd,fast-gather,fast-hops,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fast-vector-shift-masks,faster-shift-than-shuffle,fma,fma4,fsgsbase,fsrm,fxsr,gfni,harden-sls-ijmp,harden-sls-ret,hreset,idivl-to-divb,idivq-to-divl,inline-asm-use-gpr32,invpcid,kl,lea-sp,lea-uses-ag,lvi-cfi,lvi-load-hardening,lwp,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,mwaitx,ndd,nf,no-bypass-delay,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pad-short-functions,pclmul,pconfig,pku,popcnt,ppx,prefer-128-bit,prefer-256-bit,prefer-legacy-setcc,prefer-mask-registers,prefer-movmsk-over-vtest,prefer-no-gather,prefer-no-scatter,prefetchi,prfchw,ptwrite,push2pop2,raoint,rdpid,rdpru,rdrnd,rdseed,retpoline,retpoline-external-thunk,retpoline-indirect-branches,retpoline-indirect-calls,rtm,sahf,sbb-dep-breaking,serialize,seses,sgx,sha,sha512,shstk,slow-3ops-lea,slow-incdec,slow-lea,slow-pmaddwd,slow-pmulld,slow-pmullq,slow-shld,slow-two-mem-ops,slow-unaligned-mem-16,slow-unaligned-mem-32,sm3,sm4,soft-float,sse,sse-unaligned-mem,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tagged-globals,tbm,tsxldtrk,tuning-fast-imm-vector-shift,uintr,use-glm-div-sqrt-costs,use-slm-arith-costs,usermsr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,widekl,x32,x87,xop,xsave,xsavec,xsaveopt,xsaves,zu"), + // TargetArch_i386: + str_lit("16bit-mode,32bit-mode,64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-avx512,amx-bf16,amx-complex,amx-fp16,amx-fp8,amx-int8,amx-movrs,amx-tf32,amx-tile,avx,avx10.1,avx10.1-512,avx10.2,avx10.2-512,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,branch-hint,branchfusion,ccmp,cf,cldemote,clflushopt,clwb,clzero,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,ermsb,evex512,f16c,false-deps-getmant,false-deps-lzcnt-tzcnt,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-popcnt,false-deps-range,fast-11bytenop,fast-15bytenop,fast-7bytenop,fast-bextr,fast-dpwssd,fast-gather,fast-hops,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fast-vector-shift-masks,faster-shift-than-shuffle,fma,fma4,fsgsbase,fsrm,fxsr,gfni,harden-sls-ijmp,harden-sls-ret,hreset,idivl-to-divb,idivq-to-divl,inline-asm-use-gpr32,invpcid,kl,lea-sp,lea-uses-ag,lvi-cfi,lvi-load-hardening,lwp,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,mwaitx,ndd,nf,no-bypass-delay,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pad-short-functions,pclmul,pconfig,pku,popcnt,ppx,prefer-128-bit,prefer-256-bit,prefer-legacy-setcc,prefer-mask-registers,prefer-movmsk-over-vtest,prefer-no-gather,prefer-no-scatter,prefetchi,prfchw,ptwrite,push2pop2,raoint,rdpid,rdpru,rdrnd,rdseed,retpoline,retpoline-external-thunk,retpoline-indirect-branches,retpoline-indirect-calls,rtm,sahf,sbb-dep-breaking,serialize,seses,sgx,sha,sha512,shstk,slow-3ops-lea,slow-incdec,slow-lea,slow-pmaddwd,slow-pmulld,slow-pmullq,slow-shld,slow-two-mem-ops,slow-unaligned-mem-16,slow-unaligned-mem-32,sm3,sm4,soft-float,sse,sse-unaligned-mem,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tagged-globals,tbm,tsxldtrk,tuning-fast-imm-vector-shift,uintr,use-glm-div-sqrt-costs,use-slm-arith-costs,usermsr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,widekl,x32,x87,xop,xsave,xsavec,xsaveopt,xsaves,zu"), + // TargetArch_arm32: + str_lit("32bit,8msecext,a12,a15,a17,a32,a35,a5,a53,a55,a57,a7,a72,a73,a75,a76,a77,a78c,a8,a9,aapcs-frame-chain,aclass,acquire-release,aes,armv4,armv4t,armv5t,armv5te,armv5tej,armv6,armv6-m,armv6j,armv6k,armv6kz,armv6s-m,armv6t2,armv7-a,armv7-m,armv7-r,armv7e-m,armv7k,armv7s,armv7ve,armv8-a,armv8-m.base,armv8-m.main,armv8-r,armv8.1-a,armv8.1-m.main,armv8.2-a,armv8.3-a,armv8.4-a,armv8.5-a,armv8.6-a,armv8.7-a,armv8.8-a,armv8.9-a,armv9-a,armv9.1-a,armv9.2-a,armv9.3-a,armv9.4-a,armv9.5-a,armv9.6-a,armv9.7-a,atomics-32,avoid-movs-shop,avoid-muls,avoid-partial-cpsr,bf16,big-endian-instructions,branch-align-64,cde,cdecp0,cdecp1,cdecp2,cdecp3,cdecp4,cdecp5,cdecp6,cdecp7,cheap-predicable-cpsr,clrbhb,cortex-a510,cortex-a710,cortex-a78,cortex-a78ae,cortex-x1,cortex-x1c,crc,crypto,d32,db,dfb,disable-postra-scheduler,dont-widen-vmovs,dotprod,dsp,execute-only,expand-fp-mlx,exynos,fix-cmse-cve-2021-35465,fix-cortex-a57-aes-1742098,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp16fml,fp64,fpao,fpregs,fpregs16,fpregs64,fullfp16,fuse-aes,fuse-literals,harden-sls-blr,harden-sls-nocomdat,harden-sls-retbr,hwdiv,hwdiv-arm,i8mm,iwmmxt,iwmmxt2,krait,kryo,lob,long-calls,loop-align,m3,m55,m7,m85,mclass,mp,muxed-units,mve,mve.fp,mve1beat,mve2beat,mve4beat,neon,neon-fpmovs,neonfp,neoverse-v1,no-branch-predictor,no-bti-at-return-twice,no-movt,no-neg-immediates,noarm,nonpipelined-vfp,pacbti,perfmon,prefer-ishst,prefer-vmovsr,prof-unpr,r4,r5,r52,r52plus,r7,ras,rclass,read-tp-tpidrprw,read-tp-tpidruro,read-tp-tpidrurw,reserve-r9,ret-addr-stack,sb,sha2,slow-fp-brcc,slow-load-D-subreg,slow-odd-reg,slow-vdup32,slow-vgetlni32,slowfpvfmx,slowfpvmlx,soft-float,splat-vfp-neon,strict-align,swift,thumb-mode,thumb2,trustzone,use-mipipeliner,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.1m.main,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8.9a,v8m,v8m.main,v9.1a,v9.2a,v9.3a,v9.4a,v9.5a,v9.6a,v9.7a,v9a,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,vldn-align,vmlx-forwarding,vmlx-hazards,wide-stride-vfp,xscale,zcz"), + // TargetArch_arm64: + str_lit("CONTEXTIDREL2,a320,a35,a510,a520,a520ae,a53,a55,a57,a64fx,a65,a710,a715,a72,a720,a720ae,a73,a75,a76,a77,a78,a78ae,a78c,addr-lsl-slow-14,aes,aggressive-fma,aggressive-interleaving,all,alternate-sextload-cvt-f32-pattern,altnzcv,alu-lsl-fast,am,ampere1,ampere1a,ampere1b,ampere1c,amvs,apple-a10,apple-a11,apple-a12,apple-a13,apple-a14,apple-a15,apple-a16,apple-a17,apple-a7,apple-m4,apple-m5,arith-bcc-fusion,arith-cbz-fusion,ascend-store-address,avoid-ldapur,balance-fp-ops,bf16,brbe,bti,btie,c1-nano,c1-premium,c1-pro,c1-ultra,call-saved-x10,call-saved-x11,call-saved-x12,call-saved-x13,call-saved-x14,call-saved-x15,call-saved-x18,call-saved-x8,call-saved-x9,carmel,ccdp,ccidx,ccpp,chk,clrbhb,cmh,cmp-bcc-fusion,cmpbr,complxnum,cortex-a725,cortex-r82,cortex-r82ae,cortex-x1,cortex-x2,cortex-x3,cortex-x4,cortex-x925,cpa,crc,crypto,cssc,d128,disable-fast-inc-vl,disable-latency-sched-heuristic,disable-ldp,disable-maximize-scalable-bandwidth,disable-stp,disable-unpredicated-ld-st-lower,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,execute-only,exynos-cheap-as-move,exynosm3,exynosm4,f16f32dot,f16f32mm,f16mm,f32mm,f64mm,f8f16mm,f8f32mm,falkor,faminmax,fgt,fix-cortex-a53-835769,flagm,fmv,force-32bit-jump-tables,fp-armv8,fp16fml,fp8,fp8dot2,fp8dot4,fp8fma,fpac,fprcvt,fptoint,fujitsu-monaka,fullfp16,fuse-address,fuse-addsub-2reg-const1,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-cset,fuse-literals,gcie,gcs,harden-sls-blr,harden-sls-nocomdat,harden-sls-retbr,hbc,hcx,i8mm,ite,jsconv,kryo,ldp-aligned-only,lor,ls64,lscp,lse,lse128,lse2,lsfe,lsui,lut,max-interleave-factor-4,mec,mops,mops-go,mpam,mpamv2,mte,mtetc,neon,neoverse512tvb,neoversee1,neoversen1,neoversen2,neoversen3,neoversev1,neoversev2,neoversev3,neoversev3AE,nmi,no-bti-at-return-twice,no-neg-immediates,no-sve-fp-ld1r,no-zcz-fpr64,nv,occmo,olympus,oryon-1,outline-atomics,pan,pan-rwv,pauth,pauth-lr,pcdphint,perfmon,poe2,pops,predictable-select-expensive,predres,prfm-slc-target,rand,ras,rasv2,rcpc,rcpc-immo,rcpc3,rdm,reserve-lr-for-ra,reserve-x1,reserve-x10,reserve-x11,reserve-x12,reserve-x13,reserve-x14,reserve-x15,reserve-x18,reserve-x2,reserve-x20,reserve-x21,reserve-x22,reserve-x23,reserve-x24,reserve-x25,reserve-x26,reserve-x27,reserve-x28,reserve-x3,reserve-x4,reserve-x5,reserve-x6,reserve-x7,reserve-x9,rme,saphira,sb,sel2,sha2,sha3,slow-misaligned-128store,slow-paired-128,slow-strqro-store,sm4,sme,sme-b16b16,sme-f16f16,sme-f64f64,sme-f8f16,sme-f8f32,sme-fa64,sme-i16i64,sme-lutv2,sme-mop4,sme-tmop,sme2,sme2p1,sme2p2,sme2p3,spe,spe-eef,specres2,specrestrict,ssbs,ssve-aes,ssve-bitperm,ssve-fexpa,ssve-fp8dot2,ssve-fp8dot4,ssve-fp8fma,store-pair-suppress,stp-aligned-only,strict-align,sve,sve-aes,sve-aes2,sve-b16b16,sve-b16mm,sve-bfscale,sve-bitperm,sve-f16f32mm,sve-sha3,sve-sm4,sve2,sve2-aes,sve2-bitperm,sve2-sha3,sve2-sm4,sve2p1,sve2p2,sve2p3,tagged-globals,tev,the,thunderx,thunderx2t99,thunderx3t110,thunderxt81,thunderxt83,thunderxt88,tlb-rmi,tlbid,tlbiw,tpidr-el1,tpidr-el2,tpidr-el3,tpidrro-el0,tracev8.4,trbe,tsv110,uaops,use-experimental-zeroing-pseudos,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,use-reciprocal-square-root,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8.9a,v8a,v8r,v9.1a,v9.2a,v9.3a,v9.4a,v9.5a,v9.6a,v9.7a,v9a,vh,wfxt,xs,zcm-fpr128,zcm-fpr32,zcm-fpr64,zcm-gpr32,zcm-gpr64,zcz-fp-workaround,zcz-fpr128,zcz-gpr32,zcz-gpr64"), + // TargetArch_wasm32: + str_lit("atomics,bulk-memory,bulk-memory-opt,call-indirect-overlong,exception-handling,extended-const,fp16,gc,multimemory,multivalue,mutable-globals,nontrapping-fptoint,reference-types,relaxed-simd,sign-ext,simd128,tail-call,wide-arithmetic"), + // TargetArch_wasm64p32: + str_lit("atomics,bulk-memory,bulk-memory-opt,call-indirect-overlong,exception-handling,extended-const,fp16,gc,multimemory,multivalue,mutable-globals,nontrapping-fptoint,reference-types,relaxed-simd,sign-ext,simd128,tail-call,wide-arithmetic"), + // TargetArch_riscv64: + str_lit("32bit,64bit,a,add-load-fusion,addi-load-fusion,andes45,auipc-addi-fusion,auipc-load-fusion,b,bfext-fusion,c,conditional-cmv-fusion,d,disable-latency-sched-heuristic,disable-misched-load-clustering,disable-misched-store-clustering,disable-postmisched-load-clustering,disable-postmisched-store-clustering,dlen-factor-2,e,enable-vsetvli-sched-heuristic,exact-asm,experimental,experimental-p,experimental-rvm23u32,experimental-smpmpmt,experimental-svukte,experimental-xrivosvisni,experimental-xrivosvizip,experimental-xsfmclic,experimental-xsfsclic,experimental-zibi,experimental-zicfilp,experimental-zicfiss,experimental-zvbc32e,experimental-zvfbfa,experimental-zvfofp8min,experimental-zvkgs,experimental-zvqdotq,f,forced-atomics,h,i,ld-add-fusion,log-vrgather,lui-addi-fusion,lui-load-fusion,m,mips-p8700,no-default-unroll,no-sink-splat-operands,no-trailing-seq-cst-fence,optimized-nf2-segment-load-store,optimized-nf3-segment-load-store,optimized-nf4-segment-load-store,optimized-nf5-segment-load-store,optimized-nf6-segment-load-store,optimized-nf7-segment-load-store,optimized-nf8-segment-load-store,optimized-zero-stride-load,permissive-zalrsc,predictable-select-expensive,prefer-vsetvli-over-read-vlenb,prefer-w-inst,q,relax,reserve-x1,reserve-x10,reserve-x11,reserve-x12,reserve-x13,reserve-x14,reserve-x15,reserve-x16,reserve-x17,reserve-x18,reserve-x19,reserve-x2,reserve-x20,reserve-x21,reserve-x22,reserve-x23,reserve-x24,reserve-x25,reserve-x26,reserve-x27,reserve-x28,reserve-x29,reserve-x3,reserve-x30,reserve-x31,reserve-x4,reserve-x5,reserve-x6,reserve-x7,reserve-x8,reserve-x9,rva20s64,rva20u64,rva22s64,rva22u64,rva23s64,rva23u64,rvb23s64,rvb23u64,rvi20u32,rvi20u64,save-restore,sdext,sdtrig,sha,shcounterenw,shgatpa,shifted-zextw-fusion,shlcofideleg,short-forward-branch-ialu,short-forward-branch-iload,short-forward-branch-iminmax,short-forward-branch-imul,shtvala,shvsatpa,shvstvala,shvstvecd,shxadd-load-fusion,sifive7,single-element-vec-fp64,smaia,smcdeleg,smcntrpmf,smcsrind,smctr,smdbltrp,smepmp,smmpm,smnpm,smrnmi,smstateen,ssaia,ssccfg,ssccptr,sscofpmf,sscounterenw,sscsrind,ssctr,ssdbltrp,ssnpm,sspm,ssqosid,ssstateen,ssstrict,sstc,sstvala,sstvecd,ssu64xl,supm,svade,svadu,svbare,svinval,svnapot,svpbmt,svvptc,tagged-globals,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,v,ventana-veyron,vl-dependent-latency,vxrm-pipeline-flush,xandesbfhcvt,xandesperf,xandesvbfhcvt,xandesvdot,xandesvpackfph,xandesvsinth,xandesvsintload,xcvalu,xcvbi,xcvbitmanip,xcvelw,xcvmac,xcvmem,xcvsimd,xmipscbop,xmipscmov,xmipsexectl,xmipslsp,xqccmp,xqci,xqcia,xqciac,xqcibi,xqcibm,xqcicli,xqcicm,xqcics,xqcicsr,xqciint,xqciio,xqcilb,xqcili,xqcilia,xqcilo,xqcilsm,xqcisim,xqcisls,xqcisync,xsfcease,xsfmm128t,xsfmm16t,xsfmm32a16f,xsfmm32a32f,xsfmm32a8f,xsfmm32a8i,xsfmm32t,xsfmm64a64f,xsfmm64t,xsfmmbase,xsfvcp,xsfvfbfexp16e,xsfvfexp16e,xsfvfexp32e,xsfvfexpa,xsfvfexpa64e,xsfvfnrclipxfqf,xsfvfwmaccqqq,xsfvqmaccdod,xsfvqmaccqoq,xsifivecdiscarddlone,xsifivecflushdlone,xsmtvdot,xtheadba,xtheadbb,xtheadbs,xtheadcmo,xtheadcondmov,xtheadfmemidx,xtheadmac,xtheadmemidx,xtheadmempair,xtheadsync,xtheadvdot,xventanacondops,xwchc,za128rs,za64rs,zaamo,zabha,zacas,zalasr,zalrsc,zama16b,zawrs,zba,zbb,zbc,zbkb,zbkc,zbkx,zbs,zca,zcb,zcd,zce,zcf,zclsd,zcmop,zcmp,zcmt,zdinx,zexth-fusion,zextw-fusion,zfa,zfbfmin,zfh,zfhmin,zfinx,zhinx,zhinxmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccamoc,ziccif,zicclsm,ziccrse,zicntr,zicond,zicsr,zifencei,zihintntl,zihintpause,zihpm,zilsd,zilsd-4byte-align,zimop,zk,zkn,zknd,zkne,zknh,zkr,zks,zksed,zksh,zkt,zmmul,ztso,zvbb,zvbc,zve32f,zve32x,zve64d,zve64f,zve64x,zvfbfmin,zvfbfwma,zvfh,zvfhmin,zvkb,zvkg,zvkn,zvknc,zvkned,zvkng,zvknha,zvknhb,zvks,zvksc,zvksed,zvksg,zvksh,zvkt,zvl1024b,zvl128b,zvl16384b,zvl2048b,zvl256b,zvl32768b,zvl32b,zvl4096b,zvl512b,zvl64b,zvl65536b,zvl8192b"), +}; + +// Generated with the featuregen script in `misc/featuregen` +gb_global int target_microarch_counts[TargetArch_COUNT] = { + // TargetArch_Invalid: + 0, + // TargetArch_amd64: + 131, + // TargetArch_i386: + 131, + // TargetArch_arm32: + 96, + // TargetArch_arm64: + 98, + // TargetArch_wasm32: + 4, + // TargetArch_wasm64p32: + 4, + // TargetArch_riscv64: + 51, +}; + +// Generated with the featuregen script in `misc/featuregen` +gb_global MicroarchFeatureList microarch_features_list[] = { + // TargetArch_amd64: + { str_lit("alderlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("amdfam10"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,idivq-to-divl,lzcnt,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,vzeroupper,x87") }, + { str_lit("arrowlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("arrowlake-s"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("arrowlake_s"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("athlon"), str_lit("64bit-mode,cmov,cx8,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-4"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-fx"), str_lit("64bit,64bit-mode,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-mp"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-tbird"), str_lit("64bit-mode,cmov,cx8,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-xp"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon64"), str_lit("64bit,64bit-mode,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon64-sse3"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("atom"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-imm16,fxsr,idivl-to-divb,idivq-to-divl,lea-sp,lea-uses-ag,mmx,movbe,no-bypass-delay,nopl,pad-short-functions,sahf,slow-two-mem-ops,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("atom_sse4_2"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("atom_sse4_2_movbe"), str_lit("64bit,64bit-mode,aes,clflushopt,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fsgsbase,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("barcelona"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,idivq-to-divl,lzcnt,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,vzeroupper,x87") }, + { str_lit("bdver1"), str_lit("64bit,64bit-mode,aes,avx,branchfusion,cmov,crc32,cx16,cx8,fast-11bytenop,fast-scalar-shift-masks,fma4,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,x87,xop,xsave") }, + { str_lit("bdver2"), str_lit("64bit,64bit-mode,aes,avx,bmi,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave") }, + { str_lit("bdver3"), str_lit("64bit,64bit-mode,aes,avx,bmi,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fsgsbase,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave,xsaveopt") }, + { str_lit("bdver4"), str_lit("64bit,64bit-mode,aes,avx,avx2,bmi,bmi2,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fsgsbase,fxsr,idivq-to-divl,lwp,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave,xsaveopt") }, + { str_lit("bonnell"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-imm16,fxsr,idivl-to-divb,idivq-to-divl,lea-sp,lea-uses-ag,mmx,movbe,no-bypass-delay,nopl,pad-short-functions,sahf,slow-two-mem-ops,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("broadwell"), str_lit("64bit,64bit-mode,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("btver1"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-15bytenop,fast-imm16,fast-scalar-shift-masks,fast-vector-shift-masks,fxsr,idivq-to-divl,lzcnt,mmx,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,ssse3,vzeroupper,x87") }, + { str_lit("btver2"), str_lit("64bit,64bit-mode,aes,avx,bmi,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-hops,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-shift-masks,fast-vector-shift-masks,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,x87,xsave,xsaveopt") }, + { str_lit("c3"), str_lit("64bit-mode,mmx,prfchw,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("c3-2"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("cannonlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vl,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,sha,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("cascadelake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,avx512vnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("clearwaterforest"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,usermsr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("cooperlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,avx512vnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("core-avx-i"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core-avx2"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core2"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("core_2_duo_sse4_1"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,sse4.1,ssse3,vzeroupper,x87") }, + { str_lit("core_2_duo_ssse3"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("core_2nd_gen_avx"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_3rd_gen_avx"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_4th_gen_avx"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_4th_gen_avx_tsx"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_5th_gen_avx"), str_lit("64bit,64bit-mode,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_5th_gen_avx_tsx"), str_lit("64bit,64bit-mode,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_aes_pclmulqdq"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("core_i7_sse4_2"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("corei7"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("corei7-avx"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("diamondrapids"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-avx512,amx-bf16,amx-complex,amx-fp16,amx-fp8,amx-int8,amx-movrs,amx-tf32,amx-tile,avx,avx10.1,avx10.2,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,branch-hint,ccmp,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,ndd,nf,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,ppx,prefer-256-bit,prefetchi,prfchw,ptwrite,push2pop2,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves,zu") }, + { str_lit("emeraldrapids"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-bf16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("generic"), str_lit("64bit,64bit-mode,cx8,fast-15bytenop,fast-scalar-fsqrt,idivq-to-divl,macrofusion,slow-3ops-lea,sse,sse2,vzeroupper,x87") }, + { str_lit("geode"), str_lit("64bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("goldmont"), str_lit("64bit,64bit-mode,aes,clflushopt,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("goldmont-plus"), str_lit("64bit,64bit-mode,aes,clflushopt,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("goldmont_plus"), str_lit("64bit,64bit-mode,aes,clflushopt,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("gracemont"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("grandridge"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-bf16,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids-d"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-bf16,amx-complex,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids_d"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-bf16,amx-complex,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("haswell"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("i386"), str_lit("64bit-mode,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("i486"), str_lit("64bit-mode,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("i586"), str_lit("64bit-mode,cx8,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("i686"), str_lit("64bit-mode,cmov,cx8,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("icelake-client"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake-server"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake_client"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake_server"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("ivybridge"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("k6"), str_lit("64bit-mode,cx8,mmx,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("k6-2"), str_lit("64bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("k6-3"), str_lit("64bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("k8"), str_lit("64bit,64bit-mode,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("k8-sse3"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("knl"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avx512cd,avx512f,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("knm"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avx512cd,avx512f,avx512vpopcntdq,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("lakemont"), str_lit("64bit-mode,cx8,slow-unaligned-mem-16,sse,sse2,vzeroupper") }, + { str_lit("lunarlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("meteorlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("mic_avx512"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avx512cd,avx512f,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("nehalem"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("nocona"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("novalake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx10.1,avx10.2,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,ccmp,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,ndd,nf,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,ppx,prefer-movmsk-over-vtest,prefetchi,prfchw,ptwrite,push2pop2,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves,zu") }, + { str_lit("opteron"), str_lit("64bit,64bit-mode,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("opteron-sse3"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("pantherlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("penryn"), str_lit("64bit,64bit-mode,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,sse4.1,ssse3,vzeroupper,x87") }, + { str_lit("pentium"), str_lit("64bit-mode,cx8,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium-m"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium-mmx"), str_lit("64bit-mode,cx8,mmx,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium2"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium3"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium3m"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium4"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium4m"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_4"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_4_sse3"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("pentium_ii"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_iii"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_iii_no_xmm_regs"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_m"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_mmx"), str_lit("64bit-mode,cx8,mmx,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_pro"), str_lit("64bit-mode,cmov,cx8,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentiumpro"), str_lit("64bit-mode,cmov,cx8,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("prescott"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("raptorlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("rocketlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("sandybridge"), str_lit("64bit,64bit-mode,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("sapphirerapids"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,amx-bf16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("sierraforest"), str_lit("64bit,64bit-mode,adx,aes,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("silvermont"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("skx"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake-avx512"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake_avx512"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("slm"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("tigerlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("tremont"), str_lit("64bit,64bit-mode,aes,clflushopt,clwb,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,gfni,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("westmere"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("wildcatlake"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("winchip-c6"), str_lit("64bit-mode,mmx,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("winchip2"), str_lit("64bit-mode,mmx,prfchw,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("x86-64"), str_lit("64bit,64bit-mode,cmov,cx8,fxsr,idivq-to-divl,macrofusion,mmx,nopl,slow-3ops-lea,slow-incdec,sse,sse2,vzeroupper,x87") }, + { str_lit("x86-64-v2"), str_lit("64bit,64bit-mode,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,nopl,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("x86-64-v3"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fxsr,idivq-to-divl,lzcnt,macrofusion,mmx,movbe,nopl,popcnt,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave") }, + { str_lit("x86-64-v4"), str_lit("64bit,64bit-mode,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fxsr,idivq-to-divl,lzcnt,macrofusion,mmx,movbe,nopl,popcnt,prefer-256-bit,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave") }, + { str_lit("yonah"), str_lit("64bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("znver1"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver2"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver3"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,mwaitx,nopl,pclmul,pku,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver4"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-dpwssd,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,mwaitx,nopl,pclmul,pku,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,shstk,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver5"), str_lit("64bit,64bit-mode,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,avxvnni,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-dpwssd,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,mwaitx,nopl,pclmul,pku,popcnt,prefetchi,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,shstk,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + // TargetArch_i386: + { str_lit("alderlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("amdfam10"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,idivq-to-divl,lzcnt,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,vzeroupper,x87") }, + { str_lit("arrowlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("arrowlake-s"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("arrowlake_s"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("athlon"), str_lit("32bit-mode,cmov,cx8,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("athlon-4"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("athlon-fx"), str_lit("32bit-mode,64bit,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon-mp"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("athlon-tbird"), str_lit("32bit-mode,cmov,cx8,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("athlon-xp"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,prfchw,slow-shld,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("athlon64"), str_lit("32bit-mode,64bit,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("athlon64-sse3"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("atom"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-imm16,fxsr,idivl-to-divb,idivq-to-divl,lea-sp,lea-uses-ag,mmx,movbe,no-bypass-delay,nopl,pad-short-functions,sahf,slow-two-mem-ops,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("atom_sse4_2"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("atom_sse4_2_movbe"), str_lit("32bit-mode,64bit,aes,clflushopt,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fsgsbase,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("barcelona"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,idivq-to-divl,lzcnt,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,vzeroupper,x87") }, + { str_lit("bdver1"), str_lit("32bit-mode,64bit,aes,avx,branchfusion,cmov,crc32,cx16,cx8,fast-11bytenop,fast-scalar-shift-masks,fma4,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,x87,xop,xsave") }, + { str_lit("bdver2"), str_lit("32bit-mode,64bit,aes,avx,bmi,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave") }, + { str_lit("bdver3"), str_lit("32bit-mode,64bit,aes,avx,bmi,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fsgsbase,fxsr,idivq-to-divl,lwp,lzcnt,mmx,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave,xsaveopt") }, + { str_lit("bdver4"), str_lit("32bit-mode,64bit,aes,avx,avx2,bmi,bmi2,branchfusion,cmov,crc32,cx16,cx8,f16c,fast-11bytenop,fast-bextr,fast-movbe,fast-scalar-shift-masks,fma,fma4,fsgsbase,fxsr,idivq-to-divl,lwp,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,tbm,vzeroupper,x87,xop,xsave,xsaveopt") }, + { str_lit("bonnell"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-imm16,fxsr,idivl-to-divb,idivq-to-divl,lea-sp,lea-uses-ag,mmx,movbe,no-bypass-delay,nopl,pad-short-functions,sahf,slow-two-mem-ops,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("broadwell"), str_lit("32bit-mode,64bit,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("btver1"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-15bytenop,fast-imm16,fast-scalar-shift-masks,fast-vector-shift-masks,fxsr,idivq-to-divl,lzcnt,mmx,nopl,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4a,ssse3,vzeroupper,x87") }, + { str_lit("btver2"), str_lit("32bit-mode,64bit,aes,avx,bmi,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-hops,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-shift-masks,fast-vector-shift-masks,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prfchw,sahf,sbb-dep-breaking,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,x87,xsave,xsaveopt") }, + { str_lit("c3"), str_lit("32bit-mode,mmx,prfchw,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("c3-2"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("cannonlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vl,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,sha,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("cascadelake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,avx512vnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("clearwaterforest"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,usermsr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("cooperlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,avx512vnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("core-avx-i"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core-avx2"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core2"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("core_2_duo_sse4_1"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,sse4.1,ssse3,vzeroupper,x87") }, + { str_lit("core_2_duo_ssse3"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,ssse3,vzeroupper,x87") }, + { str_lit("core_2nd_gen_avx"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_3rd_gen_avx"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_4th_gen_avx"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_4th_gen_avx_tsx"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_5th_gen_avx"), str_lit("32bit-mode,64bit,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_5th_gen_avx_tsx"), str_lit("32bit-mode,64bit,adx,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("core_aes_pclmulqdq"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("core_i7_sse4_2"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("corei7"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("corei7-avx"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("diamondrapids"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-avx512,amx-bf16,amx-complex,amx-fp16,amx-fp8,amx-int8,amx-movrs,amx-tf32,amx-tile,avx,avx10.1,avx10.2,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,branch-hint,ccmp,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,ndd,nf,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,ppx,prefer-256-bit,prefetchi,prfchw,ptwrite,push2pop2,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves,zu") }, + { str_lit("emeraldrapids"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-bf16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("generic"), str_lit("32bit-mode,64bit,cx8,fast-15bytenop,fast-scalar-fsqrt,idivq-to-divl,macrofusion,slow-3ops-lea,vzeroupper,x87") }, + { str_lit("geode"), str_lit("32bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("goldmont"), str_lit("32bit-mode,64bit,aes,clflushopt,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("goldmont-plus"), str_lit("32bit-mode,64bit,aes,clflushopt,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("goldmont_plus"), str_lit("32bit-mode,64bit,aes,clflushopt,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("gracemont"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("grandridge"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-bf16,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids-d"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-bf16,amx-complex,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("graniterapids_d"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-bf16,amx-complex,amx-fp16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,branch-hint,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prefetchi,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("haswell"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("i386"), str_lit("32bit-mode,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("i486"), str_lit("32bit-mode,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("i586"), str_lit("32bit-mode,cx8,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("i686"), str_lit("32bit-mode,cmov,cx8,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("icelake-client"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake-server"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake_client"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("icelake_server"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("ivybridge"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fsgsbase,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,rdrnd,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("k6"), str_lit("32bit-mode,cx8,mmx,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("k6-2"), str_lit("32bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("k6-3"), str_lit("32bit-mode,cx8,mmx,prfchw,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("k8"), str_lit("32bit-mode,64bit,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("k8-sse3"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("knl"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avx512cd,avx512f,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("knm"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avx512cd,avx512f,avx512vpopcntdq,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("lakemont"), str_lit("32bit-mode,cx8,slow-unaligned-mem-16,vzeroupper") }, + { str_lit("lunarlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("meteorlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("mic_avx512"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avx512cd,avx512f,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,fast-gather,fast-imm16,fast-movbe,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,nopl,pclmul,popcnt,prefer-mask-registers,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,slow-incdec,slow-pmaddwd,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,x87,xsave,xsaveopt") }, + { str_lit("nehalem"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("nocona"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("novalake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx10.1,avx10.2,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,ccmp,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,egpr,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,movrs,ndd,nf,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,ppx,prefer-movmsk-over-vtest,prefetchi,prfchw,ptwrite,push2pop2,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves,zu") }, + { str_lit("opteron"), str_lit("32bit-mode,64bit,cmov,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("opteron-sse3"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fast-scalar-shift-masks,fxsr,mmx,nopl,prfchw,sbb-dep-breaking,slow-shld,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("pantherlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("penryn"), str_lit("32bit-mode,64bit,cmov,cx16,cx8,fxsr,macrofusion,mmx,nopl,sahf,slow-unaligned-mem-16,sse,sse2,sse3,sse4.1,ssse3,vzeroupper,x87") }, + { str_lit("pentium"), str_lit("32bit-mode,cx8,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentium-m"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium-mmx"), str_lit("32bit-mode,cx8,mmx,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentium2"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentium3"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("pentium3m"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("pentium4"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium4m"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_4"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_4_sse3"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("pentium_ii"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentium_iii"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("pentium_iii_no_xmm_regs"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,vzeroupper,x87") }, + { str_lit("pentium_m"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,vzeroupper,x87") }, + { str_lit("pentium_mmx"), str_lit("32bit-mode,cx8,mmx,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentium_pro"), str_lit("32bit-mode,cmov,cx8,nopl,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("pentiumpro"), str_lit("32bit-mode,cmov,cx8,nopl,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("prescott"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("raptorlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxvnni,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("rocketlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("sandybridge"), str_lit("32bit-mode,64bit,avx,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsaveopt") }, + { str_lit("sapphirerapids"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,amx-bf16,amx-int8,amx-tile,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512fp16,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,avxvnni,bmi,bmi2,cldemote,clflushopt,clwb,cmov,crc32,cx16,cx8,enqcmd,ermsb,f16c,false-deps-getmant,false-deps-mulc,false-deps-mullq,false-deps-perm,false-deps-range,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-256-bit,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tsxldtrk,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("sierraforest"), str_lit("32bit-mode,64bit,adx,aes,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint8,bmi,bmi2,cldemote,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,invpcid,kl,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,nopl,pclmul,pconfig,pku,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,shstk,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,widekl,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("silvermont"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("skx"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,clflushopt,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake-avx512"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("skylake_avx512"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,faster-shift-than-shuffle,fma,fsgsbase,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdrnd,rdseed,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("slm"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-7bytenop,fast-imm16,fast-movbe,fxsr,idivq-to-divl,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,rdrnd,sahf,slow-incdec,slow-lea,slow-pmulld,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-slm-arith-costs,vzeroupper,x87") }, + { str_lit("tigerlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,bmi,bmi2,clflushopt,clwb,cmov,crc32,cx16,cx8,ermsb,f16c,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pku,popcnt,prefer-256-bit,prfchw,rdpid,rdrnd,rdseed,sahf,sha,shstk,slow-pmullq,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,vaes,vpclmulqdq,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("tremont"), str_lit("32bit-mode,64bit,aes,clflushopt,clwb,cmov,crc32,cx16,cx8,fast-imm16,fast-movbe,fsgsbase,fxsr,gfni,mmx,movbe,no-bypass-delay,nopl,pclmul,popcnt,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,sha,slow-incdec,slow-lea,slow-two-mem-ops,sse,sse2,sse3,sse4.1,sse4.2,ssse3,use-glm-div-sqrt-costs,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("westmere"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,fxsr,idivq-to-divl,macrofusion,mmx,no-bypass-delay-mov,nopl,pclmul,popcnt,sahf,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("wildcatlake"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avxifma,avxneconvert,avxvnni,avxvnniint16,avxvnniint8,bmi,bmi2,clflushopt,clwb,cmov,cmpccxadd,crc32,cx16,cx8,enqcmd,f16c,false-deps-perm,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,gfni,hreset,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,no-bypass-delay-blend,no-bypass-delay-mov,no-bypass-delay-shuffle,nopl,pclmul,pconfig,pku,popcnt,prefer-movmsk-over-vtest,prfchw,ptwrite,rdpid,rdrnd,rdseed,sahf,serialize,sha,sha512,shstk,slow-3ops-lea,slow-pmullq,sm3,sm4,sse,sse2,sse3,sse4.1,sse4.2,ssse3,tuning-fast-imm-vector-shift,uintr,vaes,vpclmulqdq,vzeroupper,waitpkg,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("winchip-c6"), str_lit("32bit-mode,mmx,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("winchip2"), str_lit("32bit-mode,mmx,prfchw,slow-unaligned-mem-16,vzeroupper,x87") }, + { str_lit("x86-64"), str_lit("32bit-mode,64bit,cmov,cx8,fxsr,idivq-to-divl,macrofusion,mmx,nopl,slow-3ops-lea,slow-incdec,sse,sse2,vzeroupper,x87") }, + { str_lit("x86-64-v2"), str_lit("32bit-mode,64bit,cmov,crc32,cx16,cx8,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fxsr,idivq-to-divl,macrofusion,mmx,nopl,popcnt,sahf,slow-3ops-lea,slow-unaligned-mem-32,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87") }, + { str_lit("x86-64-v3"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,false-deps-lzcnt-tzcnt,false-deps-popcnt,fast-15bytenop,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fma,fxsr,idivq-to-divl,lzcnt,macrofusion,mmx,movbe,nopl,popcnt,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave") }, + { str_lit("x86-64-v4"), str_lit("32bit-mode,64bit,allow-light-256-bit,avx,avx2,avx512bw,avx512cd,avx512dq,avx512f,avx512vl,bmi,bmi2,cmov,crc32,cx16,cx8,f16c,false-deps-popcnt,fast-15bytenop,fast-gather,fast-scalar-fsqrt,fast-shld-rotate,fast-variable-crosslane-shuffle,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fxsr,idivq-to-divl,lzcnt,macrofusion,mmx,movbe,nopl,popcnt,prefer-256-bit,sahf,slow-3ops-lea,sse,sse2,sse3,sse4.1,sse4.2,ssse3,vzeroupper,x87,xsave") }, + { str_lit("yonah"), str_lit("32bit-mode,cmov,cx8,fxsr,mmx,nopl,slow-unaligned-mem-16,sse,sse2,sse3,vzeroupper,x87") }, + { str_lit("znver1"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver2"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fxsr,idivq-to-divl,lzcnt,mmx,movbe,mwaitx,nopl,pclmul,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,slow-shld,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver3"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,mwaitx,nopl,pclmul,pku,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver4"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vpopcntdq,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-dpwssd,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,mwaitx,nopl,pclmul,pku,popcnt,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,shstk,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + { str_lit("znver5"), str_lit("32bit-mode,64bit,adx,aes,allow-light-256-bit,avx,avx2,avx512bf16,avx512bitalg,avx512bw,avx512cd,avx512dq,avx512f,avx512ifma,avx512vbmi,avx512vbmi2,avx512vl,avx512vnni,avx512vp2intersect,avx512vpopcntdq,avxvnni,bmi,bmi2,branchfusion,clflushopt,clwb,clzero,cmov,crc32,cx16,cx8,f16c,fast-15bytenop,fast-bextr,fast-dpwssd,fast-imm16,fast-lzcnt,fast-movbe,fast-scalar-fsqrt,fast-scalar-shift-masks,fast-variable-perlane-shuffle,fast-vector-fsqrt,fma,fsgsbase,fsrm,fxsr,gfni,idivq-to-divl,invpcid,lzcnt,macrofusion,mmx,movbe,movdir64b,movdiri,mwaitx,nopl,pclmul,pku,popcnt,prefetchi,prfchw,rdpid,rdpru,rdrnd,rdseed,sahf,sbb-dep-breaking,sha,shstk,sse,sse2,sse3,sse4.1,sse4.2,sse4a,ssse3,vaes,vpclmulqdq,vzeroupper,wbnoinvd,x87,xsave,xsavec,xsaveopt,xsaves") }, + // TargetArch_arm32: + { str_lit("arm1020e"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm1020t"), str_lit("armv5t,v4t,v5t") }, + { str_lit("arm1022e"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm10e"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm10tdmi"), str_lit("armv5t,v4t,v5t") }, + { str_lit("arm1136j-s"), str_lit("armv6,dsp,v4t,v5t,v5te,v6") }, + { str_lit("arm1136jf-s"), str_lit("armv6,dsp,fp64,fpregs,fpregs64,slowfpvmlx,v4t,v5t,v5te,v6,vfp2,vfp2sp") }, + { str_lit("arm1156t2-s"), str_lit("armv6t2,dsp,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v8m") }, + { str_lit("arm1156t2f-s"), str_lit("armv6t2,dsp,fp64,fpregs,fpregs64,slowfpvmlx,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v8m,vfp2,vfp2sp") }, + { str_lit("arm1176jz-s"), str_lit("armv6kz,trustzone,v4t,v5t,v5te,v6,v6k") }, + { str_lit("arm1176jzf-s"), str_lit("armv6kz,fp64,fpregs,fpregs64,slowfpvmlx,trustzone,v4t,v5t,v5te,v6,v6k,vfp2,vfp2sp") }, + { str_lit("arm710t"), str_lit("armv4t,v4t") }, + { str_lit("arm720t"), str_lit("armv4t,v4t") }, + { str_lit("arm7tdmi"), str_lit("armv4t,v4t") }, + { str_lit("arm7tdmi-s"), str_lit("armv4t,v4t") }, + { str_lit("arm8"), str_lit("armv4") }, + { str_lit("arm810"), str_lit("armv4") }, + { str_lit("arm9"), str_lit("armv4t,v4t") }, + { str_lit("arm920"), str_lit("armv4t,v4t") }, + { str_lit("arm920t"), str_lit("armv4t,v4t") }, + { str_lit("arm922t"), str_lit("armv4t,v4t") }, + { str_lit("arm926ej-s"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm940t"), str_lit("armv4t,v4t") }, + { str_lit("arm946e-s"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm966e-s"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm968e-s"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm9e"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("arm9tdmi"), str_lit("armv4t,v4t") }, + { str_lit("cortex-a12"), str_lit("a12,aclass,armv7-a,avoid-partial-cpsr,d32,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ret-addr-stack,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,vmlx-forwarding") }, + { str_lit("cortex-a15"), str_lit("a15,aclass,armv7-a,avoid-partial-cpsr,d32,db,dont-widen-vmovs,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,muxed-units,neon,perfmon,ret-addr-stack,splat-vfp-neon,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,vldn-align") }, + { str_lit("cortex-a17"), str_lit("a17,aclass,armv7-a,avoid-partial-cpsr,d32,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ret-addr-stack,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,vmlx-forwarding") }, + { str_lit("cortex-a32"), str_lit("aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a35"), str_lit("a35,aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a5"), str_lit("a5,aclass,armv7-a,d32,db,dsp,fp16,fp64,fpregs,fpregs64,mp,neon,perfmon,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,vmlx-forwarding") }, + { str_lit("cortex-a510"), str_lit("aclass,acquire-release,armv9-a,bf16,cortex-a710,crc,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp16fml,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,i8mm,mp,neon,perfmon,ras,sb,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8m,v9a,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a53"), str_lit("a53,aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpao,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a55"), str_lit("a55,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a57"), str_lit("a57,aclass,acquire-release,aes,armv8-a,avoid-partial-cpsr,cheap-predicable-cpsr,crc,crypto,d32,db,dsp,fix-cortex-a57-aes-1742098,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpao,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a7"), str_lit("a7,aclass,armv7-a,d32,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,vmlx-forwarding,vmlx-hazards") }, + { str_lit("cortex-a710"), str_lit("aclass,acquire-release,armv9-a,bf16,cortex-a710,crc,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp16fml,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,i8mm,mp,neon,perfmon,ras,sb,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8m,v9a,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a72"), str_lit("a72,aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fix-cortex-a57-aes-1742098,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a73"), str_lit("a73,aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a75"), str_lit("a75,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a76"), str_lit("a76,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a76ae"), str_lit("a76,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a77"), str_lit("a77,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a78"), str_lit("aclass,acquire-release,aes,armv8.2-a,cortex-a78,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a78ae"), str_lit("aclass,acquire-release,aes,armv8.2-a,cortex-a78ae,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a78c"), str_lit("a78c,aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-a8"), str_lit("a8,aclass,armv7-a,d32,db,dsp,fp64,fpregs,fpregs64,neon,nonpipelined-vfp,perfmon,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vmlx-forwarding,vmlx-hazards") }, + { str_lit("cortex-a9"), str_lit("a9,aclass,armv7-a,avoid-partial-cpsr,d32,db,dsp,expand-fp-mlx,fp16,fp64,fpregs,fpregs64,mp,muxed-units,neon,neon-fpmovs,perfmon,prefer-vmovsr,ret-addr-stack,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vldn-align,vmlx-forwarding,vmlx-hazards") }, + { str_lit("cortex-m0"), str_lit("armv6-m,db,mclass,no-branch-predictor,noarm,strict-align,thumb-mode,v4t,v5t,v5te,v6,v6m") }, + { str_lit("cortex-m0plus"), str_lit("armv6-m,db,mclass,no-branch-predictor,noarm,strict-align,thumb-mode,v4t,v5t,v5te,v6,v6m") }, + { str_lit("cortex-m1"), str_lit("armv6-m,db,mclass,no-branch-predictor,noarm,strict-align,thumb-mode,v4t,v5t,v5te,v6,v6m") }, + { str_lit("cortex-m23"), str_lit("8msecext,acquire-release,armv8-m.base,db,hwdiv,mclass,no-branch-predictor,no-movt,noarm,strict-align,thumb-mode,v4t,v5t,v5te,v6,v6m,v7clrex,v8m") }, + { str_lit("cortex-m3"), str_lit("armv7-m,db,hwdiv,loop-align,m3,mclass,no-branch-predictor,noarm,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m") }, + { str_lit("cortex-m33"), str_lit("8msecext,acquire-release,armv8-m.main,avoid-muls,db,dsp,fix-cmse-cve-2021-35465,fp-armv8d16sp,fp16,fpregs,hwdiv,loop-align,mclass,no-branch-predictor,noarm,slowfpvfmx,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,v8m.main,vfp2sp,vfp3d16sp,vfp4d16sp") }, + { str_lit("cortex-m35p"), str_lit("8msecext,acquire-release,armv8-m.main,db,dsp,fix-cmse-cve-2021-35465,fp-armv8d16sp,fp16,fpregs,hwdiv,loop-align,mclass,no-branch-predictor,noarm,slowfpvfmx,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,v8m.main,vfp2sp,vfp3d16sp,vfp4d16sp") }, + { str_lit("cortex-m4"), str_lit("armv7e-m,db,dsp,fp16,fpregs,hwdiv,loop-align,mclass,no-branch-predictor,noarm,slowfpvfmx,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2sp,vfp3d16sp,vfp4d16sp") }, + { str_lit("cortex-m52"), str_lit("8msecext,acquire-release,armv8.1-m.main,db,dsp,fp-armv8d16,fp-armv8d16sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,lob,loop-align,mclass,mve,mve.fp,mve1beat,no-branch-predictor,noarm,pacbti,ras,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8.1m.main,v8m,v8m.main,vfp2,vfp2sp,vfp3d16,vfp3d16sp,vfp4d16,vfp4d16sp") }, + { str_lit("cortex-m55"), str_lit("8msecext,acquire-release,armv8.1-m.main,db,dsp,fix-cmse-cve-2021-35465,fp-armv8d16,fp-armv8d16sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,lob,loop-align,m55,mclass,mve,mve.fp,no-branch-predictor,noarm,ras,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8.1m.main,v8m,v8m.main,vfp2,vfp2sp,vfp3d16,vfp3d16sp,vfp4d16,vfp4d16sp") }, + { str_lit("cortex-m7"), str_lit("armv7e-m,branch-align-64,db,dsp,fp-armv8d16,fp-armv8d16sp,fp16,fp64,fpregs,fpregs64,hwdiv,m7,mclass,noarm,thumb-mode,thumb2,use-mipipeliner,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3d16,vfp3d16sp,vfp4d16,vfp4d16sp") }, + { str_lit("cortex-m85"), str_lit("8msecext,acquire-release,armv8.1-m.main,branch-align-64,db,dsp,fp-armv8d16,fp-armv8d16sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,lob,m85,mclass,mve,mve.fp,noarm,pacbti,ras,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8.1m.main,v8m,v8m.main,vfp2,vfp2sp,vfp3d16,vfp3d16sp,vfp4d16,vfp4d16sp") }, + { str_lit("cortex-r4"), str_lit("armv7-r,avoid-partial-cpsr,db,dsp,hwdiv,perfmon,r4,rclass,ret-addr-stack,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m") }, + { str_lit("cortex-r4f"), str_lit("armv7-r,avoid-partial-cpsr,db,dsp,fp64,fpregs,fpregs64,hwdiv,perfmon,r4,rclass,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3d16,vfp3d16sp") }, + { str_lit("cortex-r5"), str_lit("armv7-r,avoid-partial-cpsr,db,dsp,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,perfmon,r5,rclass,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3d16,vfp3d16sp") }, + { str_lit("cortex-r52"), str_lit("acquire-release,armv8-r,crc,d32,db,dfb,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpao,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,r52,rclass,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-r52plus"), str_lit("acquire-release,armv8-r,crc,d32,db,dfb,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpao,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,r52plus,rclass,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-r7"), str_lit("armv7-r,avoid-partial-cpsr,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,perfmon,r7,rclass,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3d16,vfp3d16sp") }, + { str_lit("cortex-r8"), str_lit("armv7-r,avoid-partial-cpsr,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,perfmon,rclass,ret-addr-stack,slow-fp-brcc,slowfpvfmx,slowfpvmlx,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3d16,vfp3d16sp") }, + { str_lit("cortex-x1"), str_lit("aclass,acquire-release,aes,armv8.2-a,cortex-x1,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cortex-x1c"), str_lit("aclass,acquire-release,aes,armv8.2-a,cortex-x1c,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("cyclone"), str_lit("aclass,acquire-release,aes,armv8-a,avoid-movs-shop,avoid-partial-cpsr,crc,crypto,d32,db,disable-postra-scheduler,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,neonfp,perfmon,ret-addr-stack,sha2,slowfpvfmx,slowfpvmlx,swift,thumb2,trustzone,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,zcz") }, + { str_lit("ep9312"), str_lit("armv4t,v4t") }, + { str_lit("exynos-m3"), str_lit("aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dont-widen-vmovs,dsp,expand-fp-mlx,exynos,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,fuse-aes,fuse-literals,hwdiv,hwdiv-arm,mp,neon,perfmon,prof-unpr,ret-addr-stack,sha2,slow-fp-brcc,slow-vdup32,slow-vgetlni32,slowfpvfmx,slowfpvmlx,splat-vfp-neon,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,wide-stride-vfp,zcz") }, + { str_lit("exynos-m4"), str_lit("aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dont-widen-vmovs,dotprod,dsp,expand-fp-mlx,exynos,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,fuse-aes,fuse-literals,hwdiv,hwdiv-arm,mp,neon,perfmon,prof-unpr,ras,ret-addr-stack,sha2,slow-fp-brcc,slow-vdup32,slow-vgetlni32,slowfpvfmx,slowfpvmlx,splat-vfp-neon,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,wide-stride-vfp,zcz") }, + { str_lit("exynos-m5"), str_lit("aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dont-widen-vmovs,dotprod,dsp,expand-fp-mlx,exynos,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,fuse-aes,fuse-literals,hwdiv,hwdiv-arm,mp,neon,perfmon,prof-unpr,ras,ret-addr-stack,sha2,slow-fp-brcc,slow-vdup32,slow-vgetlni32,slowfpvfmx,slowfpvmlx,splat-vfp-neon,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization,wide-stride-vfp,zcz") }, + { str_lit("generic"), str_lit("") }, + { str_lit("iwmmxt"), str_lit("armv5te,v4t,v5t,v5te") }, + { str_lit("krait"), str_lit("aclass,armv7-a,avoid-partial-cpsr,d32,db,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,krait,muxed-units,neon,perfmon,ret-addr-stack,thumb2,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,vldn-align,vmlx-forwarding") }, + { str_lit("kryo"), str_lit("aclass,acquire-release,aes,armv8-a,crc,crypto,d32,db,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,kryo,mp,neon,perfmon,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("mpcore"), str_lit("armv6k,fp64,fpregs,fpregs64,slowfpvmlx,v4t,v5t,v5te,v6,v6k,vfp2,vfp2sp") }, + { str_lit("mpcorenovfp"), str_lit("armv6k,v4t,v5t,v5te,v6,v6k") }, + { str_lit("neoverse-n1"), str_lit("aclass,acquire-release,aes,armv8.2-a,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("neoverse-n2"), str_lit("aclass,acquire-release,armv9-a,bf16,crc,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp16fml,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,i8mm,mp,neon,perfmon,ras,sb,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8m,v9a,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("neoverse-v1"), str_lit("aclass,acquire-release,aes,armv8.4-a,bf16,crc,crypto,d32,db,dotprod,dsp,fp-armv8,fp-armv8d16,fp-armv8d16sp,fp-armv8sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,hwdiv-arm,i8mm,mp,neon,perfmon,ras,sha2,thumb2,trustzone,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8,v8.1a,v8.2a,v8.3a,v8.4a,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,virtualization") }, + { str_lit("sc000"), str_lit("armv6-m,db,mclass,no-branch-predictor,noarm,strict-align,thumb-mode,v4t,v5t,v5te,v6,v6m") }, + { str_lit("sc300"), str_lit("armv7-m,db,hwdiv,m3,mclass,no-branch-predictor,noarm,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m") }, + { str_lit("star-mc1"), str_lit("8msecext,acquire-release,armv8-m.main,avoid-muls,db,dsp,fix-cmse-cve-2021-35465,fp-armv8d16sp,fp16,fpregs,hwdiv,loop-align,mclass,no-branch-predictor,noarm,slowfpvfmx,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,v8m.main,vfp2sp,vfp3d16sp,vfp4d16sp") }, + { str_lit("star-mc3"), str_lit("8msecext,acquire-release,armv8.1-m.main,db,dsp,fp-armv8d16,fp-armv8d16sp,fp16,fp64,fpregs,fpregs16,fpregs64,fullfp16,hwdiv,lob,loop-align,mclass,mve,mve.fp,mve1beat,no-branch-predictor,noarm,pacbti,ras,slowfpvmlx,thumb-mode,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8.1m.main,v8m,v8m.main,vfp2,vfp2sp,vfp3d16,vfp3d16sp,vfp4d16,vfp4d16sp") }, + { str_lit("strongarm"), str_lit("armv4") }, + { str_lit("strongarm110"), str_lit("armv4") }, + { str_lit("strongarm1100"), str_lit("armv4") }, + { str_lit("strongarm1110"), str_lit("armv4") }, + { str_lit("swift"), str_lit("aclass,armv7-a,avoid-movs-shop,avoid-partial-cpsr,d32,db,disable-postra-scheduler,dsp,fp16,fp64,fpregs,fpregs64,hwdiv,hwdiv-arm,mp,neon,neonfp,perfmon,prefer-ishst,prof-unpr,ret-addr-stack,slow-load-D-subreg,slow-odd-reg,slow-vdup32,slow-vgetlni32,slowfpvfmx,slowfpvmlx,swift,thumb2,use-misched,v4t,v5t,v5te,v6,v6k,v6m,v6t2,v7,v7clrex,v8m,vfp2,vfp2sp,vfp3,vfp3d16,vfp3d16sp,vfp3sp,vfp4,vfp4d16,vfp4d16sp,vfp4sp,vmlx-hazards,wide-stride-vfp") }, + { str_lit("xscale"), str_lit("armv5te,v4t,v5t,v5te") }, + // TargetArch_arm64: + { str_lit("a64fx"), str_lit("CONTEXTIDREL2,a64fx,aes,aggressive-fma,arith-bcc-fusion,ccpp,complxnum,crc,disable-unpredicated-ld-st-lower,el2vmsa,el3,fp-armv8,fullfp16,lor,lse,max-interleave-factor-4,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rdm,sha2,store-pair-suppress,sve,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("ampere1"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,altnzcv,alu-lsl-fast,am,ampere1,amvs,arith-bcc-fusion,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-literals,i8mm,jsconv,ldp-aligned-only,lor,lse,lse2,max-interleave-factor-4,mpam,neon,nv,pan,pan-rwv,pauth,perfmon,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,stp-aligned-only,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh") }, + { str_lit("ampere1a"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,altnzcv,alu-lsl-fast,am,ampere1a,amvs,arith-bcc-fusion,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fptoint,fullfp16,fuse-address,fuse-addsub-2reg-const1,fuse-adrp-add,fuse-aes,fuse-literals,i8mm,jsconv,ldp-aligned-only,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,specrestrict,ssbs,store-pair-suppress,stp-aligned-only,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh") }, + { str_lit("ampere1b"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,altnzcv,alu-lsl-fast,am,ampere1b,amvs,arith-bcc-fusion,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,cssc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,fgt,flagm,fp-armv8,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-literals,hcx,i8mm,jsconv,ldp-aligned-only,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,specrestrict,ssbs,store-pair-suppress,stp-aligned-only,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,vh,wfxt,xs") }, + { str_lit("ampere1c"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,altnzcv,alu-lsl-fast,am,ampere1c,amvs,arith-bcc-fusion,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,cssc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,faminmax,fgt,flagm,fp-armv8,fp16fml,fp8,fp8fma,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,lut,max-interleave-factor-4,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,specrestrict,ssbs,store-pair-suppress,sve,sve-aes,sve-b16b16,sve-sha3,sve-sm4,sve2,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("apple-a10"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,apple-a10,arith-bcc-fusion,arith-cbz-fusion,crc,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fuse-aes,fuse-crypto-eor,lor,neon,no-zcz-fpr64,pan,perfmon,rdm,sha2,store-pair-suppress,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a11"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,apple-a11,arith-bcc-fusion,arith-cbz-fusion,ccpp,crc,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fullfp16,fuse-aes,fuse-crypto-eor,lor,lse,neon,no-zcz-fpr64,pan,pan-rwv,perfmon,ras,rdm,sha2,store-pair-suppress,uaops,v8.1a,v8.2a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a12"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,apple-a12,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,neon,no-zcz-fpr64,pan,pan-rwv,pauth,perfmon,ras,rcpc,rdm,sha2,store-pair-suppress,uaops,v8.1a,v8.2a,v8.3a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a13"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,am,apple-a13,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,lse2,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a14"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,alternate-sextload-cvt-f32-pattern,altnzcv,am,apple-a14,arith-bcc-fusion,arith-cbz-fusion,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fptoint,fullfp16,fuse-address,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a15"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a15,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a16"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a16,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a17"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a17,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a18"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-m4,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sme,sme-f64f64,sme-i16i64,sme2,specrestrict,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,vh,wfxt,xs,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a19"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-m5,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,cssc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hbc,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sme,sme-b16b16,sme-f16f16,sme-f64f64,sme-i16i64,sme2,sme2p1,specres2,specrestrict,sve-b16b16,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,vh,wfxt,xs,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a7"), str_lit("aes,alternate-sextload-cvt-f32-pattern,apple-a7,arith-bcc-fusion,arith-cbz-fusion,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fuse-aes,fuse-crypto-eor,neon,no-zcz-fpr64,perfmon,sha2,store-pair-suppress,v8a,zcm-fpr128,zcm-gpr64,zcz-fp-workaround,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a8"), str_lit("aes,alternate-sextload-cvt-f32-pattern,apple-a7,arith-bcc-fusion,arith-cbz-fusion,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fuse-aes,fuse-crypto-eor,neon,no-zcz-fpr64,perfmon,sha2,store-pair-suppress,v8a,zcm-fpr128,zcm-gpr64,zcz-fp-workaround,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-a9"), str_lit("aes,alternate-sextload-cvt-f32-pattern,apple-a7,arith-bcc-fusion,arith-cbz-fusion,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fuse-aes,fuse-crypto-eor,neon,no-zcz-fpr64,perfmon,sha2,store-pair-suppress,v8a,zcm-fpr128,zcm-gpr64,zcz-fp-workaround,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-m1"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,alternate-sextload-cvt-f32-pattern,altnzcv,am,apple-a14,arith-bcc-fusion,arith-cbz-fusion,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fptoint,fullfp16,fuse-address,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-m2"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a15,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-m3"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a16,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-m4"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-m4,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sme,sme-f64f64,sme-i16i64,sme2,specrestrict,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,vh,wfxt,xs,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-m5"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-m5,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,cssc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hbc,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sme,sme-b16b16,sme-f16f16,sme-f64f64,sme-i16i64,sme2,sme2p1,specres2,specrestrict,sve-b16b16,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,vh,wfxt,xs,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s10"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a16,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s4"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,apple-a12,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,neon,no-zcz-fpr64,pan,pan-rwv,pauth,perfmon,ras,rcpc,rdm,sha2,store-pair-suppress,uaops,v8.1a,v8.2a,v8.3a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s5"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,apple-a12,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,neon,no-zcz-fpr64,pan,pan-rwv,pauth,perfmon,ras,rcpc,rdm,sha2,store-pair-suppress,uaops,v8.1a,v8.2a,v8.3a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s6"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,am,apple-a13,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,lse2,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s7"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,am,apple-a13,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,lse2,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s8"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,am,apple-a13,arith-bcc-fusion,arith-cbz-fusion,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,fp16fml,fullfp16,fuse-aes,fuse-crypto-eor,jsconv,lor,lse,lse2,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("apple-s9"), str_lit("CONTEXTIDREL2,aes,alternate-sextload-cvt-f32-pattern,altnzcv,am,amvs,apple-a16,arith-bcc-fusion,arith-cbz-fusion,bf16,bti,ccdp,ccpp,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,ecv,el2vmsa,el3,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-crypto-eor,fuse-csel,fuse-literals,hcx,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,no-zcz-fpr64,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,specrestrict,ssbs,store-pair-suppress,tlb-rmi,tracev8.4,uaops,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh,zcm-fpr128,zcm-gpr64,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("c1-nano"), str_lit("CONTEXTIDREL2,altnzcv,am,amvs,bf16,bti,c1-nano,ccdp,ccidx,ccpp,chk,clrbhb,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,hbc,hcx,i8mm,jsconv,lor,lse,lse2,mops,mpam,mte,neon,nmi,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rcpc3,rdm,sb,sel2,sme,sme2,specres2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8a,v9.1a,v9.2a,v9.3a,v9a,vh,wfxt,xs") }, + { str_lit("c1-premium"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,bti,c1-premium,ccdp,ccidx,ccpp,chk,clrbhb,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hbc,hcx,i8mm,jsconv,lor,lse,lse2,mops,mpam,mte,neon,nmi,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rcpc3,rdm,sb,sel2,sme,sme2,spe,spe-eef,specres2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8a,v9.1a,v9.2a,v9.3a,v9a,vh,wfxt,xs") }, + { str_lit("c1-pro"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,bf16,bti,c1-pro,ccdp,ccidx,ccpp,chk,clrbhb,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hbc,hcx,i8mm,jsconv,lor,lse,lse2,mops,mpam,mte,neon,nmi,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rcpc3,rdm,sb,sel2,sme,sme2,spe,spe-eef,specres2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8a,v9.1a,v9.2a,v9.3a,v9a,vh,wfxt,xs") }, + { str_lit("c1-ultra"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,bti,c1-ultra,ccdp,ccidx,ccpp,chk,clrbhb,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hbc,hcx,i8mm,jsconv,lor,lse,lse2,mops,mpam,mte,neon,nmi,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rcpc3,rdm,sb,sel2,sme,sme2,spe,spe-eef,specres2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8a,v9.1a,v9.2a,v9.3a,v9a,vh,wfxt,xs") }, + { str_lit("carmel"), str_lit("CONTEXTIDREL2,aes,carmel,ccpp,crc,el2vmsa,el3,fp-armv8,fullfp16,lor,lse,neon,pan,pan-rwv,ras,rdm,sha2,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cobalt-100"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,disable-maximize-scalable-bandwidth,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,neoversen2,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-a320"), str_lit("CONTEXTIDREL2,a320,aggressive-interleaving,altnzcv,am,amvs,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,ete,fgt,flagm,fp-armv8,fp16fml,fptoint,fullfp16,fuse-adrp-add,fuse-aes,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a34"), str_lit("a35,aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,sha2,v8a") }, + { str_lit("cortex-a35"), str_lit("a35,aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,sha2,v8a") }, + { str_lit("cortex-a510"), str_lit("CONTEXTIDREL2,a510,altnzcv,am,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,el2vmsa,el3,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-a520"), str_lit("CONTEXTIDREL2,a520,altnzcv,am,amvs,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a520ae"), str_lit("CONTEXTIDREL2,a520ae,altnzcv,am,amvs,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a53"), str_lit("a53,aes,balance-fp-ops,crc,el2vmsa,el3,fp-armv8,fuse-adrp-add,fuse-aes,neon,perfmon,sha2,use-postra-scheduler,use-wzr-to-vec-move,v8a") }, + { str_lit("cortex-a55"), str_lit("CONTEXTIDREL2,a55,aes,ccpp,crc,dotprod,el2vmsa,el3,fp-armv8,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,ras,rcpc,rdm,sha2,uaops,use-postra-scheduler,use-wzr-to-vec-move,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a57"), str_lit("a57,addr-lsl-slow-14,aes,balance-fp-ops,crc,el2vmsa,el3,enable-select-opt,fp-armv8,fuse-adrp-add,fuse-aes,fuse-literals,max-interleave-factor-4,neon,perfmon,predictable-select-expensive,sha2,use-postra-scheduler,v8a") }, + { str_lit("cortex-a65"), str_lit("CONTEXTIDREL2,a65,aes,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-literals,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,ssbs,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a65ae"), str_lit("CONTEXTIDREL2,a65,aes,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-literals,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,ssbs,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a710"), str_lit("CONTEXTIDREL2,a710,altnzcv,alu-lsl-fast,am,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-a715"), str_lit("CONTEXTIDREL2,a715,altnzcv,alu-lsl-fast,am,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-a72"), str_lit("a72,addr-lsl-slow-14,aes,crc,el2vmsa,el3,enable-select-opt,fp-armv8,fuse-adrp-add,fuse-aes,fuse-literals,neon,perfmon,predictable-select-expensive,sha2,v8a") }, + { str_lit("cortex-a720"), str_lit("CONTEXTIDREL2,a720,altnzcv,alu-lsl-fast,am,amvs,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a720ae"), str_lit("CONTEXTIDREL2,a720ae,altnzcv,alu-lsl-fast,am,amvs,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a725"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,cortex-a725,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-a73"), str_lit("a73,addr-lsl-slow-14,aes,crc,el2vmsa,el3,enable-select-opt,fp-armv8,fuse-adrp-add,fuse-aes,neon,perfmon,predictable-select-expensive,sha2,v8a") }, + { str_lit("cortex-a75"), str_lit("CONTEXTIDREL2,a75,addr-lsl-slow-14,aes,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a76"), str_lit("CONTEXTIDREL2,a76,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,ssbs,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a76ae"), str_lit("CONTEXTIDREL2,a76,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,ssbs,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a77"), str_lit("CONTEXTIDREL2,a77,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,ssbs,uaops,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a78"), str_lit("CONTEXTIDREL2,a78,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a78ae"), str_lit("CONTEXTIDREL2,a78ae,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-a78c"), str_lit("CONTEXTIDREL2,a78c,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,crc,dotprod,el2vmsa,el3,enable-select-opt,flagm,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,lor,lse,neon,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-r82"), str_lit("CONTEXTIDREL2,ccdp,ccpp,complxnum,cortex-r82,crc,dit,dotprod,flagm,fp-armv8,fp16fml,fpac,fullfp16,jsconv,lse,neon,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8r") }, + { str_lit("cortex-r82ae"), str_lit("CONTEXTIDREL2,ccdp,ccpp,complxnum,cortex-r82ae,crc,dit,dotprod,flagm,fp-armv8,fp16fml,fpac,fullfp16,jsconv,lse,neon,pan,pan-rwv,pauth,perfmon,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8r") }, + { str_lit("cortex-x1"), str_lit("CONTEXTIDREL2,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,cortex-x1,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-x1c"), str_lit("CONTEXTIDREL2,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,cmp-bcc-fusion,cortex-x1,crc,dotprod,el2vmsa,el3,enable-select-opt,flagm,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,lse2,neon,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,ras,rcpc,rcpc-immo,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("cortex-x2"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,cortex-x2,crc,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-x3"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,complxnum,cortex-x3,crc,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("cortex-x4"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,complxnum,cortex-x4,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cortex-x925"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,complxnum,cortex-x925,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("cyclone"), str_lit("aes,alternate-sextload-cvt-f32-pattern,apple-a7,arith-bcc-fusion,arith-cbz-fusion,disable-latency-sched-heuristic,el2vmsa,el3,fp-armv8,fuse-aes,fuse-crypto-eor,neon,no-zcz-fpr64,perfmon,sha2,store-pair-suppress,v8a,zcm-fpr128,zcm-gpr64,zcz-fp-workaround,zcz-fpr128,zcz-gpr32,zcz-gpr64") }, + { str_lit("exynos-m3"), str_lit("aes,alu-lsl-fast,crc,el2vmsa,el3,exynos-cheap-as-move,exynosm3,force-32bit-jump-tables,fp-armv8,fuse-address,fuse-adrp-add,fuse-aes,fuse-csel,fuse-literals,max-interleave-factor-4,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,use-postra-scheduler,v8a") }, + { str_lit("exynos-m4"), str_lit("CONTEXTIDREL2,aes,alu-lsl-fast,arith-bcc-fusion,arith-cbz-fusion,ccpp,crc,dotprod,el2vmsa,el3,exynos-cheap-as-move,exynosm4,force-32bit-jump-tables,fp-armv8,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-csel,fuse-literals,lor,lse,max-interleave-factor-4,neon,pan,pan-rwv,perfmon,ras,rdm,sha2,store-pair-suppress,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh,zcz-gpr32,zcz-gpr64") }, + { str_lit("exynos-m5"), str_lit("CONTEXTIDREL2,aes,alu-lsl-fast,arith-bcc-fusion,arith-cbz-fusion,ccpp,crc,dotprod,el2vmsa,el3,exynos-cheap-as-move,exynosm4,force-32bit-jump-tables,fp-armv8,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-arith-logic,fuse-csel,fuse-literals,lor,lse,max-interleave-factor-4,neon,pan,pan-rwv,perfmon,ras,rdm,sha2,store-pair-suppress,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh,zcz-gpr32,zcz-gpr64") }, + { str_lit("falkor"), str_lit("aes,alu-lsl-fast,crc,el2vmsa,el3,falkor,fp-armv8,max-interleave-factor-4,neon,perfmon,predictable-select-expensive,rdm,sha2,slow-strqro-store,store-pair-suppress,use-postra-scheduler,v8a,zcz-gpr32,zcz-gpr64") }, + { str_lit("fujitsu-monaka"), str_lit("CONTEXTIDREL2,aes,altnzcv,am,amvs,arith-bcc-fusion,bf16,bti,ccdp,ccidx,ccpp,clrbhb,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,faminmax,fgt,flagm,fp-armv8,fp16fml,fp8,fp8dot2,fp8dot4,fp8fma,fpac,fptoint,fujitsu-monaka,fullfp16,hbc,hcx,i8mm,jsconv,lor,ls64,lse,lse2,lut,mec,mops,mpam,neon,nmi,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,rme,sb,sel2,sha2,sha3,sm4,specres2,specrestrict,ssbs,sve,sve-aes,sve-bitperm,sve-sha3,sve-sm4,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8.8a,v8a,v9.1a,v9.2a,v9.3a,v9a,vh,wfxt,xs") }, + { str_lit("gb10"), str_lit("CONTEXTIDREL2,aes,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,complxnum,cortex-x925,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,spe,spe-eef,specrestrict,ssbs,sve,sve-aes,sve-bitperm,sve-sha3,sve-sm4,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("generic"), str_lit("enable-select-opt,ete,fp-armv8,fuse-adrp-add,fuse-aes,neon,trbe,use-postra-scheduler") }, + { str_lit("grace"), str_lit("CONTEXTIDREL2,aes,altnzcv,alu-lsl-fast,am,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,neoversev2,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,spe,specrestrict,ssbs,sve,sve-aes,sve-bitperm,sve-sha3,sve-sm4,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("kryo"), str_lit("aes,alu-lsl-fast,crc,el2vmsa,el3,fp-armv8,kryo,max-interleave-factor-4,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,use-postra-scheduler,v8a,zcz-gpr32,zcz-gpr64") }, + { str_lit("neoverse-512tvb"), str_lit("CONTEXTIDREL2,aes,alu-lsl-fast,am,bf16,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,el2vmsa,el3,enable-select-opt,flagm,fp-armv8,fp16fml,fpac,fullfp16,fuse-adrp-add,fuse-aes,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,neoverse512tvb,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,rand,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,sm4,spe,ssbs,sve,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh") }, + { str_lit("neoverse-e1"), str_lit("CONTEXTIDREL2,aes,ccpp,crc,dotprod,el2vmsa,el3,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,neoversee1,pan,pan-rwv,perfmon,ras,rcpc,rdm,sha2,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("neoverse-n1"), str_lit("CONTEXTIDREL2,addr-lsl-slow-14,aes,alu-lsl-fast,ccpp,crc,dotprod,el2vmsa,el3,enable-select-opt,fp-armv8,fullfp16,fuse-adrp-add,fuse-aes,lor,lse,neon,neoversen1,pan,pan-rwv,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,spe,ssbs,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + { str_lit("neoverse-n2"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,disable-maximize-scalable-bandwidth,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,neoversen2,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,ras,rcpc,rcpc-immo,rdm,sb,sel2,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("neoverse-n3"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,lse,lse2,mpam,mte,neon,neoversen3,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("neoverse-v1"), str_lit("CONTEXTIDREL2,addr-lsl-slow-14,aes,alu-lsl-fast,am,bf16,ccdp,ccidx,ccpp,complxnum,crc,disable-maximize-scalable-bandwidth,dit,dotprod,el2vmsa,el3,enable-select-opt,flagm,fp-armv8,fp16fml,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,mpam,neon,neoversev1,no-sve-fp-ld1r,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,rand,ras,rcpc,rcpc-immo,rdm,sel2,sha2,sha3,sm4,spe,ssbs,sve,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh") }, + { str_lit("neoverse-v2"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,avoid-ldapur,bf16,bti,ccdp,ccidx,ccpp,cmp-bcc-fusion,complxnum,crc,disable-latency-sched-heuristic,dit,dotprod,el2vmsa,el3,enable-select-opt,ete,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,mte,neon,neoversev2,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,spe,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8a,v9a,vh") }, + { str_lit("neoverse-v3"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,brbe,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,ls64,lse,lse2,max-interleave-factor-4,mpam,mte,neon,neoversev3,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,rme,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("neoverse-v3ae"), str_lit("CONTEXTIDREL2,altnzcv,alu-lsl-fast,am,amvs,avoid-ldapur,bf16,brbe,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,fgt,flagm,fp-armv8,fp16fml,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,fuse-csel,fuse-cset,hcx,i8mm,jsconv,lor,ls64,lse,lse2,max-interleave-factor-4,mpam,mte,neon,neoversev3AE,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,rme,sb,sel2,spe,spe-eef,specrestrict,ssbs,sve,sve-bitperm,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("olympus"), str_lit("CONTEXTIDREL2,aes,altnzcv,alu-lsl-fast,am,amvs,bf16,brbe,bti,ccdp,ccidx,ccpp,chk,cmp-bcc-fusion,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,ete,faminmax,fgt,flagm,fp-armv8,fp16fml,fp8,fp8dot2,fp8dot4,fp8fma,fpac,fptoint,fullfp16,fuse-adrp-add,fuse-aes,hcx,i8mm,jsconv,lor,ls64,lse,lse2,lut,max-interleave-factor-4,mec,mpam,mte,neon,nv,olympus,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,predres,rand,ras,rcpc,rcpc-immo,rdm,rme,sb,sel2,sha2,sha3,sm4,spe,spe-eef,specrestrict,ssbs,sve,sve-aes,sve-bitperm,sve-sha3,sve-sm4,sve2,tlb-rmi,tracev8.4,trbe,uaops,use-fixed-over-scalable-if-equal-cost,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8.7a,v8a,v9.1a,v9.2a,v9a,vh,wfxt,xs") }, + { str_lit("oryon-1"), str_lit("CONTEXTIDREL2,aes,altnzcv,am,amvs,bf16,bti,ccdp,ccidx,ccpp,complxnum,crc,dit,dotprod,ecv,el2vmsa,el3,enable-select-opt,fgt,flagm,fp-armv8,fp16fml,fptoint,fullfp16,fuse-address,fuse-adrp-add,fuse-aes,fuse-crypto-eor,i8mm,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,nv,oryon-1,pan,pan-rwv,pauth,perfmon,predres,rand,ras,rcpc,rcpc-immo,rdm,sb,sel2,sha2,sha3,sm4,spe,specrestrict,ssbs,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8.5a,v8.6a,v8a,vh") }, + { str_lit("saphira"), str_lit("CONTEXTIDREL2,aes,alu-lsl-fast,am,ccidx,ccpp,complxnum,crc,dit,dotprod,el2vmsa,el3,flagm,fp-armv8,jsconv,lor,lse,lse2,max-interleave-factor-4,mpam,neon,nv,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,ras,rcpc,rcpc-immo,rdm,saphira,sel2,sha2,spe,store-pair-suppress,tlb-rmi,tracev8.4,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8.4a,v8a,vh,zcz-gpr32,zcz-gpr64") }, + { str_lit("thunderx"), str_lit("aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,thunderx,use-postra-scheduler,v8a") }, + { str_lit("thunderx2t99"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,arith-bcc-fusion,crc,el2vmsa,el3,fp-armv8,lor,lse,max-interleave-factor-4,neon,pan,predictable-select-expensive,rdm,sha2,store-pair-suppress,thunderx2t99,use-postra-scheduler,v8.1a,v8a,vh") }, + { str_lit("thunderx3t110"), str_lit("CONTEXTIDREL2,aes,aggressive-fma,arith-bcc-fusion,balance-fp-ops,ccidx,ccpp,complxnum,crc,el2vmsa,el3,fp-armv8,jsconv,lor,lse,max-interleave-factor-4,neon,pan,pan-rwv,pauth,perfmon,predictable-select-expensive,ras,rcpc,rdm,sha2,store-pair-suppress,strict-align,thunderx3t110,uaops,use-postra-scheduler,v8.1a,v8.2a,v8.3a,v8a,vh") }, + { str_lit("thunderxt81"), str_lit("aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,thunderxt81,use-postra-scheduler,v8a") }, + { str_lit("thunderxt83"), str_lit("aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,thunderxt83,use-postra-scheduler,v8a") }, + { str_lit("thunderxt88"), str_lit("aes,crc,el2vmsa,el3,fp-armv8,neon,perfmon,predictable-select-expensive,sha2,store-pair-suppress,thunderxt88,use-postra-scheduler,v8a") }, + { str_lit("tsv110"), str_lit("CONTEXTIDREL2,aes,ccpp,complxnum,crc,dotprod,el2vmsa,el3,fp-armv8,fp16fml,fullfp16,fuse-aes,jsconv,lor,lse,neon,pan,pan-rwv,perfmon,ras,rdm,sha2,spe,store-pair-suppress,tsv110,uaops,use-postra-scheduler,v8.1a,v8.2a,v8a,vh") }, + // TargetArch_wasm32: + { str_lit("bleeding-edge"), str_lit("atomics,bulk-memory,bulk-memory-opt,call-indirect-overlong,exception-handling,extended-const,fp16,gc,multimemory,multivalue,mutable-globals,nontrapping-fptoint,reference-types,relaxed-simd,sign-ext,simd128,tail-call") }, + { str_lit("generic"), str_lit("bulk-memory,bulk-memory-opt,call-indirect-overlong,multivalue,mutable-globals,nontrapping-fptoint,reference-types,sign-ext") }, + { str_lit("lime1"), str_lit("bulk-memory-opt,call-indirect-overlong,extended-const,multivalue,mutable-globals,nontrapping-fptoint,sign-ext") }, + { str_lit("mvp"), str_lit("") }, + // TargetArch_wasm64p32: + { str_lit("bleeding-edge"), str_lit("atomics,bulk-memory,bulk-memory-opt,call-indirect-overlong,exception-handling,extended-const,fp16,gc,multimemory,multivalue,mutable-globals,nontrapping-fptoint,reference-types,relaxed-simd,sign-ext,simd128,tail-call") }, + { str_lit("generic"), str_lit("bulk-memory,bulk-memory-opt,call-indirect-overlong,multivalue,mutable-globals,nontrapping-fptoint,reference-types,sign-ext") }, + { str_lit("lime1"), str_lit("bulk-memory-opt,call-indirect-overlong,extended-const,multivalue,mutable-globals,nontrapping-fptoint,sign-ext") }, + { str_lit("mvp"), str_lit("") }, + // TargetArch_riscv64: + { str_lit("andes-45-series"), str_lit("andes45,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler") }, + { str_lit("andes-a25"), str_lit("32bit,a,c,d,f,i,m,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("andes-a45"), str_lit("32bit,a,andes45,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("andes-ax25"), str_lit("64bit,a,c,d,f,i,m,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("andes-ax45"), str_lit("64bit,a,andes45,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("andes-ax45mpv"), str_lit("64bit,a,andes45,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler,v,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul,zve32f,zve32x,zve64d,zve64f,zve64x,zvl128b,zvl32b,zvl64b") }, + { str_lit("andes-n45"), str_lit("32bit,a,andes45,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("andes-nx45"), str_lit("64bit,a,andes45,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,use-postra-scheduler,xandesperf,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("generic"), str_lit("64bit,i,optimized-nf2-segment-load-store") }, + { str_lit("generic-ooo"), str_lit("") }, + { str_lit("generic-rv32"), str_lit("32bit,i,optimized-nf2-segment-load-store") }, + { str_lit("generic-rv64"), str_lit("64bit,i,optimized-nf2-segment-load-store") }, + { str_lit("mips-p8700"), str_lit("64bit,a,c,d,f,i,m,mips-p8700,xmipscbop,xmipscmov,xmipsexectl,xmipslsp,zaamo,zalrsc,zba,zbb,zca,zicsr,zifencei,zmmul") }, + { str_lit("rocket"), str_lit("") }, + { str_lit("rocket-rv32"), str_lit("32bit,i,zicsr,zifencei") }, + { str_lit("rocket-rv64"), str_lit("64bit,i,zicsr,zifencei") }, + { str_lit("rp2350-hazard3"), str_lit("32bit,a,c,i,m,zaamo,zalrsc,zba,zbb,zbkb,zbs,zca,zcb,zcmp,zicsr,zifencei,zmmul") }, + { str_lit("sifive-7-series"), str_lit("no-default-unroll,short-forward-branch-ialu,sifive7,use-postra-scheduler") }, + { str_lit("sifive-e20"), str_lit("32bit,c,i,m,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-e21"), str_lit("32bit,a,c,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-e24"), str_lit("32bit,a,c,f,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-e31"), str_lit("32bit,a,c,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-e34"), str_lit("32bit,a,c,f,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-e76"), str_lit("32bit,a,c,f,i,m,no-default-unroll,short-forward-branch-ialu,sifive7,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-p450"), str_lit("64bit,a,auipc-addi-fusion,b,c,conditional-cmv-fusion,d,f,i,lui-addi-fusion,m,no-default-unroll,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,za64rs,zaamo,zalrsc,zba,zbb,zbs,zca,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicsr,zifencei,zihintntl,zihintpause,zihpm,zkt,zmmul") }, + { str_lit("sifive-p470"), str_lit("64bit,a,auipc-addi-fusion,b,c,conditional-cmv-fusion,d,f,i,lui-addi-fusion,m,no-default-unroll,no-sink-splat-operands,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,v,vxrm-pipeline-flush,xsifivecdiscarddlone,xsifivecflushdlone,za64rs,zaamo,zalrsc,zba,zbb,zbs,zca,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicsr,zifencei,zihintntl,zihintpause,zihpm,zkt,zmmul,zvbb,zvbc,zve32f,zve32x,zve64d,zve64f,zve64x,zvkb,zvkg,zvkn,zvknc,zvkned,zvkng,zvknhb,zvks,zvksc,zvksed,zvksg,zvksh,zvkt,zvl128b,zvl32b,zvl64b") }, + { str_lit("sifive-p550"), str_lit("64bit,a,auipc-addi-fusion,c,conditional-cmv-fusion,d,f,i,lui-addi-fusion,m,no-default-unroll,use-postra-scheduler,zaamo,zalrsc,zba,zbb,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-p670"), str_lit("64bit,a,auipc-addi-fusion,b,c,conditional-cmv-fusion,d,f,i,lui-addi-fusion,m,no-default-unroll,no-sink-splat-operands,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,v,vxrm-pipeline-flush,za64rs,zaamo,zalrsc,zba,zbb,zbs,zca,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicsr,zifencei,zihintntl,zihintpause,zihpm,zkt,zmmul,zvbb,zvbc,zve32f,zve32x,zve64d,zve64f,zve64x,zvkb,zvkg,zvkn,zvknc,zvkned,zvkng,zvknhb,zvks,zvksc,zvksed,zvksg,zvksh,zvkt,zvl128b,zvl32b,zvl64b") }, + { str_lit("sifive-p870"), str_lit("64bit,a,auipc-addi-fusion,b,c,conditional-cmv-fusion,d,f,i,lui-addi-fusion,m,no-default-unroll,no-sink-splat-operands,supm,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,v,vxrm-pipeline-flush,za64rs,zaamo,zalrsc,zama16b,zawrs,zba,zbb,zbs,zca,zcb,zcmop,zfa,zfbfmin,zfh,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicntr,zicond,zicsr,zifencei,zihintntl,zihintpause,zihpm,zimop,zkr,zkt,zmmul,zvbb,zvbc,zve32f,zve32x,zve64d,zve64f,zve64x,zvfbfmin,zvfbfwma,zvfh,zvfhmin,zvkb,zvkg,zvkn,zvknc,zvkned,zvkng,zvknhb,zvks,zvksc,zvksed,zvksg,zvksh,zvkt,zvl128b,zvl32b,zvl64b") }, + { str_lit("sifive-s21"), str_lit("64bit,a,c,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-s51"), str_lit("64bit,a,c,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-s54"), str_lit("64bit,a,c,d,f,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-s76"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,sifive7,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zihintpause,zmmul") }, + { str_lit("sifive-u54"), str_lit("64bit,a,c,d,f,i,m,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-u74"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,short-forward-branch-ialu,sifive7,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("sifive-x280"), str_lit("64bit,a,c,d,dlen-factor-2,f,i,m,no-default-unroll,optimized-nf2-segment-load-store,optimized-zero-stride-load,short-forward-branch-ialu,sifive7,use-postra-scheduler,v,vl-dependent-latency,zaamo,zalrsc,zba,zbb,zca,zfh,zfhmin,zicsr,zifencei,zmmul,zve32f,zve32x,zve64d,zve64f,zve64x,zvfh,zvfhmin,zvl128b,zvl256b,zvl32b,zvl512b,zvl64b") }, + { str_lit("sifive-x390"), str_lit("64bit,a,b,c,d,dlen-factor-2,experimental-zicfilp,experimental-zicfiss,f,i,m,no-default-unroll,optimized-nf2-segment-load-store,optimized-zero-stride-load,short-forward-branch-ialu,sifive7,single-element-vec-fp64,use-postra-scheduler,v,vl-dependent-latency,xsifivecdiscarddlone,xsifivecflushdlone,za64rs,zaamo,zalrsc,zawrs,zba,zbb,zbs,zca,zcb,zcmop,zfa,zfbfmin,zfh,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,ziccrse,zicntr,zicond,zicsr,zifencei,zihintntl,zihintpause,zihpm,zimop,zkr,zkt,zmmul,zvbb,zve32f,zve32x,zve64d,zve64f,zve64x,zvfbfmin,zvfbfwma,zvfh,zvfhmin,zvkb,zvkt,zvl1024b,zvl128b,zvl256b,zvl32b,zvl512b,zvl64b") }, + { str_lit("spacemit-x60"), str_lit("64bit,a,b,c,d,dlen-factor-2,f,i,m,optimized-nf2-segment-load-store,optimized-nf3-segment-load-store,optimized-nf4-segment-load-store,ssccptr,sscofpmf,sscounterenw,sstc,sstvala,sstvecd,svade,svbare,svinval,svnapot,svpbmt,unaligned-scalar-mem,v,vxrm-pipeline-flush,xsmtvdot,za64rs,zaamo,zalrsc,zba,zbb,zbc,zbkc,zbs,zca,zfh,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicntr,zicond,zicsr,zifencei,zihintpause,zihpm,zkt,zmmul,zve32f,zve32x,zve64d,zve64f,zve64x,zvfh,zvfhmin,zvkt,zvl128b,zvl256b,zvl32b,zvl64b") }, + { str_lit("syntacore-scr1-base"), str_lit("32bit,c,i,no-default-unroll,zca,zicsr,zifencei") }, + { str_lit("syntacore-scr1-max"), str_lit("32bit,c,i,m,no-default-unroll,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr3-rv32"), str_lit("32bit,c,i,m,no-default-unroll,use-postra-scheduler,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr3-rv64"), str_lit("64bit,a,c,i,m,no-default-unroll,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr4-rv32"), str_lit("32bit,c,d,f,i,m,no-default-unroll,use-postra-scheduler,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr4-rv64"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr5-rv32"), str_lit("32bit,a,c,d,f,i,m,no-default-unroll,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr5-rv64"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,use-postra-scheduler,zaamo,zalrsc,zca,zicsr,zifencei,zmmul") }, + { str_lit("syntacore-scr7"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,use-postra-scheduler,v,zaamo,zalrsc,zba,zbb,zbc,zbkb,zbkc,zbkx,zbs,zca,zicsr,zifencei,zkn,zknd,zkne,zknh,zmmul,zve32f,zve32x,zve64d,zve64f,zve64x,zvl128b,zvl32b,zvl64b") }, + { str_lit("tt-ascalon-d8"), str_lit("64bit,a,b,c,d,f,h,i,log-vrgather,m,no-default-unroll,optimized-nf2-segment-load-store,optimized-nf3-segment-load-store,optimized-nf4-segment-load-store,optimized-nf5-segment-load-store,optimized-nf6-segment-load-store,optimized-nf7-segment-load-store,optimized-nf8-segment-load-store,optimized-zero-stride-load,sha,shcounterenw,shgatpa,shtvala,shvsatpa,shvstvala,shvstvecd,smaia,ssaia,ssccptr,sscofpmf,sscounterenw,ssnpm,ssstateen,ssstrict,sstc,sstvala,sstvecd,ssu64xl,supm,svade,svbare,svinval,svnapot,svpbmt,unaligned-scalar-mem,unaligned-vector-mem,use-postra-scheduler,v,za64rs,zaamo,zalrsc,zawrs,zba,zbb,zbs,zca,zcb,zcmop,zfa,zfbfmin,zfh,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicntr,zicond,zicsr,zifencei,zihintntl,zihintpause,zihpm,zimop,zkt,zmmul,zvbb,zvbc,zve32f,zve32x,zve64d,zve64f,zve64x,zvfbfmin,zvfbfwma,zvfh,zvfhmin,zvkb,zvkg,zvkn,zvkned,zvkng,zvknhb,zvkt,zvl128b,zvl256b,zvl32b,zvl64b") }, + { str_lit("veyron-v1"), str_lit("64bit,a,add-load-fusion,auipc-addi-fusion,auipc-load-fusion,c,d,disable-misched-load-clustering,disable-postmisched-load-clustering,disable-postmisched-store-clustering,f,i,lui-addi-fusion,lui-load-fusion,m,shifted-zextw-fusion,ventana-veyron,xventanacondops,zaamo,zalrsc,zba,zbb,zbc,zbs,zca,zexth-fusion,zextw-fusion,zicbom,zicbop,zicboz,zicntr,zicsr,zifencei,zihintpause,zihpm,zmmul") }, + { str_lit("xiangshan-kunminghu"), str_lit("64bit,a,b,c,d,f,h,i,m,no-default-unroll,sha,shcounterenw,shgatpa,shifted-zextw-fusion,shtvala,shvsatpa,shvstvala,shvstvecd,smaia,smcsrind,smdbltrp,smmpm,smnpm,smrnmi,smstateen,ssaia,ssccptr,sscofpmf,sscounterenw,sscsrind,ssdbltrp,ssnpm,sspm,ssstateen,ssstrict,sstc,sstvala,sstvecd,ssu64xl,supm,svade,svbare,svinval,svnapot,svpbmt,v,za64rs,zaamo,zacas,zalrsc,zawrs,zba,zbb,zbc,zbkb,zbkc,zbkx,zbs,zca,zcb,zcmop,zexth-fusion,zextw-fusion,zfa,zfh,zfhmin,zic64b,zicbom,zicbop,zicboz,ziccamoa,ziccif,zicclsm,ziccrse,zicntr,zicond,zicsr,zifencei,zihintntl,zihintpause,zihpm,zimop,zkn,zknd,zkne,zknh,zks,zksed,zksh,zkt,zmmul,zvbb,zve32f,zve32x,zve64d,zve64f,zve64x,zvfh,zvfhmin,zvkb,zvkt,zvl128b,zvl32b,zvl64b") }, + { str_lit("xiangshan-nanhu"), str_lit("64bit,a,c,d,f,i,m,no-default-unroll,shifted-zextw-fusion,svinval,zaamo,zalrsc,zba,zbb,zbc,zbkb,zbkc,zbkx,zbs,zca,zexth-fusion,zextw-fusion,zicbom,zicboz,zicsr,zifencei,zkn,zknd,zkne,zknh,zksed,zksh,zmmul") }, +}; + +#elif LLVM_VERSION_MAJOR == 21 // Generated with the featuregen script in `misc/featuregen` gb_global String target_microarch_list[TargetArch_COUNT] = { // TargetArch_Invalid: From 82d985b45856c2dc4f767a5686bf875f3deaff7a Mon Sep 17 00:00:00 2001 From: Nathan Chere Date: Wed, 18 Mar 2026 20:31:27 +0100 Subject: [PATCH 190/273] add LLVM 22 support to optimisation pass pipelines --- src/llvm_backend_passes.cpp | 425 +++++++++++++++++++++++++++++++++++- 1 file changed, 422 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend_passes.cpp b/src/llvm_backend_passes.cpp index 744f6af61..5001e29b0 100644 --- a/src/llvm_backend_passes.cpp +++ b/src/llvm_backend_passes.cpp @@ -266,7 +266,7 @@ function( ), verify )"); -#else // LLVM 20 & 21 (same config) +#elif LLVM_VERSION_MAJOR < 22 // LLVM 20 & 21 (same config) array_add(&passes, u8R"( annotation2metadata, forceattrs, @@ -398,6 +398,144 @@ function( verify )"); +#else // LLVM 22 +// Passes removed: coro, openmp + array_add(&passes, u8R"( +memprof-remove-attributes, +annotation2metadata, +forceattrs, +inferattrs, +function( + ee-instrument<>, + lower-expect, + simplifycfg, + sroa, + early-cse<> +), +ipsccp, +called-value-propagation, +globalopt, +function( + mem2reg, + instcombine, + simplifycfg +), +always-inline, +require, +function( + invalidate +), +require, +cgscc( + devirt<4>( + inline, + function-attrs, + function( + sroa, + early-cse, + speculative-execution, + jump-threading, + correlated-propagation, + simplifycfg, + instcombine, + aggressive-instcombine, + tailcallelim, + simplifycfg, + reassociate, + constraint-elimination, + loop-mssa( + loop-instsimplify, + loop-simplifycfg, + licm, + loop-rotate, + licm, + simple-loop-unswitch + ), + simplifycfg, + instcombine, + loop( + loop-idiom, + indvars, + extra-simple-loop-unswitch-passes, + loop-deletion, + loop-unroll-full + ), + sroa, + vector-combine, + mldst-motion, + gvn<>, + sccp, + bdce, + instcombine, + jump-threading, + correlated-propagation, + adce, + memcpyopt, + dse, + move-auto-init, + loop-mssa( + licm + ), + simplifycfg, + instcombine + ), + function-attrs, + function( + require + ) + ) +), +deadargelim, +globalopt, +globaldce, +elim-avail-extern, +rpo-function-attrs, +recompute-globalsaa, +function( + drop-unnecessary-assumes, + float2int, + lower-constant-intrinsics, + loop( + loop-rotate, + loop-deletion + ), + loop-distribute, + inject-tli-mappings, + loop-vectorize, + drop-unnecessary-assumes, + infer-alignment, + loop-load-elim, + instcombine, + simplifycfg, + slp-vectorizer, + vector-combine, + instcombine, + loop-unroll, + transform-warning, + sroa, + infer-alignment, + instcombine, + loop-mssa( + licm + ), + alignment-from-assumptions, + loop-sink, + instsimplify, + div-rem-pairs, + tailcallelim, + simplifycfg +), +alloc-token, +globaldce, +constmerge, +cg-profile, +rel-lookup-table-converter, +function( + annotation-remarks +), +verify +)"); + #endif break; // default @@ -659,7 +797,7 @@ function( ), verify )"); -#else // LLVM 20 & 21 (same config) +#elif LLVM_VERSION_MAJOR < 22 // LLVM 20 & 21 (same config) array_add(&passes, u8R"( annotation2metadata, forceattrs, @@ -792,6 +930,145 @@ function( ), verify )"); + +#else // LLVM 22 +// Passes removed: coro, openmp + array_add(&passes, u8R"( +memprof-remove-attributes, +annotation2metadata, +forceattrs, +inferattrs, +function( + ee-instrument<>, + lower-expect, + simplifycfg, + sroa, + early-cse<> +), +ipsccp, +called-value-propagation, +globalopt, +function( + mem2reg, + instcombine, + simplifycfg +), +always-inline, +require, +function( + invalidate +), +require, +cgscc( + devirt<4>( + inline, + function-attrs, + function( + sroa, + early-cse, + speculative-execution, + jump-threading, + correlated-propagation, + simplifycfg, + instcombine, + aggressive-instcombine, + libcalls-shrinkwrap, + tailcallelim, + simplifycfg, + reassociate, + constraint-elimination, + loop-mssa( + loop-instsimplify, + loop-simplifycfg, + licm, + loop-rotate, + licm, + simple-loop-unswitch + ), + simplifycfg, + instcombine, + loop( + loop-idiom, + indvars, + extra-simple-loop-unswitch-passes, + loop-deletion, + loop-unroll-full + ), + sroa, + vector-combine, + mldst-motion, + gvn<>, + sccp, + bdce, + instcombine, + jump-threading, + correlated-propagation, + adce, + memcpyopt, + dse, + move-auto-init, + loop-mssa( + licm + ), + simplifycfg, + instcombine + ), + function-attrs, + function( + require + ) + ) +), +deadargelim, +globalopt, +globaldce, +elim-avail-extern, +rpo-function-attrs, +recompute-globalsaa, +function( + drop-unnecessary-assumes, + float2int, + lower-constant-intrinsics, + loop( + loop-rotate, + loop-deletion + ), + loop-distribute, + inject-tli-mappings, + loop-vectorize, + drop-unnecessary-assumes, + infer-alignment, + loop-load-elim, + instcombine, + simplifycfg, + slp-vectorizer, + vector-combine, + instcombine, + loop-unroll, + transform-warning, + sroa, + infer-alignment, + instcombine, + loop-mssa( + licm + ), + alignment-from-assumptions, + loop-sink, + instsimplify, + div-rem-pairs, + tailcallelim, + simplifycfg +), +alloc-token, +globaldce, +constmerge, +cg-profile, +rel-lookup-table-converter, +function( + annotation-remarks +), +verify +)"); #endif break; @@ -1055,7 +1332,7 @@ function( ), verify )"); -#else // LLVM 20 & 21 (same config) +#elif LLVM_VERSION_MAJOR < 22 // LLVM 20 & 21 (same config) array_add(&passes, u8R"( annotation2metadata, forceattrs, @@ -1193,6 +1470,148 @@ verify )"); +#else // LLVM 22 +// Passes removed: coro, openmp + array_add(&passes, u8R"( +memprof-remove-attributes, +annotation2metadata, +forceattrs, +inferattrs, +function( + ee-instrument<>, + lower-expect, + simplifycfg, + sroa, + early-cse<>, + callsite-splitting +), +ipsccp, +called-value-propagation, +globalopt, +function( + mem2reg, + instcombine, + simplifycfg +), +always-inline, +require, +function( + invalidate +), +require, +cgscc( + devirt<4>( + inline, + function-attrs, + argpromotion, + function( + sroa, + early-cse, + speculative-execution, + jump-threading, + correlated-propagation, + simplifycfg, + instcombine, + aggressive-instcombine, + libcalls-shrinkwrap, + tailcallelim, + simplifycfg, + reassociate, + constraint-elimination, + loop-mssa( + loop-instsimplify, + loop-simplifycfg, + licm, + loop-rotate, + licm, + simple-loop-unswitch + ), + simplifycfg, + instcombine, + loop( + loop-idiom, + indvars, + extra-simple-loop-unswitch-passes, + loop-deletion, + loop-unroll-full + ), + sroa, + vector-combine, + mldst-motion, + gvn<>, + sccp, + bdce, + instcombine, + jump-threading, + correlated-propagation, + adce, + memcpyopt, + dse, + move-auto-init, + loop-mssa( + licm + ), + simplifycfg, + instcombine + ), + function-attrs, + function( + require + ) + ) +), +deadargelim, +globalopt, +globaldce, +elim-avail-extern, +rpo-function-attrs, +recompute-globalsaa, +function( + drop-unnecessary-assumes, + float2int, + lower-constant-intrinsics, + chr, + loop( + loop-rotate, + loop-deletion + ), + loop-distribute, + inject-tli-mappings, + loop-vectorize, + drop-unnecessary-assumes, + infer-alignment, + loop-load-elim, + instcombine, + simplifycfg, + slp-vectorizer, + vector-combine, + instcombine, + loop-unroll, + transform-warning, + sroa, + infer-alignment, + instcombine, + loop-mssa( + licm + ), + alignment-from-assumptions, + loop-sink, + instsimplify, + div-rem-pairs, + tailcallelim, + simplifycfg +), +alloc-token, +globaldce, +constmerge, +cg-profile, +rel-lookup-table-converter, +function( + annotation-remarks +), +verify +)"); + #endif break; } From 36e6bd4235813ff9111127c12a9a0bec1458f42a Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Wed, 18 Mar 2026 15:37:04 -0400 Subject: [PATCH 191/273] [SDL3/mixer] initial commit --- vendor/sdl3/mixer/LICENSE.txt | 17 + vendor/sdl3/mixer/include/SDL_mixer.h | 3347 +++++++++++++++++++++++++ vendor/sdl3/mixer/sdl3_mixer.odin | 168 ++ 3 files changed, 3532 insertions(+) create mode 100644 vendor/sdl3/mixer/LICENSE.txt create mode 100644 vendor/sdl3/mixer/include/SDL_mixer.h create mode 100644 vendor/sdl3/mixer/sdl3_mixer.odin diff --git a/vendor/sdl3/mixer/LICENSE.txt b/vendor/sdl3/mixer/LICENSE.txt new file mode 100644 index 000000000..acaf5b21b --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.txt @@ -0,0 +1,17 @@ +Copyright (C) 1997-2026 Sam Lantinga + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. diff --git a/vendor/sdl3/mixer/include/SDL_mixer.h b/vendor/sdl3/mixer/include/SDL_mixer.h new file mode 100644 index 000000000..8eca47369 --- /dev/null +++ b/vendor/sdl3/mixer/include/SDL_mixer.h @@ -0,0 +1,3347 @@ +/* + SDL_mixer: An audio mixer library based on the SDL library + Copyright (C) 1997-2026 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/* WIKI CATEGORY: SDLMixer */ + +/** + * # CategorySDLMixer + * + * SDL_mixer is a library to make complicated audio processing tasks easier. + * + * It offers audio file decoding, mixing multiple sounds together, basic 3D + * positional audio, and various audio effects. + * + * It can mix sound to multiple audio devices in real time, or generate mixed + * audio data to a memory buffer for any other use. It can do both at the same + * time! + * + * To use the library, first call MIX_Init(). Then create a mixer with + * MIX_CreateMixerDevice() (or MIX_CreateMixer() to render to memory). + * + * Once you have a mixer, you can load sound data with MIX_LoadAudio(), + * MIX_LoadAudio_IO(), or MIX_LoadAudioWithProperties(). Data gets loaded once + * and can be played over and over. + * + * When loading audio, SDL_mixer can parse out several metadata tag formats, + * such as ID3 and APE tags, and exposes this information through the + * MIX_GetAudioProperties() function. + * + * To play audio, you create a track with MIX_CreateTrack(). You need one + * track for each sound that will be played simultaneously; think of tracks as + * individual sliders on a mixer board. You might have loaded hundreds of + * audio files, but you probably only have a handful of tracks that you assign + * those loaded files to when they are ready to play, and reuse those tracks + * with different audio later. Tracks take their input from a MIX_Audio + * (static data to be played multiple times) or an SDL_AudioStream (streaming + * PCM audio the app supplies, possibly as needed). A third option is to + * supply an SDL_IOStream, to load and decode on the fly, which might be more + * efficient for background music that is only used once, etc. + * + * Assign input to a MIX_Track with MIX_SetTrackAudio(), + * MIX_SetTrackAudioStream(), or MIX_SetTrackIOStream(). + * + * Once a track has an input, start it playing with MIX_PlayTrack(). There are + * many options to this function to dictate mixing features: looping, fades, + * etc. + * + * Tracks can be tagged with arbitrary strings, like "music" or "ingame" or + * "ui". These tags can be used to start, stop, and pause a selection of + * tracks at the same moment. + * + * All significant portions of the mixing pipeline have callbacks, so that an + * app can hook in to the appropriate locations to examine or modify audio + * data as it passes through the mixer: a "raw" callback for raw PCM data + * decoded from an audio file without any modifications, a "cooked" callback + * for that same data after all transformations (fade, positioning, etc) have + * been processed, a "stopped" callback for when the track finishes mixing, a + * "postmix" callback for the final mixed audio about to be sent to the audio + * hardware to play. Additionally, you can use MIX_Group objects to mix a + * subset of playing tracks and access the data before it is mixed in with + * other tracks. All of this is optional, but allows for powerful access and + * control of the mixing process. + * + * SDL_mixer can also be used for decoding audio files without actually + * rendering a mix. This is done with MIX_AudioDecoder. Even though SDL_mixer + * handles decoding transparently when used as the audio engine for an app, + * and probably won't need this interface in that normal scenario, this can be + * useful when using a different audio library to access many file formats. + * + * This library offers several features on top of mixing sounds together: a + * track can have its own gain, to adjust its volume, in addition to a master + * gain applied as well. One can set the "frequency ratio" of a track or the + * final mixed output, to speed it up or slow it down, which also adjusts its + * pitch. A channel map can also be applied per-track, to change what speaker + * a given channel of audio is output to. + * + * Almost all timing in SDL_mixer is in _sample frames_. Stereo PCM audio data + * in Sint16 format takes 4 bytes per sample frame (2 bytes per sample times 2 + * channels), for example. This allows everything in SDL_mixer to run at + * sample-perfect accuracy, and it lets it run without concern for wall clock + * time--you can produce audio faster than real-time, if desired. The problem, + * though, is different pieces of audio at different _sample rates_ will + * produce a different number of sample frames for the same length of time. To + * deal with this, conversion routines are offered: MIX_TrackMSToFrames(), + * MIX_TrackFramesToMS(), etc. Functions that operate on multiple tracks at + * once will deal with time in milliseconds, so it can do these conversions + * internally; be sure to read the documentation for these small quirks! + * + * SDL_mixer offers basic positional audio: a simple 3D positioning API + * through MIX_SetTrack3DPosition() and MIX_SetTrackStereo(). The former will + * do simple distance attenuation and spatialization--on a stereo setup, you + * will hear sounds move from left to right--and on a surround-sound + * configuration, individual tracks can move around the user. The latter, + * MIX_SetTrackStereo(), will force a sound to the Front Left and Front Right + * speakers and let the app pan it left and right as desired. Either effect + * can be useful for different situations. SDL_mixer is not meant to be a full + * 3D audio engine, but rather Good Enough for many purposes; if something + * more powerful in terms of 3D audio is needed, consider a proper 3D library + * like OpenAL. + */ + +#ifndef SDL_MIXER_H_ +#define SDL_MIXER_H_ + +#include +#include + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * An opaque object that represents a mixer. + * + * The MIX_Mixer is the toplevel object for this library. To use SDL_mixer, + * you must have at least one, but are allowed to have several. Each mixer is + * responsible for generating a single output stream of mixed audio, usually + * to an audio device for realtime playback. + * + * Mixers are either created to feed an audio device (through + * MIX_CreateMixerDevice()), or to generate audio to a buffer in memory, where + * it can be used for anything (through MIX_CreateMixer()). + * + * \since This datatype is available since SDL_mixer 3.0.0. + */ +typedef struct MIX_Mixer MIX_Mixer; + +/** + * An opaque object that represents audio data. + * + * Generally you load audio data (in whatever file format) into SDL_mixer with + * MIX_LoadAudio() or one of its several variants, producing a MIX_Audio + * object. + * + * A MIX_Audio represents static audio data; it could be background music, or + * maybe a laser gun sound effect. It is loaded into RAM and can be played + * multiple times, possibly on different tracks at the same time. + * + * Unlike most other objects, MIX_Audio objects can be shared between mixers. + * + * \since This datatype is available since SDL_mixer 3.0.0. + */ +typedef struct MIX_Audio MIX_Audio; + +/** + * An opaque object that represents a source of sound output to be mixed. + * + * A MIX_Mixer has an arbitrary number of tracks, and each track manages its + * own unique audio to be mixed together. + * + * Tracks also have other properties: gain, loop points, fading, 3D position, + * and other attributes that alter the produced sound; many can be altered + * during playback. + * + * \since This datatype is available since SDL_mixer 3.0.0. + */ +typedef struct MIX_Track MIX_Track; + +/** + * An opaque object that represents a grouping of tracks. + * + * SDL_mixer offers callbacks at various stages of the mixing pipeline to + * allow apps to view and manipulate data as it is transformed. Sometimes it + * is useful to hook in at a point where several tracks--but not all tracks-- + * have been mixed. For example, when a game is in some options menu, perhaps + * adjusting game audio but not UI sounds could be useful. + * + * SDL_mixer allows you to assign several tracks to a group, and receive a + * callback when that group has finished mixing, with a buffer of just that + * group's mixed audio, before it mixes into the final output. + * + * \since This datatype is available since SDL_mixer 3.0.0. + */ +typedef struct MIX_Group MIX_Group; + +/** + * The current major version of SDL_mixer headers. + * + * If this were SDL_mixer version 3.2.1, this value would be 3. + * + * \since This macro is available since SDL_mixer 3.0.0. + */ +#define SDL_MIXER_MAJOR_VERSION 3 + +/** + * The current minor version of the SDL_mixer headers. + * + * If this were SDL_mixer version 3.2.1, this value would be 2. + * + * \since This macro is available since SDL_mixer 3.0.0. + */ +#define SDL_MIXER_MINOR_VERSION 2 + +/** + * The current micro (or patchlevel) version of the SDL_mixer headers. + * + * If this were SDL_mixer version 3.2.1, this value would be 1. + * + * \since This macro is available since SDL_mixer 3.0.0. + */ +#define SDL_MIXER_MICRO_VERSION 0 + +/** + * This is the current version number macro of the SDL_mixer headers. + * + * \since This macro is available since SDL_mixer 3.0.0. + * + * \sa MIX_Version + */ +#define SDL_MIXER_VERSION SDL_VERSIONNUM(SDL_MIXER_MAJOR_VERSION, SDL_MIXER_MINOR_VERSION, SDL_MIXER_MICRO_VERSION) + +/** + * This macro will evaluate to true if compiled with SDL_mixer at least X.Y.Z. + * + * \since This macro is available since SDL_mixer 3.0.0. + */ +#define SDL_MIXER_VERSION_ATLEAST(X, Y, Z) \ + ((SDL_MIXER_MAJOR_VERSION >= X) && \ + (SDL_MIXER_MAJOR_VERSION > X || SDL_MIXER_MINOR_VERSION >= Y) && \ + (SDL_MIXER_MAJOR_VERSION > X || SDL_MIXER_MINOR_VERSION > Y || SDL_MIXER_MICRO_VERSION >= Z)) + +/** + * Get the version of SDL_mixer that is linked against your program. + * + * If you are linking to SDL_mixer dynamically, then it is possible that the + * current version will be different than the version you compiled against. + * This function returns the current version, while SDL_MIXER_VERSION is the + * version you compiled with. + * + * This function may be called safely at any time, even before MIX_Init(). + * + * \returns the version of the linked library. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa SDL_MIXER_VERSION + */ +extern SDL_DECLSPEC int SDLCALL MIX_Version(void); + +/** + * Initialize the SDL_mixer library. + * + * This must be successfully called once before (almost) any other SDL_mixer + * function can be used. + * + * It is safe to call this multiple times; the library will only initialize + * once, and won't deinitialize until MIX_Quit() has been called a matching + * number of times. Extra attempts to init report success. + * + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_Quit + */ +extern SDL_DECLSPEC bool SDLCALL MIX_Init(void); + +/** + * Deinitialize the SDL_mixer library. + * + * This must be called when done with the library, probably at the end of your + * program. + * + * It is safe to call this multiple times; the library will only deinitialize + * once, when this function is called the same number of times as MIX_Init was + * successfully called. + * + * Once you have successfully deinitialized the library, it is safe to call + * MIX_Init to reinitialize it for further use. + * + * On successful deinitialization, SDL_mixer will destroy almost all created + * objects, including objects of type: + * + * - MIX_Mixer + * - MIX_Track + * - MIX_Audio + * - MIX_Group + * - MIX_AudioDecoder + * + * ...which is to say: it's possible a single call to this function will clean + * up anything it allocated, stop all audio output, close audio devices, etc. + * Don't attempt to destroy objects after this call. The app is still + * encouraged to manage their resources carefully and clean up first, treating + * this function as a safety net against memory leaks. + * + * \threadsafety This function is not thread safe. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_Init + */ +extern SDL_DECLSPEC void SDLCALL MIX_Quit(void); + +/** + * Report the number of audio decoders available for use. + * + * An audio decoder is what turns specific audio file formats into usable PCM + * data. For example, there might be an MP3 decoder, or a WAV decoder, etc. + * SDL_mixer probably has several decoders built in. + * + * The return value can be used to call MIX_GetAudioDecoder() in a loop. + * + * The number of decoders available is decided during MIX_Init() and does not + * change until the library is deinitialized. + * + * \returns the number of decoders available. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetAudioDecoder + */ +extern SDL_DECLSPEC int SDLCALL MIX_GetNumAudioDecoders(void); + +/** + * Report the name of a specific audio decoders. + * + * An audio decoder is what turns specific audio file formats into usable PCM + * data. For example, there might be an MP3 decoder, or a WAV decoder, etc. + * SDL_mixer probably has several decoders built in. + * + * The names are capital English letters and numbers, low-ASCII. They don't + * necessarily map to a specific file format; Some decoders, like "XMP" + * operate on multiple file types, and more than one decoder might handle the + * same file type, like "DRMP3" vs "MPG123". Note that in that last example, + * neither decoder is called "MP3". + * + * The index of a specific decoder is decided during MIX_Init() and does not + * change until the library is deinitialized. Valid indices are between zero + * and the return value of MIX_GetNumAudioDecoders(). + * + * The returned pointer is const memory owned by SDL_mixer; do not free it. + * + * \param index the index of the decoder to query. + * \returns a UTF-8 (really, ASCII) string of the decoder's name, or NULL if + * `index` is invalid. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetNumAudioDecoders + */ +extern SDL_DECLSPEC const char * SDLCALL MIX_GetAudioDecoder(int index); + +/** + * Create a mixer that plays sound directly to an audio device. + * + * This is usually the function you want, vs MIX_CreateMixer(). + * + * You can choose a specific device ID to open, following SDL's usual rules, + * but often the correct choice is to specify + * SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK and let SDL figure out what device to use + * (and seamlessly transition you to new hardware if the default changes). + * + * Only playback devices make sense here. Attempting to open a recording + * device will fail. + * + * This will call SDL_Init(SDL_INIT_AUDIO) internally; it's safe to call + * SDL_Init() before this call, too, if you intend to enumerate audio devices + * to choose one to open here. + * + * An audio format can be requested, and the system will try to set the + * hardware to those specifications, or as close as possible, but this is just + * a hint. SDL_mixer will handle all data conversion behind the scenes in any + * case, and specifying a NULL spec is a reasonable choice. The best reason to + * specify a format is because you know all your data is in that format and it + * might save some unnecessary CPU time on conversion. + * + * The actual device format chosen is available through MIX_GetMixerFormat(). + * + * Once a mixer is created, next steps are usually to load audio (through + * MIX_LoadAudio() and friends), create a track (MIX_CreateTrack()), and play + * that audio through that track. + * + * When done with the mixer, it can be destroyed with MIX_DestroyMixer(). + * + * \param devid the device to open for playback, or + * SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK for the default. + * \param spec the audio format to request from the device. May be NULL. + * \returns a mixer that can be used to play audio, or NULL on failure; call + * SDL_GetError() for more information. + * + * \threadsafety This function should only be called on the main thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateMixer + * \sa MIX_DestroyMixer + */ +extern SDL_DECLSPEC MIX_Mixer * SDLCALL MIX_CreateMixerDevice(SDL_AudioDeviceID devid, const SDL_AudioSpec *spec); + +/** + * Create a mixer that generates audio to a memory buffer. + * + * Usually you want MIX_CreateMixerDevice() instead of this function. The + * mixer created here can be used with MIX_Generate() to produce more data on + * demand, as fast as desired. + * + * An audio format must be specified. This is the format it will output in. + * This cannot be NULL. + * + * Once a mixer is created, next steps are usually to load audio (through + * MIX_LoadAudio() and friends), create a track (MIX_CreateTrack()), and play + * that audio through that track. + * + * When done with the mixer, it can be destroyed with MIX_DestroyMixer(). + * + * \param spec the audio format that mixer will generate. + * \returns a mixer that can be used to generate audio, or NULL on failure; + * call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateMixerDevice + * \sa MIX_DestroyMixer + */ +extern SDL_DECLSPEC MIX_Mixer * SDLCALL MIX_CreateMixer(const SDL_AudioSpec *spec); + +/** + * Free a mixer. + * + * If this mixer was created with MIX_CreateMixerDevice(), this function will + * also close the audio device and call SDL_QuitSubSystem(SDL_INIT_AUDIO). + * + * Any MIX_Group or MIX_Track created for this mixer will also be destroyed. + * Do not access them again or attempt to destroy them after the device is + * destroyed. MIX_Audio objects will not be destroyed, since they can be + * shared between mixers (but those will all be destroyed during MIX_Quit()). + * + * \param mixer the mixer to destroy. + * + * \threadsafety If this is used with a MIX_Mixer from MIX_CreateMixerDevice, + * then this function should only be called on the main thread. + * If this is used with a MIX_Mixer from MIX_CreateMixer, then + * it is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateMixerDevice + * \sa MIX_CreateMixer + */ +extern SDL_DECLSPEC void SDLCALL MIX_DestroyMixer(MIX_Mixer *mixer); + + +/** + * Get the properties associated with a mixer. + * + * The following read-only properties are provided by SDL_mixer: + * + * - `MIX_PROP_MIXER_DEVICE_NUMBER`: the SDL_AudioDeviceID that this mixer has + * opened for playback. This will be zero (no device) if the mixer was + * created with Mix_CreateMixer() instead of Mix_CreateMixerDevice(). + * + * \param mixer the mixer to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL MIX_GetMixerProperties(MIX_Mixer *mixer); + +#define MIX_PROP_MIXER_DEVICE_NUMBER "SDL_mixer.mixer.device" + + +/** + * Get the audio format a mixer is generating. + * + * Generally you don't need this information, as SDL_mixer will convert data + * as necessary between inputs you provide and its output format, but it might + * be useful if trying to match your inputs to reduce conversion and + * resampling costs. + * + * For mixers created with MIX_CreateMixerDevice(), this is the format of the + * audio device (and may change later if the device itself changes; SDL_mixer + * will seamlessly handle this change internally, though). + * + * For mixers created with MIX_CreateMixer(), this is the format that + * MIX_Generate() will produce, as requested at create time, and does not + * change. + * + * Note that internally, SDL_mixer will work in SDL_AUDIO_F32 format before + * outputting the format specified here, so it would be more efficient to + * match input data to that, not the final output format. + * + * \param mixer the mixer to query. + * \param spec where to store the mixer audio format. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_GetMixerFormat(MIX_Mixer *mixer, SDL_AudioSpec *spec); + +/** + * Lock a mixer by obtaining its internal mutex. + * + * While locked, the mixer will not be able to mix more audio or change its + * internal state in another thread. Those other threads will block until the + * mixer is unlocked again. + * + * Under the hood, this function calls SDL_LockMutex(), so all the same rules + * apply: the lock can be recursive, it must be unlocked the same number of + * times from the same thread that locked it, etc. + * + * Just about every SDL_mixer API _also_ locks the mixer while doing its work, + * as does the SDL audio device thread while actual mixing is in progress, so + * basic use of this library never requires the app to explicitly lock the + * device to be thread safe. There are two scenarios where this can be useful, + * however: + * + * - The app has a provided a callback that the mixing thread might call, and + * there is some app state that needs to be protected against race + * conditions as changes are made and mixing progresses simultaneously. Any + * lock can be used for this, but this is a conveniently-available lock. + * - The app wants to make multiple, atomic changes to the mix. For example, + * to start several tracks at the exact same moment, one would lock the + * mixer, call MIX_PlayTrack multiple times, and then unlock again; all the + * tracks will start mixing on the same sample frame. + * + * Each call to this function must be paired with a call to MIX_UnlockMixer + * from the same thread. It is safe to lock a mixer multiple times; it remains + * locked until the final matching unlock call. + * + * Do not lock the mixer for significant amounts of time, or it can cause + * audio dropouts. Just do simply things quickly and unlock again. + * + * Locking a NULL mixer is a safe no-op. + * + * \param mixer the mixer to lock. May be NULL. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_UnlockMixer + */ +extern SDL_DECLSPEC void SDLCALL MIX_LockMixer(MIX_Mixer *mixer); + +/** + * Unlock a mixer previously locked by a call to MIX_LockMixer(). + * + * While locked, the mixer will not be able to mix more audio or change its + * internal state another thread. Those other threads will block until the + * mixer is unlocked again. + * + * Under the hood, this function calls SDL_LockMutex(), so all the same rules + * apply: the lock can be recursive, it must be unlocked the same number of + * times from the same thread that locked it, etc. + * + * Unlocking a NULL mixer is a safe no-op. + * + * \param mixer the mixer to unlock. May be NULL. + * + * \threadsafety This call must be paired with a previous MIX_LockMixer call + * on the same thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_LockMixer + */ +extern SDL_DECLSPEC void SDLCALL MIX_UnlockMixer(MIX_Mixer *mixer); + +/** + * Load audio for playback from an SDL_IOStream. + * + * In normal usage, apps should load audio once, maybe at startup, then play + * it multiple times. + * + * When loading audio, it will be cached fully in RAM in its original data + * format. Each time it plays, the data will be decoded. For example, an MP3 + * will be stored in memory in MP3 format and be decompressed on the fly + * during playback. This is a tradeoff between i/o overhead and memory usage. + * + * If `predecode` is true, the data will be decompressed during load and + * stored as raw PCM data. This might dramatically increase loading time and + * memory usage, but there will be no need to decompress data during playback. + * + * (One could also use MIX_SetTrackIOStream() to bypass loading the data into + * RAM upfront at all, but this offers still different tradeoffs. The correct + * approach depends on the app's needs and employing different approaches in + * different situations can make sense.) + * + * MIX_Audio objects can be shared between mixers. This function takes a + * MIX_Mixer, to imply this is the most likely place it will be used and + * loading should try to match its audio format, but the resulting audio can + * be used elsewhere. If `mixer` is NULL, SDL_mixer will set reasonable + * defaults. + * + * Once a MIX_Audio is created, it can be assigned to a MIX_Track with + * MIX_SetTrackAudio(), or played without any management with MIX_PlayAudio(). + * + * When done with a MIX_Audio, it can be freed with MIX_DestroyAudio(). + * + * This function loads data from an SDL_IOStream. There is also a version that + * loads from a path on the filesystem (MIX_LoadAudio()), and one that accepts + * properties for ultimate control (MIX_LoadAudioWithProperties()). + * + * The SDL_IOStream provided must be able to seek, or loading will fail. If + * the stream can't seek (data is coming from an HTTP connection, etc), + * consider caching the data to memory or disk first and creating a new stream + * to read from there. + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param io the SDL_IOStream to load data from. + * \param predecode if true, data will be fully uncompressed before returning. + * \param closeio true if SDL_mixer should close `io` before returning + * (success or failure). + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadAudio + * \sa MIX_LoadAudioWithProperties + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadAudio_IO(MIX_Mixer *mixer, SDL_IOStream *io, bool predecode, bool closeio); + +/** + * Load audio for playback from a file. + * + * This is equivalent to calling: + * + * ```c + * MIX_LoadAudio_IO(mixer, SDL_IOFromFile(path, "rb"), predecode, true); + * ``` + * + * This function loads data from a path on the filesystem. There is also a + * version that loads from an SDL_IOStream (MIX_LoadAudio_IO()), and one that + * accepts properties for ultimate control (MIX_LoadAudioWithProperties()). + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param path the path on the filesystem to load data from. + * \param predecode if true, data will be fully uncompressed before returning. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadAudio_IO + * \sa MIX_LoadAudioWithProperties + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadAudio(MIX_Mixer *mixer, const char *path, bool predecode); + +/** + * Load audio for playback from a memory buffer without making a copy. + * + * When loading audio through most other LoadAudio functions, the data will be + * cached fully in RAM in its original data format, for decoding on-demand. + * This function does most of the same work as those functions, but instead + * uses a buffer of memory provided by the app that it does not make a copy + * of. + * + * This buffer must live for the entire time the returned MIX_Audio lives, as + * the mixer will access the buffer whenever it needs to mix more data. + * + * This function is meant to maximize efficiency: if the data is already in + * memory and can remain there, don't copy it. This data can be in any + * supported audio file format (WAV, MP3, etc); it will be decoded on the fly + * while mixing. Unlike MIX_LoadAudio(), there is no `predecode` option + * offered here, as this is meant to optimize for data that's already in + * memory and intends to exist there for significant time; since predecoding + * would only need the file format data once, upfront, one could simply wrap + * it in SDL_CreateIOFromConstMem() and pass that to MIX_LoadAudio_IO(). + * + * MIX_Audio objects can be shared between multiple mixers. The `mixer` + * parameter just suggests the most likely mixer to use this audio, in case + * some optimization might be applied, but this is not required, and a NULL + * mixer may be specified. + * + * If `free_when_done` is true, SDL_mixer will call `SDL_free(data)` when the + * returned MIX_Audio is eventually destroyed. This can be useful when the + * data is not static, but rather loaded elsewhere for this specific MIX_Audio + * and simply wants to avoid the extra copy. + * + * As audio format information is obtained from the file format metadata, this + * isn't useful for raw PCM data; in that case, use MIX_LoadRawAudioNoCopy() + * instead, which offers an SDL_AudioSpec. + * + * Once a MIX_Audio is created, it can be assigned to a MIX_Track with + * MIX_SetTrackAudio(), or played without any management with MIX_PlayAudio(). + * + * When done with a MIX_Audio, it can be freed with MIX_DestroyAudio(). + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param data the buffer where the audio data lives. + * \param datalen the size, in bytes, of the buffer. + * \param free_when_done if true, `data` will be given to SDL_free() when the + * MIX_Audio is destroyed. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadRawAudioNoCopy + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadAudioNoCopy(MIX_Mixer *mixer, const void *data, size_t datalen, bool free_when_done); + +/** + * Load audio for playback through a collection of properties. + * + * Please see MIX_LoadAudio_IO() for a description of what the various + * LoadAudio functions do. This function uses properties to dictate how it + * operates, and exposes functionality the other functions don't provide. + * + * SDL_PropertiesID are discussed in + * [SDL's documentation](https://wiki.libsdl.org/SDL3/CategoryProperties) + * . + * + * These are the supported properties: + * + * - `MIX_PROP_AUDIO_LOAD_IOSTREAM_POINTER`: a pointer to an SDL_IOStream to + * be used to load audio data. Required. This stream must be able to seek! + * - `MIX_PROP_AUDIO_LOAD_CLOSEIO_BOOLEAN`: true if SDL_mixer should close the + * SDL_IOStream before returning (success or failure). + * - `MIX_PROP_AUDIO_LOAD_PREDECODE_BOOLEAN`: true if SDL_mixer should fully + * decode and decompress the data before returning. Otherwise it will be + * stored in its original state and decompressed on demand. + * - `MIX_PROP_AUDIO_LOAD_PREFERRED_MIXER_POINTER`: a pointer to a MIX_Mixer, + * in case steps can be made to match its format when decoding. Optional. + * - `MIX_PROP_AUDIO_LOAD_SKIP_METADATA_TAGS_BOOLEAN`: true to skip parsing + * metadata tags, like ID3 and APE tags. This can be used to speed up + * loading _if the data definitely doesn't have these tags_. Some decoders + * will fail if these tags are present when this property is true. + * - `MIX_PROP_AUDIO_DECODER_STRING`: the name of the decoder to use for this + * data. Optional. If not specified, SDL_mixer will examine the data and + * choose the best decoder. These names are the same returned from + * MIX_GetAudioDecoder(). + * + * Specific decoders might accept additional custom properties, such as where + * to find soundfonts for MIDI playback, etc. + * + * \param props a set of properties on how to load audio. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadAudio + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadAudioWithProperties(SDL_PropertiesID props); + +#define MIX_PROP_AUDIO_LOAD_IOSTREAM_POINTER "SDL_mixer.audio.load.iostream" +#define MIX_PROP_AUDIO_LOAD_CLOSEIO_BOOLEAN "SDL_mixer.audio.load.closeio" +#define MIX_PROP_AUDIO_LOAD_PREDECODE_BOOLEAN "SDL_mixer.audio.load.predecode" +#define MIX_PROP_AUDIO_LOAD_PREFERRED_MIXER_POINTER "SDL_mixer.audio.load.preferred_mixer" +#define MIX_PROP_AUDIO_LOAD_SKIP_METADATA_TAGS_BOOLEAN "SDL_mixer.audio.load.skip_metadata_tags" +#define MIX_PROP_AUDIO_DECODER_STRING "SDL_mixer.audio.decoder" + +/** + * Load raw PCM data from an SDL_IOStream. + * + * There are other options for _streaming_ raw PCM: an SDL_AudioStream can be + * connected to a track, as can an SDL_IOStream, and will read from those + * sources on-demand when it is time to mix the audio. This function is useful + * for loading static audio data that is meant to be played multiple times. + * + * This function will load the raw data in its entirety and cache it in RAM. + * + * MIX_Audio objects can be shared between multiple mixers. The `mixer` + * parameter just suggests the most likely mixer to use this audio, in case + * some optimization might be applied, but this is not required, and a NULL + * mixer may be specified. + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param io the SDL_IOStream to load data from. + * \param spec what format the raw data is in. + * \param closeio true if SDL_mixer should close `io` before returning + * (success or failure). + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadRawAudio + * \sa MIX_LoadRawAudioNoCopy + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadRawAudio_IO(MIX_Mixer *mixer, SDL_IOStream *io, const SDL_AudioSpec *spec, bool closeio); + +/** + * Load raw PCM data from a memory buffer. + * + * There are other options for _streaming_ raw PCM: an SDL_AudioStream can be + * connected to a track, as can an SDL_IOStream, and will read from those + * sources on-demand when it is time to mix the audio. This function is useful + * for loading static audio data that is meant to be played multiple times. + * + * This function will load the raw data in its entirety and cache it in RAM, + * allocating a copy. If the original data will outlive the created MIX_Audio, + * you can use MIX_LoadRawAudioNoCopy() to avoid extra allocations and copies. + * + * MIX_Audio objects can be shared between multiple mixers. The `mixer` + * parameter just suggests the most likely mixer to use this audio, in case + * some optimization might be applied, but this is not required, and a NULL + * mixer may be specified. + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param data the raw PCM data to load. + * \param datalen the size, in bytes, of the raw PCM data. + * \param spec what format the raw data is in. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadRawAudio_IO + * \sa MIX_LoadRawAudioNoCopy + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadRawAudio(MIX_Mixer *mixer, const void *data, size_t datalen, const SDL_AudioSpec *spec); + +/** + * Load raw PCM data from a memory buffer without making a copy. + * + * This buffer must live for the entire time the returned MIX_Audio lives, as + * the mixer will access the buffer whenever it needs to mix more data. + * + * This function is meant to maximize efficiency: if the data is already in + * memory and can remain there, don't copy it. But it can also lead to some + * interesting tricks, like changing the buffer's contents to alter multiple + * playing tracks at once. (But, of course, be careful when being too clever.) + * + * MIX_Audio objects can be shared between multiple mixers. The `mixer` + * parameter just suggests the most likely mixer to use this audio, in case + * some optimization might be applied, but this is not required, and a NULL + * mixer may be specified. + * + * If `free_when_done` is true, SDL_mixer will call `SDL_free(data)` when the + * returned MIX_Audio is eventually destroyed. This can be useful when the + * data is not static, but rather composed dynamically for this specific + * MIX_Audio and simply wants to avoid the extra copy. + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param data the buffer where the raw PCM data lives. + * \param datalen the size, in bytes, of the buffer. + * \param spec what format the raw data is in. + * \param free_when_done if true, `data` will be given to SDL_free() when the + * MIX_Audio is destroyed. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadRawAudio + * \sa MIX_LoadRawAudio_IO + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_LoadRawAudioNoCopy(MIX_Mixer *mixer, const void *data, size_t datalen, const SDL_AudioSpec *spec, bool free_when_done); + +/** + * Create a MIX_Audio that generates a sinewave. + * + * This is useful just to have _something_ to play, perhaps for testing or + * debugging purposes. + * + * You specify its frequency in Hz (determines the pitch of the sinewave's + * audio) and amplitude (determines the volume of the sinewave: 1.0f is very + * loud, 0.0f is silent). + * + * A number of milliseconds of audio to generate can be specified. Specifying + * a value less than zero will generate infinite audio (when assigned to a + * MIX_Track, the sinewave will play forever). + * + * MIX_Audio objects can be shared between multiple mixers. The `mixer` + * parameter just suggests the most likely mixer to use this audio, in case + * some optimization might be applied, but this is not required, and a NULL + * mixer may be specified. + * + * \param mixer a mixer this audio is intended to be used with. May be NULL. + * \param hz the sinewave's frequency in Hz. + * \param amplitude the sinewave's amplitude from 0.0f to 1.0f. + * \param ms the maximum number of milliseconds of audio to generate, or less + * than zero to generate infinite audio. + * \returns an audio object that can be used to make sound on a mixer, or NULL + * on failure; call SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyAudio + * \sa MIX_SetTrackAudio + * \sa MIX_LoadAudio_IO + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_CreateSineWaveAudio(MIX_Mixer *mixer, int hz, float amplitude, Sint64 ms); + + +/** + * Get the properties associated with a MIX_Audio. + * + * SDL_mixer offers some properties of its own, but this can also be a + * convenient place to store app-specific data. + * + * A SDL_PropertiesID is created the first time this function is called for a + * given MIX_Audio, if necessary. + * + * The following read-only properties are provided by SDL_mixer: + * + * - `MIX_PROP_METADATA_TITLE_STRING`: the audio's title ("Smells Like Teen + * Spirit"). + * - `MIX_PROP_METADATA_ARTIST_STRING`: the audio's artist name ("Nirvana"). + * - `MIX_PROP_METADATA_ALBUM_STRING`: the audio's album name ("Nevermind"). + * - `MIX_PROP_METADATA_COPYRIGHT_STRING`: the audio's copyright info + * ("Copyright (c) 1991") + * - `MIX_PROP_METADATA_TRACK_NUMBER`: the audio's track number on the album + * (1) + * - `MIX_PROP_METADATA_TOTAL_TRACKS_NUMBER`: the total tracks on the album + * (13) + * - `MIX_PROP_METADATA_YEAR_NUMBER`: the year the audio was released (1991) + * - `MIX_PROP_METADATA_DURATION_FRAMES_NUMBER`: The sample frames worth of + * PCM data that comprise this audio. It might be off by a little if the + * decoder only knows the duration as a unit of time. + * - `MIX_PROP_METADATA_DURATION_INFINITE_BOOLEAN`: if true, audio never runs + * out of sound to generate. This isn't necessarily always known to + * SDL_mixer, though. + * + * Other properties, documented with MIX_LoadAudioWithProperties(), may also + * be present. + * + * Note that the metadata properties are whatever SDL_mixer finds in things + * like ID3 tags, and they often have very little standardized formatting, may + * be missing, and can be completely wrong if the original data is + * untrustworthy (like an MP3 from a P2P file sharing service). + * + * \param audio the audio to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL MIX_GetAudioProperties(MIX_Audio *audio); + +#define MIX_PROP_METADATA_TITLE_STRING "SDL_mixer.metadata.title" +#define MIX_PROP_METADATA_ARTIST_STRING "SDL_mixer.metadata.artist" +#define MIX_PROP_METADATA_ALBUM_STRING "SDL_mixer.metadata.album" +#define MIX_PROP_METADATA_COPYRIGHT_STRING "SDL_mixer.metadata.copyright" +#define MIX_PROP_METADATA_TRACK_NUMBER "SDL_mixer.metadata.track" +#define MIX_PROP_METADATA_TOTAL_TRACKS_NUMBER "SDL_mixer.metadata.total_tracks" +#define MIX_PROP_METADATA_YEAR_NUMBER "SDL_mixer.metadata.year" +#define MIX_PROP_METADATA_DURATION_FRAMES_NUMBER "SDL_mixer.metadata.duration_frames" +#define MIX_PROP_METADATA_DURATION_INFINITE_BOOLEAN "SDL_mixer.metadata.duration_infinite" + + +/** + * Get the length of a MIX_Audio's playback in sample frames. + * + * This information is also available via the + * MIX_PROP_METADATA_DURATION_FRAMES_NUMBER property, but it's common enough + * to provide a simple accessor function. + * + * This reports the length of the data in _sample frames_, so sample-perfect + * mixing can be possible. Sample frames are only meaningful as a measure of + * time if the sample rate (frequency) is also known. To convert from sample + * frames to milliseconds, use MIX_AudioFramesToMS(). + * + * Not all audio file formats can report the complete length of the data they + * will produce through decoding: some can't calculate it, some might produce + * infinite audio. + * + * Also, some file formats can only report duration as a unit of time, which + * means SDL_mixer might have to estimate sample frames from that information. + * With less precision, the reported duration might be off by a few sample + * frames in either direction. + * + * This will return a value >= 0 if a duration is known. It might also return + * MIX_DURATION_UNKNOWN or MIX_DURATION_INFINITE. + * + * \param audio the audio to query. + * \returns the length of the audio in sample frames, or MIX_DURATION_UNKNOWN + * or MIX_DURATION_INFINITE. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_GetAudioDuration(MIX_Audio *audio); + +#define MIX_DURATION_UNKNOWN -1 +#define MIX_DURATION_INFINITE -2 + + +/** + * Query the initial audio format of a MIX_Audio. + * + * Note that some audio files can change format in the middle; some explicitly + * support this, but a more common example is two MP3 files concatenated + * together. In many cases, SDL_mixer will correctly handle these sort of + * files, but this function will only report the initial format a file uses. + * + * \param audio the audio to query. + * \param spec on success, audio format details will be stored here. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_GetAudioFormat(MIX_Audio *audio, SDL_AudioSpec *spec); + +/** + * Destroy the specified audio. + * + * MIX_Audio is reference-counted internally, so this function only unrefs it. + * If doing so causes the reference count to drop to zero, the MIX_Audio will + * be deallocated. This allows the system to safely operate if the audio is + * still assigned to a MIX_Track at the time of destruction. The actual + * destroying will happen when the track stops using it. + * + * But from the caller's perspective, once this function is called, it should + * assume the `audio` pointer has become invalid. + * + * Destroying a NULL MIX_Audio is a legal no-op. + * + * \param audio the audio to destroy. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC void SDLCALL MIX_DestroyAudio(MIX_Audio *audio); + +/** + * Create a new track on a mixer. + * + * A track provides a single source of audio. All currently-playing tracks + * will be processed and mixed together to form the final output from the + * mixer. + * + * There are no limits to the number of tracks one may create, beyond running + * out of memory, but in normal practice there are a small number of tracks + * that are reused between all loaded audio as appropriate. + * + * Tracks are unique to a specific MIX_Mixer and can't be transferred between + * them. + * + * \param mixer the mixer on which to create this track. + * \returns a new MIX_Track on success, NULL on error; call SDL_GetError() for + * more informations. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyTrack + */ +extern SDL_DECLSPEC MIX_Track * SDLCALL MIX_CreateTrack(MIX_Mixer *mixer); + +/** + * Destroy the specified track. + * + * If the track is currently playing, it will be stopped immediately, without + * any fadeout. If there is a callback set through + * MIX_SetTrackStoppedCallback(), it will _not_ be called. + * + * If the mixer is currently mixing in another thread, this will block until + * it finishes. + * + * Destroying a NULL MIX_Track is a legal no-op. + * + * \param track the track to destroy. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC void SDLCALL MIX_DestroyTrack(MIX_Track *track); + +/** + * Get the properties associated with a track. + * + * Currently SDL_mixer assigns no properties of its own to a track, but this + * can be a convenient place to store app-specific data. + * + * A SDL_PropertiesID is created the first time this function is called for a + * given track. + * + * \param track the track to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL MIX_GetTrackProperties(MIX_Track *track); + +/** + * Get the MIX_Mixer that owns a MIX_Track. + * + * This is the mixer pointer that was passed to MIX_CreateTrack(). + * + * \param track the track to query. + * \returns the mixer associated with the track, or NULL on error; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC MIX_Mixer * SDLCALL MIX_GetTrackMixer(MIX_Track *track); + +/** + * Set a MIX_Track's input to a MIX_Audio. + * + * A MIX_Audio is audio data stored in RAM (possibly still in a compressed + * form). One MIX_Audio can be assigned to multiple tracks at once. + * + * Once a track has a valid input, it can start mixing sound by calling + * MIX_PlayTrack(), or possibly MIX_PlayTag(). + * + * Calling this function with a NULL audio input is legal, and removes any + * input from the track. If the track was currently playing, the next time the + * mixer runs, it'll notice this and mark the track as stopped, calling any + * assigned MIX_TrackStoppedCallback. + * + * It is legal to change the input of a track while it's playing, however some + * states, like loop points, may cease to make sense with the new audio. In + * such a case, one can call MIX_PlayTrack again to adjust parameters. + * + * The track will hold a reference to the provided MIX_Audio, so it is safe to + * call MIX_DestroyAudio() on it while the track is still using it. The track + * will drop its reference (and possibly free the resources) once it is no + * longer using the MIX_Audio. + * + * \param track the track on which to set a new audio input. + * \param audio the new audio input to set. May be NULL. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackAudio(MIX_Track *track, MIX_Audio *audio); + +/** + * Set a MIX_Track's input to an SDL_AudioStream. + * + * Using an audio stream allows the application to generate any type of audio, + * in any format, possibly procedurally or on-demand, and mix in with all + * other tracks. + * + * When a track uses an audio stream, it will call SDL_GetAudioStreamData as + * it needs more audio to mix. The app can either buffer data to the stream + * ahead of time, or set a callback on the stream to provide data as needed. + * Please refer to SDL's documentation for details. + * + * A given audio stream may only be assigned to a single track at a time; + * duplicate assignments won't return an error, but assigning a stream to + * multiple tracks will cause each track to read from the stream arbitrarily, + * causing confusion and incorrect mixing. + * + * Once a track has a valid input, it can start mixing sound by calling + * MIX_PlayTrack(), or possibly MIX_PlayTag(). + * + * Calling this function with a NULL audio stream is legal, and removes any + * input from the track. If the track was currently playing, the next time the + * mixer runs, it'll notice this and mark the track as stopped, calling any + * assigned MIX_TrackStoppedCallback. + * + * It is legal to change the input of a track while it's playing, however some + * states, like loop points, may cease to make sense with the new audio. In + * such a case, one can call MIX_PlayTrack again to adjust parameters. + * + * The provided audio stream must remain valid until the track no longer needs + * it (either by changing the track's input or destroying the track). + * + * \param track the track on which to set a new audio input. + * \param stream the audio stream to use as the track's input. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackAudioStream(MIX_Track *track, SDL_AudioStream *stream); + +/** + * Set a MIX_Track's input to an SDL_IOStream. + * + * This is not the recommended way to set a track's input, but this can be + * useful for a very specific scenario: a large file, to be played once, that + * must be read from disk in small chunks as needed. In most cases, however, + * it is preferable to create a MIX_Audio ahead of time and use + * MIX_SetTrackAudio() instead. + * + * The stream supplied here should provide an audio file in a supported + * format. SDL_mixer will parse it during this call to make sure it's valid, + * and then will read file data from the stream as it needs to decode more + * during mixing. + * + * The stream must be able to seek through the complete set of data, or this + * function will fail. + * + * A given IOStream may only be assigned to a single track at a time; + * duplicate assignments won't return an error, but assigning a stream to + * multiple tracks will cause each track to read from the stream arbitrarily, + * causing confusion, incorrect mixing, or failure to decode. + * + * Once a track has a valid input, it can start mixing sound by calling + * MIX_PlayTrack(), or possibly MIX_PlayTag(). + * + * Calling this function with a NULL stream is legal, and removes any input + * from the track. If the track was currently playing, the next time the mixer + * runs, it'll notice this and mark the track as stopped, calling any assigned + * MIX_TrackStoppedCallback. + * + * It is legal to change the input of a track while it's playing, however some + * states, like loop points, may cease to make sense with the new audio. In + * such a case, one can call MIX_PlayTrack again to adjust parameters. + * + * The provided stream must remain valid until the track no longer needs it + * (either by changing the track's input or destroying the track). + * + * \param track the track on which to set a new audio input. + * \param io the new i/o stream to use as the track's input. + * \param closeio if true, close the stream when done with it. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackRawIOStream + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackIOStream(MIX_Track *track, SDL_IOStream *io, bool closeio); + +/** + * Set a MIX_Track's input to an SDL_IOStream providing raw PCM data. + * + * This is not the recommended way to set a track's input, but this can be + * useful for a very specific scenario: a large file, to be played once, that + * must be read from disk in small chunks as needed. In most cases, however, + * it is preferable to create a MIX_Audio ahead of time and use + * MIX_SetTrackAudio() instead. + * + * Also, an MIX_SetTrackAudioStream() can _also_ provide raw PCM audio to a + * track, via an SDL_AudioStream, which might be preferable unless the data is + * already coming directly from an SDL_IOStream. + * + * The stream supplied here should provide an audio in raw PCM format. + * + * A given IOStream may only be assigned to a single track at a time; + * duplicate assignments won't return an error, but assigning a stream to + * multiple tracks will cause each track to read from the stream arbitrarily, + * causing confusion and incorrect mixing. + * + * Once a track has a valid input, it can start mixing sound by calling + * MIX_PlayTrack(), or possibly MIX_PlayTag(). + * + * Calling this function with a NULL stream is legal, and removes any input + * from the track. If the track was currently playing, the next time the mixer + * runs, it'll notice this and mark the track as stopped, calling any assigned + * MIX_TrackStoppedCallback. + * + * It is legal to change the input of a track while it's playing, however some + * states, like loop points, may cease to make sense with the new audio. In + * such a case, one can call MIX_PlayTrack again to adjust parameters. + * + * The provided stream must remain valid until the track no longer needs it + * (either by changing the track's input or destroying the track). + * + * \param track the track on which to set a new audio input. + * \param io the new i/o stream to use as the track's input. + * \param spec the format of the PCM data that the SDL_IOStream will provide. + * \param closeio if true, close the stream when done with it. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackAudioStream + * \sa MIX_SetTrackIOStream + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackRawIOStream(MIX_Track *track, SDL_IOStream *io, const SDL_AudioSpec *spec, bool closeio); + + +/** + * Assign an arbitrary tag to a track. + * + * A tag can be any valid C string in UTF-8 encoding. It can be useful to + * group tracks in various ways. For example, everything in-game might be + * marked as "game", so when the user brings up the settings menu, the app can + * pause all tracks involved in gameplay at once, but keep background music + * and menu sound effects running. + * + * A track can have as many tags as desired, until the machine runs out of + * memory. + * + * It's legal to add the same tag to a track more than once; the extra + * attempts will report success but not change anything. + * + * Tags can later be removed with MIX_UntagTrack(). + * + * \param track the track to add a tag to. + * \param tag the tag to add. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_UntagTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_TagTrack(MIX_Track *track, const char *tag); + +/** + * Remove an arbitrary tag from a track. + * + * A tag can be any valid C string in UTF-8 encoding. It can be useful to + * group tracks in various ways. For example, everything in-game might be + * marked as "game", so when the user brings up the settings menu, the app can + * pause all tracks involved in gameplay at once, but keep background music + * and menu sound effects running. + * + * It's legal to remove a tag that the track doesn't have; this function + * doesn't report errors, so this simply does nothing. + * + * Specifying a NULL tag will remove all tags on a track. + * + * \param track the track from which to remove a tag. + * \param tag the tag to remove, or NULL to remove all current tags. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TagTrack + */ +extern SDL_DECLSPEC void SDLCALL MIX_UntagTrack(MIX_Track *track, const char *tag); + +/** + * Get the tags currently associated with a track. + * + * Tags are not provided in any guaranteed order. + * + * \param track the track to query. + * \param count a pointer filled in with the number of tags returned, can be + * NULL. + * \returns an array of the tags, NULL-terminated, or NULL on failure; call + * SDL_GetError() for more information. This is a single allocation + * that should be freed with SDL_free() when it is no longer needed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC char ** SDLCALL MIX_GetTrackTags(MIX_Track *track, int *count); + +/** + * Get all tracks with a specific tag. + * + * Tracks are not provided in any guaranteed order. + * + * \param mixer the mixer to query. + * \param tag the tag to search. + * \param count a pointer filled in with the number of tracks returned, can be + * NULL. + * \returns an array of the tracks, NULL-terminated, or NULL on failure; call + * SDL_GetError() for more information. The returned pointer should + * be freed with SDL_free() when it is no longer needed. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC MIX_Track ** SDLCALL MIX_GetTaggedTracks(MIX_Mixer *mixer, const char *tag, int *count); + +/** + * Seek a playing track to a new position in its input. + * + * (Not to be confused with MIX_SetTrack3DPosition(), which is positioning of + * the track in 3D space, not the playback position of its audio data.) + * + * On a playing track, the next time the mixer runs, it will start mixing from + * the new position. + * + * Position is defined in _sample frames_ of decoded audio, not units of time, + * so that sample-perfect mixing can be achieved. To instead operate in units + * of time, use MIX_TrackMSToFrames() to get the approximate sample frames for + * a given tick. + * + * This function requires an input that can seek (so it can not be used if the + * input was set with MIX_SetTrackAudioStream()), and a audio file format that + * allows seeking. SDL_mixer's decoders for some file formats do not offer + * seeking, or can only seek to times, not exact sample frames, in which case + * the final position may be off by some amount of sample frames. Please check + * your audio data and file bug reports if appropriate. + * + * It's legal to call this function on a track that is stopped, but a future + * call to MIX_PlayTrack() will reset the start position anyhow. Paused tracks + * will resume at the new input position. + * + * \param track the track to change. + * \param frames the sample frame position to seek to. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackPlaybackPosition + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackPlaybackPosition(MIX_Track *track, Sint64 frames); + +/** + * Get the current input position of a playing track. + * + * (Not to be confused with MIX_GetTrack3DPosition(), which is positioning of + * the track in 3D space, not the playback position of its audio data.) + * + * Position is defined in _sample frames_ of decoded audio, not units of time, + * so that sample-perfect mixing can be achieved. To instead operate in units + * of time, use MIX_TrackFramesToMS() to convert the return value to + * milliseconds. + * + * Stopped and paused tracks will report the position when they halted. + * Playing tracks will report the current position, which will change over + * time. + * + * \param track the track to change. + * \returns the track's current sample frame position, or -1 on error; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackPlaybackPosition + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_GetTrackPlaybackPosition(MIX_Track *track); + +/** + * Query whether a given track is fading. + * + * This specifically checks if the track is _not stopped_ (paused or playing), + * and it is fading in or out, and returns the number of frames remaining in + * the fade. + * + * If fading out, the returned value will be negative. When fading in, the + * returned value will be positive. If not fading, this function returns zero. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns 0, but there is no mechanism to distinguish errors from tracks that + * aren't fading. + * + * \param track the track to query. + * \returns less than 0 if the track is fading out, greater than 0 if fading + * in, zero otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_GetTrackFadeFrames(MIX_Track *track); + +/** + * Query how many loops remain for a given track. + * + * This returns the number of loops still pending; if a track will eventually + * complete and loop to play again one more time, this will return 1. If a + * track _was_ looping but is on its final iteration of the loop (will stop + * when this iteration completes), this will return zero. + * + * A track that is looping infinitely will return -1. This value does not + * report an error in this case. + * + * A track that is stopped (not playing and not paused) will have zero loops + * remaining. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns zero, but there is no mechanism to distinguish errors from + * non-looping tracks. + * + * \param track the track to query. + * \returns the number of pending loops, zero if not looping, and -1 if + * looping infinitely. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC int SDLCALL MIX_GetTrackLoops(MIX_Track *track); + +/** + * Change the number of times a currently-playing track will loop. + * + * This replaces any previously-set remaining loops. A value of 1 will loop to + * the start of playback one time. Zero will not loop at all. A value of -1 + * requests infinite loops. If the input is not seekable and `num_loops` isn't + * zero, this function will report success but the track will stop at the + * point it should loop. + * + * The new loop count replaces any previous state, even if the track has + * already looped. + * + * This has no effect on a track that is stopped, or rather, starting a + * stopped track later will set a new loop count, replacing this value. + * Stopped tracks can specify a loop count while starting via + * MIX_PROP_PLAY_LOOPS_NUMBER. This function is intended to alter that count + * in the middle of playback. + * + * \param track the track to configure. + * \param num_loops new number of times to loop. Zero to disable looping, -1 + * to loop infinitely. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackLoops + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackLoops(MIX_Track *track, int num_loops); + +/** + * Query the MIX_Audio assigned to a track. + * + * This returns the MIX_Audio object currently assigned to `track` through a + * call to MIX_SetTrackAudio(). If there is none assigned, or the track has an + * input that isn't a MIX_Audio (such as an SDL_AudioStream or SDL_IOStream), + * this will return NULL. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns NULL, but there is no mechanism to distinguish errors from tracks + * without a valid input. + * + * \param track the track to query. + * \returns a MIX_Audio if available, NULL if not. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackAudioStream + */ +extern SDL_DECLSPEC MIX_Audio * SDLCALL MIX_GetTrackAudio(MIX_Track *track); + +/** + * Query the SDL_AudioStream assigned to a track. + * + * This returns the SDL_AudioStream object currently assigned to `track` + * through a call to MIX_SetTrackAudioStream(). If there is none assigned, or + * the track has an input that isn't an SDL_AudioStream (such as a MIX_Audio + * or SDL_IOStream), this will return NULL. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns NULL, but there is no mechanism to distinguish errors from tracks + * without a valid input. + * + * \param track the track to query. + * \returns an SDL_AudioStream if available, NULL if not. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackAudio + */ +extern SDL_DECLSPEC SDL_AudioStream * SDLCALL MIX_GetTrackAudioStream(MIX_Track *track); + +/** + * Return the number of sample frames remaining to be mixed in a track. + * + * If the track is playing or paused, and its total duration is known, this + * will report how much audio is left to mix. If the track is playing, future + * calls to this function will report different values. + * + * Remaining audio is defined in _sample frames_ of decoded audio, not units + * of time, so that sample-perfect mixing can be achieved. To instead operate + * in units of time, use MIX_TrackFramesToMS() to convert the return value to + * milliseconds. + * + * This function does not take into account fade-outs or looping, just the + * current mixing position vs the duration of the track. + * + * If the duration of the track isn't known, or `track` is NULL, this function + * returns -1. A stopped track reports 0. + * + * \param track the track to query. + * \returns the total sample frames still to be mixed, or -1 if unknown. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_GetTrackRemaining(MIX_Track *track); + +/** + * Convert milliseconds to sample frames for a track's current format. + * + * This calculates time based on the track's current input format, which can + * change when its input does, and also if that input changes formats + * mid-stream (for example, if decoding a file that is two MP3s concatenated + * together). + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns -1. If the track has no input, this returns -1. If `ms` is < 0, + * this returns -1. + * + * \param track the track to query. + * \param ms the milliseconds to convert to track-specific sample frames. + * \returns Converted number of sample frames, or -1 for errors/no input; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TrackFramesToMS + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_TrackMSToFrames(MIX_Track *track, Sint64 ms); + +/** + * Convert sample frames for a track's current format to milliseconds. + * + * This calculates time based on the track's current input format, which can + * change when its input does, and also if that input changes formats + * mid-stream (for example, if decoding a file that is two MP3s concatenated + * together). + * + * Sample frames are more precise than milliseconds, so out of necessity, this + * function will approximate by rounding down to the closest full millisecond. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns -1. If the track has no input, this returns -1. If `frames` is < 0, + * this returns -1. + * + * \param track the track to query. + * \param frames the track-specific sample frames to convert to milliseconds. + * \returns Converted number of milliseconds, or -1 for errors/no input; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TrackMSToFrames + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_TrackFramesToMS(MIX_Track *track, Sint64 frames); + +/** + * Convert milliseconds to sample frames for a MIX_Audio's format. + * + * This calculates time based on the audio's initial format, even if the + * format would change mid-stream. + * + * If `ms` is < 0, this returns -1. + * + * \param audio the audio to query. + * \param ms the milliseconds to convert to audio-specific sample frames. + * \returns Converted number of sample frames, or -1 for errors/no input; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_AudioFramesToMS + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_AudioMSToFrames(MIX_Audio *audio, Sint64 ms); + +/** + * Convert sample frames for a MIX_Audio's format to milliseconds. + * + * This calculates time based on the audio's initial format, even if the + * format would change mid-stream. + * + * Sample frames are more precise than milliseconds, so out of necessity, this + * function will approximate by rounding down to the closest full millisecond. + * + * If `frames` is < 0, this returns -1. + * + * \param audio the audio to query. + * \param frames the audio-specific sample frames to convert to milliseconds. + * \returns Converted number of milliseconds, or -1 for errors/no input; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_AudioMSToFrames + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_AudioFramesToMS(MIX_Audio *audio, Sint64 frames); + +/** + * Convert milliseconds to sample frames at a specific sample rate. + * + * If `sample_rate` is <= 0, this returns -1. If `ms` is < 0, this returns -1. + * + * \param sample_rate the sample rate to use for conversion. + * \param ms the milliseconds to convert to rate-specific sample frames. + * \returns Converted number of sample frames, or -1 for errors; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_FramesToMS + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_MSToFrames(int sample_rate, Sint64 ms); + +/** + * Convert sample frames, at a specific sample rate, to milliseconds. + * + * Sample frames are more precise than milliseconds, so out of necessity, this + * function will approximate by rounding down to the closest full millisecond. + * + * If `sample_rate` is <= 0, this returns -1. If `frames` is < 0, this returns + * -1. + * + * \param sample_rate the sample rate to use for conversion. + * \param frames the rate-specific sample frames to convert to milliseconds. + * \returns Converted number of milliseconds, or -1 for errors; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_MSToFrames + */ +extern SDL_DECLSPEC Sint64 SDLCALL MIX_FramesToMS(int sample_rate, Sint64 frames); + + +/* operations that deal with actual mixing/playback... */ + +/** + * Start (or restart) mixing a track for playback. + * + * The track will use whatever input was last assigned to it when playing; an + * input must be assigned to this track or this function will fail. Inputs are + * assigned with calls to MIX_SetTrackAudio(), MIX_SetTrackAudioStream(), or + * MIX_SetTrackIOStream(). + * + * If the track is already playing, or paused, this will restart the track + * with the newly-specified parameters. + * + * As there are several parameters, and more may be added in the future, they + * are specified with an SDL_PropertiesID. The parameters have reasonable + * defaults, and specifying a 0 for `options` will choose defaults for + * everything. + * + * SDL_PropertiesID are discussed in + * [SDL's documentation](https://wiki.libsdl.org/SDL3/CategoryProperties) + * . + * + * These are the supported properties: + * + * - `MIX_PROP_PLAY_LOOPS_NUMBER`: The number of times to loop the track when + * it reaches the end. A value of 1 will loop to the start one time. Zero + * will not loop at all. A value of -1 requests infinite loops. If the input + * is not seekable and this value isn't zero, this function will report + * success but the track will stop at the point it should loop. Default 0. + * - `MIX_PROP_PLAY_MAX_FRAME_NUMBER`: Mix at most to this sample frame + * position in the track. This will be treated as if the input reach EOF at + * this point in the audio file. If -1, mix all available audio without a + * limit. Default -1. + * - `MIX_PROP_PLAY_MAX_MILLISECONDS_NUMBER`: The same as using the + * MIX_PROP_PLAY_MAX_FRAME_NUMBER property, but the value is specified in + * milliseconds instead of sample frames. If both properties are specified, + * the sample frames value is favored. Default -1. + * - `MIX_PROP_PLAY_START_FRAME_NUMBER`: Start mixing from this sample frame + * position in the track's input. A value <= 0 will begin from the start of + * the track's input. If the input is not seekable and this value is > 0, + * this function will report failure. Default 0. + * - `MIX_PROP_PLAY_START_MILLISECOND_NUMBER`: The same as using the + * MIX_PROP_PLAY_START_FRAME_NUMBER property, but the value is specified in + * milliseconds instead of sample frames. If both properties are specified, + * the sample frames value is favored. Default 0. + * - `MIX_PROP_PLAY_LOOP_START_FRAME_NUMBER`: If the track is looping, this is + * the sample frame position that the track will loop back to; this lets one + * play an intro at the start of a track on the first iteration, but have a + * loop point somewhere in the middle thereafter. A value <= 0 will begin + * the loop from the start of the track's input. Default 0. + * - `MIX_PROP_PLAY_LOOP_START_MILLISECOND_NUMBER`: The same as using the + * MIX_PROP_PLAY_LOOP_START_FRAME_NUMBER property, but the value is + * specified in milliseconds instead of sample frames. If both properties + * are specified, the sample frames value is favored. Default 0. + * - `MIX_PROP_PLAY_FADE_IN_FRAMES_NUMBER`: The number of sample frames over + * which to fade in the newly-started track. The track will begin mixing + * silence and reach full volume smoothly over this many sample frames. If + * the track loops before the fade-in is complete, it will continue to fade + * correctly from the loop point. A value <= 0 will disable fade-in, so the + * track starts mixing at full volume. Default 0. + * - `MIX_PROP_PLAY_FADE_IN_MILLISECONDS_NUMBER`: The same as using the + * MIX_PROP_PLAY_FADE_IN_FRAMES_NUMBER property, but the value is specified + * in milliseconds instead of sample frames. If both properties are + * specified, the sample frames value is favored. Default 0. + * - `MIX_PROP_PLAY_FADE_IN_START_GAIN_FLOAT`: If fading in, start fading from + * this volume level. 0.0f is silence and 1.0f is full volume, every in + * between is a linear change in gain. The specified value will be clamped + * between 0.0f and 1.0f. Default 0.0f. + * - `MIX_PROP_PLAY_APPEND_SILENCE_FRAMES_NUMBER`: At the end of mixing this + * track, after all loops are complete, append this many sample frames of + * silence as if it were part of the audio file. This allows for apps to + * implement effects in callbacks, like reverb, that need to generate + * samples past the end of the stream's audio, or perhaps introduce a delay + * before starting a new sound on the track without having to manage it + * directly. A value <= 0 generates no silence before stopping the track. + * Default 0. + * - `MIX_PROP_PLAY_APPEND_SILENCE_MILLISECONDS_NUMBER`: The same as using the + * MIX_PROP_PLAY_APPEND_SILENCE_FRAMES_NUMBER property, but the value is + * specified in milliseconds instead of sample frames. If both properties + * are specified, the sample frames value is favored. Default 0. + * - `MIX_PROP_PLAY_HALT_WHEN_EXHAUSTED_BOOLEAN`: If true, when input is + * completely consumed for the track, the mixer will mark the track as + * stopped (and call any appropriate MIX_TrackStoppedCallback, etc); to play + * more, the track will need to be restarted. If false, the track will just + * not contribute to the mix, but it will not be marked as stopped. There + * may be clever logic tricks this exposes generally, but this property is + * specifically useful when the track's input is an SDL_AudioStream assigned + * via MIX_SetTrackAudioStream(). Setting this property to true can be + * useful when pushing a complete piece of audio to the stream that has a + * definite ending, as the track will operate like any other audio was + * applied. Setting to false means as new data is added to the stream, the + * mixer will start using it as soon as possible, which is useful when audio + * should play immediately as it drips in: new VoIP packets, etc. Note that + * in this situation, if the audio runs out when needed, there _will_ be + * gaps in the mixed output, so try to buffer enough data to avoid this when + * possible. Note that a track is not consider exhausted until all its loops + * and appended silence have been mixed (and also, that loops don't mean + * anything when the input is an AudioStream). Default true. + * + * If this function fails, mixing of this track will not start (or restart, if + * it was already started). + * + * \param track the track to start (or restart) mixing. + * \param options a set of properties that control playback. May be zero. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTag + * \sa MIX_PlayAudio + * \sa MIX_StopTrack + * \sa MIX_PauseTrack + * \sa MIX_TrackPlaying + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PlayTrack(MIX_Track *track, SDL_PropertiesID options); + +#define MIX_PROP_PLAY_LOOPS_NUMBER "SDL_mixer.play.loops" +#define MIX_PROP_PLAY_MAX_FRAME_NUMBER "SDL_mixer.play.max_frame" +#define MIX_PROP_PLAY_MAX_MILLISECONDS_NUMBER "SDL_mixer.play.max_milliseconds" +#define MIX_PROP_PLAY_START_FRAME_NUMBER "SDL_mixer.play.start_frame" +#define MIX_PROP_PLAY_START_MILLISECOND_NUMBER "SDL_mixer.play.start_millisecond" +#define MIX_PROP_PLAY_LOOP_START_FRAME_NUMBER "SDL_mixer.play.loop_start_frame" +#define MIX_PROP_PLAY_LOOP_START_MILLISECOND_NUMBER "SDL_mixer.play.loop_start_millisecond" +#define MIX_PROP_PLAY_FADE_IN_FRAMES_NUMBER "SDL_mixer.play.fade_in_frames" +#define MIX_PROP_PLAY_FADE_IN_MILLISECONDS_NUMBER "SDL_mixer.play.fade_in_milliseconds" +#define MIX_PROP_PLAY_FADE_IN_START_GAIN_FLOAT "SDL_mixer.play.fade_in_start_gain" +#define MIX_PROP_PLAY_APPEND_SILENCE_FRAMES_NUMBER "SDL_mixer.play.append_silence_frames" +#define MIX_PROP_PLAY_APPEND_SILENCE_MILLISECONDS_NUMBER "SDL_mixer.play.append_silence_milliseconds" +#define MIX_PROP_PLAY_HALT_WHEN_EXHAUSTED_BOOLEAN "SDL_mixer.play.halt_when_exhausted" + +/** + * Start (or restart) mixing all tracks with a specific tag for playback. + * + * This function follows all the same rules as MIX_PlayTrack(); please refer + * to its documentation for the details. Unlike that function, MIX_PlayTag() + * operates on multiple tracks at once that have the specified tag applied, + * via MIX_TagTrack(). + * + * If all of your tagged tracks have different sample rates, it would make + * sense to use the `*_MILLISECONDS_NUMBER` properties in your `options`, + * instead of `*_FRAMES_NUMBER`, and let SDL_mixer figure out how to apply it + * to each track. + * + * This function returns true if all tagged tracks are started (or restarted). + * If any track fails, this function returns false, but all tracks that could + * start will still be started even when this function reports failure. + * + * From the point of view of the mixing process, all tracks that successfully + * (re)start will do so at the exact same moment. + * + * \param mixer the mixer on which to look for tagged tracks. + * \param tag the tag to use when searching for tracks. + * \param options the set of options that will be applied to each track. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTrack + * \sa MIX_TagTrack + * \sa MIX_StopTrack + * \sa MIX_PauseTrack + * \sa MIX_TrackPlaying + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PlayTag(MIX_Mixer *mixer, const char *tag, SDL_PropertiesID options); + +/** + * Play a MIX_Audio from start to finish without any management. + * + * This is what we term a "fire-and-forget" sound. Internally, SDL_mixer will + * manage a temporary track to mix the specified MIX_Audio, cleaning it up + * when complete. No options can be provided for how to do the mixing, like + * MIX_PlayTrack() offers, and since the track is not available to the caller, + * no adjustments can be made to mixing over time. + * + * This is not the function to build an entire game of any complexity around, + * but it can be convenient to play simple, one-off sounds that can't be + * stopped early. An example would be a voice saying "GAME OVER" during an + * unpausable endgame sequence. + * + * There are no limits to the number of fire-and-forget sounds that can mix at + * once (short of running out of memory), and SDL_mixer keeps an internal pool + * of temporary tracks it creates as needed and reuses when available. + * + * \param mixer the mixer on which to play this audio. + * \param audio the audio input to play. + * \returns true if the track has begun mixing, false on error; call + * SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTrack + * \sa MIX_LoadAudio + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PlayAudio(MIX_Mixer *mixer, MIX_Audio *audio); + +/** + * Halt a currently-playing track, possibly fading out over time. + * + * If `fade_out_frames` is > 0, the track does not stop mixing immediately, + * but rather fades to silence over that many sample frames before stopping. + * Sample frames are specific to the input assigned to the track, to allow for + * sample-perfect mixing. MIX_TrackMSToFrames() can be used to convert + * milliseconds to an appropriate value here. + * + * If the track ends normally while the fade-out is still in progress, the + * audio stops there; the fade is not adjusted to be shorter if it will last + * longer than the audio remaining. + * + * Once a track has completed any fadeout and come to a stop, it will call its + * MIX_TrackStoppedCallback, if any. It is legal to assign the track a new + * input and/or restart it during this callback. + * + * It is legal to halt a track that's already stopped. It does nothing, and + * returns true. + * + * \param track the track to halt. + * \param fade_out_frames the number of sample frames to spend fading out to + * silence before halting. 0 to stop immediately. + * \returns true if the track has stopped, false on error; call SDL_GetError() + * for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_StopTrack(MIX_Track *track, Sint64 fade_out_frames); + +/** + * Halt all currently-playing tracks, possibly fading out over time. + * + * If `fade_out_ms` is > 0, the tracks do not stop mixing immediately, but + * rather fades to silence over that many milliseconds before stopping. Note + * that this is different than MIX_StopTrack(), which wants sample frames; + * this function takes milliseconds because different tracks might have + * different sample rates. + * + * If a track ends normally while the fade-out is still in progress, the audio + * stops there; the fade is not adjusted to be shorter if it will last longer + * than the audio remaining. + * + * Once a track has completed any fadeout and come to a stop, it will call its + * MIX_TrackStoppedCallback, if any. It is legal to assign the track a new + * input and/or restart it during this callback. This function does not + * prevent new play requests from being made. + * + * \param mixer the mixer on which to stop all tracks. + * \param fade_out_ms the number of milliseconds to spend fading out to + * silence before halting. 0 to stop immediately. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_StopTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_StopAllTracks(MIX_Mixer *mixer, Sint64 fade_out_ms); + +/** + * Halt all tracks with a specific tag, possibly fading out over time. + * + * If `fade_out_ms` is > 0, the tracks do not stop mixing immediately, but + * rather fades to silence over that many milliseconds before stopping. Note + * that this is different than MIX_StopTrack(), which wants sample frames; + * this function takes milliseconds because different tracks might have + * different sample rates. + * + * If a track ends normally while the fade-out is still in progress, the audio + * stops there; the fade is not adjusted to be shorter if it will last longer + * than the audio remaining. + * + * Once a track has completed any fadeout and come to a stop, it will call its + * MIX_TrackStoppedCallback, if any. It is legal to assign the track a new + * input and/or restart it during this callback. This function does not + * prevent new play requests from being made. + * + * \param mixer the mixer on which to stop tracks. + * \param tag the tag to use when searching for tracks. + * \param fade_out_ms the number of milliseconds to spend fading out to + * silence before halting. 0 to stop immediately. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_StopTrack + * \sa MIX_TagTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_StopTag(MIX_Mixer *mixer, const char *tag, Sint64 fade_out_ms); + +/** + * Pause a currently-playing track. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * It is legal to pause a track that's in any state (playing, already paused, + * or stopped). Unless the track is currently playing, pausing does nothing, + * and returns true. A false return is only used to signal errors here (such + * as MIX_Init not being called or `track` being NULL). + * + * \param track the track to pause. + * \returns true if the track has paused, false on error; call SDL_GetError() + * for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_ResumeTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PauseTrack(MIX_Track *track); + +/** + * Pause all currently-playing tracks. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * This function makes all tracks on the specified mixer that are currently + * playing move to a paused state. They can later be resumed. + * + * \param mixer the mixer on which to pause all tracks. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_ResumeTrack + * \sa MIX_ResumeAllTracks + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PauseAllTracks(MIX_Mixer *mixer); + +/** + * Pause all tracks with a specific tag. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * This function makes all currently-playing tracks on the specified mixer, + * with a specific tag, move to a paused state. They can later be resumed. + * + * Tracks that match the specified tag that aren't currently playing are + * ignored. + * + * \param mixer the mixer on which to pause tracks. + * \param tag the tag to use when searching for tracks. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PauseTrack + * \sa MIX_ResumeTrack + * \sa MIX_ResumeTag + * \sa MIX_TagTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_PauseTag(MIX_Mixer *mixer, const char *tag); + +/** + * Resume a currently-paused track. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * It is legal to resume a track that's in any state (playing, paused, or + * stopped). Unless the track is currently paused, resuming does nothing, and + * returns true. A false return is only used to signal errors here (such as + * MIX_Init not being called or `track` being NULL). + * + * \param track the track to resume. + * \returns true if the track has resumed, false on error; call SDL_GetError() + * for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PauseTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_ResumeTrack(MIX_Track *track); + +/** + * Resume all currently-paused tracks. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * This function makes all tracks on the specified mixer that are currently + * paused move to a playing state. + * + * \param mixer the mixer on which to resume all tracks. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PauseTrack + * \sa MIX_PauseAllTracks + */ +extern SDL_DECLSPEC bool SDLCALL MIX_ResumeAllTracks(MIX_Mixer *mixer); + +/** + * Resume all tracks with a specific tag. + * + * A paused track is not considered "stopped," so its MIX_TrackStoppedCallback + * will not fire if paused, but it won't change state by default, generate + * audio, or generally make progress, until it is resumed. + * + * This function makes all currently-paused tracks on the specified mixer, + * with a specific tag, move to a playing state. + * + * Tracks that match the specified tag that aren't currently paused are + * ignored. + * + * \param mixer the mixer on which to resume tracks. + * \param tag the tag to use when searching for tracks. + * \returns true on success, false on error; call SDL_GetError() for details. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_ResumeTrack + * \sa MIX_PauseTrack + * \sa MIX_PauseTag + * \sa MIX_TagTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_ResumeTag(MIX_Mixer *mixer, const char *tag); + +/** + * Query if a track is currently playing. + * + * If this returns true, the track is currently contributing to the mixer's + * output (it's "playing"). It is not stopped nor paused. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns false, but there is no mechanism to distinguish errors from + * non-playing tracks. + * + * \param track the track to query. + * \returns true if playing, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTrack + * \sa MIX_PauseTrack + * \sa MIX_ResumeTrack + * \sa MIX_StopTrack + * \sa MIX_TrackPaused + */ +extern SDL_DECLSPEC bool SDLCALL MIX_TrackPlaying(MIX_Track *track); + +/** + * Query if a track is currently paused. + * + * If this returns true, the track is not currently contributing to the + * mixer's output but will when resumed (it's "paused"). It is not playing nor + * stopped. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns false, but there is no mechanism to distinguish errors from + * non-playing tracks. + * + * \param track the track to query. + * \returns true if paused, false otherwise. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PlayTrack + * \sa MIX_PauseTrack + * \sa MIX_ResumeTrack + * \sa MIX_StopTrack + * \sa MIX_TrackPlaying + */ +extern SDL_DECLSPEC bool SDLCALL MIX_TrackPaused(MIX_Track *track); + + +/* volume control... */ + +/** + * Set a mixer's master gain control. + * + * Each mixer has a master gain, to adjust the volume of the entire mix. Each + * sample passing through the pipeline is modulated by this gain value. A gain + * of zero will generate silence, 1.0f will not change the mixed volume, and + * larger than 1.0f will increase the volume. Negative values are illegal. + * There is no maximum gain specified, but this can quickly get extremely + * loud, so please be careful with this setting. + * + * A mixer's master gain defaults to 1.0f. + * + * This value can be changed at any time to adjust the future mix. + * + * \param mixer the mixer to adjust. + * \param gain the new gain value. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetMixerGain + * \sa MIX_SetTrackGain + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetMixerGain(MIX_Mixer *mixer, float gain); + +/** + * Get a mixer's master gain control. + * + * This returns the last value set through MIX_SetMixerGain(), or 1.0f if no + * value has ever been explicitly set. + * + * \param mixer the mixer to query. + * \returns the mixer's current master gain. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetMixerGain + * \sa MIX_GetTrackGain + */ +extern SDL_DECLSPEC float SDLCALL MIX_GetMixerGain(MIX_Mixer *mixer); + +/** + * Set a track's gain control. + * + * Each track has its own gain, to adjust its overall volume. Each sample from + * this track is modulated by this gain value. A gain of zero will generate + * silence, 1.0f will not change the mixed volume, and larger than 1.0f will + * increase the volume. Negative values are illegal. There is no maximum gain + * specified, but this can quickly get extremely loud, so please be careful + * with this setting. + * + * A track's gain defaults to 1.0f. + * + * This value can be changed at any time to adjust the future mix. + * + * \param track the track to adjust. + * \param gain the new gain value. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackGain + * \sa MIX_SetMixerGain + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackGain(MIX_Track *track, float gain); + +/** + * Get a track's gain control. + * + * This returns the last value set through MIX_SetTrackGain(), or 1.0f if no + * value has ever been explicitly set. + * + * \param track the track to query. + * \returns the track's current gain. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackGain + * \sa MIX_GetMixerGain + */ +extern SDL_DECLSPEC float SDLCALL MIX_GetTrackGain(MIX_Track *track); + +/** + * Set the gain control of all tracks with a specific tag. + * + * Each track has its own gain, to adjust its overall volume. Each sample from + * this track is modulated by this gain value. A gain of zero will generate + * silence, 1.0f will not change the mixed volume, and larger than 1.0f will + * increase the volume. Negative values are illegal. There is no maximum gain + * specified, but this can quickly get extremely loud, so please be careful + * with this setting. + * + * A track's gain defaults to 1.0f. + * + * This will change the gain control on tracks on the specified mixer that + * have the specified tag. + * + * From the point of view of the mixing process, all tracks that successfully + * change gain values will do so at the exact same moment. + * + * This value can be changed at any time to adjust the future mix. + * + * \param mixer the mixer on which to look for tagged tracks. + * \param tag the tag to use when searching for tracks. + * \param gain the new gain value. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackGain + * \sa MIX_SetTrackGain + * \sa MIX_SetMixerGain + * \sa MIX_TagTrack + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTagGain(MIX_Mixer *mixer, const char *tag, float gain); + + +/* frequency ratio ... */ + +/** + * Set a mixer's master frequency ratio. + * + * Each mixer has a master frequency ratio, that affects the entire mix. This + * can cause the final output to change speed and pitch. A value greater than + * 1.0f will play the audio faster, and at a higher pitch. A value less than + * 1.0f will play the audio slower, and at a lower pitch. 1.0f is normal + * speed. + * + * Each track _also_ has a frequency ratio; it will be applied when mixing + * that track's audio regardless of the master setting. The master setting + * affects the final output after all mixing has been completed. + * + * A mixer's master frequency ratio defaults to 1.0f. + * + * This value can be changed at any time to adjust the future mix. + * + * \param mixer the mixer to adjust. + * \param ratio the frequency ratio. Must be between 0.01f and 100.0f. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetMixerFrequencyRatio + * \sa MIX_SetTrackFrequencyRatio + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetMixerFrequencyRatio(MIX_Mixer *mixer, float ratio); + +/** + * Get a mixer's master frequency ratio. + * + * This returns the last value set through MIX_SetMixerFrequencyRatio(), or + * 1.0f if no value has ever been explicitly set. + * + * \param mixer the mixer to query. + * \returns the mixer's current master frequency ratio. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetMixerFrequencyRatio + * \sa MIX_GetTrackFrequencyRatio + */ +extern SDL_DECLSPEC float SDLCALL MIX_GetMixerFrequencyRatio(MIX_Mixer *mixer); + + +/** + * Change the frequency ratio of a track. + * + * The frequency ratio is used to adjust the rate at which audio data is + * consumed. Changing this effectively modifies the speed and pitch of the + * track's audio. A value greater than 1.0f will play the audio faster, and at + * a higher pitch. A value less than 1.0f will play the audio slower, and at a + * lower pitch. 1.0f is normal speed. + * + * The default value is 1.0f. + * + * This value can be changed at any time to adjust the future mix. + * + * \param track the track on which to change the frequency ratio. + * \param ratio the frequency ratio. Must be between 0.01f and 100.0f. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackFrequencyRatio + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackFrequencyRatio(MIX_Track *track, float ratio); + +/** + * Query the frequency ratio of a track. + * + * The frequency ratio is used to adjust the rate at which audio data is + * consumed. Changing this effectively modifies the speed and pitch of the + * track's audio. A value greater than 1.0f will play the audio faster, and at + * a higher pitch. A value less than 1.0f will play the audio slower, and at a + * lower pitch. 1.0f is normal speed. + * + * The default value is 1.0f. + * + * On various errors (MIX_Init() was not called, the track is NULL), this + * returns 0.0f. Since this is not a valid value to set, this can be seen as + * an error state. + * + * \param track the track on which to query the frequency ratio. + * \returns the current frequency ratio, or 0.0f on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrackFrequencyRatio + */ +extern SDL_DECLSPEC float SDLCALL MIX_GetTrackFrequencyRatio(MIX_Track *track); + + +/* channel maps... */ + +/** + * Set the current output channel map of a track. + * + * Channel maps are optional; most things do not need them, instead passing + * data in the order that SDL expects. + * + * The output channel map reorders track data after transformations and before + * it is mixed into a mixer group. This can be useful for reversing stereo + * channels, for example. + * + * Each item in the array represents an input channel, and its value is the + * channel that it should be remapped to. To reverse a stereo signal's left + * and right values, you'd have an array of `{ 1, 0 }`. It is legal to remap + * multiple channels to the same thing, so `{ 1, 1 }` would duplicate the + * right channel to both channels of a stereo signal. An element in the + * channel map set to -1 instead of a valid channel will mute that channel, + * setting it to a silence value. + * + * You cannot change the number of channels through a channel map, just + * reorder/mute them. + * + * Tracks default to no remapping applied. Passing a NULL channel map is + * legal, and turns off remapping. + * + * SDL_mixer will copy the channel map; the caller does not have to save this + * array after this call. + * + * \param track the track to change. + * \param chmap the new channel map, NULL to reset to default. + * \param count The number of channels in the map. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackOutputChannelMap(MIX_Track *track, const int *chmap, int count); + + +/* positional audio... */ + +/** + * A set of per-channel gains for tracks using MIX_SetTrackStereo(). + * + * When forcing a track to stereo, the app can specify a per-channel gain, to + * further adjust the left or right outputs. + * + * When mixing audio that has been forced to stereo, each channel is modulated + * by these values. A value of 1.0f produces no change, 0.0f produces silence. + * + * A simple panning effect would be to set `left` to the desired value and + * `right` to `1.0f - left`. + * + * \since This struct is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackStereo + */ +typedef struct MIX_StereoGains +{ + float left; /**< left channel gain */ + float right; /**< right channel gain */ +} MIX_StereoGains; + +/** + * Force a track to stereo output, with optionally left/right panning. + * + * This will cause the output of the track to convert to stereo, and then mix + * it only onto the Front Left and Front Right speakers, regardless of the + * speaker configuration. The left and right channels are modulated by + * `gains`, which can be used to produce panning effects. This function may be + * called to adjust the gains at any time. + * + * If `gains` is not NULL, this track will be switched into forced-stereo + * mode. If `gains` is NULL, this will disable spatialization (both the + * forced-stereo mode of this function and full 3D spatialization of + * MIX_SetTrack3DPosition()). + * + * Negative gains are clamped to zero; there is no clamp for maximum, so one + * could set the value > 1.0f to make a channel louder. + * + * The track's 3D position, reported by MIX_GetTrack3DPosition(), will be + * reset to (0, 0, 0). + * + * \param track the track to adjust. + * \param gains the per-channel gains, or NULL to disable spatialization. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrack3DPosition + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackStereo(MIX_Track *track, const MIX_StereoGains *gains); + + +/** + * 3D coordinates for MIX_SetTrack3DPosition. + * + * The coordinates use a "right-handed" coordinate system, like OpenGL and + * OpenAL. + * + * \since This struct is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrack3DPosition + */ +typedef struct MIX_Point3D +{ + float x; /**< X coordinate (negative left, positive right). */ + float y; /**< Y coordinate (negative down, positive up). */ + float z; /**< Z coordinate (negative forward, positive back). */ +} MIX_Point3D; + +/** + * Set a track's position in 3D space. + * + * (Please note that SDL_mixer is not intended to be a extremely powerful 3D + * API. It lacks 3D features that other APIs like OpenAL offer: there's no + * doppler effect, distance models, rolloff, etc. This is meant to be Good + * Enough for games that can use some positional sounds and can even take + * advantage of surround-sound configurations.) + * + * If `position` is not NULL, this track will be switched into 3D positional + * mode. If `position` is NULL, this will disable positional mixing (both the + * full 3D spatialization of this function and forced-stereo mode of + * MIX_SetTrackStereo()). + * + * In 3D positional mode, SDL_mixer will mix this track as if it were + * positioned in 3D space, including distance attenuation (quieter as it gets + * further from the listener) and spatialization (positioned on the correct + * speakers to suggest direction, either with stereo outputs or full surround + * sound). + * + * For a mono speaker output, spatialization is effectively disabled but + * distance attenuation will still work, which is all you can really do with a + * single speaker. + * + * The coordinate system operates like OpenGL or OpenAL: a "right-handed" + * coordinate system. See MIX_Point3D for the details. + * + * The listener is always at coordinate (0,0,0) and can't be changed. + * + * The track's input will be converted to mono (1 channel) so it can be + * rendered across the correct speakers. + * + * \param track the track for which to set 3D position. + * \param position the new 3D position for the track. May be NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetTrack3DPosition + * \sa MIX_SetTrackStereo + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrack3DPosition(MIX_Track *track, const MIX_Point3D *position); + +/** + * Get a track's current position in 3D space. + * + * If 3D positioning isn't enabled for this track, through a call to + * MIX_SetTrack3DPosition(), this will return (0,0,0). + * + * \param track the track to query. + * \param position on successful return, will contain the track's position. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrack3DPosition + */ +extern SDL_DECLSPEC bool SDLCALL MIX_GetTrack3DPosition(MIX_Track *track, MIX_Point3D *position); + + +/* Mix groups... */ + +/** + * Create a mixing group. + * + * Tracks are assigned to a mixing group (or if unassigned, they live in a + * mixer's internal default group). All tracks in a group are mixed together + * and the app can access this mixed data before it is mixed with all other + * groups to produce the final output. + * + * This can be a useful feature, but is completely optional; apps can ignore + * mixing groups entirely and still have a full experience with SDL_mixer. + * + * After creating a group, assign tracks to it with MIX_SetTrackGroup(). Use + * MIX_SetGroupPostMixCallback() to access the group's mixed data. + * + * A mixing group can be destroyed with MIX_DestroyGroup() when no longer + * needed. Destroying the mixer will also destroy all its still-existing + * mixing groups. + * + * \param mixer the mixer on which to create a mixing group. + * \returns a newly-created mixing group, or NULL on error; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_DestroyGroup + * \sa MIX_SetTrackGroup + * \sa MIX_SetGroupPostMixCallback + */ +extern SDL_DECLSPEC MIX_Group * SDLCALL MIX_CreateGroup(MIX_Mixer *mixer); + +/** + * Destroy a mixing group. + * + * Any tracks currently assigned to this group will be reassigned to the + * mixer's internal default group. + * + * \param group the mixing group to destroy. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateGroup + */ +extern SDL_DECLSPEC void SDLCALL MIX_DestroyGroup(MIX_Group *group); + +/** + * Get the properties associated with a group. + * + * Currently SDL_mixer assigns no properties of its own to a group, but this + * can be a convenient place to store app-specific data. + * + * A SDL_PropertiesID is created the first time this function is called for a + * given group. + * + * \param group the group to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL MIX_GetGroupProperties(MIX_Group *group); + +/** + * Get the MIX_Mixer that owns a MIX_Group. + * + * This is the mixer pointer that was passed to MIX_CreateGroup(). + * + * \param group the group to query. + * \returns the mixer associated with the group, or NULL on error; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC MIX_Mixer * SDLCALL MIX_GetGroupMixer(MIX_Group *group); + +/** + * Assign a track to a mixing group. + * + * All tracks in a group are mixed together, and that output is made available + * to the app before it is mixed into the final output. + * + * Tracks can only be in one group at a time, and the track and group must + * have been created on the same MIX_Mixer. + * + * Setting a track to a NULL group will remove it from any app-created groups, + * and reassign it to the mixer's internal default group. + * + * \param track the track to set mixing group assignment. + * \param group the new mixing group to assign to. May be NULL. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateGroup + * \sa MIX_SetGroupPostMixCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackGroup(MIX_Track *track, MIX_Group *group); + + + +/* Hooks... */ + +/** + * A callback that fires when a MIX_Track is stopped. + * + * This callback is fired when a track completes playback, either because it + * ran out of data to mix (and all loops were completed as well), or it was + * explicitly stopped by the app. Pausing a track will not fire this callback. + * + * It is legal to adjust the track, including changing its input and + * restarting it. If this is done because it ran out of data in the middle of + * mixing, the mixer will start mixing the new track state in its current run + * without any gap in the audio. + * + * This callback will not fire when a playing track is destroyed. + * + * \param userdata an opaque pointer provided by the app for its personal use. + * \param track the track that has stopped. + * + * \since This datatype is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackStoppedCallback + */ +typedef void (SDLCALL *MIX_TrackStoppedCallback)(void *userdata, MIX_Track *track); + +/** + * Set a callback that fires when a MIX_Track is stopped. + * + * When a track completes playback, either because it ran out of data to mix + * (and all loops were completed as well), or it was explicitly stopped by the + * app, it will fire the callback specified here. + * + * Each track has its own unique callback. + * + * Passing a NULL callback here is legal; it disables this track's callback. + * + * Pausing a track will not fire the callback, nor will the callback fire on a + * playing track that is being destroyed. + * + * It is legal to adjust the track, including changing its input and + * restarting it. If this is done because it ran out of data in the middle of + * mixing, the mixer will start mixing the new track state in its current run + * without any gap in the audio. + * + * \param track the track to assign this callback to. + * \param cb the function to call when the track stops. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TrackStoppedCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackStoppedCallback(MIX_Track *track, MIX_TrackStoppedCallback cb, void *userdata); + +/** + * A callback that fires when a MIX_Track is mixing at various stages. + * + * This callback is fired for different parts of the mixing pipeline, and + * gives the app visbility into the audio data that is being generated at + * various stages. + * + * The audio data passed through here is _not_ const data; the app is + * permitted to change it in any way it likes, and those changes will + * propagate through the mixing pipeline. + * + * An audiospec is provided. Different tracks might be in different formats, + * and an app needs to be able to handle that, but SDL_mixer always does its + * mixing work in 32-bit float samples, even if the inputs or final output are + * not floating point. As such, `spec->format` will always be `SDL_AUDIO_F32` + * and `pcm` hardcoded to be a float pointer. + * + * `samples` is the number of float values pointed to by `pcm`: samples, not + * sample frames! There are no promises how many samples will be provided + * per-callback, and this number can vary wildly from call to call, depending + * on many factors. + * + * Making changes to the track during this callback is undefined behavior. + * Change the data in `pcm` but not the track itself. + * + * \param userdata an opaque pointer provided by the app for its personal use. + * \param track the track that is being mixed. + * \param spec the format of the data in `pcm`. + * \param pcm the raw PCM data in float32 format. + * \param samples the number of float values pointed to by `pcm`. + * + * \since This datatype is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetTrackRawCallback + * \sa MIX_SetTrackCookedCallback + */ +typedef void (SDLCALL *MIX_TrackMixCallback)(void *userdata, MIX_Track *track, const SDL_AudioSpec *spec, float *pcm, int samples); + +/** + * Set a callback that fires when a MIX_Track has initial decoded audio. + * + * As a track needs to mix more data, it pulls from its input (a MIX_Audio, an + * SDL_AudioStream, etc). This input might be a compressed file format, like + * MP3, so a little more data is uncompressed from it. + * + * Once the track has PCM data to start operating on, it can fire a callback + * before _any_ changes to the raw PCM input have happened. This lets an app + * view the data before it has gone through transformations such as gain, 3D + * positioning, fading, etc. It can also change the data in any way it pleases + * during this callback, and the mixer will continue as if this data came + * directly from the input. + * + * Each track has its own unique raw callback. + * + * Passing a NULL callback here is legal; it disables this track's callback. + * + * \param track the track to assign this callback to. + * \param cb the function to call when the track mixes. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TrackMixCallback + * \sa MIX_SetTrackCookedCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackRawCallback(MIX_Track *track, MIX_TrackMixCallback cb, void *userdata); + +/** + * Set a callback that fires when the mixer has transformed a track's audio. + * + * As a track needs to mix more data, it pulls from its input (a MIX_Audio, an + * SDL_AudioStream, etc). This input might be a compressed file format, like + * MP3, so a little more data is uncompressed from it. + * + * Once the track has PCM data to start operating on, and its raw callback has + * completed, it will begin to transform the audio: gain, fading, frequency + * ratio, 3D positioning, etc. + * + * A callback can be fired after all these transformations, but before the + * transformed data is mixed into other tracks. This lets an app view the data + * at the last moment that it is still a part of this track. It can also + * change the data in any way it pleases during this callback, and the mixer + * will continue as if this data came directly from the input. + * + * Each track has its own unique cooked callback. + * + * Passing a NULL callback here is legal; it disables this track's callback. + * + * \param track the track to assign this callback to. + * \param cb the function to call when the track mixes. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_TrackMixCallback + * \sa MIX_SetTrackRawCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetTrackCookedCallback(MIX_Track *track, MIX_TrackMixCallback cb, void *userdata); + +/** + * A callback that fires when a MIX_Group has completed mixing. + * + * This callback is fired when a mixing group has finished mixing: all tracks + * in the group have mixed into a single buffer and are prepared to be mixed + * into all other groups for the final mix output. + * + * The audio data passed through here is _not_ const data; the app is + * permitted to change it in any way it likes, and those changes will + * propagate through the mixing pipeline. + * + * An audiospec is provided. Different groups might be in different formats, + * and an app needs to be able to handle that, but SDL_mixer always does its + * mixing work in 32-bit float samples, even if the inputs or final output are + * not floating point. As such, `spec->format` will always be `SDL_AUDIO_F32` + * and `pcm` hardcoded to be a float pointer. + * + * `samples` is the number of float values pointed to by `pcm`: samples, not + * sample frames! There are no promises how many samples will be provided + * per-callback, and this number can vary wildly from call to call, depending + * on many factors. + * + * \param userdata an opaque pointer provided by the app for its personal use. + * \param group the group that is being mixed. + * \param spec the format of the data in `pcm`. + * \param pcm the raw PCM data in float32 format. + * \param samples the number of float values pointed to by `pcm`. + * + * \since This datatype is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetGroupPostMixCallback + */ +typedef void (SDLCALL *MIX_GroupMixCallback)(void *userdata, MIX_Group *group, const SDL_AudioSpec *spec, float *pcm, int samples); + +/** + * Set a callback that fires when a mixer group has completed mixing. + * + * After all playing tracks in a mixer group have pulled in more data from + * their inputs, transformed it, and mixed together into a single buffer, a + * callback can be fired. This lets an app view the data at the last moment + * that it is still a part of this group. It can also change the data in any + * way it pleases during this callback, and the mixer will continue as if this + * data came directly from the group's mix buffer. + * + * Each group has its own unique callback. Tracks that aren't in an explicit + * MIX_Group are mixed in an internal grouping that is not available to the + * app. + * + * Passing a NULL callback here is legal; it disables this group's callback. + * + * \param group the mixing group to assign this callback to. + * \param cb the function to call when the group mixes. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GroupMixCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetGroupPostMixCallback(MIX_Group *group, MIX_GroupMixCallback cb, void *userdata); + +/** + * A callback that fires when all mixing has completed. + * + * This callback is fired when the mixer has completed all its work. If this + * mixer was created with MIX_CreateMixerDevice(), the data provided by this + * callback is what is being sent to the audio hardware, minus last + * conversions for format requirements. If this mixer was created with + * MIX_CreateMixer(), this is what is being output from MIX_Generate(), after + * final conversions. + * + * The audio data passed through here is _not_ const data; the app is + * permitted to change it in any way it likes, and those changes will replace + * the final mixer pipeline output. + * + * An audiospec is provided. SDL_mixer always does its mixing work in 32-bit + * float samples, even if the inputs or final output are not floating point. + * As such, `spec->format` will always be `SDL_AUDIO_F32` and `pcm` hardcoded + * to be a float pointer. + * + * `samples` is the number of float values pointed to by `pcm`: samples, not + * sample frames! There are no promises how many samples will be provided + * per-callback, and this number can vary wildly from call to call, depending + * on many factors. + * + * \param userdata an opaque pointer provided by the app for its personal use. + * \param mixer the mixer that is generating audio. + * \param spec the format of the data in `pcm`. + * \param pcm the raw PCM data in float32 format. + * \param samples the number of float values pointed to by `pcm`. + * + * \since This datatype is available since SDL_mixer 3.0.0. + * + * \sa MIX_SetPostMixCallback + */ +typedef void (SDLCALL *MIX_PostMixCallback)(void *userdata, MIX_Mixer *mixer, const SDL_AudioSpec *spec, float *pcm, int samples); + +/** + * Set a callback that fires when all mixing has completed. + * + * After all mixer groups have processed, their buffers are mixed together + * into a single buffer for the final output, at which point a callback can be + * fired. This lets an app view the data at the last moment before mixing + * completes. It can also change the data in any way it pleases during this + * callback, and the mixer will continue as if this data is the final output. + * + * Each mixer has its own unique callback. + * + * Passing a NULL callback here is legal; it disables this mixer's callback. + * + * \param mixer the mixer to assign this callback to. + * \param cb the function to call when the mixer mixes. May be NULL. + * \param userdata an opaque pointer provided to the callback for its own + * personal use. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_PostMixCallback + */ +extern SDL_DECLSPEC bool SDLCALL MIX_SetPostMixCallback(MIX_Mixer *mixer, MIX_PostMixCallback cb, void *userdata); + + +/* Audio generation without an audio device... */ + +/** + * Generate mixer output when not driving an audio device. + * + * SDL_mixer allows the creation of MIX_Mixer objects that are not connected + * to an audio device, by calling MIX_CreateMixer() instead of + * MIX_CreateMixerDevice(). Such mixers will not generate output until + * explicitly requested through this function. + * + * The caller may request as much audio as desired, so long as `buflen` is a + * multiple of the sample frame size specified when creating the mixer (for + * example, if requesting stereo Sint16 audio, buflen must be a multiple of 4: + * 2 bytes-per-channel times 2 channels). + * + * The mixer will mix as quickly as possible; since it works in sample frames + * instead of time, it can potentially generate enormous amounts of audio in a + * small amount of time. + * + * On success, this always fills `buffer` with `buflen` bytes of audio; if all + * playing tracks finish mixing, it will fill the remaining buffer with + * silence. + * + * Each call to this function will pick up where it left off, playing tracks + * will continue to mix from the point the previous call completed, etc. The + * mixer state can be changed between each call in any way desired: tracks can + * be added, played, stopped, changed, removed, etc. Effectively this function + * does the same thing SDL_mixer does internally when the audio device needs + * more audio to play. + * + * This function can not be used with mixers from MIX_CreateMixerDevice(); + * those generate audio as needed internally. + * + * This function returns the number of _bytes_ of real audio mixed, which + * might be less than `buflen`. While all `buflen` bytes of `buffer` will be + * initialized, if available tracks to mix run out, the end of the buffer will + * be initialized with silence; this silence will not be counted in the return + * value, so the caller has the option to identify how much of the buffer has + * legimitate contents vs appended silence. As such, any value >= 0 signifies + * success. A return value of -1 means failure (out of memory, invalid + * parameters, etc). + * + * \param mixer the mixer for which to generate more audio. + * \param buffer a pointer to a buffer to store audio in. + * \param buflen the number of bytes to store in buffer. + * \returns The number of bytes of mixed audio, discounting appended silence, + * on success, or -1 on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateMixer + */ +extern SDL_DECLSPEC int SDLCALL MIX_Generate(MIX_Mixer *mixer, void *buffer, int buflen); + + +/* Decode audio files directly without a mixer ... */ + +/** + * An opaque object that represents an audio decoder. + * + * Most apps won't need this, as SDL_mixer's usual interfaces will decode + * audio as needed. However, if one wants to decode an audio file into a + * memory buffer without playing it, this interface offers that. + * + * These objects are created with MIX_CreateAudioDecoder() or + * MIX_CreateAudioDecoder_IO(), and then can use MIX_DecodeAudio() to retrieve + * the raw PCM data. + * + * \since This struct is available since SDL_mixer 3.0.0. + */ +typedef struct MIX_AudioDecoder MIX_AudioDecoder; + +/** + * Create a MIX_AudioDecoder from a path on the filesystem. + * + * Most apps won't need this, as SDL_mixer's usual interfaces will decode + * audio as needed. However, if one wants to decode an audio file into a + * memory buffer without playing it, this interface offers that. + * + * This function allows properties to be specified. This is intended to supply + * file-specific settings, such as where to find SoundFonts for a MIDI file, + * etc. In most cases, the caller should pass a zero to specify no extra + * properties. + * + * SDL_PropertiesID are discussed in + * [SDL's documentation](https://wiki.libsdl.org/SDL3/CategoryProperties) + * . + * + * When done with the audio decoder, it can be destroyed with + * MIX_DestroyAudioDecoder(). + * + * This function requires SDL_mixer to have been initialized with a successful + * call to MIX_Init(), but does not need an actual MIX_Mixer to have been + * created. + * + * \param path the path on the filesystem from which to load data. + * \param props decoder-specific properties. May be zero. + * \returns an audio decoder, ready to decode. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateAudioDecoder_IO + * \sa MIX_DecodeAudio + * \sa MIX_DestroyAudioDecoder + */ +extern SDL_DECLSPEC MIX_AudioDecoder * SDLCALL MIX_CreateAudioDecoder(const char *path, SDL_PropertiesID props); + +/** + * Create a MIX_AudioDecoder from an SDL_IOStream. + * + * Most apps won't need this, as SDL_mixer's usual interfaces will decode + * audio as needed. However, if one wants to decode an audio file into a + * memory buffer without playing it, this interface offers that. + * + * This function allows properties to be specified. This is intended to supply + * file-specific settings, such as where to find SoundFonts for a MIDI file, + * etc. In most cases, the caller should pass a zero to specify no extra + * properties. + * + * If `closeio` is true, then `io` will be closed when this decoder is done + * with it. If this function fails and `closeio` is true, then `io` will be + * closed before this function returns. + * + * When done with the audio decoder, it can be destroyed with + * MIX_DestroyAudioDecoder(). + * + * This function requires SDL_mixer to have been initialized with a successful + * call to MIX_Init(), but does not need an actual MIX_Mixer to have been + * created. + * + * \param io the i/o stream from which to load data. + * \param closeio if true, close the i/o stream when done with it. + * \param props decoder-specific properties. May be zero. + * \returns an audio decoder, ready to decode. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_CreateAudioDecoder_IO + * \sa MIX_DecodeAudio + * \sa MIX_DestroyAudioDecoder + */ +extern SDL_DECLSPEC MIX_AudioDecoder * SDLCALL MIX_CreateAudioDecoder_IO(SDL_IOStream *io, bool closeio, SDL_PropertiesID props); + +/** + * Destroy the specified audio decoder. + * + * Destroying a NULL MIX_AudioDecoder is a legal no-op. + * + * \param audiodecoder the audio to destroy. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC void SDLCALL MIX_DestroyAudioDecoder(MIX_AudioDecoder *audiodecoder); + +/** + * Get the properties associated with a MIX_AudioDecoder. + * + * SDL_mixer offers some properties of its own, but this can also be a + * convenient place to store app-specific data. + * + * A SDL_PropertiesID is created the first time this function is called for a + * given MIX_AudioDecoder, if necessary. + * + * The file-specific metadata exposed through this function is identical to + * those available through MIX_GetAudioProperties(). Please refer to that + * function's documentation for details. + * + * \param audiodecoder the audio decoder to query. + * \returns a valid property ID on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + * + * \sa MIX_GetAudioProperties + */ +extern SDL_DECLSPEC SDL_PropertiesID SDLCALL MIX_GetAudioDecoderProperties(MIX_AudioDecoder *audiodecoder); + +/** + * Query the initial audio format of a MIX_AudioDecoder. + * + * Note that some audio files can change format in the middle; some explicitly + * support this, but a more common example is two MP3 files concatenated + * together. In many cases, SDL_mixer will correctly handle these sort of + * files, but this function will only report the initial format a file uses. + * + * \param audiodecoder the audio decoder to query. + * \param spec on success, audio format details will be stored here. + * \returns true on success or false on failure; call SDL_GetError() for more + * information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC bool SDLCALL MIX_GetAudioDecoderFormat(MIX_AudioDecoder *audiodecoder, SDL_AudioSpec *spec); + +/** + * Decode more audio from a MIX_AudioDecoder. + * + * Data is decoded on demand in whatever format is requested. The format is + * permitted to change between calls. + * + * This function will return the number of bytes decoded, which may be less + * than requested if there was an error or end-of-file. A return value of zero + * means the entire file was decoded, -1 means an unrecoverable error + * happened. + * + * \param audiodecoder the decoder from which to retrieve more data. + * \param buffer the memory buffer to store decoded audio. + * \param buflen the maximum number of bytes to store to `buffer`. + * \param spec the format that audio data will be stored to `buffer`. + * \returns number of bytes decoded, or -1 on error; call SDL_GetError() for + * more information. + * + * \threadsafety It is safe to call this function from any thread. + * + * \since This function is available since SDL_mixer 3.0.0. + */ +extern SDL_DECLSPEC int SDLCALL MIX_DecodeAudio(MIX_AudioDecoder *audiodecoder, void *buffer, int buflen, const SDL_AudioSpec *spec); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include + +#endif /* SDL_MIXER_H_ */ diff --git a/vendor/sdl3/mixer/sdl3_mixer.odin b/vendor/sdl3/mixer/sdl3_mixer.odin new file mode 100644 index 000000000..36e5ecd1e --- /dev/null +++ b/vendor/sdl3/mixer/sdl3_mixer.odin @@ -0,0 +1,168 @@ +package sdl3_mixer + +import "core:c" + +import SDL "vendor:sdl3" + +when ODIN_OS == .Windows { + foreign import lib "SDL3_mixer.lib" +} else { + foreign import lib "system:SDL3_mixer" +} + +Mixer :: struct {} +Audio :: struct {} +Track :: struct {} +Group :: struct {} + +StereoGains :: struct { + left, right: c.float, +} +Point3D :: struct { + x, y, z: c.float, +} + +TrackStoppedCallback :: #type proc(userdata: rawptr, track: ^Track) +TrackMixCallback :: #type proc(userdata: rawptr, track: ^Track, spec: ^SDL.AudioSpec, pcm: ^c.float, samples: c.int) +GroupMixCallback :: #type proc(userdata: rawptr, group: ^Group, spec: ^SDL.AudioSpec, pcm: ^c.float, samples: c.int) +PostMixCallback :: #type proc( userdata: rawptr, mixer: ^Mixer, spec: ^SDL.AudioSpec, pcm: ^c.float, samples: c.int) + +AudioDecoder :: struct {} + +MAJOR_VERSION :: 3 +MINOR_VERSION :: 2 +MICRO_VERSION :: 0 + +PROP_MIXER_DEVICE_NUMBER :: "SDL_mixer.mixer.device" + +PROP_AUDIO_LOAD_IOSTREAM_POINTER :: "SDL_mixer.audio.load.iostream" +PROP_AUDIO_LOAD_CLOSEIO_BOOLEAN :: "SDL_mixer.audio.load.closeio" +PROP_AUDIO_LOAD_PREDECODE_BOOLEAN :: "SDL_mixer.audio.load.predecode" +PROP_AUDIO_LOAD_PREFERRED_MIXER_POINTER :: "SDL_mixer.audio.load.preferred_mixer" +PROP_AUDIO_LOAD_SKIP_METADATA_TAGS_BOOLEAN :: "SDL_mixer.audio.load.skip_metadata_tags" +PROP_AUDIO_DECODER_STRING :: "SDL_mixer.audio.decoder" + +PROP_METADATA_TITLE_STRING :: "SDL_mixer.metadata.title" +PROP_METADATA_ARTIST_STRING :: "SDL_mixer.metadata.artist" +PROP_METADATA_ALBUM_STRING :: "SDL_mixer.metadata.album" +PROP_METADATA_COPYRIGHT_STRING :: "SDL_mixer.metadata.copyright" +PROP_METADATA_TRACK_NUMBER :: "SDL_mixer.metadata.track" +PROP_METADATA_TOTAL_TRACKS_NUMBER :: "SDL_mixer.metadata.total_tracks" +PROP_METADATA_YEAR_NUMBER :: "SDL_mixer.metadata.year" +PROP_METADATA_DURATION_FRAMES_NUMBER :: "SDL_mixer.metadata.duration_frames" +PROP_METADATA_DURATION_INFINITE_BOOLEAN :: "SDL_mixer.metadata.duration_infinite" + +PROP_PLAY_LOOPS_NUMBER :: "SDL_mixer.play.loops" +PROP_PLAY_MAX_FRAME_NUMBER :: "SDL_mixer.play.max_frame" +PROP_PLAY_MAX_MILLISECONDS_NUMBER :: "SDL_mixer.play.max_milliseconds" +PROP_PLAY_START_FRAME_NUMBER :: "SDL_mixer.play.start_frame" +PROP_PLAY_START_MILLISECOND_NUMBER :: "SDL_mixer.play.start_millisecond" +PROP_PLAY_LOOP_START_FRAME_NUMBER :: "SDL_mixer.play.loop_start_frame" +PROP_PLAY_LOOP_START_MILLISECOND_NUMBER :: "SDL_mixer.play.loop_start_millisecond" +PROP_PLAY_FADE_IN_FRAMES_NUMBER :: "SDL_mixer.play.fade_in_frames" +PROP_PLAY_FADE_IN_MILLISECONDS_NUMBER :: "SDL_mixer.play.fade_in_milliseconds" +PROP_PLAY_FADE_IN_START_GAIN_FLOAT :: "SDL_mixer.play.fade_in_start_gain" +PROP_PLAY_APPEND_SILENCE_FRAMES_NUMBER :: "SDL_mixer.play.append_silence_frames" +PROP_PLAY_APPEND_SILENCE_MILLISECONDS_NUMBER :: "SDL_mixer.play.append_silence_milliseconds" +PROP_PLAY_HALT_WHEN_EXHAUSTED_BOOLEAN :: "SDL_mixer.play.halt_when_exhausted" + +DURATION_UNKNOWN :: -1 +DURATION_INFINITE :: -2 + +@(default_calling_convention = "c", link_prefix = "MIX_", require_results) +foreign lib { + Version :: proc() -> c.int --- + Init :: proc() -> c.bool --- + Quit :: proc() --- + GetNumAudioDecoders :: proc() -> c.int --- + GetAudioDecoder :: proc(index: c.int) -> cstring --- + CreateMixerDevice :: proc(devid: SDL.AudioDeviceID, #by_ptr spec: SDL.AudioSpec) -> ^Mixer --- + CreateMixer :: proc(#by_ptr spec: SDL.AudioSpec) -> ^Mixer --- + DestroyMixer :: proc(mixer: ^Mixer) --- + GetMixerProperties :: proc(mixer: ^Mixer) -> SDL.PropertiesID --- + GetMixerFormat :: proc(mixer: ^Mixer, spec: ^SDL.AudioSpec) -> c.bool --- + LockMixer :: proc(mixer: ^Mixer) --- + UnlockMixer :: proc(mixer: ^Mixer) --- + LoadAudio_IO :: proc(mixer: ^Mixer, io: ^SDL.IOStream, predecode, closeio: c.bool) -> ^Audio --- + LoadAudio :: proc(mixer: ^Mixer, path: cstring, predecode: c.bool) -> ^Audio --- + LoadAudioNoCopy :: proc(mixer: ^Mixer, data: rawptr, datalen: c.size_t, free_when_done: c.bool) -> ^Audio --- + LoadAudioWithProperties :: proc(props: SDL.PropertiesID) -> ^Audio --- + LoadRawAudio_IO :: proc(mixer: ^Mixer, io: ^SDL.IOStream, #by_ptr spec: SDL.AudioSpec, closeio: c.bool) -> ^Audio --- + LoadRawAudio :: proc(mixer: ^Mixer, data: rawptr, datalen: c.size_t, #by_ptr spec: SDL.AudioSpec) -> ^Audio --- + LoadRawAudioNoCopy :: proc(mixer: ^Mixer, data: rawptr, datalen: c.size_t, #by_ptr spec: SDL.AudioSpec, free_when_done: c.bool) -> ^Audio --- + CreateSineWaveAudio :: proc(mixer: ^Mixer, hz: c.int, amplitude: c.float, ms: SDL.Sint64) -> ^Audio --- + GetAudioProperties :: proc(audio: ^Audio) -> SDL.PropertiesID --- + GetAudioDuration :: proc(audio: ^Audio) -> SDL.Sint64 --- + GetAudioFormat :: proc(audio: ^Audio, spec: ^SDL.AudioSpec) -> c.bool --- + DestroyAudio :: proc(audio: ^Audio) --- + CreateTrack :: proc(mixer: ^Mixer) -> ^Track --- + DestroyTrack :: proc(track: ^Track) --- + GetTrackProperties :: proc(track: ^Track) -> SDL.PropertiesID --- + GetTrackMixer :: proc(track: ^Track) -> ^Mixer --- + SetTrackAudio :: proc(track: ^Track, audio: ^Audio) -> c.bool --- + SetTrackAudioStream :: proc(track: ^Track, stream: ^SDL.AudioStream) -> c.bool --- + SetTrackIOStream :: proc(track: ^Track, io: ^SDL.IOStream, closeio: c.bool) -> c.bool --- + SetTrackRawIOStream :: proc(track: ^Track, io: ^SDL.IOStream, #by_ptr spec: SDL.AudioSpec, closeio: c.bool) -> c.bool --- + TagTrack :: proc(track: ^Track, tag: cstring) -> c.bool --- + UntagTrack :: proc(track: ^Track, tag: cstring) --- + GetTrackTags :: proc(track: ^Track, count: ^c.int) -> [^]cstring --- + GetTaggedTracks :: proc(mixer: ^Mixer, tag: cstring, count: ^c.int) -> [^]^Track --- + SetTrackPlaybackPosition :: proc(track: ^Track, frames: SDL.Sint64) -> c.bool --- + GetTrackPlaybackPosition :: proc(track: ^Track) -> SDL.Sint64 --- + GetTrackFadeFrames :: proc(track: ^Track) -> SDL.Sint64 --- + GetTrackLoops :: proc(track: ^Track) -> c.int --- + SetTrackLoops :: proc(track: ^Track, num_loops: c.int) -> c.bool --- + GetTrackAudio :: proc(track: ^Track) -> ^Audio --- + GetTrackAudioStream :: proc(track: ^Track) -> ^SDL.AudioStream --- + GetTrackRemaining :: proc(track: ^Track) -> SDL.Sint64 --- + TrackMSToFrames :: proc(track: ^Track, ms: SDL.Sint64) -> SDL.Sint64 --- + TrackFramesToMS :: proc(track: ^Track, frames: SDL.Sint64) -> SDL.Sint64 --- + AudioMSToFrames :: proc(audio: ^Audio, ms: SDL.Sint64) -> SDL.Sint64 --- + AudioFramesToMS :: proc(audio: ^Audio, frames: SDL.Sint64) -> SDL.Sint64 --- + MSToFrames :: proc(sample_rate: c.int, ms: SDL.Sint64) -> SDL.Sint64 --- + FramesToMS :: proc(sample_rate: c.int, frames: SDL.Sint64) -> SDL.Sint64 --- + PlayTrack :: proc(track: ^Track, options: SDL.PropertiesID) -> c.bool --- + PlayTag :: proc(mixer: ^Mixer, tag: cstring, options: SDL.PropertiesID) -> c.bool --- + PlayAudio :: proc(mixer: ^Mixer, audio: ^Audio) -> c.bool --- + StopTrack :: proc(track: ^Track, fade_out_frames: SDL.Sint64) -> c.bool --- + StopAllTracks :: proc(mixer: ^Mixer, fade_out_ms: SDL.Sint64) -> c.bool --- + StopTag :: proc(mixer: ^Mixer, tag: cstring, fade_out_ms: SDL.Sint64) -> c.bool --- + PauseTrack :: proc(track: ^Track) -> c.bool --- + PauseAllTracks :: proc(mixer: ^Mixer) -> c.bool --- + PauseTag :: proc(mixer: ^Mixer, tag: cstring) -> c.bool --- + ResumeTrack :: proc(track: ^Track) -> c.bool --- + ResumeAllTracks :: proc(mixer: ^Mixer) -> c.bool --- + ResumeTag :: proc(mixer: ^Mixer, tag: cstring) -> c.bool --- + TrackPlaying :: proc(track: ^Track) -> c.bool --- + TrackPaused :: proc(track: ^Track) -> c.bool --- + SetMixerGain :: proc(mixer: ^Mixer, gain: c.float) -> c.bool --- + GetMixerGain :: proc(mixer: ^Mixer) -> c.float --- + SetTrackGain :: proc(track: ^Track, gain: c.float) -> c.bool --- + GetTrackGain :: proc(track: ^Track) -> c.float --- + SetTagGain :: proc(mixer: ^Mixer, tag: cstring, gain: c.float) -> c.bool --- + SetMixerFrequencyRatio :: proc(mixer: ^Mixer, ratio: c.float) -> c.bool --- + GetMixerFrequencyRatio :: proc(mixer: ^Mixer) -> c.float --- + SetTrackFrequencyRatio :: proc(track: ^Track, ratio: c.float) -> c.bool --- + GetTrackFrequencyRatio :: proc(track: ^Track) -> c.float --- + SetTrackOutputChannelMap :: proc(track: ^Track, chmap: [^]c.int, count: c.int) -> c.bool --- + SetTrackStereo :: proc(track: ^Track, #by_ptr gains: StereoGains) -> c.bool --- + SetTrack3DPosition :: proc(track: ^Track, #by_ptr position: Point3D) -> c.bool --- + GetTrack3DPosition :: proc(track: ^Track, position: ^Point3D) -> c.bool --- + CreateGroup :: proc(mixer: ^Mixer) -> ^Group --- + DestroyGroup :: proc(group: ^Group) --- + GetGroupProperties :: proc(group: ^Group) -> SDL.PropertiesID --- + GetGroupMixer :: proc(group: ^Group) -> ^Mixer --- + SetTrackGroup :: proc(track: ^Track, group: ^Group) -> c.bool --- + SetTrackStoppedCallback :: proc(track: ^Track, cb: TrackStoppedCallback, userdata: rawptr) -> c.bool --- + SetTrackRawCallback :: proc(track: ^Track, cb: TrackMixCallback, userdata: rawptr) -> c.bool --- + SetTrackCookedCallback :: proc(track: ^Track, cb: TrackMixCallback, userdata: rawptr) -> c.bool --- + SetGroupPostMixCallback :: proc(group: ^Group, cb: GroupMixCallback, userdata: rawptr) -> c.bool --- + SetPostMixCallback :: proc(mixer: ^Mixer, cb: PostMixCallback, userdata: rawptr) -> c.bool --- + Generate :: proc(mixer: ^Mixer, buffer: rawptr, buflen: c.int) -> c.int --- + CreateAudioDecoder :: proc(path: cstring, props: SDL.PropertiesID) -> ^AudioDecoder --- + CreateAudioDecoder_IO :: proc(io: ^SDL.IOStream, closeio: c.bool, props: SDL.PropertiesID) -> ^AudioDecoder --- + DestroyAudioDecoder :: proc(audiodecoder: ^AudioDecoder) --- + GetAudioDecoderProperties :: proc(audiodecoder: ^AudioDecoder) -> SDL.PropertiesID --- + GetAudioDecoderFormat :: proc(audiodecoder: ^AudioDecoder, spec: ^SDL.AudioSpec) -> c.bool --- + DecodeAudio :: proc(audiodecoder: ^AudioDecoder, buffer: rawptr, buflen: c.int, #by_ptr spec: SDL.AudioSpec) -> c.int --- +} From 7891744b65cf0a8bff6048f56462788b4045d560 Mon Sep 17 00:00:00 2001 From: Nathan Chere Date: Wed, 18 Mar 2026 20:48:38 +0100 Subject: [PATCH 192/273] MacOS ARM builds bumped from LLVM 20->22 --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5db1119a5..dd49b8ff8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -93,8 +93,8 @@ jobs: if: matrix.os == 'macos-latest' run: | brew update - brew install llvm@20 wasmtime lua@5.4 lld - echo "$(brew --prefix llvm@20)/bin" >> $GITHUB_PATH + brew install llvm@22 wasmtime lua@5.4 lld + echo "$(brew --prefix llvm@22)/bin" >> $GITHUB_PATH - name: Download LLVM (Ubuntu) if: matrix.os == 'ubuntu-latest' || matrix.os == 'ubuntu-24.04-arm' From c2e42fe455155bdd2e617616002b91f117c8631f Mon Sep 17 00:00:00 2001 From: Nathan Chere Date: Wed, 18 Mar 2026 21:11:12 +0100 Subject: [PATCH 193/273] Remove deprecated LLVMGetGlobalContext calls --- src/llvm_backend_general.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 35a0f5f65..3088db72d 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -1767,13 +1767,13 @@ gb_internal LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *t "\n\tArgTypeCtx: %p\n\tCurrentCtx: %p\n\tGlobalCtx: %p", LLVMPrintTypeToString(arg.type), j, ft->args.count, - LLVMGetTypeContext(arg.type), ft->ctx, LLVMGetGlobalContext()); + LLVMGetTypeContext(arg.type), ft->ctx); } GB_ASSERT_MSG(LLVMGetTypeContext(ft->ret.type) == ft->ctx, "\n\t%s" "\n\tRetTypeCtx: %p\n\tCurrentCtx: %p\n\tGlobalCtx: %p", LLVMPrintTypeToString(ft->ret.type), - LLVMGetTypeContext(ft->ret.type), ft->ctx, LLVMGetGlobalContext()); + LLVMGetTypeContext(ft->ret.type), ft->ctx); } for (unsigned i = 0; i < param_count; i++) { if (params_by_ptr[i]) { @@ -1791,7 +1791,7 @@ gb_internal LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *t GB_ASSERT_MSG(LLVMGetTypeContext(new_abi_fn_type) == m->ctx, "\n\tFuncTypeCtx: %p\n\tCurrentCtx: %p\n\tGlobalCtx: %p", - LLVMGetTypeContext(new_abi_fn_type), m->ctx, LLVMGetGlobalContext()); + LLVMGetTypeContext(new_abi_fn_type), m->ctx); map_set(&m->func_raw_types, type, new_abi_fn_type); From d18eff9a937d373219484704f13e6b7f4ef57173 Mon Sep 17 00:00:00 2001 From: Nathan Chere Date: Wed, 18 Mar 2026 21:21:00 +0100 Subject: [PATCH 194/273] Fix LLVMStructType calls deprecated as of LLVM 22 --- src/llvm_backend_type.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index b41ba2f15..9b9d3e8eb 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -201,10 +201,10 @@ gb_internal LLVMTypeRef *lb_setup_modified_types_for_type_info(lbModule *m, isiz vtypes[0] = lb_type(m, t); vtypes[1] = padding; vtypes[2] = tag; - LLVMTypeRef variant_type = LLVMStructType(vtypes, gb_count_of(vtypes), true); + LLVMTypeRef variant_type = LLVMStructTypeInContext(m->ctx, vtypes, gb_count_of(vtypes), true); stypes[variant_index] = variant_type; - LLVMTypeRef modified_type = LLVMStructType(stypes, cast(unsigned)(variant_index+1), false); + LLVMTypeRef modified_type = LLVMStructTypeInContext(m->ctx, stypes, cast(unsigned)(variant_index+1), false); modified_types[i] = modified_type; } From b965e46d7cc462b560aaaab39bb540c978ab9ed1 Mon Sep 17 00:00:00 2001 From: xfitgd Date: Thu, 19 Mar 2026 08:27:09 +0900 Subject: [PATCH 195/273] fixes Android build --- src/bundle_command.cpp | 4 ++++ src/linker.cpp | 13 ++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/bundle_command.cpp b/src/bundle_command.cpp index 7abd48104..c19f29220 100644 --- a/src/bundle_command.cpp +++ b/src/bundle_command.cpp @@ -186,7 +186,11 @@ i32 bundle_android(String original_init_directory) { gb_string_clear(cmd); cmd = gb_string_append_length(cmd, android_sdk_build_tools.text, android_sdk_build_tools.len); +#if defined(GB_SYSTEM_WINDOWS) + cmd = gb_string_appendc(cmd, "apksigner.bat"); +#else cmd = gb_string_appendc(cmd, "apksigner"); +#endif cmd = gb_string_appendc(cmd, " sign"); String keystore = normalize_path(temporary_allocator(), build_context.android_keystore, NIX_SEPARATOR_STRING); diff --git a/src/linker.cpp b/src/linker.cpp index 76c795989..02bfe1146 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -676,7 +676,7 @@ try_cross_linking:; defer (gb_string_free(glue)); glue = gb_string_append_fmt(glue, "bin/clang"); - glue = gb_string_append_fmt(glue, " --target=%s%d ", build_context.metrics.target_triplet, ODIN_ANDROID_API_LEVEL); + glue = gb_string_append_fmt(glue, " --target=%.*s%d ", LIT(build_context.metrics.target_triplet), ODIN_ANDROID_API_LEVEL); glue = gb_string_appendc(glue, "-c \""); glue = gb_string_append_length(glue, ODIN_ANDROID_NDK.text, ODIN_ANDROID_NDK.len); glue = gb_string_appendc(glue, "sources/android/native_app_glue/android_native_app_glue.c"); @@ -731,12 +731,12 @@ try_cross_linking:; return result; } - object_files = gb_string_append_fmt(object_files, "\'%.*s\' ", LIT(android_glue_static_lib)); + object_files = gb_string_append_fmt(object_files, "\"%.*s\" ", LIT(android_glue_static_lib)); } for (String object_path : gen->output_object_paths) { - object_files = gb_string_append_fmt(object_files, "\'%.*s\' ", LIT(object_path)); + object_files = gb_string_append_fmt(object_files, "\"%.*s\" ", LIT(object_path)); } gbString link_settings = gb_string_make_reserve(heap_allocator(), 32); @@ -925,7 +925,10 @@ try_cross_linking:; GB_ASSERT(ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT.len != 0); platform_lib_str = gb_string_appendc(platform_lib_str, "\"-L"); - platform_lib_str = gb_string_append_length(platform_lib_str, ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL.text, ODIN_ANDROID_NDK_TOOLCHAIN_LIB_LEVEL.len); + platform_lib_str = gb_string_append_length(platform_lib_str, ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT.text, ODIN_ANDROID_NDK_TOOLCHAIN_SYSROOT.len); + platform_lib_str = gb_string_appendc(platform_lib_str, "usr/lib/"); + platform_lib_str = gb_string_append_length(platform_lib_str, ODIN_ANDROID_NDK_TOOLCHAIN_LIB.text, ODIN_ANDROID_NDK_TOOLCHAIN_LIB.len); + platform_lib_str = gb_string_append_fmt(platform_lib_str, "/%d", ODIN_ANDROID_API_LEVEL); platform_lib_str = gb_string_appendc(platform_lib_str, "\" "); platform_lib_str = gb_string_appendc(platform_lib_str, "-landroid "); @@ -970,7 +973,7 @@ try_cross_linking:; gbString ndk_bin_directory = gb_string_make_length(temporary_allocator(), ODIN_ANDROID_NDK_TOOLCHAIN.text, ODIN_ANDROID_NDK_TOOLCHAIN.len); link_command_line = gb_string_appendc(link_command_line, ndk_bin_directory); link_command_line = gb_string_appendc(link_command_line, "bin/clang"); - link_command_line = gb_string_append_fmt(link_command_line, " --target=%s%d ", build_context.metrics.target_triplet, ODIN_ANDROID_API_LEVEL); + link_command_line = gb_string_append_fmt(link_command_line, " --target=%.*s%d ", LIT(build_context.metrics.target_triplet), ODIN_ANDROID_API_LEVEL); } else { link_command_line = gb_string_appendc(link_command_line, clang_path); } From 62d78d61fa0d2a0aeb375f0cded57434721c4f3f Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Wed, 18 Mar 2026 05:13:44 +0900 Subject: [PATCH 196/273] src: Allow clang-style `+`/`-` for target features This largely works as expected, except that as far as I can tell, without explicit annotations added to the caller, (or a `#force_inline`), the LLVM `target-features` function attribute gets ignored by the inliner under the rationale of `-sse,-avx,-avx2` is a subset of `+sse,+avx,+avx2`. With `#force_no_inline` the correct code does get generated, but in the regression I am trying to fix, the caller gratuitously also uses SIMD, leading to horrific performance. --- src/build_settings.cpp | 27 ++++++++++++++++++++------- src/llvm_backend_proc.cpp | 5 ++++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d52553d65..9663d5db5 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -2160,8 +2160,15 @@ gb_internal bool check_target_feature_is_valid(String const &feature, TargetArch String_Iterator it = {feature, 0}; for (;;) { String str = string_split_iterator(&it, ','); - if (str == "") break; - if (!check_single_target_feature_is_valid(feature_list, str)) { + String feature_str = str; + if (string_starts_with(feature_str, '+') || string_starts_with(feature_str, '-')) { + feature_str = substring(feature_str, 1, feature_str.len); + if (feature_str == "") { + return false; + } + } + if (feature_str == "") break; + if (!check_single_target_feature_is_valid(feature_list, feature_str)) { if (invalid) *invalid = str; return false; } @@ -2201,20 +2208,26 @@ gb_internal bool check_target_feature_is_enabled(String const &feature, String * String_Iterator it = {feature, 0}; for (;;) { String str = string_split_iterator(&it, ','); - if (str == "") break; + String feature_str = str; + bool want_enabled = true; + if (string_starts_with(feature_str, '+') || string_starts_with(feature_str, '-')) { + want_enabled = feature_str[0] == '+'; + feature_str = substring(feature_str, 1, feature_str.len); + } + if (feature_str == "") break; if (!string_set_exists(&build_context.target_features_set, str)) { - String plus_str = concatenate_strings(temporary_allocator(), make_string_c("+"), str); + String plus_str = concatenate_strings(temporary_allocator(), make_string_c("+"), feature_str); - if (!string_set_exists(&build_context.target_features_set, plus_str)) { + if (want_enabled && !string_set_exists(&build_context.target_features_set, plus_str)) { if (not_enabled) *not_enabled = str; return false; } } - String minus_str = concatenate_strings(temporary_allocator(), make_string_c("-"), str); + String minus_str = concatenate_strings(temporary_allocator(), make_string_c("-"), feature_str); - if (string_set_exists(&build_context.target_features_set, minus_str)) { + if (!want_enabled && !string_set_exists(&build_context.target_features_set, minus_str)) { if (not_enabled) *not_enabled = str; return false; } diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 36d736b0f..7d0379e9a 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -201,12 +201,15 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i for (;;) { String str = string_split_iterator(&it, ','); if (str == "") break; + bool add_prefix = !(string_starts_with(str, '+') || string_starts_with(str, '-')); if (!first) { feature_str = gb_string_appendc(feature_str, ","); } first = false; - feature_str = gb_string_appendc(feature_str, "+"); + if (add_prefix) { + feature_str = gb_string_appendc(feature_str, "+"); + } feature_str = gb_string_append_length(feature_str, str.text, str.len); } From a171746a157b0ea4f15a1889f99e15e40eb2ad7a Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Wed, 18 Mar 2026 05:41:50 +0900 Subject: [PATCH 197/273] core/math/rand: Disable LLVM vectorization of xoshiro on Intel LLVM tries really hard to vectorize this when it is a terrible idea, when `-microarch:native` is specified on modern processors. Not doing so is a 2.5->3x performance gain. --- core/math/rand/rand_xoshiro256.odin | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/math/rand/rand_xoshiro256.odin b/core/math/rand/rand_xoshiro256.odin index 6f5dbe545..3771d2beb 100644 --- a/core/math/rand/rand_xoshiro256.odin +++ b/core/math/rand/rand_xoshiro256.odin @@ -3,6 +3,18 @@ package rand import "base:intrinsics" import "base:runtime" +when ODIN_ARCH == .amd64 || ODIN_ARCH == .i386 { + // LLVM thinks that using SIMD for read_u64 is good, + // when it causes a ~3x performance regression. As + // far as I can tell, this behavior is limited to + // Intel. + @(private = "file") + TARGET_FEATURES :: "-sse,-avx,-avx2" +} else { + @(private = "file") + TARGET_FEATURES :: "" +} + /* The state for a xoshiro256** pseudorandom generator. */ @@ -10,8 +22,9 @@ Xoshiro256_Random_State :: struct { s: [4]u64, } +@(enable_target_feature = TARGET_FEATURES) xoshiro256_random_generator_proc :: proc(data: rawptr, mode: runtime.Random_Generator_Mode, p: []byte) { - @(require_results) + @(require_results, enable_target_feature = TARGET_FEATURES) read_u64 :: proc "contextless" (r: ^Xoshiro256_Random_State) -> u64 { // xoshiro256** output function and state transition @@ -27,7 +40,7 @@ xoshiro256_random_generator_proc :: proc(data: rawptr, mode: runtime.Random_Gene return result - rotate_left64 :: proc "contextless" (x: u64, k: int) -> u64 { + rotate_left64 :: #force_inline proc "contextless" (x: u64, k: int) -> u64 { n :: 64 s := uint(k) & (n-1) return x << s | x >> (n-s) From 274e99015c6c3ce670315474b87cc40a253b4de3 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 19 Mar 2026 12:04:32 +0100 Subject: [PATCH 198/273] Add SDL3 Mixer binaries --- .gitattributes | 2 + vendor/sdl3/mixer/LICENSE.gme.txt | 504 +++++++++++++++++++++++ vendor/sdl3/mixer/LICENSE.ogg-vorbis.txt | 28 ++ vendor/sdl3/mixer/LICENSE.opus.txt | 44 ++ vendor/sdl3/mixer/LICENSE.opusfile.txt | 28 ++ vendor/sdl3/mixer/LICENSE.wavpack.txt | 25 ++ vendor/sdl3/mixer/LICENSE.xmp.txt | 20 + vendor/sdl3/mixer/SDL3_mixer.dll | 3 + vendor/sdl3/mixer/SDL3_mixer.lib | 3 + vendor/sdl3/mixer/libgme.dll | 3 + vendor/sdl3/mixer/libogg-0.dll | 3 + vendor/sdl3/mixer/libopus-0.dll | 3 + vendor/sdl3/mixer/libopusfile-0.dll | 3 + vendor/sdl3/mixer/libwavpack-1.dll | 3 + vendor/sdl3/mixer/libxmp.dll | 3 + 15 files changed, 675 insertions(+) create mode 100644 vendor/sdl3/mixer/LICENSE.gme.txt create mode 100644 vendor/sdl3/mixer/LICENSE.ogg-vorbis.txt create mode 100644 vendor/sdl3/mixer/LICENSE.opus.txt create mode 100644 vendor/sdl3/mixer/LICENSE.opusfile.txt create mode 100644 vendor/sdl3/mixer/LICENSE.wavpack.txt create mode 100644 vendor/sdl3/mixer/LICENSE.xmp.txt create mode 100644 vendor/sdl3/mixer/SDL3_mixer.dll create mode 100644 vendor/sdl3/mixer/SDL3_mixer.lib create mode 100644 vendor/sdl3/mixer/libgme.dll create mode 100644 vendor/sdl3/mixer/libogg-0.dll create mode 100644 vendor/sdl3/mixer/libopus-0.dll create mode 100644 vendor/sdl3/mixer/libopusfile-0.dll create mode 100644 vendor/sdl3/mixer/libwavpack-1.dll create mode 100644 vendor/sdl3/mixer/libxmp.dll diff --git a/.gitattributes b/.gitattributes index 864b73592..e375d2543 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8,3 +8,5 @@ vendor/box2d/lib/box2d_windows_amd64_sse2.lib filter=lfs diff=lfs merge=lfs -tex vendor/miniaudio/lib/miniaudio.lib filter=lfs diff=lfs merge=lfs -text vendor/sdl3/SDL3.dll filter=lfs diff=lfs merge=lfs -text vendor/sdl3/SDL3.lib filter=lfs diff=lfs merge=lfs -text +vendor/sdl3/mixer/*.dll filter=lfs diff=lfs merge=lfs -text +vendor/sdl3/mixer/*.lib filter=lfs diff=lfs merge=lfs -text diff --git a/vendor/sdl3/mixer/LICENSE.gme.txt b/vendor/sdl3/mixer/LICENSE.gme.txt new file mode 100644 index 000000000..5ab7695ab --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.gme.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. 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 not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the 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 +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/sdl3/mixer/LICENSE.ogg-vorbis.txt b/vendor/sdl3/mixer/LICENSE.ogg-vorbis.txt new file mode 100644 index 000000000..fb456a87b --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.ogg-vorbis.txt @@ -0,0 +1,28 @@ +Copyright (c) 2002-2020 Xiph.org Foundation + +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 the Xiph.org Foundation 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 FOUNDATION +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/sdl3/mixer/LICENSE.opus.txt b/vendor/sdl3/mixer/LICENSE.opus.txt new file mode 100644 index 000000000..9c739c34a --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.opus.txt @@ -0,0 +1,44 @@ +Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic, + Jean-Marc Valin, Timothy B. Terriberry, + CSIRO, Gregory Maxwell, Mark Borgerding, + Erik de Castro Lopo + +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 Internet Society, IETF or IETF Trust, nor the +names of specific 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. + +Opus is subject to the royalty-free patent licenses which are +specified at: + +Xiph.Org Foundation: +https://datatracker.ietf.org/ipr/1524/ + +Microsoft Corporation: +https://datatracker.ietf.org/ipr/1914/ + +Broadcom Corporation: +https://datatracker.ietf.org/ipr/1526/ diff --git a/vendor/sdl3/mixer/LICENSE.opusfile.txt b/vendor/sdl3/mixer/LICENSE.opusfile.txt new file mode 100644 index 000000000..7b53d665d --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.opusfile.txt @@ -0,0 +1,28 @@ +Copyright (c) 1994-2013 Xiph.Org Foundation and contributors + +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 the Xiph.Org Foundation 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 FOUNDATION +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/sdl3/mixer/LICENSE.wavpack.txt b/vendor/sdl3/mixer/LICENSE.wavpack.txt new file mode 100644 index 000000000..a0136963e --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.wavpack.txt @@ -0,0 +1,25 @@ + Copyright (c) 1998 - 2025 David Bryant + 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 the copyright holder 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 REGENTS 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/sdl3/mixer/LICENSE.xmp.txt b/vendor/sdl3/mixer/LICENSE.xmp.txt new file mode 100644 index 000000000..ed3491ee5 --- /dev/null +++ b/vendor/sdl3/mixer/LICENSE.xmp.txt @@ -0,0 +1,20 @@ +Extended Module Player +Copyright (C) 1996-2024 Claudio Matsuoka and Hipolito Carraro Jr + +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/sdl3/mixer/SDL3_mixer.dll b/vendor/sdl3/mixer/SDL3_mixer.dll new file mode 100644 index 000000000..fba705818 --- /dev/null +++ b/vendor/sdl3/mixer/SDL3_mixer.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8708c991962cee6fa30e69969d0261eb1c2bba1f5609f21cd096681664406a25 +size 434176 diff --git a/vendor/sdl3/mixer/SDL3_mixer.lib b/vendor/sdl3/mixer/SDL3_mixer.lib new file mode 100644 index 000000000..eef40ba35 --- /dev/null +++ b/vendor/sdl3/mixer/SDL3_mixer.lib @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc07725d580297402884da96999a63ed844b3359e98b9ed257c20fef9f492a99 +size 22380 diff --git a/vendor/sdl3/mixer/libgme.dll b/vendor/sdl3/mixer/libgme.dll new file mode 100644 index 000000000..6d1ef9ca7 --- /dev/null +++ b/vendor/sdl3/mixer/libgme.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50b739c925702d381e163e66887699eb980e03681577d8d7a19cd9972a315dea +size 445440 diff --git a/vendor/sdl3/mixer/libogg-0.dll b/vendor/sdl3/mixer/libogg-0.dll new file mode 100644 index 000000000..d2de59965 --- /dev/null +++ b/vendor/sdl3/mixer/libogg-0.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76344182f53695db65fca5921ab4e478cdf2f954d86628b27dab0fb9327bf2e7 +size 32768 diff --git a/vendor/sdl3/mixer/libopus-0.dll b/vendor/sdl3/mixer/libopus-0.dll new file mode 100644 index 000000000..3f7865d5d --- /dev/null +++ b/vendor/sdl3/mixer/libopus-0.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:064aaa2aee76ac93df0f9ec78a670a49954e3f4ac1bc1fd70ebda2f035ccc073 +size 367616 diff --git a/vendor/sdl3/mixer/libopusfile-0.dll b/vendor/sdl3/mixer/libopusfile-0.dll new file mode 100644 index 000000000..c664cf7f4 --- /dev/null +++ b/vendor/sdl3/mixer/libopusfile-0.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2e7edcdfb87f12763508b0234e2f945b6e8a3706bda740911e0d1a8ef24c758 +size 48640 diff --git a/vendor/sdl3/mixer/libwavpack-1.dll b/vendor/sdl3/mixer/libwavpack-1.dll new file mode 100644 index 000000000..2278390c9 --- /dev/null +++ b/vendor/sdl3/mixer/libwavpack-1.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e07f0623d14cbf19f6f3ee75ed6f45191088033e7167877a8ccbb41f1589f1a1 +size 178688 diff --git a/vendor/sdl3/mixer/libxmp.dll b/vendor/sdl3/mixer/libxmp.dll new file mode 100644 index 000000000..5923fd353 --- /dev/null +++ b/vendor/sdl3/mixer/libxmp.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a5f1198d976d7ea5aeb8433905c47a71906c2c9b0733166d88ec4a4525e0dee +size 417792 From 261881e57cbfd3596f54075016de19b81aae0f31 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 19 Mar 2026 19:44:34 +0100 Subject: [PATCH 199/273] vendor/stb/vorbis: support WASM --- vendor/stb/lib/stb_vorbis_wasm.o | Bin 0 -> 50828 bytes vendor/stb/src/Makefile | 3 +- vendor/stb/vorbis/stb_vorbis.odin | 61 +++++++++++++++---------- vendor/stb/vorbis/stb_vorbis_wasm.odin | 4 ++ 4 files changed, 42 insertions(+), 26 deletions(-) create mode 100644 vendor/stb/lib/stb_vorbis_wasm.o create mode 100644 vendor/stb/vorbis/stb_vorbis_wasm.odin diff --git a/vendor/stb/lib/stb_vorbis_wasm.o b/vendor/stb/lib/stb_vorbis_wasm.o new file mode 100644 index 0000000000000000000000000000000000000000..156696d78c5b743614b974c203d603b11b825996 GIT binary patch literal 50828 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 c.int --- + when !NO_STDIO { + // decode an entire file and output the data interleaved into a malloc()ed + // buffer stored in *output. The return value is the number of samples + // decoded, or -1 if the file could not be opened or was not an ogg vorbis file. + // When you're done with it, just free() the pointer returned in *output. + decode_filename :: proc(filename: cstring, channels, sample_rate: ^c.int, output: ^[^]c.short) -> c.int --- + } decode_memory :: proc(mem: [^]byte, len: c.int, channels, sample_rate: ^c.int, output: ^[^]c.short) -> c.int --- @@ -204,28 +213,30 @@ foreign lib { open_memory :: proc(data: [^]byte, len: c.int, error: ^Error, alloc_buffer: ^vorbis_alloc) -> ^vorbis --- - // create an ogg vorbis decoder from a filename via fopen(). on failure, - // returns NULL and sets *error (possibly to VORBIS_file_open_failure). - open_filename :: proc(filename: cstring, - error: ^Error, alloc_buffer: ^vorbis_alloc) -> ^vorbis --- + when !NO_STDIO { + // create an ogg vorbis decoder from a filename via fopen(). on failure, + // returns NULL and sets *error (possibly to VORBIS_file_open_failure). + open_filename :: proc(filename: cstring, + error: ^Error, alloc_buffer: ^vorbis_alloc) -> ^vorbis --- - // create an ogg vorbis decoder from an open FILE *, looking for a stream at - // the _current_ seek point (ftell). on failure, returns NULL and sets *error. - // note that stb_vorbis must "own" this stream; if you seek it in between - // calls to stb_vorbis, it will become confused. Moreover, if you attempt to - // perform stb_vorbis_seek_*() operations on this file, it will assume it - // owns the _entire_ rest of the file after the start point. Use the next - // function, stb_vorbis_open_file_section(), to limit it. - open_file :: proc(f: ^c.FILE, close_handle_on_close: b32, - error: ^Error, alloc_buffer: ^vorbis_alloc) -> ^vorbis --- + // create an ogg vorbis decoder from an open FILE *, looking for a stream at + // the _current_ seek point (ftell). on failure, returns NULL and sets *error. + // note that stb_vorbis must "own" this stream; if you seek it in between + // calls to stb_vorbis, it will become confused. Moreover, if you attempt to + // perform stb_vorbis_seek_*() operations on this file, it will assume it + // owns the _entire_ rest of the file after the start point. Use the next + // function, stb_vorbis_open_file_section(), to limit it. + open_file :: proc(f: ^c.FILE, close_handle_on_close: b32, + error: ^Error, alloc_buffer: ^vorbis_alloc) -> ^vorbis --- - // create an ogg vorbis decoder from an open FILE *, looking for a stream at - // the _current_ seek point (ftell); the stream will be of length 'len' bytes. - // on failure, returns NULL and sets *error. note that stb_vorbis must "own" - // this stream; if you seek it in between calls to stb_vorbis, it will become - // confused. - open_file_section :: proc(f: ^c.FILE, close_handle_on_close: b32, - error: ^Error, alloc_buffer: ^vorbis_alloc, len: c.uint) -> ^vorbis --- + // create an ogg vorbis decoder from an open FILE *, looking for a stream at + // the _current_ seek point (ftell); the stream will be of length 'len' bytes. + // on failure, returns NULL and sets *error. note that stb_vorbis must "own" + // this stream; if you seek it in between calls to stb_vorbis, it will become + // confused. + open_file_section :: proc(f: ^c.FILE, close_handle_on_close: b32, + error: ^Error, alloc_buffer: ^vorbis_alloc, len: c.uint) -> ^vorbis --- + } // these functions seek in the Vorbis file to (approximately) 'sample_number'. // after calling seek_frame(), the next call to get_frame_*() will include diff --git a/vendor/stb/vorbis/stb_vorbis_wasm.odin b/vendor/stb/vorbis/stb_vorbis_wasm.odin new file mode 100644 index 000000000..324b7e025 --- /dev/null +++ b/vendor/stb/vorbis/stb_vorbis_wasm.odin @@ -0,0 +1,4 @@ +#+build wasm32, wasm64p32 +package stb_vorbis + +@(require) import _ "vendor:libc-shim" From e6521ed2698c1f6b1ad5d047daee950bf29681c7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Mar 2026 18:50:01 +0000 Subject: [PATCH 200/273] Inline the generic count stuff --- src/docs_writer.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 3f5d4876a..ddd8144ca 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -472,14 +472,6 @@ gb_internal OdinDocArray odin_doc_type_as_slice(OdinDocWriter return odin_write_item_as_slice(w, index); } -gb_internal OdinDocArray odin_doc_type2_as_slice(OdinDocWriter *w, Type *type0, Type *type1, bool cache=true) { - OdinDocTypeIndex indices[2] = {}; - indices[0] = odin_doc_type(w, type0, cache); - indices[1] = odin_doc_type(w, type1, cache); - - return odin_write_slice(w, indices, gb_count_of(indices)); -} - gb_internal OdinDocArray odin_doc_add_entity_as_slice(OdinDocWriter *w, Entity *e) { OdinDocEntityIndex index = odin_doc_add_entity(w, e); return odin_write_item_as_slice(w, index); @@ -564,9 +556,10 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca doc_type.elem_count_len = 1; doc_type.elem_counts[0] = type->Array.count; if (type->Array.generic_count != nullptr) { - doc_type.types = odin_doc_type2_as_slice(w, - type->Array.elem, - type->Array.generic_count); + OdinDocTypeIndex types[2] = {}; + types[0] = odin_doc_type(w, type->Array.elem); + types[1] = odin_doc_type(w, type->Array.generic_count); + doc_type.types = odin_write_slice(w, types, gb_count_of(types)); } else { doc_type.types = odin_doc_type_as_slice(w, type->Array.elem); } @@ -596,10 +589,10 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca doc_type.elem_counts[0] = type->FixedCapacityDynamicArray.capacity; if (type->FixedCapacityDynamicArray.generic_capacity != nullptr) { - doc_type.types = odin_doc_type2_as_slice(w, - type->FixedCapacityDynamicArray.elem, - type->FixedCapacityDynamicArray.generic_capacity); - + OdinDocTypeIndex types[2] = {}; + types[0] = odin_doc_type(w, type->FixedCapacityDynamicArray.elem); + types[1] = odin_doc_type(w, type->FixedCapacityDynamicArray.generic_capacity); + doc_type.types = odin_write_slice(w, types, gb_count_of(types)); } else { doc_type.types = odin_doc_type_as_slice(w, type->FixedCapacityDynamicArray.elem); } From 111bee6ecdb260e4cf7b4d9d8c2a9538aca97a78 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Mar 2026 20:31:01 +0000 Subject: [PATCH 201/273] Fix `scope->elements` iteration causing a few bugs in the doc-format --- src/check_stmt.cpp | 16 +++++++++++----- src/docs_writer.cpp | 10 ++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 5775c3e53..5d740c6d2 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -788,11 +788,17 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, rw_mutex_lock(&scope->mutex); defer (rw_mutex_unlock(&scope->mutex)); - for (auto const &entry : scope->elements) { - Entity *decl = entry.value; - if (!is_entity_exported(decl, true)) continue; - u32 hash = entry.hash; - auto interned = scope->elements.keys[hash & (scope->elements.cap-1)]; + for (u32 i = 0; i < scope->elements.cap; i++) { + if (!scope->elements.slots[i].hash) { + continue; + } + + Entity *decl = scope->elements.slots[i].value; + if (!is_entity_exported(decl, true)) { + continue; + } + u32 hash = scope->elements.slots[i].hash; + auto interned = scope->elements.keys[i]; Entity *found = scope_insert_with_name(ctx->scope, interned, hash, decl); if (found != nullptr) { diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index ddd8144ca..a9f3a3e15 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -1042,10 +1042,12 @@ gb_internal OdinDocArray odin_doc_add_pkg_entries(OdinDocWrit auto entries = array_make(heap_allocator(), 0, w->entity_cache.count); defer (array_free(&entries)); - for (auto const &element : pkg->scope->elements) { - u32 hash = element.hash; - auto interned = pkg->scope->elements.keys[hash & (pkg->scope->elements.cap-1)]; - Entity *e = element.value; + for (isize i = 0; i < pkg->scope->elements.cap; i++) { + if (!pkg->scope->elements.slots[i].hash) { + continue; + } + auto interned = pkg->scope->elements.keys[i]; + Entity *e = pkg->scope->elements.slots[i].value; switch (e->kind) { case Entity_Invalid: case Entity_Nil: From 5e6e1c1e754c716aa1e60b40c842852ca5dabcd4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 20 Mar 2026 11:44:10 +0000 Subject: [PATCH 202/273] Add `gethostname` to ws2_32.odin --- core/sys/windows/ws2_32.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/sys/windows/ws2_32.odin b/core/sys/windows/ws2_32.odin index 77a288d6f..2221e37fa 100644 --- a/core/sys/windows/ws2_32.odin +++ b/core/sys/windows/ws2_32.odin @@ -229,6 +229,8 @@ foreign ws2_32 { getsockname :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getpeername) getpeername :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int --- + // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-gethostname) + gethostname :: proc(name: [^]c_char, namelen: c_int) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind) bind :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: socklen_t) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-listen) From e2bb7d70affdd14d4a9249749da24ff3670e5f3e Mon Sep 17 00:00:00 2001 From: imp0s5ible Date: Fri, 20 Mar 2026 15:21:12 +0100 Subject: [PATCH 203/273] Make map_file_from_path use the open flags map_file_from_path now passes the appropriate flags on to os.open instead of always calling it with os.O_RDWR. It will no longer try to open a file with write permissions if the user didn't request write access to the file mapping (or vice-versa). --- core/mem/virtual/file.odin | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/mem/virtual/file.odin b/core/mem/virtual/file.odin index 660210bbf..af0449e66 100644 --- a/core/mem/virtual/file.odin +++ b/core/mem/virtual/file.odin @@ -10,7 +10,14 @@ map_file :: proc{ } map_file_from_path :: proc(filename: string, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { - f, err := os.open(filename, os.O_RDWR) + open_flags : os.File_Flags + if .Read in flags { + open_flags += {.Read} + } + if .Write in flags { + open_flags += {.Write} + } + f, err := os.open(filename, open_flags) if err != nil { return nil, .Open_Failure } @@ -37,4 +44,4 @@ unmap_file :: proc(data: []byte) { if raw_data(data) != nil { _unmap_file(data) } -} \ No newline at end of file +} From d03f61bc76dd2498fd2f1db48f7339adc1f97648 Mon Sep 17 00:00:00 2001 From: Jakub Tomsu Date: Sat, 21 Mar 2026 20:31:54 +0100 Subject: [PATCH 204/273] add core WASAPI bindings --- vendor/wasapi/wasapi.odin | 326 +++++++++++++++++++++ vendor/wasapi/wasapi_hresult.odin | 58 ++++ vendor/wasapi/wasapi_types.odin | 472 ++++++++++++++++++++++++++++++ 3 files changed, 856 insertions(+) create mode 100644 vendor/wasapi/wasapi.odin create mode 100644 vendor/wasapi/wasapi_hresult.odin create mode 100644 vendor/wasapi/wasapi_types.odin diff --git a/vendor/wasapi/wasapi.odin b/vendor/wasapi/wasapi.odin new file mode 100644 index 000000000..2cc07aeb8 --- /dev/null +++ b/vendor/wasapi/wasapi.odin @@ -0,0 +1,326 @@ +// Windows Audio Session API Bindings Package +package wasapi + +import "core:sys/windows" + + +KSDATAFORMAT_SUBTYPE_IEEE_FLOAT_STRING :: "00000003-0000-0010-8000-00aa00389b71" +KSDATAFORMAT_SUBTYPE_IEEE_FLOAT := windows.GUID{0x00000003, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}} + +// MARK: IMMDeviceEnumerator + +CLSID_MMDeviceEnumerator_STRING :: "BCDE0395-E52F-467C-8E3D-C4579291692E" +CLSID_MMDeviceEnumerator := &windows.IID{0xBCDE0395, 0xE52F, 0x467C, {0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E}} + +IID_IMMDeviceEnumerator_STRING :: "A95664D2-9614-4F35-A746-DE8DB63617E6" +IID_IMMDeviceEnumerator := &windows.IID{0xA95664D2, 0x9614, 0x4F35, {0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6}} + +IID_IAudioClient_STRING :: "1CB9AD4C-DBFA-4c32-B178-C2F568A703B2" +IID_IAudioClient := &windows.IID{0x1CB9AD4C, 0xDBFA, 0x4c32, {0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2}} + +IID_IAudioRenderClient_STRING :: "F294ACFC-3146-4483-A7BF-ADDCA7C260E2" +IID_IAudioRenderClient := &windows.IID{0xF294ACFC, 0x3146, 0x4483, {0xA7, 0xBF, 0xAD, 0xDC, 0xA7, 0xC2, 0x60, 0xE2}} + + +IMMDeviceEnumerator :: struct #raw_union { + #subtype iunknown: windows.IUnknown, + using immdeviceenumerator_vtable: ^IMMDeviceEnumerator_VTable, +} + +IMMDeviceEnumerator_VTable :: struct { + using iunknown_vtable: windows.IUnknown_VTable, + + EnumAudioEndpoints: proc "system" ( + This: ^IMMDeviceEnumerator, + dataFlow: EDataFlow, + dwStateMask: windows.DWORD, + ppDevices: [^]IMMDeviceCollection, // Out + ) -> windows.HRESULT, + + GetDefaultAudioEndpoint: proc "system" ( + This: ^IMMDeviceEnumerator, + dataFlow: EDataFlow, + role: ERole, + ppEndpoint: ^^IMMDevice, // Out + ) -> windows.HRESULT, + + GetDevice: proc "system" ( + This: ^IMMDeviceEnumerator, + pwstrId: windows.LPCWSTR, + ppDevice: ^^IMMDevice, // Out + ) -> windows.HRESULT, + + RegisterEndpointNotificationCallback: proc "system" ( + This: ^IMMDeviceEnumerator, + pClient: ^IMMNotificationClient, // In + ) -> windows.HRESULT, + + UnregisterEndpointNotificationCallback: proc "system" ( + This: ^IMMDeviceEnumerator, + pClient: ^IMMNotificationClient, // In + ) -> windows.HRESULT, +} + + + +// MARK: IMMDeviceCollection + +IMMDeviceCollection :: struct #raw_union { + #subtype iunknown: windows.IUnknown, + using immdevicecollection_vtable: ^IMMDeviceCollection_VTable, +} + +IMMDeviceCollection_VTable :: struct { + using iunknown_vtable: windows.IUnknown_VTable, + + GetCount: proc "system" ( + This: ^IMMDeviceCollection, + pcDevices: ^windows.UINT, // Out + ) -> windows.HRESULT, + + Item: proc "system" ( + This: ^IMMDeviceCollection, + nDevice: windows.UINT, + ppDevice: ^^IMMDevice, + ) -> windows.HRESULT, +} + +// MARK: IMMDevice + +IMMDevice :: struct #raw_union { + #subtype iunknown: windows.IUnknown, + using immdevice_vtable: ^IMMDevice_VTable, +} + +IMMDevice_VTable :: struct { + using iunknown_vtable: windows.IUnknown_VTable, + + Activate: proc "system" ( + This: ^IMMDevice, + iid: windows.REFIID, // In + dwClsCtx: windows.DWORD, // In + pActivationParams: ^rawptr, // In Optional PROPVARIANT + ppInterface: [^]rawptr, // Out + ) -> windows.HRESULT, + + OpenPropertyStore: proc "system" ( + This: ^IMMDevice, + stgmAccess: windows.DWORD, // In + ppProperties: [^]^windows.IPropertyStore, // Out + ) -> windows.HRESULT, + + GetId: proc "system" ( + This: ^IMMDevice, + ppstrId: ^windows.LPWSTR, // Out + ) -> windows.HRESULT, + + GetState: proc "system" ( + This: ^IMMDevice, + pdwState: ^windows.DWORD, // Out + ) -> windows.HRESULT, +} + + + +// MARK: IMMNotificationClient + +IMMNotificationClient :: struct #raw_union { + #subtype iunknown: windows.IUnknown, + using immnotificationclient_vtable: ^IMMNotificationClient_VTable, +} + +IMMNotificationClient_VTable :: struct { + using iunknown_vtable: windows.IUnknown_VTable, + + OnDeviceStateChanged: proc "system" ( + This: ^IMMNotificationClient, + pwstrDeviceId: windows.LPCWSTR, + dwNewState: windows.DWORD, + ) -> windows.HRESULT, + + OnDeviceAdded: proc "system" ( + This: ^IMMNotificationClient, + pwstrDeviceId: windows.LPCWSTR, + ) -> windows.HRESULT, + + OnDeviceRemoved: proc "system" ( + This: ^IMMNotificationClient, + pwstrDeviceId: windows.LPCWSTR, + ) -> windows.HRESULT, + + OnDefaultDeviceChanged: proc "system" ( + This: ^IMMNotificationClient, + flow: EDataFlow, + role: ERole, + pwstrDefaultDeviceId: windows.LPCWSTR, // Optional + ) -> windows.HRESULT, + + OnPropertyValueChanged: proc "system" ( + This: ^IMMNotificationClient, + pwstrDeviceId: windows.LPCWSTR, + key: windows.PROPERTYKEY, + ) -> windows.HRESULT, +} + + +// MARK: IAudioClient + +IAudioClient :: struct #raw_union { + #subtype iunknown: windows.IUnknown, + using iaudioclient_vtable: ^IAudioClient_VTable, +} + +IAudioClient_VTable :: struct { + using iunknown_vtable: windows.IUnknown_VTable, + + Initialize: proc "system" ( + This: ^IAudioClient, + ShareMode: AUDCLNT_SHAREMODE, + StreamFlags: windows.DWORD, + hnsBufferDuration: REFERENCE_TIME, + hnsPeriodicity: REFERENCE_TIME, + pFormat: ^WAVEFORMATEX, // Const In + AudioSessionGuid: windows.LPCGUID, // In Optional + ) -> windows.HRESULT, + + GetBufferSize: proc "system" ( + This: ^IAudioClient, + pNumBufferFrames: ^u32, // Out + ) -> windows.HRESULT, + + GetStreamLatency: proc "system" ( + This: ^IAudioClient, + phnsLatency: ^REFERENCE_TIME, // Out + ) -> windows.HRESULT, + + GetCurrentPadding: proc "system" ( + This: ^IAudioClient, + pNumPaddingFrames: ^u32, // Out + ) -> windows.HRESULT, + + IsFormatSupported: proc "system" ( + This: ^IAudioClient, + ShareMode: AUDCLNT_SHAREMODE, // In + pFormat: ^WAVEFORMATEX, // Const In + ppClosestMatch: ^^WAVEFORMATEX, // Out Optional + ) -> windows.HRESULT, + + GetMixFormat: proc "system" ( + This: ^IAudioClient, + ppDeviceFormat: ^^WAVEFORMATEX, // Out + ) -> windows.HRESULT, + + GetDevicePeriod: proc "system" ( + This: ^IAudioClient, + phnsDefaultDevicePeriod: ^REFERENCE_TIME, // Out Optional + phnsMinimumDevicePeriod: ^REFERENCE_TIME, // Out Optional + ) -> windows.HRESULT, + + Start: proc "system" (This: ^IAudioClient) -> windows.HRESULT, + Stop: proc "system" (This: ^IAudioClient) -> windows.HRESULT, + Reset: proc "system" (This: ^IAudioClient) -> windows.HRESULT, + + SetEventHandle: proc "system" ( + This: ^IAudioClient, + eventHandle: windows.HANDLE, + ) -> windows.HRESULT, + + GetService: proc "system" ( + This: ^IAudioClient, + riid: windows.REFIID, // In + ppv: ^rawptr, // Out + ) -> windows.HRESULT, +} + + + +// MARK: IAudioClient2 + +IAudioClient2 :: struct #raw_union { + #subtype iunknown: windows.IUnknown, + using iaudioclient2_vtable: ^IAudioClient2_VTable, +} + +IAudioClient2_VTable :: struct { + using iaudioclient_vtable: IAudioClient_VTable, + + IsOffloadCapable: proc "system" ( + This: ^IAudioClient2, + Category: AUDIO_STREAM_CATEGORY, + pbOffloadCapable: ^windows.BOOL, // Out + ) -> windows.HRESULT, + + SetClientProperties: proc "system" ( + This: ^IAudioClient2, + pProperties: ^AudioClientProperties, // Const In + ) -> windows.HRESULT, + + GetBufferSizeLimits: proc "system" ( + This: ^IAudioClient2, + pFormat: ^WAVEFORMATEX, // Const In + bEventDriven: windows.BOOL, + phnsMinBufferDuration: ^REFERENCE_TIME, // Out + phnsMaxBufferDuration: ^REFERENCE_TIME, // Out + ) -> windows.HRESULT, +} + + + +// MARK: IAudioClient3 + +IAudioClient3 :: struct #raw_union { + #subtype iunknown: windows.IUnknown, + using iaudioclient3_vtable: ^IAudioClient3_VTable, +} + +IAudioClient3_VTable :: struct { + using iaudioclient2_vtable: IAudioClient2_VTable, + + GetSharedModeEnginePeriod: proc "system" ( + This: ^IAudioClient3, + pFormat: ^WAVEFORMATEX, // Const In + pDefaultPeriodInFrames: ^u32, // Out + pFundamentalPeriodInFrames: ^u32, // Out + pMinPeriodInFrames: ^u32, // Out + pMaxPeriodInFrames: ^u32, // Out + ) -> windows.HRESULT, + + GetCurrentSharedModeEnginePeriod: proc "system" ( + This: ^IAudioClient3, + ppFormat: ^^WAVEFORMATEX, // Out + pCurrentPeriodInFrames: ^u32, // Out + ) -> windows.HRESULT, + + InitializeSharedAudioStream: proc "system" ( + This: ^IAudioClient3, + StreamFlags: windows.DWORD, + PeriodInFrames: u32, + pFormat: ^WAVEFORMATEX, // Const In + AudioSessionGuid: windows.LPCGUID, // In Optional + ) -> windows.HRESULT, +} + + + +// MARK: IAudioRenderClient + +IAudioRenderClient :: struct #raw_union { + #subtype iunknown: windows.IUnknown, + using iaudiorenderclient_vtable: ^IAudioRenderClient_VTable, +} + +IAudioRenderClient_VTable :: struct { + using iunknown_vtable: windows.IUnknown_VTable, + + GetBuffer: proc "system" ( + This: ^IAudioRenderClient, + NumFramesRequested: u32, + ppData: ^[^]byte, // NumFramesRequested * pFormat->nBlockAlign + ) -> windows.HRESULT, + + ReleaseBuffer: proc "system" ( + This: ^IAudioRenderClient, + NumFramesWritten: u32, + dwFlags: windows.DWORD, + ) -> windows.HRESULT, +} diff --git a/vendor/wasapi/wasapi_hresult.odin b/vendor/wasapi/wasapi_hresult.odin new file mode 100644 index 000000000..75343ac3b --- /dev/null +++ b/vendor/wasapi/wasapi_hresult.odin @@ -0,0 +1,58 @@ +package wasapi + +// MAKE_HRESULT(sev,fac,code) ((sev<<31) | (fac<<16) | (code)) + +// Binary compatible with HRESULT +Result :: enum u32 { + // Error + + AUDCLNT_E_NOT_INITIALIZED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x001, + AUDCLNT_E_ALREADY_INITIALIZED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x002, + AUDCLNT_E_WRONG_ENDPOINT_TYPE = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x003, + AUDCLNT_E_DEVICE_INVALIDATED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x004, + AUDCLNT_E_NOT_STOPPED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x005, + AUDCLNT_E_BUFFER_TOO_LARGE = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x006, + AUDCLNT_E_OUT_OF_ORDER = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x007, + AUDCLNT_E_UNSUPPORTED_FORMAT = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x008, + AUDCLNT_E_INVALID_SIZE = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x009, + AUDCLNT_E_DEVICE_IN_USE = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x00a, + AUDCLNT_E_BUFFER_OPERATION_PENDING = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x00b, + AUDCLNT_E_THREAD_NOT_REGISTERED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x00c, + AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x00e, + AUDCLNT_E_ENDPOINT_CREATE_FAILED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x00f, + AUDCLNT_E_SERVICE_NOT_RUNNING = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x010, + AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x011, + AUDCLNT_E_EXCLUSIVE_MODE_ONLY = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x012, + AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x013, + AUDCLNT_E_EVENTHANDLE_NOT_SET = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x014, + AUDCLNT_E_INCORRECT_BUFFER_SIZE = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x015, + AUDCLNT_E_BUFFER_SIZE_ERROR = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x016, + AUDCLNT_E_CPUUSAGE_EXCEEDED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x017, + AUDCLNT_E_BUFFER_ERROR = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x018, + AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x019, + AUDCLNT_E_INVALID_DEVICE_PERIOD = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x020, + AUDCLNT_E_INVALID_STREAM_FLAG = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x021, + AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x022, + AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x023, + AUDCLNT_E_OFFLOAD_MODE_ONLY = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x024, + AUDCLNT_E_NONOFFLOAD_MODE_ONLY = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x025, + AUDCLNT_E_RESOURCES_INVALIDATED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x026, + AUDCLNT_E_RAW_MODE_UNSUPPORTED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x027, + AUDCLNT_E_ENGINE_PERIODICITY_LOCKED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x028, + AUDCLNT_E_ENGINE_FORMAT_LOCKED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x029, + AUDCLNT_E_HEADTRACKING_ENABLED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x030, + AUDCLNT_E_HEADTRACKING_UNSUPPORTED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x040, + AUDCLNT_E_EFFECT_NOT_AVAILABLE = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x041, + AUDCLNT_E_EFFECT_STATE_READ_ONLY = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x042, + AUDCLNT_E_POST_VOLUME_LOOPBACK_UNSUPPORTED = _SEVERITY_ERROR << 31 | _FACILITY_AUDCLNT<<16 | 0x043, + + // Success + + AUDCLNT_S_BUFFER_EMPTY = _SEVERITY_SUCCESS<<31 | _FACILITY_AUDCLNT<<16 | 0x001, + AUDCLNT_S_THREAD_ALREADY_REGISTERED = _SEVERITY_SUCCESS<<31 | _FACILITY_AUDCLNT<<16 | 0x002, + AUDCLNT_S_POSITION_STALLED = _SEVERITY_SUCCESS<<31 | _FACILITY_AUDCLNT<<16 | 0x003, +} + +_SEVERITY_ERROR :: 1 +_SEVERITY_SUCCESS :: 0 +_FACILITY_AUDCLNT :: 2185 diff --git a/vendor/wasapi/wasapi_types.odin b/vendor/wasapi/wasapi_types.odin new file mode 100644 index 000000000..1821b1fb3 --- /dev/null +++ b/vendor/wasapi/wasapi_types.odin @@ -0,0 +1,472 @@ +package wasapi + +import "core:sys/windows" + +REFERENCE_TIME :: windows.LONGLONG + +//------------------------------------------------------------------------- +// Description: AudioClient share mode +// +// AUDCLNT_SHAREMODE_SHARED - The device will be opened in shared mode and use the +// WAS format. +// AUDCLNT_SHAREMODE_EXCLUSIVE - The device will be opened in exclusive mode and use the +// application specified format. +// +AUDCLNT_SHAREMODE :: enum u32 { + SHARED, + EXCLUSIVE +} + +//------------------------------------------------------------------------- +// Description: Audio stream categories +// +// ForegroundOnlyMedia - (deprecated for Win10) Music, Streaming audio +// BackgroundCapableMedia - (deprecated for Win10) Video with audio +// Communications - VOIP, chat, phone call +// Alerts - Alarm, Ring tones +// SoundEffects - Sound effects, clicks, dings +// GameEffects - Game sound effects +// GameMedia - Background audio for games +// GameChat - In game player chat +// Speech - Speech recognition +// Media - Music, Streaming audio +// Movie - Video with audio +// FarFieldSpeech - Capture of far field speech +// UniformSpeech - Uniform, device agnostic speech processing +// VoiceTyping - Dictation, typing by voice +// Other - All other streams (default) +AUDIO_STREAM_CATEGORY :: enum u32 { + Other = 0, + ForegroundOnlyMedia = 1, + BackgroundCapableMedia = 2, // #if NTDDI_VERSION < NTDDI_WINTHRESHOLD + Communications = 3, + Alerts = 4, + SoundEffects = 5, + GameEffects = 6, + GameMedia = 7, + GameChat = 8, + Speech = 9, + Movie = 10, + Media = 11, + FarFieldSpeech = 12, // #if NTDDI_VERSION >= NTDDI_WIN10_FE + UniformSpeech = 13, // #if NTDDI_VERSION >= NTDDI_WIN10_FE + VoiceTyping = 14, // #if NTDDI_VERSION >= NTDDI_WIN10_FE +} + + +//------------------------------------------------------------------------- +// Description: AudioClient stream flags +// +// Can be a combination of AUDCLNT_STREAMFLAGS and AUDCLNT_SYSFXFLAGS: +// +// AUDCLNT_STREAMFLAGS (this group of flags uses the high word, +// w/exception of high-bit which is reserved, 0x7FFF0000): +// +// +// AUDCLNT_STREAMFLAGS_CROSSPROCESS - Audio policy control for this stream will be shared with +// with other process sessions that use the same audio session +// GUID. +// +// AUDCLNT_STREAMFLAGS_LOOPBACK - Initializes a renderer endpoint for a loopback audio application. +// In this mode, a capture stream will be opened on the specified +// renderer endpoint. Shared mode and a renderer endpoint is required. +// Otherwise the IAudioClient::Initialize call will fail. If the +// initialize is successful, a capture stream will be available +// from the IAudioClient object. +// +// AUDCLNT_STREAMFLAGS_EVENTCALLBACK - An exclusive mode client will supply an event handle that will be +// signaled when an IRP completes (or a waveRT buffer completes) telling +// it to fill the next buffer +// +// AUDCLNT_STREAMFLAGS_NOPERSIST - Session state will not be persisted +// +// AUDCLNT_STREAMFLAGS_RATEADJUST - The sample rate of the stream is adjusted to a rate specified by an application. +// +// AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY - When used with AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM, a sample rate +// converter with better quality than the default conversion but with a +// higher performance cost is used. This should be used if the audio is +// ultimately intended to be heard by humans as opposed to other +// scenarios such as pumping silence or populating a meter. +// +// AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM - A channel matrixer and a sample rate converter are inserted as necessary +// to convert between the uncompressed format supplied to +// IAudioClient::Initialize and the audio engine mix format. +// +// AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED - Session expires when there are no streams and no owning +// session controls. +// +// AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE - Don't show volume control in the Volume Mixer. +// +// AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED - Don't show volume control in the Volume Mixer after the +// session expires. +// +// +// AUDCLNT_SYSFXFLAGS (these flags use low word 0x0000FFFF): +// +// none defined currently +// +AUDCLNT_FLAG :: enum windows.DWORD { + STREAM_CROSSPROCESS = 0x00010000, + STREAM_LOOPBACK = 0x00020000, + STREAM_EVENTCALLBACK = 0x00040000, + STREAM_NOPERSIST = 0x00080000, + STREAM_RATEADJUST = 0x00100000, + STREAM_SRC_DEFAULT_QUALITY = 0x08000000, + STREAM_AUTOCONVERTPCM = 0x80000000, + SESSION_EXPIREWHENUNOWNED = 0x10000000, + SESSION_DISPLAY_HIDE = 0x20000000, + SESSION_DISPLAY_HIDEWHENEXPIRED = 0x40000000, +} + +EDataFlow :: enum u32 { + Render, + Capture, + All, +} + +ERole :: enum u32 { + Console, + Multimedia, + Communications, +} + +AudioClientProperties :: struct { + cbSize: u32, + bIsOffload: windows.BOOL, + eCategory: AUDIO_STREAM_CATEGORY, + Options: bit_set[AUDCLNT_STREAMOPTION], +} + +AUDCLNT_STREAMOPTIONS_NONE :: bit_set[AUDCLNT_STREAMOPTION]{} +AUDCLNT_STREAMOPTION :: enum u32 { + RAW, + MATCH_FORMAT, + AMBISONICS, + POST_VOLUME_LOOPBACK, +} + +// Used to specify that any possible permutation of speaker configurations +SPEAKERS_ALL :: transmute(bit_set[SPEAKER])u32(0x80000000) + +SPEAKER :: enum windows.DWORD { + FRONT_LEFT, + FRONT_RIGHT, + FRONT_CENTER, + LOW_FREQUENCY, + BACK_LEFT, + BACK_RIGHT, + FRONT_LEFT_OF_CENTER, + FRONT_RIGHT_OF_CENTER, + BACK_CENTER, + SIDE_LEFT, + SIDE_RIGHT, + TOP_CENTER, + TOP_FRONT_LEFT, + TOP_FRONT_CENTER, + TOP_FRONT_RIGHT, + TOP_BACK_LEFT, + TOP_BACK_CENTER, + TOP_BACK_RIGHT, +} + +// extended waveform format structure used for all non-PCM formats. this +// structure is common to all non-PCM formats. +WAVEFORMATEX :: struct #packed { + wFormatTag: WAVE_FORMAT, // format type + nChannels: windows.WORD, // number of channels (i.e. mono, stereo...) + nSamplesPerSec: windows.DWORD, // sample rate + nAvgBytesPerSec: windows.DWORD, // for buffer estimation + nBlockAlign: windows.WORD, // block size of data + wBitsPerSample: windows.WORD, // number of bits per sample of mono data + cbSize: windows.WORD, // the count in bytes of the size of extra information (after cbSize) +} + + +// New wave format development should be based on the +// WAVEFORMATEXTENSIBLE structure. WAVEFORMATEXTENSIBLE allows you to +// avoid having to register a new format tag with Microsoft. Simply +// define a new GUID value for the WAVEFORMATEXTENSIBLE.SubFormat field +// and use WAVE_FORMAT_EXTENSIBLE in the +// WAVEFORMATEXTENSIBLE.Format.wFormatTag field. +WAVEFORMATEXTENSIBLE :: struct { + Format: WAVEFORMATEX, + using Samples: struct #raw_union { + wValidBitsPerSample: windows.WORD, // bits of precision + wSamplesPerBlock: windows.WORD, // valid if wBitsPerSample==0 + wReserved: windows.WORD, // If neither applies, set to zero. + }, + dwChannelMask: bit_set[SPEAKER], // which channels are present in stream + SubFormat: windows.GUID, +} + + +// WAVE form wFormatTag IDs +WAVE_FORMAT :: enum windows.WORD { + UNKNOWN = 0x0000, /* Microsoft Corporation */ + ADPCM = 0x0002, /* Microsoft Corporation */ + IEEE_FLOAT = 0x0003, /* Microsoft Corporation */ + VSELP = 0x0004, /* Compaq Computer Corp. */ + IBM_CVSD = 0x0005, /* IBM Corporation */ + ALAW = 0x0006, /* Microsoft Corporation */ + MULAW = 0x0007, /* Microsoft Corporation */ + DTS = 0x0008, /* Microsoft Corporation */ + DRM = 0x0009, /* Microsoft Corporation */ + WMAVOICE9 = 0x000A, /* Microsoft Corporation */ + WMAVOICE10 = 0x000B, /* Microsoft Corporation */ + OKI_ADPCM = 0x0010, /* OKI */ + DVI_ADPCM = 0x0011, /* Intel Corporation */ + IMA_ADPCM = DVI_ADPCM, /* Intel Corporation */ + MEDIASPACE_ADPCM = 0x0012, /* Videologic */ + SIERRA_ADPCM = 0x0013, /* Sierra Semiconductor Corp */ + G723_ADPCM = 0x0014, /* Antex Electronics Corporation */ + DIGISTD = 0x0015, /* DSP Solutions, Inc. */ + DIGIFIX = 0x0016, /* DSP Solutions, Inc. */ + DIALOGIC_OKI_ADPCM = 0x0017, /* Dialogic Corporation */ + MEDIAVISION_ADPCM = 0x0018, /* Media Vision, Inc. */ + CU_CODEC = 0x0019, /* Hewlett-Packard Company */ + HP_DYN_VOICE = 0x001A, /* Hewlett-Packard Company */ + YAMAHA_ADPCM = 0x0020, /* Yamaha Corporation of America */ + SONARC = 0x0021, /* Speech Compression */ + DSPGROUP_TRUESPEECH = 0x0022, /* DSP Group, Inc */ + ECHOSC1 = 0x0023, /* Echo Speech Corporation */ + AUDIOFILE_AF36 = 0x0024, /* Virtual Music, Inc. */ + APTX = 0x0025, /* Audio Processing Technology */ + AUDIOFILE_AF10 = 0x0026, /* Virtual Music, Inc. */ + PROSODY_1612 = 0x0027, /* Aculab plc */ + LRC = 0x0028, /* Merging Technologies S.A. */ + DOLBY_AC2 = 0x0030, /* Dolby Laboratories */ + GSM610 = 0x0031, /* Microsoft Corporation */ + MSNAUDIO = 0x0032, /* Microsoft Corporation */ + ANTEX_ADPCME = 0x0033, /* Antex Electronics Corporation */ + CONTROL_RES_VQLPC = 0x0034, /* Control Resources Limited */ + DIGIREAL = 0x0035, /* DSP Solutions, Inc. */ + DIGIADPCM = 0x0036, /* DSP Solutions, Inc. */ + CONTROL_RES_CR10 = 0x0037, /* Control Resources Limited */ + NMS_VBXADPCM = 0x0038, /* Natural MicroSystems */ + CS_IMAADPCM = 0x0039, /* Crystal Semiconductor IMA ADPCM */ + ECHOSC3 = 0x003A, /* Echo Speech Corporation */ + ROCKWELL_ADPCM = 0x003B, /* Rockwell International */ + ROCKWELL_DIGITALK = 0x003C, /* Rockwell International */ + XEBEC = 0x003D, /* Xebec Multimedia Solutions Limited */ + G721_ADPCM = 0x0040, /* Antex Electronics Corporation */ + G728_CELP = 0x0041, /* Antex Electronics Corporation */ + MSG723 = 0x0042, /* Microsoft Corporation */ + INTEL_G723_1 = 0x0043, /* Intel Corp. */ + INTEL_G729 = 0x0044, /* Intel Corp. */ + SHARP_G726 = 0x0045, /* Sharp */ + MPEG = 0x0050, /* Microsoft Corporation */ + RT24 = 0x0052, /* InSoft, Inc. */ + PAC = 0x0053, /* InSoft, Inc. */ + MPEGLAYER3 = 0x0055, /* ISO/MPEG Layer3 Format Tag */ + LUCENT_G723 = 0x0059, /* Lucent Technologies */ + CIRRUS = 0x0060, /* Cirrus Logic */ + ESPCM = 0x0061, /* ESS Technology */ + VOXWARE = 0x0062, /* Voxware Inc */ + CANOPUS_ATRAC = 0x0063, /* Canopus, co., Ltd. */ + G726_ADPCM = 0x0064, /* APICOM */ + G722_ADPCM = 0x0065, /* APICOM */ + DSAT = 0x0066, /* Microsoft Corporation */ + DSAT_DISPLAY = 0x0067, /* Microsoft Corporation */ + VOXWARE_BYTE_ALIGNED = 0x0069, /* Voxware Inc */ + VOXWARE_AC8 = 0x0070, /* Voxware Inc */ + VOXWARE_AC10 = 0x0071, /* Voxware Inc */ + VOXWARE_AC16 = 0x0072, /* Voxware Inc */ + VOXWARE_AC20 = 0x0073, /* Voxware Inc */ + VOXWARE_RT24 = 0x0074, /* Voxware Inc */ + VOXWARE_RT29 = 0x0075, /* Voxware Inc */ + VOXWARE_RT29HW = 0x0076, /* Voxware Inc */ + VOXWARE_VR12 = 0x0077, /* Voxware Inc */ + VOXWARE_VR18 = 0x0078, /* Voxware Inc */ + VOXWARE_TQ40 = 0x0079, /* Voxware Inc */ + VOXWARE_SC3 = 0x007A, /* Voxware Inc */ + VOXWARE_SC3_1 = 0x007B, /* Voxware Inc */ + SOFTSOUND = 0x0080, /* Softsound, Ltd. */ + VOXWARE_TQ60 = 0x0081, /* Voxware Inc */ + MSRT24 = 0x0082, /* Microsoft Corporation */ + G729A = 0x0083, /* AT&T Labs, Inc. */ + MVI_MVI2 = 0x0084, /* Motion Pixels */ + DF_G726 = 0x0085, /* DataFusion Systems (Pty) (Ltd) */ + DF_GSM610 = 0x0086, /* DataFusion Systems (Pty) (Ltd) */ + ISIAUDIO = 0x0088, /* Iterated Systems, Inc. */ + ONLIVE = 0x0089, /* OnLive! Technologies, Inc. */ + MULTITUDE_FT_SX20 = 0x008A, /* Multitude Inc. */ + INFOCOM_ITS_G721_ADPCM = 0x008B, /* Infocom */ + CONVEDIA_G729 = 0x008C, /* Convedia Corp. */ + CONGRUENCY = 0x008D, /* Congruency Inc. */ + SBC24 = 0x0091, /* Siemens Business Communications Sys */ + DOLBY_AC3_SPDIF = 0x0092, /* Sonic Foundry */ + MEDIASONIC_G723 = 0x0093, /* MediaSonic */ + PROSODY_8KBPS = 0x0094, /* Aculab plc */ + ZYXEL_ADPCM = 0x0097, /* ZyXEL Communications, Inc. */ + PHILIPS_LPCBB = 0x0098, /* Philips Speech Processing */ + PACKED = 0x0099, /* Studer Professional Audio AG */ + MALDEN_PHONYTALK = 0x00A0, /* Malden Electronics Ltd. */ + RACAL_RECORDER_GSM = 0x00A1, /* Racal recorders */ + RACAL_RECORDER_G720_A = 0x00A2, /* Racal recorders */ + RACAL_RECORDER_G723_1 = 0x00A3, /* Racal recorders */ + RACAL_RECORDER_TETRA_ACELP = 0x00A4, /* Racal recorders */ + NEC_AAC = 0x00B0, /* NEC Corp. */ + RAW_AAC1 = 0x00FF, /* For Raw AAC, with format block AudioSpecificConfig() (as defined by MPEG-4), that follows WAVEFORMATEX */ + RHETOREX_ADPCM = 0x0100, /* Rhetorex Inc. */ + IRAT = 0x0101, /* BeCubed Software Inc. */ + VIVO_G723 = 0x0111, /* Vivo Software */ + VIVO_SIREN = 0x0112, /* Vivo Software */ + PHILIPS_CELP = 0x0120, /* Philips Speech Processing */ + PHILIPS_GRUNDIG = 0x0121, /* Philips Speech Processing */ + DIGITAL_G723 = 0x0123, /* Digital Equipment Corporation */ + SANYO_LD_ADPCM = 0x0125, /* Sanyo Electric Co., Ltd. */ + SIPROLAB_ACEPLNET = 0x0130, /* Sipro Lab Telecom Inc. */ + SIPROLAB_ACELP4800 = 0x0131, /* Sipro Lab Telecom Inc. */ + SIPROLAB_ACELP8V3 = 0x0132, /* Sipro Lab Telecom Inc. */ + SIPROLAB_G729 = 0x0133, /* Sipro Lab Telecom Inc. */ + SIPROLAB_G729A = 0x0134, /* Sipro Lab Telecom Inc. */ + SIPROLAB_KELVIN = 0x0135, /* Sipro Lab Telecom Inc. */ + VOICEAGE_AMR = 0x0136, /* VoiceAge Corp. */ + G726ADPCM = 0x0140, /* Dictaphone Corporation */ + DICTAPHONE_CELP68 = 0x0141, /* Dictaphone Corporation */ + DICTAPHONE_CELP54 = 0x0142, /* Dictaphone Corporation */ + QUALCOMM_PUREVOICE = 0x0150, /* Qualcomm, Inc. */ + QUALCOMM_HALFRATE = 0x0151, /* Qualcomm, Inc. */ + TUBGSM = 0x0155, /* Ring Zero Systems, Inc. */ + MSAUDIO1 = 0x0160, /* Microsoft Corporation */ + WMAUDIO2 = 0x0161, /* Microsoft Corporation */ + WMAUDIO3 = 0x0162, /* Microsoft Corporation */ + WMAUDIO_LOSSLESS = 0x0163, /* Microsoft Corporation */ + WMASPDIF = 0x0164, /* Microsoft Corporation */ + UNISYS_NAP_ADPCM = 0x0170, /* Unisys Corp. */ + UNISYS_NAP_ULAW = 0x0171, /* Unisys Corp. */ + UNISYS_NAP_ALAW = 0x0172, /* Unisys Corp. */ + UNISYS_NAP_16K = 0x0173, /* Unisys Corp. */ + SYCOM_ACM_SYC008 = 0x0174, /* SyCom Technologies */ + SYCOM_ACM_SYC701_G726L = 0x0175, /* SyCom Technologies */ + SYCOM_ACM_SYC701_CELP54 = 0x0176, /* SyCom Technologies */ + SYCOM_ACM_SYC701_CELP68 = 0x0177, /* SyCom Technologies */ + KNOWLEDGE_ADVENTURE_ADPCM = 0x0178, /* Knowledge Adventure, Inc. */ + FRAUNHOFER_IIS_MPEG2_AAC = 0x0180, /* Fraunhofer IIS */ + DTS_DS = 0x0190, /* Digital Theatre Systems, Inc. */ + CREATIVE_ADPCM = 0x0200, /* Creative Labs, Inc */ + CREATIVE_FASTSPEECH8 = 0x0202, /* Creative Labs, Inc */ + CREATIVE_FASTSPEECH10 = 0x0203, /* Creative Labs, Inc */ + UHER_ADPCM = 0x0210, /* UHER informatic GmbH */ + ULEAD_DV_AUDIO = 0x0215, /* Ulead Systems, Inc. */ + ULEAD_DV_AUDIO_1 = 0x0216, /* Ulead Systems, Inc. */ + QUARTERDECK = 0x0220, /* Quarterdeck Corporation */ + ILINK_VC = 0x0230, /* I-link Worldwide */ + RAW_SPORT = 0x0240, /* Aureal Semiconductor */ + ESST_AC3 = 0x0241, /* ESS Technology, Inc. */ + GENERIC_PASSTHRU = 0x0249, + IPI_HSX = 0x0250, /* Interactive Products, Inc. */ + IPI_RPELP = 0x0251, /* Interactive Products, Inc. */ + CS2 = 0x0260, /* Consistent Software */ + SONY_SCX = 0x0270, /* Sony Corp. */ + SONY_SCY = 0x0271, /* Sony Corp. */ + SONY_ATRAC3 = 0x0272, /* Sony Corp. */ + SONY_SPC = 0x0273, /* Sony Corp. */ + TELUM_AUDIO = 0x0280, /* Telum Inc. */ + TELUM_IA_AUDIO = 0x0281, /* Telum Inc. */ + NORCOM_VOICE_SYSTEMS_ADPCM = 0x0285, /* Norcom Electronics Corp. */ + FM_TOWNS_SND = 0x0300, /* Fujitsu Corp. */ + MICRONAS = 0x0350, /* Micronas Semiconductors, Inc. */ + MICRONAS_CELP833 = 0x0351, /* Micronas Semiconductors, Inc. */ + BTV_DIGITAL = 0x0400, /* Brooktree Corporation */ + INTEL_MUSIC_CODER = 0x0401, /* Intel Corp. */ + INDEO_AUDIO = 0x0402, /* Ligos */ + QDESIGN_MUSIC = 0x0450, /* QDesign Corporation */ + ON2_VP7_AUDIO = 0x0500, /* On2 Technologies */ + ON2_VP6_AUDIO = 0x0501, /* On2 Technologies */ + VME_VMPCM = 0x0680, /* AT&T Labs, Inc. */ + TPC = 0x0681, /* AT&T Labs, Inc. */ + LIGHTWAVE_LOSSLESS = 0x08AE, /* Clearjump */ + OLIGSM = 0x1000, /* Ing C. Olivetti & C., S.p.A. */ + OLIADPCM = 0x1001, /* Ing C. Olivetti & C., S.p.A. */ + OLICELP = 0x1002, /* Ing C. Olivetti & C., S.p.A. */ + OLISBC = 0x1003, /* Ing C. Olivetti & C., S.p.A. */ + OLIOPR = 0x1004, /* Ing C. Olivetti & C., S.p.A. */ + LH_CODEC = 0x1100, /* Lernout & Hauspie */ + LH_CODEC_CELP = 0x1101, /* Lernout & Hauspie */ + LH_CODEC_SBC8 = 0x1102, /* Lernout & Hauspie */ + LH_CODEC_SBC12 = 0x1103, /* Lernout & Hauspie */ + LH_CODEC_SBC16 = 0x1104, /* Lernout & Hauspie */ + NORRIS = 0x1400, /* Norris Communications, Inc. */ + ISIAUDIO_2 = 0x1401, /* ISIAudio */ + SOUNDSPACE_MUSICOMPRESS = 0x1500, /* AT&T Labs, Inc. */ + MPEG_ADTS_AAC = 0x1600, /* Microsoft Corporation */ + MPEG_RAW_AAC = 0x1601, /* Microsoft Corporation */ + MPEG_LOAS = 0x1602, /* Microsoft Corporation (MPEG-4 Audio Transport Streams (LOAS/LATM) */ + NOKIA_MPEG_ADTS_AAC = 0x1608, /* Microsoft Corporation */ + NOKIA_MPEG_RAW_AAC = 0x1609, /* Microsoft Corporation */ + VODAFONE_MPEG_ADTS_AAC = 0x160A, /* Microsoft Corporation */ + VODAFONE_MPEG_RAW_AAC = 0x160B, /* Microsoft Corporation */ + MPEG_HEAAC = 0x1610, /* Microsoft Corporation (MPEG-2 AAC or MPEG-4 HE-AAC v1/v2 streams with any payload (ADTS, ADIF, LOAS/LATM, RAW). Format block includes MP4 AudioSpecificConfig() -- see HEAACWAVEFORMAT below */ + VOXWARE_RT24_SPEECH = 0x181C, /* Voxware Inc. */ + SONICFOUNDRY_LOSSLESS = 0x1971, /* Sonic Foundry */ + INNINGS_TELECOM_ADPCM = 0x1979, /* Innings Telecom Inc. */ + LUCENT_SX8300P = 0x1C07, /* Lucent Technologies */ + LUCENT_SX5363S = 0x1C0C, /* Lucent Technologies */ + CUSEEME = 0x1F03, /* CUSeeMe */ + NTCSOFT_ALF2CM_ACM = 0x1FC4, /* NTCSoft */ + DVM = 0x2000, /* FAST Multimedia AG */ + DTS2 = 0x2001, + MAKEAVIS = 0x3313, + DIVIO_MPEG4_AAC = 0x4143, /* Divio, Inc. */ + NOKIA_ADAPTIVE_MULTIRATE = 0x4201, /* Nokia */ + DIVIO_G726 = 0x4243, /* Divio, Inc. */ + LEAD_SPEECH = 0x434C, /* LEAD Technologies */ + LEAD_VORBIS = 0x564C, /* LEAD Technologies */ + WAVPACK_AUDIO = 0x5756, /* xiph.org */ + ALAC = 0x6C61, /* Apple Lossless */ + OGG_VORBIS_MODE_1 = 0x674F, /* Ogg Vorbis */ + OGG_VORBIS_MODE_2 = 0x6750, /* Ogg Vorbis */ + OGG_VORBIS_MODE_3 = 0x6751, /* Ogg Vorbis */ + OGG_VORBIS_MODE_1_PLUS = 0x676F, /* Ogg Vorbis */ + OGG_VORBIS_MODE_2_PLUS = 0x6770, /* Ogg Vorbis */ + OGG_VORBIS_MODE_3_PLUS = 0x6771, /* Ogg Vorbis */ + _3COM_NBX = 0x7000, /* 3COM Corp. */ + OPUS = 0x704F, /* Opus */ + FAAD_AAC = 0x706D, + AMR_NB = 0x7361, /* AMR Narrowband */ + AMR_WB = 0x7362, /* AMR Wideband */ + AMR_WP = 0x7363, /* AMR Wideband Plus */ + GSM_AMR_CBR = 0x7A21, /* GSMA/3GPP */ + GSM_AMR_VBR_SID = 0x7A22, /* GSMA/3GPP */ + COMVERSE_INFOSYS_G723_1 = 0xA100, /* Comverse Infosys */ + COMVERSE_INFOSYS_AVQSBC = 0xA101, /* Comverse Infosys */ + COMVERSE_INFOSYS_SBC = 0xA102, /* Comverse Infosys */ + SYMBOL_G729_A = 0xA103, /* Symbol Technologies */ + VOICEAGE_AMR_WB = 0xA104, /* VoiceAge Corp. */ + INGENIENT_G726 = 0xA105, /* Ingenient Technologies, Inc. */ + MPEG4_AAC = 0xA106, /* ISO/MPEG-4 */ + ENCORE_G726 = 0xA107, /* Encore Software */ + ZOLL_ASAO = 0xA108, /* ZOLL Medical Corp. */ + SPEEX_VOICE = 0xA109, /* xiph.org */ + VIANIX_MASC = 0xA10A, /* Vianix LLC */ + WM9_SPECTRUM_ANALYZER = 0xA10B, /* Microsoft */ + WMF_SPECTRUM_ANAYZER = 0xA10C, /* Microsoft */ + GSM_610 = 0xA10D, + GSM_620 = 0xA10E, + GSM_660 = 0xA10F, + GSM_690 = 0xA110, + GSM_ADAPTIVE_MULTIRATE_WB = 0xA111, + POLYCOM_G722 = 0xA112, /* Polycom */ + POLYCOM_G728 = 0xA113, /* Polycom */ + POLYCOM_G729_A = 0xA114, /* Polycom */ + POLYCOM_SIREN = 0xA115, /* Polycom */ + GLOBAL_IP_ILBC = 0xA116, /* Global IP */ + RADIOTIME_TIME_SHIFT_RADIO = 0xA117, /* RadioTime */ + NICE_ACA = 0xA118, /* Nice Systems */ + NICE_ADPCM = 0xA119, /* Nice Systems */ + VOCORD_G721 = 0xA11A, /* Vocord Telecom */ + VOCORD_G726 = 0xA11B, /* Vocord Telecom */ + VOCORD_G722_1 = 0xA11C, /* Vocord Telecom */ + VOCORD_G728 = 0xA11D, /* Vocord Telecom */ + VOCORD_G729 = 0xA11E, /* Vocord Telecom */ + VOCORD_G729_A = 0xA11F, /* Vocord Telecom */ + VOCORD_G723_1 = 0xA120, /* Vocord Telecom */ + VOCORD_LBC = 0xA121, /* Vocord Telecom */ + NICE_G728 = 0xA122, /* Nice Systems */ + FRACE_TELECOM_G729 = 0xA123, /* France Telecom */ + CODIAN = 0xA124, /* CODIAN */ + DOLBY_AC4 = 0xAC40, /* Dolby AC-4 */ + FLAC = 0xF1AC, /* flac.sourceforge.net */ + EXTENSIBLE = 0xFFFE, /* Microsoft */ +} From 2f8ffc75b28d07ec43c17ea75896376f2cd1e492 Mon Sep 17 00:00:00 2001 From: Jakub Tomsu Date: Sat, 21 Mar 2026 22:12:00 +0100 Subject: [PATCH 205/273] move WASAPI to vendor:windows/wasapi --- vendor/{ => windows}/wasapi/wasapi.odin | 0 vendor/{ => windows}/wasapi/wasapi_hresult.odin | 0 vendor/{ => windows}/wasapi/wasapi_types.odin | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename vendor/{ => windows}/wasapi/wasapi.odin (100%) rename vendor/{ => windows}/wasapi/wasapi_hresult.odin (100%) rename vendor/{ => windows}/wasapi/wasapi_types.odin (100%) diff --git a/vendor/wasapi/wasapi.odin b/vendor/windows/wasapi/wasapi.odin similarity index 100% rename from vendor/wasapi/wasapi.odin rename to vendor/windows/wasapi/wasapi.odin diff --git a/vendor/wasapi/wasapi_hresult.odin b/vendor/windows/wasapi/wasapi_hresult.odin similarity index 100% rename from vendor/wasapi/wasapi_hresult.odin rename to vendor/windows/wasapi/wasapi_hresult.odin diff --git a/vendor/wasapi/wasapi_types.odin b/vendor/windows/wasapi/wasapi_types.odin similarity index 100% rename from vendor/wasapi/wasapi_types.odin rename to vendor/windows/wasapi/wasapi_types.odin From a097f3c9381a5ba83ce594c3df82dcc357ab7e7a Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Mon, 23 Mar 2026 16:42:30 +0100 Subject: [PATCH 206/273] add type_field_bit_offset/size intrinsics --- base/intrinsics/intrinsics.odin | 5 +++ src/check_builtin.cpp | 62 +++++++++++++++++++++++++++++++++ src/checker_builtin_procs.hpp | 6 ++++ 3 files changed, 73 insertions(+) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index ee99da1b3..0e70250d5 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -205,6 +205,11 @@ type_bit_set_underlying_type :: proc($T: typeid) -> typeid where type_is_bit_set type_has_field :: proc($T: typeid, $name: string) -> bool --- type_field_type :: proc($T: typeid, $name: string) -> typeid --- +type_field_bit_size :: proc($T: typeid, $name: string) -> int where type_is_bit_field(T) --- +type_field_bit_offset :: proc($T: typeid, $name: string) -> int where type_is_bit_field(T) --- + +type_bit_field_size :: proc($T: typeid, $name: string) -> typeid --- + type_proc_parameter_count :: proc($T: typeid) -> int where type_is_proc(T) --- type_proc_return_count :: proc($T: typeid) -> int where type_is_proc(T) --- diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 4b3e8807e..767699214 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -6880,6 +6880,68 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As break; } break; + + case BuiltinProc_type_field_bit_offset: + case BuiltinProc_type_field_bit_size: + { + Operand op = {}; + Type *bt = check_type(c, ce->args[0]); + Type *type = base_type(bt); + if (type == nullptr || type == t_invalid) { + error(ce->args[0], "Expected a type for '%.*s'", LIT(builtin_name)); + return false; + } + + if (!is_type_bit_field(type)) { + error(operand->expr, "Expected a bit field type for '%.*s'", LIT(builtin_name)); + operand->mode = Addressing_Invalid; + operand->type = t_invalid; + return false; + } + + Operand x = {}; + check_expr(c, &x, ce->args[1]); + + if (!is_type_string(x.type) || x.mode != Addressing_Constant || x.value.kind != ExactValue_String) { + error(ce->args[1], "Expected a constant string for field argument"); + return false; + } + + InternedString field_name = string_interner_insert(x.value.value_string); + + i64 bit_offset = 0; + i64 bit_size = 0; + for_array(i, type->BitField.fields) { + Entity *f = type->BitField.fields[i]; + if (f->kind != Entity_Variable || (f->flags & EntityFlag_Field) == 0) { + continue; + } + auto str = entity_interned_name(f); + if (field_name == str) { + bit_offset = type->BitField.bit_offsets[i]; + bit_size = type->BitField.bit_sizes[i]; + break; + } + } + + i64 value = 0; + switch (id) { + case BuiltinProc_type_field_bit_offset: + value = bit_offset; + break; + case BuiltinProc_type_field_bit_size: + value = bit_size; + break; + default: + GB_ASSERT(false); + } + + operand->mode = Addressing_Constant; + operand->type = t_untyped_integer; + operand->value = exact_value_i64(value); + break; + } + break; case BuiltinProc_type_is_specialization_of: { diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index f73422932..c0333e91c 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -314,6 +314,9 @@ BuiltinProc__type_simple_boolean_end, BuiltinProc_type_has_field, BuiltinProc_type_field_type, + + BuiltinProc_type_field_bit_offset, + BuiltinProc_type_field_bit_size, BuiltinProc_type_is_specialization_of, @@ -694,6 +697,9 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("type_has_field"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_field_type"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + + {STR_LIT("type_field_bit_offset"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("type_field_bit_size"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_specialization_of"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, From b1d9db7b15bd65d3021792de7d770517d497c167 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Mon, 23 Mar 2026 16:43:11 +0100 Subject: [PATCH 207/273] make offset_of(Bit_Field, ...) an error, typo fix --- src/check_builtin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 767699214..e4907dfd0 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -2821,9 +2821,9 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } - if (is_type_array(type)) { + if (is_type_array(type) || is_type_bit_field(type)) { gbString t = type_to_string(type); - error(field_arg, "Invalid a struct type for '%.*s', got '%s'", LIT(builtin_name), t); + error(field_arg, "Expected a struct type for '%.*s', got '%s'", LIT(builtin_name), t); gb_string_free(t); return false; } From 7053e6720f04cef3e74e2db8ab31af3122d2873e Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Mon, 23 Mar 2026 17:18:01 +0100 Subject: [PATCH 208/273] remove type_bit_field_size accident --- base/intrinsics/intrinsics.odin | 2 -- 1 file changed, 2 deletions(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index 0e70250d5..4d3d38882 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -208,8 +208,6 @@ type_field_type :: proc($T: typeid, $name: string) -> typeid --- type_field_bit_size :: proc($T: typeid, $name: string) -> int where type_is_bit_field(T) --- type_field_bit_offset :: proc($T: typeid, $name: string) -> int where type_is_bit_field(T) --- -type_bit_field_size :: proc($T: typeid, $name: string) -> typeid --- - type_proc_parameter_count :: proc($T: typeid) -> int where type_is_proc(T) --- type_proc_return_count :: proc($T: typeid) -> int where type_is_proc(T) --- From d6a47f5e9935d02306897beff334cd375995d5ea Mon Sep 17 00:00:00 2001 From: Carlyle Date: Mon, 23 Mar 2026 11:43:13 -0700 Subject: [PATCH 209/273] added get_page_size() to `core:mem/virtual` --- core/mem/virtual/virtual.odin | 11 +++++++++++ core/mem/virtual/virtual_linux.odin | 5 +++++ core/mem/virtual/virtual_other.odin | 4 ++++ core/mem/virtual/virtual_posix.odin | 4 ++++ core/mem/virtual/virtual_windows.odin | 7 +++++++ 5 files changed, 31 insertions(+) diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin index d37c61267..112089e9e 100644 --- a/core/mem/virtual/virtual.odin +++ b/core/mem/virtual/virtual.odin @@ -45,6 +45,17 @@ release :: proc "contextless" (data: rawptr, size: uint) { _release(data, size) } +get_page_size :: proc() -> int { + // NOTE(tetra): The page size never changes, so why do anything complicated + // if we don't have to. + @static page_size := -1 + if page_size != -1 { + return page_size + } + page_size = _get_page_size() + return page_size +} + Protect_Flag :: enum u32 { Read, Write, diff --git a/core/mem/virtual/virtual_linux.odin b/core/mem/virtual/virtual_linux.odin index 144a8dc59..824434c51 100644 --- a/core/mem/virtual/virtual_linux.odin +++ b/core/mem/virtual/virtual_linux.odin @@ -3,6 +3,7 @@ package mem_virtual import "core:sys/linux" +import "core:sys/posix" _reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { addr, errno := linux.mmap(0, size, {}, {.PRIVATE, .ANONYMOUS}) @@ -33,6 +34,10 @@ _release :: proc "contextless" (data: rawptr, size: uint) { _ = linux.munmap(data, size) } +_get_page_size :: proc() -> int { + return int(posix.sysconf(._PAGE_SIZE)) +} + _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { pflags: linux.Mem_Protection pflags = {} diff --git a/core/mem/virtual/virtual_other.odin b/core/mem/virtual/virtual_other.odin index 8a2e1a61d..d251d194e 100644 --- a/core/mem/virtual/virtual_other.odin +++ b/core/mem/virtual/virtual_other.odin @@ -21,6 +21,10 @@ _decommit :: proc "contextless" (data: rawptr, size: uint) { _release :: proc "contextless" (data: rawptr, size: uint) { } +_get_page_size :: proc() -> int { + return 0 +} + _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { return false } diff --git a/core/mem/virtual/virtual_posix.odin b/core/mem/virtual/virtual_posix.odin index 6f257c385..d81ff4ed9 100644 --- a/core/mem/virtual/virtual_posix.odin +++ b/core/mem/virtual/virtual_posix.odin @@ -20,6 +20,10 @@ _release :: proc "contextless" (data: rawptr, size: uint) { posix.munmap(data, size) } +_get_page_size :: proc() -> int { + return int(posix.sysconf(._PAGE_SIZE)) +} + _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { #assert(i32(posix.Prot_Flag_Bits.READ) == i32(Protect_Flag.Read)) #assert(i32(posix.Prot_Flag_Bits.WRITE) == i32(Protect_Flag.Write)) diff --git a/core/mem/virtual/virtual_windows.odin b/core/mem/virtual/virtual_windows.odin index 0866ebfa1..f8300ec06 100644 --- a/core/mem/virtual/virtual_windows.odin +++ b/core/mem/virtual/virtual_windows.odin @@ -123,6 +123,13 @@ _release :: proc "contextless" (data: rawptr, size: uint) { VirtualFree(data, 0, MEM_RELEASE) } +_get_page_size :: proc() -> int { + info: SYSTEM_INFO + GetSystemInfo(&info) + + return int(info.dwPageSize) +} + @(no_sanitize_address) _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { pflags: u32 From d90cc4e3b6a8647f81b70464c983cc8093154c62 Mon Sep 17 00:00:00 2001 From: Laytan Date: Mon, 23 Mar 2026 21:28:47 +0100 Subject: [PATCH 210/273] json: fix user unmarshaller example (#6468) * json: fix user unmarshaller example - Returning `.None` in the custom unmarshaler is wrong, should be `nil` - `advance_token` has to be called Besides the fixes I made it an actual example that will show up on the package docs --- core/encoding/json/unmarshal.odin | 88 +++++++++++++++++-------------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 2aa3c0913..4058393c8 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -34,35 +34,6 @@ Register_User_Unmarshaler_Error :: enum { Unmarshaler_Previously_Found, } -// Example User Unmarshaler: -// Custom Unmarshaler for `int` -// Some_Unmarshaler :: proc(p: ^json.Parser, v: any) -> json.Unmarshal_Error { -// token := p.curr_token.text -// i, ok := strconv.parse_i64_of_base(token, 2) -// if !ok { -// return .Invalid_Data -// -// } -// (^int)(v.data)^ = int(i) -// return .None -// } -// -// _main :: proc() { -// // Ensure the json._user_unmarshaler map is initialized -// json.set_user_unmarshalers(new(map[typeid]json.User_Unmarshaler)) -// reg_err := json.register_user_unmarshaler(type_info_of(int).id, Some_Unmarshaler) -// assert(reg_err == .None) -// -// data := `{"value":101010}` -// SomeType :: struct { -// value: int, -// } -// y: SomeType -// -// unmarshal_err := json.unmarshal(transmute([]byte)data, &y) -// fmt.println(y, unmarshal_err) -// } - // NOTE(Jeroen): This is a pointer to prevent accidental additions // it is prefixed with `_` rather than marked with a private attribute so that users can access it if necessary _user_unmarshalers: ^map[typeid]User_Unmarshaler @@ -72,23 +43,60 @@ _user_unmarshalers: ^map[typeid]User_Unmarshaler // Inputs: // - m: A pointer to a map of typeids to User_Unmarshaler procs. // -// NOTE: Must be called before using register_user_unmarshaler. +// NOTE: Must be called before using `register_user_unmarshaler`. // set_user_unmarshalers :: proc(m: ^map[typeid]User_Unmarshaler) { assert(_user_unmarshalers == nil, "set_user_unmarshalers must not be called more than once.") _user_unmarshalers = m } -// Registers a user-defined unmarshaler for a specific typeid -// -// Inputs: -// - id: The typeid of the custom type. -// - unmarshaler: The User_Unmarshaler function for the custom type. -// -// Returns: A Register_User_Unmarshaler_Error value indicating the success or failure of the operation. -// -// WARNING: set_user_unmarshalers must be called before using this procedure. -// +/* +Registers a user-defined unmarshaler for a specific `typeid`. + +WARNING: set_user_unmarshalers must be called before using this procedure. + +Inputs: +- id: The `typeid` of the custom type. +- unmarshaler: The `User_Unmarshaler` function for the custom type. + +Example: + import "core:fmt" + import "core:encoding/json" + import "core:strconv" + + // Custom Unmarshaler for `int` + some_unmarshaler :: proc(p: ^json.Parser, v: any) -> json.Unmarshal_Error { + token := p.curr_token.text + i, ok := strconv.parse_i64_of_base(token, 2) + if !ok { + return .Invalid_Data + } + + (^int)(v.data)^ = int(i) + + json.advance_token(p) + return nil + } + + register_user_unmarshaler_example :: proc() { + // Ensure the `json._user_unmarshalers` map is initialized. + json.set_user_unmarshalers(new(map[typeid]json.User_Unmarshaler)) + reg_err := json.register_user_unmarshaler(typeid_of(int), some_unmarshaler) + assert(reg_err == .None) + + data := `{"value":101010}` + SomeType :: struct { + value: int, + } + y: SomeType + + unmarshal_err := json.unmarshal(transmute([]byte)data, &y) + fmt.println(y, unmarshal_err) + } + +Output: + SomeType{value = 42} nil +*/ register_user_unmarshaler :: proc(id: typeid, unmarshaler: User_Unmarshaler) -> Register_User_Unmarshaler_Error { if _user_unmarshalers == nil { return .No_User_Unmarshaler From 147542b5cc97abbebb4f95cb32377af2c0d4f523 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Mon, 23 Mar 2026 20:55:44 -0400 Subject: [PATCH 211/273] Allow pointers to types which have subtype fields at offset 0 to be assignable in proc parameters. ```odin // Virtual interface IFoo :: struct { foo: proc( self: ^IFoo ), } // Implements IFoo interface Foo :: struct { using vt: IFoo, name: string, } // Implement interface via `Foo` Foo_Impl :: IFoo { // `self` of type `^Foo` (not `^IFoo`) is now accepted as a valid parameter. foo = proc( self: ^Foo ) { ... }, } ``` --- src/check_expr.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++- src/types.cpp | 36 ++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 9044d8346..597c641a2 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -667,6 +667,7 @@ gb_internal bool find_or_generate_polymorphic_procedure_from_parameters(CheckerC gb_internal bool check_type_specialization_to(CheckerContext *c, Type *specialization, Type *type, bool compound, bool modify_type); gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, Type *source, bool compound, bool modify_type); gb_internal bool check_cast_internal(CheckerContext *c, Operand *x, Type *type); +gb_internal bool check_proc_params_assignable(CheckerContext *c, Type *x, Type *y); #define MAXIMUM_TYPE_DISTANCE 10 @@ -927,8 +928,12 @@ gb_internal i64 check_distance_between_types(CheckerContext *c, Operand *operand add_entity_use(c, operand->expr, e); return 4; } + + if (is_type_proc(src) && check_proc_params_assignable(c, dst, src)) { + return 4; + } } - + if (is_type_complex_or_quaternion(dst)) { Type *elem = base_complex_elem_type(dst); if (are_types_identical(elem, base_type(src))) { @@ -1052,6 +1057,51 @@ gb_internal bool internal_check_is_assignable_to(Type *src, Type *dst) { return check_is_assignable_to(nullptr, &x, dst); } +gb_internal bool check_proc_params_assignable(CheckerContext *c, Type *dst, Type *src) { + GB_ASSERT(dst->kind == Type_Proc); + GB_ASSERT(src->kind == Type_Proc); + + if (!dst->Proc.params || !src->Proc.params) { + return false; + } + + if (!are_types_identical(src->Proc.results, dst->Proc.results)) { + return false; + } + + auto& dst_tuple = dst->Proc.params->Tuple; + auto& src_tuple = src->Proc.params->Tuple; + + if (dst_tuple.variables.count == src_tuple.variables.count && dst_tuple.is_packed == src_tuple.is_packed) { + for_array(i, dst_tuple.variables) { + Entity *edst = dst_tuple.variables[i]; + Entity *esrc = src_tuple.variables[i]; + + if (edst->kind != esrc->kind || !are_types_identical(edst->type, esrc->type)) { + + // Pointers to subtype fields that are at byte offset 0 are OK + if (edst->type->kind == Type_Pointer && esrc->type->kind == Type_Pointer && + is_type_struct(esrc->type->Pointer.elem) && + check_is_assignable_to_using_offset_zero_subtype(esrc->type->Pointer.elem, edst->type->Pointer.elem)) { + continue; + } + + return false; + } + + if (edst->kind == Entity_Constant && !compare_exact_values(Token_CmpEq, edst->Constant.value, esrc->Constant.value)) { + // NOTE(bill): This is needed for polymorphic procedures + return false; + } + } + + return true; + } + + return false; +} + + gb_internal AstPackage *get_package_of_type(Type *type) { for (;;) { if (type == nullptr) { diff --git a/src/types.cpp b/src/types.cpp index f4b708e57..6d033eeb3 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -4922,6 +4922,42 @@ gb_internal isize check_is_assignable_to_using_subtype(Type *src, Type *dst, isi return 0; } +gb_internal bool check_is_assignable_to_using_offset_zero_subtype(Type *src, Type *dst) { + + Type *src_struct = base_type(src); + if (!is_type_struct(src_struct)) { + return false; + } + + // We check multiple fields in case of #raw_union, + // but exit on the first field that is not at offset 0. + for_array(i, src_struct->Struct.fields) { + Entity *f = src_struct->Struct.fields[i]; + if (f->kind != Entity_Variable || (f->flags&EntityFlags_IsSubtype) == 0) { + continue; + } + + Type *field_type = nullptr; + i64 offset = type_offset_of(src_struct, i, &field_type); + + // Only allowed if the subtype field shared the same address as its container + if (offset != 0) { + return false; + } + + if (are_types_identical(field_type, dst)) { + return true; + } + + // Check parent if the field type is a struct + if (check_is_assignable_to_using_offset_zero_subtype(field_type, dst)) { + return true; + } + } + + return false; +} + gb_internal bool is_type_subtype_of(Type *src, Type *dst) { if (are_types_identical(src, dst)) { return true; From 4f6caf19f01701d794a4a1fd5b05494edd5dc069 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Mon, 23 Mar 2026 21:15:12 -0400 Subject: [PATCH 212/273] Ensure checking for proc property equality before checking param assignability --- src/check_expr.cpp | 2 +- src/types.cpp | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 597c641a2..d6c91ce94 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -929,7 +929,7 @@ gb_internal i64 check_distance_between_types(CheckerContext *c, Operand *operand return 4; } - if (is_type_proc(src) && check_proc_params_assignable(c, dst, src)) { + if (is_type_proc(src) && are_proc_properties_identical(dst,src) && check_proc_params_assignable(c, dst, src)) { return 4; } } diff --git a/src/types.cpp b/src/types.cpp index 6d033eeb3..ffd0fc196 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3058,6 +3058,13 @@ gb_internal bool are_types_identical_unique_tuples(Type *x, Type *y) { return are_types_identical_internal(x, y, true); } +gb_internal bool are_proc_properties_identical(Type *x, Type *y) { + return x->Proc.calling_convention == y->Proc.calling_convention && + x->Proc.c_vararg == y->Proc.c_vararg && + x->Proc.variadic == y->Proc.variadic && + x->Proc.diverging == y->Proc.diverging && + x->Proc.optional_ok == y->Proc.optional_ok; +} gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple_names) { if (x == y) { @@ -3262,11 +3269,7 @@ gb_internal bool are_types_identical_internal(Type *x, Type *y, bool check_tuple break; case Type_Proc: - return x->Proc.calling_convention == y->Proc.calling_convention && - x->Proc.c_vararg == y->Proc.c_vararg && - x->Proc.variadic == y->Proc.variadic && - x->Proc.diverging == y->Proc.diverging && - x->Proc.optional_ok == y->Proc.optional_ok && + return are_proc_properties_identical(x, y) && are_types_identical_internal(x->Proc.params, y->Proc.params, check_tuple_names) && are_types_identical_internal(x->Proc.results, y->Proc.results, check_tuple_names); From 2d77303b27ba0a3855b1e5ebffce0044efc87508 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 24 Mar 2026 16:16:24 +0100 Subject: [PATCH 213/273] Revert "added get_page_size() to `core:mem/virtual`" --- core/mem/virtual/virtual.odin | 11 ----------- core/mem/virtual/virtual_linux.odin | 5 ----- core/mem/virtual/virtual_other.odin | 4 ---- core/mem/virtual/virtual_posix.odin | 4 ---- core/mem/virtual/virtual_windows.odin | 7 ------- 5 files changed, 31 deletions(-) diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin index 112089e9e..d37c61267 100644 --- a/core/mem/virtual/virtual.odin +++ b/core/mem/virtual/virtual.odin @@ -45,17 +45,6 @@ release :: proc "contextless" (data: rawptr, size: uint) { _release(data, size) } -get_page_size :: proc() -> int { - // NOTE(tetra): The page size never changes, so why do anything complicated - // if we don't have to. - @static page_size := -1 - if page_size != -1 { - return page_size - } - page_size = _get_page_size() - return page_size -} - Protect_Flag :: enum u32 { Read, Write, diff --git a/core/mem/virtual/virtual_linux.odin b/core/mem/virtual/virtual_linux.odin index 824434c51..144a8dc59 100644 --- a/core/mem/virtual/virtual_linux.odin +++ b/core/mem/virtual/virtual_linux.odin @@ -3,7 +3,6 @@ package mem_virtual import "core:sys/linux" -import "core:sys/posix" _reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { addr, errno := linux.mmap(0, size, {}, {.PRIVATE, .ANONYMOUS}) @@ -34,10 +33,6 @@ _release :: proc "contextless" (data: rawptr, size: uint) { _ = linux.munmap(data, size) } -_get_page_size :: proc() -> int { - return int(posix.sysconf(._PAGE_SIZE)) -} - _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { pflags: linux.Mem_Protection pflags = {} diff --git a/core/mem/virtual/virtual_other.odin b/core/mem/virtual/virtual_other.odin index d251d194e..8a2e1a61d 100644 --- a/core/mem/virtual/virtual_other.odin +++ b/core/mem/virtual/virtual_other.odin @@ -21,10 +21,6 @@ _decommit :: proc "contextless" (data: rawptr, size: uint) { _release :: proc "contextless" (data: rawptr, size: uint) { } -_get_page_size :: proc() -> int { - return 0 -} - _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { return false } diff --git a/core/mem/virtual/virtual_posix.odin b/core/mem/virtual/virtual_posix.odin index d81ff4ed9..6f257c385 100644 --- a/core/mem/virtual/virtual_posix.odin +++ b/core/mem/virtual/virtual_posix.odin @@ -20,10 +20,6 @@ _release :: proc "contextless" (data: rawptr, size: uint) { posix.munmap(data, size) } -_get_page_size :: proc() -> int { - return int(posix.sysconf(._PAGE_SIZE)) -} - _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { #assert(i32(posix.Prot_Flag_Bits.READ) == i32(Protect_Flag.Read)) #assert(i32(posix.Prot_Flag_Bits.WRITE) == i32(Protect_Flag.Write)) diff --git a/core/mem/virtual/virtual_windows.odin b/core/mem/virtual/virtual_windows.odin index f8300ec06..0866ebfa1 100644 --- a/core/mem/virtual/virtual_windows.odin +++ b/core/mem/virtual/virtual_windows.odin @@ -123,13 +123,6 @@ _release :: proc "contextless" (data: rawptr, size: uint) { VirtualFree(data, 0, MEM_RELEASE) } -_get_page_size :: proc() -> int { - info: SYSTEM_INFO - GetSystemInfo(&info) - - return int(info.dwPageSize) -} - @(no_sanitize_address) _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { pflags: u32 From 7a017d2ecd78b8eaf8c5d32841beeba2ccaf5406 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Tue, 24 Mar 2026 15:37:04 -0400 Subject: [PATCH 214/273] Add test case for implicit cast pointer to offset zero subtype field proc param --- tests/issues/run.bat | 2 + tests/issues/run.sh | 7 +++ tests/issues/test_issue_xxxx.odin | 79 +++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 tests/issues/test_issue_xxxx.odin diff --git a/tests/issues/run.bat b/tests/issues/run.bat index 3db9d48c2..3c722ccc7 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -32,6 +32,8 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_6165.odin %COMMON% || exit /b ..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b ..\..\..\odin build ..\test_issue_6401.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b +..\..\..\odin test ..\test_issue_xxxx.odin %COMMON% || exit /b +..\..\..\odin build ..\test_issue_xxxx.odin -define:TEST_EXPECT_FAILURE=true %COMMON% 2>&1 | find /c "Error:" | findstr /x "1" || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index 01e6a6a28..67530a1d7 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -49,6 +49,13 @@ else echo "SUCCESSFUL 0/1" exit 1 fi +$ODIN test ../test_issue_xxxx.odin $COMMON +if [[ $($ODIN test ../test_issue_xxxx.odin -define:TEST_EXPECT_FAILURE=true $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 1 ]] ; then + echo "SUCCESSFUL 1/1" +else + echo "SUCCESSFUL 0/1" + exit 1 +fi set +x popd diff --git a/tests/issues/test_issue_xxxx.odin b/tests/issues/test_issue_xxxx.odin new file mode 100644 index 000000000..4d20ef356 --- /dev/null +++ b/tests/issues/test_issue_xxxx.odin @@ -0,0 +1,79 @@ +// Tests PR #xxxx https://github.com/odin-lang/Odin/issues/xxxx +package test_issues + +TEST_EXPECT_FAILURE :: #config(TEST_EXPECT_FAILURE, false) + +// Interfaces +IFoo :: struct { + foo: proc(self: ^IFoo) -> string, +} + +IBar :: struct { + bar: proc(self: ^IBar) -> string, +} + + +// Virtual table holders +Foo :: struct { + using vt: IFoo, +} + +// This is OK, but be careful! +Foo_Bar :: struct #raw_union { + using vt_foo: IFoo, + using vt_bar: IBar, +} + +// Implementation via Foo +Foo_Impl :: IFoo { + foo = proc(self: ^Foo) -> string { + return "Foo" + }, +} + +// Implementations via Foo_Bar +Foo_Bar_Foo_Impl :: IFoo { + foo = proc(self: ^Foo_Bar) -> string { + return "Foo_Bar: Foo" + }, +} + +Foo_Bar_Bar_Impl :: IBar { + bar = proc(self: ^Foo_Bar) -> string { + return "Foo_Bar: Bar" + }, +} + +when TEST_EXPECT_FAILURE { + // Will not be allowed in to be used in an implementation: + // The interface and implementation do not share the same address. + Invalid_Foo :: struct { + x: int, + using vt: IFoo, + } + + Invalid_Foo_Impl :: IFoo { + // Will not compile: + foo = proc(self: ^Invalid_Foo) -> string { + return "" + }, + } +} + +import "core:testing" + +@test +test_const_array_fill_assignment :: proc(t: ^testing.T) { + foo := Foo { + vt = Foo_Impl, + } + testing.expect_value(t, foo->foo(), "Foo") + + foo_bar := Foo_Bar { + vt_foo = Foo_Bar_Foo_Impl, + } + testing.expect_value(t, foo_bar->foo(), "Foo_Bar: Foo") + + foo_bar.vt_bar = Foo_Bar_Bar_Impl + testing.expect_value(t, foo_bar->bar(), "Foo_Bar: Bar") +} From b66e65e7f89d8c6ce426079581de84bfdbda9e58 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Tue, 24 Mar 2026 15:40:29 -0400 Subject: [PATCH 215/273] Rename temp test name given PR number --- tests/issues/run.bat | 4 ++-- tests/issues/run.sh | 4 ++-- tests/issues/{test_issue_xxxx.odin => test_pr_6470.odin} | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename tests/issues/{test_issue_xxxx.odin => test_pr_6470.odin} (95%) diff --git a/tests/issues/run.bat b/tests/issues/run.bat index 3c722ccc7..be04148a6 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -32,8 +32,8 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_issue_6165.odin %COMMON% || exit /b ..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b ..\..\..\odin build ..\test_issue_6401.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b -..\..\..\odin test ..\test_issue_xxxx.odin %COMMON% || exit /b -..\..\..\odin build ..\test_issue_xxxx.odin -define:TEST_EXPECT_FAILURE=true %COMMON% 2>&1 | find /c "Error:" | findstr /x "1" || exit /b +..\..\..\odin test ..\test_pr_6470.odin %COMMON% || exit /b +..\..\..\odin build ..\test_pr_6470.odin -define:TEST_EXPECT_FAILURE=true %COMMON% 2>&1 | find /c "Error:" | findstr /x "1" || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index 67530a1d7..996007cd7 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -49,8 +49,8 @@ else echo "SUCCESSFUL 0/1" exit 1 fi -$ODIN test ../test_issue_xxxx.odin $COMMON -if [[ $($ODIN test ../test_issue_xxxx.odin -define:TEST_EXPECT_FAILURE=true $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 1 ]] ; then +$ODIN test ../test_pr_6470.odin $COMMON +if [[ $($ODIN test ../test_pr_6470.odin -define:TEST_EXPECT_FAILURE=true $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 1 ]] ; then echo "SUCCESSFUL 1/1" else echo "SUCCESSFUL 0/1" diff --git a/tests/issues/test_issue_xxxx.odin b/tests/issues/test_pr_6470.odin similarity index 95% rename from tests/issues/test_issue_xxxx.odin rename to tests/issues/test_pr_6470.odin index 4d20ef356..d2427b335 100644 --- a/tests/issues/test_issue_xxxx.odin +++ b/tests/issues/test_pr_6470.odin @@ -1,4 +1,4 @@ -// Tests PR #xxxx https://github.com/odin-lang/Odin/issues/xxxx +// Tests PR #6470 https://github.com/odin-lang/Odin/pull/6470 package test_issues TEST_EXPECT_FAILURE :: #config(TEST_EXPECT_FAILURE, false) From 35b4c42f87963a2e7522c05cad9979a6b0dee3a1 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Tue, 24 Mar 2026 16:07:59 -0400 Subject: [PATCH 216/273] Use `odin test` for `test_pr_6470.odin` on windows --- tests/issues/run.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/issues/run.bat b/tests/issues/run.bat index be04148a6..f1a1c48c0 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -33,7 +33,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin build ..\test_issue_6240.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b ..\..\..\odin build ..\test_issue_6401.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b ..\..\..\odin test ..\test_pr_6470.odin %COMMON% || exit /b -..\..\..\odin build ..\test_pr_6470.odin -define:TEST_EXPECT_FAILURE=true %COMMON% 2>&1 | find /c "Error:" | findstr /x "1" || exit /b +..\..\..\odin test ..\test_pr_6470.odin -define:TEST_EXPECT_FAILURE=true %COMMON% 2>&1 | find /c "Error:" | findstr /x "1" || exit /b @echo off From 85eeca2f03b3571f22cad578b81b294e9c09a4af Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Mar 2026 10:15:58 +0000 Subject: [PATCH 217/273] Add missing generic `#soa` pointers to parapoly handling system --- src/check_expr.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index d6c91ce94..b5270c8e9 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1472,6 +1472,17 @@ gb_internal bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, T return is_polymorphic_type_assignable(c, poly->MultiPointer.elem, source->Pointer.elem, true, modify_type); } return false; + + case Type_SoaPointer: + if (source->kind == Type_SoaPointer) { + isize level = check_is_assignable_to_using_subtype(source->SoaPointer.elem, poly->SoaPointer.elem, /*level*/0, /*src_is_ptr*/false, /*allow_polymorphic*/true); + if (level > 0) { + return true; + } + return is_polymorphic_type_assignable(c, poly->SoaPointer.elem, source->SoaPointer.elem, true, modify_type); + } + return false; + case Type_Array: if (source->kind == Type_Array) { if (poly->Array.generic_count != nullptr) { From b178e39f808c760243ef02229a6dae6f4224b78d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Mar 2026 11:33:05 +0000 Subject: [PATCH 218/273] Improve error message when trying to pass a parapoly type to value parameter --- src/check_type.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/check_type.cpp b/src/check_type.cpp index b625fb3d0..18cbb4900 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1621,11 +1621,18 @@ gb_internal Type *determine_type_from_polymorphic(CheckerContext *ctx, Type *pol bool show_error = modify_type && !ctx->hide_polymorphic_errors; if (!is_operand_value(operand)) { if (show_error) { + ERROR_BLOCK(); + gbString pts = type_to_string(poly_type); gbString ots = type_to_string(operand.type, true); defer (gb_string_free(pts)); defer (gb_string_free(ots)); error(operand.expr, "Cannot determine polymorphic type from parameter: '%s' to '%s'", ots, pts); + + if (operand.mode == Addressing_Type) { + error_line("\tSuggestion: Are you trying to pass a type to a value parameter?\n"); + } + } return t_invalid; } From 8f4b720e90f6b866cfccc685e1a57f785c930296 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Mar 2026 11:38:14 +0000 Subject: [PATCH 219/273] Add `contextless` to appropriate procedures in `core:math/fixed` --- core/math/fixed/fixed.odin | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/math/fixed/fixed.odin b/core/math/fixed/fixed.odin index 28f87b6d2..233eefd6b 100644 --- a/core/math/fixed/fixed.odin +++ b/core/math/fixed/fixed.odin @@ -29,7 +29,7 @@ Fixed32_32 :: distinct Fixed(i64, 32) Fixed52_12 :: distinct Fixed(i64, 12) -init_from_f64 :: proc(x: ^$T/Fixed($Backing, $Fraction_Width), val: f64) { +init_from_f64 :: proc "contextless" (x: ^$T/Fixed($Backing, $Fraction_Width), val: f64) { i, f := math.modf(math.abs(val)) x.i = Backing(f * (1< f64 { +to_f64 :: proc "contextless" (x: $T/Fixed($Backing, $Fraction_Width)) -> f64 { sign := -1.0 if x.i < 0 else 1.0 num := math.abs(x.i) res := f64(num >> Fraction_Width) @@ -55,39 +55,39 @@ to_f64 :: proc(x: $T/Fixed($Backing, $Fraction_Width)) -> f64 { @(require_results) -add :: proc(x, y: $T/Fixed) -> T { +add :: proc "contextless" (x, y: $T/Fixed) -> T { return {x.i + y.i} } @(require_results) -sub :: proc(x, y: $T/Fixed) -> T { +sub :: proc "contextless" (x, y: $T/Fixed) -> T { return {x.i - y.i} } @(require_results) -mul :: proc(x, y: $T/Fixed($Backing, $Fraction_Width)) -> (z: T) { +mul :: proc "contextless" (x, y: $T/Fixed($Backing, $Fraction_Width)) -> (z: T) { z.i = intrinsics.fixed_point_mul(x.i, y.i, Fraction_Width) return } @(require_results) -mul_sat :: proc(x, y: $T/Fixed($Backing, $Fraction_Width)) -> (z: T) { +mul_sat :: proc "contextless" (x, y: $T/Fixed($Backing, $Fraction_Width)) -> (z: T) { z.i = intrinsics.fixed_point_mul_sat(x.i, y.i, Fraction_Width) return } @(require_results) -div :: proc(x, y: $T/Fixed($Backing, $Fraction_Width)) -> (z: T) { +div :: proc "contextless" (x, y: $T/Fixed($Backing, $Fraction_Width)) -> (z: T) { z.i = intrinsics.fixed_point_div(x.i, y.i, Fraction_Width) return } @(require_results) -div_sat :: proc(x, y: $T/Fixed($Backing, $Fraction_Width)) -> (z: T) { +div_sat :: proc "contextless" (x, y: $T/Fixed($Backing, $Fraction_Width)) -> (z: T) { z.i = intrinsics.fixed_point_div_sat(x.i, y.i, Fraction_Width) return } @(require_results) -floor :: proc(x: $T/Fixed($Backing, $Fraction_Width)) -> Backing { +floor :: proc "contextless" (x: $T/Fixed($Backing, $Fraction_Width)) -> Backing { if x.i >= 0 { return x.i >> Fraction_Width } else { @@ -95,11 +95,11 @@ floor :: proc(x: $T/Fixed($Backing, $Fraction_Width)) -> Backing { } } @(require_results) -ceil :: proc(x: $T/Fixed($Backing, $Fraction_Width)) -> Backing { +ceil :: proc "contextless" (x: $T/Fixed($Backing, $Fraction_Width)) -> Backing { return (x.i + (1 << Fraction_Width - 1)) >> Fraction_Width } @(require_results) -round :: proc(x: $T/Fixed($Backing, $Fraction_Width)) -> Backing { +round :: proc "contextless" (x: $T/Fixed($Backing, $Fraction_Width)) -> Backing { return (x.i + (1 << (Fraction_Width - 1))) >> Fraction_Width } From 7e9c14e6f3378acc1c07fadf0b0d294d49d0437d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Mar 2026 11:38:38 +0000 Subject: [PATCH 220/273] Remove deprecated procedure --- core/math/fixed/fixed.odin | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/core/math/fixed/fixed.odin b/core/math/fixed/fixed.odin index 233eefd6b..6b9ef364b 100644 --- a/core/math/fixed/fixed.odin +++ b/core/math/fixed/fixed.odin @@ -163,7 +163,7 @@ to_string :: proc(x: $T/Fixed($Backing, $Fraction_Width), allocator := context.a } -@(private) +@(rodata, private) _power_of_two_table := [129]string{ "0.5", "1", @@ -295,8 +295,3 @@ _power_of_two_table := [129]string{ "85070591730234615865843651857942052864", "170141183460469231731687303715884105728", } - -@(deprecated="Use write instead") -append :: proc(dst: []byte, x: $T/Fixed($Backing, $Fraction_Width)) -> string { - return write(dst, x) -} From 8bac2e30c6a416569507ccc5b8e4f1f84f440844 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Mar 2026 11:40:26 +0000 Subject: [PATCH 221/273] Remove deprecated procedures in `core:container/queue` --- core/container/queue/queue.odin | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/core/container/queue/queue.odin b/core/container/queue/queue.odin index 37f3a923f..6790e825a 100644 --- a/core/container/queue/queue.odin +++ b/core/container/queue/queue.odin @@ -236,16 +236,6 @@ back_ptr :: proc(q: ^$Q/Queue($T), loc := #caller_location) -> ^T { } -@(deprecated="Use `front_ptr` instead") -peek_front :: proc(q: ^$Q/Queue($T), loc := #caller_location) -> ^T { - return front_ptr(q, loc) -} - -@(deprecated="Use `back_ptr` instead") -peek_back :: proc(q: ^$Q/Queue($T), loc := #caller_location) -> ^T { - return back_ptr(q, loc) -} - /* Push an element to the back of the queue. From 9379273d20bb657f9da10483e13a1076ba8e97a3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Mar 2026 11:41:05 +0000 Subject: [PATCH 222/273] Remove deprecated `append_*` procedures in `core:strconv` --- core/strconv/deprecated.odin | 37 ------------------------------------ 1 file changed, 37 deletions(-) diff --git a/core/strconv/deprecated.odin b/core/strconv/deprecated.odin index c644d331e..9f41f1940 100644 --- a/core/strconv/deprecated.odin +++ b/core/strconv/deprecated.odin @@ -1,42 +1,5 @@ package strconv -// (2025-06-05) These procedures are to be removed at a later release. - -@(deprecated="Use write_bits instead") -append_bits :: proc(buf: []byte, x: u64, base: int, is_signed: bool, bit_size: int, digits: string, flags: Int_Flags) -> string { - return write_bits(buf, x, base, is_signed, bit_size, digits, flags) -} - -@(deprecated="Use write_bits_128 instead") -append_bits_128 :: proc(buf: []byte, x: u128, base: int, is_signed: bool, bit_size: int, digits: string, flags: Int_Flags) -> string { - return write_bits_128(buf, x, base, is_signed, bit_size, digits, flags) -} - -@(deprecated="Use write_bool instead") -append_bool :: proc(buf: []byte, b: bool) -> string { - return write_bool(buf, b) -} - -@(deprecated="Use write_uint instead") -append_uint :: proc(buf: []byte, u: u64, base: int) -> string { - return write_uint(buf, u, base) -} - -@(deprecated="Use write_int instead") -append_int :: proc(buf: []byte, i: i64, base: int) -> string { - return write_int(buf, i, base) -} - -@(deprecated="Use write_u128 instead") -append_u128 :: proc(buf: []byte, u: u128, base: int) -> string { - return write_u128(buf, u, base) -} - -@(deprecated="Use write_float instead") -append_float :: proc(buf: []byte, f: f64, fmt: byte, prec, bit_size: int) -> string { - return write_float(buf, f, fmt, prec, bit_size) -} - // 2025-10-03 Deprecated C short names and implementations @(deprecated="Use strconv.write_int() instead") From a9e81e01aa58929db29aa47a8b058debc5b77a77 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Mar 2026 14:08:39 +0000 Subject: [PATCH 223/273] Allow addressing of an index expression of an soa slice/dynamic array --- src/check_expr.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index b5270c8e9..e507e81e5 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8896,8 +8896,14 @@ gb_internal bool check_set_index_data(Operand *o, Type *t, bool indirection, i64 case Type_Struct: if (t->Struct.soa_kind != StructSoa_None) { - if (t->Struct.soa_kind == StructSoa_Fixed) { + switch (t->Struct.soa_kind) { + case StructSoa_Fixed: *max_count = t->Struct.soa_count; + break; + case StructSoa_Slice: + case StructSoa_Dynamic: + indirection = o->mode != Addressing_Constant; + break; } o->type = t->Struct.soa_elem; if (o->mode == Addressing_SoaVariable || o->mode == Addressing_Variable || indirection) { From 59eaa136255dfcd3d8e65844ef7c8a22bd7413ba Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Mar 2026 14:10:08 +0000 Subject: [PATCH 224/273] Fix indexing logic of FCD arrays --- src/check_expr.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index e507e81e5..501d37e54 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8889,8 +8889,11 @@ gb_internal bool check_set_index_data(Operand *o, Type *t, bool indirection, i64 case Type_FixedCapacityDynamicArray: o->type = t->FixedCapacityDynamicArray.elem; - if (o->mode != Addressing_Constant) { + if (indirection) { o->mode = Addressing_Variable; + } else if (o->mode != Addressing_Variable && + o->mode != Addressing_Constant) { + o->mode = Addressing_Value; } return true; From e10257f86a5c7da7bcc3f7df2d876f4b7470ac52 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Mar 2026 14:11:22 +0000 Subject: [PATCH 225/273] Fix slicing logic of a FCD array to check if it can be sliced or not --- src/check_expr.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 501d37e54..93836115a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -11709,6 +11709,14 @@ gb_internal ExprKind check_slice_expr(CheckerContext *c, Operand *o, Ast *node, case Type_FixedCapacityDynamicArray: valid = true; + if (o->mode != Addressing_Variable && !is_type_pointer(o->type)) { + gbString str = expr_to_string(node); + error(node, "Cannot slice a fixed capacity dynamic array '%s', value is not addressable", str); + gb_string_free(str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } o->type = alloc_type_slice(t->FixedCapacityDynamicArray.elem); break; From 0fce2da4429efb5ee75a067830f343990c6ae5ee Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 25 Mar 2026 15:03:37 +0000 Subject: [PATCH 226/273] Add suggestion when trying to slice an enumerated array --- src/check_expr.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 93836115a..0b065c41a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -11740,9 +11740,14 @@ gb_internal ExprKind check_slice_expr(CheckerContext *c, Operand *o, Ast *node, case Type_EnumeratedArray: { + ERROR_BLOCK(); + gbString str = expr_to_string(o->expr); gbString type_str = type_to_string(o->type); error(o->expr, "Cannot slice '%s' of type '%s', as enumerated arrays cannot be sliced", str, type_str); + + error_line("\tSuggestion: Slicing an enumerated array does not make much sense, but if you need such a construct, use 'slice.enumerated_array'\n"); + gb_string_free(type_str); gb_string_free(str); o->mode = Addressing_Invalid; From 2363f859442ed96f4b1b1e28cbc18569d9e2819d Mon Sep 17 00:00:00 2001 From: Mortimer Snerd Date: Wed, 25 Mar 2026 19:33:17 -0400 Subject: [PATCH 227/273] Fix for corner case in the scratch allocator. The scratch allocator could erroneously return a slice overlapping previously allocated memory for allocation requests that were smaller than the arena size, but larger than the amount of free space left in the arena. - fix the check in mem::scratch_alloc_bytes_non_zeroed that wasn't routing the request to the backup allocator. - added concrete reproduction test under tests/issues. --- core/mem/allocators.odin | 11 ++-------- tests/issues/run.bat | 1 + tests/issues/run.sh | 2 ++ tests/issues/test_pr_unknown.odin | 35 +++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 tests/issues/test_pr_unknown.odin diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index eea7a5b4f..68b6102b6 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -536,15 +536,8 @@ scratch_alloc_bytes_non_zeroed :: proc( // we don't need to be so strict about every byte. aligned_size += alignment - 1 } - if aligned_size <= len(s.data) { - offset := uintptr(0) - if s.curr_offset+aligned_size <= len(s.data) { - offset = uintptr(s.curr_offset) - } else { - // The allocation will cause an overflow past the boundary of the - // space available, so reset to the starting offset. - offset = 0 - } + if s.curr_offset+aligned_size <= len(s.data) { + offset := uintptr(s.curr_offset) start := uintptr(raw_data(s.data)) ptr := rawptr(offset+start) // We keep track of the original base pointer without extra alignment diff --git a/tests/issues/run.bat b/tests/issues/run.bat index f1a1c48c0..c1199ff73 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -34,6 +34,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin build ..\test_issue_6401.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b ..\..\..\odin test ..\test_pr_6470.odin %COMMON% || exit /b ..\..\..\odin test ..\test_pr_6470.odin -define:TEST_EXPECT_FAILURE=true %COMMON% 2>&1 | find /c "Error:" | findstr /x "1" || exit /b +..\..\..\odin test ..\test_pr_unknown.odin %COMMON% || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index 996007cd7..ef8c73351 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -37,6 +37,8 @@ $ODIN test ../test_issue_6068.odin $COMMON $ODIN test ../test_issue_6101.odin $COMMON $ODIN test ../test_issue_6165.odin $COMMON $ODIN test ../test_issue_6396.odin $COMMON +$ODIN test ../test_pr_unknown.odin $COMMON + if [[ $($ODIN build ../test_issue_6240.odin $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 3 ]] ; then echo "SUCCESSFUL 1/1" else diff --git a/tests/issues/test_pr_unknown.odin b/tests/issues/test_pr_unknown.odin new file mode 100644 index 000000000..b63aec674 --- /dev/null +++ b/tests/issues/test_pr_unknown.odin @@ -0,0 +1,35 @@ +package test_issues + +import "core:testing" +import "core:mem" + +// Test for a problem encountered with the scratch allocator. +// Say you have a scratch allocator with an arena size of N. +// If you make an allocation whose size is <= N but greater than +// the amount of free space left in the arena, the allocator +// will return a slice of memory from the start of the arena, +// overlapping previous allocations. (the expected +// behavior is it satisfies the request with the backup allocator) + +@test +test_scratch_smash :: proc(t: ^testing.T) { + // setup + frAlloc: mem.Scratch + err := mem.scratch_init(&frAlloc, 1 * mem.Kilobyte) + testing.expect(t, err == nil) + + talloc := mem.scratch_allocator(&frAlloc) + defer mem.scratch_destroy(&frAlloc) + + // First allocation fits in arena. + a1 := make([]byte, 512, talloc) + + // Second allocation does not fit in the free space, but is + // <= the arena size. + a2 := make([]byte, 1024, talloc) + + // Should be true, but bug in scratch allocator returns space + // overlapping a1 when allocating a2. + testing.expect(t, &a1[0] != &a2[0]) +} + From 6aceb7639f55d40390d7540ade7d07fd2c78ba1f Mon Sep 17 00:00:00 2001 From: Mortimer Snerd Date: Wed, 25 Mar 2026 19:55:38 -0400 Subject: [PATCH 228/273] Clean up the name of the test file for this PR --- tests/issues/run.bat | 2 +- tests/issues/run.sh | 2 +- tests/issues/{test_pr_unknown.odin => test_pr_6476.odin} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename tests/issues/{test_pr_unknown.odin => test_pr_6476.odin} (100%) diff --git a/tests/issues/run.bat b/tests/issues/run.bat index c1199ff73..2f42e3e21 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -34,7 +34,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin build ..\test_issue_6401.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "3" || exit /b ..\..\..\odin test ..\test_pr_6470.odin %COMMON% || exit /b ..\..\..\odin test ..\test_pr_6470.odin -define:TEST_EXPECT_FAILURE=true %COMMON% 2>&1 | find /c "Error:" | findstr /x "1" || exit /b -..\..\..\odin test ..\test_pr_unknown.odin %COMMON% || exit /b +..\..\..\odin test ..\test_pr_6476.odin %COMMON% || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index ef8c73351..8a7800cd7 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -37,7 +37,7 @@ $ODIN test ../test_issue_6068.odin $COMMON $ODIN test ../test_issue_6101.odin $COMMON $ODIN test ../test_issue_6165.odin $COMMON $ODIN test ../test_issue_6396.odin $COMMON -$ODIN test ../test_pr_unknown.odin $COMMON +$ODIN test ../test_pr_6476.odin $COMMON if [[ $($ODIN build ../test_issue_6240.odin $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 3 ]] ; then echo "SUCCESSFUL 1/1" diff --git a/tests/issues/test_pr_unknown.odin b/tests/issues/test_pr_6476.odin similarity index 100% rename from tests/issues/test_pr_unknown.odin rename to tests/issues/test_pr_6476.odin From a2f1aafed3647174080be091ce26dec04290ee2f Mon Sep 17 00:00:00 2001 From: Weixie Cui Date: Thu, 26 Mar 2026 17:54:17 +0800 Subject: [PATCH 229/273] Fix GB_PANIC format string in lb_emit_conv invalid subtype cast The panic string passed two type names but only had one %s placeholder. --- src/llvm_backend_expr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 39cdcd54f..8a35f1690 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2579,7 +2579,7 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { sel.index.allocator = temporary_allocator(); if (lookup_subtype_polymorphic_selection(t, src_type, &sel)) { if (sel.entity == nullptr) { - GB_PANIC("invalid subtype cast %s -> ", type_to_string(src_type), type_to_string(t)); + GB_PANIC("invalid subtype cast %s -> %s", type_to_string(src_type), type_to_string(t)); } if (st_is_ptr) { lbValue res = lb_emit_deep_field_gep(p, value, sel); From b16eaea8a8998d6dc7cec9d33c9044a3cb6ed239 Mon Sep 17 00:00:00 2001 From: Weixie Cui Date: Thu, 26 Mar 2026 17:57:18 +0800 Subject: [PATCH 230/273] Fix u16 multi-pointer to cstring16 transmute condition in lb_emit_conv cstring16 uses UTF-16 code units; accept u16 multi-pointers, not u8. --- src/llvm_backend_expr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 39cdcd54f..02024bb82 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2150,7 +2150,7 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { if (is_type_cstring16(src) && is_type_u16_multi_ptr(dst)) { return lb_emit_transmute(p, value, dst); } - if (is_type_u8_multi_ptr(src) && is_type_cstring16(dst)) { + if (is_type_u16_multi_ptr(src) && is_type_cstring16(dst)) { return lb_emit_transmute(p, value, dst); } if (is_type_cstring16(src) && is_type_rawptr(dst)) { From 4e87f47fe31a59bd1edc3cd28e97a9da1923f20a Mon Sep 17 00:00:00 2001 From: Weixie Cui Date: Thu, 26 Mar 2026 17:50:05 +0800 Subject: [PATCH 231/273] Fix >= comparison runtime dependencies for string and cstring types Token_GtEq incorrectly added *_gt runtime symbols for cstring, cstring16, string16, and string comparisons; use the correct *_ge dependencies instead. --- src/check_expr.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 0b065c41a..856f44827 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3197,7 +3197,7 @@ gb_internal void check_comparison(CheckerContext *c, Ast *node, Operand *x, Oper case Token_Lt: add_package_dependency(c, "runtime", "cstring_lt"); break; case Token_Gt: add_package_dependency(c, "runtime", "cstring_gt"); break; case Token_LtEq: add_package_dependency(c, "runtime", "cstring_le"); break; - case Token_GtEq: add_package_dependency(c, "runtime", "cstring_gt"); break; + case Token_GtEq: add_package_dependency(c, "runtime", "cstring_ge"); break; } } else if (is_type_cstring16(x->type) && is_type_cstring16(y->type)) { switch (op) { @@ -3206,7 +3206,7 @@ gb_internal void check_comparison(CheckerContext *c, Ast *node, Operand *x, Oper case Token_Lt: add_package_dependency(c, "runtime", "cstring16_lt"); break; case Token_Gt: add_package_dependency(c, "runtime", "cstring16_gt"); break; case Token_LtEq: add_package_dependency(c, "runtime", "cstring16_le"); break; - case Token_GtEq: add_package_dependency(c, "runtime", "cstring16_gt"); break; + case Token_GtEq: add_package_dependency(c, "runtime", "cstring16_ge"); break; } } else if (is_type_string16(x->type) || is_type_string16(y->type)) { switch (op) { @@ -3215,7 +3215,7 @@ gb_internal void check_comparison(CheckerContext *c, Ast *node, Operand *x, Oper case Token_Lt: add_package_dependency(c, "runtime", "string16_lt"); break; case Token_Gt: add_package_dependency(c, "runtime", "string16_gt"); break; case Token_LtEq: add_package_dependency(c, "runtime", "string16_le"); break; - case Token_GtEq: add_package_dependency(c, "runtime", "string16_gt"); break; + case Token_GtEq: add_package_dependency(c, "runtime", "string16_ge"); break; } } else if (is_type_string(x->type) || is_type_string(y->type)) { switch (op) { @@ -3224,7 +3224,7 @@ gb_internal void check_comparison(CheckerContext *c, Ast *node, Operand *x, Oper case Token_Lt: add_package_dependency(c, "runtime", "string_lt"); break; case Token_Gt: add_package_dependency(c, "runtime", "string_gt"); break; case Token_LtEq: add_package_dependency(c, "runtime", "string_le"); break; - case Token_GtEq: add_package_dependency(c, "runtime", "string_gt"); break; + case Token_GtEq: add_package_dependency(c, "runtime", "string_ge"); break; } } else if (is_type_complex(x->type) || is_type_complex(y->type)) { switch (op) { From 25c10c18cca5150c03f3de256ea140aebf1c3667 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 26 Mar 2026 11:49:39 +0000 Subject: [PATCH 232/273] Remove tilde backend --- build.bat | 10 - src/build_settings.cpp | 2 - src/checker.cpp | 3 +- src/entity.cpp | 10 +- src/main.cpp | 50 - src/tilde.cpp | 842 --------- src/tilde.hpp | 386 ---- src/tilde/tb.h | 1309 ------------- src/tilde/tb.lib | Bin 2347218 -> 0 bytes src/tilde/tb_arena.h | 79 - src/tilde/tb_coff.h | 334 ---- src/tilde/tb_elf.h | 170 -- src/tilde/tb_formats.h | 132 -- src/tilde/tb_x64.h | 105 -- src/tilde_builtin.cpp | 592 ------ src/tilde_const.cpp | 1049 ----------- src/tilde_debug.cpp | 482 ----- src/tilde_expr.cpp | 3961 --------------------------------------- src/tilde_proc.cpp | 1327 ------------- src/tilde_stmt.cpp | 2889 ---------------------------- src/tilde_type_info.cpp | 985 ---------- 21 files changed, 3 insertions(+), 14714 deletions(-) delete mode 100644 src/tilde.cpp delete mode 100644 src/tilde.hpp delete mode 100644 src/tilde/tb.h delete mode 100644 src/tilde/tb.lib delete mode 100644 src/tilde/tb_arena.h delete mode 100644 src/tilde/tb_coff.h delete mode 100644 src/tilde/tb_elf.h delete mode 100644 src/tilde/tb_formats.h delete mode 100644 src/tilde/tb_x64.h delete mode 100644 src/tilde_builtin.cpp delete mode 100644 src/tilde_const.cpp delete mode 100644 src/tilde_debug.cpp delete mode 100644 src/tilde_expr.cpp delete mode 100644 src/tilde_proc.cpp delete mode 100644 src/tilde_stmt.cpp delete mode 100644 src/tilde_type_info.cpp diff --git a/build.bat b/build.bat index b6e8b890d..9cddcc375 100644 --- a/build.bat +++ b/build.bat @@ -107,16 +107,6 @@ set libs= ^ set odin_res=misc\odin.res set odin_rc=misc\odin.rc -rem DO NOT TOUCH! -rem THIS TILDE STUFF IS FOR DEVELOPMENT ONLY! -set tilde_backend=0 -if %tilde_backend% EQU 1 ( - set libs=%libs% src\tilde\tb.lib - set compiler_defines=%compiler_defines% -DODIN_TILDE_BACKEND -) -rem DO NOT TOUCH! - - set linker_flags= -incremental:no -opt:ref -subsystem:console -MANIFEST:EMBED if %release_mode% EQU 0 ( rem Debug diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 9663d5db5..41849fd6b 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -607,8 +607,6 @@ struct BuildContext { isize max_error_count; - bool tilde_backend; - u32 cmd_doc_flags; Array extra_packages; diff --git a/src/checker.cpp b/src/checker.cpp index ce8042b41..0d82ec9f9 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1295,7 +1295,6 @@ gb_internal void init_universal(void) { add_global_bool_constant("ODIN_NO_RTTI", bc->no_rtti); add_global_bool_constant("ODIN_VALGRIND_SUPPORT", bc->ODIN_VALGRIND_SUPPORT); - add_global_bool_constant("ODIN_TILDE", bc->tilde_backend); add_global_constant("ODIN_COMPILE_TIMESTAMP", t_untyped_integer, exact_value_i64(odin_compile_timestamp())); @@ -3009,7 +3008,7 @@ gb_internal void generate_minimum_dependency_set(Checker *c, Entity *start) { str_lit("aeabi_d2h") ); - FORCE_ADD_RUNTIME_ENTITIES(is_arch_wasm() && !build_context.tilde_backend, + FORCE_ADD_RUNTIME_ENTITIES(is_arch_wasm(), // // Extended data type internal procedures // str_lit("umodti3"), // str_lit("udivti3"), diff --git a/src/entity.cpp b/src/entity.cpp index 5062599de..7bb6e88ca 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -184,14 +184,8 @@ struct Entity { Entity * aliased_of; - union { - std::atomic code_gen_module; - struct cgModule *cg_module; - }; - union { - std::atomic code_gen_procedure; - struct cgProcedure *cg_procedure; - }; + std::atomic code_gen_module; + std::atomic code_gen_procedure; u64 order_in_src; String deprecated_message; diff --git a/src/main.cpp b/src/main.cpp index 4d68d3d73..a79ac77a5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -76,16 +76,6 @@ gb_global Timings global_timings = {0}; #include "linker.cpp" #include "bundle_command.cpp" -#if defined(GB_SYSTEM_WINDOWS) && defined(ODIN_TILDE_BACKEND) -#define ALLOW_TILDE 1 -#else -#define ALLOW_TILDE 0 -#endif - -#if ALLOW_TILDE -#include "tilde.cpp" -#endif - #include "llvm_backend.cpp" #include "bug_report.cpp" @@ -414,8 +404,6 @@ enum BuildFlagKind { BuildFlag_InternalLLVMMem2Reg, BuildFlag_InternalEnableRVO, - BuildFlag_Tilde, - BuildFlag_Sanitize, BuildFlag_LTO, @@ -647,9 +635,6 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_InternalLLVMMem2Reg, str_lit("internal-llvm-mem2reg"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalEnableRVO, str_lit("internal-enable-rvo"), BuildFlagParam_None, Command_all); -#if ALLOW_TILDE - add_flag(&build_flags, BuildFlag_Tilde, str_lit("tilde"), BuildFlagParam_None, Command__does_build); -#endif add_flag(&build_flags, BuildFlag_Sanitize, str_lit("sanitize"), BuildFlagParam_String, Command__does_build, true); add_flag(&build_flags, BuildFlag_LTO, str_lit("lto"), BuildFlagParam_String, Command__does_build); @@ -1646,11 +1631,6 @@ gb_internal bool parse_build_flags(Array args) { break; - - case BuildFlag_Tilde: - build_context.tilde_backend = true; - break; - case BuildFlag_Sanitize: GB_ASSERT(value.kind == ExactValue_String); @@ -4120,36 +4100,6 @@ int main(int arg_count, char const **arg_ptr) { failed_to_cache_parsing = true; } -#if ALLOW_TILDE - if (build_context.tilde_backend) { - LinkerData linker_data = {}; - MAIN_TIME_SECTION("Tilde Code Gen"); - if (!cg_generate_code(checker, &linker_data)) { - return 1; - } - - switch (build_context.build_mode) { - case BuildMode_Executable: - case BuildMode_StaticLibrary: - case BuildMode_DynamicLibrary: - i32 result = linker_stage(&linker_data); - if (result) { - if (build_context.show_timings) { - show_timings(checker, &global_timings); - } - if (build_context.show_import_graph) { - show_import_graph(checker); - } - - if (build_context.export_dependencies_format != DependenciesExportUnspecified) { - export_dependencies(checker); - } - return result; - } - break; - } - } else -#endif { lbGenerator *gen = permanent_alloc_item(); if (!lb_init_generator(gen, checker)) { diff --git a/src/tilde.cpp b/src/tilde.cpp deleted file mode 100644 index f6fed0f9a..000000000 --- a/src/tilde.cpp +++ /dev/null @@ -1,842 +0,0 @@ -#include "tilde.hpp" - - -gb_global Slice global_tb_arenas; - -gb_internal TB_Arena *cg_arena(void) { - return &global_tb_arenas[current_thread_index()]; -} - -gb_internal void cg_global_arena_init(void) { - global_tb_arenas = slice_make(permanent_allocator(), global_thread_pool.threads.count); - for_array(i, global_tb_arenas) { - tb_arena_create(&global_tb_arenas[i], 2ull<<20); - } -} - -// returns TB_TYPE_VOID if not trivially possible -gb_internal TB_DataType cg_data_type(Type *t) { - GB_ASSERT(t != nullptr); - t = core_type(t); - i64 sz = type_size_of(t); - switch (t->kind) { - case Type_Basic: - switch (t->Basic.kind) { - case Basic_bool: - case Basic_b8: - case Basic_b16: - case Basic_b32: - case Basic_b64: - - case Basic_i8: - case Basic_u8: - case Basic_i16: - case Basic_u16: - case Basic_i32: - case Basic_u32: - case Basic_i64: - case Basic_u64: - case Basic_i128: - case Basic_u128: - - case Basic_rune: - - case Basic_int: - case Basic_uint: - case Basic_uintptr: - case Basic_typeid: - return TB_TYPE_INTN(cast(u16)gb_min(8*sz, 64)); - - case Basic_f16: return TB_TYPE_F16; - case Basic_f32: return TB_TYPE_F32; - case Basic_f64: return TB_TYPE_F64; - - case Basic_rawptr: return TB_TYPE_PTR; - case Basic_cstring: return TB_TYPE_PTR; - - - // Endian Specific Types - case Basic_i16le: - case Basic_u16le: - case Basic_i32le: - case Basic_u32le: - case Basic_i64le: - case Basic_u64le: - case Basic_i128le: - case Basic_u128le: - case Basic_i16be: - case Basic_u16be: - case Basic_i32be: - case Basic_u32be: - case Basic_i64be: - case Basic_u64be: - case Basic_i128be: - case Basic_u128be: - return TB_TYPE_INTN(cast(u16)gb_min(8*sz, 64)); - - case Basic_f16le: return TB_TYPE_F16; - case Basic_f32le: return TB_TYPE_F32; - case Basic_f64le: return TB_TYPE_F64; - - case Basic_f16be: return TB_TYPE_F16; - case Basic_f32be: return TB_TYPE_F32; - case Basic_f64be: return TB_TYPE_F64; - } - break; - - case Type_Pointer: - case Type_MultiPointer: - case Type_Proc: - return TB_TYPE_PTR; - - case Type_BitSet: - return cg_data_type(bit_set_to_int(t)); - - case Type_RelativePointer: - return cg_data_type(t->RelativePointer.base_integer); - } - - // unknown - return {}; -} - - -gb_internal cgValue cg_value(TB_Global *g, Type *type) { - return cg_value((TB_Symbol *)g, type); -} -gb_internal cgValue cg_value(TB_External *e, Type *type) { - return cg_value((TB_Symbol *)e, type); -} -gb_internal cgValue cg_value(TB_Function *f, Type *type) { - return cg_value((TB_Symbol *)f, type); -} -gb_internal cgValue cg_value(TB_Symbol *s, Type *type) { - cgValue v = {}; - v.kind = cgValue_Symbol; - v.type = type; - v.symbol = s; - return v; -} -gb_internal cgValue cg_value(TB_Node *node, Type *type) { - cgValue v = {}; - v.kind = cgValue_Value; - v.type = type; - v.node = node; - return v; -} -gb_internal cgValue cg_lvalue_addr(TB_Node *node, Type *type) { - GB_ASSERT(node->dt.type == TB_PTR); - cgValue v = {}; - v.kind = cgValue_Addr; - v.type = type; - v.node = node; - return v; -} - -gb_internal cgValue cg_lvalue_addr_to_value(cgValue v) { - if (v.kind == cgValue_Value) { - GB_ASSERT(is_type_pointer(v.type)); - GB_ASSERT(v.node->dt.type == TB_PTR); - } else { - GB_ASSERT(v.kind == cgValue_Addr); - GB_ASSERT(v.node->dt.type == TB_PTR); - v.kind = cgValue_Value; - v.type = alloc_type_pointer(v.type); - } - return v; -} - -gb_internal cgValue cg_value_multi(cgValueMulti *multi, Type *type) { - GB_ASSERT(type->kind == Type_Tuple); - GB_ASSERT(multi != nullptr); - GB_ASSERT(type->Tuple.variables.count > 1); - GB_ASSERT(multi->values.count == type->Tuple.variables.count); - cgValue v = {}; - v.kind = cgValue_Multi; - v.type = type; - v.multi = multi; - return v; -} - -gb_internal cgValue cg_value_multi(Slice const &values, Type *type) { - cgValueMulti *multi = gb_alloc_item(permanent_allocator(), cgValueMulti); - multi->values = values; - return cg_value_multi(multi, type); -} - - -gb_internal cgValue cg_value_multi2(cgValue const &x, cgValue const &y, Type *type) { - GB_ASSERT(type->kind == Type_Tuple); - GB_ASSERT(type->Tuple.variables.count == 2); - cgValueMulti *multi = gb_alloc_item(permanent_allocator(), cgValueMulti); - multi->values = slice_make(permanent_allocator(), 2); - multi->values[0] = x; - multi->values[1] = y; - return cg_value_multi(multi, type); -} - - -gb_internal cgAddr cg_addr(cgValue const &value) { - GB_ASSERT(value.kind != cgValue_Multi); - cgAddr addr = {}; - addr.kind = cgAddr_Default; - addr.addr = value; - if (addr.addr.kind == cgValue_Addr) { - GB_ASSERT(addr.addr.node != nullptr); - addr.addr.kind = cgValue_Value; - addr.addr.type = alloc_type_pointer(addr.addr.type); - } - return addr; -} - -gb_internal cgAddr cg_addr_map(cgValue addr, cgValue map_key, Type *map_type, Type *map_result) { - GB_ASSERT(is_type_pointer(addr.type)); - Type *mt = type_deref(addr.type); - GB_ASSERT(is_type_map(mt)); - - cgAddr v = {cgAddr_Map, addr}; - v.map.key = map_key; - v.map.type = map_type; - v.map.result = map_result; - return v; -} - -gb_internal cgAddr cg_addr_soa_variable(cgValue addr, cgValue index, Ast *index_expr) { - cgAddr v = {cgAddr_SoaVariable, addr}; - v.soa.index = index; - v.soa.index_expr = index_expr; - return v; -} - - - -gb_internal void cg_set_debug_pos_from_node(cgProcedure *p, Ast *node) { - if (node) { - TokenPos pos = ast_token(node).pos; - TB_SourceFile **file = map_get(&p->module->file_id_map, cast(uintptr)pos.file_id); - if (file) { - tb_inst_location(p->func, *file, pos.line, pos.column); - } - } -} - -gb_internal void cg_add_symbol(cgModule *m, Entity *e, TB_Symbol *symbol) { - if (e) { - rw_mutex_lock(&m->values_mutex); - map_set(&m->symbols, e, symbol); - rw_mutex_unlock(&m->values_mutex); - } -} - -gb_internal void cg_add_entity(cgModule *m, Entity *e, cgValue const &val) { - if (e) { - rw_mutex_lock(&m->values_mutex); - GB_ASSERT(val.node != nullptr); - map_set(&m->values, e, val); - rw_mutex_unlock(&m->values_mutex); - } -} - -gb_internal void cg_add_member(cgModule *m, String const &name, cgValue const &val) { - if (name.len > 0) { - rw_mutex_lock(&m->values_mutex); - string_map_set(&m->members, name, val); - rw_mutex_unlock(&m->values_mutex); - } -} - -gb_internal void cg_add_procedure_value(cgModule *m, cgProcedure *p) { - rw_mutex_lock(&m->values_mutex); - if (p->entity != nullptr) { - map_set(&m->procedure_values, p->func, p->entity); - if (p->symbol != nullptr) { - map_set(&m->symbols, p->entity, p->symbol); - } - } - string_map_set(&m->procedures, p->name, p); - rw_mutex_unlock(&m->values_mutex); - -} - -gb_internal TB_Symbol *cg_find_symbol_from_entity(cgModule *m, Entity *e) { - GB_ASSERT(e != nullptr); - - rw_mutex_lock(&m->values_mutex); - TB_Symbol **found = map_get(&m->symbols, e); - if (found) { - rw_mutex_unlock(&m->values_mutex); - return *found; - } - - String link_name = cg_get_entity_name(m, e); - cgProcedure **proc_found = string_map_get(&m->procedures, link_name); - if (proc_found) { - TB_Symbol *symbol = (*proc_found)->symbol; - map_set(&m->symbols, e, symbol); - rw_mutex_unlock(&m->values_mutex); - return symbol; - } - rw_mutex_unlock(&m->values_mutex); - - if (e->kind == Entity_Procedure) { - debugf("[Tilde] try to generate procedure %.*s as it was not in the minimum_dependency_set", LIT(e->token.string)); - // IMPORTANT TODO(bill): This is an utter bodge, try and fix this shit - cgProcedure *p = cg_procedure_create(m, e); - if (p != nullptr) { - GB_ASSERT(p->symbol != nullptr); - cg_add_procedure_to_queue(p); - return p->symbol; - } - } - - - GB_PANIC("could not find entity's symbol %.*s", LIT(e->token.string)); - return nullptr; -} - - -struct cgGlobalVariable { - cgValue var; - cgValue init; - DeclInfo *decl; - bool is_initialized; -}; - -// Returns already_has_entry_point -gb_internal bool cg_global_variables_create(cgModule *m, Array *global_variables) { - isize global_variable_max_count = 0; - bool already_has_entry_point = false; - - for (Entity *e : m->info->entities) { - String name = e->token.string; - - if (e->kind == Entity_Variable) { - global_variable_max_count++; - } else if (e->kind == Entity_Procedure) { - if ((e->scope->flags&ScopeFlag_Init) && name == "main") { - GB_ASSERT(e == m->info->entry_point); - } - if (build_context.command_kind == Command_test && - (e->Procedure.is_export || e->Procedure.link_name.len > 0)) { - String link_name = e->Procedure.link_name; - if (e->pkg->kind == Package_Runtime) { - if (link_name == "main" || - link_name == "DllMain" || - link_name == "WinMain" || - link_name == "wWinMain" || - link_name == "mainCRTStartup" || - link_name == "_start") { - already_has_entry_point = true; - } - } - } - } - } - *global_variables = array_make(permanent_allocator(), 0, global_variable_max_count); - - auto *min_dep_set = &m->info->minimum_dependency_set; - - for (DeclInfo *d : m->info->variable_init_order) { - Entity *e = d->entity; - - if ((e->scope->flags & ScopeFlag_File) == 0) { - continue; - } - - if (!ptr_set_exists(min_dep_set, e)) { - continue; - } - - DeclInfo *decl = decl_info_of_entity(e); - if (decl == nullptr) { - continue; - } - GB_ASSERT(e->kind == Entity_Variable); - - bool is_foreign = e->Variable.is_foreign; - bool is_export = e->Variable.is_export; - - String name = cg_get_entity_name(m, e); - - TB_Linkage linkage = TB_LINKAGE_PRIVATE; - - if (is_foreign) { - linkage = TB_LINKAGE_PUBLIC; - // lb_add_foreign_library_path(m, e->Variable.foreign_library); - } else if (is_export) { - linkage = TB_LINKAGE_PUBLIC; - } - // lb_set_linkage_from_entity_flags(m, g.value, e->flags); - - TB_DebugType *debug_type = cg_debug_type(m, e->type); - TB_Global *global = tb_global_create(m->mod, name.len, cast(char const *)name.text, debug_type, linkage); - cgValue g = cg_value(global, alloc_type_pointer(e->type)); - - TB_ModuleSectionHandle section = tb_module_get_data(m->mod); - - if (e->Variable.thread_local_model != "") { - section = tb_module_get_tls(m->mod); - } - if (e->Variable.link_section.len > 0) { - // TODO(bill): custom module sections - // LLVMSetSection(g.value, alloc_cstring(permanent_allocator(), e->Variable.link_section)); - } - - - cgGlobalVariable var = {}; - var.var = g; - var.decl = decl; - - if (decl->init_expr != nullptr) { - TypeAndValue tav = type_and_value_of_expr(decl->init_expr); - - isize max_regions = cg_global_const_calculate_region_count(tav.value, e->type); - tb_global_set_storage(m->mod, section, global, type_size_of(e->type), type_align_of(e->type), max_regions); - - if (tav.mode == Addressing_Constant && - tav.value.kind != ExactValue_Invalid) { - cg_global_const_add_region(m, tav.value, e->type, global, 0); - var.is_initialized = true; - } - if (!var.is_initialized && is_type_untyped_nil(tav.type)) { - var.is_initialized = true; - } - } else { - var.is_initialized = true; - // TODO(bill): is this even needed; - i64 max_regions = cg_global_const_calculate_region_count_from_basic_type(e->type); - tb_global_set_storage(m->mod, section, global, type_size_of(e->type), type_align_of(e->type), max_regions); - } - - array_add(global_variables, var); - - cg_add_symbol(m, e, cast(TB_Symbol *)global); - cg_add_entity(m, e, g); - cg_add_member(m, name, g); - } - - cg_setup_type_info_data(m); - - return already_has_entry_point; -} - -gb_internal void cg_global_variables_initialize(cgProcedure *p, Array *global_variables) { - for (cgGlobalVariable &var : *global_variables) { - if (var.is_initialized) { - continue; - } - cgValue src = cg_build_expr(p, var.decl->init_expr); - cgValue dst = cg_flatten_value(p, var.var); - cg_emit_store(p, dst, src); - } -} - - -gb_internal cgModule *cg_module_create(Checker *c) { - cgModule *m = gb_alloc_item(permanent_allocator(), cgModule); - - m->checker = c; - m->info = &c->info; - - - TB_FeatureSet feature_set = {}; - bool is_jit = false; - m->mod = tb_module_create(TB_ARCH_X86_64, TB_SYSTEM_WINDOWS, &feature_set, is_jit); - tb_module_set_tls_index(m->mod, 10, "_tls_index"); - - map_init(&m->values); - map_init(&m->symbols); - map_init(&m->file_id_map); - map_init(&m->debug_type_map); - map_init(&m->proc_debug_type_map); - map_init(&m->proc_proto_map); - map_init(&m->anonymous_proc_lits_map); - map_init(&m->equal_procs); - map_init(&m->hasher_procs); - map_init(&m->map_get_procs); - map_init(&m->map_set_procs); - map_init(&m->map_info_map); - map_init(&m->map_cell_info_map); - - array_init(&m->single_threaded_procedure_queue, heap_allocator()); - - - for_array(id, global_files) { - if (AstFile *f = global_files[id]) { - char const *path = alloc_cstring(temporary_allocator(), f->fullpath); - TB_SourceFile *file = tb_get_source_file(m->mod, path); - map_set(&m->file_id_map, cast(uintptr)id, file); - } - } - - return m; -} - -gb_internal void cg_module_destroy(cgModule *m) { - map_destroy(&m->values); - map_destroy(&m->symbols); - map_destroy(&m->file_id_map); - map_destroy(&m->debug_type_map); - map_destroy(&m->proc_debug_type_map); - map_destroy(&m->proc_proto_map); - map_destroy(&m->anonymous_proc_lits_map); - map_destroy(&m->equal_procs); - map_destroy(&m->hasher_procs); - map_destroy(&m->map_get_procs); - map_destroy(&m->map_set_procs); - map_destroy(&m->map_info_map); - map_destroy(&m->map_cell_info_map); - - array_free(&m->single_threaded_procedure_queue); - - tb_module_destroy(m->mod); -} - -gb_internal String cg_set_nested_type_name_ir_mangled_name(Entity *e, cgProcedure *p) { - // NOTE(bill, 2020-03-08): A polymorphic procedure may take a nested type declaration - // and as a result, the declaration does not have time to determine what it should be - - GB_ASSERT(e != nullptr && e->kind == Entity_TypeName); - if (e->TypeName.ir_mangled_name.len != 0) { - return e->TypeName.ir_mangled_name; - } - GB_ASSERT((e->scope->flags & ScopeFlag_File) == 0); - - if (p == nullptr) { - Entity *proc = nullptr; - if (e->parent_proc_decl != nullptr) { - proc = e->parent_proc_decl->entity; - } else { - Scope *scope = e->scope; - while (scope != nullptr && (scope->flags & ScopeFlag_Proc) == 0) { - scope = scope->parent; - } - GB_ASSERT(scope != nullptr); - GB_ASSERT(scope->flags & ScopeFlag_Proc); - proc = scope->procedure_entity; - } - GB_ASSERT(proc->kind == Entity_Procedure); - if (proc->cg_procedure != nullptr) { - p = proc->cg_procedure; - } - } - - // NOTE(bill): Generate a new name - // parent_proc.name-guid - String ts_name = e->token.string; - - if (p != nullptr) { - isize name_len = p->name.len + 1 + ts_name.len + 1 + 10 + 1; - char *name_text = gb_alloc_array(permanent_allocator(), char, name_len); - u32 guid = 1+p->module->nested_type_name_guid.fetch_add(1); - name_len = gb_snprintf(name_text, name_len, "%.*s" ABI_PKG_NAME_SEPARATOR "%.*s-%u", LIT(p->name), LIT(ts_name), guid); - - String name = make_string(cast(u8 *)name_text, name_len-1); - e->TypeName.ir_mangled_name = name; - return name; - } else { - // NOTE(bill): a nested type be required before its parameter procedure exists. Just give it a temp name for now - isize name_len = 9 + 1 + ts_name.len + 1 + 10 + 1; - char *name_text = gb_alloc_array(permanent_allocator(), char, name_len); - static std::atomic guid; - name_len = gb_snprintf(name_text, name_len, "_internal" ABI_PKG_NAME_SEPARATOR "%.*s-%u", LIT(ts_name), 1+guid.fetch_add(1)); - - String name = make_string(cast(u8 *)name_text, name_len-1); - e->TypeName.ir_mangled_name = name; - return name; - } -} - -gb_internal String cg_mangle_name(cgModule *m, Entity *e) { - String name = e->token.string; - - AstPackage *pkg = e->pkg; - GB_ASSERT_MSG(pkg != nullptr, "Missing package for '%.*s'", LIT(name)); - String pkgn = pkg->name; - GB_ASSERT(!rune_is_digit(pkgn[0])); - if (pkgn == "llvm") { - GB_PANIC("llvm. entities are not allowed with the tilde backend"); - } - - isize max_len = pkgn.len + 1 + name.len + 1; - bool require_suffix_id = is_type_polymorphic(e->type, true); - - if ((e->scope->flags & (ScopeFlag_File | ScopeFlag_Pkg)) == 0) { - require_suffix_id = true; - } else if (is_blank_ident(e->token)) { - require_suffix_id = true; - }if (e->flags & EntityFlag_NotExported) { - require_suffix_id = true; - } - - if (require_suffix_id) { - max_len += 21; - } - - char *new_name = gb_alloc_array(permanent_allocator(), char, max_len); - isize new_name_len = gb_snprintf( - new_name, max_len, - "%.*s" ABI_PKG_NAME_SEPARATOR "%.*s", LIT(pkgn), LIT(name) - ); - if (require_suffix_id) { - char *str = new_name + new_name_len-1; - isize len = max_len-new_name_len; - isize extra = gb_snprintf(str, len, "-%llu", cast(unsigned long long)e->id); - new_name_len += extra-1; - } - - String mangled_name = make_string((u8 const *)new_name, new_name_len-1); - return mangled_name; -} - -gb_internal String cg_get_entity_name(cgModule *m, Entity *e) { - if (e != nullptr && e->kind == Entity_TypeName && e->TypeName.ir_mangled_name.len != 0) { - return e->TypeName.ir_mangled_name; - } - GB_ASSERT(e != nullptr); - - if (e->pkg == nullptr) { - return e->token.string; - } - - if (e->kind == Entity_TypeName && (e->scope->flags & ScopeFlag_File) == 0) { - return cg_set_nested_type_name_ir_mangled_name(e, nullptr); - } - - String name = {}; - - bool no_name_mangle = false; - - if (e->kind == Entity_Variable) { - bool is_foreign = e->Variable.is_foreign; - bool is_export = e->Variable.is_export; - no_name_mangle = e->Variable.link_name.len > 0 || is_foreign || is_export; - if (e->Variable.link_name.len > 0) { - return e->Variable.link_name; - } - } else if (e->kind == Entity_Procedure && e->Procedure.link_name.len > 0) { - return e->Procedure.link_name; - } else if (e->kind == Entity_Procedure && e->Procedure.is_export) { - no_name_mangle = true; - } - - if (!no_name_mangle) { - name = cg_mangle_name(m, e); - } - if (name.len == 0) { - name = e->token.string; - } - - if (e->kind == Entity_TypeName) { - e->TypeName.ir_mangled_name = name; - } else if (e->kind == Entity_Procedure) { - e->Procedure.link_name = name; - } - - return name; -} - -#include "tilde_const.cpp" -#include "tilde_debug.cpp" -#include "tilde_expr.cpp" -#include "tilde_builtin.cpp" -#include "tilde_type_info.cpp" -#include "tilde_proc.cpp" -#include "tilde_stmt.cpp" - - -gb_internal String cg_filepath_obj_for_module(cgModule *m, bool use_assembly) { - String path = concatenate3_strings(permanent_allocator(), - build_context.build_paths[BuildPath_Output].basename, - STR_LIT("/"), - build_context.build_paths[BuildPath_Output].name - ); - - // if (m->file) { - // char buf[32] = {}; - // isize n = gb_snprintf(buf, gb_size_of(buf), "-%u", m->file->id); - // String suffix = make_string((u8 *)buf, n-1); - // path = concatenate_strings(permanent_allocator(), path, suffix); - // } else if (m->pkg) { - // path = concatenate3_strings(permanent_allocator(), path, STR_LIT("-"), m->pkg->name); - // } - - String ext = {}; - - if (use_assembly) { - ext = STR_LIT(".S"); - } else { - if (is_arch_wasm()) { - ext = STR_LIT(".wasm.o"); - } else { - switch (build_context.metrics.os) { - case TargetOs_windows: - ext = STR_LIT(".obj"); - break; - default: - case TargetOs_darwin: - case TargetOs_linux: - case TargetOs_essence: - ext = STR_LIT(".o"); - break; - - case TargetOs_freestanding: - switch (build_context.metrics.abi) { - default: - case TargetABI_Default: - case TargetABI_SysV: - ext = STR_LIT(".o"); - break; - case TargetABI_Win64: - ext = STR_LIT(".obj"); - break; - } - break; - } - } - } - - return concatenate_strings(permanent_allocator(), path, ext); -} - - -gb_internal WORKER_TASK_PROC(cg_procedure_generate_worker_proc) { - cgProcedure *p = cast(cgProcedure *)data; - cg_procedure_generate(p); - return 0; -} - -gb_internal void cg_add_procedure_to_queue(cgProcedure *p) { - if (p == nullptr) { - return; - } - cgModule *m = p->module; - if (m->do_threading) { - thread_pool_add_task(cg_procedure_generate_worker_proc, p); - } else { - array_add(&m->single_threaded_procedure_queue, p); - } -} - -gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) { - TIME_SECTION("Tilde Module Initializtion"); - - CheckerInfo *info = &c->info; - - linker_data_init(linker_data, info, c->parser->init_fullpath); - - #if defined(GB_SYSTEM_OSX) - linker_enable_system_library_linking(linker_data); - #endif - - cg_global_arena_init(); - - cgModule *m = cg_module_create(c); - defer (cg_module_destroy(m)); - - m->do_threading = false; - - TIME_SECTION("Tilde Global Variables"); - - Array global_variables = {}; - bool already_has_entry_point = cg_global_variables_create(m, &global_variables); - gb_unused(already_has_entry_point); - - if (true) { - Type *proc_type = alloc_type_proc(nullptr, nullptr, 0, nullptr, 0, false, ProcCC_Odin); - cgProcedure *p = cg_procedure_create_dummy(m, str_lit(CG_STARTUP_RUNTIME_PROC_NAME), proc_type); - p->is_startup = true; - cg_startup_runtime_proc = p; - } - - if (true) { - Type *proc_type = alloc_type_proc(nullptr, nullptr, 0, nullptr, 0, false, ProcCC_Odin); - cgProcedure *p = cg_procedure_create_dummy(m, str_lit(CG_CLEANUP_RUNTIME_PROC_NAME), proc_type); - p->is_startup = true; - cg_cleanup_runtime_proc = p; - } - - auto *min_dep_set = &info->minimum_dependency_set; - - Array procedures_to_generate = {}; - array_init(&procedures_to_generate, heap_allocator()); - defer (array_free(&procedures_to_generate)); - - for (Entity *e : info->entities) { - String name = e->token.string; - Scope *scope = e->scope; - - if ((scope->flags & ScopeFlag_File) == 0) { - continue; - } - - Scope *package_scope = scope->parent; - GB_ASSERT(package_scope->flags & ScopeFlag_Pkg); - - if (e->kind != Entity_Procedure) { - continue; - } - - if (!ptr_set_exists(min_dep_set, e)) { - // NOTE(bill): Nothing depends upon it so doesn't need to be built - continue; - } - if (cgProcedure *p = cg_procedure_create(m, e)) { - array_add(&procedures_to_generate, p); - } - } - for (cgProcedure *p : procedures_to_generate) { - cg_add_procedure_to_queue(p); - } - - if (!m->do_threading) { - for (isize i = 0; i < m->single_threaded_procedure_queue.count; i++) { - cgProcedure *p = m->single_threaded_procedure_queue[i]; - cg_procedure_generate(p); - } - } - - thread_pool_wait(); - - { - cgProcedure *p = cg_startup_runtime_proc; - cg_procedure_begin(p); - cg_global_variables_initialize(p, &global_variables); - tb_inst_ret(p->func, 0, nullptr); - cg_procedure_end(p); - } - { - cgProcedure *p = cg_cleanup_runtime_proc; - cg_procedure_begin(p); - tb_inst_ret(p->func, 0, nullptr); - cg_procedure_end(p); - } - - - TB_DebugFormat debug_format = TB_DEBUGFMT_NONE; - if (build_context.ODIN_DEBUG) { - switch (build_context.metrics.os) { - case TargetOs_windows: - debug_format = TB_DEBUGFMT_CODEVIEW; - break; - case TargetOs_darwin: - case TargetOs_linux: - case TargetOs_essence: - case TargetOs_freebsd: - case TargetOs_openbsd: - case TargetOs_haiku: - debug_format = TB_DEBUGFMT_DWARF; - break; - } - } - TB_ExportBuffer export_buffer = tb_module_object_export(m->mod, debug_format); - defer (tb_export_buffer_free(export_buffer)); - - String filepath_obj = cg_filepath_obj_for_module(m, false); - array_add(&linker_data->output_object_paths, filepath_obj); - GB_ASSERT(tb_export_buffer_to_file(export_buffer, cast(char const *)filepath_obj.text)); - - return true; -} - -#undef ABI_PKG_NAME_SEPARATOR diff --git a/src/tilde.hpp b/src/tilde.hpp deleted file mode 100644 index d141b2330..000000000 --- a/src/tilde.hpp +++ /dev/null @@ -1,386 +0,0 @@ -#if defined(GB_SYSTEM_WINDOWS) - #pragma warning(push) - #pragma warning(disable: 4200) - #pragma warning(disable: 4201) - #define restrict gb_restrict -#endif - -#include "tilde/tb.h" -#include "tilde/tb_arena.h" - -#define TB_TYPE_F16 TB_DataType{ { TB_INT, 16 } } -#define TB_TYPE_I128 TB_DataType{ { TB_INT, 128 } } -#define TB_TYPE_INT TB_TYPE_INTN(cast(u16)(8*build_context.int_size)) -#define TB_TYPE_INTPTR TB_TYPE_INTN(cast(u16)(8*build_context.ptr_size)) - -#if defined(GB_SYSTEM_WINDOWS) - #pragma warning(pop) -#endif - -#define CG_STARTUP_RUNTIME_PROC_NAME "__$startup_runtime" -#define CG_CLEANUP_RUNTIME_PROC_NAME "__$cleanup_runtime" -#define CG_STARTUP_TYPE_INFO_PROC_NAME "__$startup_type_info" -#define CG_TYPE_INFO_DATA_NAME "__$type_info_data" -#define CG_TYPE_INFO_TYPES_NAME "__$type_info_types_data" -#define CG_TYPE_INFO_NAMES_NAME "__$type_info_names_data" -#define CG_TYPE_INFO_OFFSETS_NAME "__$type_info_offsets_data" -#define CG_TYPE_INFO_USINGS_NAME "__$type_info_usings_data" -#define CG_TYPE_INFO_TAGS_NAME "__$type_info_tags_data" -#define CG_TYPE_INFO_ENUM_VALUES_NAME "__$type_info_enum_values_data" - -struct cgModule; - - -enum cgValueKind : u32 { - cgValue_Value, // rvalue - cgValue_Addr, // lvalue - cgValue_Symbol, // global - cgValue_Multi, // multiple values -}; - -struct cgValueMulti; - -struct cgValue { - cgValueKind kind; - Type * type; - union { - // NOTE: any value in this union must be a pointer - TB_Symbol * symbol; - TB_Node * node; - cgValueMulti *multi; - }; -}; - -struct cgValueMulti { - Slice values; -}; - - -enum cgAddrKind { - cgAddr_Default, - cgAddr_Map, - cgAddr_Context, - cgAddr_SoaVariable, - - cgAddr_RelativePointer, - cgAddr_RelativeSlice, - - cgAddr_Swizzle, - cgAddr_SwizzleLarge, -}; - -struct cgAddr { - cgAddrKind kind; - cgValue addr; - union { - struct { - cgValue key; - Type *type; - Type *result; - } map; - struct { - Selection sel; - } ctx; - struct { - cgValue index; - Ast *index_expr; - } soa; - struct { - cgValue index; - Ast *node; - } index_set; - struct { - bool deref; - } relative; - struct { - Type *type; - u8 count; // 2, 3, or 4 components - u8 indices[4]; - } swizzle; - struct { - Type *type; - Slice indices; - } swizzle_large; - }; -}; - - -struct cgTargetList { - cgTargetList *prev; - bool is_block; - // control regions - TB_Node * break_; - TB_Node * continue_; - TB_Node * fallthrough_; -}; - -struct cgBranchRegions { - Ast * label; - TB_Node *break_; - TB_Node *continue_; -}; - -enum cgDeferExitKind { - cgDeferExit_Default, - cgDeferExit_Return, - cgDeferExit_Branch, -}; - -enum cgDeferKind { - cgDefer_Node, - cgDefer_Proc, -}; - -struct cgDefer { - cgDeferKind kind; - isize scope_index; - isize context_stack_count; - TB_Node * control_region; - union { - Ast *stmt; - struct { - cgValue deferred; - Slice result_as_args; - } proc; - }; -}; - - -struct cgContextData { - cgAddr ctx; - isize scope_index; - isize uses; -}; - -struct cgControlRegion { - TB_Node *control_region; - isize scope_index; -}; - -struct cgProcedure { - u32 flags; - u16 state_flags; - - cgProcedure *parent; - Array children; - - TB_Function *func; - TB_FunctionPrototype *proto; - TB_Symbol *symbol; - - Entity * entity; - cgModule *module; - String name; - Type * type; - Ast * type_expr; - Ast * body; - u64 tags; - ProcInlining inlining; - bool is_foreign; - bool is_export; - bool is_entry_point; - bool is_startup; - - TB_DebugType *debug_type; - - cgValue value; - - Ast *curr_stmt; - - cgTargetList * target_list; - Array defer_stack; - Array scope_stack; - Array context_stack; - - Array control_regions; - Array branch_regions; - - Scope *curr_scope; - i32 scope_index; - bool in_multi_assignment; - isize split_returns_index; - bool return_by_ptr; - - PtrMap variable_map; - PtrMap soa_values_map; -}; - - -struct cgModule { - TB_Module * mod; - Checker * checker; - CheckerInfo *info; - LinkerData * linker_data; - - bool do_threading; - Array single_threaded_procedure_queue; - - RwMutex values_mutex; - PtrMap values; - PtrMap symbols; - StringMap members; - StringMap procedures; - PtrMap procedure_values; - - RecursiveMutex debug_type_mutex; - PtrMap debug_type_map; - PtrMap proc_debug_type_map; // not pointer to - - RecursiveMutex proc_proto_mutex; - PtrMap proc_proto_map; - - BlockingMutex anonymous_proc_lits_mutex; - PtrMap anonymous_proc_lits_map; - - RecursiveMutex generated_procs_mutex; - PtrMap equal_procs; - PtrMap hasher_procs; - PtrMap map_get_procs; - PtrMap map_set_procs; - - RecursiveMutex map_info_mutex; - PtrMap map_info_map; - PtrMap map_cell_info_map; - - // NOTE(bill): no need to protect this with a mutex - PtrMap file_id_map; // Key: AstFile.id (i32 cast to uintptr) - - std::atomic nested_type_name_guid; - std::atomic const_nil_guid; -}; - -#ifndef ABI_PKG_NAME_SEPARATOR -#define ABI_PKG_NAME_SEPARATOR "@" -#endif - -struct GlobalTypeInfoData { - TB_Global *global; - Type * array_type; - Type * elem_type; - isize index; -}; - -gb_global Entity *cg_global_type_info_data_entity = {}; -gb_global GlobalTypeInfoData cg_global_type_info_member_types = {}; -gb_global GlobalTypeInfoData cg_global_type_info_member_names = {}; -gb_global GlobalTypeInfoData cg_global_type_info_member_offsets = {}; -gb_global GlobalTypeInfoData cg_global_type_info_member_usings = {}; -gb_global GlobalTypeInfoData cg_global_type_info_member_tags = {}; -gb_global GlobalTypeInfoData cg_global_type_info_member_enum_values = {}; - -gb_global cgProcedure *cg_startup_runtime_proc = nullptr; -gb_global cgProcedure *cg_cleanup_runtime_proc = nullptr; - - - -gb_internal TB_Arena *cg_arena(void); - -gb_internal cgProcedure *cg_procedure_create(cgModule *m, Entity *entity, bool ignore_body=false); -gb_internal void cg_add_procedure_to_queue(cgProcedure *p); -gb_internal void cg_setup_type_info_data(cgModule *m); -gb_internal cgProcedure *cg_procedure_generate_anonymous(cgModule *m, Ast *expr, cgProcedure *parent); - -gb_internal isize cg_global_const_calculate_region_count(ExactValue const &value, Type *type); -gb_internal i64 cg_global_const_calculate_region_count_from_basic_type(Type *type); -gb_internal bool cg_global_const_add_region(cgModule *m, ExactValue const &value, Type *type, TB_Global *global, i64 offset); - -gb_internal String cg_get_entity_name(cgModule *m, Entity *e); - -gb_internal cgValue cg_value(TB_Global * g, Type *type); -gb_internal cgValue cg_value(TB_External *e, Type *type); -gb_internal cgValue cg_value(TB_Function *f, Type *type); -gb_internal cgValue cg_value(TB_Symbol * s, Type *type); -gb_internal cgValue cg_value(TB_Node * node, Type *type); - -gb_internal cgAddr cg_addr(cgValue const &value); -gb_internal cgAddr cg_addr_map(cgValue addr, cgValue map_key, Type *map_type, Type *map_result); - -gb_internal u64 cg_typeid_as_u64(cgModule *m, Type *type); -gb_internal cgValue cg_type_info(cgProcedure *p, Type *type); -gb_internal isize cg_type_info_index(CheckerInfo *info, Type *type, bool err_on_not_found=true); - -gb_internal cgValue cg_const_value(cgProcedure *p, Type *type, ExactValue const &value); -gb_internal cgValue cg_const_nil(cgProcedure *p, Type *type); - -gb_internal cgValue cg_flatten_value(cgProcedure *p, cgValue value); - -gb_internal void cg_build_stmt(cgProcedure *p, Ast *stmt); -gb_internal void cg_build_stmt_list(cgProcedure *p, Slice const &stmts); -gb_internal void cg_build_when_stmt(cgProcedure *p, AstWhenStmt *ws); - - -gb_internal cgValue cg_build_expr(cgProcedure *p, Ast *expr); -gb_internal cgAddr cg_build_addr(cgProcedure *p, Ast *expr); -gb_internal cgValue cg_build_addr_ptr(cgProcedure *p, Ast *expr); -gb_internal cgValue cg_build_cond(cgProcedure *p, Ast *cond, TB_Node *true_block, TB_Node *false_block); - -gb_internal Type * cg_addr_type(cgAddr const &addr); -gb_internal cgValue cg_addr_load(cgProcedure *p, cgAddr addr); -gb_internal void cg_addr_store(cgProcedure *p, cgAddr addr, cgValue value); -gb_internal cgValue cg_addr_get_ptr(cgProcedure *p, cgAddr const &addr); - -gb_internal cgValue cg_emit_load(cgProcedure *p, cgValue const &ptr, bool is_volatile=false); -gb_internal void cg_emit_store(cgProcedure *p, cgValue dst, cgValue src, bool is_volatile=false); - -gb_internal cgAddr cg_add_local (cgProcedure *p, Type *type, Entity *e, bool zero_init); -gb_internal cgAddr cg_add_global(cgProcedure *p, Type *type, Entity *e); -gb_internal cgValue cg_address_from_load_or_generate_local(cgProcedure *p, cgValue value); -gb_internal cgValue cg_copy_value_to_ptr(cgProcedure *p, cgValue value, Type *original_type, isize min_alignment); - -gb_internal cgValue cg_build_call_expr(cgProcedure *p, Ast *expr); - -gb_internal void cg_build_return_stmt(cgProcedure *p, Slice const &return_results); -gb_internal void cg_build_return_stmt_internal(cgProcedure *p, Slice const &results); -gb_internal void cg_build_return_stmt_internal_single(cgProcedure *p, cgValue result); -gb_internal void cg_build_range_stmt(cgProcedure *p, Ast *node); - -gb_internal cgValue cg_find_value_from_entity(cgModule *m, Entity *e); -gb_internal cgValue cg_find_procedure_value_from_entity(cgModule *m, Entity *e); - -gb_internal TB_DebugType *cg_debug_type(cgModule *m, Type *type); - -gb_internal String cg_get_entity_name(cgModule *m, Entity *e); - -gb_internal cgValue cg_typeid(cgProcedure *m, Type *t); - -gb_internal cgValue cg_emit_ptr_offset(cgProcedure *p, cgValue ptr, cgValue index); -gb_internal cgValue cg_emit_array_ep(cgProcedure *p, cgValue s, cgValue index); -gb_internal cgValue cg_emit_array_epi(cgProcedure *p, cgValue s, i64 index); -gb_internal cgValue cg_emit_struct_ep(cgProcedure *p, cgValue s, i64 index); -gb_internal cgValue cg_emit_deep_field_gep(cgProcedure *p, cgValue e, Selection const &sel); -gb_internal cgValue cg_emit_struct_ev(cgProcedure *p, cgValue s, i64 index); - -gb_internal cgValue cg_emit_conv(cgProcedure *p, cgValue value, Type *t); -gb_internal cgValue cg_emit_comp_against_nil(cgProcedure *p, TokenKind op_kind, cgValue x); -gb_internal cgValue cg_emit_comp(cgProcedure *p, TokenKind op_kind, cgValue left, cgValue right); -gb_internal cgValue cg_emit_arith(cgProcedure *p, TokenKind op, cgValue lhs, cgValue rhs, Type *type); -gb_internal cgValue cg_emit_unary_arith(cgProcedure *p, TokenKind op, cgValue x, Type *type); -gb_internal void cg_emit_increment(cgProcedure *p, cgValue addr); - -gb_internal cgProcedure *cg_equal_proc_for_type (cgModule *m, Type *type); -gb_internal cgProcedure *cg_hasher_proc_for_type(cgModule *m, Type *type); -gb_internal cgValue cg_hasher_proc_value_for_type(cgProcedure *p, Type *type); -gb_internal cgValue cg_equal_proc_value_for_type(cgProcedure *p, Type *type); - -gb_internal cgValue cg_emit_call(cgProcedure * p, cgValue value, Slice const &args); -gb_internal cgValue cg_emit_runtime_call(cgProcedure *p, char const *name, Slice const &args); - -gb_internal bool cg_emit_goto(cgProcedure *p, TB_Node *control_region); - -gb_internal TB_Node *cg_control_region(cgProcedure *p, char const *name); - -gb_internal isize cg_append_tuple_values(cgProcedure *p, Array *dst_values, cgValue src_value); - -gb_internal cgValue cg_handle_param_value(cgProcedure *p, Type *parameter_type, ParameterValue const ¶m_value, TokenPos const &pos); - -gb_internal cgValue cg_builtin_len(cgProcedure *p, cgValue value); -gb_internal cgValue cg_builtin_raw_data(cgProcedure *p, cgValue const &x); -gb_internal cgValue cg_builtin_map_info(cgProcedure *p, Type *map_type); -gb_internal cgValue cg_builtin_map_cell_info(cgProcedure *p, Type *type); -gb_internal cgValue cg_emit_source_code_location_as_global(cgProcedure *p, String const &proc_name, TokenPos pos); -gb_internal cgValue cg_emit_source_code_location_as_global(cgProcedure *p, Ast *node); - - -gb_internal cgValue cg_internal_dynamic_map_get_ptr(cgProcedure *p, cgValue const &map_ptr, cgValue const &key); -gb_internal void cg_internal_dynamic_map_set(cgProcedure *p, cgValue const &map_ptr, Type *map_type, - cgValue const &map_key, cgValue const &map_value, Ast *node); \ No newline at end of file diff --git a/src/tilde/tb.h b/src/tilde/tb.h deleted file mode 100644 index 4fe21c902..000000000 --- a/src/tilde/tb.h +++ /dev/null @@ -1,1309 +0,0 @@ -// Glossary (because i don't know where else to put it) -// IR - intermediate representation -// SoN - sea of nodes (https://www.oracle.com/technetwork/java/javase/tech/c2-ir95-150110.pdf) -// SSA - single static assignment -// GVN - global value numbering -// CSE - common subexpression elimination -// CFG - control flow graph -// DSE - dead store elimination -// GCM - global code motion -// SROA - scalar replacement of aggregates -// SCCP - sparse conditional constant propagation -// RPO - reverse postorder -// BB - basic block -// ZTC - zero trip count -// SCC - strongly connected components -#ifndef TB_CORE_H -#define TB_CORE_H - -#include -#include -#include -#include -#include -#include -#include -#include - -// https://semver.org/ -#define TB_VERSION_MAJOR 0 -#define TB_VERSION_MINOR 3 -#define TB_VERSION_PATCH 0 - -#ifndef TB_API -# ifdef __cplusplus -# define TB_EXTERN extern "C" -# else -# define TB_EXTERN -# endif -# ifdef TB_DLL -# ifdef TB_IMPORT_DLL -# define TB_API TB_EXTERN __declspec(dllimport) -# else -# define TB_API TB_EXTERN __declspec(dllexport) -# endif -# else -# define TB_API TB_EXTERN -# endif -#endif - -// These are flags -typedef enum TB_ArithmeticBehavior { - TB_ARITHMATIC_NONE = 0, - TB_ARITHMATIC_NSW = 1, - TB_ARITHMATIC_NUW = 2, -} TB_ArithmeticBehavior; - -typedef enum TB_DebugFormat { - TB_DEBUGFMT_NONE, - - TB_DEBUGFMT_DWARF, - TB_DEBUGFMT_CODEVIEW, - - TB_DEBUGFMT_COLINPILLED -} TB_DebugFormat; - -typedef enum TB_Arch { - TB_ARCH_UNKNOWN, - - TB_ARCH_X86_64, - TB_ARCH_AARCH64, // unsupported but planned - TB_ARCH_WASM32, -} TB_Arch; - -typedef enum TB_System { - TB_SYSTEM_WINDOWS, - TB_SYSTEM_LINUX, - TB_SYSTEM_MACOS, - TB_SYSTEM_ANDROID, // Not supported yet - TB_SYSTEM_WEB, - - TB_SYSTEM_MAX, -} TB_System; - -typedef enum TB_WindowsSubsystem { - TB_WIN_SUBSYSTEM_UNKNOWN, - - TB_WIN_SUBSYSTEM_WINDOWS, - TB_WIN_SUBSYSTEM_CONSOLE, - TB_WIN_SUBSYSTEM_EFI_APP, -} TB_WindowsSubsystem; - -typedef enum TB_ABI { - // Used on 64bit Windows platforms - TB_ABI_WIN64, - - // Used on Mac, BSD and Linux platforms - TB_ABI_SYSTEMV, -} TB_ABI; - -typedef enum TB_OutputFlavor { - TB_FLAVOR_OBJECT, // .o .obj - TB_FLAVOR_SHARED, // .so .dll - TB_FLAVOR_STATIC, // .a .lib - TB_FLAVOR_EXECUTABLE, // .exe -} TB_OutputFlavor; - -typedef enum TB_CallingConv { - TB_CDECL, - TB_STDCALL -} TB_CallingConv; - -typedef enum TB_FeatureSet_X64 { - TB_FEATURE_X64_SSE3 = (1u << 0u), - TB_FEATURE_X64_SSE41 = (1u << 1u), - TB_FEATURE_X64_SSE42 = (1u << 2u), - - TB_FEATURE_X64_POPCNT = (1u << 3u), - TB_FEATURE_X64_LZCNT = (1u << 4u), - - TB_FEATURE_X64_CLMUL = (1u << 5u), - TB_FEATURE_X64_F16C = (1u << 6u), - - TB_FEATURE_X64_BMI1 = (1u << 7u), - TB_FEATURE_X64_BMI2 = (1u << 8u), - - TB_FEATURE_X64_AVX = (1u << 9u), - TB_FEATURE_X64_AVX2 = (1u << 10u), -} TB_FeatureSet_X64; - -typedef struct TB_FeatureSet { - TB_FeatureSet_X64 x64; -} TB_FeatureSet; - -typedef enum TB_Linkage { - TB_LINKAGE_PUBLIC, - TB_LINKAGE_PRIVATE -} TB_Linkage; - -typedef enum { - TB_COMDAT_NONE, - - TB_COMDAT_MATCH_ANY, -} TB_ComdatType; - -typedef enum TB_MemoryOrder { - TB_MEM_ORDER_RELAXED, - TB_MEM_ORDER_CONSUME, - TB_MEM_ORDER_ACQUIRE, - TB_MEM_ORDER_RELEASE, - TB_MEM_ORDER_ACQ_REL, - TB_MEM_ORDER_SEQ_CST, -} TB_MemoryOrder; - -typedef enum TB_DataTypeEnum { - // Integers, note void is an i0 and bool is an i1 - // i(0-64) - TB_INT, - // Floating point numbers - // f{32,64} - TB_FLOAT, - // Pointers - TB_PTR, - // represents control flow for REGION, BRANCH - TB_CONTROL, - // represents memory (and I/O) - TB_MEMORY, - // continuation (usually just return addresses :p) - TB_CONT, - // Tuples, these cannot be used in memory ops, just accessed via projections - TB_TUPLE, -} TB_DataTypeEnum; - -typedef enum TB_FloatFormat { - // IEEE 754 floats - TB_FLT_32, TB_FLT_64 -} TB_FloatFormat; - -typedef union TB_DataType { - struct { - uint16_t type : 4; - // for integers it's the bitwidth - uint16_t data : 12; - }; - uint16_t raw; -} TB_DataType; -static_assert(sizeof(TB_DataType) == 2, "im expecting this to be a uint16_t"); - -// classify data types -#define TB_IS_VOID_TYPE(x) ((x).type == TB_INT && (x).data == 0) -#define TB_IS_BOOL_TYPE(x) ((x).type == TB_INT && (x).data == 1) -#define TB_IS_INTEGER_TYPE(x) ((x).type == TB_INT) -#define TB_IS_FLOAT_TYPE(x) ((x).type == TB_FLOAT) -#define TB_IS_POINTER_TYPE(x) ((x).type == TB_PTR) - -// accessors -#define TB_GET_INT_BITWIDTH(x) ((x).data) -#define TB_GET_FLOAT_FORMAT(x) ((x).data) -#define TB_GET_PTR_ADDRSPACE(x) ((x).data) - -//////////////////////////////// -// ANNOTATIONS -//////////////////////////////// -// -// (A, B) -> (C, D) -// -// node takes A and B, produces C, D. if there's multiple -// results we need to use projections and the indices are -// based on the order seen here, proj0 is C, proj1 is D. -// -// (A, B) & C -> Int -// -// nodes takes A and B along with C in it's extra data. this is -// where non-node inputs fit. -// -typedef enum TB_NodeTypeEnum { - TB_NULL = 0, - - //////////////////////////////// - // CONSTANTS - //////////////////////////////// - TB_INTEGER_CONST, - TB_FLOAT32_CONST, - TB_FLOAT64_CONST, - - //////////////////////////////// - // MISCELLANEOUS - //////////////////////////////// - // this is an unspecified value, usually generated by the optimizer - // when malformed input is folded into an operation. - TB_POISON, // () -> Any - // projections just extract a single field of a tuple - TB_PROJ, // Tuple & Int -> Any - // this is a simple way to embed machine code into the code - TB_MACHINE_OP, // (Control, Memory) & Buffer -> (Control, Memory) - // reads the TSC on x64 - TB_CYCLE_COUNTER, // (Control) -> Int64 - // prefetches data for reading. The number next to the - // - // 0 is temporal - // 1-3 are just cache levels - TB_PREFETCH, // (Memory, Ptr) & Int -> Memory - - //////////////////////////////// - // CONTROL - //////////////////////////////// - // there's only one START and STOP per function - TB_START, // () -> (Control, Memory, Data...) - TB_END, // (Control, Memory, Data?) -> () - // regions are used to represent paths which have multiple entries. - // each input is a predecessor. - TB_REGION, // (Control...) -> (Control) - // phi nodes work the same as in SSA CFG, the value is based on which predecessor was taken. - // each input lines up with the regions such that region.in[i] will use phi.in[i+1] as the - // subsequent data. - TB_PHI, // (Control, Data...) -> Data - // branch is used to implement most control flow, it acts like a switch - // statement in C usually. they take a key and match against some cases, - // if they match, it'll jump to that successor, if none match it'll take - // the default successor. - // - // if (cond) { A; } else { B; } is just switch (cond) { case 0: B; default: A; } - // - // it's possible to not pass a key and the default successor is always called, this is - // a GOTO. tb_inst_goto, tb_inst_if can handle common cases for you. - TB_BRANCH, // (Control, Data?) -> (Control...) - // debugbreak will trap in a continuable manner. - TB_DEBUGBREAK, // (Control, Memory) -> (Control) - // trap will not be continuable but will stop execution. - TB_TRAP, // (Control) -> (Control) - // unreachable means it won't trap or be continuable. - TB_UNREACHABLE, // (Control) -> () - // this is generated when a path becomes disconnected - // from the main IR, it'll be reduced by the monotonic - // rewrites. - TB_DEAD, // () -> (Control) - - //////////////////////////////// - // CONTROL + MEMORY - //////////////////////////////// - // nothing special, it's just a function call, 3rd argument here is the - // target pointer (or syscall number) and the rest are just data args. - TB_CALL, // (Control, Memory, Data, Data...) -> (Control, Memory, Data) - TB_SYSCALL, // (Control, Memory, Data, Data...) -> (Control, Memory, Data) - // performs call while recycling the stack frame somewhat - TB_TAILCALL, // (Control, Memory, RPC, Data, Data...) -> () - // safepoint polls are the same except they only trigger if the poll site - // says to (platform specific but almost always just the page being made - // unmapped/guard), 3rd argument is the poll site. - TB_SAFEPOINT_POLL, // (Control, Memory, Ptr?, Data...) -> (Control) - // this safepoint which doesn't emit any poll site, it's just - // an address, this is used by AOT compiles to encode line info. - TB_SAFEPOINT_NOP, // (Control, Memory, Ptr?, Data...) -> (Control) - - //////////////////////////////// - // MEMORY - //////////////////////////////// - // MERGEMEM will join multiple non-aliasing memory effects, because - // they don't alias there's no ordering guarentee. - TB_MERGEMEM, // (Memory...) -> Memory - // LOAD and STORE are standard memory accesses, they can be folded away. - TB_LOAD, // (Control?, Memory, Ptr) -> Data - TB_STORE, // (Control, Memory, Ptr, Data) -> Memory - // bulk memory ops. - TB_MEMCPY, // (Control, Memory, Ptr, Ptr, Size) -> Memory - TB_MEMSET, // (Control, Memory, Ptr, Int8, Size) -> Memory - // these memory accesses represent "volatile" which means - // they may produce side effects and thus cannot be eliminated. - TB_READ, // (Control, Memory, Ptr) -> (Memory, Data) - TB_WRITE, // (Control, Memory, Ptr, Data) -> (Memory, Data) - // atomics have multiple observers (if not they wouldn't need to - // be atomic) and thus produce side effects everywhere just like - // volatiles except they have synchronization guarentees. the atomic - // data ops will return the value before the operation is performed. - // Atomic CAS return the old value and a boolean for success (true if - // the value was changed) - TB_ATOMIC_LOAD, // (Control, Memory, Ptr) -> (Memory, Data) - TB_ATOMIC_XCHG, // (Control, Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_ADD, // (Control, Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_SUB, // (Control, Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_AND, // (Control, Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_XOR, // (Control, Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_OR, // (Control, Memory, Ptr, Data) -> (Memory, Data) - TB_ATOMIC_CAS, // (Control, Memory, Data, Data) -> (Memory, Data, Bool) - - // like a multi-way branch but without the control flow aspect, but for data. - TB_LOOKUP, - - //////////////////////////////// - // POINTERS - //////////////////////////////// - // LOCAL will statically allocate stack space - TB_LOCAL, // () & (Int, Int) -> Ptr - // SYMBOL will return a pointer to a TB_Symbol - TB_SYMBOL, // () & TB_Symbol* -> Ptr - // offsets pointer by constant value - TB_MEMBER_ACCESS, // Ptr & Int -> Ptr - // arguments represent base, index, and stride respectively - // and will perform `base + index*stride` - TB_ARRAY_ACCESS, // (Ptr, Int) & Int -> Ptr - // converts an integer to a pointer - TB_INT2PTR, // Int -> Ptr - // converts a pointer to an integer - TB_PTR2INT, // Ptr -> Int - - // Conversions - TB_TRUNCATE, - TB_FLOAT_EXT, - TB_SIGN_EXT, - TB_ZERO_EXT, - TB_UINT2FLOAT, - TB_FLOAT2UINT, - TB_INT2FLOAT, - TB_FLOAT2INT, - TB_BITCAST, - - // Select - TB_SELECT, - - // Bitmagic - TB_BSWAP, - TB_CLZ, - TB_CTZ, - TB_POPCNT, - - // Unary operations - TB_NOT, - TB_NEG, - - // Integer arithmatic - TB_AND, - TB_OR, - TB_XOR, - TB_ADD, - TB_SUB, - TB_MUL, - - TB_SHL, - TB_SHR, - TB_SAR, - TB_ROL, - TB_ROR, - TB_UDIV, - TB_SDIV, - TB_UMOD, - TB_SMOD, - - // Float arithmatic - TB_FADD, - TB_FSUB, - TB_FMUL, - TB_FDIV, - TB_FMAX, - TB_FMIN, - - // Comparisons - TB_CMP_EQ, - TB_CMP_NE, - TB_CMP_ULT, - TB_CMP_ULE, - TB_CMP_SLT, - TB_CMP_SLE, - TB_CMP_FLT, - TB_CMP_FLE, - - // Special ops - // adds two paired integers to two other paired integers and returns - // a low and high value - TB_ADDPAIR, - // does full multiplication (64x64=128 and so on) returning - // the low and high values in separate projections - TB_MULPAIR, - - // variadic - TB_VA_START, - - // x86 intrinsics - TB_X86INTRIN_LDMXCSR, - TB_X86INTRIN_STMXCSR, - TB_X86INTRIN_SQRT, - TB_X86INTRIN_RSQRT, -} TB_NodeTypeEnum; -typedef uint8_t TB_NodeType; - -// just represents some region of bytes, usually in file parsing crap -typedef struct { - size_t length; - const uint8_t* data; -} TB_Slice; - -// represents byte counts -typedef uint32_t TB_CharUnits; - -// will get interned so each TB_Module has a unique identifier for the source file -typedef struct { - // used by the debug info export - int id; - - size_t len; - uint8_t path[]; -} TB_SourceFile; - -typedef struct TB_Location { - TB_SourceFile* file; - int line, column; - uint32_t pos; -} TB_Location; - -// SO refers to shared objects which mean either shared libraries (.so or .dll) -// or executables (.exe or ELF executables) -typedef enum { - // exports to the rest of the shared object - TB_EXTERNAL_SO_LOCAL, - - // exports outside of the shared object - TB_EXTERNAL_SO_EXPORT, -} TB_ExternalType; - -typedef struct TB_Global TB_Global; -typedef struct TB_External TB_External; -typedef struct TB_Function TB_Function; - -typedef struct TB_Module TB_Module; -typedef struct TB_DebugType TB_DebugType; -typedef struct TB_ModuleSection TB_ModuleSection; -typedef struct TB_FunctionPrototype TB_FunctionPrototype; - -enum { TB_MODULE_SECTION_NONE = -1 }; -typedef int32_t TB_ModuleSectionHandle; -typedef struct TB_Attrib TB_Attrib; - -// target-specific, just a unique ID for the registers -typedef int TB_PhysicalReg; - -// Thread local module state -typedef struct TB_ThreadInfo TB_ThreadInfo; - -typedef enum { - TB_SYMBOL_NONE, - TB_SYMBOL_EXTERNAL, - TB_SYMBOL_GLOBAL, - TB_SYMBOL_FUNCTION, - TB_SYMBOL_MAX, -} TB_SymbolTag; - -// Refers generically to objects within a module -// -// TB_Function, TB_Global, and TB_External are all subtypes of TB_Symbol -// and thus are safely allowed to cast into a symbol for operations. -typedef struct TB_Symbol { - #ifdef __cplusplus - TB_SymbolTag tag; - #else - _Atomic TB_SymbolTag tag; - #endif - - // which thread info it's tied to (we may need to remove it, this - // is used for that) - TB_ThreadInfo* info; - char* name; - - // It's kinda a weird circular reference but yea - TB_Module* module; - - // helpful for sorting and getting consistent builds - uint64_t ordinal; - - union { - // if we're JITing then this maps to the address of the symbol - void* address; - size_t symbol_id; - }; - - // after this point it's tag-specific storage -} TB_Symbol; - -typedef struct TB_Node TB_Node; -typedef struct User User; -struct User { - User* next; - TB_Node* n; - int slot; -}; - -struct TB_Node { - TB_NodeType type; - uint16_t input_count; - TB_DataType dt; - - // makes it easier to track in graph walks - uint32_t gvn; - - // only value while inside of a TB_Passes, - // these are unordered and usually just - // help perform certain transformations or - // analysis (not necessarily semantics) - User* users; - - // ordered def-use edges, jolly ol' semantics - TB_Node** inputs; - - char extra[]; -}; - -// These are the extra data in specific nodes -#define TB_NODE_GET_EXTRA(n) ((void*) n->extra) -#define TB_NODE_GET_EXTRA_T(n, T) ((T*) (n)->extra) -#define TB_NODE_SET_EXTRA(n, T, ...) (*((T*) (n)->extra) = (T){ __VA_ARGS__ }) - -// this represents switch (many targets), if (one target) and goto (only default) logic. -typedef struct { // TB_BRANCH - size_t succ_count; - int64_t keys[]; -} TB_NodeBranch; - -typedef struct { // TB_PROJ - int index; -} TB_NodeProj; - -typedef struct { // TB_INTEGER_CONST - uint64_t value; -} TB_NodeInt; - -typedef struct { // any compare operator - TB_DataType cmp_dt; -} TB_NodeCompare; - -typedef struct { // any integer binary operator - TB_ArithmeticBehavior ab; -} TB_NodeBinopInt; - -typedef struct { - TB_CharUnits align; -} TB_NodeMemAccess; - -typedef struct { - int level; -} TB_NodePrefetch; - -typedef struct { - TB_CharUnits size, align; - int alias_index; // 0 if local is used beyond direct memops, 1...n as a unique alias name -} TB_NodeLocal; - -typedef struct { - // this is the raw buffer - size_t length; - const uint8_t* data; - - // represents the outputs, inputs and temporaries in that order - size_t outs, ins, tmps; - TB_PhysicalReg regs[]; -} TB_NodeMachineOp; - -typedef struct { - float value; -} TB_NodeFloat32; - -typedef struct { - double value; -} TB_NodeFloat64; - -typedef struct { - int64_t stride; -} TB_NodeArray; - -typedef struct { - int64_t offset; -} TB_NodeMember; - -typedef struct { - TB_Symbol* sym; -} TB_NodeSymbol; - -typedef struct { - TB_MemoryOrder order; - TB_MemoryOrder order2; - TB_Node* proj0; - TB_Node* proj1; -} TB_NodeAtomic; - -typedef struct { - // line info on safepoints - TB_SourceFile* file; - int line, column; -} TB_NodeSafepoint; - -typedef struct { - TB_FunctionPrototype* proto; - int proj_count; - TB_Node* projs[]; -} TB_NodeCall; - -typedef struct { - TB_FunctionPrototype* proto; -} TB_NodeTailcall; - -typedef struct { - const char* tag; - - // magic factor for hot-code, higher means run more often - float freq; - - // used for IR building only, stale after that. - TB_Node *mem_in, *mem_out; -} TB_NodeRegion; - -typedef struct { - int64_t key; - uint64_t val; -} TB_LookupEntry; - -typedef struct { - size_t entry_count; - TB_LookupEntry entries[]; -} TB_NodeLookup; - -typedef struct TB_MultiOutput { - size_t count; - union { - // count = 1 - TB_Node* single; - // count > 1 - TB_Node** multiple; - }; -} TB_MultiOutput; -#define TB_MULTI_OUTPUT(o) ((o).count > 1 ? (o).multiple : &(o).single) - -typedef struct { - int64_t key; - TB_Node* value; -} TB_SwitchEntry; - -typedef enum { - TB_EXECUTABLE_UNKNOWN, - TB_EXECUTABLE_PE, - TB_EXECUTABLE_ELF, -} TB_ExecutableType; - -typedef struct { - TB_Node* node; // type == TB_SAFEPOINT - void* userdata; - - uint32_t ip; // relative to the function body. - uint32_t count; // same as node->input_count - int32_t values[]; -} TB_Safepoint; - -typedef enum { - TB_MODULE_SECTION_WRITE = 1, - TB_MODULE_SECTION_EXEC = 2, - TB_MODULE_SECTION_TLS = 4, -} TB_ModuleSectionFlags; - -// ******************************* -// Public macros -// ******************************* -#ifdef __cplusplus - -#define TB_TYPE_TUPLE TB_DataType{ { TB_TUPLE } } -#define TB_TYPE_CONTROL TB_DataType{ { TB_CONTROL } } -#define TB_TYPE_VOID TB_DataType{ { TB_INT, 0 } } -#define TB_TYPE_I8 TB_DataType{ { TB_INT, 8 } } -#define TB_TYPE_I16 TB_DataType{ { TB_INT, 16 } } -#define TB_TYPE_I32 TB_DataType{ { TB_INT, 32 } } -#define TB_TYPE_I64 TB_DataType{ { TB_INT, 64 } } -#define TB_TYPE_F32 TB_DataType{ { TB_FLOAT, TB_FLT_32 } } -#define TB_TYPE_F64 TB_DataType{ { TB_FLOAT, TB_FLT_64 } } -#define TB_TYPE_BOOL TB_DataType{ { TB_INT, 1 } } -#define TB_TYPE_PTR TB_DataType{ { TB_PTR, 0 } } -#define TB_TYPE_MEMORY TB_DataType{ { TB_MEMORY,0 } } -#define TB_TYPE_CONT TB_DataType{ { TB_CONT, 0 } } -#define TB_TYPE_INTN(N) TB_DataType{ { TB_INT, (N) } } -#define TB_TYPE_PTRN(N) TB_DataType{ { TB_PTR, (N) } } - -#else - -#define TB_TYPE_TUPLE (TB_DataType){ { TB_TUPLE } } -#define TB_TYPE_CONTROL (TB_DataType){ { TB_CONTROL } } -#define TB_TYPE_VOID (TB_DataType){ { TB_INT, 0 } } -#define TB_TYPE_I8 (TB_DataType){ { TB_INT, 8 } } -#define TB_TYPE_I16 (TB_DataType){ { TB_INT, 16 } } -#define TB_TYPE_I32 (TB_DataType){ { TB_INT, 32 } } -#define TB_TYPE_I64 (TB_DataType){ { TB_INT, 64 } } -#define TB_TYPE_F32 (TB_DataType){ { TB_FLOAT, TB_FLT_32 } } -#define TB_TYPE_F64 (TB_DataType){ { TB_FLOAT, TB_FLT_64 } } -#define TB_TYPE_BOOL (TB_DataType){ { TB_INT, 1 } } -#define TB_TYPE_PTR (TB_DataType){ { TB_PTR, 0 } } -#define TB_TYPE_CONT (TB_DataType){ { TB_CONT, 0 } } -#define TB_TYPE_MEMORY (TB_DataType){ { TB_MEMORY,0 } } -#define TB_TYPE_INTN(N) (TB_DataType){ { TB_INT, (N) } } -#define TB_TYPE_PTRN(N) (TB_DataType){ { TB_PTR, (N) } } - -#endif - -typedef void (*TB_PrintCallback)(void* user_data, const char* fmt, ...); - -// defined in common/arena.h -typedef struct TB_Arena TB_Arena; - -// 0 for default -TB_API void tb_arena_create(TB_Arena* restrict arena, size_t chunk_size); -TB_API void tb_arena_destroy(TB_Arena* restrict arena); -TB_API bool tb_arena_is_empty(TB_Arena* restrict arena); -TB_API void tb_arena_clear(TB_Arena* restrict arena); - -//////////////////////////////// -// Module management -//////////////////////////////// -// Creates a module with the correct target and settings -TB_API TB_Module* tb_module_create(TB_Arch arch, TB_System sys, const TB_FeatureSet* features, bool is_jit); - -// Creates a module but defaults on the architecture and system based on the host machine -TB_API TB_Module* tb_module_create_for_host(const TB_FeatureSet* features, bool is_jit); - -// Frees all resources for the TB_Module and it's functions, globals and -// compiled code. -TB_API void tb_module_destroy(TB_Module* m); - -// When targetting windows & thread local storage, you'll need to bind a tls index -// which is usually just a global that the runtime support has initialized, if you -// dont and the tls_index is used, it'll crash -TB_API void tb_module_set_tls_index(TB_Module* m, ptrdiff_t len, const char* name); - -TB_API TB_ModuleSectionHandle tb_module_create_section(TB_Module* m, ptrdiff_t len, const char* name, TB_ModuleSectionFlags flags, TB_ComdatType comdat); - -typedef struct { - TB_ThreadInfo* info; - size_t i; -} TB_SymbolIter; - -// Lovely iterator for all the symbols... it's probably not "fast" -TB_SymbolIter tb_symbol_iter(TB_Module* mod); -TB_Symbol* tb_symbol_iter_next(TB_SymbolIter* iter); - -//////////////////////////////// -// Compiled code introspection -//////////////////////////////// -enum { TB_ASSEMBLY_CHUNK_CAP = 4*1024 - sizeof(size_t[2]) }; - -typedef struct TB_Assembly TB_Assembly; -struct TB_Assembly { - TB_Assembly* next; - - // nice chunk of text here - size_t length; - char data[]; -}; - -// this is where the machine code and other relevant pieces go. -typedef struct TB_FunctionOutput TB_FunctionOutput; - -TB_API void tb_output_print_asm(TB_FunctionOutput* out, FILE* fp); - -TB_API uint8_t* tb_output_get_code(TB_FunctionOutput* out, size_t* out_length); - -// returns NULL if there's no line info -TB_API TB_Location* tb_output_get_locations(TB_FunctionOutput* out, size_t* out_count); - -// returns NULL if no assembly was generated -TB_API TB_Assembly* tb_output_get_asm(TB_FunctionOutput* out); - -// this is relative to the start of the function (the start of the prologue) -TB_API TB_Safepoint* tb_safepoint_get(TB_Function* f, uint32_t relative_ip); - -//////////////////////////////// -// JIT compilation -//////////////////////////////// -typedef struct TB_JIT TB_JIT; -typedef struct TB_CPUContext TB_CPUContext; - -// passing 0 to jit_heap_capacity will default to 4MiB -TB_API TB_JIT* tb_jit_begin(TB_Module* m, size_t jit_heap_capacity); -TB_API void* tb_jit_place_function(TB_JIT* jit, TB_Function* f); -TB_API void* tb_jit_place_global(TB_JIT* jit, TB_Global* g); -TB_API void tb_jit_dump_heap(TB_JIT* jit); -TB_API void tb_jit_end(TB_JIT* jit); - -typedef struct { - TB_Symbol* base; - uint32_t offset; -} TB_ResolvedAddr; - -typedef struct { - TB_Function* f; - TB_Location* loc; - uint32_t start, end; -} TB_ResolvedLine; - -TB_API TB_ResolvedAddr tb_jit_addr2sym(TB_JIT* jit, void* ptr); -TB_API TB_ResolvedLine tb_jit_addr2line(TB_JIT* jit, void* ptr); -TB_API void* tb_jit_get_code_ptr(TB_Function* f); - -typedef enum { - // just keeps running - TB_DBG_NONE, - // stops after one instruction - TB_DBG_INST, - // stops once the line changes - TB_DBG_LINE, -} TB_DbgStep; - -// Debugger stuff -// creates a new context we can run JIT code in, you don't -// technically need this but it's a nice helper for writing -// JITs especially when it comes to breakpoints (and eventually -// safepoints) -TB_API TB_CPUContext* tb_jit_thread_create(void* entry, void* arg); -// runs until TB_DbgStep condition is met -TB_API bool tb_jit_thread_resume(TB_JIT* jit, TB_CPUContext* cpu, TB_DbgStep step); -TB_API void* tb_jit_thread_pc(TB_CPUContext* cpu); -TB_API void tb_jit_breakpoint(TB_JIT* jit, void* addr); -TB_API void tb_jit_thread_dump_stack(TB_JIT* jit, TB_CPUContext* cpu); - -//////////////////////////////// -// Disassembler -//////////////////////////////// -TB_API ptrdiff_t tb_print_disassembly_inst(TB_Arch arch, size_t length, const void* ptr); - -//////////////////////////////// -// Exporter -//////////////////////////////// -// Export buffers are generated in chunks because it's easier, usually the -// chunks are "massive" (representing some connected piece of the buffer) -// but they don't have to be. -typedef struct TB_ExportChunk TB_ExportChunk; -struct TB_ExportChunk { - TB_ExportChunk* next; - size_t pos, size; - uint8_t data[]; -}; - -typedef struct { - size_t total; - TB_ExportChunk *head, *tail; -} TB_ExportBuffer; - -TB_API TB_ExportBuffer tb_module_object_export(TB_Module* m, TB_DebugFormat debug_fmt); -TB_API bool tb_export_buffer_to_file(TB_ExportBuffer buffer, const char* path); -TB_API void tb_export_buffer_free(TB_ExportBuffer buffer); - -//////////////////////////////// -// Linker exporter -//////////////////////////////// -// This is used to export shared objects or executables -typedef struct TB_Linker TB_Linker; -typedef struct TB_LinkerSection TB_LinkerSection; -typedef struct TB_LinkerSectionPiece TB_LinkerSectionPiece; - -typedef struct { - enum { - TB_LINKER_MSG_NULL, - - // pragma comment(lib, "blah") - TB_LINKER_MSG_IMPORT, - } tag; - union { - // pragma lib request - TB_Slice import_path; - }; -} TB_LinkerMsg; - -TB_API TB_ExecutableType tb_system_executable_format(TB_System s); - -TB_API TB_Linker* tb_linker_create(TB_ExecutableType type, TB_Arch arch); -TB_API TB_ExportBuffer tb_linker_export(TB_Linker* l); -TB_API void tb_linker_destroy(TB_Linker* l); - -TB_API bool tb_linker_get_msg(TB_Linker* l, TB_LinkerMsg* msg); - -// windows only -TB_API void tb_linker_set_subsystem(TB_Linker* l, TB_WindowsSubsystem subsystem); - -TB_API void tb_linker_set_entrypoint(TB_Linker* l, const char* name); - -// Links compiled module into output -TB_API void tb_linker_append_module(TB_Linker* l, TB_Module* m); - -// Adds object file to output -TB_API void tb_linker_append_object(TB_Linker* l, TB_Slice obj_name, TB_Slice content); - -// Adds static library to output -// this can include imports (wrappers for DLL symbols) along with -// normal sections. -TB_API void tb_linker_append_library(TB_Linker* l, TB_Slice ar_name, TB_Slice content); - -//////////////////////////////// -// Symbols -//////////////////////////////// -TB_API TB_Global* tb_extern_transmute(TB_External* e, TB_DebugType* dbg_type, TB_Linkage linkage); -TB_API TB_External* tb_extern_create(TB_Module* m, ptrdiff_t len, const char* name, TB_ExternalType type); - -TB_API TB_SourceFile* tb_get_source_file(TB_Module* m, const char* path); - -// Called once you're done with TB operations on a thread (or i guess when it's -// about to be killed :p), not calling it can only result in leaks on that thread -// and calling it too early will result in TB potentially reallocating it but there's -// should be no crashes from this, just potential slowdown or higher than expected memory -// usage. -TB_API void tb_free_thread_resources(void); - -//////////////////////////////// -// Function Prototypes -//////////////////////////////// -typedef struct TB_PrototypeParam { - TB_DataType dt; - TB_DebugType* debug_type; - - // does not apply for returns - const char* name; -} TB_PrototypeParam; - -struct TB_FunctionPrototype { - // header - TB_CallingConv call_conv; - uint16_t return_count, param_count; - bool has_varargs; - - // params are directly followed by returns - TB_PrototypeParam params[]; -}; -#define TB_PROTOTYPE_RETURNS(p) ((p)->params + (p)->param_count) - -// creates a function prototype used to define a function's parameters and returns. -// -// function prototypes do not get freed individually and last for the entire run -// of the backend, they can also be reused for multiple functions which have -// matching signatures. -TB_API TB_FunctionPrototype* tb_prototype_create(TB_Module* m, TB_CallingConv cc, size_t param_count, const TB_PrototypeParam* params, size_t return_count, const TB_PrototypeParam* returns, bool has_varargs); - -// same as tb_function_set_prototype except it will handle lowering from types like the TB_DebugType -// into the correct ABI and exposing sane looking nodes to the parameters. -// -// returns the parameters -TB_API TB_Node** tb_function_set_prototype_from_dbg(TB_Function* f, TB_ModuleSectionHandle section, TB_DebugType* dbg, TB_Arena* arena, size_t* out_param_count); -TB_API TB_FunctionPrototype* tb_prototype_from_dbg(TB_Module* m, TB_DebugType* dbg); - -// used for ABI parameter passing -typedef enum { - // needs a direct value - TB_PASSING_DIRECT, - - // needs an address to the value - TB_PASSING_INDIRECT, - - // doesn't use this parameter - TB_PASSING_IGNORE, -} TB_PassingRule; - -TB_API TB_PassingRule tb_get_passing_rule_from_dbg(TB_Module* mod, TB_DebugType* param_type, bool is_return); - -//////////////////////////////// -// Globals -//////////////////////////////// -TB_API TB_Global* tb_global_create(TB_Module* m, ptrdiff_t len, const char* name, TB_DebugType* dbg_type, TB_Linkage linkage); - -// allocate space for the global -TB_API void tb_global_set_storage(TB_Module* m, TB_ModuleSectionHandle section, TB_Global* global, size_t size, size_t align, size_t max_objects); - -// returns a buffer which the user can fill to then have represented in the initializer -TB_API void* tb_global_add_region(TB_Module* m, TB_Global* global, size_t offset, size_t size); - -// places a relocation for a global at offset, the size of the relocation -// depends on the pointer size -TB_API void tb_global_add_symbol_reloc(TB_Module* m, TB_Global* global, size_t offset, const TB_Symbol* symbol); - -TB_API TB_ModuleSectionHandle tb_module_get_text(TB_Module* m); -TB_API TB_ModuleSectionHandle tb_module_get_rdata(TB_Module* m); -TB_API TB_ModuleSectionHandle tb_module_get_data(TB_Module* m); -TB_API TB_ModuleSectionHandle tb_module_get_tls(TB_Module* m); - -//////////////////////////////// -// Function Attributes -//////////////////////////////// -// These are parts of a function that describe metadata for instructions -TB_API void tb_function_attrib_variable(TB_Function* f, TB_Node* n, TB_Node* parent, ptrdiff_t len, const char* name, TB_DebugType* type); -TB_API void tb_function_attrib_scope(TB_Function* f, TB_Node* n, TB_Node* parent); - -//////////////////////////////// -// Debug info Generation -//////////////////////////////// -TB_API TB_DebugType* tb_debug_get_void(TB_Module* m); -TB_API TB_DebugType* tb_debug_get_bool(TB_Module* m); -TB_API TB_DebugType* tb_debug_get_integer(TB_Module* m, bool is_signed, int bits); -TB_API TB_DebugType* tb_debug_get_float(TB_Module* m, TB_FloatFormat fmt); -TB_API TB_DebugType* tb_debug_create_ptr(TB_Module* m, TB_DebugType* base); -TB_API TB_DebugType* tb_debug_create_array(TB_Module* m, TB_DebugType* base, size_t count); -TB_API TB_DebugType* tb_debug_create_alias(TB_Module* m, TB_DebugType* base, ptrdiff_t len, const char* tag); -TB_API TB_DebugType* tb_debug_create_struct(TB_Module* m, ptrdiff_t len, const char* tag); -TB_API TB_DebugType* tb_debug_create_union(TB_Module* m, ptrdiff_t len, const char* tag); -TB_API TB_DebugType* tb_debug_create_field(TB_Module* m, TB_DebugType* type, ptrdiff_t len, const char* name, TB_CharUnits offset); - -// returns the array you need to fill with fields -TB_API TB_DebugType** tb_debug_record_begin(TB_Module* m, TB_DebugType* type, size_t count); -TB_API void tb_debug_record_end(TB_DebugType* type, TB_CharUnits size, TB_CharUnits align); - -TB_API TB_DebugType* tb_debug_create_func(TB_Module* m, TB_CallingConv cc, size_t param_count, size_t return_count, bool has_varargs); - -TB_API TB_DebugType* tb_debug_field_type(TB_DebugType* type); - -TB_API size_t tb_debug_func_return_count(TB_DebugType* type); -TB_API size_t tb_debug_func_param_count(TB_DebugType* type); - -// you'll need to fill these if you make a function -TB_API TB_DebugType** tb_debug_func_params(TB_DebugType* type); -TB_API TB_DebugType** tb_debug_func_returns(TB_DebugType* type); - -//////////////////////////////// -// Symbols -//////////////////////////////// -// returns NULL if the tag doesn't match -TB_API TB_Function* tb_symbol_as_function(TB_Symbol* s); -TB_API TB_External* tb_symbol_as_external(TB_Symbol* s); -TB_API TB_Global* tb_symbol_as_global(TB_Symbol* s); - -//////////////////////////////// -// Function IR Generation -//////////////////////////////// -TB_API void tb_get_data_type_size(TB_Module* mod, TB_DataType dt, size_t* size, size_t* align); - -// the user_data is expected to be a valid FILE* -TB_API void tb_default_print_callback(void* user_data, const char* fmt, ...); - -TB_API void tb_inst_location(TB_Function* f, TB_SourceFile* file, int line, int column); - -// this is where the STOP will be -TB_API void tb_inst_set_exit_location(TB_Function* f, TB_SourceFile* file, int line, int column); - -// if section is NULL, default to .text -TB_API TB_Function* tb_function_create(TB_Module* m, ptrdiff_t len, const char* name, TB_Linkage linkage); - -TB_API TB_Arena* tb_function_get_arena(TB_Function* f); - -// if len is -1, it's null terminated -TB_API void tb_symbol_set_name(TB_Symbol* s, ptrdiff_t len, const char* name); - -TB_API void tb_symbol_bind_ptr(TB_Symbol* s, void* ptr); -TB_API const char* tb_symbol_get_name(TB_Symbol* s); - -// if arena is NULL, defaults to module arena which is freed on tb_free_thread_resources -TB_API void tb_function_set_prototype(TB_Function* f, TB_ModuleSectionHandle section, TB_FunctionPrototype* p, TB_Arena* arena); -TB_API TB_FunctionPrototype* tb_function_get_prototype(TB_Function* f); - -TB_API void tb_inst_set_control(TB_Function* f, TB_Node* control); -TB_API TB_Node* tb_inst_get_control(TB_Function* f); - -TB_API TB_Node* tb_inst_region(TB_Function* f); - -// if len is -1, it's null terminated -TB_API void tb_inst_set_region_name(TB_Function* f, TB_Node* n, ptrdiff_t len, const char* name); - -TB_API void tb_inst_unreachable(TB_Function* f); -TB_API void tb_inst_debugbreak(TB_Function* f); -TB_API void tb_inst_trap(TB_Function* f); -TB_API TB_Node* tb_inst_poison(TB_Function* f, TB_DataType dt); - -TB_API TB_Node* tb_inst_param(TB_Function* f, int param_id); - -TB_API TB_Node* tb_inst_fpxt(TB_Function* f, TB_Node* src, TB_DataType dt); -TB_API TB_Node* tb_inst_sxt(TB_Function* f, TB_Node* src, TB_DataType dt); -TB_API TB_Node* tb_inst_zxt(TB_Function* f, TB_Node* src, TB_DataType dt); -TB_API TB_Node* tb_inst_trunc(TB_Function* f, TB_Node* src, TB_DataType dt); -TB_API TB_Node* tb_inst_int2ptr(TB_Function* f, TB_Node* src); -TB_API TB_Node* tb_inst_ptr2int(TB_Function* f, TB_Node* src, TB_DataType dt); -TB_API TB_Node* tb_inst_int2float(TB_Function* f, TB_Node* src, TB_DataType dt, bool is_signed); -TB_API TB_Node* tb_inst_float2int(TB_Function* f, TB_Node* src, TB_DataType dt, bool is_signed); -TB_API TB_Node* tb_inst_bitcast(TB_Function* f, TB_Node* src, TB_DataType dt); - -TB_API TB_Node* tb_inst_local(TB_Function* f, TB_CharUnits size, TB_CharUnits align); - -TB_API TB_Node* tb_inst_load(TB_Function* f, TB_DataType dt, TB_Node* addr, TB_CharUnits align, bool is_volatile); -TB_API void tb_inst_store(TB_Function* f, TB_DataType dt, TB_Node* addr, TB_Node* val, TB_CharUnits align, bool is_volatile); - -TB_API void tb_inst_safepoint_poll(TB_Function* f, TB_Node* addr, int input_count, TB_Node** inputs); - -TB_API TB_Node* tb_inst_bool(TB_Function* f, bool imm); -TB_API TB_Node* tb_inst_sint(TB_Function* f, TB_DataType dt, int64_t imm); -TB_API TB_Node* tb_inst_uint(TB_Function* f, TB_DataType dt, uint64_t imm); -TB_API TB_Node* tb_inst_float32(TB_Function* f, float imm); -TB_API TB_Node* tb_inst_float64(TB_Function* f, double imm); -TB_API TB_Node* tb_inst_cstring(TB_Function* f, const char* str); -TB_API TB_Node* tb_inst_string(TB_Function* f, size_t len, const char* str); - -// write 'val' over 'count' bytes on 'dst' -TB_API void tb_inst_memset(TB_Function* f, TB_Node* dst, TB_Node* val, TB_Node* count, TB_CharUnits align); - -// zero 'count' bytes on 'dst' -TB_API void tb_inst_memzero(TB_Function* f, TB_Node* dst, TB_Node* count, TB_CharUnits align); - -// performs a copy of 'count' elements from one memory location to another -// both locations cannot overlap. -TB_API void tb_inst_memcpy(TB_Function* f, TB_Node* dst, TB_Node* src, TB_Node* count, TB_CharUnits align); - -// result = base + (index * stride) -TB_API TB_Node* tb_inst_array_access(TB_Function* f, TB_Node* base, TB_Node* index, int64_t stride); - -// result = base + offset -// where base is a pointer -TB_API TB_Node* tb_inst_member_access(TB_Function* f, TB_Node* base, int64_t offset); - -TB_API TB_Node* tb_inst_get_symbol_address(TB_Function* f, TB_Symbol* target); - -// Performs a conditional select between two values, if the operation is -// performed wide then the cond is expected to be the same type as a and b where -// the condition is resolved as true if the MSB (per component) is 1. -// -// result = cond ? a : b -// a, b must match in type -TB_API TB_Node* tb_inst_select(TB_Function* f, TB_Node* cond, TB_Node* a, TB_Node* b); - -// Integer arithmatic -TB_API TB_Node* tb_inst_add(TB_Function* f, TB_Node* a, TB_Node* b, TB_ArithmeticBehavior arith_behavior); -TB_API TB_Node* tb_inst_sub(TB_Function* f, TB_Node* a, TB_Node* b, TB_ArithmeticBehavior arith_behavior); -TB_API TB_Node* tb_inst_mul(TB_Function* f, TB_Node* a, TB_Node* b, TB_ArithmeticBehavior arith_behavior); -TB_API TB_Node* tb_inst_div(TB_Function* f, TB_Node* a, TB_Node* b, bool signedness); -TB_API TB_Node* tb_inst_mod(TB_Function* f, TB_Node* a, TB_Node* b, bool signedness); - -// Bitmagic operations -TB_API TB_Node* tb_inst_bswap(TB_Function* f, TB_Node* n); -TB_API TB_Node* tb_inst_clz(TB_Function* f, TB_Node* n); -TB_API TB_Node* tb_inst_ctz(TB_Function* f, TB_Node* n); -TB_API TB_Node* tb_inst_popcount(TB_Function* f, TB_Node* n); - -// Bitwise operations -TB_API TB_Node* tb_inst_not(TB_Function* f, TB_Node* n); -TB_API TB_Node* tb_inst_neg(TB_Function* f, TB_Node* n); -TB_API TB_Node* tb_inst_and(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_or(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_xor(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_sar(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_shl(TB_Function* f, TB_Node* a, TB_Node* b, TB_ArithmeticBehavior arith_behavior); -TB_API TB_Node* tb_inst_shr(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_rol(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_ror(TB_Function* f, TB_Node* a, TB_Node* b); - -// Atomics -// By default you can use TB_MEM_ORDER_SEQ_CST for the memory order to get -// correct but possibly slower results on certain platforms (those with relaxed -// memory models). - -// Must be aligned to the natural alignment of dt -TB_API TB_Node* tb_inst_atomic_load(TB_Function* f, TB_Node* addr, TB_DataType dt, TB_MemoryOrder order); - -// All atomic operations here return the old value and the operations are -// performed in the same data type as 'src' with alignment of 'addr' being -// the natural alignment of 'src' -TB_API TB_Node* tb_inst_atomic_xchg(TB_Function* f, TB_Node* addr, TB_Node* src, TB_MemoryOrder order); -TB_API TB_Node* tb_inst_atomic_add(TB_Function* f, TB_Node* addr, TB_Node* src, TB_MemoryOrder order); -TB_API TB_Node* tb_inst_atomic_sub(TB_Function* f, TB_Node* addr, TB_Node* src, TB_MemoryOrder order); -TB_API TB_Node* tb_inst_atomic_and(TB_Function* f, TB_Node* addr, TB_Node* src, TB_MemoryOrder order); -TB_API TB_Node* tb_inst_atomic_xor(TB_Function* f, TB_Node* addr, TB_Node* src, TB_MemoryOrder order); -TB_API TB_Node* tb_inst_atomic_or(TB_Function* f, TB_Node* addr, TB_Node* src, TB_MemoryOrder order); - -// returns old_value from *addr -TB_API TB_Node* tb_inst_atomic_cmpxchg(TB_Function* f, TB_Node* addr, TB_Node* expected, TB_Node* desired, TB_MemoryOrder succ, TB_MemoryOrder fail); - -// Float math -TB_API TB_Node* tb_inst_fadd(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_fsub(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_fmul(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_fdiv(TB_Function* f, TB_Node* a, TB_Node* b); - -// Comparisons -TB_API TB_Node* tb_inst_cmp_eq(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_cmp_ne(TB_Function* f, TB_Node* a, TB_Node* b); - -TB_API TB_Node* tb_inst_cmp_ilt(TB_Function* f, TB_Node* a, TB_Node* b, bool signedness); -TB_API TB_Node* tb_inst_cmp_ile(TB_Function* f, TB_Node* a, TB_Node* b, bool signedness); -TB_API TB_Node* tb_inst_cmp_igt(TB_Function* f, TB_Node* a, TB_Node* b, bool signedness); -TB_API TB_Node* tb_inst_cmp_ige(TB_Function* f, TB_Node* a, TB_Node* b, bool signedness); - -TB_API TB_Node* tb_inst_cmp_flt(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_cmp_fle(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_cmp_fgt(TB_Function* f, TB_Node* a, TB_Node* b); -TB_API TB_Node* tb_inst_cmp_fge(TB_Function* f, TB_Node* a, TB_Node* b); - -// General intrinsics -TB_API TB_Node* tb_inst_va_start(TB_Function* f, TB_Node* a); -TB_API TB_Node* tb_inst_cycle_counter(TB_Function* f); -TB_API TB_Node* tb_inst_prefetch(TB_Function* f, TB_Node* addr, int level); - -// x86 Intrinsics -TB_API TB_Node* tb_inst_x86_ldmxcsr(TB_Function* f, TB_Node* a); -TB_API TB_Node* tb_inst_x86_stmxcsr(TB_Function* f); -TB_API TB_Node* tb_inst_x86_sqrt(TB_Function* f, TB_Node* a); -TB_API TB_Node* tb_inst_x86_rsqrt(TB_Function* f, TB_Node* a); - -// Control flow -TB_API TB_Node* tb_inst_syscall(TB_Function* f, TB_DataType dt, TB_Node* syscall_num, size_t param_count, TB_Node** params); -TB_API TB_MultiOutput tb_inst_call(TB_Function* f, TB_FunctionPrototype* proto, TB_Node* target, size_t param_count, TB_Node** params); -TB_API void tb_inst_tailcall(TB_Function* f, TB_FunctionPrototype* proto, TB_Node* target, size_t param_count, TB_Node** params); - -TB_API TB_Node* tb_inst_safepoint(TB_Function* f, TB_Node* poke_site, size_t param_count, TB_Node** params); - -TB_API TB_Node* tb_inst_incomplete_phi(TB_Function* f, TB_DataType dt, TB_Node* region, size_t preds); -TB_API bool tb_inst_add_phi_operand(TB_Function* f, TB_Node* phi, TB_Node* region, TB_Node* val); - -TB_API TB_Node* tb_inst_phi2(TB_Function* f, TB_Node* region, TB_Node* a, TB_Node* b); -TB_API void tb_inst_goto(TB_Function* f, TB_Node* target); -TB_API void tb_inst_if(TB_Function* f, TB_Node* cond, TB_Node* true_case, TB_Node* false_case); -TB_API void tb_inst_branch(TB_Function* f, TB_DataType dt, TB_Node* key, TB_Node* default_case, size_t entry_count, const TB_SwitchEntry* keys); - -TB_API void tb_inst_ret(TB_Function* f, size_t count, TB_Node** values); - -//////////////////////////////// -// Passes -//////////////////////////////// -typedef enum { - // allowed to remove PHIs nodes, this is - // helpful because the default IR building - // will produce tons of useless memory PHIs. - TB_PEEPHOLE_PHI = 1, - - // it's allowed to fold memory operations (store or load elimination) - TB_PEEPHOLE_MEMORY = 2, - - // just do every reduction rule i can provide you - TB_PEEPHOLE_ALL = 7, -} TB_PeepholeFlags; - -// Function analysis, optimizations, and codegen are all part of this -typedef struct TB_Passes TB_Passes; - -// the arena is used to allocate the nodes while passes are being done. -TB_API TB_Passes* tb_pass_enter(TB_Function* f, TB_Arena* arena); -TB_API void tb_pass_exit(TB_Passes* opt); - -// transformation passes: -// peephole: 99% of the optimizer, i'm sea of nodes pilled so i -// break down most optimizations into local rewrites, it's -// incremental and recommended to run after any non-peephole -// pass. -// -// mem2reg: lowers TB_LOCALs into SoN values, this makes more -// data flow analysis possible on the code and allows to codegen -// to place variables into registers. -// -// SROA: splits LOCALs into multiple to allow for more dataflow -// analysis later on. -TB_API void tb_pass_peephole(TB_Passes* opt, TB_PeepholeFlags flags); -TB_API void tb_pass_sroa(TB_Passes* opt); -TB_API bool tb_pass_mem2reg(TB_Passes* opt); -TB_API bool tb_pass_loop(TB_Passes* opt); - -// this just runs the optimizer in the default configuration -TB_API void tb_pass_optimize(TB_Passes* opt); - -// analysis -// print: prints IR in a flattened text form. -TB_API bool tb_pass_print(TB_Passes* opt); -// print-dot: prints IR as DOT -TB_API void tb_pass_print_dot(TB_Passes* opt, TB_PrintCallback callback, void* user_data); - -// codegen -TB_API TB_FunctionOutput* tb_pass_codegen(TB_Passes* opt, bool emit_asm); - -TB_API void tb_pass_kill_node(TB_Passes* opt, TB_Node* n); -TB_API void tb_pass_mark(TB_Passes* opt, TB_Node* n); -TB_API void tb_pass_mark_users(TB_Passes* opt, TB_Node* n); - -//////////////////////////////// -// IR access -//////////////////////////////// -TB_API const char* tb_node_get_name(TB_Node* n); - -TB_API TB_Node* tb_get_parent_region(TB_Node* n); -TB_API bool tb_node_is_constant_non_zero(TB_Node* n); -TB_API bool tb_node_is_constant_zero(TB_Node* n); - -#endif /* TB_CORE_H */ diff --git a/src/tilde/tb.lib b/src/tilde/tb.lib deleted file mode 100644 index 510569b0eb2d5e9bd11f3cb47f140b32f8dadb77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2347218 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

4%>*ww3c_U-OttC+0)el zbnuK3I8C6$fu)<1x34Sc9)Zlf5-jpQ4sIU4-o73_?vNy71TqKB1aBV?XJ=*ETSMm5^p+0!Y&$HUVHVsvp1YQUL$`1rbexq88+QFWX7 z1vt9<`8s+*bfalD^Yrx#2ncY3$)f7@b@27^@d^MX0m!jo_9mc3_b6fN>)_%T;Ns-# z;^zQUQ<0njt^?pP@8jU)JIl3W?DJ}&U`pBmEx_bG$ zy7?na$wN2A+1Jt8*~QxjuA~C(P;yI87atdYFINw^3N!^i4nCe<0sa9V2y2oP!Ici& zCC2V9E^dB4F76J=IpE37U+%lfSc@tB0pUUMgzn82fp7dpWxJ zf;T-QCr4u^{{XK5Pe)$|(9kckjFFqai?5H9r>g^+bU2Z-pF?gbYGyF;boTXh_VROgC{4)(cU<8? zVB+WL>F4X=?of;&lSe z!w4eKHNF8JE}jl)xo8(Wo49#<`8c_ND#Tp0D|gLZ9G#q9{GDAu@l=qQi5eOvuKs@h z9^S424j7r&)ZfM3#oNWl&7rs?zX&z+o4N#eJ9#EpfMyMyJxlYl^T1b0JEL9-YVPCa>E+_+13IQ5FEJPGWDP$SYAa$tdn587UPBX4&P@C8i{_9`BJXp$x_9 z+10_r4|IBq2V^t`TwsF>GdvS8;LxuCg(bLI0v`ATM^W5ZnV;%j>q2;U$VH1(F8k66_QF$ivmk-M*to0F5DLpeBV;NmWB4j#?{o^I~` zp!pt%VT29OFGvN=D8fwv9kK20;pOGy2%4uQ)|B$1Owgq~a8pbIJbisV+}vFqiqXTs z478%m+soC@At$jizZ4~a3_&*t`uTeL`GW8Gb#w#|t%IW&+*$@J21g<|iV+D89L2D> z#I|e;T`5wnWa#1P;OgiBsxiO=zu?4#n%uyN8XVf-UJKX-;6@_YK@iKKi51+%0N;-U znnwV){=vGz$r?<6m4l4{>xQ`+d1(MiPJjhEDDd2!TwML36C_~M!H&k0d%=zY=Mr$X z04oQ(7hGq7WpQO(XI}>=A76hDN6^_*D$tHMI8Q>H56dZ7db!|EJy;wZkKkc-@Qej` z)(|X#=+dlC6MwK?iwSP0BQ8e-}3o7x20@H}o3S$=AWp#n;i-#W}zs3vzB$VnG4uG!^*D3s4wB zDr?YcVvtKfH#8vI0J>5Fw0hd#$JfCbsqhDFth6@;?>nTaUBag`^a>!N)8eEkAEArk}Oq6D1czy!D!fanF6QebItFo4Ta z)B+pqF0cxevItwvKzdmOUNiun;Q*IK&hRjF0v)&N?BwU=2U;HpvdqQL-qhLA$H(3@ zIK&Z@A|c7k1w9G*JNWrII(s|0c{)I@a5Dw(-a~5z1~@o*_<*h`cZ8`b&o9ab-O`Ct ztoVC@E|v=L@N#r_2yu!J0IeJXt-~owwKq-5F9qGB2U;DJXm1MHu7VgvH!${g^>_9H z9S#%}04{A|elv7-c5v}?_Hc6cg-qmwLl_(pcxo4LO#-fZ!O9^j!4)UCCWOQdxQ+z3 zsF8hP=<4j?tcNaJ4x;Jo; zfeA=j1_uP#^|by|fkPT>5;(NLjspiRxWf!~CRhv{8ej={74;zzGyA0agc=MGJjMe1d`rgc0^TJGeQzdV9Kn4{URE1nUQT7u;qATLBIXaA<<< z0Vg4t=|p!pP$~&$2QPmgKVM(p0EhI{JjksJrYZTk_NFC8sbJe-4m5D_bnx@^bMy9f zL#*%1FDS7$OioL;H_5O!HZn5<^)x`GLlJm+pebChvy+3fmz%4LpEGE5CnXiMwlB39 zvdS+bu?(`T5VSM7C_l&EG&Ln1al?(TgPW(Phm(^FXsEit-n1yc1pQoXbI=iLUVfmv z=u>lzicp7@K>LWiT)h2#LE}fD5C_KzBsGAiZosJyoc_Qu2q{y*;R}vsuyTkXIK07u z0%jS3Oap5Ki-C&+NFIci2Z+&sP~qe21v-ZmbXuQ^qa(yBa7hKW0Bj#Pj=`3KO$CdA zZ345v>cBREdU+tb!Py6#U%=|&odlFsD&WKj_9Iv?SS6SXOE}ny8*n`Yu93jyfe$<) zEj)ZZ9bE!E9AMYHf!qO?^>J`=c6AJJb9Qn_$w;pFJx>h1093febQ zkeQbUI+G2nQ2`F1``R7d-Mt)A6N^A?AFRs!9elmr0vz2zXXJu9j93+!IJr4`_<~y) z&Tct5;0y$Jk*R-xkFST5w?AmC8`_jXM4W*|fS-?_ho={0u%!&7pcItKK@3!{nL0Un z`nx;2fLg;Q_8){KEbks1haB=i;_VNeaRG*q!kdco% z>j%o3e*XTx-tN%-58xz@lr_QS9k?I_=NE9T08Y=~C zRIMZT%fS+4S_TV$Ll=Js7to}EGx$OdXulaL6v38&T@LXPxYPr?8f-IIB{)HY12}%bEO03eHVCWc3o2M*X?utuhqpgO{(LledSb zFT`+r)BMsB@a5u2CAq(YQ-Fu7v!|mMOi@NE_*?;$$aVI0@b-6h2>{(W2$BHD7dTWQ zZ2+*hzzGi=yAVNe9D@~syQbh20G0;p25W&R1Pg*ygA*&5z?DCoogMsLK{rCULsrm% zlL0vOg4+aOOCWl|xem++s{w}%*k*7Fha?Q_dtog=UIbxSP#U`XI=BaTIePg(mm7hT zA=p@O5~2<6XaeZ=w?80wgiV4IC{WZz`+GJ25bq~A+SKg){2JoB#@fT zh93S7ey*P0p5ViiLBp~tkggxtCt#<7?Eu>bj&ev60Jr?1K?Y$%^&yrhfxB8@0_;HW zQY^6Z!C?lDS+M!w-WZsLW)tXUcTj}FOD?cQNDhO?w419#fUmp1Bj`wekPaj@ATGl3 zV5`9)4h}D{1UN-Ne1+25L_{D&5^OuX!-=wE1*`z<1#l4Iwg5U14z?WL#x;Ta!xOYw z%g58(6WSrBw?FU|*x=v*`wZ+VaGZj z(ap!z!QP|*RDgnF3WSm5UHrUUeL$zun}Ca0kSqwpR2Vw@f+pqs{k))iC&5t(j$?2_ z1IGy1q2QDS=7N>LvIz1f4{#R&oJhev2Jp}qxcva$^9(ixJOU4H>O%JIAm<|&ZwGfb z{{Sy1H_(7CG|Pf*#F-?(W`f-VE}6hihPw>x2zY7(r#*0%f#x~nQzO7021g3mKCp?9 zm;r0E2aSq@ayFO;_7ZX+8kqUI`a5}hf_9yOdIAP!Rp3Dhcp$sDI=DJHdii^U&mo5n z3W2QyCu6WpV2i>20Vfl1z5+)!KL3CfAWAi`L14dt%QsYyg4KfULvGO^Rf(p)PHx`* z?#}L@(?(Krz~;cc;Oy_<@8Rg=4vOJVrHOVD9AW?dR|9>gix_Qe2r^k_dJVEC3D6U7bB$0=z)u zIVQy=MQGB7uI>(Q&aOV5zP^y*X(AjCRs!q&gFS{Q4?)Qj92==17C2}wKI z8Mv+on+CQ895!HcAqK&`2s#$U-`~&A$=wg)2Lk#)E(1FX;t_D(f@fFE$^mRG*cD(F zIC+AD7?MW7CV^8Am;jpzb|hFe$SxFjdONy!1o(lbBj}eM!6}*)cRD-xc=|hg1o%Sw zL{tk;up7XM9UM5|q=4XpV-*~J;ONFtS~xj6xVXCd1h}|3#K*%9Jpu(YAqtkj!%rwPs&1H3G46RHv%iCHfRk&0zY`=gfI}LRUU3(g;EW0mb#N&Jp6v%GVsN^L6siQ&fD;)w znbZieghu|e@7>e02g0>Xt@C%AVCcte+PFLFV6sHM{kE<$YN{L63~I1 zph0HPY9`bCG<#FX(c9o1`QVlk%mzcy#e|-29=-tqNVBNmo;J92N0ceBWJXS2Fm&~G zaCP?Zb@layqziBv0WOum84z5?feR0?7;5SVM;h2M;Isx#_>i&TV$ z584N73OXbK;#Rn{p}&iVkE@F}Xdwe+H~=mMy6DT(#nssbe4Vz7Z%LB9C0Z_Y@kd*G zV&dxL=jG+)1seQucEgf844m8@JY9W!eY`yaKyw17;5i2q&=P5IhN>zBW%Z&|h%lPz z{tjNw{@!k`pz(arf;!mv9yqoT?sjtU^6_wXcXjr5NY2kIOD!s~2Ok82u`vX+UC!0b z)7Q_-1F{<(Y!GTn0LMSLsskqiaE%3Kfh!3x7o42Hi3OZ;!HEMB%;2;S>X4x{6T#&W zN`CTl2ypUq_x5)6hO88Xc??C7le2@TvyZ=zvy(5vUzvF&`Szw5iytg}oty)lok4f_ zsem$%i!bO}Jn+tcl&omr?B(FTdb@g|!Hw4|sg&V_T$HmLR)yc=*%gx8zA;bx*g=v{Z#U*eV zgidbvVE-@bL?9bq)XxFc{)@DqNF=o4c1wfU}pc zgS|;gQEGBY893VE@=l=JpWVFzT-+TUAV*_^!p#^I@z_(oxvRUUo2w^iSr%xqYdUBZ z6LRh6=iuW8s>hri9qbLE=O%*!96WxGY;AzIhnJg=yPt!-VPZ~6YEfQdNh)Zel0BNr z00$>mS3eg&cTWe{dTZ01%)IQ>B70M!TxHZ zhXh0hEC_DRfP)mw1&1Tp2(W5!FxsoQfVbO&&X zIJrCcx;VOfyLvi0K$f8!gJ)yx(c3Y|$;;K*!O0J_?ZgXGd4Qt<+|UCjG;oBV)+JyS z;Fuw`*#J&3;0_8n*@C+O;GNCjS_qtoz$=HrF%4D+mT&`AAmFY7IPF1F9NgE=UJjm~ zo&nyz-u{TiG4S)YjEq5zIiz(lDCcdN1o(J3`G8i&l;o#?D?qrhCIQ|)-kzYYZbp7N zEcL-;4MC^%xVySK`g(#E|6?R8u(QEkJ#hGeS&;OOy)MO?Wnozl975PLB)GK+b~iYO z!JG-oB%m+@VYrjsTpj%U{k@#sL2G3HwIL5%< zgZUqNB!>!=1{)8~?8LYQ?i&|Z2WMw5Hy1ZQP$LaGgAGoU;L-z}GQnXFPOZck4GJuH zL5kAS0VhmwiUr3j0dJyYE`JAScV}-8@CB!ij$o&ux&@pxzzzkoz!o5?3|N>!PuPO* zPyxA>bi**qIwIp57U~AZPTs!G0e-%qn~%W(3zIQ)@pbTbb$4-e^Ms68gS`ZfRxIT# z!h_&42HfZb8wd72xCR9$YOn;@5U?yPG$8Ak;c*2{LEuIMOabyT58S39N0f`JgO{g^ zySJkcWCdaoD1^a&0H-9dgTYP$y9PB1!EPfmBtgcKot!{*ft#m~r=PpOlLKf53UWkX zZf0?AVhQR#HqZ!^myd^sm$M^iS(2k8*e_tmlM)}``UU%-H%ejxn+XmFP%Z2TN$B9* z2q~AqQ3Q`Ll*|QQ=mJ&>u9d-24t8uYENvOMdN??_`8zwigZhu4rSHb}rkUXTqG9VM zQ|wKl+x|^cN>d^IB)E1bHwSl5XHS37^|85$1@@+?c_l@apzE_s>`l|aYpB7!3&i9M zX!Bfvmyf%n6SS;EBqDGw1rtcg0lW?hTo!{p0uD7W7o48Ks=*TA)D8(Durw$&z?=zc zmHB%4fd;-HB^tO<1WVD_l04DPHgpGoV*?z<-~<7VH*kUnCt`?|U>UF%!O{>x@E96c z5FAZlHQ=a6)N0O%74*(N4n96EK7Ot~;B|SXMWETbQjke*KKVr{sYRK2>7XE`a`j<``6 zWSa-7W6Yd9o&9}Wz~gr=zMx$hZcq!6Ei&KjB2+jBcsl#~fi^5x zf;T6E!Udcz;Yuu=y_{Wr-8}srk}@G@B!CkPT;9aV$;HhFwAmiK%?UKKi>kmfz}4Hu z*TvJ>A-T8&)cgY3fxh=I;_UC`0_p>RVi$BqC0c-+I(hm!x%jy_J0#_R zhH8=H%-GG*(a}G^%h#a@Z5M}`yQ_!4pR=oX&~zJ;$)Igr;J6~vMC8KBz{JbXIl$Z7*~uZfqzGJ4!!0!S^z!j^ z0-Xk(n+h&z;4&tjeol@)o&nCFfgW%%0+%xKaP;@|^7aJvrk&lu#VcIS)W=uPWPp!{o12fP2k0ag z6i1l)c)0tzc{uw)WYE_U8~b?sczS?#NE53@pkp`atH05&&@}jFEcRr^>y-ha{*<({JfGP)DsFoy&G?DCm(-z7s!}1 zIABm4J>XCTR|Q}K+@lA#lE4uLD&#@K6QBf&M1zY7aQ6*da)JqP2LU{=0In>-EU*}u z08eRwI}+f21#)m2n)`Wp`Fs2NKpLFj^aZYE!7Vmql?HwezAj!~ULL+q4%w+id8s+Z zM)oEtXvf?5IJo-;_&7UzdOCoXU}IBa>EYt;>*VJc;EZgT2C44Be6TOUf?yV6KpQk2;N;`$9GVcXskp)S-GCPD`S=8YPF{kPG++(j_A)r3gBM$& z8V)uH+?WQd1qT_-eb|abaDqS#Fktl_Qo{n2E4>^&e7(J0A*&t0{-CN8z>WcjFu1q| zr*3f3>;cL$APmbk28Lcfo&hc{ph+5Va)wJdxj6(ldjxp7fJYYL^M2sj6%`j>drNyu zdsEk-Apanw<1$dZ>F(g=>*3?*<^~yL0|zVl2^kz^h-n^S<7tABt8cqS2i4RKOYY9hEwg$E{R zL5*L4pQj6W1CuFerWD&*eomeaUf%8j-o9?$VADYDX?s(|)+yM)G02@bDiL!pM?Vi2 zA2-k*dVACKe9+7sii1s^JiHy=w!>IRzJG6knoaFqz^x_~=VNXGg* zxVyT#J9&FUVhyAi*6u`CYV7Ch=H}}U+6fOb6m*IYQYtqvbMp1|_x5uJ$5%;FA~=D; zePKP#GHuCoK@NjkYhE78xOBo0FIy?EfJNY<3;~!bl+{f9= z-QNqeMAj4>CSacygYpB~1iGoKv!ic-E9fL`u=7F523&c<-RSG!g)rF0;p~1 z#v%otnVXw;fTOdA2lN;X%pG?o-p;;Wt^uI4iwr;s5OHL;IypIbxVrkf`G9WuGPPIn@Ub^V$xWCE#LvOm z(c9b6(a8lR4T19>rfNfHS04|5Zy(TDD5(FBlonl`9DICTJ)Hdf5VJ@5psm&5TQ0$y zt4+*IL8BP3NhElXS^Bs*c{{p*cI$wBSq3_^4U~I8Sp?*FWIq~ux;VOd`+E5}fLnfW zLrguq1NZE`VlZWIq`Bc?G!p`+^1* zoZY~Kfp9Y{eSACvyxqVn@xVcV&m2>KM?Y70M^Jg8;_O*ffj*37>hI_4>gWtQW=F-@ z6Lj(?YJp?s>F4U<=nZOKI=g|YIP@VSLnn8K0B0{BSAXcyz2HI>+*AcO0KicIW`PP9 za6bXuk_4B8pp`D*Dh4vZiWC5#6O=t&{an03o8myV8a89WjWKY`5ZodFmjzU9n+1Su z2Dih&9b*s=77d1`Uf$0Bz5&o{JHd?&FoCSdz{SPE$Hm>lJ;28gDbYbj!cD>F^I0aP zrh(4lvjp8M3|ViL3$w$(&C$Wx$II6%z}W{a%Ybgd&dsb!Edt+lWMK(ElK`&Q+1tU( z)73k`+ttaz7dCHUnv_~no(gIyq@W7rH%RESNN_ZRl|%Zn;1LFJ^A9}W1*$Y1 z9l@y!Ih;XvX1KX|xp;z_#wyTTN5S0-aGC(8L7FEPa2p;xc7kNoPc(+yJynocl$uv!Z(5#Nl3{NOn`;7{9e}u{(cdA!!{6J{33@I)q(=nKLf|n> zP=-S38DnHD0~0@IcUM1GcUOmu(hTrm1d_`@Jup`{CqGAb7f>yOyjKa_IR!WD!O;PU z1A;a~6=3Ts+C%Rz0-FTx6@pnXC&8pq;@R2X!PCpf&C?q^dq7Et8!fegODJ#>1G5l& z1He9pBs;LbQJmxA>fq+?;p`5XFN5BhiKPSrhaEU6!wW%hKM%DK1P{`IJAvR{DwqJ5 zJK*jhIAwuTGMEc4M8SrD)qxWqSPX0mvMWJHns~aodAa+$xHz~aX6ArW6sW6Fl$x7g zmI|7k%d@vkt;j4c0Vlsw#B`vckDId-=!9nnNC?0(xIut}r;ERbv#Y1KLqTbAMtovU zPJCW|N-8+d!Bx3~7FxUex_~c`RzWRDOoM~`9YGf^=cQ$)+na)?Ra1-YO_M;^QNv6C z%?|oH1qAql4hjbO30yLeRgi$|P;jJ!TXx_I1L7%YszX%dpiaNHn}@HHj~}QNgLPO1 ztRL(eh#_Dm`Qs4aXhy^)$gA)$aB_8Uad!1`b#($wWI?ke#L>{)g>9e%91~zwkU=lx zOz!6F;N{`t?&$}afd?xEr*lXON11O1X9sZE2`-w!`4sF~urAOH3COWvRq$O}Cnh52wYfzT>(z_;HU$u z14jwIk_a=&xVSsGdH6Z|`nZGUk)U^ygZ%-v9&8nu1v3^jIS4y^3tZ>JB#<}Of?Y!$ z-yo-NXMcwPPe(WKp?uKo9blWlnHC%w;PEAFEhI?WNugjhRo-HZKk`6ptU--HZ!<*BH$o+r2@LQ+TYK^-PsvZ=uqYx zBCJNvj+WkTex6Rw;AIEUHVfGPTu|x*XFL!C?p8N{2Um{(A2(Nb$UF-;;=xve^DMaB z0Vj4a7hDK}3tjM7BiJ}_J_gHzCBW@HFc)kTSRGgbGG^xJ2sRv?r@)3IT7?MHPy-sQ z0&E1B$cDMyz{1ySJxffS)`32n~qxjKty$v=%sMGqauTzJ$#*<9DN;<%RpmrkRx!xVGdVh>FVm`13C@@q6BnK zFRB6~FVHOkMc}Z7>vHmP@b_}|_7Cv%Lph_j2y}yzDcJ4ckvLET4m@ED(+O(+JG;2L zIr)1-TB_iv1RD++9ROPnj(BkK4iQAu@?e$VD29|C;C2XDC3q<$q~#9gqohSwM+a|j zH+TO4@TeIy@q$wYSS{EQ;4}jcK`fO8*hOFsh%^J%3eEx8^n(*BSP9rnu$#dKgB8OI zc*qPpxO@OB2Ac=Y3@9FO@dVvS=L5Pn6?}*UWDo$X4ZgS?Wq~uSuMMs!!1jVe7VHeL z@n8b%G_c>mt^#`y9M}-|frA9B87vJE1T)d=O=!m-)y=LB{;ocbzOJsI;ZqWJ${^ef zp2h<^0PIq5mIreoP63w)hzJ3P9oTsgX)u#0m-;%mxVm^aIf14`R2&__=AsrAV6(s$ zKoTA_=&|+Fz(oOg4j7yUDA~6GuGzpHBycqkHVP$--Mk(AT|xH*fH!E85XN9ff=3s? zhJsm;&0~g4juskeolVQ-VX8c z>7|K9De-BUDaG;0`K4%gpgDnVkN5O*^m1`TRf<{4`#X60c>DP}`}reO<|L+rgBD@6 zvxA?9Pk@)Jn-^SFW?~68o1Go}eS8BvLD!bS90^j1X)$O#-^<;{$;Aobot*r<^sL+h zZ05Q<__{gyIC?lDd<0XC#cU@BA7?jzU-tk|pr_^~=OmV;#wX{4$AD1kIClqE{{S~9 zZ!d(gsTm-ZSUu?it|X;Y-LAG;PjqK2F}CMVz3mm7s;$ritl^ znR%ccte~U}s+B;S>yUN%J9zl}d3ihgx$>XQI{hW*+|T-cF8wt`70>nYjhv z;sl;j%>7(J2i?0mIzYC%f(viBtdom_i>tS*ho7q#XlrIFXhr~bY5}-@Ms`eqLx887 zuWNvpC(>z!@I$!ZW}11qdpi4igHCcaDN4=B2Ul2dSziZtchLDSPN2>jc&j+tMcTEfoK&LRH$~yb``g?$`$~MUaZPY+6@Ibf9xVgKygLb|mjtN6@ zgSVfvyPvOzgS)dmYzH-J2D5bYa`g4{c5`%yFUcv6FD*u!j&^c(@b`6f_Hpy}c8CYf z=YW!ET4p*Hl}-*mj-LKLZmzya!3IfxsCI%54-W8k^8sB*1Dk8HH?_wSh)#|U?!Nvm zUT%Ia=qFgB8tLrh;OFe??djz12%7uOPX?VWZ3?s86ugHIs3YL_&Opb6>u?BY!5A+Ks(`c z^HWN5PzwP=7e@y-e}5NW4{ylIN^rnJJcm83z(I``2jIv7hX6R_!2trU$-!b^S#TW= zmIdc)aE%CVE+W(+=R`v{X9qtYH@5&67f4GU9Q9zWU^Bs5!D8U}2OA8w2W&T33~U8h z2Ur#yRba;>=4$Zy6Kn=*D-G;xu%%#gz%B=yjbt-C8qK`D+}xcUo!lJaG4D%tc6IRa zarATb4)Am+Ng^S2fL4%txH|fJ`?*0@zkx#o+;4$&X29MAy9exbh#=T62seYgdo*fF>u3GkUCc~CPz0+3T6;~}S0 zfdmQ?i$P7Ol+^UpJTM>i3@nfkWq$s}{l$;t5sxU!91x5KK`JjD+ zNWO$y00}&hGMLA6a`Kar_{FIu@u2=ck`Txam=N3`kUF?cAjRM#ioug{AYOcKVs>hL zK~a7dhzHjNG73c(q_-cRn356?xk(tL97z!BN^p^dB!%z>R4vFkpvwgl)4{eBDKjr6zMur0vZ09(Gj7o`@b7L|e3fVj!|xw#NKK|GL03i83u1#^oMlVJMNQ^78S3CCwbB@C0| zL;Zps-CUu36Ewad%mgDC!vxF#I|?ERW8T|URr#eQ z5H%o&Rizez3!?nelH!u0_`K2_RJTC|p)LjSP@E3)cQKN#_}moJ;!<$I0AB4IpO%@L zlM)Y$ZE%1k78hscrNAl9Hm#r1-MLqD;_uAIN&pbb5Rys0hp}E=kNQ0p%a8;(7Ub@vxx7 z&;*k}x2ZTezW|(yzzzaA4^-}f%!h;tXeA0#NdQ&_3WwB+%#wIy@kc zW@rur^P$&dqsW8rdj^Tb7gvB&CRim{)Yu3lj^LY_pz=XiZX-krkhCKkRfQxD-CPOM z1o9oI>;NZ$c+eV3kSN$PkoTaMv%tkb%F)G;7KFpqffE;aDLGsSw7wY5L6mNwyT0MV zpdJI91G&l@nVVbyu5G}s%T3LN#U+?unwf_Px1{`hq|}8hQ(OYt`wKS|~dGQ0A%|(oST=A+$>WwmavoSY#3ZO_T4HHV z3AFD5Dln50lff-Pa1{`7?QrA?Q+PlVm#z>W{^F}`DtnKkjqja{W*{zR59eLV_3ft9B}ba zF>p@=GI#>g05K2J+erou*dhr+`jqi-;f&Org480YozNR!z{+#d%uMo=vY;|Zu1QSJ z$j1-`ca_UBQ_JI_i6y@%HxZnAp^ix^O-oBHiZ98BcL`A?Kp_mW7g`}_mO%0o5;s0C z71E4>hDUa0PEI^T9;6Z4e<>+S%qz|IsgfbREH56k&H&5+=}9aC*LmPV zCnq1$u?2I$2?-QLU|ufd%0dJ`u_zlfNDgrrSP3|BgGxUXMGT@kkH@MZX{S|P5 z0_e?dZ~;(H2*d%GU*O{c<3U?E(1c*cOL7jVo0(P#&As662f9-5VVDrXlvHrRl2n?R zlagA5lw3h+97QT6AJVA7kN~wL;MFWvS#XktlsQ=C6N}R0K?lWRbrQ(tLt}paEJ?!JGkFfdU`@EUqjrNzIK< ztw>ES1=!Q(6 zA>0cMAW%OVT@cKNx*VbmECL!yCZEn3GwB8i>%@T+nb+ zF*vSJ1Yq;T3Jq+<>P!?E2QEFn2gK=7#0Wx5SkFUthbwCyZu}w^kL6m`s zF@%OHg9(G>3=H7XFg`>2XrCpKyNSR{ z$HB|gz*8!a*%mZG@GKH|!V)}71D?bIPc(s9;CUy|G(Xleh4P}yScc!IV7imZ`DS~xH@|HJNh{~IV2Z?C*$BUMjjq+9^U@ojjy1ygFzUv zoyNe}*%7p<-Ph5fGzGk~0It!*&&kWp1$0$;W?l*EkruuVu6`bl?w~_1VS@vCCEzfG z>$da;Imp@B*#V{kJn@T=2OY`e;^OWCmj^EZM96zNyL!4idOO19QC(;3f|5b6#%+}88oL3o@j$4H3MUBXJ1E8U&jE4;!^PZ z9^4tm&i+2mE&%~v4i)I8d3ic{x_No}I3(wSCvuVWfI`mC&Cww@AH0?kE@R>z;O6QM zI)ywpzYLt*5K_*r?mpm6)Ws$FXj1+zE!z74n?SER~Z<) zIynaT1$g;66rnrZ+0)0*%gNi>p*RCP2MKqBae!}tueU$wP`nKAY$cKm=xAiO0B46{ z(B^KWKs9l8^>T4`arSTkHJee>v74)xue-myr$b66S~xg+_<6dyxVbrGqDvWj`g*!~ zf)0zzEk$#kw~uFlj~D2;D9}-fNNzCp@p5!^^Ye3c$V~)icDTDu-F#i#yd6D!97>b( zbHVu?E@$HE>FDj|=IiMI8l^&Uxv7Vjqoa3#kFNuG1PfKp$;scz6|}M_H@^(^$~6O1 zCw~`556=J>P|O#jI>p$_&&SEd$HUDbClxiT7`uA~xVyQzcsk_eqopKV=gbq?&0C*8Q|;&-v5WAK`Vqo10JZF z{N0=!o!lLr9J0`ox=BEQual3jlcPf>dUTn3IC{G{xq|aYei>?+Waj1Nqw zoE?4Ly&xLF1vfk;n7MnqdIq>T`hg{rP$fgDd|>gweOaVl!o zH1i1X_4e`dfjSjc($vQf!1Mb`5F< zF?09zbaC$P?Ca~{<>BZD)`l+U=I7_`@9qVXLyJHYZ&z0@#{h44kQ{3KnfUqo z_<00)fE|ezLoSYP0nW~T5J#fQnFM%vfsSPWn}`-aPCg#a9!^eRhoHrsiIbDRhli8D z56B^?QD^Gx;^gk_>*)-VLW?<5=Kxn1S5Qq^oLYhwaV7!IPA=Y_&W>PxD4EvC+r!Jp zDZs^g&*~QJ>$;ICx3pK`!y#lEHAam69Q|Ef{at+>vhvVnyaGU1x_CNdp~aMui-$7iSMQUl)fgw74<$b8+|Z0^P8gg%&eL?g6gOUTz*f4q2%A$;i{u z-^JU-&B+1npiLuB7k3X250?OkWK`>oJl&l=-JN{A9a7LGoV`Kk0eCtjp-LFLczb%f zySRHh6c?b$_&GcKxw&{bIwYaXID2^n1o(KlITUB2>G5~O@AK(_? z^U3?vi3=Pnw99_JdTXA14=o zKZha<@O}$;nQrXn>gwg;<>&2CWQi(c;sdhZ-`NusJLpm#o&m0|P5}-@hKA@;ZoXat zpkw%o42{sGTpfM996g*sv4bw<=||@9XOViXBubV-H^+M-Mj_ zABR-5=rQ&PaB=l^a&vP?MT;L}4{r}29}hoAhg7r(GWPHfa0hRkPDP6$V{ac{A5Twb zKZjJbC^GhOcMfoMa`$#fMT;Y27e`+oXD1gohg7skGIsXzcJ^}h1-Sq%mRwxjUEQ2L z0vw7gP@8eaE^glLE}pKQ4n>xzGA4c=-p=lzEl@><2Ix}m?v9Rbo_?TMLYH!NcK7k| z1BJH{x|Ey0tDloUD7=l)r5wF|d_COVL9v7`<>c<=?dJxHTT@giV;?6EelhaB(O?k0l=uA2&bG0C$HX^jPw7aq$G*oaRu39!u`-j&A-Qjy?`W=&|JC z*3|==no1u)K0IlpNAW$I|VM~Q1yV;d3!s% zgChu4#?uK@(|Utq6+Gwxcbc)6r<0qbn?I;v1dl<$WsLk?Jp`;-Li`w@$@dF4I*T>3N;i=0vw$kUEN$0#$e0@9| zk}A>K-zKgep8md00d5ZE`9-L?-PGH~(Z|o*(ZeAHQ!c>K$tR5JWA%23ND-$OL;D>j)sO;XM~$2WM9=FL&4hPT&d{ z+!6&_4IbkICvw!K>R@HyHa55k3Sa1sv>_BMTM9}?V3WW@fRLr%;A8?j9tvy&SS>hw z!R=Nd7Gx(PS-ZJ7JGlh-`Z{D5 zqaLCNzDC>6)6Ego?*!=qyA#|lf&?Mh1>iv;up=RYSOXgpx=<3Fn!ycVuxIi>MuS;k zqrg4_n+NtKm<3i0(G3Y}BySpecslsI__(AL{1l z?d|H2RhnC154ociY%N@kv%7~c{i-)sANn%lYYKgsRPGVAOj=gDlB6tH3C}lvV zHNbm=Opp%D_H=geaP#r^_ws}sNdVek2a2x}5CINGu)o1U26h@)0+!sNCnA806L9$k z4mofE3FhJ_U|aamOvAbn8f-0A_rSx!4|K1+hljtTlS4{oF?_iM$RltyCSKm|Zq5PD zpuz>TyWJS=eo}I-kuw;*WCs++;K%_Ni;(yPrxtL21IHaW8G*ATL>epu&RAe+h#*eI?;pz;N23L!4!(BWboPB*fJ$zl<93V>%LFc@sg5Q%UWCey z0H2Bg4he|W;MxOz>w^mDb}867Wt7+q^Ns;%zo)CakFSTLheL?Ji$7?eXbz~J1Rc6k zVsBbpS^(a2j@;&O^>^@aaq)NafL;L)PF&yw3yuMBLV<-l=ookKF}h$sK}5k7AB2hj zfDdpGfFlDuCk$pGALIZop}+|moV39u6jH2%odiyWV0S@m1iP*j=6^#cXNLfHZ+~BR zCrA|!4pgujBt5X!C_EE_V+G<3q<}GSc5`s@bN2LgcXBAs$S=)FffO1UiDjwwrb*y~ zY(Z_&Oz^^p6r_fRyRUD52=H=3hY4q zfeZE|IQt_?B5;6$g8&?C_Ta_}Qb2%}g99Aw9I#6uj!1%ssI$L=pNF@Pzn?4U7-p>J zvVm=Y7)vnYVoN~abU|vybso5*!(6=`T)aGee7qbXbuqYj0>>pd=)uS0f};a=BpoCY zRUkK!K>`?2$s_L_2j?pAnKIyl3rxV&L(2-3GJ~Ma;F=bGG$t$=fx{Y+`eAWx;Oyw& za6rNe4{%aN&%(Ix2}O<|XKzrOZ?GIC?CR~{1x5djv1#0Iz_gOCPm0Y@OX-m{0@G!HHnzE+_+3m&B?L7ka21RbB@;^yP%<_lRt2OdNLy9rzpf)f!qM!}u}x1=GC zg(n@bbI@Fk@Ha{_a&vWXcL{Lu@B`hMqXIoE4(tM462PFd7K2Lko)H2Xj5}=(c_NMuH z_NKw`aP)R{aC7zXbo6$FqzZ5(gB=6Oa40o7*xleb0cS~Y`T%DMaIVGWA#er-=NGUt zu;JiH0(%!+@_?fY=4T?>0N}*p1owoCyMw2XtFMy>=2iys$S7afFeO_>gyf= z8ZdzDL$o&q?Z`xS8|btqrvNuEe=pD#QB*Dvz`+krxsW&j_v0}$yNkbrD`*bR6Lb$9 z?7VKUUWhi7f)!jWfy)zcz5uhpV>@YXCXKJ;2%56Leo&y1gmJTqEf6WEVFNA2%OANF@XI z5S7Yju#dsf0j^>Y6$`jx0u$gO92}guN@izA2Y)X&FK-`DNP8RXKycWDt30sru&{^Z zQ^b$}DB&Tp5?a#$oQonrNb#QX_aB=l?a|GRf2ReGw1$w;{(Po0~fJE`Qp{uK}m!q4fw*%S?o293(kC&IL zKjh9w*zKprM!Ary?@$ae_Vjjl_4IQEo&64)tpm3);qEqfb#nFf_xEszT;!DkZVI~< zgMt^S$z63XFPBr0ZyLa^bIB;{)40&^kHYPCa|U8k_GH|FqcHL@wMMWVE!=( zaPV{Y^z!y|ase$l%`CwYXaNp>p5D%GpcU7k{mwYb7DFd*2RCOIKUY`i-7mQP0!{|- zz9CB4h#sU!r5vbma`N)a0LfHIEcVn!6617_yq?bB*0M$Sg;DPBv>oB zECOo<7f9g32V4w++st4kVAJ8T1}V_NUchMI8#=ipp6Lr z{vavT0?)+9(bLVx**gFvg|;Zm#ly+Z+uz+0Bn2MEM;Per@8}L%4F!?{M;~0u)XUGw z*~7^b>@W01S)Q(rUapS5V2`0M%JL3yc6D-b1cxH}qAVYGmjGvHS4c3ThKOl^mxsTP zt0&lR=!>%aLHp_4e8HYGL=6*TA74*5KM!{&hag9Ay#n`vu@7i5Bkb{Tck=dkadC7Aazc{{a18MG zba4-G2nq(*hzLFYUS1w9?q1#wK`y8=MjoC{Uha;*o(@5%ab@K0R_4m7LGGVXC+U(O+_M zaq#l=@pSfgb3>2o;^NHoJbP2n9fOddL8=!Gd>s5de0^M8T)|gZt2ldlc>0C7x?pL2 zI=MKw1-SS)c|vafRskLH?&;&|Vs8r40`fAbl?J-~7o`w4bar*{@NoC@aq@vo4x$A! zI84ET0#5wkkOYS*YO4jT0<0Ds{vhi>H6-TDFtX=BcL6whI|ul?f%nB^f=_J(oz9Y6 z0!kN1N)2879ekXeU7g&KJL2HT1V=TP1+Ig^&IdaXOu!t1t-kTmzYl1;J722u?wUkYvX$q1Ypee)6C&(!P zksbpaTwMK}eL&4`aB{?J9_Unk--Tb`VK)c)%^YZdR zi!UHayF3GYzYf?@s3*D`dN?}x`+GP!27tOJD#*9TfeTF{gA^Q^;MfDl890Q&`oSR# zo{<2HL0aPAYzl8-f_ad#70k4Ujcdbbm?(I97M!ucX&4;ud9d&_boF&`a&+E zuvTzB18a?k`@+N1!3DH!#0zwNJlWBK(;~3%QKtF8E+NGeVE2P#0jvug5@iVYJ30jT zf;N_bFGMFdISrWmL3hV`dpo(fgSL2OK&AlfP0PWT#+HDpaZsI}Xb;QY#X0#U_9k%8 zd%8O~xx0f};h-)xbaD)wE5M-y&Kh6>mZb1?1i>{XxMu=h0}0Ur&Ocy52p=p3PC^hq zI5xrZ;K+dpf=vQP8@O0RQVte`C_-F<;1=NE=i%n<;qT#z==z(24nPErSiuW9Q^*1( zd(*tsveY7bQ^fimCuh*Da{f-v(91o+u?e;noZ=z&p=N(@Mg!MsD0Q}pi@S%Dv#W=T zLwRBjxD%~fTvG@FX+|?kREUdgS`(<;}Gvd@;&s14TK7Cp#)CC;Gn|Qm&DSx z0J{@p9o!vG-VQE~0Rb)npmH3RVc}lHVg#Bqz{7XocmTT_984${xOzG`yEyu|2Y5iP zl>oaN>^<aM}VZ1gBB3LR6!`R)bR$ zI4-~@gIxmVfsRf{QJo&|7U&F%Cz|zAfz|q6mCjg=V zbo>IU0%Lz)M-R|CABW^Ju!V4~=3ZXDUVfmhbkIY2k;Bfw)XUQ?Ai&$l&!H%#q!{dc zxK3j~FK;hL7heZZMTuO~8@oICJG;4hcsk^zf)gx4i?g>UXw#aDLsBs~q!BW%&fb2` zPVNp##o(}oOPKh$dAWM|f(|=L&OkNI#Kq6sI{>s`qyqiC6*CVPcPB6J03Xn3S#bqw zV3@hO`nh`e`UgNH!9@VvJ~MxJFF!XACy-nfx<(f-KVKIYcQ=S6szy^EM<>wvGCrUn zM%%+@;^XAw=;`k21d>Aye`iOB02fEc0M`IN2jts9z=PM|TUS7*oPma}(m~S^&~toX z&NT$xXYB0a?d%A>HxX<&*t?JkLU0lThbTDmAcElJ1uiVWLm*fM5s49;z`>agY&e(z zr&6%7kW2th)5s|Y)C2YNarbfo1v5wjtPMPOfXGGgT#mH%0Nh3a4?=<0)PeIqcq|(% z23|`9>ivO?1iJ~X!~#1TY!|pl0EYxpZUnXc!B^fRjljA(I=K6L`ve5|xjB@e%pZX! zkxY{9jSVdf%|WYjK_^@mflkPT1;2r_uYan4C(`c+Kr%I5O^Vk zy=hv05qO3TuG7`g!P&#x(a+7z52vk0mRM~ybaQub@eJ?{@Ctw|Sb;|a|-bHb$5XbKZA=?a8%-RGdOL4 z7e|7l9z1vi9>4*oZ?G6xNhB!6fQN~|(}-XRur{y+SP57HW*4@W1r`@UJO>})gnP!# z*}>b>+uH|p#0SV`a8#iB9PBk*IRc#SQDY|zWDa;92i(90`@kI}2KE(rHX5Jf!C8SE z7r^{v;N-gOjg^i?@?MXeJ9Z@Bvx&MPi^pk`3X6PePzzt0qwM0l4)Bu9gt} zNEc@Ze-~#DUl(7hf&1s+5+B?g0N1Q&1Xvc0 zfVmN78aCg8wGeG8%pV4z2~%f(A5Rwtdy}Lj(8v#HBnVuN!__#sIJi4G`gnpbZ3m6| z7}^_xoB|ryGX>R_ptGeR0x4)ys20vn9v&|KpbG>|?M+>Sg8YNfR2X^td3dgOEb>+Izo;EFEbbMIc8a z8*1d{?BwI;?dRlB3~r~veQD(8;pOS(@9N=D46bvKBpluR++96A9SYEOxcT|}J39G0 z6rk!b1kLFBdU=EAvr#Pfc6Imj@$>a@0BxZ|@sOdvhr5@%7ib7v1vK@K&_vaCLX{0`=%Xp=t^nl7XwR@b_}|b9Hlc2MsoY#-u>ba4Uw~ zDTv_`cSmnGUq^p06vb$+^$+lOb8&M8tAULjq6C|%tEa!ale;76K4ND#(4b~c4mcOU z9cAq03c5wq8??9sq5?%8v^w9}#ogD##}l%95nL)jN*-{>864-}Mi`;iJfv9;CBb^Z zZ7*;^04__wMuQ2k1lUlBax86mR|hX2CvQJbKgeBtU>&IC6S!>&ZsdTS3swOZ13MWO zJ7Am9*TrKmkHAGExFEq#Kw_XIDIRp$M+)c^dhl8EAYN`>YHogBCipCN5Wgrj9e&>h zh!48d2`&&{VP*n8pdWO59PEr+S{`-_JL?wZ)LY2epP&f|FDDm&FDGYE0*7w>2iH>I z2m}*gF1RYO2Ty;4qYWGb;2;Nc!Bq>G3yu(QbmNL-b9WC%PcP6BY@i?oXKS!}NXkIY zm(ETO&Ypf=u70jA4&WOcK;wGF8O5n3#h^(b#6pvzRM34%pmjosC9)o#4n6?^0nToY zpiJQC2zDpfiKqz*>=SSb0ux~0f)hPh0_-xd7{qzt$_(CWKxtBeThidZB)HiOCP1YT zxQPO8Kf}k%p{6*4`=DTZz@~%44jj^8F{Dj{&W;YAuC8A0zMhaxD_{qLodu2}FahR* zbwm2u1k`|gU*hA!R?z8?O5zP`So`)?f`!SMt429l@1K?%-hRUiYvZilJE zR#$_)gw>lU{Ymgx2UsmQ=)uN0X16d%8;VuVV3G3|d>H(U<2T8zMCtwr7 zx?#>kE(q*ZJir}PaOMXWlHj%pVss6hDu`)}AlZYQh)rERJbhdOygVF2f*hT}T|bzU z4NSfLecaq#T^t=;T%AI}X#_53;^gY+;uGNR>)`3<26iGs%FD^q)yLPx)gjz52%PNT zQl`F6F0SrA&fX4?b_a?}ynNhTeZ2ev9NZj39Klfu*XQKy;Nu?P=<68(st}yrB0-tN z*)11Bfv2;a-8>*G%X}dec!LMR0B;8;XKxpGUsorG5b*K!C|bd*(O`@HKrOCfh#{bc z7dSV-4Z^u#&cff(Bf!he57e*2?-pk-2X7}w9~XBYJWc`C(2&K4DvRE)C(sxzOuFV5&ivIU=#a+CavE?hJri z0~Y{YV~V&e2wcLWb4&9Qb28KOQd6K3c{$)qK0xMy{ZNtwx!WfmbTF;<(Hub5aNaiNI)aqsQ?i`RSr6?J~JJBH5EjfhPf!Og?hIlu?f&H!r#*SGngDiy31T<3#pMTD84k`vUh?t(ao^*_jL4e11;7qE=d7h8;GvJ z!q?Ts-NV(z9b`sIY8r-ofSbFgub00cNIo;K1YO?O!Qb26)6ErhMx%up_VDs`@OJia zbMy4}1f7zIrUsOb;^Q+xw{#a9fRhA_XNbZxLg5*s@Jvv6rYJl!6rMQ>&jN*KiNZ5P za}26$3{jn9i0YpBqWt_41_sD=WySHi#bwEQ`T7b53J3sULr60d6R?DlsfD32n3cel z(#FfMc0pz8=|~2K7zPN?17ExiVS~uO{0s~-ObiT?LLeRkLofpag91Z9f?i5uNg_lD zPKJxZnP7$kgTVp4q~c;Q2S%{K7znz7A>e>s1*(A@j0_A|%yZC#+#U|sY{J065HAMj zf*B413K;677#J8P6QPcafq`Ky5$ZS?7#Ow_p^lA#fnh&3b>IsGRY1WBc5{F#1H(}< z1_n_ZFqZ-3e+LEwCq0O|5Qr!P!wX&phEz8g4?=_06`+P+4K#5=jBZz0f z(BYz@&fhA}z`)?q%L~%#(F=}$#~o)G7#LoFL<|pr6m_|%sC#t#sAw1-*u}`e!0>^8 zqagp3gUvq}_**4F+Phs;4E|pLE7`%sz`)SX_)>*|f#D^{2#;h{Pr7s- z!cZcCme4TMHNU(I12{e7b}u}^8eYPlIVN~Czwz+tbWy=lNPyxEQbh2#@PIttT%!WY z1<)Mm0?vUTMLyji{oSBK29yH8Hg&qFxOBUyxOg-l@j#2;2#|dNphC$5xvNRuH>~v(Y{r~^JJ%6hYSi(gGVjZa5fdml5>5!7f0a4OGlwm{*nw_9{LJGy^ z8WkHx{#IXDl>tgsod-dsp^u6M*yWN)t`I;f{$5`E|NlSODd6OSVXu!0Bsp}4sF)ZY z*vSlvonH+6t_MAuk3<~ClK(?gG(bsH0hE3e7!b){gMlBlK#&2u2&BB*M@0dg2Ej=T zmWJWA5OVzkGMb3;O^*?|`h}KnJ}L%~kcX6Bp!^G}&rqs&R3|2Zd|RVpz`)<)0%bDs zw^%}%jQlNnP$mn13#dwHu2C^y<8J|FY!H)`zXh7%AyqCcD?w{%43C0B6H9rHy*wpo z7|4GfprXP89B82U0C@ywaa6#-z+iZw^B_19JUU%eG(gG1!lRqPgBiqui1?@&fE9of zl_|Ow1&|gE4{H|{1%7ag=(vlD3n{r(P~uhq zD+a}s#$kT>29RR>?HM_6a`I7u25#q}9UyxRPd0;7E2!i_N>D_YM^yM`fXd?tP#_0@ zTSz)IuOt4j$bcpdc{t z=yu?MI058dux%iD1F(7jFMz5Huwb`~iVmcPL(1RK$b&??NAnwKQ35I;AX(S&0Jv!j ztG@+6LC@jQ$)n=Y&7uNIcO0;~#-sU&07m(w0cu=AtoKn-0W%GMIpGs%i)p9@Pe6v z!K0G}+#2WTcHr3Q;Ka``^ZQRwV~j<`Bl)BU;|WMG!{P(n6oN)tbB&4uB8fvvz#Ik! z28iV#Gh9>@Iypco71XZ+m8u@y;Of9dMWLGm>{L+TwSfAqpa4?n=78u06`bJUlZDlH z5NQE$*9ny6|MR;ZM9cEv{*eSYy>$AhupDOrcVC)qR2=wwLFJf7GLMP}Bwu+Pe8>X! z8mJ%B3d(9PL8Sq>p6_N+0oCp-DlZTI|NkGX9ad+EfGW?I)(i{`-99QT9?2pI^B%Ey zFkXPfF9)WCN2doUhk;t04Baj&A|B00Bo3#6;v1Y^yM0ttARY(B7^pae_s0mygX6=X z(+AW#3sEuX_EFJ+nACX)9#+uG+ydNRMDOmx{016hV0h^Ot?n54TXj*3epvGyoOU#h zJAm8rpiV6)7G8pQph$xzXh`Q0l%1p^VDkj)sqQwupEHtfv3LRKg z*#gQ~9#{+l6;7ZG_x}PoHo*j_UI4|Zi;Bt15>RUh)b-V8U|;}M-Yg8DA{5l^W?^t- zU|>*WU|?Wjn90Dv04gzA7`8DmFo3Fl7KXPB3=FDZSp!A}22k^ng&~HKfk7QC_K1;z z0aQk_FqAXF#AY)wFld5h&oMDDfNBU9hO0~r3=rEMFu`p5$;7~*4OYj&3}cBiGcf3Y z#oCz}7(ne17KT-D)=_2#29OU}7`Rwqt}0<+U;wqKSr|^Uz})hI1?GZZEDQ|BVDki6 z85ls(&B9>C3R9QJ3iHuNR+x@xHkfQX8%%6D8_aJH;j;hXvYhM;44|yW!cfc(bIUq* z1_n^(Vqw_I4)gf|c9_qvvcr5C!vXWrN)DJ?esC}_Sb^Ov$;rR~%6Kdc+MF=4AWm2u z)pIg1fQn`ohMk-Y47Ok$oLn%M25~Vk*n`F9a)AbjK=Heoivb+lEDR^P7#N(uve)4( zS8fIdXRuflHvfx|A*eYpb7AUWv=CGt#)qkc z*$b10@s-fj!}P)Ak?3RwLk2^J5{3+hB8F6kM1~ZGVg`LQemp}iLoq`cLo$ON189gc zjUk62ks+NyfkBNyjX{ASjiHnw4=j_+kk63E0BVTkGL$e>FfcGwFqD8}h=JiF0|NtS zR8x<^2GmhzxBxD_KsC}yP^M>KU`WnM%u81&OD!tS%+FIWG}bfFGlb}y!2rsQ?qGeO zA{vC(fCwn&0ToRUHfUx!K0hxx6~vWe5E1|nJAgQ-*a2iSAA_ABqW}W~BSTtFVmbo@ zAA^%1s0;)(Lm3$6F@WS*Ao8Vo$q;#vA7JuK4E}Bz}eg zq?dsKH0bKhz`$^ofq@~Lfq~%~0|P@50|Uc#1_p*Y1_p*3pz4c(f#D_t0|UsnW;IT*a3wL$e$p$ zp8;ix?p#z+y&-yJ{F17|hVz1uCOpW~ssq zV_-@N*bIBN<<*T7#J8d z5Pr(cEy#%nxh_5>KOQ={Pqx2g!FF^o3NhFTg7Ok010uLU=@nEHqN`zG$b(r6PSc?H zf~kRpj|A9Uh~r`Y0Cm=QpyHqs6V$!{m9?Po0i`vNIiPt6P(2*Q0I7jM-3w5u4w{?- z>4{@tU`PN>_%JXqltI~`RugCaX3=DIid1M6x149~UQU^*OVqjoM zhvttA1_p+w3=9mJ3=9lE7#J9`K;;P|0|Tg~&d;biUKw+892ytUMBLhP@0|P@pBdElJq+w9$g`T%S zWjrh1rXoe&0dUFKDD3)W-PCz`y_+Ui-oT znJD}UEn~hz(=W)sdT4oa70fdX3=G<+{sB$&ljRpsxnc<_Bp4RL{eoOR!t6vYAAdpp z@*A2LK{O~Y{s+Y=$c>DUyvWGNz~IWjzyKPu1*H#WMh1p1XnFv(c-a^k7#1=xFt9_* zA#8C7YDs~N1YsRiKg073xnlltCaGA2DO+4 z8A0VJ1A`FMKYOs0tKf`P`XOk!itHY!77zt4^FehTwsO@NH2T62 z1g;D9z~ydk2`F4aWe+IbBFh_sIcQjb9BsvbS{_dZ=OK_O3=GzYus|t~k;4O2ra@Gr zkRYSM{zVTDklPo7!=r%-6kh1z0SaGadGzoAm6OQw;DBPt%SlZu0f!f;Zo(p;o}ZTr zmIs9=OdeJrFff3kIlmNS7AQ_Y;RsX1#b750N>8BD4I~GOFPI!GJ~E)?JtzcV;im;E zL!jcISyE8{r<#F*L7IVq0aUkx`jfSwGJ}DE0W?wxO530^9@MsJf|lu^AplUB3@YWmBwlNcBn>=+psCNnTF_%JdsOkrSPNM&ST08O9fGBPks1GTB3bUPyh!*tN10w{k5 zBLlc+JeQGyVHN|V-2$R_GcqvDW?*1A&j_iLKz(6QyX!Y2s1?Y-z|I6w&%?yPumBVe zObiU5_Lv$I1H)oaJ;=nsu!MnuAr#7wVq#!e%D})-%*4O|s@rOr7#LPU%VCgv(aT}v zbZCc2x1f3joLtE%k3e;~9Xlviy})T1J*|SuX_!1LEr8N5NCybR+=N_SDKdiETMP_J z(D4Hh4QdOhF)}c?gW5oh3=IAZ3=EpkJPIl&(Cbi;Jji?yc0~9!w*<5zvbdxuzmm8% zAi94*X?rHvzi#mI7nEN>_JA?_Ig0Ks!`-!eI(cKP;i??96w}9gcl$RM9KpSU3;q4>{@*7MZ7FV$N0l5R_CeSbz zsK*WxGiHR051BABFo5RPKs0E~$CQzQ0o0~4V`N|`Wnf@1XN2To3q}Tp4p5sH>UWSE z(9@|M$Y3aTL-jjoPaaY21#Eur1Ua0+6drHL=@4coayqnu)|dK1=919`_2)i0m|H3jS;BI`|bKY`-w9N15gJ|ucQ07{oIc~ChH zDqk5GAm{FZ+yg4BL1_Y}22|HT)a2!Z+NmIUQ2vI=!_ow(EC%TZVVM6wZFo>zg2bGm z`PUVie?c@T|AN}dps_=DM#$)i2eh5+$;bfizk4wpkoFcA6Ye%XDF1`hg0LULouKlmq^J^-Du^kM z(bELTZ8O2{b%47U)Sdv@1Hv$Sk=sJS&~zRGP3IsQl+HsLA>)8y(D24q&cgBy$ZUU9 zf0X7yya5h(P+A13LBsHH$L5chV1E#wUn8OZh=Te9M1%Yh&B(w2%CDgQ7--xz7U~~R z9~8ab_=DuYFob`=;~LP_{b2uq$~GjWFecnT0pN60k^vfb0p%l5Sz`E(8zNdw2lVRpp}a0j0_B*J~^oU2kJ9tLfbxBjF2`9sBe6Pfq@~1k%8eN0|Nu7 zZFP@0|U4{4vx5@{L+%l zJa9OG@)Rg8AWBe3aNL2~vXHPZ0Jnuf;i?JhL^9Zc<1GqoJ|f&fWiYZlqznX|@&kz% zP}soaVPTAHKg{jO^$w_Q4NCf;ehDayLGcEf9|4UMfiS2I0m^rv@CMa8ptOOWj=|1^ zdM^RN0S8AiWS0my9fQgXs4`><92PM5BCCNJgc$*oB*}yVHPC93<0lM zPKi%RElEtyfV9Vu?SiQXtycwg6F~J7ByJG-3RFIKg5yUBUfzM?1f~~eFDQ+J#+5+g zmC$mcijjcd0ah*~HK4o4Js8$i+p zNPaEY-D2Q$1^1UBL>^SF!{o8W1I%5>@lX$Ki#0&~gDoClbri_{bcCb9=_0iv6P$cO z{vi|(Acc$!MX8|iE>PJ53fmiC|A@fj0hDe*_JAu0Uk4lw0-}9-9G^wA0^=O z7vVpUUtsc}G6Gbu!1}wOJPwls#Wh3@Q3im*5+)CeOHkZ^90bBJKY^AcfzlI5tP9$P z0xjMKnb!-g!}=IOO$D{LKxqRM79cff7#_Ch?NCsDoC)$AgD=*! z0kao5ZOn$|QP2twPz6Oyl$eD4qTU`@sEmB|vjIAo1nUG`WJ2fdRA_1w?~p^;bg24_7fl=7?8A$I#X=LdMhALdUNO?mr|1yBu`-rp&s#DH_-Kq>un~?TF8MwUxN`D|b zVe+u_hwK-SJSgmt{jv{Q&+dnYJGSx&)J6yC1L03i zk%0j;w|X2pk8^?%vJT`VBLf3y-taVZ+~Eu~96_U&%-x`_9cZo;WXpcg+!X@@!$AfH2GDjV(7Y$8AAFdBfdLejp#B#qtdBz12Y|-U zn?YNQ7$9SHAbp^;0-Bo!Mzv=~$sB8jtr#q;uWQ$cgNatu6zZSZ(Sjnk$uG zzQMr9z##}KzkK}tz}+_?1~fJCpm`P!K@kDS!UIrRmt)`%loViK2nz9ucMkFl@pN|d zi4S&l4)OE{MLUBOR34ig$UbDVlo&V!#RV7`016DJU z-2zgBWDv+trUDG$!~hB(5Z^+8fdO35K;42Y5AqLaY%(6aE!@l`z69bHkQgY@!1%~! zh%s;og2q|E5no)ASX2U11?ppP2!i_YkXQ$;SSd&>O3a1$mw|zyG&8THpri<_800Qc zy8%>Tg4_vm2dFIt;)B~DC7^W4A=n|n03C2BE{+FFq~?_rRWg9)$w6fssQ)U!Xi>KG z!IF}?JvBFuFfP0IX$fS_qyVFKalHwRcgP6>` zBLf2iJ%gCiJCYkbk`H2W zF>C-8C=3h?+zg;r3W&qSZ~;Vt#Xvna5QhuA-UXzC8@&A!#NuM8VT7zi?vbY#n*kI~7 zpe!ziIc$)%ZQKkCpe!zi7odS7u)S}fEG~vWP+4vU26l)JE`}U-NS(;dPyl6dG3)`) z1%cucw9*t3Z+GBg51=eAhCfgiH>A4`4toI(n0X>l78gSW2Wb5q$h;aTi;Lk5C_#bU zcLB=cVt4~(aWi~?vbY#{KovV!odA@@#h?RaaWfb|SzHW0P!=~s0F=eWPyl6dGn7DC zTns%>7B|BLD2t0>0Vm9TOQ0++1_N%$+6Qh16DW&|p#s$D0lTFJ%Hm>}0cCMB%z?7F z7}h{_a5HRxvbY#zcp&QuxEU0nEG~u&P$vLvUJjJS#ZUv4w4K=mA`AJ5GoApjZa;9`J`b%Wd-1Ff;S z7;>Pp+zbU!78k=F0Z4y}o8bVI#l^q@ZC!CQ@IYBy3^IZ+bqY`x7XxTpC1{R{o1sGx zvI3lo;Q~|#H^UVui;Lk2RF<3J1(e0b5F*6D0P5>=GekgHTnr094Fqt!ErGJQ7!E*L z+zdycEG~uzP!>1C6DW%dvM>d#mjzV4f%BURl*P@U0cCM97(iLv3?@((7lVf|%q>1p z78e7D2xK0In}G+);$nyZ4Sa&_h=H=W7%HGFZiX5ti;H0fl*P?32g>4NSOYbMn_&Z# z#l;{a3hBFYGblh=TnsT#7B@ozl*PrcMierK&&{v_%Hm@90b2M6cFP|qi;ICr45m&1 z%Hm>35o2Hgjq7nUWI$P53>!d;!@+vDKv`T27oaR|hAU7O7sC^%4sM1QP!<=1i8y2) zo}0k}%Hm>Z05y=o=CwdsTntm7vfK}17&eDEP%4O7&b`2?AQWjaWMo)Le}4LGlW1{TnuwS zlaOFHFMzVR7&bs`vbY#rq+xnJpe!ziJJOIo88^cND2t21 z1Ug8}&0qm#aWRBIS=_-&Cmg5aWUMHg{I=Qbv95I7ej{} z14B4iT@RGS#c%+<$+zcn6EG~v8P!>1C3n+_=;SbalZt%7YP}hNr!9)o%$Is1R0cCM9fX3UD7+6Ii zD?vc*4H$;^uHs7=K7Hh3U=jdr1L9#|WME@p1ec3^3>*T`Mj1$!0i=dmfPn#|hL3?! z2-GM9t+5BKqerM^Vqg^jwGTfOvM$nQ?2GIIJke@;Q6VNDl7i7lM5 z_R<)tpkV^hp9GqFlF9(qFC+juGzfH(FK8(G6WFhyhO01AxO;$?>x25xY+|7H04N+m zV;@FX!v(9Kpgm7WS`veXR~OWupuRH$gG*{sX}V`#T0YpVp!C7P;FF)6?VMklR{|H~ zVF-c@Gvwz%BtApJ1>#@-^1RHvbjVSh5dVS1CBWtcr{*RWWaJk?!UEJ6S6~P($b=fB z#lR{G@;9iJ14(V5{ZLr_!r%u@cNBH>a%0Lf^YTjcG8jIB(kEyvLP~&vAv7G6KbQnS z@dCl?w>wBgN7q$tbl| zP=6XF4nX2649@v^C8>EJqac!y_yNgjFu3I;rWb?l2DwcKyW2c6(=*^|^caE*5{pv7 zqZ^>~2I@S>A*D?Nydxc-K7zs)G#&y9TXSgGg8T*vTS(cX2sY0xCo?Y_VlOycoWOig z_=CzaC9oPu$`D{c4S$dw$^r}wAUh_pfW{vn<%l4td_mdh0&)+eYy_1Npu7w!Cm`i0 z6N8!nXe<|^R~|a|LzB>1U^T3DA2>CDn+}i>Oh_1n zL+yj5QIK5>4B)k9;5ry&F9!o?ZP}-fAag-!G!i9^Vw$T3t%Gp4ePF|pp!CQl1{zdKD1v4P`LdsZ>J)m_X zAblYH3=B*R8A$pvVfw%eRX}kC$$zkP4znv8Ne^h81MDxz0*sF!vq5zmC@ewhVC6<0 zEG)rABV?fiNG;4vSXu;)mVnYMEPO!g20-K4Ahj?z7a`eS401DKF~UcOfPI z$Zi9v1(^-=Q!P@yuY>9VP0oV)5uiE*IZQxvmmqz}`Wunl)&!fU08fa5`VJ63gWBSAg>8TJT&8O239d37Xe&PdR|v?aX4V3|&y$x}h{E z$9@7$5i-Emg@Z&ulF)%(@EHOiK1dw29~3&+0p33e?NBm+_U?h&`ye%-wKJgk6A&9T z(FYn81+hVUh(K#5K01^jH_)P#Y7(ne+$o^>%7c|%b+Oq><3`2b>o*33fpu7bGWd0sMQ1NeS<=n8NB8W)c0U!01ZcjQWZ0(yUhS$ zfrj}YvLHJ_^DxW|AYVXOAQK?6AU^1v4`%Rr9uO92)dEBof970&2aRZ1fXp9e}pBa2E1cU{OQ-~~R#u_xc&kR150m1^!bVFo8aSYn% z&kWub4`G4g8X^mtQ3IW0!VKO^4`G3FIz$!}_n5Lr;Hf?AEt;C)>X7HB6IL>81*Kxu#(oNFK~P?~|r zg67#kD}9+6KxqfU06=+04OChgXicVEYKVsL>82` zK;h5Ka0j%+7PK>t0hGodvY?&npk1)c;2As!>kR_~14I^-=0JIY89c)YVS)BdLu5fY z1{90TpyC=lX3NaL!U)p~ItLV#*O(bVEASyK0k|w^Hy&tYm6-vwcO1e3?aG9htN=R9 z7VJ_LI7)Ii*pw-i$(LH8{3P#8{A2WES6e0_nDFx*WW(Lq|SqQ5GZm*(}s*$Oc zwXwaUgOis@V5p6=OEB`W&7cB+nGtkwGiW{8R+cTGW%djV49G_|gK7=Xj!00c0l^>< z1_tEgnn5)*Gb4Ba526ITXMlkL`KV@4`NGTyid&G9-+}GUAQ1)zs-;bQVzH-&{;zuQIIUEF3>0eGb6|i zAo=tiI?SAKU5-$@Kx&v6pochvq62)s5i=v`xMxtPHNLhAgt!)}29(GcxIt;15p>iu z$mElSH}`@>7#Q>l5QjX2N^xdJ&`M#@xhX4;-FOZX0jXzTxCTlB&@-Hv89`+`NW91D zTq<}~u|&@RRLC;?{|~AsK=K{XNMU49U|?d1FNfTf3z7k0h~y+D2JmVCh#HXi z7Kj9h3H3dwlmwMf2sNNJ-k`h=5`hE^=)5Sf7SN7+FawmI!3?-aJB$k#(Za9`)T-FP z1S)VqZU$)x#!v&=nFf*pVJ7e>BdC9B04}Crx}ZrLqy*{I3OYr7lL~02JA2qkUK#6 zY64sYG-d+w1!%q=6sizUgVt3XfSUvAC4+Q=X39ZoAnsYp$N-)l2Z=B-Ko{14lz}nC zobzBdgn)?1F)=VGaKYRIxo!X=4Kv;+XLnHWH7 zK>eNrC~BUdr~#=2?YsW~SEC2IF99UXz`*eDKLbNLBib4y1_lPuNF*pN!bXZf^A#|5 zd{Sz9W*$UOY6U}lYF-MQ15$@LYX;ocg>6s*b5cQ_Y>*;QB8Ci!fxAs8gJ9rZFSt7v zAD@|95FehHS>l#o6r7oto|EdIl$DxXg0?&h-W>&70_j~t^ag{sIzZSVMU}33C8E1A{<;bfeEk&z?VaU?>PeBX#}{ReA zhmiXeiBJf>1``~BV0~pEcYv+KxNeCHG`*V%z6%9>%?ZI9QOr$DOpL*oqkwKiv0z@e zpfc5H8z+M_v^|B~v<8)iR^m(yR~i@?_+~)LYS6$Uwi{7cLff&R?zMtIKmu}e9Hbw#Y)Li))lAUM zAL!0gP4cQeW1;>Ds{{ZzEE|z>;(-b z#Md!1?1!p@n}>Gu45&kJ8>$8r?jYd?YDlbM0xbsaN9NE5^#pn(}| z;RotsZ)j#__|Xhehsz(J;TEnIW(GIt3Rhg}K;}iXFf%M5pbj)Bx2c7h;UfWcpu<6# zTbUW$TJgINwBaD4m6<`V4WbSn&S>ER3TLY}W(FsyI$ZwP3_7%@jhW#;R2?q!K>n3( zXJ$wSogE9_fWyE54rjD@19dG*p=v;J3&IWp0vPcNTD{gvggVgB(kvp>fdV>Oh+c3W-n$%KwLnPzUOs-X=mFs0;j_2z8*r zvR_1~0}U;hc0$q~G*}q0#V=?Q(Vqx)Ad`}aPzRbUP9;)ZIT7kW>93Orb)eNq^N3If z%5PhUPzOp^dx%g6DxWVCp$=5u|06;jXeF^q7bvu0vBrQk-atbg#zd$COk&$N`yMlaN1WQ)Pd6dA0pI& zCRO;l3CAxeoHdD12WrN75}^*X+B=j8b)Z%7X+)?44eONVj>p$@dd zbu|&{Ktq!!h)@Tb^0`QaI#9m+N`yL4xy#Z+IDSFpiyRT^K<1eep$-&p{zRw)4Y$V< zp$=4TEF?l5=;-qsM5qI~PpOx1xPa2V0TJpzgKq&ur~}oPIYg)fh4XSE)PdZ0kO+04 z^!$(rb)fd%HzL%5%8l;kJ9jH8LCPE!3oM#cC4pcrL zAVM9;zo&>)caI2lp!(<&5$ZtY?mr^bf#&IzCNMK7t%1aGE2w?XP=L`-0oCUr8zE|7 zDFIu17u0S_AwnIfo+%_k9Vi|25upxLf6OOB9VkB55vlGF5$Ztc>KYO1K=!`HrmiHX z7!+5qFa_1CjGLGlxHdt;8dQEcFgP4Q9~S_X8zN9OFumB~17xoO5$Zts$b|@Xpmta! zk?OLEPzRd2ttCPo$lfMw>YRf@R3bbBM5qI$gJVRf11(azON2U*d90fuX#k)5K;^Rx5$ZsTBJ_z+2l8(f5$ZtY zeFqWhK>d$-M5qI$)0IT111(6|ON2U5dGMPEb)a;>wS{mvgW4}LM5qHTYcV529jH95 zB|;r&S5_|(>Ok&WLxeg|xEv!w9jG3>N`yMlDuCZar~@7TtG$(QID^t@IT7kW<4A{y zPzPGDC9;jMy`YOYyogW-YA5y(p$;_ux||4gp!{}{2z8)(@H!FdK>fiNM5qJhUxw|3 z!v&PC#E4J_YPTB@p$;@o7(j$NQ2r<-LLDeQw-TWaRK83hLLDevRuG{MWZpg^)Pc&s zOGKyxEdaesggQ_Uv5Rnd1uA#-iBJdH+!siMI#Bv6 zB0?Rg+-N339cb6~Od`~Q%C+r8r~}2@F(TA~!uc8z>OkYMFNshGYL|QOlD;g$Q+^{MJf@I#4=YPJ}v8I^9l$I#9fwB0?P~Tpkjk4&)Eky@bOV zw5dRy2z8+PsGJCOp!#SE5$ZtcYCRF^KfyM>C5}^)MZ*lD-9Dbm2 zGYKNpf!du)M5qI`H*APd2TJ#zM5qI$t5hP?f#R)(2z8+Fn@)r}P<*T*LLDey?j}MV zXdS>EBGiHW%ekL$yn*U{1tQde{9#0dI#4=rBvPF>5$ZtU97=>bPtBGiHUQ8$TD2MXtZM5qJJ<8T}xoDM+!9%mxdf!r5PggQ{T z)DWQ#bS3jNBGiG*J4%E)Q2BhH2z8*#?*0&=4pg6O9V9ON9EeZ{3cnB{)PeGEC6VeT z5TOo~f0q-X4pbg&BSIahA8>*Qbs&FyCPE!3T(}Mq4rfsQ)h9w7=+Yv4BGiF4AZ;T; z9jM>5R+2z8)#L>Uq4K<$VrM5qH@?75Z*b)a?){4hb)b4d>Lg)* zfXoXZLLI2TRX~I~P`aukLLI0dHJb=^pz>e^5$Ztkww(xdp!(<(5$ZtZy&yszsGs+n z2z8+PL;Mus_yEP50TJpz;|ys;r~}m>T|}q@wI{a_p$>F>!YLxufy%#cM5qJB2k&XZ z;R2dx(k4P3D7`onp$=qT5E1G?^=cLo>OlUTMT9y~IBz6E9VlFm6QK^2PM;E?4pcAv zAVM7|T*S{1jt@||t51YFP=7Fn2z8+HAdLuhpoJI3M5qJB#|a|Tfy%Y}M5qI~?=2DP zKpX6T5upxL?lPPu9L}KlRUkqgD7_dHp$?S(0*O!uN-ya|r~}1s8xiV2<>Uk+)PdTG zYlu(>8VA`!ggTIa9}}St)c*TPggQ{X$)6(}Z=iOfJrU|a;ao(7I?#C2L?YCI`m4)` zRCk&Pb)fM3K!iHbF*a=H35N@)-(x|9I?(2KPa@QT^2Zz^)PatjSWkpHP&f-+AnXs2 zf7OXl2MWJPBGiG>Up^7)K>nRdggVgSFe`{q2WpT1BtjjiUgf<=I9x#fl_5eMX#T^9 z2z4O$g%F_*R6b`Asjid=b)fcI6A|h_;WC>Db)axrMT9!g`uhV!r~~CAu1kdD15_VL z6QK^&pH?J79jLyvCPE!3{5*+J2TJ!zM5qHD0@Xo;I#7B!L4-Px`|c2-4%FWLN`yL) zd5V__#|LQK+lmNvpl~iFLLDgHnu$;c8n2s6ggTHv&JdvvR8K!8LLI0){Yr#7Pq~?>P&pJzggQ_;oOkr5F%jxOHk?M94p$@d(=Ohv8K>6|l5$Zts?KTnW zK>6qe5$Zts=noOOlFe zfk<_eh)@UWH!dMU9q8u4bwsEG#m65a)Pd47*LA}21{#NxBtjj?Jbxn8f#M^M2z8+J zS4@OD(7KFfBGiHA%a#zK4wOzm5}^*{KBgOl!w+Ph5E1G?C#)$Gp$=3|P9j1b=)8>8 zM5qIm8=r|#2Rc5L;U;1Kg4(A&M5qJB#~C8jfzp-aEyDJK@~;LF>OkRVPlP(qK8FY* z)PdZ$iU@U}a$_eE>OlG9G!g1R<-r3Y)PeT3>D?wAexP=pIT7kW<&`}V>OkqwlL&R7 zc$-LsI?%eW6-1~5)vJezPzQ>SQ$(l(jVInALLJC`zlcx=%5S1~2*(F#oKT4fb)fpv zjtF(2@vuN5)J8BtLxeg|`(QQ^>OkSQkqC95 za_tBa>OkSba*uGhlru6g$P=Lsw2orheZuB}#!q(=p$=3Z-5^38$ljMkr~{n~#sfNE zmB9K4P`Tztgu1N^3=Gjkr~}RW2|OemE+GG!5TOoq47e*1>OkgI5upw=FVszhI#7AA zg9vq?`KY5rr~}n+cZpC3+JE$o2z8)wDZNL8!x=O`7(#?P(7Ztl5$ZtZEg?c3s6TUs z2z8)-)C(fif!dRwiBJbx&mi)caJYbuvCkty9VoxuB0?Q#KIJbF>Ol3D!4tyn1EoJd zBGiG}InhL@1ErTNBGiHM+XN!ifyT#=5}^)Mjz1?--7g~4fzlQ4Q^Mf~>IWzip$?RP z4T(?(@`opp>SBmc2PzNpiBJcsw>pSW2XfzHBGqjpLLDfaPZFUHlz;CMp$?QzUl5@V zRQ`P@LLJDz`p*cb15h|S5upyW4kelhb)aOl4CNg~vN((@}K)%_+y9Vox? zyd)ehAbZV-P*=skz~D}VI#B=PAd%{>6QK^2?%xuj4pi^|CqfOkvI789Wk)XzIbggQ`t`I88BAoB!Y6ZQwFJar&K9cbP;i3oL|_URfT)Pdsd4iV}= z{kL~Sr~~Co-ZzB(3u<3U5upw=59?2aI#9XRMT9y~xweD|b)fNxO+=^z^&77fp$;_O z^o9s^AoEP#5)MC*`#gzI2RctMj|g?3^tY4m12ggTJ>z7nAhH2%l&iEucB%1Ip})Pd4pIT7kW<-s%} z)Pc&s6-1~5nRkE)b)bBCi3oL|@cT=II#7E};4|Uy1GTTriBJdfZyFKmKo=_35upxb z-gY9?fyPOkT5h6r___A}d8!r=!R7YHCi9jN`1O@um7y;?(rI#9W>j0klgdruLe z4s`DCZ6efx)*~sx?oEWwm0&wJ6qJ8;iBJbBPaTL<7eItMP&!B;LLJC`eMG1OjWaAH zLLDgH_7b5EG=BA*2z8+R`Ok#r&fkQ?57bYQAVM9eov1{FI#4<3NQ63&y&*)X z1Fc7jBSIZ${mTX-)PeRxY$rk;=$z=iM5qIqcZdjepn04VM5qJZ19h1Qb)fZ4SBX#u z3g>%7r~~=q1rh2%;rxyWb)a=sUx`o$^2c8y)Pcf}?GNGf46;{{2z4O;N)n+C6n^qV zs?#Jw9mrl|BGiHWVM&BKP<%KNsm_B4bs&5FiBJcMw{RlVf#NNJ2z8)#Vm1-#K<+Ci zLLI2xR8NFDka?4dQ0K_Nz%ZK#b)Xb_hX{3`aJf%}I#7G<6%pz{{hnV$r~}o5{C`2N zgf_-;oI?+aUo|4sfx=Ip2z4O;niHW8WUmvE>b!|i2XbEs5$Zthiy=ZCXnZ`K2z4NP zdx%g6Di5X*p$;^^FpCIvAoErbp$=5Pts_Dms9n672z8)(>nIWGK=vLdQr#IM)PeH( zMIzLJ-1n3Sb)fS8IT7kW=6xhm-De`zeI-)ecOuk*>V=;~r~}QbG5jN39)QMuc!^L4 znjcgqLLDew1rwnTG_RXVggVgqKFvg^%LCn^`Jb?V;}{qi^0BE)DN0Q)DNBWwo}l*q zSu}MFTmlSwDXB@N=_;UY>|muU+?g4k{%2) z3`_e!r3Xv|s;(d==GKf?c2)#3xka=^7RCkp~but+D z++z1{IFafu6RB0K8O#g}l35%K8*@P^n}Go|PT(K_&u{R2`G$dkfi<6l;bT5T9jN@rrtSm- z14C#52ZL-OL>-94rtS_S14C{h2ZLuZNCg7}sGP&5?hgY4!{1^KhMy%6b-3)k!N9-} zTgt&;S_V-EBC(lwgn@yfwTy$ovmB&?fdNEfQwK6{W;q8#VFgG9Zgmcf3=9V=I2ahK zAnHKv4{YX5VP;_Ht>R!%tb?cnjf-GYXTZq7&{@yHu(JW84%FVqrVbP?hK(Eyx=j#u zxWXldk%3`i69>cFW{5gm?$cmoV5n^2U|84+QHRT36-EXI$uTIKOvS97#?dvm?WVpGGu)6Q-I2oAN6IQ3Vo|8eB2zB1;IT^x< zP*=L1lcA9ab@SJAGOQ*--O2Tw3|EOz_jx@h!+#>w$!_3e(A+>cT--NsG6WN$u5be< zLoE^NW^dqRSWbkxqZ>FGE)t>c{RU2k-$baB+{nqG3T;c^OIOYtIT`$kP?x)rlc5q# zok#N<506eC6$_7U7ZrL0pcon zbo;1SfDQ2I4pC9?=sf7t>!P9o6>(9~0I6~Ssdw;bKH_mWZGuPhn+%^$AC&}`P8XFJ zkIoR40Fd)NKx#Z7s+((65*YYfK{IO}y&yL*fW$3cf{HefvIH>Kr`tuv0c5L1w~tDU zPqz=qpa(vk4h9~b0UDhi3O*3Mh6g$id30U`I|)pjNlQyh)8m(K0r{H&=AH=0h6ju; z9WE;2AUA=7)BzNV4h;M)AU9wQ#YSe-Py_{s1K1K!5F!O4X!jFX9OQHdoXS9jl*e%w zl?0H}UfMG;FuVk@5bEKvg40Q$tI?4o7OdCs62$Uu9~Fr6K!Fzl3Oo<6JVdtBMa2T- zWeW!WDX3`xG}sPSxC?Y$A6PYsCV-Y5gW}G^qxl5~C=d)l1{gro<4#a13^o?wdq+kF z29TYQYxaQJE|De5$SeO@c;#>1<2J7u7)Qe9_j?;g60|(4SWe{37Qi?MnE0kc?iTo z%Tft1LG3e_E+3U}P&gvl>)7y+5pHn;$mIzh%||j0Bc*o>P=+%ANrCgU2FQE^h@S2c zP?kLi=1lNtK4Nj$qxnq)C`UkYDcCa4<^viaj|PA=dVtk}V${L#04Vi1Fm$-6*z>o5 z3L20qaB2?#t1|fylIn6%u}29#(A9Gw*EoPo(EzamKr90!cLqAq=;YM0mJcXts{JVb^?{bg@U#kA&;trt4Ugu79Eki3_ZP(E zm!Nefpn%ly==R|7Xgr0OT1DJf0~<^9-cAf|homrNZDC0f!wZ z0fK69FbCu?aKQkz22{v_(nL3hN8>@zZ4Mrd2Ny6hFhCS{gEC+95paI)1_csB=fPBu zZWdM0VpWfBmJ=S`;IswJ?+`N~sSecMKuV9$LIZ3pM1e>18>oD9jfw)kGP)71$pmYg zSh}bv@J~g~+i2|zXe#dpwaY*W7;HNz9yB~U4?6CESE(QeSsVsuCzSkzS3lS=h)!5~ z&j97G1W=(D;n4|d7IlZHM1Ue90Ms~h@agqYft1=RpgPX}n~RD)Bc4W%IGVqq>LKMj zsLs;{#hkT^N&>WwT?0-+AQ>bEcdmp%p{ zH6Bnk*bJ7zVsL~9GssDx2msk*(0LF@w9px2KTp!R72C=fG1ftUaaL~!^;fCJkD zqO$;0{&j<#)$OBF04j7kT~q=zwZe&1G9W?wj3@>?n{|IswI3xl*v_bg;l*>Um0J(i`0dl_qNF^kv zf*K*7$)n=Y&7#ufz<1yU zqY9%91FW!!gvAfYg^>0Y*m0on0y_m3UZ8e)H>ji34a>P8CEy?chn<55_HwfkRIf5H zG4Qv82Esu;1V;#}a?rpP#9DB@*3IC-3NC^bA6&+R`n#a?01D=g z5EXk+#2R2UDSv{T(;WipAo{34+O{Z7PH@~m##97~K!|cs3IXj=2jy8s&Ard4wQFwSX z9%Nu-V1RWmA%&iXhvf-yTerhS#T}Fg(E14$T`nr_C|>3P+vlQU!N1Lc57aP6bJSUI zM1e|I@YqH-H1k2yB#KF3=U)LUM^OZF2DsG&(F2N9aIp(+rNhL0R1`2G)dCi&D7t+> zjc`z|1ocBeLm=Ib63qwxcREU7aXl=WAlAGDEszFvWxyp4xJdFqY6H9kmGWrPu7;4p z6%>&XSlS03pz;ISNPvv{;2yEyVnQFW0GGPZ4$)N9Za-)*3&<_tzPbf8G3*4*Y(ff* z<1Q-T4%bToa0J5AEGVVG+mqlJ!B$6$V7LUP9~7fVV<%ytHYOwHe2XMLv)l%RngS5t>;&7}_=~}Tfq~!cVDkaSjzb_D9J)OC8y?jkc*NN7kdfnJ zhX+5XP=f>r$RpsEA~=s4cr+fAU}0bYrEuJ%qNg!}2vp&9gQ`BLcFhwzL901DW_o=8 z39I*>5J_n@>4P6=QFTXML7<`!@*46P!-?Nc8W2jp7V15|j!=MTW?6&$jVj0Xw} zGN28lcTlpm4BY z;ctS5Z92otrQr4`DEBlUU<8>CNhU8r4gd`xSi7kBKqD74p7zZ}C5@546_m|EmM}x5 zKnIC|lO%%Jzz9+R8pJW@Zvoj2iZ!r1!Cvy{4N-A$+zFa_G(2$JMFo`VAVmteumV>N zpj7bV-~a!|TvXCQahnc{+YC?=hqO;T8Xhrrgs8ZKx>~RaBHS&^+o0weq$mRi=QkG> zcSinJa61FkR0a!zhu>R3K?F+SknjMd2Mdqp3Q!_?iU_g_0noGys7(lRD>y9}!DYKW z6d>9?(;|^eNf;pfP@!`J?5B`@E7#J8J4ru}PBEhmApza!$4h1NNG$0Oy^roOK zI)j&&|Ns9F*6P#kAOOl^;9QREdScxJ>eYhd5$Y&VWP?qH_#byE0cxEfH|!u4FY5R| zc)kW)D8X8Jt)NK~P?`tbj?VD15gdLYpyniOLJ;I>3y_x}tpP|RK>`OyvmCS`3gl#1 z=Qu2D}9AVFM*e@H8!QSiwiiJg|=Ufci7g`5I6y!oc4Gx>W*X8KTps0qu@J ztpg9{DS&D;+@t9I7^Ng~o6X`dZ2S~`ya{Bng5k-|Qy$+-KvV0#@U=jvVpswV7?kD? zN_z)ozQ#pGgIKF(V_1dVKj8TmWJ^GS$_N`!1XbwZ#z-dzsDNj984b$7U=eVq2~@9w z0~sX?f|g9en}x8r*a@lN4X5n$1;s1Yd(c;ed5|nYl=A%|1pzOKKbdgcIi@IW)9M+87!c*OW-pyC!h7@UEc)LkHh`2~gtJgj|GB0y8B{Ozz|q5@DJj_^46iqY_Zhvh}EWD{uV z2dG*qVBnt)8ZWlT7%u~zf&o&Ifo~}I1V(yuQOWS=Y*7IfsV|K{P1x=bl>$(So&bq7 za6X5OGof{=ze5V-dPe>h&`ndI^ilw79!K!EftDJA+!DdT-vrtn2a<~b&xwN4#Y@mq z0mB2JSTX>Ypde{*u>hU~FYwTYmTLhX%&^f?a6tqzvVegfysQnRC*T-tbwzWHN(KWz zngc=iL4lOPTm`ENB0x4HMurQ(T#!QW$gl&vxXSidq7xECN0+@#q8zbbz91#&82TJV7;~yT)Z_vwEu+u^57F>ZSz*bIx41laZ@Bs~dfV|)U${5g* zE^v1p)ItMgazv*URL;DFWpYS$2djp_ix$9*T12xLGGPO$hG6ACxV%KN3gkX;6^5o4 z(%)g=Zv~Brfs&U613#8FjRtr&8fiR$fd3sq9a~5{4H5+C^C1!R4i8YML&h&aDFj^M zLwl1%mCqRSPvF5QaEb)4nE_>MxWSN^1g8d2xEp{f84C}jG9NMmiYPz9>)${FAFxGm zB)gB&@|`aJgQj}uQVCcBhty)AB?X{D2HFw@MG80oJ(>?Og2WNYT>+F#6&U#84MKNM~WEy!+g_J=qCDc%t6EAad@ zxRDB(^a8ml0Le{|)o%}=%@FX+YXG!c3bDPpMg=r71R5#_xe(lB4S-HLB8p~6Nexl} zE}FpuITnyQ26r1#4`U$~sQ(WQN5u38Y=I>_93gIog(J8n4ep3RgB~0ku9+}Wez0iv7tfW=|UZF*ttt(V|NLN`p8 z3#2GF@aXOV>)*u!n&&y-*m>|jXs8i1oo&-xqhiCr-wK)~gA3|_Bfr~6MW>U)<9Le- zXd(~X*#Ye%YOGPQ0hz26Gq0M99=3sCx@?AIM*h zJ3t15jRaM#AZtNYE0}IP0tyjmeF&OAq_8~mfQ=`(gA9VE{^KqxpjDC#pe7z@u^(ui zAfyxD<)h*bTa*V91&tBHo1>t*36xdPtCp8rpnXk9?Sa}~Xn4rj;iF;(^)0A-3Tn|a z@V9~vfAWAV@kK1D{N|!!23^bx)&U-aehFGS^gl#J1H=P${NaPdkQFExIwOQgaCvEB{ZDFNpaq#6Oa9zc{Q;QAV=(S)!T z)HHyUWGI~%Pzr`E&xFrm5$+1W+XtX%N7RSl^=aVx5M1*hITuu<8X&tF(q91wCAh5v zRSRBM2w8rF7K)JM;iG~y3I_^819%XE%VV(R2H?ebpz;`Hyav?W>Tprf2bF^mmx5!? z1+-8E6i^`dfzmTr6x81E0JqpM;veQ;P)!Re$iV8sZh@qD1JJ0rK7T7{$POB|AZtO^ zfD-#*XmSR*5@Z8T^I_!?+`Z5+0WCaxb6ZE)@Y!O8X{5$@^}-Z|Jv1}vVnnt0X*ka4>BKp{nQ3V zP&J8n-t?1K*n{0y0@V5X>d0dG*asUT0q(9qT*qA05oR`UbYEZf5qPp z>4$+dfESx1mSv&%s18&E!#XaIHC~`B1T6wVgNn>9Dg_?OpvhXuN&;|z+JhQ#;N{ho z0-ylYkZ4+>atw;9}oiU18lAo4XR zz6|h<2Y`;aMjndY%v@PJkxd!NOfGD)peGUI6lX2B-i853xjm!x>Ulz%+r{43d zZQ#-3M$ir)(6V80T2t$CQBgxl1dyr&)Z+&Y8^EL0;U#Rz8%joZgtpX?k|TKO!UXvG zHIHr{6_4hZj2?<7z=Pw^)$Ebr>H@Vq2jzca$`{a_1j_1HX#EHZUzGV{(6Aq<0s!R$ z1<-0k#1J5)xq@PU1T5x2?f^FqkUI0ACC4A{Yggs4%sgTN)*VQ zMsRry8KDA=h{A>wz)Lm34I=PvGDrl2A|0~&0F?JZ!wI0W3fx?Se?sRU#0dyqpQDj-Z?RK*#q%%HSTb!$3X+k6DAq zOR*KhFQY)(yM0uU$CSZUv$cy#0DpTRcrpuA^Mbbkg4f9&e8uRY30}d|1e+^N@L+~C zQDAjb0iMn2AzNbGARQz z#t^{Y2D*6>q$~hw96JCuj%|T7j%@+1nLt{>4Rr8OV+Lp(8yxE%pmA&mh|LIZx537v zA?Y37AIJc?4m=7AUT6cZ+@Ql2h#-WFxJ%UR6rB3;5s%QWH?5mhs+V+UeERk6enm6g#ZrzcF+Y>~i))a1*y=^dYJO0s8B%QGs24#i z4M0YLj6|*<5u=CTemkUO1^E$akR8-N1-l2-vZBx(==C#_{owS7W;MM1Hr(oy;pU$T zP~utu%JH2(D(L-4m>fKE!835+?c?CG58RgmZxsR$_<{$4q0Kc&PIpnU0A+UvP{#Lw z?nMazXLXQ~kc1B^$w0ejAnRY~9lp@@RNX!*kSqjp4QMSBD9eD>Gf^rJ9e-*B4O4=5 zhk(x51~siAp6`G(u0f$;0A2_O%}mJqkYQ6c2H-&_wD~=B_rZ%1*m@siZz1;I!Tk$c zf&}t2$iLvC3VD14I@$>uu|Dpi;sP2$et8Yr3^0JNoozvp-v*M0u8xP)`LJ~@Am^bd z?FK0YB^FSaAm&uyb0^@Q6=Wg?ZU<;q`X%V>RZulU^kNZE_YbuP?E~6j3>wkx3Ajm(JhllNkL?E8#elqi9lR6?5sqM!EIf`M1dY~sXoH4& zL5s3cyTqWebdVL`fhdGta1jp{gSrCN0e~#lfb91Mx2B+XeJ93nHHeo7|43CR&WS{=W>`qaRlmEdo+Li59$(w90KlIgY|rb<;r;^B^yy^)MAc1`-{gpdFK_DGIc08nlrgVIMd@A$5sC zZ6|P}6MYf_)OyumfQ;#a3xVSdpmYv$5M){c65inc5;)MIgT#aa9W-Bw;z)>wR?s2` zs6C)OecVMQ1Vq0C9Ucd=6x=)pH*R4~J@CK)bniDf!XQNh+9*0`yaa46cpGNOOVIc~ zC~t$e6c~7bvl{q7xo#Jg5J+Dhx&4Kf-_VjDyjTE@{DN&kgpvX{C!x28A^8CmxS(C{ zsOi2LRQ4QqQ2`BDfhSxcal*fy1w7~iUIzm2E*N+~7nB;jyoeaQKEUX4@Bw(8DL5q| zG78M4Eug6mP^5!%6W9Vsi3|#3@Pq=m5`|v0X}ep?NXW>C<= zECt!|65MKqS_(@5P;W!_t$`8(IA}rc1i1xX@S@dk5}=h?9H98)K$^7%B{Bx^nqH6N zETB<5aP)D2hRyi*v2cKfb0Ir!yIE8q@y4R^@+LUiSX4ljEqDQ|fJgHYiNna_>&=k! z5=Kz?f*W%Mpw0n$rw5ck3!tqxP>Bkwq`?!3kjMljPLIPVjxbdjo}|OZOZ|K+XY&pGy}s?7CaP=6G~Z0eiID zN2LZdY|-$Tu_H!B!KE`sMFZ3=0k^pjC1L@n+$mt-Z-F#oLDNN@Eh?a~zL&mC3=Ggn z1D&k}@x#Gx7nK;x6a1~9V;qjVsDSPnXK;Zk>zV>~5-4Cm(FWT7l>5; zA5827P2qvV4CHgrBniUPAz*Q^r$a1H@V9^#H-LqpRsC^D41g+)m!SFyl;A=6f`Pvc z(sqHQ2+$rdc&g~aOb#F|pyU9~O5KpG1WFQ)4UZXJK#2n6NpM*QYwknreFXB^)Ye3;zram#4QS5;rndP9#_kztbq%_ah2bT*Sp;fegTuMgMa2YE^kKHA zAmtaRgaWx1yyU671-xXby9K=BsjEc=bi@I;`~s~y2Km>eqetZ%sOQt!0xn5GtE52d z%{qHj?tqG~#ywzRNEXML!i~|3A4m>>`LMG^(Z4CHN49s}tHc-%x`|&1o$vpu=84X&yu~z>fZc3U{`sfPDBe zA9kAEOVDmLkjFu33gmH6#DUldzd#NIfcOP8E)OaQK&n7~0`Wnk$j6nTOwen|dD+erwjuN`vu+YoAH85tOMf)=lWO#?MnV7uyC5sE?QJYp`~K3MjB5h!|*HEC+uRcokq{jfw*(G4r>BDl1TL*TLi9OJ?wC zQy!NeAciEs!=&JKu^#-*2>UA-7#Kin0~vOLHXVa4Y5u_kS0K@=$omjc z`_GMUV5I@b8K4va%HZ8CDxk9;T)L)!3)?P8;p5Xi2b_r<8y+#bbWBm{hb&QQQRxF0 z{*VSDC?V895<+#Sk4g!s$p^}Xpuoj*CYvaF=?`5g0CE-h+?ArsiX5y-qZY$X-6A8Y|K4EG{uZ0Bwz zKwaf=@By<2<3ZF!905wi5wJ5^k3**OKsoH?Rz?PfZ!O?}W#osCk41cQh-HKxFomod zv|$%i*?^)7)FhAS3Wx#I-S7?*D7nLGMo{4kw#6Tm1tBpEY6*Y?6`TuAKuyr83=9n5 zt*|wqB{;_XJ&?geAC-s=jLnr1P(k=sqHc!>YZsLoNC(Nd%SFW)oRq`Axu{e#^0$C` zS>W?Op(oHHyC2lH1D}itQ2^=BBP&?OfZVPGB~FlAK@|xok%F53;FJfR$AxV%1~0q9 zXn}#wDubNz*8;jq4Ad+HB}!2KK`W_nrWw#t-l%B?WN0TO_CRg}g|A2B5m0_Y9hP^waH-+jos`z-4uJiwek#AY(zX+XZQsfLmSjk$R2uz!?wfgw83@ zP8cL3f-)Y+Ndz)pAV$W68fOie(Z-W!gRp3YbOT+W2jfCBkOSm!GW@I8g0Ywe@;j(d zv+(GJ=Sj$3N*~Z(Iq=zx1(05+k4go&%h|XG-2DXm8gi7uaY)Y)ob*?LDwbxb68=`u zFeNCAL17I_Rv`O8$qE$4pjJL8d_idi>?>%A1S)7jtzL{Y2C?R)JIIP|Xk2tdI>X?o z_t1uhEM)2%61<=Ve&BKpJdI17JA72YXK-S51bD3@_z*hCARn^l*Mdqy@NOYy(7Zcn zUl^o!_04A^%qDg2G_N_$)6kd${EudS}K?M=mW3bK@cu%nbs3>g% z)z&`nBn~|r0JgginyVnaHb|IyG#&xvioX;Kx;l>K?w>P z50KR$M}e#cIjU<4q{rLqqY?paY=D9s;t%iwm~PNH5S`#0nE(kha25p}Bml~q-7PAR za0dr0#1}9j&`G$U@dfC}3&|{{^4YJROJe-EKe)Zr3$;iVKJR0ACd;%a1_p+14-t@` z8Q>)(D207%0n0J+w}P8X&3nN58Ti{E5i|wN1!Y{2mpz&fLYLoxECY3v!J^$$z?Okj zfx^qDn*kJ*pkA3zw*v==4bB#zh3%b??yOHQr0)uL&r1!M^P4L`1L?P!L1zzxx;fn( zpf~_I6MX!1C#0D7fEom9u)vB!k6uW52{IT|#DEP3#S|#V7T`I5C>vupJEU;K-42G< zf6aTqD}wQ*f?N!r$53MW#aOa2h2|akT?ae;06211AI^>q}zk!Cw?S9eRGgtJ%GUj70%GmwqKt+^RjpfvA*#3yd8EofTdPHhEEW`bfL z6quliS?~%dkZ~T}0S2HV1j6>HfFvLy^D4Oe4Kfy#SE0rt#(zOZf{g>Iz+o}0U49Uh z6TynXT_tzOsWsr8pCH{Ri541l@Y(Q}peE}}OK=dos8}>th%obmZ|1&Sr+ghK4jnnWIpox?dCV&@p1)_4#*}5$SfnyYzkU3fSjB` zm9#=P>_mLX$?A|z+#a2R9^K$`^9?*Y1-l%0z`+0+Q-{rWqR#h&+Zv!iW&k-;19E>0 zcs>=pi5q;#xI?Fpij7AvsEq0LQAq&T;?NL;E?Wl6LDmI9RxyB9H+Vn=z%35QXb1A3 z1Nclkjcy+moBtQUn^i$fxJy814MO4ru|MVD3pPmo4yqn}pj8H_4gw`!P}L4f@t{Ul z1*qHtwUoiefm)9Rpu`1M);$GWxWiO{;wl5wN=*QHFao0o<)RXB%tghY5ftVXpw?M| z$H9lp&;u;NYicq)nm_#q$vA*!OQ8G592~(%`N8dnj=?E|RVsAND+V+WZGy8s5% zOX@u6(R}bf$Oi%7U~KaQXDU!{gd{r>Knv6pknNZQT87YEqY}Zu-vT~y5`1Dj%ut+; zjQ|-Gfou?{G1=v!;txq!(4hs?@jF=l0i|!`MMI#5g$Ln66#e2Na2SFHg_>(rOciHk?|#H-3Qn(kIq9L$u24;9*p2+lVBx|J3vRVfu%u?0PnU0 zuXV716!YMQPX{QKV%r!5y8QsO{tvRh1C*{oDj|J`dQe->N2LyIHptJQ<~NuF8ohxW z>N*M3)x*qZpw`5!z@6kE??_-OUI7gM1MHb|IL6xCy!(%j0F_f9RY9 zG^{}N3R3ig!j<9W;(!1D!?s-@pZ@@UIF{x$yuUuV{f{8Z2=ZK<1}hR0>}1`3E{O5Zbf^ zC2CN7R=|AO8=_)>CGUV*HlW%Fv_1!PdK0L~_kij_DwiBUu>@-Kf@29hh2y~A3@ODx zWeJ`rf}LN|5&(@71Mq2x;JwT3HYj4?`Wdva$pfvwt^um%z&c=aTj7l0=^%K9uz-bw z#mgwjL2%&=T`nr&klF!!^dG1{4)Q9fkqeqV22J3A#<{y8D-fXD%3Zx8bNCX4=+PT&_Hbh(CG{npdc#%^^qdL`39WYx>{5~^57)Uc)`15|ECa*}05u!H#R{(F z8<1dt9{h#W{sOlu;fpIk%?8lo;?58i8^cSEJK&3CK~)cA1#5SRicM#r2zZgWN8=kv zpBp+>)eT$W;G*Kt1sS6UhahNp&ZQHw%MDcaxpcIstOrFrmZe;vaWLq8A>e=n_4FXd zcXEIR?LoZ<@bGmrXhh~1WStnp%gM~(xgn6LjQlO2q8pUK9KJaSGD6pdffhr5a}dCH z`^;x-9Rg4kfh_en_(Bp?c7YmmuqN9s(4u;Y0G0k8F`y_0mr4;H zogUy)30zr$`u*U2ZW$h(9^g&~Xi6af76M=cJUTtV{c}j>0=cr&1ALkfsC5iep#a_H z2MkP)f*3|^QF^>n8PBpA@mGJtdmb6T6WqQ6yUPPSXaGJp7tH_WAj!xNoooYzSGPw6tXtrD@B#C#|FA|S zl5g3Nr$_=o^K~1AMp=JS_^g6H-us%mIzFL)0OEo0vZMat;9YKSuzFc`@f84 zWMDwvf?5uWK#-$cy5^{WJO*kCmV-hJj|0K@XkZ!oE%q)XV`@T?h|CmVAP(0yzd;@PG<=5C>!xIL1L7kX0Z~0H`PGfHYMC z5`+vOfU-Tv;k!VW$bo|$)Fy&d{$MV0SokwAFm#2eltWE|HY&ayV)Ou&hLFVsuy|sD zmSCVnXMx>JP>Tn;It@PM1?ui0#_K`t7f@JffP4e;CnyF%(;i6otU7jkq76{Hg4>y} z^E;shIk=q*E)~H0Oboz_{99n{9S!(t`nVT9fKnH7iwzV38Xnz@9?Xu=!})QahYw1j zSoMNhb)W*o!K0fKbO;?YsO<#_Nf#B3<_ZxO{#IBsOM^gd2O6|SwgglFfdUQG<^cN~ zGB*h>^*|{RBnL{p;Rpqw@C8RZe9R5x27F^~8$omONa+RAegienAp3hPK=B9O}mSj~IDGv^HaEudj2m`=!H;GlUgP<${zRuUd> zQ30)J2F1Y3$BYaN&3nK`{parmjoKY=f$;u=SHOboV1O>}N`}aQ3KHlTGpMQIq5@gB z(|Ms2Dvz|71Qgq#Y7%4@s8|L0v>WR3Zivf$dLdOGsLcThJV=n@X>5S^+<-g zM*`9hssum-9SI-~C<}o&86XZQb%QtskYPGdLnQ%MZxmFFhk~N98#YG->hK^fGxPw( zB*=JBsDqa@fQ$!mB0x#b1G(Np_AWFgVe#AziE@v|BcOBzTAu*B(+eqEfeU^O&~fD` zXIjCA3&Ev2h?TpmIb47iSi^r0auNFXBxuvIr8ix?o=vOorcxE`P-gvj&w zkOTx>z6z5?PPWix>Y#aUP^?27(Fx74@J&+iwNs$Q2B0MVaz8V)`37ocgJbGAq*?>X zLRauGf}918QftWcJb&|NMg|7>x*k}$fasvffd+lR{o&&-D&P@9(0WdA(1DU8sLAdC z%0{388cAMN(Fz58z|jEMzLE=K_yc+s5<~#(uR_!d{hd+j)dh1 zP^TSIQNDyN&jJSsw2TC^AqIffK!CM^-2lzp9?b{A3v!^P5WEl62U-aVYMFyV9-;xf zh^~1LcyNJ{zX>!g3aS9X+tR?+G#_MyEIR}ZL4Z>sXulOmO$5j!P>;m})J3*D!QTg7 zBHImFWC^J|KWL_T93kM}HkT58pAhra87Sn+|1hMa- z97q*7Z*+2i%mE2A@VA@-$0>C89b}FP-0VenN;SGuVEdpz?Q&3$3)J%hwMZQx2dje{ zQ=O;4fdC3C@aTX8$c5l*^`N($2Y~Z1)TrYQBA`X^Aa{Za1p;mOIy47?0~z75R!|)P z841yVAG!>x0zicrcsx%7lw(2p7-S)shE8mFwW` zbbv+yK|`3}Rui}(3u;t>k{u*tf@U#56TYB&4s^a5D6l~7J5WLaweLXUAd@OUO)#VZ zfGMEt09uee2UJ|Zm+iDcc1}X7c2J;Ofb#+*L4eD9a1oERfv_EPSTe{>1)wQnG-9^ivh;js+a1_qi)hOCwaO&nW;?&fZWG{!(vW#F>SMFl*X6ajL3 z0BC#?*4yrMQE_RmQE_452OrZ4+6CX)q5=v`=srVG*$N)_hZuR>MFrGOWq1h*SJ1Lt zaPbSdXtDy5dZ5#0;A05_UaJ59|Nl6|Oi&zkLzu9o=%5q>Uq1;skIY5I;plHc(9|p_ z#XySyNQ{9ty)f{D#}`3fae&sLM}G^rs8}5REdVaykN%E4c=U(Hi6e=>bq@M;9`rc) z(;gugbMVN+-#Q086i;|^9ss98(8Lqi_)ZrUo#q-99R~hZa7hZa4P+=-A;ii~4$!u1 z$oPBn8}PztP@)9oQ%GV5^%cR(I>1p3-lwVoN>JcL4l+XlG?i|_-&_PL^}zF4)}Z@v zn_wvq+@%6F8o}m5)~`Y@7J>{3z!LyyZu*#uN;u<7(0nC4^c7&W1o%7=4H!@3WgV#N z;G%*)GlSG$1p5b6kHHcyhz7d@>%APHQ%=BLHqd-9D0-3o2QJm|`440dXut`4!UuSs z56yp|6HY*-DaZlPMgz<}pq4QxV}U9ckU1XRoc}Li2^cSMAVWGpKHVH}>ySrS5Dtgt z7W8ma!yaxP&2PZ_%Mw8CZj|#XkxwuLkKRL9R6>dz&@}^~@mz4KgBJz?pk(2|kNaRe zkav+A-k^T60c^<$cyWOPwAYSQ!h?*5)-=kXKD@PyiUI6Q01wdNc1Zm{#QK`%2lk-# zHQ@D0prqFcJ*!9ov?Bm?K#l{R1_NlD7>YX~$DQN$7a!1yGg+k2r!O9z50z zUMmh3695f1cDkrYfD8fO# zDgz&G&=51^xKmJl4jGjKtw+GNngDW@_5yIi1LbyQkY-SXKoXBtm;@b;2bxO<^<>{@fGT&;mIm;eMF~*G5dgKvz}W?y3c%T=J48hS zIcIo)*64Tps0esiGxEcBzN#}que9P(0VN*+5AdyY>I|SuGhmj3RJOC582DR2#Uv=8kn$PsT!>N5 zL&osdkd6?BCQ=q4pl_@OV819j-lL6rxjLyvrT4QO>5D3OBB>q7}Yw0Q&YQmhDk zhq|a^8PShm;%^7tI0!3VK#q$5Wd)>Vw+MHE2kg^degW6=p!P4ghJ}x`gV(Zvvu!hE z+yayzzu+YIO=(H|8B}0M+ zq#6{o;2a6+`GT4>pcD?G@ii$fqgxLhTVddbt;7J2wY~fX+BXB8q5%zUfV|D$1lp1W zid9gcfQCvzqM-I8*x}tsdnLg0<{*<^t_2$e9pcl5jBtQw?IBKwjR|T)2LwTf8iM)> z$68cC+8JKvg7rfN;Xob*|_hOB(zZ)ODbT45t_;Dy5k!V%h|Z9d=t z_hvh2#B>K}MGPo~SwK&|gV+FCx&XEjoITL{ypWx!pfNRkad00!4!V6*3gDe5ke%SI z450W0)oT^tX%O(Cneb2vhwcF?03FZ`aSy~JFJD5}&Vl;-pi}}$TT>u2G6x?qdoY5J z_{P0y{t1Tbpdr`^>K}tUso+65_(@FAn1iKT7nKM|*lEKe4OE(dPZ)=eh(cl>(qI6! z24Lf|xRN?F$#a8hZAiNUDxwS$0aeP7?IYc=BSAm~jswW^;6Uh|0^TZ&Wyv6-}HMGYfx%M%h%NK1%c=As3B1b-{&$RJo+!4;<9ga)qdaL1DvdKCV5j#(jtBznc?H!?p3R3CK}9pDNCp+npcn!b&7k=*koQ340NRus zqL2n%i~}oMx*%}~Y33p3o51Z8aO^?-1?mrAv{OJ=i$c={sDS`3ADKb}oXVw(w5aGB^%U!U3mVa5caH;(~35ap8AxgQEp^aR%C_kCHTwyQqMd;=QzB zWMF`nR3Nt^dbi*!5^$U7gAvitVF<{W3v}I01bD<3bWSg*p$}T(g1GqP;0rcTDGy%V z1N9>$-Gf8wfjvkPwk{57AXMQcWSYQ7B><(i0Pj;$fQJxh)fhZBj zhb4dpj6um2tc=WkM8{lI{J<+GAPbC<7BNCM6M<4CXhkr%J>a5(ZzB;Xc)+y@cps4m zI00ksF!Dp3(h~rR?`D)8Mvyx#K*QNYTZ~jbqgsr%?Z}VuWjm+{gDjqHft;Nk0=e57 zx3?k?r9Z0aXnT=h-fG?hJ^%>1db!I-#SfIYKrss*qQKaz1X^!H-Tvg@O;0{5D0|Z2 zH3p~%!I4`0!HE-mBz6W$Ou)h$TtZ-MRD-N5AjUqlM1o`=YP#}cd^rIr^+0yQ`GD4c zpqJUopmrI!n#PhDP?HnP6Qm{@wDWALB9zz3m>L+;TtO;ndmnwgc4{XJA$3epb z-wr}VAGE*BM5u)S*ETvXH;`CCAzL4yh= z4bZmK=0jjVLfj16u*U?Qa{&+9LS~-9cYpbIo`6I$NCM2l@CIl>iV4_b&@nBrMzC6_ z$>6pZ$N-PVg9_XX42X~gr)!8W!HOW`U{G@$cg)77$|! z8iNB}KnJ#`D?~-jqw^pv-GKDM?rVUU237?TM#~>a@^JrxoAaO>8ev0`jRzGN85nkf zCS1WLLB+uWu-jzerX$T)fbN%vXaKi@pa*_~jmH+7p!q12HWheusG9+HECD=A;WPm> zhJ{240eG| z=7)>HTn)dT8Z-jH@bW9Dn*vVrklf_B1ECAzZ}4a>=oEFRQQ$VLhDT=y$Ty%J*x+>6 z*!UDDdnjxCRBSEe5q&!L2u>;tiB?K}#CI`!|u- zJHvwwHD_Q;x}a-HFcThlj2B$fVO=c)KGzgdqJd)v}2jIy)q`78D*G;4IqzC5- z@SA-XqX42 z6TA=H;$`T6_$U{6)a(FwhSlRGH>g1fZh(TDd$`>Qx)TsN=RnsXGIl}EHG`x(=)O$Q zd_Jhl0O9)jQ|w`46s@WRBb~}Ne4xY1L&e)2L{kROKp*$@)vY4D+A~>`F2$h zw;MdX1M){VhezWsCN4572ZsE7)zUpwn|e9s}nW z$P5U`$Kcid2A~Xk@Bym_BlHd_u)}fKwE*TvkalQ*f%>eteK$1Sl{~pI3AQ=MWOP_9V0}X5yG>|qhLLwT}^+zeMp!plJtN?dWig70){5BH8 zW%p++1(JeC^Fa>K4qpM-#w(C(6+9Xbg0n58r15Ax1mZdF;9!TQ5K#OmcpPs4HDWWGF+v-5AsJ!+f$r=?&S79jeS_5Bc-C@)cIu&MgT?`DWf`Pc zgUYIB-^po6%haPrb0ffzR(lHaUT6CkK4f zfq${2X-N41@&MQ&U;>ySDihaITW1WoUP zOAm+)q|gLccm|MVmk!`%m*7b&P#736@J|JuBZa!`66`5h;}5)P*}$W_0o*JF^+R5+ zf!0k1kOf`1%Q$|Fcmb{1uy#>#;BSR3bGKmNZvic+0>!n1M|TI<8c2H+%zg^MRUJ0iY%p{Mufe39%X7!;l@?&{gf=L2Z<*Wd}`d&_RFr91tk|dhxe|8lE7h zdw9UxUJkIf7dVv!V37dda0YIagI5_qj(dhzx!^92hX->9sDStAgizqF7`W-v4H3}1 z2$urIG;|H4!^>n);DHqqE+VF&hXrWG5xC3&#Y+Hm-~?KmLi$cP!xgjy8>M82n*~Zp zSk6C#ryQI{g2ph=jf5l?)B*vVH6blh_#h5wyaYur^n@o^d4n(qylNV@b_Bet5E25Q zo*gI{ASyv|3{IZVHC&+N3BPZa$od6zl@N-XKqWHdkhIQ2sUF=dsuAE!#B#x-6Ew#F zZt+2CL{J!lMqfbZLp8qvui}Ark_e4|Tt<&$s0LU-Kqi7f0Sc;Sj=89~GrR4+^GDHFCdibcoOav8v zpz#ezpo3T*){USoB`_QGp_?gjCX=&hKJ0Q)(FbiRgUm^SwV^rzvR4?~JcjiWVfS2u zG9l7n0(3tHDdGJT%{9;(1wLYnExbXagP`z63`oFM2D&r61ogL$xv1zffO_)a^1=X` z%0VXv=!3%zVSVlep+OKK?V6QNlFRy)ITEO-qwq@M!QW&yt62x&8@ z0G?fkbi|?AKAhpD6}a?qQ8D<&z{uYMx_KQG0igZc;8Sf3Ji0+g+Q8Ze;Pe*$5|qEd zyAjaNeM0GvfP)HlA_cg+g4Q2vwl#;0gCxUdBs@A0kw>VY zLJ;FSS;0e(kct2%1Rium6#@@8f*k>FUx4Mybzt3D|ums zTMPJ@ax6*@bRI%mj}O=40x})km;*(INB4vVY0yA2xamKk1Ih*sFi!xpT~rKq&5&jQ z@A_6iu0Fu+JTL*;!P9(z5wx%8r6s8TZ$1Jlis9)+0(1k42&j?7;n4|NcMHNUDjXi| zjL_RCQOCb5HZXcL+p2?Nq{BtUoWBKfo)08KK)C`My2!NwNFnliQPlB8NH{`U60ph) z?mpQ5V6d^EstA;*UOIy|s8^8|9IfNYFV8v(zR32%n2Ws(w&O>0OPzA_&4J>YW z06Mw}=IvyMr9!x4vKSZ`z`~&ZJ7};6tPpg%l#7bNPSBbZumEf~(SOJlaz2?ZDh6Lb zcbkN$=ztm%kkTJ~={8&rEDm2J0glj}pj|;=1K|z;b%hbaph$qUX!^jLEt5eb;|Cvd zK{ma*Kz$1~3(NQ>ticH>8{t+!O9FSsmo2c78@L>3A`k2!Xb6JYFT-K#K!ranfg=@j zHsHoHXyB0*G!X$(1#Ulq2cEzU3s_y|xTAp|KHdTH3}iF}X#xXmBhqvNxO4ywX`>Vf zAOX0_X3A$JptA>{852-Ef!pQ=kgcO2S3;^B&@=@|A#`*PBG|D2eAqced;^#bDw{hy zR)Eutubc5y~!6Ufv!x{@g z{(*)IxX%yD=io{h(llyu1S`M@3{aFoGbXfXbKC*C5e~V!0C^8m{D2IE9 zay7&>hfE*w`RMJ-B58POR9n5=wf3^xq&`r~l&_y^KNI_zh}ODRhHo zG8q1YZk&dlp^cKixb&(mctQH10&fHOp55)cO8s8w*D%7i>!K7ml5ooA_y#!{%3k-O95$4hS#sIWY zMBuoKiVmoz1eFsCKHV`Y3ZNz}c+dyjRR*`(6+nCBK$~X`Px`c9=3nH~e!24)XlIaP z=LwKUI2=2TT{{C=Tsj>&IsVI=oM(>k&X;qC*S zZw{6KI}0g=D8R1N^-)m()#3-ZVHFOfghCaAqz35bZm4-M$AG5%knMx)Zv)*I4Z6&^ z+ebwQtO1mHLA@XFj4jv>P}T-r?hM|!3zahA?*j!l=-6q{ki$z*TLL5n;(!(ufYf)p zsHlMJamaoi&{Z!6kaD>PbQT_nDFr3O?Y)8PKaFk&4zQna4|0~F*$B$K8qF0f71u*d{MQi|}`XmbZef?F6TaouK<;koaJy!}=E*u%qxn z$r^W{VT`YX(+q>*C8W+bG)5qng2Th3@eO1}dk^?fCeT3`0q{xyR9}Ey1)AXmExq>W z2KmcJCBSh9LarBjAW$!=IJgk;{{}k#p1&2mpc!^$QZsl^8GKeQNDp4?B)~2r(YhAM zF-wp$XhG*ZBe`D!IbOg8Jj97D_MnDUFJxyA(zYG&EI91+HBdr?9i*%eO6Q=;ud9az zG&%wfs19(a#-hWA1w5CHwEyZLw61hG=E4%dz`xH$B>)tkE#R4(-Vl`lWOqRdaL{@3 zFqa>PbYh`Fc-(;nbV%(>f6%oj#As#!I~EckFwMMR&7d)B@X$OYDnKVr?*L^huy?=- z9%^TE1qUar41^feT)`pE-^vDUk{IysV`%>24ZC>-)LMlOD;vCQ23zl<0#V}&y$Lee zMMcNs-~%p*Ehrj%Q8c)tY7oJq0n(2F8ORDc=hCD31*6Bo7ht2okqjn4(FbvYCx0ts zdL8U02gc?fPN)tCU!!UOKCmC5%ZVSdVhU6c!`3VqfK3Jy2!#y%t)R#QmF2Jq1g%wv z1RE^;L4&j~+2al@pjI!8+g!oH#NP@#hX9oGnk^XkTOqfkKutkO5Ri-sDu*FwqQDG- z>>+?o_&_wGD+N0pLBMo^i(5z=8e64chSrz?k4b^k45+~hX-h%ugL(~YgGb{LP-%l! z{(`O^0~NcR{4LN*#Y7y>78p=sLT)m`ZzlsKV^EF6z~75}hz@x8HW`$>4n6>nGeW8% za2X3)?*(2T3tH#}(MwdF*ojs{LA64iZy*IdZ7A8n6BD)jR$3kj`+}1Zr0EEXAJ9tKjt~{%)x+*51$QKo3RzP%SfGJ?4F<@$=7>>SR2N!6=Sx9D zZ3du5J$#Z2TuFdhH{ddsfgjwqM>KpuJ^+oFLFRWb`ma7J9H1sMXq!&+5ec;W9-7}k zj-Y`=iap3$ScekQ)@TA93GAa{4|eMgh6V-((3usWmBBDif)2j|2Q#S6tN~h2qybXK z-v%0o0`)t<078MJSc;^%q12EmAq5-0t_kiVLLk^%RQLyvikqBBO0opwX zHm$n_tQyqDRM_<&Hc|uD0Gb|C0PWWTThk4-rW;}nSOw@B4v^bG849I8=hF$=%@5uL z*BPP$p3X!%54rgVBR}NI9Z-J>6fR^QhzwbOOUnKs_zw6M(85X3UP(|JWEbd4Yp{`Gz!SgK|n9Xfh1a{sFZdL1|wDbhsNd>`+d; zhB^;9J%R7rZmv;L;p1;*V_;x71C9@nLXE={0y=zD*g(Arw&ov+{5_ynCzMyk-w*0l zLU=C{n-4g4xTvs$2MD@cRMC{(T&V2bzC^u2MJWhxWceOOjB8L9J70xd%R&&Kxx10}5wQ0rWBx)Kmg@r#Qg= zU2>F>2^^G@cbxhbEm`0RsaA02UQYC^#eFXfKohYtv`BwrvdV=1gO#z069?r>8vkM&xPS-Dky0k zcToY2je(mT;Aw3R{(U^~RLjl}zLf&xF7QeJ5|DKSs38v;w1KFAc5FFbt^*~eZqQ^X zq8$jG9EQwKcCmtz0l2aThj$mN6axd&crK_t>d|Zq8VH3qBUnKW1($f>b|%>KU@pjV z1xTHbI{$!(I+#hI1v)!Hr3F|wDDi+g^^oCUS5SC>vJ$8e^7w8FvJNyn_6wAM_4!+2 ztxXFgc@NNC_ftS?E5NY{9^7$9A0dXcPr&m*&}JY52LpdIs5c092G|oXK}iSFNMul8 z;D;X)sQ{X%e+lmRH`b_VFfcTrO0qD3$33As8JJLX3NU~#fdn-+6&M&CAlD*-(%vp1XKi4lR-J4 z;b%~G0(Dv-!)drIBE|%8oP!kNbORM7AU;4%{h;w7@C-aSA%gM)D3o4;A_CMXNdPUb z2TOrUnG8_l0+N4W>qEhSKxL@`baW9k@1ucb#s@SP1-thF!+KDy3@HjqR2;wsK?^wC zU}w;RODTw@;6^WG{pb-;j|IG*4@dn1t5ZNDTj0n5HP%7KKo<@+)_||PaNutOU2Onr zHG#JQX@G*&0kTv961X7udFV1QFn|wE1+Qn)@Bo(&EVM)$PqzU4%Afxrvx9+(Yrn>0WP4GIo%;DE}(PHJ3SPjmO>nd=$=`8b5V(B zgq^Gn8c7DP3_@JVjwIv&)(lDGkn#(19~|iX3h?cGz9RRWebZ1OH$U@KsE_tA|m;h?YM1YE3&^dUZ z!`(nZ9RVr{Ah8E(_kkQmOu7VxD)P7<=-@Pv6YwqSKZrKA3DN_a;J~Nn5QZM`ZNZS? za@bV>FRd6E7{0lvIhbO0zcK|zZxF?719_%zq3_%QIdIDy8sTvYN^7+v_c z-RN>r$pf>%8{QK@rA-7V|A96m`gn9caOsRNaOn)tfLuS1l+j^V*N@3FAIUPzZn$ zmpv#rK#9u^GQwvI-i!!M+Mp^O)DY|nQLzO{2MTtDsDKp)3U!63*n`Ccpkr^Kj1C%) z0Yw66mH=c1hz1`)54)iPdglPd_8t|`dTodUT2$tN3b#(k5oMr@G{8d%&?A;WsT;aS z0#fP*fR^wyLCQnOp;(~80bHmwzhv}KJOQ2}gOsV*3S^L@&=Wq$LI(ae@c0{SkO5S# zfjq(h%~c-6_Iph%*J)ni^`1Cx+q6g$Le0tCiwfhDMc*K<&peO-n zFmPakx_-$1cL0Ywq>qL>+##JMq-#iCmcutCg3gMER0U9Tp@-u^ZyE(N~Lt-;fBC&x=wX7HVWAP0f^ZYSWQSx}Qe16rWu z5yqghu>xGRxf-5y?L0wlSWW`9FrofH3N27zfD;o`3gW#^$T5xZ^w$C!n}UT7NDJ66 zP%Vg&-FLD$ECud;?Z5qhv0bbkUy zDhKVy2Ok-!4Qg&^gSg;}8oEJT@HI5eu#GX`v#2Wgn?WN3pt>D=9SbNl_;Ft^2)Z5} zwLAkiXxcy}BrH%7NiIYs15{jsd;xIMOpq(E=>T6HTj0U$qmqEo0}cRaOo9Tv z04drb)f4>Qj22KU9g!2k7wy1RgQl;c>%bw&0y8Uu8tjnm?2ulN2c%Q$xI-F!nI9|< zcD8^U0w7C3*&X?YN#yZUr14!)s|xRZftYr=sDQ_6A$I|SIsu4t%AxahkohxE(+xcG zVE}47AdOvt2EZZvY(OOmXcZFLdD7U=8%H#o!MhSc2S0$uX~5|P)GX=-w-`XTX&@T< zAYS7^1}5Z#aX`I4@R7s;poTKW~eb&iE3vAK{pbia7(QNd@k0S%92x4o*Oz zjuCWd5VVjGlpGvDezgF#lMKMqo}CZS+ehHmJ9rtzHy0Ii*sXTWH7aNxVgxC~I71w= z{|Gdn0-jGw00lDm?qeU7a8O)Ez{boV2I4+vy$C%GLHh&XJ}5YgLRLzE32(vK@Tthg&`;k!ChRBZ=icP_*+1= zEs9!jCWMN(sAzz%r-X7LhM_3{nF#LjfXBMQ@#X<7u3&=){jeT8_)@NybqwH^ILH^E zC4e9U!0Vb4_}f6Ee-MYYf;zWIQn*W}Ivl|ZYA1uz3Aj(50q#ISw??6~X3^TSpz#9a zObhDYLz6sYvy!d1v%52*d90E#>X=;fXeVep<7P_}_>(E;_Sq0L$N_zuze z4`&Ir65adQGAA^@27odYqyqqQG&p`xGhsitCI^isGBAR2ZvrASf)fE~eIsNXu?1B6 zgTfb)4^6tkhrMCsLx=|4?Pbt0w#fAhL_Mgi>u^yi?{ZN=I@=#@{sWvfQLZw94mfz= z_i8%hONdv&N1XVmfNl#1)mUIpf_w!M5I`x+K%(GHZw}D48`KLLs8`dwTvU*bM+ePs zTY%D|0jTJKtn>zzdEhUdDM&>iG4NX4}iH2Mqnfr1u#eF*&2C0Nk_E(c&+sla>iYg9ZK;1^w_ zGrR;%5rW1y(m=LC?gRjt47Rh=Ma8DMM#Y8!a=9UBlmeo{1#}755TFgEpd| z%WfRM9cJ_Zt=s`Ex4<0BfEb89BOr$-$Xn3$N#I%^G_LPz2-)9@2n_iAJaW+h9TWjq zui(*EXtfJEgU17Ow;-rL3K~j>9J>MASnmO862dY)cy0nR)elx|Z`XT(}(Vuz;`CCCv0{$*gRSb@9P)z|@GU1^O zT3!xWY6g}96*?Ly^A+HGK?*>PCI`^YO&jFsa#3+O#=rK`o5;(P zK&v$&rCK{^XV^|qBL!?CXhI%x;aVT4wDJJ2AqKUoz~uy32`I4OOW0t;iUy$U3XVmH zzaa?Q20$6Qp5 z8KCK7?+F1BVbO zUKsh?p_QgOdikq`Ej4~4qEDnQQCn+0Zc$mVBqfq#XXegiRU)AXtZ%l(8;inoCIF4#11lo zz4IWnR)QUIb5a7dO{m*JAQE+bIL3M;@Tqa2IWBMlg*P!k84c?If);vv2{d~GKEV~- zaItn2fXqi=)vS$0vj@0vgm(-f)4o$dLrL%o3tXW=&P{~R*F)B(LK{pP9?b_GP|6=4 z6%ALz1F+rKpnezX5*ZEHaf=$@B{Cod4j#=F91Q%eS)jBA_7!NL1$QeSbQ}?KM1#!m z@aP7w6oTAw3+kSAd%y%h3|Na59M~^m_lH7lhLl4JAnPGTC$z!gxWg4^xZ&30hE)&D zdEE{i9-SWG+RXucE+{;VJ;0l7JYa$jkQq8q9fEB>8tn!$0Z=aDfF7J@c)-K*B4}wG ze-mi95)?j=#X_)S_8Jdu^u-MBB;I;$!`aekdSpllR3qa;%fSg(YDtREIkc5*y z=*kcD2rmF9eem4|ji7ND7Es{>cEoy65(W?XK~gUG@>fVp0DL(EEW<(uHjyu^1jkB- z2khDbP`E*dA-Y*kfOa28K(iR=N(oRu-Gh<89X2EZ$v=BRiKrW9Xori6J;;;-kLCj} zz||C}(6EQCvNG_1oo@%)Fu=dJONot2R@}59&VuW3}g!^ zqd{zWITaNA;Hn>H1Go-FBqZ=n65zrbq!YZvA^==Wg1F!dIX&KpkVGff`WC0rfvzKn-Q^N_cP_ zXn-OOY#S`2c%ZabA-!r)ss9RvjDkK5oR3c4+My8~!znG5JV zH&DY86eQpoda$p-omt2fE~r%vT2l#HUI$(ttIrQU$PQFiTf3;ZKuQttk~(;z1hwiw z@{kRq;2}NmaG}M^`H)tf16XGpxKRNaB;N_jO5h-VX%2IvPqzd3)E;ElfCec+ZcP9U z(?Y6I7nOu=4++hSogNY%;G<4K!HtN2$bNzl61_VN z3|+m8O&@4CA!>mI(+3@7g|vb|ajD<~$)+f4^q`3tIsK!iFWATtNFiju0;)VbJvBdI z#-9F=QamUuHK6SmP$~x{EJ&jevJq5)f7?lqY)HcfzFz`;JOZH!6sQV#0u^+l7HZ&t zA_ktB;VB4Pz&=N7lYyLW(Cr`tvR%Ui)CK~th=2>*f{v--Z--2l!{PvL19(>nrp4e~ zg3b1~7`DR}Rd#?!v<+Yv1%T|=fVN0LC#8TZ76at7dNsg}uNF`n6RMcOqq!mgwlEo+ z?Vzh3QNs}~J zS!z@~AWL^!z#A%hK}!jdl^<~IJb<;7107uo8ft^bE7(<_6Es09g&DyWH3NSOXix=| z*#bNp4}g!v>W0|>_7EsDf=d}l(F-!HoPhzfX3HJClpg&kNKkhjH1ZeV*?16S9LQ+! zPB8Eg7GxO+NX!FNJcFwcmD$ zQi1fr!Sh+*{x@VPDZYgqaac-F$h-k4fWZ+3Ca@)V&>|}I1dpaS16)s_&If`=%OEF_ zvVxnrpqK&`5U@fM)cypw>kz{S;I65|E>JB9jtyvNq7+P^vKF+P%Y}gf-k#`k;8S6= zVc-Xy)4{*(KqRP10BP?EfL0xasPKDq@~Cu$sPH#DVgzkp?DF7ic*NN7@E^y;4i7$$ z<|6`!A>(H#6Sz#aq>*nEk3A~S5f0h|ayi4W9wf_Lzt4o5l| z-vBbE&;mO41*9B2u?#-m1gsHa3}lg>0%)-q?$nF9m;!Xg7o^b!>&wGMIz2eRhn0fT z5x6u47n`tgb5K)&162Bes{?593NNZ5Z3qWg8v;_?;F^B`MIFxItHwwq(DO0C#T=x5 z1GVYFZ3oaUVVow_VweP5?+u=Mz&!|pF_#V+q=JSzI0=CX29M?g;A4`&Jr1Ob6BK?B zcY+$)xFe?>oBI%bB}nQA-x>hQ9K#2sYF#<{p5vb#d(E1mYw7{0aGZl$dg*_;!k=zYxErAvn zfd&;owTM0bS_Cxrjb4iwK>8A(TErf?7J(Y)$={4#FcYdlKqri&+oAz((7^Kta(@PS zN&;K)avn>Cgw~4y?GFW&8(?8bF9KeoLozNXz^T-)xQO8%c+!OQ$3TOC;NAgb$^}yR zKniuxokH+J9aQRpN(NY=4l3)wWg|$Hhes!*+y*CAP>>@P>Ts2ywc+4$6{d=jzZF)f zgA{?gGLWMnQF;-e-~bmRU;^Ua)N=yuIRfvU0CB)$ZJ>l} z0PRG8G65xaaA}OYc)5pLBP@Y|f*!Qb!UNI+1T!J&tfK+6Y`5_s=%^k<3mF<+4G@K(&4|{G zpq0>gTAWWYTmhN|?rs2S14X8Shjk;!IDW_^IBcXDGGz=2b433o0yO>%8lMga4J<=T zLqcuFnHa?^Xr=(Qg-cw;I2*$xSUZexM!b1bkE)XhjC(6j$(lYIyrc2S8n({sXTV8xH;N^5AcHR1c0lMo{eWLziH}>U&gk zTS2u1Xi_O0)ZBrNQgm~GGBzZjVTS}j?~`c;4K#tA2OdaOT=c)tWS zgg~klK(2bo*x|ts5eH3^VO1?R8F!Hy8*A76E5W_JC4o2wY zJ}B?PHb_D@)> z8z|tZ1$=(N4$x8N|NsB52krYc;Gd4Vc^$Mv8sEB%+C!|_3C zz^muLc?{BD2RSR?CHPPPP%XfLXBR>#M!A48I}A1n6y^cY2nUaM5n2AJU@QMTnkxht zU}Hpx;dqqxg8(R_b3n#HIY5ER4w+*CIfMf=9}d2c31y}hG;{!!{gu!1-Ot6 z$YBcI4&YvjfwiLre=DrjsnG3U1IkSX){ZuKCP_dm1JPSSkfIox8d1UrwqC_W#h`fy zc+nMqza)6D0bZzsnk&Z}KysjkRv`C*t33nox-0E2kc3C_$!?bp2hhqHT=K_VIzXWV z4grJi4v?48nji4Pre+O5sT{Pi1#GtlXdcCYzZo)v4?9R3lsKWW0X@D$dSOcG(>!JQAuayhm8OAf-VjQ)imI!02N2IkZl7X72qYD zNX-@aA@QJa)&Ru^NGEuEuL1{uGx+2{_=FKe4X6}{>Mj z^%u%`GbpvHf=&(t*H^gv5y9w*2)UZ-F%e6g-+AKo-10&TRnYc33z=jxPn7q~LMz z1-MdIc)9yObS?#4?SmwdRvm;uc{>LkH|$4^Wc^G_2x)*zgB)C3GJ=)^%r~ zgCda2cz9GGvIxjMsJ=rO+;S1*cv$c=gIlT(>>+8#8eI6J_!;U;P|NEjs1^emjUEHA z6bp9=l5J8T+aOJ0+?%j^(enVP1q@0B;DHuMn*mfGpwDN3!W3Ktfz-l|4s=nm=ys5C z1hw&?gCUR_5Tph?T5Zu>A;ZAm4%x#5Yk`Am1`9mn1pZh$ijXn@q|*S8PRt7vz+rv_ zvO*eLdF-O1&k@DKyd^;4GOis_v!ReF#rW3_+%^vP`M7i z2_4)Lmhfmi$N^gCrFmi}xOF|#4dFssiUL(4Y(le-mil z1yrQDzBH|+a|%MHZg&^PvAw@pwb;I2{HqcWV@R0<-q!4+k^tH#1X(5kvK2h8THw>&03K~aJzEE4az>X2N5jLv z9UdH@V%h=J72X9-`P$IVO9rU0b^u!lR)5?<2IMply8vVXxblJe7@R(!Gshq~aE+GW z(cJ+W{P1W#2pW6^Gr@D|ki~gu>&L#F@-N zt3Xioz#IACQ5SIO1hyJf1>kO!fsR5!H3ziG0IUbJ0SA--9GZ84j$dblbt$1+8=*aC za2W^dO@Nd`dMMqT9@!@oK;;)GuwFg`jgf!~Q6@Z5br>Va5kY(iWOM*5>oguj%2H7G zKvM4naJL(!yo8-!hB)EM!vit)<^dmj!x`3lunawW5K)Hg#n1=Yoenw(3EB;Tv_^2+ zybr?!(2#TUjuQkD{eG95|dy@9d`h=PQhJTu%jJN(v`zYCs3mcynYy3_JKwxcY?Y};Ia%f z)}zq@US8(`8<_@~ipurXrg6@q4 zB_P=5JWxN|f#4cK(6%#ZXn~Uz+#As2@bu9ghL&cao*DM9;{eWi`Da zsMjQeI_lst|K?ZVb9_MKfffw>xSN6I7}kQcfV(W1jV=cc@JtRUdce6JYrohAiv^ImBK+%JY;o!%Pz~8(XaqO%K}*2k2V`gvT7hhj zVF)yFz+(_pq=NGdB#nYoMt29OriZpF!A#h~TZoTA#jgfvq#BfAp!$4NG++f4s9ysX zg$F&TJ^>xQ1j;R7&0uLz6d1e&-FOA6g}|*{Sm6&^{RA?m+fxSA6>0?yj36|^%>@r9 zW9Ab^aFGomAQM@zla`QUA3RKA0IqRC2bP1%X9EJ2X&6Ruf)aPPkBR|G6>0F2?eG8p zAOk^-Wl#X(YxG88F%+Z^+E@lJ<$(GTT!Mqj0?=K@xQmh)G!sGB3BZCLzNGfJiwdYW z!T{c24RI@YZx-l0Vfc;=9<3S{H_N5ViMa38%)1VPx@Y-!qDzE?_ z+vNkjFBar>(3OwS@PgH~0iZ+$uBj}r)wOVC&<-5PFJQ9~O%_<={-qrimd7F7&7t*Ys1203zWC8)>D7b^nx~2fOkWHcQwEQ5nOD62uQ`uL|nzpj8?9I z;*wC2$%3H=RtCfU;tk3vph6U041ntbJoO2v*#WW~RR4hvF9DSyFh1TLIoueo0Uel! zr!w^Lz*-rCk9~z!hLF}RhOe--Quwi0Z_v#E>IDWsroTba#Rwk?*8pvlvUX94;BSRg zp|DkF@UR1=1Bf0_+YfwV7bqaG846MWmID=Y=oQwxzo=VQK$BT0>ACR@==@dCdCj1S zB2XbwE0mS{n8zF?G5NOP0*D0w-&I0 zjQp+gVBN6uJE5jnJ8D2L3*`l;7ig8QFh=T{p3^~Lp9>*P^bF)w*U=9KGZXh$p zy`Z9`H$(;6Mg|u@prWb`e1jTjc7lPw4Rm!6tgR0UI|uMcF(bI=25v-Hz{ajMKnEOx z!Ut6Hf|n~9fX+h%g%2ccg9eA-=fXI=tO1ufXs$yICTz*b4{gZ;=x!QN?4YhUMw);3 zXx;&8=izIGxT2LCAdec5)PZrsFacD+5bkBT0v}J^umu!P5aYpZWmr7`8d3mVfCgS~0%;#1cL7~g;KO*h8*3VDX#GBL z6C5<80*V4?gBa4~(*U=HL0KMa(XWZcB#-6_34GIiTG;eJR=?nOvNje?4v=wl@S!N6 zJ%Et(4#`k8Di$34ZIA{Ac=`{rCJ8)-9RS>0JJ`^8#d(tY7|38hd``=mr|gz4}5$A=v#hL?OgL2HOW$q5{s5K}JN-2)zL!)g#Db->&}ba;R&HE zqk-x;m(CUy&{7YO3o1Z!Fa@Bx2$UEYKxYnvx{9DG1gx|hs6Xs5t345+D6fG6pHz|aXx$)L$I zXg>xts)p1M24719=7TzqkPCG{om>zP)N2GaS~5C4WI*1mVBl}N56;3aDhZGx2UJgh z8vo!xg2p&#hca9YQic+a+0ROQV0x#pBt5v~c zgPP#>19%%1xYTn%F7?1(1~rU8O$Shh0@IC0KwCh;_c?hqz5yi?kQ6B7Ks0Em(Wlc# zr21YpzkrVS-)+h^=jL2E+Y6Dh0bhcO-#Nj`V2! z2|7U1gWnx|VL<`BPytWBMtB^20nSv=l@*{VeMs{aXO6mvW*=y*0^}1=2qbh*fRu(l zD#-B)8PsiU1}B3S6_EcynFgc_RPt4TA|5=akpL>~prt3MRR_6X@;KxqXmF+w1ZN7E z8Bd_6J z=K#4K)+`0@=LR2tiT{$O*!t^_492ZjL95)7R2Y>2)Hr?Ex_q6gxo3Q$mjn?8_s zmdC*d%pQzz_d#3_YCM3v0IrohE;$Db1`WtLPVl8&7NDhF zAm4*dbpeIqOVCZ2p!9FxaqxvCD1^anSPhTnhv2h`ARBZ+qrnGXfS0!^fFeKvq!rJg zf+l(dz*a$l3nd5eW(TDDi_-W8t=d5e0krrA9r+FNBU*I9(j)HpZvOZmbPWfn*9}U< zwU`4+g5dEl(7?M#^Fax)*`VYHKF>$NgBfHTR8jyU30Yay2N^$y zNrR=pCy|2&K0UNy;_$o9UP3ZEC{KY`GBA5cc!16U0&}_@z{{~fyB!7i`yhMrL213) z1H70FwA&GU-=YBnWb7E^6>uWZ@L=ZffF7d)S``esa1SQo0Xo8s1KLJBVgWvn1LA+E z|3Hi8x*0rJ4}f;gVV~cHsfSESgTfs3{8Q+9UTC~px~M4dL$4kHwZI{X030+R7b}3K zPe4%*7J(XuI==`t543(7NfBcH8fpJ5Sl$CVy9dn`pw)>;mV&H6+HV==(fB3+G>p*M zq5`^1*rRg_@j9uq%o?TU5ZyZ@OXXT2ur;mFDpl6$#Mv4=B|fZ&6V|Vrwum zF#HFJ_qM2j&OZg!DS$b#I^vA_(0BmWOz%8zKp+;K7=@ zq3&xu*Z?{a+7n!=fodJ_RnpMP9;yjsF{lOuwT{4=J0b015FdQKa`TP|(8M<6q=X$H zFMzaw>cE$f87Js%&)p5+)wVFZXL@|!3DO9vKM#P~gz%dxAY)b_$ATJcptcOiFwhtf z*uKVtU~?eL=D;Zr#giZr@J$yG$GU*p{ZJP)@2G&d6tu<&>QWb#jF+Gzt>ND3ZfF2S z4YD&qx)9C;-3bC}*noP86`*tizODo6G_YQLPKy9p1an#fhy&KyydwjP(*n?)209xC z9uS}q1nEL{8o13E0dg9+0~-KW+;|YI7sF}2Ju09ZeLy)0RNq2_atb84n}!-`fN3&U*B2fpkTC=cs@N_I-M%K&~9>ZBYRY0eEzls3?H$p3(qiY{(W`uq!~G z1&xR7e8CJluFd27N6*fS*aQ!Nia}7q0F|=f1O#%dhlWolb_aJuEbcr8G7OaQkZrh( zP4Ey%5ac;zm0-7^3u1FiXMuxHXM}}MXMllECr)Q!izHAN9@0OA6n#jUym=2e6dCy2 zz&o?MQKJjBeC+|3y`UN#96H@SV68X|#$ys_ZU)rQio-Y`6{&p(YA1u^57bHn?T`cQ z?*sQg9YA9^;DK`Rq&c`f3qEBI+8PC|3kOx?2C&v2$OI3h_AQ7HI&Ttk-zq3hAhF(} z0$N`T;)5&((V&9PrxS8nBxs%wl<+{!LeK~`XqFG0@OphzB0v=`XoMA{k-?)IbbdSZ z_F3?H1xTaQqxoP3yfX(GE`iRocr+g@K$3wq(7-iEC;0X=NGl2yaTTE9QSdSq5Cc3; z>VY(<37YwXjwv?p0p|<`{+29IWdd0+(+gUZYIp!-Qou{l#hV@|+nFQydqK@9P&X8O zimC_X_HBe3&@dvT(*PMCfi6o500kE~I665%H;;ir2+86E27V-q9k5uOfUp=mMrDD; zV#w-9klVoV4PMFO0J0cl8+dcq9&p)!WN`+H#Rga`&OlfUUa+Bo#bOP(kHJT9ffrvG zfGmb22(XVqnT&zI1vH=t>dk-~tspU|yFf_^Ng6y;0}_KugA)#a3uONhts+d;b=-w1SusPKTd#ez1t zc7yicBlWK#^V^_w4hmoBu3FGp@l(L*3RFUaQm9Wa*D=LKvhsL26U-3yt>1$hH< zttVtQ1AOKhR2vpK0r-sst>8ObA=w9NBbz(U~QF3>zbXoA55A_Te*0&+D* z%PDXN(M83;v-toEcvt|^Ho#Cgje&sywAB#QbU*H*Vgu^afYP=H_@-wU6$8*2`KLg| z5U8^Ob_B>)s3VYU1UU_EdPsAPN(g9$Hh4$}NfmhO8l;p0-)aic0gaCc&^QKYu<#{_ z0J{Pr5Ajs1Dgy%p#9;7(Gl*QLi%Lj$h)M{wm<5L=L_O%NOHg2<-Z6zfUW7Dz3J+<} z%o(V1a@@htzyS3sXe1qUG)#w!O7J%qm0(85wq=AP8f#QSo-;Bq@VCwc6~(&kyD3E`^8>kf=cYp*TIzc5Jcn5t1e{&2-A7}~)q*Mdc!v+l}GV%91Lm~;13_wFs zBs&fqqF|!iMJ2=obo4a8Jb3;dk)WZC9Z>28<#Et8u%IiA(?RE)fDSN1zF-M*vrrpo z%{|Bm;C&3J!}i47?2CR<@HZEgG)Deb(1tYV&UjGH#X8yi6`a74Dq%>X!o66%Q^k;y@?Fqc6qy=AshE$Pcy#dTBk*;Jl0;I>%j9z&jxz zWvCL+M;89syxYAHg^2gM2~0jq+74wPeBK$j{*L=+epz#^bSIZ!9l8;J+ zVY`!+u@k;V6Wr)XcnMl}3#x!D7+{ApfK%Eo&~8Sg#Wdgy z1twsMK`Q|u-eq7=0C{&RJo+0RGInr)Qcna<$AGdD#04N$0yqhvmsjZbpMs|Sz%!`^ zjypi>k>ROG2V{oBF$PA+1y0~(08VWhsHsf@JpK$mQvh`To(C+uBVAQ@+(iYn$%UcI zN5vhoq8B_C_w68~3%~0DgbRFneN=Sd4$uH?!efA>Kd{BPZ?%H&-)(#YN)Dj)0(U@> z**OK$VeISycNmYis2l-R4F(JfpgIktl)(eq{s1)qK*cIV5Z(ar16?2rsYv--96^15 z*lrG02Jn2y30BbHC#b*!HL*d>TTt`vc#BF8=y+UEjk8Au@6UaPJChu+mYwT_?LKmh@A3Ycy@0`fd;J{US*21{VA;Cq;R zeNJLkJ zbo!`(PYV#}X6STL0iSs((Cxs|>7v2|%HkY51=OLV9-spNK!j4@1WREx~T%Zw0k0c76dhNWo)~9*`5b3=eof?@G4>7k(WsD%y}+c%hwNP{M;o z3%H~M-O!`m<)Wgk!q@>e8PtqHtYCm0YTE|tqJTS_patOu{LP>a7OaGUw~HZr*IZN# zpl415KrICqF(9Y8sDP_mNSwWl2PHmKZ$VDy2OT*;oDraw_)bvs7aUg5`!68Q2d8@k z0bZ8}YtLhr$1W-s;QMo3R2-l-L&|4}Q#--^at+A-KMl|UTI&35;AKmolml95c1Z1#+-5Gyu{W zUV_&_gLi!%Kfj6>(ha|w4?V@Ze@Bwv|Jgj|GB0!Vm{OyoHhc2Zu0G)YY0b0j8 z36x8~ht7e+EgiLU;?evD<-RNz6#)&evsxWSel(A+lYhAdFS z@!$){?K0^5^I;8IP$${~RJ1@^hTy0%hhCwMGbk{RxCbrNv35~$z~fGIO;Af9O9?=A zo;Ju3(85*l30#m-Jmj${@S+`fd#U*i%6TUtkOj5Sy+GYCuHz2Sc3Mce)(v0N2-+(J zN;(O!Ll;^>t^if81)xNf0ZLKOdzC;7C}FCg*I-f#AbnIoCODw>UI-s6au_{{g3f#7U6xYS8gnc(<>Eru0!J`#>guD|*!RJ>dBr zNFaj}FL;v2z@s|=eDNbB#z5^<@Ckn4eM8`uL3aRn^c5j*3~KO!u0$TV;qr#3~CI5 zN0bu~MK-813jkGSkj4$TGV=#{9K2Y$0yIwmS`FjT$pP81+zM*mA8S!*2NjYp<-kQ8 zsNG`iq5|EXhqWbOj**;vR3boa4)BT=$j#QU`z1kf0BZJw%9jk#POu2WlMtnlJOwU1 z0|fZnKoe6t1VC{MidOJI1xOEgd=ZiH5T^!$B*CXHTktnSHsOHk&~6_U1O9C+9JcpB zEs++;=|XVVF+*42fkNV#i;6$PO9|AT81#rCgO~GQMNyZFioXhD2PBNTAQYr&4qq$` z>#v~?!hsSQ){!Srgn>H-h5Ajbp;L#}v z@h_-niC8adcmQpFxA6^VZBiFx)de`jK$~tr^Q)lQbI|-MI2m+8)|`Xpoj|=m8?0HbS1Lb6JcE*~DL1zJ@nAQzh7ViOSHg-bB z5ESGFm2WlY5w*-phVmVnVtou4gU63AQ9-OvxhR& zXiyud6*NHN($%5@3MJsE*vs=Ieec%%4DQGcj;~wx*5YRCT zkn<0BFoGNfZp?woD|noML_irM0_1v7K*Q_=1tf?MTIvBxWUht>;Nb|KS#92<0-_oC z;Tt4Co(DT2iJ5`nWfs^Yko4%mjG8P!1|!E9h!3*}CB{HDfPxA{W3%Z86YM;qZs`0! zGh|T=JcS@lhJvpJhI9!6UP4Chpw7|;t(pXFFaiYyxU?()u?jq_Aqwzx$3Q2#qNfIs zYeB^{_&~l4kVzRJlR(1!E#SUoH)KK>8lvFs#1kStIlCV3dJr7CNVCz810pvPRvkZJfA$Xo2+*OBm zhQPHnqVof~=?mmW2M_4_VQ34^17t7m<}PTK6E(0vi%X$VMnV>ZEZ_wtWXRkF$m>vt zT0_DN&u%l&G9FY%padqgQwB8-vWFHt08xP7Z{Fx(id+J;fd)^%L5e8ov^A2OA?@qlN*f zg?fMy(&B{oj}iM3!DH>+kh}$%+U!vQ9V!B9iQK`Ul zjv%P3i|ULiDqzz_m8UdVq(H3%Wqt2q2yZ%|k&& zJzyu)w}943fclylppqKm0Z<3OI{@4yDF7XY$N<{}1Zq5fbC6=>ZvjOD*hwDE6$K3Z zEugV*yry^*APwDu9S^#>7s*{hFyksLiHo$Z zA6$JyH%g-RPr&U_aHk8ps17tS0?UdXAQw3JfSZV*F<@*+?I zhV&$D|o&V)az34fSf3(0i_*$I(<|uKov1);et7+bGC~Ok$@pXjVc z<^^x0fsNNkfSeKlYGflv0yxVySAb^VSV5f+Y;_#A{yONyCs6jpcWc*HjE)&-o*Q)D zFYbB`v`red9D@z8fpQG^kOFXJiWu^SoD2?1I^g;iw8I=+R#8$Yy(I= zIL%`?9DH{MSj{&V6?H~_aL*C9a;QH+15Akfr%=)}Y!4XNOprRrjT|WbFPBai6%kNB z9@_r`ozx9ls@Dk`375d=UxAvkp#BtS8WobjTU4flO2STP8>_EA?R=|K*_K;N=%^bp+Mid@uvPSQXT?gv=JBYB)<> z_JNu=$68b%#!p2v9yI=10Y1?T95|q}r9gLBmob9Ynn9Mlc7xhh-B1@Nlmm!9fML37kWat@{r$HQ?n^ zkaf@%THv*4xI+weq!!%t03|HY|n~O>rBY!JsbrLu@ zK&uNuaS0NDG^Rmw0?95aE}o1BKz%Zhqdl4rf)`3a$}h+nW*v~E*#)5>^;6>!Q2sg$ zZ$CD_(Et_QD3fyF3<{c=>t+CzE)pL+_%{mjPdNymeeVX1oPaJFhE6D|Grj~j{<JV!|H3nin6jW-!_pdtOX#|5?Z797UPz8GM0UN0AW&oZ@0}b~e z#%nx4^F`f=1u39qDxmra;~W`q)?)@W0b!j=aEHnRJUj`CHV@EDbpU_!Lr~EJTPz03 zNgklAVqtgyG!+^Eo(gS-G#Q`+9^iH=vyX}euG|Ek9EGK-m$2k*0ZRlHFQ-A1H)uE- z)D;3n0(deP+O-7DN`VFeKrsnQzTi0%a2)^{5Cu8k0_6MxNW&iFCrHZ-A_E%!V+I|5 z4Vn>o$q$(aa)(7!1zP(B+Ft>Wc6WO~@&u@)hwWzopMs|V3S?L#z(>WQ+e-wTcH!Ox zt^5Glt^mqB;K~f_BL|;u22lFb@acBo05L%Kqk@l`umE)~Ahx{(txE!HZmtl)cj!5& z!HitVLvk2sR1hh>XMn5$I~sCyAIMZAT&{Q8t54fCxXoTy5-J)1hRTQeAWjNr19Cy>`9)=;H&Ovj92EN05@1tvi9I6Ih zga-;yi{qfxXaAvVHo#c{vak;BaY$el@Hc@+uOXQnT^%UpGQ120WkJN$7x>f+15mtx z$`SCQ5{PbSC5g0t5fp$H4E%_Din_t8i!8w9lRG2o)CahHg6yXO^_fAr3uB)QtZ3;3 zO=9;#sxF9+zztqlT@G>_WXJ-%OQ0LFg8@*y7OQ3ep1K5d|Jl1Fic56@;L%D^RNmQ~`p<`#@rlVPH@Ts1dYY zPJw{|i!(lgBLFmf0C5XiOhQNEm_ep=f|@kov$ViQnSzE~K>cZGLI5?2G9Zi5Kx_CA ztC5g>4O(6SawjAPK#8%}MrP4z^7l zR`NN3#!taP0Xnw_q7HmeNhc%%KrR3e=|cCM!1_Dj3vf^us~mSxkpK-EzJ$$*34p6g z@X$BtY~OCsO14fH6$$8=CX32v5B@!%h0#1OAAkz`ZqQ{l%|{dtdo;hnXFh11JScY| znGc#R*Z~@s&~{Pbfvmlfcqt8zFt9ay4|E;`%WIwhEvS2W0o^`uC!qjTemj6lMwI3~ zs1^gwW5c=}8yI1=1ZW8qSCU4ZKmgx^u`3nCDHU;{vvu?D0v#@gcp?GQrsBJ7Z2P_+WS ze@ejvdVUb7AoQ?q)BxQqi@Q)qAM{4J9(02ga{mlk)qwL9XhII+V92N{_+&!R3KqzH z!4`)-5aW%YAs zNCS9R0EolC-GK*sEgbm7VdyLZ|8@s1gfMtnEl4#;s{*QB;LA2U4}y{&Y<>h(ctgzr z9ZLdh0fP6%f#;CHTW`TNa{*|)5ad-*)2{+ld|CXz0LcXK(I}+xs2vuHuu(+KBcM>x zP-I{L)glUDx<^F>5xX5ySyUBqU`b`xUfi6I7_e4%7f0!w1Q$1>k-wC~!5^8jmIKxP5K`%FNqT0xNr)yds+1iUW46H0eOH;JGmY3LNw%K*@A zP|z#{O2Q!fK$A_N)(t3LyMrX47ti6YEHu%B=s2VY4Nf1&A^ln~8@5*z>Jt9#o?PIl z1udEdB_wc*5*i4QrWHgp$WdTEA`rke18lKCcMH_V&`GuCJt`o12L4v?C>3-f`#*mx zs3!%tsQCapD8+&-eF@$|3@y_^wt=*R%O=#}tk%QOR0?ief;z%TyH~*Z4|*bi2mksW z6>#bTE#QHTS0S=8xW<8HW$^xOa1jLV7r;iNK>c)(V_{iY1LQDJoIo-me2+haoA>e(ppt)nvUR%&5iJ*O~E&}|$;EiUWu_{;x z0OR~W@F1ZF1Ahy6hyaUH@TESW-9C_D1GnX&hckjJ8PGy{a8Q7WZWk37(B>r<6_=Nw zm6o6`Am}W4&|O?RXGk+Jfa-7!|sn8ZNT}59)`bm;v(NH_&_&tZfQf zGYq#5oL-3+F zV5^lG7#Mbfh6ljH2*RVA!=v#a=C1IC9$YL&(VbTU{LQP2hScM>Gx=UgVKQoj}XE3*nq}S!Na7G zBmxRU$aEFT_%ZS>KhXBy%i2|Os3+T*Q)KCly@aT2`PwU__4Afx3Gz_xD9qdm~7KGRUG7Yqljyqh?oC<0a6oAS-@bnS5C5f;Eys^N6fxl%PxT6lcH1fe++?+V2BBqZFPH zzy}k7O4Tk8e((xOevtdY>l_@w!{3lT2dGmDibDg)ft?W3AOo)u*Mf$R5#<@^{1%^1 z9~JN-yZ}(9_3-Ef&5|N_(6Ggv2u4j9q5@9Zki-LbHqKlkif#bpe4KVrQx+8E0gyXT zKn-n>MKwSwdA|R_bV7U%=x|c_glEs?G3ikdnvl3h1}!CY`$5s=)6D^j9Po-h@a`i>f&y9MfRwG94=R9%had?Y;{6to3qhK} z4NRoe2+|C0T7jnopvTt0>QAiq0fK50(2X@XlkY^d@fJ{cLC#_T6opgZZB!O0f1m$=hKMdu}m2bKl%Km}K~j|%wgodD3~EuaBu zkmDUdeRF8Kfy5yEb`S7ngt&Ly&%tmRcz(u5C7_!Vd?lOZ2|T-{=3>(gYZXU$*n+M& z!84RQ53lw#(5S47NT=*e@PZNC z?!>qKYzu~7SXO{nYuKv9tr*%s=aPcg;ovUGx8u-+ciGSmG)87a$zyqfzX$A)KJW@&kn6yeIO<+1576|XiwdOc0V?ncpd(`*jR!$TZX?wu zptXgK6`-3v8~B^St9(ErpgTW71tV(50i5T-)6L*r#TlRi24p(OWn7vkJZ6BZ1K8*^ z?$W&&-Rt1Cg#ZHse-pU;1`VHs%WqH>2MU6K&VxHZXV@8D`u-6l(e0w516e%+se4%X z;dk1BrV$xH6`BLS4puq33&2O~f)5L60}bJTECsid;GO|b?SNH*LK-}m#CQVccOKBZ z67D*q9^JOa8Wj%$MLp89ENN~dhl#$TaV^)CL+t}8#Mi45dL1&+$1OTXxCzPpd(L)-f37mhJK{*9 z;g2qREQWwjNCsDg&^!gHYr#uSaMw?uL)tO@02+k>r5vb9SeJZ&^H&7O<&Kb(5fCLF zR2z6^3FbYJB4!_z4A175jG!cdO*MF=4Sbvkcwh#+=GK9~9dhR(s1d^q-o@mif;>PA z3Ndixf|3I`=Ucqo2OU6)@Bz)jcY{_>At?i0W(#r_cySwAf3fk+3D7KmcZ`94#YfgHyCx%P>ad} zP{@Djgs>&WXrnsr9m9g?p>^Cv1#}@311Oz=H?4qd;cqSl z4}u`##Ss#A6(0QSA(nYE9t16V0*5qcDJ97MZp^^0@aXJ00xDBM5ejx>H+TVP&k@kb zJH%4(1iOn$1!N``n+HMXDS|9$e!=L$JO!e)6H0>)2w;Iuc!A;wvd$DWe88nGxFCYs z+kEgp*kNE_f+boYu7s?z0o_2_d=fGd1~M}O)ISdZjqZS4901ze1Bz1qW+Cu+8n^}a zfE}a~R&PN&**>tQ0A#@qXnO~ELQ{ejxJV5mq#!^%0BoMeAhOKd|gk>fHyh2lha5(}R5<;&t!1I6(9{lS;N1!vF zfbE9_ou3BTbmpQGjx?Nw*Z>0BHvt)agPr%-0ve40MI>nN0=PB+4`d)Vbbx9m1K6Bl zH*7Qy-rxZH`6e{I8i0#RkRp)3EKl(Fg2t#prh~RhfSL>tmqUvw?1o_rzz1l>!^?EA zjmQSTMxh{+L2&nBGwm6gX&{Gz2TUM(LGA_5HyFIU4o)@DF<0afn8t&kx*XyU$UIUj z=u9L~U^&183uRCclnY^j-U><(&@pR>yJ1RUYn8#OUqUWG@hLo%z_EzU)L+<4g)Z0toqq}*?}ct%hGji)9K!}vAp0HgS8X{M zLt(ISHn;<^xh&Y5+Bc!K2Tp^ZnqhJkU{R*q9b%%n$B$uw$_KUkAe@E-D_7vJIA; zK#MV;r+0vRg=j;&pw%)AFV}+7X?X(A(6c@^mw=KmxP=T2 zEXYQ5i07cj5@;@i?&(7>`oJTZ;MQ;eI2oecj|#ni7`De2UhaXsEx_LlIwc#_?15DA zJ}MU7JRP8TwdnL|0atK{Qt#ynP=y8Gj1S5^BK*yUplY?(N5uhj)G1^QgyT-o;fX6icwvagP05!)PcY^zwpnWBvJ};6Q&=v;A z9qbGY436Mq(7<+qx_t;W5a&Rwf*XUX1nL}!RghzjT~yGW3~>&`D!8}MoD6Xes7sFI zErgT7iKY1f6Dal#ULFROpT}KPK)q#fFI+=_zZtw#4m6kE9Rdn=*z!al6%A&Q4&?aJ z=nUxq$BPE6k)iQ&J1AbDYZQ++fMODS9vM`m+ryywAY-Qo_-YuCWOD^*-2h|@9>k(< z4->Ew6PQiS6(&fhS%5Tkdsu*#KySN&9wL?oT91HlzXW*A0Vq|0d;#ScFpG3_BJm5L zNe(>aYGBMWVHe2x;FtvE52&sJR4qvQ9nj2!C1J364j}X3sSwFL3uN;wx{=Hy>^@LB zpr-pksSDjau=_yM`rriz@cG1m&JY!rP9BwR7L{%v6_(2nx}e9azshs9Q@6YE_8?rxb%YzNFtd6O4Z0Uf*t zYNc>^bc?9)Z}SmkJou1<6FhPS7h*d2PykJc`QSqd@Ijms$m$U=q| zQ1b>j8`41*WWZ({TS1*g zun2VKo&mPr)J3HLGM@-r`jP=vfp2bq5{6S;R0@tefJQ~Z@lgQk6oZP2m*6W`L3;!t z&1&!l9PkOS1>Kw;*(Vb~r=dVLLV$W>khy5Yk`Qp~2z-Y+?$JVQGfdzaM{q9*5+cz0 z6nuttb0f4q4*>hS6>@;Bi%I}WWCRe1jQLnXAfTH8w4M*VW+Vc71q`T`0kxkiK#2-6 z8wZ_>2k#gGonqT~5PVs$h7<^l0+IoJXh z6%Q28dJypJ3Ty@v@+>4{gVG$h+f)Geb_KZZ14)2G3S0_6(lNBHcnBm1ZY5_pf>))2 zG$2M>;fV`YLwP`JAjJBk<{hAGUC`HGA>>)XAr3mxAiEQE`xq!0MuPTdBCme~Rl(q3 z0(CJ#PJ*6t3(Kz>kRZjGUz;&P4YpPlmMd}3{Ip=`1ua_yxu}}~e&icyRULRN3+1|L z(De(D^`Nlx5;sLiGceB z(outroWPssp!ycFTFnA{y*Oy=3dljA`~b_GpiTt1-T;>b%{3|+42S`e4A}Th0w{B3 zfcG?m#!m^m7qlz~y?q?v0g3x;AC&}9tb>vkxY3dUsV~5rj$Kqdx*0$VBr@Qk|V zhR1R6d$t09wWZnuG!=1sy5_K57A+y&!oJoV`G^8L+d! zphM%3!&blxBtS(KxTJv=RiM}d8Rr4D8GNcW>UvSob_dXq2E4ce50HSfuLi8R(mb&f zv`hwcOUO@9h%10*oD>-Ndq6b?$b4|GQ3DpG;MNA#I`9~lks<}~Q6c>Dp!yx9zm4dm zf%|Nr(Y0(J6$1%qodb5K26$^6co75c(N|EhjGmA*z@ti_1{reu3a$JwfD{q1`rZIs zoWRNt0|KS)BP@P3fUbN6t?~zjn}J8S2RQkHhNnP_4`3Y7nqtr)E|8;J!2X9Q)PSaN zkV&A8Imjk~`;8!zJUlu*U>vYXjvSEt)?s#nB{d-DAAk%$?f~v9L!^&8fVY=`ImaDj z!1))n&KR;@8=PK1dJaAi0IlF)V8XKi1auB9a>(xlouLFtY0W>B@o3zO5qPk{Fi`q~ z98ZBy|9%YppuPvl7bxrFz(W%jpww)^$lngB>_Md&s3G$bbaWJGwVDOU(Rkbn+I)cQ zNl?Iny4v6ak-)7O*bo6I*g$=4CjNFJ+r&8B{}nc07Z3QKKyS2#m;^F~;iWuirv5nO8Y57N z2s+^cwCNGV2AKeI185Ed>;}*-QU(SFaQEG(cMfQW*280l2P60vH?W3I4~>_gV{Kq@=F#l{UREB!-w$aPLp=);2BqPh zpxG{vP6lXA1OyDSh!f!t+*=`PSB zRwPBqC*Y1`_5c+%kb6WR&B(?hpp*&OAcRP-&2PZ@5!@Mt4Wxl`BY5N$G}s8Mk3bh3 zz+49&wFFmJuv`Z2b%3WEac^q|$-whguR1Dmb^Ui${0nt-?0(CZIKao-AA zx(Uwxpj{NWXF);N6QVoIzyqmt)&MP&1P?-Wg6acM@c=0Vz-Q;cDg{_u4!VE^ycfbF z0K8fd6nS7_P?SJ4A=(Du9ao6>K$IWgJlhGqzq)e@Bu8~ZcCUk4gy1dF&4&y?sR+V8 z2R>w z?uPBt?}mn&{F;(&>lqaiQJG@b1&E!NTvV<3P>|_qZ#=8=M2yS5s-U8y{ZB{ZK368enh0L z`QWtWqmr=;v=j{PGH~ZL12h*7G9Fb9+Pejxf(>yewqRY4W+kY~iXi094QQI+7dw&a zybO>{75q)0{f{7<6Cix>&PWg+JX!)?nhtdne8C;~czc8wGx*y`Ozc~I!e!$Ma9(%ePq ze=2~Mv0!x%Y>PR>i`^{XDGY>rKz%aUhH!aC9Fe>c>I~4~6-drN8vnr^-mt?l5aHeY z=|3oXAr1mXFM61RXL&$jj<`P&tJh$|DG-y6vw#l#VSwDL23pR z#Q1M_11Q^h9DE=UiIhK(<-u7BO&&C!3QErfpg@Q2Uu~>WNdT7$xCcSEQ(g};fqWR4E(L2bz`7$hXhz>6H-QJap!es3x?s>t%6wED;Oj6! zOAtYu9>AwDfrfG*y&iDy5W0Q|JS`OgDG9*!4QK@%=yWO&ecT1Koey*l8E7;YI=>n5 z@;B;v&uHs+o8J(ZenFQP6On$Q_osozU%>4v$T@tVb(zN-KwWTfk>2g20=aqt)QW{D z1N9q`ghNye3{Pr8m%SjwJHZoD(90+*K%Eg#9sv(HK*#B!iwHcr;X}>fNCUS}!1J!) z_yPC6Ax;2|HG@xybO2vI0j>;vR4RPC1wo@R0lwXV93V!7Z?~s_59nYU(7kWq(E`Y9 z52z9YO-w`2pMZ=XhNu{H`l#qY?uG9`I!2)bGyo3nu7Mr?5@}=;O{zOYMF)I`GkA6h zbi$bLK@ZS)11O}JI}$*R*-i)r?kaaTfQ7n2y=Cjh3}({fY=P$Gl;L?X~3Zm)Bwb{(WDVwAH?-A$3kW| z5F@$Zvq3@khJt*Ad^9lZY!9SSAkgfG1+>ux8dNjDbI<4uQ2hb18l0eD%MKx{)L``= zqP_raEBOanYk}S#K^xD}05zlkGZF}NUGzWzCmZN#&j%QxW^{t5|3F0c7gwBo|KwIVt&B&_~6u?s$xHl(##^PA;Y>ooT1V8+23JXwXhKzT? z!w+o5^aJ3A4*0Mch&&{}gR%)|%$tE9x;oQE1+j}TaU z0M7;2|dw!RTNb9w-DC%{9(j-o5*Bm7xA1xNLhb_e=-mRo)(^A<+_B*?qeo|qih@UHjf#dx zXNih|OGk`~1*kd#4+uj?t6+C1BF@}~v^5~Z!@!573pPfCPeJlCTF>dV0fIl$ox8sGux z12;Y)H;;mtphjB2OVFq%$O4c8un4Fz6#z;H;1&UBIX}paP*;0&c7PHuC=G$q3`ir` zy3P)eO(4twE+U}EJ$8108XF+hAXQkTA!BIJu0O&K*gzsEZom~U=)#g;4E!$Ofqsx# zogI+O1@SJ_qe#z8wX;g=!7w!whrg+OXRyh!h!+;W-BWR`6CHcu|16 zlAn#mY*0|ZBFLv3yspDX8+wds_Y`n0fJwU=o&=>3NQ3L88K_W$TZ%iN=3`h232)Gh z6*!OxkJ~T6Z3Lv_LD-0eXhtBX0#MS2`Pm12!6cf;!On!HYfxbfuKilTgf15(E1|q{S*nH{$m7a5CO8v0u=t>O{g9_GY-Pm z#)HSlkGrUVdXEgCj#>l*e+wjEgBo#=ErZ~5@f|?JYZj;@pWv=h0t0^wxVQo>^7J_P z61=K10pw4}iVyJ21gL-luSV8@_nHDg24XW6x?%#-3IjDzkwyw}R#oX}16H7-$N)UL z)_f!b)Io>$&q1}T0w@7?x2S+GN9b-*DPUw^=xR{`EduiCo}vPpF9FdJAVa&SsDOI0 z;EF<=k%7UbvqwdMk%0kJz`Jy`sPKc#>YSniF0MLzR6qp~xUvFCfNCFi{#MXZ?+su! zI2Ix2%yqP=fUZUaO+3T1=W)mx#S9D#OrY8dWF`ZD8~DW8#ywywKvK~205Ng)09CHwjyr6k6>@MbC^$hU z_A(%@vXua>83C2ES0T4_f$peagx}5hL1W@XSb+@~rw@!mLPJ$MvbVC|#paCflP)vZL6~qYuaX>{5h!f#z zcmUL?1`nh_%6L$!hKFw{BkTg-<~=GPcQEj`KxPr3aRcpjfaU^l=5S9eeg&BY3NTPQ z04Ff$dWTLA4v;X&eV`rBT|M9hAPpb?gVGvE6ZrTl36L5P&+x!EM+s2&bmIrFPeUwj z05#L+f*Ol%T|O#qD7qy@={#0%bC1=Jn9JES_E3_4yw>0btTLN9x|W-)e5i|K(a`y z^+EG}(7U{_E_pnI%SE6eO;A@2G|`ptp8+%|1=~jj=7Qn?oKC<86+nX-w#2dt9E*q% zJ#Yn~4efWpO$LRjNAm&jv>e7}Y8RCR{&vtxKaXq|l>q2c)d=WP)d<95)(F@dK=33N zbm$bkfG`4X_Dj%=2RNa5WJB�k620}DW*A(-45QTKyK&F6Y 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%0DnS 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%0AE?x1hQlG+qqq^Ml5RLHi6qG-&(>v_fAiEpH zMo+V#bvK|i3p(QnlrBK>=;bl!4h>j5aU=W=N*Cbr7?LUox23VA3s5@B1pE07xZDM$ z8wLhY(*;uZg5nn@k6fOE)(U(8>jSC7oNEO66(SE>yN75~gVq$n`~vb9D9uSRFff4X zHjua@bnFGRt_ZZ22}FbPI%v;2Xnqs4UIetZ8nh1`blx?H2JLAFtvdpZF@o00fzmZ- ztsJP_1?^P_^>;vf)j@WH_T+-rZUi$jFo5Q$LFyS985lriD@YA!uR7?gbkN#|d5jDU zptTR6^(&w?4xn@lTH62`^9Akc1)Zav4&9Fnnj3w@$iM)a8wHJbg623u@d=u%@5E`j3l zB{*&q;QcmiXHLS@z`_>U9+3M$We@T^5vc6~ihoes1yt^XXwdios0{;}69KhhK=Wjv zHVnw$pz#AQv^6cTIW~~Lg;4wr>oydpmXsF6Czh7v!xBDnd4?~YJ2CJGg32e5*$kkg zOYj?MWmS>`>GEVI=44iZw?M%20;o*~F^7Qx znpjd=1U~->RF5J2$-n@rhambn!1*0C?kfT|2c$7GFD)NbCOZj&n$QzKgHH^VaDRf* z3Pdjh1IQg9e}eo4%k!YKg+ODN+R!mK9nf9&pml-J@mtUs9=>(=qF{G`Z2;9z`H%pI z)J^!}5|$>B{Rs+RP}Fgu8Mx$A65(MB3LBVxAiF_rA5dI@%1n?r zXuSf+?V$Avpm{UUIt7q9AR3gPK<#-@9S2Hlps_j-4Kf3?jsfIH$T%_T{V1S5CCF?L zmPGMmenClQejaFS6Lhd;ZUH0?kmDbu2a4h8h!Z>x4ABdc1C=kJw6PKF*BEfS2-IF- zWXR0~E&c|{gW?Q}d?KjL2a*TnCzw2_p8(Piy3q_I2MTwX9JVw7@*l{2hQG;ae+H=uS6D1C#*IYH<5fM`%(6Ev0x@;hj4 z257n$v`+}MCk+(dpmr2!%=bA10|RI+7bsjHbtCGyGbrzX><3|0u$w_F22h@bm7?Ho zJ}6v3egMm&65uog^ApGqFlmt4pmGH{&Xz&PQkV4p10DG6=MA z1GxoX+CgqNgVM7msI!G-3>%bBAac1V<7l9{A{(e4P+1SkqYMlXCxF}s%10o7LDYDG z=l&si46=6ulz(Az$Zi4k*#e>Fg337bvQgw$Pfkw21^w8 zLgE!VGz)HI1nIG)@HDp99KM5IGO<*e$X?UM2Z-Vj!Odc{`h)CC<^9>+AVPF8o6UZ#k`WDbV9<2CI*IIj0_B*^Cm!U1+8}m*(nLS9}_fR&jh)P z7<7Ý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ξLj{ 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

4ceo!46p9pH} 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 jVC7 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%0Dls4~ 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
7UWsboIa?3 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

brt($fcz)mSm;r=+GOmgbb?WF}cL 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

)0|0|RJHKnavC6ocGxS|$eB-&`#Q@y8S~$o}S; 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%0Ah-MnuLXoIUoaB);*~20#gIB<0ZH+l?*x`0Bi@S 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 z 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�h)+W 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

C!jS~pt&N@`ciR5 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 z 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 YXNbx*LX|}0qDmT~a1Bs+h6W5=0RPLX8~^|S diff --git a/src/tilde/tb_arena.h b/src/tilde/tb_arena.h deleted file mode 100644 index 67ec0e181..000000000 --- a/src/tilde/tb_arena.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once -#include -#include - -#ifndef TB_API -# ifdef __cplusplus -# define TB_EXTERN extern "C" -# else -# define TB_EXTERN -# endif -# ifdef TB_DLL -# ifdef TB_IMPORT_DLL -# define TB_API TB_EXTERN __declspec(dllimport) -# else -# define TB_API TB_EXTERN __declspec(dllexport) -# endif -# else -# define TB_API TB_EXTERN -# endif -#endif - -enum { - TB_ARENA_SMALL_CHUNK_SIZE = 4 * 1024, - TB_ARENA_MEDIUM_CHUNK_SIZE = 512 * 1024, - TB_ARENA_LARGE_CHUNK_SIZE = 16 * 1024 * 1024, - - TB_ARENA_ALIGNMENT = 16, -}; - -typedef struct TB_ArenaChunk TB_ArenaChunk; -struct TB_ArenaChunk { - TB_ArenaChunk* next; - size_t pad; - char data[]; -}; - -typedef struct TB_Arena { - size_t chunk_size; - TB_ArenaChunk* base; - TB_ArenaChunk* top; - - // top of the allocation space - char* watermark; - char* high_point; // &top->data[chunk_size] -} TB_Arena; - -typedef struct TB_ArenaSavepoint { - TB_ArenaChunk* top; - char* watermark; -} TB_ArenaSavepoint; - -#define TB_ARENA_FOR(it, arena) for (TB_ArenaChunk* it = (arena)->base; it != NULL; it = it->next) - -#define TB_ARENA_ALLOC(arena, T) tb_arena_alloc(arena, sizeof(T)) -#define TB_ARENA_ARR_ALLOC(arena, count, T) tb_arena_alloc(arena, (count) * sizeof(T)) - -TB_API void tb_arena_create(TB_Arena* restrict arena, size_t chunk_size); -TB_API void tb_arena_destroy(TB_Arena* restrict arena); - -TB_API void* tb_arena_unaligned_alloc(TB_Arena* restrict arena, size_t size); -TB_API void* tb_arena_alloc(TB_Arena* restrict arena, size_t size); - -// return false on failure -TB_API bool tb_arena_free(TB_Arena* restrict arena, void* ptr, size_t size); -TB_API void tb_arena_pop(TB_Arena* restrict arena, void* ptr, size_t size); - -// in case you wanna mix unaligned and aligned arenas -TB_API void tb_arena_realign(TB_Arena* restrict arena); - -TB_API bool tb_arena_is_empty(TB_Arena* arena); - -TB_API size_t tb_arena_current_size(TB_Arena* arena); - -// savepoints -TB_API TB_ArenaSavepoint tb_arena_save(TB_Arena* arena); -TB_API void tb_arena_restore(TB_Arena* arena, TB_ArenaSavepoint sp); - -// resets to only having one chunk -TB_API void tb_arena_clear(TB_Arena* arena); diff --git a/src/tilde/tb_coff.h b/src/tilde/tb_coff.h deleted file mode 100644 index ddedd6ffe..000000000 --- a/src/tilde/tb_coff.h +++ /dev/null @@ -1,334 +0,0 @@ -// PE/COFF is the executable/object format used by Microsoft. -#ifndef TB_COFF_H -#define TB_COFF_H - -#include "tb_formats.h" - -#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 - -#define IMAGE_SYM_CLASS_EXTERNAL 0x0002 -#define IMAGE_SYM_CLASS_STATIC 0x0003 -#define IMAGE_SYM_CLASS_LABEL 0x0006 -#define IMAGE_SYM_CLASS_FILE 0x0067 -#define IMAGE_SYM_CLASS_SECTION 0x0068 -#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 0x0069 - -#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 - -#define IMAGE_REL_AMD64_ADDR64 0x0001 -#define IMAGE_REL_AMD64_ADDR32 0x0002 -#define IMAGE_REL_AMD64_ADDR32NB 0x0003 -#define IMAGE_REL_AMD64_REL32 0x0004 -#define IMAGE_REL_AMD64_REL32_1 0x0005 -#define IMAGE_REL_AMD64_REL32_2 0x0006 -#define IMAGE_REL_AMD64_REL32_3 0x0007 -#define IMAGE_REL_AMD64_REL32_4 0x0008 -#define IMAGE_REL_AMD64_REL32_5 0x0009 -#define IMAGE_REL_AMD64_SECTION 0x000A -#define IMAGE_REL_AMD64_SECREL 0x000B - -#define IMAGE_SCN_LNK_REMOVE 0x00000800 -#define IMAGE_SCN_LNK_COMDAT 0x00001000 -#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 -#define IMAGE_SCN_MEM_EXECUTE 0x20000000 -#define IMAGE_SCN_MEM_READ 0x40000000 -#define IMAGE_SCN_MEM_WRITE 0x80000000 - -#define IMAGE_SCN_CNT_CODE 0x00000020 /* Section contains code. */ -#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 /* Section contains initialized data. */ -#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 /* Section contains uninitialized data. */ - -#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory -#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory -#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory -#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory -#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory -#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table -#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory -#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data -#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP -#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory -#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory -#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers -#define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table -#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors -#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor - -#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 -#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 -#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 - -typedef enum { - TB_COFF_SECTION_NO_PAD = 0x00000008, - TB_COFF_SECTION_CODE = 0x00000020, - TB_COFF_SECTION_INIT = 0x00000040, - TB_COFF_SECTION_UNINIT = 0x00000080, - TB_COFF_SECTION_OTHER = 0x00000100, - TB_COFF_SECTION_INFO = 0x00000200, - TB_COFF_SECTION_REMOVE = 0x00000800, - TB_COFF_SECTION_COMDAT = 0x00001000, - - // this is actually a 4bit field - TB_COFF_SECTION_ALIGN = 0x00F00000, - - // if we have more than 65535 relocations we do this - TB_COFF_SECTION_RELOC_OVR = 0x00F00000, - - // memory flags - TB_COFF_SECTION_DISCARDABLE = 0x02000000, - TB_COFF_SECTION_NOT_CACHED = 0x04000000, - TB_COFF_SECTION_NOT_PAGED = 0x08000000, - TB_COFF_SECTION_SHARED = 0x10000000, - TB_COFF_SECTION_EXECUTE = 0x20000000, - TB_COFF_SECTION_READ = 0x40000000, - TB_COFF_SECTION_WRITE = 0x80000000, -} TB_COFF_SectionFlags; - -typedef struct TB_COFF_Parser { - // inputs - TB_Slice name, file; - - // results - size_t section_count; - size_t symbol_table, symbol_count; - - // private - TB_Slice string_table; -} TB_COFF_Parser; - -// fills the parser with results from the COFF header -bool tb_coff_parse_init(TB_COFF_Parser* restrict parser); -bool tb_coff_parse_section(TB_COFF_Parser* restrict parser, size_t i, TB_ObjectSection* out_sec); - -// how many symbols does this one symbol take up (basically 1 + aux symbols). -// returns 0 if error. -size_t tb_coff_parse_symbol(TB_COFF_Parser* restrict parser, size_t i, TB_ObjectSymbol* restrict out_sym); - -#endif // TB_COFF_H - -#ifdef TB_COFF_IMPL -#include - -#pragma pack(push, 2) -typedef struct COFF_SectionHeader { - char name[8]; - union { - uint32_t physical_address; - uint32_t virtual_size; - } misc; - uint32_t virtual_address; - uint32_t raw_data_size; - uint32_t raw_data_pos; - uint32_t pointer_to_reloc; - uint32_t pointer_to_lineno; - uint16_t num_reloc; - uint16_t num_lineno; - uint32_t characteristics; -} COFF_SectionHeader; - -typedef struct COFF_FileHeader { - uint16_t machine; - uint16_t section_count; - uint32_t timestamp; - uint32_t symbol_table; - uint32_t symbol_count; - uint16_t optional_header_size; - uint16_t flags; -} COFF_FileHeader; - -typedef struct COFF_Symbol { - union { - uint8_t short_name[8]; - uint32_t long_name[2]; - }; - uint32_t value; - int16_t section_number; - uint16_t type; - uint8_t storage_class; - uint8_t aux_symbols_count; -} COFF_Symbol; - -typedef struct COFF_ImageReloc { - union { - uint32_t VirtualAddress; - uint32_t RelocCount; - }; - uint32_t SymbolTableIndex; - uint16_t Type; -} COFF_ImageReloc; -#pragma pack(pop) - -// sanity checks -static_assert(sizeof(COFF_SectionHeader) == 40, "COFF Section header size != 40 bytes"); -static_assert(sizeof(COFF_ImageReloc) == 10, "COFF Image Relocation size != 10 bytes"); -static_assert(sizeof(COFF_FileHeader) == 20, "COFF File header size != 20 bytes"); -static_assert(sizeof(COFF_Symbol) == 18, "COFF Symbol size != 18 bytes"); - -bool tb_coff_parse_init(TB_COFF_Parser* restrict parser) { - TB_Slice file = parser->file; - - if (file.length < sizeof(COFF_FileHeader)) return false; - COFF_FileHeader* header = (COFF_FileHeader*) &parser->file.data[0]; - - // locate string table (it spans until the end of the file) - size_t string_table_pos = header->symbol_table + (header->symbol_count * sizeof(COFF_Symbol)); - if (file.length < string_table_pos) return false; - - parser->symbol_count = header->symbol_count; - parser->symbol_table = header->symbol_table; - parser->section_count = header->section_count; - parser->string_table = (TB_Slice){ - .length = file.length - string_table_pos, - .data = &file.data[string_table_pos] - }; - - return true; -} - -static long long tb__parse_decimal_int(size_t n, const char* str) { - const char* end = &str[n]; - - int result = 0; - while (str != end) { - if (*str < '0' || *str > '9') break; - - result *= 10; - result += *str - '0'; - str++; - } - - return result; -} - -bool tb_coff_parse_section(TB_COFF_Parser* restrict parser, size_t i, TB_ObjectSection* restrict out_sec) { - TB_Slice file = parser->file; - size_t section_offset = sizeof(COFF_FileHeader) + (i * sizeof(COFF_SectionHeader)); - - if (file.length < section_offset + sizeof(COFF_SectionHeader)) { - return false; - } - - COFF_SectionHeader* sec = (COFF_SectionHeader*) &file.data[section_offset]; - *out_sec = (TB_ObjectSection) { .flags = sec->characteristics }; - - // Parse string table name stuff - if (sec->name[0] == '/') { - // string table access - int offset = tb__parse_decimal_int(7, &sec->name[1]); - if (file.length > offset) { - return false; - } - - const uint8_t* data = &parser->string_table.data[offset]; - out_sec->name = (TB_Slice){ strlen((const char*) data), data }; - } else { - // normal inplace string - size_t len = strlen(sec->name); - out_sec->name = (TB_Slice){ len, (uint8_t*) sec->name }; - } - - // Parse relocations - if (sec->num_reloc > 0) { - out_sec->relocation_count = sec->num_reloc; - COFF_ImageReloc* src_relocs = (COFF_ImageReloc*) &file.data[sec->pointer_to_reloc]; - - TB_ObjectReloc* dst_relocs = tb_platform_heap_alloc(sec->num_reloc * sizeof(TB_ObjectReloc)); - FOREACH_N(j, 0, sec->num_reloc) { - dst_relocs[j] = (TB_ObjectReloc){ 0 }; - switch (src_relocs[j].Type) { - case IMAGE_REL_AMD64_ADDR32NB: dst_relocs[j].type = TB_OBJECT_RELOC_ADDR32NB; break; - case IMAGE_REL_AMD64_ADDR32: dst_relocs[j].type = TB_OBJECT_RELOC_ADDR32; break; - case IMAGE_REL_AMD64_ADDR64: dst_relocs[j].type = TB_OBJECT_RELOC_ADDR64; break; - case IMAGE_REL_AMD64_SECREL: dst_relocs[j].type = TB_OBJECT_RELOC_SECREL; break; - case IMAGE_REL_AMD64_SECTION: dst_relocs[j].type = TB_OBJECT_RELOC_SECTION; break; - - case IMAGE_REL_AMD64_REL32: - case IMAGE_REL_AMD64_REL32_1: - case IMAGE_REL_AMD64_REL32_2: - case IMAGE_REL_AMD64_REL32_3: - case IMAGE_REL_AMD64_REL32_4: - case IMAGE_REL_AMD64_REL32_5: - dst_relocs[j].type = TB_OBJECT_RELOC_REL32; - break; - - default: tb_todo(); - } - - if (src_relocs[j].Type >= IMAGE_REL_AMD64_REL32 && src_relocs[j].Type <= IMAGE_REL_AMD64_REL32_5) { - dst_relocs[j].addend = 4 + (src_relocs[j].Type - IMAGE_REL_AMD64_REL32); - } - - dst_relocs[j].symbol_index = src_relocs[j].SymbolTableIndex; - dst_relocs[j].virtual_address = src_relocs[j].VirtualAddress; - } - - out_sec->relocations = dst_relocs; - } - - // Parse virtual region - out_sec->virtual_address = sec->virtual_address; - out_sec->virtual_size = sec->misc.virtual_size; - - // Read raw data (if applies) - if (sec->raw_data_size) { - assert(sec->raw_data_pos + sec->raw_data_size < file.length); - out_sec->raw_data = (TB_Slice){ sec->raw_data_size, &file.data[sec->raw_data_pos] }; - } - - return true; -} - -TB_ObjectSymbolType classify_symbol_type(uint16_t st_class) { - switch (st_class) { - case 2: return TB_OBJECT_SYMBOL_EXTERN; - case 3: return TB_OBJECT_SYMBOL_STATIC; - case 6: return TB_OBJECT_SYMBOL_STATIC; - case 0x68: return TB_OBJECT_SYMBOL_SECTION; - case 0x69: return TB_OBJECT_SYMBOL_WEAK_EXTERN; - default: return TB_OBJECT_SYMBOL_UNKNOWN; - } -} - -size_t tb_coff_parse_symbol(TB_COFF_Parser* restrict parser, size_t i, TB_ObjectSymbol* restrict out_sym) { - TB_Slice file = parser->file; - size_t symbol_offset = parser->symbol_table + (i * sizeof(COFF_Symbol)); - - if (file.length < symbol_offset + sizeof(COFF_Symbol)) { - return 0; - } - - COFF_Symbol* sym = (COFF_Symbol*) &file.data[symbol_offset]; - *out_sym = (TB_ObjectSymbol) { - .ordinal = i, - .type = classify_symbol_type(sym->storage_class), - .section_num = sym->section_number, - .value = sym->value - }; - - // Parse string table name stuff - if (sym->long_name[0] == 0) { - // string table access (read a cstring) - // TODO(NeGate): bounds check this - const uint8_t* data = &parser->string_table.data[sym->long_name[1]]; - out_sym->name = (TB_Slice){ strlen((const char*) data), data }; - } else { - // normal inplace string - size_t len = 1; - const char* name = (const char*) sym->short_name; - while (len < 8 && name[len] != 0) { - len++; - } - out_sym->name = (TB_Slice){ len, sym->short_name }; - } - - // TODO(NeGate): Process aux symbols - if (sym->aux_symbols_count) { - out_sym->extra = &sym[1]; - - // FOREACH_N(j, 0, sym->aux_symbols_count) {} - } - - return sym->aux_symbols_count + 1; -} - -#endif // TB_COFF_IMPL diff --git a/src/tilde/tb_elf.h b/src/tilde/tb_elf.h deleted file mode 100644 index 5260d7372..000000000 --- a/src/tilde/tb_elf.h +++ /dev/null @@ -1,170 +0,0 @@ -#ifndef TB_ELF_H -#define TB_ELF_H - -#include - -#define TB_EI_MAG0 0 -#define TB_EI_MAG1 1 -#define TB_EI_MAG2 2 -#define TB_EI_MAG3 3 -#define TB_EI_CLASS 4 /* Class of machine. */ -#define TB_EI_DATA 5 /* Data format. */ -#define TB_EI_VERSION 6 /* ELF format version. */ -#define TB_EI_OSABI 7 /* Operating system / ABI identification */ -#define TB_EI_ABIVERSION 8 /* ABI version */ -#define TB_OLD_EI_BRAND 8 /* Start of architecture identification. */ -#define TB_EI_PAD 9 /* Start of padding (per SVR4 ABI). */ -#define TB_EI_NIDENT 16 /* Size of e_ident array. */ - -/* Values for e_type. */ -#define TB_ET_NONE 0 /* Unknown type. */ -#define TB_ET_REL 1 /* Relocatable. */ -#define TB_ET_EXEC 2 /* Executable. */ -#define TB_ET_DYN 3 /* Shared object. */ -#define TB_ET_CORE 4 /* Core file. */ -#define TB_ET_LOOS 0xfe00 /* First operating system specific. */ -#define TB_ET_HIOS 0xfeff /* Last operating system-specific. */ -#define TB_ET_LOPROC 0xff00 /* First processor-specific. */ -#define TB_ET_HIPROC 0xffff /* Last processor-specific. */ - -/* Values for e_machine. */ -#define TB_EM_NONE 0 /* Unknown machine. */ -#define TB_EM_X86_64 62 /* Advanced Micro Devices x86-64 */ -#define TB_EM_AARCH64 183 /* AArch64 (64-bit ARM) */ - -/* sh_type */ -#define TB_SHT_NULL 0 /* inactive */ -#define TB_SHT_PROGBITS 1 /* program defined information */ -#define TB_SHT_SYMTAB 2 /* symbol table section */ -#define TB_SHT_STRTAB 3 /* string table section */ -#define TB_SHT_RELA 4 /* relocation section with addends */ -#define TB_SHT_NOBITS 8 /* no space section */ - -/* Flags for sh_flags. */ -#define TB_SHF_WRITE 0x1 /* Section contains writable data. */ -#define TB_SHF_ALLOC 0x2 /* Section occupies memory. */ -#define TB_SHF_EXECINSTR 0x4 /* Section contains instructions. */ -#define TB_SHF_MERGE 0x10 /* Section may be merged. */ -#define TB_SHF_STRINGS 0x20 /* Section contains strings. */ -#define TB_SHF_INFO_LINK 0x40 /* sh_info holds section index. */ -#define TB_SHF_LINK_ORDER 0x80 /* Special ordering requirements. */ -#define TB_SHF_OS_NONCONFORMING 0x100 /* OS-specific processing required. */ -#define TB_SHF_GROUP 0x200 /* Member of section group. */ -#define TB_SHF_TLS 0x400 /* Section contains TLS data. */ -#define TB_SHF_MASKOS 0x0ff00000 /* OS-specific semantics. */ -#define TB_SHF_MASKPROC 0xf0000000 /* Processor-specific semantics. */ - -/* Values for p_flags. */ -#define TB_PF_X 0x1 /* Executable. */ -#define TB_PF_W 0x2 /* Writable. */ -#define TB_PF_R 0x4 /* Readable. */ -#define TB_PF_MASKOS 0x0ff00000 /* Operating system-specific. */ -#define TB_PF_MASKPROC 0xf0000000 /* Processor-specific. */ - -/* Values for p_type. */ -#define TB_PT_NULL 0 /* Unused entry. */ -#define TB_PT_LOAD 1 /* Loadable segment. */ -#define TB_PT_DYNAMIC 2 /* Dynamic linking information segment. */ -#define TB_PT_INTERP 3 /* Pathname of interpreter. */ -#define TB_PT_NOTE 4 /* Auxiliary information. */ -#define TB_PT_SHLIB 5 /* Reserved (not used). */ -#define TB_PT_PHDR 6 /* Location of program header itself. */ -#define TB_PT_TLS 7 /* Thread local storage segment */ - -/* Values for relocation */ -typedef enum { - TB_ELF_X86_64_NONE = 0, - TB_ELF_X86_64_64 = 1, - TB_ELF_X86_64_PC32 = 2, - TB_ELF_X86_64_GOT32 = 3, - TB_ELF_X86_64_PLT32 = 4, - TB_ELF_X86_64_GOTPCREL = 9, -} TB_ELF_RelocType; - -// ST_TYPE -#define TB_ELF64_STT_NOTYPE 0 -#define TB_ELF64_STT_OBJECT 1 -#define TB_ELF64_STT_FUNC 2 -#define TB_ELF64_STT_SECTION 3 - -// ST_INFO -#define TB_ELF64_STB_LOCAL 0 -#define TB_ELF64_STB_GLOBAL 1 -#define TB_ELF64_STB_WEAK 2 - -/* Macros for accessing the fields of st_info. */ -#define TB_ELF64_ST_BIND(info) ((info) >> 4) -#define TB_ELF64_ST_TYPE(info) ((info) & 0xf) - -#define TB_ELF64_ST_INFO(b, t) (((b) << 4) | ((t) & 0xF)) - -#define TB_ELF64_R_SYM(i) ((i) >> 32u) -#define TB_ELF64_R_TYPE(i) ((i)&0xffffffffULL) -#define TB_ELF64_R_INFO(s, t) (((uint64_t)(s) << 32ULL) + ((uint64_t)(t) & 0xffffffffULL)) - -// http://web.mit.edu/freebsd/head/sys/sys/elf64.h -// https://cirosantilli.com/elf-hello-world#minimal-elf-file -// https://en.wikipedia.org/wiki/Executable_and_Linkable_Format -typedef struct { - uint8_t ident[16]; - uint16_t type; - uint16_t machine; - uint32_t version; - uint64_t entry; - uint64_t phoff; - uint64_t shoff; - uint32_t flags; - uint16_t ehsize; - uint16_t phentsize; - uint16_t phnum; - uint16_t shentsize; - uint16_t shnum; - uint16_t shstrndx; -} TB_Elf64_Ehdr; - -typedef struct { - uint32_t name; - uint32_t type; - uint64_t flags; - uint64_t addr; - uint64_t offset; - uint64_t size; - uint32_t link; - uint32_t info; - uint64_t addralign; - uint64_t entsize; -} TB_Elf64_Shdr; - -// Segment header for ELF64. -typedef struct { - uint32_t type; // Type of segment - uint32_t flags; // Segment flags - uint64_t offset; // File offset where segment is located, in bytes - uint64_t vaddr; // Virtual address of beginning of segment - uint64_t paddr; // Physical addr of beginning of segment (OS-specific) - uint64_t filesz; // Num. of bytes in file image of segment (may be zero) - uint64_t memsz; // Num. of bytes in mem image of segment (may be zero) - uint64_t align; // Segment alignment constraint -} TB_Elf64_Phdr; - -typedef struct { - uint32_t name; - uint8_t info; - uint8_t other; - uint16_t shndx; - uint64_t value; - uint64_t size; -} TB_Elf64_Sym; - -typedef struct { - uint64_t offset; - uint64_t info; - int64_t addend; -} TB_Elf64_Rela; - -typedef struct { - uint64_t offset; - uint64_t info; -} TB_Elf64_Rel; - -#endif /* TB_ELF_H */ diff --git a/src/tilde/tb_formats.h b/src/tilde/tb_formats.h deleted file mode 100644 index 1975d5848..000000000 --- a/src/tilde/tb_formats.h +++ /dev/null @@ -1,132 +0,0 @@ -// This handles the generalized executable/object format parsing stuff -#ifndef TB_OBJECT_H -#define TB_OBJECT_H - -#include -#include - -typedef enum { - TB_OBJECT_RELOC_NONE, // how? - - // Target independent - TB_OBJECT_RELOC_ADDR32, - TB_OBJECT_RELOC_ADDR64, // unsupported on 32bit platforms - TB_OBJECT_RELOC_SECREL, - TB_OBJECT_RELOC_SECTION, - - // COFF only - TB_OBJECT_RELOC_ADDR32NB, // Relative virtual address - - // x64 only - TB_OBJECT_RELOC_REL32, // relative 32bit displacement - - // Aarch64 only - TB_OBJECT_RELOC_BRANCH26, // 26bit displacement for B and BL instructions - TB_OBJECT_RELOC_REL21, // for ADR instructions - - // TODO(NeGate): fill in the rest of this later -} TB_ObjectRelocType; - -typedef struct { - TB_ObjectRelocType type; - uint32_t symbol_index; - size_t virtual_address; - size_t addend; -} TB_ObjectReloc; - -typedef enum { - TB_OBJECT_SYMBOL_UNKNOWN, - TB_OBJECT_SYMBOL_EXTERN, // exported - TB_OBJECT_SYMBOL_WEAK_EXTERN, // weak - TB_OBJECT_SYMBOL_IMPORT, // forward decl - TB_OBJECT_SYMBOL_STATIC, // local - TB_OBJECT_SYMBOL_SECTION, // local -} TB_ObjectSymbolType; - -typedef struct { - TB_ObjectSymbolType type; - int section_num; - - uint32_t ordinal; - uint32_t value; - - TB_Slice name; - - // for COFF, this is the auxillary - void* extra; - - // this is zeroed out by the loader and left for the user to do crap with - void* user_data; -} TB_ObjectSymbol; - -typedef struct { - TB_Slice name; - uint32_t flags; - - size_t virtual_address; - size_t virtual_size; - - // You can have a virtual size without having a raw - // data size, that's how the BSS section works - TB_Slice raw_data; - - size_t relocation_count; - TB_ObjectReloc* relocations; - - // this is zeroed out by the loader and left for the user to do crap with - void* user_data; -} TB_ObjectSection; - -typedef enum { - TB_OBJECT_FILE_UNKNOWN, - - TB_OBJECT_FILE_COFF, - TB_OBJECT_FILE_ELF64 -} TB_ObjectFileType; - -typedef struct { - TB_ObjectFileType type; - TB_Arch arch; - - TB_Slice name; - TB_Slice ar_name; - - size_t symbol_count; - TB_ObjectSymbol* symbols; - - size_t section_count; - TB_ObjectSection sections[]; -} TB_ObjectFile; - -//////////////////////////////// -// Archive parser -//////////////////////////////// -typedef struct { - TB_Slice name; - - // if import_name is empty, we're dealing with an object file - TB_Slice import_name; - uint16_t ordinal; - - TB_Slice content; -} TB_ArchiveEntry; - -typedef struct { - TB_Slice file; - size_t pos; - - size_t member_count; - uint32_t* members; - - size_t symbol_count; - uint16_t* symbols; - - TB_Slice strtbl; -} TB_ArchiveFileParser; - -// We do this to parse the header -bool tb_archive_parse(TB_Slice file, TB_ArchiveFileParser* restrict out_parser); -// After that we can enumerate any symbol entries to resolve imports -size_t tb_archive_parse_entries(TB_ArchiveFileParser* restrict parser, size_t i, size_t count, TB_ArchiveEntry* out_entry); - -#endif // TB_OBJECT_H diff --git a/src/tilde/tb_x64.h b/src/tilde/tb_x64.h deleted file mode 100644 index 58b3d656c..000000000 --- a/src/tilde/tb_x64.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef TB_X64_H -#define TB_X64_H - -#include -#include - -typedef enum { - // uses xmm registers for the reg array - TB_X86_INSTR_XMMREG = (1u << 0u), - - // r/m is a memory operand - TB_X86_INSTR_USE_MEMOP = (1u << 1u), - - // r/m is a rip-relative address (TB_X86_INSTR_USE_MEMOP is always set when this is set) - TB_X86_INSTR_USE_RIPMEM = (1u << 2u), - - // LOCK prefix is present - TB_X86_INSTR_LOCK = (1u << 3u), - - // uses a signed immediate - TB_X86_INSTR_IMMEDIATE = (1u << 4u), - - // absolute means it's using the 64bit immediate (cannot be applied while a memory operand is active) - TB_X86_INSTR_ABSOLUTE = (1u << 5u), - - // set if the r/m can be found on the right hand side - TB_X86_INSTR_DIRECTION = (1u << 6u), - - // uses the second data type because the instruction is weird like MOVSX or MOVZX - TB_X86_INSTR_TWO_DATA_TYPES = (1u << 7u), - - // REP prefix is present - TB_X86_INSTR_REP = (1u << 8u), - - // REPNE prefix is present - TB_X86_INSTR_REPNE = (1u << 9u), -} TB_X86_InstFlags; - -typedef enum { - TB_X86_RAX, TB_X86_RCX, TB_X86_RDX, TB_X86_RBX, TB_X86_RSP, TB_X86_RBP, TB_X86_RSI, TB_X86_RDI, - TB_X86_R8, TB_X86_R9, TB_X86_R10, TB_X86_R11, TB_X86_R12, TB_X86_R13, TB_X86_R14, TB_X86_R15, -} TB_X86_GPR; - -typedef enum { - TB_X86_SEGMENT_DEFAULT = 0, - - TB_X86_SEGMENT_ES, TB_X86_SEGMENT_CS, - TB_X86_SEGMENT_SS, TB_X86_SEGMENT_DS, - TB_X86_SEGMENT_GS, TB_X86_SEGMENT_FS, -} TB_X86_Segment; - -typedef enum { - TB_X86_TYPE_NONE = 0, - - TB_X86_TYPE_BYTE, // 1 - TB_X86_TYPE_WORD, // 2 - TB_X86_TYPE_DWORD, // 4 - TB_X86_TYPE_QWORD, // 8 - - TB_X86_TYPE_PBYTE, // int8 x 16 = 16 - TB_X86_TYPE_PWORD, // int16 x 8 = 16 - TB_X86_TYPE_PDWORD, // int32 x 4 = 16 - TB_X86_TYPE_PQWORD, // int64 x 2 = 16 - - TB_X86_TYPE_SSE_SS, // float32 x 1 = 4 - TB_X86_TYPE_SSE_SD, // float64 x 1 = 8 - TB_X86_TYPE_SSE_PS, // float32 x 4 = 16 - TB_X86_TYPE_SSE_PD, // float64 x 2 = 16 - - TB_X86_TYPE_XMMWORD, // the generic idea of them -} TB_X86_DataType; - -typedef struct { - int32_t opcode; - - // registers (there's 4 max taking up 8bit slots each) - int8_t regs[4]; - uint16_t flags; - - // bitpacking amirite - TB_X86_DataType data_type : 8; - TB_X86_DataType data_type2 : 8; - TB_X86_Segment segment : 4; - uint8_t length : 4; - - // memory operand - // X86_INSTR_USE_MEMOP - uint8_t base, index, scale; - int32_t disp; - - // immediate operand - // imm for INSTR_IMMEDIATE - // abs for INSTR_ABSOLUTE - union { - int32_t imm; - uint64_t abs; - }; -} TB_X86_Inst; - -bool tb_x86_disasm(TB_X86_Inst* restrict inst, size_t length, const uint8_t* data); -const char* tb_x86_reg_name(int8_t reg, TB_X86_DataType dt); -const char* tb_x86_type_name(TB_X86_DataType dt); -const char* tb_x86_mnemonic(TB_X86_Inst* inst); - -#endif /* TB_X64_H */ diff --git a/src/tilde_builtin.cpp b/src/tilde_builtin.cpp deleted file mode 100644 index 3b4e4f900..000000000 --- a/src/tilde_builtin.cpp +++ /dev/null @@ -1,592 +0,0 @@ -gb_internal cgValue cg_builtin_len(cgProcedure *p, cgValue value) { - Type *t = base_type(value.type); - - switch (t->kind) { - case Type_Basic: - switch (t->Basic.kind) { - case Basic_string: - { - GB_ASSERT(value.kind == cgValue_Addr); - cgValue ptr = cg_value(value.node, alloc_type_pointer(value.type)); - cgValue len_ptr = cg_emit_struct_ep(p, ptr, 1); - return cg_emit_load(p, len_ptr); - } - case Basic_cstring: - GB_PANIC("TODO(bill): len(cstring)"); - break; - } - break; - case Type_Array: - return cg_const_int(p, t_int, t->Array.count); - case Type_EnumeratedArray: - return cg_const_int(p, t_int, t->EnumeratedArray.count); - case Type_Slice: - { - GB_ASSERT(value.kind == cgValue_Addr); - cgValue ptr = cg_value(value.node, alloc_type_pointer(value.type)); - cgValue len_ptr = cg_emit_struct_ep(p, ptr, 1); - return cg_emit_load(p, len_ptr); - } - case Type_DynamicArray: - { - GB_ASSERT(value.kind == cgValue_Addr); - cgValue ptr = cg_value(value.node, alloc_type_pointer(value.type)); - cgValue len_ptr = cg_emit_struct_ep(p, ptr, 1); - return cg_emit_load(p, len_ptr); - } - case Type_Map: - { - GB_ASSERT(value.kind == cgValue_Addr); - cgValue ptr = cg_value(value.node, alloc_type_pointer(value.type)); - cgValue len_ptr = cg_emit_struct_ep(p, ptr, 1); - return cg_emit_conv(p, cg_emit_load(p, len_ptr), t_int); - } - case Type_Struct: - GB_ASSERT(is_type_soa_struct(t)); - { - if (t->Struct.soa_kind == StructSoa_Fixed) { - return cg_const_int(p, t_int, t->Struct.soa_count); - } - - GB_ASSERT(t->Struct.soa_kind == StructSoa_Slice || - t->Struct.soa_kind == StructSoa_Dynamic); - - isize n = 0; - Type *elem = base_type(t->Struct.soa_elem); - if (elem->kind == Type_Struct) { - n = cast(isize)elem->Struct.fields.count; - } else if (elem->kind == Type_Array) { - n = cast(isize)elem->Array.count; - } else { - GB_PANIC("Unreachable"); - } - - return cg_emit_struct_ev(p, value, n); - } - break; - } - - GB_PANIC("TODO(bill): cg_builtin_len %s", type_to_string(t)); - return {}; -} - -gb_internal cgValue cg_builtin_cap(cgProcedure *p, cgValue value) { - Type *t = base_type(value.type); - - switch (t->kind) { - case Type_Basic: - switch (t->Basic.kind) { - case Basic_string: - { - GB_ASSERT(value.kind == cgValue_Addr); - cgValue ptr = cg_value(value.node, alloc_type_pointer(value.type)); - cgValue len_ptr = cg_emit_struct_ep(p, ptr, 1); - return cg_emit_load(p, len_ptr); - } - case Basic_cstring: - GB_PANIC("TODO(bill): cap(cstring)"); - break; - } - break; - case Type_Array: - return cg_const_int(p, t_int, t->Array.count); - case Type_EnumeratedArray: - return cg_const_int(p, t_int, t->EnumeratedArray.count); - case Type_Slice: - { - GB_ASSERT(value.kind == cgValue_Addr); - cgValue ptr = cg_value(value.node, alloc_type_pointer(value.type)); - cgValue len_ptr = cg_emit_struct_ep(p, ptr, 1); - return cg_emit_load(p, len_ptr); - } - case Type_DynamicArray: - { - GB_ASSERT(value.kind == cgValue_Addr); - cgValue ptr = cg_value(value.node, alloc_type_pointer(value.type)); - cgValue len_ptr = cg_emit_struct_ep(p, ptr, 2); - return cg_emit_load(p, len_ptr); - } - case Type_Map: - { - TB_DataType dt_uintptr = cg_data_type(t_uintptr); - TB_Node *zero = tb_inst_uint(p->func, dt_uintptr, 0); - TB_Node *one = tb_inst_uint(p->func, dt_uintptr, 0); - TB_Node *mask = tb_inst_uint(p->func, dt_uintptr, MAP_CACHE_LINE_SIZE-1); - - TB_Node *data = cg_emit_struct_ev(p, value, 0).node; - TB_Node *log2_cap = tb_inst_and(p->func, data, mask); - TB_Node *cap = tb_inst_shl(p->func, one, log2_cap, cast(TB_ArithmeticBehavior)0); - TB_Node *cmp = tb_inst_cmp_eq(p->func, data, zero); - - cgValue res = cg_value(tb_inst_select(p->func, cmp, zero, cap), t_uintptr); - return cg_emit_conv(p, res, t_int); - } - case Type_Struct: - GB_ASSERT(is_type_soa_struct(t)); - break; - } - - GB_PANIC("TODO(bill): cg_builtin_cap %s", type_to_string(t)); - return {}; -} - - -gb_internal cgValue cg_builtin_raw_data(cgProcedure *p, cgValue const &value) { - Type *t = base_type(value.type); - cgValue res = {}; - switch (t->kind) { - case Type_Slice: - { - GB_ASSERT(value.kind == cgValue_Addr); - cgValue ptr = cg_value(value.node, alloc_type_pointer(value.type)); - cgValue data_ptr = cg_emit_struct_ep(p, ptr, 0); - res = cg_emit_load(p, data_ptr); - GB_ASSERT(is_type_multi_pointer(res.type)); - } - break; - case Type_DynamicArray: - { - GB_ASSERT(value.kind == cgValue_Addr); - cgValue ptr = cg_value(value.node, alloc_type_pointer(value.type)); - cgValue data_ptr = cg_emit_struct_ep(p, ptr, 0); - res = cg_emit_load(p, data_ptr); - } - break; - case Type_Basic: - if (t->Basic.kind == Basic_string) { - GB_ASSERT(value.kind == cgValue_Addr); - cgValue ptr = cg_value(value.node, alloc_type_pointer(value.type)); - cgValue data_ptr = cg_emit_struct_ep(p, ptr, 0); - res = cg_emit_load(p, data_ptr); - } else if (t->Basic.kind == Basic_cstring) { - res = cg_emit_conv(p, value, t_u8_multi_ptr); - } - break; - case Type_Pointer: - GB_ASSERT(is_type_array_like(t->Pointer.elem)); - GB_ASSERT(value.kind == cgValue_Value); - res = cg_value(value.node, alloc_type_multi_pointer(base_array_type(t->Pointer.elem))); - break; - case Type_MultiPointer: - - GB_PANIC("TODO(bill) %s", type_to_string(value.type)); - // res = cg_emit_conv(p, value, tv.type); - break; - } - GB_ASSERT(res.node != nullptr); - return res; -} - -gb_internal cgValue cg_builtin_min(cgProcedure *p, Type *t, cgValue x, cgValue y) { - x = cg_emit_conv(p, x, t); - y = cg_emit_conv(p, y, t); - return cg_emit_select(p, cg_emit_comp(p, Token_Lt, x, y), x, y); -} -gb_internal cgValue cg_builtin_max(cgProcedure *p, Type *t, cgValue x, cgValue y) { - x = cg_emit_conv(p, x, t); - y = cg_emit_conv(p, y, t); - return cg_emit_select(p, cg_emit_comp(p, Token_Gt, x, y), x, y); -} - -gb_internal cgValue cg_builtin_abs(cgProcedure *p, cgValue const &x) { - if (is_type_unsigned(x.type)) { - return x; - } - - if (is_type_quaternion(x.type)) { - GB_PANIC("TODO(bill): abs quaternion"); - } else if (is_type_complex(x.type)) { - GB_PANIC("TODO(bill): abs complex"); - } - - TB_DataType dt = cg_data_type(x.type); - GB_ASSERT(!TB_IS_VOID_TYPE(dt)); - TB_Node *zero = nullptr; - if (dt.type == TB_FLOAT) { - if (dt.data == 32) { - zero = tb_inst_float32(p->func, 0); - } else if (dt.data == 64) { - zero = tb_inst_float64(p->func, 0); - } - } else { - zero = tb_inst_uint(p->func, dt, 0); - } - GB_ASSERT(zero != nullptr); - - cgValue cond = cg_emit_comp(p, Token_Lt, x, cg_value(zero, x.type)); - cgValue neg = cg_emit_unary_arith(p, Token_Sub, x, x.type); - return cg_emit_select(p, cond, neg, x); -} - -gb_internal cgValue cg_builtin_clamp(cgProcedure *p, Type *t, cgValue const &x, cgValue const &min, cgValue const &max) { - cgValue z = x; - z = cg_builtin_max(p, t, z, min); - z = cg_builtin_min(p, t, z, max); - return z; -} - - - -gb_internal cgValue cg_builtin_mem_zero(cgProcedure *p, cgValue const &ptr, cgValue const &len) { - GB_ASSERT(ptr.kind == cgValue_Value); - GB_ASSERT(len.kind == cgValue_Value); - tb_inst_memzero(p->func, ptr.node, len.node, 1); - return ptr; -} - -gb_internal cgValue cg_builtin_mem_copy(cgProcedure *p, cgValue const &dst, cgValue const &src, cgValue const &len) { - GB_ASSERT(dst.kind == cgValue_Value); - GB_ASSERT(src.kind == cgValue_Value); - GB_ASSERT(len.kind == cgValue_Value); - // TODO(bill): This needs to be memmove - tb_inst_memcpy(p->func, dst.node, src.node, len.node, 1); - return dst; -} - -gb_internal cgValue cg_builtin_mem_copy_non_overlapping(cgProcedure *p, cgValue const &dst, cgValue const &src, cgValue const &len) { - GB_ASSERT(dst.kind == cgValue_Value); - GB_ASSERT(src.kind == cgValue_Value); - GB_ASSERT(len.kind == cgValue_Value); - tb_inst_memcpy(p->func, dst.node, src.node, len.node, 1); - return dst; -} - -gb_internal TB_Symbol *cg_builtin_map_cell_info_symbol(cgModule *m, Type *type) { - MUTEX_GUARD(&m->map_info_mutex); - TB_Symbol **found = map_get(&m->map_cell_info_map, type); - if (found) { - return *found; - } - i64 size = 0, len = 0; - map_cell_size_and_len(type, &size, &len); - - TB_Global *global = tb_global_create(m->mod, 0, "", cg_debug_type(m, t_map_cell_info), TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), global, type_size_of(t_map_cell_info), type_align_of(t_map_cell_info), 4); - - i64 ptr_size = build_context.ptr_size; - void *size_of_type = tb_global_add_region(m->mod, global, 0*ptr_size, ptr_size); - void *align_of_type = tb_global_add_region(m->mod, global, 1*ptr_size, ptr_size); - void *size_of_cell = tb_global_add_region(m->mod, global, 2*ptr_size, ptr_size); - void *elements_per_cell = tb_global_add_region(m->mod, global, 3*ptr_size, ptr_size); - - cg_write_uint_at_ptr(size_of_type, type_size_of(type), t_uintptr); - cg_write_uint_at_ptr(align_of_type, type_align_of(type), t_uintptr); - cg_write_uint_at_ptr(size_of_cell, size, t_uintptr); - cg_write_uint_at_ptr(elements_per_cell, len, t_uintptr); - - map_set(&m->map_cell_info_map, type, cast(TB_Symbol *)global); - - return cast(TB_Symbol *)global; -} - - -gb_internal cgValue cg_builtin_map_cell_info(cgProcedure *p, Type *type) { - type = core_type(type); - TB_Symbol *symbol = cg_builtin_map_cell_info_symbol(p->module, type); - TB_Node *node = tb_inst_get_symbol_address(p->func, symbol); - return cg_value(node, t_map_cell_info_ptr); -} - -gb_internal cgValue cg_builtin_map_info(cgProcedure *p, Type *map_type) { - map_type = base_type(map_type); - GB_ASSERT(map_type->kind == Type_Map); - - cgModule *m = p->module; - MUTEX_GUARD(&m->map_info_mutex); - TB_Global *global = nullptr; - TB_Symbol **found = map_get(&m->map_info_map, map_type); - if (found) { - global = cast(TB_Global *)*found; - } else { - global = tb_global_create(m->mod, 0, "", cg_debug_type(m, t_map_info), TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), global, type_size_of(t_map_info), type_align_of(t_map_info), 4); - - TB_Symbol *key_cell_info = cg_builtin_map_cell_info_symbol(m, map_type->Map.key); - TB_Symbol *value_cell_info = cg_builtin_map_cell_info_symbol(m, map_type->Map.value); - cgProcedure *key_hasher = cg_hasher_proc_for_type(p->module, map_type->Map.key); - cgProcedure *key_equal = cg_equal_proc_for_type (p->module, map_type->Map.key); - - tb_global_add_symbol_reloc(p->module->mod, global, 0*build_context.ptr_size, key_cell_info); - tb_global_add_symbol_reloc(p->module->mod, global, 1*build_context.ptr_size, value_cell_info); - tb_global_add_symbol_reloc(p->module->mod, global, 2*build_context.ptr_size, key_hasher->symbol); - tb_global_add_symbol_reloc(p->module->mod, global, 3*build_context.ptr_size, key_equal->symbol); - - map_set(&m->map_info_map, map_type, cast(TB_Symbol *)global); - } - - GB_ASSERT(global != nullptr); - TB_Node *node = tb_inst_get_symbol_address(p->func, cast(TB_Symbol *)global); - return cg_value(node, t_map_info_ptr); -} - - - - -gb_internal cgValue cg_build_builtin(cgProcedure *p, BuiltinProcId id, Ast *expr) { - ast_node(ce, CallExpr, expr); - - if (BuiltinProc__simd_begin < id && id < BuiltinProc__simd_end) { - GB_PANIC("TODO(bill): cg_build_builtin_simd_proc"); - // return cg_build_builtin_simd_proc(p, expr, tv, id); - } - - String builtin_name = builtin_procs[id].name; - - switch (id) { - case BuiltinProc_DIRECTIVE: { - ast_node(bd, BasicDirective, ce->proc); - String name = bd->name.string; - GB_ASSERT(name == "location"); - String procedure = p->entity->token.string; - TokenPos pos = ast_token(ce->proc).pos; - if (ce->args.count > 0) { - Ast *ident = unselector_expr(ce->args[0]); - GB_ASSERT(ident->kind == Ast_Ident); - Entity *e = entity_of_node(ident); - GB_ASSERT(e != nullptr); - - if (e->parent_proc_decl != nullptr && e->parent_proc_decl->entity != nullptr) { - procedure = e->parent_proc_decl->entity->token.string; - } else { - procedure = str_lit(""); - } - pos = e->token.pos; - - } - return cg_emit_source_code_location_as_global(p, procedure, pos); - } break; - - case BuiltinProc_len: { - cgValue v = cg_build_expr(p, ce->args[0]); - Type *t = base_type(v.type); - if (is_type_pointer(t)) { - // IMPORTANT TODO(bill): Should there be a nil pointer check? - v = cg_emit_load(p, v); - t = type_deref(t); - } - return cg_builtin_len(p, v); - } - - case BuiltinProc_cap: { - cgValue v = cg_build_expr(p, ce->args[0]); - Type *t = base_type(v.type); - if (is_type_pointer(t)) { - // IMPORTANT TODO(bill): Should there be a nil pointer check? - v = cg_emit_load(p, v); - t = type_deref(t); - } - return cg_builtin_cap(p, v); - } - - case BuiltinProc_raw_data: - { - cgValue v = cg_build_expr(p, ce->args[0]); - return cg_builtin_raw_data(p, v); - } - - case BuiltinProc_min: - if (ce->args.count == 2) { - Type *t = type_of_expr(expr); - cgValue x = cg_build_expr(p, ce->args[0]); - cgValue y = cg_build_expr(p, ce->args[1]); - return cg_builtin_min(p, t, x, y); - } else { - Type *t = type_of_expr(expr); - cgValue x = cg_build_expr(p, ce->args[0]); - for (isize i = 1; i < ce->args.count; i++) { - cgValue y = cg_build_expr(p, ce->args[i]); - x = cg_builtin_min(p, t, x, y); - } - return x; - } - break; - case BuiltinProc_max: - if (ce->args.count == 2) { - Type *t = type_of_expr(expr); - cgValue x = cg_build_expr(p, ce->args[0]); - cgValue y = cg_build_expr(p, ce->args[1]); - return cg_builtin_max(p, t, x, y); - } else { - Type *t = type_of_expr(expr); - cgValue x = cg_build_expr(p, ce->args[0]); - for (isize i = 1; i < ce->args.count; i++) { - cgValue y = cg_build_expr(p, ce->args[i]); - x = cg_builtin_max(p, t, x, y); - } - return x; - } - break; - - case BuiltinProc_abs: - { - cgValue x = cg_build_expr(p, ce->args[0]); - return cg_builtin_abs(p, x); - } - - case BuiltinProc_clamp: - { - cgValue x = cg_build_expr(p, ce->args[0]); - cgValue min = cg_build_expr(p, ce->args[1]); - cgValue max = cg_build_expr(p, ce->args[2]); - return cg_builtin_clamp(p, type_of_expr(expr), x, min, max); - } - - case BuiltinProc_debug_trap: - tb_inst_debugbreak(p->func); - return {}; - case BuiltinProc_trap: - tb_inst_trap(p->func); - return {}; - - case BuiltinProc_mem_zero: - { - cgValue ptr = cg_build_expr(p, ce->args[0]); - cgValue len = cg_build_expr(p, ce->args[1]); - return cg_builtin_mem_zero(p, ptr, len); - } - - case BuiltinProc_mem_copy: - { - cgValue dst = cg_build_expr(p, ce->args[0]); - cgValue src = cg_build_expr(p, ce->args[1]); - cgValue len = cg_build_expr(p, ce->args[2]); - return cg_builtin_mem_copy(p, dst, src, len); - } - - case BuiltinProc_mem_copy_non_overlapping: - { - cgValue dst = cg_build_expr(p, ce->args[0]); - cgValue src = cg_build_expr(p, ce->args[1]); - cgValue len = cg_build_expr(p, ce->args[2]); - return cg_builtin_mem_copy_non_overlapping(p, dst, src, len); - } - - - case BuiltinProc_overflow_add: - { - Type *res_type = type_of_expr(expr); - GB_ASSERT(res_type->kind == Type_Tuple); - GB_ASSERT(res_type->Tuple.variables.count == 2); - // TODO(bill): do a proper overflow add - Type *type = res_type->Tuple.variables[0]->type; - Type *ok_type = res_type->Tuple.variables[1]->type; - cgValue x = cg_build_expr(p, ce->args[0]); - cgValue y = cg_build_expr(p, ce->args[1]); - x = cg_emit_conv(p, x, type); - y = cg_emit_conv(p, y, type); - cgValue res = cg_emit_arith(p, Token_Add, x, y, type); - cgValue ok = cg_const_int(p, ok_type, false); - - return cg_value_multi2(res, ok, res_type); - } - - - case BuiltinProc_ptr_offset: - { - cgValue ptr = cg_build_expr(p, ce->args[0]); - cgValue len = cg_build_expr(p, ce->args[1]); - len = cg_emit_conv(p, len, t_int); - return cg_emit_ptr_offset(p, ptr, len); - } - case BuiltinProc_ptr_sub: - { - Type *elem0 = type_deref(type_of_expr(ce->args[0])); - Type *elem1 = type_deref(type_of_expr(ce->args[1])); - GB_ASSERT(are_types_identical(elem0, elem1)); - Type *elem = elem0; - - cgValue ptr0 = cg_emit_conv(p, cg_build_expr(p, ce->args[0]), t_uintptr); - cgValue ptr1 = cg_emit_conv(p, cg_build_expr(p, ce->args[1]), t_uintptr); - - cgValue diff = cg_emit_arith(p, Token_Sub, ptr0, ptr1, t_uintptr); - diff = cg_emit_conv(p, diff, t_int); - return cg_emit_arith(p, Token_Quo, diff, cg_const_int(p, t_int, type_size_of(elem)), t_int); - } - - case BuiltinProc_type_info_of: - { - Ast *arg = ce->args[0]; - TypeAndValue tav = type_and_value_of_expr(arg); - if (tav.mode == Addressing_Type) { - Type *t = default_type(type_of_expr(arg)); - return cg_type_info(p, t); - } - GB_ASSERT(is_type_typeid(tav.type)); - - auto args = slice_make(permanent_allocator(), 1); - args[0] = cg_build_expr(p, arg); - return cg_emit_runtime_call(p, "__type_info_of", args); - } - - - case BuiltinProc_type_equal_proc: - return cg_equal_proc_value_for_type(p, ce->args[0]->tav.type); - - case BuiltinProc_type_hasher_proc: - return cg_hasher_proc_value_for_type(p, ce->args[0]->tav.type); - - case BuiltinProc_type_map_cell_info: - return cg_builtin_map_cell_info(p, ce->args[0]->tav.type); - case BuiltinProc_type_map_info: - return cg_builtin_map_info(p, ce->args[0]->tav.type); - - case BuiltinProc_expect: - { - Type *t = default_type(expr->tav.type); - cgValue x = cg_emit_conv(p, cg_build_expr(p, ce->args[0]), t); - cgValue y = cg_emit_conv(p, cg_build_expr(p, ce->args[1]), t); - gb_unused(y); - return x; - } - - case BuiltinProc_count_leading_zeros: - { - cgValue n = cg_build_expr(p, ce->args[0]); - n = cg_emit_conv(p, n, default_type(expr->tav.type)); - GB_ASSERT(n.kind == cgValue_Value); - TB_Node *val = tb_inst_clz(p->func, n.node); - val = tb_inst_zxt(p->func, val, cg_data_type(n.type)); - return cg_value(val, n.type); - } - - - case BuiltinProc_count_trailing_zeros: - { - cgValue n = cg_build_expr(p, ce->args[0]); - n = cg_emit_conv(p, n, default_type(expr->tav.type)); - GB_ASSERT(n.kind == cgValue_Value); - TB_Node *val = tb_inst_ctz(p->func, n.node); - val = tb_inst_zxt(p->func, val, cg_data_type(n.type)); - return cg_value(val, n.type); - } - - case BuiltinProc_count_ones: - { - cgValue n = cg_build_expr(p, ce->args[0]); - n = cg_emit_conv(p, n, default_type(expr->tav.type)); - GB_ASSERT(n.kind == cgValue_Value); - TB_Node *val = tb_inst_popcount(p->func, n.node); - val = tb_inst_zxt(p->func, val, cg_data_type(n.type)); - return cg_value(val, n.type); - } - - case BuiltinProc_count_zeros: - { - cgValue n = cg_build_expr(p, ce->args[0]); - n = cg_emit_conv(p, n, default_type(expr->tav.type)); - GB_ASSERT(n.kind == cgValue_Value); - TB_DataType dt = cg_data_type(n.type); - TB_Node *ones = tb_inst_popcount(p->func, n.node); - ones = tb_inst_zxt(p->func, ones, dt); - - cgValue size = cg_const_int(p, n.type, 8*type_size_of(n.type)); - return cg_emit_arith(p, Token_Sub, size, cg_value(ones, n.type), n.type); - } - - } - - - GB_PANIC("TODO(bill): builtin procs %d %.*s", id, LIT(builtin_name)); - return {}; -} - diff --git a/src/tilde_const.cpp b/src/tilde_const.cpp deleted file mode 100644 index 456b2cdc7..000000000 --- a/src/tilde_const.cpp +++ /dev/null @@ -1,1049 +0,0 @@ -gb_internal bool cg_is_expr_constant_zero(Ast *expr) { - GB_ASSERT(expr != nullptr); - auto v = exact_value_to_integer(expr->tav.value); - if (v.kind == ExactValue_Integer) { - return big_int_cmp_zero(&v.value_integer) == 0; - } - return false; -} - -gb_internal cgValue cg_const_nil(cgModule *m, cgProcedure *p, Type *type) { - GB_ASSERT(m != nullptr); - Type *original_type = type; - type = core_type(type); - i64 size = type_size_of(type); - i64 align = type_align_of(type); - TB_DataType dt = cg_data_type(type); - if (TB_IS_VOID_TYPE(dt)) { - char name[32] = {}; - gb_snprintf(name, 31, "cnil$%u", 1+m->const_nil_guid.fetch_add(1)); - TB_Global *global = tb_global_create(m->mod, -1, name, cg_debug_type(m, type), TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), global, size, align, 0); - - TB_Symbol *symbol = cast(TB_Symbol *)global; - if (p) { - TB_Node *node = tb_inst_get_symbol_address(p->func, symbol); - return cg_lvalue_addr(node, type); - } else { - return cg_value(symbol, type); - } - } - - if (is_type_internally_pointer_like(type)) { - return cg_value(tb_inst_uint(p->func, dt, 0), type); - } else if (is_type_integer(type) || is_type_boolean(type) || is_type_bit_set(type) || is_type_typeid(type)) { - return cg_value(tb_inst_uint(p->func, dt, 0), type); - } else if (is_type_float(type)) { - switch (size) { - case 2: - return cg_value(tb_inst_uint(p->func, dt, 0), type); - case 4: - return cg_value(tb_inst_float32(p->func, 0), type); - case 8: - return cg_value(tb_inst_float64(p->func, 0), type); - } - } - GB_PANIC("TODO(bill): cg_const_nil %s", type_to_string(original_type)); - return {}; -} - -gb_internal cgValue cg_const_nil(cgProcedure *p, Type *type) { - return cg_const_nil(p->module, p, type); -} - -gb_internal TB_Global *cg_global_const_string(cgModule *m, String const &str, Type *type, TB_Global *global, i64 offset); -gb_internal void cg_write_int_at_ptr(void *dst, i64 i, Type *original_type); - -gb_internal void cg_global_source_code_location_const(cgModule *m, String const &proc_name, TokenPos pos, TB_Global *global, i64 offset) { - // Source_Code_Location :: struct { - // file_path: string, - // line, column: i32, - // procedure: string, - // } - - i64 file_path_offset = type_offset_of(t_source_code_location, 0); - i64 line_offset = type_offset_of(t_source_code_location, 1); - i64 column_offset = type_offset_of(t_source_code_location, 2); - i64 procedure_offset = type_offset_of(t_source_code_location, 3); - - String file_path = get_file_path_string(pos.file_id); - if (file_path.len != 0) { - cg_global_const_string(m, file_path, t_string, global, offset+file_path_offset); - } - - void *line_ptr = tb_global_add_region(m->mod, global, offset+line_offset, 4); - void *column_ptr = tb_global_add_region(m->mod, global, offset+column_offset, 4); - cg_write_int_at_ptr(line_ptr, pos.line, t_i32); - cg_write_int_at_ptr(column_ptr, pos.column, t_i32); - - if (proc_name.len != 0) { - cg_global_const_string(m, proc_name, t_string, global, offset+procedure_offset); - } -} - - -gb_internal cgValue cg_emit_source_code_location_as_global(cgProcedure *p, String const &proc_name, TokenPos pos) { - cgModule *m = p->module; - char name[32] = {}; - gb_snprintf(name, 31, "scl$%u", 1+m->const_nil_guid.fetch_add(1)); - - TB_Global *global = tb_global_create(m->mod, -1, name, cg_debug_type(m, t_source_code_location), TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), global, type_size_of(t_source_code_location), type_align_of(t_source_code_location), 6); - - cg_global_source_code_location_const(m, proc_name, pos, global, 0); - - TB_Node *ptr = tb_inst_get_symbol_address(p->func, cast(TB_Symbol *)global); - return cg_lvalue_addr(ptr, t_source_code_location); -} - -gb_internal cgValue cg_emit_source_code_location_as_global(cgProcedure *p, Ast *node) { - String proc_name = p->name; - TokenPos pos = ast_token(node).pos; - return cg_emit_source_code_location_as_global(p, proc_name, pos); -} - -gb_internal void cg_write_big_int_at_ptr(void *dst, BigInt const *a, Type *original_type) { - GB_ASSERT(build_context.endian_kind == TargetEndian_Little); - size_t sz = cast(size_t)type_size_of(original_type); - if (big_int_is_zero(a)) { - gb_memset(dst, 0, sz); - return; - } - u64 rop64[4] = {}; // 2 u64 is the maximum we will ever need, so doubling it will be fine :P - u8 *rop = cast(u8 *)rop64; - - size_t max_count = 0; - size_t written = 0; - size_t size = 1; - size_t nails = 0; - mp_endian endian = MP_LITTLE_ENDIAN; - - max_count = mp_pack_count(a, nails, size); - if (sz < max_count) { - debug_print_big_int(a); - gb_printf_err("%s -> %tu\n", type_to_string(original_type), sz);; - } - GB_ASSERT_MSG(sz >= max_count, "max_count: %tu, sz: %tu, written: %tu, type %s", max_count, sz, written, type_to_string(original_type)); - GB_ASSERT(gb_size_of(rop64) >= sz); - - mp_err err = mp_pack(rop, sz, &written, - MP_LSB_FIRST, - size, endian, nails, - a); - GB_ASSERT(err == MP_OKAY); - - if (!is_type_endian_little(original_type)) { - for (size_t i = 0; i < sz/2; i++) { - u8 tmp = rop[i]; - rop[i] = rop[sz-1-i]; - rop[sz-1-i] = tmp; - } - } - - gb_memcopy(dst, rop, sz); - return; -} - - -gb_internal void cg_write_int_at_ptr(void *dst, i64 i, Type *original_type) { - ExactValue v = exact_value_i64(i); - cg_write_big_int_at_ptr(dst, &v.value_integer, original_type); -} -gb_internal void cg_write_uint_at_ptr(void *dst, u64 i, Type *original_type) { - ExactValue v = exact_value_u64(i); - cg_write_big_int_at_ptr(dst, &v.value_integer, original_type); -} - -gb_internal TB_Global *cg_global_const_string(cgModule *m, String const &str, Type *type, TB_Global *global, i64 offset) { - GB_ASSERT(is_type_string(type)); - - char name[32] = {}; - gb_snprintf(name, 31, "csb$%u", 1+m->const_nil_guid.fetch_add(1)); - TB_Global *str_global = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE); - i64 size = str.len+1; - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), str_global, size, 1, 1); - u8 *data = cast(u8 *)tb_global_add_region(m->mod, str_global, 0, size); - gb_memcopy(data, str.text, str.len); - data[str.len] = 0; - - if (is_type_cstring(type)) { - if (global) { - tb_global_add_symbol_reloc(m->mod, global, offset+0, cast(TB_Symbol *)str_global); - } - return str_global; - } - - if (global == nullptr) { - gb_snprintf(name, 31, "cstr$%u", 1+m->const_nil_guid.fetch_add(1)); - global = tb_global_create(m->mod, -1, name, cg_debug_type(m, type), TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), global, type_size_of(type), type_align_of(type), 2); - } - - tb_global_add_symbol_reloc(m->mod, global, offset+0, cast(TB_Symbol *)str_global); - void *len_ptr = tb_global_add_region(m->mod, global, offset+build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(len_ptr, str.len, t_int); - - return global; -} - -gb_internal bool cg_elem_type_can_be_constant(Type *t) { - t = base_type(t); - if (t == t_invalid) { - return false; - } - if (is_type_dynamic_array(t) || is_type_map(t)) { - return false; - } - return true; -} - - -gb_internal bool cg_is_elem_const(Ast *elem, Type *elem_type) { - if (!cg_elem_type_can_be_constant(elem_type)) { - return false; - } - if (elem->kind == Ast_FieldValue) { - elem = elem->FieldValue.value; - } - TypeAndValue tav = type_and_value_of_expr(elem); - GB_ASSERT_MSG(tav.mode != Addressing_Invalid, "%s %s", expr_to_string(elem), type_to_string(tav.type)); - return tav.value.kind != ExactValue_Invalid; -} - -gb_internal bool cg_is_nested_possibly_constant(Type *ft, Selection const &sel, Ast *elem) { - GB_ASSERT(!sel.indirect); - for (i32 index : sel.index) { - Type *bt = base_type(ft); - switch (bt->kind) { - case Type_Struct: - // if (bt->Struct.is_raw_union) { - // return false; - // } - ft = bt->Struct.fields[index]->type; - break; - case Type_Array: - ft = bt->Array.elem; - break; - default: - return false; - } - } - return cg_is_elem_const(elem, ft); -} - -gb_internal i64 cg_global_const_calculate_region_count_from_basic_type(Type *type) { - type = core_type(type); - - switch (type->kind) { - case Type_Basic: - switch (type->Basic.kind) { - case Basic_string: // ^u8 + int - case Basic_any: // rawptr + typeid - return 2; - } - return 1; - case Type_Pointer: - case Type_MultiPointer: - return 2; // allows for offsets - case Type_Proc: - return 1; - case Type_Slice: - return 3; // alows for offsets - case Type_DynamicArray: - return 5; - case Type_Map: - return 4; - - case Type_Enum: - case Type_BitSet: - return 1; - - case Type_RelativePointer: - case Type_RelativeMultiPointer: - return 2; // allows for offsets - - case Type_Matrix: - return 1; - - case Type_Array: - { - Type *elem = type->Array.elem; - i64 count = cg_global_const_calculate_region_count_from_basic_type(elem); - return count*type->Array.count; - } - case Type_EnumeratedArray: - { - Type *elem = type->EnumeratedArray.elem; - i64 count = cg_global_const_calculate_region_count_from_basic_type(elem); - return count*type->EnumeratedArray.count; - } - - case Type_Struct: - if (type->Struct.is_raw_union) { - i64 max_count = 0; - for (Entity *f : type->Struct.fields) { - i64 count = cg_global_const_calculate_region_count_from_basic_type(f->type); - max_count = gb_max(count, max_count); - } - return max_count; - } else { - i64 max_count = 0; - for (Entity *f : type->Struct.fields) { - max_count += cg_global_const_calculate_region_count_from_basic_type(f->type); - } - return max_count; - } - break; - case Type_Union: - { - i64 max_count = 0; - for (Type *t : type->Union.variants) { - i64 count = cg_global_const_calculate_region_count_from_basic_type(t); - max_count = gb_max(count, max_count); - } - return max_count+1; - } - break; - - default: - GB_PANIC("TODO(bill): %s", type_to_string(type)); - break; - } - return -1; -} -gb_internal isize cg_global_const_calculate_region_count(ExactValue const &value, Type *type) { - Type *bt = base_type(type); - if (is_type_array(type) && value.kind == ExactValue_String && !is_type_u8(core_array_type(type))) { - if (is_type_rune_array(type)) { - return 1; - } - - Type *et = base_array_type(type); - i64 base_count = 2; - if (is_type_cstring(et)) { - base_count = 1; - } - return base_count * bt->Array.count; - } else if (is_type_u8_array(type) && value.kind == ExactValue_String) { - return 1; - } else if (is_type_array(type) && - value.kind != ExactValue_Invalid && - value.kind != ExactValue_String && - value.kind != ExactValue_Compound) { - Type *elem = type->Array.elem; - - i64 base_count = cg_global_const_calculate_region_count(value, elem); - return base_count * type->Array.count; - } else if (is_type_matrix(type) && - value.kind != ExactValue_Invalid && - value.kind != ExactValue_Compound) { - return 1; - } else if (is_type_simd_vector(type) && - value.kind != ExactValue_Invalid && - value.kind != ExactValue_Compound) { - return 1; - } - - isize count = 0; - switch (value.kind) { - case ExactValue_Invalid: - return 0; - case ExactValue_Bool: - case ExactValue_Integer: - case ExactValue_Float: - case ExactValue_Typeid: - case ExactValue_Complex: - case ExactValue_Quaternion: - return 1; - case ExactValue_Pointer: - return 2; - - case ExactValue_Procedure: - return 1; - - case ExactValue_String: - if (is_type_string(type)) { - return 3; - } else if (is_type_cstring(type) || is_type_array_like(type)) { - return 2; - } - return 3; - - case ExactValue_Compound: { - ast_node(cl, CompoundLit, value.value_compound); - Type *bt = base_type(type); - switch (bt->kind) { - case Type_Struct: - if (cl->elems[0]->kind == Ast_FieldValue) { - for (isize i = 0; i < cl->elems.count; i++) { - ast_node(fv, FieldValue, cl->elems[i]); - String name = fv->field->Ident.token.string; - - Selection sel = lookup_field(type, name, false); - GB_ASSERT(!sel.indirect); - - Entity *f = bt->Struct.fields[sel.index[0]]; - - if (!cg_elem_type_can_be_constant(f->type)) { - continue; - } - - if (sel.index.count == 1) { - count += cg_global_const_calculate_region_count(fv->value->tav.value, f->type); - } else { - count += 1; // just in case - if (cg_is_nested_possibly_constant(type, sel, fv->value)) { - Type *cv_type = sel.entity->type; - count += cg_global_const_calculate_region_count(fv->value->tav.value, cv_type); - } - } - } - } else { - for_array(i, cl->elems) { - i64 field_index = i; - Ast *elem = cl->elems[i]; - TypeAndValue tav = elem->tav; - Entity *f = bt->Struct.fields[field_index]; - if (!cg_elem_type_can_be_constant(f->type)) { - continue; - } - - ExactValue value = {}; - if (tav.mode != Addressing_Invalid) { - value = tav.value; - } - count += cg_global_const_calculate_region_count(value, type); - } - } - break; - case Type_Array: - case Type_EnumeratedArray: - case Type_SimdVector: { - Type *et = base_array_type(bt); - if (!cg_elem_type_can_be_constant(et)) { - break; - } - for (Ast *elem : cl->elems) { - if (elem->kind == Ast_FieldValue) { - ast_node(fv, FieldValue, elem); - ExactValue const &value = elem->FieldValue.value->tav.value; - if (is_ast_range(fv->field)) { - ast_node(ie, BinaryExpr, fv->field); - TypeAndValue lo_tav = ie->left->tav; - TypeAndValue hi_tav = ie->right->tav; - GB_ASSERT(lo_tav.mode == Addressing_Constant); - GB_ASSERT(hi_tav.mode == Addressing_Constant); - - TokenKind op = ie->op.kind; - i64 lo = exact_value_to_i64(lo_tav.value); - i64 hi = exact_value_to_i64(hi_tav.value); - if (op != Token_RangeHalf) { - hi += 1; - } - - for (i64 i = lo; i < hi; i++) { - count += cg_global_const_calculate_region_count(value, et); - } - } else { - count += cg_global_const_calculate_region_count(value, et); - } - } else { - ExactValue const &value = elem->tav.value; - count += cg_global_const_calculate_region_count(value, et); - } - } - } break; - - case Type_BitSet: - return 1; - case Type_Matrix: - return 1; - - case Type_Slice: - return 3; - - default: - GB_PANIC("TODO(bill): %s", type_to_string(type)); - break; - } - }break; - } - return count; -} - -gb_internal TB_Global *cg_global_const_comp_literal(cgModule *m, Type *type, ExactValue const &value, TB_Global *global, i64 base_offset); - -gb_internal bool cg_global_const_add_region(cgModule *m, ExactValue const &value, Type *type, TB_Global *global, i64 offset) { - GB_ASSERT(is_type_endian_little(type)); - GB_ASSERT(!is_type_different_to_arch_endianness(type)); - - GB_ASSERT(global != nullptr); - - Type *bt = base_type(type); - i64 size = type_size_of(type); - if (value.kind == ExactValue_Invalid) { - return false; - } - if (is_type_array(type) && value.kind == ExactValue_String && !is_type_u8(core_array_type(type))) { - if (is_type_rune_array(type)) { - i64 count = type->Array.count; - Rune rune; - isize rune_offset = 0; - isize width = 1; - String s = value.value_string; - - Rune *runes = cast(Rune *)tb_global_add_region(m->mod, global, offset, count*4); - - for (i64 i = 0; i < count && rune_offset < s.len; i++) { - width = utf8_decode(s.text+rune_offset, s.len-rune_offset, &rune); - runes[i] = rune; - rune_offset += width; - - } - GB_ASSERT(offset == s.len); - return true; - } - Type *et = bt->Array.elem; - i64 elem_size = type_size_of(et); - - for (i64 i = 0; i < bt->Array.count; i++) { - cg_global_const_add_region(m, value, et, global, offset+(i * elem_size)); - } - return true; - } else if (is_type_u8_array(type) && value.kind == ExactValue_String) { - u8 *dst = cast(u8 *)tb_global_add_region(m->mod, global, offset, size); - gb_memcopy(dst, value.value_string.text, gb_min(value.value_string.len, size)); - return true; - } else if (is_type_array(type) && - value.kind != ExactValue_Invalid && - value.kind != ExactValue_String && - value.kind != ExactValue_Compound) { - - Type *et = bt->Array.elem; - i64 elem_size = type_size_of(et); - - for (i64 i = 0; i < bt->Array.count; i++) { - cg_global_const_add_region(m, value, et, global, offset+(i * elem_size)); - } - - return true; - } else if (is_type_matrix(type) && - value.kind != ExactValue_Invalid && - value.kind != ExactValue_Compound) { - GB_PANIC("TODO(bill): matrices"); - - i64 row = bt->Matrix.row_count; - i64 column = bt->Matrix.column_count; - GB_ASSERT(row == column); - - Type *elem = bt->Matrix.elem; - - i64 elem_size = type_size_of(elem); - gb_unused(elem_size); - - // 1 region in memory, not many - - return true; - } else if (is_type_simd_vector(type) && - value.kind != ExactValue_Invalid && - value.kind != ExactValue_Compound) { - - GB_PANIC("TODO(bill): #simd vectors"); - - Type *et = type->SimdVector.elem; - i64 elem_size = type_size_of(et); - gb_unused(elem_size); - - // 1 region in memory, not many - - return true; - } - - - switch (value.kind) { - case ExactValue_Bool: - { - GB_ASSERT_MSG(!is_type_array_like(bt), "%s", type_to_string(type)); - bool *res = cast(bool *)tb_global_add_region(m->mod, global, offset, size); - *res = !!value.value_bool; - } - break; - - case ExactValue_Integer: - { - GB_ASSERT_MSG(!is_type_array_like(bt), "%s", type_to_string(type)); - void *res = tb_global_add_region(m->mod, global, offset, size); - cg_write_big_int_at_ptr(res, &value.value_integer, type); - } - break; - - case ExactValue_Float: - { - GB_ASSERT_MSG(!is_type_array_like(bt), "%s", type_to_string(type)); - f64 f = exact_value_to_f64(value); - void *res = tb_global_add_region(m->mod, global, offset, size); - switch (size) { - case 2: *(u16 *)res = f32_to_f16(cast(f32)f); break; - case 4: *(f32 *)res = cast(f32)f; break; - case 8: *(f64 *)res = cast(f64)f; break; - } - } - break; - - case ExactValue_Pointer: - { - GB_ASSERT_MSG(!is_type_array_like(bt), "%s", type_to_string(type)); - void *res = tb_global_add_region(m->mod, global, offset, size); - *(u64 *)res = exact_value_to_u64(value); - } - break; - - case ExactValue_String: - if (is_type_array_like(type)) { - GB_ASSERT(global != nullptr); - void *data = tb_global_add_region(m->mod, global, offset, size); - gb_memcopy(data, value.value_string.text, gb_min(value.value_string.len, size)); - } else { - cg_global_const_string(m, value.value_string, type, global, offset); - } - break; - - case ExactValue_Typeid: - { - GB_ASSERT_MSG(!is_type_array_like(bt), "%s", type_to_string(type)); - void *dst = tb_global_add_region(m->mod, global, offset, size); - u64 id = cg_typeid_as_u64(m, value.value_typeid); - cg_write_uint_at_ptr(dst, id, t_typeid); - } - break; - - case ExactValue_Compound: - { - TB_Global *out_global = cg_global_const_comp_literal(m, type, value, global, offset); - GB_ASSERT(out_global == global); - } - break; - - case ExactValue_Procedure: - GB_PANIC("TODO(bill): nested procedure values/literals\n"); - break; - case ExactValue_Complex: - { - GB_ASSERT_MSG(!is_type_array_like(bt), "%s", type_to_string(type)); - Complex128 c = {}; - if (value.value_complex) { - c = *value.value_complex; - } - void *res = tb_global_add_region(m->mod, global, offset, size); - switch (size) { - case 4: - ((u16 *)res)[0] = f32_to_f16(cast(f32)c.real); - ((u16 *)res)[1] = f32_to_f16(cast(f32)c.imag); - break; - case 8: - ((f32 *)res)[0] = cast(f32)c.real; - ((f32 *)res)[1] = cast(f32)c.imag; - break; - case 16: - ((f64 *)res)[0] = cast(f64)c.real; - ((f64 *)res)[1] = cast(f64)c.imag; - break; - } - } - break; - case ExactValue_Quaternion: - { - GB_ASSERT_MSG(!is_type_array_like(bt), "%s", type_to_string(type)); - // @QuaternionLayout - Quaternion256 q = {}; - if (value.value_quaternion) { - q = *value.value_quaternion; - } - void *res = tb_global_add_region(m->mod, global, offset, size); - switch (size) { - case 8: - ((u16 *)res)[0] = f32_to_f16(cast(f32)q.imag); - ((u16 *)res)[1] = f32_to_f16(cast(f32)q.jmag); - ((u16 *)res)[2] = f32_to_f16(cast(f32)q.kmag); - ((u16 *)res)[3] = f32_to_f16(cast(f32)q.real); - break; - case 16: - ((f32 *)res)[0] = cast(f32)q.imag; - ((f32 *)res)[1] = cast(f32)q.jmag; - ((f32 *)res)[2] = cast(f32)q.kmag; - ((f32 *)res)[3] = cast(f32)q.real; - break; - case 32: - ((f64 *)res)[0] = cast(f64)q.imag; - ((f64 *)res)[1] = cast(f64)q.jmag; - ((f64 *)res)[2] = cast(f64)q.kmag; - ((f64 *)res)[3] = cast(f64)q.real; - break; - } - } - break; - default: - GB_PANIC("%s", type_to_string(type)); - break; - } - return true; -} - - -gb_internal TB_Global *cg_global_const_comp_literal(cgModule *m, Type *original_type, ExactValue const &value, TB_Global *global, i64 base_offset) { - GB_ASSERT(value.kind == ExactValue_Compound); - Ast *value_compound = value.value_compound; - ast_node(cl, CompoundLit, value_compound); - - TEMPORARY_ALLOCATOR_GUARD(); - - if (global == nullptr) { - char name[32] = {}; - gb_snprintf(name, 31, "complit$%u", 1+m->const_nil_guid.fetch_add(1)); - global = tb_global_create(m->mod, -1, name, cg_debug_type(m, original_type), TB_LINKAGE_PRIVATE); - i64 size = type_size_of(original_type); - i64 align = type_align_of(original_type); - - // READ ONLY? - TB_ModuleSectionHandle section = 0; - if (is_type_string(original_type) || is_type_cstring(original_type)) { - section = tb_module_get_rdata(m->mod); - } else { - section = tb_module_get_data(m->mod); - } - - if (cl->elems.count == 0) { - tb_global_set_storage(m->mod, section, global, size, align, 0); - return global; - } - - - isize global_region_count = cg_global_const_calculate_region_count(value, original_type); - tb_global_set_storage(m->mod, section, global, size, align, global_region_count); - } - - if (cl->elems.count == 0) { - return global; - } - - - Type *bt = base_type(original_type); - i64 bt_size = type_size_of(bt); - - switch (bt->kind) { - case Type_Struct: - if (cl->elems[0]->kind == Ast_FieldValue) { - isize elem_count = cl->elems.count; - for (isize i = 0; i < elem_count; i++) { - ast_node(fv, FieldValue, cl->elems[i]); - String name = fv->field->Ident.token.string; - - TypeAndValue tav = fv->value->tav; - GB_ASSERT(tav.mode != Addressing_Invalid); - ExactValue value = tav.value; - - Selection sel = lookup_field(bt, name, false); - GB_ASSERT(!sel.indirect); - - if (!cg_is_nested_possibly_constant(bt, sel, fv->value)) { - continue; - } - - i64 offset = type_offset_of_from_selection(bt, sel); - cg_global_const_add_region(m, value, sel.entity->type, global, base_offset+offset); - } - } else { - for_array(i, cl->elems) { - i64 field_index = i; - Ast *elem = cl->elems[i]; - TypeAndValue tav = elem->tav; - Entity *f = bt->Struct.fields[field_index]; - if (!cg_elem_type_can_be_constant(f->type)) { - continue; - } - - i64 offset = bt->Struct.offsets[field_index]; - - ExactValue value = {}; - if (tav.mode != Addressing_Invalid) { - value = tav.value; - } - cg_global_const_add_region(m, value, f->type, global, base_offset+offset); - } - } - return global; - - case Type_Array: - case Type_EnumeratedArray: - case Type_SimdVector: - if (cl->elems[0]->kind == Ast_FieldValue) { - Type *et = base_array_type(bt); - i64 elem_size = type_size_of(et); - for (Ast *elem : cl->elems) { - ast_node(fv, FieldValue, elem); - - ExactValue const &value = fv->value->tav.value; - - if (is_ast_range(fv->field)) { - ast_node(ie, BinaryExpr, fv->field); - TypeAndValue lo_tav = ie->left->tav; - TypeAndValue hi_tav = ie->right->tav; - GB_ASSERT(lo_tav.mode == Addressing_Constant); - GB_ASSERT(hi_tav.mode == Addressing_Constant); - - TokenKind op = ie->op.kind; - i64 lo = exact_value_to_i64(lo_tav.value); - i64 hi = exact_value_to_i64(hi_tav.value); - if (op != Token_RangeHalf) { - hi += 1; - } - - for (i64 i = lo; i < hi; i++) { - i64 offset = i * elem_size; - cg_global_const_add_region(m, value, et, global, base_offset+offset); - } - } else { - TypeAndValue index_tav = fv->field->tav; - GB_ASSERT(index_tav.mode == Addressing_Constant); - i64 i = exact_value_to_i64(index_tav.value); - i64 offset = i * elem_size; - cg_global_const_add_region(m, value, et, global, base_offset+offset); - } - } - } else { - Type *et = base_array_type(bt); - i64 elem_size = type_size_of(et); - i64 offset = 0; - for (Ast *elem : cl->elems) { - ExactValue const &value = elem->tav.value; - cg_global_const_add_region(m, value, et, global, base_offset+offset); - offset += elem_size; - } - } - - return global; - - case Type_BitSet: - if (bt_size > 0) { - BigInt bits = {}; - BigInt one = {}; - big_int_from_u64(&one, 1); - - for_array(i, cl->elems) { - Ast *e = cl->elems[i]; - GB_ASSERT(e->kind != Ast_FieldValue); - - TypeAndValue tav = e->tav; - if (tav.mode != Addressing_Constant) { - continue; - } - GB_ASSERT(tav.value.kind == ExactValue_Integer); - i64 v = big_int_to_i64(&tav.value.value_integer); - i64 lower = bt->BitSet.lower; - u64 index = cast(u64)(v-lower); - BigInt bit = {}; - big_int_from_u64(&bit, index); - big_int_shl(&bit, &one, &bit); - big_int_or(&bits, &bits, &bit); - } - - void *dst = tb_global_add_region(m->mod, global, base_offset, bt_size); - cg_write_big_int_at_ptr(dst, &bits, original_type); - } - return global; - - case Type_Matrix: - GB_PANIC("TODO(bill): constant compound literal for %s", type_to_string(original_type)); - break; - - case Type_Slice: - { - i64 count = gb_max(cl->elems.count, cl->max_count); - Type *elem = bt->Slice.elem; - Type *t = alloc_type_array(elem, count); - TB_Global *backing_array = cg_global_const_comp_literal(m, t, value, nullptr, 0); - - tb_global_add_symbol_reloc(m->mod, global, base_offset+0, cast(TB_Symbol *)backing_array); - - void *len_ptr = tb_global_add_region(m->mod, global, base_offset+build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(len_ptr, count, t_int); - } - return global; - } - - GB_PANIC("TODO(bill): constant compound literal for %s", type_to_string(original_type)); - return nullptr; -} - - -gb_internal cgValue cg_const_value(cgProcedure *p, Type *type, ExactValue const &value) { - GB_ASSERT(p != nullptr); - TB_Node *node = nullptr; - - if (is_type_untyped(type)) { - // TODO(bill): THIS IS A COMPLETE HACK, WHY DOES THIS NOT A TYPE? - GB_ASSERT(type->kind == Type_Basic); - switch (type->Basic.kind) { - case Basic_UntypedBool: - type = t_bool; - break; - case Basic_UntypedInteger: - type = t_i64; - break; - case Basic_UntypedFloat: - type = t_f64; - break; - case Basic_UntypedComplex: - type = t_complex128; - break; - case Basic_UntypedQuaternion: - type = t_quaternion256; - break; - case Basic_UntypedString: - type = t_string; - break; - case Basic_UntypedRune: - type = t_rune; - break; - case Basic_UntypedNil: - case Basic_UntypedUninit: - return cg_value(cast(TB_Node *)nullptr, type); - } - } - TB_DataType dt = cg_data_type(type); - - switch (value.kind) { - case ExactValue_Invalid: - return cg_const_nil(p, type); - - case ExactValue_Typeid: - return cg_typeid(p, value.value_typeid); - - case ExactValue_Procedure: - { - Ast *expr = unparen_expr(value.value_procedure); - if (expr->kind == Ast_ProcLit) { - cgProcedure *anon = cg_procedure_generate_anonymous(p->module, expr, p); - TB_Node *ptr = tb_inst_get_symbol_address(p->func, anon->symbol); - GB_ASSERT(are_types_identical(type, anon->type)); - return cg_value(ptr, type); - } - - Entity *e = entity_of_node(expr); - if (e != nullptr) { - TB_Symbol *found = cg_find_symbol_from_entity(p->module, e); - GB_ASSERT_MSG(found != nullptr, "could not find '%.*s'", LIT(e->token.string)); - TB_Node *ptr = tb_inst_get_symbol_address(p->func, found); - GB_ASSERT(type != nullptr); - GB_ASSERT(are_types_identical(type, e->type)); - return cg_value(ptr, type); - } - - GB_PANIC("TODO(bill): cg_const_value ExactValue_Procedure %s", expr_to_string(expr)); - } - break; - } - - switch (value.kind) { - case ExactValue_Bool: - GB_ASSERT(!TB_IS_VOID_TYPE(dt)); - return cg_value(tb_inst_uint(p->func, dt, value.value_bool), type); - - case ExactValue_Integer: - GB_ASSERT(!TB_IS_VOID_TYPE(dt)); - // GB_ASSERT(dt.raw != TB_TYPE_I128.raw); - if (is_type_unsigned(type)) { - u64 i = 0; - if (value.kind == ExactValue_Integer && value.value_integer.sign) { - i = exact_value_to_i64(value); - } else { - i = exact_value_to_u64(value); - } - return cg_value(tb_inst_uint(p->func, dt, i), type); - } else { - i64 i = exact_value_to_i64(value); - return cg_value(tb_inst_sint(p->func, dt, i), type); - } - break; - - case ExactValue_Float: - GB_ASSERT(!TB_IS_VOID_TYPE(dt)); - GB_ASSERT(dt.raw != TB_TYPE_F16.raw); - GB_ASSERT(!is_type_different_to_arch_endianness(type)); - { - f64 f = exact_value_to_f64(value); - if (type_size_of(type) == 8) { - return cg_value(tb_inst_float64(p->func, f), type); - } else { - return cg_value(tb_inst_float32(p->func, cast(f32)f), type); - } - } - break; - - case ExactValue_String: - { - GB_ASSERT(is_type_string(type)); - cgModule *m = p->module; - - String str = value.value_string; - - char name[32] = {}; - gb_snprintf(name, 31, "csb$%u", 1+m->const_nil_guid.fetch_add(1)); - TB_Global *cstr_global = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE); - - i64 size = str.len+1; - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), cstr_global, size, 1, 1); - u8 *data = cast(u8 *)tb_global_add_region(m->mod, cstr_global, 0, size); - gb_memcopy(data, str.text, str.len); - data[str.len] = 0; - - if (is_type_cstring(type)) { - cgValue s = cg_value(cstr_global, type); - return cg_flatten_value(p, s); - } - - gb_snprintf(name, 31, "str$%u", 1+m->const_nil_guid.fetch_add(1)); - TB_Global *str_global = tb_global_create(m->mod, -1, name, cg_debug_type(m, type), TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), str_global, type_size_of(type), type_align_of(type), 2); - - tb_global_add_symbol_reloc(m->mod, str_global, 0, cast(TB_Symbol *)cstr_global); - void *len_ptr = tb_global_add_region(m->mod, str_global, build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(len_ptr, str.len, t_int); - - TB_Node *s = tb_inst_get_symbol_address(p->func, cast(TB_Symbol *)str_global); - return cg_lvalue_addr(s, type); - - } - - case ExactValue_Pointer: - return cg_value(tb_inst_uint(p->func, dt, exact_value_to_u64(value)), type); - - case ExactValue_Compound: - { - TB_Symbol *symbol = cast(TB_Symbol *)cg_global_const_comp_literal(p->module, type, value, nullptr, 0); - TB_Node *node = tb_inst_get_symbol_address(p->func, symbol); - return cg_lvalue_addr(node, type); - } - break; - } - - - GB_ASSERT(node != nullptr); - return cg_value(node, type); -} - -gb_internal cgValue cg_const_int(cgProcedure *p, Type *type, i64 i) { - return cg_const_value(p, type, exact_value_i64(i)); -} -gb_internal cgValue cg_const_bool(cgProcedure *p, Type *type, bool v) { - return cg_value(tb_inst_bool(p->func, v), type); -} - -gb_internal cgValue cg_const_string(cgProcedure *p, Type *type, String const &str) { - return cg_const_value(p, type, exact_value_string(str)); -} - -gb_internal cgValue cg_const_union_tag(cgProcedure *p, Type *u, Type *v) { - return cg_const_value(p, union_tag_type(u), exact_value_i64(union_variant_index(u, v))); -} - diff --git a/src/tilde_debug.cpp b/src/tilde_debug.cpp deleted file mode 100644 index a4b82bf72..000000000 --- a/src/tilde_debug.cpp +++ /dev/null @@ -1,482 +0,0 @@ -gb_internal TB_DebugType *cg_debug_type_internal(cgModule *m, Type *type); -gb_internal TB_DebugType *cg_debug_type(cgModule *m, Type *type) { - type = reduce_tuple_to_single_type(type); - - mutex_lock(&m->debug_type_mutex); - defer (mutex_unlock(&m->debug_type_mutex)); - TB_DebugType **found = map_get(&m->debug_type_map, type); - if (found) { - return *found; - } - - TB_DebugType *res = cg_debug_type_internal(m, type); - map_set(&m->debug_type_map, type, res); - return res; -} - -gb_internal TB_DebugType *cg_debug_type_for_proc(cgModule *m, Type *type) { - GB_ASSERT(is_type_proc(type)); - TB_DebugType **func_found = nullptr; - TB_DebugType *func_ptr = cg_debug_type(m, type); - GB_ASSERT(func_ptr != nullptr); - - mutex_lock(&m->debug_type_mutex); - func_found = map_get(&m->proc_debug_type_map, type); - mutex_unlock(&m->debug_type_mutex); - GB_ASSERT(func_found != nullptr); - return *func_found; -} - - -gb_internal TB_DebugType *cg_debug_type_internal_record(cgModule *m, Type *type, String const &record_name) { - Type *bt = base_type(type); - switch (bt->kind) { - case Type_Struct: - { - type_set_offsets(bt); - - TB_DebugType *record = nullptr; - if (bt->Struct.is_raw_union) { - record = tb_debug_create_union(m->mod, record_name.len, cast(char const *)record_name.text); - } else { - record = tb_debug_create_struct(m->mod, record_name.len, cast(char const *)record_name.text); - } - if (record_name.len != 0) { - map_set(&m->debug_type_map, type, record); - } - - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, bt->Struct.fields.count); - for_array(i, bt->Struct.fields) { - Entity *e = bt->Struct.fields[i]; - Type *type = e->type; - if (is_type_proc(type)) { - type = t_rawptr; - } - TB_DebugType *field_type = cg_debug_type(m, type); - String name = e->token.string; - TB_CharUnits offset = cast(TB_CharUnits)bt->Struct.offsets[i]; - if (name.len == 0) { - name = str_lit("_"); - } - - fields[i] = tb_debug_create_field(m->mod, field_type, name.len, cast(char const *)name.text, offset); - } - tb_debug_record_end( - record, - cast(TB_CharUnits)type_size_of(type), - cast(TB_CharUnits)type_align_of(type) - ); - return record; - } - break; - - case Type_Tuple: - { - GB_ASSERT(record_name.len == 0); - type_set_offsets(bt); - - TB_DebugType *record = tb_debug_create_struct(m->mod, 0, ""); - isize record_count = 0; - for (Entity *e : bt->Tuple.variables) { - if (e->kind == Entity_Variable) { - record_count += 1; - } - } - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, record_count); - for_array(i, bt->Tuple.variables) { - Entity *e = bt->Tuple.variables[i]; - if (e->kind != Entity_Variable) { - continue; - } - Type *type = e->type; - if (is_type_proc(type)) { - type = t_rawptr; - } - TB_DebugType *field_type = cg_debug_type(m, type); - String name = e->token.string; - TB_CharUnits offset = cast(TB_CharUnits)bt->Tuple.offsets[i]; - if (name.len == 0) { - name = str_lit("_"); - } - - fields[i] = tb_debug_create_field(m->mod, field_type, name.len, cast(char const *)name.text, offset); - } - tb_debug_record_end( - record, - cast(TB_CharUnits)type_size_of(type), - cast(TB_CharUnits)type_align_of(type) - ); - return record; - } - break; - case Type_Union: - { - TB_DebugType *record = tb_debug_create_struct(m->mod, record_name.len, cast(char const *)record_name.text); - if (record_name.len != 0) { - map_set(&m->debug_type_map, type, record); - } - - i64 variant_count = bt->Union.variants.count; - if (is_type_union_maybe_pointer(bt)) { - // NO TAG - GB_ASSERT(variant_count == 1); - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, variant_count); - TB_DebugType *variant_type = cg_debug_type(m, bt->Union.variants[0]); - fields[0] = tb_debug_create_field(m->mod, variant_type, -1, "v0", 0); - tb_debug_record_end( - record, - cast(TB_CharUnits)type_size_of(type), - cast(TB_CharUnits)type_align_of(type) - ); - } else { - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, variant_count+1); - for_array(i, bt->Union.variants) { - Type *v = bt->Union.variants[i]; - TB_DebugType *variant_type = cg_debug_type(m, v); - char name[32] = {}; - u32 v_index = cast(u32)i; - if (bt->Union.kind != UnionType_no_nil) { - v_index += 1; - } - gb_snprintf(name, 31, "v%u", v_index); - fields[i] = tb_debug_create_field(m->mod, variant_type, -1, name, 0); - } - - TB_DebugType *tag_type = cg_debug_type(m, union_tag_type(bt)); - fields[variant_count] = tb_debug_create_field(m->mod, tag_type, -1, "tag", cast(TB_CharUnits)bt->Union.variant_block_size); - - } - tb_debug_record_end( - record, - cast(TB_CharUnits)type_size_of(type), - cast(TB_CharUnits)type_align_of(type) - ); - return record; - } - break; - } - return nullptr; -} - - -gb_internal TB_DebugType *cg_debug_type_internal(cgModule *m, Type *type) { - if (type == nullptr) { - return tb_debug_get_void(m->mod); - } - Type *original_type = type; - if (type->kind == Type_Named) { - String name = type->Named.name; - TB_DebugType *res = cg_debug_type_internal_record(m, type, name); - if (res) { - return res; - } - type = base_type(type->Named.base); - } - - TB_CharUnits int_size = cast(TB_CharUnits)build_context.int_size; - TB_CharUnits ptr_size = cast(TB_CharUnits)build_context.ptr_size; - TB_CharUnits size = cast(TB_CharUnits)type_size_of(type); - TB_CharUnits align = cast(TB_CharUnits)type_align_of(type); - int bits = cast(int)(8*size); - bool is_signed = is_type_integer(core_type(type)) && !is_type_unsigned(core_type(type)); - - switch (type->kind) { - case Type_Basic: - switch (type->Basic.kind) { - case Basic_bool: return tb_debug_get_bool(m->mod); - case Basic_b8: return tb_debug_get_bool(m->mod); - case Basic_b16: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_b32: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_b64: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i8: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u8: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i16: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u16: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i32: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u32: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i64: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u64: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i128: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u128: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_rune: return tb_debug_get_integer(m->mod, is_signed, bits); - - case Basic_f16: return tb_debug_get_integer(m->mod, false, bits); - case Basic_f32: return tb_debug_get_float(m->mod, TB_FLT_32); - case Basic_f64: return tb_debug_get_float(m->mod, TB_FLT_64); - - case Basic_complex32: - case Basic_complex64: - case Basic_complex128: - { - String name = basic_types[type->Basic.kind].Basic.name; - TB_DebugType *record = tb_debug_create_struct(m->mod, name.len, cast(char const *)name.text); - Type *et = base_complex_elem_type(type); - TB_CharUnits elem_size = cast(TB_CharUnits)type_size_of(et); - TB_DebugType *elem = cg_debug_type(m, et); - - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, 2); - fields[0] = tb_debug_create_field(m->mod, elem, -1, "real", 0*elem_size); - fields[1] = tb_debug_create_field(m->mod, elem, -1, "imag", 1*elem_size); - - tb_debug_record_end(record, size, align); - return record; - } - case Basic_quaternion64: - case Basic_quaternion128: - case Basic_quaternion256: - { - String name = basic_types[type->Basic.kind].Basic.name; - TB_DebugType *record = tb_debug_create_struct(m->mod, name.len, cast(char const *)name.text); - Type *et = base_complex_elem_type(type); - TB_CharUnits elem_size = cast(TB_CharUnits)type_size_of(et); - TB_DebugType *elem = cg_debug_type(m, et); - - // @QuaternionLayout - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, 4); - fields[0] = tb_debug_create_field(m->mod, elem, -1, "imag", 0*elem_size); - fields[1] = tb_debug_create_field(m->mod, elem, -1, "jmag", 1*elem_size); - fields[2] = tb_debug_create_field(m->mod, elem, -1, "kmag", 2*elem_size); - fields[3] = tb_debug_create_field(m->mod, elem, -1, "real", 3*elem_size); - - tb_debug_record_end(record, size, align); - return record; - } - - case Basic_int: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_uint: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_uintptr: return tb_debug_get_integer(m->mod, is_signed, bits); - - case Basic_rawptr: - return tb_debug_create_ptr(m->mod, tb_debug_get_void(m->mod)); - case Basic_string: - { - String name = basic_types[type->Basic.kind].Basic.name; - TB_DebugType *record = tb_debug_create_struct(m->mod, name.len, cast(char const *)name.text); - // @QuaternionLayout - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, 2); - fields[0] = tb_debug_create_field(m->mod, cg_debug_type(m, t_u8_ptr), -1, "data", 0*int_size); - fields[1] = tb_debug_create_field(m->mod, cg_debug_type(m, t_int), -1, "len", 1*int_size); - - tb_debug_record_end(record, size, align); - return record; - } - case Basic_cstring: - return tb_debug_create_ptr(m->mod, tb_debug_get_integer(m->mod, false, 8)); - - case Basic_any: - { - String name = basic_types[type->Basic.kind].Basic.name; - TB_DebugType *record = tb_debug_create_struct(m->mod, name.len, cast(char const *)name.text); - // @QuaternionLayout - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, 2); - fields[0] = tb_debug_create_field(m->mod, cg_debug_type(m, t_rawptr), -1, "data", 0*ptr_size); - fields[1] = tb_debug_create_field(m->mod, cg_debug_type(m, t_typeid), -1, "id", 1*ptr_size); - - tb_debug_record_end(record, size, align); - return record; - } - case Basic_typeid: return tb_debug_get_integer(m->mod, false, bits); - - case Basic_i16le: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u16le: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i32le: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u32le: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i64le: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u64le: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i128le: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u128le: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i16be: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u16be: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i32be: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u32be: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i64be: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u64be: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_i128be: return tb_debug_get_integer(m->mod, is_signed, bits); - case Basic_u128be: return tb_debug_get_integer(m->mod, is_signed, bits); - - case Basic_f16le: return tb_debug_get_integer(m->mod, false, bits); - case Basic_f32le: return tb_debug_get_float(m->mod, TB_FLT_32); - case Basic_f64le: return tb_debug_get_float(m->mod, TB_FLT_64); - case Basic_f16be: return tb_debug_get_integer(m->mod, false, bits); - case Basic_f32be: return tb_debug_get_float(m->mod, TB_FLT_32); - case Basic_f64be: return tb_debug_get_float(m->mod, TB_FLT_64); - } - break; - case Type_Generic: - GB_PANIC("SHOULD NEVER HIT"); - break; - case Type_Pointer: - return tb_debug_create_ptr(m->mod, cg_debug_type(m, type->Pointer.elem)); - case Type_MultiPointer: - return tb_debug_create_ptr(m->mod, cg_debug_type(m, type->MultiPointer.elem)); - case Type_Array: - return tb_debug_create_array(m->mod, cg_debug_type(m, type->Array.elem), type->Array.count); - case Type_EnumeratedArray: - return tb_debug_create_array(m->mod, cg_debug_type(m, type->EnumeratedArray.elem), type->EnumeratedArray.count); - case Type_Slice: - { - String name = {}; - TB_DebugType *record = tb_debug_create_struct(m->mod, name.len, cast(char const *)name.text); - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, 2); - fields[0] = tb_debug_create_field(m->mod, cg_debug_type(m, alloc_type_pointer(type->Slice.elem)), -1, "data", 0*int_size); - fields[1] = tb_debug_create_field(m->mod, cg_debug_type(m, t_int), -1, "len", 1*int_size); - - tb_debug_record_end(record, size, align); - return record; - } - case Type_DynamicArray: - { - String name = {}; - TB_DebugType *record = tb_debug_create_struct(m->mod, name.len, cast(char const *)name.text); - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, 4); - fields[0] = tb_debug_create_field(m->mod, cg_debug_type(m, alloc_type_pointer(type->Slice.elem)), -1, "data", 0*int_size); - fields[1] = tb_debug_create_field(m->mod, cg_debug_type(m, t_int), -1, "len", 1*int_size); - fields[2] = tb_debug_create_field(m->mod, cg_debug_type(m, t_int), -1, "cap", 2*int_size); - fields[3] = tb_debug_create_field(m->mod, cg_debug_type(m, t_allocator), -1, "allocator", 3*int_size); - - tb_debug_record_end(record, size, align); - return record; - } - case Type_Map: - return cg_debug_type(m, t_raw_map); - - case Type_Struct: - case Type_Tuple: - case Type_Union: - return cg_debug_type_internal_record(m, type, {}); - - case Type_Enum: - return tb_debug_get_integer(m->mod, is_signed, bits); - - case Type_Proc: - { - TypeProc *pt = &type->Proc; - isize param_count = 0; - isize return_count = 0; - - bool is_odin_cc = is_calling_convention_odin(pt->calling_convention); - - if (pt->params) for (Entity *e : pt->params->Tuple.variables) { - if (e->kind == Entity_Variable) { - param_count += 1; - } - } - - if (pt->result_count > 0) { - if (is_odin_cc) { - // Split returns - param_count += pt->result_count-1; - return_count = 1; - } else { - return_count = 1; - } - } - - if (pt->calling_convention == ProcCC_Odin) { - // `context` ptr - param_count += 1; - } - - TB_CallingConv tb_cc = TB_CDECL; - if (pt->calling_convention == ProcCC_StdCall) { - tb_cc = TB_STDCALL; - } - TB_DebugType *func = tb_debug_create_func(m->mod, tb_cc, param_count, return_count, pt->c_vararg); - - map_set(&m->proc_debug_type_map, original_type, func); - map_set(&m->proc_debug_type_map, type, func); - - TB_DebugType *func_ptr = tb_debug_create_ptr(m->mod, func); - map_set(&m->debug_type_map, original_type, func_ptr); - map_set(&m->debug_type_map, type, func_ptr); - - TB_DebugType **params = tb_debug_func_params(func); - TB_DebugType **returns = tb_debug_func_returns(func); - - isize param_index = 0; - isize return_index = 0; - if (pt->params) for (Entity *e : pt->params->Tuple.variables) { - if (e->kind == Entity_Variable) { - Type *type = e->type; - if (is_type_proc(type)) { - type = t_rawptr; - } - String name = e->token.string; - if (name.len == 0) { - name = str_lit("_"); - } - params[param_index++] = tb_debug_create_field(m->mod, cg_debug_type(m, type), name.len, cast(char const *)name.text, 0); - } - } - - if (pt->result_count) { - GB_ASSERT(pt->results); - if (is_odin_cc) { - // Split Returns - for (isize i = 0; i < pt->results->Tuple.variables.count-1; i++) { - Entity *e = pt->results->Tuple.variables[i]; - GB_ASSERT(e->kind == Entity_Variable); - Type *type = e->type; - if (is_type_proc(e->type)) { - type = t_rawptr; - } - type = alloc_type_pointer(type); - - String name = e->token.string; - if (name.len == 0) { - name = str_lit("_"); - } - params[param_index++] = tb_debug_create_field(m->mod, cg_debug_type(m, type), name.len, cast(char const *)name.text, 0); - } - - Type *last_type = pt->results->Tuple.variables[pt->results->Tuple.variables.count-1]->type; - if (is_type_proc(last_type)) { - last_type = t_rawptr; - } - returns[return_index++] = cg_debug_type(m, last_type); - } else { - returns[return_index++] = cg_debug_type(m, pt->results); - } - } - - if (pt->calling_convention == ProcCC_Odin) { - Type *type = t_context_ptr; - String name = str_lit("__.context_ptr"); - params[param_index++] = tb_debug_create_field(m->mod, cg_debug_type(m, type), name.len, cast(char const *)name.text, 0); - } - - GB_ASSERT_MSG(param_index == param_count, "%td vs %td for %s", param_index, param_count, type_to_string(type)); - GB_ASSERT_MSG(return_index == return_count, "%td vs %td for %s", return_index, return_count, type_to_string(type)); - - return func_ptr; - } - break; - case Type_BitSet: - return cg_debug_type(m, bit_set_to_int(type)); - case Type_SimdVector: - return tb_debug_create_array(m->mod, cg_debug_type(m, type->SimdVector.elem), type->SimdVector.count); - case Type_RelativePointer: - return cg_debug_type(m, type->RelativePointer.base_integer); - case Type_RelativeMultiPointer: - return cg_debug_type(m, type->RelativeMultiPointer.base_integer); - case Type_Matrix: - { - i64 count = matrix_type_total_internal_elems(type); - return tb_debug_create_array(m->mod, cg_debug_type(m, type->Matrix.elem), count); - } - case Type_SoaPointer: - { - String name = {}; - TB_DebugType *record = tb_debug_create_struct(m->mod, name.len, cast(char const *)name.text); - TB_DebugType **fields = tb_debug_record_begin(m->mod, record, 2); - fields[0] = tb_debug_create_field(m->mod, cg_debug_type(m, alloc_type_pointer(type->SoaPointer.elem)), -1, "ptr", 0*int_size); - fields[1] = tb_debug_create_field(m->mod, cg_debug_type(m, t_int), -1, "offset", 1*int_size); - - tb_debug_record_end(record, size, align); - return record; - } - } - - // TODO(bill): cg_debug_type - return tb_debug_get_void(m->mod); -} diff --git a/src/tilde_expr.cpp b/src/tilde_expr.cpp deleted file mode 100644 index 236d0cf7d..000000000 --- a/src/tilde_expr.cpp +++ /dev/null @@ -1,3961 +0,0 @@ -gb_internal cgValue cg_flatten_value(cgProcedure *p, cgValue value) { - GB_ASSERT(value.kind != cgValue_Multi); - if (value.kind == cgValue_Symbol) { - GB_ASSERT(is_type_internally_pointer_like(value.type)); - return cg_value(tb_inst_get_symbol_address(p->func, value.symbol), value.type); - } else if (value.kind == cgValue_Addr) { - // TODO(bill): Is this a good idea? - // this converts an lvalue to an rvalue if trivially possible - TB_DataType dt = cg_data_type(value.type); - if (!TB_IS_VOID_TYPE(dt)) { - TB_CharUnits align = cast(TB_CharUnits)type_align_of(value.type); - return cg_value(tb_inst_load(p->func, dt, value.node, align, false), value.type); - } - } - return value; -} - -gb_internal cgValue cg_emit_select(cgProcedure *p, cgValue const &cond, cgValue const &x, cgValue const &y) { - GB_ASSERT(x.kind == y.kind); - GB_ASSERT(cond.kind == cgValue_Value); - cgValue res = x; - res.node = tb_inst_select(p->func, cond.node, x.node, y.node); - return res; -} - - -gb_internal bool cg_is_expr_untyped_const(Ast *expr) { - auto const &tv = type_and_value_of_expr(expr); - if (is_type_untyped(tv.type)) { - return tv.value.kind != ExactValue_Invalid; - } - return false; -} -gb_internal cgValue cg_expr_untyped_const_to_typed(cgProcedure *p, Ast *expr, Type *t) { - GB_ASSERT(is_type_typed(t)); - auto const &tv = type_and_value_of_expr(expr); - return cg_const_value(p, t, tv.value); -} - -gb_internal cgContextData *cg_push_context_onto_stack(cgProcedure *p, cgAddr ctx) { - ctx.kind = cgAddr_Context; - cgContextData *cd = array_add_and_get(&p->context_stack); - cd->ctx = ctx; - cd->scope_index = p->scope_index; - return cd; -} - -gb_internal cgAddr cg_find_or_generate_context_ptr(cgProcedure *p) { - if (p->context_stack.count > 0) { - return p->context_stack[p->context_stack.count-1].ctx; - } - - Type *pt = base_type(p->type); - GB_ASSERT(pt->kind == Type_Proc); - GB_ASSERT(pt->Proc.calling_convention != ProcCC_Odin); - - cgAddr c = cg_add_local(p, t_context, nullptr, true); - tb_function_attrib_variable(p->func, c.addr.node, nullptr, -1, "context", cg_debug_type(p->module, t_context)); - c.kind = cgAddr_Context; - // lb_emit_init_context(p, c); - cg_push_context_onto_stack(p, c); - // lb_add_debug_context_variable(p, c); - - return c; -} - -gb_internal cgValue cg_find_value_from_entity(cgModule *m, Entity *e) { - e = strip_entity_wrapping(e); - GB_ASSERT(e != nullptr); - - GB_ASSERT(e->token.string != "_"); - - if (e->kind == Entity_Procedure) { - return cg_find_procedure_value_from_entity(m, e); - } - - cgValue *found = nullptr; - rw_mutex_shared_lock(&m->values_mutex); - found = map_get(&m->values, e); - rw_mutex_shared_unlock(&m->values_mutex); - if (found) { - return *found; - } - - GB_PANIC("\n\tError in: %s, missing value '%.*s'\n", token_pos_to_string(e->token.pos), LIT(e->token.string)); - return {}; -} - -gb_internal cgValue cg_get_using_variable(cgProcedure *p, Entity *e) { - GB_ASSERT(e->kind == Entity_Variable && e->flags & EntityFlag_Using); - String name = e->token.string; - Entity *parent = e->using_parent; - Selection sel = lookup_field(parent->type, name, false); - GB_ASSERT(sel.entity != nullptr); - cgValue *pv = map_get(&p->module->values, parent); - - cgValue v = {}; - - if (pv == nullptr && parent->flags & EntityFlag_SoaPtrField) { - // NOTE(bill): using SOA value (probably from for-in statement) - GB_PANIC("TODO(bill): cg_get_soa_variable_addr"); - // cgAddr parent_addr = cg_get_soa_variable_addr(p, parent); - // v = cg_addr_get_ptr(p, parent_addr); - } else if (pv != nullptr) { - v = *pv; - } else { - GB_ASSERT_MSG(e->using_expr != nullptr, "%.*s %.*s", LIT(e->token.string), LIT(name)); - v = cg_build_addr_ptr(p, e->using_expr); - } - GB_ASSERT(v.node != nullptr); - GB_ASSERT_MSG(parent->type == type_deref(v.type), "%s %s", type_to_string(parent->type), type_to_string(v.type)); - cgValue ptr = cg_emit_deep_field_gep(p, v, sel); - // if (parent->scope) { - // if ((parent->scope->flags & (ScopeFlag_File|ScopeFlag_Pkg)) == 0) { - // cg_add_debug_local_variable(p, ptr.value, e->type, e->token); - // } - // } else { - // cg_add_debug_local_variable(p, ptr.value, e->type, e->token); - // } - return ptr; -} -gb_internal cgAddr cg_build_addr_from_entity(cgProcedure *p, Entity *e, Ast *expr) { - GB_ASSERT(e != nullptr); - if (e->kind == Entity_Constant) { - Type *t = default_type(type_of_expr(expr)); - cgValue v = cg_const_value(p, t, e->Constant.value); - GB_PANIC("TODO(bill): cg_add_global_generated"); - // return cg_add_global_generated(p->module, t, v); - return {}; - } - - cgAddr *local_found = map_get(&p->variable_map, e); - if (local_found) { - return *local_found; - } - - cgValue v = {}; - - cgModule *m = p->module; - - rw_mutex_lock(&m->values_mutex); - cgValue *found = map_get(&m->values, e); - rw_mutex_unlock(&m->values_mutex); - if (found) { - v = *found; - } else if (e->kind == Entity_Variable && e->flags & EntityFlag_Using) { - // NOTE(bill): Calculate the using variable every time - v = cg_get_using_variable(p, e); - } else if (e->flags & EntityFlag_SoaPtrField) { - return map_must_get(&p->soa_values_map, e); - } - - - if (v.node == nullptr) { - cgValue v = cg_find_value_from_entity(m, e); - v = cg_flatten_value(p, v); - return cg_addr(v); - } - - return cg_addr(v); -} - -gb_internal cgValue cg_emit_union_tag_ptr(cgProcedure *p, cgValue const &parent_ptr) { - Type *t = parent_ptr.type; - Type *ut = base_type(type_deref(t)); - GB_ASSERT_MSG(is_type_pointer(t), "%s", type_to_string(t)); - GB_ASSERT_MSG(ut->kind == Type_Union, "%s", type_to_string(t)); - - GB_ASSERT(!is_type_union_maybe_pointer_original_alignment(ut)); - GB_ASSERT(!is_type_union_maybe_pointer(ut)); - GB_ASSERT(type_size_of(ut) > 0); - - Type *tag_type = union_tag_type(ut); - i64 tag_offset = ut->Union.variant_block_size; - - GB_ASSERT(parent_ptr.kind == cgValue_Value); - TB_Node *ptr = parent_ptr.node; - TB_Node *tag_ptr = tb_inst_member_access(p->func, ptr, tag_offset); - return cg_value(tag_ptr, alloc_type_pointer(tag_type)); -} - - - -gb_internal cgValue cg_correct_endianness(cgProcedure *p, cgValue value) { - Type *src = core_type(value.type); - GB_ASSERT(is_type_integer(src) || is_type_float(src)); - if (is_type_different_to_arch_endianness(src)) { - GB_PANIC("TODO(bill): cg_correct_endianness"); - // Type *platform_src_type = integer_endian_type_to_platform_type(src); - // value = cg_emit_byte_swap(p, value, platform_src_type); - } - return value; -} - -gb_internal cgValue cg_emit_transmute(cgProcedure *p, cgValue value, Type *type) { - GB_ASSERT(type_size_of(value.type) == type_size_of(type)); - - value = cg_flatten_value(p, value); - - if (are_types_identical(value.type, type)) { - return value; - } - if (are_types_identical(core_type(value.type), core_type(type))) { - value.type = type; - return value; - } - - i64 src_align = type_align_of(value.type); - i64 dst_align = type_align_of(type); - - if (dst_align > src_align) { - cgAddr local = cg_add_local(p, type, nullptr, false); - cgValue dst = local.addr; - dst.type = alloc_type_pointer(value.type); - cg_emit_store(p, dst, value); - return cg_addr_load(p, local); - } - - TB_DataType dt = cg_data_type(type); - switch (value.kind) { - case cgValue_Value: - GB_ASSERT_MSG(!TB_IS_VOID_TYPE(dt), "%d %s -> %s", dt.type, type_to_string(value.type), type_to_string(type)); - value.type = type; - if (value.node->dt.raw != dt.raw) { - switch (value.node->dt.type) { - case TB_INT: - switch (value.node->dt.type) { - case TB_INT: - break; - case TB_FLOAT: - value.node = tb_inst_bitcast(p->func, value.node, dt); - break; - case TB_PTR: - value.node = tb_inst_int2ptr(p->func, value.node); - break; - } - break; - case TB_FLOAT: - switch (value.node->dt.type) { - case TB_INT: - value.node = tb_inst_bitcast(p->func, value.node, dt); - break; - case TB_FLOAT: - break; - case TB_PTR: - value.node = tb_inst_bitcast(p->func, value.node, TB_TYPE_INTPTR); - value.node = tb_inst_int2ptr(p->func, value.node); - break; - } - break; - case TB_PTR: - switch (value.node->dt.type) { - case TB_INT: - value.node = tb_inst_ptr2int(p->func, value.node, dt); - break; - case TB_FLOAT: - value.node = tb_inst_ptr2int(p->func, value.node, TB_TYPE_INTPTR); - value.node = tb_inst_bitcast(p->func, value.node, dt); - break; - case TB_PTR: - break; - } - break; - } - } - return value; - case cgValue_Addr: - value.type = type; - return value; - case cgValue_Symbol: - GB_PANIC("should be handled above"); - break; - case cgValue_Multi: - GB_PANIC("cannot transmute multiple values at once"); - break; - } - return value; - -} -gb_internal cgValue cg_emit_byte_swap(cgProcedure *p, cgValue value, Type *end_type) { - GB_ASSERT(type_size_of(value.type) == type_size_of(end_type)); - - if (type_size_of(value.type) < 2) { - return value; - } - - if (is_type_float(value.type)) { - i64 sz = type_size_of(value.type); - Type *integer_type = nullptr; - switch (sz) { - case 2: integer_type = t_u16; break; - case 4: integer_type = t_u32; break; - case 8: integer_type = t_u64; break; - } - GB_ASSERT(integer_type != nullptr); - value = cg_emit_transmute(p, value, integer_type); - } - - GB_ASSERT(value.kind == cgValue_Value); - - // TODO(bill): bswap - // value.node = tb_inst_bswap(p->func, value.node); - return cg_emit_transmute(p, value, end_type); -} - -gb_internal cgValue cg_emit_comp_records(cgProcedure *p, TokenKind op_kind, cgValue left, cgValue right, Type *type) { - GB_ASSERT((is_type_struct(type) || is_type_union(type)) && is_type_comparable(type)); - cgValue left_ptr = cg_address_from_load_or_generate_local(p, left); - cgValue right_ptr = cg_address_from_load_or_generate_local(p, right); - cgValue res = {}; - if (type_size_of(type) == 0) { - switch (op_kind) { - case Token_CmpEq: - return cg_const_bool(p, t_bool, true); - case Token_NotEq: - return cg_const_bool(p, t_bool, false); - } - GB_PANIC("invalid operator"); - } - TEMPORARY_ALLOCATOR_GUARD(); - if (is_type_simple_compare(type)) { - // TODO(bill): Test to see if this is actually faster!!!! - auto args = slice_make(temporary_allocator(), 3); - args[0] = cg_emit_conv(p, left_ptr, t_rawptr); - args[1] = cg_emit_conv(p, right_ptr, t_rawptr); - args[2] = cg_const_int(p, t_int, type_size_of(type)); - res = cg_emit_runtime_call(p, "memory_equal", args); - } else { - cgProcedure *equal_proc = cg_equal_proc_for_type(p->module, type); - cgValue value = cg_value(tb_inst_get_symbol_address(p->func, equal_proc->symbol), equal_proc->type); - auto args = slice_make(temporary_allocator(), 2); - args[0] = cg_emit_conv(p, left_ptr, t_rawptr); - args[1] = cg_emit_conv(p, right_ptr, t_rawptr); - res = cg_emit_call(p, value, args); - } - if (op_kind == Token_NotEq) { - res = cg_emit_unary_arith(p, Token_Not, res, res.type); - } - return res; -} - -gb_internal cgValue cg_emit_comp(cgProcedure *p, TokenKind op_kind, cgValue left, cgValue right) { - GB_ASSERT(gb_is_between(op_kind, Token__ComparisonBegin+1, Token__ComparisonEnd-1)); - - Type *a = core_type(left.type); - Type *b = core_type(right.type); - - cgValue nil_check = {}; - if (is_type_array_like(left.type) || is_type_array_like(right.type)) { - // don't do `nil` check if it is array-like - } else if (is_type_untyped_nil(left.type)) { - nil_check = cg_emit_comp_against_nil(p, op_kind, right); - } else if (is_type_untyped_nil(right.type)) { - nil_check = cg_emit_comp_against_nil(p, op_kind, left); - } - if (nil_check.node != nullptr) { - return nil_check; - } - - if (are_types_identical(a, b)) { - // NOTE(bill): No need for a conversion - } /*else if (cg_is_const(left) || cg_is_const_nil(left)) { - left = cg_emit_conv(p, left, right.type); - } else if (cg_is_const(right) || cg_is_const_nil(right)) { - right = cg_emit_conv(p, right, left.type); - }*/ else { - Type *lt = left.type; - Type *rt = right.type; - - lt = left.type; - rt = right.type; - i64 ls = type_size_of(lt); - i64 rs = type_size_of(rt); - - // NOTE(bill): Quick heuristic, larger types are usually the target type - if (ls < rs) { - left = cg_emit_conv(p, left, rt); - } else if (ls > rs) { - right = cg_emit_conv(p, right, lt); - } else { - if (is_type_union(rt)) { - left = cg_emit_conv(p, left, rt); - } else { - right = cg_emit_conv(p, right, lt); - } - } - } - - a = core_type(left.type); - b = core_type(right.type); - left = cg_flatten_value(p, left); - right = cg_flatten_value(p, right); - - - if (is_type_matrix(a) && (op_kind == Token_CmpEq || op_kind == Token_NotEq)) { - GB_PANIC("TODO(bill): cg_emit_comp matrix"); - // Type *tl = base_type(a); - // lbValue lhs = lb_address_from_load_or_generate_local(p, left); - // lbValue rhs = lb_address_from_load_or_generate_local(p, right); - - - // // TODO(bill): Test to see if this is actually faster!!!! - // auto args = array_make(permanent_allocator(), 3); - // args[0] = lb_emit_conv(p, lhs, t_rawptr); - // args[1] = lb_emit_conv(p, rhs, t_rawptr); - // args[2] = lb_const_int(p->module, t_int, type_size_of(tl)); - // lbValue val = lb_emit_runtime_call(p, "memory_compare", args); - // lbValue res = lb_emit_comp(p, op_kind, val, lb_const_nil(p->module, val.type)); - // return lb_emit_conv(p, res, t_bool); - } - if (is_type_array_like(a)) { - GB_PANIC("TODO(bill): cg_emit_comp is_type_array_like"); - // Type *tl = base_type(a); - // lbValue lhs = lb_address_from_load_or_generate_local(p, left); - // lbValue rhs = lb_address_from_load_or_generate_local(p, right); - - - // TokenKind cmp_op = Token_And; - // lbValue res = lb_const_bool(p->module, t_bool, true); - // if (op_kind == Token_NotEq) { - // res = lb_const_bool(p->module, t_bool, false); - // cmp_op = Token_Or; - // } else if (op_kind == Token_CmpEq) { - // res = lb_const_bool(p->module, t_bool, true); - // cmp_op = Token_And; - // } - - // bool inline_array_arith = lb_can_try_to_inline_array_arith(tl); - // i32 count = 0; - // switch (tl->kind) { - // case Type_Array: count = cast(i32)tl->Array.count; break; - // case Type_EnumeratedArray: count = cast(i32)tl->EnumeratedArray.count; break; - // } - - // if (inline_array_arith) { - // // inline - // lbAddr val = lb_add_local_generated(p, t_bool, false); - // lb_addr_store(p, val, res); - // for (i32 i = 0; i < count; i++) { - // lbValue x = lb_emit_load(p, lb_emit_array_epi(p, lhs, i)); - // lbValue y = lb_emit_load(p, lb_emit_array_epi(p, rhs, i)); - // lbValue cmp = lb_emit_comp(p, op_kind, x, y); - // lbValue new_res = lb_emit_arith(p, cmp_op, lb_addr_load(p, val), cmp, t_bool); - // lb_addr_store(p, val, lb_emit_conv(p, new_res, t_bool)); - // } - - // return lb_addr_load(p, val); - // } else { - // if (is_type_simple_compare(tl) && (op_kind == Token_CmpEq || op_kind == Token_NotEq)) { - // // TODO(bill): Test to see if this is actually faster!!!! - // auto args = array_make(permanent_allocator(), 3); - // args[0] = lb_emit_conv(p, lhs, t_rawptr); - // args[1] = lb_emit_conv(p, rhs, t_rawptr); - // args[2] = lb_const_int(p->module, t_int, type_size_of(tl)); - // lbValue val = lb_emit_runtime_call(p, "memory_compare", args); - // lbValue res = lb_emit_comp(p, op_kind, val, lb_const_nil(p->module, val.type)); - // return lb_emit_conv(p, res, t_bool); - // } else { - // lbAddr val = lb_add_local_generated(p, t_bool, false); - // lb_addr_store(p, val, res); - // auto loop_data = lb_loop_start(p, count, t_i32); - // { - // lbValue i = loop_data.idx; - // lbValue x = lb_emit_load(p, lb_emit_array_ep(p, lhs, i)); - // lbValue y = lb_emit_load(p, lb_emit_array_ep(p, rhs, i)); - // lbValue cmp = lb_emit_comp(p, op_kind, x, y); - // lbValue new_res = lb_emit_arith(p, cmp_op, lb_addr_load(p, val), cmp, t_bool); - // lb_addr_store(p, val, lb_emit_conv(p, new_res, t_bool)); - // } - // lb_loop_end(p, loop_data); - - // return lb_addr_load(p, val); - // } - // } - } - - if ((is_type_struct(a) || is_type_union(a)) && is_type_comparable(a)) { - return cg_emit_comp_records(p, op_kind, left, right, a); - } - - if ((is_type_struct(b) || is_type_union(b)) && is_type_comparable(b)) { - return cg_emit_comp_records(p, op_kind, left, right, b); - } - - if (is_type_string(a)) { - if (is_type_cstring(a)) { - left = cg_emit_conv(p, left, t_string); - right = cg_emit_conv(p, right, t_string); - } - - char const *runtime_procedure = nullptr; - switch (op_kind) { - case Token_CmpEq: runtime_procedure = "string_eq"; break; - case Token_NotEq: runtime_procedure = "string_ne"; break; - case Token_Lt: runtime_procedure = "string_lt"; break; - case Token_Gt: runtime_procedure = "string_gt"; break; - case Token_LtEq: runtime_procedure = "string_le"; break; - case Token_GtEq: runtime_procedure = "string_gt"; break; - } - GB_ASSERT(runtime_procedure != nullptr); - - auto args = slice_make(permanent_allocator(), 2); - args[0] = left; - args[1] = right; - return cg_emit_runtime_call(p, runtime_procedure, args); - } - - if (is_type_complex(a)) { - char const *runtime_procedure = ""; - i64 sz = 8*type_size_of(a); - switch (sz) { - case 32: - switch (op_kind) { - case Token_CmpEq: runtime_procedure = "complex32_eq"; break; - case Token_NotEq: runtime_procedure = "complex32_ne"; break; - } - break; - case 64: - switch (op_kind) { - case Token_CmpEq: runtime_procedure = "complex64_eq"; break; - case Token_NotEq: runtime_procedure = "complex64_ne"; break; - } - break; - case 128: - switch (op_kind) { - case Token_CmpEq: runtime_procedure = "complex128_eq"; break; - case Token_NotEq: runtime_procedure = "complex128_ne"; break; - } - break; - } - GB_ASSERT(runtime_procedure != nullptr); - - GB_PANIC("TODO(bill): cg_emit_runtime_call"); - // auto args = array_make(permanent_allocator(), 2); - // args[0] = left; - // args[1] = right; - // return lb_emit_runtime_call(p, runtime_procedure, args); - } - - if (is_type_quaternion(a)) { - char const *runtime_procedure = ""; - i64 sz = 8*type_size_of(a); - switch (sz) { - case 64: - switch (op_kind) { - case Token_CmpEq: runtime_procedure = "quaternion64_eq"; break; - case Token_NotEq: runtime_procedure = "quaternion64_ne"; break; - } - break; - case 128: - switch (op_kind) { - case Token_CmpEq: runtime_procedure = "quaternion128_eq"; break; - case Token_NotEq: runtime_procedure = "quaternion128_ne"; break; - } - break; - case 256: - switch (op_kind) { - case Token_CmpEq: runtime_procedure = "quaternion256_eq"; break; - case Token_NotEq: runtime_procedure = "quaternion256_ne"; break; - } - break; - } - GB_ASSERT(runtime_procedure != nullptr); - - GB_PANIC("TODO(bill): cg_emit_runtime_call"); - // auto args = array_make(permanent_allocator(), 2); - // args[0] = left; - // args[1] = right; - // return lb_emit_runtime_call(p, runtime_procedure, args); - } - - if (is_type_bit_set(a)) { - switch (op_kind) { - case Token_Lt: - case Token_LtEq: - case Token_Gt: - case Token_GtEq: - { - Type *it = bit_set_to_int(a); - cgValue lhs = cg_emit_transmute(p, left, it); - cgValue rhs = cg_emit_transmute(p, right, it); - cgValue res = cg_emit_arith(p, Token_And, lhs, rhs, it); - GB_ASSERT(lhs.kind == cgValue_Value); - GB_ASSERT(rhs.kind == cgValue_Value); - GB_ASSERT(res.kind == cgValue_Value); - - if (op_kind == Token_Lt || op_kind == Token_LtEq) { - // (lhs & rhs) == lhs - res = cg_value(tb_inst_cmp_eq(p->func, res.node, lhs.node), t_bool); - } else if (op_kind == Token_Gt || op_kind == Token_GtEq) { - // (lhs & rhs) == rhs - res = cg_value(tb_inst_cmp_eq(p->func, res.node, rhs.node), t_bool); - } - - // NOTE(bill): Strict subsets - if (op_kind == Token_Lt || op_kind == Token_Gt) { - // res &~ (lhs == rhs) - cgValue eq = cg_value(tb_inst_cmp_eq(p->func, lhs.node, rhs.node), t_bool); - res = cg_emit_arith(p, Token_AndNot, res, eq, t_bool); - } - return res; - } - - case Token_CmpEq: - GB_ASSERT(left.kind == cgValue_Value); - GB_ASSERT(right.kind == cgValue_Value); - return cg_value(tb_inst_cmp_eq(p->func, left.node, right.node), t_bool); - case Token_NotEq: - GB_ASSERT(left.kind == cgValue_Value); - GB_ASSERT(right.kind == cgValue_Value); - return cg_value(tb_inst_cmp_ne(p->func, left.node, right.node), t_bool); - } - } - - if (op_kind != Token_CmpEq && op_kind != Token_NotEq) { - Type *t = left.type; - if (is_type_integer(t) && is_type_different_to_arch_endianness(t)) { - Type *platform_type = integer_endian_type_to_platform_type(t); - cgValue x = cg_emit_byte_swap(p, left, platform_type); - cgValue y = cg_emit_byte_swap(p, right, platform_type); - left = x; - right = y; - } else if (is_type_float(t) && is_type_different_to_arch_endianness(t)) { - Type *platform_type = integer_endian_type_to_platform_type(t); - cgValue x = cg_emit_conv(p, left, platform_type); - cgValue y = cg_emit_conv(p, right, platform_type); - left = x; - right = y; - } - } - - a = core_type(left.type); - b = core_type(right.type); - - - if (is_type_integer(a) || - is_type_boolean(a) || - is_type_pointer(a) || - is_type_multi_pointer(a) || - is_type_proc(a) || - is_type_enum(a) || - is_type_typeid(a)) { - TB_Node *lhs = left.node; - TB_Node *rhs = right.node; - TB_Node *res = nullptr; - - bool is_signed = is_type_integer(left.type) && !is_type_unsigned(left.type); - switch (op_kind) { - case Token_CmpEq: res = tb_inst_cmp_eq(p->func, lhs, rhs); break; - case Token_NotEq: res = tb_inst_cmp_ne(p->func, lhs, rhs); break; - case Token_Gt: res = tb_inst_cmp_igt(p->func, lhs, rhs, is_signed); break; - case Token_GtEq: res = tb_inst_cmp_ige(p->func, lhs, rhs, is_signed); break; - case Token_Lt: res = tb_inst_cmp_ilt(p->func, lhs, rhs, is_signed); break; - case Token_LtEq: res = tb_inst_cmp_ile(p->func, lhs, rhs, is_signed); break; - } - - GB_ASSERT(res != nullptr); - return cg_value(res, t_bool); - } else if (is_type_float(a)) { - TB_Node *lhs = left.node; - TB_Node *rhs = right.node; - TB_Node *res = nullptr; - switch (op_kind) { - case Token_CmpEq: res = tb_inst_cmp_eq(p->func, lhs, rhs); break; - case Token_NotEq: res = tb_inst_cmp_ne(p->func, lhs, rhs); break; - case Token_Gt: res = tb_inst_cmp_fgt(p->func, lhs, rhs); break; - case Token_GtEq: res = tb_inst_cmp_fge(p->func, lhs, rhs); break; - case Token_Lt: res = tb_inst_cmp_flt(p->func, lhs, rhs); break; - case Token_LtEq: res = tb_inst_cmp_fle(p->func, lhs, rhs); break; - } - GB_ASSERT(res != nullptr); - return cg_value(res, t_bool); - } else if (is_type_simd_vector(a)) { - GB_PANIC("TODO(bill): #simd vector"); - // LLVMValueRef mask = nullptr; - // Type *elem = base_array_type(a); - // if (is_type_float(elem)) { - // LLVMRealPredicate pred = {}; - // switch (op_kind) { - // case Token_CmpEq: pred = LLVMRealOEQ; break; - // case Token_NotEq: pred = LLVMRealONE; break; - // } - // mask = LLVMBuildFCmp(p->builder, pred, left.value, right.value, ""); - // } else { - // LLVMIntPredicate pred = {}; - // switch (op_kind) { - // case Token_CmpEq: pred = LLVMIntEQ; break; - // case Token_NotEq: pred = LLVMIntNE; break; - // } - // mask = LLVMBuildICmp(p->builder, pred, left.value, right.value, ""); - // } - // GB_ASSERT_MSG(mask != nullptr, "Unhandled comparison kind %s (%s) %.*s %s (%s)", type_to_string(left.type), type_to_string(base_type(left.type)), LIT(token_strings[op_kind]), type_to_string(right.type), type_to_string(base_type(right.type))); - - // /* NOTE(bill, 2022-05-28): - // Thanks to Per Vognsen, sign extending to - // a vector of the same width as the input vector, bit casting to an integer, - // and then comparing against zero is the better option - // See: https://lists.llvm.org/pipermail/llvm-dev/2012-September/053046.html - - // // Example assuming 128-bit vector - - // %1 = <4 x float> ... - // %2 = <4 x float> ... - // %3 = fcmp oeq <4 x float> %1, %2 - // %4 = sext <4 x i1> %3 to <4 x i32> - // %5 = bitcast <4 x i32> %4 to i128 - // %6 = icmp ne i128 %5, 0 - // br i1 %6, label %true1, label %false2 - - // This will result in 1 cmpps + 1 ptest + 1 br - // (even without SSE4.1, contrary to what the mail list states, because of pmovmskb) - - // */ - - // unsigned count = cast(unsigned)get_array_type_count(a); - // unsigned elem_sz = cast(unsigned)(type_size_of(elem)*8); - // LLVMTypeRef mask_type = LLVMVectorType(LLVMIntTypeInContext(p->module->ctx, elem_sz), count); - // mask = LLVMBuildSExtOrBitCast(p->builder, mask, mask_type, ""); - - // LLVMTypeRef mask_int_type = LLVMIntTypeInContext(p->module->ctx, cast(unsigned)(8*type_size_of(a))); - // LLVMValueRef mask_int = LLVMBuildBitCast(p->builder, mask, mask_int_type, ""); - // res.value = LLVMBuildICmp(p->builder, LLVMIntNE, mask_int, LLVMConstNull(LLVMTypeOf(mask_int)), ""); - // return res; - } - - GB_PANIC("Unhandled comparison kind %s (%s) %.*s %s (%s)", type_to_string(left.type), type_to_string(base_type(left.type)), LIT(token_strings[op_kind]), type_to_string(right.type), type_to_string(base_type(right.type))); - return {}; -} - -gb_internal cgValue cg_emit_comp_against_nil(cgProcedure *p, TokenKind op_kind, cgValue x) { - GB_ASSERT(op_kind == Token_CmpEq || op_kind == Token_NotEq); - x = cg_flatten_value(p, x); - cgValue res = {}; - Type *t = x.type; - - TB_DataType dt = cg_data_type(t); - - Type *bt = base_type(t); - TypeKind type_kind = bt->kind; - - switch (type_kind) { - case Type_Basic: - switch (bt->Basic.kind) { - case Basic_rawptr: - case Basic_cstring: - GB_ASSERT(x.kind == cgValue_Value); - if (op_kind == Token_CmpEq) { - return cg_value(tb_inst_cmp_eq(p->func, x.node, tb_inst_uint(p->func, dt, 0)), t_bool); - } else if (op_kind == Token_NotEq) { - return cg_value(tb_inst_cmp_ne(p->func, x.node, tb_inst_uint(p->func, dt, 0)), t_bool); - } - break; - case Basic_any: - { - GB_ASSERT(x.kind == cgValue_Addr); - // // TODO(bill): is this correct behaviour for nil comparison for any? - cgValue data = cg_emit_struct_ev(p, x, 0); - cgValue id = cg_emit_struct_ev(p, x, 1); - - if (op_kind == Token_CmpEq) { - TB_Node *a = tb_inst_cmp_eq(p->func, data.node, tb_inst_uint(p->func, data.node->dt, 0)); - TB_Node *b = tb_inst_cmp_eq(p->func, id.node, tb_inst_uint(p->func, id.node->dt, 0)); - TB_Node *c = tb_inst_or(p->func, a, b); - return cg_value(c, t_bool); - } else if (op_kind == Token_NotEq) { - TB_Node *a = tb_inst_cmp_ne(p->func, data.node, tb_inst_uint(p->func, data.node->dt, 0)); - TB_Node *b = tb_inst_cmp_ne(p->func, id.node, tb_inst_uint(p->func, id.node->dt, 0)); - TB_Node *c = tb_inst_and(p->func, a, b); - return cg_value(c, t_bool); - } - } - break; - case Basic_typeid: - cgValue invalid_typeid = cg_const_value(p, t_typeid, exact_value_i64(0)); - return cg_emit_comp(p, op_kind, x, invalid_typeid); - } - break; - - case Type_Enum: - case Type_Pointer: - case Type_MultiPointer: - case Type_Proc: - case Type_BitSet: - GB_ASSERT(x.kind == cgValue_Value); - if (op_kind == Token_CmpEq) { - return cg_value(tb_inst_cmp_eq(p->func, x.node, tb_inst_uint(p->func, dt, 0)), t_bool); - } else if (op_kind == Token_NotEq) { - return cg_value(tb_inst_cmp_ne(p->func, x.node, tb_inst_uint(p->func, dt, 0)), t_bool); - } - break; - - case Type_Slice: - case Type_DynamicArray: - case Type_Map: - { - // NOTE(bill): all of their data "pointer-like" fields are at the 0-index - cgValue data = cg_emit_struct_ev(p, x, 0); - if (op_kind == Token_CmpEq) { - TB_Node *a = tb_inst_cmp_eq(p->func, data.node, tb_inst_uint(p->func, data.node->dt, 0)); - return cg_value(a, t_bool); - } else if (op_kind == Token_NotEq) { - TB_Node *a = tb_inst_cmp_ne(p->func, data.node, tb_inst_uint(p->func, data.node->dt, 0)); - return cg_value(a, t_bool); - } - } - break; - - case Type_Union: - { - if (type_size_of(t) == 0) { - return cg_const_bool(p, t_bool, op_kind == Token_CmpEq); - } else if (is_type_union_maybe_pointer(t)) { - cgValue tag = cg_emit_transmute(p, x, t_rawptr); - return cg_emit_comp_against_nil(p, op_kind, tag); - } else { - GB_ASSERT("TODO(bill): cg_emit_union_tag_value"); - // cgValue tag = cg_emit_union_tag_value(p, x); - // return cg_emit_comp(p, op_kind, tag, cg_zero(p->module, tag.type)); - } - } - break; - case Type_Struct: - GB_PANIC("TODO(bill): cg_emit_struct_ev"); - // if (is_type_soa_struct(t)) { - // Type *bt = base_type(t); - // if (bt->Struct.soa_kind == StructSoa_Slice) { - // LLVMValueRef the_value = {}; - // if (bt->Struct.fields.count == 0) { - // cgValue len = cg_soa_struct_len(p, x); - // the_value = len.value; - // } else { - // cgValue first_field = cg_emit_struct_ev(p, x, 0); - // the_value = first_field.value; - // } - // if (op_kind == Token_CmpEq) { - // res.value = LLVMBuildIsNull(p->builder, the_value, ""); - // return res; - // } else if (op_kind == Token_NotEq) { - // res.value = LLVMBuildIsNotNull(p->builder, the_value, ""); - // return res; - // } - // } else if (bt->Struct.soa_kind == StructSoa_Dynamic) { - // LLVMValueRef the_value = {}; - // if (bt->Struct.fields.count == 0) { - // cgValue cap = cg_soa_struct_cap(p, x); - // the_value = cap.value; - // } else { - // cgValue first_field = cg_emit_struct_ev(p, x, 0); - // the_value = first_field.value; - // } - // if (op_kind == Token_CmpEq) { - // res.value = LLVMBuildIsNull(p->builder, the_value, ""); - // return res; - // } else if (op_kind == Token_NotEq) { - // res.value = LLVMBuildIsNotNull(p->builder, the_value, ""); - // return res; - // } - // } - // } else if (is_type_struct(t) && type_has_nil(t)) { - // auto args = array_make(permanent_allocator(), 2); - // cgValue lhs = cg_address_from_load_or_generate_local(p, x); - // args[0] = cg_emit_conv(p, lhs, t_rawptr); - // args[1] = cg_const_int(p->module, t_int, type_size_of(t)); - // cgValue val = cg_emit_runtime_call(p, "memory_compare_zero", args); - // cgValue res = cg_emit_comp(p, op_kind, val, cg_const_int(p->module, t_int, 0)); - // return res; - // } - break; - } - GB_PANIC("Unknown handled type: %s -> %s", type_to_string(t), type_to_string(bt)); - return {}; -} - -gb_internal cgValue cg_emit_conv(cgProcedure *p, cgValue value, Type *t) { - t = reduce_tuple_to_single_type(t); - - value = cg_flatten_value(p, value); - - Type *src_type = value.type; - if (are_types_identical(t, src_type)) { - return value; - } - - if (is_type_untyped_uninit(src_type)) { - // return cg_const_undef(m, t); - return cg_const_nil(p, t); - } - if (is_type_untyped_nil(src_type)) { - return cg_const_nil(p, t); - } - - Type *src = core_type(src_type); - Type *dst = core_type(t); - GB_ASSERT(src != nullptr); - GB_ASSERT(dst != nullptr); - - if (are_types_identical(src, dst)) { - return cg_emit_transmute(p, value, t); - } - - TB_DataType st = cg_data_type(src); - if (value.kind == cgValue_Value && !TB_IS_VOID_TYPE(value.node->dt)) { - st = value.node->dt; - } - TB_DataType dt = cg_data_type(t); - - if (is_type_integer(src) && is_type_integer(dst)) { - GB_ASSERT(src->kind == Type_Basic && - dst->kind == Type_Basic); - GB_ASSERT(value.kind == cgValue_Value); - - i64 sz = type_size_of(default_type(src)); - i64 dz = type_size_of(default_type(dst)); - - if (sz == dz) { - if (dz > 1 && !types_have_same_internal_endian(src, dst)) { - return cg_emit_byte_swap(p, value, t); - } - value.type = t; - return value; - } - - if (sz > 1 && is_type_different_to_arch_endianness(src)) { - Type *platform_src_type = integer_endian_type_to_platform_type(src); - value = cg_emit_byte_swap(p, value, platform_src_type); - } - - TB_Node* (*op)(TB_Function* f, TB_Node* src, TB_DataType dt) = tb_inst_trunc; - - if (dz < sz) { - op = tb_inst_trunc; - } else if (dz == sz) { - op = tb_inst_bitcast; - } else if (dz > sz) { - op = is_type_unsigned(src) ? tb_inst_zxt : tb_inst_sxt; // zero extent - } - - if (dz > 1 && is_type_different_to_arch_endianness(dst)) { - Type *platform_dst_type = integer_endian_type_to_platform_type(dst); - - cgValue res = cg_value(op(p->func, value.node, cg_data_type(platform_dst_type)), platform_dst_type); - return cg_emit_byte_swap(p, res, t); - } else { - return cg_value(op(p->func, value.node, dt), t); - } - } - - // boolean -> boolean/integer - if (is_type_boolean(src) && (is_type_boolean(dst) || is_type_integer(dst))) { - TB_Node *v = tb_inst_cmp_ne(p->func, value.node, tb_inst_uint(p->func, st, 0)); - return cg_value(tb_inst_zxt(p->func, v, dt), t); - } - - // integer -> boolean - if (is_type_integer(src) && is_type_boolean(dst)) { - TB_Node *v = tb_inst_cmp_ne(p->func, value.node, tb_inst_uint(p->func, st, 0)); - return cg_value(tb_inst_zxt(p->func, v, dt), t); - } - - if (is_type_cstring(src) && is_type_u8_ptr(dst)) { - return cg_emit_transmute(p, value, dst); - } - if (is_type_u8_ptr(src) && is_type_cstring(dst)) { - return cg_emit_transmute(p, value, dst); - } - if (is_type_cstring(src) && is_type_u8_multi_ptr(dst)) { - return cg_emit_transmute(p, value, dst); - } - if (is_type_u8_multi_ptr(src) && is_type_cstring(dst)) { - return cg_emit_transmute(p, value, dst); - } - if (is_type_cstring(src) && is_type_rawptr(dst)) { - return cg_emit_transmute(p, value, dst); - } - if (is_type_rawptr(src) && is_type_cstring(dst)) { - return cg_emit_transmute(p, value, dst); - } - - - if (are_types_identical(src, t_cstring) && are_types_identical(dst, t_string)) { - TEMPORARY_ALLOCATOR_GUARD(); - cgValue c = cg_emit_conv(p, value, t_cstring); - auto args = slice_make(temporary_allocator(), 1); - args[0] = c; - cgValue s = cg_emit_runtime_call(p, "cstring_to_string", args); - return cg_emit_conv(p, s, dst); - } - - // float -> float - if (is_type_float(src) && is_type_float(dst)) { - i64 sz = type_size_of(src); - i64 dz = type_size_of(dst); - - if (sz == 2 || dz == 2) { - GB_PANIC("TODO(bill): f16 conversions"); - } - - - if (dz == sz) { - if (types_have_same_internal_endian(src, dst)) { - return cg_value(value.node, t); - } else { - return cg_emit_byte_swap(p, value, t); - } - } - - if (is_type_different_to_arch_endianness(src) || is_type_different_to_arch_endianness(dst)) { - Type *platform_src_type = integer_endian_type_to_platform_type(src); - Type *platform_dst_type = integer_endian_type_to_platform_type(dst); - cgValue res = {}; - res = cg_emit_conv(p, value, platform_src_type); - res = cg_emit_conv(p, res, platform_dst_type); - if (is_type_different_to_arch_endianness(dst)) { - res = cg_emit_byte_swap(p, res, t); - } - return cg_emit_conv(p, res, t); - } - - - if (dz >= sz) { - return cg_value(tb_inst_fpxt(p->func, value.node, dt), t); - } - return cg_value(tb_inst_trunc(p->func, value.node, dt), t); - } - - if (is_type_complex(src) && is_type_complex(dst)) { - GB_PANIC("TODO(bill): complex -> complex"); - } - - if (is_type_quaternion(src) && is_type_quaternion(dst)) { - // @QuaternionLayout - GB_PANIC("TODO(bill): quaternion -> quaternion"); - } - if (is_type_integer(src) && is_type_complex(dst)) { - GB_PANIC("TODO(bill): int -> complex"); - } - if (is_type_float(src) && is_type_complex(dst)) { - GB_PANIC("TODO(bill): float -> complex"); - } - if (is_type_integer(src) && is_type_quaternion(dst)) { - GB_PANIC("TODO(bill): int -> quaternion"); - } - if (is_type_float(src) && is_type_quaternion(dst)) { - GB_PANIC("TODO(bill): float -> quaternion"); - } - if (is_type_complex(src) && is_type_quaternion(dst)) { - GB_PANIC("TODO(bill): complex -> quaternion"); - } - - - // float <-> integer - if (is_type_float(src) && is_type_integer(dst)) { - if (is_type_different_to_arch_endianness(src) || is_type_different_to_arch_endianness(dst)) { - Type *platform_src_type = integer_endian_type_to_platform_type(src); - Type *platform_dst_type = integer_endian_type_to_platform_type(dst); - cgValue res = {}; - res = cg_emit_conv(p, value, platform_src_type); - res = cg_emit_conv(p, res, platform_dst_type); - return cg_emit_conv(p, res, t); - } - - // if (is_type_integer_128bit(dst)) { - // TEMPORARY_ALLOCATOR_GUARD(); - - // auto args = array_make(temporary_allocator(), 1); - // args[0] = value; - // char const *call = "fixunsdfdi"; - // if (is_type_unsigned(dst)) { - // call = "fixunsdfti"; - // } - // lbValue res_i128 = lb_emit_runtime_call(p, call, args); - // return lb_emit_conv(p, res_i128, t); - // } - - bool is_signed = !is_type_unsigned(dst); - return cg_value(tb_inst_float2int(p->func, value.node, dt, is_signed), t); - } - if (is_type_integer(src) && is_type_float(dst)) { - if (is_type_different_to_arch_endianness(src) || is_type_different_to_arch_endianness(dst)) { - Type *platform_src_type = integer_endian_type_to_platform_type(src); - Type *platform_dst_type = integer_endian_type_to_platform_type(dst); - cgValue res = {}; - res = cg_emit_conv(p, value, platform_src_type); - res = cg_emit_conv(p, res, platform_dst_type); - if (is_type_different_to_arch_endianness(dst)) { - res = cg_emit_byte_swap(p, res, t); - } - return cg_emit_conv(p, res, t); - } - - // if (is_type_integer_128bit(src)) { - // TEMPORARY_ALLOCATOR_GUARD(); - - // auto args = array_make(temporary_allocator(), 1); - // args[0] = value; - // char const *call = "floattidf"; - // if (is_type_unsigned(src)) { - // call = "floattidf_unsigned"; - // } - // lbValue res_f64 = lb_emit_runtime_call(p, call, args); - // return lb_emit_conv(p, res_f64, t); - // } - - bool is_signed = !is_type_unsigned(dst); - return cg_value(tb_inst_int2float(p->func, value.node, dt, is_signed), t); - } - - if (is_type_simd_vector(dst)) { - GB_PANIC("TODO(bill): ? -> #simd vector"); - } - - - // Pointer <-> uintptr - if (is_type_pointer(src) && is_type_uintptr(dst)) { - return cg_value(tb_inst_ptr2int(p->func, value.node, dt), t); - } - if (is_type_uintptr(src) && is_type_pointer(dst)) { - return cg_value(tb_inst_int2ptr(p->func, value.node), t); - } - if (is_type_multi_pointer(src) && is_type_uintptr(dst)) { - return cg_value(tb_inst_ptr2int(p->func, value.node, dt), t); - } - if (is_type_uintptr(src) && is_type_multi_pointer(dst)) { - return cg_value(tb_inst_int2ptr(p->func, value.node), t); - } - - if (is_type_union(dst)) { - GB_PANIC("TODO(bill): ? -> union"); - } - - // NOTE(bill): This has to be done before 'Pointer <-> Pointer' as it's - // subtype polymorphism casting - if (check_is_assignable_to_using_subtype(src_type, t)) { - GB_PANIC("TODO(bill): ? -> subtyping"); - } - - // Pointer <-> Pointer - if (is_type_pointer(src) && is_type_pointer(dst)) { - return cg_value(value.node, t); - } - if (is_type_multi_pointer(src) && is_type_pointer(dst)) { - return cg_value(value.node, t); - } - if (is_type_pointer(src) && is_type_multi_pointer(dst)) { - return cg_value(value.node, t); - } - if (is_type_multi_pointer(src) && is_type_multi_pointer(dst)) { - return cg_value(value.node, t); - } - - // proc <-> proc - if (is_type_proc(src) && is_type_proc(dst)) { - return cg_value(value.node, t); - } - - // pointer -> proc - if (is_type_pointer(src) && is_type_proc(dst)) { - return cg_value(value.node, t); - } - // proc -> pointer - if (is_type_proc(src) && is_type_pointer(dst)) { - return cg_value(value.node, t); - } - - // []byte/[]u8 <-> string - if (is_type_u8_slice(src) && is_type_string(dst)) { - return cg_emit_transmute(p, value, t); - } - if (is_type_string(src) && is_type_u8_slice(dst)) { - return cg_emit_transmute(p, value, t); - } - - if (is_type_matrix(dst) && !is_type_matrix(src)) { - GB_PANIC("TODO(bill): !matrix -> matrix"); - } - - if (is_type_matrix(dst) && is_type_matrix(src)) { - GB_PANIC("TODO(bill): matrix -> matrix"); - } - - if (is_type_any(dst)) { - if (is_type_untyped_nil(src) || - is_type_untyped_uninit(src)) { - return cg_const_nil(p, t); - } - - cgAddr result = cg_add_local(p, t, nullptr, false); - - Type *st = default_type(src_type); - - cgValue data = cg_address_from_load_or_generate_local(p, value); - GB_ASSERT(is_type_pointer(data.type)); - GB_ASSERT(is_type_typed(st)); - - data = cg_emit_conv(p, data, t_rawptr); - if (p->name == "main@main") { - GB_PANIC("HERE %s %llu", type_to_string(st), cg_typeid_as_u64(p->module, value.type)); - } - - cgValue id = cg_typeid(p, st); - cgValue data_ptr = cg_emit_struct_ep(p, result.addr, 0); - cgValue id_ptr = cg_emit_struct_ep(p, result.addr, 1); - - cg_emit_store(p, data_ptr, data); - cg_emit_store(p, id_ptr, id); - - return cg_addr_load(p, result); - } - - i64 src_sz = type_size_of(src); - i64 dst_sz = type_size_of(dst); - - if (src_sz == dst_sz) { - // bit_set <-> integer - if (is_type_integer(src) && is_type_bit_set(dst)) { - cgValue v = cg_emit_conv(p, value, bit_set_to_int(dst)); - return cg_emit_transmute(p, v, t); - } - if (is_type_bit_set(src) && is_type_integer(dst)) { - cgValue bs = cg_emit_transmute(p, value, bit_set_to_int(src)); - return cg_emit_conv(p, bs, dst); - } - - // typeid <-> integer - if (is_type_integer(src) && is_type_typeid(dst)) { - return cg_emit_transmute(p, value, dst); - } - if (is_type_typeid(src) && is_type_integer(dst)) { - return cg_emit_transmute(p, value, dst); - } - } - - - if (is_type_untyped(src)) { - if (is_type_string(src) && is_type_string(dst)) { - cgAddr result = cg_add_local(p, t, nullptr, false); - cg_addr_store(p, result, value); - return cg_addr_load(p, result); - } - } - - - gb_printf_err("%.*s\n", LIT(p->name)); - gb_printf_err("cg_emit_conv: src -> dst\n"); - gb_printf_err("Not Identical %s != %s\n", type_to_string(src_type), type_to_string(t)); - gb_printf_err("Not Identical %s != %s\n", type_to_string(src), type_to_string(dst)); - gb_printf_err("Not Identical %p != %p\n", src_type, t); - gb_printf_err("Not Identical %p != %p\n", src, dst); - - - GB_PANIC("Invalid type conversion: '%s' to '%s' for procedure '%.*s'", - type_to_string(src_type), type_to_string(t), - LIT(p->name)); - - return {}; -} - -gb_internal cgValue cg_emit_arith(cgProcedure *p, TokenKind op, cgValue lhs, cgValue rhs, Type *type) { - if (is_type_array_like(lhs.type) || is_type_array_like(rhs.type)) { - GB_PANIC("TODO(bill): cg_emit_arith_array"); - } else if (is_type_matrix(lhs.type) || is_type_matrix(rhs.type)) { - GB_PANIC("TODO(bill): cg_emit_arith_matrix"); - } else if (is_type_complex(type)) { - GB_PANIC("TODO(bill): cg_emit_arith complex"); - } else if (is_type_quaternion(type)) { - GB_PANIC("TODO(bill): cg_emit_arith quaternion"); - } - - lhs = cg_flatten_value(p, cg_emit_conv(p, lhs, type)); - rhs = cg_flatten_value(p, cg_emit_conv(p, rhs, type)); - GB_ASSERT(lhs.kind == cgValue_Value); - GB_ASSERT(rhs.kind == cgValue_Value); - - if (is_type_integer(type) && is_type_different_to_arch_endianness(type)) { - switch (op) { - case Token_AndNot: - case Token_And: - case Token_Or: - case Token_Xor: - goto handle_op; - } - - Type *platform_type = integer_endian_type_to_platform_type(type); - cgValue x = cg_emit_byte_swap(p, lhs, integer_endian_type_to_platform_type(lhs.type)); - cgValue y = cg_emit_byte_swap(p, rhs, integer_endian_type_to_platform_type(rhs.type)); - - cgValue res = cg_emit_arith(p, op, x, y, platform_type); - - return cg_emit_byte_swap(p, res, type); - } - - if (is_type_float(type) && is_type_different_to_arch_endianness(type)) { - Type *platform_type = integer_endian_type_to_platform_type(type); - cgValue x = cg_emit_conv(p, lhs, integer_endian_type_to_platform_type(lhs.type)); - cgValue y = cg_emit_conv(p, rhs, integer_endian_type_to_platform_type(rhs.type)); - - cgValue res = cg_emit_arith(p, op, x, y, platform_type); - - return cg_emit_byte_swap(p, res, type); - } - -handle_op:; - - // NOTE(bill): Bit Set Aliases for + and - - if (is_type_bit_set(type)) { - switch (op) { - case Token_Add: op = Token_Or; break; - case Token_Sub: op = Token_AndNot; break; - } - } - - TB_ArithmeticBehavior arith_behavior = cast(TB_ArithmeticBehavior)0; - - Type *integral_type = type; - if (is_type_simd_vector(integral_type)) { - GB_PANIC("TODO(bill): cg_emit_arith #simd vector"); - // integral_type = core_array_type(integral_type); - } - - switch (op) { - case Token_Add: - if (is_type_float(integral_type)) { - return cg_value(tb_inst_fadd(p->func, lhs.node, rhs.node), type); - } - return cg_value(tb_inst_add(p->func, lhs.node, rhs.node, arith_behavior), type); - case Token_Sub: - if (is_type_float(integral_type)) { - return cg_value(tb_inst_fsub(p->func, lhs.node, rhs.node), type); - } - return cg_value(tb_inst_sub(p->func, lhs.node, rhs.node, arith_behavior), type); - case Token_Mul: - if (is_type_float(integral_type)) { - return cg_value(tb_inst_fmul(p->func, lhs.node, rhs.node), type); - } - return cg_value(tb_inst_mul(p->func, lhs.node, rhs.node, arith_behavior), type); - case Token_Quo: - if (is_type_float(integral_type)) { - return cg_value(tb_inst_fdiv(p->func, lhs.node, rhs.node), type); - } - return cg_value(tb_inst_div(p->func, lhs.node, rhs.node, !is_type_unsigned(integral_type)), type); - case Token_Mod: - if (is_type_float(integral_type)) { - GB_PANIC("TODO(bill): float %% float"); - } - return cg_value(tb_inst_mod(p->func, lhs.node, rhs.node, !is_type_unsigned(integral_type)), type); - case Token_ModMod: - if (is_type_unsigned(integral_type)) { - return cg_value(tb_inst_mod(p->func, lhs.node, rhs.node, false), type); - } else { - TB_Node *a = tb_inst_mod(p->func, lhs.node, rhs.node, true); - TB_Node *b = tb_inst_add(p->func, a, rhs.node, arith_behavior); - TB_Node *c = tb_inst_mod(p->func, b, rhs.node, true); - return cg_value(c, type); - } - - case Token_And: - return cg_value(tb_inst_and(p->func, lhs.node, rhs.node), type); - case Token_Or: - return cg_value(tb_inst_or(p->func, lhs.node, rhs.node), type); - case Token_Xor: - return cg_value(tb_inst_xor(p->func, lhs.node, rhs.node), type); - case Token_Shl: - { - rhs = cg_emit_conv(p, rhs, lhs.type); - TB_DataType dt = cg_data_type(lhs.type); - TB_Node *lhsval = lhs.node; - TB_Node *bits = rhs.node; - - TB_Node *bit_size = tb_inst_uint(p->func, dt, 8*type_size_of(lhs.type)); - TB_Node *zero = tb_inst_uint(p->func, dt, 0); - - TB_Node *width_test = tb_inst_cmp_ilt(p->func, bits, bit_size, false); - - TB_Node *res = tb_inst_shl(p->func, lhsval, bits, arith_behavior); - res = tb_inst_select(p->func, width_test, res, zero); - return cg_value(res, type); - } - case Token_Shr: - { - rhs = cg_emit_conv(p, rhs, lhs.type); - TB_DataType dt = cg_data_type(lhs.type); - TB_Node *lhsval = lhs.node; - TB_Node *bits = rhs.node; - - TB_Node *bit_size = tb_inst_uint(p->func, dt, 8*type_size_of(lhs.type)); - TB_Node *zero = tb_inst_uint(p->func, dt, 0); - - TB_Node *width_test = tb_inst_cmp_ilt(p->func, bits, bit_size, false); - - TB_Node *res = nullptr; - - if (is_type_unsigned(integral_type)) { - res = tb_inst_shr(p->func, lhsval, bits); - } else { - res = tb_inst_sar(p->func, lhsval, bits); - } - - - res = tb_inst_select(p->func, width_test, res, zero); - return cg_value(res, type); - } - case Token_AndNot: - return cg_value(tb_inst_and(p->func, lhs.node, tb_inst_not(p->func, rhs.node)), type); - } - - GB_PANIC("unhandled operator of cg_emit_arith"); - - return {}; -} - - -gb_internal void cg_fill_slice(cgProcedure *p, cgAddr const &slice, cgValue data, cgValue len) { - cgValue slice_ptr = cg_addr_get_ptr(p, slice); - cgValue data_ptr = cg_emit_struct_ep(p, slice_ptr, 0); - cgValue len_ptr = cg_emit_struct_ep(p, slice_ptr, 1); - - data = cg_emit_conv(p, data, type_deref(data_ptr.type)); - len = cg_emit_conv(p, len, t_int); - cg_emit_store(p, data_ptr, data); - cg_emit_store(p, len_ptr, len); -} - -gb_internal cgAddr cg_build_addr_slice_expr(cgProcedure *p, Ast *expr) { - ast_node(se, SliceExpr, expr); - - cgValue low = cg_const_int(p, t_int, 0); - cgValue high = {}; - - if (se->low != nullptr) { - low = cg_correct_endianness(p, cg_build_expr(p, se->low)); - } - if (se->high != nullptr) { - high = cg_correct_endianness(p, cg_build_expr(p, se->high)); - } - - bool no_indices = se->low == nullptr && se->high == nullptr; - gb_unused(no_indices); - - cgAddr addr = cg_build_addr(p, se->expr); - cgValue base = cg_addr_load(p, addr); - Type *type = base_type(base.type); - - if (is_type_pointer(type)) { - type = base_type(type_deref(type)); - addr = cg_addr(base); - base = cg_addr_load(p, addr); - } - - switch (type->kind) { - case Type_Basic: - case Type_Slice: { - if (type->kind == Type_Basic) { - GB_ASSERT(type->Basic.kind == Basic_string); - } - - Type *slice_type = type; - if (high.node == nullptr) { - cgValue len = cg_builtin_len(p, base); - high = len; - } - - if (!no_indices) { - // cg_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); - } - - cgValue elem = cg_emit_ptr_offset(p, cg_builtin_raw_data(p, base), low); - cgValue new_len = cg_emit_arith(p, Token_Sub, high, low, t_int); - - cgAddr slice = cg_add_local(p, slice_type, nullptr, true); - cg_fill_slice(p, slice, elem, new_len); - return slice; - } - - case Type_RelativeMultiPointer: - GB_PANIC("TODO(bill): Type_RelativeMultiPointer should be handled above already on the cg_addr_load"); - break; - - case Type_DynamicArray: { - // Type *elem_type = type->DynamicArray.elem; - // Type *slice_type = alloc_type_slice(elem_type); - - // lbValue len = lb_dynamic_array_len(p, base); - // if (high.value == nullptr) high = len; - - // if (!no_indices) { - // lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); - // } - - // lbValue elem = lb_emit_ptr_offset(p, lb_dynamic_array_elem(p, base), low); - // lbValue new_len = lb_emit_arith(p, Token_Sub, high, low, t_int); - - // lbAddr slice = lb_add_local_generated(p, slice_type, false); - // lb_fill_slice(p, slice, elem, new_len); - // return slice; - GB_PANIC("cg_build_addr_slice_expr Type_DynamicArray"); - break; - } - - case Type_MultiPointer: { - Type *res_type = type_of_expr(expr); - if (se->high == nullptr) { - cgAddr res = cg_add_local(p, res_type, nullptr, false); - GB_ASSERT(base.kind == cgValue_Value); - GB_ASSERT(low.kind == cgValue_Value); - - i64 stride = type_size_of(type->MultiPointer.elem); - cgValue offset = cg_value(tb_inst_array_access(p->func, base.node, low.node, stride), base.type); - cg_addr_store(p, res, offset); - return res; - } else { - cgAddr res = cg_add_local(p, res_type, nullptr, true); - low = cg_emit_conv(p, low, t_int); - high = cg_emit_conv(p, high, t_int); - - // cg_emit_multi_pointer_slice_bounds_check(p, se->open, low, high); - - i64 stride = type_size_of(type->MultiPointer.elem); - TB_Node *offset = tb_inst_array_access(p->func, base.node, low.node, stride); - TB_Node *len = tb_inst_sub(p->func, high.node, low.node, cast(TB_ArithmeticBehavior)0); - - TB_Node *data_ptr = tb_inst_member_access(p->func, res.addr.node, type_offset_of(res_type, 0)); - TB_Node *len_ptr = tb_inst_member_access(p->func, res.addr.node, type_offset_of(res_type, 1)); - - tb_inst_store(p->func, TB_TYPE_PTR, data_ptr, offset, cast(TB_CharUnits)build_context.ptr_size, false); - tb_inst_store(p->func, TB_TYPE_INT, len_ptr, len, cast(TB_CharUnits)build_context.int_size, false); - return res; - } - } - - case Type_Array: { - Type *slice_type = type_of_expr(expr); - GB_ASSERT(is_type_slice(slice_type)); - cgValue len = cg_const_int(p, t_int, type->Array.count); - if (high.node == nullptr) high = len; - - // bool low_const = type_and_value_of_expr(se->low).mode == Addressing_Constant; - // bool high_const = type_and_value_of_expr(se->high).mode == Addressing_Constant; - // if (!low_const || !high_const) { - // if (!no_indices) { - // lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); - // } - // } - cgValue elem = cg_emit_ptr_offset(p, cg_builtin_raw_data(p, cg_addr_get_ptr(p, addr)), low); - cgValue new_len = cg_emit_arith(p, Token_Sub, high, low, t_int); - - cgAddr slice = cg_add_local(p, slice_type, nullptr, true); - cg_fill_slice(p, slice, elem, new_len); - return slice; - } - - - case Type_Struct: - // if (is_type_soa_struct(type)) { - // lbValue len = lb_soa_struct_len(p, lb_addr_get_ptr(p, addr)); - // if (high.value == nullptr) high = len; - - // if (!no_indices) { - // lb_emit_slice_bounds_check(p, se->open, low, high, len, se->low != nullptr); - // } - // #if 1 - - // lbAddr dst = lb_add_local_generated(p, type_of_expr(expr), true); - // if (type->Struct.soa_kind == StructSoa_Fixed) { - // i32 field_count = cast(i32)type->Struct.fields.count; - // for (i32 i = 0; i < field_count; i++) { - // lbValue field_dst = lb_emit_struct_ep(p, dst.addr, i); - // lbValue field_src = lb_emit_struct_ep(p, lb_addr_get_ptr(p, addr), i); - // field_src = lb_emit_array_ep(p, field_src, low); - // lb_emit_store(p, field_dst, field_src); - // } - - // lbValue len_dst = lb_emit_struct_ep(p, dst.addr, field_count); - // lbValue new_len = lb_emit_arith(p, Token_Sub, high, low, t_int); - // lb_emit_store(p, len_dst, new_len); - // } else if (type->Struct.soa_kind == StructSoa_Slice) { - // if (no_indices) { - // lb_addr_store(p, dst, base); - // } else { - // i32 field_count = cast(i32)type->Struct.fields.count - 1; - // for (i32 i = 0; i < field_count; i++) { - // lbValue field_dst = lb_emit_struct_ep(p, dst.addr, i); - // lbValue field_src = lb_emit_struct_ev(p, base, i); - // field_src = lb_emit_ptr_offset(p, field_src, low); - // lb_emit_store(p, field_dst, field_src); - // } - - - // lbValue len_dst = lb_emit_struct_ep(p, dst.addr, field_count); - // lbValue new_len = lb_emit_arith(p, Token_Sub, high, low, t_int); - // lb_emit_store(p, len_dst, new_len); - // } - // } else if (type->Struct.soa_kind == StructSoa_Dynamic) { - // i32 field_count = cast(i32)type->Struct.fields.count - 3; - // for (i32 i = 0; i < field_count; i++) { - // lbValue field_dst = lb_emit_struct_ep(p, dst.addr, i); - // lbValue field_src = lb_emit_struct_ev(p, base, i); - // field_src = lb_emit_ptr_offset(p, field_src, low); - // lb_emit_store(p, field_dst, field_src); - // } - - - // lbValue len_dst = lb_emit_struct_ep(p, dst.addr, field_count); - // lbValue new_len = lb_emit_arith(p, Token_Sub, high, low, t_int); - // lb_emit_store(p, len_dst, new_len); - // } - - // return dst; - // #endif - // } - GB_PANIC("cg_build_addr_slice_expr Type_Struct"); - break; - - } - - GB_PANIC("Unknown slicable type"); - return {}; -} - -gb_internal cgValue cg_emit_unary_arith(cgProcedure *p, TokenKind op, cgValue x, Type *type) { - switch (op) { - case Token_Add: - return x; - case Token_Not: // Boolean not - case Token_Xor: // Bitwise not - case Token_Sub: // Number negation - break; - case Token_Pointer: - GB_PANIC("This should be handled elsewhere"); - break; - } - - x = cg_flatten_value(p, x); - - if (is_type_array_like(x.type)) { - GB_PANIC("TODO(bill): cg_emit_unary_arith is_type_array_like"); - // // IMPORTANT TODO(bill): This is very wasteful with regards to stack memory - // Type *tl = base_type(x.type); - // cgValue val = cg_address_from_load_or_generate_local(p, x); - // GB_ASSERT(is_type_array_like(type)); - // Type *elem_type = base_array_type(type); - - // // NOTE(bill): Doesn't need to be zero because it will be initialized in the loops - // cgAddr res_addr = cg_add_local(p, type, nullptr, false); - // cgValue res = cg_addr_get_ptr(p, res_addr); - - // bool inline_array_arith = cg_can_try_to_inline_array_arith(type); - - // i32 count = cast(i32)get_array_type_count(tl); - - // LLVMTypeRef vector_type = nullptr; - // if (op != Token_Not && cg_try_vector_cast(p->module, val, &vector_type)) { - // LLVMValueRef vp = LLVMBuildPointerCast(p->builder, val.value, LLVMPointerType(vector_type, 0), ""); - // LLVMValueRef v = LLVMBuildLoad2(p->builder, vector_type, vp, ""); - - // LLVMValueRef opv = nullptr; - // switch (op) { - // case Token_Xor: - // opv = LLVMBuildNot(p->builder, v, ""); - // break; - // case Token_Sub: - // if (is_type_float(elem_type)) { - // opv = LLVMBuildFNeg(p->builder, v, ""); - // } else { - // opv = LLVMBuildNeg(p->builder, v, ""); - // } - // break; - // } - - // if (opv != nullptr) { - // LLVMSetAlignment(res.value, cast(unsigned)cg_alignof(vector_type)); - // LLVMValueRef res_ptr = LLVMBuildPointerCast(p->builder, res.value, LLVMPointerType(vector_type, 0), ""); - // LLVMBuildStore(p->builder, opv, res_ptr); - // return cg_emit_conv(p, cg_emit_load(p, res), type); - // } - // } - - // if (inline_array_arith) { - // // inline - // for (i32 i = 0; i < count; i++) { - // cgValue e = cg_emit_load(p, cg_emit_array_epi(p, val, i)); - // cgValue z = cg_emit_unary_arith(p, op, e, elem_type); - // cg_emit_store(p, cg_emit_array_epi(p, res, i), z); - // } - // } else { - // auto loop_data = cg_loop_start(p, count, t_i32); - - // cgValue e = cg_emit_load(p, cg_emit_array_ep(p, val, loop_data.idx)); - // cgValue z = cg_emit_unary_arith(p, op, e, elem_type); - // cg_emit_store(p, cg_emit_array_ep(p, res, loop_data.idx), z); - - // cg_loop_end(p, loop_data); - // } - // return cg_emit_load(p, res); - } - - if (op == Token_Xor) { - GB_ASSERT(x.kind == cgValue_Value); - cgValue cmp = cg_value(tb_inst_not(p->func, x.node), x.type); - return cg_emit_conv(p, cmp, type); - } - - if (op == Token_Not) { - TB_Node *zero = cg_const_nil(p, x.type).node; - cgValue cmp = cg_value(tb_inst_cmp_ne(p->func, x.node, zero), x.type); - return cg_emit_conv(p, cmp, type); - } - - if (op == Token_Sub && is_type_integer(type) && is_type_different_to_arch_endianness(type)) { - Type *platform_type = integer_endian_type_to_platform_type(type); - cgValue v = cg_emit_byte_swap(p, x, platform_type); - - cgValue res = cg_value(tb_inst_neg(p->func, v.node), platform_type); - return cg_emit_byte_swap(p, res, type); - } - - if (op == Token_Sub && is_type_float(type) && is_type_different_to_arch_endianness(type)) { - Type *platform_type = integer_endian_type_to_platform_type(type); - cgValue v = cg_emit_byte_swap(p, x, platform_type); - - cgValue res = cg_value(tb_inst_neg(p->func, v.node), platform_type); - return cg_emit_byte_swap(p, res, type); - } - - cgValue res = {}; - - if (op == Token_Sub) { // Number negation - if (is_type_integer(x.type)) { - res = cg_value(tb_inst_neg(p->func, x.node), x.type); - } else if (is_type_float(x.type)) { - res = cg_value(tb_inst_neg(p->func, x.node), x.type); - } else if (is_type_complex(x.type)) { - GB_PANIC("TODO(bill): neg complex"); - // LLVMValueRef v0 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 0, ""), ""); - // LLVMValueRef v1 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 1, ""), ""); - - // cgAddr addr = cg_add_local_generated(p, x.type, false); - // LLVMTypeRef type = llvm_addr_type(p->module, addr.addr); - // LLVMBuildStore(p->builder, v0, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 0, "")); - // LLVMBuildStore(p->builder, v1, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 1, "")); - // return cg_addr_load(p, addr); - - } else if (is_type_quaternion(x.type)) { - GB_PANIC("TODO(bill): neg quaternion"); - // LLVMValueRef v0 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 0, ""), ""); - // LLVMValueRef v1 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 1, ""), ""); - // LLVMValueRef v2 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 2, ""), ""); - // LLVMValueRef v3 = LLVMBuildFNeg(p->builder, LLVMBuildExtractValue(p->builder, x.value, 3, ""), ""); - - // cgAddr addr = cg_add_local_generated(p, x.type, false); - // LLVMTypeRef type = llvm_addr_type(p->module, addr.addr); - // LLVMBuildStore(p->builder, v0, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 0, "")); - // LLVMBuildStore(p->builder, v1, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 1, "")); - // LLVMBuildStore(p->builder, v2, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 2, "")); - // LLVMBuildStore(p->builder, v3, LLVMBuildStructGEP2(p->builder, type, addr.addr.value, 3, "")); - // return cg_addr_load(p, addr); - } else if (is_type_simd_vector(x.type)) { - GB_PANIC("TODO(bill): neg simd"); - // Type *elem = base_array_type(x.type); - // if (is_type_float(elem)) { - // res.value = LLVMBuildFNeg(p->builder, x.value, ""); - // } else { - // res.value = LLVMBuildNeg(p->builder, x.value, ""); - // } - } else if (is_type_matrix(x.type)) { - GB_PANIC("TODO(bill): neg matrix"); - // cgValue zero = {}; - // zero.value = LLVMConstNull(cg_type(p->module, type)); - // zero.type = type; - // return cg_emit_arith_matrix(p, Token_Sub, zero, x, type, true); - } else { - GB_PANIC("Unhandled type %s", type_to_string(x.type)); - } - res.type = x.type; - return res; - } - - return res; -} - -gb_internal void cg_emit_if(cgProcedure *p, cgValue const &cond, TB_Node *true_region, TB_Node *false_region) { - GB_ASSERT(cond.kind == cgValue_Value); - tb_inst_if(p->func, cond.node, true_region, false_region); -} - - -struct cgLoopData { - cgAddr index_addr; - cgValue index; - TB_Node *body; - TB_Node *done; - TB_Node *loop; -}; - -gb_internal cgLoopData cg_loop_start(cgProcedure *p, isize count, Type *index_type) { - cgLoopData data = {}; - - cgValue max = cg_const_int(p, index_type, count); - - data.index_addr = cg_add_local(p, index_type, nullptr, true); - - data.body = cg_control_region(p, "loop_body"); - data.done = cg_control_region(p, "loop_done"); - data.loop = cg_control_region(p, "loop_loop"); - - cg_emit_goto(p, data.loop); - tb_inst_set_control(p->func, data.loop); - - data.index = cg_addr_load(p, data.index_addr); - - cgValue cond = cg_emit_comp(p, Token_Lt, data.index, max); - cg_emit_if(p, cond, data.body, data.done); - tb_inst_set_control(p->func, data.body); - - return data; -} - -gb_internal void cg_loop_end(cgProcedure *p, cgLoopData const &data) { - if (data.index_addr.addr.node != nullptr) { - cg_emit_increment(p, data.index_addr.addr); - cg_emit_goto(p, data.loop); - tb_inst_set_control(p->func, data.done); - } -} - - - -gb_internal void cg_build_try_lhs_rhs(cgProcedure *p, Ast *arg, Type *final_type, cgValue *lhs_, cgValue *rhs_) { - cgValue lhs = {}; - cgValue rhs = {}; - - cgValue value = cg_build_expr(p, arg); - if (value.kind == cgValue_Multi) { - auto const &values = value.multi->values; - if (values.count == 2) { - lhs = values[0]; - rhs = values[1]; - } else { - rhs = values[values.count-1]; - if (values.count > 1) { - lhs = cg_value_multi(slice(values, 0, values.count-1), final_type); - } - } - } else { - rhs = value; - } - - GB_ASSERT(rhs.node != nullptr); - - if (lhs_) *lhs_ = lhs; - if (rhs_) *rhs_ = rhs; -} - -gb_internal cgValue cg_emit_try_has_value(cgProcedure *p, cgValue rhs) { - cgValue has_value = {}; - if (is_type_boolean(rhs.type)) { - has_value = rhs; - } else { - GB_ASSERT_MSG(type_has_nil(rhs.type), "%s", type_to_string(rhs.type)); - has_value = cg_emit_comp_against_nil(p, Token_CmpEq, rhs); - } - GB_ASSERT(has_value.node != nullptr); - return has_value; -} - -gb_internal cgValue cg_build_or_return(cgProcedure *p, Ast *arg, Type *final_type) { - cgValue lhs = {}; - cgValue rhs = {}; - cg_build_try_lhs_rhs(p, arg, final_type, &lhs, &rhs); - - TB_Node *return_region = cg_control_region(p, "or_return_return"); - TB_Node *continue_region = cg_control_region(p, "or_return_continue"); - - cgValue cond = cg_emit_try_has_value(p, rhs); - cg_emit_if(p, cond, continue_region, return_region); - tb_inst_set_control(p->func, return_region); - { - Type *proc_type = base_type(p->type); - Type *results = proc_type->Proc.results; - GB_ASSERT(results != nullptr && results->kind == Type_Tuple); - TypeTuple *tuple = &results->Tuple; - - GB_ASSERT(tuple->variables.count != 0); - - Entity *end_entity = tuple->variables[tuple->variables.count-1]; - rhs = cg_emit_conv(p, rhs, end_entity->type); - if (p->type->Proc.has_named_results) { - GB_ASSERT(end_entity->token.string.len != 0); - - // NOTE(bill): store the named values before returning - cgAddr found = map_must_get(&p->variable_map, end_entity); - cg_addr_store(p, found, rhs); - - cg_build_return_stmt(p, {}); - } else { - GB_ASSERT(tuple->variables.count == 1); - Slice results = {}; - results.data = &rhs; - results.count = 1;; - cg_build_return_stmt_internal(p, results); - } - } - tb_inst_set_control(p->func, continue_region); - if (final_type != nullptr && !is_type_tuple(final_type)) { - return cg_emit_conv(p, lhs, final_type); - } - return {}; -} - -gb_internal cgValue cg_build_or_else(cgProcedure *p, Ast *arg, Ast *else_expr, Type *final_type) { - if (arg->state_flags & StateFlag_DirectiveWasFalse) { - return cg_build_expr(p, else_expr); - } - - cgValue lhs = {}; - cgValue rhs = {}; - cg_build_try_lhs_rhs(p, arg, final_type, &lhs, &rhs); - - GB_ASSERT(else_expr != nullptr); - - if (is_diverging_expr(else_expr)) { - TB_Node *then = cg_control_region(p, "or_else_then"); - TB_Node *else_ = cg_control_region(p, "or_else_else"); - - cg_emit_if(p, cg_emit_try_has_value(p, rhs), then, else_); - // NOTE(bill): else block needs to be straight afterwards to make sure that the actual value is used - // from the then block - tb_inst_set_control(p->func, else_); - - cg_build_expr(p, else_expr); - - tb_inst_set_control(p->func, then); - return cg_emit_conv(p, lhs, final_type); - } else { - TB_Node *incoming_values[2] = {}; - TB_Node *incoming_regions[2] = {}; - - TB_Node *then = cg_control_region(p, "or_else_then"); - TB_Node *done = cg_control_region(p, "or_else_done"); // NOTE(bill): Append later - TB_Node *else_ = cg_control_region(p, "or_else_else"); - - cg_emit_if(p, cg_emit_try_has_value(p, rhs), then, else_); - tb_inst_set_control(p->func, then); - - cgValue x = cg_emit_conv(p, lhs, final_type); - incoming_values[0] = x.node; - incoming_regions[0] = tb_inst_get_control(p->func); - - tb_inst_goto(p->func, done); - tb_inst_set_control(p->func, else_); - - cgValue y = cg_emit_conv(p, cg_build_expr(p, else_expr), final_type); - incoming_values[1] = y.node; - incoming_regions[1] = tb_inst_get_control(p->func); - - tb_inst_goto(p->func, done); - tb_inst_set_control(p->func, done); - - GB_ASSERT(x.kind == y.kind); - GB_ASSERT(incoming_values[0]->dt.raw == incoming_values[1]->dt.raw); - cgValue res = {}; - res.kind = x.kind; - res.type = final_type; - - res.node = tb_inst_incomplete_phi(p->func, incoming_values[0]->dt, done, 2); - tb_inst_add_phi_operand(p->func, res.node, incoming_regions[0], incoming_values[0]); - tb_inst_add_phi_operand(p->func, res.node, incoming_regions[1], incoming_values[1]); - return res; - } -} - - -gb_internal isize cg_control_region_pred_count(TB_Node *region) { - GB_ASSERT(region->type == TB_REGION); - GB_ASSERT(region->input_count > 0); - return region->input_count; -} - -gb_internal cgValue cg_build_logical_binary_expr(cgProcedure *p, TokenKind op, Ast *left, Ast *right, Type *final_type) { - TB_Node *rhs = cg_control_region(p, "logical_cmp_rhs"); - TB_Node *done = cg_control_region(p, "logical_cmp_done"); - - cgValue short_circuit = {}; - if (op == Token_CmpAnd) { - cg_build_cond(p, left, rhs, done); - short_circuit = cg_const_bool(p, t_bool, false); - } else if (op == Token_CmpOr) { - cg_build_cond(p, left, done, rhs); - short_circuit = cg_const_bool(p, t_bool, true); - } - - if (rhs->input_count == 0) { - tb_inst_set_control(p->func, done); - return cg_emit_conv(p, short_circuit, final_type); - } - - if (done->input_count == 0) { - tb_inst_set_control(p->func, rhs); - return cg_build_expr(p, right); - } - - tb_inst_set_control(p->func, rhs); - cgValue edge = cg_build_expr(p, right); - TB_Node *edge_region = tb_inst_get_control(p->func); - - tb_inst_goto(p->func, done); - tb_inst_set_control(p->func, done); - - TB_DataType dt = edge.node->dt; - TB_Node *phi = tb_inst_incomplete_phi(p->func, dt, done, done->input_count); - for (size_t i = 0; i < done->input_count; i++) { - TB_Node *val = short_circuit.node; - TB_Node *region = done->inputs[i]; - if (region == edge_region) { - val = edge.node; - } - tb_inst_add_phi_operand(p->func, phi, region, val); - } - return cg_emit_conv(p, cg_value(phi, t_bool), final_type); -} - - - -gb_internal cgValue cg_build_binary_expr(cgProcedure *p, Ast *expr) { - ast_node(be, BinaryExpr, expr); - - TypeAndValue tv = type_and_value_of_expr(expr); - - if (is_type_matrix(be->left->tav.type) || is_type_matrix(be->right->tav.type)) { - cgValue left = cg_build_expr(p, be->left); - cgValue right = cg_build_expr(p, be->right); - GB_PANIC("TODO(bill): cg_emit_arith_matrix"); - // return cg_emit_arith_matrix(p, be->op.kind, left, right, default_type(tv.type), false); - } - - - switch (be->op.kind) { - case Token_Add: - case Token_Sub: - case Token_Mul: - case Token_Quo: - case Token_Mod: - case Token_ModMod: - case Token_And: - case Token_Or: - case Token_Xor: - case Token_AndNot: { - Type *type = default_type(tv.type); - cgValue left = cg_build_expr(p, be->left); - cgValue right = cg_build_expr(p, be->right); - return cg_emit_arith(p, be->op.kind, left, right, type); - } - - case Token_Shl: - case Token_Shr: { - cgValue left, right; - Type *type = default_type(tv.type); - left = cg_build_expr(p, be->left); - - if (cg_is_expr_untyped_const(be->right)) { - // NOTE(bill): RHS shift operands can still be untyped - // Just bypass the standard cg_build_expr - right = cg_expr_untyped_const_to_typed(p, be->right, type); - } else { - right = cg_build_expr(p, be->right); - } - return cg_emit_arith(p, be->op.kind, left, right, type); - } - - case Token_CmpEq: - case Token_NotEq: - if (is_type_untyped_nil(be->right->tav.type)) { - // `x == nil` or `x != nil` - cgValue left = cg_build_expr(p, be->left); - cgValue cmp = cg_emit_comp_against_nil(p, be->op.kind, left); - Type *type = default_type(tv.type); - return cg_emit_conv(p, cmp, type); - } else if (is_type_untyped_nil(be->left->tav.type)) { - // `nil == x` or `nil != x` - cgValue right = cg_build_expr(p, be->right); - cgValue cmp = cg_emit_comp_against_nil(p, be->op.kind, right); - Type *type = default_type(tv.type); - return cg_emit_conv(p, cmp, type); - }/* else if (cg_is_empty_string_constant(be->right)) { - // `x == ""` or `x != ""` - cgValue s = cg_build_expr(p, be->left); - s = cg_emit_conv(p, s, t_string); - cgValue len = cg_string_len(p, s); - cgValue cmp = cg_emit_comp(p, be->op.kind, len, cg_const_int(p->module, t_int, 0)); - Type *type = default_type(tv.type); - return cg_emit_conv(p, cmp, type); - } else if (cg_is_empty_string_constant(be->left)) { - // `"" == x` or `"" != x` - cgValue s = cg_build_expr(p, be->right); - s = cg_emit_conv(p, s, t_string); - cgValue len = cg_string_len(p, s); - cgValue cmp = cg_emit_comp(p, be->op.kind, len, cg_const_int(p->module, t_int, 0)); - Type *type = default_type(tv.type); - return cg_emit_conv(p, cmp, type); - }*/ - /*fallthrough*/ - case Token_Lt: - case Token_LtEq: - case Token_Gt: - case Token_GtEq: - { - cgValue left = {}; - cgValue right = {}; - - if (be->left->tav.mode == Addressing_Type) { - left = cg_typeid(p, be->left->tav.type); - } - if (be->right->tav.mode == Addressing_Type) { - right = cg_typeid(p, be->right->tav.type); - } - if (left.node == nullptr) left = cg_build_expr(p, be->left); - if (right.node == nullptr) right = cg_build_expr(p, be->right); - cgValue cmp = cg_emit_comp(p, be->op.kind, left, right); - Type *type = default_type(tv.type); - return cg_emit_conv(p, cmp, type); - } - - case Token_CmpAnd: - case Token_CmpOr: - return cg_build_logical_binary_expr(p, be->op.kind, be->left, be->right, tv.type); - - case Token_in: - case Token_not_in: - { - cgValue left = cg_build_expr(p, be->left); - cgValue right = cg_build_expr(p, be->right); - Type *rt = base_type(right.type); - if (is_type_pointer(rt)) { - right = cg_emit_load(p, right); - rt = base_type(type_deref(rt)); - } - - switch (rt->kind) { - case Type_Map: - { - cgValue map_ptr = cg_address_from_load_or_generate_local(p, right); - cgValue key = left; - cgValue ptr = cg_internal_dynamic_map_get_ptr(p, map_ptr, key); - if (be->op.kind == Token_in) { - return cg_emit_conv(p, cg_emit_comp_against_nil(p, Token_NotEq, ptr), t_bool); - } else { - return cg_emit_conv(p, cg_emit_comp_against_nil(p, Token_CmpEq, ptr), t_bool); - } - } - break; - case Type_BitSet: - { - Type *key_type = rt->BitSet.elem; - GB_ASSERT(are_types_identical(left.type, key_type)); - - Type *it = bit_set_to_int(rt); - left = cg_emit_conv(p, left, it); - if (is_type_different_to_arch_endianness(it)) { - left = cg_emit_byte_swap(p, left, integer_endian_type_to_platform_type(it)); - } - - cgValue lower = cg_const_value(p, left.type, exact_value_i64(rt->BitSet.lower)); - cgValue key = cg_emit_arith(p, Token_Sub, left, lower, left.type); - cgValue bit = cg_emit_arith(p, Token_Shl, cg_const_int(p, left.type, 1), key, left.type); - bit = cg_emit_conv(p, bit, it); - - cgValue old_value = cg_emit_transmute(p, right, it); - cgValue new_value = cg_emit_arith(p, Token_And, old_value, bit, it); - - GB_PANIC("TODO(bill): cg_emit_comp"); - // TokenKind op = (be->op.kind == Token_in) ? Token_NotEq : Token_CmpEq; - // return cg_emit_conv(p, cg_emit_comp(p, op, new_value, cg_const_int(p, new_value.type, 0)), t_bool); - } - break; - default: - GB_PANIC("Invalid 'in' type"); - } - break; - } - break; - default: - GB_PANIC("Invalid binary expression"); - break; - } - return {}; -} - -gb_internal cgValue cg_build_cond(cgProcedure *p, Ast *cond, TB_Node *true_block, TB_Node *false_block) { - cond = unparen_expr(cond); - - GB_ASSERT(cond != nullptr); - GB_ASSERT(true_block != nullptr); - GB_ASSERT(false_block != nullptr); - - // Use to signal not to do compile time short circuit for consts - cgValue no_comptime_short_circuit = {}; - - switch (cond->kind) { - case_ast_node(ue, UnaryExpr, cond); - if (ue->op.kind == Token_Not) { - cgValue cond_val = cg_build_cond(p, ue->expr, false_block, true_block); - return cond_val; - // if (cond_val.value && LLVMIsConstant(cond_val.value)) { - // return cg_const_bool(p->module, cond_val.type, LLVMConstIntGetZExtValue(cond_val.value) == 0); - // } - // return no_comptime_short_circuit; - } - case_end; - - case_ast_node(be, BinaryExpr, cond); - if (be->op.kind == Token_CmpAnd) { - TB_Node *block = cg_control_region(p, "cmp_and"); - cg_build_cond(p, be->left, block, false_block); - tb_inst_set_control(p->func, block); - cg_build_cond(p, be->right, true_block, false_block); - return no_comptime_short_circuit; - } else if (be->op.kind == Token_CmpOr) { - TB_Node *block = cg_control_region(p, "cmp_or"); - cg_build_cond(p, be->left, true_block, block); - tb_inst_set_control(p->func, block); - cg_build_cond(p, be->right, true_block, false_block); - return no_comptime_short_circuit; - } - case_end; - } - - cgValue v = {}; - if (cg_is_expr_untyped_const(cond)) { - v = cg_expr_untyped_const_to_typed(p, cond, t_bool); - } else { - v = cg_build_expr(p, cond); - } - cg_emit_if(p, v, true_block, false_block); - return v; -} - -gb_internal cgValue cg_build_expr_internal(cgProcedure *p, Ast *expr); -gb_internal cgValue cg_build_expr(cgProcedure *p, Ast *expr) { - cg_set_debug_pos_from_node(p, expr); - - u16 prev_state_flags = p->state_flags; - defer (p->state_flags = prev_state_flags); - - if (expr->state_flags != 0) { - u16 in = expr->state_flags; - u16 out = p->state_flags; - - if (in & StateFlag_bounds_check) { - out |= StateFlag_bounds_check; - out &= ~StateFlag_no_bounds_check; - } else if (in & StateFlag_no_bounds_check) { - out |= StateFlag_no_bounds_check; - out &= ~StateFlag_bounds_check; - } - - if (in & StateFlag_type_assert) { - out |= StateFlag_type_assert; - out &= ~StateFlag_no_type_assert; - } else if (in & StateFlag_no_type_assert) { - out |= StateFlag_no_type_assert; - out &= ~StateFlag_type_assert; - } - - p->state_flags = out; - } - - - // IMPORTANT NOTE(bill): - // Selector Call Expressions (foo->bar(...)) - // must only evaluate `foo` once as it gets transformed into - // `foo.bar(foo, ...)` - // And if `foo` is a procedure call or something more complex, storing the value - // once is a very good idea - // If a stored value is found, it must be removed from the cache - if (expr->state_flags & StateFlag_SelectorCallExpr) { - // cgValue *pp = map_get(&p->selector_values, expr); - // if (pp != nullptr) { - // cgValue res = *pp; - // map_remove(&p->selector_values, expr); - // return res; - // } - // cgAddr *pa = map_get(&p->selector_addr, expr); - // if (pa != nullptr) { - // cgAddr res = *pa; - // map_remove(&p->selector_addr, expr); - // return cg_addr_load(p, res); - // } - } - - cgValue res = cg_build_expr_internal(p, expr); - if (res.kind == cgValue_Symbol) { - GB_ASSERT(is_type_internally_pointer_like(res.type)); - res = cg_value(tb_inst_get_symbol_address(p->func, res.symbol), res.type); - } - - if (expr->state_flags & StateFlag_SelectorCallExpr) { - // map_set(&p->selector_values, expr, res); - } - return res; -} - - -gb_internal cgValue cg_find_ident(cgProcedure *p, Entity *e, Ast *expr) { - cgAddr *found_addr = map_get(&p->variable_map, e); - if (found_addr) { - return cg_addr_load(p, *found_addr); - } - - cgValue *found = nullptr; - rw_mutex_shared_lock(&p->module->values_mutex); - found = map_get(&p->module->values, e); - rw_mutex_shared_unlock(&p->module->values_mutex); - - if (found) { - - auto v = *found; - // NOTE(bill): This is because pointers are already pointers in LLVM - if (is_type_proc(v.type)) { - return v; - } - return cg_emit_load(p, v); - } else if (e != nullptr && e->kind == Entity_Variable) { - return cg_addr_load(p, cg_build_addr(p, expr)); - } - - if (e->kind == Entity_Procedure) { - return cg_find_procedure_value_from_entity(p->module, e); - } - - String pkg = {}; - if (e->pkg) { - pkg = e->pkg->name; - } - gb_printf_err("Error in: %s\n", token_pos_to_string(ast_token(expr).pos)); - GB_PANIC("nullptr value for expression from identifier: %.*s.%.*s (%p) : %s @ %p", LIT(pkg), LIT(e->token.string), e, type_to_string(e->type), expr); - return {}; -} - -cgAddr cg_build_addr_compound_lit(cgProcedure *p, Ast *expr) { - struct cgCompoundLitElemTempData { - Ast * expr; - cgValue value; - i64 elem_index; - i64 elem_length; - cgValue gep; - }; - - - auto const &populate = [](cgProcedure *p, Slice const &elems, Array *temp_data, Type *compound_type) { - Type *bt = base_type(compound_type); - Type *et = nullptr; - switch (bt->kind) { - case Type_Array: et = bt->Array.elem; break; - case Type_EnumeratedArray: et = bt->EnumeratedArray.elem; break; - case Type_Slice: et = bt->Slice.elem; break; - case Type_BitSet: et = bt->BitSet.elem; break; - case Type_DynamicArray: et = bt->DynamicArray.elem; break; - case Type_SimdVector: et = bt->SimdVector.elem; break; - case Type_Matrix: et = bt->Matrix.elem; break; - } - GB_ASSERT(et != nullptr); - - - // NOTE(bill): Separate value, gep, store into their own chunks - for_array(i, elems) { - Ast *elem = elems[i]; - if (elem->kind == Ast_FieldValue) { - ast_node(fv, FieldValue, elem); - if (is_ast_range(fv->field)) { - ast_node(ie, BinaryExpr, fv->field); - TypeAndValue lo_tav = ie->left->tav; - TypeAndValue hi_tav = ie->right->tav; - GB_ASSERT(lo_tav.mode == Addressing_Constant); - GB_ASSERT(hi_tav.mode == Addressing_Constant); - - TokenKind op = ie->op.kind; - i64 lo = exact_value_to_i64(lo_tav.value); - i64 hi = exact_value_to_i64(hi_tav.value); - if (op != Token_RangeHalf) { - hi += 1; - } - - cgValue value = cg_emit_conv(p, cg_build_expr(p, fv->value), et); - - GB_ASSERT((hi-lo) > 0); - - if (bt->kind == Type_Matrix) { - GB_PANIC("TODO(bill): Type_Matrix"); - // for (i64 k = lo; k < hi; k++) { - // cgCompoundLitElemTempData data = {}; - // data.value = value; - - // data.elem_index = matrix_row_major_index_to_offset(bt, k); - // array_add(temp_data, data); - // } - } else { - enum {MAX_ELEMENT_AMOUNT = 32}; - if ((hi-lo) <= MAX_ELEMENT_AMOUNT) { - for (i64 k = lo; k < hi; k++) { - cgCompoundLitElemTempData data = {}; - data.value = value; - data.elem_index = k; - array_add(temp_data, data); - } - } else { - cgCompoundLitElemTempData data = {}; - data.value = value; - data.elem_index = lo; - data.elem_length = hi-lo; - array_add(temp_data, data); - } - } - } else { - auto tav = fv->field->tav; - GB_ASSERT(tav.mode == Addressing_Constant); - i64 index = exact_value_to_i64(tav.value); - - cgValue value = cg_emit_conv(p, cg_build_expr(p, fv->value), et); - GB_ASSERT(!is_type_tuple(value.type)); - - cgCompoundLitElemTempData data = {}; - data.value = value; - data.expr = fv->value; - if (bt->kind == Type_Matrix) { - GB_PANIC("TODO(bill): Type_Matrix"); - // data.elem_index = matrix_row_major_index_to_offset(bt, index); - } else { - data.elem_index = index; - } - array_add(temp_data, data); - } - - } else { - // if (bt->kind != Type_DynamicArray && lb_is_elem_const(elem, et)) { - // continue; - // } - - cgValue field_expr = cg_build_expr(p, elem); - GB_ASSERT(!is_type_tuple(field_expr.type)); - - cgValue ev = cg_emit_conv(p, field_expr, et); - - cgCompoundLitElemTempData data = {}; - data.value = ev; - if (bt->kind == Type_Matrix) { - GB_PANIC("TODO(bill): Type_Matrix"); - // data.elem_index = matrix_row_major_index_to_offset(bt, i); - } else { - data.elem_index = i; - } - array_add(temp_data, data); - } - } - }; - - auto const &assign_array = [](cgProcedure *p, Array const &temp_data) { - for (auto const &td : temp_data) if (td.value.node != nullptr) { - if (td.elem_length > 0) { - GB_PANIC("TODO(bill): range"); - // auto loop_data = cg_loop_start(p, cast(isize)td.elem_length, t_i32); - // { - // cgValue dst = td.gep; - // dst = cg_emit_ptr_offset(p, dst, loop_data.idx); - // cg_emit_store(p, dst, td.value); - // } - // cg_loop_end(p, loop_data); - } else { - cg_emit_store(p, td.gep, td.value); - } - } - }; - - - - ast_node(cl, CompoundLit, expr); - - Type *type = type_of_expr(expr); - Type *bt = base_type(type); - - cgAddr v = {}; - if (p->is_startup) { - v = cg_add_global(p, type, nullptr); - } else { - v = cg_add_local(p, type, nullptr, true); - } - - if (cl->elems.count == 0) { - // No need to create it - return v; - } - - TEMPORARY_ALLOCATOR_GUARD(); - - Type *et = nullptr; - switch (bt->kind) { - case Type_Array: et = bt->Array.elem; break; - case Type_EnumeratedArray: et = bt->EnumeratedArray.elem; break; - case Type_Slice: et = bt->Slice.elem; break; - case Type_BitSet: et = bt->BitSet.elem; break; - case Type_SimdVector: et = bt->SimdVector.elem; break; - case Type_Matrix: et = bt->Matrix.elem; break; - } - - String proc_name = {}; - if (p->entity) { - proc_name = p->entity->token.string; - } - TokenPos pos = ast_token(expr).pos; - - - switch (bt->kind) { - default: GB_PANIC("Unknown CompoundLit type: %s", type_to_string(type)); break; - - case Type_Struct: { - TypeStruct *st = &bt->Struct; - cgValue comp_lit_ptr = cg_addr_get_ptr(p, v); - - for_array(field_index, cl->elems) { - Ast *elem = cl->elems[field_index]; - - cgValue field_expr = {}; - Entity *field = nullptr; - isize index = field_index; - - if (elem->kind == Ast_FieldValue) { - ast_node(fv, FieldValue, elem); - String name = fv->field->Ident.token.string; - Selection sel = lookup_field(bt, name, false); - GB_ASSERT(!sel.indirect); - - elem = fv->value; - if (sel.index.count > 1) { - cgValue dst = cg_emit_deep_field_gep(p, comp_lit_ptr, sel); - field_expr = cg_build_expr(p, elem); - field_expr = cg_emit_conv(p, field_expr, sel.entity->type); - cg_emit_store(p, dst, field_expr); - continue; - } - - index = sel.index[0]; - } else { - Selection sel = lookup_field_from_index(bt, st->fields[field_index]->Variable.field_index); - GB_ASSERT(sel.index.count == 1); - GB_ASSERT(!sel.indirect); - index = sel.index[0]; - } - - field = st->fields[index]; - Type *ft = field->type; - - field_expr = cg_build_expr(p, elem); - - cgValue gep = {}; - if (st->is_raw_union) { - gep = cg_emit_conv(p, comp_lit_ptr, alloc_type_pointer(ft)); - } else { - gep = cg_emit_struct_ep(p, comp_lit_ptr, cast(i32)index); - } - - Type *fet = field_expr.type; - GB_ASSERT(fet->kind != Type_Tuple); - - // HACK TODO(bill): THIS IS A MASSIVE HACK!!!! - if (is_type_union(ft) && !are_types_identical(fet, ft) && !is_type_untyped(fet)) { - GB_ASSERT_MSG(union_variant_index(ft, fet) >= 0, "%s", type_to_string(fet)); - - GB_PANIC("TODO(bill): cg_emit_store_union_variant"); - // cg_emit_store_union_variant(p, gep, field_expr, fet); - } else { - cgValue fv = cg_emit_conv(p, field_expr, ft); - cg_emit_store(p, gep, fv); - } - } - return v; - } - - case Type_Map: { - GB_ASSERT(!build_context.no_dynamic_literals); - GB_PANIC("TODO(bill): map literals"); - - // cgValue err = cg_dynamic_map_reserve(p, v.addr, 2*cl->elems.count, pos); - // gb_unused(err); - - // for (Ast *elem : cl->elems) { - // ast_node(fv, FieldValue, elem); - - // cgValue key = cg_build_expr(p, fv->field); - // cgValue value = cg_build_expr(p, fv->value); - // cg_internal_dynamic_map_set(p, v.addr, type, key, value, elem); - // } - break; - } - - case Type_Array: { - auto temp_data = array_make(temporary_allocator(), 0, cl->elems.count); - - populate(p, cl->elems, &temp_data, type); - - cgValue dst_ptr = cg_addr_get_ptr(p, v); - for_array(i, temp_data) { - i32 index = cast(i32)(temp_data[i].elem_index); - temp_data[i].gep = cg_emit_array_epi(p, dst_ptr, index); - } - - assign_array(p, temp_data); - break; - } - case Type_EnumeratedArray: { - auto temp_data = array_make(temporary_allocator(), 0, cl->elems.count); - - populate(p, cl->elems, &temp_data, type); - - cgValue dst_ptr = cg_addr_get_ptr(p, v); - i64 index_offset = exact_value_to_i64(*bt->EnumeratedArray.min_value); - for_array(i, temp_data) { - i32 index = cast(i32)(temp_data[i].elem_index - index_offset); - temp_data[i].gep = cg_emit_array_epi(p, dst_ptr, index); - } - - assign_array(p, temp_data); - break; - } - case Type_Slice: { - isize count = gb_max(cl->elems.count, cl->max_count); - - TB_CharUnits backing_size = cast(TB_CharUnits)(type_size_of(bt->Slice.elem) * count); - TB_CharUnits align = cast(TB_CharUnits)type_align_of(bt->Slice.elem); - - TB_Node *backing = nullptr; - if (p->is_startup) { - TB_Global *global = tb_global_create(p->module->mod, 0, "", nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(p->module->mod, tb_module_get_data(p->module->mod), global, backing_size, align, 0); - backing = tb_inst_get_symbol_address(p->func, cast(TB_Symbol *)global); - } else { - backing = tb_inst_local(p->func, backing_size, align); - } - - cgValue data = cg_value(backing, alloc_type_multi_pointer(bt->Slice.elem)); - - auto temp_data = array_make(temporary_allocator(), 0, cl->elems.count); - populate(p, cl->elems, &temp_data, type); - - - for_array(i, temp_data) { - temp_data[i].gep = cg_emit_ptr_offset(p, data, cg_const_int(p, t_int, temp_data[i].elem_index)); - } - - assign_array(p, temp_data); - cg_fill_slice(p, v, data, cg_const_int(p, t_int, count)); - return v; - } - - case Type_DynamicArray: { - GB_ASSERT(!build_context.no_dynamic_literals); - - Type *et = bt->DynamicArray.elem; - cgValue size = cg_const_int(p, t_int, type_size_of(et)); - cgValue align = cg_const_int(p, t_int, type_align_of(et)); - - i64 item_count = gb_max(cl->max_count, cl->elems.count); - { - - auto args = slice_make(temporary_allocator(), 5); - args[0] = cg_emit_conv(p, cg_addr_get_ptr(p, v), t_rawptr); - args[1] = size; - args[2] = align; - args[3] = cg_const_int(p, t_int, item_count); - args[4] = cg_emit_source_code_location_as_global(p, proc_name, pos); - cg_emit_runtime_call(p, "__dynamic_array_reserve", args); - } - - Type *array_type = alloc_type_array(et, item_count); - cgAddr items_addr = cg_add_local(p, array_type, nullptr, true); - cgValue items = cg_addr_get_ptr(p, items_addr); - - auto temp_data = array_make(temporary_allocator(), 0, cl->elems.count); - populate(p, cl->elems, &temp_data, type); - - for_array(i, temp_data) { - temp_data[i].gep = cg_emit_array_epi(p, items, temp_data[i].elem_index); - } - assign_array(p, temp_data); - - { - auto args = slice_make(temporary_allocator(), 6); - args[0] = cg_emit_conv(p, v.addr, t_rawptr); - args[1] = size; - args[2] = align; - args[3] = cg_emit_conv(p, items, t_rawptr); - args[4] = cg_const_int(p, t_int, item_count); - args[5] = cg_emit_source_code_location_as_global(p, proc_name, pos); - cg_emit_runtime_call(p, "__dynamic_array_append", args); - } - break; - } - - case Type_Basic: { - GB_ASSERT(is_type_any(bt)); - String field_names[2] = { - str_lit("data"), - str_lit("id"), - }; - Type *field_types[2] = { - t_rawptr, - t_typeid, - }; - - for_array(field_index, cl->elems) { - Ast *elem = cl->elems[field_index]; - - cgValue field_expr = {}; - isize index = field_index; - - if (elem->kind == Ast_FieldValue) { - ast_node(fv, FieldValue, elem); - Selection sel = lookup_field(bt, fv->field->Ident.token.string, false); - index = sel.index[0]; - elem = fv->value; - } else { - TypeAndValue tav = type_and_value_of_expr(elem); - Selection sel = lookup_field(bt, field_names[field_index], false); - index = sel.index[0]; - } - - field_expr = cg_build_expr(p, elem); - - GB_ASSERT(field_expr.type->kind != Type_Tuple); - - Type *ft = field_types[index]; - cgValue fv = cg_emit_conv(p, field_expr, ft); - cgValue gep = cg_emit_struct_ep(p, cg_addr_get_ptr(p, v), index); - cg_emit_store(p, gep, fv); - } - break; - } - - case Type_BitSet: { - i64 sz = type_size_of(type); - if (sz == 0) { - return v; - } - cgValue lower = cg_const_value(p, t_int, exact_value_i64(bt->BitSet.lower)); - Type *it = bit_set_to_int(bt); - cgValue one = cg_const_value(p, it, exact_value_i64(1)); - for (Ast *elem : cl->elems) { - GB_ASSERT(elem->kind != Ast_FieldValue); - - cgValue expr = cg_build_expr(p, elem); - GB_ASSERT(expr.type->kind != Type_Tuple); - - cgValue e = cg_emit_conv(p, expr, it); - e = cg_emit_arith(p, Token_Sub, e, lower, it); - e = cg_emit_arith(p, Token_Shl, one, e, it); - - cgValue old_value = cg_emit_transmute(p, cg_addr_load(p, v), it); - cgValue new_value = cg_emit_arith(p, Token_Or, old_value, e, it); - new_value = cg_emit_transmute(p, new_value, type); - cg_addr_store(p, v, new_value); - } - return v; - } - - case Type_Matrix: { - auto temp_data = array_make(temporary_allocator(), 0, cl->elems.count); - - populate(p, cl->elems, &temp_data, type); - - cgValue dst_ptr = cg_addr_get_ptr(p, v); - for_array(i, temp_data) { - temp_data[i].gep = cg_emit_array_epi(p, dst_ptr, temp_data[i].elem_index); - } - - assign_array(p, temp_data); - break; - } - - case Type_SimdVector: { - // auto temp_data = array_make(temporary_allocator(), 0, cl->elems.count); - - // populate(p, cl->elems, &temp_data, type); - - // // TODO(bill): reduce the need for individual `insertelement` if a `shufflevector` - // // might be a better option - // for (auto const &td : temp_data) if (td.value.node != nullptr) { - // if (td.elem_length > 0) { - // for (i64 k = 0; k < td.elem_length; k++) { - // LLVMValueRef index = cg_const_int(p->module, t_u32, td.elem_index + k).value; - // vector_value.value = LLVMBuildInsertElement(p->builder, vector_value.value, td.value.value, index, ""); - // } - // } else { - // LLVMValueRef index = cg_const_int(p->module, t_u32, td.elem_index).value; - // vector_value.value = LLVMBuildInsertElement(p->builder, vector_value.value, td.value.value, index, ""); - - // } - // } - break; - } - } - - return v; -} - -gb_internal cgValue cg_make_soa_pointer(cgProcedure *p, Type *type, cgValue const &addr, cgValue const &index) { - cgAddr v = cg_add_local(p, type, nullptr, true); - cgValue ptr = cg_emit_struct_ep(p, v.addr, 0); - cgValue idx = cg_emit_struct_ep(p, v.addr, 1); - cg_emit_store(p, ptr, addr); - cg_emit_store(p, idx, cg_emit_conv(p, index, t_int)); - - return cg_addr_load(p, v); -} - -gb_internal cgValue cg_build_unary_and(cgProcedure *p, Ast *expr) { - ast_node(ue, UnaryExpr, expr); - auto tv = type_and_value_of_expr(expr); - - - Ast *ue_expr = unparen_expr(ue->expr); - if (ue_expr->kind == Ast_IndexExpr && tv.mode == Addressing_OptionalOkPtr && is_type_tuple(tv.type)) { - GB_PANIC("TODO(bill): &m[k]"); - // Type *tuple = tv.type; - - // Type *map_type = type_of_expr(ue_expr->IndexExpr.expr); - // Type *ot = base_type(map_type); - // Type *t = base_type(type_deref(ot)); - // bool deref = t != ot; - // GB_ASSERT(t->kind == Type_Map); - // ast_node(ie, IndexExpr, ue_expr); - - // cgValue map_val = cg_build_addr_ptr(p, ie->expr); - // if (deref) { - // map_val = cg_emit_load(p, map_val); - // } - - // cgValue key = lb_build_expr(p, ie->index); - // key = lb_emit_conv(p, key, t->Map.key); - - // lbAddr addr = lb_addr_map(map_val, key, t, alloc_type_pointer(t->Map.value)); - // lbValue ptr = lb_addr_get_ptr(p, addr); - - // lbValue ok = lb_emit_comp_against_nil(p, Token_NotEq, ptr); - // ok = lb_emit_conv(p, ok, tuple->Tuple.variables[1]->type); - - // lbAddr res = lb_add_local_generated(p, tuple, false); - // lbValue gep0 = lb_emit_struct_ep(p, res.addr, 0); - // lbValue gep1 = lb_emit_struct_ep(p, res.addr, 1); - // lb_emit_store(p, gep0, ptr); - // lb_emit_store(p, gep1, ok); - // return lb_addr_load(p, res); - - } else if (is_type_soa_pointer(tv.type)) { - ast_node(ie, IndexExpr, ue_expr); - cgValue addr = cg_build_addr_ptr(p, ie->expr); - cgValue index = cg_build_expr(p, ie->index); - - if (!build_context.no_bounds_check) { - // TODO(bill): soa bounds checking - } - - return cg_make_soa_pointer(p, tv.type, addr, index); - } else if (ue_expr->kind == Ast_CompoundLit) { - cgAddr addr = cg_build_addr_compound_lit(p, expr); - return addr.addr; - } else if (ue_expr->kind == Ast_TypeAssertion) { - GB_PANIC("TODO(bill): &v.(T)"); - // if (is_type_tuple(tv.type)) { - // Type *tuple = tv.type; - // Type *ptr_type = tuple->Tuple.variables[0]->type; - // Type *ok_type = tuple->Tuple.variables[1]->type; - - // ast_node(ta, TypeAssertion, ue_expr); - // TokenPos pos = ast_token(expr).pos; - // Type *type = type_of_expr(ue_expr); - // GB_ASSERT(!is_type_tuple(type)); - - // lbValue e = lb_build_expr(p, ta->expr); - // Type *t = type_deref(e.type); - // if (is_type_union(t)) { - // lbValue v = e; - // if (!is_type_pointer(v.type)) { - // v = lb_address_from_load_or_generate_local(p, v); - // } - // Type *src_type = type_deref(v.type); - // Type *dst_type = type; - - // lbValue src_tag = {}; - // lbValue dst_tag = {}; - // if (is_type_union_maybe_pointer(src_type)) { - // src_tag = lb_emit_comp_against_nil(p, Token_NotEq, v); - // dst_tag = lb_const_bool(p->module, t_bool, true); - // } else { - // src_tag = lb_emit_load(p, lb_emit_union_tag_ptr(p, v)); - // dst_tag = lb_const_union_tag(p->module, src_type, dst_type); - // } - - // lbValue ok = lb_emit_comp(p, Token_CmpEq, src_tag, dst_tag); - - // lbValue data_ptr = lb_emit_conv(p, v, ptr_type); - // lbAddr res = lb_add_local_generated(p, tuple, true); - // lbValue gep0 = lb_emit_struct_ep(p, res.addr, 0); - // lbValue gep1 = lb_emit_struct_ep(p, res.addr, 1); - // lb_emit_store(p, gep0, lb_emit_select(p, ok, data_ptr, lb_const_nil(p->module, ptr_type))); - // lb_emit_store(p, gep1, lb_emit_conv(p, ok, ok_type)); - // return lb_addr_load(p, res); - // } else if (is_type_any(t)) { - // lbValue v = e; - // if (is_type_pointer(v.type)) { - // v = lb_emit_load(p, v); - // } - - // lbValue data_ptr = lb_emit_conv(p, lb_emit_struct_ev(p, v, 0), ptr_type); - // lbValue any_id = lb_emit_struct_ev(p, v, 1); - // lbValue id = lb_typeid(p->module, type); - - // lbValue ok = lb_emit_comp(p, Token_CmpEq, any_id, id); - - // lbAddr res = lb_add_local_generated(p, tuple, false); - // lbValue gep0 = lb_emit_struct_ep(p, res.addr, 0); - // lbValue gep1 = lb_emit_struct_ep(p, res.addr, 1); - // lb_emit_store(p, gep0, lb_emit_select(p, ok, data_ptr, lb_const_nil(p->module, ptr_type))); - // lb_emit_store(p, gep1, lb_emit_conv(p, ok, ok_type)); - // return lb_addr_load(p, res); - // } else { - // GB_PANIC("TODO(bill): type assertion %s", type_to_string(type)); - // } - - // } else { - // GB_ASSERT(is_type_pointer(tv.type)); - - // ast_node(ta, TypeAssertion, ue_expr); - // TokenPos pos = ast_token(expr).pos; - // Type *type = type_of_expr(ue_expr); - // GB_ASSERT(!is_type_tuple(type)); - - // lbValue e = lb_build_expr(p, ta->expr); - // Type *t = type_deref(e.type); - // if (is_type_union(t)) { - // lbValue v = e; - // if (!is_type_pointer(v.type)) { - // v = lb_address_from_load_or_generate_local(p, v); - // } - // Type *src_type = type_deref(v.type); - // Type *dst_type = type; - - - // if ((p->state_flags & StateFlag_no_type_assert) == 0) { - // lbValue src_tag = {}; - // lbValue dst_tag = {}; - // if (is_type_union_maybe_pointer(src_type)) { - // src_tag = lb_emit_comp_against_nil(p, Token_NotEq, v); - // dst_tag = lb_const_bool(p->module, t_bool, true); - // } else { - // src_tag = lb_emit_load(p, lb_emit_union_tag_ptr(p, v)); - // dst_tag = lb_const_union_tag(p->module, src_type, dst_type); - // } - - - // isize arg_count = 6; - // if (build_context.no_rtti) { - // arg_count = 4; - // } - - // lbValue ok = lb_emit_comp(p, Token_CmpEq, src_tag, dst_tag); - // auto args = array_make(permanent_allocator(), arg_count); - // args[0] = ok; - - // args[1] = lb_find_or_add_entity_string(p->module, get_file_path_string(pos.file_id)); - // args[2] = lb_const_int(p->module, t_i32, pos.line); - // args[3] = lb_const_int(p->module, t_i32, pos.column); - - // if (!build_context.no_rtti) { - // args[4] = lb_typeid(p->module, src_type); - // args[5] = lb_typeid(p->module, dst_type); - // } - // lb_emit_runtime_call(p, "type_assertion_check", args); - // } - - // lbValue data_ptr = v; - // return lb_emit_conv(p, data_ptr, tv.type); - // } else if (is_type_any(t)) { - // lbValue v = e; - // if (is_type_pointer(v.type)) { - // v = lb_emit_load(p, v); - // } - // lbValue data_ptr = lb_emit_struct_ev(p, v, 0); - // if ((p->state_flags & StateFlag_no_type_assert) == 0) { - // GB_ASSERT(!build_context.no_rtti); - - // lbValue any_id = lb_emit_struct_ev(p, v, 1); - - // lbValue id = lb_typeid(p->module, type); - // lbValue ok = lb_emit_comp(p, Token_CmpEq, any_id, id); - // auto args = array_make(permanent_allocator(), 6); - // args[0] = ok; - - // args[1] = lb_find_or_add_entity_string(p->module, get_file_path_string(pos.file_id)); - // args[2] = lb_const_int(p->module, t_i32, pos.line); - // args[3] = lb_const_int(p->module, t_i32, pos.column); - - // args[4] = any_id; - // args[5] = id; - // lb_emit_runtime_call(p, "type_assertion_check", args); - // } - - // return lb_emit_conv(p, data_ptr, tv.type); - // } else { - // GB_PANIC("TODO(bill): type assertion %s", type_to_string(type)); - // } - // } - } - - return cg_build_addr_ptr(p, ue->expr); -} - -gb_internal cgValue cg_emit_cast_union(cgProcedure *p, cgValue value, Type *type, TokenPos pos) { - Type *src_type = value.type; - bool is_ptr = is_type_pointer(src_type); - - bool is_tuple = true; - Type *tuple = type; - if (type->kind != Type_Tuple) { - is_tuple = false; - tuple = make_optional_ok_type(type); - } - - - if (is_ptr) { - value = cg_emit_load(p, value); - } - Type *src = base_type(type_deref(src_type)); - GB_ASSERT_MSG(is_type_union(src), "%s", type_to_string(src_type)); - Type *dst = tuple->Tuple.variables[0]->type; - - cgValue value_ = cg_address_from_load_or_generate_local(p, value); - - if ((p->state_flags & StateFlag_no_type_assert) != 0 && !is_tuple) { - // just do a bit cast of the data at the front - cgValue ptr = cg_emit_conv(p, value_, alloc_type_pointer(type)); - return cg_emit_load(p, ptr); - } - - - cgValue tag = {}; - cgValue dst_tag = {}; - cgValue cond = {}; - cgValue data = {}; - - cgValue gep0 = cg_add_local(p, tuple->Tuple.variables[0]->type, nullptr, true).addr; - cgValue gep1 = cg_add_local(p, tuple->Tuple.variables[1]->type, nullptr, true).addr; - - if (is_type_union_maybe_pointer(src)) { - data = cg_emit_load(p, cg_emit_conv(p, value_, gep0.type)); - } else { - tag = cg_emit_load(p, cg_emit_union_tag_ptr(p, value_)); - dst_tag = cg_const_union_tag(p, src, dst); - } - - TB_Node *ok_block = cg_control_region(p, "union_cast_ok"); - TB_Node *end_block = cg_control_region(p, "union_cast_end"); - - if (data.node != nullptr) { - GB_ASSERT(is_type_union_maybe_pointer(src)); - cond = cg_emit_comp_against_nil(p, Token_NotEq, data); - } else { - cond = cg_emit_comp(p, Token_CmpEq, tag, dst_tag); - } - - cg_emit_if(p, cond, ok_block, end_block); - tb_inst_set_control(p->func, ok_block); - - if (data.node == nullptr) { - data = cg_emit_load(p, cg_emit_conv(p, value_, gep0.type)); - } - cg_emit_store(p, gep0, data); - cg_emit_store(p, gep1, cg_const_bool(p, t_bool, true)); - - cg_emit_goto(p, end_block); - tb_inst_set_control(p->func, end_block); - - if (!is_tuple) { - GB_ASSERT((p->state_flags & StateFlag_no_type_assert) == 0); - // NOTE(bill): Panic on invalid conversion - Type *dst_type = tuple->Tuple.variables[0]->type; - - isize arg_count = 7; - if (build_context.no_rtti) { - arg_count = 4; - } - - cgValue ok = cg_emit_load(p, gep1); - auto args = slice_make(permanent_allocator(), arg_count); - args[0] = ok; - - args[1] = cg_const_string(p, t_string, get_file_path_string(pos.file_id)); - args[2] = cg_const_int(p, t_i32, pos.line); - args[3] = cg_const_int(p, t_i32, pos.column); - - if (!build_context.no_rtti) { - args[4] = cg_typeid(p, src_type); - args[5] = cg_typeid(p, dst_type); - args[6] = cg_emit_conv(p, value_, t_rawptr); - } - cg_emit_runtime_call(p, "type_assertion_check2", args); - - return cg_emit_load(p, gep0); - } - - return cg_value_multi2(cg_emit_load(p, gep0), cg_emit_load(p, gep1), tuple); -} - -gb_internal cgValue cg_emit_cast_any(cgProcedure *p, cgValue value, Type *type, TokenPos pos) { - Type *src_type = value.type; - - if (is_type_pointer(src_type)) { - value = cg_emit_load(p, value); - } - - bool is_tuple = true; - Type *tuple = type; - if (type->kind != Type_Tuple) { - is_tuple = false; - tuple = make_optional_ok_type(type); - } - Type *dst_type = tuple->Tuple.variables[0]->type; - - if ((p->state_flags & StateFlag_no_type_assert) != 0 && !is_tuple) { - // just do a bit cast of the data at the front - cgValue ptr = cg_emit_struct_ev(p, value, 0); - ptr = cg_emit_conv(p, ptr, alloc_type_pointer(type)); - return cg_emit_load(p, ptr); - } - - cgValue dst_typeid = cg_typeid(p, dst_type); - cgValue any_typeid = cg_emit_struct_ev(p, value, 1); - - - TB_Node *ok_block = cg_control_region(p, "any_cast_ok"); - TB_Node *end_block = cg_control_region(p, "any_cast_end"); - cgValue cond = cg_emit_comp(p, Token_CmpEq, any_typeid, dst_typeid); - cg_emit_if(p, cond, ok_block, end_block); - tb_inst_set_control(p->func, ok_block); - - cgValue gep0 = cg_add_local(p, tuple->Tuple.variables[0]->type, nullptr, true).addr; - cgValue gep1 = cg_add_local(p, tuple->Tuple.variables[1]->type, nullptr, true).addr; - - cgValue any_data = cg_emit_struct_ev(p, value, 0); - cgValue ptr = cg_emit_conv(p, any_data, alloc_type_pointer(dst_type)); - cg_emit_store(p, gep0, cg_emit_load(p, ptr)); - cg_emit_store(p, gep1, cg_const_bool(p, t_bool, true)); - - cg_emit_goto(p, end_block); - tb_inst_set_control(p->func, end_block); - - if (!is_tuple) { - // NOTE(bill): Panic on invalid conversion - cgValue ok = cg_emit_load(p, gep1); - - isize arg_count = 7; - if (build_context.no_rtti) { - arg_count = 4; - } - auto args = slice_make(permanent_allocator(), arg_count); - args[0] = ok; - - args[1] = cg_const_string(p, t_string, get_file_path_string(pos.file_id)); - args[2] = cg_const_int(p, t_i32, pos.line); - args[3] = cg_const_int(p, t_i32, pos.column); - - if (!build_context.no_rtti) { - args[4] = any_typeid; - args[5] = dst_typeid; - args[6] = cg_emit_struct_ev(p, value, 0); - } - cg_emit_runtime_call(p, "type_assertion_check2", args); - - return cg_emit_load(p, gep0); - } - - return cg_value_multi2(cg_emit_load(p, gep0), cg_emit_load(p, gep1), tuple); -} - - -gb_internal cgValue cg_build_type_assertion(cgProcedure *p, Ast *expr, Type *type) { - ast_node(ta, TypeAssertion, expr); - - TokenPos pos = ast_token(expr).pos; - cgValue e = cg_build_expr(p, ta->expr); - Type *t = type_deref(e.type); - - if (is_type_union(t)) { - return cg_emit_cast_union(p, e, type, pos); - } else if (is_type_any(t)) { - return cg_emit_cast_any(p, e, type, pos); - } - GB_PANIC("TODO(bill): type assertion %s", type_to_string(e.type)); - return {}; -} - - -gb_internal cgValue cg_build_expr_internal(cgProcedure *p, Ast *expr) { - expr = unparen_expr(expr); - - TokenPos expr_pos = ast_token(expr).pos; - TypeAndValue tv = type_and_value_of_expr(expr); - Type *type = type_of_expr(expr); - GB_ASSERT_MSG(tv.mode != Addressing_Invalid, "invalid expression '%s' (tv.mode = %d, tv.type = %s) @ %s\n Current Proc: %.*s : %s", expr_to_string(expr), tv.mode, type_to_string(tv.type), token_pos_to_string(expr_pos), LIT(p->name), type_to_string(p->type)); - - if (tv.value.kind != ExactValue_Invalid && - expr->kind != Ast_CompoundLit) { - // NOTE(bill): The commented out code below is just for debug purposes only - // if (is_type_untyped(type)) { - // gb_printf_err("%s %s : %s @ %p\n", token_pos_to_string(expr_pos), expr_to_string(expr), type_to_string(expr->tav.type), expr); - // GB_PANIC("%s\n", type_to_string(tv.type)); - // } - // NOTE(bill): Short on constant values - return cg_const_value(p, type, tv.value); - } else if (tv.mode == Addressing_Type) { - // NOTE(bill, 2023-01-16): is this correct? I hope so at least - return cg_typeid(p, tv.type); - } - - switch (expr->kind) { - case_ast_node(bl, BasicLit, expr); - TokenPos pos = bl->token.pos; - GB_PANIC("Non-constant basic literal %s - %.*s", token_pos_to_string(pos), LIT(token_strings[bl->token.kind])); - case_end; - - case_ast_node(bd, BasicDirective, expr); - TokenPos pos = bd->token.pos; - GB_PANIC("Non-constant basic literal %s - %.*s", token_pos_to_string(pos), LIT(bd->name.string)); - case_end; - - case_ast_node(i, Ident, expr); - Entity *e = entity_from_expr(expr); - e = strip_entity_wrapping(e); - - GB_ASSERT_MSG(e != nullptr, "%s in %.*s %p", expr_to_string(expr), LIT(p->name), expr); - - if (e->kind == Entity_Builtin) { - Token token = ast_token(expr); - GB_PANIC("TODO(bill): lb_build_expr Entity_Builtin '%.*s'\n" - "\t at %s", LIT(builtin_procs[e->Builtin.id].name), - token_pos_to_string(token.pos)); - return {}; - } else if (e->kind == Entity_Nil) { - // TODO(bill): is this correct? - return cg_value(cast(TB_Node *)nullptr, e->type); - } - GB_ASSERT(e->kind != Entity_ProcGroup); - - cgAddr *addr = map_get(&p->variable_map, e); - if (addr) { - return cg_addr_load(p, *addr); - } - return cg_find_ident(p, e, expr); - case_end; - - case_ast_node(i, Implicit, expr); - return cg_addr_load(p, cg_build_addr(p, expr)); - case_end; - - case_ast_node(u, Uninit, expr); - if (is_type_untyped(type)) { - return cg_value(cast(TB_Node *)nullptr, t_untyped_uninit); - } - return cg_value(tb_inst_poison(p->func, cg_data_type(type)), type); - case_end; - - case_ast_node(de, DerefExpr, expr); - return cg_addr_load(p, cg_build_addr(p, expr)); - case_end; - - - case_ast_node(se, SelectorExpr, expr); - TypeAndValue tav = type_and_value_of_expr(expr); - GB_ASSERT(tav.mode != Addressing_Invalid); - return cg_addr_load(p, cg_build_addr(p, expr)); - case_end; - - case_ast_node(ise, ImplicitSelectorExpr, expr); - TypeAndValue tav = type_and_value_of_expr(expr); - GB_ASSERT(tav.mode == Addressing_Constant); - - return cg_const_value(p, type, tv.value); - case_end; - - - case_ast_node(se, SelectorCallExpr, expr); - GB_ASSERT(se->modified_call); - return cg_build_call_expr(p, se->call); - case_end; - - case_ast_node(i, CallExpr, expr); - return cg_build_call_expr(p, expr); - case_end; - - case_ast_node(cl, CompoundLit, expr); - cgAddr addr = cg_build_addr_compound_lit(p, expr); - return cg_addr_load(p, addr); - case_end; - - - case_ast_node(te, TernaryIfExpr, expr); - cgValue incoming_values[2] = {}; - TB_Node *incoming_regions[2] = {}; - - TB_Node *then = cg_control_region(p, "if_then"); - TB_Node *done = cg_control_region(p, "if_done"); - TB_Node *else_ = cg_control_region(p, "if_else"); - - cg_build_cond(p, te->cond, then, else_); - tb_inst_set_control(p->func, then); - - Type *type = default_type(type_of_expr(expr)); - - incoming_values [0] = cg_emit_conv(p, cg_build_expr(p, te->x), type); - incoming_regions[0] = tb_inst_get_control(p->func); - - cg_emit_goto(p, done); - tb_inst_set_control(p->func, else_); - - incoming_values [1] = cg_emit_conv(p, cg_build_expr(p, te->y), type); - incoming_regions[1] = tb_inst_get_control(p->func); - - cg_emit_goto(p, done); - tb_inst_set_control(p->func, done); - - GB_ASSERT(incoming_values[0].kind == cgValue_Value || - incoming_values[0].kind == cgValue_Addr); - GB_ASSERT(incoming_values[0].kind == incoming_values[1].kind); - - cgValue res = {}; - res.kind = incoming_values[0].kind; - res.type = type; - TB_DataType dt = cg_data_type(type); - if (res.kind == cgValue_Addr) { - dt = TB_TYPE_PTR; - } - res.node = tb_inst_incomplete_phi(p->func, dt, done, 2); - tb_inst_add_phi_operand(p->func, res.node, incoming_regions[0], incoming_values[0].node); - tb_inst_add_phi_operand(p->func, res.node, incoming_regions[1], incoming_values[1].node); - return res; - case_end; - - case_ast_node(te, TernaryWhenExpr, expr); - TypeAndValue tav = type_and_value_of_expr(te->cond); - GB_ASSERT(tav.mode == Addressing_Constant); - GB_ASSERT(tav.value.kind == ExactValue_Bool); - if (tav.value.value_bool) { - return cg_build_expr(p, te->x); - } else { - return cg_build_expr(p, te->y); - } - case_end; - - case_ast_node(tc, TypeCast, expr); - cgValue e = cg_build_expr(p, tc->expr); - switch (tc->token.kind) { - case Token_cast: - return cg_emit_conv(p, e, type); - case Token_transmute: - return cg_emit_transmute(p, e, type); - } - GB_PANIC("Invalid AST TypeCast"); - case_end; - - case_ast_node(ac, AutoCast, expr); - cgValue value = cg_build_expr(p, ac->expr); - return cg_emit_conv(p, value, type); - case_end; - - case_ast_node(se, SliceExpr, expr); - if (is_type_slice(type_of_expr(se->expr))) { - // NOTE(bill): Quick optimization - if (se->high == nullptr && - (se->low == nullptr || cg_is_expr_constant_zero(se->low))) { - return cg_build_expr(p, se->expr); - } - } - return cg_addr_load(p, cg_build_addr(p, expr)); - case_end; - - case_ast_node(ie, IndexExpr, expr); - return cg_addr_load(p, cg_build_addr(p, expr)); - case_end; - - case_ast_node(ie, MatrixIndexExpr, expr); - return cg_addr_load(p, cg_build_addr(p, expr)); - case_end; - - case_ast_node(ue, UnaryExpr, expr); - if (ue->op.kind == Token_And) { - return cg_build_unary_and(p, expr); - } - cgValue v = cg_build_expr(p, ue->expr); - return cg_emit_unary_arith(p, ue->op.kind, v, type); - case_end; - case_ast_node(be, BinaryExpr, expr); - return cg_build_binary_expr(p, expr); - case_end; - - case_ast_node(oe, OrReturnExpr, expr); - return cg_build_or_return(p, oe->expr, tv.type); - case_end; - - case_ast_node(oe, OrElseExpr, expr); - return cg_build_or_else(p, oe->x, oe->y, tv.type); - case_end; - - case_ast_node(ta, TypeAssertion, expr); - return cg_build_type_assertion(p, expr, tv.type); - case_end; - - case_ast_node(pl, ProcLit, expr); - cgProcedure *anon = cg_procedure_generate_anonymous(p->module, expr, p); - GB_ASSERT(anon != nullptr); - GB_ASSERT(anon->symbol != nullptr); - return cg_value(tb_inst_get_symbol_address(p->func, anon->symbol), type); - case_end; - - } - TokenPos token_pos = ast_token(expr).pos; - GB_PANIC("Unexpected expression\n" - "\tAst: %.*s @ " - "%s\n", - LIT(ast_strings[expr->kind]), - token_pos_to_string(token_pos)); - - return {}; -} - - -gb_internal cgValue cg_map_data_uintptr(cgProcedure *p, cgValue value) { - GB_ASSERT(is_type_map(value.type) || are_types_identical(value.type, t_raw_map)); - cgValue data = cg_emit_struct_ev(p, value, 0); - u64 mask_value = 0; - if (build_context.ptr_size == 4) { - mask_value = 0xfffffffful & ~(MAP_CACHE_LINE_SIZE-1); - } else { - mask_value = 0xffffffffffffffffull & ~(MAP_CACHE_LINE_SIZE-1); - } - cgValue mask = cg_const_int(p, t_uintptr, mask_value); - return cg_emit_arith(p, Token_And, data, mask, t_uintptr); -} - -gb_internal cgValue cg_gen_map_key_hash(cgProcedure *p, cgValue const &map_ptr, cgValue key, cgValue *key_ptr_) { - TEMPORARY_ALLOCATOR_GUARD(); - - cgValue key_ptr = cg_address_from_load_or_generate_local(p, key); - key_ptr = cg_emit_conv(p, key_ptr, t_rawptr); - - if (key_ptr_) *key_ptr_ = key_ptr; - - Type* key_type = base_type(type_deref(map_ptr.type))->Map.key; - - cgValue hasher = cg_hasher_proc_value_for_type(p, key_type); - - Slice args = {}; - args = slice_make(temporary_allocator(), 1); - args[0] = cg_map_data_uintptr(p, cg_emit_load(p, map_ptr)); - cgValue seed = cg_emit_runtime_call(p, "map_seed_from_map_data", args); - - args = slice_make(temporary_allocator(), 2); - args[0] = key_ptr; - args[1] = seed; - return cg_emit_call(p, hasher, args); -} - -gb_internal cgValue cg_internal_dynamic_map_get_ptr(cgProcedure *p, cgValue const &map_ptr, cgValue const &key) { - TEMPORARY_ALLOCATOR_GUARD(); - - Type *map_type = base_type(type_deref(map_ptr.type)); - GB_ASSERT(map_type->kind == Type_Map); - - cgValue ptr = {}; - cgValue key_ptr = {}; - cgValue hash = cg_gen_map_key_hash(p, map_ptr, key, &key_ptr); - - auto args = slice_make(temporary_allocator(), 4); - args[0] = cg_emit_transmute(p, map_ptr, t_raw_map_ptr); - args[1] = cg_builtin_map_info(p, map_type); - args[2] = hash; - args[3] = key_ptr; - - ptr = cg_emit_runtime_call(p, "__dynamic_map_get", args); - - return cg_emit_conv(p, ptr, alloc_type_pointer(map_type->Map.value)); -} - - -gb_internal void cg_internal_dynamic_map_set(cgProcedure *p, cgValue const &map_ptr, Type *map_type, - cgValue const &map_key, cgValue const &map_value, Ast *node) { - TEMPORARY_ALLOCATOR_GUARD(); - - map_type = base_type(map_type); - GB_ASSERT(map_type->kind == Type_Map); - - cgValue key_ptr = {}; - cgValue hash = cg_gen_map_key_hash(p, map_ptr, map_key, &key_ptr); - - cgValue v = cg_emit_conv(p, map_value, map_type->Map.value); - cgValue value_ptr = cg_address_from_load_or_generate_local(p, v); - - auto args = slice_make(temporary_allocator(), 6); - args[0] = cg_emit_conv(p, map_ptr, t_raw_map_ptr); - args[1] = cg_builtin_map_info(p, map_type); - args[2] = hash; - args[3] = cg_emit_conv(p, key_ptr, t_rawptr); - args[4] = cg_emit_conv(p, value_ptr, t_rawptr); - args[5] = cg_emit_source_code_location_as_global(p, node); - cg_emit_runtime_call(p, "__dynamic_map_set", args); -} - - - - -gb_internal cgValue cg_build_addr_ptr(cgProcedure *p, Ast *expr) { - cgAddr addr = cg_build_addr(p, expr); - return cg_addr_get_ptr(p, addr); -} - -gb_internal cgAddr cg_build_addr_internal(cgProcedure *p, Ast *expr); -gb_internal cgAddr cg_build_addr(cgProcedure *p, Ast *expr) { - expr = unparen_expr(expr); - - // IMPORTANT NOTE(bill): - // Selector Call Expressions (foo->bar(...)) - // must only evaluate `foo` once as it gets transformed into - // `foo.bar(foo, ...)` - // And if `foo` is a procedure call or something more complex, storing the value - // once is a very good idea - // If a stored value is found, it must be removed from the cache - if (expr->state_flags & StateFlag_SelectorCallExpr) { - // lbAddr *pp = map_get(&p->selector_addr, expr); - // if (pp != nullptr) { - // lbAddr res = *pp; - // map_remove(&p->selector_addr, expr); - // return res; - // } - } - cgAddr addr = cg_build_addr_internal(p, expr); - if (expr->state_flags & StateFlag_SelectorCallExpr) { - // map_set(&p->selector_addr, expr, addr); - } - return addr; -} - -gb_internal cgAddr cg_build_addr_index_expr(cgProcedure *p, Ast *expr) { - ast_node(ie, IndexExpr, expr); - - Type *t = base_type(type_of_expr(ie->expr)); - - bool deref = is_type_pointer(t); - t = base_type(type_deref(t)); - if (is_type_soa_struct(t)) { - cgValue val = cg_build_addr_ptr(p, ie->expr); - if (deref) { - val = cg_emit_load(p, val); - } - - cgValue index = cg_build_expr(p, ie->index); - return cg_addr_soa_variable(val, index, ie->index); - } - - if (ie->expr->tav.mode == Addressing_SoaVariable) { - GB_PANIC("TODO(bill): #soa"); - // // SOA Structures for slices/dynamic arrays - // GB_ASSERT(is_type_pointer(type_of_expr(ie->expr))); - - // lbValue field = lb_build_expr(p, ie->expr); - // lbValue index = lb_build_expr(p, ie->index); - - - // if (!build_context.no_bounds_check) { - // // TODO HACK(bill): Clean up this hack to get the length for bounds checking - // // GB_ASSERT(LLVMIsALoadInst(field.value)); - - // // lbValue a = {}; - // // a.value = LLVMGetOperand(field.value, 0); - // // a.type = alloc_type_pointer(field.type); - - // // irInstr *b = &a->Instr; - // // GB_ASSERT(b->kind == irInstr_StructElementPtr); - // // lbValue base_struct = b->StructElementPtr.address; - - // // GB_ASSERT(is_type_soa_struct(type_deref(ir_type(base_struct)))); - // // lbValue len = ir_soa_struct_len(p, base_struct); - // // lb_emit_bounds_check(p, ast_token(ie->index), index, len); - // } - // lbValue val = lb_emit_ptr_offset(p, field, index); - // return lb_addr(val); - } - - GB_ASSERT_MSG(is_type_indexable(t), "%s %s", type_to_string(t), expr_to_string(expr)); - - if (is_type_map(t)) { - cgAddr map_addr = cg_build_addr(p, ie->expr); - cgValue key = cg_build_expr(p, ie->index); - key = cg_emit_conv(p, key, t->Map.key); - - Type *result_type = type_of_expr(expr); - cgValue map_ptr = cg_addr_get_ptr(p, map_addr); - if (is_type_pointer(type_deref(map_ptr.type))) { - map_ptr = cg_emit_load(p, map_ptr); - } - return cg_addr_map(map_ptr, key, t, result_type); - } - - switch (t->kind) { - case Type_Array: { - cgValue array = {}; - array = cg_build_addr_ptr(p, ie->expr); - if (deref) { - array = cg_emit_load(p, array); - } - cgValue index = cg_build_expr(p, ie->index); - index = cg_emit_conv(p, index, t_int); - cgValue elem = cg_emit_array_ep(p, array, index); - - auto index_tv = type_and_value_of_expr(ie->index); - if (index_tv.mode != Addressing_Constant) { - // cgValue len = cg_const_int(p->module, t_int, t->Array.count); - // cg_emit_bounds_check(p, ast_token(ie->index), index, len); - } - return cg_addr(elem); - } - - case Type_EnumeratedArray: { - cgValue array = {}; - array = cg_build_addr_ptr(p, ie->expr); - if (deref) { - array = cg_emit_load(p, array); - } - - Type *index_type = t->EnumeratedArray.index; - - auto index_tv = type_and_value_of_expr(ie->index); - - cgValue index = {}; - if (compare_exact_values(Token_NotEq, *t->EnumeratedArray.min_value, exact_value_i64(0))) { - if (index_tv.mode == Addressing_Constant) { - ExactValue idx = exact_value_sub(index_tv.value, *t->EnumeratedArray.min_value); - index = cg_const_value(p, index_type, idx); - } else { - index = cg_emit_arith(p, Token_Sub, - cg_build_expr(p, ie->index), - cg_const_value(p, index_type, *t->EnumeratedArray.min_value), - index_type); - index = cg_emit_conv(p, index, t_int); - } - } else { - index = cg_emit_conv(p, cg_build_expr(p, ie->index), t_int); - } - - cgValue elem = cg_emit_array_ep(p, array, index); - - if (index_tv.mode != Addressing_Constant) { - // cgValue len = cg_const_int(p->module, t_int, t->EnumeratedArray.count); - // cg_emit_bounds_check(p, ast_token(ie->index), index, len); - } - return cg_addr(elem); - } - - case Type_Slice: { - cgValue slice = {}; - slice = cg_build_expr(p, ie->expr); - if (deref) { - slice = cg_emit_load(p, slice); - } - cgValue elem = cg_builtin_raw_data(p, slice); - cgValue index = cg_emit_conv(p, cg_build_expr(p, ie->index), t_int); - // cgValue len = cg_builtin_len(p, slice); - // cg_emit_bounds_check(p, ast_token(ie->index), index, len); - cgValue v = cg_emit_ptr_offset(p, elem, index); - v.type = alloc_type_pointer(type_deref(v.type, true)); - return cg_addr(v); - } - - case Type_MultiPointer: { - cgValue multi_ptr = {}; - multi_ptr = cg_build_expr(p, ie->expr); - if (deref) { - multi_ptr = cg_emit_load(p, multi_ptr); - } - cgValue index = cg_build_expr(p, ie->index); - index = cg_emit_conv(p, index, t_int); - - cgValue v = cg_emit_ptr_offset(p, multi_ptr, index); - v.type = alloc_type_pointer(type_deref(v.type, true)); - return cg_addr(v); - } - - case Type_RelativeMultiPointer: { - cgValue multi_ptr = {}; - multi_ptr = cg_build_expr(p, ie->expr); - if (deref) { - multi_ptr = cg_emit_load(p, multi_ptr); - } - cgValue index = cg_build_expr(p, ie->index); - index = cg_emit_conv(p, index, t_int); - - cgValue v = cg_emit_ptr_offset(p, multi_ptr, index); - v.type = alloc_type_pointer(type_deref(v.type, true)); - return cg_addr(v); - } - - case Type_DynamicArray: { - cgValue dynamic_array = {}; - dynamic_array = cg_build_expr(p, ie->expr); - if (deref) { - dynamic_array = cg_emit_load(p, dynamic_array); - } - cgValue elem = cg_builtin_raw_data(p, dynamic_array); - cgValue index = cg_emit_conv(p, cg_build_expr(p, ie->index), t_int); - // cgValue len = cg_dynamic_array_len(p, dynamic_array); - // cg_emit_bounds_check(p, ast_token(ie->index), index, len); - cgValue v = cg_emit_ptr_offset(p, elem, index); - v.type = alloc_type_pointer(type_deref(v.type, true)); - return cg_addr(v); - } - - case Type_Matrix: { - GB_PANIC("TODO(bill): matrix"); - // lbValue matrix = {}; - // matrix = lb_build_addr_ptr(p, ie->expr); - // if (deref) { - // matrix = lb_emit_load(p, matrix); - // } - // lbValue index = lb_build_expr(p, ie->index); - // index = lb_emit_conv(p, index, t_int); - // lbValue elem = lb_emit_matrix_ep(p, matrix, lb_const_int(p->module, t_int, 0), index); - // elem = lb_emit_conv(p, elem, alloc_type_pointer(type_of_expr(expr))); - - // auto index_tv = type_and_value_of_expr(ie->index); - // if (index_tv.mode != Addressing_Constant) { - // lbValue len = lb_const_int(p->module, t_int, t->Matrix.column_count); - // lb_emit_bounds_check(p, ast_token(ie->index), index, len); - // } - // return lb_addr(elem); - } - - - case Type_Basic: { // Basic_string - cgValue str; - cgValue elem; - cgValue len; - cgValue index; - - str = cg_build_expr(p, ie->expr); - if (deref) { - str = cg_emit_load(p, str); - } - elem = cg_builtin_raw_data(p, str); - len = cg_builtin_len(p, str); - - index = cg_emit_conv(p, cg_build_expr(p, ie->index), t_int); - // cg_emit_bounds_check(p, ast_token(ie->index), index, len); - - cgValue v = cg_emit_ptr_offset(p, elem, index); - v.type = alloc_type_pointer(type_deref(v.type, true)); - return cg_addr(v); - } - } - return {}; -} - -gb_internal cgAddr cg_build_addr_internal(cgProcedure *p, Ast *expr) { - switch (expr->kind) { - case_ast_node(i, Implicit, expr); - cgAddr v = {}; - switch (i->kind) { - case Token_context: - v = cg_find_or_generate_context_ptr(p); - break; - } - - GB_ASSERT(v.addr.node != nullptr); - return v; - case_end; - - case_ast_node(i, Ident, expr); - if (is_blank_ident(expr)) { - cgAddr val = {}; - return val; - } - String name = i->token.string; - Entity *e = entity_of_node(expr); - return cg_build_addr_from_entity(p, e, expr); - case_end; - - case_ast_node(de, DerefExpr, expr); - Type *t = type_of_expr(de->expr); - if (is_type_relative_pointer(t)) { - cgAddr addr = cg_build_addr(p, de->expr); - addr.relative.deref = true; - return addr; - } else if (is_type_soa_pointer(t)) { - cgValue value = cg_build_expr(p, de->expr); - cgValue ptr = cg_emit_struct_ev(p, value, 0); - cgValue idx = cg_emit_struct_ev(p, value, 1); - return cg_addr_soa_variable(ptr, idx, nullptr); - } - cgValue addr = cg_build_expr(p, de->expr); - return cg_addr(addr); - case_end; - - case_ast_node(ie, IndexExpr, expr); - return cg_build_addr_index_expr(p, expr); - case_end; - - case_ast_node(se, SliceExpr, expr); - return cg_build_addr_slice_expr(p, expr); - case_end; - - case_ast_node(se, SelectorExpr, expr); - Ast *sel_node = unparen_expr(se->selector); - if (sel_node->kind != Ast_Ident) { - GB_PANIC("Unsupported selector expression"); - } - String selector = sel_node->Ident.token.string; - TypeAndValue tav = type_and_value_of_expr(se->expr); - - if (tav.mode == Addressing_Invalid) { - // NOTE(bill): Imports - Entity *imp = entity_of_node(se->expr); - if (imp != nullptr) { - GB_ASSERT(imp->kind == Entity_ImportName); - } - return cg_build_addr(p, unparen_expr(se->selector)); - } - - - Type *type = base_type(tav.type); - if (tav.mode == Addressing_Type) { // Addressing_Type - Selection sel = lookup_field(tav.type, selector, true); - if (sel.pseudo_field) { - GB_ASSERT(sel.entity->kind == Entity_Procedure); - return cg_addr(cg_find_value_from_entity(p->module, sel.entity)); - } - GB_PANIC("Unreachable %.*s", LIT(selector)); - } - - if (se->swizzle_count > 0) { - Type *array_type = base_type(type_deref(tav.type)); - GB_ASSERT(array_type->kind == Type_Array); - u8 swizzle_count = se->swizzle_count; - u8 swizzle_indices_raw = se->swizzle_indices; - u8 swizzle_indices[4] = {}; - for (u8 i = 0; i < swizzle_count; i++) { - u8 index = swizzle_indices_raw>>(i*2) & 3; - swizzle_indices[i] = index; - } - cgValue a = {}; - if (is_type_pointer(tav.type)) { - a = cg_build_expr(p, se->expr); - } else { - cgAddr addr = cg_build_addr(p, se->expr); - a = cg_addr_get_ptr(p, addr); - } - - GB_ASSERT(is_type_array(expr->tav.type)); - GB_PANIC("TODO(bill): cg_addr_swizzle"); - // return cg_addr_swizzle(a, expr->tav.type, swizzle_count, swizzle_indices); - } - - Selection sel = lookup_field(type, selector, false); - GB_ASSERT(sel.entity != nullptr); - if (sel.pseudo_field) { - GB_ASSERT(sel.entity->kind == Entity_Procedure); - Entity *e = entity_of_node(sel_node); - return cg_addr(cg_find_value_from_entity(p->module, e)); - } - - { - cgAddr addr = cg_build_addr(p, se->expr); - if (addr.kind == cgAddr_Map) { - cgValue v = cg_addr_load(p, addr); - cgValue a = cg_address_from_load_or_generate_local(p, v); - a = cg_emit_deep_field_gep(p, a, sel); - return cg_addr(a); - } else if (addr.kind == cgAddr_Context) { - GB_ASSERT(sel.index.count > 0); - if (addr.ctx.sel.index.count >= 0) { - sel = selection_combine(addr.ctx.sel, sel); - } - addr.ctx.sel = sel; - addr.kind = cgAddr_Context; - return addr; - } else if (addr.kind == cgAddr_SoaVariable) { - cgValue index = addr.soa.index; - i64 first_index = sel.index[0]; - Selection sub_sel = sel; - sub_sel.index.data += 1; - sub_sel.index.count -= 1; - - cgValue arr = cg_emit_struct_ep(p, addr.addr, first_index); - - Type *t = base_type(type_deref(addr.addr.type)); - GB_ASSERT(is_type_soa_struct(t)); - - // TODO(bill): bounds checking for soa variable - // if (addr.soa.index_expr != nullptr && (!cg_is_const(addr.soa.index) || t->Struct.soa_kind != StructSoa_Fixed)) { - // cgValue len = cg_soa_struct_len(p, addr.addr); - // cg_emit_bounds_check(p, ast_token(addr.soa.index_expr), addr.soa.index, len); - // } - - cgValue item = {}; - - if (t->Struct.soa_kind == StructSoa_Fixed) { - item = cg_emit_array_ep(p, arr, index); - } else { - item = cg_emit_ptr_offset(p, cg_emit_load(p, arr), index); - } - if (sub_sel.index.count > 0) { - item = cg_emit_deep_field_gep(p, item, sub_sel); - } - item.type = alloc_type_pointer(type_deref(item.type, true)); - return cg_addr(item); - } else if (addr.kind == cgAddr_Swizzle) { - GB_ASSERT(sel.index.count > 0); - // NOTE(bill): just patch the index in place - sel.index[0] = addr.swizzle.indices[sel.index[0]]; - } else if (addr.kind == cgAddr_SwizzleLarge) { - GB_ASSERT(sel.index.count > 0); - // NOTE(bill): just patch the index in place - sel.index[0] = addr.swizzle.indices[sel.index[0]]; - } - - cgValue a = cg_addr_get_ptr(p, addr); - a = cg_emit_deep_field_gep(p, a, sel); - return cg_addr(a); - } - case_end; - - case_ast_node(ce, CallExpr, expr); - cgValue res = cg_build_expr(p, expr); - switch (res.kind) { - case cgValue_Value: - return cg_addr(cg_address_from_load_or_generate_local(p, res)); - case cgValue_Addr: - return cg_addr(res); - case cgValue_Multi: - GB_PANIC("cannot address a multi-valued expression"); - break; - } - case_end; - - case_ast_node(cl, CompoundLit, expr); - return cg_build_addr_compound_lit(p, expr); - case_end; - - } - - TokenPos token_pos = ast_token(expr).pos; - GB_PANIC("Unexpected address expression\n" - "\tAst: %.*s @ " - "%s\n", - LIT(ast_strings[expr->kind]), - token_pos_to_string(token_pos)); - - return {}; -} \ No newline at end of file diff --git a/src/tilde_proc.cpp b/src/tilde_proc.cpp deleted file mode 100644 index 8e9b80144..000000000 --- a/src/tilde_proc.cpp +++ /dev/null @@ -1,1327 +0,0 @@ -gb_internal TB_FunctionPrototype *cg_procedure_type_as_prototype(cgModule *m, Type *type) { - GB_ASSERT(is_type_proc(type)); - mutex_lock(&m->proc_proto_mutex); - defer (mutex_unlock(&m->proc_proto_mutex)); - - if (type->kind == Type_Named) { - type = base_type(type); - } - TB_FunctionPrototype **found = map_get(&m->proc_proto_map, type); - if (found) { - return *found; - } - - TB_DebugType *dbg = cg_debug_type_for_proc(m, type); - TB_FunctionPrototype *proto = tb_prototype_from_dbg(m->mod, dbg); - - map_set(&m->proc_proto_map, type, proto); - return proto; -} - -gb_internal cgProcedure *cg_procedure_create(cgModule *m, Entity *entity, bool ignore_body) { - GB_ASSERT(entity != nullptr); - GB_ASSERT(entity->kind == Entity_Procedure); - if (!entity->Procedure.is_foreign) { - if ((entity->flags & EntityFlag_ProcBodyChecked) == 0) { - GB_PANIC("%.*s :: %s (was parapoly: %d %d)", LIT(entity->token.string), type_to_string(entity->type), is_type_polymorphic(entity->type, true), is_type_polymorphic(entity->type, false)); - } - } - - String link_name = cg_get_entity_name(m, entity); - - cgProcedure *p = nullptr; - { - StringHashKey key = string_hash_string(link_name); - cgValue *found = string_map_get(&m->members, key); - if (found) { - cg_add_entity(m, entity, *found); - rw_mutex_lock(&m->values_mutex); - p = string_map_must_get(&m->procedures, key); - rw_mutex_unlock(&m->values_mutex); - if (!ignore_body && p->func != nullptr) { - return nullptr; - } - } - } - - if (p == nullptr) { - p = gb_alloc_item(permanent_allocator(), cgProcedure); - } - - p->module = m; - p->entity = entity; - p->name = link_name; - - DeclInfo *decl = entity->decl_info; - - ast_node(pl, ProcLit, decl->proc_lit); - Type *pt = base_type(entity->type); - GB_ASSERT(pt->kind == Type_Proc); - - p->type = entity->type; - p->type_expr = decl->type_expr; - p->body = pl->body; - p->inlining = pl->inlining; - p->is_foreign = entity->Procedure.is_foreign; - p->is_export = entity->Procedure.is_export; - p->is_entry_point = false; - p->split_returns_index = -1; - - gbAllocator a = heap_allocator(); - p->children.allocator = a; - - p->defer_stack.allocator = a; - p->scope_stack.allocator = a; - p->context_stack.allocator = a; - - p->control_regions.allocator = a; - p->branch_regions.allocator = a; - - map_init(&p->variable_map); - map_init(&p->soa_values_map); - - TB_Linkage linkage = TB_LINKAGE_PRIVATE; - if (p->is_export) { - linkage = TB_LINKAGE_PUBLIC; - } else if (p->is_foreign || ignore_body) { - if (ignore_body) { - linkage = TB_LINKAGE_PUBLIC; - } - p->symbol = cast(TB_Symbol *)tb_extern_create(m->mod, link_name.len, cast(char const *)link_name.text, TB_EXTERNAL_SO_LOCAL); - } - if (p->name == "main") { - // TODO(bill): figure out when this should be public or not - linkage = TB_LINKAGE_PUBLIC; - } - - if (p->symbol == nullptr) { - p->func = tb_function_create(m->mod, link_name.len, cast(char const *)link_name.text, linkage); - - p->debug_type = cg_debug_type_for_proc(m, p->type); - p->proto = tb_prototype_from_dbg(m->mod, p->debug_type); - - p->symbol = cast(TB_Symbol *)p->func; - } - - p->value = cg_value(p->symbol, p->type); - - cg_add_symbol(m, entity, p->symbol); - cg_add_entity(m, entity, p->value); - cg_add_member(m, p->name, p->value); - cg_add_procedure_value(m, p); - - - return p; -} - -gb_internal cgProcedure *cg_procedure_create_dummy(cgModule *m, String const &link_name, Type *type) { - auto *prev_found = string_map_get(&m->members, link_name); - GB_ASSERT_MSG(prev_found == nullptr, "failed to create dummy procedure for: %.*s", LIT(link_name)); - - cgProcedure *p = gb_alloc_item(permanent_allocator(), cgProcedure); - - p->module = m; - p->name = link_name; - - p->type = type; - p->type_expr = nullptr; - p->body = nullptr; - p->tags = 0; - p->inlining = ProcInlining_none; - p->is_foreign = false; - p->is_export = false; - p->is_entry_point = false; - p->split_returns_index = -1; - - gbAllocator a = heap_allocator(); - p->children.allocator = a; - - p->defer_stack.allocator = a; - p->scope_stack.allocator = a; - p->context_stack.allocator = a; - - p->control_regions.allocator = a; - p->branch_regions.allocator = a; - - map_init(&p->variable_map); - map_init(&p->soa_values_map); - - TB_Linkage linkage = TB_LINKAGE_PRIVATE; - - p->func = tb_function_create(m->mod, link_name.len, cast(char const *)link_name.text, linkage); - - p->debug_type = cg_debug_type_for_proc(m, p->type); - p->proto = tb_prototype_from_dbg(m->mod, p->debug_type); - - p->symbol = cast(TB_Symbol *)p->func; - - cgValue proc_value = cg_value(p->symbol, p->type); - cg_add_member(m, p->name, proc_value); - cg_add_procedure_value(m, p); - - return p; -} - -gb_internal cgProcedure *cg_procedure_generate_anonymous(cgModule *m, Ast *expr, cgProcedure *parent) { - expr = unparen_expr(expr); - ast_node(pl, ProcLit, expr); - - mutex_lock(&m->anonymous_proc_lits_mutex); - defer (mutex_unlock(&m->anonymous_proc_lits_mutex)); - - cgProcedure **found = map_get(&m->anonymous_proc_lits_map, expr); - if (found) { - return *found; - } - - TokenPos pos = ast_token(expr).pos; - - // NOTE(bill): Generate a new name - // parent$count - - String prefix_name = str_lit("proc_lit"); - if (parent) { - prefix_name = parent->name; - } - - isize name_len = prefix_name.len + 6 + 11; - char *name_text = gb_alloc_array(permanent_allocator(), char, name_len); - - static std::atomic name_id; - name_len = gb_snprintf(name_text, name_len, "%.*s$anon-%d", LIT(prefix_name), 1+name_id.fetch_add(1)); - String name = make_string((u8 *)name_text, name_len-1); - - Type *type = type_of_expr(expr); - - GB_ASSERT(pl->decl->entity == nullptr); - Token token = {}; - token.pos = ast_token(expr).pos; - token.kind = Token_Ident; - token.string = name; - Entity *e = alloc_entity_procedure(nullptr, token, type, pl->tags); - e->file = expr->file(); - - // NOTE(bill): this is to prevent a race condition since these procedure literals can be created anywhere at any time - e->decl_info = pl->decl; - pl->decl->entity = e; - e->flags |= EntityFlag_ProcBodyChecked; - - cgProcedure *p = cg_procedure_create(m, e); - - map_set(&m->anonymous_proc_lits_map, expr, p); - - if (parent != nullptr) { - array_add(&parent->children, p); - } - - cg_add_procedure_to_queue(p); - return p; - -} - -gb_internal void cg_procedure_begin(cgProcedure *p) { - if (p == nullptr || p->func == nullptr) { - return; - } - - TB_ModuleSectionHandle section = tb_module_get_text(p->module->mod); - tb_function_set_prototype(p->func, section, p->proto, cg_arena()); - - if (p->body == nullptr) { - return; - } - - - DeclInfo *decl = decl_info_of_entity(p->entity); - if (decl != nullptr) { - for_array(i, decl->labels) { - BlockLabel bl = decl->labels[i]; - cgBranchRegions bb = {bl.label, nullptr, nullptr}; - array_add(&p->branch_regions, bb); - } - } - - GB_ASSERT(p->type->kind == Type_Proc); - TypeProc *pt = &p->type->Proc; - bool is_odin_like_cc = is_calling_convention_odin(pt->calling_convention); - int param_index = 0; - int param_count = p->proto->param_count; - - if (pt->results) { - Type *result_type = nullptr; - if (is_odin_like_cc) { - result_type = pt->results->Tuple.variables[pt->results->Tuple.variables.count-1]->type; - } else { - result_type = pt->results; - } - TB_DebugType *debug_type = cg_debug_type(p->module, result_type); - TB_PassingRule rule = tb_get_passing_rule_from_dbg(p->module->mod, debug_type, true); - if (rule == TB_PASSING_INDIRECT) { - p->return_by_ptr = true; - param_index++; - } - } - - if (pt->params != nullptr) for (Entity *e : pt->params->Tuple.variables) { - if (e->kind != Entity_Variable) { - continue; - } - - GB_ASSERT_MSG(param_index < param_count, "%d < %d %.*s :: %s", param_index, param_count, LIT(p->name), type_to_string(p->type)); - - TB_Node *param_ptr = nullptr; - - TB_CharUnits size = cast(TB_CharUnits)type_size_of(e->type); - TB_CharUnits align = cast(TB_CharUnits)type_align_of(e->type); - TB_DebugType *debug_type = cg_debug_type(p->module, e->type); - TB_PassingRule rule = tb_get_passing_rule_from_dbg(p->module->mod, debug_type, false); - switch (rule) { - case TB_PASSING_DIRECT: { - TB_Node *param = tb_inst_param(p->func, param_index++); - param_ptr = tb_inst_local(p->func, size, align); - tb_inst_store(p->func, param->dt, param_ptr, param, align, false); - } break; - case TB_PASSING_INDIRECT: - // TODO(bill): does this need a copy? for non-odin calling convention stuff? - param_ptr = tb_inst_param(p->func, param_index++); - break; - case TB_PASSING_IGNORE: - continue; - } - - GB_ASSERT(param_ptr->dt.type == TB_PTR); - - cgValue local = cg_value(param_ptr, alloc_type_pointer(e->type)); - - if (e != nullptr && e->token.string.len > 0 && e->token.string != "_") { - // NOTE(bill): for debugging purposes only - String name = e->token.string; - TB_DebugType *param_debug_type = debug_type; - TB_Node * param_ptr_to_use = param_ptr; - if (rule == TB_PASSING_INDIRECT) { - // HACK TODO(bill): this is just to get the debug information - TB_CharUnits ptr_size = cast(TB_CharUnits)build_context.ptr_size; - TB_Node *dummy_param = tb_inst_local(p->func, ptr_size, ptr_size); - tb_inst_store(p->func, TB_TYPE_PTR, dummy_param, param_ptr, ptr_size, false); - param_ptr_to_use = dummy_param; - param_debug_type = tb_debug_create_ptr(p->module->mod, param_debug_type); - } - tb_function_attrib_variable( - p->func, - param_ptr_to_use, - nullptr, // parent - name.len, cast(char const *)name.text, - param_debug_type - ); - } - cgAddr addr = cg_addr(local); - if (e) { - map_set(&p->variable_map, e, addr); - } - } - - if (is_odin_like_cc) { - p->split_returns_index = param_index; - } - - if (pt->calling_convention == ProcCC_Odin) { - // NOTE(bill): Push context on to stack from implicit parameter - - String name = str_lit("__.context_ptr"); - - Entity *e = alloc_entity_param(nullptr, make_token_ident(name), t_context_ptr, false, false); - e->flags |= EntityFlag_NoAlias; - - TB_Node *param_ptr = tb_inst_param(p->func, param_count-1); - cgValue local = cg_value(param_ptr, t_context_ptr); - cgAddr addr = cg_addr(local); - map_set(&p->variable_map, e, addr); - - - cgContextData *cd = array_add_and_get(&p->context_stack); - cd->ctx = addr; - cd->scope_index = -1; - cd->uses = +1; // make sure it has been used already - } - - if (pt->has_named_results) { - auto const &results = pt->results->Tuple.variables; - for_array(i, results) { - Entity *e = results[i]; - GB_ASSERT(e->kind == Entity_Variable); - - if (e->token.string == "") { - continue; - } - GB_ASSERT(!is_blank_ident(e->token)); - - cgAddr res = cg_add_local(p, e->type, e, true); - - if (e->Variable.param_value.kind != ParameterValue_Invalid) { - cgValue c = cg_handle_param_value(p, e->type, e->Variable.param_value, e->token.pos); - cg_addr_store(p, res, c); - } - } - } -} - - -gb_internal WORKER_TASK_PROC(cg_procedure_compile_worker_proc) { - cgProcedure *p = cast(cgProcedure *)data; - - TB_Passes *opt = tb_pass_enter(p->func, cg_arena()); - defer (tb_pass_exit(opt)); - - // optimization passes - if (false) { - tb_pass_peephole(opt, TB_PEEPHOLE_ALL); - tb_pass_mem2reg(opt); - tb_pass_peephole(opt, TB_PEEPHOLE_ALL); - } - - bool emit_asm = false; - if ( - // string_starts_with(p->name, str_lit("runtime@_windows_default_alloc_or_resize")) || - false - ) { - emit_asm = true; - } - - // emit ir - if ( - // string_starts_with(p->name, str_lit("main@")) || - false - ) { // IR Printing - TB_Arena *arena = cg_arena(); - TB_Passes *passes = tb_pass_enter(p->func, arena); - defer (tb_pass_exit(passes)); - - tb_pass_print(passes); - fprintf(stdout, "\n"); - fflush(stdout); - } - if (false) { // GraphViz printing - tb_pass_print_dot(opt, tb_default_print_callback, stdout); - } - - // compile - TB_FunctionOutput *output = tb_pass_codegen(opt, emit_asm); - if (emit_asm) { - tb_output_print_asm(output, stdout); - fprintf(stdout, "\n"); - fflush(stdout); - } - - return 0; -} - -gb_internal void cg_procedure_end(cgProcedure *p) { - if (p == nullptr || p->func == nullptr) { - return; - } - if (tb_inst_get_control(p->func)) { - if (p->type->Proc.result_count == 0) { - tb_inst_ret(p->func, 0, nullptr); - } else { - tb_inst_unreachable(p->func); - } - } - - if (p->module->do_threading) { - thread_pool_add_task(cg_procedure_compile_worker_proc, p); - } else { - cg_procedure_compile_worker_proc(p); - } -} - -gb_internal void cg_procedure_generate(cgProcedure *p) { - if (p->body == nullptr) { - return; - } - - cg_procedure_begin(p); - cg_build_stmt(p, p->body); - cg_procedure_end(p); -} - -gb_internal void cg_build_nested_proc(cgProcedure *p, AstProcLit *pd, Entity *e) { - GB_ASSERT(pd->body != nullptr); - cgModule *m = p->module; - auto *min_dep_set = &m->info->minimum_dependency_set; - - if (ptr_set_exists(min_dep_set, e) == false) { - // NOTE(bill): Nothing depends upon it so doesn't need to be built - return; - } - - // NOTE(bill): Generate a new name - // parent.name-guid - String original_name = e->token.string; - String pd_name = original_name; - if (e->Procedure.link_name.len > 0) { - pd_name = e->Procedure.link_name; - } - - - isize name_len = p->name.len + 1 + pd_name.len + 1 + 10 + 1; - char *name_text = gb_alloc_array(permanent_allocator(), char, name_len); - - i32 guid = cast(i32)p->children.count; - name_len = gb_snprintf(name_text, name_len, "%.*s" ABI_PKG_NAME_SEPARATOR "%.*s-%d", LIT(p->name), LIT(pd_name), guid); - String name = make_string(cast(u8 *)name_text, name_len-1); - - e->Procedure.link_name = name; - - cgProcedure *nested_proc = cg_procedure_create(p->module, e); - e->cg_procedure = nested_proc; - - cgValue value = nested_proc->value; - - cg_add_entity(m, e, value); - array_add(&p->children, nested_proc); - cg_add_procedure_to_queue(nested_proc); -} - - - - - -gb_internal cgValue cg_find_procedure_value_from_entity(cgModule *m, Entity *e) { - GB_ASSERT(is_type_proc(e->type)); - e = strip_entity_wrapping(e); - GB_ASSERT(e != nullptr); - GB_ASSERT(e->kind == Entity_Procedure); - - cgValue *found = nullptr; - rw_mutex_shared_lock(&m->values_mutex); - found = map_get(&m->values, e); - rw_mutex_shared_unlock(&m->values_mutex); - if (found) { - GB_ASSERT(found->node != nullptr); - return *found; - } - - GB_PANIC("Error in: %s, missing procedure %.*s\n", token_pos_to_string(e->token.pos), LIT(e->token.string)); - return {}; -} - - - -gb_internal cgValue cg_build_call_expr_internal(cgProcedure *p, Ast *expr); -gb_internal cgValue cg_build_call_expr(cgProcedure *p, Ast *expr) { - expr = unparen_expr(expr); - ast_node(ce, CallExpr, expr); - - cgValue res = cg_build_call_expr_internal(p, expr); - - if (ce->optional_ok_one) { // TODO(bill): Minor hack for #optional_ok procedures - GB_ASSERT(res.kind == cgValue_Multi); - GB_ASSERT(res.multi->values.count == 2); - return res.multi->values[0]; - } - return res; -} - -gb_internal cgValue cg_emit_call(cgProcedure * p, cgValue value, Slice const &args) { - if (value.kind == cgValue_Symbol) { - value = cg_value(tb_inst_get_symbol_address(p->func, value.symbol), value.type); - } - GB_ASSERT(value.kind == cgValue_Value); - TEMPORARY_ALLOCATOR_GUARD(); - - TB_Module *m = p->module->mod; - - - Type *type = base_type(value.type); - GB_ASSERT(type->kind == Type_Proc); - TypeProc *pt = &type->Proc; - gb_unused(pt); - - TB_FunctionPrototype *proto = cg_procedure_type_as_prototype(p->module, type); - TB_Node *target = value.node; - auto params = slice_make(temporary_allocator(), proto->param_count); - - - GB_ASSERT(build_context.metrics.os == TargetOs_windows); - // TODO(bill): Support more than Win64 ABI - - bool is_odin_like_cc = is_calling_convention_odin(pt->calling_convention); - - bool return_is_indirect = false; - - Slice result_entities = {}; - Slice param_entities = {}; - if (pt->results) { - result_entities = pt->results->Tuple.variables; - } - if (pt->params) { - param_entities = pt->params->Tuple.variables; - } - - isize param_index = 0; - if (pt->result_count != 0) { - Type *return_type = nullptr; - if (is_odin_like_cc) { - return_type = result_entities[result_entities.count-1]->type; - } else { - return_type = pt->results; - } - TB_DebugType *dbg = cg_debug_type(p->module, return_type); - TB_PassingRule rule = tb_get_passing_rule_from_dbg(m, dbg, true); - if (rule == TB_PASSING_INDIRECT) { - return_is_indirect = true; - TB_CharUnits size = cast(TB_CharUnits)type_size_of(return_type); - TB_CharUnits align = cast(TB_CharUnits)gb_max(type_align_of(return_type), 16); - TB_Node *local = tb_inst_local(p->func, size, align); - tb_inst_memzero(p->func, local, tb_inst_uint(p->func, TB_TYPE_INT, size), align); - params[param_index++] = local; - } - } - isize param_entity_index = 0; - for_array(i, args) { - Entity *param_entity = nullptr; - do { - param_entity = param_entities[param_entity_index++]; - } while (param_entity->kind != Entity_Variable); - Type *param_type = param_entity->type; - cgValue arg = args[i]; - arg = cg_emit_conv(p, arg, param_type); - arg = cg_flatten_value(p, arg); - - TB_Node *param = nullptr; - - TB_DebugType *dbg = cg_debug_type(p->module, param_type); - TB_PassingRule rule = tb_get_passing_rule_from_dbg(m, dbg, false); - switch (rule) { - case TB_PASSING_DIRECT: - GB_ASSERT(arg.kind == cgValue_Value); - param = arg.node; - break; - case TB_PASSING_INDIRECT: - { - cgValue arg_ptr = {}; - // indirect - if (is_odin_like_cc) { - arg_ptr = cg_address_from_load_or_generate_local(p, arg); - } else { - arg_ptr = cg_copy_value_to_ptr(p, arg, param_type, 16); - } - GB_ASSERT(arg_ptr.kind == cgValue_Value); - param = arg_ptr.node; - } - break; - case TB_PASSING_IGNORE: - continue; - } - - params[param_index++] = param; - } - - // Split returns - isize split_offset = -1; - if (is_odin_like_cc) { - split_offset = param_index; - for (isize i = 0; i < pt->result_count-1; i++) { - Type *result = result_entities[i]->type; - TB_CharUnits size = cast(TB_CharUnits)type_size_of(result); - TB_CharUnits align = cast(TB_CharUnits)gb_max(type_align_of(result), 16); - TB_Node *local = tb_inst_local(p->func, size, align); - // TODO(bill): Should this need to be zeroed any way? - tb_inst_memzero(p->func, local, tb_inst_uint(p->func, TB_TYPE_INT, size), align); - params[param_index++] = local; - } - } - - if (pt->calling_convention == ProcCC_Odin) { - cgValue ctx_ptr = cg_find_or_generate_context_ptr(p).addr; - GB_ASSERT(ctx_ptr.kind == cgValue_Value); - params[param_index++] = ctx_ptr.node; - } - GB_ASSERT_MSG(param_index == params.count, "%td vs %td\n %s %u %u", - param_index, params.count, - type_to_string(type), - proto->return_count, - proto->param_count); - - for (TB_Node *param : params) { - GB_ASSERT(param != nullptr); - } - - GB_ASSERT(target != nullptr); - TB_MultiOutput multi_output = tb_inst_call(p->func, proto, target, params.count, params.data); - gb_unused(multi_output); - - switch (pt->result_count) { - case 0: - return {}; - case 1: - if (return_is_indirect) { - return cg_lvalue_addr(params[0], pt->results->Tuple.variables[0]->type); - } else { - GB_ASSERT(multi_output.count == 1); - TB_Node *node = multi_output.single; - return cg_value(node, pt->results->Tuple.variables[0]->type); - } - } - - cgValueMulti *multi = gb_alloc_item(permanent_allocator(), cgValueMulti); - multi->values = slice_make(permanent_allocator(), pt->result_count); - - if (is_odin_like_cc) { - GB_ASSERT(split_offset >= 0); - for (isize i = 0; i < pt->result_count-1; i++) { - multi->values[i] = cg_lvalue_addr(params[split_offset+i], result_entities[i]->type); - } - - Type *end_type = result_entities[pt->result_count-1]->type; - if (return_is_indirect) { - multi->values[pt->result_count-1] = cg_lvalue_addr(params[0], end_type); - } else { - GB_ASSERT(multi_output.count == 1); - TB_DataType dt = cg_data_type(end_type); - TB_Node *res = multi_output.single; - if (res->dt.raw != dt.raw) { - // struct-like returns passed in registers - TB_CharUnits size = cast(TB_CharUnits)type_size_of(end_type); - TB_CharUnits align = cast(TB_CharUnits)type_align_of(end_type); - TB_Node *addr = tb_inst_local(p->func, size, align); - tb_inst_store(p->func, res->dt, addr, res, align, false); - multi->values[pt->result_count-1] = cg_lvalue_addr(addr, end_type); - } else { - multi->values[pt->result_count-1] = cg_value(res, end_type); - } - } - } else { - TB_Node *the_tuple = {}; - if (return_is_indirect) { - the_tuple = params[0]; - } else { - GB_ASSERT(multi_output.count == 1); - TB_Node *res = multi_output.single; - - // struct-like returns passed in registers - TB_CharUnits size = cast(TB_CharUnits)type_size_of(pt->results); - TB_CharUnits align = cast(TB_CharUnits)type_align_of(pt->results); - the_tuple = tb_inst_local(p->func, size, align); - tb_inst_store(p->func, res->dt, the_tuple, res, align, false); - } - for (isize i = 0; i < pt->result_count; i++) { - i64 offset = type_offset_of(pt->results, i, nullptr); - TB_Node *ptr = tb_inst_member_access(p->func, the_tuple, offset); - multi->values[i] = cg_lvalue_addr(ptr, result_entities[i]->type); - } - } - - return cg_value_multi(multi, pt->results); -} - -gb_internal cgValue cg_emit_runtime_call(cgProcedure *p, char const *name, Slice const &args) { - AstPackage *pkg = p->module->info->runtime_package; - Entity *e = scope_lookup_current(pkg->scope, make_string_c(name)); - cgValue value = cg_find_procedure_value_from_entity(p->module, e); - return cg_emit_call(p, value, args); -} - -gb_internal cgValue cg_handle_param_value(cgProcedure *p, Type *parameter_type, ParameterValue const ¶m_value, TokenPos const &pos) { - switch (param_value.kind) { - case ParameterValue_Constant: - if (is_type_constant_type(parameter_type)) { - auto res = cg_const_value(p, parameter_type, param_value.value); - return res; - } else { - ExactValue ev = param_value.value; - cgValue arg = {}; - Type *type = type_of_expr(param_value.original_ast_expr); - if (type != nullptr) { - arg = cg_const_value(p, type, ev); - } else { - arg = cg_const_value(p, parameter_type, param_value.value); - } - return cg_emit_conv(p, arg, parameter_type); - } - - case ParameterValue_Nil: - return cg_const_nil(p, parameter_type); - case ParameterValue_Location: - { - String proc_name = {}; - if (p->entity != nullptr) { - proc_name = p->entity->token.string; - } - return cg_emit_source_code_location_as_global(p, proc_name, pos); - } - case ParameterValue_Value: - return cg_build_expr(p, param_value.ast_value); - } - return cg_const_nil(p, parameter_type); -} - -gb_internal cgValue cg_build_call_expr_internal(cgProcedure *p, Ast *expr) { - ast_node(ce, CallExpr, expr); - - TypeAndValue tv = type_and_value_of_expr(expr); - - TypeAndValue proc_tv = type_and_value_of_expr(ce->proc); - AddressingMode proc_mode = proc_tv.mode; - if (proc_mode == Addressing_Type) { - GB_ASSERT(ce->args.count == 1); - cgValue x = cg_build_expr(p, ce->args[0]); - return cg_emit_conv(p, x, tv.type); - } - - Ast *proc_expr = unparen_expr(ce->proc); - if (proc_mode == Addressing_Builtin) { - Entity *e = entity_of_node(proc_expr); - BuiltinProcId id = BuiltinProc_Invalid; - if (e != nullptr) { - id = cast(BuiltinProcId)e->Builtin.id; - } else { - id = BuiltinProc_DIRECTIVE; - } - if (id == BuiltinProc___entry_point) { - if (p->module->info->entry_point) { - cgValue entry_point = cg_find_procedure_value_from_entity(p->module, p->module->info->entry_point); - GB_ASSERT(entry_point.node != nullptr); - cg_emit_call(p, entry_point, {}); - } - return {}; - } - - return cg_build_builtin(p, id, expr); - } - - // NOTE(bill): Regular call - cgValue value = {}; - - Entity *proc_entity = entity_of_node(proc_expr); - if (proc_entity != nullptr) { - if (proc_entity->flags & EntityFlag_Disabled) { - GB_ASSERT(tv.type == nullptr); - return {}; - } - } - - if (proc_expr->tav.mode == Addressing_Constant) { - ExactValue v = proc_expr->tav.value; - switch (v.kind) { - case ExactValue_Integer: - { - u64 u = big_int_to_u64(&v.value_integer); - cgValue x = cg_value(tb_inst_uint(p->func, TB_TYPE_PTR, u), t_rawptr); - value = cg_emit_conv(p, x, proc_expr->tav.type); - break; - } - case ExactValue_Pointer: - { - u64 u = cast(u64)v.value_pointer; - cgValue x = cg_value(tb_inst_uint(p->func, TB_TYPE_PTR, u), t_rawptr); - value = cg_emit_conv(p, x, proc_expr->tav.type); - break; - } - } - } - - if (value.node == nullptr) { - value = cg_build_expr(p, proc_expr); - } - if (value.kind == cgValue_Addr) { - value = cg_emit_load(p, value); - } - GB_ASSERT(value.kind == cgValue_Value); - GB_ASSERT(value.node != nullptr); - GB_ASSERT(is_type_proc(value.type)); - - TEMPORARY_ALLOCATOR_GUARD(); - - Type *proc_type_ = base_type(value.type); - GB_ASSERT(proc_type_->kind == Type_Proc); - TypeProc *pt = &proc_type_->Proc; - - GB_ASSERT(ce->split_args != nullptr); - - isize internal_param_count = 0; - if (pt->params) for (Entity *e : pt->params->Tuple.variables) { - if (e->kind == Entity_Variable) { - internal_param_count += 1; - } - } - GB_ASSERT(internal_param_count <= pt->param_count); - - auto args = array_make(temporary_allocator(), 0, internal_param_count); - - bool vari_expand = (ce->ellipsis.pos.line != 0); - bool is_c_vararg = pt->c_vararg; - - for_array(i, ce->split_args->positional) { - Entity *e = pt->params->Tuple.variables[i]; - if (e->kind == Entity_TypeName) { - continue; - } else if (e->kind == Entity_Constant) { - continue; - } - - GB_ASSERT(e->kind == Entity_Variable); - if (pt->variadic && pt->variadic_index == i) { - cgValue variadic_args = cg_const_nil(p, e->type); - auto variadic = slice(ce->split_args->positional, pt->variadic_index, ce->split_args->positional.count); - if (variadic.count != 0) { - // variadic call argument generation - Type *slice_type = e->type; - GB_ASSERT(slice_type->kind == Type_Slice); - - if (is_c_vararg) { - GB_ASSERT(!vari_expand); - - Type *elem_type = slice_type->Slice.elem; - - for (Ast *var_arg : variadic) { - cgValue arg = cg_build_expr(p, var_arg); - if (is_type_any(elem_type)) { - array_add(&args, cg_emit_conv(p, arg, default_type(arg.type))); - } else { - array_add(&args, cg_emit_conv(p, arg, elem_type)); - } - } - break; - } else if (vari_expand) { - GB_ASSERT(variadic.count == 1); - variadic_args = cg_build_expr(p, variadic[0]); - variadic_args = cg_emit_conv(p, variadic_args, slice_type); - } else { - Type *elem_type = slice_type->Slice.elem; - - auto var_args = array_make(temporary_allocator(), 0, variadic.count); - for (Ast *var_arg : variadic) { - cgValue v = cg_build_expr(p, var_arg); - cg_append_tuple_values(p, &var_args, v); - } - isize slice_len = var_args.count; - if (slice_len > 0) { - cgAddr slice = cg_add_local(p, slice_type, nullptr, true); - cgAddr base_array = cg_add_local(p, alloc_type_array(elem_type, slice_len), nullptr, true); - - for (isize i = 0; i < var_args.count; i++) { - cgValue addr = cg_emit_array_epi(p, base_array.addr, cast(i32)i); - cgValue var_arg = var_args[i]; - var_arg = cg_emit_conv(p, var_arg, elem_type); - cg_emit_store(p, addr, var_arg); - } - - cgValue base_elem = cg_emit_array_epi(p, base_array.addr, 0); - cgValue len = cg_const_int(p, t_int, slice_len); - cg_fill_slice(p, slice, base_elem, len); - - variadic_args = cg_addr_load(p, slice); - } - } - } - array_add(&args, variadic_args); - - break; - } else { - cgValue value = cg_build_expr(p, ce->split_args->positional[i]); - cg_append_tuple_values(p, &args, value); - } - } - - if (!is_c_vararg) { - array_resize(&args, internal_param_count); - } - - for (Ast *arg : ce->split_args->named) { - ast_node(fv, FieldValue, arg); - GB_ASSERT(fv->field->kind == Ast_Ident); - String name = fv->field->Ident.token.string; - gb_unused(name); - isize param_index = lookup_procedure_parameter(pt, name); - GB_ASSERT(param_index >= 0); - - cgValue value = cg_build_expr(p, fv->value); - GB_ASSERT(!is_type_tuple(value.type)); - args[param_index] = value; - } - - TokenPos pos = ast_token(ce->proc).pos; - - - if (pt->params != nullptr) { - isize min_count = internal_param_count; - if (is_c_vararg) { - min_count -= 1; - } - GB_ASSERT_MSG(args.count >= min_count, "in %.*s", LIT(p->name)); - isize arg_index = 0; - for_array(param_index, pt->params->Tuple.variables) { - Entity *e = pt->params->Tuple.variables[param_index]; - if (e->kind == Entity_TypeName) { - continue; - } else if (e->kind == Entity_Constant) { - continue; - } - GB_ASSERT(e->kind == Entity_Variable); - - if (pt->variadic && param_index == pt->variadic_index) { - if (!is_c_vararg && args[arg_index].node == nullptr) { - args[arg_index++] = cg_const_nil(p, e->type); - continue; - } - } - - cgValue arg = args[arg_index]; - if (arg.node == nullptr) { - GB_ASSERT(e->kind == Entity_Variable); - args[arg_index++] = cg_handle_param_value(p, e->type, e->Variable.param_value, pos); - } else { - args[arg_index++] = cg_emit_conv(p, arg, e->type); - } - } - } - - isize final_count = is_c_vararg ? args.count : internal_param_count; - auto call_args = slice(args, 0, final_count); - - return cg_emit_call(p, value, call_args); -} - - - -gb_internal cgValue cg_hasher_proc_value_for_type(cgProcedure *p, Type *type) { - cgProcedure *found = cg_hasher_proc_for_type(p->module, type); - return cg_value(tb_inst_get_symbol_address(p->func, found->symbol), found->type); -} - -gb_internal cgValue cg_equal_proc_value_for_type(cgProcedure *p, Type *type) { - cgProcedure *found = cg_equal_proc_for_type(p->module, type); - return cg_value(tb_inst_get_symbol_address(p->func, found->symbol), found->type); -} - - - -gb_internal cgProcedure *cg_equal_proc_for_type(cgModule *m, Type *type) { - type = base_type(type); - GB_ASSERT(is_type_comparable(type)); - - mutex_lock(&m->generated_procs_mutex); - defer (mutex_unlock(&m->generated_procs_mutex)); - - cgProcedure **found = map_get(&m->equal_procs, type); - if (found) { - return *found; - } - - static std::atomic proc_index; - - char buf[32] = {}; - isize n = gb_snprintf(buf, 32, "__$equal%u", 1+proc_index.fetch_add(1)); - char *str = gb_alloc_str_len(permanent_allocator(), buf, n-1); - String proc_name = make_string_c(str); - - - cgProcedure *p = cg_procedure_create_dummy(m, proc_name, t_equal_proc); - map_set(&m->equal_procs, type, p); - p->split_returns_index = 2; - - cg_procedure_begin(p); - - TB_Node *x = tb_inst_param(p->func, 0); - TB_Node *y = tb_inst_param(p->func, 1); - GB_ASSERT(x->dt.type == TB_PTR); - GB_ASSERT(y->dt.type == TB_PTR); - - TB_DataType ret_dt = TB_PROTOTYPE_RETURNS(p->proto)->dt; - - TB_Node *node_true = tb_inst_uint(p->func, ret_dt, true); - TB_Node *node_false = tb_inst_uint(p->func, ret_dt, false); - - TB_Node *same_ptr_region = cg_control_region(p, "same_ptr"); - TB_Node *diff_ptr_region = cg_control_region(p, "diff_ptr"); - - TB_Node *is_same_ptr = tb_inst_cmp_eq(p->func, x, y); - tb_inst_if(p->func, is_same_ptr, same_ptr_region, diff_ptr_region); - - tb_inst_set_control(p->func, same_ptr_region); - tb_inst_ret(p->func, 1, &node_true); - - tb_inst_set_control(p->func, diff_ptr_region); - - Type *pt = alloc_type_pointer(type); - cgValue lhs = cg_value(x, pt); - cgValue rhs = cg_value(y, pt); - - if (type->kind == Type_Struct) { - type_set_offsets(type); - - TB_Node *false_region = cg_control_region(p, "bfalse"); - cgValue res = cg_const_bool(p, t_bool, true); - - for_array(i, type->Struct.fields) { - TB_Node *next_region = cg_control_region(p, "btrue"); - - cgValue plhs = cg_emit_struct_ep(p, lhs, i); - cgValue prhs = cg_emit_struct_ep(p, rhs, i); - cgValue left = cg_emit_load(p, plhs); - cgValue right = cg_emit_load(p, prhs); - cgValue ok = cg_emit_comp(p, Token_CmpEq, left, right); - - cg_emit_if(p, ok, next_region, false_region); - - cg_emit_goto(p, next_region); - tb_inst_set_control(p->func, next_region); - } - - tb_inst_ret(p->func, 1, &node_true); - tb_inst_set_control(p->func, false_region); - tb_inst_ret(p->func, 1, &node_false); - - } else if (type->kind == Type_Union) { - if (type_size_of(type) == 0) { - tb_inst_ret(p->func, 1, &node_true); - } else if (is_type_union_maybe_pointer(type)) { - Type *v = type->Union.variants[0]; - Type *pv = alloc_type_pointer(v); - - cgValue left = cg_emit_load(p, cg_emit_conv(p, lhs, pv)); - cgValue right = cg_emit_load(p, cg_emit_conv(p, rhs, pv)); - cgValue ok = cg_emit_comp(p, Token_CmpEq, left, right); - cg_build_return_stmt_internal_single(p, ok); - } else { - TB_Node *false_region = cg_control_region(p, "bfalse"); - TB_Node *switch_region = cg_control_region(p, "bswitch"); - - cgValue lhs_tag = cg_emit_load(p, cg_emit_union_tag_ptr(p, lhs)); - cgValue rhs_tag = cg_emit_load(p, cg_emit_union_tag_ptr(p, rhs)); - - cgValue tag_eq = cg_emit_comp(p, Token_CmpEq, lhs_tag, rhs_tag); - cg_emit_if(p, tag_eq, switch_region, false_region); - - size_t entry_count = type->Union.variants.count; - if (type->Union.kind != UnionType_no_nil) { - entry_count += 1; - } - - size_t entry_offset = 0; - - TB_SwitchEntry *keys = gb_alloc_array(temporary_allocator(), TB_SwitchEntry, entry_count); - if (type->Union.kind != UnionType_no_nil) { - TB_Node *region = cg_control_region(p, "bcase"); - keys[entry_offset].key = 0; - keys[entry_offset].value = region; - entry_offset += 1; - - tb_inst_set_control(p->func, region); - cgValue ok = cg_const_bool(p, t_bool, true); - cg_build_return_stmt_internal_single(p, ok); - } - - for (isize i = 0; i < type->Union.variants.count; i++) { - TB_Node *region = cg_control_region(p, "bcase"); - Type *variant = type->Union.variants[i]; - keys[entry_offset+i].key = union_variant_index(type, variant); - keys[entry_offset+i].value = region; - - tb_inst_set_control(p->func, region); - Type *vp = alloc_type_pointer(variant); - cgValue left = cg_emit_load(p, cg_emit_conv(p, lhs, vp)); - cgValue right = cg_emit_load(p, cg_emit_conv(p, rhs, vp)); - cgValue ok = cg_emit_comp(p, Token_CmpEq, left, right); - cg_build_return_stmt_internal_single(p, ok); - } - - - tb_inst_set_control(p->func, switch_region); - TB_DataType tag_dt = cg_data_type(lhs_tag.type); - GB_ASSERT(lhs_tag.kind == cgValue_Value); - tb_inst_branch(p->func, tag_dt, lhs_tag.node, false_region, entry_count, keys); - - tb_inst_set_control(p->func, false_region); - tb_inst_ret(p->func, 1, &node_false); - } - } else { - cgValue left = cg_lvalue_addr(x, type); - cgValue right = cg_lvalue_addr(y, type); - cgValue ok = cg_emit_comp(p, Token_CmpEq, left, right); - cg_build_return_stmt_internal_single(p, ok); - } - - cg_procedure_end(p); - - return p; -} - - -gb_internal cgValue cg_simple_compare_hash(cgProcedure *p, Type *type, cgValue data, cgValue seed) { - TEMPORARY_ALLOCATOR_GUARD(); - - GB_ASSERT_MSG(is_type_simple_compare(type), "%s", type_to_string(type)); - - auto args = slice_make(temporary_allocator(), 3); - args[0] = data; - args[1] = seed; - args[2] = cg_const_int(p, t_int, type_size_of(type)); - return cg_emit_runtime_call(p, "default_hasher", args); -} - - - - - -gb_internal cgProcedure *cg_hasher_proc_for_type(cgModule *m, Type *type) { - type = base_type(type); - GB_ASSERT(is_type_valid_for_keys(type)); - - mutex_lock(&m->generated_procs_mutex); - defer (mutex_unlock(&m->generated_procs_mutex)); - - cgProcedure **found = map_get(&m->hasher_procs, type); - if (found) { - return *found; - } - - static std::atomic proc_index; - - char buf[32] = {}; - isize n = gb_snprintf(buf, 32, "__$hasher%u", 1+proc_index.fetch_add(1)); - char *str = gb_alloc_str_len(permanent_allocator(), buf, n-1); - String proc_name = make_string_c(str); - - - cgProcedure *p = cg_procedure_create_dummy(m, proc_name, t_hasher_proc); - map_set(&m->hasher_procs, type, p); - p->split_returns_index = 2; - - cg_procedure_begin(p); - defer (cg_procedure_end(p)); - - TB_Node *x = tb_inst_param(p->func, 0); // data - TB_Node *y = tb_inst_param(p->func, 1); // seed - - cgValue data = cg_value(x, t_rawptr); - cgValue seed = cg_value(y, t_uintptr); - - if (is_type_simple_compare(type)) { - cgValue res = cg_simple_compare_hash(p, type, data, seed); - cg_build_return_stmt_internal_single(p, res); - return p; - } - - TEMPORARY_ALLOCATOR_GUARD(); - - auto args = slice_make(temporary_allocator(), 2); - - if (type->kind == Type_Struct) { - type_set_offsets(type); - for_array(i, type->Struct.fields) { - i64 offset = type->Struct.offsets[i]; - Entity *field = type->Struct.fields[i]; - cgValue field_hasher = cg_hasher_proc_value_for_type(p, field->type); - - TB_Node *ptr = tb_inst_member_access(p->func, data.node, offset); - - args[0] = cg_value(ptr, alloc_type_pointer(field->type)); - args[1] = seed; - seed = cg_emit_call(p, field_hasher, args); - } - - cg_build_return_stmt_internal_single(p, seed); - } else if (type->kind == Type_Union) { - if (type_size_of(type) == 0) { - cg_build_return_stmt_internal_single(p, seed); - } else if (is_type_union_maybe_pointer(type)) { - Type *v = type->Union.variants[0]; - cgValue variant_hasher = cg_hasher_proc_value_for_type(p, v); - - args[0] = data; - args[1] = seed; - cgValue res = cg_emit_call(p, variant_hasher, args); - cg_build_return_stmt_internal_single(p, seed); - } else { - TB_Node *end_region = cg_control_region(p, "bend"); - TB_Node *switch_region = cg_control_region(p, "bswitch"); - - cg_emit_goto(p, switch_region); - - size_t entry_count = type->Union.variants.count; - TB_SwitchEntry *keys = gb_alloc_array(temporary_allocator(), TB_SwitchEntry, entry_count); - for (size_t i = 0; i < entry_count; i++) { - TB_Node *region = cg_control_region(p, "bcase"); - Type *variant = type->Union.variants[i]; - keys[i].key = union_variant_index(type, variant); - keys[i].value = region; - - tb_inst_set_control(p->func, region); - - cgValue variant_hasher = cg_hasher_proc_value_for_type(p, variant); - - args[0] = data; - args[1] = seed; - cgValue res = cg_emit_call(p, variant_hasher, args); - cg_build_return_stmt_internal_single(p, res); - } - - tb_inst_set_control(p->func, switch_region); - - cgValue tag_ptr = cg_emit_union_tag_ptr(p, data); - cgValue tag = cg_emit_load(p, tag_ptr); - - TB_DataType tag_dt = cg_data_type(tag.type); - GB_ASSERT(tag.kind == cgValue_Value); - tb_inst_branch(p->func, tag_dt, tag.node, end_region, entry_count, keys); - - tb_inst_set_control(p->func, end_region); - cg_build_return_stmt_internal_single(p, seed); - } - } else if (type->kind == Type_Array) { - cgAddr pres = cg_add_local(p, t_uintptr, nullptr, false); - cg_addr_store(p, pres, seed); - - cgValue elem_hasher = cg_hasher_proc_value_for_type(p, type->Array.elem); - - auto loop_data = cg_loop_start(p, type->Array.count, t_int); - - i64 stride = type_size_of(type->Array.elem); - TB_Node *ptr = tb_inst_array_access(p->func, data.node, loop_data.index.node, stride); - args[0] = cg_value(ptr, alloc_type_pointer(type->Array.elem)); - args[1] = cg_addr_load(p, pres); - - cgValue new_seed = cg_emit_call(p, elem_hasher, args); - cg_addr_store(p, pres, new_seed); - - cg_loop_end(p, loop_data); - - cgValue res = cg_addr_load(p, pres); - cg_build_return_stmt_internal_single(p, res); - } else if (type->kind == Type_EnumeratedArray) { - cgAddr pres = cg_add_local(p, t_uintptr, nullptr, false); - cg_addr_store(p, pres, seed); - - cgValue elem_hasher = cg_hasher_proc_value_for_type(p, type->EnumeratedArray.elem); - - auto loop_data = cg_loop_start(p, type->EnumeratedArray.count, t_int); - - i64 stride = type_size_of(type->EnumeratedArray.elem); - TB_Node *ptr = tb_inst_array_access(p->func, data.node, loop_data.index.node, stride); - args[0] = cg_value(ptr, alloc_type_pointer(type->EnumeratedArray.elem)); - args[1] = cg_addr_load(p, pres); - - cgValue new_seed = cg_emit_call(p, elem_hasher, args); - cg_addr_store(p, pres, new_seed); - - cg_loop_end(p, loop_data); - - cgValue res = cg_addr_load(p, pres); - cg_build_return_stmt_internal_single(p, res); - } else if (is_type_cstring(type)) { - args[0] = data; - args[1] = seed; - cgValue res = cg_emit_runtime_call(p, "default_hasher_cstring", args); - cg_build_return_stmt_internal_single(p, seed); - } else if (is_type_string(type)) { - args[0] = data; - args[1] = seed; - cgValue res = cg_emit_runtime_call(p, "default_hasher_string", args); - cg_build_return_stmt_internal_single(p, seed); - } else { - GB_PANIC("Unhandled type for hasher: %s", type_to_string(type)); - } - return p; -} \ No newline at end of file diff --git a/src/tilde_stmt.cpp b/src/tilde_stmt.cpp deleted file mode 100644 index 597a4262c..000000000 --- a/src/tilde_stmt.cpp +++ /dev/null @@ -1,2889 +0,0 @@ -gb_internal bool cg_emit_goto(cgProcedure *p, TB_Node *control_region) { - if (tb_inst_get_control(p->func)) { - tb_inst_goto(p->func, control_region); - return true; - } - return false; -} - -gb_internal TB_Node *cg_control_region(cgProcedure *p, char const *name) { - TEMPORARY_ALLOCATOR_GUARD(); - - isize n = gb_strlen(name); - - char *new_name = gb_alloc_array(temporary_allocator(), char, n+12); - n = -1 + gb_snprintf(new_name, n+11, "%.*s_%u", cast(int)n, name, p->control_regions.count); - - TB_Node *region = tb_inst_region(p->func); - tb_inst_set_region_name(p->func, region, n, new_name); - - GB_ASSERT(p->scope_index >= 0); - array_add(&p->control_regions, cgControlRegion{region, p->scope_index}); - - return region; -} - -gb_internal cgValue cg_emit_load(cgProcedure *p, cgValue const &ptr, bool is_volatile) { - GB_ASSERT_MSG(is_type_pointer(ptr.type), "%s", type_to_string(ptr.type)); - Type *type = type_deref(ptr.type); - TB_DataType dt = cg_data_type(type); - - if (TB_IS_VOID_TYPE(dt)) { - switch (ptr.kind) { - case cgValue_Value: - return cg_lvalue_addr(ptr.node, type); - case cgValue_Addr: - GB_PANIC("NOT POSSIBLE - Cannot load an lvalue to begin with"); - break; - case cgValue_Multi: - GB_PANIC("NOT POSSIBLE - Cannot load multiple values at once"); - break; - case cgValue_Symbol: - return cg_lvalue_addr(tb_inst_get_symbol_address(p->func, ptr.symbol), type); - } - } - GB_ASSERT(dt.type != TB_MEMORY); - GB_ASSERT(dt.type != TB_TUPLE); - - // use the natural alignment - // if people need a special alignment, they can use `intrinsics.unaligned_load` - TB_CharUnits alignment = cast(TB_CharUnits)type_align_of(type); - - TB_Node *the_ptr = nullptr; - switch (ptr.kind) { - case cgValue_Value: - the_ptr = ptr.node; - break; - case cgValue_Addr: - the_ptr = tb_inst_load(p->func, TB_TYPE_PTR, ptr.node, alignment, is_volatile); - break; - case cgValue_Multi: - GB_PANIC("NOT POSSIBLE - Cannot load multiple values at once"); - break; - case cgValue_Symbol: - the_ptr = tb_inst_get_symbol_address(p->func, ptr.symbol); - break; - } - return cg_value(tb_inst_load(p->func, dt, the_ptr, alignment, is_volatile), type); -} - -gb_internal void cg_emit_store(cgProcedure *p, cgValue dst, cgValue src, bool is_volatile) { - GB_ASSERT_MSG(dst.kind != cgValue_Multi, "cannot store to multiple values at once"); - - if (dst.kind == cgValue_Addr) { - dst = cg_emit_load(p, dst, is_volatile); - } else if (dst.kind == cgValue_Symbol) { - dst = cg_value(tb_inst_get_symbol_address(p->func, dst.symbol), dst.type); - } - - GB_ASSERT(is_type_pointer(dst.type)); - Type *dst_type = type_deref(dst.type); - - GB_ASSERT_MSG(are_types_identical(core_type(dst_type), core_type(src.type)), "%s vs %s", type_to_string(dst_type), type_to_string(src.type)); - - TB_DataType dt = cg_data_type(dst_type); - TB_DataType st = cg_data_type(src.type); - GB_ASSERT(dt.raw == st.raw); - - // use the natural alignment - // if people need a special alignment, they can use `intrinsics.unaligned_store` - TB_CharUnits alignment = cast(TB_CharUnits)type_align_of(dst_type); - - if (TB_IS_VOID_TYPE(dt)) { - TB_Node *dst_ptr = nullptr; - TB_Node *src_ptr = nullptr; - - switch (dst.kind) { - case cgValue_Value: - dst_ptr = dst.node; - break; - case cgValue_Addr: - GB_PANIC("DST cgValue_Addr should be handled above"); - break; - case cgValue_Symbol: - dst_ptr = tb_inst_get_symbol_address(p->func, dst.symbol); - break; - } - - switch (src.kind) { - case cgValue_Value: - GB_PANIC("SRC cgValue_Value should be handled above"); - break; - case cgValue_Symbol: - GB_PANIC("SRC cgValue_Symbol should be handled above"); - break; - case cgValue_Addr: - src_ptr = src.node; - break; - } - - // IMPORTANT TODO(bill): needs to be memmove - i64 sz = type_size_of(dst_type); - TB_Node *count = tb_inst_uint(p->func, TB_TYPE_INT, cast(u64)sz); - tb_inst_memcpy(p->func, dst_ptr, src_ptr, count, alignment/*, is_volatile*/); - return; - } - - - switch (dst.kind) { - case cgValue_Value: - switch (src.kind) { - case cgValue_Value: - if (src.node->dt.type == TB_INT && src.node->dt.data == 1) { - src.node = tb_inst_zxt(p->func, src.node, dt); - } - tb_inst_store(p->func, dt, dst.node, src.node, alignment, is_volatile); - return; - case cgValue_Addr: - tb_inst_store(p->func, dt, dst.node, - tb_inst_load(p->func, st, src.node, alignment, is_volatile), - alignment, is_volatile); - return; - case cgValue_Symbol: - tb_inst_store(p->func, dt, dst.node, - tb_inst_get_symbol_address(p->func, src.symbol), - alignment, is_volatile); - return; - } - case cgValue_Addr: - GB_PANIC("cgValue_Addr should be handled above"); - break; - case cgValue_Symbol: - GB_PANIC(" cgValue_Symbol should be handled above"); - break; - } -} - - -gb_internal cgValue cg_address_from_load(cgProcedure *p, cgValue value) { - switch (value.kind) { - case cgValue_Value: - { - TB_Node *load_inst = value.node; - GB_ASSERT_MSG(load_inst->type == TB_LOAD, "expected a load instruction"); - TB_Node *ptr = load_inst->inputs[2]; - return cg_value(ptr, alloc_type_pointer(value.type)); - } - case cgValue_Addr: - return cg_value(value.node, alloc_type_pointer(value.type)); - case cgValue_Symbol: - GB_PANIC("Symbol is an invalid use case for cg_address_from_load"); - return {}; - case cgValue_Multi: - GB_PANIC("Multi is an invalid use case for cg_address_from_load"); - break; - } - GB_PANIC("Invalid cgValue for cg_address_from_load"); - return {}; - -} - -gb_internal bool cg_addr_is_empty(cgAddr const &addr) { - switch (addr.kind) { - case cgValue_Value: - case cgValue_Addr: - return addr.addr.node == nullptr; - case cgValue_Symbol: - return addr.addr.symbol == nullptr; - case cgValue_Multi: - return addr.addr.multi == nullptr; - } - return true; -} - -gb_internal Type *cg_addr_type(cgAddr const &addr) { - if (cg_addr_is_empty(addr)) { - return nullptr; - } - switch (addr.kind) { - case cgAddr_Map: - { - Type *t = base_type(addr.map.type); - GB_ASSERT(is_type_map(t)); - return t->Map.value; - } - case cgAddr_Swizzle: - return addr.swizzle.type; - case cgAddr_SwizzleLarge: - return addr.swizzle_large.type; - case cgAddr_Context: - if (addr.ctx.sel.index.count > 0) { - Type *t = t_context; - for_array(i, addr.ctx.sel.index) { - GB_ASSERT(is_type_struct(t)); - t = base_type(t)->Struct.fields[addr.ctx.sel.index[i]]->type; - } - return t; - } - break; - } - return type_deref(addr.addr.type); -} - -gb_internal cgValue cg_addr_load(cgProcedure *p, cgAddr addr) { - if (addr.addr.node == nullptr) { - return {}; - } - switch (addr.kind) { - case cgAddr_Default: - return cg_emit_load(p, addr.addr); - - case cgAddr_Map: - { - Type *map_type = base_type(type_deref(addr.addr.type)); - GB_ASSERT(map_type->kind == Type_Map); - cgAddr v_addr = cg_add_local(p, map_type->Map.value, nullptr, true); - - cgValue ptr = cg_internal_dynamic_map_get_ptr(p, addr.addr, addr.map.key); - cgValue ok = cg_emit_conv(p, cg_emit_comp_against_nil(p, Token_NotEq, ptr), t_bool); - - TB_Node *then = cg_control_region(p, "map.get.then"); - TB_Node *done = cg_control_region(p, "map.get.done"); - cg_emit_if(p, ok, then, done); - tb_inst_set_control(p->func, then); - { - cgValue value = cg_emit_conv(p, ptr, alloc_type_pointer(map_type->Map.value)); - value = cg_emit_load(p, value); - cg_addr_store(p, v_addr, value); - } - cg_emit_goto(p, done); - tb_inst_set_control(p->func, done); - - cgValue v = cg_addr_load(p, v_addr); - if (is_type_tuple(addr.map.result)) { - return cg_value_multi2(v, ok, addr.map.result); - } else { - return v; - } - } - - case cgAddr_SoaVariable: - { - Type *t = type_deref(addr.addr.type); - t = base_type(t); - GB_ASSERT(t->kind == Type_Struct && t->Struct.soa_kind != StructSoa_None); - Type *elem = t->Struct.soa_elem; - - cgValue len = {}; - if (t->Struct.soa_kind == StructSoa_Fixed) { - len = cg_const_int(p, t_int, t->Struct.soa_count); - } else { - cgValue v = cg_emit_load(p, addr.addr); - len = cg_builtin_len(p, v); - } - - cgAddr res = cg_add_local(p, elem, nullptr, true); - - // if (addr.soa.index_expr != nullptr && (!cg_is_const(addr.soa.index) || t->Struct.soa_kind != StructSoa_Fixed)) { - // cg_emit_bounds_check(p, ast_token(addr.soa.index_expr), addr.soa.index, len); - // } - - if (t->Struct.soa_kind == StructSoa_Fixed) { - for_array(i, t->Struct.fields) { - Entity *field = t->Struct.fields[i]; - Type *base_type = field->type; - GB_ASSERT(base_type->kind == Type_Array); - - cgValue dst = cg_emit_struct_ep(p, res.addr, cast(i32)i); - cgValue src_ptr = cg_emit_struct_ep(p, addr.addr, cast(i32)i); - src_ptr = cg_emit_array_ep(p, src_ptr, addr.soa.index); - cgValue src = cg_emit_load(p, src_ptr); - cg_emit_store(p, dst, src); - } - } else { - isize field_count = t->Struct.fields.count; - if (t->Struct.soa_kind == StructSoa_Slice) { - field_count -= 1; - } else if (t->Struct.soa_kind == StructSoa_Dynamic) { - field_count -= 3; - } - for (isize i = 0; i < field_count; i++) { - Entity *field = t->Struct.fields[i]; - Type *base_type = field->type; - GB_ASSERT(base_type->kind == Type_Pointer); - - cgValue dst = cg_emit_struct_ep(p, res.addr, cast(i32)i); - cgValue src_ptr = cg_emit_struct_ep(p, addr.addr, cast(i32)i); - cgValue src = cg_emit_load(p, src_ptr); - src = cg_emit_ptr_offset(p, src, addr.soa.index); - src = cg_emit_load(p, src); - cg_emit_store(p, dst, src); - } - } - - return cg_addr_load(p, res); - } - } - GB_PANIC("TODO(bill): cg_addr_load %p", addr.addr.node); - return {}; -} - - -gb_internal void cg_addr_store(cgProcedure *p, cgAddr addr, cgValue value) { - if (cg_addr_is_empty(addr)) { - return; - } - GB_ASSERT(value.type != nullptr); - if (is_type_untyped_uninit(value.type)) { - Type *t = cg_addr_type(addr); - value = cg_value(tb_inst_poison(p->func, cg_data_type(t)), t); - // TODO(bill): IS THIS EVEN A GOOD IDEA? - } else if (is_type_untyped_nil(value.type)) { - Type *t = cg_addr_type(addr); - value = cg_const_nil(p, t); - } - - if (addr.kind == cgAddr_RelativePointer && addr.relative.deref) { - addr = cg_addr(cg_address_from_load(p, cg_addr_load(p, addr))); - } - - if (addr.kind == cgAddr_RelativePointer) { - GB_PANIC("TODO(bill): cgAddr_RelativePointer"); - } else if (addr.kind == cgAddr_RelativeSlice) { - GB_PANIC("TODO(bill): cgAddr_RelativeSlice"); - } else if (addr.kind == cgAddr_Map) { - cg_internal_dynamic_map_set(p, addr.addr, addr.map.type, addr.map.key, value, p->curr_stmt); - return; - } else if (addr.kind == cgAddr_Context) { - cgAddr old_addr = cg_find_or_generate_context_ptr(p); - - bool create_new = true; - for_array(i, p->context_stack) { - cgContextData *ctx_data = &p->context_stack[i]; - if (ctx_data->ctx.addr.node == old_addr.addr.node) { - if (ctx_data->uses > 0) { - create_new = true; - } else if (p->scope_index > ctx_data->scope_index) { - create_new = true; - } else { - // gb_printf_err("%.*s (curr:%td) (ctx:%td) (uses:%td)\n", LIT(p->name), p->scope_index, ctx_data->scope_index, ctx_data->uses); - create_new = false; - } - break; - } - } - - cgValue next = {}; - if (create_new) { - cgValue old = cg_addr_load(p, old_addr); - cgAddr next_addr = cg_add_local(p, t_context, nullptr, true); - cg_addr_store(p, next_addr, old); - cg_push_context_onto_stack(p, next_addr); - next = next_addr.addr; - } else { - next = old_addr.addr; - } - - if (addr.ctx.sel.index.count > 0) { - cgValue lhs = cg_emit_deep_field_gep(p, next, addr.ctx.sel); - cgValue rhs = cg_emit_conv(p, value, type_deref(lhs.type)); - cg_emit_store(p, lhs, rhs); - } else { - cgValue lhs = next; - cgValue rhs = cg_emit_conv(p, value, cg_addr_type(addr)); - cg_emit_store(p, lhs, rhs); - } - return; - } else if (addr.kind == cgAddr_SoaVariable) { - GB_PANIC("TODO(bill): cgAddr_SoaVariable"); - } else if (addr.kind == cgAddr_Swizzle) { - GB_ASSERT(addr.swizzle.count <= 4); - GB_PANIC("TODO(bill): cgAddr_Swizzle"); - } else if (addr.kind == cgAddr_SwizzleLarge) { - GB_PANIC("TODO(bill): cgAddr_SwizzleLarge"); - } - - value = cg_emit_conv(p, value, cg_addr_type(addr)); - cg_emit_store(p, addr.addr, value); -} - -gb_internal cgValue cg_addr_get_ptr(cgProcedure *p, cgAddr const &addr) { - if (cg_addr_is_empty(addr)) { - GB_PANIC("Illegal addr -> nullptr"); - return {}; - } - - switch (addr.kind) { - case cgAddr_Map: - GB_PANIC("TODO(bill): cg_addr_get_ptr cgAddr_Map"); - // return cg_internal_dynamic_map_get_ptr(p, addr.addr, addr.map.key); - break; - - case cgAddr_RelativePointer: { - Type *rel_ptr = base_type(cg_addr_type(addr)); - GB_ASSERT(rel_ptr->kind == Type_RelativePointer); - - cgValue ptr = cg_emit_conv(p, addr.addr, t_uintptr); - cgValue offset = cg_emit_conv(p, ptr, alloc_type_pointer(rel_ptr->RelativePointer.base_integer)); - offset = cg_emit_load(p, offset); - - if (!is_type_unsigned(rel_ptr->RelativePointer.base_integer)) { - offset = cg_emit_conv(p, offset, t_i64); - } - offset = cg_emit_conv(p, offset, t_uintptr); - - cgValue absolute_ptr = cg_emit_arith(p, Token_Add, ptr, offset, t_uintptr); - absolute_ptr = cg_emit_conv(p, absolute_ptr, rel_ptr->RelativePointer.pointer_type); - - GB_PANIC("TODO(bill): cg_addr_get_ptr cgAddr_RelativePointer"); - // cgValue cond = cg_emit_comp(p, Token_CmpEq, offset, cg_const_nil(p->module, rel_ptr->RelativePointer.base_integer)); - - // NOTE(bill): nil check - // cgValue nil_ptr = cg_const_nil(p->module, rel_ptr->RelativePointer.pointer_type); - // cgValue final_ptr = cg_emit_select(p, cond, nil_ptr, absolute_ptr); - // return final_ptr; - break; - } - - case cgAddr_SoaVariable: - // TODO(bill): FIX THIS HACK - return cg_address_from_load(p, cg_addr_load(p, addr)); - - case cgAddr_Context: - GB_PANIC("cgAddr_Context should be handled elsewhere"); - break; - - case cgAddr_Swizzle: - case cgAddr_SwizzleLarge: - // TOOD(bill): is this good enough logic? - break; - } - - return addr.addr; -} - -gb_internal cgValue cg_emit_ptr_offset(cgProcedure *p, cgValue ptr, cgValue index) { - GB_ASSERT(ptr.kind == cgValue_Value); - GB_ASSERT(index.kind == cgValue_Value); - GB_ASSERT(is_type_pointer(ptr.type) || is_type_multi_pointer(ptr.type)); - GB_ASSERT(is_type_integer(index.type)); - - Type *elem = type_deref(ptr.type, true); - i64 stride = type_size_of(elem); - return cg_value(tb_inst_array_access(p->func, ptr.node, index.node, stride), alloc_type_pointer(elem)); -} -gb_internal cgValue cg_emit_array_ep(cgProcedure *p, cgValue s, cgValue index) { - GB_ASSERT(s.kind == cgValue_Value); - GB_ASSERT(index.kind == cgValue_Value); - - Type *t = s.type; - GB_ASSERT_MSG(is_type_pointer(t), "%s", type_to_string(t)); - Type *st = base_type(type_deref(t)); - GB_ASSERT_MSG(is_type_array(st) || is_type_enumerated_array(st) || is_type_matrix(st), "%s", type_to_string(st)); - GB_ASSERT_MSG(is_type_integer(core_type(index.type)), "%s", type_to_string(index.type)); - - - Type *elem = base_array_type(st); - i64 stride = type_size_of(elem); - return cg_value(tb_inst_array_access(p->func, s.node, index.node, stride), alloc_type_pointer(elem)); -} -gb_internal cgValue cg_emit_array_epi(cgProcedure *p, cgValue s, i64 index) { - return cg_emit_array_ep(p, s, cg_const_int(p, t_int, index)); -} - - -gb_internal cgValue cg_emit_struct_ep(cgProcedure *p, cgValue s, i64 index) { - s = cg_flatten_value(p, s); - - GB_ASSERT(is_type_pointer(s.type)); - Type *t = base_type(type_deref(s.type)); - Type *result_type = nullptr; - - if (is_type_relative_pointer(t)) { - s = cg_addr_get_ptr(p, cg_addr(s)); - } - i64 offset = -1; - i64 int_size = build_context.int_size; - i64 ptr_size = build_context.ptr_size; - - switch (t->kind) { - case Type_Struct: - type_set_offsets(t); - result_type = t->Struct.fields[index]->type; - offset = t->Struct.offsets[index]; - break; - case Type_Union: - GB_ASSERT(index == -1); - GB_PANIC("TODO(bill): cg_emit_union_tag_ptr"); - break; - // return cg_emit_union_tag_ptr(p, s); - case Type_Tuple: - type_set_offsets(t); - result_type = t->Tuple.variables[index]->type; - offset = t->Tuple.offsets[index]; - GB_PANIC("TODO(bill): cg_emit_tuple_ep %d", s.kind); - break; - // return cg_emit_tuple_ep(p, s, index); - case Type_Slice: - switch (index) { - case 0: - result_type = alloc_type_multi_pointer(t->Slice.elem); - offset = 0; - break; - case 1: - result_type = t_int; - offset = int_size; - break; - } - break; - case Type_Basic: - switch (t->Basic.kind) { - case Basic_string: - switch (index) { - case 0: - result_type = t_u8_multi_ptr; - offset = 0; - break; - case 1: - result_type = t_int; - offset = int_size; - break; - } - break; - case Basic_any: - switch (index) { - case 0: - result_type = t_rawptr; - offset = 0; - break; - case 1: - result_type = t_typeid; - offset = ptr_size; - break; - } - break; - - case Basic_complex32: - case Basic_complex64: - case Basic_complex128: - { - Type *ft = base_complex_elem_type(t); - i64 sz = type_size_of(ft); - switch (index) { - case 0: case 1: - result_type = ft; offset = sz * index; break; - default: goto error_case; - } - break; - } - case Basic_quaternion64: - case Basic_quaternion128: - case Basic_quaternion256: - { - Type *ft = base_complex_elem_type(t); - i64 sz = type_size_of(ft); - switch (index) { - case 0: case 1: case 2: case 3: - result_type = ft; offset = sz * index; break; - default: goto error_case; - } - } - break; - default: - goto error_case; - } - break; - case Type_DynamicArray: - switch (index) { - case 0: - result_type = alloc_type_multi_pointer(t->DynamicArray.elem); - offset = index*int_size; - break; - case 1: case 2: - result_type = t_int; - offset = index*int_size; - break; - case 3: - result_type = t_allocator; - offset = index*int_size; - break; - default: goto error_case; - } - break; - case Type_Map: - { - init_map_internal_types(t); - Type *itp = alloc_type_pointer(t_raw_map); - s = cg_emit_transmute(p, s, itp); - - Type *rms = base_type(t_raw_map); - GB_ASSERT(rms->kind == Type_Struct); - - if (0 <= index && index < 3) { - result_type = rms->Struct.fields[index]->type; - offset = rms->Struct.offsets[index]; - } else { - goto error_case; - } - break; - } - case Type_Array: - return cg_emit_array_epi(p, s, index); - case Type_SoaPointer: - switch (index) { - case 0: - result_type = alloc_type_pointer(t->SoaPointer.elem); - offset = 0; - break; - case 1: - result_type = t_int; - offset = int_size; - break; - } - break; - default: - error_case:; - GB_PANIC("TODO(bill): struct_gep type: %s, %lld", type_to_string(s.type), cast(long long)index); - break; - } - - GB_ASSERT_MSG(result_type != nullptr, "%s %lld", type_to_string(t), cast(long long)index); - GB_ASSERT_MSG(offset >= 0, "%s %lld", type_to_string(t), cast(long long)offset); - - GB_ASSERT(s.kind == cgValue_Value); - return cg_value( - tb_inst_member_access(p->func, s.node, offset), - alloc_type_pointer(result_type) - ); -} - - -gb_internal cgValue cg_emit_struct_ev(cgProcedure *p, cgValue s, i64 index) { - s = cg_address_from_load_or_generate_local(p, s); - cgValue ptr = cg_emit_struct_ep(p, s, index); - return cg_flatten_value(p, cg_emit_load(p, ptr)); -} - - -gb_internal cgValue cg_emit_deep_field_gep(cgProcedure *p, cgValue e, Selection const &sel) { - GB_ASSERT(sel.index.count > 0); - Type *type = type_deref(e.type); - - for_array(i, sel.index) { - i64 index = sel.index[i]; - if (is_type_pointer(type)) { - type = type_deref(type); - e = cg_emit_load(p, e); - } - type = core_type(type); - - switch (type->kind) { - case Type_SoaPointer: { - cgValue addr = cg_emit_struct_ep(p, e, 0); - cgValue index = cg_emit_struct_ep(p, e, 1); - addr = cg_emit_load(p, addr); - index = cg_emit_load(p, index); - - i64 first_index = sel.index[0]; - Selection sub_sel = sel; - sub_sel.index.data += 1; - sub_sel.index.count -= 1; - - cgValue arr = cg_emit_struct_ep(p, addr, first_index); - - Type *t = base_type(type_deref(addr.type)); - GB_ASSERT(is_type_soa_struct(t)); - - if (t->Struct.soa_kind == StructSoa_Fixed) { - e = cg_emit_array_ep(p, arr, index); - } else { - e = cg_emit_ptr_offset(p, cg_emit_load(p, arr), index); - } - break; - } - case Type_Basic: - switch (type->Basic.kind) { - case Basic_any: - if (index == 0) { - type = t_rawptr; - } else if (index == 1) { - type = t_type_info_ptr; - } - e = cg_emit_struct_ep(p, e, index); - break; - default: - e = cg_emit_struct_ep(p, e, index); - break; - } - break; - case Type_Struct: - if (type->Struct.is_raw_union) { - type = get_struct_field_type(type, index); - GB_ASSERT(is_type_pointer(e.type)); - e = cg_emit_transmute(p, e, alloc_type_pointer(type)); - } else { - type = get_struct_field_type(type, index); - e = cg_emit_struct_ep(p, e, index); - } - break; - case Type_Union: - GB_ASSERT(index == -1); - type = t_type_info_ptr; - e = cg_emit_struct_ep(p, e, index); - break; - case Type_Tuple: - type = type->Tuple.variables[index]->type; - e = cg_emit_struct_ep(p, e, index); - break; - case Type_Slice: - case Type_DynamicArray: - case Type_Map: - case Type_RelativePointer: - e = cg_emit_struct_ep(p, e, index); - break; - case Type_Array: - e = cg_emit_array_epi(p, e, index); - break; - default: - GB_PANIC("un-gep-able type %s", type_to_string(type)); - break; - } - } - - return e; -} - - - - - - - - -gb_internal cgBranchRegions cg_lookup_branch_regions(cgProcedure *p, Ast *ident) { - GB_ASSERT(ident->kind == Ast_Ident); - Entity *e = entity_of_node(ident); - GB_ASSERT(e->kind == Entity_Label); - for (cgBranchRegions const &b : p->branch_regions) { - if (b.label == e->Label.node) { - return b; - } - } - - GB_PANIC("Unreachable"); - cgBranchRegions empty = {}; - return empty; -} - -gb_internal cgTargetList *cg_push_target_list(cgProcedure *p, Ast *label, TB_Node *break_, TB_Node *continue_, TB_Node *fallthrough_) { - cgTargetList *tl = gb_alloc_item(permanent_allocator(), cgTargetList); - tl->prev = p->target_list; - tl->break_ = break_; - tl->continue_ = continue_; - tl->fallthrough_ = fallthrough_; - p->target_list = tl; - - if (label != nullptr) { // Set label blocks - GB_ASSERT(label->kind == Ast_Label); - - for (cgBranchRegions &b : p->branch_regions) { - GB_ASSERT(b.label != nullptr && label != nullptr); - GB_ASSERT(b.label->kind == Ast_Label); - if (b.label == label) { - b.break_ = break_; - b.continue_ = continue_; - return tl; - } - } - - GB_PANIC("Unreachable"); - } - - return tl; -} - -gb_internal void cg_pop_target_list(cgProcedure *p) { - p->target_list = p->target_list->prev; -} -gb_internal cgAddr cg_add_local(cgProcedure *p, Type *type, Entity *e, bool zero_init) { - GB_ASSERT(type != nullptr); - - isize size = type_size_of(type); - TB_CharUnits alignment = cast(TB_CharUnits)type_align_of(type); - if (is_type_matrix(type)) { - alignment *= 2; // NOTE(bill): Just in case - } - - TB_Node *local = tb_inst_local(p->func, cast(u32)size, alignment); - - if (e != nullptr && e->token.string.len > 0 && e->token.string != "_") { - // NOTE(bill): for debugging purposes only - String name = e->token.string; - TB_DebugType *debug_type = cg_debug_type(p->module, type); - tb_function_attrib_variable(p->func, local, nullptr, name.len, cast(char const *)name.text, debug_type); - } - - if (zero_init) { - bool is_volatile = false; - gb_unused(is_volatile); - TB_Node *zero = tb_inst_uint(p->func, TB_TYPE_I8, 0); - TB_Node *count = tb_inst_uint(p->func, TB_TYPE_I32, cast(u64)size); - tb_inst_memset(p->func, local, zero, count, alignment/*, is_volatile*/); - } - - cgAddr addr = cg_addr(cg_value(local, alloc_type_pointer(type))); - if (e) { - map_set(&p->variable_map, e, addr); - } - return addr; -} - -gb_internal cgAddr cg_add_global(cgProcedure *p, Type *type, Entity *e) { - GB_ASSERT(type != nullptr); - - isize size = type_size_of(type); - TB_CharUnits alignment = cast(TB_CharUnits)type_align_of(type); - if (is_type_matrix(type)) { - alignment *= 2; // NOTE(bill): Just in case - } - - TB_Global *global = tb_global_create(p->module->mod, 0, "", nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(p->module->mod, tb_module_get_data(p->module->mod), global, size, alignment, 0); - TB_Node *local = tb_inst_get_symbol_address(p->func, cast(TB_Symbol *)global); - - if (e != nullptr && e->token.string.len > 0 && e->token.string != "_") { - // NOTE(bill): for debugging purposes only - String name = e->token.string; - TB_DebugType *debug_type = cg_debug_type(p->module, type); - tb_function_attrib_variable(p->func, local, nullptr, name.len, cast(char const *)name.text, debug_type); - } - - cgAddr addr = cg_addr(cg_value(local, alloc_type_pointer(type))); - if (e) { - map_set(&p->variable_map, e, addr); - } - return addr; -} - - -gb_internal cgValue cg_copy_value_to_ptr(cgProcedure *p, cgValue value, Type *original_type, isize min_alignment) { - TB_CharUnits size = cast(TB_CharUnits)type_size_of(original_type); - TB_CharUnits align = cast(TB_CharUnits)gb_max(type_align_of(original_type), min_alignment); - TB_Node *copy = tb_inst_local(p->func, size, align); - if (value.kind == cgValue_Value) { - tb_inst_store(p->func, cg_data_type(original_type), copy, value.node, align, false); - } else { - GB_ASSERT(value.kind == cgValue_Addr); - tb_inst_memcpy(p->func, copy, value.node, tb_inst_uint(p->func, TB_TYPE_INT, size), align); - } - - return cg_value(copy, alloc_type_pointer(original_type)); -} - -gb_internal cgValue cg_address_from_load_or_generate_local(cgProcedure *p, cgValue value) { - switch (value.kind) { - case cgValue_Value: - if (value.node->type == TB_LOAD) { - TB_Node *ptr = value.node->inputs[2]; - return cg_value(ptr, alloc_type_pointer(value.type)); - } - break; - case cgValue_Addr: - return cg_value(value.node, alloc_type_pointer(value.type)); - case cgValue_Multi: - GB_PANIC("cgValue_Multi not allowed"); - } - - cgAddr res = cg_add_local(p, value.type, nullptr, false); - cg_addr_store(p, res, value); - return res.addr; -} - - -gb_internal void cg_build_defer_stmt(cgProcedure *p, cgDefer const &d) { - TB_Node *curr_region = tb_inst_get_control(p->func); - if (curr_region == nullptr) { - return; - } - - // NOTE(bill): The prev block may defer injection before it's terminator - TB_Node *last_inst = nullptr; - // if (curr_region->input_count) { - // last_inst = *(curr_region->inputs + curr_region->input_count); - // } - // if (last_inst && TB_IS_NODE_TERMINATOR(last_inst->type)) { - // // NOTE(bill): ReturnStmt defer stuff will be handled previously - // return; - // } - - isize prev_context_stack_count = p->context_stack.count; - GB_ASSERT(prev_context_stack_count <= p->context_stack.capacity); - defer (p->context_stack.count = prev_context_stack_count); - p->context_stack.count = d.context_stack_count; - - TB_Node *b = cg_control_region(p, "defer"); - if (last_inst == nullptr) { - cg_emit_goto(p, b); - } - - tb_inst_set_control(p->func, b); - if (d.kind == cgDefer_Node) { - cg_build_stmt(p, d.stmt); - } else if (d.kind == cgDefer_Proc) { - cg_emit_call(p, d.proc.deferred, d.proc.result_as_args); - } -} - - -gb_internal void cg_emit_defer_stmts(cgProcedure *p, cgDeferExitKind kind, TB_Node *control_region) { - isize count = p->defer_stack.count; - isize i = count; - while (i --> 0) { - cgDefer const &d = p->defer_stack[i]; - - if (kind == cgDeferExit_Default) { - if (p->scope_index == d.scope_index && - d.scope_index > 0) { - cg_build_defer_stmt(p, d); - array_pop(&p->defer_stack); - continue; - } else { - break; - } - } else if (kind == cgDeferExit_Return) { - cg_build_defer_stmt(p, d); - } else if (kind == cgDeferExit_Branch) { - GB_ASSERT(control_region != nullptr); - isize lower_limit = -1; - for (auto const &cr : p->control_regions) { - if (cr.control_region == control_region) { - lower_limit = cr.scope_index; - break; - } - } - GB_ASSERT(lower_limit >= 0); - if (lower_limit < d.scope_index) { - cg_build_defer_stmt(p, d); - } - } - } -} - -gb_internal void cg_scope_open(cgProcedure *p, Scope *scope) { - // TODO(bill): debug scope information - p->scope_index += 1; - array_add(&p->scope_stack, scope); -} - -gb_internal void cg_scope_close(cgProcedure *p, cgDeferExitKind kind, TB_Node *control_region) { - cg_emit_defer_stmts(p, kind, control_region); - GB_ASSERT(p->scope_index > 0); - - while (p->context_stack.count > 0) { - auto *ctx = &p->context_stack[p->context_stack.count-1]; - if (ctx->scope_index < p->scope_index) { - break; - } - array_pop(&p->context_stack); - } - - p->scope_index -= 1; - array_pop(&p->scope_stack); -} - - -gb_internal isize cg_append_tuple_values(cgProcedure *p, Array *dst_values, cgValue src_value) { - isize init_count = dst_values->count; - Type *t = src_value.type; - if (t && t->kind == Type_Tuple) { - GB_ASSERT(src_value.kind == cgValue_Multi); - GB_ASSERT(src_value.multi != nullptr); - GB_ASSERT(src_value.multi->values.count == t->Tuple.variables.count); - for (cgValue const &value : src_value.multi->values) { - array_add(dst_values, value); - } - } else { - array_add(dst_values, src_value); - } - return dst_values->count - init_count; -} -gb_internal void cg_build_assignment(cgProcedure *p, Array const &lvals, Slice const &values) { - if (values.count == 0) { - return; - } - - auto inits = array_make(permanent_allocator(), 0, lvals.count); - - for (Ast *rhs : values) { - cgValue init = cg_build_expr(p, rhs); - cg_append_tuple_values(p, &inits, init); - } - - bool prev_in_assignment = p->in_multi_assignment; - - isize lval_count = 0; - for (cgAddr const &lval : lvals) { - if (!cg_addr_is_empty(lval)) { - // check if it is not a blank identifier - lval_count += 1; - } - } - p->in_multi_assignment = lval_count > 1; - - GB_ASSERT(lvals.count == inits.count); - - - if (inits.count > 1) for_array(i, inits) { - cgAddr lval = lvals[i]; - cgValue init = cg_flatten_value(p, inits[i]); - - GB_ASSERT(init.kind != cgValue_Multi); - if (init.type == nullptr) { - continue; - } - - Type *type = cg_addr_type(lval); - if (!cg_addr_is_empty(lval)) { - GB_ASSERT_MSG(are_types_identical(init.type, type), "%s = %s", type_to_string(init.type), type_to_string(type)); - } - - if (init.kind == cgValue_Addr && - !cg_addr_is_empty(lval)) { - // NOTE(bill): This is needed for certain constructs such as this: - // a, b = b, a - // NOTE(bill): This is a bodge and not necessarily a good way of doing things whatsoever - TB_CharUnits size = cast(TB_CharUnits)type_size_of(type); - TB_CharUnits align = cast(TB_CharUnits)type_align_of(type); - TB_Node *copy = tb_inst_local(p->func, size, align); - tb_inst_memcpy(p->func, copy, init.node, tb_inst_uint(p->func, TB_TYPE_INT, size), align); - // use the copy instead - init.node = copy; - } - inits[i] = init; - } - - for_array(i, inits) { - cgAddr lval = lvals[i]; - cgValue init = inits[i]; - GB_ASSERT(init.kind != cgValue_Multi); - if (init.type == nullptr) { - continue; - } - cg_addr_store(p, lval, init); - } - - p->in_multi_assignment = prev_in_assignment; -} - -gb_internal void cg_build_assign_stmt(cgProcedure *p, AstAssignStmt *as) { - if (as->op.kind == Token_Eq) { - auto lvals = array_make(permanent_allocator(), 0, as->lhs.count); - - for (Ast *lhs : as->lhs) { - cgAddr lval = {}; - if (!is_blank_ident(lhs)) { - lval = cg_build_addr(p, lhs); - } - array_add(&lvals, lval); - } - cg_build_assignment(p, lvals, as->rhs); - return; - } - - GB_ASSERT(as->lhs.count == 1); - GB_ASSERT(as->rhs.count == 1); - // NOTE(bill): Only 1 += 1 is allowed, no tuples - // +=, -=, etc - - i32 op_ = cast(i32)as->op.kind; - op_ += Token_Add - Token_AddEq; // Convert += to + - TokenKind op = cast(TokenKind)op_; - - if (op == Token_CmpAnd || op == Token_CmpOr) { - GB_PANIC("TODO(bill): cg_emit_logical_binary_expr"); - // Type *type = as->lhs[0]->tav.type; - // cgValue new_value = cg_emit_logical_binary_expr(p, op, as->lhs[0], as->rhs[0], type); - - // cgAddr lhs = cg_build_addr(p, as->lhs[0]); - // cg_addr_store(p, lhs, new_value); - } else { - cgAddr lhs = cg_build_addr(p, as->lhs[0]); - cgValue value = cg_build_expr(p, as->rhs[0]); - Type *lhs_type = cg_addr_type(lhs); - - // NOTE(bill): Allow for the weird edge case of: - // array *= matrix - if (op == Token_Mul && is_type_matrix(value.type) && is_type_array(lhs_type)) { - GB_PANIC("TODO(bill): array *= matrix"); - // cgValue old_value = cg_addr_load(p, lhs); - // Type *type = old_value.type; - // cgValue new_value = cg_emit_vector_mul_matrix(p, old_value, value, type); - // cg_addr_store(p, lhs, new_value); - // return; - } - - if (is_type_array(lhs_type)) { - GB_PANIC("TODO(bill): cg_build_assign_stmt_array"); - // cg_build_assign_stmt_array(p, op, lhs, value); - // return; - } else { - cgValue old_value = cg_addr_load(p, lhs); - Type *type = old_value.type; - - cgValue change = cg_emit_conv(p, value, type); - cgValue new_value = cg_emit_arith(p, op, old_value, change, type); - cg_addr_store(p, lhs, new_value); - } - } -} - -gb_internal void cg_build_return_stmt_internal_single(cgProcedure *p, cgValue result) { - Slice results = {}; - results.data = &result; - results.count = 1; - cg_build_return_stmt_internal(p, results); -} - - -gb_internal void cg_build_return_stmt_internal(cgProcedure *p, Slice const &results) { - TypeTuple *tuple = &p->type->Proc.results->Tuple; - isize return_count = p->type->Proc.result_count; - - if (return_count == 0) { - tb_inst_ret(p->func, 0, nullptr); - return; - } - - if (p->split_returns_index >= 0) { - GB_ASSERT(is_calling_convention_odin(p->type->Proc.calling_convention)); - - for (isize i = 0; i < return_count-1; i++) { - Entity *e = tuple->variables[i]; - TB_Node *ret_ptr = tb_inst_param(p->func, cast(int)(p->split_returns_index+i)); - cgValue ptr = cg_value(ret_ptr, alloc_type_pointer(e->type)); - cg_emit_store(p, ptr, results[i]); - } - - if (p->return_by_ptr) { - Entity *e = tuple->variables[return_count-1]; - TB_Node *ret_ptr = tb_inst_param(p->func, 0); - cgValue ptr = cg_value(ret_ptr, alloc_type_pointer(e->type)); - cg_emit_store(p, ptr, results[return_count-1]); - - tb_inst_ret(p->func, 0, nullptr); - return; - } else { - GB_ASSERT(p->proto->return_count == 1); - TB_DataType dt = TB_PROTOTYPE_RETURNS(p->proto)->dt; - - cgValue result = results[return_count-1]; - result = cg_flatten_value(p, result); - TB_Node *final_res = nullptr; - if (result.kind == cgValue_Addr) { - TB_CharUnits align = cast(TB_CharUnits)type_align_of(result.type); - final_res = tb_inst_load(p->func, dt, result.node, align, false); - } else { - GB_ASSERT(result.kind == cgValue_Value); - TB_DataType st = result.node->dt; - GB_ASSERT(st.type == dt.type); - if (st.raw == dt.raw) { - final_res = result.node; - } else if (st.type == TB_INT && st.data == 1) { - final_res = tb_inst_zxt(p->func, result.node, dt); - } else { - final_res = tb_inst_bitcast(p->func, result.node, dt); - } - } - GB_ASSERT(final_res != nullptr); - - tb_inst_ret(p->func, 1, &final_res); - return; - } - - } else { - GB_ASSERT_MSG(!is_calling_convention_odin(p->type->Proc.calling_convention), "missing %s", proc_calling_convention_strings[p->type->Proc.calling_convention]); - - if (p->return_by_ptr) { - Entity *e = tuple->variables[return_count-1]; - TB_Node *ret_ptr = tb_inst_param(p->func, 0); - cgValue ptr = cg_value(ret_ptr, alloc_type_pointer(e->type)); - cg_emit_store(p, ptr, results[return_count-1]); - - tb_inst_ret(p->func, 0, nullptr); - return; - } else { - GB_ASSERT(p->proto->return_count == 1); - TB_DataType dt = TB_PROTOTYPE_RETURNS(p->proto)->dt; - if (results.count == 1) { - cgValue result = results[0]; - result = cg_flatten_value(p, result); - - TB_Node *final_res = nullptr; - if (result.kind == cgValue_Addr) { - TB_CharUnits align = cast(TB_CharUnits)type_align_of(result.type); - final_res = tb_inst_load(p->func, dt, result.node, align, false); - } else { - GB_ASSERT(result.kind == cgValue_Value); - TB_DataType st = result.node->dt; - GB_ASSERT(st.type == dt.type); - if (st.raw == dt.raw) { - final_res = result.node; - } else if (st.type == TB_INT && st.data == 1) { - final_res = tb_inst_zxt(p->func, result.node, dt); - } else { - final_res = tb_inst_bitcast(p->func, result.node, dt); - } - } - - GB_ASSERT(final_res != nullptr); - - tb_inst_ret(p->func, 1, &final_res); - return; - } else { - GB_ASSERT_MSG(results.count == 1, "TODO(bill): multi-return values for the return"); - return; - } - } - - } -} - - -gb_internal void cg_build_return_stmt(cgProcedure *p, Slice const &return_results) { - TypeTuple *tuple = &p->type->Proc.results->Tuple; - isize return_count = p->type->Proc.result_count; - - if (return_count == 0) { - tb_inst_ret(p->func, 0, nullptr); - return; - } - TEMPORARY_ALLOCATOR_GUARD(); - - auto results = array_make(temporary_allocator(), 0, return_count); - - if (return_results.count != 0) { - for (isize i = 0; i < return_results.count; i++) { - cgValue res = cg_build_expr(p, return_results[i]); - cg_append_tuple_values(p, &results, res); - } - } else { - for_array(i, tuple->variables) { - Entity *e = tuple->variables[i]; - cgAddr addr = map_must_get(&p->variable_map, e); - cgValue res = cg_addr_load(p, addr); - array_add(&results, res); - } - } - GB_ASSERT(results.count == return_count); - - if (return_results.count != 0 && p->type->Proc.has_named_results) { - // NOTE(bill): store the named values before returning - for_array(i, tuple->variables) { - Entity *e = tuple->variables[i]; - cgAddr addr = map_must_get(&p->variable_map, e); - cg_addr_store(p, addr, results[i]); - } - } - for_array(i, tuple->variables) { - Entity *e = tuple->variables[i]; - results[i] = cg_emit_conv(p, results[i], e->type); - } - - cg_build_return_stmt_internal(p, slice_from_array(results)); -} - -gb_internal void cg_build_if_stmt(cgProcedure *p, Ast *node) { - ast_node(is, IfStmt, node); - cg_scope_open(p, is->scope); // Scope #1 - defer (cg_scope_close(p, cgDeferExit_Default, nullptr)); - - if (is->init != nullptr) { - TB_Node *init = cg_control_region(p, "if_init"); - cg_emit_goto(p, init); - tb_inst_set_control(p->func, init); - cg_build_stmt(p, is->init); - } - - TB_Node *then = cg_control_region(p, "if_then"); - TB_Node *done = cg_control_region(p, "if_done"); - TB_Node *else_ = done; - if (is->else_stmt != nullptr) { - else_ = cg_control_region(p, "if_else"); - } - - cgValue cond = cg_build_cond(p, is->cond, then, else_); - gb_unused(cond); - - if (is->label != nullptr) { - cgTargetList *tl = cg_push_target_list(p, is->label, done, nullptr, nullptr); - tl->is_block = true; - } - - // TODO(bill): should we do a constant check? - // Which philosophy are we following? - // - IR represents what the code represents (probably this) - // - IR represents what the code executes - - tb_inst_set_control(p->func, then); - - cg_build_stmt(p, is->body); - - cg_emit_goto(p, done); - - if (is->else_stmt != nullptr) { - tb_inst_set_control(p->func, else_); - - cg_scope_open(p, scope_of_node(is->else_stmt)); - cg_build_stmt(p, is->else_stmt); - cg_scope_close(p, cgDeferExit_Default, nullptr); - - cg_emit_goto(p, done); - } - - tb_inst_set_control(p->func, done); -} - -gb_internal void cg_build_for_stmt(cgProcedure *p, Ast *node) { - ast_node(fs, ForStmt, node); - - cg_scope_open(p, fs->scope); - defer (cg_scope_close(p, cgDeferExit_Default, nullptr)); - - if (fs->init != nullptr) { - TB_Node *init = cg_control_region(p, "for_init"); - cg_emit_goto(p, init); - tb_inst_set_control(p->func, init); - cg_build_stmt(p, fs->init); - } - TB_Node *body = cg_control_region(p, "for_body"); - TB_Node *done = cg_control_region(p, "for_done"); - TB_Node *loop = body; - if (fs->cond != nullptr) { - loop = cg_control_region(p, "for_loop"); - } - TB_Node *post = loop; - if (fs->post != nullptr) { - post = cg_control_region(p, "for_post"); - } - - cg_emit_goto(p, loop); - tb_inst_set_control(p->func, loop); - - if (loop != body) { - cg_build_cond(p, fs->cond, body, done); - tb_inst_set_control(p->func, body); - } - - cg_push_target_list(p, fs->label, done, post, nullptr); - cg_build_stmt(p, fs->body); - cg_pop_target_list(p); - - cg_emit_goto(p, post); - - if (fs->post != nullptr) { - tb_inst_set_control(p->func, post); - cg_build_stmt(p, fs->post); - cg_emit_goto(p, loop); - } - tb_inst_set_control(p->func, done); -} - - -gb_internal Ast *cg_strip_and_prefix(Ast *ident) { - if (ident != nullptr) { - if (ident->kind == Ast_UnaryExpr && ident->UnaryExpr.op.kind == Token_And) { - ident = ident->UnaryExpr.expr; - } - GB_ASSERT(ident->kind == Ast_Ident); - } - return ident; -} - -gb_internal void cg_emit_increment(cgProcedure *p, cgValue addr) { - GB_ASSERT(is_type_pointer(addr.type)); - Type *type = type_deref(addr.type); - cgValue v_one = cg_const_value(p, type, exact_value_i64(1)); - cg_emit_store(p, addr, cg_emit_arith(p, Token_Add, cg_emit_load(p, addr), v_one, type)); - -} - -gb_internal void cg_range_stmt_store_val(cgProcedure *p, Ast *stmt_val, cgValue const &value) { - Entity *e = entity_of_node(stmt_val); - if (e == nullptr) { - return; - } - - if (e->flags & EntityFlag_Value) { - if (value.kind == cgValue_Addr) { - cgValue ptr = cg_address_from_load_or_generate_local(p, value); - cg_add_entity(p->module, e, ptr); - return; - } - } - - cgAddr addr = cg_add_local(p, e->type, e, false); - cg_addr_store(p, addr, value); - return; -} - -gb_internal void cg_build_range_stmt_interval(cgProcedure *p, AstBinaryExpr *node, - AstRangeStmt *rs, Scope *scope) { - bool ADD_EXTRA_WRAPPING_CHECK = true; - - cg_scope_open(p, scope); - - Ast *val0 = rs->vals.count > 0 ? cg_strip_and_prefix(rs->vals[0]) : nullptr; - Ast *val1 = rs->vals.count > 1 ? cg_strip_and_prefix(rs->vals[1]) : nullptr; - Type *val0_type = nullptr; - Type *val1_type = nullptr; - if (val0 != nullptr && !is_blank_ident(val0)) { - val0_type = type_of_expr(val0); - } - if (val1 != nullptr && !is_blank_ident(val1)) { - val1_type = type_of_expr(val1); - } - - TokenKind op = Token_Lt; - switch (node->op.kind) { - case Token_Ellipsis: op = Token_LtEq; break; - case Token_RangeFull: op = Token_LtEq; break; - case Token_RangeHalf: op = Token_Lt; break; - default: GB_PANIC("Invalid interval operator"); break; - } - - - cgValue lower = cg_build_expr(p, node->left); - cgValue upper = {}; // initialized each time in the loop - - cgAddr value; - if (val0_type != nullptr) { - value = cg_add_local(p, val0_type, entity_of_node(val0), false); - } else { - value = cg_add_local(p, lower.type, nullptr, false); - } - cg_addr_store(p, value, lower); - - cgAddr index; - if (val1_type != nullptr) { - index = cg_add_local(p, val1_type, entity_of_node(val1), false); - } else { - index = cg_add_local(p, t_int, nullptr, false); - } - cg_addr_store(p, index, cg_const_int(p, t_int, 0)); - - TB_Node *loop = cg_control_region(p, "for_interval_loop"); - TB_Node *body = cg_control_region(p, "for_interval_body"); - TB_Node *done = cg_control_region(p, "for_interval_done"); - - cg_emit_goto(p, loop); - tb_inst_set_control(p->func, loop); - - upper = cg_build_expr(p, node->right); - cgValue curr_value = cg_addr_load(p, value); - cgValue cond = cg_emit_comp(p, op, curr_value, upper); - cg_emit_if(p, cond, body, done); - tb_inst_set_control(p->func, body); - - cgValue val = cg_addr_load(p, value); - cgValue idx = cg_addr_load(p, index); - - if (val0_type) cg_range_stmt_store_val(p, val0, val); - if (val1_type) cg_range_stmt_store_val(p, val1, idx); - - - { - // NOTE: this check block will most likely be optimized out, and is here - // to make this code easier to read - TB_Node *check = nullptr; - TB_Node *post = cg_control_region(p, "for_interval_post"); - - TB_Node *continue_block = post; - - if (ADD_EXTRA_WRAPPING_CHECK && - op == Token_LtEq) { - check = cg_control_region(p, "for_interval_check"); - continue_block = check; - } - - cg_push_target_list(p, rs->label, done, continue_block, nullptr); - - cg_build_stmt(p, rs->body); - - cg_scope_close(p, cgDeferExit_Default, nullptr); - cg_pop_target_list(p); - - if (check != nullptr) { - cg_emit_goto(p, check); - tb_inst_set_control(p->func, check); - - cgValue check_cond = cg_emit_comp(p, Token_NotEq, curr_value, upper); - cg_emit_if(p, check_cond, post, done); - } else { - cg_emit_goto(p, post); - } - - tb_inst_set_control(p->func, post); - cg_emit_increment(p, value.addr); - cg_emit_increment(p, index.addr); - cg_emit_goto(p, loop); - } - - tb_inst_set_control(p->func, done); -} - -gb_internal void cg_build_range_stmt_indexed(cgProcedure *p, cgValue expr, Type *val_type, cgValue count_ptr, - cgValue *val_, cgValue *idx_, TB_Node **loop_, TB_Node **done_, - bool is_reverse) { - cgValue count = {}; - Type *expr_type = base_type(type_deref(expr.type)); - switch (expr_type->kind) { - case Type_Array: - count = cg_const_int(p, t_int, expr_type->Array.count); - break; - } - - cgValue val = {}; - cgValue idx = {}; - TB_Node *loop = nullptr; - TB_Node *done = nullptr; - TB_Node *body = nullptr; - - loop = cg_control_region(p, "for_index_loop"); - body = cg_control_region(p, "for_index_body"); - done = cg_control_region(p, "for_index_done"); - - cgAddr index = cg_add_local(p, t_int, nullptr, false); - - if (!is_reverse) { - /* - for x, i in array { - ... - } - - i := -1 - for { - i += 1 - if !(i < len(array)) { - break - } - #no_bounds_check x := array[i] - ... - } - */ - - cg_addr_store(p, index, cg_const_int(p, t_int, cast(u64)-1)); - - cg_emit_goto(p, loop); - tb_inst_set_control(p->func, loop); - - cgValue incr = cg_emit_arith(p, Token_Add, cg_addr_load(p, index), cg_const_int(p, t_int, 1), t_int); - cg_addr_store(p, index, incr); - - if (count.node == nullptr) { - GB_ASSERT(count_ptr.node != nullptr); - count = cg_emit_load(p, count_ptr); - } - cgValue cond = cg_emit_comp(p, Token_Lt, incr, count); - cg_emit_if(p, cond, body, done); - } else { - // NOTE(bill): REVERSED LOGIC - /* - #reverse for x, i in array { - ... - } - - i := len(array) - for { - i -= 1 - if i < 0 { - break - } - #no_bounds_check x := array[i] - ... - } - */ - - if (count.node == nullptr) { - GB_ASSERT(count_ptr.node != nullptr); - count = cg_emit_load(p, count_ptr); - } - count = cg_emit_conv(p, count, t_int); - cg_addr_store(p, index, count); - - cg_emit_goto(p, loop); - tb_inst_set_control(p->func, loop); - - cgValue incr = cg_emit_arith(p, Token_Sub, cg_addr_load(p, index), cg_const_int(p, t_int, 1), t_int); - cg_addr_store(p, index, incr); - - cgValue anti_cond = cg_emit_comp(p, Token_Lt, incr, cg_const_int(p, t_int, 0)); - cg_emit_if(p, anti_cond, done, body); - } - - tb_inst_set_control(p->func, body); - - idx = cg_addr_load(p, index); - switch (expr_type->kind) { - case Type_Array: { - if (val_type != nullptr) { - val = cg_emit_load(p, cg_emit_array_ep(p, expr, idx)); - } - break; - } - case Type_EnumeratedArray: { - if (val_type != nullptr) { - val = cg_emit_load(p, cg_emit_array_ep(p, expr, idx)); - // NOTE(bill): Override the idx value for the enumeration - Type *index_type = expr_type->EnumeratedArray.index; - if (compare_exact_values(Token_NotEq, *expr_type->EnumeratedArray.min_value, exact_value_u64(0))) { - idx = cg_emit_arith(p, Token_Add, idx, cg_const_value(p, index_type, *expr_type->EnumeratedArray.min_value), index_type); - } - } - break; - } - case Type_Slice: { - if (val_type != nullptr) { - cgValue elem = cg_builtin_raw_data(p, expr); - val = cg_emit_load(p, cg_emit_ptr_offset(p, elem, idx)); - } - break; - } - case Type_DynamicArray: { - if (val_type != nullptr) { - cgValue elem = cg_emit_struct_ep(p, expr, 0); - elem = cg_emit_load(p, elem); - val = cg_emit_load(p, cg_emit_ptr_offset(p, elem, idx)); - } - break; - } - case Type_Struct: { - GB_ASSERT(is_type_soa_struct(expr_type)); - break; - } - - default: - GB_PANIC("Cannot do range_indexed of %s", type_to_string(expr_type)); - break; - } - - if (val_) *val_ = val; - if (idx_) *idx_ = idx; - if (loop_) *loop_ = loop; - if (done_) *done_ = done; - -} - -gb_internal void cg_build_range_stmt_enum(cgProcedure *p, Type *enum_type, Type *val_type, cgValue *val_, cgValue *idx_, TB_Node **loop_, TB_Node **done_) { - Type *t = enum_type; - GB_ASSERT(is_type_enum(t)); - t = base_type(t); - Type *core_elem = core_type(t); - GB_ASSERT(t->kind == Type_Enum); - i64 enum_count = t->Enum.fields.count; - cgValue max_count = cg_const_int(p, t_int, enum_count); - - cgValue ti = cg_type_info(p, t); - cgValue variant = cg_emit_struct_ep(p, ti, 4); - cgValue eti_ptr = cg_emit_conv(p, variant, t_type_info_enum_ptr); - cgValue values = cg_emit_load(p, cg_emit_struct_ep(p, eti_ptr, 2)); - cgValue values_data = cg_builtin_raw_data(p, values); - - cgAddr offset_ = cg_add_local(p, t_int, nullptr, false); - cg_addr_store(p, offset_, cg_const_int(p, t_int, 0)); - - TB_Node *loop = cg_control_region(p, "for_enum_loop"); - cg_emit_goto(p, loop); - tb_inst_set_control(p->func, loop); - - TB_Node *body = cg_control_region(p, "for_enum_body"); - TB_Node *done = cg_control_region(p, "for_enum_done"); - - cgValue offset = cg_addr_load(p, offset_); - cgValue cond = cg_emit_comp(p, Token_Lt, offset, max_count); - cg_emit_if(p, cond, body, done); - tb_inst_set_control(p->func, body); - - cgValue val_ptr = cg_emit_ptr_offset(p, values_data, offset); - cg_emit_increment(p, offset_.addr); - - cgValue val = {}; - if (val_type != nullptr) { - GB_ASSERT(are_types_identical(enum_type, val_type)); - - if (is_type_integer(core_elem)) { - cgValue i = cg_emit_load(p, cg_emit_conv(p, val_ptr, t_i64_ptr)); - val = cg_emit_conv(p, i, t); - } else { - GB_PANIC("TODO(bill): enum core type %s", type_to_string(core_elem)); - } - } - - if (val_) *val_ = val; - if (idx_) *idx_ = offset; - if (loop_) *loop_ = loop; - if (done_) *done_ = done; -} - -gb_internal void cg_build_range_stmt_struct_soa(cgProcedure *p, AstRangeStmt *rs, Scope *scope) { - Ast *expr = unparen_expr(rs->expr); - TypeAndValue tav = type_and_value_of_expr(expr); - - TB_Node *loop = nullptr; - TB_Node *body = nullptr; - TB_Node *done = nullptr; - - bool is_reverse = rs->reverse; - - cg_scope_open(p, scope); - - Ast *val0 = rs->vals.count > 0 ? cg_strip_and_prefix(rs->vals[0]) : nullptr; - Ast *val1 = rs->vals.count > 1 ? cg_strip_and_prefix(rs->vals[1]) : nullptr; - Type *val_types[2] = {}; - if (val0 != nullptr && !is_blank_ident(val0)) { - val_types[0] = type_of_expr(val0); - } - if (val1 != nullptr && !is_blank_ident(val1)) { - val_types[1] = type_of_expr(val1); - } - - cgAddr array = cg_build_addr(p, expr); - if (is_type_pointer(cg_addr_type(array))) { - array = cg_addr(cg_addr_load(p, array)); - } - cgValue count = cg_builtin_len(p, cg_addr_load(p, array)); - - - cgAddr index = cg_add_local(p, t_int, nullptr, false); - - if (!is_reverse) { - /* - for x, i in array { - ... - } - - i := -1 - for { - i += 1 - if !(i < len(array)) { - break - } - x := array[i] // but #soa-ified - ... - } - */ - - cg_addr_store(p, index, cg_const_int(p, t_int, cast(u64)-1)); - - loop = cg_control_region(p, "for_soa_loop"); - cg_emit_goto(p, loop); - tb_inst_set_control(p->func, loop); - - cgValue incr = cg_emit_arith(p, Token_Add, cg_addr_load(p, index), cg_const_int(p, t_int, 1), t_int); - cg_addr_store(p, index, incr); - - body = cg_control_region(p, "for_soa_body"); - done = cg_control_region(p, "for_soa_done"); - - cgValue cond = cg_emit_comp(p, Token_Lt, incr, count); - cg_emit_if(p, cond, body, done); - } else { - // NOTE(bill): REVERSED LOGIC - /* - #reverse for x, i in array { - ... - } - - i := len(array) - for { - i -= 1 - if i < 0 { - break - } - #no_bounds_check x := array[i] // but #soa-ified - ... - } - */ - cg_addr_store(p, index, count); - - loop = cg_control_region(p, "for_soa_loop"); - cg_emit_goto(p, loop); - tb_inst_set_control(p->func, loop); - - cgValue incr = cg_emit_arith(p, Token_Sub, cg_addr_load(p, index), cg_const_int(p, t_int, 1), t_int); - cg_addr_store(p, index, incr); - - body = cg_control_region(p, "for_soa_body"); - done = cg_control_region(p, "for_soa_done"); - - cgValue cond = cg_emit_comp(p, Token_Lt, incr, cg_const_int(p, t_int, 0)); - cg_emit_if(p, cond, done, body); - } - tb_inst_set_control(p->func, body); - - - if (val_types[0]) { - Entity *e = entity_of_node(val0); - if (e != nullptr) { - cgAddr soa_val = cg_addr_soa_variable(array.addr, cg_addr_load(p, index), nullptr); - map_set(&p->soa_values_map, e, soa_val); - } - } - if (val_types[1]) { - cg_range_stmt_store_val(p, val1, cg_addr_load(p, index)); - } - - - cg_push_target_list(p, rs->label, done, loop, nullptr); - - cg_build_stmt(p, rs->body); - - cg_scope_close(p, cgDeferExit_Default, nullptr); - cg_pop_target_list(p); - cg_emit_goto(p, loop); - tb_inst_set_control(p->func, done); - -} - - -gb_internal void cg_build_range_stmt(cgProcedure *p, Ast *node) { - ast_node(rs, RangeStmt, node); - - Ast *expr = unparen_expr(rs->expr); - - if (is_ast_range(expr)) { - cg_build_range_stmt_interval(p, &expr->BinaryExpr, rs, rs->scope); - return; - } - - Type *expr_type = type_of_expr(expr); - if (expr_type != nullptr) { - Type *et = base_type(type_deref(expr_type)); - if (is_type_soa_struct(et)) { - cg_build_range_stmt_struct_soa(p, rs, rs->scope); - return; - } - } - - cg_scope_open(p, rs->scope); - - - Ast *val0 = rs->vals.count > 0 ? cg_strip_and_prefix(rs->vals[0]) : nullptr; - Ast *val1 = rs->vals.count > 1 ? cg_strip_and_prefix(rs->vals[1]) : nullptr; - Type *val0_type = nullptr; - Type *val1_type = nullptr; - if (val0 != nullptr && !is_blank_ident(val0)) { - val0_type = type_of_expr(val0); - } - if (val1 != nullptr && !is_blank_ident(val1)) { - val1_type = type_of_expr(val1); - } - - cgValue val = {}; - cgValue key = {}; - TB_Node *loop = nullptr; - TB_Node *done = nullptr; - bool is_map = false; - TypeAndValue tav = type_and_value_of_expr(expr); - - if (tav.mode == Addressing_Type) { - cg_build_range_stmt_enum(p, type_deref(tav.type), val0_type, &val, &key, &loop, &done); - } else { - Type *expr_type = type_of_expr(expr); - Type *et = base_type(type_deref(expr_type)); - switch (et->kind) { - case Type_Map: { - is_map = true; - cgValue map = cg_build_addr_ptr(p, expr); - if (is_type_pointer(type_deref(map.type))) { - map = cg_emit_load(p, map); - } - GB_PANIC("TODO(bill): cg_build_range_map"); - // cg_build_range_map(p, map, val1_type, &val, &key, &loop, &done); - break; - } - case Type_Array: { - cgValue array = cg_build_addr_ptr(p, expr); - if (is_type_pointer(type_deref(array.type))) { - array = cg_emit_load(p, array); - } - cgAddr count_ptr = cg_add_local(p, t_int, nullptr, false); - cg_addr_store(p, count_ptr, cg_const_int(p, t_int, et->Array.count)); - cg_build_range_stmt_indexed(p, array, val0_type, count_ptr.addr, &val, &key, &loop, &done, rs->reverse); - break; - } - case Type_EnumeratedArray: { - cgValue array = cg_build_addr_ptr(p, expr); - if (is_type_pointer(type_deref(array.type))) { - array = cg_emit_load(p, array); - } - cgAddr count_ptr = cg_add_local(p, t_int, nullptr, false); - cg_addr_store(p, count_ptr, cg_const_int(p, t_int, et->EnumeratedArray.count)); - cg_build_range_stmt_indexed(p, array, val0_type, count_ptr.addr, &val, &key, &loop, &done, rs->reverse); - break; - } - case Type_DynamicArray: { - cgValue count_ptr = {}; - cgValue array = cg_build_addr_ptr(p, expr); - if (is_type_pointer(type_deref(array.type))) { - array = cg_emit_load(p, array); - } - count_ptr = cg_emit_struct_ep(p, array, 1); - cg_build_range_stmt_indexed(p, array, val0_type, count_ptr, &val, &key, &loop, &done, rs->reverse); - break; - } - case Type_Slice: { - cgValue count_ptr = {}; - cgValue slice = cg_build_expr(p, expr); - if (is_type_pointer(slice.type)) { - count_ptr = cg_emit_struct_ep(p, slice, 1); - slice = cg_emit_load(p, slice); - } else { - count_ptr = cg_add_local(p, t_int, nullptr, false).addr; - cg_emit_store(p, count_ptr, cg_builtin_len(p, slice)); - } - cg_build_range_stmt_indexed(p, slice, val0_type, count_ptr, &val, &key, &loop, &done, rs->reverse); - break; - } - case Type_Basic: { - cgValue string = cg_build_expr(p, expr); - if (is_type_pointer(string.type)) { - string = cg_emit_load(p, string); - } - if (is_type_untyped(expr_type)) { - cgAddr s = cg_add_local(p, default_type(string.type), nullptr, false); - cg_addr_store(p, s, string); - string = cg_addr_load(p, s); - } - Type *t = base_type(string.type); - GB_ASSERT(!is_type_cstring(t)); - GB_PANIC("TODO(bill): cg_build_range_string"); - // cg_build_range_string(p, string, val0_type, &val, &key, &loop, &done, rs->reverse); - break; - } - case Type_Tuple: - GB_PANIC("TODO(bill): cg_build_range_tuple"); - // cg_build_range_tuple(p, expr, val0_type, val1_type, &val, &key, &loop, &done); - break; - default: - GB_PANIC("Cannot range over %s", type_to_string(expr_type)); - break; - } - } - - if (is_map) { - if (val0_type) cg_range_stmt_store_val(p, val0, key); - if (val1_type) cg_range_stmt_store_val(p, val1, val); - } else { - if (val0_type) cg_range_stmt_store_val(p, val0, val); - if (val1_type) cg_range_stmt_store_val(p, val1, key); - } - - cg_push_target_list(p, rs->label, done, loop, nullptr); - - cg_build_stmt(p, rs->body); - - cg_scope_close(p, cgDeferExit_Default, nullptr); - cg_pop_target_list(p); - cg_emit_goto(p, loop); - tb_inst_set_control(p->func, done); -} - -gb_internal bool cg_switch_stmt_can_be_trivial_jump_table(AstSwitchStmt *ss) { - if (ss->tag == nullptr) { - return false; - } - enum { DISALLOW_64_SWITCH = true }; - - bool is_typeid = false; - TypeAndValue tv = type_and_value_of_expr(ss->tag); - if (is_type_integer(core_type(tv.type))) { - i64 sz = type_size_of(tv.type); - if (sz > 8) { - return false; - } - if (DISALLOW_64_SWITCH && sz == 8) { - return false; - } - // okay - } else if (is_type_typeid(tv.type)) { - // okay - is_typeid = true; - if (DISALLOW_64_SWITCH && build_context.ptr_size == 8) { - return false; - } - } else { - return false; - } - - ast_node(body, BlockStmt, ss->body); - for (Ast *clause : body->stmts) { - ast_node(cc, CaseClause, clause); - - if (cc->list.count == 0) { - continue; - } - - for (Ast *expr : cc->list) { - expr = unparen_expr(expr); - if (is_ast_range(expr)) { - return false; - } - if (expr->tav.mode == Addressing_Type) { - GB_ASSERT(is_typeid); - continue; - } - tv = type_and_value_of_expr(expr); - if (tv.mode != Addressing_Constant) { - return false; - } - if (!is_type_integer(core_type(tv.type))) { - return false; - } - } - - } - - return true; -} - - -gb_internal void cg_build_switch_stmt(cgProcedure *p, Ast *node) { - ast_node(ss, SwitchStmt, node); - cg_scope_open(p, ss->scope); - - if (ss->init != nullptr) { - cg_build_stmt(p, ss->init); - } - cgValue tag = {}; - if (ss->tag != nullptr) { - tag = cg_build_expr(p, ss->tag); - } else { - tag = cg_const_bool(p, t_bool, true); - } - - TB_Node *done = cg_control_region(p, "switch_done"); - - ast_node(body, BlockStmt, ss->body); - - isize case_count = body->stmts.count; - Slice default_stmts = {}; - TB_Node *default_fall = nullptr; - TB_Node *default_block = nullptr; - Scope * default_scope = nullptr; - TB_Node *fall = nullptr; - - - auto body_regions = slice_make(permanent_allocator(), body->stmts.count); - auto body_scopes = slice_make(permanent_allocator(), body->stmts.count); - for_array(i, body->stmts) { - Ast *clause = body->stmts[i]; - ast_node(cc, CaseClause, clause); - - body_regions[i] = cg_control_region(p, cc->list.count == 0 ? "switch_default_body" : "switch_case_body"); - body_scopes[i] = cc->scope; - if (cc->list.count == 0) { - default_block = body_regions[i]; - default_scope = cc->scope; - } - } - - bool is_trivial = cg_switch_stmt_can_be_trivial_jump_table(ss); - if (is_trivial) { - isize key_count = 0; - for (Ast *clause : body->stmts) { - ast_node(cc, CaseClause, clause); - key_count += cc->list.count; - } - TB_SwitchEntry *keys = gb_alloc_array(temporary_allocator(), TB_SwitchEntry, key_count); - isize key_index = 0; - for_array(i, body->stmts) { - Ast *clause = body->stmts[i]; - ast_node(cc, CaseClause, clause); - - TB_Node *region = body_regions[i]; - for (Ast *expr : cc->list) { - i64 key = 0; - expr = unparen_expr(expr); - GB_ASSERT(!is_ast_range(expr)); - if (expr->tav.mode == Addressing_Type) { - Type *type = expr->tav.value.value_typeid; - if (type == nullptr || type == t_invalid) { - type = expr->tav.type; - } - key = cg_typeid_as_u64(p->module, type); - } else { - auto tv = type_and_value_of_expr(expr); - GB_ASSERT(tv.mode == Addressing_Constant); - key = exact_value_to_i64(tv.value); - } - keys[key_index++] = {key, region}; - } - } - GB_ASSERT(key_index == key_count); - - TB_Node *end_block = done; - if (default_block) { - end_block = default_block; - } - - TB_DataType dt = cg_data_type(tag.type); - GB_ASSERT(tag.kind == cgValue_Value); - GB_ASSERT(!TB_IS_VOID_TYPE(dt)); - - tb_inst_branch(p->func, dt, tag.node, end_block, key_count, keys); - } - - for_array(i, body->stmts) { - Ast *clause = body->stmts[i]; - ast_node(cc, CaseClause, clause); - - TB_Node *body_region = body_regions[i]; - Scope *body_scope = body_scopes[i]; - fall = done; - if (i+1 < case_count) { - fall = body_regions[i+1]; - } - - if (cc->list.count == 0) { - // default case - default_stmts = cc->stmts; - default_fall = fall; - GB_ASSERT(default_block == body_region); - continue; - } - - TB_Node *next_cond = nullptr; - if (!is_trivial) for (Ast *expr : cc->list) { - expr = unparen_expr(expr); - - next_cond = cg_control_region(p, "switch_case_next"); - - cgValue cond = {}; - if (is_ast_range(expr)) { - ast_node(ie, BinaryExpr, expr); - TokenKind op = Token_Invalid; - switch (ie->op.kind) { - case Token_Ellipsis: op = Token_LtEq; break; - case Token_RangeFull: op = Token_LtEq; break; - case Token_RangeHalf: op = Token_Lt; break; - default: GB_PANIC("Invalid interval operator"); break; - } - cgValue lhs = cg_build_expr(p, ie->left); - cgValue rhs = cg_build_expr(p, ie->right); - - cgValue cond_lhs = cg_emit_comp(p, Token_LtEq, lhs, tag); - cgValue cond_rhs = cg_emit_comp(p, op, tag, rhs); - cond = cg_emit_arith(p, Token_And, cond_lhs, cond_rhs, t_bool); - } else { - if (expr->tav.mode == Addressing_Type) { - GB_ASSERT(is_type_typeid(tag.type)); - cgValue e = cg_typeid(p, expr->tav.type); - e = cg_emit_conv(p, e, tag.type); - cond = cg_emit_comp(p, Token_CmpEq, tag, e); - } else { - cond = cg_emit_comp(p, Token_CmpEq, tag, cg_build_expr(p, expr)); - } - } - - GB_ASSERT(cond.kind == cgValue_Value); - tb_inst_if(p->func, cond.node, body_region, next_cond); - tb_inst_set_control(p->func, next_cond); - } - - tb_inst_set_control(p->func, body_region); - - cg_push_target_list(p, ss->label, done, nullptr, fall); - cg_scope_open(p, body_scope); - cg_build_stmt_list(p, cc->stmts); - cg_scope_close(p, cgDeferExit_Default, body_region); - cg_pop_target_list(p); - - cg_emit_goto(p, done); - tb_inst_set_control(p->func, next_cond); - } - - if (default_block != nullptr) { - if (!is_trivial) { - cg_emit_goto(p, default_block); - } - tb_inst_set_control(p->func, default_block); - - cg_push_target_list(p, ss->label, done, nullptr, default_fall); - cg_scope_open(p, default_scope); - cg_build_stmt_list(p, default_stmts); - cg_scope_close(p, cgDeferExit_Default, default_block); - cg_pop_target_list(p); - } - - - cg_emit_goto(p, done); - tb_inst_set_control(p->func, done); - - cg_scope_close(p, cgDeferExit_Default, done); -} - -gb_internal void cg_build_type_switch_stmt(cgProcedure *p, Ast *node) { - ast_node(ss, TypeSwitchStmt, node); - - TB_Node *done_region = cg_control_region(p, "typeswitch_done"); - TB_Node *else_region = done_region; - TB_Node *default_region = nullptr; - isize num_cases = 0; - - cg_scope_open(p, ss->scope); - defer (cg_scope_close(p, cgDeferExit_Default, done_region)); - - ast_node(as, AssignStmt, ss->tag); - GB_ASSERT(as->lhs.count == 1); - GB_ASSERT(as->rhs.count == 1); - - cgValue parent = cg_build_expr(p, as->rhs[0]); - bool is_parent_ptr = is_type_pointer(parent.type); - Type *parent_base_type = type_deref(parent.type); - gb_unused(parent_base_type); - - TypeSwitchKind switch_kind = check_valid_type_switch_type(parent.type); - GB_ASSERT(switch_kind != TypeSwitch_Invalid); - - - cgValue parent_value = parent; - - cgValue parent_ptr = parent; - if (!is_parent_ptr) { - parent_ptr = cg_address_from_load_or_generate_local(p, parent); - } - - cgValue tag = {}; - cgValue union_data = {}; - if (switch_kind == TypeSwitch_Union) { - union_data = cg_emit_conv(p, parent_ptr, t_rawptr); - Type *union_type = type_deref(parent_ptr.type); - if (is_type_union_maybe_pointer(union_type)) { - tag = cg_emit_conv(p, cg_emit_comp_against_nil(p, Token_NotEq, union_data), t_int); - } else if (union_tag_size(union_type) == 0) { - tag = {}; // there is no tag for a zero sized union - } else { - cgValue tag_ptr = cg_emit_union_tag_ptr(p, parent_ptr); - tag = cg_emit_load(p, tag_ptr); - } - } else if (switch_kind == TypeSwitch_Any) { - tag = cg_emit_load(p, cg_emit_struct_ep(p, parent_ptr, 1)); - } else { - GB_PANIC("Unknown switch kind"); - } - - ast_node(body, BlockStmt, ss->body); - - for (Ast *clause : body->stmts) { - ast_node(cc, CaseClause, clause); - num_cases += cc->list.count; - if (cc->list.count == 0) { - GB_ASSERT(default_region == nullptr); - default_region = cg_control_region(p, "typeswitch_default_body"); - else_region = default_region; - } - } - - bool all_by_reference = false; - for (Ast *clause : body->stmts) { - ast_node(cc, CaseClause, clause); - if (cc->list.count != 1) { - continue; - } - Entity *case_entity = implicit_entity_of_node(clause); - all_by_reference |= (case_entity->flags & EntityFlag_Value) == 0; - break; - } - - TB_Node *backing_ptr = nullptr; - if (!all_by_reference) { - bool variants_found = false; - i64 max_size = 0; - i64 max_align = 1; - for (Ast *clause : body->stmts) { - ast_node(cc, CaseClause, clause); - if (cc->list.count != 1) { - continue; - } - Entity *case_entity = implicit_entity_of_node(clause); - if (!is_type_untyped_nil(case_entity->type)) { - max_size = gb_max(max_size, type_size_of(case_entity->type)); - max_align = gb_max(max_align, type_align_of(case_entity->type)); - variants_found = true; - } - } - if (variants_found) { - backing_ptr = tb_inst_local(p->func, cast(TB_CharUnits)max_size, cast(TB_CharUnits)max_align); - } - } - - TEMPORARY_ALLOCATOR_GUARD(); - TB_Node **control_regions = gb_alloc_array(temporary_allocator(), TB_Node *, body->stmts.count); - TB_SwitchEntry *switch_entries = gb_alloc_array(temporary_allocator(), TB_SwitchEntry, num_cases); - - isize case_index = 0; - for_array(i, body->stmts) { - Ast *clause = body->stmts[i]; - ast_node(cc, CaseClause, clause); - if (cc->list.count == 0) { - control_regions[i] = default_region; - continue; - } - - TB_Node *region = cg_control_region(p, "typeswitch_body"); - control_regions[i] = region; - - for (Ast *type_expr : cc->list) { - Type *case_type = type_of_expr(type_expr); - i64 key = -1; - if (switch_kind == TypeSwitch_Union) { - Type *ut = base_type(type_deref(parent.type)); - if (is_type_untyped_nil(case_type)) { - key = 0; - } else { - key = union_variant_index(ut, case_type); - } - } else if (switch_kind == TypeSwitch_Any) { - if (is_type_untyped_nil(case_type)) { - key = 0; - } else { - key = cast(i64)cg_typeid_as_u64(p->module, case_type); - } - } - GB_ASSERT(key >= 0); - - switch_entries[case_index++] = TB_SwitchEntry{key, region}; - } - } - - GB_ASSERT(case_index == num_cases); - - { - TB_DataType dt = {}; - TB_Node *key = nullptr; - if (type_size_of(parent_base_type) == 0) { - GB_ASSERT(tag.node == nullptr); - key = tb_inst_bool(p->func, false); - dt = cg_data_type(t_bool); - } else { - GB_ASSERT(tag.kind == cgValue_Value && tag.node != nullptr); - dt = cg_data_type(tag.type); - key = tag.node; - } - - GB_ASSERT(!TB_IS_VOID_TYPE(dt)); - tb_inst_branch(p->func, dt, key, else_region, num_cases, switch_entries); - } - - - for_array(i, body->stmts) { - Ast *clause = body->stmts[i]; - ast_node(cc, CaseClause, clause); - - bool saw_nil = false; - for (Ast *type_expr : cc->list) { - Type *case_type = type_of_expr(type_expr); - if (is_type_untyped_nil(case_type)) { - saw_nil = true; - } - } - - Entity *case_entity = implicit_entity_of_node(clause); - bool by_reference = (case_entity->flags & EntityFlag_Value) == 0; - - cg_scope_open(p, cc->scope); - - TB_Node *body_region = control_regions[i]; - tb_inst_set_control(p->func, body_region); - - if (cc->list.count == 1 && !saw_nil) { - cgValue data = {}; - if (switch_kind == TypeSwitch_Union) { - data = union_data; - } else if (switch_kind == TypeSwitch_Any) { - data = cg_emit_load(p, cg_emit_struct_ep(p, parent_ptr, 0)); - } - GB_ASSERT(data.kind == cgValue_Value); - - Type *ct = case_entity->type; - Type *ct_ptr = alloc_type_pointer(ct); - - cgValue ptr = {}; - - if (backing_ptr) { // by value - GB_ASSERT(!by_reference); - - i64 size = type_size_of(case_entity->type); - i64 align = type_align_of(case_entity->type); - - // make a copy of the case value - tb_inst_memcpy(p->func, - backing_ptr, // dst - data.node, // src - tb_inst_uint(p->func, TB_TYPE_INT, size), - cast(TB_CharUnits)align - ); - - ptr = cg_value(backing_ptr, ct_ptr); - - } else { // by reference - GB_ASSERT(by_reference); - ptr = cg_emit_conv(p, data, ct_ptr); - } - GB_ASSERT(are_types_identical(case_entity->type, type_deref(ptr.type))); - - cg_add_entity(p->module, case_entity, ptr); - String name = case_entity->token.string; - tb_function_attrib_variable(p->func, ptr.node, nullptr, name.len, cast(char const *)name.text, cg_debug_type(p->module, ct)); - } else { - if (case_entity->flags & EntityFlag_Value) { - // by value - cgAddr x = cg_add_local(p, case_entity->type, case_entity, false); - cg_addr_store(p, x, parent_value); - } else { - // by reference - cg_add_entity(p->module, case_entity, parent_value); - } - } - - cg_push_target_list(p, ss->label, done_region, nullptr, nullptr); - cg_build_stmt_list(p, cc->stmts); - cg_scope_close(p, cgDeferExit_Default, body_region); - cg_pop_target_list(p); - - cg_emit_goto(p, done_region); - } - - cg_emit_goto(p, done_region); - tb_inst_set_control(p->func, done_region); -} - - -gb_internal void cg_build_mutable_value_decl(cgProcedure *p, Ast *node) { - ast_node(vd, ValueDecl, node); - if (!vd->is_mutable) { - return; - } - - bool is_static = false; - for (Ast *name : vd->names) if (!is_blank_ident(name)) { - // NOTE(bill): Sanity check to check for the existence of the variable's Entity - GB_ASSERT(name->kind == Ast_Ident); - Entity *e = entity_of_node(name); - TokenPos pos = ast_token(name).pos; - GB_ASSERT_MSG(e != nullptr, "\n%s missing entity for %.*s", token_pos_to_string(pos), LIT(name->Ident.token.string)); - if (e->flags & EntityFlag_Static) { - // NOTE(bill): If one of the entities is static, they all are - is_static = true; - } - } - - if (is_static) { - for_array(i, vd->names) { - Ast *ident = vd->names[i]; - GB_ASSERT(!is_blank_ident(ident)); - Entity *e = entity_of_node(ident); - GB_ASSERT(e->flags & EntityFlag_Static); - String name = e->token.string; - - String mangled_name = {}; - { - gbString str = gb_string_make_length(permanent_allocator(), p->name.text, p->name.len); - str = gb_string_appendc(str, "-"); - str = gb_string_append_fmt(str, ".%.*s-%llu", LIT(name), cast(long long)e->id); - mangled_name.text = cast(u8 *)str; - mangled_name.len = gb_string_length(str); - } - - cgModule *m = p->module; - - TB_DebugType *debug_type = cg_debug_type(m, e->type); - TB_Global *global = tb_global_create(m->mod, mangled_name.len, cast(char const *)mangled_name.text, debug_type, TB_LINKAGE_PRIVATE); - - TB_ModuleSectionHandle section = tb_module_get_data(m->mod); - if (e->Variable.thread_local_model != "") { - section = tb_module_get_tls(m->mod); - String model = e->Variable.thread_local_model; - if (model == "default") { - // TODO(bill): Thread Local Storage models - } else if (model == "localdynamic") { - // TODO(bill): Thread Local Storage models - } else if (model == "initialexec") { - // TODO(bill): Thread Local Storage models - } else if (model == "localexec") { - // TODO(bill): Thread Local Storage models - } else { - GB_PANIC("Unhandled thread local mode %.*s", LIT(model)); - } - } - - i64 max_objects = 0; - ExactValue value = {}; - - if (vd->values.count > 0) { - GB_ASSERT(vd->names.count == vd->values.count); - Ast *ast_value = vd->values[i]; - GB_ASSERT(ast_value->tav.mode == Addressing_Constant || - ast_value->tav.mode == Addressing_Invalid); - - value = ast_value->tav.value; - max_objects = cg_global_const_calculate_region_count(value, e->type); - } - tb_global_set_storage(m->mod, section, global, type_size_of(e->type), type_align_of(e->type), max_objects); - - cg_global_const_add_region(m, value, e->type, global, 0); - - TB_Node *node = tb_inst_get_symbol_address(p->func, cast(TB_Symbol *)global); - cgValue global_val = cg_value(node, alloc_type_pointer(e->type)); - cg_add_entity(p->module, e, global_val); - cg_add_member(p->module, mangled_name, global_val); - } - return; - } - - TEMPORARY_ALLOCATOR_GUARD(); - - - - auto inits = array_make(temporary_allocator(), 0, vd->values.count != 0 ? vd->names.count : 0); - for (Ast *rhs : vd->values) { - cgValue init = cg_build_expr(p, rhs); - cg_append_tuple_values(p, &inits, init); - } - - - auto lvals = slice_make(temporary_allocator(), vd->names.count); - for_array(i, vd->names) { - Ast *name = vd->names[i]; - if (!is_blank_ident(name)) { - Entity *e = entity_of_node(name); - bool zero_init = vd->values.count == 0; - if (vd->names.count == vd->values.count) { - Ast *expr = unparen_expr(vd->values[i]); - if (expr->kind == Ast_CompoundLit && - inits[i].kind == cgValue_Addr) { - TB_Node *ptr = inits[i].node; - - if (e != nullptr && e->token.string.len > 0 && e->token.string != "_") { - // NOTE(bill): for debugging purposes only - String name = e->token.string; - TB_DebugType *debug_type = cg_debug_type(p->module, e->type); - tb_function_attrib_variable(p->func, ptr, nullptr, name.len, cast(char const *)name.text, debug_type); - } - - cgAddr addr = cg_addr(inits[i]); - map_set(&p->variable_map, e, addr); - continue; - } - } - - lvals[i] = cg_add_local(p, e->type, e, zero_init); - } - } - - - GB_ASSERT(vd->values.count == 0 || lvals.count == inits.count); - for_array(i, inits) { - cgAddr lval = lvals[i]; - cgValue init = inits[i]; - cg_addr_store(p, lval, init); - } -} - - -gb_internal void cg_build_stmt(cgProcedure *p, Ast *node) { - Ast *prev_stmt = p->curr_stmt; - defer (p->curr_stmt = prev_stmt); - p->curr_stmt = node; - - // TODO(bill): check if last instruction was a terminating one or not - - cg_set_debug_pos_from_node(p, node); - - u16 prev_state_flags = p->state_flags; - defer (p->state_flags = prev_state_flags); - - if (node->state_flags != 0) { - u16 in = node->state_flags; - u16 out = p->state_flags; - - if (in & StateFlag_bounds_check) { - out |= StateFlag_bounds_check; - out &= ~StateFlag_no_bounds_check; - } else if (in & StateFlag_no_bounds_check) { - out |= StateFlag_no_bounds_check; - out &= ~StateFlag_bounds_check; - } - if (in & StateFlag_no_type_assert) { - out |= StateFlag_no_type_assert; - out &= ~StateFlag_type_assert; - } else if (in & StateFlag_type_assert) { - out |= StateFlag_type_assert; - out &= ~StateFlag_no_type_assert; - } - - p->state_flags = out; - } - - switch (node->kind) { - case_ast_node(bs, EmptyStmt, node); - case_end; - - case_ast_node(us, UsingStmt, node); - case_end; - - case_ast_node(ws, WhenStmt, node); - cg_build_when_stmt(p, ws); - case_end; - - case_ast_node(bs, BlockStmt, node); - TB_Node *done = nullptr; - if (bs->label != nullptr) { - done = cg_control_region(p, "block_done"); - cgTargetList *tl = cg_push_target_list(p, bs->label, done, nullptr, nullptr); - tl->is_block = true; - } - - cg_scope_open(p, bs->scope); - cg_build_stmt_list(p, bs->stmts); - cg_scope_close(p, cgDeferExit_Default, nullptr); - - if (done != nullptr) { - cg_emit_goto(p, done); - tb_inst_set_control(p->func, done); - } - - if (bs->label != nullptr) { - cg_pop_target_list(p); - } - case_end; - - case_ast_node(vd, ValueDecl, node); - cg_build_mutable_value_decl(p, node); - case_end; - - case_ast_node(bs, BranchStmt, node); - TB_Node *block = nullptr; - - if (bs->label != nullptr) { - cgBranchRegions bb = cg_lookup_branch_regions(p, bs->label); - switch (bs->token.kind) { - case Token_break: block = bb.break_; break; - case Token_continue: block = bb.continue_; break; - case Token_fallthrough: - GB_PANIC("fallthrough cannot have a label"); - break; - } - } else { - for (cgTargetList *t = p->target_list; t != nullptr && block == nullptr; t = t->prev) { - if (t->is_block) { - continue; - } - - switch (bs->token.kind) { - case Token_break: block = t->break_; break; - case Token_continue: block = t->continue_; break; - case Token_fallthrough: block = t->fallthrough_; break; - } - } - } - GB_ASSERT(block != nullptr); - - cg_emit_defer_stmts(p, cgDeferExit_Branch, block); - cg_emit_goto(p, block); - case_end; - - case_ast_node(es, ExprStmt, node); - cg_build_expr(p, es->expr); - case_end; - - case_ast_node(as, AssignStmt, node); - cg_build_assign_stmt(p, as); - case_end; - - case_ast_node(rs, ReturnStmt, node); - cg_build_return_stmt(p, rs->results); - case_end; - - case_ast_node(is, IfStmt, node); - cg_build_if_stmt(p, node); - case_end; - - case_ast_node(fs, ForStmt, node); - cg_build_for_stmt(p, node); - case_end; - - case_ast_node(rs, RangeStmt, node); - cg_build_range_stmt(p, node); - case_end; - - case_ast_node(rs, UnrollRangeStmt, node); - GB_PANIC("TODO(bill): lb_build_unroll_range_stmt"); - // cg_build_range_stmt(p, rs, rs->scope); - case_end; - - case_ast_node(fs, SwitchStmt, node); - cg_build_switch_stmt(p, node); - case_end; - - case_ast_node(ts, TypeSwitchStmt, node); - cg_build_type_switch_stmt(p, node); - case_end; - - case_ast_node(ds, DeferStmt, node); - Type *pt = base_type(p->type); - GB_ASSERT(pt->kind == Type_Proc); - if (pt->Proc.calling_convention == ProcCC_Odin) { - GB_ASSERT(p->context_stack.count != 0); - } - - cgDefer *d = array_add_and_get(&p->defer_stack); - d->kind = cgDefer_Node; - d->scope_index = p->scope_index; - d->context_stack_count = p->context_stack.count; - d->control_region = tb_inst_get_control(p->func); - GB_ASSERT(d->control_region != nullptr); - d->stmt = ds->stmt; - case_end; - - - - default: - GB_PANIC("TODO cg_build_stmt %.*s", LIT(ast_strings[node->kind])); - break; - } -} - -gb_internal void cg_build_constant_value_decl(cgProcedure *p, AstValueDecl *vd) { - if (vd == nullptr || vd->is_mutable) { - return; - } - - auto *min_dep_set = &p->module->info->minimum_dependency_set; - - static i32 global_guid = 0; - - for (Ast *ident : vd->names) { - GB_ASSERT(ident->kind == Ast_Ident); - Entity *e = entity_of_node(ident); - GB_ASSERT(e != nullptr); - if (e->kind != Entity_TypeName) { - continue; - } - - bool polymorphic_struct = false; - if (e->type != nullptr && e->kind == Entity_TypeName) { - Type *bt = base_type(e->type); - if (bt->kind == Type_Struct) { - polymorphic_struct = bt->Struct.is_polymorphic; - } - } - - if (!polymorphic_struct && !ptr_set_exists(min_dep_set, e)) { - continue; - } - - if (e->TypeName.ir_mangled_name.len != 0) { - // NOTE(bill): Already set - continue; - } - - cg_set_nested_type_name_ir_mangled_name(e, p); - } - - for_array(i, vd->names) { - Ast *ident = vd->names[i]; - GB_ASSERT(ident->kind == Ast_Ident); - Entity *e = entity_of_node(ident); - GB_ASSERT(e != nullptr); - if (e->kind != Entity_Procedure) { - continue; - } - GB_ASSERT (vd->values[i] != nullptr); - - Ast *value = unparen_expr(vd->values[i]); - if (value->kind != Ast_ProcLit) { - continue; // It's an alias - } - - DeclInfo *decl = decl_info_of_entity(e); - ast_node(pl, ProcLit, decl->proc_lit); - if (pl->body != nullptr) { - GenProcsData *gpd = e->Procedure.gen_procs; - if (gpd) { - rw_mutex_shared_lock(&gpd->mutex); - for (Entity *e : gpd->procs) { - if (!ptr_set_exists(min_dep_set, e)) { - continue; - } - DeclInfo *d = decl_info_of_entity(e); - cg_build_nested_proc(p, &d->proc_lit->ProcLit, e); - } - rw_mutex_shared_unlock(&gpd->mutex); - } else { - cg_build_nested_proc(p, pl, e); - } - } else { - - // FFI - Foreign function interace - String original_name = e->token.string; - String name = original_name; - - if (e->Procedure.is_foreign) { - GB_PANIC("cg_add_foreign_library_path"); - // cg_add_foreign_library_path(p->module, e->Procedure.foreign_library); - } - - if (e->Procedure.link_name.len > 0) { - name = e->Procedure.link_name; - } - - cgValue *prev_value = string_map_get(&p->module->members, name); - if (prev_value != nullptr) { - // NOTE(bill): Don't do mutliple declarations in the IR - return; - } - - e->Procedure.link_name = name; - - cgProcedure *nested_proc = cg_procedure_create(p->module, e); - - cgValue value = p->value; - - array_add(&p->children, nested_proc); - string_map_set(&p->module->members, name, value); - cg_add_procedure_to_queue(nested_proc); - } - } -} - - -gb_internal void cg_build_stmt_list(cgProcedure *p, Slice const &stmts) { - for (Ast *stmt : stmts) { - switch (stmt->kind) { - case_ast_node(vd, ValueDecl, stmt); - cg_build_constant_value_decl(p, vd); - case_end; - case_ast_node(fb, ForeignBlockDecl, stmt); - ast_node(block, BlockStmt, fb->body); - cg_build_stmt_list(p, block->stmts); - case_end; - } - } - for (Ast *stmt : stmts) { - cg_build_stmt(p, stmt); - } -} - - -gb_internal void cg_build_when_stmt(cgProcedure *p, AstWhenStmt *ws) { - TypeAndValue tv = type_and_value_of_expr(ws->cond); - GB_ASSERT(is_type_boolean(tv.type)); - GB_ASSERT(tv.value.kind == ExactValue_Bool); - if (tv.value.value_bool) { - cg_build_stmt_list(p, ws->body->BlockStmt.stmts); - } else if (ws->else_stmt) { - switch (ws->else_stmt->kind) { - case Ast_BlockStmt: - cg_build_stmt_list(p, ws->else_stmt->BlockStmt.stmts); - break; - case Ast_WhenStmt: - cg_build_when_stmt(p, &ws->else_stmt->WhenStmt); - break; - default: - GB_PANIC("Invalid 'else' statement in 'when' statement"); - break; - } - } -} - diff --git a/src/tilde_type_info.cpp b/src/tilde_type_info.cpp deleted file mode 100644 index 96a101376..000000000 --- a/src/tilde_type_info.cpp +++ /dev/null @@ -1,985 +0,0 @@ -gb_internal void cg_global_const_type_info_ptr(cgModule *m, Type *type, TB_Global *global, i64 offset) { - GB_ASSERT(type != nullptr); - TB_Symbol *type_table_array = cg_find_symbol_from_entity(m, cg_global_type_info_data_entity); - - - i64 index_in_bytes = cast(i64)cg_type_info_index(m->info, type); - index_in_bytes *= type_size_of(t_type_info); - - void *ti_ptr_ptr = tb_global_add_region(m->mod, global, offset, build_context.ptr_size); - // NOTE(bill): define the byte offset for the pointer - cg_write_int_at_ptr(ti_ptr_ptr, index_in_bytes, t_uintptr); - - // NOTE(bill): this will add to the byte offset set previously - tb_global_add_symbol_reloc(m->mod, global, offset, type_table_array); -} - -gb_internal cgValue cg_global_type_info_data_ptr(cgProcedure *p) { - cgValue v = cg_find_value_from_entity(p->module, cg_global_type_info_data_entity); - return cg_flatten_value(p, v); -} - -gb_internal isize cg_type_info_index(CheckerInfo *info, Type *type, bool err_on_not_found) { - auto *set = &info->minimum_dependency_type_info_set; - isize index = type_info_index(info, type, err_on_not_found); - if (index >= 0) { - auto *found = map_get(set, index); - if (found) { - GB_ASSERT(*found >= 0); - return *found + 1; - } - } - if (err_on_not_found) { - GB_PANIC("NOT FOUND lb_type_info_index '%s' @ index %td", type_to_string(type), index); - } - return -1; -} - -gb_internal cgValue cg_type_info(cgProcedure *p, Type *type) { - GB_ASSERT(!build_context.no_rtti); - - type = default_type(type); - - isize index = cg_type_info_index(p->module->info, type); - GB_ASSERT(index >= 0); - - cgValue data = cg_global_type_info_data_ptr(p); - return cg_emit_array_epi(p, data, index); -} - - -gb_internal u64 cg_typeid_as_u64(cgModule *m, Type *type) { - GB_ASSERT(!build_context.no_rtti); - - type = default_type(type); - - u64 id = cast(u64)cg_type_info_index(m->info, type); - GB_ASSERT(id >= 0); - - u64 kind = Typeid_Invalid; - u64 named = is_type_named(type) && type->kind != Type_Basic; - u64 special = 0; - u64 reserved = 0; - - Type *bt = base_type(type); - TypeKind tk = bt->kind; - switch (tk) { - case Type_Basic: { - u32 flags = bt->Basic.flags; - if (flags & BasicFlag_Boolean) kind = Typeid_Boolean; - if (flags & BasicFlag_Integer) kind = Typeid_Integer; - if (flags & BasicFlag_Unsigned) kind = Typeid_Integer; - if (flags & BasicFlag_Float) kind = Typeid_Float; - if (flags & BasicFlag_Complex) kind = Typeid_Complex; - if (flags & BasicFlag_Pointer) kind = Typeid_Pointer; - if (flags & BasicFlag_String) kind = Typeid_String; - if (flags & BasicFlag_Rune) kind = Typeid_Rune; - } break; - case Type_Pointer: kind = Typeid_Pointer; break; - case Type_MultiPointer: kind = Typeid_Multi_Pointer; break; - case Type_Array: kind = Typeid_Array; break; - case Type_Matrix: kind = Typeid_Matrix; break; - case Type_EnumeratedArray: kind = Typeid_Enumerated_Array; break; - case Type_Slice: kind = Typeid_Slice; break; - case Type_DynamicArray: kind = Typeid_Dynamic_Array; break; - case Type_Map: kind = Typeid_Map; break; - case Type_Struct: kind = Typeid_Struct; break; - case Type_Enum: kind = Typeid_Enum; break; - case Type_Union: kind = Typeid_Union; break; - case Type_Tuple: kind = Typeid_Tuple; break; - case Type_Proc: kind = Typeid_Procedure; break; - case Type_BitSet: kind = Typeid_Bit_Set; break; - case Type_SimdVector: kind = Typeid_Simd_Vector; break; - case Type_RelativePointer: kind = Typeid_Relative_Pointer; break; - case Type_RelativeMultiPointer: kind = Typeid_Relative_Multi_Pointer; break; - case Type_SoaPointer: kind = Typeid_SoaPointer; break; - } - - if (is_type_cstring(type)) { - special = 1; - } else if (is_type_integer(type) && !is_type_unsigned(type)) { - special = 1; - } - - u64 data = 0; - if (build_context.ptr_size == 4) { - GB_ASSERT(id <= (1u<<24u)); - data |= (id &~ (1u<<24)) << 0u; // index - data |= (kind &~ (1u<<5)) << 24u; // kind - data |= (named &~ (1u<<1)) << 29u; // named - data |= (special &~ (1u<<1)) << 30u; // special - data |= (reserved &~ (1u<<1)) << 31u; // reserved - } else { - GB_ASSERT(build_context.ptr_size == 8); - GB_ASSERT(id <= (1ull<<56u)); - data |= (id &~ (1ull<<56)) << 0ul; // index - data |= (kind &~ (1ull<<5)) << 56ull; // kind - data |= (named &~ (1ull<<1)) << 61ull; // named - data |= (special &~ (1ull<<1)) << 62ull; // special - data |= (reserved &~ (1ull<<1)) << 63ull; // reserved - } - - return data; -} - -gb_internal cgValue cg_typeid(cgProcedure *p, Type *t) { - u64 x = cg_typeid_as_u64(p->module, t); - return cg_value(tb_inst_uint(p->func, cg_data_type(t_typeid), x), t_typeid); -} - - - - -gb_internal void cg_set_type_info_member_types(cgModule *m, TB_Global *global, isize offset, isize count, void *userdata, Type *(*type_proc)(isize index, void *userdata)) { - if (count == 0) { - return; - } - - void *data_ptr = tb_global_add_region(m->mod, global, offset+0, build_context.ptr_size); - i64 offset_in_bytes = cg_global_type_info_member_types.index * type_size_of(cg_global_type_info_member_types.elem_type); - cg_global_type_info_member_types.index += count; - - cg_write_int_at_ptr(data_ptr, offset_in_bytes, t_uintptr); - tb_global_add_symbol_reloc(m->mod, global, offset+0, cast(TB_Symbol *)cg_global_type_info_member_types.global); - - for (isize i = 0; i < count; i++) { - i64 elem_size = type_size_of(cg_global_type_info_member_types.elem_type); - Type *type = type_proc(i, userdata); - i64 offset_for_elem = offset_in_bytes + i*elem_size; - cg_global_const_type_info_ptr(m, type, cg_global_type_info_member_types.global, offset_for_elem); - } - - void *len_ptr = tb_global_add_region(m->mod, global, offset+build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(len_ptr, count, t_int); -} - - -gb_internal void cg_set_type_info_member_names(cgModule *m, TB_Global *global, isize offset, isize count, void *userdata, String (*name_proc)(isize index, void *userdata)) { - if (count == 0) { - return; - } - void *data_ptr = tb_global_add_region(m->mod, global, offset+0, build_context.ptr_size); - i64 offset_in_bytes = cg_global_type_info_member_names.index * type_size_of(cg_global_type_info_member_names.elem_type); - cg_global_type_info_member_names.index += count; - - cg_write_int_at_ptr(data_ptr, offset_in_bytes, t_uintptr); - tb_global_add_symbol_reloc(m->mod, global, offset+0, cast(TB_Symbol *)cg_global_type_info_member_names.global); - - for (isize i = 0; i < count; i++) { - i64 elem_size = type_size_of(cg_global_type_info_member_names.elem_type); - String name = name_proc(i, userdata); - i64 offset_for_elem = offset_in_bytes + i*elem_size; - cg_global_const_string(m, name, cg_global_type_info_member_names.elem_type, cg_global_type_info_member_names.global, offset_for_elem); - - } - - void *len_ptr = tb_global_add_region(m->mod, global, offset+build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(len_ptr, count, t_int); -} - - -gb_internal void cg_set_type_info_member_offsets(cgModule *m, TB_Global *global, isize offset, isize count, void *userdata, i64 (*offset_proc)(isize index, void *userdata)) { - if (count == 0) { - return; - } - void *data_ptr = tb_global_add_region(m->mod, global, offset+0, build_context.ptr_size); - i64 offset_in_bytes = cg_global_type_info_member_offsets.index * type_size_of(cg_global_type_info_member_offsets.elem_type); - cg_global_type_info_member_offsets.index += count; - - cg_write_int_at_ptr(data_ptr, offset_in_bytes, t_uintptr); - tb_global_add_symbol_reloc(m->mod, global, offset+0, cast(TB_Symbol *)cg_global_type_info_member_offsets.global); - - for (isize i = 0; i < count; i++) { - i64 elem_size = type_size_of(cg_global_type_info_member_offsets.elem_type); - i64 the_offset = offset_proc(i, userdata); - i64 offset_for_elem = offset_in_bytes + i*elem_size; - - void *offset_ptr = tb_global_add_region(m->mod, cg_global_type_info_member_offsets.global, offset_for_elem, elem_size); - cg_write_uint_at_ptr(offset_ptr, the_offset, t_uintptr); - } - - void *len_ptr = tb_global_add_region(m->mod, global, offset+build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(len_ptr, count, t_int); -} - -gb_internal void cg_set_type_info_member_usings(cgModule *m, TB_Global *global, isize offset, isize count, void *userdata, bool (*usings_proc)(isize index, void *userdata)) { - if (count == 0) { - return; - } - void *data_ptr = tb_global_add_region(m->mod, global, offset+0, build_context.ptr_size); - i64 offset_in_bytes = cg_global_type_info_member_usings.index * type_size_of(cg_global_type_info_member_usings.elem_type); - cg_global_type_info_member_usings.index += count; - - cg_write_int_at_ptr(data_ptr, offset_in_bytes, t_uintptr); - tb_global_add_symbol_reloc(m->mod, global, offset+0, cast(TB_Symbol *)cg_global_type_info_member_usings.global); - - for (isize i = 0; i < count; i++) { - i64 elem_size = type_size_of(cg_global_type_info_member_usings.elem_type); - GB_ASSERT(elem_size == 1); - bool the_usings = usings_proc(i, userdata); - i64 offset_for_elem = offset_in_bytes + i*elem_size; - - bool *usings_ptr = cast(bool *)tb_global_add_region(m->mod, cg_global_type_info_member_usings.global, offset_for_elem, 1); - *usings_ptr = the_usings; - } - - void *len_ptr = tb_global_add_region(m->mod, global, offset+build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(len_ptr, count, t_int); -} - - - -gb_internal void cg_set_type_info_member_tags(cgModule *m, TB_Global *global, isize offset, isize count, void *userdata, String (*tag_proc)(isize index, void *userdata)) { - if (count == 0) { - return; - } - void *data_ptr = tb_global_add_region(m->mod, global, offset+0, build_context.ptr_size); - i64 offset_in_bytes = cg_global_type_info_member_tags.index * type_size_of(cg_global_type_info_member_tags.elem_type); - cg_global_type_info_member_tags.index += count; - - cg_write_int_at_ptr(data_ptr, offset_in_bytes, t_uintptr); - tb_global_add_symbol_reloc(m->mod, global, offset+0, cast(TB_Symbol *)cg_global_type_info_member_tags.global); - - for (isize i = 0; i < count; i++) { - i64 elem_size = type_size_of(cg_global_type_info_member_tags.elem_type); - String tag = tag_proc(i, userdata); - i64 offset_for_elem = offset_in_bytes + i*elem_size; - cg_global_const_string(m, tag, cg_global_type_info_member_tags.elem_type, cg_global_type_info_member_tags.global, offset_for_elem); - - } - - void *len_ptr = tb_global_add_region(m->mod, global, offset+build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(len_ptr, count, t_int); -} - -gb_internal void cg_set_type_info_member_enum_values(cgModule *m, TB_Global *global, isize offset, isize count, void *userdata, i64 (*value_proc)(isize index, void *userdata)) { - if (count == 0) { - return; - } - void *data_ptr = tb_global_add_region(m->mod, global, offset+0, build_context.ptr_size); - i64 offset_in_bytes = cg_global_type_info_member_enum_values.index * type_size_of(cg_global_type_info_member_enum_values.elem_type); - cg_global_type_info_member_enum_values.index += count; - - cg_write_int_at_ptr(data_ptr, offset_in_bytes, t_uintptr); - tb_global_add_symbol_reloc(m->mod, global, offset+0, cast(TB_Symbol *)cg_global_type_info_member_enum_values.global); - - for (isize i = 0; i < count; i++) { - i64 elem_size = type_size_of(cg_global_type_info_member_enum_values.elem_type); - GB_ASSERT(elem_size == 8); - i64 the_value = value_proc(i, userdata); - i64 offset_for_elem = offset_in_bytes + i*elem_size; - - void *offset_ptr = tb_global_add_region(m->mod, cg_global_type_info_member_enum_values.global, offset_for_elem, elem_size); - cg_write_uint_at_ptr(offset_ptr, the_value, cg_global_type_info_member_enum_values.elem_type); - } - - void *len_ptr = tb_global_add_region(m->mod, global, offset+build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(len_ptr, count, t_int); -} - - - -gb_internal void cg_setup_type_info_data(cgModule *m) { - if (build_context.no_rtti) { - return; - } - - CheckerInfo *info = m->info; - { // Add type info data - isize max_type_info_count = info->minimum_dependency_type_info_set.count+1; - // gb_printf_err("max_type_info_count: %td\n", max_type_info_count); - Type *t = alloc_type_array(t_type_info, max_type_info_count); - - i64 max_objects = cast(i64)max_type_info_count * cg_global_const_calculate_region_count_from_basic_type(t_type_info); - - TB_Global *g = tb_global_create(m->mod, -1, CG_TYPE_INFO_DATA_NAME, nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, max_objects); - - cgValue value = cg_value(g, alloc_type_pointer(t)); - cg_global_type_info_data_entity = alloc_entity_variable(nullptr, make_token_ident(CG_TYPE_INFO_DATA_NAME), t, EntityState_Resolved); - cg_add_symbol(m, cg_global_type_info_data_entity, cast(TB_Symbol *)g); - cg_add_entity(m, cg_global_type_info_data_entity, value); - } - - { // Type info member buffer - // NOTE(bill): Removes need for heap allocation by making it global memory - isize count = 0; - isize enum_count = 0; - - for (Type *t : m->info->type_info_types) { - isize index = cg_type_info_index(m->info, t, false); - if (index < 0) { - continue; - } - - switch (t->kind) { - case Type_Union: - count += t->Union.variants.count; - break; - case Type_Struct: - count += t->Struct.fields.count; - break; - case Type_Tuple: - count += t->Tuple.variables.count; - break; - case Type_Enum: - enum_count += t->Enum.fields.count; - break; - } - } - - if (count > 0) { - char const *name = CG_TYPE_INFO_TYPES_NAME; - Type *t = alloc_type_array(t_type_info_ptr, count); - TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count*3); - cg_global_type_info_member_types = GlobalTypeInfoData{g, t, t_type_info_ptr, 0}; - } - if (count > 0 || enum_count > 0) { - char const *name = CG_TYPE_INFO_NAMES_NAME; - Type *t = alloc_type_array(t_string, (enum_count+count)); - TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, (enum_count+count)*3); - cg_global_type_info_member_names = GlobalTypeInfoData{g, t, t_string, 0}; - } - if (count > 0) { - char const *name = CG_TYPE_INFO_OFFSETS_NAME; - Type *t = alloc_type_array(t_uintptr, count); - TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count); - cg_global_type_info_member_offsets = GlobalTypeInfoData{g, t, t_uintptr, 0}; - } - - if (count > 0) { - char const *name = CG_TYPE_INFO_USINGS_NAME; - Type *t = alloc_type_array(t_bool, count); - TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count); - cg_global_type_info_member_usings = GlobalTypeInfoData{g, t, t_bool, 0}; - } - - if (count > 0) { - char const *name = CG_TYPE_INFO_TAGS_NAME; - Type *t = alloc_type_array(t_string, count); - TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count*3); - cg_global_type_info_member_tags = GlobalTypeInfoData{g, t, t_string, 0}; - } - - if (enum_count > 0) { - char const *name = CG_TYPE_INFO_ENUM_VALUES_NAME; - Type *t = alloc_type_array(t_i64, enum_count); - TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE); - tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, enum_count); - cg_global_type_info_member_enum_values = GlobalTypeInfoData{g, t, t_i64, 0}; - } - } - gb_unused(info); - - - i64 global_type_info_data_entity_count = 0; - - // NOTE(bill): Set the type_table slice with the global backing array - TB_Global *type_table_slice = cast(TB_Global *)cg_find_symbol_from_entity(m, scope_lookup_current(m->info->runtime_package->scope, str_lit("type_table"))); - GB_ASSERT(type_table_slice != nullptr); - - TB_Global *type_table_array = cast(TB_Global *)cg_find_symbol_from_entity(m, cg_global_type_info_data_entity); - GB_ASSERT(type_table_array != nullptr); - - Type *type = base_type(cg_global_type_info_data_entity->type); - GB_ASSERT(is_type_array(type)); - global_type_info_data_entity_count = type->Array.count; - - tb_global_add_symbol_reloc(m->mod, type_table_slice, 0, cast(TB_Symbol *)type_table_array); - - void *len_ptr = tb_global_add_region(m->mod, type_table_slice, build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(len_ptr, type->Array.count, t_int); - - // Useful types - Entity *type_info_flags_entity = find_core_entity(info->checker, str_lit("Type_Info_Flags")); - Type *t_type_info_flags = type_info_flags_entity->type; - GB_ASSERT(type_size_of(t_type_info_flags) == 4); - - auto entries_handled = slice_make(heap_allocator(), cast(isize)global_type_info_data_entity_count); - defer (gb_free(heap_allocator(), entries_handled.data)); - entries_handled[0] = true; - - - i64 type_info_size = type_size_of(t_type_info); - i64 size_offset = type_offset_of(t_type_info, 0); - i64 align_offset = type_offset_of(t_type_info, 1); - i64 flags_offset = type_offset_of(t_type_info, 2); - i64 id_offset = type_offset_of(t_type_info, 3); - i64 variant_offset = type_offset_of(t_type_info, 4); - - Type *type_info_union = base_type(t_type_info)->Struct.fields[4]->type; - GB_ASSERT(type_info_union->kind == Type_Union); - - i64 union_tag_offset = type_info_union->Union.variant_block_size; - Type *ti_union_tag_type = union_tag_type(type_info_union); - u64 union_tag_type_size = type_size_of(ti_union_tag_type); - - auto const &set_bool = [](cgModule *m, TB_Global *global, i64 offset, bool value) { - bool *ptr = cast(bool *)tb_global_add_region(m->mod, global, offset, 1); - *ptr = value; - }; - - - for_array(type_info_type_index, info->type_info_types) { - Type *t = info->type_info_types[type_info_type_index]; - if (t == nullptr || t == t_invalid) { - continue; - } - - isize entry_index = cg_type_info_index(info, t, false); - if (entry_index <= 0) { - continue; - } - - if (entries_handled[entry_index]) { - continue; - } - entries_handled[entry_index] = true; - - TB_Global *global = type_table_array; - - i64 offset = entry_index * type_info_size; - - i64 size = type_size_of(t); - i64 align = type_align_of(t); - u32 flags = type_info_flags_of_type(t); - u64 id = cg_typeid_as_u64(m, t); - - void *size_ptr = tb_global_add_region(m->mod, global, offset+size_offset, build_context.int_size); - void *align_ptr = tb_global_add_region(m->mod, global, offset+align_offset, build_context.int_size); - void *flags_ptr = tb_global_add_region(m->mod, global, offset+flags_offset, 4); - void *id_ptr = tb_global_add_region(m->mod, global, offset+id_offset, build_context.ptr_size); - cg_write_int_at_ptr (size_ptr, size, t_int); - cg_write_int_at_ptr (align_ptr, align, t_int); - cg_write_int_at_ptr (flags_ptr, flags, t_u32); - cg_write_uint_at_ptr(id_ptr, id, t_typeid); - - - // add data to the offset to make it easier to deal with later on - offset += variant_offset; - - Type *tag_type = nullptr; - - switch (t->kind) { - case Type_Named: { - // Type_Info_Named :: struct { - // name: string, - // base: ^Type_Info, - // pkg: string, - // loc: Source_Code_Location, - // } - tag_type = t_type_info_named; - - i64 name_offset = type_offset_of(tag_type, 0); - String name = t->Named.type_name->token.string; - cg_global_const_string(m, name, t_string, global, offset+name_offset); - - i64 base_offset = type_offset_of(tag_type, 1); - cg_global_const_type_info_ptr(m, t->Named.base, global, offset+base_offset); - - if (t->Named.type_name->pkg) { - i64 pkg_offset = type_offset_of(tag_type, 2); - String pkg_name = t->Named.type_name->pkg->name; - cg_global_const_string(m, pkg_name, t_string, global, offset+pkg_offset); - } - - String proc_name = {}; - if (t->Named.type_name->parent_proc_decl) { - DeclInfo *decl = t->Named.type_name->parent_proc_decl; - if (decl->entity && decl->entity->kind == Entity_Procedure) { - i64 name_offset = type_offset_of(tag_type, 0); - proc_name = decl->entity->token.string; - cg_global_const_string(m, proc_name, t_string, global, offset+name_offset); - } - } - - i64 loc_offset = type_offset_of(tag_type, 3); - TokenPos pos = t->Named.type_name->token.pos; - cg_global_source_code_location_const(m, proc_name, pos, global, offset+loc_offset); - - break; - } - - case Type_Basic: - switch (t->Basic.kind) { - case Basic_bool: - case Basic_b8: - case Basic_b16: - case Basic_b32: - case Basic_b64: - tag_type = t_type_info_boolean; - break; - - case Basic_i8: - case Basic_u8: - case Basic_i16: - case Basic_u16: - case Basic_i32: - case Basic_u32: - case Basic_i64: - case Basic_u64: - case Basic_i128: - case Basic_u128: - - case Basic_i16le: - case Basic_u16le: - case Basic_i32le: - case Basic_u32le: - case Basic_i64le: - case Basic_u64le: - case Basic_i128le: - case Basic_u128le: - case Basic_i16be: - case Basic_u16be: - case Basic_i32be: - case Basic_u32be: - case Basic_i64be: - case Basic_u64be: - case Basic_i128be: - case Basic_u128be: - - case Basic_int: - case Basic_uint: - case Basic_uintptr: { - tag_type = t_type_info_integer; - - bool is_signed = (t->Basic.flags & BasicFlag_Unsigned) == 0; - // NOTE(bill): This is matches the runtime layout - u8 endianness_value = 0; - if (t->Basic.flags & BasicFlag_EndianLittle) { - endianness_value = 1; - } else if (t->Basic.flags & BasicFlag_EndianBig) { - endianness_value = 2; - } - u8 *signed_ptr = cast(u8 *)tb_global_add_region(m->mod, global, offset+0, 1); - u8 *endianness_ptr = cast(u8 *)tb_global_add_region(m->mod, global, offset+1, 1); - *signed_ptr = is_signed; - *endianness_ptr = endianness_value; - break; - } - - case Basic_rune: - tag_type = t_type_info_rune; - break; - - case Basic_f16: - case Basic_f32: - case Basic_f64: - case Basic_f16le: - case Basic_f32le: - case Basic_f64le: - case Basic_f16be: - case Basic_f32be: - case Basic_f64be: - { - tag_type = t_type_info_float; - - // // NOTE(bill): This is matches the runtime layout - u8 endianness_value = 0; - if (t->Basic.flags & BasicFlag_EndianLittle) { - endianness_value = 1; - } else if (t->Basic.flags & BasicFlag_EndianBig) { - endianness_value = 2; - } - - u8 *ptr = cast(u8 *)tb_global_add_region(m->mod, global, offset+0, 1); - *ptr = endianness_value; - } - break; - - case Basic_complex32: - case Basic_complex64: - case Basic_complex128: - tag_type = t_type_info_complex; - break; - - case Basic_quaternion64: - case Basic_quaternion128: - case Basic_quaternion256: - tag_type = t_type_info_quaternion; - break; - - case Basic_rawptr: - tag_type = t_type_info_pointer; - break; - - case Basic_string: - tag_type = t_type_info_string; - break; - - case Basic_cstring: - tag_type = t_type_info_string; - set_bool(m, global, offset+0, true); - break; - - case Basic_any: - tag_type = t_type_info_any; - break; - - case Basic_typeid: - tag_type = t_type_info_typeid; - break; - } - break; - - case Type_Pointer: - tag_type = t_type_info_pointer; - cg_global_const_type_info_ptr(m, t->Pointer.elem, global, offset+0); - break; - case Type_MultiPointer: - tag_type = t_type_info_multi_pointer; - cg_global_const_type_info_ptr(m, t->MultiPointer.elem, global, offset+0); - break; - case Type_SoaPointer: - tag_type = t_type_info_soa_pointer; - cg_global_const_type_info_ptr(m, t->SoaPointer.elem, global, offset+0); - break; - - case Type_Array: - { - tag_type = t_type_info_array; - - cg_global_const_type_info_ptr(m, t->Array.elem, global, offset+0); - void *elem_size_ptr = tb_global_add_region(m->mod, global, offset+1*build_context.int_size, build_context.int_size); - void *count_ptr = tb_global_add_region(m->mod, global, offset+2*build_context.int_size, build_context.int_size); - - cg_write_int_at_ptr(elem_size_ptr, type_size_of(t->Array.elem), t_int); - cg_write_int_at_ptr(count_ptr, t->Array.count, t_int); - } - break; - - case Type_EnumeratedArray: - { - tag_type = t_type_info_enumerated_array; - - i64 elem_offset = type_offset_of(tag_type, 0); - i64 index_offset = type_offset_of(tag_type, 1); - i64 elem_size_offset = type_offset_of(tag_type, 2); - i64 count_offset = type_offset_of(tag_type, 3); - i64 min_value_offset = type_offset_of(tag_type, 4); - i64 max_value_offset = type_offset_of(tag_type, 5); - i64 is_sparse_offset = type_offset_of(tag_type, 6); - - cg_global_const_type_info_ptr(m, t->EnumeratedArray.elem, global, offset+elem_offset); - cg_global_const_type_info_ptr(m, t->EnumeratedArray.index, global, offset+index_offset); - - void *elem_size_ptr = tb_global_add_region(m->mod, global, offset+elem_size_offset, build_context.int_size); - void *count_ptr = tb_global_add_region(m->mod, global, offset+count_offset, build_context.int_size); - - void *min_value_ptr = tb_global_add_region(m->mod, global, offset+min_value_offset, type_size_of(t_type_info_enum_value)); - void *max_value_ptr = tb_global_add_region(m->mod, global, offset+max_value_offset, type_size_of(t_type_info_enum_value)); - - cg_write_int_at_ptr(elem_size_ptr, type_size_of(t->EnumeratedArray.elem), t_int); - cg_write_int_at_ptr(count_ptr, t->EnumeratedArray.count, t_int); - - cg_write_int_at_ptr(min_value_ptr, exact_value_to_i64(*t->EnumeratedArray.min_value), t_type_info_enum_value); - cg_write_int_at_ptr(max_value_ptr, exact_value_to_i64(*t->EnumeratedArray.max_value), t_type_info_enum_value); - set_bool(m, global, offset+is_sparse_offset, t->EnumeratedArray.is_sparse); - } - break; - - case Type_DynamicArray: - { - tag_type = t_type_info_dynamic_array; - - cg_global_const_type_info_ptr(m, t->DynamicArray.elem, global, offset+0); - void *elem_size_ptr = tb_global_add_region(m->mod, global, offset+1*build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(elem_size_ptr, type_size_of(t->DynamicArray.elem), t_int); - } - break; - case Type_Slice: - { - tag_type = t_type_info_slice; - - cg_global_const_type_info_ptr(m, t->Slice.elem, global, offset+0); - void *elem_size_ptr = tb_global_add_region(m->mod, global, offset+1*build_context.int_size, build_context.int_size); - cg_write_int_at_ptr(elem_size_ptr, type_size_of(t->Slice.elem), t_int); - } - break; - - case Type_Proc: - { - tag_type = t_type_info_procedure; - - i64 params_offset = type_offset_of(tag_type, 0); - i64 results_offset = type_offset_of(tag_type, 1); - i64 variadic_offset = type_offset_of(tag_type, 2); - i64 convention_offset = type_offset_of(tag_type, 3); - - if (t->Proc.params) { - cg_global_const_type_info_ptr(m, t->Proc.params, global, offset+params_offset); - } - if (t->Proc.results) { - cg_global_const_type_info_ptr(m, t->Proc.results, global, offset+results_offset); - } - - set_bool(m, global, offset+variadic_offset, t->Proc.variadic); - - u8 *convention_ptr = cast(u8 *)tb_global_add_region(m->mod, global, offset+convention_offset, 1); - *convention_ptr = cast(u8)t->Proc.calling_convention; - } - break; - - case Type_Tuple: - { - tag_type = t_type_info_parameters; - - i64 types_offset = type_offset_of(tag_type, 0); - i64 names_offset = type_offset_of(tag_type, 1); - - i64 count = t->Tuple.variables.count; - - cg_set_type_info_member_types(m, global, offset+types_offset, count, t, [](isize i, void *userdata) -> Type * { - Type *t = cast(Type *)userdata; - return t->Tuple.variables[i]->type; - }); - - cg_set_type_info_member_names(m, global, offset+names_offset, count, t, [](isize i, void *userdata) -> String { - Type *t = cast(Type *)userdata; - return t->Tuple.variables[i]->token.string; - }); - } - break; - - case Type_Enum: - { - tag_type = t_type_info_enum; - - i64 base_offset = type_offset_of(tag_type, 0); - i64 names_offset = type_offset_of(tag_type, 1); - i64 values_offset = type_offset_of(tag_type, 2); - - cg_global_const_type_info_ptr(m, t->Enum.base_type, global, offset+base_offset); - - i64 count = t->Enum.fields.count; - - cg_set_type_info_member_names(m, global, offset+names_offset, count, t, [](isize i, void *userdata) -> String { - Type *t = cast(Type *)userdata; - return t->Enum.fields[i]->token.string; - }); - - cg_set_type_info_member_enum_values(m, global, offset+values_offset, count, t, [](isize i, void *userdata) -> i64 { - Type *t = cast(Type *)userdata; - Entity *e = t->Enum.fields[i]; - GB_ASSERT(e->kind == Entity_Constant); - return exact_value_to_i64(e->Constant.value); - }); - } - break; - case Type_Struct: - { - tag_type = t_type_info_struct; - - i64 types_offset = type_offset_of(tag_type, 0); - i64 names_offset = type_offset_of(tag_type, 1); - i64 offsets_offset = type_offset_of(tag_type, 2); - i64 usings_offset = type_offset_of(tag_type, 3); - i64 tags_offset = type_offset_of(tag_type, 4); - - i64 is_packed_offset = type_offset_of(tag_type, 5); - i64 is_raw_union_offset = type_offset_of(tag_type, 6); - i64 custom_align_offset = type_offset_of(tag_type, 7); - - i64 equal_offset = type_offset_of(tag_type, 8); - - i64 soa_kind_offset = type_offset_of(tag_type, 9); - i64 soa_base_type_offset = type_offset_of(tag_type, 10); - i64 soa_len_offset = type_offset_of(tag_type, 11); - - // TODO(bill): equal proc stuff - gb_unused(equal_offset); - - i64 count = t->Struct.fields.count; - - cg_set_type_info_member_types(m, global, offset+types_offset, count, t, [](isize i, void *userdata) -> Type * { - Type *t = cast(Type *)userdata; - return t->Struct.fields[i]->type; - }); - - cg_set_type_info_member_names(m, global, offset+names_offset, count, t, [](isize i, void *userdata) -> String { - Type *t = cast(Type *)userdata; - return t->Struct.fields[i]->token.string; - }); - - cg_set_type_info_member_offsets(m, global, offset+offsets_offset, count, t, [](isize i, void *userdata) -> i64 { - Type *t = cast(Type *)userdata; - return t->Struct.offsets[i]; - }); - - cg_set_type_info_member_usings(m, global, offset+usings_offset, count, t, [](isize i, void *userdata) -> bool { - Type *t = cast(Type *)userdata; - return (t->Struct.fields[i]->flags & EntityFlag_Using) != 0; - }); - - cg_set_type_info_member_tags(m, global, offset+tags_offset, count, t, [](isize i, void *userdata) -> String { - Type *t = cast(Type *)userdata; - return t->Struct.tags[i]; - }); - - - set_bool(m, global, offset+is_packed_offset, t->Struct.is_packed); - set_bool(m, global, offset+is_raw_union_offset, t->Struct.is_raw_union); - set_bool(m, global, offset+custom_align_offset, t->Struct.custom_align != 0); - - if (t->Struct.soa_kind != StructSoa_None) { - u8 *kind_ptr = cast(u8 *)tb_global_add_region(m->mod, global, offset+soa_kind_offset, 1); - *kind_ptr = cast(u8)t->Struct.soa_kind; - - cg_global_const_type_info_ptr(m, t->Struct.soa_elem, global, offset+soa_base_type_offset); - - void *soa_len_ptr = tb_global_add_region(m->mod, global, offset+soa_len_offset, build_context.int_size); - cg_write_int_at_ptr(soa_len_ptr, t->Struct.soa_count, t_int); - } - } - break; - case Type_Union: - { - tag_type = t_type_info_union; - - i64 variants_offset = type_offset_of(tag_type, 0); - i64 tag_offset_offset = type_offset_of(tag_type, 1); - i64 tag_type_offset = type_offset_of(tag_type, 2); - - i64 equal_offset = type_offset_of(tag_type, 3); - - i64 custom_align_offset = type_offset_of(tag_type, 4); - i64 no_nil_offset = type_offset_of(tag_type, 5); - i64 shared_nil_offset = type_offset_of(tag_type, 6); - - // TODO(bill): equal procs - gb_unused(equal_offset); - - i64 count = t->Union.variants.count; - - cg_set_type_info_member_types(m, global, offset+variants_offset, count, t, [](isize i, void *userdata) -> Type * { - Type *t = cast(Type *)userdata; - return t->Union.variants[i]; - }); - - void *tag_offset_ptr = tb_global_add_region(m->mod, global, offset+tag_offset_offset, build_context.ptr_size); - cg_write_uint_at_ptr(tag_offset_ptr, t->Union.variant_block_size, t_uintptr); - - cg_global_const_type_info_ptr(m, union_tag_type(t), global, offset+tag_type_offset); - - set_bool(m, global, offset+custom_align_offset, t->Union.custom_align != 0); - set_bool(m, global, offset+no_nil_offset, t->Union.kind == UnionType_no_nil); - set_bool(m, global, offset+shared_nil_offset, t->Union.kind == UnionType_shared_nil); - } - break; - case Type_Map: - { - tag_type = t_type_info_map; - - i64 key_offset = type_offset_of(tag_type, 0); - i64 value_offset = type_offset_of(tag_type, 1); - i64 map_info_offset = type_offset_of(tag_type, 2); - - // TODO(bill): map info - gb_unused(map_info_offset); - - cg_global_const_type_info_ptr(m, t->Map.key, global, offset+key_offset); - cg_global_const_type_info_ptr(m, t->Map.value, global, offset+value_offset); - - } - break; - case Type_BitSet: - { - tag_type = t_type_info_bit_set; - - i64 elem_offset = type_offset_of(tag_type, 0); - i64 underlying_offset = type_offset_of(tag_type, 1); - i64 lower_offset = type_offset_of(tag_type, 2); - i64 upper_offset = type_offset_of(tag_type, 3); - - cg_global_const_type_info_ptr(m, t->BitSet.elem, global, offset+elem_offset); - if (t->BitSet.underlying) { - cg_global_const_type_info_ptr(m, t->BitSet.underlying, global, offset+underlying_offset); - } - - void *lower_ptr = tb_global_add_region(m->mod, global, offset+lower_offset, 8); - void *upper_ptr = tb_global_add_region(m->mod, global, offset+upper_offset, 8); - - cg_write_int_at_ptr(lower_ptr, t->BitSet.lower, t_i64); - cg_write_int_at_ptr(upper_ptr, t->BitSet.upper, t_i64); - } - break; - case Type_SimdVector: - { - tag_type = t_type_info_simd_vector; - - i64 elem_offset = type_offset_of(tag_type, 0); - i64 elem_size_offset = type_offset_of(tag_type, 1); - i64 count_offset = type_offset_of(tag_type, 2); - - cg_global_const_type_info_ptr(m, t->SimdVector.elem, global, offset+elem_offset); - - void *elem_size_ptr = tb_global_add_region(m->mod, global, offset+elem_size_offset, build_context.int_size); - void *count_ptr = tb_global_add_region(m->mod, global, offset+count_offset, build_context.int_size); - - cg_write_int_at_ptr(elem_size_ptr, type_size_of(t->SimdVector.elem), t_int); - cg_write_int_at_ptr(count_ptr, t->SimdVector.count, t_int); - } - break; - - case Type_RelativePointer: - { - tag_type = t_type_info_relative_pointer; - - i64 pointer_offset = type_offset_of(tag_type, 0); - i64 base_integer_offset = type_offset_of(tag_type, 1); - - cg_global_const_type_info_ptr(m, t->RelativePointer.pointer_type, global, offset+pointer_offset); - cg_global_const_type_info_ptr(m, t->RelativePointer.base_integer, global, offset+base_integer_offset); - } - break; - case Type_RelativeMultiPointer: - { - tag_type = t_type_info_relative_multi_pointer; - - i64 pointer_offset = type_offset_of(tag_type, 0); - i64 base_integer_offset = type_offset_of(tag_type, 1); - - cg_global_const_type_info_ptr(m, t->RelativePointer.pointer_type, global, offset+pointer_offset); - cg_global_const_type_info_ptr(m, t->RelativePointer.base_integer, global, offset+base_integer_offset); - } - break; - case Type_Matrix: - { - tag_type = t_type_info_matrix; - - i64 elem_offset = type_offset_of(tag_type, 0); - i64 elem_size_offset = type_offset_of(tag_type, 1); - i64 elem_stride_offset = type_offset_of(tag_type, 2); - i64 row_count_offset = type_offset_of(tag_type, 3); - i64 column_count_offset = type_offset_of(tag_type, 4); - - cg_global_const_type_info_ptr(m, t->Matrix.elem, global, offset+elem_offset); - - void *elem_size_ptr = tb_global_add_region(m->mod, global, offset+elem_size_offset, build_context.int_size); - void *elem_stride_ptr = tb_global_add_region(m->mod, global, offset+elem_stride_offset, build_context.int_size); - void *row_count_ptr = tb_global_add_region(m->mod, global, offset+row_count_offset, build_context.int_size); - void *column_count_ptr = tb_global_add_region(m->mod, global, offset+column_count_offset, build_context.int_size); - - cg_write_int_at_ptr(elem_size_ptr, type_size_of(t->Matrix.elem), t_int); - cg_write_int_at_ptr(elem_stride_ptr, matrix_type_stride_in_elems(t), t_int); - cg_write_int_at_ptr(row_count_ptr, t->Matrix.row_count, t_int); - cg_write_int_at_ptr(column_count_ptr, t->Matrix.column_count, t_int); - - } - break; - } - - if (tag_type != nullptr) { - i64 union_index = union_variant_index(type_info_union, tag_type); - GB_ASSERT(union_index != 0); - void *tag_ptr = tb_global_add_region(m->mod, global, offset+union_tag_offset, union_tag_type_size); - cg_write_int_at_ptr(tag_ptr, union_index, ti_union_tag_type); - } - - } -} \ No newline at end of file From 382ca331be07e3b71acbd93ea645eacb8d339e36 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Thu, 26 Mar 2026 19:38:49 +0100 Subject: [PATCH 233/273] runtime align_forward procs as source of truth --- .../runtime/default_temp_allocator_arena.odin | 9 --- base/runtime/internal.odin | 72 ++++++++----------- bench.odin | 69 ++++++++++++++++++ core/mem/mem.odin | 24 ++----- 4 files changed, 101 insertions(+), 73 deletions(-) create mode 100644 bench.odin diff --git a/base/runtime/default_temp_allocator_arena.odin b/base/runtime/default_temp_allocator_arena.odin index eafaf9fbe..f1d09792a 100644 --- a/base/runtime/default_temp_allocator_arena.odin +++ b/base/runtime/default_temp_allocator_arena.odin @@ -97,15 +97,6 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: uint) @(require_results) arena_alloc :: proc(arena: ^Arena, size, alignment: uint, loc := #caller_location) -> (data: []byte, err: Allocator_Error) { - align_forward_uint :: proc "contextless" (ptr, align: uint) -> uint { - p := ptr - modulo := p & (align-1) - if modulo != 0 { - p += align - modulo - } - return p - } - assert(alignment & (alignment-1) == 0, "non-power of two alignment", loc) size := size diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index 12f0dceca..db17cb033 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -29,6 +29,30 @@ byte_slice :: #force_inline proc "contextless" (data: rawptr, len: int) -> []byt return ([^]byte)(data)[:max(len, 0)] } +@(require_results) +align_forward_uint :: #force_inline proc "odin" (ptr, align: uint) -> uint { + assert(is_power_of_two_uint(align)) + return (ptr + align-1) & ~(align-1) +} + +@(require_results) +align_forward_int :: #force_inline proc "odin" (ptr, align: int) -> int { + assert(is_power_of_two_int(align)) + return int(align_forward_uint(uint(ptr), uint(align))) +} + +@(require_results) +align_forward_uintptr :: #force_inline proc "odin" (ptr, align: uintptr) -> uintptr { + return uintptr(align_forward_uint(uint(ptr), uint(align))) +} + +align_forward :: proc { + align_forward_int, + align_forward_uint, + align_forward_uintptr, +} + +@(require_results) is_power_of_two_int :: #force_inline proc "contextless" (x: int) -> bool { if x <= 0 { return false @@ -36,51 +60,17 @@ is_power_of_two_int :: #force_inline proc "contextless" (x: int) -> bool { return (x & (x-1)) == 0 } -align_forward_int :: #force_inline proc "odin" (ptr, align: int) -> int { - assert(is_power_of_two_int(align)) - - p := ptr - modulo := p & (align-1) - if modulo != 0 { - p += align - modulo - } - return p -} - +@(require_results) is_power_of_two_uint :: #force_inline proc "contextless" (x: uint) -> bool { - if x <= 0 { + if x == 0 { return false } return (x & (x-1)) == 0 } -align_forward_uint :: #force_inline proc "odin" (ptr, align: uint) -> uint { - assert(is_power_of_two_uint(align)) - - p := ptr - modulo := p & (align-1) - if modulo != 0 { - p += align - modulo - } - return p -} - +@(require_results) is_power_of_two_uintptr :: #force_inline proc "contextless" (x: uintptr) -> bool { - if x <= 0 { - return false - } - return (x & (x-1)) == 0 -} - -align_forward_uintptr :: #force_inline proc "odin" (ptr, align: uintptr) -> uintptr { - assert(is_power_of_two_uintptr(align)) - - p := ptr - modulo := p & (align-1) - if modulo != 0 { - p += align - modulo - } - return p + return is_power_of_two_uint(uint(x)) } is_power_of_two :: proc { @@ -89,12 +79,6 @@ is_power_of_two :: proc { is_power_of_two_uintptr, } -align_forward :: proc { - align_forward_int, - align_forward_uint, - align_forward_uintptr, -} - mem_zero :: proc "contextless" (data: rawptr, len: int) -> rawptr { if data == nil { return nil diff --git a/bench.odin b/bench.odin new file mode 100644 index 000000000..aab09bbfe --- /dev/null +++ b/bench.odin @@ -0,0 +1,69 @@ +package bench + +import "core:slice" +import "core:math/rand" +import "core:time" +import "core:fmt" + +T :: u64 + +benchmark_sort :: proc(num: int) -> f64 { + data := make([]T, num) + defer delete(data) + for &x in data { + x = T(rand.uint64()) + } + + start := time.tick_now() + + slice.sort(data) + + return time.duration_milliseconds(time.tick_since(start)) +} + +benchmark_sort_with_indices :: proc(num: int) -> f64 { + data := make([]T, num) + defer delete(data) + for &x in data { + x = T(rand.uint64()) + } + + start := time.tick_now() + + // Important: includes 'sort_from_permutation_indices' + indices := slice.sort_with_indices(data) + + return time.duration_milliseconds(time.tick_since(start)) +} + +benchmark_proc :: proc(num: int, bench: proc(int) -> f64, expr := #caller_expression(bench)) { + + ITERS :: 10 + min_dur := max(f64) + max_dur := min(f64) + sum_dur: f64 + for i in 0.. bool { - if x <= 0 { - return false - } - return (x & (x-1)) == 0 -} +is_power_of_two :: runtime.is_power_of_two_uintptr /* Check if a pointer is aligned. @@ -497,11 +491,7 @@ bytes, `ptr` is returned. The specified alignment must be a power of 2. */ -@(require_results) -align_forward_uintptr :: proc(ptr, align: uintptr) -> uintptr { - assert(is_power_of_two(align)) - return (ptr + align-1) & ~(align-1) -} +align_forward_uintptr :: runtime.align_forward_uintptr /* Align pointer forward. @@ -526,10 +516,7 @@ bytes, `ptr` is returned. The specified alignment must be a power of 2. */ -@(require_results) -align_forward_int :: proc(ptr, align: int) -> int { - return int(align_forward_uintptr(uintptr(ptr), uintptr(align))) -} +align_forward_int :: runtime.align_forward_int /* Align uint forward. @@ -540,10 +527,7 @@ bytes, `ptr` is returned. The specified alignment must be a power of 2. */ -@(require_results) -align_forward_uint :: proc(ptr, align: uint) -> uint { - return uint(align_forward_uintptr(uintptr(ptr), uintptr(align))) -} +align_forward_uint :: runtime.align_forward_uint /* Align uintptr backwards. From e7c29e21eedc82bf272b64804c1b20da40ce29a7 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Thu, 26 Mar 2026 19:40:14 +0100 Subject: [PATCH 234/273] remove Fixed_Byte_Buffer --- core/mem/mem.odin | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/core/mem/mem.odin b/core/mem/mem.odin index 912d62dbc..66da0f2d9 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -610,32 +610,6 @@ reinterpret_copy :: proc "contextless" ($T: typeid, ptr: rawptr) -> (value: T) { return } -/* -Dynamic array with a fixed capacity buffer. - -This type represents dynamic arrays with a fixed-size backing buffer. Upon -allocating memory beyond reaching the maximum capacity, allocations from fixed -byte buffers return `nil` and no error. -*/ -Fixed_Byte_Buffer :: distinct [dynamic]byte - -/* -Create a fixed byte buffer from a slice. -*/ -@(require_results) -make_fixed_byte_buffer :: proc "contextless" (backing: []byte) -> Fixed_Byte_Buffer { - s := transmute(Raw_Slice)backing - d: Raw_Dynamic_Array - d.data = s.data - d.len = 0 - d.cap = s.len - d.allocator = Allocator{ - procedure = nil_allocator_proc, - data = nil, - } - return transmute(Fixed_Byte_Buffer)d -} - /* General-purpose align formula. From 2dd9c703376032160cf323464cdd86dcc9d57063 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Thu, 26 Mar 2026 19:51:51 +0100 Subject: [PATCH 235/273] remove bench.odin - unrelated to this PR --- bench.odin | 69 ------------------------------------------------------ 1 file changed, 69 deletions(-) delete mode 100644 bench.odin diff --git a/bench.odin b/bench.odin deleted file mode 100644 index aab09bbfe..000000000 --- a/bench.odin +++ /dev/null @@ -1,69 +0,0 @@ -package bench - -import "core:slice" -import "core:math/rand" -import "core:time" -import "core:fmt" - -T :: u64 - -benchmark_sort :: proc(num: int) -> f64 { - data := make([]T, num) - defer delete(data) - for &x in data { - x = T(rand.uint64()) - } - - start := time.tick_now() - - slice.sort(data) - - return time.duration_milliseconds(time.tick_since(start)) -} - -benchmark_sort_with_indices :: proc(num: int) -> f64 { - data := make([]T, num) - defer delete(data) - for &x in data { - x = T(rand.uint64()) - } - - start := time.tick_now() - - // Important: includes 'sort_from_permutation_indices' - indices := slice.sort_with_indices(data) - - return time.duration_milliseconds(time.tick_since(start)) -} - -benchmark_proc :: proc(num: int, bench: proc(int) -> f64, expr := #caller_expression(bench)) { - - ITERS :: 10 - min_dur := max(f64) - max_dur := min(f64) - sum_dur: f64 - for i in 0.. Date: Thu, 26 Mar 2026 19:50:11 -0400 Subject: [PATCH 236/273] Fix issue where 2 `when` statements which eval to `true` in a `foreign` block cause the rest of the statements on the block to go unchecked --- src/checker.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 0d82ec9f9..340b74241 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -6027,8 +6027,8 @@ gb_internal void check_import_entities(Checker *c) { } TIME_SECTION("check_import_entities - check delayed entities"); - for_array(i, package_order) { - ImportGraphNode *node = package_order[i]; + for (isize pkg_index = 0; pkg_index < package_order.count; pkg_index++) { + ImportGraphNode *node = package_order[pkg_index]; GB_ASSERT(node->scope->flags&ScopeFlag_Pkg); AstPackage *pkg = node->scope->pkg; @@ -6054,9 +6054,20 @@ gb_internal void check_import_entities(Checker *c) { reset_checker_context(&ctx, f, &untyped); ctx.collect_delayed_decls = true; + + bool will_recheck_foreign_block = false; for (Ast *decl : f->delayed_decls_queues[AstDelayQueue_ForeignBlock]) { - check_add_foreign_block_decl(&ctx, decl); + if (check_add_foreign_block_decl(&ctx, decl)) { + pkg_index -= 1; // Re-check package + will_recheck_foreign_block = true; + break; + } } + + if (will_recheck_foreign_block) { + break; + } + array_clear(&f->delayed_decls_queues[AstDelayQueue_ForeignBlock]); } From 7da7bc8456653b9b885b6905ca90d817aad1add5 Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Thu, 26 Mar 2026 20:10:24 -0400 Subject: [PATCH 237/273] Add test case for issue #6484 --- tests/issues/run.bat | 1 + tests/issues/run.sh | 2 ++ tests/issues/test_issue_6484.odin | 17 +++++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 tests/issues/test_issue_6484.odin diff --git a/tests/issues/run.bat b/tests/issues/run.bat index 2f42e3e21..0b92f07ff 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -35,6 +35,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_pr_6470.odin %COMMON% || exit /b ..\..\..\odin test ..\test_pr_6470.odin -define:TEST_EXPECT_FAILURE=true %COMMON% 2>&1 | find /c "Error:" | findstr /x "1" || exit /b ..\..\..\odin test ..\test_pr_6476.odin %COMMON% || exit /b +..\..\..\odin check ..\test_issue_6484.odin -no-entry-point %COMMON% || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index 8a7800cd7..17b1b75e0 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -58,6 +58,8 @@ else echo "SUCCESSFUL 0/1" exit 1 fi +$ODIN check ../test_issue_6484.odin -no-entry-point $COMMON + set +x popd diff --git a/tests/issues/test_issue_6484.odin b/tests/issues/test_issue_6484.odin new file mode 100644 index 000000000..d115a12ef --- /dev/null +++ b/tests/issues/test_issue_6484.odin @@ -0,0 +1,17 @@ +// Tests issue #6484 https://github.com/odin-lang/Odin/pull/6484 +package test_issues + +foreign import lib "this_library_does_not_exist" + +foreign lib { + foo :: proc(int) --- + when true {} + when true {} + bar :: proc() --- +} + +foo_bar :: proc { + foo, + bar, +} + From 8fdc76d3905162a8655a87398d664e34f3dccb54 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Thu, 26 Mar 2026 20:28:14 -0400 Subject: [PATCH 238/273] [ci] fix odin versioning in nightly builds --- ci/build_linux_static.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ci/build_linux_static.sh b/ci/build_linux_static.sh index 2eb99116e..d88081f1e 100755 --- a/ci/build_linux_static.sh +++ b/ci/build_linux_static.sh @@ -6,7 +6,14 @@ LLVM_CONFIG="llvm-config-20" DISABLED_WARNINGS="-Wno-switch -Wno-macro-redefined -Wno-unused-value" -CPPFLAGS="-DODIN_VERSION_RAW=\"dev-$(date +"%Y-%m")\"" +if [ -d ".git" ] && [ -n "$(command -v git)" ]; then + GIT_SHA=$(git show --pretty='%h' --no-patch --no-notes HEAD) + GIT_DATE=$(git show "--pretty=%cd" "--date=format:%Y-%m" --no-patch --no-notes HEAD) + CPPFLAGS="$CPPFLAGS -DGIT_SHA=\"$GIT_SHA\"" +else + GIT_DATE=$(date +"%Y-%m") +fi +CPPFLAGS="$CPPFLAGS -DODIN_VERSION_RAW=\"dev-$GIT_DATE\"" CXXFLAGS="-std=c++14 $($LLVM_CONFIG --cxxflags --ldflags)" LDFLAGS="-static -lm -lzstd -lz -lffi -pthread -ldl -fuse-ld=mold" From 3e6a5a6f862c513a7b9b5d773d7b49af9bfd1d79 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 27 Mar 2026 11:00:07 -0400 Subject: [PATCH 239/273] [ci] fixed git + docker mount permissions --- .github/workflows/nightly.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index c7858c82c..cdf1e0be2 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -58,6 +58,7 @@ jobs: musl-dev llvm20-dev clang20 git mold lz4 \ libxml2-static llvm20-static zlib-static zstd-static \ make && + git config --global --add safe.directory /src && ./ci/build_linux_static.sh ' - name: Odin run From 44bf8ba4648f39afcebc60f9fd3daa4638f5d913 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 27 Mar 2026 17:43:06 +0000 Subject: [PATCH 240/273] Support `odin doc core:os` style paths --- src/main.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a79ac77a5..af5a3b0da 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3772,6 +3772,19 @@ int main(int arg_count, char const **arg_ptr) { init_filename = copy_string(permanent_allocator(), init_filename); + build_context.command = command; + + string_set_init(&build_context.custom_attributes); + string_set_init(&build_context.vet_packages); + + if (!parse_build_flags(args)) { + return 1; + } + + if (build_context.show_help) { + return print_show_help(args[0], command); + } + if (init_filename.len > 0 && !build_context.show_help) { // The command must be build, run, test, check, or another that takes a directory or filename. if (!path_is_directory(init_filename)) { @@ -3783,6 +3796,47 @@ int main(int arg_count, char const **arg_ptr) { break; } } + if (!single_file_package) { + isize colon_pos = -1; + for (isize j = 0; j < init_filename.len; j++) { + if (init_filename[j] == ':') { + colon_pos = j; + break; + } + } + if (colon_pos > 0) { + String collection_name = substring(init_filename, 0, colon_pos); + String file_str = substring(init_filename, colon_pos+1, init_filename.len); + + if (collection_name == "core") { + bool replace_with_base = false; + if (string_starts_with(file_str, str_lit("runtime"))) { + replace_with_base = true; + } else if (string_starts_with(file_str, str_lit("intrinsics"))) { + replace_with_base = true; + } if (string_starts_with(file_str, str_lit("builtin"))) { + replace_with_base = true; + } + + if (replace_with_base) { + collection_name = str_lit("base"); + } + } + + String base_dir = {}; + if (find_library_collection_path(collection_name, &base_dir)) { + bool ok = false; + String fullpath = string_trim_whitespace(get_fullpath_relative(permanent_allocator(), base_dir, file_str, &ok)); + if (ok) { + init_filename = fullpath; + if (path_is_directory(init_filename)) { + goto filename_check_success; + } + } + } + } + + } if (!single_file_package) { gb_printf_err("ERROR: `%.*s %.*s` takes a package/directory as its first argument.\n", LIT(args[0]), LIT(command)); @@ -3809,22 +3863,11 @@ int main(int arg_count, char const **arg_ptr) { return 1; } } + + filename_check_success:; } } - build_context.command = command; - - string_set_init(&build_context.custom_attributes); - string_set_init(&build_context.vet_packages); - - if (!parse_build_flags(args)) { - return 1; - } - - if (build_context.show_help) { - return print_show_help(args[0], command); - } - if (command == "bundle") { return bundle(init_filename); } From ac17852f36bb95a0466e7dadcd1edb232b551a0c Mon Sep 17 00:00:00 2001 From: mtarik34b <131314797+mtarik34b@users.noreply.github.com> Date: Sat, 28 Mar 2026 00:09:27 +0100 Subject: [PATCH 241/273] Add option to show docs in source order within each file --- src/build_settings.cpp | 8 +++--- src/docs.cpp | 65 ++++++++++++++++++++++++++++++++++++------ src/main.cpp | 10 ++++++- 3 files changed, 70 insertions(+), 13 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 41849fd6b..c12107bf7 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -250,9 +250,10 @@ gb_global char const *odin_command_strings[32] = { enum CmdDocFlag : u32 { - CmdDocFlag_Short = 1<<0, - CmdDocFlag_AllPackages = 1<<1, - CmdDocFlag_DocFormat = 1<<2, + CmdDocFlag_Short = 1<<0, + CmdDocFlag_InSourceOrder = 1<<1, + CmdDocFlag_AllPackages = 1<<2, + CmdDocFlag_DocFormat = 1<<3, }; enum TimingsExportFormat : i32 { @@ -2637,4 +2638,3 @@ gb_internal bool init_build_paths(String init_filename) { return true; } - diff --git a/src/docs.cpp b/src/docs.cpp index 004134a5c..09a62562f 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -28,7 +28,7 @@ gb_global char const *print_entity_names[Entity_Count] = { }; -gb_internal GB_COMPARE_PROC(cmp_entities_for_printing) { +gb_internal GB_COMPARE_PROC(cmp_entities_for_printing_by_kind_order) { GB_ASSERT(a != nullptr); GB_ASSERT(b != nullptr); Entity *x = *cast(Entity **)a; @@ -55,6 +55,37 @@ gb_internal GB_COMPARE_PROC(cmp_entities_for_printing) { return res; } +gb_internal GB_COMPARE_PROC(cmp_entities_for_printing_by_order_in_src) { + GB_ASSERT(a != nullptr); + GB_ASSERT(b != nullptr); + Entity *x = *cast(Entity **)a; + Entity *y = *cast(Entity **)b; + u64 res = 0; + if (x->pkg != y->pkg) { + if (x->pkg == nullptr) { + return -1; + } + if (y->pkg == nullptr) { + return +1; + } + res = string_compare(x->pkg->name, y->pkg->name); + if (res != 0) { + return res; + } + } + + u64 sx = x->order_in_src; + u64 sy = y->order_in_src; + res = u64_cmp(sx, sy); + + if (res) { + return res; + } + res = i32_cmp(x->token.pos.offset, y->token.pos.offset); + + return res; +} + gb_internal GB_COMPARE_PROC(cmp_ast_package_by_name) { GB_ASSERT(a != nullptr); GB_ASSERT(b != nullptr); @@ -237,18 +268,37 @@ gb_internal void print_doc_package(CheckerInfo *info, AstPackage *pkg) { } array_add(&entities, e); } - array_sort(entities, cmp_entities_for_printing); + + bool in_src_order = build_context.cmd_doc_flags & CmdDocFlag_InSourceOrder; + + if (in_src_order) { + array_sort(entities, cmp_entities_for_printing_by_order_in_src); + } else { + array_sort(entities, cmp_entities_for_printing_by_kind_order); + } bool show_docs = (build_context.cmd_doc_flags & CmdDocFlag_Short) == 0; + AstFile *curr_file = nullptr; EntityKind curr_entity_kind = Entity_Invalid; for (Entity *e : entities) { - if (curr_entity_kind != e->kind) { - if (curr_entity_kind != Entity_Invalid) { - print_doc_line(0, ""); + if (in_src_order) { + if (curr_file != e->file) { + if (curr_file != nullptr) { + print_doc_line(0, ""); + } + curr_file = e->file; + String filename = remove_directory_from_path(curr_file->fullpath); + print_doc_line(1, "file: %s", filename); + } + } else { + if (curr_entity_kind != e->kind) { + if (curr_entity_kind != Entity_Invalid) { + print_doc_line(0, ""); + } + curr_entity_kind = e->kind; + print_doc_line(1, "%s", print_entity_names[e->kind]); } - curr_entity_kind = e->kind; - print_doc_line(1, "%s", print_entity_names[e->kind]); } Ast *type_expr = nullptr; @@ -303,7 +353,6 @@ gb_internal void print_doc_package(CheckerInfo *info, AstPackage *pkg) { print_doc_line(2, filename); } } - } gb_internal void generate_documentation(Checker *c) { diff --git a/src/main.cpp b/src/main.cpp index af5a3b0da..d8017e7d3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -370,6 +370,7 @@ enum BuildFlagKind { BuildFlag_GoToDefinitions, BuildFlag_Short, + BuildFlag_InSourceOrder, BuildFlag_AllPackages, BuildFlag_DocFormat, @@ -602,6 +603,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_SourceCodeLocations, str_lit("source-code-locations"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_Short, str_lit("short"), BuildFlagParam_None, Command_doc); + add_flag(&build_flags, BuildFlag_InSourceOrder, str_lit("in-source-order"), BuildFlagParam_None, Command_doc); add_flag(&build_flags, BuildFlag_AllPackages, str_lit("all-packages"), BuildFlagParam_None, Command_doc | Command_test | Command_build); add_flag(&build_flags, BuildFlag_DocFormat, str_lit("doc-format"), BuildFlagParam_None, Command_doc); @@ -1491,6 +1493,9 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_Short: build_context.cmd_doc_flags |= CmdDocFlag_Short; break; + case BuildFlag_InSourceOrder: + build_context.cmd_doc_flags |= CmdDocFlag_InSourceOrder; + break; case BuildFlag_AllPackages: build_context.cmd_doc_flags |= CmdDocFlag_AllPackages; build_context.test_all_packages = true; @@ -3000,6 +3005,9 @@ gb_internal int print_show_help(String const arg0, String command, String option if (print_flag("-short")) { print_usage_line(2, "Shows shortened documentation for the packages."); } + if (print_flag("-in-source-order")) { + print_usage_line(2, "Shows documentation for the packages in source order within each file."); + } } if (check) { @@ -3279,7 +3287,7 @@ gb_internal void print_show_unused(Checker *c) { array_add(&unused, e); } - array_sort(unused, cmp_entities_for_printing); + array_sort(unused, cmp_entities_for_printing_by_kind_order); print_usage_line(0, "Unused Package Declarations"); From 2640a18296bc4edeac614f8766e08a9161902bd7 Mon Sep 17 00:00:00 2001 From: mtarik34b <131314797+mtarik34b@users.noreply.github.com> Date: Sat, 28 Mar 2026 02:08:47 +0100 Subject: [PATCH 242/273] Undo rename of cmp_entities_for_printing --- src/docs.cpp | 4 ++-- src/main.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/docs.cpp b/src/docs.cpp index 09a62562f..e711d9f59 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -28,7 +28,7 @@ gb_global char const *print_entity_names[Entity_Count] = { }; -gb_internal GB_COMPARE_PROC(cmp_entities_for_printing_by_kind_order) { +gb_internal GB_COMPARE_PROC(cmp_entities_for_printing) { GB_ASSERT(a != nullptr); GB_ASSERT(b != nullptr); Entity *x = *cast(Entity **)a; @@ -274,7 +274,7 @@ gb_internal void print_doc_package(CheckerInfo *info, AstPackage *pkg) { if (in_src_order) { array_sort(entities, cmp_entities_for_printing_by_order_in_src); } else { - array_sort(entities, cmp_entities_for_printing_by_kind_order); + array_sort(entities, cmp_entities_for_printing); } bool show_docs = (build_context.cmd_doc_flags & CmdDocFlag_Short) == 0; diff --git a/src/main.cpp b/src/main.cpp index d8017e7d3..3ec67ccc3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3287,7 +3287,7 @@ gb_internal void print_show_unused(Checker *c) { array_add(&unused, e); } - array_sort(unused, cmp_entities_for_printing_by_kind_order); + array_sort(unused, cmp_entities_for_printing); print_usage_line(0, "Unused Package Declarations"); From 7de688d89384c1d32ea1f8b8ca6a47f5d7ba28c1 Mon Sep 17 00:00:00 2001 From: mtarik34b <131314797+mtarik34b@users.noreply.github.com> Date: Sat, 28 Mar 2026 02:50:05 +0100 Subject: [PATCH 243/273] Use int instead of u64 --- src/docs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs.cpp b/src/docs.cpp index e711d9f59..de7bdafd1 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -60,7 +60,7 @@ gb_internal GB_COMPARE_PROC(cmp_entities_for_printing_by_order_in_src) { GB_ASSERT(b != nullptr); Entity *x = *cast(Entity **)a; Entity *y = *cast(Entity **)b; - u64 res = 0; + int res = 0; if (x->pkg != y->pkg) { if (x->pkg == nullptr) { return -1; From 1f2d978396df59a7011efeff93edd3bba0c8bfb4 Mon Sep 17 00:00:00 2001 From: imp0s5ible Date: Sun, 29 Mar 2026 21:11:22 +0200 Subject: [PATCH 244/273] Fix #6495 - Handle starting separator during name comparison During the loop comparing file/directory names, the starting character in both will be a path separator in most cases. Since a naive string equality will regard forward slashes and backslashes as different, we must specially handle the first character and exclude it from the equality comparison if necessary. --- core/os/path_windows.odin | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/os/path_windows.odin b/core/os/path_windows.odin index b471ab0b0..98e26f929 100644 --- a/core/os/path_windows.odin +++ b/core/os/path_windows.odin @@ -349,6 +349,9 @@ _get_common_path_len :: proc(base, target: string) -> int { end := min(len(base), len(target)) for j in 0..=end { if j == end || _is_path_separator(base[j]) { + if _is_path_separator(base[i]) && _is_path_separator(target[i]) { + i += 1 + } if strings.equal_fold(base[i:j], target[i:j]) { i = j } else { From 0d8fe0738820f88e38b7c78d05101aaa38fb6788 Mon Sep 17 00:00:00 2001 From: imp0s5ible Date: Sun, 29 Mar 2026 21:24:57 +0200 Subject: [PATCH 245/273] Fix array-bounds-exceeded error We didn't consider empty base/target strings and accessed the ith element unconditionally. We now check to make sure `i` is in range. --- core/os/path_windows.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/os/path_windows.odin b/core/os/path_windows.odin index 98e26f929..83100ad69 100644 --- a/core/os/path_windows.odin +++ b/core/os/path_windows.odin @@ -349,7 +349,7 @@ _get_common_path_len :: proc(base, target: string) -> int { end := min(len(base), len(target)) for j in 0..=end { if j == end || _is_path_separator(base[j]) { - if _is_path_separator(base[i]) && _is_path_separator(target[i]) { + if i < end && _is_path_separator(base[i]) && _is_path_separator(target[i]) { i += 1 } if strings.equal_fold(base[i:j], target[i:j]) { From d27f34f2338a59de7839dba27e1e9ddfa1ef3b6a Mon Sep 17 00:00:00 2001 From: Tejas Hegde <45031546+Tejas-H5@users.noreply.github.com> Date: Mon, 30 Mar 2026 19:29:52 +1030 Subject: [PATCH 246/273] Updated delete_key doc to mention iteration behaviour --- base/runtime/core_builtin.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index fe76ee5a5..92225303a 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -693,6 +693,8 @@ shrink_map :: proc(m: ^$T/map[$K]$V, loc := #caller_location) -> (did_shrink: bo // The delete_key built-in procedure deletes the element with the specified key (m[key]) from the map. // If m is nil, or there is no such element, this procedure is a no-op +// It is safe to use `delete_key` while iterating a map. +// But if you iterate across a map and insert a new key, it could resize which means you are not iterating across all of the elements. @builtin delete_key :: proc(m: ^$T/map[$K]$V, key: K) -> (deleted_key: K, deleted_value: V) { if m != nil { From 4dceffd049d15286126d134573f22bdf9f698de6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 30 Mar 2026 11:50:59 +0100 Subject: [PATCH 247/273] When parsing an incorrect for loop, remove `assert` // caused by this: ``` for a b, c := d() ``` --- core/odin/parser/parser.odin | 7 ++++--- src/parser.cpp | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 0f3ac78b2..b58635080 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -933,9 +933,10 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt { next_token := peek_token(p) if next_token.kind == .In || next_token.kind == .Comma { cond = parse_simple_stmt(p, {.In}) - as := cond.derived_stmt.(^ast.Assign_Stmt) - assert(as.op.kind == .In) - is_range = true + if as, ok := cond.derived_stmt.(^ast.Assign_Stmt); ok { + assert(as.op.kind == .In) + is_range = true + } break general_conds } } diff --git a/src/parser.cpp b/src/parser.cpp index 584979064..8fe33d2b8 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -4951,8 +4951,9 @@ gb_internal Ast *parse_for_stmt(AstFile *f) { Token next_token = peek_token(f); if (next_token.kind == Token_in || next_token.kind == Token_Comma) { cond = parse_simple_stmt(f, StmtAllowFlag_In); - GB_ASSERT(cond->kind == Ast_AssignStmt && cond->AssignStmt.op.kind == Token_in); - is_range = true; + if (cond->kind == Ast_AssignStmt && cond->AssignStmt.op.kind == Token_in) { + is_range = true; + } goto range_skip; } } From 52701390ce54c98c03ffc403690beb009806fbdb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 30 Mar 2026 11:52:08 +0100 Subject: [PATCH 248/273] Remove dead code in `filename_from_path` --- src/string.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/string.cpp b/src/string.cpp index 09bce205e..a4fa85871 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -492,17 +492,7 @@ gb_internal bool string_contains_string(String const &haystack, String const &ne gb_internal String filename_from_path(String s) { isize i = string_extension_position(s); if (i >= 0) { - s = substring(s, 0, i); - return s; - } - if (i > 0) { - isize j = 0; - for (j = s.len-1; j >= 0; j--) { - if (is_separator(s[j])) { - break; - } - } - return substring(s, j+1, s.len); + return substring(s, 0, i); } return make_string(nullptr, 0); } From 69606e4e228eaadb998c73efba51472199955ee0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 30 Mar 2026 13:15:41 +0100 Subject: [PATCH 249/273] Compiler `arena_alloc_array` utility procedure --- src/common_memory.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/common_memory.cpp b/src/common_memory.cpp index 1590aac65..38c316733 100644 --- a/src/common_memory.cpp +++ b/src/common_memory.cpp @@ -501,6 +501,10 @@ gb_internal Arena *get_arena(ThreadArenaKind kind) { return nullptr; } +template +gb_internal T *arena_alloc_array(Arena *arena, isize count) { + return cast(T *)arena_alloc(arena, gb_size_of(T)*count, gb_align_of(T)); +} template gb_internal T *permanent_alloc_item() { @@ -511,13 +515,13 @@ gb_internal T *permanent_alloc_item() { template gb_internal T *permanent_alloc_array(isize count) { Arena *arena = get_arena(ThreadArena_Permanent); - return cast(T *)arena_alloc(arena, gb_size_of(T)*count, gb_align_of(T)); + return arena_alloc_array(arena, count); } template gb_internal Slice permanent_slice_make(isize count) { Arena *arena = get_arena(ThreadArena_Permanent); - T *data = cast(T *)arena_alloc(arena, gb_size_of(T)*count, gb_align_of(T)); + T *data = arena_alloc_array(arena, count); return {data, count}; } @@ -530,13 +534,13 @@ gb_internal T *temporary_alloc_item() { template gb_internal T *temporary_alloc_array(isize count) { Arena *arena = get_arena(ThreadArena_Temporary); - return cast(T *)arena_alloc(arena, gb_size_of(T)*count, gb_align_of(T)); + return arena_alloc_array(arena, count); } template gb_internal Slice temporary_slice_make(isize count) { Arena *arena = get_arena(ThreadArena_Temporary); - T *data = cast(T *)arena_alloc(arena, gb_size_of(T)*count, gb_align_of(T)); + T *data = arena_alloc_array(arena, count); return {data, count}; } From c8cd8dd2db9a895091f5151d0831c46407025369 Mon Sep 17 00:00:00 2001 From: Leandro Libanio Date: Wed, 1 Apr 2026 12:39:48 -0300 Subject: [PATCH 250/273] allow in-progress union variants when validating union members Fixes: #5961 --- src/check_type.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 18cbb4900..b7ff56536 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -796,11 +796,19 @@ gb_internal void check_union_type(CheckerContext *ctx, Type *union_type, Ast *no if (t != nullptr && t != t_invalid) { bool ok = true; t = default_type(t); - if (is_type_untyped(t) || is_type_empty_union(t)) { + if (is_type_untyped(t)) { ok = false; gbString str = type_to_string(t); error(node, "Invalid variant type in union '%s'", str); gb_string_free(str); + } else if (is_type_empty_union(t)) { + Type *base = base_type(t); + if (base == nullptr || base->kind != Type_Union || base->Union.node == nullptr) { + ok = false; + gbString str = type_to_string(t); + error(node, "Invalid variant type in union '%s'", str); + gb_string_free(str); + } } else { for_array(j, variants) { if (union_variant_index_types_equal(t, variants[j])) { From 8d63c1bbff951bcb1f9519e7a382f8014bd5d7c2 Mon Sep 17 00:00:00 2001 From: Leandro Libanio Date: Wed, 1 Apr 2026 13:34:04 -0300 Subject: [PATCH 251/273] publish partial struct fields during struct field checking Fixes: #6506 --- src/check_type.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/check_type.cpp b/src/check_type.cpp index b7ff56536..137cdb96f 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -127,6 +127,8 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, Slicekind != Ast_Field) { continue; From 74c503916809876165e527bd2996c78df77bc761 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 1 Apr 2026 18:41:39 +0200 Subject: [PATCH 252/273] Revert "Fix #6424" This reverts commit 66be1a799b281d7a733b6fb6b625452b3c69ecc1. --- core/compress/common.odin | 2 ++ core/compress/zlib/zlib.odin | 18 +++++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/core/compress/common.odin b/core/compress/common.odin index 07ea7b71c..d78aec328 100644 --- a/core/compress/common.odin +++ b/core/compress/common.odin @@ -368,6 +368,8 @@ refill_lsb_from_memory :: #force_inline proc(z: ^Context_Memory_Input, width := if len(z.input_data) != 0 { b = u64(z.input_data[0]) z.input_data = z.input_data[1:] + } else { + b = 0 } z.code_buffer |= b << u8(z.num_bits) diff --git a/core/compress/zlib/zlib.odin b/core/compress/zlib/zlib.odin index 72664846e..e484a4958 100644 --- a/core/compress/zlib/zlib.odin +++ b/core/compress/zlib/zlib.odin @@ -326,7 +326,7 @@ decode_huffman :: proc(z: ^$C, t: ^Huffman_Table) -> (r: u16, err: Error) #no_bo return 0, .Code_Buffer_Malformed } compress.refill_lsb(z) - if z.code_buffer == 0 { + if z.num_bits > 63 { return 0, .Stream_Too_Short } } @@ -491,7 +491,7 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all */ expected_output_size = max(max(expected_output_size, compress.COMPRESS_OUTPUT_ALLOCATE_MIN), 512) - // fmt.printfln("ZLIB: Expected Payload Size: %v", expected_output_size) + // fmt.printf("\nZLIB: Expected Payload Size: %v\n\n", expected_output_size); if expected_output_size > 0 && expected_output_size <= compress.COMPRESS_OUTPUT_ALLOCATE_MAX { /* @@ -522,16 +522,11 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all final := u32(0) type := u32(0) - defer if int(z.bytes_written) != len(z.output.buf) { - resize(&z.output.buf, int(z.bytes_written)) - } - for { final = compress.read_bits_lsb(z, 1) type = compress.read_bits_lsb(z, 2) - // fmt.printfln("len(z): %v", len(z.input_data)) - // fmt.printfln("Final: %v | Type: %v", final, type) + // fmt.printf("Final: %v | Type: %v\n", final, type) switch type { case 0: @@ -566,6 +561,7 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all case 3: return .BType_3 case: + // fmt.printf("Err: %v | Final: %v | Type: %v\n", err, final, type) if type == 1 { // Use fixed code lengths. build_huffman(z_repeat, Z_FIXED_LENGTH[:]) or_return @@ -594,6 +590,7 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all for n < ntot { c = decode_huffman(z, codelength_ht) or_return + if c < 0 || c >= 19 { return .Huffman_Bad_Code_Lengths } @@ -638,12 +635,15 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all } parse_huffman_block(z, z_repeat, z_offset) or_return } - if final == 1 { break } } + if int(z.bytes_written) != len(z.output.buf) { + resize(&z.output.buf, int(z.bytes_written)) or_return + } + return nil } From fbf0c06cf47f11ab9e7892916e56fad66008fe6a Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 1 Apr 2026 18:58:16 +0200 Subject: [PATCH 253/273] Temporarily revert 6425 fix. --- core/compress/common.odin | 21 ++++++++++++--------- core/compress/zlib/zlib.odin | 3 --- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/compress/common.odin b/core/compress/common.odin index d78aec328..fcda3fc20 100644 --- a/core/compress/common.odin +++ b/core/compress/common.odin @@ -360,23 +360,26 @@ refill_lsb_from_memory :: #force_inline proc(z: ^Context_Memory_Input, width := refill := u64(width) b := u64(0) - if z.num_bits > refill { - return - } - for { + if z.num_bits > refill { + break + } + if z.code_buffer == 0 && z.num_bits > 63 { + z.num_bits = 0 + } + if z.code_buffer >= 1 << uint(z.num_bits) { + // Code buffer is malformed. + z.num_bits = max(u64) + return + } if len(z.input_data) != 0 { b = u64(z.input_data[0]) z.input_data = z.input_data[1:] } else { - b = 0 + return } - z.code_buffer |= b << u8(z.num_bits) z.num_bits += 8 - if z.num_bits > refill { - break - } } } diff --git a/core/compress/zlib/zlib.odin b/core/compress/zlib/zlib.odin index e484a4958..efa9cb906 100644 --- a/core/compress/zlib/zlib.odin +++ b/core/compress/zlib/zlib.odin @@ -322,9 +322,6 @@ decode_huffman_slowpath :: proc(z: ^$C, t: ^Huffman_Table) -> (r: u16, err: Erro @(optimization_mode="favor_size") decode_huffman :: proc(z: ^$C, t: ^Huffman_Table) -> (r: u16, err: Error) #no_bounds_check { if z.num_bits < 16 { - if z.num_bits > 63 { - return 0, .Code_Buffer_Malformed - } compress.refill_lsb(z) if z.num_bits > 63 { return 0, .Stream_Too_Short From b52cc450534b01efbee74572d5235dcff212e9bc Mon Sep 17 00:00:00 2001 From: Stefan Stefanov Date: Wed, 1 Apr 2026 23:03:25 +0300 Subject: [PATCH 254/273] core/crypto/aes: Fix src size check Fixed a faulty check that would check the `dst` twice instead of checking the `src` and `dst` input parameters in `encrypt_ecb()` & `decrypt_ecb()`. --- core/crypto/aes/aes_ecb.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/crypto/aes/aes_ecb.odin b/core/crypto/aes/aes_ecb.odin index cac62de5d..9ec1a9a37 100644 --- a/core/crypto/aes/aes_ecb.odin +++ b/core/crypto/aes/aes_ecb.odin @@ -21,7 +21,7 @@ init_ecb :: proc(ctx: ^Context_ECB, key: []byte, impl := DEFAULT_IMPLEMENTATION) encrypt_ecb :: proc(ctx: ^Context_ECB, dst, src: []byte) { ensure(ctx._is_initialized) ensure(len(dst) == BLOCK_SIZE, "crypto/aes: invalid dst size") - ensure(len(dst) == BLOCK_SIZE, "crypto/aes: invalid src size") + ensure(len(src) == BLOCK_SIZE, "crypto/aes: invalid src size") switch &impl in ctx._impl { case ct64.Context: @@ -35,7 +35,7 @@ encrypt_ecb :: proc(ctx: ^Context_ECB, dst, src: []byte) { decrypt_ecb :: proc(ctx: ^Context_ECB, dst, src: []byte) { ensure(ctx._is_initialized) ensure(len(dst) == BLOCK_SIZE, "crypto/aes: invalid dst size") - ensure(len(dst) == BLOCK_SIZE, "crypto/aes: invalid src size") + ensure(len(src) == BLOCK_SIZE, "crypto/aes: invalid src size") switch &impl in ctx._impl { case ct64.Context: From 70c4f4bc457a1fee216fbe7743ea96ae88b787fd Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 2 Apr 2026 10:25:19 +0100 Subject: [PATCH 255/273] Fix `read_reg_string` which was using the wrong size in bytes for the resulting buffer --- core/sys/info/platform_windows.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/info/platform_windows.odin b/core/sys/info/platform_windows.odin index e7d3baa83..585269774 100644 --- a/core/sys/info/platform_windows.odin +++ b/core/sys/info/platform_windows.odin @@ -366,7 +366,7 @@ read_reg_string :: proc "contextless" (hkey: sys.HKEY, subkey, val: cstring16, r return } - utf16.decode_to_utf8(res_buf[:result_size], buf_utf16[:]) + utf16.decode_to_utf8(res_buf[:], buf_utf16[:result_size / size_of(u16)]) res = string(cstring(&res_buf[0])) return res, true } From 1d8c44a98c7fd9b17683aa6d8327cfa780d0bf95 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 2 Apr 2026 12:52:17 +0100 Subject: [PATCH 256/273] Fix minor issues with Windows bindings --- core/sys/info/platform_windows.odin | 2 +- core/sys/windows/advapi32.odin | 2 +- core/sys/windows/util.odin | 9 ++++----- core/sys/windows/winver.odin | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/core/sys/info/platform_windows.odin b/core/sys/info/platform_windows.odin index 585269774..fbaf071b9 100644 --- a/core/sys/info/platform_windows.odin +++ b/core/sys/info/platform_windows.odin @@ -300,7 +300,7 @@ _iterate_gpus :: proc(it: ^GPU_Iterator, minimum_vram := i64(256 * 1024 * 1024)) gpu_key, auto_cast it._index, &buf_wstring[0], - &buf_len, + buf_len, ); status != i32(sys.ERROR_SUCCESS) { return {}, it.index, false } diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin index d4b86b875..7097ebdbd 100644 --- a/core/sys/windows/advapi32.odin +++ b/core/sys/windows/advapi32.odin @@ -171,7 +171,7 @@ foreign advapi32 { hKey: HKEY, dwIndex: DWORD, lpName: LPWSTR, - lpcchName: LPDWORD, + cchName: DWORD, ) -> LSTATUS --- RegEnumKeyExW :: proc( diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 542d2718e..184a8c2e3 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -465,7 +465,7 @@ get_computer_name_and_account_sid :: proc(username: string) -> (computer_name: s return "", {}, false } - cname_w := make([]u16, min(computer_name_size, 1), context.temp_allocator) + cname_w := make([]u16, computer_name_size context.temp_allocator) res = LookupAccountNameW( nil, @@ -507,7 +507,7 @@ get_sid :: proc(username: string, sid: ^SID) -> (ok: bool) { return false } - cname_w := make([]u16, min(computer_name_size, 1), context.temp_allocator) + cname_w := make([]u16, computer_name_size, context.temp_allocator) res = LookupAccountNameW( nil, @@ -707,7 +707,6 @@ run_as_user :: proc(username, password, application, commandline: string, pi: ^P } si := STARTUPINFOW{} si.cb = size_of(STARTUPINFOW) - pi := pi ok = bool(CreateProcessAsUserW( user_token, @@ -738,7 +737,7 @@ ensure_winsock_initialized :: proc "contextless" () { @static gate := false @static initted := false - if initted { + if intrinsics.atomic_load(&initted) { return } @@ -752,5 +751,5 @@ ensure_winsock_initialized :: proc "contextless" () { res := WSAStartup(version_requested, &unused_info) assert_contextless(res == 0, "unable to initialized Winsock2") - initted = true + intrinsics.atomic_store(&initted, true) } diff --git a/core/sys/windows/winver.odin b/core/sys/windows/winver.odin index 878080102..3ec6ce056 100644 --- a/core/sys/windows/winver.odin +++ b/core/sys/windows/winver.odin @@ -9,7 +9,7 @@ foreign version { GetFileVersionInfoW :: proc(lptstrFilename: LPCWSTR, dwHandle: DWORD, dwLen: DWORD, lpData: LPVOID) -> BOOL --- GetFileVersionInfoSizeExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, lpdwHandle: LPDWORD) -> DWORD --- - GetFileVersionInfoExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, dwHandle, dwLen: DWORD, lpData: LPVOID) -> DWORD --- + GetFileVersionInfoExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, dwHandle, dwLen: DWORD, lpData: LPVOID) -> BOOL --- VerLanguageNameW :: proc(wLang: DWORD, szLang: LPWSTR, cchLang: DWORD) -> DWORD --- VerQueryValueW :: proc(pBlock: LPCVOID, lpSubBlock: LPCWSTR, lplpBuffer: ^LPVOID, puLen: PUINT) -> BOOL --- From 039c438af2cfa5c8155b6451306b68cdaeaf19e5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 2 Apr 2026 12:54:07 +0100 Subject: [PATCH 257/273] Fix possible utf16 out of bounds issue --- core/sys/windows/util.odin | 2 +- core/unicode/utf16/utf16.odin | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 184a8c2e3..fc2b61033 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -465,7 +465,7 @@ get_computer_name_and_account_sid :: proc(username: string) -> (computer_name: s return "", {}, false } - cname_w := make([]u16, computer_name_size context.temp_allocator) + cname_w := make([]u16, computer_name_size, context.temp_allocator) res = LookupAccountNameW( nil, diff --git a/core/unicode/utf16/utf16.odin b/core/unicode/utf16/utf16.odin index edd48e0f3..7396cb9e8 100644 --- a/core/unicode/utf16/utf16.odin +++ b/core/unicode/utf16/utf16.odin @@ -39,19 +39,19 @@ encode :: proc "contextless" (d: []u16, s: []rune) -> int { loop: for r in s { switch r { case 0..<_surr1, _surr3 ..< _surr_self: - if m+1 < n { break loop } + if n >= m { break loop } d[n] = u16(r) n += 1 case _surr_self ..= MAX_RUNE: - if m+2 < n { break loop } + if n+1 >= m { break loop } r1, r2 := encode_surrogate_pair(r) d[n] = u16(r1) d[n+1] = u16(r2) n += 2 case: - if m+1 < n { break loop } + if n >= m { break loop } d[n] = u16(REPLACEMENT_CHAR) n += 1 } @@ -65,19 +65,19 @@ encode_string :: proc "contextless" (d: []u16, s: string) -> int { loop: for r in s { switch r { case 0..<_surr1, _surr3 ..< _surr_self: - if m+1 < n { break loop } + if n >= m { break loop } d[n] = u16(r) n += 1 case _surr_self ..= MAX_RUNE: - if m+2 < n { break loop } + if n+1 >= m { break loop } r1, r2 := encode_surrogate_pair(r) d[n] = u16(r1) d[n+1] = u16(r2) n += 2 case: - if m+1 < n { break loop } + if n >= m { break loop } d[n] = u16(REPLACEMENT_CHAR) n += 1 } From 7313e6708d8171da020893194c73d080859bb7c7 Mon Sep 17 00:00:00 2001 From: Lucy Date: Thu, 2 Apr 2026 12:17:38 -0300 Subject: [PATCH 258/273] add -o docs to usage --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index d7288e5f4..24f862e0e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2678,7 +2678,7 @@ gb_internal int print_show_help(String const arg0, String command, String option if (run_or_build) { if (print_flag("-debug")) { - print_usage_line(2, "Enables debug information, and defines the global constant ODIN_DEBUG to be 'true'."); + print_usage_line(2, "Enables debug information, and defines the global constant ODIN_DEBUG to be 'true'. Sets -o:none by default."); } } @@ -2943,7 +2943,7 @@ gb_internal int print_show_help(String const arg0, String command, String option if (LB_USE_NEW_PASS_SYSTEM) { print_usage_line(3, "-o:aggressive (use this with caution)"); } - print_usage_line(2, "The default is -o:minimal."); + print_usage_line(2, "The default is -o:minimal. If -debug is set, the default is -o:none."); } From d06572c831b4b301a79ee535e89857dfeefac6d5 Mon Sep 17 00:00:00 2001 From: juaum Date: Sat, 4 Apr 2026 10:13:19 +0200 Subject: [PATCH 259/273] core/os: Add dir procedure --- core/os/path.odin | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/os/path.odin b/core/os/path.odin index 766adcaa9..0a0c8356a 100644 --- a/core/os/path.odin +++ b/core/os/path.odin @@ -383,6 +383,24 @@ base :: proc(path: string) -> string { return file } +/* +Gets the parent directory path from a path. + +e.g. + '/home/foo/bar.tar.gz' -> '/home/foo' + 'path/to/name.tar.gz' -> 'path/to' + +Returns "." if the path is an empty string. +*/ +dir :: proc(path: string) -> string { + if path == "" { + return "." + } + + d, _ := split_path(path) + return d +} + /* Gets the name of a file from a path. From b3c1725025468fbb9ada77fa929e246107171cf5 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 4 Apr 2026 14:38:27 +0200 Subject: [PATCH 260/273] [core:terminal] Remove superfluous @(init) and @(fini) --- core/terminal/terminal_windows.odin | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/terminal/terminal_windows.odin b/core/terminal/terminal_windows.odin index 6c77330b5..64244e1ac 100644 --- a/core/terminal/terminal_windows.odin +++ b/core/terminal/terminal_windows.odin @@ -17,7 +17,6 @@ old_modes: [2]struct{ {windows.STD_ERROR_HANDLE, 0}, } -@(init) _init_terminal :: proc "contextless" () { vtp_enabled: bool @@ -49,7 +48,6 @@ _init_terminal :: proc "contextless" () { } } -@(fini) _fini_terminal :: proc "contextless" () { for v in old_modes { handle := windows.GetStdHandle(v.handle) From ac1b5aea0f3744d81f8b1802b0efb752bed2ffe9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 7 Apr 2026 11:35:20 +0100 Subject: [PATCH 261/273] Add `intrinsics.simd_odd_even`; More `core:simd` operations --- core/simd/simd.odin | 88 ++++++++++++++++++++++++++++++++++- src/check_builtin.cpp | 29 ++++++++++++ src/checker_builtin_procs.hpp | 2 + src/llvm_backend_proc.cpp | 24 ++++++++++ 4 files changed, 142 insertions(+), 1 deletion(-) diff --git a/core/simd/simd.odin b/core/simd/simd.odin index 52c97cc45..02a00a47d 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -2579,6 +2579,27 @@ Reverse the bit pattern of a SIMD vector. */ reverse_bits :: intrinsics.reverse_bits +/* +**Operation** + + #assert(len(a) == len(b)) + res := 0 + N :: len(a) + for i in 0 ..< N/2 { + res[i] = a[2*i + 1] + } + for i in 0 ..< N/2 { + res[i + N/2] = b[2*i] + } + return res +*/ +odd_even :: intrinsics.simd_odd_even + +@(require_results) +add_sub :: #force_inline proc "contextless" (a, b: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_integer(E) { + return odd_even(add(a, b), sub(a, b)) +} + /* Perform a FMA (Fused multiply-add) operation on each lane of SIMD vectors. @@ -2606,6 +2627,41 @@ Returns: */ fused_mul_add :: intrinsics.fused_mul_add + +@(require_results) +fused_neg_mul_add :: #force_inline proc "contextless" (a, b, c: $T/#simd[$LANES]$E) -> T { + return fused_mul_add(neg(a), b, c) +} + +@(require_results) +fused_mul_sub :: #force_inline proc "contextless" (a, b, c: $T/#simd[$LANES]$E) -> T { + return fused_mul_add(a, b, neg(c)) +} + +@(require_results) +fused_neg_mul_sub :: #force_inline proc "contextless" (a, b, c: $T/#simd[$LANES]$E) -> T { + return fused_mul_add(neg(a), b, neg(c)) +} + +@(require_results) +fused_mul_add_sub :: #force_inline proc "contextless" (a, b, c: $T/#simd[$LANES]$E) -> T { + odd := fused_mul_add(a, b, c) + even := fused_mul_sub(a, b, c) + return odd_even(odd, even) +} + +@(require_results) +fused_mul_sub_add :: #force_inline proc "contextless" (a, b, c: $T/#simd[$LANES]$E) -> T { + odd := fused_mul_sub(a, b, c) + even := fused_mul_add(a, b, c) + return odd_even(odd, even) +} + + + + + + /* Perform a FMA (Fused multiply-add) operation on each lane of SIMD vectors. @@ -2769,4 +2825,34 @@ Operation: res[i] = i } */ -indices :: intrinsics.simd_indices \ No newline at end of file +indices :: intrinsics.simd_indices + +/* +Create a vector where each lane contains the index of that lane. +Inputs: +- `V`: The type of the vector to create. +Result: +- A vector of the given type, where each lane contains the index of that lane. +Operation: + for i in 0 ..< N { + res[i] = i + } +*/ +iota :: intrinsics.simd_indices + + + +@(require_results) +saturating_neg :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_integer(E) { + return saturating_sub(T(0), v) +} + +@(require_results) +saturating_abs :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_integer(E) { + return max(v, saturating_sub(T(0), v)) +} + +@(require_results) +abs_diff :: #force_inline proc "contextless" (a, b: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_integer(E) { + return abs(sub(a, b)) +} diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index e4907dfd0..634370fd9 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1387,6 +1387,35 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan return true; } + case BuiltinProc_simd_odd_even: + { + Operand x = {}; + Operand y = {}; + check_expr(c, &x, ce->args[0]); if (x.mode == Addressing_Invalid) return false; + check_expr_with_type_hint(c, &y, ce->args[1], x.type); if (y.mode == Addressing_Invalid) return false; + convert_to_typed(c, &y, x.type); if (y.mode == Addressing_Invalid) return false; + if (!is_type_simd_vector(x.type)) { + error(x.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); + return false; + } + if (!is_type_simd_vector(y.type)) { + error(y.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); + return false; + } + if (!are_types_identical(x.type, y.type)) { + gbString xs = type_to_string(x.type); + gbString ys = type_to_string(y.type); + error(x.expr, "'%.*s' expected 2 arguments of the same type, got '%s' vs '%s'", LIT(builtin_name), xs, ys); + gb_string_free(ys); + gb_string_free(xs); + return false; + } + + operand->mode = Addressing_Value; + operand->type = x.type; + return true; + } + case BuiltinProc_simd_select: { Operand cond = {}; diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index c0333e91c..36e983476 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -204,6 +204,7 @@ BuiltinProc__simd_begin, BuiltinProc_simd_shuffle, BuiltinProc_simd_select, BuiltinProc_simd_runtime_swizzle, + BuiltinProc_simd_odd_even, BuiltinProc_simd_ceil, BuiltinProc_simd_floor, @@ -595,6 +596,7 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("simd_shuffle"), 2, true, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_select"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_runtime_swizzle"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_odd_even"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_ceil") , 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_floor"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 7d0379e9a..2960a4306 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1738,6 +1738,30 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn return res; } + case BuiltinProc_simd_odd_even: + { + Type *vt = arg0.type; + GB_ASSERT(vt->kind == Type_SimdVector); + + u64 indices_count = cast(u64)vt->SimdVector.count; + + LLVMValueRef *vals = gb_alloc_array(temporary_allocator(), LLVMValueRef, indices_count); + + for (u64 i = 0; i < indices_count/2; i++) { + u64 val = 2*i + 1; + vals[i] = LLVMConstInt(lb_type(p->module, t_u32), val, false); + } + for (u64 i = 0; i < indices_count/2; i++) { + u64 val = 2*i + indices_count; + vals[i+indices_count/2] = LLVMConstInt(lb_type(p->module, t_u32), val, false); + } + + LLVMValueRef indices = LLVMConstVector(vals, cast(unsigned)indices_count); + + res.value = LLVMBuildShuffleVector(p->builder, arg0.value, arg1.value, indices, ""); + return res; + } + case BuiltinProc_simd_select: { LLVMValueRef cond = arg0.value; From 30b6fab1201668413186a2fdab21854179010005 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 7 Apr 2026 11:46:57 +0100 Subject: [PATCH 262/273] Fix simd.scatter/simd.gather for LLVM 22 --- src/llvm_backend_proc.cpp | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 2960a4306..d6742b2c5 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2189,6 +2189,8 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn auto alignment = cast(unsigned long long)type_align_of(base_array_type(arg1.type)); LLVMValueRef align = LLVMConstInt(LLVMInt32TypeInContext(p->module->ctx), alignment, false); + i32 align_idx = -1; + unsigned arg_count = 4; LLVMValueRef args[4] = {}; switch (builtin_id) { @@ -2196,20 +2198,34 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn types[1] = lb_type(p->module, t_rawptr); /*fallthrough*/ case BuiltinProc_simd_gather: - args[0] = ptr; - args[1] = align; - args[2] = mask; - args[3] = val; + if (LLVM_VERSION_MAJOR >= 22) { + arg_count = 3; + args[0] = ptr; align_idx = 0; + args[1] = mask; + args[2] = val; + } else { + args[0] = ptr; + args[1] = align; + args[2] = mask; + args[3] = val; + } break; case BuiltinProc_simd_masked_store: types[1] = lb_type(p->module, t_rawptr); /*fallthrough*/ case BuiltinProc_simd_scatter: - args[0] = val; - args[1] = ptr; - args[2] = align; - args[3] = mask; + if (LLVM_VERSION_MAJOR >= 22) { + arg_count = 3; + args[0] = val; + args[1] = ptr; align_idx = 1; + args[2] = mask; + } else { + args[0] = val; + args[1] = ptr; + args[2] = align; + args[3] = mask; + } break; case BuiltinProc_simd_masked_expand_load: @@ -2230,6 +2246,10 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn } res.value = lb_call_intrinsic(p, name, args, arg_count, types, type_count); + if (align_idx >= 0) { + LLVMAttributeRef align_attr = lb_create_enum_attribute(p->module->ctx, "align", alignment); + LLVMAddAttributeAtIndex(res.value, align_idx, align_attr); + } return res; } From 885db93e20e24f1f7fc9a365229a3bf852c84e45 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 7 Apr 2026 13:18:03 +0100 Subject: [PATCH 263/273] Add `intrinsics.simd_sums_of_n` --- base/intrinsics/intrinsics.odin | 6 ++ core/simd/simd.odin | 3 + src/check_builtin.cpp | 59 +++++++++++++++++ src/checker_builtin_procs.hpp | 4 ++ src/llvm_backend_proc.cpp | 109 ++++++++++++++++++++++++++++++-- vendor/cgltf/cgltf.odin | 2 +- 6 files changed, 178 insertions(+), 5 deletions(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index 4d3d38882..db7814157 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -356,6 +356,12 @@ simd_lanes_reverse :: proc(a: #simd[N]T) -> #simd[N]T --- simd_lanes_rotate_left :: proc(a: #simd[N]T, $offset: int) -> #simd[N]T --- simd_lanes_rotate_right :: proc(a: #simd[N]T, $offset: int) -> #simd[N]T --- +// return {b[0], a[1], b[2], a[3], ...} +simd_odd_even :: proc(a, b: #simd[N]T) -> #simd[N]T --- + +// Returns the sums of N consecutive lanes +simd_sums_of_n :: proc(a: #simd[LANES]T, $N: uint) -> #simd[LANES/N]T where is_power_of_two(N) --- + // Checks if the current target supports the given target features. // // Takes a constant comma-seperated string (eg: "sha512,sse4.1"), or a procedure type which has either diff --git a/core/simd/simd.odin b/core/simd/simd.odin index 02a00a47d..471cb86b8 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -2841,6 +2841,9 @@ Operation: iota :: intrinsics.simd_indices +sums_of_n :: intrinsics.simd_sums_of_n + + @(require_results) saturating_neg :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_integer(E) { diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 634370fd9..5e3ade4e2 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1521,6 +1521,65 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan return true; } + case BuiltinProc_simd_sums_of_n: + { + Operand x = {}; + check_expr(c, &x, ce->args[0]); if (x.mode == Addressing_Invalid) return false; + + if (!is_type_simd_vector(x.type)) { + error(x.expr, "'%.*s' expected a simd vector boolean type", LIT(builtin_name)); + return false; + } + Type *bt = base_type(x.type); + u64 max_count = cast(u64)bt->SimdVector.count; + Type *elem = bt->SimdVector.elem; + + u64 n = 0; + + Operand y = {}; + check_expr(c, &y, ce->args[1]); if (y.mode == Addressing_Invalid) return false; + { + Type *arg_type = base_type(y.type); + if (!is_type_integer(arg_type) || y.mode != Addressing_Constant) { + error(y.expr, "Indices to '%.*s' must be constant integers", LIT(builtin_name)); + return false; + } + + if (big_int_is_neg(&y.value.value_integer)) { + error(y.expr, "Negative '%.*s' index", LIT(builtin_name)); + return false; + } + + n = exact_value_to_u64(y.value); + } + + if (!(is_power_of_two_u64(n) && n >= 2)) { + error(y.expr, "'%.*s' requires a power of two 'n' parameter >= 2, got %llu", LIT(builtin_name), cast(unsigned long long)n); + return false; + } + + if (n > max_count) { + error(y.expr, "'%.*s' requires that the 'n' parameter is <= than the #simd length, got %llu vs %llu", LIT(builtin_name), cast(unsigned long long)n, cast(unsigned long long) max_count); + return false; + } + + if (max_count % n != 0) { + error(y.expr, "'%.*s' requires the #simd length to be a multiple of the 'n' parameter, got #simd length=%llu, n=%llu", LIT(builtin_name), cast(unsigned long long) max_count, cast(unsigned long long)n); + return false; + } + + operand->mode = Addressing_Value; + + u64 result_count = max_count/n; + if (result_count == 1) { + operand->type = elem; + } else { + operand->type = alloc_type_simd_vector(result_count, elem); + } + return true; + + } + case BuiltinProc_simd_ceil: case BuiltinProc_simd_floor: case BuiltinProc_simd_trunc: diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index 36e983476..a21428853 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -206,6 +206,8 @@ BuiltinProc__simd_begin, BuiltinProc_simd_runtime_swizzle, BuiltinProc_simd_odd_even, + BuiltinProc_simd_sums_of_n, + BuiltinProc_simd_ceil, BuiltinProc_simd_floor, BuiltinProc_simd_trunc, @@ -598,6 +600,8 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("simd_runtime_swizzle"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_odd_even"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_sums_of_n"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_ceil") , 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_floor"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_trunc"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index d6742b2c5..52fc67337 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1691,7 +1691,7 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn case BuiltinProc_simd_extract_lsbs: case BuiltinProc_simd_extract_msbs: { - Type *vt = arg0.type; + Type *vt = base_type(arg0.type); GB_ASSERT(vt->kind == Type_SimdVector); i64 elem_bits = 8*type_size_of(elem); @@ -1719,7 +1719,7 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn case BuiltinProc_simd_shuffle: { - Type *vt = arg0.type; + Type *vt = base_type(arg0.type); GB_ASSERT(vt->kind == Type_SimdVector); i64 indices_count = ce->args.count-2; @@ -1740,7 +1740,7 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn case BuiltinProc_simd_odd_even: { - Type *vt = arg0.type; + Type *vt = base_type(arg0.type); GB_ASSERT(vt->kind == Type_SimdVector); u64 indices_count = cast(u64)vt->SimdVector.count; @@ -1778,7 +1778,7 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn LLVMValueRef src = arg0.value; LLVMValueRef indices = lb_build_expr(p, ce->args[1]).value; - Type *vt = arg0.type; + Type *vt = base_type(arg0.type); GB_ASSERT(vt->kind == Type_SimdVector); i64 count = vt->SimdVector.count; Type *elem_type = vt->SimdVector.elem; @@ -2042,6 +2042,107 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn return res; } + + case BuiltinProc_simd_sums_of_n: + { + TEMPORARY_ALLOCATOR_GUARD(); + + Type *vt = base_type(arg0.type); + GB_ASSERT(vt->kind == Type_SimdVector); + bool is_float = is_type_float(vt->SimdVector.elem); + LLVMTypeRef llvm_elem = lb_type(m, elem); + + LLVMValueRef val = arg0.value; + LLVMTypeRef llvm_u32 = lb_type(m, t_u32); + + u64 max_count = cast(u64)vt->SimdVector.count; + + GB_ASSERT(ce->args[1]->tav.mode == Addressing_Constant); + u64 n = exact_value_to_u64(ce->args[1]->tav.value); + GB_ASSERT(max_count >= n); + GB_ASSERT(max_count % n == 0); + + u64 new_size = max_count / n; + + if (max_count == n) { + LLVMValueRef args[2] = {}; + isize args_count = 0; + + char const *name = nullptr; + if (is_float) { + name = "llvm.vector.reduce.fadd"; + args[args_count++] = LLVMConstReal(llvm_elem, 0.0); + } else { + name = "llvm.vector.reduce.add"; + } + + args[args_count++] = arg0.value; + + LLVMTypeRef types[1] = {lb_type(p->module, arg0.type)}; + res.value = lb_call_intrinsic(p, name, args, cast(unsigned)args_count, types, gb_count_of(types)); + return res; + } else if (n == 2) { + LLVMValueRef *left_vals = gb_alloc_array(temporary_allocator(), LLVMValueRef, new_size); + LLVMValueRef *right_vals = gb_alloc_array(temporary_allocator(), LLVMValueRef, new_size); + for (u64 i = 0; i < new_size; i++) { + left_vals[i] = LLVMConstInt(llvm_u32, 2*i, false); + right_vals[i] = LLVMConstInt(llvm_u32, 2*i+1, false); + } + LLVMValueRef left_indices = LLVMConstVector(left_vals, cast(unsigned)new_size); + LLVMValueRef right_indices = LLVMConstVector(right_vals, cast(unsigned)new_size); + + LLVMValueRef left = LLVMBuildShuffleVector(p->builder, val, val, left_indices, ""); + LLVMValueRef right = LLVMBuildShuffleVector(p->builder, val, val, right_indices, ""); + + if (is_float) { + res.value = LLVMBuildFAdd(p->builder, left, right, ""); + } else { + res.value = LLVMBuildAdd(p->builder, left, right, ""); + } + } else { + LLVMValueRef *shuffled = gb_alloc_array(temporary_allocator(), LLVMValueRef, new_size); + LLVMValueRef *reductions = gb_alloc_array(temporary_allocator(), LLVMValueRef, new_size); + + for (u64 i = 0; i < new_size; i++) { + u64 offset = i*n; + LLVMValueRef *index_vals = gb_alloc_array(temporary_allocator(), LLVMValueRef, n); + for (u64 j = 0; j < n; j++) { + index_vals[j] = LLVMConstInt(llvm_u32, offset+j, false); + } + + LLVMValueRef indices = LLVMConstVector(index_vals, cast(unsigned)n); + shuffled[i] = LLVMBuildShuffleVector(p->builder, val, val, indices, ""); + } + for (u64 i = 0; i < new_size; i++) { + LLVMValueRef args[2] = {}; + isize args_count = 0; + + char const *name = nullptr; + if (is_float) { + name = "llvm.vector.reduce.fadd"; + args[args_count++] = LLVMConstReal(llvm_elem, 0.0); + } else { + name = "llvm.vector.reduce.add"; + } + + args[args_count++] = shuffled[i]; + + LLVMTypeRef this_simd_type = LLVMVectorType(llvm_elem, cast(unsigned)n); + LLVMTypeRef types[1] = {this_simd_type}; + reductions[i] = lb_call_intrinsic(p, name, args, cast(unsigned)args_count, types, gb_count_of(types)); + } + + res.value = LLVMConstNull(LLVMVectorType(llvm_elem, cast(unsigned)new_size)); + for (u64 i = 0; i < new_size; i++) { + LLVMValueRef idx = LLVMConstInt(llvm_u32, i, false); + res.value = LLVMBuildInsertElement(p->builder, res.value, reductions[i], idx, ""); + } + } + + return res; + + } break; + case BuiltinProc_simd_ceil: case BuiltinProc_simd_floor: case BuiltinProc_simd_trunc: diff --git a/vendor/cgltf/cgltf.odin b/vendor/cgltf/cgltf.odin index db1d1c6c0..c30d2c4b6 100644 --- a/vendor/cgltf/cgltf.odin +++ b/vendor/cgltf/cgltf.odin @@ -13,7 +13,7 @@ LIB :: ( when LIB != "" { when !#exists(LIB) { // Windows library is shipped with the compiler, so a Windows specific message should not be needed. - #panic("Could not find the compiled cgltf library, it can be compiled by running `make -C \"" + ODIN_ROOT + "vendor/cgltf/src\"`") + // #panic("Could not find the compiled cgltf library, it can be compiled by running `make -C \"" + ODIN_ROOT + "vendor/cgltf/src\"`") } } From 5de18d30f3933310c0f644d62894fda7260e1206 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 7 Apr 2026 14:35:04 +0100 Subject: [PATCH 264/273] Add `intrinsics.simd_approx_recip` and `intrinsics.simd_approx_recip_sqrt` --- base/intrinsics/intrinsics.odin | 3 + core/simd/simd.odin | 4 + src/check_builtin.cpp | 4 +- src/checker_builtin_procs.hpp | 6 + src/llvm_backend_proc.cpp | 250 ++++++++++++++++++++++++++++++++ 5 files changed, 266 insertions(+), 1 deletion(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index db7814157..235ba9969 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -348,6 +348,9 @@ simd_trunc :: proc(a: #simd[N]any_float) -> #simd[N]any_float --- // rounding to the nearest integral value; if two values are equally near, rounds to the even one simd_nearest :: proc(a: #simd[N]any_float) -> #simd[N]any_float --- +simd_approx_recip :: proc(x: #simd[N]T) -> #simd[N]T where type_is_float(T)) --- +simd_approx_recip_sqrt :: proc(x: #simd[N]T) -> #simd[N]T where type_is_float(T)) --- + simd_to_bits :: proc(v: #simd[N]T) -> #simd[N]Integer where size_of(T) == size_of(Integer), type_is_unsigned(Integer) --- // equivalent to a swizzle with descending indices, e.g. reserve(a, 3, 2, 1, 0) diff --git a/core/simd/simd.odin b/core/simd/simd.odin index 471cb86b8..7de007c9d 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -2814,6 +2814,10 @@ recip :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where int } +approx_recip :: intrinsics.simd_approx_recip +approx_recip_sqrt :: intrinsics.simd_approx_recip_sqrt + + /* Create a vector where each lane contains the index of that lane. Inputs: diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 5e3ade4e2..a40a06cd9 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1584,12 +1584,14 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan case BuiltinProc_simd_floor: case BuiltinProc_simd_trunc: case BuiltinProc_simd_nearest: + case BuiltinProc_simd_approx_recip: + case BuiltinProc_simd_approx_recip_sqrt: { Operand x = {}; check_expr(c, &x, ce->args[0]); if (x.mode == Addressing_Invalid) return false; if (!is_type_simd_vector(x.type)) { - error(x.expr, "'%.*s' expected a simd vector boolean type", LIT(builtin_name)); + error(x.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); return false; } Type *elem = base_array_type(x.type); diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index a21428853..fcabecce3 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -213,6 +213,9 @@ BuiltinProc__simd_begin, BuiltinProc_simd_trunc, BuiltinProc_simd_nearest, + BuiltinProc_simd_approx_recip, + BuiltinProc_simd_approx_recip_sqrt, + BuiltinProc_simd_to_bits, BuiltinProc_simd_lanes_reverse, @@ -607,6 +610,9 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("simd_trunc"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_nearest"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_approx_recip"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_approx_recip_sqrt"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_to_bits"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_lanes_reverse"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 52fc67337..84ef34484 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2163,6 +2163,256 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn return res; } + + case BuiltinProc_simd_approx_recip: + { + Type *vt = base_type(arg0.type); + GB_ASSERT(is_type_simd_vector(vt)); + + LLVMValueRef val = arg0.value; + i64 count = vt->SimdVector.count; + Type *elem = base_type(vt->SimdVector.elem); + + // TODO(bill): Good optimizations for more than SSE + // e.g. AVX, ARM64, etc + if (are_types_identical(elem, t_f32) && (build_context.metrics.arch == TargetArch_i386 || build_context.metrics.arch == TargetArch_amd64)) { + char const *name_x86 = "llvm.x86.sse.rcp.ps"; + + if (count < 4) { + GB_ASSERT(count == 2); + + LLVMValueRef zero = lb_const_value(p->module, elem, exact_value_float(0)).value; + LLVMValueRef one = lb_const_value(p->module, elem, exact_value_float(1)).value; + + + LLVMValueRef grow_indices[4] = {zero, one, zero, zero}; + LLVMValueRef shrink_indices[2] = {zero, one}; + LLVMValueRef grow_mask = LLVMConstVector(grow_indices, 4); + LLVMValueRef shrink_mask = LLVMConstVector(shrink_indices, 2); + + val = LLVMBuildShuffleVector(p->builder, val, val, grow_mask, ""); + LLVMValueRef args[1] = {val}; + val = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); + val = LLVMBuildShuffleVector(p->builder, val, val, shrink_mask, ""); + res.value = val; + return res; + } else if (count == 4) { + LLVMValueRef args[1] = {val}; + val = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); + res.value = val; + return res; + } else { + GB_ASSERT(count > 4); + i64 parts_count = count/4; + LLVMValueRef *parts = gb_alloc_array(temporary_allocator(), LLVMValueRef, parts_count); + for (i64 i = 0; i < parts_count; i++) { + LLVMValueRef v0 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+0)).value; + LLVMValueRef v1 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+1)).value; + LLVMValueRef v2 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+2)).value; + LLVMValueRef v3 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+3)).value; + + LLVMValueRef indices[4] = {v0, v1, v2, v3}; + + parts[i] = LLVMBuildShuffleVector(p->builder, val, val, LLVMConstVector(indices, 4), ""); + } + + for (i64 i = 0; i < parts_count; i++) { + LLVMValueRef args[1] = {parts[i]}; + parts[i] = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); + } + + LLVMValueRef *indices = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); + + u64 sub_parts_remaining = parts_count; + + while (sub_parts_remaining > 1) { + for (u64 i = 0; i < sub_parts_remaining; i += 2) { + unsigned indices_count = 2*cast(unsigned)(cast(u64)count/sub_parts_remaining); + for (unsigned j = 0; j < indices_count; j++) { + indices[j] = lb_const_value(p->module, t_u32, exact_value_i64(j)).value; + } + + parts[i] = LLVMBuildShuffleVector(p->builder, parts[i], parts[i+1], LLVMConstVector(indices, indices_count), ""); + } + + for (u64 i = 2; i < sub_parts_remaining; i += 2) { + parts[i/2] = parts[i]; + } + + + sub_parts_remaining >>= 1; + } + + res.value = parts[0]; + return res; + } + } + + + LLVMValueRef one = lb_const_value(p->module, vt->SimdVector.elem, exact_value_float(1)).value; + LLVMValueRef *ones = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); + for (i64 i = 0; i < count; i++) { + ones[i] = one; + } + LLVMValueRef one_vector = LLVMConstVector(ones, cast(unsigned)count); + res.value = LLVMBuildFDiv(p->builder, one_vector, val, ""); + return res; + } + + case BuiltinProc_simd_approx_recip_sqrt: + { + auto const_broadcast_vector_float = [](lbProcedure *p, Type *elem_type, i64 count, f64 elem) -> LLVMValueRef { + LLVMValueRef val = lb_const_value(p->module, elem_type, exact_value_float(elem)).value; + LLVMValueRef *vals = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); + for (i64 i = 0; i < count; i++) { + vals[i] = val; + } + return LLVMConstVector(vals, cast(unsigned)count); + }; + auto const_broadcast_vector_unsigned = [](lbProcedure *p, Type *elem_type, i64 count, u64 elem) -> LLVMValueRef { + LLVMValueRef val = lb_const_value(p->module, elem_type, exact_value_u64(elem)).value; + LLVMValueRef *vals = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); + for (i64 i = 0; i < count; i++) { + vals[i] = val; + } + return LLVMConstVector(vals, cast(unsigned)count); + }; + + + Type *vt = base_type(arg0.type); + GB_ASSERT(is_type_simd_vector(vt)); + Type *elem = base_type(vt->SimdVector.elem); + LLVMValueRef val = arg0.value; + i64 count = vt->SimdVector.count; + + // TODO(bill): Good optimizations for more than SSE + // e.g. AVX, ARM64, etc + if (are_types_identical(elem, t_f32) && (build_context.metrics.arch == TargetArch_i386 || build_context.metrics.arch == TargetArch_amd64)) { + char const *name_x86 = "llvm.x86.sse.rsqrt.ps"; + + if (count < 4) { + GB_ASSERT(count == 2); + + LLVMValueRef zero = lb_const_value(p->module, elem, exact_value_float(0)).value; + LLVMValueRef one = lb_const_value(p->module, elem, exact_value_float(1)).value; + + + LLVMValueRef grow_indices[4] = {zero, one, zero, zero}; + LLVMValueRef shrink_indices[2] = {zero, one}; + LLVMValueRef grow_mask = LLVMConstVector(grow_indices, 4); + LLVMValueRef shrink_mask = LLVMConstVector(shrink_indices, 2); + + val = LLVMBuildShuffleVector(p->builder, val, val, grow_mask, ""); + LLVMValueRef args[1] = {val}; + val = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); + val = LLVMBuildShuffleVector(p->builder, val, val, shrink_mask, ""); + res.value = val; + return res; + } else if (count == 4) { + LLVMValueRef args[1] = {val}; + val = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); + res.value = val; + return res; + } else { + GB_ASSERT(count > 4); + i64 parts_count = count/4; + LLVMValueRef *parts = gb_alloc_array(temporary_allocator(), LLVMValueRef, parts_count); + for (i64 i = 0; i < parts_count; i++) { + LLVMValueRef v0 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+0)).value; + LLVMValueRef v1 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+1)).value; + LLVMValueRef v2 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+2)).value; + LLVMValueRef v3 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+3)).value; + + LLVMValueRef indices[4] = {v0, v1, v2, v3}; + + parts[i] = LLVMBuildShuffleVector(p->builder, val, val, LLVMConstVector(indices, 4), ""); + } + + for (i64 i = 0; i < parts_count; i++) { + LLVMValueRef args[1] = {parts[i]}; + parts[i] = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); + } + + LLVMValueRef *indices = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); + + u64 sub_parts_remaining = parts_count; + + while (sub_parts_remaining > 1) { + for (u64 i = 0; i < sub_parts_remaining; i += 2) { + unsigned indices_count = 2*cast(unsigned)(cast(u64)count/sub_parts_remaining); + for (unsigned j = 0; j < indices_count; j++) { + indices[j] = lb_const_value(p->module, t_u32, exact_value_i64(j)).value; + } + + parts[i] = LLVMBuildShuffleVector(p->builder, parts[i], parts[i+1], LLVMConstVector(indices, indices_count), ""); + } + + for (u64 i = 2; i < sub_parts_remaining; i += 2) { + parts[i/2] = parts[i]; + } + + + sub_parts_remaining >>= 1; + } + + res.value = parts[0]; + return res; + } + } else if (are_types_identical(elem, t_f64)) { + LLVMValueRef half = const_broadcast_vector_float(p, elem, count, 0.5); + LLVMValueRef three_halfs = const_broadcast_vector_float(p, elem, count, 1.5); + LLVMValueRef unsigned_one_vector = const_broadcast_vector_unsigned(p, t_u64, count, 1); + + LLVMValueRef half_val = LLVMBuildFMul(p->builder, val, half, ""); + + // Initial Guess based on log2(f) + LLVMValueRef magic = const_broadcast_vector_unsigned(p, t_u64, count, 0x5FE6EB50C7B537A9ull); + + // i = (transmute(u64)val >> 1) + LLVMValueRef i = LLVMBuildBitCast(p->builder, val, LLVMTypeOf(magic), ""); + i = LLVMBuildLShr(p->builder, i, unsigned_one_vector, ""); + + // magic - (transmute(u64)val - i) + // what the fuck? + LLVMValueRef guess = LLVMBuildSub(p->builder, magic, i, ""); + + guess = LLVMBuildBitCast(p->builder, guess, LLVMTypeOf(val), ""); + + + // Newton-Raphson Iteration + // guess = guess * (-(half_val * guess) * guess + 1.5) + for (isize i = 0; i < 1; i++) { + LLVMValueRef half_guess = LLVMBuildFMul(p->builder, half_val, guess, ""); + half_guess = LLVMBuildFNeg(p->builder, half_guess, ""); + + LLVMValueRef nma = nullptr; // -(half_val * guess) * guess + 1.5 + { + char const *name = "llvm.fma"; + LLVMTypeRef types[1] = {lb_type(p->module, vt)}; + LLVMValueRef args[3] = { half_guess, guess, three_halfs }; + nma = lb_call_intrinsic(p, name, args, gb_count_of(args), types, gb_count_of(types)); + } + + // guess = guess * nma + guess = LLVMBuildFMul(p->builder, guess, nma, ""); + } + + res.value = guess; + return res; + } else { + + char const *name = "llvm.sqrt"; + LLVMTypeRef types[1] = {lb_type(p->module, vt)}; + LLVMValueRef args[1] = { val }; + res.value = lb_call_intrinsic(p, name, args, gb_count_of(args), types, gb_count_of(types)); + + LLVMValueRef one_vector = const_broadcast_vector_float(p, elem, count, 1.0); + res.value = LLVMBuildFDiv(p->builder, one_vector, res.value, ""); + return res; + } + } + + case BuiltinProc_simd_lanes_reverse: { i64 count = get_array_type_count(arg0.type); From 6e09ce9a0499d554a0001fb407a1ac1959c503c7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 7 Apr 2026 15:25:41 +0100 Subject: [PATCH 265/273] `intrinsics.to_bits_signed`; `simd.signbit` --- base/intrinsics/intrinsics.odin | 5 ++-- core/simd/simd.odin | 18 +++++++++++-- src/check_builtin.cpp | 42 +++++++++++++++++++++-------- src/checker_builtin_procs.hpp | 2 ++ src/llvm_backend_proc.cpp | 1 + src/types.cpp | 47 +++++++++++++++++++++++++++++++++ 6 files changed, 100 insertions(+), 15 deletions(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index 235ba9969..ce3814d37 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -1,4 +1,4 @@ -// This is purely for documentation +7// This is purely for documentation #+build ignore package intrinsics @@ -351,7 +351,8 @@ simd_nearest :: proc(a: #simd[N]any_float) -> #simd[N]any_float --- simd_approx_recip :: proc(x: #simd[N]T) -> #simd[N]T where type_is_float(T)) --- simd_approx_recip_sqrt :: proc(x: #simd[N]T) -> #simd[N]T where type_is_float(T)) --- -simd_to_bits :: proc(v: #simd[N]T) -> #simd[N]Integer where size_of(T) == size_of(Integer), type_is_unsigned(Integer) --- +simd_to_bits :: proc(v: #simd[N]T) -> #simd[N]Integer where size_of(T) == size_of(Integer), type_is_unsigned(Integer) --- +simd_to_bits_signed :: proc(v: #simd[N]T) -> #simd[N]Integer where size_of(T) == size_of(Integer), !type_is_unsigned(Integer) --- // equivalent to a swizzle with descending indices, e.g. reserve(a, 3, 2, 1, 0) simd_lanes_reverse :: proc(a: #simd[N]T) -> #simd[N]T --- diff --git a/core/simd/simd.odin b/core/simd/simd.odin index 7de007c9d..af4b214a8 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -2517,10 +2517,16 @@ Compute the nearest integer of each lane in a SIMD vector. nearest :: intrinsics.simd_nearest /* -Transmute a SIMD vector into an integer vector. +Transmute a SIMD vector into an unsigned integer vector. */ to_bits :: intrinsics.simd_to_bits +/* +Transmute a SIMD vector into a signed integer vector. +*/ +to_bits_signed :: intrinsics.simd_to_bits_signed + + /* Reverse the lanes of a SIMD vector. @@ -2779,6 +2785,15 @@ signum :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where in return select(is_nan, v, copysign(T(1), v)) } +@(require_results) +signbit :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> (res: type_of(intrinsics.simd_to_bits(T{}))) { + BITS :: 8*size_of(E) + val := to_bits(v) + mask := type_of(val)(1<<(BITS-1)) + masked := bit_and(val, mask) + return to_bits(shr(to_bits_signed(masked), BITS-1)) +} + /* Calculate reciprocals of SIMD lanes. @@ -2848,7 +2863,6 @@ iota :: intrinsics.simd_indices sums_of_n :: intrinsics.simd_sums_of_n - @(require_results) saturating_neg :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_integer(E) { return saturating_sub(T(0), v) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index a40a06cd9..bc837c98e 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -887,14 +887,24 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan Operand x = {}; Operand y = {}; check_expr(c, &x, ce->args[0]); if (x.mode == Addressing_Invalid) return false; - check_expr_with_type_hint(c, &y, ce->args[1], x.type); if (y.mode == Addressing_Invalid) return false; - convert_to_typed(c, &y, x.type); if (y.mode == Addressing_Invalid) return false; + check_expr(c, &y, ce->args[1]); if (y.mode == Addressing_Invalid) return false; if (!is_type_simd_vector(x.type)) { error(x.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); return false; } if (!is_type_simd_vector(y.type)) { - error(y.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); + if (is_type_untyped(y.type) || is_type_unsigned(y.type)) { + Type *rhs_type = type_unsigned_equivalent(x.type); + convert_to_typed(c, &y, rhs_type); if (y.mode == Addressing_Invalid) return false; + } else { + convert_to_typed(c, &y, x.type); if (y.mode == Addressing_Invalid) return false; + } + } + + if (!is_type_simd_vector(y.type)) { + gbString s = type_to_string(y.type); + error(y.expr, "'%.*s' expected a simd vector type or unsigned integer, got %s", LIT(builtin_name), s); + gb_string_free(s); return false; } GB_ASSERT(x.type->kind == Type_SimdVector); @@ -1706,15 +1716,25 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan } Type *elem = base_array_type(x.type); i64 count = get_array_type_count(x.type); - i64 sz = type_size_of(elem); - Type *bit_elem = nullptr; - switch (sz) { - case 1: bit_elem = t_u8; break; - case 2: bit_elem = t_u16; break; - case 4: bit_elem = t_u32; break; - case 8: bit_elem = t_u64; break; + Type *bit_elem = type_unsigned_equivalent(elem); + + operand->type = alloc_type_simd_vector(count, bit_elem); + operand->mode = Addressing_Value; + return true; + } + + case BuiltinProc_simd_to_bits_signed: + { + Operand x = {}; + check_expr(c, &x, ce->args[0]); if (x.mode == Addressing_Invalid) return false; + + if (!is_type_simd_vector(x.type)) { + error(x.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); + return false; } - GB_ASSERT(bit_elem != nullptr); + Type *elem = base_array_type(x.type); + i64 count = get_array_type_count(x.type); + Type *bit_elem = type_signed_equivalent(elem); operand->type = alloc_type_simd_vector(count, bit_elem); operand->mode = Addressing_Value; diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index fcabecce3..a96f641ae 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -217,6 +217,7 @@ BuiltinProc__simd_begin, BuiltinProc_simd_approx_recip_sqrt, BuiltinProc_simd_to_bits, + BuiltinProc_simd_to_bits_signed, BuiltinProc_simd_lanes_reverse, BuiltinProc_simd_lanes_rotate_left, @@ -614,6 +615,7 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("simd_approx_recip_sqrt"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_to_bits"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_to_bits_signed"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_lanes_reverse"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_lanes_rotate_left"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 84ef34484..6173df7a5 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2500,6 +2500,7 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn } case BuiltinProc_simd_to_bits: + case BuiltinProc_simd_to_bits_signed: { res.value = LLVMBuildBitCast(p->builder, arg0.value, lb_type(m, tv.type), ""); return res; diff --git a/src/types.cpp b/src/types.cpp index ffd0fc196..543658cea 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -1332,6 +1332,8 @@ gb_internal bool is_type_integer_or_float(Type *t) { return false; } + + gb_internal bool is_type_numeric(Type *t) { t = base_type(t); if (t == nullptr) { return false; } @@ -1709,6 +1711,51 @@ gb_internal bool is_type_simd_vector(Type *t) { return t->kind == Type_SimdVector; } + +gb_internal Type *type_unsigned_equivalent(Type *t) { + Type *original_type = t; + t = base_type(t); + if (is_type_simd_vector(t)) { + if (is_type_unsigned(t->SimdVector.elem)) { + return original_type; + } + return alloc_type_simd_vector(t->SimdVector.count, type_unsigned_equivalent(t->SimdVector.elem)); + } + + i64 sz = type_size_of(t); + switch (sz) { + case 1: return t_u8; + case 2: return t_u16; + case 4: return t_u32; + case 8: return t_u64; + case 16: return t_u128; + } + GB_PANIC("No known equivalent unsigned integer sized for %s", type_to_string(t)); + return nullptr; +} + +gb_internal Type *type_signed_equivalent(Type *t) { + Type *original_type = t; + t = base_type(t); + if (is_type_simd_vector(t)) { + if (!is_type_unsigned(t->SimdVector.elem)) { + return original_type; + } + return alloc_type_simd_vector(t->SimdVector.count, type_signed_equivalent(t->SimdVector.elem)); + } + ; + i64 sz = type_size_of(t); + switch (sz) { + case 1: return t_i8; + case 2: return t_i16; + case 4: return t_i32; + case 8: return t_i64; + case 16: return t_i128; + } + GB_PANIC("No known equivalent signed integer sized for %s", type_to_string(t)); + return nullptr; +} + gb_internal Type *base_array_type(Type *t) { Type *bt = base_type(t); if (is_type_array(bt)) { From 6f7226e6926f550a87570b01ebd3149b9e5a301a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 7 Apr 2026 15:45:50 +0100 Subject: [PATCH 266/273] Add `intrinsics.simd_pairwise_(add|sub)` --- base/intrinsics/intrinsics.odin | 4 ++++ core/simd/simd.odin | 5 ++++- src/check_builtin.cpp | 4 +++- src/checker_builtin_procs.hpp | 6 ++++++ src/llvm_backend_proc.cpp | 35 +++++++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index ce3814d37..5fb04dd1e 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -366,6 +366,10 @@ simd_odd_even :: proc(a, b: #simd[N]T) -> #simd[N]T --- // Returns the sums of N consecutive lanes simd_sums_of_n :: proc(a: #simd[LANES]T, $N: uint) -> #simd[LANES/N]T where is_power_of_two(N) --- +simd_pairwise_add :: proc(a, b: #simd[LANES]T) -> #simd[LANES/N]T --- +simd_pairwise_sub :: proc(a, b: #simd[LANES]T) -> #simd[LANES/N]T --- + + // Checks if the current target supports the given target features. // // Takes a constant comma-seperated string (eg: "sha512,sse4.1"), or a procedure type which has either diff --git a/core/simd/simd.odin b/core/simd/simd.odin index af4b214a8..40a25abc5 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -2786,7 +2786,7 @@ signum :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T where in } @(require_results) -signbit :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> (res: type_of(intrinsics.simd_to_bits(T{}))) { +sign_bit :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> (res: type_of(intrinsics.simd_to_bits(T{}))) { BITS :: 8*size_of(E) val := to_bits(v) mask := type_of(val)(1<<(BITS-1)) @@ -2877,3 +2877,6 @@ saturating_abs :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> T abs_diff :: #force_inline proc "contextless" (a, b: $T/#simd[$LANES]$E) -> T where intrinsics.type_is_integer(E) { return abs(sub(a, b)) } + +pairwise_add :: intrinsics.simd_pairwise_add +pairwise_sub :: intrinsics.simd_pairwise_add diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index bc837c98e..0d185a99f 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -781,6 +781,8 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan case BuiltinProc_simd_div: case BuiltinProc_simd_min: case BuiltinProc_simd_max: + case BuiltinProc_simd_pairwise_add: + case BuiltinProc_simd_pairwise_sub: { Operand x = {}; Operand y = {}; @@ -1537,7 +1539,7 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan check_expr(c, &x, ce->args[0]); if (x.mode == Addressing_Invalid) return false; if (!is_type_simd_vector(x.type)) { - error(x.expr, "'%.*s' expected a simd vector boolean type", LIT(builtin_name)); + error(x.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); return false; } Type *bt = base_type(x.type); diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index a96f641ae..4b9ff809c 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -208,6 +208,9 @@ BuiltinProc__simd_begin, BuiltinProc_simd_sums_of_n, + BuiltinProc_simd_pairwise_add, + BuiltinProc_simd_pairwise_sub, + BuiltinProc_simd_ceil, BuiltinProc_simd_floor, BuiltinProc_simd_trunc, @@ -606,6 +609,9 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("simd_sums_of_n"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_pairwise_add"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_pairwise_sub"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_ceil") , 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_floor"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("simd_trunc"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 6173df7a5..13e2e6485 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2143,6 +2143,41 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn } break; + case BuiltinProc_simd_pairwise_add: + case BuiltinProc_simd_pairwise_sub: + if (is_float) { + switch (builtin_id) { + case BuiltinProc_simd_pairwise_add: op_code = LLVMFAdd; break; + case BuiltinProc_simd_pairwise_sub: op_code = LLVMFSub; break; + } + } else { + switch (builtin_id) { + case BuiltinProc_simd_pairwise_add: op_code = LLVMAdd; break; + case BuiltinProc_simd_pairwise_sub: op_code = LLVMSub; break; + } + } + if (op_code) { + LLVMValueRef a = arg0.value; + LLVMValueRef b = arg1.value; + + unsigned count = LLVMGetVectorSize(LLVMTypeOf(a)); + + LLVMValueRef *evens = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); + LLVMValueRef *odds = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); + LLVMTypeRef llvm_u32 = lb_type(m, t_u32); + for (unsigned i = 0; i < count; i++) { + evens[i] = LLVMConstInt(llvm_u32, 2*i, false); + odds[i] = LLVMConstInt(llvm_u32, 2*i + 1, false); + } + + LLVMValueRef x = LLVMBuildShuffleVector(p->builder, a, b, LLVMConstVector(evens, count), ""); + LLVMValueRef y = LLVMBuildShuffleVector(p->builder, a, b, LLVMConstVector(odds, count), ""); + + res.value = LLVMBuildBinOp(p->builder, op_code, x, y, ""); + return res; + } + break; + case BuiltinProc_simd_ceil: case BuiltinProc_simd_floor: case BuiltinProc_simd_trunc: From c4893f617a9c46d3519422bf8609563294d4f294 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Tue, 7 Apr 2026 11:23:20 -0400 Subject: [PATCH 267/273] Fix typo in filepath.dir description --- core/path/filepath/path.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index e383e756c..5f46414ae 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -245,7 +245,7 @@ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> ( } /* - Returns all but the last element path, usually the path's directory. Once the final element has been removed, + Returns all but the last path element, usually the path's directory. Once the final element has been removed, `dir` calls `clean` on the path and trailing separators are removed. If the path consists purely of separators, then `"."` is returned. */ From 08ae38b9aae2cd0a55ec4dfebc5b4e0b9f165ca4 Mon Sep 17 00:00:00 2001 From: Shane Shrybman Date: Tue, 7 Apr 2026 11:31:33 -0400 Subject: [PATCH 268/273] Fix filepath.dir to return '.' for an empty path --- core/path/filepath/path.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/path/filepath/path.odin b/core/path/filepath/path.odin index 5f46414ae..e9f22772c 100644 --- a/core/path/filepath/path.odin +++ b/core/path/filepath/path.odin @@ -246,11 +246,11 @@ rel :: proc(base_path, target_path: string, allocator := context.allocator) -> ( /* Returns all but the last path element, usually the path's directory. Once the final element has been removed, - `dir` calls `clean` on the path and trailing separators are removed. If the path consists purely of separators, - then `"."` is returned. + `dir` calls `clean` on the path and trailing separators are removed. If the path is empty or consists purely + of separators, then `"."` is returned. */ dir :: proc(path: string, allocator := context.allocator) -> string { - i := len(path) - 1 + i := len(path) > 0 ? len(path) - 1 : 0 for i > 0 && !is_separator(path[i]) { i -= 1 } From e558f9852e48640f5e773c674c758b9ea68cf99c Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 8 Apr 2026 10:17:43 +0200 Subject: [PATCH 269/273] Add comment to `os.exit` --- core/os/process.odin | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/os/process.odin b/core/os/process.odin index 9a720af87..ef3b09fdd 100644 --- a/core/os/process.odin +++ b/core/os/process.odin @@ -38,7 +38,11 @@ delete_args :: proc "contextless" () { } /* -Exit the current process. +Tells the OS to exit the current process directly. + +IMPORTANT: `@(fini)` blocks won't be executed. + +If you want `@(fini)` cleanup to happen, call `runtime._cleanup_runtime` first. */ exit :: proc "contextless" (code: int) -> ! { runtime.exit(code) From 68942ce53d84765954447f3fd1a69397d6d08277 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 8 Apr 2026 10:56:52 +0100 Subject: [PATCH 270/273] Genericize `simd_approx_recip_(sqrt)` to allow for AVX and AVX512 intrinsics if enabled --- src/llvm_backend_proc.cpp | 322 +++++++++++++++++++++----------------- 1 file changed, 179 insertions(+), 143 deletions(-) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 13e2e6485..4bd11b535 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1325,6 +1325,105 @@ gb_internal LLVMValueRef llvm_splat_int(i64 count, LLVMTypeRef type, i64 value, return LLVMConstVector(values, cast(unsigned)count); } +gb_internal bool lb_llvm_simd_bulk_op_unary(lbProcedure *p, lbValue arg, LLVMValueRef *result_, char const *intrinsic_name, unsigned default_width, LLVMValueRef *extra_args=nullptr, unsigned extra_args_count=0) { + if (intrinsic_name == nullptr || default_width == 0) { + return false; + } + + auto do_call_intrinsic = [](lbProcedure *p, char const *intrinsic_name, LLVMValueRef val, LLVMValueRef *extra_args, unsigned extra_args_count) -> LLVMValueRef { + if (extra_args && extra_args_count > 0) { + LLVMValueRef *args = gb_alloc_array(temporary_allocator(), LLVMValueRef, extra_args_count+1); + args[0] = val; + gb_memcopy(args+1, extra_args, gb_size_of(extra_args[0]) * extra_args_count); + + return lb_call_intrinsic(p, intrinsic_name, args, extra_args_count+1, nullptr, 0); + } else { + LLVMValueRef args[1] = {val}; + return lb_call_intrinsic(p, intrinsic_name, args, gb_count_of(args), nullptr, 0); + } + }; + + TEMPORARY_ALLOCATOR_GUARD(); + + Type *vt = base_type(arg.type); + GB_ASSERT(is_type_simd_vector(vt)); + + LLVMValueRef val = arg.value; + unsigned count = cast(unsigned)vt->SimdVector.count; + Type *elem = base_type(vt->SimdVector.elem); + + if (count < default_width) { + LLVMValueRef *grow_indices = gb_alloc_array(temporary_allocator(), LLVMValueRef, default_width); + LLVMValueRef *shrink_indices = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); + + for (unsigned i = 0; i < count; i++) { + ExactValue idx = is_type_float(elem) ? + exact_value_float(cast(f64)i) : + exact_value_u64(i); + shrink_indices[i] = lb_const_value(p->module, elem, idx).value; + grow_indices[i] = shrink_indices[i]; + } + for (unsigned i = count; i < default_width; i++) { + grow_indices[i] = shrink_indices[0]; + } + + LLVMValueRef grow_mask = LLVMConstVector(grow_indices, default_width); + LLVMValueRef shrink_mask = LLVMConstVector(shrink_indices, count); + + val = LLVMBuildShuffleVector(p->builder, val, val, grow_mask, ""); + + val = do_call_intrinsic(p, intrinsic_name, val, extra_args, extra_args_count); + val = LLVMBuildShuffleVector(p->builder, val, val, shrink_mask, ""); + *result_ = val; + return true; + } else if (count == default_width) { + val = do_call_intrinsic(p, intrinsic_name, val, extra_args, extra_args_count); + *result_ = val; + return true; + } else { + GB_ASSERT(count > default_width); + unsigned parts_count = count/default_width; + LLVMValueRef *parts = gb_alloc_array(temporary_allocator(), LLVMValueRef, parts_count); + for (unsigned i = 0; i < parts_count; i++) { + LLVMValueRef *indices = gb_alloc_array(temporary_allocator(), LLVMValueRef, default_width); + for (unsigned i = 0; i < default_width; i++) { + indices[i] = lb_const_value(p->module, t_u32, exact_value_u64(4*i+0)).value; + } + + parts[i] = LLVMBuildShuffleVector(p->builder, val, val, LLVMConstVector(indices, default_width), ""); + } + + for (unsigned i = 0; i < parts_count; i++) { + parts[i] = do_call_intrinsic(p, intrinsic_name, parts[i], extra_args, extra_args_count); + } + + LLVMValueRef *indices = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); + for (unsigned j = 0; j < count; j++) { + indices[j] = lb_const_value(p->module, t_u32, exact_value_i64(j)).value; + } + + u64 sub_parts_remaining = parts_count; + + while (sub_parts_remaining > 1) { + for (unsigned i = 0; i < sub_parts_remaining; i += 2) { + unsigned indices_count = 2*cast(unsigned)(cast(u64)count/sub_parts_remaining); + + parts[i] = LLVMBuildShuffleVector(p->builder, parts[i], parts[i+1], LLVMConstVector(indices, indices_count), ""); + } + + for (u64 i = 2; i < sub_parts_remaining; i += 2) { + parts[i/2] = parts[i]; + } + + + sub_parts_remaining >>= 1; + } + + *result_ = parts[0]; + return true; + } +} + gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv, BuiltinProcId builtin_id) { ast_node(ce, CallExpr, expr); @@ -2208,82 +2307,54 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn i64 count = vt->SimdVector.count; Type *elem = base_type(vt->SimdVector.elem); + char const *intrinsic_name = nullptr; + unsigned default_width = 0; + LLVMValueRef *extra_args = nullptr; + unsigned extra_args_count = 0; + + String features_to_enable = {}; + String min_legal_vector_width = {}; + // TODO(bill): Good optimizations for more than SSE // e.g. AVX, ARM64, etc - if (are_types_identical(elem, t_f32) && (build_context.metrics.arch == TargetArch_i386 || build_context.metrics.arch == TargetArch_amd64)) { - char const *name_x86 = "llvm.x86.sse.rcp.ps"; + if ((build_context.metrics.arch == TargetArch_i386 || build_context.metrics.arch == TargetArch_amd64)) { + if (are_types_identical(elem, t_f32)) { + intrinsic_name = "llvm.x86.sse.rcp.ps"; + default_width = 4; - if (count < 4) { - GB_ASSERT(count == 2); - - LLVMValueRef zero = lb_const_value(p->module, elem, exact_value_float(0)).value; - LLVMValueRef one = lb_const_value(p->module, elem, exact_value_float(1)).value; - - - LLVMValueRef grow_indices[4] = {zero, one, zero, zero}; - LLVMValueRef shrink_indices[2] = {zero, one}; - LLVMValueRef grow_mask = LLVMConstVector(grow_indices, 4); - LLVMValueRef shrink_mask = LLVMConstVector(shrink_indices, 2); - - val = LLVMBuildShuffleVector(p->builder, val, val, grow_mask, ""); - LLVMValueRef args[1] = {val}; - val = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); - val = LLVMBuildShuffleVector(p->builder, val, val, shrink_mask, ""); - res.value = val; - return res; - } else if (count == 4) { - LLVMValueRef args[1] = {val}; - val = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); - res.value = val; - return res; - } else { - GB_ASSERT(count > 4); - i64 parts_count = count/4; - LLVMValueRef *parts = gb_alloc_array(temporary_allocator(), LLVMValueRef, parts_count); - for (i64 i = 0; i < parts_count; i++) { - LLVMValueRef v0 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+0)).value; - LLVMValueRef v1 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+1)).value; - LLVMValueRef v2 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+2)).value; - LLVMValueRef v3 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+3)).value; - - LLVMValueRef indices[4] = {v0, v1, v2, v3}; - - parts[i] = LLVMBuildShuffleVector(p->builder, val, val, LLVMConstVector(indices, 4), ""); - } - - for (i64 i = 0; i < parts_count; i++) { - LLVMValueRef args[1] = {parts[i]}; - parts[i] = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); - } - - LLVMValueRef *indices = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); - - u64 sub_parts_remaining = parts_count; - - while (sub_parts_remaining > 1) { - for (u64 i = 0; i < sub_parts_remaining; i += 2) { - unsigned indices_count = 2*cast(unsigned)(cast(u64)count/sub_parts_remaining); - for (unsigned j = 0; j < indices_count; j++) { - indices[j] = lb_const_value(p->module, t_u32, exact_value_i64(j)).value; - } - - parts[i] = LLVMBuildShuffleVector(p->builder, parts[i], parts[i+1], LLVMConstVector(indices, indices_count), ""); + if (count >= 8) { + if (check_target_feature_is_enabled(str_lit("avx"), nullptr)) { + intrinsic_name = "llvm.x86.avx.rcp.ps.256"; + default_width = 8; } - - for (u64 i = 2; i < sub_parts_remaining; i += 2) { - parts[i/2] = parts[i]; - } - - - sub_parts_remaining >>= 1; } - res.value = parts[0]; - return res; + if (count >= 16) { + if (check_target_feature_is_enabled(str_lit("avx512vl"), nullptr)) { + features_to_enable = str_lit("+avx512f,+evex512"); + min_legal_vector_width = str_lit("512"); + + intrinsic_name = "llvm.x86.avx512.rcp14.ps.512"; + default_width = 16; + + extra_args_count = 2; + extra_args = gb_alloc_array(temporary_allocator(), LLVMValueRef, extra_args_count); + + extra_args[0] = LLVMGetUndef(LLVMVectorType(lb_type(p->module, t_f32), 16)); + extra_args[1] = LLVMConstInt(lb_type(p->module, t_i16), (1u<<16) - 1, true); + } + } } } + if (lb_llvm_simd_bulk_op_unary(p, arg0, &res.value, intrinsic_name, default_width, extra_args, extra_args_count)) { + if (features_to_enable.len > 0) lb_add_attribute_to_proc_with_string(p->module, p->value, str_lit("target-features"), features_to_enable); + if (min_legal_vector_width.len > 0) lb_add_attribute_to_proc_with_string(p->module, p->value, str_lit("min-legal-vector-width"), min_legal_vector_width); + + return res; + } + LLVMValueRef one = lb_const_value(p->module, vt->SimdVector.elem, exact_value_float(1)).value; LLVMValueRef *ones = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); for (i64 i = 0; i < count; i++) { @@ -2298,19 +2369,11 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn { auto const_broadcast_vector_float = [](lbProcedure *p, Type *elem_type, i64 count, f64 elem) -> LLVMValueRef { LLVMValueRef val = lb_const_value(p->module, elem_type, exact_value_float(elem)).value; - LLVMValueRef *vals = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); - for (i64 i = 0; i < count; i++) { - vals[i] = val; - } - return LLVMConstVector(vals, cast(unsigned)count); + return llvm_vector_broadcast(p, val, cast(unsigned)count); }; auto const_broadcast_vector_unsigned = [](lbProcedure *p, Type *elem_type, i64 count, u64 elem) -> LLVMValueRef { LLVMValueRef val = lb_const_value(p->module, elem_type, exact_value_u64(elem)).value; - LLVMValueRef *vals = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); - for (i64 i = 0; i < count; i++) { - vals[i] = val; - } - return LLVMConstVector(vals, cast(unsigned)count); + return llvm_vector_broadcast(p, val, cast(unsigned)count); }; @@ -2320,80 +2383,53 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn LLVMValueRef val = arg0.value; i64 count = vt->SimdVector.count; + char const *intrinsic_name = nullptr; + unsigned default_width = 0; + LLVMValueRef *extra_args = nullptr; + unsigned extra_args_count = 0; + + String features_to_enable = {}; + String min_legal_vector_width = {}; + // TODO(bill): Good optimizations for more than SSE // e.g. AVX, ARM64, etc - if (are_types_identical(elem, t_f32) && (build_context.metrics.arch == TargetArch_i386 || build_context.metrics.arch == TargetArch_amd64)) { - char const *name_x86 = "llvm.x86.sse.rsqrt.ps"; + if ((build_context.metrics.arch == TargetArch_i386 || build_context.metrics.arch == TargetArch_amd64)) { + if (are_types_identical(elem, t_f32)) { + intrinsic_name = "llvm.x86.sse.rsqrt.ps"; + default_width = 4; - if (count < 4) { - GB_ASSERT(count == 2); - - LLVMValueRef zero = lb_const_value(p->module, elem, exact_value_float(0)).value; - LLVMValueRef one = lb_const_value(p->module, elem, exact_value_float(1)).value; - - - LLVMValueRef grow_indices[4] = {zero, one, zero, zero}; - LLVMValueRef shrink_indices[2] = {zero, one}; - LLVMValueRef grow_mask = LLVMConstVector(grow_indices, 4); - LLVMValueRef shrink_mask = LLVMConstVector(shrink_indices, 2); - - val = LLVMBuildShuffleVector(p->builder, val, val, grow_mask, ""); - LLVMValueRef args[1] = {val}; - val = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); - val = LLVMBuildShuffleVector(p->builder, val, val, shrink_mask, ""); - res.value = val; - return res; - } else if (count == 4) { - LLVMValueRef args[1] = {val}; - val = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); - res.value = val; - return res; - } else { - GB_ASSERT(count > 4); - i64 parts_count = count/4; - LLVMValueRef *parts = gb_alloc_array(temporary_allocator(), LLVMValueRef, parts_count); - for (i64 i = 0; i < parts_count; i++) { - LLVMValueRef v0 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+0)).value; - LLVMValueRef v1 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+1)).value; - LLVMValueRef v2 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+2)).value; - LLVMValueRef v3 = lb_const_value(p->module, t_u32, exact_value_i64(4*i+3)).value; - - LLVMValueRef indices[4] = {v0, v1, v2, v3}; - - parts[i] = LLVMBuildShuffleVector(p->builder, val, val, LLVMConstVector(indices, 4), ""); - } - - for (i64 i = 0; i < parts_count; i++) { - LLVMValueRef args[1] = {parts[i]}; - parts[i] = lb_call_intrinsic(p, name_x86, args, gb_count_of(args), nullptr, 0); - } - - LLVMValueRef *indices = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); - - u64 sub_parts_remaining = parts_count; - - while (sub_parts_remaining > 1) { - for (u64 i = 0; i < sub_parts_remaining; i += 2) { - unsigned indices_count = 2*cast(unsigned)(cast(u64)count/sub_parts_remaining); - for (unsigned j = 0; j < indices_count; j++) { - indices[j] = lb_const_value(p->module, t_u32, exact_value_i64(j)).value; - } - - parts[i] = LLVMBuildShuffleVector(p->builder, parts[i], parts[i+1], LLVMConstVector(indices, indices_count), ""); + if (count >= 8) { + if (check_target_feature_is_enabled(str_lit("avx"), nullptr)) { + intrinsic_name = "llvm.x86.avx.rsqrt.ps.256"; + default_width = 8; } - - for (u64 i = 2; i < sub_parts_remaining; i += 2) { - parts[i/2] = parts[i]; - } - - - sub_parts_remaining >>= 1; } + if (count >= 16) { + if (check_target_feature_is_enabled(str_lit("avx512vl"), nullptr)) { + features_to_enable = str_lit("+avx512f,+evex512"); + min_legal_vector_width = str_lit("512"); - res.value = parts[0]; - return res; + intrinsic_name = "llvm.x86.avx512.rsqrt14.ps.512"; + default_width = 16; + + extra_args_count = 2; + extra_args = gb_alloc_array(temporary_allocator(), LLVMValueRef, extra_args_count); + + extra_args[0] = LLVMGetUndef(LLVMVectorType(lb_type(p->module, t_f32), 16)); + extra_args[1] = LLVMConstInt(lb_type(p->module, t_i16), (1u<<16) - 1, true); + } + } } - } else if (are_types_identical(elem, t_f64)) { + } + + if (lb_llvm_simd_bulk_op_unary(p, arg0, &res.value, intrinsic_name, default_width, extra_args, extra_args_count)) { + if (features_to_enable.len > 0) lb_add_attribute_to_proc_with_string(p->module, p->value, str_lit("target-features"), features_to_enable); + if (min_legal_vector_width.len > 0) lb_add_attribute_to_proc_with_string(p->module, p->value, str_lit("min-legal-vector-width"), min_legal_vector_width); + + return res; + } + + if (are_types_identical(elem, t_f64)) { LLVMValueRef half = const_broadcast_vector_float(p, elem, count, 0.5); LLVMValueRef three_halfs = const_broadcast_vector_float(p, elem, count, 1.5); LLVMValueRef unsigned_one_vector = const_broadcast_vector_unsigned(p, t_u64, count, 1); From 56a1a81a38861636379446eeeb7df4fca0b5116d Mon Sep 17 00:00:00 2001 From: Montgomery Date: Wed, 8 Apr 2026 12:49:51 +0100 Subject: [PATCH 271/273] Fix output of filename when outputting docs with the -in-source-order option. --- src/docs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs.cpp b/src/docs.cpp index de7bdafd1..1d8886edb 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -289,7 +289,7 @@ gb_internal void print_doc_package(CheckerInfo *info, AstPackage *pkg) { } curr_file = e->file; String filename = remove_directory_from_path(curr_file->fullpath); - print_doc_line(1, "file: %s", filename); + print_doc_line(1, "file: %.*s", LIT(filename)); } } else { if (curr_entity_kind != e->kind) { From 2414f428a587ddd26c25a9401871ee1b5da71f83 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 8 Apr 2026 15:37:46 +0100 Subject: [PATCH 272/273] Add `core:simd/x86/avx.odin` --- core/simd/x86/avx.odin | 1852 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1852 insertions(+) create mode 100644 core/simd/x86/avx.odin diff --git a/core/simd/x86/avx.odin b/core/simd/x86/avx.odin new file mode 100644 index 000000000..c274f4903 --- /dev/null +++ b/core/simd/x86/avx.odin @@ -0,0 +1,1852 @@ +#+build i386, amd64 +package simd_x86 + +import "base:intrinsics" + +// Adds packed double-precision (64-bit) floating-point elements in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_add_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + return intrinsics.simd_add(a, b) +} + +// Adds packed single-precision (32-bit) floating-point elements in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_add_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + return intrinsics.simd_add(a, b) +} + +// Computes the bitwise AND of a packed double-precision (64-bit) floating-point elements in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_and_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + a := transmute(#simd[4]u64)a + b := transmute(#simd[4]u64)b + return transmute(__m256d)intrinsics.simd_bit_and(a, b) +} + +// Computes the bitwise AND of packed single-precision (32-bit) floating-point elements in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_and_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + a := transmute(#simd[8]u32)a + b := transmute(#simd[8]u32)b + return transmute(__m256)intrinsics.simd_bit_and(a, b) +} + +// Computes the bitwise OR packed double-precision (64-bit) floating-point elements in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_or_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + a := transmute(#simd[4]u64)a + b := transmute(#simd[4]u64)b + return transmute(__m256d)intrinsics.simd_bit_or(a, b) +} + +// Computes the bitwise OR packed single-precision (32-bit) floating-point elements in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_or_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + a := transmute(#simd[8]u32)a + b := transmute(#simd[8]u32)b + return transmute(__m256)intrinsics.simd_bit_or(a, b) +} + +// Shuffles double-precision (64-bit) floating-point elements within 128-bit lanes using the control in `imm8`. +@(require_results, enable_target_feature="avx") +_mm256_shuffle_pd :: #force_inline proc "c" (a, b: __m256d, $MASK: u8) -> __m256d { + return intrinsics.simd_shuffle( + a, + b, + MASK & 1, + ((MASK >> 1) & 1) + 4, + ((MASK >> 2) & 1) + 2, + ((MASK >> 3) & 1) + 6, + ) +} + + +// Shuffles single-precision (32-bit) floating-point elements in `a` within 128-bit lanes using the control in `imm8`. +@(require_results, enable_target_feature="avx") +_mm256_shuffle_ps :: #force_inline proc "c" (a, b: __m256, $MASK: u8) -> __m256 { + return intrinsics.simd_shuffle( + a, + b, + MASK & 0b11, + (MASK >> 2) & 0b11, + ((MASK >> 4) & 0b11) + 8, + ((MASK >> 6) & 0b11) + 8, + (MASK & 0b11) + 4, + ((MASK >> 2) & 0b11) + 4, + ((MASK >> 4) & 0b11) + 12, + ((MASK >> 6) & 0b11) + 12, + ) +} + + + +// Computes the bitwise NOT of packed double-precision (64-bit) floating-point elements in `a`, and then AND with `b`. +@(require_results, enable_target_feature="avx") +_mm256_andnot_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + a := transmute(#simd[4]u64)a + b := transmute(#simd[4]u64)b + return transmute(__m256d)intrinsics.simd_bit_and(intrinsics.simd_bit_xor((#simd[4]u64)(0), a), b) +} + +// Computes the bitwise NOT of packed single-precision (32-bit) floating-point elements in `a` and then AND with `b`. +@(require_results, enable_target_feature="avx") +_mm256_andnot_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + a := transmute(#simd[8]u32)a + b := transmute(#simd[8]u32)b + return transmute(__m256)intrinsics.simd_bit_and(intrinsics.simd_bit_xor((#simd[8]u32)(0), a), b) +} + + + +// Compares packed double-precision (64-bit) floating-point elements in `a` and `b`, and returns packed maximum values +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_max_pd) +@(require_results, enable_target_feature="avx") +_mm256_max_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + return llvm_vmaxpd(a, b) +} + +// Compares packed single-precision (32-bit) floating-point elements in `a` and `b`, and returns packed maximum values +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_max_ps) +@(require_results, enable_target_feature="avx") +_mm256_max_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + return llvm_vmaxps(a, b) +} + +// Compares packed double-precision (64-bit) floating-point elements in `a` and `b`, and returns packed minimum values +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_min_pd) +@(require_results, enable_target_feature="avx") +_mm256_min_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + return llvm_vminpd(a, b) +} + +// Compares packed single-precision (32-bit) floating-point elements in `a` and `b`, and returns packed minimum values +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_min_ps) +@(require_results, enable_target_feature="avx") +_mm256_min_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + return llvm_vminps(a, b) +} + + + +// Multiplies packed double-precision (64-bit) floating-point elements in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_mul_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + return intrinsics.simd_mul(a, b) +} + +// Multiplies packed single-precision (32-bit) floating-point elements in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_mul_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + return intrinsics.simd_mul(a, b) +} + +// Alternatively adds and subtracts packed double-precision (64-bit) floating-point elements in `a` to/from packed elements in `b`. +@(require_results, enable_target_feature="avx") +_mm256_addsub_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + add := intrinsics.simd_add(a, b) + sub := intrinsics.simd_sub(a, b) + return intrinsics.simd_shuffle(add, sub, 4, 1, 6, 3) +} + + +// Alternatively adds and subtracts packed single-precision (32-bit) floating-point elements in `a` to/from packed elements in `b`. +@(require_results, enable_target_feature="avx") +_mm256_addsub_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + add := intrinsics.simd_add(a, b) + sub := intrinsics.simd_sub(a, b) + return intrinsics.simd_shuffle(add, sub, 8, 1, 10, 3, 12, 5, 14, 7) +} + + +// Subtracts packed double-precision (64-bit) floating-point elements in `b` +// from packed elements in `a`. +@(require_results, enable_target_feature="avx") +_mm256_sub_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + return intrinsics.simd_sub(a, b) +} + +// Subtracts packed single-precision (32-bit) floating-point elements in `b` +// from packed elements in `a`. +@(require_results, enable_target_feature="avx") +_mm256_sub_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + return intrinsics.simd_sub(a, b) +} + +// Computes the division of each of the 8 packed 32-bit floating-point elements +// in `a` by the corresponding packed elements in `b`. +@(require_results, enable_target_feature="avx") +_mm256_div_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + return intrinsics.simd_div(a, b) +} + +// Computes the division of each of the 4 packed 64-bit floating-point elements +// in `a` by the corresponding packed elements in `b`. +@(require_results, enable_target_feature="avx") +_mm256_div_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + return intrinsics.simd_div(a, b) +} + + + +// Rounds packed double-precision (64-bit) floating point elements in `a` +// according to the flag `ROUNDING`. The value of `ROUNDING` may be as follows: +// +// - `0x00`: Round to the nearest whole number. +// - `0x01`: Round down, toward negative infinity. +// - `0x02`: Round up, toward positive infinity. +// - `0x03`: Truncate the values. +// +// For a complete list of options, check [the LLVM docs][llvm_docs]. +// +// [llvm_docs]: https://github.com/llvm-mirror/clang/blob/dcd8d797b20291f1a6b3e0ddda085aa2bbb382a8/lib/Headers/avxintrin.h#L382 +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_round_pd) +@(require_results, enable_target_feature="avx") +_mm256_round_pd :: #force_inline proc "c" (a: __m256d, $ROUNDING: u8) -> __m256d where ROUNDING < 16 { + return llvm_roundpd256(a, ROUNDING) +} + +// Rounds packed double-precision (64-bit) floating point elements in `a` +// toward positive infinity. +@(require_results, enable_target_feature="avx") +_mm256_ceil_pd :: #force_inline proc "c" (a: __m256d) -> __m256d { + return intrinsics.simd_ceil(a) +} + +// Rounds packed double-precision (64-bit) floating point elements in `a` +// toward negative infinity. +@(require_results, enable_target_feature="avx") +_mm256_floor_pd :: #force_inline proc "c" (a: __m256d) -> __m256d { + return intrinsics.simd_floor(a) +} + + + +// Rounds packed single-precision (32-bit) floating point elements in `a` +// according to the flag `ROUNDING`. The value of `ROUNDING` may be as follows: +// +// - `0x00`: Round to the nearest whole number. +// - `0x01`: Round down, toward negative infinity. +// - `0x02`: Round up, toward positive infinity. +// - `0x03`: Truncate the values. +// +// For a complete list of options, check [the LLVM docs][llvm_docs]. +// +// [llvm_docs]: https://github.com/llvm-mirror/clang/blob/dcd8d797b20291f1a6b3e0ddda085aa2bbb382a8/lib/Headers/avxintrin.h#L382 +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_round_ps) +@(require_results, enable_target_feature="avx") +_mm256_round_ps :: #force_inline proc(a: __m256, $ROUNDING: u8) -> __m256 where ROUNDING < 16 { + return llvm_roundps256(a, u32(ROUNDING)) +} + +// Rounds packed single-precision (32-bit) floating point elements in `a` +// toward positive infinity. +@(require_results, enable_target_feature="avx") +_mm256_ceil_ps :: #force_inline proc "c" (a: __m256) -> __m256 { + return intrinsics.simd_ceil(a) +} + +// Rounds packed single-precision (32-bit) floating point elements in `a` +// toward negative infinity. +@(require_results, enable_target_feature="avx") +_mm256_floor_ps :: #force_inline proc "c" (a: __m256) -> __m256 { + return intrinsics.simd_floor(a) +} + +// Returns the square root of packed single-precision (32-bit) floating point elements in `a`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_sqrt_ps) +@(require_results, enable_target_feature="avx") +_mm256_sqrt_ps :: #force_inline proc "c" (a: __m256) -> __m256 { + return intrinsics.sqrt(a) +} + +// Returns the square root of packed double-precision (64-bit) floating point elements in `a`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_sqrt_pd) +@(require_results, enable_target_feature="avx") +_mm256_sqrt_pd :: #force_inline proc "c" (a: __m256d) -> __m256d { + return intrinsics.sqrt(a) +} + + + +// Blends packed double-precision (64-bit) floating-point elements from +// `a` and `b` using control mask `imm8`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_blend_pd) +@(require_results, enable_target_feature="avx") +_mm256_blend_pd :: #force_inline proc "c" (a, b: __m256d, $IIM4: u32) -> __m256d where IMM4 < 16 { + return intrinsics.simd_shuffle( + a, + b, + ((IMM4 >> 0) & 1) * 4 + 0, + ((IMM4 >> 1) & 1) * 4 + 1, + ((IMM4 >> 2) & 1) * 4 + 2, + ((IMM4 >> 3) & 1) * 4 + 3, + ) +} + +// Blends packed single-precision (32-bit) floating-point elements from +// `a` and `b` using control mask `imm8`. +@(require_results, enable_target_feature="avx") +_mm256_blend_ps :: #force_inline proc "c" (a, b: __m256, $IMM8: u8) -> __m256 { + return intrinsics.simd_shuffle( + a, + b, + ((IMM8 >> 0) & 1) * 8 + 0, + ((IMM8 >> 1) & 1) * 8 + 1, + ((IMM8 >> 2) & 1) * 8 + 2, + ((IMM8 >> 3) & 1) * 8 + 3, + ((IMM8 >> 4) & 1) * 8 + 4, + ((IMM8 >> 5) & 1) * 8 + 5, + ((IMM8 >> 6) & 1) * 8 + 6, + ((IMM8 >> 7) & 1) * 8 + 7, + ) +} + + + +// Blends packed double-precision (64-bit) floating-point elements from +// `a` and `b` using `c` as a mask. +@(require_results, enable_target_feature="avx") +_mm256_blendv_pd :: #force_inline proc "c" (a, b: __m256d, c: __m256d) -> __m256d { + mask := intrinsics.simd_lanes_lt(transmute(#simd[4]i64)c, 0) + return intrinsics.simd_select(mask, b, a) +} + +// Blends packed single-precision (32-bit) floating-point elements from +// `a` and `b` using `c` as a mask. +@(require_results, enable_target_feature="avx") +_mm256_blendv_ps :: #force_inline proc "c" (a, b: __m256, c: __m256) -> __m256 { + mask := intrinsics.simd_lanes_lt(transmute(#simd[8]i32)c, 0) + return intrinsics.simd_select(mask, b, a) +} + + + +// Conditionally multiplies the packed single-precision (32-bit) floating-point elements in `a` and `b` using the high 4 bits in `imm8`, +// sum the four products, and conditionally return the sum +// using the low 4 bits of `imm8`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_dp_ps) +@(require_results, enable_target_feature="avx") +_mm256_dp_ps :: #force_inline proc "c" (a, b: __m256, $IMM8: i8) -> __m256 { + return llvm_vdpps(a, b, IMM8) +} + +// Horizontal addition of adjacent pairs in the two packed vectors +// of 4 64-bit floating points `a` and `b`. +// In the result, sums of elements from `a` are returned in even locations, +// while sums of elements from `b` are returned in odd locations. +@(require_results, enable_target_feature="avx") +_mm256_hadd_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + even := intrinsics.simd_shuffle(a, b, 0, 4, 2, 6) + odd := intrinsics.simd_shuffle(a, b, 1, 5, 3, 7) + return intrinsics.simd_add(even, odd) +} + + + +// Horizontal addition of adjacent pairs in the two packed vectors +// of 8 32-bit floating points `a` and `b`. +// In the result, sums of elements from `a` are returned in locations of +// indices 0, 1, 4, 5; while sums of elements from `b` are locations +// 2, 3, 6, 7. +@(require_results, enable_target_feature="avx") +_mm256_hadd_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + even := intrinsics.simd_shuffle(a, b, 0, 2, 8, 10, 4, 6, 12, 14) + odd := intrinsics.simd_shuffle(a, b, 1, 3, 9, 11, 5, 7, 13, 15) + return intrinsics.simd_add(even, odd) +} + +// Horizontal subtraction of adjacent pairs in the two packed vectors +// of 4 64-bit floating points `a` and `b`. +// In the result, sums of elements from `a` are returned in even locations, +// while sums of elements from `b` are returned in odd locations. +@(require_results, enable_target_feature="avx") +_mm256_hsub_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + even := intrinsics.simd_shuffle(a, b, 0, 4, 2, 6) + odd := intrinsics.simd_shuffle(a, b, 1, 5, 3, 7) + return intrinsics.simd_sub(even, odd) +} + +// Horizontal subtraction of adjacent pairs in the two packed vectors +// of 8 32-bit floating points `a` and `b`. +// In the result, sums of elements from `a` are returned in locations of +// indices 0, 1, 4, 5; while sums of elements from `b` are locations +// 2, 3, 6, 7. +@(require_results, enable_target_feature="avx") +_mm256_hsub_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + even := intrinsics.simd_shuffle(a, b, 0, 2, 8, 10, 4, 6, 12, 14) + odd := intrinsics.simd_shuffle(a, b, 1, 3, 9, 11, 5, 7, 13, 15) + return intrinsics.simd_sub(even, odd) +} + +// Computes the bitwise XOR of packed double-precision (64-bit) floating-point elements in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_xor_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + a := transmute(#simd[4]u64)a + b := transmute(#simd[4]u64)b + return transmute(__m256d)intrinsics.simd_bit_xor(a, b) +} + +// Computes the bitwise XOR of packed single-precision (32-bit) floating-point elements in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_xor_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + a := transmute(#simd[8]u32)a + b := transmute(#simd[8]u32)b + return transmute(__m256)intrinsics.simd_bit_xor(a, b) +} + + + +_CMP_EQ_OQ :: 0x00 // Equal (ordered, non-signaling) +_CMP_LT_OS :: 0x01 // Less-than (ordered, signaling) +_CMP_LE_OS :: 0x02 // Less-than-or-equal (ordered, signaling) +_CMP_UNORD_Q :: 0x03 // Unordered (non-signaling) +_CMP_NEQ_UQ :: 0x04 // Not-equal (unordered, non-signaling) +_CMP_NLT_US :: 0x05 // Not-less-than (unordered, signaling) +_CMP_NLE_US :: 0x06 // Not-less-than-or-equal (unordered, signaling) +_CMP_ORD_Q :: 0x07 // Ordered (non-signaling) +_CMP_EQ_UQ :: 0x08 // Equal (unordered, non-signaling) +_CMP_NGE_US :: 0x09 // Not-greater-than-or-equal (unordered, signaling) +_CMP_NGT_US :: 0x0a // Not-greater-than (unordered, signaling) +_CMP_FALSE_OQ :: 0x0b // False (ordered, non-signaling) +_CMP_NEQ_OQ :: 0x0c // Not-equal (ordered, non-signaling) +_CMP_GE_OS :: 0x0d // Greater-than-or-equal (ordered, signaling) +_CMP_GT_OS :: 0x0e // Greater-than (ordered, signaling) +_CMP_TRUE_UQ :: 0x0f // True (unordered, non-signaling) +_CMP_EQ_OS :: 0x10 // Equal (ordered, signaling) +_CMP_LT_OQ :: 0x11 // Less-than (ordered, non-signaling) +_CMP_LE_OQ :: 0x12 // Less-than-or-equal (ordered, non-signaling) +_CMP_UNORD_S :: 0x13 // Unordered (signaling) +_CMP_NEQ_US :: 0x14 // Not-equal (unordered, signaling) +_CMP_NLT_UQ :: 0x15 // Not-less-than (unordered, non-signaling) +_CMP_NLE_UQ :: 0x16 // Not-less-than-or-equal (unordered, non-signaling) +_CMP_ORD_S :: 0x17 // Ordered (signaling) +_CMP_EQ_US :: 0x18 // Equal (unordered, signaling) +_CMP_NGE_UQ :: 0x19 // Not-greater-than-or-equal (unordered, non-signaling) +_CMP_NGT_UQ :: 0x1a // Not-greater-than (unordered, non-signaling) +_CMP_FALSE_OS :: 0x1b // False (ordered, signaling) +_CMP_NEQ_OS :: 0x1c // Not-equal (ordered, signaling) +_CMP_GE_OQ :: 0x1d // Greater-than-or-equal (ordered, non-signaling) +_CMP_GT_OQ :: 0x1e // Greater-than (ordered, non-signaling) +_CMP_TRUE_US :: 0x1f // True (unordered, signaling) + + + +// Compares packed double-precision (64-bit) floating-point elements in `a` and `b` based on the comparison operand specified by `IMM5`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmp_pd) +@(require_results, enable_target_feature="avx") +_mm_cmp_pd :: #force_inline proc "c" (a, b: __m128d, $IMM5: u8) -> __m128d where IMM5 < 32 { + return llvm_vcmppd(a, b, IMM5) +} + +// Compares packed double-precision (64-bit) floating-point elements in `a` and `b` based on the comparison operand specified by `IMM5`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_cmp_pd) +@(require_results, enable_target_feature="avx") +_mm256_cmp_pd :: #force_inline proc "c" (a, b: __m256d, $IMM5: u8) -> __m256d where IMM5 < 32 { + return llvm_vcmppd256(a, b, IMM5) +} + +// Compares packed single-precision (32-bit) floating-point elements in `a` and `b` based on the comparison operand specified by `IMM5`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmp_ps) +@(require_results, enable_target_feature="avx") +_mm_cmp_ps :: #force_inline proc "c" (a: __m128, b: __m128, $IMM5: u8) -> __m128 where IMM5 < 32 { + return llvm_vcmpps(a, b, IMM5) +} + +// Compares packed single-precision (32-bit) floating-point elements in `a` and `b` based on the comparison operand specified by `IMM5`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_cmp_ps) +@(require_results, enable_target_feature="avx") +_mm256_cmp_ps :: #force_inline proc "c" (a, b: __m256, $IMM5: u8) -> __m256 where IMM5 < 32 { + return llvm_vcmpps256(a, b, IMM5) +} + +// Compares the lower double-precision (64-bit) floating-point element in +// `a` and `b` based on the comparison operand specified by `IMM5`, +// store the result in the lower element of returned vector, +// and copies the upper element from `a` to the upper element of returned +// vector. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmp_sd) +@(require_results, enable_target_feature="avx") +_mm_cmp_sd :: #force_inline proc "c" (a, b: __m128d, $IMM5: u8) -> __m128d where IMM5 < 32 { + return llvm_vcmpsd(a, b, IMM5) +} + +// Compares the lower single-precision (32-bit) floating-point element in +// `a` and `b` based on the comparison operand specified by `IMM5`, +// store the result in the lower element of returned vector, +// and copies the upper 3 packed elements from `a` to the upper elements of +// returned vector. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmp_ss) +@(require_results, enable_target_feature="avx") +_mm_cmp_ss :: #force_inline proc "c" (a: __m128, b: __m128, $IMM5: u8) -> __m128 where IMM5 < 32 { + return llvm_vcmpss(a, b, IMM5) +} + +// Converts packed 32-bit integers in `a` to packed double-precision (64-bit) floating-point elements. +@(require_results, enable_target_feature="avx") +_mm256_cvtepi32_pd :: #force_inline proc "c" (a: __m128i) -> __m256d { + return __m256d(transmute(#simd[4]i32)a) +} + +// Converts packed 32-bit integers in `a` to packed single-precision (32-bit) floating-point elements. +@(require_results, enable_target_feature="avx") +_mm256_cvtepi32_ps :: #force_inline proc "c" (a: __m256i) -> __m256 { + return __m256(transmute(#simd[8]i32)a) +} + +// Converts packed double-precision (64-bit) floating-point elements in `a` to packed single-precision (32-bit) floating-point elements. +@(require_results, enable_target_feature="avx") +_mm256_cvtpd_ps :: #force_inline proc "c" (a: __m256d) -> __m128 { + return __m128(a) +} + +// Converts packed single-precision (32-bit) floating-point elements in `a` to packed 32-bit integers. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_cvtps_epi32) +@(require_results, enable_target_feature="avx") +_mm256_cvtps_epi32 :: #force_inline proc "c" (a: __m256) -> __m256i { + return transmute(__m256i)llvm_vcvtps2dq(a) +} + +// Converts packed single-precision (32-bit) floating-point elements in `a` to packed double-precision (64-bit) floating-point elements. +@(require_results, enable_target_feature="avx") +_mm256_cvtps_pd :: #force_inline proc "c" (a: __m128) -> __m256d { + return __m256d(a) +} + +// Returns the first element of the input vector of `[4 x double]`. +@(require_results, enable_target_feature="avx") +_mm256_cvtsd_f64 :: #force_inline proc "c" (a: __m256d) -> f64 { + return intrinsics.simd_extract(a, 0) +} + +// Converts packed double-precision (64-bit) floating-point elements in `a` to packed 32-bit integers with truncation. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_cvttpd_epi32) +@(require_results, enable_target_feature="avx") +_mm256_cvttpd_epi32 :: #force_inline proc "c" (a: __m256d) -> __m128i { + return transmute(__m128i)llvm_vcvttpd2dq(a) +} + +// Converts packed double-precision (64-bit) floating-point elements in `a` to packed 32-bit integers. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_cvtpd_epi32) +@(require_results, enable_target_feature="avx") +_mm256_cvtpd_epi32 :: #force_inline proc "c" (a: __m256d) -> __m128i { + return transmute(__m128i)llvm_vcvtpd2dq(a) +} + +// Converts packed single-precision (32-bit) floating-point elements in `a` to packed 32-bit integers with truncation. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_cvttps_epi32) +@(require_results, enable_target_feature="avx") +_mm256_cvttps_epi32 :: #force_inline proc "c" (a: __m256) -> __m256i { + return transmute(__m256i)llvm_vcvttps2dq(a) +} + + + +// Extracts 128 bits (composed of 4 packed single-precision (32-bit) floating-point elements) from `a`, selected with `imm8`. +@(require_results, enable_target_feature="avx") +_mm256_extractf128_ps :: #force_inline proc "c" (a: __m256, $IMM1: u8) -> __m128 where IMM1 < 2 { + when IMM1 == 0 { + return intrinsics.simd_shuffle(a, _mm256_undefined_ps(), 0, 1, 2, 3) + } else { + return intrinsics.simd_shuffle(a, _mm256_undefined_ps(), 4, 5, 6, 7) + } +} + +// Extracts 128 bits (composed of 2 packed double-precision (64-bit) floating-point elements) from `a`, selected with `imm8`. +@(require_results, enable_target_feature="avx") +_mm256_extractf128_pd :: #force_inline proc "c" (a: __m256d, $IMM1: u8) -> __m128d where IMM1 < 2 { + when IMM1 == 0 { + return intrinsics.simd_shuffle(a, _mm256_undefined_pd(), 0, 1) + } else { + return intrinsics.simd_shuffle(a, _mm256_undefined_pd(), 2, 3) + } +} + +// Extracts 128 bits (composed of integer data) from `a`, selected with `imm8`. +@(require_results, enable_target_feature="avx") +_mm256_extractf128_si256 :: #force_inline proc "c" (a: __m256i, $IMM1: u8) -> __m128i where IMM1 < 2 { + when IMM1 == 0 { + dst := intrinsics.simd_shuffle(transmute(#simd[4]i64)a, (#simd[4]i64)(0), 0, 1) + return transmute(__m128i)dst + } else { + dst := intrinsics.simd_shuffle(transmute(#simd[4]i64)a, (#simd[4]i64)(0), 2, 3) + return transmute(__m128i)dst + } +} + +// Extracts a 32-bit integer from `a`, selected with `INDEX`. +@(require_results, enable_target_feature="avx") +_mm256_extract_epi32 :: #force_inline proc "c" (a: __m256i, $INDEX: u8) -> i32 where INDEX < 8 { + return intrinsics.simd_extract(transmute(#simd[8]i32)a, INDEX) +} + +@(require_results, enable_target_feature="avx") +_mm256_cvtsi256_si32 :: #force_inline proc "c" (a: __m256i) -> i32 { + return intrinsics.simd_extract(transmute(#simd[8]i32)a, 0) +} + +// Zeroes the contents of all XMM or YMM registers. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_zeroall) +@(enable_target_feature="avx") +_mm256_zeroall :: #force_inline proc "c" () { + llvm_vzeroall() +} + +// Zeroes the upper 128 bits of all YMM registers; the lower 128-bits of the registers are unmodified. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_zeroupper) +@(enable_target_feature="avx") +_mm256_zeroupper :: #force_inline proc "c" () { + llvm_vzeroupper() +} + +// Shuffles single-precision (32-bit) floating-point elements in `a` within 128-bit lanes using the control in `b`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_permutevar_ps) +@(require_results, enable_target_feature="avx") +_mm256_permutevar_ps :: #force_inline proc "c" (a: __m256, b: __m256i) -> __m256 { + return llvm_vpermilps256(a, transmute(#simd[8]i32)b) +} + +// Shuffles single-precision (32-bit) floating-point elements in `a` using the control in `b`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_permutevar_ps) +@(require_results, enable_target_feature="avx") +_mm_permutevar_ps :: #force_inline proc "c" (a: __m128, b: __m128i) -> __m128 { + return llvm_vpermilps(a, transmute(#simd[4]i32)b) +} + +// Shuffles single-precision (32-bit) floating-point elements in `a` within 128-bit lanes using the control in `imm8`. +@(require_results, enable_target_feature="avx") +_mm256_permute_ps :: #force_inline proc "c" (a: __m256, $IMM8: u8) -> __m256 { + return intrinsics.simd_shuffle( + a, + _mm256_undefined_ps(), + (IMM8 >> 0) & 0b11, + (IMM8 >> 2) & 0b11, + (IMM8 >> 4) & 0b11, + (IMM8 >> 6) & 0b11, + ((IMM8 >> 0) & 0b11) + 4, + ((IMM8 >> 2) & 0b11) + 4, + ((IMM8 >> 4) & 0b11) + 4, + ((IMM8 >> 6) & 0b11) + 4, + ) +} + +// Shuffles single-precision (32-bit) floating-point elements in `a` using the control in `imm8`. +@(require_results, enable_target_feature="avx") +_mm_permute_ps :: #force_inline proc "c" (a: __m128, $IMM8: u8) -> __m128 { + return intrinsics.simd_shuffle( + a, + _mm_undefined_ps(), + (IMM8 >> 0) & 0b11, + (IMM8 >> 2) & 0b11, + (IMM8 >> 4) & 0b11, + (IMM8 >> 6) & 0b11, + ) +} + +// Shuffles double-precision (64-bit) floating-point elements in `a` within 256-bit lanes using the control in `b`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_permutevar_pd) +@(require_results, enable_target_feature="avx") +_mm256_permutevar_pd :: #force_inline proc "c" (a: __m256d, b: __m256i) -> __m256d { + return llvm_vpermilpd256(a, b) +} + +// Shuffles double-precision (64-bit) floating-point elements in `a` using the control in `b`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_permutevar_pd) +@(require_results, enable_target_feature="avx") +_mm_permutevar_pd :: #force_inline proc "c" (a: __m128d, b: __m128i) -> __m128d { + return llvm_vpermilpd(a, b) +} + +// Shuffles double-precision (64-bit) floating-point elements in `a` within 128-bit lanes using the control in `imm8`. +@(require_results, enable_target_feature="avx") +_mm256_permute_pd :: #force_inline proc "c" (a: __m256d, $IMM4: u8) -> __m256d where IMM4 < 16 { + return intrinsics.simd_shuffle( + a, + _mm256_undefined_pd(), + ((IMM4 >> 0) & 1), + ((IMM4 >> 1) & 1), + ((IMM4 >> 2) & 1) + 2, + ((IMM4 >> 3) & 1) + 2, + ) +} + +// Shuffles double-precision (64-bit) floating-point elements in `a` using the control in `imm8`. +@(require_results, enable_target_feature="avx") +_mm_permute_pd :: #force_inline proc "c" (a: __m128d, $IMM2: u8) -> __m128d where IMM2 < 4 { + return intrinsics.simd_shuffle( + a, + _mm_undefined_pd(), + (IMM2) & 1, + (IMM2 >> 1) & 1, + ) +} + + + +// Shuffles 256 bits (composed of 8 packed single-precision (32-bit) floating-point elements) selected by `imm8` from `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_permute2f128_ps :: #force_inline proc "c" (a, b: __m256, $IMM8: u8) -> __m256 { + return _mm256_castsi256_ps(_mm256_permute2f128_si256( + _mm256_castps_si256(a), + _mm256_castps_si256(b), + IMM8, + )) +} + +// Shuffles 256 bits (composed of 4 packed double-precision (64-bit) floating-point elements) selected by `imm8` from `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_permute2f128_pd :: #force_inline proc "c" (a, b: __m256d, $IMM8: u8) -> __m256d { + _mm256_castsi256_pd(_mm256_permute2f128_si256( + _mm256_castpd_si256(a), + _mm256_castpd_si256(b), + IMM8, + )) +} + +// Shuffles 128-bits (composed of integer data) selected by `imm8` from `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_permute2f128_si256 :: #force_inline proc "c" (a, b: __m256i, $IMM8: u8) -> __m256i { + r := intrinsics.simd_shuffle( + a, + b, + 2 * ((IMM8 & 0xf) & 0b11) + 0, + 2 * ((IMM8 & 0xf) & 0b11) + 1, + + 2 * (((IMM8 & 0xf0) >> 4) & 0b11) + 0, + 2 * (((IMM8 & 0xf0) >> 4) & 0b11) + 1, + ) + return intrinsics.simd_shuffle( + r, + __m256i(0), + + 4 if ((IMM8 & 0xf) & 0b1000) != 0 else 0, + 4 if ((IMM8 & 0xf) & 0b1000) != 0 else 1, + + 4 if (((IMM8 & 0xf0)>>4) & 0b1000) != 0 else 2, + 4 if (((IMM8 & 0xf0)>>4) & 0b1000) != 0 else 3, + ) +} + +// Broadcasts a single-precision (32-bit) floating-point element from memory to all elements of the returned vector. +@(require_results, enable_target_feature="avx") +_mm256_broadcast_ss :: #force_inline proc "c" (f: ^f32) -> __m256 { + return _mm256_set1_ps(f^) +} + +// Broadcasts a single-precision (32-bit) floating-point element from memory to all elements of the returned vector. +@(require_results, enable_target_feature="sse,avx") +_mm_broadcast_ss :: #force_inline proc "c" (f: ^f32) -> __m128 { + return _mm_set1_ps(f^) +} + +// Broadcasts a double-precision (64-bit) floating-point element from memory to all elements of the returned vector. +@(require_results, enable_target_feature="avx") +_mm256_broadcast_sd :: #force_inline proc "c" (f: ^f64) -> __m256d { + return _mm256_set1_pd(f^) +} + +// Broadcasts 128 bits from memory (composed of 4 packed single-precision (32-bit) floating-point elements) to all elements of the returned vector. +@(require_results, enable_target_feature="sse,avx") +_mm256_broadcast_ps :: #force_inline proc "c" (a: ^__m128) -> __m256 { + return intrinsics.simd_shuffle(a^, _mm_setzero_ps(), 0, 1, 2, 3, 0, 1, 2, 3) +} + +// Broadcasts 128 bits from memory (composed of 2 packed double-precision (64-bit) floating-point elements) to all elements of the returned vector. +@(require_results, enable_target_feature="sse2,avx") +_mm256_broadcast_pd :: #force_inline proc "c" (a: ^__m128d) -> __m256d { + return intrinsics.simd_shuffle(a^, _mm_setzero_pd(), 0, 1, 0, 1) +} + +// Copies `a` to result, then inserts 128 bits (composed of 4 packed +// single-precision (32-bit) floating-point elements) from `b` into result +// at the location specified by `imm8`. +@(require_results, enable_target_feature="sse,avx") +_mm256_insertf128_ps :: #force_inline proc "c" (a: __m256, b: __m128, $IMM1: u8) -> __m256 where IMM1 < 2 { + when IMM1 == 0 { + return intrinsics.simd_shuffle( + a, + _mm256_castps128_ps256(b), + 8, 9, 10, 11, 4, 5, 6, 7, + ) + } else { + return intrinsics.simd_shuffle( + a, + _mm256_castps128_ps256(b), + 0, 1, 2, 3, 8, 9, 10, 11, + ) + } +} + +// Copies `a` to result, then inserts 128 bits (composed of 2 packed +// double-precision (64-bit) floating-point elements) from `b` into result +// at the location specified by `imm8`. +@(require_results, enable_target_feature="sse2,avx") +_mm256_insertf128_pd :: #force_inline proc "c" (a: __m256d, b: __m128d, $IMM1: u8) -> __m256d where IMM1 < 2 { + when IMM1 == 0 { + return intrinsics.simd_shuffle( + a, + _mm256_castpd128_pd256(b), + 4, 5, 2, 3, + ) + } else { + return intrinsics.simd_shuffle( + a, + _mm256_castpd128_pd256(b), + 0, 1, 4, 5, + ) + } +} + +// Copies `a` to result, then inserts 128 bits from `b` into result at the location specified by `imm8`. +@(require_results, enable_target_feature="avx") +_mm256_insertf128_si256 :: #force_inline proc "c" (a: __m256i, b: __m128i, $IMM1: u8) -> __m256i where IMM1 < 2 { + when IMM1 == 0 { + return intrinsics.simd_shuffle( + a, + _mm256_castsi128_si256(b), + 4, 5, 2, 3, + ) + } else { + return intrinsics.simd_shuffle( + a, + _mm256_castsi128_si256(b), + 0, 1, 4, 5, + ) + } +} + +// Copies `a` to result, and inserts the 8-bit integer `i` into result at the location specified by `index`. +@(require_results, enable_target_feature="avx") +_mm256_insert_epi8 :: #force_inline proc "c" (a: __m256i, i: i8, $INDEX: u8) -> __m256i where INDEX < 32 { + return transmute(__m256i)intrinsics.simd_replace(transmute(#simd[32]i8)a, INDEX, i) +} + +// Copies `a` to result, and inserts the 16-bit integer `i` into result at the location specified by `index`. +@(require_results, enable_target_feature="avx") +_mm256_insert_epi16 :: #force_inline proc "c" (a: __m256i, i: i16, $INDEX: u8) -> __m256i where INDEX < 16 { + return transmute(__m256i)intrinsics.simd_replace(transmute(#simd[16]i16)a, INDEX, i) +} + +// Copies `a` to result, and inserts the 32-bit integer `i` into result at the location specified by `index`. +@(require_results, enable_target_feature="avx") +_mm256_insert_epi32 :: #force_inline proc "c" (a: __m256i, i: i32, $INDEX: u8) -> __m256i where INDEX < 8 { + return transmute(__m256i)intrinsics.simd_replace(transmute(#simd[8]i32)a, INDEX, i) +} + + + +// Loads 256-bits (composed of 4 packed double-precision (64-bit) floating-point elements) from memory into result. +// `mem_addr` must be aligned on a 32-byte boundary or a +// general-protection exception may be generated. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_load_pd) +@(require_results, enable_target_feature="avx") +_mm256_load_pd :: #force_inline proc "c" (mem_addr: ^f64) -> __m256d { + return (^__m256d)(mem_addr)^ +} + +// Stores 256-bits (composed of 4 packed double-precision (64-bit) floating-point elements) from `a` into memory. +// `mem_addr` must be aligned on a 32-byte boundary or a +// general-protection exception may be generated. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_store_pd) +@(enable_target_feature="avx") +_mm256_store_pd :: #force_inline proc "c" (mem_addr: ^f64, a: __m256d) { + (^__m256d)(mem_addr)^ = a +} + +// Loads 256-bits (composed of 8 packed single-precision (32-bit) floating-point elements) from memory into result. +// `mem_addr` must be aligned on a 32-byte boundary or a +// general-protection exception may be generated. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_load_ps) +@(require_results, enable_target_feature="avx") +_mm256_load_ps :: #force_inline proc "c" (mem_addr: ^f32) -> __m256 { + return (^__m256)(mem_addr)^ +} + +// Stores 256-bits (composed of 8 packed single-precision (32-bit) floating-point elements) from `a` into memory. +// `mem_addr` must be aligned on a 32-byte boundary or a +// general-protection exception may be generated. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_store_ps) +@(enable_target_feature="avx") +_mm256_store_ps :: #force_inline proc "c" (mem_addr: ^f32, a: __m256) { + (^__m256)(mem_addr)^ = a +} + +// Loads 256-bits (composed of 4 packed double-precision (64-bit) floating-point elements) from memory into result. +// `mem_addr` does not need to be aligned on any particular boundary. +@(enable_target_feature="avx") +_mm256_loadu_pd :: #force_inline proc "c" (mem_addr: ^f64) -> __m256d { + return intrinsics.unaligned_load((^__m256d)(mem_addr)) +} + +// Stores 256-bits (composed of 4 packed double-precision (64-bit) floating-point elements) from `a` into memory. +// `mem_addr` does not need to be aligned on any particular boundary. +@(enable_target_feature="avx") +_mm256_storeu_pd :: #force_inline proc "c" (mem_addr: ^f64, a: __m256d) { + intrinsics.unaligned_store((^__m256d)(mem_addr), a) +} + +// Loads 256-bits (composed of 8 packed single-precision (32-bit) floating-point elements) from memory into result. +// `mem_addr` does not need to be aligned on any particular boundary. +@(require_results, enable_target_feature="avx") +_mm256_loadu_ps :: #force_inline proc "c" (mem_addr: ^f32) -> __m256 { + return intrinsics.unaligned_load((^__m256)(mem_addr)) +} + +// Stores 256-bits (composed of 8 packed single-precision (32-bit) floating-point elements) from `a` into memory. +// `mem_addr` does not need to be aligned on any particular boundary. +@(enable_target_feature="avx") +_mm256_storeu_ps :: #force_inline proc "c" (mem_addr: ^f32, a: __m256) { + intrinsics.unaligned_store((^__m256)(mem_addr), a) +} + +// Loads 256-bits of integer data from memory into result. +// `mem_addr` must be aligned on a 32-byte boundary or a +// general-protection exception may be generated. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_load_si256) +@(require_results, enable_target_feature="avx") +_mm256_load_si256 :: #force_inline proc "c" (mem_addr: ^__m256i) -> __m256i { + return mem_addr^ +} + +// Stores 256-bits of integer data from `a` into memory. +// `mem_addr` must be aligned on a 32-byte boundary or a +// general-protection exception may be generated. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_store_si256) +@(enable_target_feature="avx") +_mm256_store_si256 :: #force_inline proc "c" (mem_addr: ^__m256i, a: __m256i) { + mem_addr^ = a +} + +// Loads 256-bits of integer data from memory into result. +// `mem_addr` does not need to be aligned on any particular boundary. +@(require_results, enable_target_feature="avx") +_mm256_loadu_si256 :: #force_inline proc "c" (mem_addr: ^__m256i) -> __m256i { + return intrinsics.unaligned_load(mem_addr) +} + +// Stores 256-bits of integer data from `a` into memory. +// `mem_addr` does not need to be aligned on any particular boundary. +@(enable_target_feature="avx") +_mm256_storeu_si256 :: #force_inline proc "c" (mem_addr: ^__m256i, a: __m256i) { + intrinsics.unaligned_store(mem_addr, a) +} + +// Loads packed double-precision (64-bit) floating-point elements from memory +// into result using `mask` (elements are zeroed out when the high bit of the +// corresponding element is not set). +@(require_results, enable_target_feature="avx") +_mm256_maskload_pd :: #force_inline proc "c" (mem_addr: ^f64, mask: __m256i) -> __m256d { + mask_mask := intrinsics.simd_shr(mask, 63) + return intrinsics.simd_masked_load(mem_addr, _mm256_setzero_pd(), mask_mask) +} + +// Stores packed double-precision (64-bit) floating-point elements from `a` +// into memory using `mask`. +@(enable_target_feature="avx") +_mm256_maskstore_pd :: #force_inline proc "c" (mem_addr: ^f64, mask: __m256i, a: __m256d) { + mask_mask := intrinsics.simd_shr(mask, 63) + intrinsics.simd_masked_store(mem_addr, a, mask_mask) +} + + +// Loads packed double-precision (64-bit) floating-point elements from memory +// into result using `mask` (elements are zeroed out when the high bit of the +// corresponding element is not set). +@(require_results, enable_target_feature="sse2,avx") +_mm_maskload_pd :: #force_inline proc "c" (mem_addr: ^f64, mask: __m128i) -> __m128d { + mask_mask := intrinsics.simd_shr(mask, 63) + return intrinsics.simd_masked_load(mem_addr, _mm_setzero_pd(), mask_mask) +} + +// Stores packed double-precision (64-bit) floating-point elements from `a` +// into memory using `mask`. +@(enable_target_feature="avx") +_mm_maskstore_pd :: #force_inline proc "c" (mem_addr: ^f64, mask: __m128i, a: __m128d) { + mask_mask := intrinsics.simd_shr(mask, 63) + intrinsics.simd_masked_store(mem_addr, a, mask_mask) +} + +// Loads packed single-precision (32-bit) floating-point elements from memory +// into result using `mask` (elements are zeroed out when the high bit of the +// corresponding element is not set). +@(require_results, enable_target_feature="avx") +_mm256_maskload_ps :: #force_inline proc "c" (mem_addr: ^f32, mask: __m256i) -> __m256 { + mask_mask := intrinsics.simd_shr(transmute(#simd[8]i32)mask, 31) + return intrinsics.simd_masked_load(mem_addr, _mm256_setzero_ps(), mask_mask) +} + +// Stores packed single-precision (32-bit) floating-point elements from `a` +// into memory using `mask`. +@(enable_target_feature="avx") +_mm256_maskstore_ps :: #force_inline proc "c" (mem_addr: ^f32, mask: __m256i, a: __m256) { + mask_mask := intrinsics.simd_shr(transmute(#simd[8]i32)mask, 31) + intrinsics.simd_masked_store(mem_addr, a, mask_mask) +} + +// Loads packed single-precision (32-bit) floating-point elements from memory +// into result using `mask` (elements are zeroed out when the high bit of the +// corresponding element is not set). +@(require_results, enable_target_feature="sse,avx") +_mm_maskload_ps :: #force_inline proc "c" (mem_addr: ^f32, mask: __m128i) -> __m128 { + mask_mask := intrinsics.simd_shr(transmute(#simd[4]i32)mask, 31) + return intrinsics.simd_masked_load(mem_addr, _mm_setzero_ps(), mask_mask) +} + +// Stores packed single-precision (32-bit) floating-point elements from `a` +// into memory using `mask`. +@(enable_target_feature="avx") +_mm_maskstore_ps :: #force_inline proc "c" (mem_addr: ^f32, mask: __m128i, a: __m128) { + mask_mask := intrinsics.simd_shr(transmute(#simd[4]i32)mask, 31) + intrinsics.simd_masked_store(mem_addr, a, mask_mask) +} + + + + +// Duplicate odd-indexed single-precision (32-bit) floating-point elements from `a`, and returns the results. +@(require_results, enable_target_feature="avx") +_mm256_movehdup_ps :: #force_inline proc "c" (a: __m256) -> __m256 { + return intrinsics.simd_shuffle(a, a, 1, 1, 3, 3, 5, 5, 7, 7) +} + +// Duplicate even-indexed single-precision (32-bit) floating-point elements from `a`, and returns the results. +@(require_results, enable_target_feature="avx") +_mm256_moveldup_ps :: #force_inline proc "c" (a: __m256) -> __m256 { + return intrinsics.simd_shuffle(a, a, 0, 0, 2, 2, 4, 4, 6, 6) +} + +// Duplicate even-indexed double-precision (64-bit) floating-point elements from `a`, and returns the results. +@(require_results, enable_target_feature="avx") +_mm256_movedup_pd :: #force_inline proc "c" (a: __m256d) -> __m256d { + return intrinsics.simd_shuffle(a, a, 0, 0, 2, 2) +} + + +// Loads 256-bits of integer data from unaligned memory into result. +// This intrinsic may perform better than `_mm256_loadu_si256` when the +// data crosses a cache line boundary. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_lddqu_si256) +@(require_results, enable_target_feature="avx") +_mm256_lddqu_si256 :: #force_inline proc "c" (mem_addr: ^__m256i) -> __m256i { + return transmute(__m256i)llvm_vlddqu(mem_addr) +} + +// Moves integer data from a 256-bit integer vector to a 32-byte +// aligned memory location. To minimize caching, the data is flagged as +// non-temporal (unlikely to be used again soon) +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_stream_si256) +// +// # Safety of non-temporal stores +// +// After using this intrinsic, but before any other access to the memory that this intrinsic +// mutates, a call to [`_mm_sfence`] must be performed by the thread that used the intrinsic. In +// particular, functions that call this intrinsic should generally call `_mm_sfence` before they +// return. +// +// See [`_mm_sfence`] for details. +@(enable_target_feature="avx") +_mm256_stream_si256 :: #force_inline proc "c" (mem_addr: ^__m256i, a: __m256i) { + panic_contextless("TODO: _mm256_stream_si256") +} + +// Moves double-precision values from a 256-bit vector of `[4 x double]` +// to a 32-byte aligned memory location. To minimize caching, the data is +// flagged as non-temporal (unlikely to be used again soon). +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_stream_pd) +// +// # Safety of non-temporal stores +// +// After using this intrinsic, but before any other access to the memory that this intrinsic +// mutates, a call to [`_mm_sfence`] must be performed by the thread that used the intrinsic. In +// particular, functions that call this intrinsic should generally call `_mm_sfence` before they +// return. +// +// See [`_mm_sfence`] for details. +@(enable_target_feature="avx") +_mm256_stream_pd :: #force_inline proc "c" (mem_addr: ^f64, a: __m256d) { + panic_contextless("TODO: _mm256_stream_pd") +} + +// Moves single-precision floating point values from a 256-bit vector +// of `[8 x float]` to a 32-byte aligned memory location. To minimize +// caching, the data is flagged as non-temporal (unlikely to be used again +// soon). +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_stream_ps) +// +// # Safety of non-temporal stores +// +// After using this intrinsic, but before any other access to the memory that this intrinsic +// mutates, a call to [`_mm_sfence`] must be performed by the thread that used the intrinsic. In +// particular, functions that call this intrinsic should generally call `_mm_sfence` before they +// return. +// +// See [`_mm_sfence`] for details. +@(enable_target_feature="avx") +_mm256_stream_ps :: #force_inline proc "c" (mem_addr: ^f32, a: __m256) { + panic_contextless("TODO: _mm256_stream_ps") +} + +// Computes the approximate reciprocal of packed single-precision (32-bit) floating-point elements in `a`, and returns the results. The maximum +// relative error for this approximation is less than 1.5*2^-12. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_rcp_ps) +@(require_results, enable_target_feature="avx") +_mm256_rcp_ps :: #force_inline proc "c" (a: __m256) -> __m256 { + return llvm_vrcpps(a) +} + +// Computes the approximate reciprocal square root of packed single-precision +// (32-bit) floating-point elements in `a`, and returns the results. +// The maximum relative error for this approximation is less than 1.5*2^-12. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_rsqrt_ps) +@(require_results, enable_target_feature="avx") +_mm256_rsqrt_ps :: #force_inline proc "c" (a: __m256) -> __m256 { + return llvm_vrsqrtps(a) +} + + + +// Unpacks and interleave double-precision (64-bit) floating-point elements +// from the high half of each 128-bit lane in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_unpackhi_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + return intrinsics.simd_shuffle(a, b, 1, 5, 3, 7) +} + +// Unpacks and interleave single-precision (32-bit) floating-point elements +// from the high half of each 128-bit lane in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_unpackhi_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + return intrinsics.simd_shuffle(a, b, 2, 10, 3, 11, 6, 14, 7, 15) +} + +// Unpacks and interleave double-precision (64-bit) floating-point elements +// from the low half of each 128-bit lane in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_unpacklo_pd :: #force_inline proc "c" (a, b: __m256d) -> __m256d { + return intrinsics.simd_shuffle(a, b, 0, 4, 2, 6) +} + +// Unpacks and interleave single-precision (32-bit) floating-point elements +// from the low half of each 128-bit lane in `a` and `b`. +@(require_results, enable_target_feature="avx") +_mm256_unpacklo_ps :: #force_inline proc "c" (a, b: __m256) -> __m256 { + return intrinsics.simd_shuffle(a, b, 0, 8, 1, 9, 4, 12, 5, 13) +} + +// Computes the bitwise AND of 256 bits (representing integer data) in `a` and +// `b`, and set `ZF` to 1 if the result is zero, otherwise set `ZF` to 0. +// Computes the bitwise NOT of `a` and then AND with `b`, and set `CF` to 1 if +// the result is zero, otherwise set `CF` to 0. Return the `ZF` value. +@(require_results, enable_target_feature="avx") +_mm256_testz_si256 :: #force_inline proc "c" (a, b: __m256i) -> i32 { + r := intrinsics.simd_bit_and(a, b) + return i32(0 == intrinsics.simd_reduce_or(r)) +} + +// Computes the bitwise AND of 256 bits (representing integer data) in `a` and +// `b`, and set `ZF` to 1 if the result is zero, otherwise set `ZF` to 0. +// Computes the bitwise NOT of `a` and then AND with `b`, and set `CF` to 1 if +// the result is zero, otherwise set `CF` to 0. Return the `CF` value. +@(require_results, enable_target_feature="avx") +_mm256_testc_si256 :: #force_inline proc "c" (a, b: __m256i) -> i32 { + r := intrinsics.simd_bit_and(intrinsics.simd_bit_xor(a, __m256i(~i64(0))), b) + return i32(0 == intrinsics.simd_reduce_or(r)) +} + + + +// Computes the bitwise AND of 256 bits (representing integer data) in `a` and +// `b`, and set `ZF` to 1 if the result is zero, otherwise set `ZF` to 0. +// Computes the bitwise NOT of `a` and then AND with `b`, and set `CF` to 1 if +// the result is zero, otherwise set `CF` to 0. Return 1 if both the `ZF` and +// `CF` values are zero, otherwise return 0. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_testnzc_si256) +@(require_results, enable_target_feature="avx") +_mm256_testnzc_si256 :: #force_inline proc "c" (a, b: __m256i) -> i32 { + return llvm_ptestnzc256(a, b) +} + +// Computes the bitwise AND of 256 bits (representing double-precision (64-bit) floating-point elements) in `a` and `b`, producing an intermediate 256-bit +// value, and set `ZF` to 1 if the sign bit of each 64-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 64-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return the `ZF` value. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_testz_pd) +@(require_results, enable_target_feature="avx") +_mm256_testz_pd :: #force_inline proc "c" (a, b: __m256d) -> i32 { + return llvm_vtestzpd256(a, b) +} + +// Computes the bitwise AND of 256 bits (representing double-precision (64-bit) floating-point elements) in `a` and `b`, producing an intermediate 256-bit +// value, and set `ZF` to 1 if the sign bit of each 64-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 64-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return the `CF` value. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_testc_pd) +@(require_results, enable_target_feature="avx") +_mm256_testc_pd :: #force_inline proc "c" (a, b: __m256d) -> i32 { + return llvm_vtestcpd256(a, b) +} + +// Computes the bitwise AND of 256 bits (representing double-precision (64-bit) floating-point elements) in `a` and `b`, producing an intermediate 256-bit +// value, and set `ZF` to 1 if the sign bit of each 64-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 64-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return 1 if both the `ZF` and `CF` values +// are zero, otherwise return 0. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_testnzc_pd) +@(require_results, enable_target_feature="avx") +_mm256_testnzc_pd :: #force_inline proc "c" (a, b: __m256d) -> i32 { + return llvm_vtestnzcpd256(a, b) +} + +// Computes the bitwise AND of 128 bits (representing double-precision (64-bit) floating-point elements) in `a` and `b`, producing an intermediate 128-bit +// value, and set `ZF` to 1 if the sign bit of each 64-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 64-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return the `ZF` value. +@(require_results, enable_target_feature="sse2,avx") +_mm_testz_pd :: #force_inline proc "c" (a, b: __m128d) -> i32 { + r := intrinsics.simd_lanes_lt(transmute(__m128i)_mm_and_pd(a, b), __m128i(0)) + return i32(0 == intrinsics.simd_reduce_or(r)) +} + +// Computes the bitwise AND of 128 bits (representing double-precision (64-bit) floating-point elements) in `a` and `b`, producing an intermediate 128-bit +// value, and set `ZF` to 1 if the sign bit of each 64-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 64-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return the `CF` value. +@(require_results, enable_target_feature="sse2,avx") +_mm_testc_pd :: #force_inline proc "c" (a, b: __m128d) -> i32 { + r := intrinsics.simd_lanes_lt(transmute(__m128i)_mm_andnot_pd(a, b), __m128i(0)) + return i32(0 == intrinsics.simd_reduce_or(r)) +} + +// Computes the bitwise AND of 128 bits (representing double-precision (64-bit) floating-point elements) in `a` and `b`, producing an intermediate 128-bit +// value, and set `ZF` to 1 if the sign bit of each 64-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 64-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return 1 if both the `ZF` and `CF` values +// are zero, otherwise return 0. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_testnzc_pd) +@(require_results, enable_target_feature="avx") +_mm_testnzc_pd :: #force_inline proc "c" (a, b: __m128d) -> i32 { + return llvm_vtestnzcpd(a, b) +} + +// Computes the bitwise AND of 256 bits (representing single-precision (32-bit) floating-point elements) in `a` and `b`, producing an intermediate 256-bit +// value, and set `ZF` to 1 if the sign bit of each 32-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 32-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return the `ZF` value. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_testz_ps) +@(require_results, enable_target_feature="avx") +_mm256_testz_ps :: #force_inline proc "c" (a, b: __m256) -> i32 { + return llvm_vtestzps256(a, b) +} + +// Computes the bitwise AND of 256 bits (representing single-precision (32-bit) floating-point elements) in `a` and `b`, producing an intermediate 256-bit +// value, and set `ZF` to 1 if the sign bit of each 32-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 32-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return the `CF` value. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_testc_ps) +@(require_results, enable_target_feature="avx") +_mm256_testc_ps :: #force_inline proc "c" (a, b: __m256) -> i32 { + return llvm_vtestcps256(a, b) +} + +// Computes the bitwise AND of 256 bits (representing single-precision (32-bit) floating-point elements) in `a` and `b`, producing an intermediate 256-bit +// value, and set `ZF` to 1 if the sign bit of each 32-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 32-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return 1 if both the `ZF` and `CF` values +// are zero, otherwise return 0. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_testnzc_ps) +@(require_results, enable_target_feature="avx") +_mm256_testnzc_ps :: #force_inline proc "c" (a, b: __m256) -> i32 { + return llvm_vtestnzcps256(a, b) +} + +// Computes the bitwise AND of 128 bits (representing single-precision (32-bit) floating-point elements) in `a` and `b`, producing an intermediate 128-bit +// value, and set `ZF` to 1 if the sign bit of each 32-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 32-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return the `ZF` value. +@(require_results, enable_target_feature="sse,avx") +_mm_testz_ps :: #force_inline proc "c" (a: __m128, b: __m128) -> i32 { + r := intrinsics.simd_lanes_lt(transmute(#simd[4]i32)_mm_and_ps(a, b), (#simd[4]i32)(0)) + return i32(0 == intrinsics.simd_reduce_or(r)) +} + +// Computes the bitwise AND of 128 bits (representing single-precision (32-bit) floating-point elements) in `a` and `b`, producing an intermediate 128-bit +// value, and set `ZF` to 1 if the sign bit of each 32-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 32-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return the `CF` value. +@(require_results, enable_target_feature="sse,avx") +_mm_testc_ps :: #force_inline proc "c" (a: __m128, b: __m128) -> i32 { + r := intrinsics.simd_lanes_lt(transmute(#simd[4]i32)_mm_andnot_ps(a, b), (#simd[4]i32)(0)) + return i32(0 == intrinsics.simd_reduce_or(r)) +} + +// Computes the bitwise AND of 128 bits (representing single-precision (32-bit) floating-point elements) in `a` and `b`, producing an intermediate 128-bit +// value, and set `ZF` to 1 if the sign bit of each 32-bit element in the +// intermediate value is zero, otherwise set `ZF` to 0. Compute the bitwise +// NOT of `a` and then AND with `b`, producing an intermediate value, and set +// `CF` to 1 if the sign bit of each 32-bit element in the intermediate value +// is zero, otherwise set `CF` to 0. Return 1 if both the `ZF` and `CF` values +// are zero, otherwise return 0. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_testnzc_ps) +@(require_results, enable_target_feature="avx") +_mm_testnzc_ps :: #force_inline proc "c" (a: __m128, b: __m128) -> i32 { + return llvm_vtestnzcps(a, b) +} + +// Sets each bit of the returned mask based on the most significant bit of the +// corresponding packed double-precision (64-bit) floating-point element in +// `a`. +@(require_results, enable_target_feature="avx") +_mm256_movemask_pd :: #force_inline proc "c" (a: __m256d) -> i32 { + mask := intrinsics.simd_lanes_lt(transmute(#simd[4]i64)a, (#simd[4]i64)(0)) + return i32(transmute(u8)intrinsics.simd_extract_lsbs(mask)) +} + +// Sets each bit of the returned mask based on the most significant bit of the +// corresponding packed single-precision (32-bit) floating-point element in +// `a`. +@(require_results, enable_target_feature="avx") +_mm256_movemask_ps :: #force_inline proc "c" (a: __m256) -> i32 { + // Propagate the highest bit to the rest, because simd_bitmask + // requires all-1 or all-0. + mask := intrinsics.simd_lanes_lt(transmute(#simd[8]i32)a, (#simd[8]i32)(0)) + return i32(transmute(u8)intrinsics.simd_extract_lsbs(mask)) +} + +// Returns vector of type __m256d with all elements set to zero. +@(require_results, enable_target_feature="avx") +_mm256_setzero_pd :: #force_inline proc "c" () -> __m256d { + return 0 +} + +// Returns vector of type __m256 with all elements set to zero. +@(require_results, enable_target_feature="avx") +_mm256_setzero_ps :: #force_inline proc "c" () -> __m256 { + return 0 +} + +// Returns vector of type __m256i with all elements set to zero. +@(require_results, enable_target_feature="avx") +_mm256_setzero_si256 :: #force_inline proc "c" () -> __m256i { + return 0 +} + +// Sets packed double-precision (64-bit) floating-point elements in returned +// vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_set_pd :: #force_inline proc "c" (a: f64, b: f64, c: f64, d: f64) -> __m256d { + return _mm256_setr_pd(d, c, b, a) +} + +// Sets packed single-precision (32-bit) floating-point elements in returned +// vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_set_ps :: #force_inline proc "c" ( + a: f32, + b: f32, + c: f32, + d: f32, + e: f32, + f: f32, + g: f32, + h: f32, +) -> __m256 { + return _mm256_setr_ps(h, g, f, e, d, c, b, a) +} + +// Sets packed 8-bit integers in returned vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_set_epi8 :: #force_inline proc "c" ( + e00, e01, e02, e03, e04, e05, e06, e07: i8, + e08, e09, e10, e11, e12, e13, e14, e15: i8, + e16, e17, e18, e19, e20, e21, e22, e23: i8, + e24, e25, e26, e27, e28, e29, e30, e31: i8, +) -> __m256i { + return _mm256_setr_epi8( + e31, e30, e29, e28, e27, e26, e25, e24, + e23, e22, e21, e20, e19, e18, e17, e16, + e15, e14, e13, e12, e11, e10, e09, e08, + e07, e06, e05, e04, e03, e02, e01, e00, + ) +} + +// Sets packed 16-bit integers in returned vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_set_epi16 :: #force_inline proc "c" ( + e00, e01, e02, e03, e04, e05, e06, e07: i16, + e08, e09, e10, e11, e12, e13, e14, e15: i16, +) -> __m256i { + return _mm256_setr_epi16( + e15, e14, e13, e12, + e11, e10, e09, e08, + e07, e06, e05, e04, + e03, e02, e01, e00, + ) +} + +// Sets packed 32-bit integers in returned vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_set_epi32 :: #force_inline proc "c" (e0, e1, e2, e3, e4, e5, e6, e7: i32) -> __m256i { + return _mm256_setr_epi32(e7, e6, e5, e4, e3, e2, e1, e0) +} + +// Sets packed 64-bit integers in returned vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_set_epi64x :: #force_inline proc "c" (a: i64, b: i64, c: i64, d: i64) -> __m256i { + return _mm256_setr_epi64x(d, c, b, a) +} + +// Sets packed double-precision (64-bit) floating-point elements in returned +// vector with the supplied values in reverse order. +@(require_results, enable_target_feature="avx") +_mm256_setr_pd :: #force_inline proc "c" (a: f64, b: f64, c: f64, d: f64) -> __m256d { + return __m256d{a, b, c, d} +} + +// Sets packed single-precision (32-bit) floating-point elements in returned +// vector with the supplied values in reverse order. +@(require_results, enable_target_feature="avx") +_mm256_setr_ps :: #force_inline proc "c" (a, b, c, d, e, f, g, h: f32) -> __m256 { + return __m256{a, b, c, d, e, f, g, h} +} + +// Sets packed 8-bit integers in returned vector with the supplied values in +// reverse order. +@(require_results, enable_target_feature="avx") +_mm256_setr_epi8 :: #force_inline proc "c" ( + e00, e01, e02, e03, e04, e05, e06, e07: i8, + e08, e09, e10, e11, e12, e13, e14, e15: i8, + e16, e17, e18, e19, e20, e21, e22, e23: i8, + e24, e25, e26, e27, e28, e29, e30, e31: i8, +) -> __m256i { + return transmute(__m256i)#simd[32]i8{ + e00, e01, e02, e03, e04, e05, e06, e07, + e08, e09, e10, e11, e12, e13, e14, e15, + e16, e17, e18, e19, e20, e21, e22, e23, + e24, e25, e26, e27, e28, e29, e30, e31, + } +} + +// Sets packed 16-bit integers in returned vector with the supplied values in +// reverse order. +@(require_results, enable_target_feature="avx") +_mm256_setr_epi16 :: #force_inline proc "c" ( + e00, e01, e02, e03, e04, e05, e06, e07: i16, + e08, e09, e10, e11, e12, e13, e14, e15: i16, +) -> __m256i { + return transmute(__m256i)#simd[16]i16{ + e00, e01, e02, e03, + e04, e05, e06, e07, + e08, e09, e10, e11, + e12, e13, e14, e15, + } +} + +// Sets packed 32-bit integers in returned vector with the supplied values in +// reverse order. +@(require_results, enable_target_feature="avx") +_mm256_setr_epi32 :: #force_inline proc "c" (e0, e1, e2, e3, e4, e5, e6, e7: i32) -> __m256i { + return transmute(__m256i)#simd[8]i32{e0, e1, e2, e3, e4, e5, e6, e7} +} + +// Sets packed 64-bit integers in returned vector with the supplied values in +// reverse order. +@(require_results, enable_target_feature="avx") +_mm256_setr_epi64x :: #force_inline proc "c" (a: i64, b: i64, c: i64, d: i64) -> __m256i { + return {a, b, c, d} +} + +// Broadcasts double-precision (64-bit) floating-point value `a` to all elements of returned vector. +@(require_results, enable_target_feature="avx") +_mm256_set1_pd :: #force_inline proc "c" (a: f64) -> __m256d { + return a +} + +// Broadcasts single-precision (32-bit) floating-point value `a` to all elements of returned vector. +@(require_results, enable_target_feature="avx") +_mm256_set1_ps :: #force_inline proc "c" (a: f32) -> __m256 { + return a +} + +// Broadcasts 8-bit integer `a` to all elements of returned vector. +// This intrinsic may generate the `vpbroadcastb`. +@(require_results, enable_target_feature="avx") +_mm256_set1_epi8 :: #force_inline proc "c" (a: i8) -> __m256i { + return transmute(__m256i)(#simd[32]i8)(a) +} + +// Broadcasts 16-bit integer `a` to all elements of returned vector. +// This intrinsic may generate the `vpbroadcastw`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_set1_epi16) +@(require_results, enable_target_feature="avx") +_mm256_set1_epi16 :: #force_inline proc "c" (a: i16) -> __m256i { + return transmute(__m256i)(#simd[16]i16)(a) +} + +// Broadcasts 32-bit integer `a` to all elements of returned vector. +// This intrinsic may generate the `vpbroadcastd`. +@(require_results, enable_target_feature="avx") +_mm256_set1_epi32 :: #force_inline proc "c" (a: i32) -> __m256i { + return transmute(__m256i)(#simd[8]i32)(a) +} + +// Broadcasts 64-bit integer `a` to all elements of returned vector. +// This intrinsic may generate the `vpbroadcastq`. +// +// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_set1_epi64x) +@(require_results, enable_target_feature="avx") +_mm256_set1_epi64x :: #force_inline proc "c" (a: i64) -> __m256i { + return a +} + +// Cast vector of type __m256d to type __m256. +@(require_results, enable_target_feature="avx") +_mm256_castpd_ps :: #force_inline proc "c" (a: __m256d) -> __m256 { + return transmute(__m256)a +} + +// Cast vector of type __m256 to type __m256d. +@(require_results, enable_target_feature="avx") +_mm256_castps_pd :: #force_inline proc "c" (a: __m256) -> __m256d { + return transmute(__m256d)a +} + +// Casts vector of type __m256 to type __m256i. +@(require_results, enable_target_feature="avx") +_mm256_castps_si256 :: #force_inline proc "c" (a: __m256) -> __m256i { + return transmute(__m256i)a +} + +// Casts vector of type __m256i to type __m256. +@(require_results, enable_target_feature="avx") +_mm256_castsi256_ps :: #force_inline proc "c" (a: __m256i) -> __m256 { + return transmute(__m256)a +} + +// Casts vector of type __m256d to type __m256i. +@(require_results, enable_target_feature="avx") +_mm256_castpd_si256 :: #force_inline proc "c" (a: __m256d) -> __m256i { + return transmute(__m256i)a +} + +// Casts vector of type __m256i to type __m256d. +@(require_results, enable_target_feature="avx") +_mm256_castsi256_pd :: #force_inline proc "c" (a: __m256i) -> __m256d { + return transmute(__m256d)a +} + +// Casts vector of type __m256 to type __m128. +@(require_results, enable_target_feature="avx") +_mm256_castps256_ps128 :: #force_inline proc "c" (a: __m256) -> __m128 { + return intrinsics.simd_shuffle(a, a, 0, 1, 2, 3) +} + +// Casts vector of type __m256d to type __m128d. +@(require_results, enable_target_feature="avx") +_mm256_castpd256_pd128 :: #force_inline proc "c" (a: __m256d) -> __m128d { + return intrinsics.simd_shuffle(a, a, 0, 1) +} + +// Casts vector of type __m256i to type __m128i. +@(require_results, enable_target_feature="avx") +_mm256_castsi256_si128 :: #force_inline proc "c" (a: __m256i) -> __m128i { + return intrinsics.simd_shuffle(a, a, 0, 1) +} + +// Casts vector of type __m128 to type __m256; +// the upper 128 bits of the result are indeterminate. +// +// In the Intel documentation, the upper bits are declared to be "undefined". +@(require_results, enable_target_feature="sse,avx") +_mm256_castps128_ps256 :: #force_inline proc "c" (a: __m128) -> __m256 { + return intrinsics.simd_shuffle(a, _mm_undefined_ps(), 0, 1, 2, 3, 4, 4, 4, 4) +} + +// Casts vector of type __m128d to type __m256d; +// the upper 128 bits of the result are indeterminate. +// +// In the Intel documentation, the upper bits are declared to be "undefined". +@(require_results, enable_target_feature="sse2,avx") +_mm256_castpd128_pd256 :: #force_inline proc "c" (a: __m128d) -> __m256d { + return intrinsics.simd_shuffle(a, _mm_undefined_pd(), 0, 1, 2, 2) +} + +// Casts vector of type __m128i to type __m256i; +// the upper 128 bits of the result are indeterminate. +// +// In the Intel documentation, the upper bits are declared to be "undefined". +@(require_results, enable_target_feature="avx") +_mm256_castsi128_si256 :: #force_inline proc "c" (a: __m128i) -> __m256i { + return intrinsics.simd_shuffle(a, __m128i(0), 0, 1, 2, 2) +} + +// Constructs a 256-bit floating-point vector of `[8 x float]` from a +// 128-bit floating-point vector of `[4 x float]`. The lower 128 bits contain +// the value of the source vector. The upper 128 bits are set to zero. +@(require_results, enable_target_feature="sse,avx") +_mm256_zextps128_ps256 :: #force_inline proc "c" (a: __m128) -> __m256 { + return intrinsics.simd_shuffle(a, _mm_setzero_ps(), 0, 1, 2, 3, 4, 5, 6, 7) +} + +// Constructs a 256-bit integer vector from a 128-bit integer vector. +// The lower 128 bits contain the value of the source vector. The upper +// 128 bits are set to zero. +@(require_results, enable_target_feature="avx") +_mm256_zextsi128_si256 :: #force_inline proc "c" (a: __m128i) -> __m256i { + return intrinsics.simd_shuffle(a, __m128i(0), 0, 1, 2, 3) +} + +// Constructs a 256-bit floating-point vector of `[4 x double]` from a +// 128-bit floating-point vector of `[2 x double]`. The lower 128 bits +// contain the value of the source vector. The upper 128 bits are set +// to zero. +@(require_results, enable_target_feature="sse2,avx") +_mm256_zextpd128_pd256 :: #force_inline proc "c" (a: __m128d) -> __m256d { + return intrinsics.simd_shuffle(a, _mm_setzero_pd(), 0, 1, 2, 3) +} + +// Returns vector of type `__m256` with indeterminate elements. +// Despite using the word "undefined" (following Intel's naming scheme), this non-deterministically +@(require_results, enable_target_feature="avx") +_mm256_undefined_ps :: #force_inline proc "c" () -> __m256 { + return 0 +} + +// Returns vector of type `__m256d` with indeterminate elements. +// Despite using the word "undefined" (following Intel's naming scheme), this non-deterministically +@(require_results, enable_target_feature="avx") +_mm256_undefined_pd :: #force_inline proc "c" () -> __m256d { + return 0 +} + +// Returns vector of type __m256i with with indeterminate elements. +// Despite using the word "undefined" (following Intel's naming scheme), this non-deterministically +@(require_results, enable_target_feature="avx") +_mm256_undefined_si256 :: #force_inline proc "c" () -> __m256i { + return 0 +} + +// Sets packed __m256 returned vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_set_m128 :: #force_inline proc "c" (hi: __m128, lo: __m128) -> __m256 { + return intrinsics.simd_shuffle(lo, hi, 0, 1, 2, 3, 4, 5, 6, 7) +} + +// Sets packed __m256d returned vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_set_m128d :: #force_inline proc "c" (hi: __m128d, lo: __m128d) -> __m256d { + hi := transmute(__m128)hi + lo := transmute(__m128)lo + return transmute(__m256d)_mm256_set_m128(hi, lo) +} + +// Sets packed __m256i returned vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_set_m128i :: #force_inline proc "c" (hi: __m128i, lo: __m128i) -> __m256i { + hi := transmute(__m128)hi + lo := transmute(__m128)lo + return transmute(__m256i)_mm256_set_m128(hi, lo) +} + +// Sets packed __m256 returned vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_setr_m128 :: #force_inline proc "c" (lo: __m128, hi: __m128) -> __m256 { + return _mm256_set_m128(hi, lo) +} + +// Sets packed __m256d returned vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_setr_m128d :: #force_inline proc "c" (lo: __m128d, hi: __m128d) -> __m256d { + return _mm256_set_m128d(hi, lo) +} + +// Sets packed __m256i returned vector with the supplied values. +@(require_results, enable_target_feature="avx") +_mm256_setr_m128i :: #force_inline proc "c" (lo: __m128i, hi: __m128i) -> __m256i { + return _mm256_set_m128i(hi, lo) +} + +// Loads two 128-bit values (composed of 4 packed single-precision (32-bit) floating-point elements) from memory, and combine them into a 256-bit value. +// `hiaddr` and `loaddr` do not need to be aligned on any particular boundary. +@(require_results, enable_target_feature="sse,avx") +_mm256_loadu2_m128 :: #force_inline proc "c" (hiaddr, loaddr: ^f32) -> __m256 { + a := _mm256_castps128_ps256(_mm_loadu_ps(loaddr)) + return _mm256_insertf128_ps(a, _mm_loadu_ps(hiaddr), 1) +} + +// Loads two 128-bit values (composed of 2 packed double-precision (64-bit) floating-point elements) from memory, and combine them into a 256-bit value. +// `hiaddr` and `loaddr` do not need to be aligned on any particular boundary. +@(require_results, enable_target_feature="sse2,avx") +_mm256_loadu2_m128d :: #force_inline proc "c" (hiaddr, loaddr: ^f64) -> __m256d { + a := _mm256_castpd128_pd256(_mm_loadu_pd(loaddr)) + return _mm256_insertf128_pd(a, _mm_loadu_pd(hiaddr), 1) +} + +// Loads two 128-bit values (composed of integer data) from memory, and combine them into a 256-bit value. +// `hiaddr` and `loaddr` do not need to be aligned on any particular boundary. +@(require_results, enable_target_feature="sse2,avx") +_mm256_loadu2_m128i :: #force_inline proc "c" (hiaddr, loaddr: ^__m128i) -> __m256i { + a := _mm256_castsi128_si256(_mm_loadu_si128(loaddr)) + return _mm256_insertf128_si256(a, _mm_loadu_si128(hiaddr), 1) +} + +// Stores the high and low 128-bit halves (each composed of 4 packed +// single-precision (32-bit) floating-point elements) from `a` into memory two +// different 128-bit locations. +// `hiaddr` and `loaddr` do not need to be aligned on any particular boundary. +@(enable_target_feature="sse,avx") +_mm256_storeu2_m128 :: #force_inline proc "c" (hiaddr, loaddr: ^f32, a: __m256) { + lo := _mm256_castps256_ps128(a) + _mm_storeu_ps(loaddr, lo) + hi := _mm256_extractf128_ps(a, 1) + _mm_storeu_ps(hiaddr, hi) +} + +// Stores the high and low 128-bit halves (each composed of 2 packed +// double-precision (64-bit) floating-point elements) from `a` into memory two +// different 128-bit locations. +// `hiaddr` and `loaddr` do not need to be aligned on any particular boundary. +@(enable_target_feature="sse2,avx") +_mm256_storeu2_m128d :: #force_inline proc "c" (hiaddr, loaddr: ^f64, a: __m256d) { + lo := _mm256_castpd256_pd128(a) + _mm_storeu_pd(loaddr, lo) + hi := _mm256_extractf128_pd(a, 1) + _mm_storeu_pd(hiaddr, hi) +} + +// Stores the high and low 128-bit halves (each composed of integer data) from +// `a` into memory two different 128-bit locations. +// `hiaddr` and `loaddr` do not need to be aligned on any particular boundary. +@(enable_target_feature="sse2,avx") +_mm256_storeu2_m128i :: #force_inline proc "c" (hiaddr, loaddr: ^__m128i, a: __m256i) { + lo := _mm256_castsi256_si128(a) + _mm_storeu_si128(loaddr, lo) + hi := _mm256_extractf128_si256(a, 1) + _mm_storeu_si128(hiaddr, hi) +} + +// Returns the first element of the input vector of `[8 x float]`. +@(require_results, enable_target_feature="avx") +_mm256_cvtss_f32 :: #force_inline proc "c" (a: __m256) -> f32 { + return intrinsics.simd_extract(a, 0) +} + + + +@(require_results, enable_target_feature="avx") +_mm256_insert_epi64 :: #force_inline proc "c" (a: __m256i, i: i64, $idx: u32) -> __m256i { + return intrinsics.simd_replace(transmute(#simd[4]i64)a, idx, i) +} + +@(require_results, enable_target_feature="avx") +_mm256_extract_epi64 :: #force_inline proc "c" (a: __m256i, $idx: u32) -> i64 { + return intrinsics.simd_extract(transmute(#simd[4]i64)a, idx) +} + + +@(private, default_calling_convention="none") +foreign _ { + @(link_name="llvm.x86.avx.round.pd.256") llvm_roundpd256 :: proc(a: __m256d, #const b: u32) -> __m256d --- + @(link_name="llvm.x86.avx.round.ps.256") llvm_roundps256 :: proc(a: __m256, #const b: u32) -> __m256 --- + @(link_name="llvm.x86.avx.dp.ps.256") llvm_vdpps :: proc(a, b: __m256, #const imm8: u8) -> __m256 --- + @(link_name="llvm.x86.sse2.cmp.pd") llvm_vcmppd :: proc(a, b: __m128d, #const imm8: u8) -> __m128d --- + @(link_name="llvm.x86.avx.cmp.pd.256") llvm_vcmppd256 :: proc(a, b: __m256d, imm8: u8) -> __m256d --- + @(link_name="llvm.x86.sse.cmp.ps") llvm_vcmpps :: proc(a: __m128, b: __m128, #const imm8: u8) -> __m128 --- + @(link_name="llvm.x86.avx.cmp.ps.256") llvm_vcmpps256 :: proc(a, b: __m256, imm8: u8) -> __m256 --- + @(link_name="llvm.x86.sse2.cmp.sd") llvm_vcmpsd :: proc(a, b: __m128d, #const imm8: u8) -> __m128d --- + @(link_name="llvm.x86.sse.cmp.ss") llvm_vcmpss :: proc(a: __m128, b: __m128, #const imm8: u8) -> __m128 --- + @(link_name="llvm.x86.avx.cvt.ps2dq.256") llvm_vcvtps2dq :: proc(a: __m256) -> #simd[8]i32 --- + @(link_name="llvm.x86.avx.cvtt.pd2dq.256") llvm_vcvttpd2dq :: proc(a: __m256d) -> #simd[4]i32 --- + @(link_name="llvm.x86.avx.cvt.pd2dq.256") llvm_vcvtpd2dq :: proc(a: __m256d) -> #simd[4]i32 --- + @(link_name="llvm.x86.avx.cvtt.ps2dq.256") llvm_vcvttps2dq :: proc(a: __m256) -> #simd[8]i32 --- + @(link_name="llvm.x86.avx.vzeroall") llvm_vzeroall :: proc() --- + @(link_name="llvm.x86.avx.vzeroupper") llvm_vzeroupper :: proc() --- + @(link_name="llvm.x86.avx.vpermilvar.ps.256") llvm_vpermilps256 :: proc(a: __m256, b: #simd[8]i32) -> __m256 --- + @(link_name="llvm.x86.avx.vpermilvar.ps") llvm_vpermilps :: proc(a: __m128, b: #simd[4]i32) -> __m128 --- + @(link_name="llvm.x86.avx.vpermilvar.pd.256") llvm_vpermilpd256 :: proc(a: __m256d, b: #simd[4]i64) -> __m256d --- + @(link_name="llvm.x86.avx.vpermilvar.pd") llvm_vpermilpd :: proc(a: __m128d, b: #simd[2]i64) -> __m128d --- + @(link_name="llvm.x86.avx.ldu.dq.256") llvm_vlddqu :: proc(mem_addr: rawptr) -> #simd[32]i8 --- + @(link_name="llvm.x86.avx.rcp.ps.256") llvm_vrcpps :: proc(a: __m256) -> __m256 --- + @(link_name="llvm.x86.avx.rsqrt.ps.256") llvm_vrsqrtps :: proc(a: __m256) -> __m256 --- + @(link_name="llvm.x86.avx.ptestnzc.256") llvm_ptestnzc256 :: proc(a: #simd[4]i64, b: #simd[4]i64) -> i32 --- + @(link_name="llvm.x86.avx.vtestz.pd.256") llvm_vtestzpd256 :: proc(a, b: __m256d) -> i32 --- + @(link_name="llvm.x86.avx.vtestc.pd.256") llvm_vtestcpd256 :: proc(a, b: __m256d) -> i32 --- + @(link_name="llvm.x86.avx.vtestnzc.pd.256") llvm_vtestnzcpd256 :: proc(a, b: __m256d) -> i32 --- + @(link_name="llvm.x86.avx.vtestnzc.pd") llvm_vtestnzcpd :: proc(a, b: __m128d) -> i32 --- + @(link_name="llvm.x86.avx.vtestz.ps.256") llvm_vtestzps256 :: proc(a, b: __m256) -> i32 --- + @(link_name="llvm.x86.avx.vtestc.ps.256") llvm_vtestcps256 :: proc(a, b: __m256) -> i32 --- + @(link_name="llvm.x86.avx.vtestnzc.ps.256") llvm_vtestnzcps256 :: proc(a, b: __m256) -> i32 --- + @(link_name="llvm.x86.avx.vtestnzc.ps") llvm_vtestnzcps :: proc(a: __m128, b: __m128) -> i32 --- + @(link_name="llvm.x86.avx.min.ps.256") llvm_vminps :: proc(a, b: __m256) -> __m256 --- + @(link_name="llvm.x86.avx.max.ps.256") llvm_vmaxps :: proc(a, b: __m256) -> __m256 --- + @(link_name="llvm.x86.avx.min.pd.256") llvm_vminpd :: proc(a, b: __m256d) -> __m256d --- + @(link_name="llvm.x86.avx.max.pd.256") llvm_vmaxpd :: proc(a, b: __m256d) -> __m256d --- +} From c87d1a3cf6815e15bd41261444dd5f527f246e2c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 8 Apr 2026 15:42:40 +0100 Subject: [PATCH 273/273] Comment out the uncompleted stuff --- core/simd/x86/avx.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/simd/x86/avx.odin b/core/simd/x86/avx.odin index c274f4903..5b0383526 100644 --- a/core/simd/x86/avx.odin +++ b/core/simd/x86/avx.odin @@ -1063,6 +1063,7 @@ _mm256_lddqu_si256 :: #force_inline proc "c" (mem_addr: ^__m256i) -> __m256i { return transmute(__m256i)llvm_vlddqu(mem_addr) } +/* // Moves integer data from a 256-bit integer vector to a 32-byte // aligned memory location. To minimize caching, the data is flagged as // non-temporal (unlikely to be used again soon) @@ -1120,6 +1121,7 @@ _mm256_stream_pd :: #force_inline proc "c" (mem_addr: ^f64, a: __m256d) { _mm256_stream_ps :: #force_inline proc "c" (mem_addr: ^f32, a: __m256) { panic_contextless("TODO: _mm256_stream_ps") } +*/ // Computes the approximate reciprocal of packed single-precision (32-bit) floating-point elements in `a`, and returns the results. The maximum // relative error for this approximation is less than 1.5*2^-12.