diff options
author | qrort <qrort@yandex-team.com> | 2022-12-02 11:31:25 +0300 |
---|---|---|
committer | qrort <qrort@yandex-team.com> | 2022-12-02 11:31:25 +0300 |
commit | b1f4ffc9c8abff3ba58dc1ec9a9f92d2f0de6806 (patch) | |
tree | 2a23209faf0fea5586a6d4b9cee60d1b318d29fe /library/cpp | |
parent | 559174a9144de40d6bb3997ea4073c82289b4974 (diff) | |
download | ydb-b1f4ffc9c8abff3ba58dc1ec9a9f92d2f0de6806.tar.gz |
remove kikimr/driver DEPENDS
Diffstat (limited to 'library/cpp')
455 files changed, 0 insertions, 108723 deletions
diff --git a/library/cpp/actors/log_backend/actor_log_backend.cpp b/library/cpp/actors/log_backend/actor_log_backend.cpp deleted file mode 100644 index a6fdd20c7b4..00000000000 --- a/library/cpp/actors/log_backend/actor_log_backend.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "actor_log_backend.h" - -#include <library/cpp/actors/core/actorsystem.h> -#include <library/cpp/actors/core/log.h> -#include <library/cpp/logger/record.h> - -namespace { - -NActors::NLog::EPriority GetActorLogPriority(ELogPriority priority) { - switch (priority) { - case TLOG_EMERG: - return NActors::NLog::PRI_EMERG; - case TLOG_ALERT: - return NActors::NLog::PRI_ALERT; - case TLOG_CRIT: - return NActors::NLog::PRI_CRIT; - case TLOG_ERR: - return NActors::NLog::PRI_ERROR; - case TLOG_WARNING: - return NActors::NLog::PRI_WARN; - case TLOG_NOTICE: - return NActors::NLog::PRI_NOTICE; - case TLOG_INFO: - return NActors::NLog::PRI_INFO; - case TLOG_DEBUG: - return NActors::NLog::PRI_DEBUG; - default: - return NActors::NLog::PRI_TRACE; - } -} - -} - -TActorLogBackend::TActorLogBackend(NActors::TActorSystem* actorSystem, int logComponent) - : ActorSystem(actorSystem) - , LogComponent(logComponent) -{ -} - -void TActorLogBackend::WriteData(const TLogRecord& rec) { - LOG_LOG(*ActorSystem, GetActorLogPriority(rec.Priority), LogComponent, TString(rec.Data, rec.Len)); -} diff --git a/library/cpp/actors/log_backend/actor_log_backend.h b/library/cpp/actors/log_backend/actor_log_backend.h deleted file mode 100644 index a51427d498d..00000000000 --- a/library/cpp/actors/log_backend/actor_log_backend.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -#include <library/cpp/logger/backend.h> - -namespace NActors { -class TActorSystem; -} // namespace NActors - -class TActorLogBackend : public TLogBackend { -public: - TActorLogBackend(NActors::TActorSystem* actorSystem, int logComponent); - - void WriteData(const TLogRecord& rec) override; - - void ReopenLog() override { - } - -private: - NActors::TActorSystem* const ActorSystem; - const int LogComponent; -}; diff --git a/library/cpp/containers/concurrent_hash/concurrent_hash.h b/library/cpp/containers/concurrent_hash/concurrent_hash.h deleted file mode 100644 index f15a1c3d6ec..00000000000 --- a/library/cpp/containers/concurrent_hash/concurrent_hash.h +++ /dev/null @@ -1,128 +0,0 @@ -#pragma once - -#include <util/generic/hash.h> -#include <util/system/spinlock.h> - -#include <array> - -template <typename K, typename V, size_t BucketCount = 64, typename L = TAdaptiveLock> -class TConcurrentHashMap { -public: - using TActualMap = THashMap<K, V>; - using TLock = L; - - struct TBucket { - friend class TConcurrentHashMap; - - private: - TActualMap Map; - mutable TLock Mutex; - - public: - TLock& GetMutex() const { - return Mutex; - } - - TActualMap& GetMap() { - return Map; - } - const TActualMap& GetMap() const { - return Map; - } - - const V& GetUnsafe(const K& key) const { - typename TActualMap::const_iterator it = Map.find(key); - Y_VERIFY(it != Map.end(), "not found by key"); - return it->second; - } - - V& GetUnsafe(const K& key) { - typename TActualMap::iterator it = Map.find(key); - Y_VERIFY(it != Map.end(), "not found by key"); - return it->second; - } - - V RemoveUnsafe(const K& key) { - typename TActualMap::iterator it = Map.find(key); - Y_VERIFY(it != Map.end(), "removing non-existent key"); - V r = std::move(it->second); - Map.erase(it); - return r; - } - - bool HasUnsafe(const K& key) const { - typename TActualMap::const_iterator it = Map.find(key); - return (it != Map.end()); - } - }; - - std::array<TBucket, BucketCount> Buckets; - -public: - TBucket& GetBucketForKey(const K& key) { - return Buckets[THash<K>()(key) % BucketCount]; - } - - const TBucket& GetBucketForKey(const K& key) const { - return Buckets[THash<K>()(key) % BucketCount]; - } - - void Insert(const K& key, const V& value) { - TBucket& bucket = GetBucketForKey(key); - TGuard<TLock> guard(bucket.Mutex); - bucket.Map[key] = value; - } - - void InsertUnique(const K& key, const V& value) { - TBucket& bucket = GetBucketForKey(key); - TGuard<TLock> guard(bucket.Mutex); - if (!bucket.Map.insert(std::make_pair(key, value)).second) { - Y_FAIL("non-unique key"); - } - } - - V& InsertIfAbsent(const K& key, const V& value) { - TBucket& bucket = GetBucketForKey(key); - TGuard<TLock> guard(bucket.Mutex); - return bucket.Map.insert(std::make_pair(key, value)).first->second; - } - - template <typename Callable> - V& InsertIfAbsentWithInit(const K& key, Callable initFunc) { - TBucket& bucket = GetBucketForKey(key); - TGuard<TLock> guard(bucket.Mutex); - if (bucket.HasUnsafe(key)) { - return bucket.GetUnsafe(key); - } - - return bucket.Map.insert(std::make_pair(key, initFunc())).first->second; - } - - V Get(const K& key) const { - const TBucket& bucket = GetBucketForKey(key); - TGuard<TLock> guard(bucket.Mutex); - return bucket.GetUnsafe(key); - } - - bool Get(const K& key, V& result) const { - const TBucket& bucket = GetBucketForKey(key); - TGuard<TLock> guard(bucket.Mutex); - if (bucket.HasUnsafe(key)) { - result = bucket.GetUnsafe(key); - return true; - } - return false; - } - - V Remove(const K& key) { - TBucket& bucket = GetBucketForKey(key); - TGuard<TLock> guard(bucket.Mutex); - return bucket.RemoveUnsafe(key); - } - - bool Has(const K& key) const { - const TBucket& bucket = GetBucketForKey(key); - TGuard<TLock> guard(bucket.Mutex); - return bucket.HasUnsafe(key); - } -}; diff --git a/library/cpp/containers/str_hash/str_hash.cpp b/library/cpp/containers/str_hash/str_hash.cpp deleted file mode 100644 index 12986385334..00000000000 --- a/library/cpp/containers/str_hash/str_hash.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "str_hash.h" - -#include <library/cpp/charset/ci_string.h> -#include <util/stream/output.h> -#include <util/stream/input.h> - -HashSet::HashSet(const char** array, size_type size) { - Resize(size); - while (*array && **array) - AddPermanent(*array++); -} - -void HashSet::Read(IInputStream* input) { - TString s; - - while (input->ReadLine(s)) { - AddUniq(TCiString(s).c_str()); - } -} - -void HashSet::Write(IOutputStream* output) const { - for (const auto& it : *this) { - *output << it.first << "\n"; - } -} - -#ifdef TEST_STRHASH -#include <ctime> -#include <fstream> -#include <cstdio> -#include <cstdlib> - -using namespace std; - -int main(int argc, char* argv[]) { - if (argc < 2) { - printf("usage: stoplist <stop-words file ...\n"); - exit(EXIT_FAILURE); // FreeBSD: EX_USAGE - } - Hash hash; - hash.Read(cin); - for (--argc, ++argv; argc > 0; --argc, ++argv) { - ifstream input(argv[0]); - if (!input.good()) { - perror(argv[0]); - continue; - } - TCiString s; - while (input >> s) { - if (!hash.Has(s)) - cout << s << "\n"; - else - cout << "[[" << s << "]]" - << "\n"; - } - } - return EXIT_SUCCESS; // EX_OK -} - -#endif diff --git a/library/cpp/containers/str_hash/str_hash.h b/library/cpp/containers/str_hash/str_hash.h deleted file mode 100644 index 25f960dbb5f..00000000000 --- a/library/cpp/containers/str_hash/str_hash.h +++ /dev/null @@ -1,181 +0,0 @@ -#pragma once - -#include <library/cpp/containers/str_map/str_map.h> -#include <library/cpp/charset/ci_string.h> -#include <util/system/yassert.h> -#include <util/memory/tempbuf.h> - -#include <memory> - -class IInputStream; -class IOutputStream; - -template <class T, class Alloc = std::allocator<const char*>> -class Hash; - -struct yvoid { - yvoid() = default; -}; - -template <typename T, class Alloc> -class Hash: public string_hash<T, ci_hash, ci_equal_to, Alloc> { - using ci_string_hash = string_hash<T, ci_hash, ci_equal_to, Alloc>; - -protected: - using ci_string_hash::pool; - -public: - using size_type = typename ci_string_hash::size_type; - using const_iterator = typename ci_string_hash::const_iterator; - using iterator = typename ci_string_hash::iterator; - using value_type = typename ci_string_hash::value_type; - using ci_string_hash::begin; - using ci_string_hash::end; - using ci_string_hash::find; - using ci_string_hash::size; - - Hash() - : ci_string_hash() - { - } - explicit Hash(size_type theSize) - : ci_string_hash(theSize, theSize * AVERAGEWORD_BUF) - { - } - Hash(const char** strings, size_type size = 0, T* = 0); // must end with NULL or "\0" - virtual ~Hash(); - bool Has(const char* s, size_t len, T* pp = nullptr) const; - bool Has(const char* s, T* pp = nullptr) const { - const_iterator it; - if ((it = find(s)) == end()) - return false; - else if (pp) - *pp = (*it).second; - return true; - } - void Add(const char* s, T data) { - // in fact it is the same insert_unique as in AddUnique. - // it's impossible to have _FAST_ version of insert() in 'hash_map' - - // you have to use 'hash_mmap' to get the _kind_ of desired effect. - // BUT still there will be "Checks" inside - - // to make the same keys close to each other (see insert_equal()) - this->insert_copy(s, data); - } - bool AddUniq(const char* s, T data) { - return this->insert_copy(s, data).second; - } - // new function to get rid of allocations completely! -- e.g. in constructors - void AddPermanent(const char* s, T data) { - this->insert(value_type(s, data)); - } - T Detach(const char* s) { - iterator it = find(s); - if (it == end()) - return T(); - T data = (*it).second; - this->erase(it); - return data; - } - size_type NumEntries() const { - return size(); - } - bool ForEach(bool (*func)(const char* key, T data, void* cookie), void* cookie = nullptr); - void Resize(size_type theSize) { - this->reserve(theSize); - // no pool resizing here. - } - virtual void Clear(); - char* Pool() { - if (pool.Size() < 2 || pool.End()[-2] != '\0') - pool.Append("\0", 1); - return pool.Begin(); - } -}; - -template <class T, class Alloc> -Hash<T, Alloc>::Hash(const char** array, size_type theSize, T* data) { - // must end with NULL or "\0" - Y_ASSERT(data != nullptr); - Resize(theSize); - while (*array && **array) - AddPermanent(*array++, *data++); -} - -template <class T, class Alloc> -bool Hash<T, Alloc>::Has(const char* s, size_t len, T* pp) const { - TTempArray<char> buf(len + 1); - char* const allocated = buf.Data(); - memcpy(allocated, s, len); - allocated[len] = '\x00'; - return Has(allocated, pp); -} - -template <class T, class Alloc> -Hash<T, Alloc>::~Hash() { - Clear(); -} - -template <class T, class Alloc> -void Hash<T, Alloc>::Clear() { - ci_string_hash::clear_hash(); // to make the key pool empty -} - -template <class T, class Alloc> -bool Hash<T, Alloc>::ForEach(bool (*func)(const char* key, T data, void* cookie), void* cookie) { - for (const_iterator it = begin(); it != end(); ++it) - if (!func((*it).first, (*it).second, cookie)) - return false; - return true; -} - -class HashSet: public Hash<yvoid> { -public: - HashSet(const char** array, size_type size = 0); - HashSet() - : Hash<yvoid>() - { - } - void Read(IInputStream* input); - void Write(IOutputStream* output) const; - void Add(const char* s) { - // in fact it is the same insert_unique as in AddUnique. - // it's impossible to have _FAST_ version of insert() in 'hash_map' - - // you have to use 'hash_mmap' to get the _kind_ of desired effect. - // BUT still there will be "Checks" inside - - // to make the same keys close to each other (see insert_equal()) - insert_copy(s, yvoid()); - } - bool AddUniq(const char* s) { - return insert_copy(s, yvoid()).second; - } - // new function to get rid of allocations completely! -- e.g. in constructors - void AddPermanent(const char* s) { - insert(value_type(s, yvoid())); - } -}; - -template <class T, class HashFcn = THash<T>, class EqualKey = TEqualTo<T>, class Alloc = std::allocator<T>> -class TStaticHash: private THashMap<T, T, HashFcn, EqualKey> { -private: - using TBase = THashMap<T, T, HashFcn, EqualKey>; - -public: - TStaticHash(T arr[][2], size_t size) { - TBase::reserve(size); - while (size) { - TBase::insert(typename TBase::value_type(arr[0][0], arr[0][1])); - arr++; - size--; - } - } - T operator[](const T& key) const { // !!! it is not lvalue nor it used to be - typename TBase::const_iterator it = TBase::find(key); - if (it == TBase::end()) - return nullptr; - return it->second; - } -}; - -using TStHash = TStaticHash<const char*, ci_hash, ci_equal_to>; diff --git a/library/cpp/coroutine/dns/async.cpp b/library/cpp/coroutine/dns/async.cpp deleted file mode 100644 index be35135828c..00000000000 --- a/library/cpp/coroutine/dns/async.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include "async.h" - -#include <util/generic/singleton.h> -#include <util/generic/vector.h> - -#include <contrib/libs/c-ares/include/ares.h> - -using namespace NAsyncDns; - -namespace { - struct TAresError: public TDnsError { - inline TAresError(int code) { - (*this) << ares_strerror(code); - } - }; - - struct TAresInit { - inline TAresInit() { - const int code = ares_library_init(ARES_LIB_INIT_ALL); - - if (code) { - ythrow TAresError(code) << "can not init ares engine"; - } - } - - inline ~TAresInit() { - ares_library_cleanup(); - } - - static inline void InitOnce() { - Singleton<TAresInit>(); - } - }; -} - -class TAsyncDns::TImpl { -public: - inline TImpl(IPoller* poller, const TOptions& o) - : P_(poller) - { - TAresInit::InitOnce(); - - ares_options opts; - - Zero(opts); - - int optflags = 0; - - optflags |= ARES_OPT_FLAGS; - opts.flags = ARES_FLAG_STAYOPEN; - - optflags |= ARES_OPT_TIMEOUTMS; - opts.timeout = o.TimeOut.MilliSeconds(); - - optflags |= ARES_OPT_TRIES; - opts.tries = o.Retries; - - optflags |= ARES_OPT_SOCK_STATE_CB; - opts.sock_state_cb = (decltype(opts.sock_state_cb))StateCb; - static_assert(sizeof(opts.sock_state_cb) == sizeof(&StateCb), "Inconsistent socket state size"); - opts.sock_state_cb_data = this; - - const int code = ares_init_options(&H_, &opts, optflags); - - if (code) { - ythrow TAresError(code) << "can not init ares channel"; - } - } - - inline ~TImpl() { - ares_destroy(H_); - } - - inline TDuration Timeout() { - struct timeval tv; - Zero(tv); - - ares_timeout(H_, nullptr, &tv); - - return TDuration(tv); - } - - template <class T> - inline void ProcessSocket(T s) { - ares_process_fd(H_, s, s); - } - - inline void ProcessNone() { - ProcessSocket(ARES_SOCKET_BAD); - } - - inline void AsyncResolve(const TNameRequest& req) { - ares_gethostbyname(H_, req.Addr, req.Family, AsyncResolveHostCb, req.CB); - } - -private: - static void StateCb(void* arg, int s, int read, int write) { - ((TImpl*)arg)->P_->OnStateChange((SOCKET)s, (bool)read, (bool)write); - } - - static void AsyncResolveHostCb(void* arg, int status, int timeouts, hostent* he) { - const IHostResult::TResult res = { - status, timeouts, he}; - - ((IHostResult*)arg)->OnComplete(res); - } - -private: - IPoller* P_; - ares_channel H_; -}; - -void NAsyncDns::CheckAsyncStatus(int status) { - if (status) { - ythrow TAresError(status); - } -} - -void NAsyncDns::CheckPartialAsyncStatus(int status) { - if (status == ARES_ENODATA) { - return; - } - - CheckAsyncStatus(status); -} - -TAsyncDns::TAsyncDns(IPoller* poller, const TOptions& opts) - : I_(new TImpl(poller, opts)) -{ -} - -TAsyncDns::~TAsyncDns() { -} - -void TAsyncDns::AsyncResolve(const TNameRequest& req) { - I_->AsyncResolve(req); -} - -TDuration TAsyncDns::Timeout() { - return I_->Timeout(); -} - -void TAsyncDns::ProcessSocket(SOCKET s) { - I_->ProcessSocket(s); -} - -void TAsyncDns::ProcessNone() { - I_->ProcessNone(); -} diff --git a/library/cpp/coroutine/dns/async.h b/library/cpp/coroutine/dns/async.h deleted file mode 100644 index 1ec26bc91d7..00000000000 --- a/library/cpp/coroutine/dns/async.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "iface.h" - -#include <util/network/socket.h> -#include <util/datetime/base.h> -#include <util/generic/ptr.h> - -namespace NAsyncDns { - struct IPoller { - virtual void OnStateChange(SOCKET s, bool read, bool write) = 0; - }; - - class TAsyncDns { - public: - TAsyncDns(IPoller* poller, const TOptions& opts = TOptions()); - ~TAsyncDns(); - - void AsyncResolve(const TNameRequest& req); - - TDuration Timeout(); - void ProcessSocket(SOCKET s); - void ProcessNone(); - - private: - class TImpl; - THolder<TImpl> I_; - }; - - void CheckAsyncStatus(int status); - void CheckPartialAsyncStatus(int status); -} diff --git a/library/cpp/coroutine/dns/cache.cpp b/library/cpp/coroutine/dns/cache.cpp deleted file mode 100644 index 69910a79601..00000000000 --- a/library/cpp/coroutine/dns/cache.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include "cache.h" - -#include "async.h" -#include "coro.h" -#include "helpers.h" - -#include <library/cpp/cache/cache.h> - -#include <library/cpp/coroutine/engine/impl.h> -#include <library/cpp/coroutine/engine/events.h> - -using namespace NAddr; -using namespace NAsyncDns; - -class TContDnsCache::TImpl { - using TKey = std::pair<TString, ui16>; - - enum EResolveState { - RS_NOT_RESOLVED, - RS_IN_PROGRESS, - RS_RESOLVED, - RS_FAILED, - RS_EXPIRED - }; - - struct TEntry: public TSimpleRefCount<TEntry> { - TAddrs Addrs_; - TInstant ResolveTimestamp_; - EResolveState State_; - TContSimpleEvent ResolvedEvent_; - TString LastResolveError_; - - TEntry(TContExecutor* e) - : State_(RS_NOT_RESOLVED) - , ResolvedEvent_(e) - { - } - }; - - using TEntryRef = TIntrusivePtr<TEntry>; - -public: - inline TImpl(TContExecutor* e, const TCacheOptions& opts) - : Executor_(e) - , Opts_(opts) - , Cache_(opts.MaxSize) - { - } - - inline ~TImpl() { - } - - void LookupOrResolve(TContResolver& resolver, const TString& addr, ui16 port, TAddrs& result) { - TKey cacheKey(addr, port); - - TEntryRef e; - auto iter = Cache_.Find(cacheKey); - if (iter == Cache_.End()) { - e = MakeIntrusive<TEntry>(Executor_); - Cache_.Insert(cacheKey, e); - } else { - e = iter.Value(); - } - - while (true) { - switch (e->State_) { - case RS_NOT_RESOLVED: - case RS_EXPIRED: - e->State_ = RS_IN_PROGRESS; - try { - ResolveAddr(resolver, addr, port, result); - } catch (TDnsError& err) { - e->ResolveTimestamp_ = TInstant::Now(); - e->LastResolveError_ = err.AsStrBuf(); - e->State_ = RS_FAILED; - e->ResolvedEvent_.BroadCast(); - throw; - } catch (...) { - // errors not related to DNS - e->State_ = RS_NOT_RESOLVED; - e->ResolvedEvent_.BroadCast(); - throw; - } - e->ResolveTimestamp_ = TInstant::Now(); - e->Addrs_ = result; - e->State_ = RS_RESOLVED; - e->ResolvedEvent_.BroadCast(); - return; - case RS_IN_PROGRESS: - e->ResolvedEvent_.WaitI(); - continue; - case RS_RESOLVED: - if (e->ResolveTimestamp_ + Opts_.EntryLifetime < TInstant::Now()) { - e->State_ = RS_EXPIRED; - continue; // try and resolve again - } - result = e->Addrs_; - return; - case RS_FAILED: - if (e->ResolveTimestamp_ + Opts_.NotFoundLifetime < TInstant::Now()) { - e->State_ = RS_EXPIRED; - continue; // try and resolve again - } - ythrow TDnsError() << e->LastResolveError_; - default: - Y_FAIL("Bad state, shoult not get here"); - }; - } - } - -private: - TContExecutor* Executor_; - const TCacheOptions Opts_; - TLRUCache<TKey, TEntryRef> Cache_; -}; - -TContDnsCache::TContDnsCache(TContExecutor* e, const NAsyncDns::TCacheOptions& opts) - : I_(MakeHolder<TImpl>(e, opts)) -{ -} - -TContDnsCache::~TContDnsCache() { -} - -void TContDnsCache::LookupOrResolve(TContResolver& resolver, const TString& addr, ui16 port, TVector<NAddr::IRemoteAddrRef>& result) { - return I_->LookupOrResolve(resolver, addr, port, result); -} - -void TContDnsCache::LookupOrResolve(TContResolver& resolver, const TString& addr, TVector<NAddr::IRemoteAddrRef>& result) { - LookupOrResolve(resolver, addr, 80, result); -} diff --git a/library/cpp/coroutine/dns/cache.h b/library/cpp/coroutine/dns/cache.h deleted file mode 100644 index 7c358ce591f..00000000000 --- a/library/cpp/coroutine/dns/cache.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include "iface.h" - -#include <util/generic/ptr.h> -#include <util/generic/vector.h> -#include <util/network/address.h> - -class TContExecutor; - -namespace NAsyncDns { - class TContResolver; - - struct TCacheOptions { - inline TCacheOptions() { - } - - inline TCacheOptions& SetEntryLifetime(const TDuration& val) noexcept { - EntryLifetime = val; - - return *this; - } - - inline TCacheOptions& SetNotFoundLifetime(const TDuration& val) noexcept { - NotFoundLifetime = val; - - return *this; - } - - inline TCacheOptions& SetMaxSize(size_t val) noexcept { - MaxSize = val; - - return *this; - } - - size_t MaxSize = 512; - TDuration EntryLifetime = TDuration::Seconds(1800); - TDuration NotFoundLifetime = TDuration::Seconds(1); - }; - - // MT-unsafe LRU DNS cache - class TContDnsCache { - public: - TContDnsCache(TContExecutor* e, const TCacheOptions& opts = {}); - ~TContDnsCache(); - - void LookupOrResolve(TContResolver& resolver, const TString& addr, ui16 port, TVector<NAddr::IRemoteAddrRef>& result); - void LookupOrResolve(TContResolver& resolver, const TString& addr, TVector<NAddr::IRemoteAddrRef>& result); - - private: - class TImpl; - THolder<TImpl> I_; - }; -} diff --git a/library/cpp/coroutine/dns/coro.cpp b/library/cpp/coroutine/dns/coro.cpp deleted file mode 100644 index 9d6a89f6e75..00000000000 --- a/library/cpp/coroutine/dns/coro.cpp +++ /dev/null @@ -1,225 +0,0 @@ -#include "coro.h" - -#include "async.h" - -#include <library/cpp/coroutine/engine/events.h> -#include <library/cpp/coroutine/engine/impl.h> - -#include <util/generic/vector.h> -#include <util/memory/smallobj.h> - -using namespace NAsyncDns; - -class TContResolver::TImpl: public IPoller { - struct TPollEvent: - public NCoro::IPollEvent, - public TIntrusiveListItem<TPollEvent>, - public TObjectFromPool<TPollEvent> - { - inline TPollEvent(TImpl* parent, SOCKET s, int what) - : IPollEvent(s, what) - , P(parent) - { - P->E_->Poller()->Schedule(this); - } - - inline ~TPollEvent() override { - P->E_->Poller()->Remove(this); - } - - void OnPollEvent(int) noexcept override { - P->D_.ProcessSocket(Fd()); - } - - TImpl* P; - }; - - typedef TAutoPtr<TPollEvent> TEventRef; - - struct TOneShotEvent { - inline TOneShotEvent(TContExecutor* e) noexcept - : E(e) - , S(false) - { - } - - inline void Signal() noexcept { - S = true; - E.Signal(); - } - - inline void Wait() noexcept { - if (S) { - return; - } - - E.WaitI(); - } - - TContSimpleEvent E; - bool S; - }; - - struct TContSemaphore { - inline TContSemaphore(TContExecutor* e, size_t num) noexcept - : E(e) - , N(num) - { - } - - inline void Acquire() noexcept { - while (!N) { - E.WaitI(); - } - - --N; - } - - inline void Release() noexcept { - ++N; - E.Signal(); - } - - TContSimpleEvent E; - size_t N; - }; - - struct TRequest: public TIntrusiveListItem<TRequest>, public TOneShotEvent, public IHostResult { - inline TRequest(const TNameRequest* req, TContExecutor* e) - : TOneShotEvent(e) - , Req(req) - { - } - - void OnComplete(const TResult& res) override { - Req->CB->OnComplete(res); - Signal(); - } - - const TNameRequest* Req; - }; - -public: - inline TImpl(TContExecutor* e, const TOptions& opts) - : P_(TDefaultAllocator::Instance()) - , E_(e) - , RateLimit_(E_, opts.MaxRequests) - , D_(this, opts) - , DC_(nullptr) - { - } - - inline ~TImpl() { - Y_VERIFY(DC_ == nullptr, "shit happens"); - } - - inline void Resolve(const TNameRequest& hreq) { - TGuard<TContSemaphore> g(RateLimit_); - - if (hreq.Family == AF_UNSPEC) { - const TNameRequest hreq1(hreq.Copy(AF_INET)); - TRequest req1(&hreq1, E_); - - const TNameRequest hreq2(hreq.Copy(AF_INET6)); - TRequest req2(&hreq2, E_); - - Schedule(&req1); - Schedule(&req2); - - req1.Wait(); - req2.Wait(); - } else { - TRequest req(&hreq, E_); - - Schedule(&req); - - req.Wait(); - } - - if (A_.Empty() && DC_) { - DC_->ReSchedule(); - } - } - -private: - inline void Schedule(TRequest* req) { - D_.AsyncResolve(req->Req->Copy(req)); - A_.PushBack(req); - ResolveCont()->ReSchedule(); - } - - inline TCont* ResolveCont() { - if (!DC_) { - DC_ = E_->Create<TImpl, &TImpl::RunAsyncDns>(this, "async_dns"); - } - - return DC_; - } - - void RunAsyncDns(TCont*) { - while (!A_.Empty()) { - Y_VERIFY(!I_.Empty(), "shit happens"); - - const TDuration tout = D_.Timeout(); - - if (E_->Running()->SleepT(Max(tout, TDuration::MilliSeconds(10))) == ETIMEDOUT) { - D_.ProcessNone(); - } - - DC_->Yield(); - } - - DC_ = nullptr; - } - - void OnStateChange(SOCKET s, bool read, bool write) noexcept override { - static const ui16 WHAT[] = { - 0, CONT_POLL_READ, CONT_POLL_WRITE, CONT_POLL_READ | CONT_POLL_WRITE}; - - const int what = WHAT[((size_t)read) | (((size_t)write) << 1)]; - - TEventRef& ev = S_.Get(s); - - if (!ev) { - ev.Reset(new (&P_) TPollEvent(this, s, what)); - I_.PushBack(ev.Get()); - } else { - if (what) { - if (ev->What() != what) { - //may optimize - ev.Reset(new (&P_) TPollEvent(this, s, what)); - I_.PushBack(ev.Get()); - } - } else { - ev.Destroy(); - //auto unlink - } - } - - if (DC_) { - DC_->ReSchedule(); - } - } - -private: - TSocketMap<TEventRef> S_; - TPollEvent::TPool P_; - TContExecutor* E_; - TContSemaphore RateLimit_; - TAsyncDns D_; - TIntrusiveList<TPollEvent> I_; - TIntrusiveList<TRequest> A_; - TCont* DC_; -}; - -TContResolver::TContResolver(TContExecutor* e, const TOptions& opts) - : I_(new TImpl(e, opts)) -{ -} - -TContResolver::~TContResolver() { -} - -void TContResolver::Resolve(const TNameRequest& req) { - I_->Resolve(req); -} diff --git a/library/cpp/coroutine/dns/coro.h b/library/cpp/coroutine/dns/coro.h deleted file mode 100644 index 62a01891b8a..00000000000 --- a/library/cpp/coroutine/dns/coro.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "iface.h" - -#include <util/generic/ptr.h> -#include <util/generic/ylimits.h> - -class TContExecutor; - -namespace NAsyncDns { - class TContResolver { - public: - TContResolver(TContExecutor* e, const TOptions& opts = TOptions()); - ~TContResolver(); - - void Resolve(const TNameRequest& hreq); - - private: - class TImpl; - THolder<TImpl> I_; - }; -} diff --git a/library/cpp/coroutine/dns/helpers.cpp b/library/cpp/coroutine/dns/helpers.cpp deleted file mode 100644 index 21d17b5d674..00000000000 --- a/library/cpp/coroutine/dns/helpers.cpp +++ /dev/null @@ -1,148 +0,0 @@ -#include "helpers.h" -#include "coro.h" -#include "async.h" -#include "cache.h" - -#include <util/digest/city.h> -#include <util/generic/hash_set.h> - -using namespace NAddr; -using namespace NAsyncDns; - -namespace { - typedef ui64 TAddrHash; - - inline TAddrHash Hash(const IRemoteAddrRef& addr) { - return CityHash64((const char*)addr->Addr(), addr->Len()); - } - - inline IRemoteAddrRef ConstructIP4(void* data, ui16 port) { - return new TIPv4Addr(TIpAddress(*(ui32*)data, port)); - } - - inline IRemoteAddrRef ConstructIP6(void* data, ui16 port) { - sockaddr_in6 res; - - Zero(res); - - res.sin6_family = AF_INET6; - res.sin6_port = HostToInet(port); - memcpy(&res.sin6_addr.s6_addr, data, sizeof(res.sin6_addr.s6_addr)); - - return new TIPv6Addr(res); - } - - inline IRemoteAddrRef Construct(const hostent* h, void* data, ui16 port) { - switch (h->h_addrtype) { - case AF_INET: - return ConstructIP4(data, port); - - case AF_INET6: - return ConstructIP6(data, port); - } - - //real shit happens - abort(); - } - - template <class It, class T> - static bool FindByHash(It b, It e, T t) { - while (b != e) { - if (Hash(*b) == t) { - return true; - } - - ++b; - } - - return false; - } - - inline size_t LstLen(char** lst) noexcept { - size_t ret = 0; - - while (*lst) { - ++ret; - ++lst; - } - - return ret; - } -} - -void TResolveAddr::OnComplete(const TResult& r) { - const hostent* h = r.Result; - - if (!h) { - Status.push_back(r.Status); - - return; - } - - char** lst = h->h_addr_list; - - typedef THashSet<TAddrHash> THashes; - TAutoPtr<THashes> hashes; - - if ((Result.size() + LstLen(lst)) > 8) { - hashes.Reset(new THashes()); - - for (const auto& it : Result) { - hashes->insert(Hash(it)); - } - } - - while (*lst) { - IRemoteAddrRef addr = Construct(h, *lst, Port); - - if (!hashes) { - if (!FindByHash(Result.begin(), Result.end(), Hash(addr))) { - Result.push_back(addr); - } - } else { - const TAddrHash h = Hash(addr); - - if (hashes->find(h) == hashes->end()) { - hashes->insert(h); - Result.push_back(addr); - } - } - - ++lst; - } -} - -void NAsyncDns::ResolveAddr(TContResolver& resolver, const TString& host, ui16 port, TAddrs& result) { - TResolveAddr cb(port); - - resolver.Resolve(TNameRequest(host.data(), AF_UNSPEC, &cb)); - - if (cb.Result) { - for (auto status : cb.Status) { - //we have some results, so skip empty responses for aaaa requests - CheckPartialAsyncStatus(status); - } - } else { - for (auto status : cb.Status) { - CheckAsyncStatus(status); - } - } - - cb.Result.swap(result); -} - -void NAsyncDns::ResolveAddr(TContResolver& resolver, const TString& addr, TAddrs& result) { - ResolveAddr(resolver, addr, 80, result); -} - -void NAsyncDns::ResolveAddr(TContResolver& resolver, const TString& host, ui16 port, TAddrs& result, TContDnsCache* cache) { - if (cache) { - cache->LookupOrResolve(resolver, host, port, result); - } else { - ResolveAddr(resolver, host, port, result); - } -} - -void NAsyncDns::ResolveAddr(TContResolver& resolver, const TString& addr, TAddrs& result, TContDnsCache* cache) { - ResolveAddr(resolver, addr, 80, result, cache); -} diff --git a/library/cpp/coroutine/dns/helpers.h b/library/cpp/coroutine/dns/helpers.h deleted file mode 100644 index 5f3cc8676fd..00000000000 --- a/library/cpp/coroutine/dns/helpers.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "iface.h" - -#include <util/network/address.h> -#include <util/generic/vector.h> - -namespace NAsyncDns { - class TContResolver; - class TContDnsCache; - using NAddr::IRemoteAddrRef; - - typedef TVector<IRemoteAddrRef> TAddrs; - - struct TResolveAddr: public IHostResult { - inline TResolveAddr(ui16 port) - : Port(port) - , Status(0) - { - } - - void OnComplete(const TResult& result) override; - - TAddrs Result; - ui16 Port; - TVector<int> Status; - }; - - //resolve addr(host + port), like TNetworkAddress - void ResolveAddr(TContResolver& resolver, const TString& addr, TAddrs& result); - void ResolveAddr(TContResolver& resolver, const TString& host, ui16 port, TAddrs& result); - void ResolveAddr(TContResolver& resolver, const TString& addr, TAddrs& result, TContDnsCache* cache); - void ResolveAddr(TContResolver& resolver, const TString& host, ui16 port, TAddrs& result, TContDnsCache* cache); -} diff --git a/library/cpp/coroutine/dns/iface.h b/library/cpp/coroutine/dns/iface.h deleted file mode 100644 index 0310f48f8fd..00000000000 --- a/library/cpp/coroutine/dns/iface.h +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once - -#include <util/datetime/base.h> -#include <util/generic/yexception.h> - -struct hostent; - -namespace NAsyncDns { - struct TOptions { - inline TOptions() - : MaxRequests(Max()) - , Retries(5) - , TimeOut(TDuration::MilliSeconds(50)) - { - } - - inline TOptions& SetMaxRequests(size_t val) noexcept { - MaxRequests = val; - - return *this; - } - - inline TOptions& SetRetries(size_t val) noexcept { - Retries = val; - - return *this; - } - - inline TOptions& SetTimeOut(const TDuration& val) noexcept { - TimeOut = val; - - return *this; - } - - size_t MaxRequests; - size_t Retries; - TDuration TimeOut; - }; - - struct IHostResult { - struct TResult { - int Status; - int Timeouts; - const hostent* Result; - }; - - virtual ~IHostResult() = default; - - virtual void OnComplete(const TResult& result) = 0; - }; - - struct TNameRequest { - inline TNameRequest(const char* addr, int family, IHostResult* cb) - : Addr(addr) - , Family(family) - , CB(cb) - { - } - - inline TNameRequest Copy(IHostResult* cb) const noexcept { - return TNameRequest(Addr, Family, cb); - } - - inline TNameRequest Copy(int family) const noexcept { - return TNameRequest(Addr, family, CB); - } - - const char* Addr; - int Family; - IHostResult* CB; - }; - - struct TDnsError: public yexception { - }; -} diff --git a/library/cpp/coroutine/util/cosem.h b/library/cpp/coroutine/util/cosem.h deleted file mode 100644 index 5ed41a9669a..00000000000 --- a/library/cpp/coroutine/util/cosem.h +++ /dev/null @@ -1,433 +0,0 @@ -#pragma once - -#include <library/cpp/coroutine/engine/events.h> -#include <library/cpp/coroutine/engine/impl.h> -#include <library/cpp/coroutine/engine/mutex.h> -#include <library/cpp/coroutine/engine/network.h> - -#include <util/network/pair.h> -#include <util/network/poller.h> -#include <library/cpp/deprecated/atomic/atomic.h> -#include <util/system/yield.h> -#include <util/generic/noncopyable.h> - -/***************************************************************** - TContSemaphore - ^ - | - TCoSemaphore - ^ - | - TCoMutex - *****************************************************************/ - -/* - * Note: this semaphore does not try to be thread-safe. - * It is intended to use within coroutines in single thread only. - * Do not share it between threads. Use TContMtSpinlock instead. - */ - -class TContSemaphore { -public: - inline TContSemaphore(const unsigned int initial) - : mValue(initial) - { - } - - inline bool Acquire(TCont* cont) { - while (!mValue) { - mWaitQueue.WaitI(cont); - } - --mValue; - return true; - } - - inline bool Release(TCont*) { - ++mValue; - mWaitQueue.Signal(); - return true; - } - - inline bool TryAcquire(TCont*) { - if (!mValue) { - return false; - } - --mValue; - return true; - } - -protected: - TAtomic mValue; - TContWaitQueue mWaitQueue; -}; - -/***************************************************************** - TContMtSyncBase - ^ ^ - / \ - / \ - TContMtSpinlock TContMtSemaphore - ^ - | - TCoMtSpinlock - *****************************************************************/ -class TContMtSyncBase { -public: - static inline void Yield(TCont* cont) { - //printf("yield() called with cont=%p in thread %p\n", cont, pthread_self()); fflush(stdout); - if (cont) { - // Bugfeature workaround: coroutine Yield() in loop would make our priority too high to receive any other events - // so we probably never come out of this loop. So better use Sleep() instead. Unlike Yield(), Sleep(0) - // makes all pending I/Os have higher priority than us. - cont->SleepT(TDuration::Zero()); - } else { - ThreadYield(); - } - } - - static inline void SleepT(TCont* cont, unsigned time) { - if (cont) { - cont->SleepT(TDuration::MicroSeconds(time)); - } else { - ::usleep(time); - } - } -}; - -/* - * Thread-safe version of TContMutex - */ - -class TContMtSpinlock: private TContMtSyncBase { -public: - TContMtSpinlock() - : mToken(true) - { - } - - inline int LockI(TCont* cont) const { - // We do not want to lock the bus for a long time. However, we do not want to switch context - // immediately. Hope that 16 times is enough to finish most of the small operations. - for (int i = 0; i < 4; ++i) { - if (AtomicSwap(&mToken, false)) - return 0; - } - for (int i = 0; i < 8; ++i) { - if (AtomicSwap(&mToken, false)) - return 0; - Yield(cont); - } - for (int i = 0; i < 4; ++i) { - if (AtomicSwap(&mToken, false)) - return 0; - SleepT(cont, 1000); - } - while (!AtomicSwap(&mToken, false)) - SleepT(cont, 10000); - return 0; - } - - inline bool Acquire(TCont* cont) const { - return (LockI(cont) == 0); - } - - inline int LockD(TCont* cont, TInstant deadline) { - for (int i = 0; i < 4; ++i) { - if (AtomicSwap(&mToken, false)) - return 0; - } - for (int i = 0; i < 8; ++i) { - if (AtomicSwap(&mToken, false)) - return 0; - if (Now() > deadline) - return ETIMEDOUT; - Yield(cont); - } - for (int i = 0; i < 4; ++i) { - if (AtomicSwap(&mToken, false)) - return 0; - if (Now() > deadline) - return ETIMEDOUT; - SleepT(cont, 1000); - } - while (!AtomicSwap(&mToken, false)) { - if (Now() > deadline) - return ETIMEDOUT; - SleepT(cont, 10000); - } - return 0; - } - - inline int LockT(TCont* cont, TDuration timeout) { - return LockD(cont, Now() + timeout); - } - - inline void UnLock(TCont*) const { - mToken = true; - } - - inline bool Release(TCont* cont) const { - UnLock(cont); - return true; - } - - inline bool TryAcquire(TCont*) const { - return AtomicSwap(&mToken, false); - } - -private: - TAtomic mutable mToken; -}; - -/* Thread-safe version of TContSemaphore */ - -class TContMtSemaphore: private TContMtSyncBase { -public: - TContMtSemaphore(const unsigned int initial) - : mValue(initial) - { - } - - inline bool Acquire(TCont* cont) { - for (int i = 0; i < 1024; ++i) { - if (TryAcquire(cont)) - return true; - } - while (!TryAcquire(cont)) - Yield(cont); - return true; - } - - inline bool Release(TCont*) { - AtomicAdd(mValue, 1); - return true; - } - - inline bool TryAcquire(TCont*) { - TAtomic q = AtomicAdd(mValue, -1); - if (q < 0) { - AtomicAdd(mValue, 1); // this is safe even if some other thread accessed mValue - // since increments and decrements are always balanced - return false; - } - return true; - } - -private: - TAtomic mValue; -}; - -/***************************************************************** - TContSem - *****************************************************************/ -class TContSem { -public: - TContSem(void*) noexcept { - pfd[0] = pfd[1] = INVALID_SOCKET; - val = 0; - } - - ~TContSem() { - if (pfd[0] != INVALID_SOCKET) - closesocket(pfd[0]); - if (pfd[1] != INVALID_SOCKET) - closesocket(pfd[1]); - pfd[0] = pfd[1] = INVALID_SOCKET; - val = 0; - } - - bool Initialized() noexcept { - return pfd[0] != INVALID_SOCKET; - } - - int Init(unsigned short Val) noexcept { - assert(pfd[0] == INVALID_SOCKET && pfd[1] == INVALID_SOCKET); - - if (SocketPair(pfd) == SOCKET_ERROR) { - return errno; - } - - char ch = 0; - val = Val; - - for (unsigned short i = 0; i < val; i++) - if (send(pfd[1], &ch, 1, 0) != 1) { - int err = errno; - closesocket(pfd[0]); - closesocket(pfd[1]); - pfd[0] = pfd[1] = INVALID_SOCKET; - return err; - } -#if defined(_unix_) - if (fcntl(pfd[0], F_SETFL, O_NONBLOCK) == -1) - return errno; - if (fcntl(pfd[1], F_SETFL, O_NONBLOCK) == -1) - return errno; -#endif - - readPoller.WaitRead(pfd[0], this); - writePoller.WaitWrite(pfd[1], this); - - return 0; - } - - int DownD(TCont* cont, TInstant deadline) { - assert(pfd[0] != INVALID_SOCKET && pfd[1] != INVALID_SOCKET); - assert(cont); - --val; - - char ch = 0; - int result = downMutex.LockI(cont); - if (result) - return result; - TContIOStatus status = NCoro::ReadD(cont, pfd[0], &ch, 1, deadline); - downMutex.UnLock(); - if (status.Status()) - return status.Status(); - return 0; - } - - int DownT(TCont* cont, TDuration timeout) { - return DownD(cont, Now() + timeout); - } - - int DownI(TCont* cont) { - return DownD(cont, TInstant::Max()); - } - - int Down() { - assert(pfd[0] != INVALID_SOCKET && pfd[1] != INVALID_SOCKET); - --val; - - char ch = 0; - while (true) { - int result = recv(pfd[0], &ch, 1, 0); - if (result == INVALID_SOCKET) { - if (errno != EINTR && errno != EAGAIN) { - return errno; - } - } else { - break; - } - void* pollerResult = readPoller.WaitI(); - Y_ASSERT(pollerResult == this); - } - return 0; - } - - int Up(TCont* cont) { - assert(pfd[0] != INVALID_SOCKET && pfd[1] != INVALID_SOCKET); - assert(cont); - ++val; - - char ch = 0; - upMutex.LockI(cont); - TContIOStatus status = NCoro::WriteI(cont, pfd[1], &ch, 1); - upMutex.UnLock(); - if (status.Status()) - return status.Status(); - return 0; - } - - int Up() { - assert(pfd[0] != INVALID_SOCKET && pfd[1] != INVALID_SOCKET); - ++val; - - char ch = 0; - while (true) { - int result = send(pfd[1], &ch, 1, 0); - if (result == INVALID_SOCKET) { - if (errno != EINTR && errno != EAGAIN) { - return errno; - } - } else { - break; - } - void* pollerResult = writePoller.WaitI(); - Y_ASSERT(pollerResult == this); - } - return 0; - } - -private: - SOCKET pfd[2]; - unsigned short val; - TSocketPoller readPoller; - TSocketPoller writePoller; - TContMutex downMutex; - TContMutex upMutex; - - // forbid copying - TContSem(const TContSem&) { - } - TContSem& operator=(const TContSem&) { - return *this; - } -}; - -class TCoMtMutex { -public: - TCoMtMutex() - : Mutex(this) - { - Mutex.Init(1); - } - - void Acquire() { - Mutex.Down(); - } - - void Acquire(TCont* c) { - Mutex.DownI(c); - } - - void Release(TCont* c) { - Mutex.Up(c); - } - - void Release() { - Mutex.Up(); - } - -private: - TContSem Mutex; -}; - -/***************************************************************** - GUARDS - *****************************************************************/ -class SemaphoreGuard : TNonCopyable { -public: - inline SemaphoreGuard(TCont* cont, TContSemaphore& semaphore) - : mSemaphore(semaphore) - , mCont(cont) - { - mSemaphore.Acquire(mCont); - } - - inline ~SemaphoreGuard() { - mSemaphore.Release(mCont); - } - -private: - TContSemaphore& mSemaphore; - TCont* mCont; -}; - -class ContGuard { -public: - inline ContGuard(TCont* cont, TContMtSpinlock& lock) - : mLock(lock) - , mCont(cont) - { - mLock.LockI(mCont); - } - - inline ~ContGuard() { - mLock.UnLock(mCont); - } - -private: - TContMtSpinlock& mLock; - TCont* mCont; -}; diff --git a/library/cpp/coroutine/util/pipeevent.h b/library/cpp/coroutine/util/pipeevent.h deleted file mode 100644 index 059f2a34d9a..00000000000 --- a/library/cpp/coroutine/util/pipeevent.h +++ /dev/null @@ -1,93 +0,0 @@ -#pragma once - -#include <library/cpp/coroutine/engine/events.h> -#include <library/cpp/coroutine/engine/impl.h> -#include <library/cpp/coroutine/engine/network.h> - -#include <util/network/socket.h> -#include <library/cpp/deprecated/atomic/atomic.h> -#include <util/system/pipe.h> - -// TPipeEvent and TPipeSemaphore try to minimize number of coroutines reading from same pipe -// because its actually quite expensive with >1000 coroutines waiting on same event/semaphore - -// Using this class you can block in coroutine on waiting -// a signal from outer thread. -// Usual thread synchronization primitives are not appropriate -// because they will block all coroutines in single thread. -class TPipeEvent { -public: - explicit TPipeEvent() - : Signaled(0) - , NumWaiting(0) - { - TPipeHandle::Pipe(SignalRecvPipe, SignalSendPipe); - SetNonBlock(SignalRecvPipe); - SetNonBlock(SignalSendPipe); - } - - void Signal() { - if (AtomicCas(&Signaled, 1, 0)) { - char tmp = 1; - SignalSendPipe.Write(&tmp, 1); - } - } - - void Wait(TCont* cont) { - if (++NumWaiting > 1) { - ToWake.WaitI(cont); - } - char tmp; - NCoro::ReadI(cont, SignalRecvPipe, &tmp, 1).Checked(); - AtomicSet(Signaled, 0); - if (--NumWaiting > 0) { - ToWake.Signal(); - } - } - -private: - TAtomic Signaled; - size_t NumWaiting; - TContWaitQueue ToWake; - TPipeHandle SignalRecvPipe; - TPipeHandle SignalSendPipe; -}; - -class TPipeSemaphore { -public: - explicit TPipeSemaphore() - : Value(0) - , NumWaiting(0) - { - TPipeHandle::Pipe(SignalRecvPipe, SignalSendPipe); - SetNonBlock(SignalRecvPipe); - SetNonBlock(SignalSendPipe); - } - - void Inc() { - if (AtomicIncrement(Value) <= 0) { - char tmp = 1; - SignalSendPipe.Write(&tmp, 1); - } - } - - void Dec(TCont* cont) { - if (AtomicDecrement(Value) < 0) { - if (++NumWaiting > 1) { - ToWake.WaitI(cont); - } - char tmp; - NCoro::ReadI(cont, SignalRecvPipe, &tmp, 1).Checked(); - if (--NumWaiting > 0) { - ToWake.Signal(); - } - } - } - -private: - TAtomic Value; - size_t NumWaiting; - TContWaitQueue ToWake; - TPipeHandle SignalRecvPipe; - TPipeHandle SignalSendPipe; -}; diff --git a/library/cpp/coroutine/util/pipeque.h b/library/cpp/coroutine/util/pipeque.h deleted file mode 100644 index 8a197f5bff6..00000000000 --- a/library/cpp/coroutine/util/pipeque.h +++ /dev/null @@ -1,262 +0,0 @@ -#pragma once - -#include <util/network/sock.h> -#include <util/network/pair.h> -#include <util/generic/intrlist.h> -#include <util/system/mutex.h> -#include <util/memory/smallobj.h> - -class TConnectedStreamSocket: public TStreamSocket { -public: - TConnectedStreamSocket(SOCKET fd) - : TStreamSocket(fd) - { - } - - ssize_t Send(const void* msg, size_t len, int flags = 0) { - ssize_t ret = 0; - do { - ret = TStreamSocket::Send(msg, len, flags); - } while (ret == -EINTR); - return ret; - } - - ssize_t Recv(void* buf, size_t len, int flags = 0) { - ssize_t ret = 0; - do { - ret = TStreamSocket::Recv(buf, len, flags); - } while (ret == -EINTR); - return ret; - } -}; - -// Limited size, syncronized queue based on intrusive list. -// Reader and writer both wait on file descriptors instead -// of traditional cond vars. That allows the queue to be -// employed both in (POSIX) threads and coroutines. -template <class T> -class TBasicPipeQueue { -public: - // derive your T from TBasicPipeQueue<T>::Item - typedef TIntrusiveListItem<T> TItem; - static const size_t MaxQueueSizeDef = (1 << 6); // fits default socket buffer sizes on our Linux and FreeBSD servers - - TBasicPipeQueue(bool isPushBlocking = true, - bool isPopBlocking = true, - size_t maxQueueSize = MaxQueueSizeDef) - : CurSize(0) - , MaxQueueSize(maxQueueSize) - , PushSock(INVALID_SOCKET) - , PopSock(INVALID_SOCKET) - , ShouldContinue(true) - { - SOCKET socks[2]; - socks[0] = INVALID_SOCKET; - socks[1] = INVALID_SOCKET; - if (SocketPair(socks)) - ythrow yexception() << "TBasicPipeQueue: can't create socket pair: " << LastSystemError(); - TSocketHolder pushSock(socks[0]); - TSocketHolder popSock(socks[1]); - PushSock.Swap(pushSock); - PopSock.Swap(popSock); - if (!isPushBlocking) - SetNonBlock(PushFd(), true); - if (!isPopBlocking) - SetNonBlock(PopFd(), true); - - char b = '\0'; - for (size_t i = 0; i < MaxQueueSize; i++) { - if (PopSock.Send(&b, 1) != 1) { - Y_VERIFY(false, "TBasicPipeQueue: queue size too big (%" PRISZT "): make it less then %" PRISZT " or increase limits", MaxQueueSize, i); - } - } - } - - ~TBasicPipeQueue() { - } - - void Stop() { - ShouldContinue = false; - } - - bool Push(T* t) { - char b = '\0'; - ssize_t r = 0; - if (!ShouldContinue) - return false; - - // make sure the queue has enough space to write to (wait for reading on PushSock or block on Recv) - r = PushSock.Recv(&b, 1); - if (r == 0) { - return false; - } else if (r < 0) { - if (errno == EAGAIN) - return false; - else - ythrow yexception() << "TBasicPipeQueue: error in Push(Recv): " << LastSystemError(); - } - - Y_VERIFY(!IsFull(), "TBasicPipeQueue: no space left"); - - if (!ShouldContinue) - return false; - - { - TGuard<TMutex> guard(Mutex); - List.PushBack(t); - CurSize++; - } - - // signal that the queue has item - r = PushSock.Send(&b, 1); - if (r <= 0) - ythrow yexception() << "TBasicPipeQueue: error in Push(Send): " << LastSystemError(); - - return true; - } - - T* Pop() { - char b = '\0'; - // wait for an item to appear in the queue - ssize_t r = PopSock.Recv(&b, 1); - if (r == 0) { - return nullptr; - } else if (r < 0) { - if (errno == EAGAIN) - return nullptr; - else - ythrow yexception() << "TBasicPipeQueue: error in Pop(Recv): " << LastSystemError(); - } - - T* t = nullptr; - { - TGuard<TMutex> guard(Mutex); - t = List.PopFront(); - CurSize--; - } - - // signal that the queue has a free slot - r = PopSock.Send(&b, 1); - if (r <= 0) - ythrow yexception() << "TBasicPipeQueue: error in Pop(Send): " << LastSystemError(); - - return t; - } - - SOCKET PushFd() { - return (SOCKET)PushSock; - } - - SOCKET PopFd() { - return (SOCKET)PopSock; - } - - size_t Size() const { - TGuard<TMutex> guard(Mutex); - size_t curSize = CurSize; - return curSize; - } - - bool Empty() const { - TGuard<TMutex> guard(Mutex); - bool empty = CurSize == 0; - return empty; - } - - bool IsFull() const { - TGuard g{Mutex}; - return CurSize >= MaxQueueSize; - } - -protected: - typedef TIntrusiveList<T> TListType; - TListType List; - size_t CurSize; - size_t MaxQueueSize; - TConnectedStreamSocket PushSock; - TConnectedStreamSocket PopSock; - TMutex Mutex; - bool ShouldContinue; - /** - * --{push(write)}--> PushSock ---> PopSock --{pop(read)}--> - */ -}; - -template <class T> -class TSyncSmallObjAllocator { -public: - TSyncSmallObjAllocator(IAllocator* alloc = TDefaultAllocator::Instance()) - : Allocator(alloc) - { - } - - void Release(T* t) { - t->~T(); - { - TGuard<TMutex> guard(Mutex); - Allocator.Release(t); - } - } - - T* Alloc() { - void* t; - { - TGuard<TMutex> guard(Mutex); - t = Allocator.Allocate(); - } - return new (t) T(); - } - -protected: - TSmallObjAllocator<T> Allocator; - TMutex Mutex; -}; - -template <class T> -struct TPipeQueueItem: public TIntrusiveListItem<TPipeQueueItem<T>> { - T Val; -}; - -template <class T> -class TPipeQueue - : protected TSyncSmallObjAllocator<TPipeQueueItem<T>>, - protected TBasicPipeQueue<TPipeQueueItem<T>> { - typedef TPipeQueueItem<T> TItem; - typedef TSyncSmallObjAllocator<TItem> TAlloc; - typedef TBasicPipeQueue<TItem> TBaseQueue; - -public: - TPipeQueue(bool isPushBlocking = true, - bool isPopBlocking = true, - size_t maxQueueSize = TBaseQueue::MaxQueueSizeDef, - IAllocator* alloc = TDefaultAllocator::Instance()) - : TAlloc(alloc) - , TBaseQueue(isPushBlocking, isPopBlocking, maxQueueSize) - { - } - - bool Push(const T& t) { - TItem* item = TAlloc::Alloc(); - item->Val = t; - bool res = TBaseQueue::Push(item); - if (!res) - TAlloc::Release(item); - return res; - } - - bool Pop(T* t) { - TItem* item = TBaseQueue::Pop(); - if (item == nullptr) - return false; - - *t = item->Val; - TAlloc::Release(item); - return true; - } - - using TBaseQueue::Empty; - using TBaseQueue::PopFd; - using TBaseQueue::PushFd; - using TBaseQueue::Size; - using TBaseQueue::Stop; -}; diff --git a/library/cpp/cpulimit/cpu.cpp b/library/cpp/cpulimit/cpu.cpp deleted file mode 100644 index 583b38055ed..00000000000 --- a/library/cpp/cpulimit/cpu.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "cpu.h" - -#include <util/datetime/cputimer.h> -#include <util/generic/yexception.h> -#include <util/generic/ylimits.h> -#include <util/random/random.h> -#include <util/system/rusage.h> -#include <util/thread/pool.h> - -namespace { - TDuration GetUsage() { - const auto rusage = TRusage::Get(); - return rusage.Utime + rusage.Stime; - } - - TInstant MonotonicNow() { - return TInstant::Zero() + CyclesToDuration(GetCycleCount()); - } -} - -namespace NCpuLimit { - TCpuMeasurer::TCpuMeasurer(TDuration probePeriod) - : FastProbe_{.Period = probePeriod, .Usage = 0} - , SlowProbe_{.Period = TDuration::MilliSeconds(100), .Usage = 0} - { - const auto now = MonotonicNow(); - const auto usageNow = GetUsage(); - for (auto [probe, size] : {std::pair(&FastProbe_, 5), std::pair(&SlowProbe_, 3)}) { - probe->Window.assign(size, {now, usageNow}); - probe->MeasurerThread = SystemThreadFactory()->Run([this, probe = probe] { - UpdateProbeThread(*probe); - }); - } - } - - TCpuMeasurer::~TCpuMeasurer() { - Finished_ = true; - for (auto* probe : {&FastProbe_, &SlowProbe_}) { - probe->MeasurerThread->Join(); - } - } - - void TCpuMeasurer::UpdateProbeThread(TProbe& probe) { - const ui64 numberOfMeasurments = 10; - const TDuration checkPeriod = probe.Period / numberOfMeasurments; - while (!Finished_.load()) { - Sleep(checkPeriod); - - const auto now = MonotonicNow(); - const auto usageNow = GetUsage(); - - const auto [windowStartTime, windowStartUsage] = probe.Window.front(); - - const auto windowDuration = now - windowStartTime; - const auto windowUsage = usageNow - windowStartUsage; - - probe.Usage.store(windowUsage / windowDuration); - probe.Window.emplace_back(now, usageNow); - - if (probe.Window.size() > numberOfMeasurments) { - probe.Window.pop_front(); - } - } - } - - TCpuLimiter::TCpuLimiter(double slowThreshold, double fastThresholdBegin, double fastThresholdEnd) - : SlowThreshold_(slowThreshold) - , FastThresholdBegin_(fastThresholdBegin) - , FastThresholdEnd_(fastThresholdEnd) - { - Y_ENSURE(FastThresholdBegin_ <= FastThresholdEnd_); - } - - bool TCpuLimiter::ThrottleHard(double slowUsage, double fastUsage) const { - if (slowUsage <= SlowThreshold_) { - return false; - } - if (fastUsage > FastThresholdEnd_) { - return true; - } else if (fastUsage > FastThresholdBegin_) { - return RandomNumber<ui32>() * (FastThresholdEnd_ - FastThresholdBegin_) < - Max<ui32>() * (fastUsage - FastThresholdBegin_); - } else { - return false; - } - } - - bool TCpuLimiter::ThrottleSoft(double slowUsage, double fastUsage) const { - return slowUsage > SlowThreshold_ && fastUsage > FastThresholdEnd_; - } -} diff --git a/library/cpp/cpulimit/cpu.h b/library/cpp/cpulimit/cpu.h deleted file mode 100644 index eb5ee9b011e..00000000000 --- a/library/cpp/cpulimit/cpu.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include "cpu.h" - -#include <util/datetime/base.h> -#include <util/system/types.h> -#include <util/thread/factory.h> - -#include <deque> - -namespace NCpuLimit { - class TCpuMeasurer { - struct TProbe { - TDuration Period; - std::atomic<double> Usage; - THolder<IThreadFactory::IThread> MeasurerThread; - std::deque<std::pair<TInstant, TDuration>> Window; - TDuration WindowDuration{}; - TDuration WindowUsage{}; - }; - - public: - explicit TCpuMeasurer(TDuration probePeriod); - ~TCpuMeasurer(); - - double CpuUsageFast() const { - return FastProbe_.Usage.load(); - } - - double CpuUsageSlow() const { - return SlowProbe_.Usage.load(); - } - - private: - void UpdateProbeThread(TProbe& probe); - - std::atomic<bool> Finished_ = false; - - TProbe FastProbe_; - TProbe SlowProbe_; - }; - - class TCpuLimiter { - public: - TCpuLimiter(double slowThreshold, double fastThresholdBegin, double fastThresholdEnd); - - // Only throttle (all requests) when LA is greater than FastThresholdEnd_ - bool ThrottleSoft(double slowUsage, double fastUsage) const; - - // Throttle requests with some probability when LA is greater than - // FastThresholdBegin_ - bool ThrottleHard(double slowUsage, double fastUsage) const; - - private: - double SlowThreshold_; - double FastThresholdBegin_; - double FastThresholdEnd_; - }; -} diff --git a/library/cpp/deprecated/autoarray/README.md b/library/cpp/deprecated/autoarray/README.md deleted file mode 100644 index 1d83147ceeb..00000000000 --- a/library/cpp/deprecated/autoarray/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Pre-C++11 vector-like container. - -Just use std::vector. If you need to fill your vector with custom-constructed data, use reserve+emplace_back (but make sure that your elements are movable). diff --git a/library/cpp/deprecated/autoarray/autoarray.cpp b/library/cpp/deprecated/autoarray/autoarray.cpp deleted file mode 100644 index 15167f27f69..00000000000 --- a/library/cpp/deprecated/autoarray/autoarray.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "autoarray.h" diff --git a/library/cpp/deprecated/autoarray/autoarray.h b/library/cpp/deprecated/autoarray/autoarray.h deleted file mode 100644 index 2aa12c59161..00000000000 --- a/library/cpp/deprecated/autoarray/autoarray.h +++ /dev/null @@ -1,264 +0,0 @@ -#pragma once - -#include <util/system/compat.h> -#include <util/system/yassert.h> -#include <util/system/defaults.h> -#include <util/system/sys_alloc.h> - -#include <util/generic/typetraits.h> -#include <utility> - -#include <new> -#include <util/generic/noncopyable.h> - -struct autoarray_getindex { - autoarray_getindex() = default; -}; - -struct aarr_b0 { - aarr_b0() = default; -}; - -struct aarr_nofill { - aarr_nofill() = default; -}; - -template <typename T> -struct ynd_type_traits { - enum { - empty_destructor = TTypeTraits<T>::IsPod, - }; -}; - -template <class T> -class autoarray : TNonCopyable { -protected: - T* arr; - size_t _size; - -private: - void AllocBuf(size_t siz) { - arr = nullptr; - _size = 0; - if (siz) { - arr = (T*)y_allocate(sizeof(T) * siz); - _size = siz; - } - } - -public: - using value_type = T; - using iterator = T*; - using const_iterator = const T*; - - autoarray() - : arr(nullptr) - , _size(0) - { - } - autoarray(size_t siz) { - AllocBuf(siz); - T* curr = arr; - try { - for (T* end = arr + _size; curr != end; ++curr) - new (curr) T(); - } catch (...) { - for (--curr; curr >= arr; --curr) - curr->~T(); - y_deallocate(arr); - throw; - } - } - template <class A> - explicit autoarray(size_t siz, A& fill) { - AllocBuf(siz); - T* curr = arr; - try { - for (T* end = arr + _size; curr != end; ++curr) - new (curr) T(fill); - } catch (...) { - for (--curr; curr >= arr; --curr) - curr->~T(); - y_deallocate(arr); - throw; - } - } - explicit autoarray(size_t siz, autoarray_getindex) { - AllocBuf(siz); - size_t nCurrent = 0; - try { - for (nCurrent = 0; nCurrent < _size; ++nCurrent) - new (&arr[nCurrent]) T(nCurrent); - } catch (...) { - for (size_t n = 0; n < nCurrent; ++n) - arr[n].~T(); - y_deallocate(arr); - throw; - } - } - explicit autoarray(size_t siz, aarr_b0) { - AllocBuf(siz); - memset(arr, 0, _size * sizeof(T)); - } - explicit autoarray(size_t siz, aarr_nofill) { - AllocBuf(siz); - } - template <class A> - explicit autoarray(const A* fill, size_t siz) { - AllocBuf(siz); - size_t nCurrent = 0; - try { - for (nCurrent = 0; nCurrent < _size; ++nCurrent) - new (&arr[nCurrent]) T(fill[nCurrent]); - } catch (...) { - for (size_t n = 0; n < nCurrent; ++n) - arr[n].~T(); - y_deallocate(arr); - throw; - } - } - template <class A, class B> - explicit autoarray(const A* fill, const B* cfill, size_t siz) { - AllocBuf(siz); - size_t nCurrent = 0; - try { - for (nCurrent = 0; nCurrent < _size; ++nCurrent) - new (&arr[nCurrent]) T(fill[nCurrent], cfill); - } catch (...) { - for (size_t n = 0; n < nCurrent; ++n) - arr[n].~T(); - y_deallocate(arr); - throw; - } - } - template <class A> - explicit autoarray(const A* fill, size_t initsiz, size_t fullsiz) { - AllocBuf(fullsiz); - size_t nCurrent = 0; - try { - for (nCurrent = 0; nCurrent < ((initsiz < _size) ? initsiz : _size); ++nCurrent) - new (&arr[nCurrent]) T(fill[nCurrent]); - for (; nCurrent < _size; ++nCurrent) - new (&arr[nCurrent]) T(); - } catch (...) { - for (size_t n = 0; n < nCurrent; ++n) - arr[n].~T(); - y_deallocate(arr); - throw; - } - } - template <class A> - explicit autoarray(const A* fill, size_t initsiz, size_t fullsiz, const T& dummy) { - AllocBuf(fullsiz); - size_t nCurrent = 0; - try { - for (nCurrent = 0; nCurrent < ((initsiz < _size) ? initsiz : _size); ++nCurrent) - new (&arr[nCurrent]) T(fill[nCurrent]); - for (; nCurrent < _size; ++nCurrent) - new (&arr[nCurrent]) T(dummy); - } catch (...) { - for (size_t n = 0; n < nCurrent; ++n) - arr[n].~T(); - y_deallocate(arr); - throw; - } - } - - template <class... R> - explicit autoarray(size_t siz, R&&... fill) { - AllocBuf(siz); - T* curr = arr; - try { - for (T* end = arr + _size; curr != end; ++curr) - new (curr) T(std::forward<R>(fill)...); - } catch (...) { - for (--curr; curr >= arr; --curr) - curr->~T(); - y_deallocate(arr); - throw; - } - } - ~autoarray() { - if (_size) { - if (!ynd_type_traits<T>::empty_destructor) - for (T *curr = arr, *end = arr + _size; curr != end; ++curr) - curr->~T(); - y_deallocate(arr); - } - } - T& operator[](size_t pos) { - Y_ASSERT(pos < _size); - return arr[pos]; - } - const T& operator[](size_t pos) const { - Y_ASSERT(pos < _size); - return arr[pos]; - } - size_t size() const { - return _size; - } - void swap(autoarray& with) { - T* tmp_arr = arr; - size_t tmp_size = _size; - arr = with.arr; - _size = with._size; - with.arr = tmp_arr; - with._size = tmp_size; - } - void resize(size_t siz) { - autoarray<T> tmp(arr, _size, siz); - swap(tmp); - } - void resize(size_t siz, const T& dummy) { - autoarray<T> tmp(arr, _size, siz, dummy); - swap(tmp); - } - T* rawpointer() { - return arr; - } - const T* operator~() const { - return arr; - } - T* begin() { - return arr; - } - T* end() { - return arr + _size; - } - T& back() { - Y_ASSERT(_size); - return arr[_size - 1]; - } - bool empty() const { - return !_size; - } - bool operator!() const { - return !_size; - } - size_t operator+() const { - return _size; - } - const T* begin() const { - return arr; - } - const T* end() const { - return arr + _size; - } - const T& back() const { - Y_ASSERT(_size); - return arr[_size - 1]; - } - //operator T*() { return arr; } -}; - -template <class T> -inline bool operator==(const autoarray<T>& a, const autoarray<T>& b) { - size_t count = a.size(); - if (count != b.size()) - return false; - for (size_t i = 0; i < count; ++i) { - if (a[i] != b[i]) - return false; - } - return true; -} diff --git a/library/cpp/deprecated/datafile/README.md b/library/cpp/deprecated/datafile/README.md deleted file mode 100644 index 7f8547108e8..00000000000 --- a/library/cpp/deprecated/datafile/README.md +++ /dev/null @@ -1,3 +0,0 @@ -A wrapper on top of some user-defined custom file format. - -Just write your own if you need it. It's going to be way easier than figuring out how to use this one. diff --git a/library/cpp/deprecated/datafile/datafile.cpp b/library/cpp/deprecated/datafile/datafile.cpp deleted file mode 100644 index ff93f11c6b7..00000000000 --- a/library/cpp/deprecated/datafile/datafile.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "datafile.h" - -void TDataFileBase::DoLoad(const char* fname, int loadMode) { - Destroy(); - TFile f(fname, RdOnly); - DoLoad(f, loadMode, nullptr, 0); -} - -void TDataFileBase::DoLoad(TFile& f, int loadMode, void* hdrPtr, size_t hdrSize) { - if (hdrPtr) { - if (loadMode & DLM_EXACT_SIZE && f.GetLength() != (i64)Length) - throw yexception() << f.GetName() << " size does not match its header value"; - } else { - Length = f.GetLength(); - hdrSize = 0; - } - if ((loadMode & DLM_LD_TYPE_MASK) == DLM_READ) { - MemData = TVector<char>(Length); - memcpy(MemData.begin(), hdrPtr, hdrSize); - f.Load(MemData.begin() + hdrSize, Length - hdrSize); - Start = MemData.begin(); - } else { - FileData.init(f); - if (FileData.getSize() < Length) - throw yexception() << f.GetName() << " is smaller than what its header value says"; - if ((loadMode & DLM_LD_TYPE_MASK) == DLM_MMAP_PRC) - FileData.precharge(); - Start = (const char*)FileData.getData(); - } -} - -void TDataFileBase::Destroy() { - TVector<char>().swap(MemData); - FileData.term(); - Start = nullptr; - Length = 0; -} - -void TDataFileBase::Precharge() const { - if (Length && Start == (char*)FileData.getData()) - FileData.precharge(); -} diff --git a/library/cpp/deprecated/datafile/datafile.h b/library/cpp/deprecated/datafile/datafile.h deleted file mode 100644 index a438baceca3..00000000000 --- a/library/cpp/deprecated/datafile/datafile.h +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once - -#include "loadmode.h" - -#include <library/cpp/deprecated/mapped_file/mapped_file.h> - -#include <util/generic/vector.h> -#include <util/system/file.h> -#include <util/system/filemap.h> - -/** Simple helper that allows a file to be either mapped or read into malloc'ed memory. - This behaviour is controlled by EDataLoadMode enum defined in loadmode.h. - Unlike TBlob it provides Precharge() function and simple file size - based integrity check. - - To use this code, inherit your class from TDataFile<TFileHeader>. - TFileHeader must be a pod-type structure with byte layout of the file header. - File must start with that header. - TFileHeader must have FileSize() member function that determines expected file size or - length of data that need to be read from the beginning of file. - */ - -class TDataFileBase { -protected: - TVector<char> MemData; - TMappedFile FileData; - - const char* Start; - size_t Length; - - TDataFileBase() - : Start(nullptr) - , Length(0) - { - } - - void DoLoad(TFile& f, int loadMode, void* hdrPtr, size_t hdrSize); - void DoLoad(const char* fname, int loadMode); // just whole file - void Destroy(); - void swap(TDataFileBase& with) { - MemData.swap(with.MemData); - FileData.swap(with.FileData); - DoSwap(Start, with.Start); - DoSwap(Length, with.Length); - } - -public: - void Precharge() const; -}; - -template <class TFileHeader> -class TDataFile: public TDataFileBase { -protected: - void Load(const char* fname, EDataLoadMode loadMode) { - Destroy(); - TFile f(fname, RdOnly | Seq); - TFileHeader hdr; - f.Load(&hdr, sizeof(hdr)); - Length = hdr.FileSize(); - DoLoad(f, (int)loadMode, &hdr, sizeof(hdr)); - } - const TFileHeader& Hdr() const { - return *(TFileHeader*)Start; - } -}; - -// Use: class TFoo: public TDataFileEx<Foo> {...}; -// Additional requrement: TFileHeader must have Validate(fname) function that throws exception. -// Class TUser itself must have Init(fname) function -// Adds Load() function to your class (TUser) -template <class TUser, class TFileHeader> -class TDataFileEx: public TDataFile<TFileHeader> { -private: - using TBase = TDataFile<TFileHeader>; - TUser& User() const { - return *(TUser*)this; - } - -public: - TDataFileEx(const char* fname, EDataLoadMode loadMode = DLM_DEFAULT) { - if (fname) - Load(fname, loadMode); - } - void Load(const char* fname, EDataLoadMode loadMode = DLM_DEFAULT) { - TBase::Load(fname, loadMode); - TBase::Hdr().Validate(fname); - User().Init(fname); - } -}; diff --git a/library/cpp/deprecated/datafile/loadmode.cpp b/library/cpp/deprecated/datafile/loadmode.cpp deleted file mode 100644 index a857830326e..00000000000 --- a/library/cpp/deprecated/datafile/loadmode.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "loadmode.h" diff --git a/library/cpp/deprecated/datafile/loadmode.h b/library/cpp/deprecated/datafile/loadmode.h deleted file mode 100644 index f04054dd645..00000000000 --- a/library/cpp/deprecated/datafile/loadmode.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -// It is recommended to support all reasonal value combinations via this enum, -// to let Load() function argument be of EDataLoadMode type, not just int type - -enum EDataLoadMode { - DLM_READ = 0, - DLM_MMAP_PRC = 1, // precharge - DLM_MMAP = 2, // w/o precharge - DLM_MMAP_AUTO_PRC = 3, // precharge automatically (same as DLM_MMAP unless specifically supported) - DLM_LD_TYPE_MASK = 15, - DLM_EXACT_SIZE = 16, // fail if input file is larger than what header says - - DLM_READ_ESZ = DLM_READ | DLM_EXACT_SIZE, - DLM_MMAP_PRC_ESZ = DLM_MMAP_PRC | DLM_EXACT_SIZE, - DLM_MMAP_ESZ = DLM_MMAP | DLM_EXACT_SIZE, - DLM_MMAP_APRC_ESZ = DLM_MMAP_AUTO_PRC | DLM_EXACT_SIZE, - - DLM_DEFAULT = DLM_MMAP_PRC_ESZ, -}; diff --git a/library/cpp/deprecated/fgood/README.md b/library/cpp/deprecated/fgood/README.md deleted file mode 100644 index 4f662896573..00000000000 --- a/library/cpp/deprecated/fgood/README.md +++ /dev/null @@ -1,15 +0,0 @@ -Some ancient wrappers on top of FILE*, and some string manupulation functions. - -Alternatives are as follows. - -For TFILEPtr. Use TIFStream or TOFStream if you need IO. For some rare use cases a TFileMap might also do. - -For fput/fget/getline. Use streams API. - -For struct ffb and struct prnstr. Just don't use them. Even if you can figure out what they do. - -For sf family of functions and TLineSplitter. Just use Split* from util/string/split.h - -For TSFReader. Use TMapTsvFile. - -For read_or_die family of functions. Use streams API. diff --git a/library/cpp/deprecated/fgood/ffb.cpp b/library/cpp/deprecated/fgood/ffb.cpp deleted file mode 100644 index aa9da861a65..00000000000 --- a/library/cpp/deprecated/fgood/ffb.cpp +++ /dev/null @@ -1,407 +0,0 @@ -#include "ffb.h" - -#include <util/string/util.h> // str_spn -#include <util/system/compat.h> -#include <util/generic/yexception.h> - -#include <cstdio> -#include <algorithm> - -#include <ctype.h> - -#ifdef _win_ -#include <io.h> -#else -#include <unistd.h> -#endif - -ffb::ffb(FILE* file) - : TFILEPtr(file) -{ - if (file && !isatty(fileno(file)) && BUFSIZ < 512 * 1024) - setvbuf(file, nullptr, _IOFBF, 512 * 1024); -} - -void ffb::operator=(FILE* f) { - TFILEPtr::operator=(f); - if (f && !isatty(fileno(f)) && BUFSIZ < 512 * 1024) - setvbuf(f, nullptr, _IOFBF, 512 * 1024); -} - -void ffb::open(const char* name, const char* mode) { - TFILEPtr::open(name, mode); - if (!isatty(fileno(*this)) && BUFSIZ < 512 * 1024) - setvbuf(*this, nullptr, _IOFBF, 512 * 1024); -} - -int sf(char** fb, char* buf) { //don't want to call sf(fb, buf, 32) - if (!(*buf && *buf != 10)) { - *fb = nullptr; - return 0; - } - int n = 1; - fb[0] = buf; - while (*buf && *buf != 10 && n < 31) { - if (*buf == '\t') { - *buf++ = 0; - fb[n++] = buf; - continue; - } - buf++; - } - if (*buf == 10 && buf[-1] == 13) - buf[-1] = 0; - *buf = 0; - fb[n] = nullptr; - return n; -} - -int sf(char** fb, char* buf, size_t fb_sz) { - if (!(*buf && *buf != 10)) { - *fb = nullptr; - return 0; - } - fb_sz--; - int n = 1; - fb[0] = buf; - while (*buf && *buf != 10 && n < (int)fb_sz) { - if (*buf == '\t') { - *buf++ = 0; - fb[n++] = buf; - continue; - } - buf++; - } - if (*buf == 10 && buf[-1] == 13) - buf[-1] = 0; - *buf = 0; - fb[n] = nullptr; - return n; -} - -inline int sf_blank(char** fb, char* buf, size_t fb_sz) { - while (isspace((ui8)*buf)) - buf++; - if (!*buf) { - *fb = nullptr; - return 0; - } - fb_sz--; - int n = 1; - fb[0] = buf; - while (*buf && *buf != 10 && n < (int)fb_sz) { - if (isspace((ui8)*buf)) { - *buf++ = 0; - while (isspace((ui8)*buf)) - buf++; - if (*buf) - fb[n++] = buf; - continue; - } - buf++; - } - if (*buf == 10 && buf[-1] == 13) - buf[-1] = 0; - *buf = 0; - fb[n] = nullptr; - return n; -} - -int sf(char fs, char** fb, char* buf, size_t fb_sz) { - if (fs == ' ') - return sf_blank(fb, buf, fb_sz); - while (*buf == fs) - buf++; - if (!(*buf && *buf != 10)) { - *fb = nullptr; - return 0; - } - fb_sz--; - int n = 1; - fb[0] = buf; - while (*buf && *buf != 10 && n < (int)fb_sz) { - if (*buf == fs) { - *buf++ = 0; - while (*buf == fs) - buf++; - fb[n++] = buf; - continue; - } - buf++; - } - if (*buf == 10 && buf[-1] == 13) - buf[-1] = 0; - *buf = 0; - fb[n] = nullptr; - return n; -} - -int sf(const char* fs, char** fb, char* buf, size_t fb_sz) { - if (!(*buf && *buf != 10)) { - *fb = nullptr; - return 0; - } - int fs_len = strlen(fs); - fb_sz--; - int n = 1; - fb[0] = buf; - while (*buf && *buf != 10 && n < (int)fb_sz) { - if (*buf == *fs && !strncmp(buf + 1, fs + 1, fs_len - 1)) { - *buf = 0; - buf += fs_len; - fb[n++] = buf; - continue; - } - buf++; - } - if (*buf == 10 && buf[-1] == 13) - buf[-1] = 0; - *buf = 0; - fb[n] = nullptr; - return n; -} - -inline bool is_end(const char* p) { - return !p || !p[0]; -} - -int sf(const char* seps, char* buf, char** fb, size_t fb_sz) { - if (fb_sz < 1 || is_end(buf)) { - *fb = nullptr; - return 0; - } - str_spn sseps(seps); - fb[0] = nullptr; - int n = 0; - // skip leading delimeters - buf = sseps.cbrk(buf); - if (is_end(buf)) - return 0; - // store fields - while (n < (int)fb_sz) { - fb[n++] = buf; - // find delimeters - buf = sseps.brk(buf + 1); - if (is_end(buf)) - break; - *buf = 0; - // skip delimiters - buf = sseps.cbrk(buf + 1); - if (is_end(buf)) - break; - } - fb[n] = nullptr; - return n; -} - -void TLineSplitter::operator()(char* p, TVector<char*>& fields) const { - if (!p || !*p) - return; - char* q = p; - while (1) { - p = Sep.brk(p); - if (q && (p - q || !SkipEmpty())) - fields.push_back(q); - q = nullptr; - if (!*p) - break; - if (SepStrLen == 1 || (SepStrLen > 1 && !strncmp(p + 1, SepStr + 1, SepStrLen - 1))) { - *p = 0; - p += SepStrLen; - q = p; - } else - p++; - } -} - -void TLineSplitter::operator()(const char* p, TVector<std::pair<const char*, size_t>>& fields) const { - if (!p || !*p) - return; - const char* q = p; - while (1) { - p = Sep.brk(p); - if (q && (p - q || !SkipEmpty())) - fields.push_back(std::make_pair(q, p - q)); - q = nullptr; - if (!*p) - break; - if (SepStrLen == 1 || (SepStrLen > 1 && !strncmp(p + 1, SepStr + 1, SepStrLen - 1))) { - p += SepStrLen; - q = p; - } else - p++; - } -} - -TSFReader::TSFReader(const char* fname, char sep, i32 nfrq) // if sep == ' ' isspace will be imitated (for compat) - : Split(str_spn(sep == ' ' ? "\t\n\v\f\r " : TString(1, sep).data()), sep == ' ') - , OpenPipe(false) -{ - Open(fname, nfrq); -} - -TSFReader::TSFReader(const char* fname, const char* sep, i32 nfrq) - : Split(sep, false) - , OpenPipe(false) -{ - Open(fname, nfrq); -} - -TSFReader::TSFReader(const char* fname, const TLineSplitter& spl, i32 nfrq) - : Split(spl) - , OpenPipe(false) -{ - Open(fname, nfrq); -} - -void TSFReader::Open(const char* fname, i32 nfrq, size_t vbuf_size) { - FieldsRequired = nfrq; - NF = NR = 0; - - if (IsOpen()) - File.close(); - - if (!fname) - return; - - if (!strcmp(fname, "/dev/stdin")) { - File.assign(stdin, "/dev/stdin"); - } else { - if (OpenPipe) - File.popen(fname, "r"); - else - File.open(fname, "r"); - } - OpenPipe = false; - if (!isatty(fileno(File))) - setvbuf(File, nullptr, _IOFBF, vbuf_size); -} - -void TSFReader::Popen(const char* pname, i32 nfrq, size_t vbuf_size) { - OpenPipe = true; - Open(pname, nfrq, vbuf_size); -} - -bool TSFReader::NextLine(segmented_string_pool* pool) { - size_t line_len = 0; - -#ifdef __FreeBSD__ - char* ptr = fgetln(File, &line_len); - if (!ptr) - return false; - if (!line_len || ptr[line_len - 1] != '\n') { // last line w/o newline - Buf.AssignNoAlias(ptr, line_len); - ptr = Buf.begin(); - } else { - // can safely replace newline with \0 - ptr[line_len - 1] = 0; - --line_len; - } -#else - if (!getline(File, Buf)) - return false; - char* ptr = Buf.begin(); - line_len = Buf.size(); -#endif - if (line_len && ptr[line_len - 1] == '\r') - ptr[line_len - 1] = 0; - - if (pool) { - char* nptr = pool->append(ptr); - Y_ASSERT(!strcmp(ptr, nptr)); - ptr = nptr; - } - - ++NR; - Fields.clear(); - Split(ptr, Fields); - NF = Fields.size(); - - if (FieldsRequired != -1 && FieldsRequired != (int)NF) - ythrow yexception() << File.name() << " line " << NR << ": " << NF << " fields, expected " << FieldsRequired; - - return true; -} - -int prnstr::f(const char* c, ...) { - va_list params; - int n = asize - pos, k; - va_start(params, c); - while ((k = vsnprintf(buf + pos, n, c, params)) >= n) { - n += asize, asize *= 2; - while (k + pos >= n) - n += asize, asize *= 2; - char* t = new char[asize]; - memcpy(t, buf, pos); - delete[] buf; - buf = t; - va_end(params); - va_start(params, c); - } - pos += k; - va_end(params); - return k; -} -int prnstr::s(const char* c, size_t k) { - if (!c) - return 0; - size_t n = asize - pos; - if (k >= n) { - n += asize, asize *= 2; - while (k + pos >= n) - n += asize, asize *= 2; - char* t = new char[asize]; - memcpy(t, buf, pos); - delete[] buf; - buf = t; - } - memcpy(buf + pos, c, k); - pos += k; - buf[pos] = 0; - return k; -} -void prnstr::clear() { - pos = 0; - if (asize > 32768) { - asize = 32768; - delete[] buf; - buf = new char[asize]; - } -} - -void prnstr::swap(prnstr& w) { - std::swap(buf, w.buf); - std::swap(pos, w.pos); - std::swap(asize, w.asize); -} - -FILE* read_or_die(const char* fname) { - FILE* f = fopen(fname, "rb"); - if (!f) - err(1, "%s", fname); - return f; -} -FILE* write_or_die(const char* fname) { - FILE* f = fopen(fname, "wb"); - if (!f) - err(1, "%s", fname); - return f; -} -FILE* fopen_or_die(const char* fname, const char* mode) { - FILE* f = fopen(fname, mode); - if (!f) - err(1, "%s (mode '%s')", fname, mode); - return f; -} - -FILE* fopen_chk(const char* fname, const char* mode) { - FILE* f = fopen(fname, mode); - if (!f) - ythrow yexception() << fname << " (mode '" << mode << "'): " << LastSystemErrorText(); - return f; -} - -void fclose_chk(FILE* f, const char* fname) { - if (fclose(f)) - ythrow yexception() << "file " << fname << ": " << LastSystemErrorText(); -} diff --git a/library/cpp/deprecated/fgood/ffb.h b/library/cpp/deprecated/fgood/ffb.h deleted file mode 100644 index ca229eb65a1..00000000000 --- a/library/cpp/deprecated/fgood/ffb.h +++ /dev/null @@ -1,264 +0,0 @@ -#pragma once - -#include "fgood.h" - -#include <util/string/util.h> // str_spn -#include <util/string/split.h> // str_spn -#include <util/memory/segmented_string_pool.h> -#include <util/generic/string.h> -#include <util/generic/vector.h> -#include <util/generic/noncopyable.h> - -#include <utility> - -#include <cstdarg> -#include <cstring> - -struct ffb: public TFILEPtr { - ffb() { - } - ffb(FILE* file); - ffb(const char* name, const char* mode) { - open(name, mode); - } - void operator=(FILE* f); // take ownership - void open(const char* name, const char* mode); - int f(const char* c, ...) { - va_list args; - va_start(args, c); - return vfprintf(*this, c, args); - } - void s(const char* c) { - fsput(c, strlen(c)); - } - void b(const void* cc, int n) { - fsput((const char*)cc, n); - } - void B(const void* cc, int N) { - fsput((const char*)cc, N); - } - void c(char c) { - fputc(c); - } - void cbe(wchar16 c) { // big endian utf-16 - fputc(char(c >> 8)); //Hi8 - fputc(char(c & 255)); //Lo8 - } - void sbe(const wchar16* c) { - for (; *c; c++) - cbe(*c); - } - void fclose() { - close(); - } -}; - -// split fields of tab-delimited line of text -// here and below fb actual size must be fb_sz + 1 to allow fb[fb_sz] be zero -int sf(char** fb, char* buf, size_t fb_sz); -int sf(char** fb, char* buf /* fb_sz == 32 */); - -// split fields of char-delimited line of text -// Achtung: delim = ' ' imitates awk: initial separators are skipped, -// repeated seps treated as one, all chars less than ' ' treated as separators. -int sf(char fs, char** fb, char* buf, size_t fb_sz = 32); - -// split fields of string-delimited line of text (fs is NOT a regexp) -// (usually fs is "@@") -int sf(const char* fs, char** fb, char* buf, size_t fb_sz = 32); - -// split fields of char-delimited line of text, set of char-separators is given -// Achtung: repeated seps treated as one, initial seps are skipped -// newlines are NOT ignored. -int sf(const char* seps, char* buf, char** fb, size_t fb_sz = 32); - -inline char* chomp(char* buf) { - char* c = buf + strlen(buf); - if (c > buf && c[-1] == '\n') { - *--c = 0; -#ifdef _win32_ - if (c > buf && c[-1] == '\r') - *--c = 0; -#endif - } - return buf; -} - -inline char* chomp_cr(char* buf) { - char* c = buf + strlen(buf); - if (c > buf && c[-1] == '\n') - *--c = 0; - if (c > buf && c[-1] == '\r') - *--c = 0; - return buf; -} - -class TLineSplitter { -protected: - enum { // Default: Split string by SepStr - SplitByAnySep = 1, // Split string by Sep - NoEmptyFields = 2 // Skip all empty fields between separators - }; - -private: - ui32 Flags; - const str_spn Sep; // collection of separators - const char* SepStr; // pointer exact string to separate by - size_t SepStrLen; // length of separator string - -public: - TLineSplitter(const char* sep, bool noEmpty) - : Flags(noEmpty ? NoEmptyFields : 0) - , Sep(TString(sep, 1).data()) - , SepStr(sep) - , SepStrLen(strlen(sep)) - { - } - TLineSplitter(const str_spn& sep, bool noEmpty = false) - : Flags(SplitByAnySep | (noEmpty ? NoEmptyFields : 0)) - , Sep(sep) - , SepStr(nullptr) - , SepStrLen(1) - { - } - bool AnySep() const { - return Flags & SplitByAnySep; - } - bool SkipEmpty() const { - return Flags & NoEmptyFields; - } - /// Separates string onto tokens - /// Expecting a zero-terminated string - /// By default returns empty fields between sequential separators - void operator()(char* p, TVector<char*>& fields) const; - /// Same, but for const string - fills vector of pairs (pointer, length) - void operator()(const char* p, TVector<std::pair<const char*, size_t>>& fields) const; -}; - -/** - * Use library/cpp/map_text_file/map_tsv_file.h instead. - */ -class TSFReader { - TString Buf; // buffer used for non-'\n'-terminated string and for non-freebsd work - TLineSplitter Split; - TVector<char*> Fields; - size_t NF; // Fields.size() - size_t NR; - - TFILEPtr File; - - bool OpenPipe; // internal flag that turns open() to popen() - - i32 FieldsRequired; // if != -1, != nf, terminate program - -public: - // char separator - // Achtung: delim = ' ' imitates awk: initial separators are skipped, - // all chars less than ' ' treated as separators. - TSFReader(const char* fname = nullptr, char sep = '\t', i32 nf_reqired = -1); - // exact string separator - TSFReader(const char* fname, const char* sep, i32 nf_reqired = -1); - // fully customizable - TSFReader(const char* fname, const TLineSplitter& spl, i32 nf_reqired = -1); - - void Open(const char* fname, i32 nf_reqired = -1, size_t vbufsize = 1u << 21); // use "/dev/stdin" for stdin - void Popen(const char* pname, i32 nf_reqired = -1, size_t vbufsize = 1u << 21); - - bool NextLine(segmented_string_pool* pool = nullptr); - - bool IsOpen() const { - return (FILE*)File != nullptr; - } - bool IsEof() const { - return feof(File); - } - void Close() { - File.close(); - } - void Rewind() { - File.seek(0, SEEK_SET); - } - void Seek(i64 offset, int mode = SEEK_SET) { - File.seek(offset, mode); - } - i64 Tell() const { - return ftell(File); - } - char*& operator[](size_t ind) { - //if (ind >= NF) - // throw yexception("Can't return reference to unexisting field %" PRISZT, ind); - return Fields[ind]; - } - const char* operator[](size_t ind) const { - if (ind >= NF) - return nullptr; - return Fields[ind]; - } - operator int() const { // note: empty input line makes 0 fields - return (int)NF; - } - const char* Name() const { - return File.name().data(); - } - size_t Line() const { - return NR; - } - const TVector<char*>& GetFields() const { - return Fields; - } -}; - -struct prnstr { - char* buf; - int pos; - int asize; - prnstr() - : pos(0) - { - asize = 32; - buf = new char[asize]; - } - explicit prnstr(int asz) - : pos(0) - { - asize = asz; - buf = new char[asize]; - } - int f(const char* c, ...); - int s(const char* c1, const char* c2); - int s(const char* c1, const char* c2, const char* c3); - int s(const char* c, size_t len); - //int s(const char *c); - int s(const char* c) { - return c ? s(c, strlen(c)) : 0; - } - int s(const TString& c); - int s_htmesc(const char* c, bool enc_utf = false); - int s_htmesc_w(const char* c); - int c(char c); - int cu(wchar32 c); //for utf-8 - void restart() { - *buf = 0; - pos = 0; - } - const char* operator~() const { - return buf; - } - int operator+() const { - return pos; - } - ~prnstr() { - delete[] buf; - } - void clear(); - void swap(prnstr& w); -}; - -// functions that terminate program upon failure -FILE* read_or_die(const char* fname); -FILE* write_or_die(const char* fname); -FILE* fopen_or_die(const char* fname, const char* mode); - -// functions that throw upon failure -FILE* fopen_chk(const char* fname, const char* mode); -void fclose_chk(FILE* f, const char* fname_dbg); diff --git a/library/cpp/deprecated/fgood/fgood.cpp b/library/cpp/deprecated/fgood/fgood.cpp deleted file mode 100644 index 5d4725bfae2..00000000000 --- a/library/cpp/deprecated/fgood/fgood.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "fgood.h" - -#include <util/generic/cast.h> -#include <util/string/cast.h> -#include <util/system/fstat.h> - -#ifdef _win32_ -#include <io.h> -#endif - -i64 TFILEPtr::length() const { -#ifdef _win32_ - FHANDLE fd = (FHANDLE)_get_osfhandle(fileno(m_file)); -#else - FHANDLE fd = fileno(m_file); -#endif - i64 rv = GetFileLength(fd); - if (rv < 0) - ythrow yexception() << "TFILEPtr::length() " << Name.data() << ": " << LastSystemErrorText(); - return rv; -} - -FILE* OpenFILEOrFail(const TString& name, const char* mode) { - FILE* res = ::fopen(name.data(), mode); - if (!res) { - ythrow yexception() << "can't open \'" << name << "\' with mode \'" << mode << "\': " << LastSystemErrorText(); - } - return res; -} - -void TFILECloser::Destroy(FILE* file) { - ::fclose(file); -} - -#ifdef _freebsd_ // fgetln -#define getline getline_alt_4test -#endif // _freebsd_ - -bool getline(TFILEPtr& f, TString& s) { - char buf[4096]; - char* buf_ptr; - if (s.capacity() > sizeof(buf)) { - s.resize(s.capacity()); - if ((buf_ptr = fgets(s.begin(), IntegerCast<int>(s.capacity()), f)) == nullptr) - return false; - } else { - if ((buf_ptr = fgets(buf, sizeof(buf), f)) == nullptr) - return false; - } - size_t buf_len = strlen(buf_ptr); - bool line_complete = buf_len && buf_ptr[buf_len - 1] == '\n'; - if (line_complete) - buf_len--; - if (buf_ptr == s.begin()) - s.resize(buf_len); - else - s.AssignNoAlias(buf, buf_len); - if (line_complete) - return true; - while (fgets(buf, sizeof(buf), f)) { - size_t buf_len2 = strlen(buf); - if (buf_len2 && buf[buf_len2 - 1] == '\n') { - buf[buf_len2 - 1] = 0; - s.append(buf, buf_len2 - 1); - return true; - } - s.append(buf, buf_len2); - } - return true; -} diff --git a/library/cpp/deprecated/fgood/fgood.h b/library/cpp/deprecated/fgood/fgood.h deleted file mode 100644 index 0aaf910c0fb..00000000000 --- a/library/cpp/deprecated/fgood/fgood.h +++ /dev/null @@ -1,328 +0,0 @@ -#pragma once - -#include <util/system/yassert.h> -#include <util/system/defaults.h> -#include <util/generic/string.h> -#include <util/generic/yexception.h> -#include <util/generic/ptr.h> - -#include "fput.h" - -#include <cstdio> - -#include <fcntl.h> - -#ifdef _unix_ -extern "C" int __ungetc(int, FILE*); -#endif - -#if (!defined(__FreeBSD__) && !defined(__linux__) && !defined(_darwin_) && !defined(_cygwin_)) || defined(_bionic_) -#define feof_unlocked(_stream) feof(_stream) -#define ferror_unlocked(_stream) ferror(_stream) -#endif - -#ifndef _unix_ -#if defined(_MSC_VER) && (_MSC_VER < 1900) -#define getc_unlocked(_stream) (--(_stream)->_cnt >= 0 ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream)) -#define putc_unlocked(_c, _stream) (--(_stream)->_cnt >= 0 ? 0xff & (*(_stream)->_ptr++ = (char)(_c)) : _flsbuf((_c), (_stream))) -#else -#define getc_unlocked(_stream) getc(_stream) -#define putc_unlocked(_c, _stream) putc(_c, _stream) -#endif -#endif - -inline bool fgood(FILE* f) { - return !feof_unlocked(f) && !ferror_unlocked(f); -} - -#ifdef _win32_ -// These functions will work only with static MSVC runtime linkage. For dynamic linkage, -// fseeki64.c and ftelli64.c from CRT sources should be included in project -extern "C" int __cdecl _fseeki64(FILE*, __int64, int); -extern "C" __int64 __cdecl _ftelli64(FILE*); - -inline i64 ftello(FILE* stream) { - return _ftelli64(stream); -} - -inline int fseeko(FILE* stream, i64 offset, int origin) { - return _fseeki64(stream, offset, origin); -} -#endif - -class TFILEPtr { -private: - enum { SHOULD_CLOSE = 1, - IS_PIPE = 2 }; - FILE* m_file; - int m_Flags; - TString Name; - -public: - TFILEPtr() noexcept { - m_file = nullptr; - m_Flags = 0; - } - TFILEPtr(const TString& name, const char* mode) { - m_file = nullptr; - m_Flags = 0; - open(name, mode); - } - TFILEPtr(const TFILEPtr& src) noexcept { - m_file = src.m_file; - m_Flags = 0; - } - TFILEPtr& operator=(const TFILEPtr& src) { - if (src.m_file != m_file) { - close(); - m_file = src.m_file; - m_Flags = 0; - } - return *this; - } - explicit TFILEPtr(FILE* f) noexcept { // take ownership - m_file = f; - m_Flags = SHOULD_CLOSE; - } - TFILEPtr& operator=(FILE* f) { // take ownership - if (f != m_file) { - close(); - m_file = f; - m_Flags = SHOULD_CLOSE; - } - return *this; - } - const TString& name() const { - return Name; - } - operator FILE*() const noexcept { - return m_file; - } - FILE* operator->() const noexcept { - return m_file; - } - bool operator!() const noexcept { - return m_file == nullptr; - } - bool operator!=(FILE* f) const noexcept { - return m_file != f; - } - bool operator==(FILE* f) const noexcept { - return m_file == f; - } - ~TFILEPtr() { - close(); - } - void Y_PRINTF_FORMAT(2, 3) check(const char* message, ...) const { - if (Y_UNLIKELY(!fgood(m_file))) { - va_list args; - va_start(args, message); - char buf[512]; - vsnprintf(buf, 512, message, args); - // XXX: errno is undefined here - ythrow yexception() << buf << ": " << LastSystemErrorText() << ", " << Name.data() << " at offset " << (i64)ftell(); - } - } - TFILEPtr& assign(FILE* f, const char* name = nullptr) { // take ownership and have a name - *this = f; - if (name) - Name = name; - return *this; - } - void open(const TString& name, const char* mode) { - Y_ASSERT(!name.empty()); - Y_ASSERT(m_file == nullptr); - m_file = ::fopen(name.data(), mode); - if (!m_file) - ythrow yexception() << "can't open \'" << name << "\' with mode \'" << mode << "\': " << LastSystemErrorText(); - m_Flags = SHOULD_CLOSE; - Name = name; - } - void popen(const TString& command, const char* mode) { - Y_ASSERT(!command.empty()); - Y_ASSERT(m_file == nullptr); - m_file = ::popen(command.data(), mode); - if (!m_file) - ythrow yexception() << "can't execute \'" << command << "\' with mode \'" << mode << "\': " << LastSystemErrorText(); - m_Flags = IS_PIPE | SHOULD_CLOSE; - Name = command; - } - void close() { - if (m_file != nullptr && (m_Flags & SHOULD_CLOSE)) { - if ((m_Flags & IS_PIPE) ? ::pclose(m_file) : ::fclose(m_file)) { - m_file = nullptr; - m_Flags = 0; - if (!UncaughtException()) - ythrow yexception() << "can't close file " << Name.data() << ": " << LastSystemErrorText(); - } - } - m_file = nullptr; - m_Flags = 0; - Name.clear(); - } - size_t write(const void* buffer, size_t size, size_t count) const { - Y_ASSERT(m_file != nullptr); - size_t r = ::fwrite(buffer, size, count, m_file); - check("can't write %lu bytes", (unsigned long)size * count); - return r; - } - size_t read(void* buffer, size_t size, size_t count) const { - Y_ASSERT(m_file != nullptr); - size_t r = ::fread(buffer, size, count, m_file); - if (ferror_unlocked(m_file)) - ythrow yexception() << "can't read " << (unsigned long)size * count << " bytes: " << LastSystemErrorText() << ", " << Name.data() << " at offset " << (i64)ftell(); - return r; - } - char* fgets(char* buffer, int size) const { - Y_ASSERT(m_file != nullptr); - char* r = ::fgets(buffer, size, m_file); - if (ferror_unlocked(m_file)) - ythrow yexception() << "can't read string of maximum size " << size << ": " << LastSystemErrorText() << ", " << Name.data() << " at offset " << (i64)ftell(); - return r; - } - void Y_PRINTF_FORMAT(2, 3) fprintf(const char* format, ...) { - Y_ASSERT(m_file != nullptr); - va_list args; - va_start(args, format); - vfprintf(m_file, format, args); - check("can't write"); - } - void seek(i64 offset, int origin) const { - Y_ASSERT(m_file != nullptr); -#if defined(_unix_) || defined(_win32_) - if (fseeko(m_file, offset, origin) != 0) -#else - Y_ASSERT(offset == (i64)(i32)offset); - if (::fseek(m_file, (long)offset, origin) != 0) -#endif - ythrow yexception() << "can't seek " << Name.data() << " by " << offset << ": " << LastSystemErrorText(); - } - i64 length() const; // uses various system headers -> in fileptr.cpp - - void setDirect() const { -#if !defined(_win_) && !defined(_darwin_) - if (!m_file) - ythrow yexception() << "file not open"; - if (fcntl(fileno(m_file), F_SETFL, O_DIRECT) == -1) - ythrow yexception() << "Cannot set O_DIRECT flag"; -#endif - } - - // for convenience - - i64 ftell() const noexcept { -#if defined(_unix_) || defined(_win32_) - return ftello(m_file); -#else - return ftell(m_file); -#endif - } - bool eof() const noexcept { - Y_ASSERT(m_file != nullptr); - return feof_unlocked(m_file) != 0; - } - int fputc(int c) { - Y_ASSERT(m_file != nullptr); - return putc_unlocked(c, m_file); - } - size_t fputs(const char* buffer) const { - return write(buffer, strlen(buffer), 1); - } - int fgetc() { - Y_ASSERT(m_file != nullptr); - return getc_unlocked(m_file); - } - int ungetc(int c) { - Y_ASSERT(m_file != nullptr); - return ::ungetc(c, m_file); - } - template <class T> - size_t fput(const T& a) { - Y_ASSERT(m_file != nullptr); - return ::fput(m_file, a); - } - template <class T> - size_t fget(T& a) { - Y_ASSERT(m_file != nullptr); - return ::fget(m_file, a); - } - size_t fsput(const char* s, size_t l) { - Y_ASSERT(m_file != nullptr); - return ::fsput(m_file, s, l); - } - size_t fsget(char* s, size_t l) { - Y_ASSERT(m_file != nullptr); - return ::fsget(m_file, s, l); - } - - void fflush() { - ::fflush(m_file); - } - - /* This block contains some TFile/TStream - compatible names */ - size_t Read(void* bufferIn, size_t numBytes) { - size_t r = fsget((char*)bufferIn, numBytes); - if (Y_UNLIKELY(ferror_unlocked(m_file))) - ythrow yexception() << "can't read " << numBytes << " bytes: " << LastSystemErrorText() << ", " << Name << " at offset " << (i64)ftell(); - return r; - } - void Write(const void* buffer, size_t numBytes) { - write(buffer, 1, numBytes); - } - i64 Seek(i64 offset, int origin /*SeekDir*/) { - seek(offset, origin); - return ftell(); - } - i64 GetPosition() const noexcept { - return ftell(); - } - i64 GetLength() const noexcept { - return length(); - } - bool ReadLine(TString& st); - - /* Similar to TAutoPtr::Release - return pointer and forget about it. */ - FILE* Release() noexcept { - FILE* result = m_file; - m_file = nullptr; - m_Flags = 0; - Name.clear(); - return result; - } -}; - -inline void fclose(TFILEPtr& F) { - F.close(); -} - -inline void fseek(const TFILEPtr& F, i64 offset, int whence) { - F.seek(offset, whence); -} - -#ifdef _freebsd_ // fgetln -inline bool getline(TFILEPtr& f, TString& s) { - size_t len; - char* buf = fgetln(f, &len); - if (!buf) - return false; - if (len && buf[len - 1] == '\n') - len--; - s.AssignNoAlias(buf, len); - return true; -} -#else -bool getline(TFILEPtr& f, TString& s); -#endif //_freebsd_ - -inline bool TFILEPtr::ReadLine(TString& st) { - return getline(*this, st); -} - -FILE* OpenFILEOrFail(const TString& name, const char* mode); - -//Should be used with THolder -struct TFILECloser { - static void Destroy(FILE* file); -}; - -using TFILEHolder = THolder<FILE, TFILECloser>; diff --git a/library/cpp/deprecated/fgood/fput.h b/library/cpp/deprecated/fgood/fput.h deleted file mode 100644 index 690b06332df..00000000000 --- a/library/cpp/deprecated/fgood/fput.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -#include <util/system/defaults.h> -#include <util/system/valgrind.h> - -#include <cstdio> - -#ifdef __FreeBSD__ -#include <cstring> - -template <class T> -Y_FORCE_INLINE size_t fput(FILE* F, const T& a) { - if (Y_LIKELY(F->_w >= int(sizeof(a)))) { - memcpy(F->_p, &a, sizeof(a)); - F->_p += sizeof(a); - F->_w -= sizeof(a); - return 1; - } else { - return fwrite(&a, sizeof(a), 1, F); - } -} - -template <class T> -Y_FORCE_INLINE size_t fget(FILE* F, T& a) { - if (Y_LIKELY(F->_r >= int(sizeof(a)))) { - memcpy(&a, F->_p, sizeof(a)); - F->_p += sizeof(a); - F->_r -= sizeof(a); - return 1; - } else { - return fread(&a, sizeof(a), 1, F); - } -} - -inline size_t fsput(FILE* F, const char* s, size_t l) { - VALGRIND_CHECK_READABLE(s, l); - - if ((size_t)F->_w >= l) { - memcpy(F->_p, s, l); - F->_p += l; - F->_w -= l; - return l; - } else { - return fwrite(s, 1, l, F); - } -} - -inline size_t fsget(FILE* F, char* s, size_t l) { - if ((size_t)F->_r >= l) { - memcpy(s, F->_p, l); - F->_p += l; - F->_r -= l; - return l; - } else { - return fread(s, 1, l, F); - } -} -#else -template <class T> -Y_FORCE_INLINE size_t fput(FILE* F, const T& a) { - return fwrite(&a, sizeof(a), 1, F); -} - -template <class T> -Y_FORCE_INLINE size_t fget(FILE* F, T& a) { - return fread(&a, sizeof(a), 1, F); -} - -inline size_t fsput(FILE* F, const char* s, size_t l) { -#ifdef WITH_VALGRIND - VALGRIND_CHECK_READABLE(s, l); -#endif - return fwrite(s, 1, l, F); -} - -inline size_t fsget(FILE* F, char* s, size_t l) { - return fread(s, 1, l, F); -} -#endif diff --git a/library/cpp/deprecated/mapped_file/mapped_file.cpp b/library/cpp/deprecated/mapped_file/mapped_file.cpp deleted file mode 100644 index b0e4511299b..00000000000 --- a/library/cpp/deprecated/mapped_file/mapped_file.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "mapped_file.h" - -#include <util/generic/yexception.h> -#include <util/system/defaults.h> -#include <util/system/hi_lo.h> -#include <util/system/filemap.h> - -TMappedFile::TMappedFile(TFileMap* map, const char* dbgName) { - Map_ = map; - i64 len = Map_->Length(); - if (Hi32(len) != 0 && sizeof(size_t) <= sizeof(ui32)) - ythrow yexception() << "File '" << dbgName << "' mapping error: " << len << " too large"; - - Map_->Map(0, static_cast<size_t>(len)); -} - -TMappedFile::TMappedFile(const TFile& file, TFileMap::EOpenMode om, const char* dbgName) - : Map_(nullptr) -{ - init(file, om, dbgName); -} - -void TMappedFile::precharge(size_t off, size_t size) const { - if (!Map_) - return; - - Map_->Precharge(off, size); -} - -void TMappedFile::init(const TString& name) { - THolder<TFileMap> map(new TFileMap(name)); - TMappedFile newFile(map.Get(), name.data()); - Y_UNUSED(map.Release()); - newFile.swap(*this); - newFile.term(); -} - -void TMappedFile::init(const TString& name, size_t length, TFileMap::EOpenMode om) { - THolder<TFileMap> map(new TFileMap(name, length, om)); - TMappedFile newFile(map.Get(), name.data()); - Y_UNUSED(map.Release()); - newFile.swap(*this); - newFile.term(); -} - -void TMappedFile::init(const TFile& file, TFileMap::EOpenMode om, const char* dbgName) { - THolder<TFileMap> map(new TFileMap(file, om)); - TMappedFile newFile(map.Get(), dbgName); - Y_UNUSED(map.Release()); - newFile.swap(*this); - newFile.term(); -} - -void TMappedFile::init(const TString& name, TFileMap::EOpenMode om) { - THolder<TFileMap> map(new TFileMap(name, om)); - TMappedFile newFile(map.Get(), name.data()); - Y_UNUSED(map.Release()); - newFile.swap(*this); - newFile.term(); -} - -void TMappedFile::flush() { - Map_->Flush(); -} diff --git a/library/cpp/erasure/README.md b/library/cpp/erasure/README.md deleted file mode 100644 index 7723bf7c234..00000000000 --- a/library/cpp/erasure/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Erasure based codecs for arbitrary data - -C++ wrapper for LRC and Reed-Solomon erasure codecs. -There are two backends for LRC: Jerasure(http://jerasure.org) and ISA-L(https://github.com/intel/isa-l). ISA-L is much faster - it condsiders different instrucion sets to optimize speed of encode and decode. The only limitations now are if you don't have SSE4.2 instruction set (then base variant is as slow as Jerasure) or if you run it on aarch64 architecture (however, 2.29 version will be going to support fast implementation). However, we still have to keep Jerasure because it is incompatible due to some optimization in it which affect data layout in coded blocks. -Also see https://wiki.yandex-team.ru/yt/userdoc/erasure/, https://wiki.yandex-team.ru/ignatijjkolesnichenko/yt/erasure/. - -It is possible to use codecs LRC 2k-2-2 and Reed Solomon n-k for any data stream. All you need is to provide CodecTraits (see `codecs_ut.cpp` for examples). Note that ISA-L only supports WordSize equal to 8. If you use Jerasure codecs with bigger WordSize than `MaxWordSize` in `public.h`, codec is not guaranteed to be thread-safe. - -You can use interface in `codec.h` or use the exact codec from `lrc_isa.h`, `lrc_jerasure.h` and `reed_solomon.h` if you like. diff --git a/library/cpp/erasure/codec.cpp b/library/cpp/erasure/codec.cpp deleted file mode 100644 index 5fbcd720b28..00000000000 --- a/library/cpp/erasure/codec.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "codec.h" diff --git a/library/cpp/erasure/codec.h b/library/cpp/erasure/codec.h deleted file mode 100644 index c03d25e9c87..00000000000 --- a/library/cpp/erasure/codec.h +++ /dev/null @@ -1,80 +0,0 @@ -#pragma once - -#include "public.h" - -#include <optional> -#include <vector> - -namespace NErasure { - -//! Describes a generic way to generate parity blocks from data blocks and -//! to recover (repair) missing blocks. -/*! - * Given N data blocks (numbered from 0 to N - 1) one can call #Encode to generate - * another M parity blocks (numbered from N to N + M - 1). - * - * If some of the resulting N + M blocks ever become missing one can attempt to - * repair the missing blocks by calling #Decode. - * - * Here N and M are fixed (codec-specific) parameters. - * Call #GetDataPartCount and #GetParityPartCount to figure out the - * the values for N and M, respectively. - * - */ -template <class TBlobType> -struct ICodec { - //! Computes a sequence of parity blocks for given data blocks. - /*! - * The size of #blocks must be equal to #GetDataPartCount. - * The size of the returned array is equal to #GetParityPartCount. - */ - virtual std::vector<TBlobType> Encode(const std::vector<TBlobType>& blocks) const = 0; - - //! Decodes (repairs) missing blocks. - /*! - * #erasedIndices must contain the set of erased blocks indices. - * #blocks must contain known blocks (in the order specified by #GetRepairIndices). - * \returns The repaired blocks. - */ - virtual std::vector<TBlobType> Decode( - const std::vector<TBlobType>& blocks, - const TPartIndexList& erasedIndices) const = 0; - - //! Given a set of missing block indices, returns |true| if missing blocks can be repaired. - //! Due to performance reasons the elements of #erasedIndices must unique and sorted. - virtual bool CanRepair(const TPartIndexList& erasedIndices) const = 0; - - //! Rapid version that works with set instead of list. - virtual bool CanRepair(const TPartIndexSet& erasedIndices) const = 0; - - //! Given a set of missing block indices, checks if missing blocks can be repaired. - /*! - * \returns - * If repair is not possible, returns |std::nullopt|. - * Otherwise returns the indices of blocks (both data and parity) to be passed to #Decode - * (in this very order). Not all known blocks may be needed for repair. - */ - virtual std::optional<TPartIndexList> GetRepairIndices(const TPartIndexList& erasedIndices) const = 0; - - //! Returns the number of data blocks this codec can handle. - virtual int GetDataPartCount() const = 0; - - //! Returns the number of parity blocks this codec can handle. - virtual int GetParityPartCount() const = 0; - - //! Returns the maximum number of blocks that can always be repaired when missing. - virtual int GetGuaranteedRepairablePartCount() const = 0; - - //! Every block passed to this codec must have size divisible by the result of #GetWordSize. - virtual int GetWordSize() const = 0; - - // Extension methods - - //! Returns the sum of #GetDataPartCount and #GetParityPartCount. - int GetTotalPartCount() const { - return GetDataPartCount() + GetParityPartCount(); - } -}; - -} // namespace NErasure - diff --git a/library/cpp/erasure/helpers.cpp b/library/cpp/erasure/helpers.cpp deleted file mode 100644 index 74edeca52c0..00000000000 --- a/library/cpp/erasure/helpers.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include "helpers.h" - -#include <algorithm> -#include <iterator> - -namespace NErasure { - -TPartIndexList MakeSegment(int begin, int end) { - TPartIndexList result(end - begin); - for (int i = begin; i < end; ++i) { - result[i - begin] = i; - } - return result; -} - -TPartIndexList MakeSingleton(int elem) { - TPartIndexList result; - result.push_back(elem); - return result; -} - -TPartIndexList Difference(int begin, int end, const TPartIndexList& subtrahend) { - size_t pos = 0; - TPartIndexList result; - for (int i = begin; i < end; ++i) { - while (pos < subtrahend.size() && subtrahend[pos] < i) { - pos += 1; - } - if (pos == subtrahend.size() || subtrahend[pos] != i) { - result.push_back(i); - } - } - return result; -} - -TPartIndexList Difference(const TPartIndexList& first, const TPartIndexList& second) { - TPartIndexList result; - std::set_difference(first.begin(), first.end(), second.begin(), second.end(), std::back_inserter(result)); - return result; -} - -TPartIndexList Difference(const TPartIndexList& set, int subtrahend) { - return Difference(set, MakeSingleton(subtrahend)); -} - -TPartIndexList Intersection(const TPartIndexList& first, const TPartIndexList& second) { - TPartIndexList result; - std::set_intersection(first.begin(), first.end(), second.begin(), second.end(), std::back_inserter(result)); - return result; -} - -TPartIndexList Union(const TPartIndexList& first, const TPartIndexList& second) { - TPartIndexList result; - std::set_union(first.begin(), first.end(), second.begin(), second.end(), std::back_inserter(result)); - return result; -} - -bool Contains(const TPartIndexList& set, int elem) { - return std::binary_search(set.begin(), set.end(), elem); -} - -TPartIndexList UniqueSortedIndices(const TPartIndexList& indices) { - TPartIndexList copy = indices; - std::sort(copy.begin(), copy.end()); - copy.erase(std::unique(copy.begin(), copy.end()), copy.end()); - return copy; -} - -TPartIndexList ExtractRows(const TPartIndexList& matrix, int width, const TPartIndexList& rows) { - Y_ASSERT(matrix.size() % width == 0); - TPartIndexList result(width * rows.size()); - for (size_t i = 0; i < rows.size(); ++i) { - auto start = matrix.begin() + rows[i] * width; - std::copy(start, start + width, result.begin() + i * width); - } - return result; -} - -} // namespace NErasure - diff --git a/library/cpp/erasure/helpers.h b/library/cpp/erasure/helpers.h deleted file mode 100644 index 741186322a1..00000000000 --- a/library/cpp/erasure/helpers.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "public.h" - -namespace NErasure { - -// All vectors here are assumed to be sorted. - -TPartIndexList MakeSegment(int begin, int end); - -TPartIndexList MakeSingleton(int elem); - -TPartIndexList Difference(int begin, int end, const TPartIndexList& subtrahend); - -TPartIndexList Difference(const TPartIndexList& first, const TPartIndexList& second); - -TPartIndexList Difference(const TPartIndexList& first, int elem); - -TPartIndexList Intersection(const TPartIndexList& first, const TPartIndexList& second); - -TPartIndexList Union(const TPartIndexList& first, const TPartIndexList& second); - -bool Contains(const TPartIndexList& set, int elem); - -TPartIndexList UniqueSortedIndices(const TPartIndexList& indices); - -TPartIndexList ExtractRows(const TPartIndexList& matrix, int width, const TPartIndexList& rows); - -} // namespace NErasure - diff --git a/library/cpp/erasure/isa_erasure.cpp b/library/cpp/erasure/isa_erasure.cpp deleted file mode 100644 index 0b0199934e0..00000000000 --- a/library/cpp/erasure/isa_erasure.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "isa_erasure.h" diff --git a/library/cpp/erasure/isa_erasure.h b/library/cpp/erasure/isa_erasure.h deleted file mode 100644 index a7df61307f5..00000000000 --- a/library/cpp/erasure/isa_erasure.h +++ /dev/null @@ -1,170 +0,0 @@ -#pragma once - -#include "public.h" - -#include "helpers.h" - -#include <library/cpp/yt/assert/assert.h> - -#include <util/generic/array_ref.h> -#include <util/generic/ptr.h> -#include <util/generic/singleton.h> - -#include <vector> - -extern "C" { - #include <contrib/libs/isa-l/include/erasure_code.h> -} - -namespace NErasure { - -template <class TBlobType> -static inline unsigned char* ConstCast(typename TBlobType::const_iterator blobIter) { - return const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(blobIter)); -} - -template <int DataPartCount, int ParityPartCount, class TCodecTraits, class TBlobType = typename TCodecTraits::TBlobType, class TMutableBlobType = typename TCodecTraits::TMutableBlobType> -std::vector<TBlobType> ISAErasureEncode( - const std::vector<unsigned char>& encodeGFTables, - const std::vector<TBlobType>& dataBlocks) -{ - YT_VERIFY(dataBlocks.size() == DataPartCount); - - size_t blockLength = dataBlocks.front().Size(); - for (size_t i = 1; i < dataBlocks.size(); ++i) { - YT_VERIFY(dataBlocks[i].Size() == blockLength); - } - - std::vector<unsigned char*> dataPointers; - for (const auto& block : dataBlocks) { - dataPointers.emplace_back(ConstCast<TBlobType>(block.Begin())); - } - - std::vector<TMutableBlobType> parities(ParityPartCount); - std::vector<unsigned char*> parityPointers(ParityPartCount); - for (size_t i = 0; i < ParityPartCount; ++i) { - parities[i] = TCodecTraits::AllocateBlob(blockLength); - parityPointers[i] = ConstCast<TBlobType>(parities[i].Begin()); - memset(parityPointers[i], 0, blockLength); - } - - ec_encode_data( - blockLength, - DataPartCount, - ParityPartCount, - const_cast<unsigned char*>(encodeGFTables.data()), - dataPointers.data(), - parityPointers.data()); - - return std::vector<TBlobType>(parities.begin(), parities.end()); -} - -template <int DataPartCount, int ParityPartCount, class TCodecTraits, class TBlobType = typename TCodecTraits::TBlobType, class TMutableBlobType = typename TCodecTraits::TMutableBlobType> -std::vector<TBlobType> ISAErasureDecode( - const std::vector<TBlobType>& dataBlocks, - const TPartIndexList& erasedIndices, - TConstArrayRef<TPartIndexList> groups, - const std::vector<unsigned char>& fullGeneratorMatrix) -{ - YT_VERIFY(dataBlocks.size() >= DataPartCount); - YT_VERIFY(erasedIndices.size() <= ParityPartCount); - - size_t blockLength = dataBlocks.front().Size(); - for (size_t i = 1; i < dataBlocks.size(); ++i) { - YT_VERIFY(dataBlocks[i].Size() == blockLength); - } - - std::vector<unsigned char> partialGeneratorMatrix(DataPartCount * DataPartCount, 0); - - std::vector<unsigned char*> recoveryBlocks; - for (size_t i = 0; i < DataPartCount; ++i) { - recoveryBlocks.emplace_back(ConstCast<TBlobType>(dataBlocks[i].Begin())); - } - - // Groups check is specific for LRC. - std::vector<int> isGroupHealthy(2, 1); - for (size_t i = 0; i < 2; ++i) { - for (const auto& index : erasedIndices) { - if (!groups.empty() && Contains(groups[0], index)) { - isGroupHealthy[0] = 0; - } else if (!groups.empty() && Contains(groups[1], index)) { - isGroupHealthy[1] = 0; - } - } - } - - // When a group is healthy we cannot use its local parity, thus skip it using gap. - size_t gap = 0; - size_t decodeMatrixIndex = 0; - size_t erasedBlockIndex = 0; - while (decodeMatrixIndex < DataPartCount) { - size_t globalIndex = decodeMatrixIndex + erasedBlockIndex + gap; - - if (erasedBlockIndex < erasedIndices.size() && - globalIndex == static_cast<size_t>(erasedIndices[erasedBlockIndex])) - { - ++erasedBlockIndex; - continue; - } - - if (!groups.empty() && globalIndex >= DataPartCount && globalIndex < DataPartCount + 2) { - if (Contains(groups[0], globalIndex) && isGroupHealthy[0]) { - ++gap; - continue; - } - if (Contains(groups[1], globalIndex) && isGroupHealthy[1]) { - ++gap; - continue; - } - } - - memcpy(&partialGeneratorMatrix[decodeMatrixIndex * DataPartCount], &fullGeneratorMatrix[globalIndex * DataPartCount], DataPartCount); - ++decodeMatrixIndex; - } - - std::vector<unsigned char> invertedGeneratorMatrix(DataPartCount * DataPartCount, 0); - int res = gf_invert_matrix(partialGeneratorMatrix.data(), invertedGeneratorMatrix.data(), DataPartCount); - YT_VERIFY(res == 0); - - std::vector<unsigned char> decodeMatrix(DataPartCount * (DataPartCount + ParityPartCount), 0); - - //! Some magical code from library example. - for (size_t i = 0; i < erasedIndices.size(); ++i) { - if (erasedIndices[i] < DataPartCount) { - memcpy(&decodeMatrix[i * DataPartCount], &invertedGeneratorMatrix[erasedIndices[i] * DataPartCount], DataPartCount); - } else { - for (int k = 0; k < DataPartCount; ++k) { - int val = 0; - for (int j = 0; j < DataPartCount; ++j) { - val ^= gf_mul_erasure(invertedGeneratorMatrix[j * DataPartCount + k], fullGeneratorMatrix[DataPartCount * erasedIndices[i] + j]); - } - - decodeMatrix[DataPartCount * i + k] = val; - } - } - } - - std::vector<unsigned char> decodeGFTables(DataPartCount * erasedIndices.size() * 32); - ec_init_tables(DataPartCount, erasedIndices.size(), decodeMatrix.data(), decodeGFTables.data()); - - std::vector<TMutableBlobType> recoveredParts; - std::vector<unsigned char*> recoveredPartsPointers; - for (size_t i = 0; i < erasedIndices.size(); ++i) { - recoveredParts.emplace_back(TCodecTraits::AllocateBlob(blockLength)); - recoveredPartsPointers.emplace_back(ConstCast<TBlobType>(recoveredParts.back().Begin())); - memset(recoveredPartsPointers.back(), 0, blockLength); - } - - ec_encode_data( - blockLength, - DataPartCount, - erasedIndices.size(), - decodeGFTables.data(), - recoveryBlocks.data(), - recoveredPartsPointers.data()); - - return std::vector<TBlobType>(recoveredParts.begin(), recoveredParts.end()); -} - -} // namespace NErasure - diff --git a/library/cpp/erasure/lrc.cpp b/library/cpp/erasure/lrc.cpp deleted file mode 100644 index 8c6a347091c..00000000000 --- a/library/cpp/erasure/lrc.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "lrc.h" diff --git a/library/cpp/erasure/lrc.h b/library/cpp/erasure/lrc.h deleted file mode 100644 index 15185a47f45..00000000000 --- a/library/cpp/erasure/lrc.h +++ /dev/null @@ -1,326 +0,0 @@ -#pragma once - -#include "helpers.h" - -#include <library/cpp/sse/sse.h> - -#include <library/cpp/yt/assert/assert.h> - -#include <util/generic/array_ref.h> - -#include <algorithm> -#include <optional> - -namespace NErasure { - -template <class TCodecTraits, class TBlobType = typename TCodecTraits::TBlobType> -static inline TBlobType Xor(const std::vector<TBlobType>& refs) { - using TBufferType = typename TCodecTraits::TBufferType; - size_t size = refs.front().Size(); - TBufferType result = TCodecTraits::AllocateBuffer(size); // this also fills the buffer with zeros - for (const TBlobType& ref : refs) { - const char* data = reinterpret_cast<const char*>(ref.Begin()); - size_t pos = 0; -#ifdef ARCADIA_SSE - for (; pos + sizeof(__m128i) <= size; pos += sizeof(__m128i)) { - __m128i* dst = reinterpret_cast<__m128i*>(result.Begin() + pos); - const __m128i* src = reinterpret_cast<const __m128i*>(data + pos); - _mm_storeu_si128(dst, _mm_xor_si128(_mm_loadu_si128(src), _mm_loadu_si128(dst))); - } -#endif - for (; pos < size; ++pos) { - *(result.Begin() + pos) ^= data[pos]; - } - } - return TCodecTraits::FromBufferToBlob(std::move(result)); -} - -//! Locally Reconstructable Codes -/*! - * See https://www.usenix.org/conference/usenixfederatedconferencesweek/erasure-coding-windows-azure-storage - * for more details. - */ -template <int DataPartCount, int ParityPartCount, int WordSize, class TCodecTraits> -class TLrcCodecBase - : public ICodec<typename TCodecTraits::TBlobType> -{ - static_assert(DataPartCount % 2 == 0, "Data part count must be even."); - static_assert(ParityPartCount == 4, "Now we only support n-2-2 scheme for LRC codec"); - static_assert(1 + DataPartCount / 2 < (1 << (WordSize / 2)), "Data part count should be enough small to construct proper matrix."); -public: - //! Main blob for storing data. - using TBlobType = typename TCodecTraits::TBlobType; - //! Main mutable blob for decoding data. - using TMutableBlobType = typename TCodecTraits::TMutableBlobType; - - static constexpr ui64 RequiredDataAlignment = alignof(ui64); - - TLrcCodecBase() { - Groups_[0] = MakeSegment(0, DataPartCount / 2); - // Xor. - Groups_[0].push_back(DataPartCount); - - Groups_[1] = MakeSegment(DataPartCount / 2, DataPartCount); - // Xor. - Groups_[1].push_back(DataPartCount + 1); - - constexpr int totalPartCount = DataPartCount + ParityPartCount; - if constexpr (totalPartCount <= BitmaskOptimizationThreshold) { - CanRepair_.resize(1 << totalPartCount); - for (int mask = 0; mask < (1 << totalPartCount); ++mask) { - TPartIndexList erasedIndices; - for (size_t i = 0; i < totalPartCount; ++i) { - if ((mask & (1 << i)) == 0) { - erasedIndices.push_back(i); - } - } - CanRepair_[mask] = CalculateCanRepair(erasedIndices); - } - } - } - - /*! Note that if you want to restore any internal data, blocks offsets must by WordSize * sizeof(long) aligned. - * Though it is possible to restore unaligned data if no more than one index in each Group is failed. See unittests for this case. - */ - std::vector<TBlobType> Decode( - const std::vector<TBlobType>& blocks, - const TPartIndexList& erasedIndices) const override - { - if (erasedIndices.empty()) { - return std::vector<TBlobType>(); - } - - size_t blockLength = blocks.front().Size(); - for (size_t i = 1; i < blocks.size(); ++i) { - YT_VERIFY(blocks[i].Size() == blockLength); - } - - TPartIndexList indices = UniqueSortedIndices(erasedIndices); - - // We can restore one block by xor. - if (indices.size() == 1) { - int index = erasedIndices.front(); - for (size_t i = 0; i < 2; ++i) { - if (Contains(Groups_[i], index)) { - return std::vector<TBlobType>(1, Xor<TCodecTraits>(blocks)); - } - } - } - - TPartIndexList recoveryIndices = GetRepairIndices(indices).value(); - // We can restore two blocks from different groups using xor. - if (indices.size() == 2 && - indices.back() < DataPartCount + 2 && - recoveryIndices.back() < DataPartCount + 2) - { - std::vector<TBlobType> result; - for (int index : indices) { - for (size_t groupIndex = 0; groupIndex < 2; ++groupIndex) { - if (!Contains(Groups_[groupIndex], index)) { - continue; - } - - std::vector<TBlobType> correspondingBlocks; - for (int pos : Groups_[groupIndex]) { - for (size_t i = 0; i < blocks.size(); ++i) { - if (recoveryIndices[i] != pos) { - continue; - } - correspondingBlocks.push_back(blocks[i]); - } - } - - result.push_back(Xor<TCodecTraits>(correspondingBlocks)); - } - } - return result; - } - - return FallbackToCodecDecode(blocks, std::move(indices)); - } - - bool CanRepair(const TPartIndexList& erasedIndices) const final { - constexpr int totalPartCount = DataPartCount + ParityPartCount; - if constexpr (totalPartCount <= BitmaskOptimizationThreshold) { - int mask = (1 << (totalPartCount)) - 1; - for (int index : erasedIndices) { - mask -= (1 << index); - } - return CanRepair_[mask]; - } else { - return CalculateCanRepair(erasedIndices); - } - } - - bool CanRepair(const TPartIndexSet& erasedIndicesMask) const final { - constexpr int totalPartCount = DataPartCount + ParityPartCount; - if constexpr (totalPartCount <= BitmaskOptimizationThreshold) { - TPartIndexSet mask = erasedIndicesMask; - return CanRepair_[mask.flip().to_ulong()]; - } else { - TPartIndexList erasedIndices; - for (size_t i = 0; i < erasedIndicesMask.size(); ++i) { - if (erasedIndicesMask[i]) { - erasedIndices.push_back(i); - } - } - return CalculateCanRepair(erasedIndices); - } - } - - std::optional<TPartIndexList> GetRepairIndices(const TPartIndexList& erasedIndices) const final { - if (erasedIndices.empty()) { - return TPartIndexList(); - } - - TPartIndexList indices = UniqueSortedIndices(erasedIndices); - - if (indices.size() > ParityPartCount) { - return std::nullopt; - } - - // One erasure from data or xor blocks. - if (indices.size() == 1) { - int index = indices.front(); - for (size_t i = 0; i < 2; ++i) { - if (Contains(Groups_[i], index)) { - return Difference(Groups_[i], index); - } - } - } - - // Null if we have 4 erasures in one group. - if (indices.size() == ParityPartCount) { - bool intersectsAny = true; - for (size_t i = 0; i < 2; ++i) { - if (Intersection(indices, Groups_[i]).empty()) { - intersectsAny = false; - } - } - if (!intersectsAny) { - return std::nullopt; - } - } - - // Calculate coverage of each group. - int groupCoverage[2] = {}; - for (int index : indices) { - for (size_t i = 0; i < 2; ++i) { - if (Contains(Groups_[i], index)) { - ++groupCoverage[i]; - } - } - } - - // Two erasures, one in each group. - if (indices.size() == 2 && groupCoverage[0] == 1 && groupCoverage[1] == 1) { - return Difference(Union(Groups_[0], Groups_[1]), indices); - } - - // Erasures in only parity blocks. - if (indices.front() >= DataPartCount) { - return MakeSegment(0, DataPartCount); - } - - // Remove unnecessary xor parities. - TPartIndexList result = Difference(0, DataPartCount + ParityPartCount, indices); - for (size_t i = 0; i < 2; ++i) { - if (groupCoverage[i] == 0 && indices.size() <= 3) { - result = Difference(result, DataPartCount + i); - } - } - return result; - } - - int GetDataPartCount() const override { - return DataPartCount; - } - - int GetParityPartCount() const override { - return ParityPartCount; - } - - int GetGuaranteedRepairablePartCount() const override { - return ParityPartCount - 1; - } - - int GetWordSize() const override { - return WordSize * sizeof(long); - } - - virtual ~TLrcCodecBase() = default; - -protected: - // Indices of data blocks and corresponding xor (we have two xor parities). - TConstArrayRef<TPartIndexList> GetXorGroups() const { - return Groups_; - } - - virtual std::vector<TBlobType> FallbackToCodecDecode( - const std::vector<TBlobType>& /* blocks */, - TPartIndexList /* erasedIndices */) const = 0; - - template <typename T> - void InitializeGeneratorMatrix(T* generatorMatrix, const std::function<T(T)>& GFSquare) { - for (int row = 0; row < ParityPartCount; ++row) { - for (int column = 0; column < DataPartCount; ++column) { - int index = row * DataPartCount + column; - - bool isFirstHalf = column < DataPartCount / 2; - if (row == 0) generatorMatrix[index] = isFirstHalf ? 1 : 0; - if (row == 1) generatorMatrix[index] = isFirstHalf ? 0 : 1; - - // Let alpha_i be coefficient of first half and beta_i of the second half. - // Then matrix is non-singular iff: - // a) alpha_i, beta_j != 0 - // b) alpha_i != beta_j - // c) alpha_i + alpha_k != beta_j + beta_l - // for any i, j, k, l. - if (row == 2) { - int shift = isFirstHalf ? 1 : (1 << (WordSize / 2)); - int relativeColumn = isFirstHalf ? column : (column - (DataPartCount / 2)); - generatorMatrix[index] = shift * (1 + relativeColumn); - } - - // The last row is the square of the row before last. - if (row == 3) { - auto prev = generatorMatrix[index - DataPartCount]; - generatorMatrix[index] = GFSquare(prev); - } - } - } - } - -private: - bool CalculateCanRepair(const TPartIndexList& erasedIndices) const { - TPartIndexList indices = UniqueSortedIndices(erasedIndices); - if (indices.size() > ParityPartCount) { - return false; - } - - if (indices.size() == 1) { - int index = indices.front(); - for (size_t i = 0; i < 2; ++i) { - if (Contains(Groups_[i], index)) { - return true; - } - } - } - - // If 4 indices miss in one block we cannot recover. - if (indices.size() == ParityPartCount) { - for (size_t i = 0; i < 2; ++i) { - if (Intersection(indices, Groups_[i]).empty()) { - return false; - } - } - } - - return true; - } - - TPartIndexList Groups_[2]; - std::vector<bool> CanRepair_; -}; - -} // namespace NErasure diff --git a/library/cpp/erasure/lrc_isa.cpp b/library/cpp/erasure/lrc_isa.cpp deleted file mode 100644 index 2068f840c87..00000000000 --- a/library/cpp/erasure/lrc_isa.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "lrc_isa.h" diff --git a/library/cpp/erasure/lrc_isa.h b/library/cpp/erasure/lrc_isa.h deleted file mode 100644 index 800dc3c5cab..00000000000 --- a/library/cpp/erasure/lrc_isa.h +++ /dev/null @@ -1,77 +0,0 @@ -#pragma once - -#include "lrc.h" -#include "helpers.h" - -#include "isa_erasure.h" - -extern "C" { - #include <contrib/libs/isa-l/include/erasure_code.h> -} - -#include <library/cpp/sse/sse.h> - -#include <util/generic/array_ref.h> - -#include <optional> -#include <vector> - -namespace NErasure { - -template <int DataPartCount, int ParityPartCount, int WordSize, class TCodecTraits> -class TLrcIsa - : public TLrcCodecBase<DataPartCount, ParityPartCount, WordSize, TCodecTraits> -{ - static_assert(WordSize == 8, "ISA-l erasure codes support computations only in GF(2^8)"); -public: - //! Main blob for storing data. - using TBlobType = typename TCodecTraits::TBlobType; - //! Main mutable blob for decoding data. - using TMutableBlobType = typename TCodecTraits::TMutableBlobType; - - static constexpr ui64 RequiredDataAlignment = alignof(ui64); - - TLrcIsa() - : TLrcCodecBase<DataPartCount, ParityPartCount, WordSize, TCodecTraits>() - { - EncodeGFTables_.resize(DataPartCount * ParityPartCount * 32, 0); - GeneratorMatrix_.resize((DataPartCount + ParityPartCount) * DataPartCount, 0); - - for (int row = 0; row < DataPartCount; ++row) { - GeneratorMatrix_[row * DataPartCount + row] = 1; - } - this->template InitializeGeneratorMatrix<typename decltype(GeneratorMatrix_)::value_type>( - &GeneratorMatrix_[DataPartCount * DataPartCount], - std::bind(&gf_mul_erasure, std::placeholders::_1, std::placeholders::_1)); - - ec_init_tables( - DataPartCount, - ParityPartCount, - &GeneratorMatrix_.data()[DataPartCount * DataPartCount], - EncodeGFTables_.data()); - } - - std::vector<TBlobType> Encode(const std::vector<TBlobType>& blocks) const override { - return ISAErasureEncode<DataPartCount, ParityPartCount, TCodecTraits, TBlobType, TMutableBlobType>(EncodeGFTables_, blocks); - } - - virtual ~TLrcIsa() = default; - -private: - std::vector<TBlobType> FallbackToCodecDecode( - const std::vector<TBlobType>& blocks, - TPartIndexList erasedIndices) const override - { - return ISAErasureDecode<DataPartCount, ParityPartCount, TCodecTraits, TBlobType, TMutableBlobType>( - blocks, - std::move(erasedIndices), - this->GetXorGroups(), - GeneratorMatrix_); - } - - std::vector<unsigned char> GeneratorMatrix_; - std::vector<unsigned char> EncodeGFTables_; -}; - -} // NErasure - diff --git a/library/cpp/erasure/public.cpp b/library/cpp/erasure/public.cpp deleted file mode 100644 index 4df9bcaa186..00000000000 --- a/library/cpp/erasure/public.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "public.h" diff --git a/library/cpp/erasure/public.h b/library/cpp/erasure/public.h deleted file mode 100644 index d5cf01297b1..00000000000 --- a/library/cpp/erasure/public.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once - -#include <util/generic/buffer.h> -#include <util/generic/yexception.h> -#include <util/memory/blob.h> -#include <util/string/cast.h> -#include <util/system/src_root.h> - -#include <vector> - -#include <bitset> - -namespace NErasure { - -//! The maximum total number of blocks our erasure codec can handle. -static constexpr int MaxTotalPartCount = 16; - -//! Max word size to use. `w` in jerasure notation -static constexpr int MaxWordSize = 8; - -//! Max threshold to generate bitmask for CanRepair indices for LRC encoding. -static constexpr int BitmaskOptimizationThreshold = 22; - -//! A vector type for holding block indexes. -using TPartIndexList = std::vector<int>; - -//! Each bit corresponds to a possible block index. -using TPartIndexSet = std::bitset<MaxTotalPartCount>; - -template <class TBlobType> -struct ICodec; - -struct TDefaultCodecTraits { - using TBlobType = TBlob; - using TMutableBlobType = TBlob; - using TBufferType = TBuffer; - - static inline TMutableBlobType AllocateBlob(size_t size) { - TBufferType buffer(size); - buffer.Resize(size); - // The buffer is cleared after this call so no use after free. - return TBlob::FromBuffer(buffer); - } - - // AllocateBuffer must fill the memory with 0. - static inline TBufferType AllocateBuffer(size_t size) { - TBufferType buffer(size); - buffer.Fill(0, size); - return buffer; - } - - static inline TBlobType FromBufferToBlob(TBufferType&& blob) { - return TBlobType::FromBuffer(blob); - } -}; - -} // namespace NErasure diff --git a/library/cpp/erasure/reed_solomon.cpp b/library/cpp/erasure/reed_solomon.cpp deleted file mode 100644 index 68aa2acbfbc..00000000000 --- a/library/cpp/erasure/reed_solomon.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "reed_solomon.h" diff --git a/library/cpp/erasure/reed_solomon.h b/library/cpp/erasure/reed_solomon.h deleted file mode 100644 index a2e268e81d4..00000000000 --- a/library/cpp/erasure/reed_solomon.h +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include "helpers.h" - -#include <algorithm> -#include <optional> - -namespace NErasure { - -template <int DataPartCount, int ParityPartCount, int WordSize, class TCodecTraits> -class TReedSolomonBase - : public ICodec<typename TCodecTraits::TBlobType> -{ -public: - static constexpr ui64 RequiredDataAlignment = alignof(ui64); - - bool CanRepair(const TPartIndexList& erasedIndices) const final { - return erasedIndices.size() <= ParityPartCount; - } - - bool CanRepair(const TPartIndexSet& erasedIndices) const final { - return erasedIndices.count() <= static_cast<size_t>(ParityPartCount); - } - - std::optional<TPartIndexList> GetRepairIndices(const TPartIndexList& erasedIndices) const final { - if (erasedIndices.empty()) { - return TPartIndexList(); - } - - TPartIndexList indices = erasedIndices; - std::sort(indices.begin(), indices.end()); - indices.erase(std::unique(indices.begin(), indices.end()), indices.end()); - - if (indices.size() > static_cast<size_t>(ParityPartCount)) { - return std::nullopt; - } - - return Difference(0, DataPartCount + ParityPartCount, indices); - } - - int GetDataPartCount() const final { - return DataPartCount; - } - - int GetParityPartCount() const final { - return ParityPartCount; - } - - int GetGuaranteedRepairablePartCount() const final { - return ParityPartCount; - } - - int GetWordSize() const final { - return WordSize * sizeof(long); - } - - virtual ~TReedSolomonBase() = default; -}; - -} // namespace NErasure diff --git a/library/cpp/erasure/reed_solomon_isa.cpp b/library/cpp/erasure/reed_solomon_isa.cpp deleted file mode 100644 index eaffde54b5d..00000000000 --- a/library/cpp/erasure/reed_solomon_isa.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "reed_solomon_isa.h" diff --git a/library/cpp/erasure/reed_solomon_isa.h b/library/cpp/erasure/reed_solomon_isa.h deleted file mode 100644 index 73a3cd630f0..00000000000 --- a/library/cpp/erasure/reed_solomon_isa.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once - -#include "isa_erasure.h" -#include "reed_solomon.h" - -extern "C" { - #include <contrib/libs/isa-l/include/erasure_code.h> -} - -#include <util/generic/array_ref.h> - -#include <array> - -namespace NErasure { - -template <int DataPartCount, int ParityPartCount, int WordSize, class TCodecTraits> -class TReedSolomonIsa - : public TReedSolomonBase<DataPartCount, ParityPartCount, WordSize, TCodecTraits> -{ - static_assert(WordSize == 8, "ISA-l erasure codes support computations only in GF(2^8)"); -public: - //! Main blob for storing data. - using TBlobType = typename TCodecTraits::TBlobType; - //! Main mutable blob for decoding data. - using TMutableBlobType = typename TCodecTraits::TMutableBlobType; - - TReedSolomonIsa() { - EncodeGFTables_.resize(DataPartCount * ParityPartCount * 32, 0); - GeneratorMatrix_.resize((DataPartCount + ParityPartCount) * DataPartCount, 0); - - gf_gen_rs_matrix( - GeneratorMatrix_.data(), - DataPartCount + ParityPartCount, - DataPartCount); - - ec_init_tables( - DataPartCount, - ParityPartCount, - &GeneratorMatrix_.data()[DataPartCount * DataPartCount], - EncodeGFTables_.data()); - } - - virtual std::vector<TBlobType> Encode(const std::vector<TBlobType>& blocks) const override { - return ISAErasureEncode<DataPartCount, ParityPartCount, TCodecTraits, TBlobType, TMutableBlobType>(EncodeGFTables_, blocks); - } - - virtual std::vector<TBlobType> Decode( - const std::vector<TBlobType>& blocks, - const TPartIndexList& erasedIndices) const override - { - if (erasedIndices.empty()) { - return std::vector<TBlobType>(); - } - - return ISAErasureDecode<DataPartCount, ParityPartCount, TCodecTraits, TBlobType, TMutableBlobType>( - blocks, - erasedIndices, - TConstArrayRef<TPartIndexList>(), - GeneratorMatrix_); - } - - virtual ~TReedSolomonIsa() = default; - -private: - std::vector<unsigned char> GeneratorMatrix_; - std::vector<unsigned char> EncodeGFTables_; -}; - -} // namespace NErasure diff --git a/library/cpp/eventlog/common.h b/library/cpp/eventlog/common.h deleted file mode 100644 index 75c512c13ef..00000000000 --- a/library/cpp/eventlog/common.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -template <class T> -class TPacketInputStream { -public: - virtual bool Avail() const = 0; - virtual T operator*() const = 0; - virtual bool Next() = 0; - virtual ~TPacketInputStream() = default; -}; diff --git a/library/cpp/eventlog/dumper/common.cpp b/library/cpp/eventlog/dumper/common.cpp deleted file mode 100644 index eebe3b6ee33..00000000000 --- a/library/cpp/eventlog/dumper/common.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "common.h" - -#include <contrib/libs/re2/re2/re2.h> - -#include <util/datetime/base.h> -#include <util/datetime/parser.h> -#include <util/string/cast.h> - -static time_t RecentTime(int h, int m, int s) { - time_t now = time(nullptr); - tm tmTmp; - localtime_r(&now, &tmTmp); - tmTmp.tm_hour = h; - tmTmp.tm_min = m; - tmTmp.tm_sec = s; - time_t today = mktime(&tmTmp); - tmTmp.tm_mday -= 1; - time_t yesterday = mktime(&tmTmp); - return today <= now ? today : yesterday; -} - -static bool ParseRecentTime(const TString& str, time_t& result) { - RE2 RecentTimePattern("(\\d{1,2}):(\\d{2})(?::(\\d{2}))?"); - re2::StringPiece hStr, mStr, sStr; - if (!RE2::FullMatch({str.data(), str.size()}, RecentTimePattern, &hStr, &mStr, &sStr)) { - return false; - } - int h = FromString<int>(hStr.data(), hStr.length()); - int m = FromString<int>(mStr.data(), mStr.length()); - int s = FromString<int>(sStr.data(), sStr.length(), 0); - if (h > 23 || m > 59 || s > 59) { - return false; - } - result = RecentTime(h, m, s); - return true; -} - -namespace { - class TDefaultOffset8601Parser: public TIso8601DateTimeParser { - public: - TDefaultOffset8601Parser(int offsetHours) { - DateTimeFields.ZoneOffsetMinutes = offsetHours * 60; - } - }; -} // namespace - -static bool ParseISO8601DateTimeWithDefaultOffset(TStringBuf str, int offsetHours, time_t& result) { - TDefaultOffset8601Parser parser{offsetHours}; - - if (!parser.ParsePart(str.data(), str.size())) { - return false; - } - - const TInstant instant = parser.GetResult(TInstant::Max()); - if (instant == TInstant::Max()) { - return false; - } - - result = instant.TimeT(); - return true; -} - -ui64 ParseTime(const TString& str, ui64 defValue, int offset) { - if (!str) { - return defValue; - } - - time_t utcTime; - - if (ParseISO8601DateTimeWithDefaultOffset(str, offset, utcTime)) { - return (ui64)utcTime * 1000000; - } - - if (ParseRecentTime(str, utcTime)) { - return (ui64)utcTime * 1000000; - } - - // if conversion fails, TryFromString leaves defValue unchanged - TryFromString<ui64>(str, defValue); - return defValue; -} diff --git a/library/cpp/eventlog/dumper/common.h b/library/cpp/eventlog/dumper/common.h deleted file mode 100644 index 839fc7b221c..00000000000 --- a/library/cpp/eventlog/dumper/common.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include <util/generic/string.h> - -/** - * Returns microseconds since the epoch. - */ -ui64 ParseTime(const TString& str, ui64 defValue, int offset /* timezone offset, default MSK */ = 3); diff --git a/library/cpp/eventlog/dumper/evlogdump.cpp b/library/cpp/eventlog/dumper/evlogdump.cpp deleted file mode 100644 index 003b412265b..00000000000 --- a/library/cpp/eventlog/dumper/evlogdump.cpp +++ /dev/null @@ -1,414 +0,0 @@ -#include "common.h" -#include "evlogdump.h" - -#include <library/cpp/eventlog/evdecoder.h> -#include <library/cpp/eventlog/iterator.h> -#include <library/cpp/eventlog/logparser.h> - -#include <library/cpp/getopt/last_getopt.h> - -#ifndef NO_SVN_DEPEND -#include <library/cpp/svnversion/svnversion.h> -#endif - -#include <util/datetime/base.h> -#include <util/generic/ptr.h> -#include <util/stream/file.h> -#include <util/string/cast.h> -#include <util/string/type.h> - -using namespace NEventLog; -namespace nlg = NLastGetopt; - -IFrameFilterRef CreateDurationFrameFilter(const TString& params) { - TStringBuf d(params); - TStringBuf l, r; - d.Split(':', l, r); - TDuration min = l.empty() ? TDuration::Zero() : FromString<TDuration>(l); - TDuration max = r.empty() ? TDuration::Max() : FromString<TDuration>(r); - - if (min > TDuration::Zero() || max < TDuration::Max()) { - return new TDurationFrameFilter(min.GetValue(), max.GetValue()); - } - - return nullptr; -} - -IFrameFilterRef CreateFrameIdFilter(const ui32 frameId) { - return new TFrameIdFrameFilter(frameId); -} - -IFrameFilterRef CreateContainsEventFrameFilter(const TString& args, const IEventFactory* factory) { - return new TContainsEventFrameFilter(args, factory); -} - -void ListAllEvents(IEventFactory* factory, IOutputStream* out) { - Y_ENSURE(out); - - for (TEventClass eventClass = factory->EventClassBegin(); eventClass < factory->EventClassEnd(); eventClass++) { - THolder<TEvent> event(factory->CreateLogEvent(eventClass)); - - const TStringBuf& name = event->GetName(); - if (name) { - (*out) << name << "\n"; - } - } -} - -void ListEventFieldsByEventId(const TEventClass eventClass, IEventFactory* factory, IOutputStream* out) { - THolder<TEvent> event(factory->CreateLogEvent(eventClass)); - const NProtoBuf::Message* message = event->GetProto(); - const google::protobuf::Descriptor* descriptor = message->GetDescriptor(); - - (*out) << descriptor->DebugString(); -} - -void ListEventFields(const TString& eventName, IEventFactory* factory, IOutputStream* out) { - Y_ENSURE(out); - - TEventClass eventClass; - - try { - eventClass = factory->ClassByName(eventName); - } catch (yexception& e) { - if (!TryFromString<TEventClass>(eventName, eventClass)) { - (*out) << "Cannot dervie event class from event name: " << eventName << Endl; - return; - } - } - - ListEventFieldsByEventId(eventClass, factory, out); -} - -int PrintHelpEvents(const TString& helpEvents, IEventFactory* factory) { - if (helpEvents == "all") { - ListAllEvents(factory, &Cout); - } else if (IsNumber(helpEvents)) { - ListEventFieldsByEventId(IntFromString<ui32, 10>(helpEvents), factory, &Cout); - } else { - ListEventFields(helpEvents, factory, &Cout); - } - - return 0; -} - -int IterateEventLog(IEventFactory* fac, IEventProcessor* proc, int argc, const char** argv) { - class TProxy: public ITunableEventProcessor { - public: - TProxy(IEventProcessor* proc) - : Processor_(proc) - { - } - - void AddOptions(NLastGetopt::TOpts&) override { - } - - void SetOptions(const TEvent::TOutputOptions& options) override { - Processor_->SetOptions(options); - } - - void ProcessEvent(const TEvent* ev) override { - Processor_->ProcessEvent(ev); - } - - bool CheckedProcessEvent(const TEvent* ev) override { - return Processor_->CheckedProcessEvent(ev); - } - - private: - IEventProcessor* Processor_ = nullptr; - }; - - TProxy proxy(proc); - return IterateEventLog(fac, &proxy, argc, argv); -} - -int IterateEventLog(IEventFactory* fac, ITunableEventProcessor* proc, int argc, const char** argv) { - nlg::TOpts opts; - opts.AddHelpOption('?'); - opts.AddHelpOption('h'); - opts.SetTitle( - "Search EventLog dumper\n\n" - "Examples:\n" - "evlogdump -s 1228484839332219 -e 1228484840332219 event_log\n" - "evlogdump -s 2008-12-12T12:00:00+03 -e 2008-12-12T12:05:00+03 event_log\n" - "evlogdump -s 12:40 -e 12:55 event_log\n" - "evlogdump -i 301,302,303 event_log\n" - "evlogdump -i SubSourceResponse,SubSourceOk,SubSourceError event_log\n" - "evlogdump -d 40ms:60ms event_log\n" - "evlogdump -c ReqId:ReqId:1563185655856304-30407004790538173600035-vla1-0671-p1\n" - "\n" - "Fine manual: https://nda.ya.ru/3Tpo3L\n" - "\n" - "If in trouble using this (or bugs encountered),\n" - "please don't hesitate to ask middlesearch/basesearch dev team\n" - "(vmordovin@, mvel@, etc)\n"); - - TString start; - opts.AddLongOption( - 's', "start-time", - "Start time (Unix time in microseconds, ISO8601, or HH:MM[:SS] in the last 24 hours).\n" - "Long frames can produce inaccurate cropping and event loss in dump (see SEARCH-5576)") - .Optional() - .StoreResult(&start); - - TString end; - opts.AddLongOption( - 'e', "end-time", - "End time (Unix time in microseconds, ISO8601, or HH:MM[:SS] in the last 24 hours)") - .Optional() - .StoreResult(&end); - - TOptions o; - - opts.AddLongOption( - 'm', "max-request-duration", - "Max duration of a request in the log, in us") - .Optional() - .StoreResult(&o.MaxRequestDuration); - - bool oneFrame = false; - opts.AddLongOption( - 'f', "one-frame", - "Treat input file as single frame dump (e.g. from gdb)") - .NoArgument() - .Optional() - .StoreValue(&oneFrame, true); - - opts.AddLongOption( - 'v', "version", - "Print program version") - .NoArgument() - .Optional() - .Handler(&nlg::PrintVersionAndExit); - - TString includeEventList; - opts.AddLongOption( - 'i', "event-list", - "Comma-separated list of included event class IDs or names " - "(e.g. 265,287 or MainTaskError,ContextCreated)") - .Optional() - .StoreResult(&includeEventList) - .StoreValue(&o.EnableEvents, true); - - TString durationFilterStr; - opts.AddLongOption( - 'd', "duration", - "DurationMin[:DurationMax] (values must contain a unit, valid examples are: 50us, 50ms, 50s)\n" - "(show frames with duration greater or equal DurationMin [and less or equal than DurationMax])") - .Optional() - .StoreResult(&durationFilterStr); - - const ui32 INVALID_FRAME_ID = ui32(-1); - ui32 frameIdFilter = INVALID_FRAME_ID; - opts.AddLongOption( - 'n', "frame-id", - "Filter frame with given id\n") - .Optional() - .StoreResult(&frameIdFilter); - - TString excludeEventList; - opts.AddLongOption( - 'x', "exclude-list", - "Comma-separated list of excluded event class IDs or names (see also --event-list option)") - .Optional() - .StoreResult(&excludeEventList) - .StoreValue(&o.EnableEvents, false); - - opts.AddLongOption( - 'o', "frame-order", - "Order events by time only inside a frame (faster)") - .NoArgument() - .Optional() - .StoreValue(&o.ForceWeakOrdering, true); - - opts.AddLongOption( - 'O', "global-order", - "Globally but lossy (may lose some frames) order events by time only (slower)") - .NoArgument() - .Optional() - .StoreValue(&o.ForceStrongOrdering, true); - - opts.AddLongOption( - "lossless-strong-order", - "Globally order events by time only (super slow and memory heavy)") - .NoArgument() - .Optional() - .StoreValue(&o.ForceLosslessStrongOrdering, true) - .StoreValue(&o.ForceStrongOrdering, true); - - opts.AddLongOption( - 'S', "stream", - "Force stream mode (for log files with invalid ending)") - .NoArgument() - .Optional() - .StoreValue(&o.ForceStreamMode, true); - - opts.AddLongOption( - 't', "tail", - "Open file like `tail -f` does") - .NoArgument() - .Optional() - .StoreValue(&o.TailFMode, true); - - bool unescaped = false; - opts.AddLongOption( - 'u', "unescaped", - "Don't escape \\t, \\n chars in message fields") - .NoArgument() - .StoreValue(&unescaped, true); - - bool json = false; - opts.AddLongOption( - 'j', "json", - "Print messages as JSON values") - .NoArgument() - .StoreValue(&json, true); - - TEvent::TOutputOptions outputOptions; - opts.AddLongOption( - 'r', "human-readable", - "Print some fields (e.g. timestamp) in human-readable format, add time offsets") - .NoArgument() - .StoreValue(&outputOptions.HumanReadable, true); - - //Supports only fields of type string - TString containsEvent; - opts.AddLongOption( - 'c', "contains-event", - "Only print frames that contain events whose particular field's value matches given value.\n" - "Match group should be provided in format: EventName:FieldName:ValueToMatch\n" - "If more than one match group is provided, they should be separated by / delimiter.\n" - "Nested fields are supported through \'.\' in FieldName.\n" - "Symbols \'/\' and \':\' in EventName, FieldName or ValueToMatch must be escaped.\n" - "NOTE: bool values are 1 and 0.") - .Optional() - .StoreResult(&containsEvent); - - TString helpEvents; - opts.AddLongOption("help-events") - .RequiredArgument("EVENT, EVENT_ID or string \"all\"") - .Optional() - .StoreResult(&helpEvents); - - proc->AddOptions(opts); - - opts.SetFreeArgsMin(0); - opts.SetFreeArgsMax(1); - opts.SetFreeArgTitle(0, "<eventlog>", "Event log file"); - - try { - const nlg::TOptsParseResult optsRes(&opts, argc, argv); - - if (helpEvents) { - return PrintHelpEvents(helpEvents, fac); - } - - TVector<TString> freeArgs = optsRes.GetFreeArgs(); - if (freeArgs) { - o.FileName = freeArgs[0]; - } - - ui32 conditionsHappened = 0; - - if (frameIdFilter != INVALID_FRAME_ID) { - ++conditionsHappened; - } - if (containsEvent) { - ++conditionsHappened; - } - if (durationFilterStr) { - ++conditionsHappened; - } - - if (conditionsHappened > 1) { - throw nlg::TUsageException() << "You can only use no more than one of frame id, duration or contains event frame filters."; - } - - if (frameIdFilter != INVALID_FRAME_ID) { - o.FrameFilter = CreateFrameIdFilter(frameIdFilter); - } else if (durationFilterStr) { - o.FrameFilter = CreateDurationFrameFilter(durationFilterStr); - } else if (containsEvent) { - o.FrameFilter = CreateContainsEventFrameFilter(containsEvent, fac); - } - - // handle some inconsistencies - if (o.ForceWeakOrdering && o.ForceStrongOrdering) { - throw nlg::TUsageException() << "You can use either strong (-O) or weak (-o) ordering. "; - } - if (includeEventList && excludeEventList) { - throw nlg::TUsageException() << "You can use either include (-i) or exclude (-x) events list. "; - } - if (unescaped && json) { - throw nlg::TUsageException() << "You can use either unescaped (-u) or json (-j) output format. "; - } - - proc->CheckOptions(); - } catch (...) { - Cerr << "Usage error: " << CurrentExceptionMessage() << Endl; - return 1; - } - - o.EvList = o.EnableEvents ? includeEventList : excludeEventList; - if (json) { - outputOptions.OutputFormat = TEvent::TOutputFormat::Json; - } else if (unescaped) { - outputOptions.OutputFormat = TEvent::TOutputFormat::TabSeparatedRaw; - } else { - outputOptions.OutputFormat = TEvent::TOutputFormat::TabSeparated; - } - - IEventProcessor* eventProcessor = NEvClass::Processor(); - // FIXME(mvel): A little of hell here: `proc` and `eventProcessor` are `IEventProcessor`s - // So we need to set options for BOTH! - - eventProcessor->SetOptions(outputOptions); - proc->SetOptions(outputOptions); - proc->SetEventProcessor(eventProcessor); - - if (oneFrame) { - THolder<IInputStream> fileInput; - - // this is for coredumps analysis, usage: - // gdb: dump binary memory framefile Data_ Data_ + Pos_ - // evlogdump -f framefile - IInputStream* usedInput = nullptr; - - if (o.FileName.size()) { - fileInput.Reset(new TUnbufferedFileInput(o.FileName)); - usedInput = fileInput.Get(); - } else { - usedInput = &Cin; - } - - try { - for (;;) { - proc->ProcessEvent(DecodeEvent(*usedInput, true, 0, nullptr, fac).Get()); - } - } catch (...) { - } - - return 0; - } - - o.StartTime = ParseTime(start, MIN_START_TIME); - o.EndTime = ParseTime(end, MAX_END_TIME); - - try { - THolder<IIterator> it = CreateIterator(o, fac); - - while (const auto ev = it->Next()) { - if (!proc->CheckedProcessEvent(ev.Get())) { - break; - } - } - - return 0; - } catch (...) { - Cout.Flush(); - Cerr << "Error occured: " << CurrentExceptionMessage() << Endl; - } - - return 1; -} diff --git a/library/cpp/eventlog/dumper/evlogdump.h b/library/cpp/eventlog/dumper/evlogdump.h deleted file mode 100644 index eb150573746..00000000000 --- a/library/cpp/eventlog/dumper/evlogdump.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include "tunable_event_processor.h" - -#include <library/cpp/eventlog/eventlog.h> - -int IterateEventLog(IEventFactory* fac, IEventProcessor* proc, int argc, const char** argv); -int IterateEventLog(IEventFactory* fac, ITunableEventProcessor* proc, int argc, const char** argv); - -// added for using in infra/libs/logger/log_printer.cpp -int PrintHelpEvents(const TString& helpEvents, IEventFactory* factory); diff --git a/library/cpp/eventlog/dumper/tunable_event_processor.cpp b/library/cpp/eventlog/dumper/tunable_event_processor.cpp deleted file mode 100644 index 8333089cb54..00000000000 --- a/library/cpp/eventlog/dumper/tunable_event_processor.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "tunable_event_processor.h" diff --git a/library/cpp/eventlog/dumper/tunable_event_processor.h b/library/cpp/eventlog/dumper/tunable_event_processor.h deleted file mode 100644 index b56eae9222a..00000000000 --- a/library/cpp/eventlog/dumper/tunable_event_processor.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include <library/cpp/eventlog/eventlog.h> - -namespace NLastGetopt { - class TOpts; -} - -class ITunableEventProcessor: public IEventProcessor { -public: - virtual void SetEventProcessor(IEventProcessor* /*processor*/) { - } - - virtual void AddOptions(NLastGetopt::TOpts& opts) = 0; - virtual void CheckOptions() { - } - virtual ~ITunableEventProcessor() { - } -}; diff --git a/library/cpp/eventlog/evdecoder.cpp b/library/cpp/eventlog/evdecoder.cpp deleted file mode 100644 index e4413a1b0e0..00000000000 --- a/library/cpp/eventlog/evdecoder.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#include <util/memory/tempbuf.h> -#include <util/string/cast.h> -#include <util/stream/output.h> - -#include "evdecoder.h" -#include "logparser.h" - -static const char* const UNKNOWN_EVENT_CLASS = "Unknown event class"; - -static inline void LogError(ui64 frameAddr, const char* msg, bool strict) { - if (!strict) { - Cerr << "EventDecoder warning @" << frameAddr << ": " << msg << Endl; - } else { - ythrow yexception() << "EventDecoder error @" << frameAddr << ": " << msg; - } -} - -static inline bool SkipData(IInputStream& s, size_t amount) { - return (amount == s.Skip(amount)); -} - -// There are 2 log fomats: the one, that allows event skip without event decode (it has stored event length) -// and another, that requires each event decode just to seek over stream. needRead == true means the latter format. -static inline THolder<TEvent> DoDecodeEvent(IInputStream& s, const TEventFilter* const filter, const bool needRead, IEventFactory* fac) { - TEventTimestamp ts; - TEventClass c; - THolder<TEvent> e; - - ::Load(&s, ts); - ::Load(&s, c); - - bool needReturn = false; - - if (!filter || filter->EventAllowed(c)) { - needReturn = true; - } - - if (needRead || needReturn) { - e.Reset(fac->CreateLogEvent(c)); - - if (!!e) { - e->Timestamp = ts; - e->Load(s); - } else if (needReturn) { - e.Reset(new TUnknownEvent(ts, c)); - } - - if (!needReturn) { - e.Reset(nullptr); - } - } - - return e; -} - -THolder<TEvent> DecodeFramed(IInputStream& inp, ui64 frameAddr, const TEventFilter* const filter, IEventFactory* fac, bool strict) { - ui32 len; - ::Load(&inp, len); - - if (len < sizeof(ui32)) { - ythrow TEventDecoderError() << "invalid event length"; - } - - TLengthLimitedInput s(&inp, len - sizeof(ui32)); - - try { - THolder<TEvent> e = DoDecodeEvent(s, filter, false, fac); - if (!!e) { - if (!s.Left()) { - return e; - } else if (e->Class == 0) { - if (!SkipData(s, s.Left())) { - ythrow TEventDecoderError() << "cannot skip bad event"; - } - - return e; - } - - LogError(frameAddr, "Event is not fully read", strict); - } - } catch (const TLoadEOF&) { - if (s.Left()) { - throw; - } - - LogError(frameAddr, "Unexpected event end", strict); - } - - if (!SkipData(s, s.Left())) { - ythrow TEventDecoderError() << "cannot skip bad event"; - } - - return nullptr; -} - -THolder<TEvent> DecodeEvent(IInputStream& s, bool framed, ui64 frameAddr, const TEventFilter* const filter, IEventFactory* fac, bool strict) { - try { - if (framed) { - return DecodeFramed(s, frameAddr, filter, fac, strict); - } else { - THolder<TEvent> e = DoDecodeEvent(s, filter, true, fac); - // e(0) means event, skipped by filter. Not an error. - if (!!e && !e->Class) { - ythrow TEventDecoderError() << UNKNOWN_EVENT_CLASS; - } - - return e; - } - } catch (const TLoadEOF&) { - ythrow TEventDecoderError() << "unexpected frame end"; - } -} diff --git a/library/cpp/eventlog/evdecoder.h b/library/cpp/eventlog/evdecoder.h deleted file mode 100644 index eedfc821743..00000000000 --- a/library/cpp/eventlog/evdecoder.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include <util/generic/yexception.h> -#include <util/generic/ptr.h> - -#include "eventlog.h" - -class TEvent; -class IInputStream; -class TEventFilter; - -struct TEventDecoderError: public yexception { -}; - -THolder<TEvent> DecodeEvent(IInputStream& s, bool framed, ui64 frameAddr, const TEventFilter* const filter, IEventFactory* fac, bool strict = false); -bool AcceptableContent(TEventLogFormat); diff --git a/library/cpp/eventlog/event_field_output.cpp b/library/cpp/eventlog/event_field_output.cpp deleted file mode 100644 index a1b4c2dafa1..00000000000 --- a/library/cpp/eventlog/event_field_output.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "event_field_output.h" - -#include <util/string/split.h> - -namespace { - TString MakeSeparators(EFieldOutputFlags flags) { - TString res; - res.reserve(3); - - if (flags & EFieldOutputFlag::EscapeTab) { - res.append('\t'); - } - if (flags & EFieldOutputFlag::EscapeNewLine) { - res.append('\n'); - } - if (flags & EFieldOutputFlag::EscapeBackSlash) { - res.append('\\'); - } - - return res; - } -} - -TEventFieldOutput::TEventFieldOutput(IOutputStream& output, EFieldOutputFlags flags) - : Output(output) - , Flags(flags) - , Separators(MakeSeparators(flags)) -{ -} - -IOutputStream& TEventFieldOutput::GetOutputStream() { - return Output; -} - -EFieldOutputFlags TEventFieldOutput::GetFlags() const { - return Flags; -} - -void TEventFieldOutput::DoWrite(const void* buf, size_t len) { - if (!Flags) { - Output.Write(buf, len); - return; - } - - TStringBuf chunk{static_cast<const char*>(buf), len}; - - for (const auto part : StringSplitter(chunk).SplitBySet(Separators.data())) { - TStringBuf token = part.Token(); - TStringBuf delim = part.Delim(); - - if (!token.empty()) { - Output.Write(token); - } - if ("\n" == delim) { - Output.Write(TStringBuf("\\n")); - } else if ("\t" == delim) { - Output.Write(TStringBuf("\\t")); - } else if ("\\" == delim) { - Output.Write(TStringBuf("\\\\")); - } else { - Y_ASSERT(delim.empty()); - } - } -} - diff --git a/library/cpp/eventlog/event_field_output.h b/library/cpp/eventlog/event_field_output.h deleted file mode 100644 index ed9db0ae167..00000000000 --- a/library/cpp/eventlog/event_field_output.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include <util/stream/output.h> -#include <util/generic/flags.h> - -enum class EFieldOutputFlag { - EscapeTab = 0x1, // escape \t in field value - EscapeNewLine = 0x2, // escape \n in field value - EscapeBackSlash = 0x4 // escape \ in field value -}; - -Y_DECLARE_FLAGS(EFieldOutputFlags, EFieldOutputFlag); -Y_DECLARE_OPERATORS_FOR_FLAGS(EFieldOutputFlags); - -class TEventFieldOutput: public IOutputStream { -public: - TEventFieldOutput(IOutputStream& output, EFieldOutputFlags flags); - - IOutputStream& GetOutputStream(); - EFieldOutputFlags GetFlags() const; - -protected: - void DoWrite(const void* buf, size_t len) override; - -private: - IOutputStream& Output; - EFieldOutputFlags Flags; - TString Separators; -}; diff --git a/library/cpp/eventlog/event_field_printer.cpp b/library/cpp/eventlog/event_field_printer.cpp deleted file mode 100644 index 29c6b4b661e..00000000000 --- a/library/cpp/eventlog/event_field_printer.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "event_field_printer.h" - -#include <library/cpp/protobuf/json/proto2json.h> - -namespace { - - const NProtobufJson::TProto2JsonConfig PROTO_2_JSON_CONFIG = NProtobufJson::TProto2JsonConfig() - .SetMissingRepeatedKeyMode(NProtobufJson::TProto2JsonConfig::MissingKeyDefault) - .AddStringTransform(MakeIntrusive<NProtobufJson::TBase64EncodeBytesTransform>()); - -} // namespace - -TEventProtobufMessageFieldPrinter::TEventProtobufMessageFieldPrinter(EProtobufMessageFieldPrintMode mode) - : Mode(mode) -{} - -template <> -void TEventProtobufMessageFieldPrinter::PrintProtobufMessageFieldToOutput<google::protobuf::Message, false>(const google::protobuf::Message& field, TEventFieldOutput& output) { - switch (Mode) { - case EProtobufMessageFieldPrintMode::DEFAULT: - case EProtobufMessageFieldPrintMode::JSON: { - // Do not use field.PrintJSON() here: IGNIETFERRO-2002 - NProtobufJson::Proto2Json(field, output, PROTO_2_JSON_CONFIG); - break; - } - } -} diff --git a/library/cpp/eventlog/event_field_printer.h b/library/cpp/eventlog/event_field_printer.h deleted file mode 100644 index 835e8f4a850..00000000000 --- a/library/cpp/eventlog/event_field_printer.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include "event_field_output.h" - -#include <google/protobuf/message.h> - -// NB: For historical reasons print code for all primitive types/repeated fields/etc generated by https://a.yandex-team.ru/arc/trunk/arcadia/tools/event2cpp - -enum class EProtobufMessageFieldPrintMode { - // Use <TEventProtobufMessageFieldType>::Print method for fields that has it - // Print json for other fields - DEFAULT = 0, - - JSON = 1, -}; - -class TEventProtobufMessageFieldPrinter { -public: - explicit TEventProtobufMessageFieldPrinter(EProtobufMessageFieldPrintMode mode); - - template <typename TEventProtobufMessageFieldType, bool HasPrintFunction> - void PrintProtobufMessageFieldToOutput(const TEventProtobufMessageFieldType& field, TEventFieldOutput& output) { - if constexpr (HasPrintFunction) { - if (Mode == EProtobufMessageFieldPrintMode::DEFAULT) { - field.Print(output.GetOutputStream(), output.GetFlags()); - return; - } - } - - PrintProtobufMessageFieldToOutput<google::protobuf::Message, false>(field, output); - } - - template <> - void PrintProtobufMessageFieldToOutput<google::protobuf::Message, false>(const google::protobuf::Message& field, TEventFieldOutput& output); - -private: - EProtobufMessageFieldPrintMode Mode; -}; diff --git a/library/cpp/eventlog/eventlog.cpp b/library/cpp/eventlog/eventlog.cpp deleted file mode 100644 index 458a632b4a2..00000000000 --- a/library/cpp/eventlog/eventlog.cpp +++ /dev/null @@ -1,554 +0,0 @@ -#include <util/datetime/base.h> -#include <util/stream/zlib.h> -#include <util/stream/length.h> -#include <util/generic/buffer.h> -#include <util/generic/yexception.h> -#include <util/digest/murmur.h> -#include <util/generic/singleton.h> -#include <util/generic/function.h> -#include <util/stream/output.h> -#include <util/stream/format.h> -#include <util/stream/null.h> - -#include <google/protobuf/messagext.h> - -#include "eventlog.h" -#include "events_extension.h" -#include "evdecoder.h" -#include "logparser.h" -#include <library/cpp/eventlog/proto/internal.pb.h> - -#include <library/cpp/json/json_writer.h> -#include <library/cpp/protobuf/json/proto2json.h> - - -TAtomic eventlogFrameCounter = 0; - -namespace { - - const NProtobufJson::TProto2JsonConfig PROTO_2_JSON_CONFIG = NProtobufJson::TProto2JsonConfig() - .SetMissingRepeatedKeyMode(NProtobufJson::TProto2JsonConfig::MissingKeyDefault) - .AddStringTransform(MakeIntrusive<NProtobufJson::TBase64EncodeBytesTransform>()); - - ui32 GenerateFrameId() { - return ui32(AtomicAdd(eventlogFrameCounter, 1)); - } - - inline const NProtoBuf::Message* UnknownEventMessage() { - return Singleton<NEventLogInternal::TUnknownEvent>(); - } - -} // namespace - -void TEvent::Print(IOutputStream& out, const TOutputOptions& options, const TEventState& eventState) const { - if (options.OutputFormat == TOutputFormat::TabSeparatedRaw) { - PrintHeader(out, options, eventState); - DoPrint(out, {}); - } else if (options.OutputFormat == TOutputFormat::TabSeparated) { - PrintHeader(out, options, eventState); - DoPrint( - out, - EFieldOutputFlags{} | EFieldOutputFlag::EscapeNewLine | EFieldOutputFlag::EscapeBackSlash); - } else if (options.OutputFormat == TOutputFormat::Json) { - NJson::TJsonWriterConfig jsonWriterConfig; - jsonWriterConfig.FormatOutput = 0; - NJson::TJsonWriter jsonWriter(&out, jsonWriterConfig); - - jsonWriter.OpenMap(); - PrintJsonHeader(jsonWriter); - DoPrintJson(jsonWriter); - jsonWriter.CloseMap(); - } -} - -void TEvent::PrintHeader(IOutputStream& out, const TOutputOptions& options, const TEventState& eventState) const { - if (options.HumanReadable) { - out << TInstant::MicroSeconds(Timestamp).ToString() << "\t"; - if (Timestamp >= eventState.FrameStartTime) - out << "+" << HumanReadable(TDuration::MicroSeconds(Timestamp - eventState.FrameStartTime)); - else // a bug somewhere? anyway, let's handle it in a nice fashion - out << "-" << HumanReadable(TDuration::MicroSeconds(eventState.FrameStartTime - Timestamp)); - - if (Timestamp >= eventState.PrevEventTime) - out << " (+" << HumanReadable(TDuration::MicroSeconds(Timestamp - eventState.PrevEventTime)) << ")"; - // else: these events are async and out-of-order, relative time diff makes no sense, skip it - - out << "\tF# " << FrameId << '\t'; - } else { - out << static_cast<TEventTimestamp>(Timestamp); - out << '\t' << FrameId << '\t'; - } -} - -void TEvent::PrintJsonHeader(NJson::TJsonWriter& jsonWriter) const { - jsonWriter.Write("Timestamp", Timestamp); - jsonWriter.Write("FrameId", FrameId); -} - -class TProtobufEvent: public TEvent { -public: - TProtobufEvent(TEventTimestamp t, size_t eventId, const NProtoBuf::Message& msg) - : TEvent(eventId, t) - , Message_(&msg) - , EventFactory_(NProtoBuf::TEventFactory::Instance()) - { - } - - TProtobufEvent() - : TEvent(0, 0) - , EventFactory_(NProtoBuf::TEventFactory::Instance()) - { - } - - explicit TProtobufEvent(ui32 id, NProtoBuf::TEventFactory* eventFactory = NProtoBuf::TEventFactory::Instance()) - : TEvent(id, 0) - , EventFactory_(eventFactory) - { - InnerMsg_.Reset(EventFactory_->CreateEvent(Class)); - Message_ = InnerMsg_.Get(); - } - - ui32 Id() const { - return Class; - } - - void Load(IInputStream& in) override { - if (!!InnerMsg_) { - InnerMsg_->ParseFromArcadiaStream(&in); - } else { - TransferData(&in, &Cnull); - } - } - - void Save(IOutputStream& out) const override { - Message_->SerializeToArcadiaStream(&out); - } - - void SaveToBuffer(TBufferOutput& buf) const override { - size_t messageSize = Message_->ByteSize(); - size_t before = buf.Buffer().Size(); - buf.Buffer().Advance(messageSize); - Y_PROTOBUF_SUPPRESS_NODISCARD Message_->SerializeToArray(buf.Buffer().Data() + before, messageSize); - } - - TStringBuf GetName() const override { - return EventFactory_->NameById(Id()); - } - -private: - void DoPrint(IOutputStream& out, EFieldOutputFlags flags) const override { - EventFactory_->PrintEvent(Id(), Message_, out, flags); - } - void DoPrintJson(NJson::TJsonWriter& jsonWriter) const override { - jsonWriter.OpenMap("EventBody"); - jsonWriter.Write("Type", GetName()); - - jsonWriter.Write("Fields"); - NProtobufJson::Proto2Json(*GetProto(), jsonWriter, PROTO_2_JSON_CONFIG); - - jsonWriter.CloseMap(); - } - - const NProtoBuf::Message* GetProto() const override { - if (Message_) { - return Message_; - } - - return UnknownEventMessage(); - } - -private: - const NProtoBuf::Message* Message_ = nullptr; - NProtoBuf::TEventFactory* EventFactory_; - THolder<NProtoBuf::Message> InnerMsg_; - - friend class TEventLogFrame; -}; - -void TEventLogFrame::LogProtobufEvent(size_t eventId, const NProtoBuf::Message& ev) { - TProtobufEvent event(Now().MicroSeconds(), eventId, ev); - - LogEventImpl(event); -} - -void TEventLogFrame::LogProtobufEvent(TEventTimestamp timestamp, size_t eventId, const NProtoBuf::Message& ev) { - TProtobufEvent event(timestamp, eventId, ev); - - LogEventImpl(event); -} - -template <> -void TEventLogFrame::DebugDump(const TProtobufEvent& ev) { - static TMutex lock; - - with_lock (lock) { - Cerr << ev.Timestamp << "\t" << ev.GetName() << "\t"; - ev.GetProto()->PrintJSON(Cerr); - Cerr << Endl; - } -} - -#pragma pack(push, 1) -struct TFrameHeaderData { - char SyncField[COMPRESSED_LOG_FRAME_SYNC_DATA.size()]; - TCompressedFrameBaseHeader Header; - TCompressedFrameHeader2 HeaderEx; -}; -#pragma pack(pop) - -TEventLogFrame::TEventLogFrame(IEventLog& parentLog, bool needAlwaysSafeAdd, TWriteFrameCallbackPtr writeFrameCallback) - : EvLog_(parentLog.HasNullBackend() ? nullptr : &parentLog) - , NeedAlwaysSafeAdd_(needAlwaysSafeAdd) - , ForceDump_(false) - , WriteFrameCallback_(std::move(writeFrameCallback)) -{ - DoInit(); -} - -TEventLogFrame::TEventLogFrame(IEventLog* parentLog, bool needAlwaysSafeAdd, TWriteFrameCallbackPtr writeFrameCallback) - : EvLog_(parentLog) - , NeedAlwaysSafeAdd_(needAlwaysSafeAdd) - , ForceDump_(false) - , WriteFrameCallback_(std::move(writeFrameCallback)) -{ - if (EvLog_ && EvLog_->HasNullBackend()) { - EvLog_ = nullptr; - } - - DoInit(); -} - -TEventLogFrame::TEventLogFrame(bool needAlwaysSafeAdd, TWriteFrameCallbackPtr writeFrameCallback) - : EvLog_(nullptr) - , NeedAlwaysSafeAdd_(needAlwaysSafeAdd) - , ForceDump_(false) - , WriteFrameCallback_(std::move(writeFrameCallback)) -{ - DoInit(); -} - -void TEventLogFrame::Flush() { - if (EvLog_ == nullptr) - return; - - TBuffer& buf = Buf_.Buffer(); - - if (buf.Empty()) { - return; - } - - EvLog_->WriteFrame(buf, StartTimestamp_, EndTimestamp_, WriteFrameCallback_, std::move(MetaFlags_)); - - DoInit(); - - return; -} - -void TEventLogFrame::SafeFlush() { - TGuard<TMutex> g(Mtx_); - Flush(); -} - -void TEventLogFrame::AddEvent(TEventTimestamp timestamp) { - if (timestamp < StartTimestamp_) { - StartTimestamp_ = timestamp; - } - - if (timestamp > EndTimestamp_) { - EndTimestamp_ = timestamp; - } -} - -void TEventLogFrame::DoInit() { - Buf_.Buffer().Clear(); - - StartTimestamp_ = (TEventTimestamp)-1; - EndTimestamp_ = 0; -} - -void TEventLogFrame::VisitEvents(ILogFrameEventVisitor& visitor, IEventFactory* eventFactory) { - const auto doVisit = [this, &visitor, eventFactory]() { - TBuffer& buf = Buf_.Buffer(); - - TBufferInput bufferInput(buf); - TLengthLimitedInput limitedInput(&bufferInput, buf.size()); - - TEventFilter EventFilter(false); - - while (limitedInput.Left()) { - THolder<TEvent> event = DecodeEvent(limitedInput, true, 0, &EventFilter, eventFactory); - - visitor.Visit(*event); - } - }; - if (NeedAlwaysSafeAdd_) { - TGuard<TMutex> g(Mtx_); - doVisit(); - } else { - doVisit(); - } -} - -TSelfFlushLogFrame::TSelfFlushLogFrame(IEventLog& parentLog, bool needAlwaysSafeAdd, TWriteFrameCallbackPtr writeFrameCallback) - : TEventLogFrame(parentLog, needAlwaysSafeAdd, std::move(writeFrameCallback)) -{ -} - -TSelfFlushLogFrame::TSelfFlushLogFrame(IEventLog* parentLog, bool needAlwaysSafeAdd, TWriteFrameCallbackPtr writeFrameCallback) - : TEventLogFrame(parentLog, needAlwaysSafeAdd, std::move(writeFrameCallback)) -{ -} - -TSelfFlushLogFrame::TSelfFlushLogFrame(bool needAlwaysSafeAdd, TWriteFrameCallbackPtr writeFrameCallback) - : TEventLogFrame(needAlwaysSafeAdd, std::move(writeFrameCallback)) -{ -} - -TSelfFlushLogFrame::~TSelfFlushLogFrame() { - try { - Flush(); - } catch (...) { - } -} - -IEventLog::~IEventLog() { -} - -static THolder<TLogBackend> ConstructBackend(const TString& fileName, const TEventLogBackendOptions& backendOpts) { - try { - THolder<TLogBackend> backend; - if (backendOpts.UseSyncPageCacheBackend) { - backend = MakeHolder<TSyncPageCacheFileLogBackend>(fileName, backendOpts.SyncPageCacheBackendBufferSize, backendOpts.SyncPageCacheBackendMaxPendingSize); - } else { - backend = MakeHolder<TFileLogBackend>(fileName); - } - return MakeHolder<TReopenLogBackend>(std::move(backend)); - } catch (...) { - Cdbg << "Warning: Cannot open event log '" << fileName << "': " << CurrentExceptionMessage() << "." << Endl; - } - - return MakeHolder<TNullLogBackend>(); -} - -TEventLog::TEventLog(const TString& fileName, TEventLogFormat contentFormat, const TEventLogBackendOptions& backendOpts, TMaybe<TEventLogFormat> logFormat) - : Log_(ConstructBackend(fileName, backendOpts)) - , ContentFormat_(contentFormat) - , LogFormat_(logFormat.Defined() ? *logFormat : COMPRESSED_LOG_FORMAT_V4) - , HasNullBackend_(Log_.IsNullLog()) - , Lz4hcCodec_(NBlockCodecs::Codec("lz4hc")) - , ZstdCodec_(NBlockCodecs::Codec("zstd_1")) -{ - Y_ENSURE(LogFormat_ == COMPRESSED_LOG_FORMAT_V4 || LogFormat_ == COMPRESSED_LOG_FORMAT_V5); - - if (contentFormat & 0xff000000) { - ythrow yexception() << "wrong compressed event log content format code (" << contentFormat << ")"; - } -} - -TEventLog::TEventLog(const TString& fileName, TEventLogFormat contentFormat, const TEventLogBackendOptions& backendOpts) - : TEventLog(fileName, contentFormat, backendOpts, COMPRESSED_LOG_FORMAT_V4) -{ -} - -TEventLog::TEventLog(const TLog& log, TEventLogFormat contentFormat, TEventLogFormat logFormat) - : Log_(log) - , ContentFormat_(contentFormat) - , LogFormat_(logFormat) - , HasNullBackend_(Log_.IsNullLog()) - , Lz4hcCodec_(NBlockCodecs::Codec("lz4hc")) - , ZstdCodec_(NBlockCodecs::Codec("zstd_1")) -{ - if (contentFormat & 0xff000000) { - ythrow yexception() << "wrong compressed event log content format code (" << contentFormat << ")"; - } -} - -TEventLog::TEventLog(TEventLogFormat contentFormat, TEventLogFormat logFormat) - : Log_(MakeHolder<TNullLogBackend>()) - , ContentFormat_(contentFormat) - , LogFormat_(logFormat) - , HasNullBackend_(true) - , Lz4hcCodec_(NBlockCodecs::Codec("lz4hc")) - , ZstdCodec_(NBlockCodecs::Codec("zstd_1")) -{ - if (contentFormat & 0xff000000) { - ythrow yexception() << "wrong compressed event log content format code (" << contentFormat << ")"; - } -} - -TEventLog::~TEventLog() { -} - -void TEventLog::ReopenLog() { - Log_.ReopenLog(); -} - -void TEventLog::CloseLog() { - Log_.CloseLog(); -} - -void TEventLog::Flush() { -} - -namespace { - class TOnExceptionAction { - public: - TOnExceptionAction(std::function<void()>&& f) - : F_(std::move(f)) - { - } - - ~TOnExceptionAction() { - if (F_ && UncaughtException()) { - try { - F_(); - } catch (...) { - } - } - } - - private: - std::function<void()> F_; - }; -} - -void TEventLog::WriteFrame(TBuffer& buffer, - TEventTimestamp startTimestamp, - TEventTimestamp endTimestamp, - TWriteFrameCallbackPtr writeFrameCallback, - TLogRecord::TMetaFlags metaFlags) { - Y_ENSURE(LogFormat_ == COMPRESSED_LOG_FORMAT_V4 || LogFormat_ == COMPRESSED_LOG_FORMAT_V5); - - TBuffer& b1 = buffer; - - size_t maxCompressedLength = (LogFormat_ == COMPRESSED_LOG_FORMAT_V4) ? b1.Size() + 256 : ZstdCodec_->MaxCompressedLength(b1); - - // Reserve enough memory to minimize reallocs - TBufferOutput outbuf(sizeof(TFrameHeaderData) + maxCompressedLength); - TBuffer& b2 = outbuf.Buffer(); - b2.Proceed(sizeof(TFrameHeaderData)); - - { - TFrameHeaderData& hdr = *reinterpret_cast<TFrameHeaderData*>(b2.data()); - - memcpy(hdr.SyncField, COMPRESSED_LOG_FRAME_SYNC_DATA.data(), COMPRESSED_LOG_FRAME_SYNC_DATA.size()); - hdr.Header.Format = (LogFormat_ << 24) | (ContentFormat_ & 0xffffff); - hdr.Header.FrameId = GenerateFrameId(); - hdr.HeaderEx.UncompressedDatalen = (ui32)b1.Size(); - hdr.HeaderEx.StartTimestamp = startTimestamp; - hdr.HeaderEx.EndTimestamp = endTimestamp; - hdr.HeaderEx.PayloadChecksum = 0; - hdr.HeaderEx.CompressorVersion = 0; - } - - if (LogFormat_ == COMPRESSED_LOG_FORMAT_V4) { - TBuffer encoded(b1.Size() + sizeof(TFrameHeaderData) + 256); - Lz4hcCodec_->Encode(b1, encoded); - - TZLibCompress compr(&outbuf, ZLib::ZLib, 6, 2048); - compr.Write(encoded.data(), encoded.size()); - compr.Finish(); - } else { - b2.Advance(ZstdCodec_->Compress(b1, b2.Pos())); - } - - { - const size_t k = sizeof(TCompressedFrameBaseHeader) + COMPRESSED_LOG_FRAME_SYNC_DATA.size(); - TFrameHeaderData& hdr = *reinterpret_cast<TFrameHeaderData*>(b2.data()); - hdr.Header.Length = static_cast<ui32>(b2.size() - k); - hdr.HeaderEx.PayloadChecksum = MurmurHash<ui32>(b2.data() + sizeof(TFrameHeaderData), b2.size() - sizeof(TFrameHeaderData)); - - const size_t n = sizeof(TFrameHeaderData) - (COMPRESSED_LOG_FRAME_SYNC_DATA.size() + sizeof(hdr.HeaderEx.HeaderChecksum)); - hdr.HeaderEx.HeaderChecksum = MurmurHash<ui32>(b2.data() + COMPRESSED_LOG_FRAME_SYNC_DATA.size(), n); - } - - const TBuffer& frameData = outbuf.Buffer(); - - TOnExceptionAction actionCallback([this] { - if (ErrorCallback_) { - ErrorCallback_->OnWriteError(); - } - }); - - if (writeFrameCallback) { - writeFrameCallback->OnAfterCompress(frameData, startTimestamp, endTimestamp); - } - - Log_.Write(frameData.Data(), frameData.Size(), std::move(metaFlags)); - if (SuccessCallback_) { - SuccessCallback_->OnWriteSuccess(frameData); - } -} - -TEvent* TProtobufEventFactory::CreateLogEvent(TEventClass c) { - return new TProtobufEvent(c, EventFactory_); -} - -TEventClass TProtobufEventFactory::ClassByName(TStringBuf name) const { - return EventFactory_->IdByName(name); -} - -TEventClass TProtobufEventFactory::EventClassBegin() const { - const auto& items = EventFactory_->FactoryItems(); - - if (items.empty()) { - return static_cast<TEventClass>(0); - } - - return static_cast<TEventClass>(items.begin()->first); -} - -TEventClass TProtobufEventFactory::EventClassEnd() const { - const auto& items = EventFactory_->FactoryItems(); - - if (items.empty()) { - return static_cast<TEventClass>(0); - } - - return static_cast<TEventClass>(items.rbegin()->first + 1); -} - -namespace NEvClass { - IEventFactory* Factory() { - return Singleton<TProtobufEventFactory>(); - } - - IEventProcessor* Processor() { - return Singleton<TProtobufEventProcessor>(); - } -} - -const NProtoBuf::Message* TUnknownEvent::GetProto() const { - return UnknownEventMessage(); -} - -TStringBuf TUnknownEvent::GetName() const { - return TStringBuf("UnknownEvent"); -} - -void TUnknownEvent::DoPrintJson(NJson::TJsonWriter& jsonWriter) const { - jsonWriter.OpenMap("EventBody"); - jsonWriter.Write("Type", GetName()); - jsonWriter.Write("EventId", (size_t)Class); - jsonWriter.CloseMap(); -} - -TStringBuf TEndOfFrameEvent::GetName() const { - return TStringBuf("EndOfFrame"); -} - -const NProtoBuf::Message* TEndOfFrameEvent::GetProto() const { - return Singleton<NEventLogInternal::TEndOfFrameEvent>(); -} - -void TEndOfFrameEvent::DoPrintJson(NJson::TJsonWriter& jsonWriter) const { - jsonWriter.OpenMap("EventBody"); - jsonWriter.Write("Type", GetName()); - jsonWriter.OpenMap("Fields"); - jsonWriter.CloseMap(); - jsonWriter.CloseMap(); -} - -THolder<TEvent> MakeProtobufLogEvent(TEventTimestamp ts, TEventClass eventId, google::protobuf::Message& ev) { - return MakeHolder<TProtobufEvent>(ts, eventId, ev); -} diff --git a/library/cpp/eventlog/eventlog.h b/library/cpp/eventlog/eventlog.h deleted file mode 100644 index 45c2dfb17fd..00000000000 --- a/library/cpp/eventlog/eventlog.h +++ /dev/null @@ -1,623 +0,0 @@ -#pragma once - -#include "eventlog_int.h" -#include "event_field_output.h" -#include "events_extension.h" - -#include <library/cpp/blockcodecs/codecs.h> -#include <library/cpp/logger/all.h> - -#include <google/protobuf/message.h> - -#include <util/datetime/base.h> -#include <util/generic/ptr.h> -#include <util/generic/string.h> -#include <util/stream/output.h> -#include <util/stream/buffer.h> -#include <util/stream/str.h> -#include <util/system/mutex.h> -#include <util/stream/output.h> -#include <util/system/env.h> -#include <util/system/unaligned_mem.h> -#include <util/ysaveload.h> - -#include <cstdlib> - -namespace NJson { - class TJsonWriter; -} - -class IEventLog; - -class TEvent : public TThrRefBase { -public: - enum class TOutputFormat { - TabSeparated, - TabSeparatedRaw, // disables escaping - Json - }; - - struct TOutputOptions { - TOutputFormat OutputFormat = TOutputFormat::TabSeparated; - // Dump some fields (e.g. timestamp) in more human-readable format - bool HumanReadable = false; - - TOutputOptions(TOutputFormat outputFormat = TOutputFormat::TabSeparated) - : OutputFormat(outputFormat) - { - } - - TOutputOptions(TOutputFormat outputFormat, bool humanReadable) - : OutputFormat(outputFormat) - , HumanReadable(humanReadable) - { - } - }; - - struct TEventState { - TEventTimestamp FrameStartTime = 0; - TEventTimestamp PrevEventTime = 0; - TEventState() { - } - }; - - TEvent(TEventClass c, TEventTimestamp t) - : Class(c) - , Timestamp(t) - { - } - - virtual ~TEvent() = default; - - // Note, that descendants MUST have Save() & Load() methods to alter - // only its new variables, not the base class! - virtual void Save(IOutputStream& out) const = 0; - virtual void SaveToBuffer(TBufferOutput& out) const { - Save(out); - } - - // Note, that descendants MUST have Save() & Load() methods to alter - // only its new variables, not the base class! - virtual void Load(IInputStream& i) = 0; - - virtual TStringBuf GetName() const = 0; - virtual const NProtoBuf::Message* GetProto() const = 0; - - void Print(IOutputStream& out, const TOutputOptions& options = TOutputOptions(), const TEventState& eventState = TEventState()) const; - void PrintHeader(IOutputStream& out, const TOutputOptions& options, const TEventState& eventState) const; - - TString ToString() const { - TStringStream buff; - Print(buff); - return buff.Str(); - } - - void FullSaveToBuffer(TBufferOutput& buf) const { - SaveMessageHeader(buf); - this->SaveToBuffer(buf); - } - - void FullSave(IOutputStream& o) const { - SaveMessageHeader(o); - this->Save(o); - } - - void FullLoad(IInputStream& i) { - ::Load(&i, Timestamp); - ::Load(&i, Class); - this->Load(i); - } - - template <class T> - const T* Get() const { - return static_cast<const T*>(this->GetProto()); - } - - TEventClass Class; - TEventTimestamp Timestamp; - ui32 FrameId = 0; - -private: - void SaveMessageHeader(IOutputStream& out) const { - ::Save(&out, Timestamp); - ::Save(&out, Class); - } - - virtual void DoPrint(IOutputStream& out, EFieldOutputFlags flags) const = 0; - virtual void DoPrintJson(NJson::TJsonWriter& jsonWriter) const = 0; - - void PrintJsonHeader(NJson::TJsonWriter& jsonWriter) const; -}; - -using TEventPtr = TIntrusivePtr<TEvent>; -using TConstEventPtr = TIntrusiveConstPtr<TEvent>; - -class IEventProcessor { -public: - virtual void SetOptions(const TEvent::TOutputOptions& options) { - Options_ = options; - } - virtual void ProcessEvent(const TEvent* ev) = 0; - virtual bool CheckedProcessEvent(const TEvent* ev) { - ProcessEvent(ev); - return true; - } - virtual ~IEventProcessor() = default; - -protected: - TEvent::TOutputOptions Options_; -}; - -class IEventFactory { -public: - virtual TEvent* CreateLogEvent(TEventClass c) = 0; - virtual TEventLogFormat CurrentFormat() = 0; - virtual TEventClass ClassByName(TStringBuf name) const = 0; - virtual TEventClass EventClassBegin() const = 0; - virtual TEventClass EventClassEnd() const = 0; - virtual ~IEventFactory() = default; -}; - -class TUnknownEvent: public TEvent { -public: - TUnknownEvent(TEventTimestamp ts, TEventClass cls) - : TEvent(cls, ts) - { - } - - ~TUnknownEvent() override = default; - - void Save(IOutputStream& /* o */) const override { - ythrow yexception() << "TUnknownEvent cannot be saved"; - } - - void Load(IInputStream& /* i */) override { - ythrow yexception() << "TUnknownEvent cannot be loaded"; - } - - TStringBuf GetName() const override; - -private: - void DoPrint(IOutputStream& out, EFieldOutputFlags) const override { - out << GetName() << "\t" << (size_t)Class; - } - - void DoPrintJson(NJson::TJsonWriter& jsonWriter) const override; - - const NProtoBuf::Message* GetProto() const override; -}; - -class TEndOfFrameEvent: public TEvent { -public: - enum { - EventClass = 0 - }; - - TEndOfFrameEvent(TEventTimestamp ts) - : TEvent(TEndOfFrameEvent::EventClass, ts) - { - } - - ~TEndOfFrameEvent() override = default; - - void Save(IOutputStream& o) const override { - (void)o; - ythrow yexception() << "TEndOfFrameEvent cannot be saved"; - } - - void Load(IInputStream& i) override { - (void)i; - ythrow yexception() << "TEndOfFrameEvent cannot be loaded"; - } - - TStringBuf GetName() const override; - -private: - void DoPrint(IOutputStream& out, EFieldOutputFlags) const override { - out << GetName(); - } - void DoPrintJson(NJson::TJsonWriter& jsonWriter) const override; - - const NProtoBuf::Message* GetProto() const override; -}; - -class ILogFrameEventVisitor { -public: - virtual ~ILogFrameEventVisitor() = default; - - virtual void Visit(const TEvent& event) = 0; -}; - -class IWriteFrameCallback : public TAtomicRefCount<IWriteFrameCallback> { -public: - virtual ~IWriteFrameCallback() = default; - - virtual void OnAfterCompress(const TBuffer& compressedFrame, TEventTimestamp startTimestamp, TEventTimestamp endTimestamp) = 0; -}; - -using TWriteFrameCallbackPtr = TIntrusivePtr<IWriteFrameCallback>; - -class TEventLogFrame { -public: - TEventLogFrame(bool needAlwaysSafeAdd = false, TWriteFrameCallbackPtr writeFrameCallback = nullptr); - TEventLogFrame(IEventLog& parentLog, bool needAlwaysSafeAdd = false, TWriteFrameCallbackPtr writeFrameCallback = nullptr); - TEventLogFrame(IEventLog* parentLog, bool needAlwaysSafeAdd = false, TWriteFrameCallbackPtr writeFrameCallback = nullptr); - - virtual ~TEventLogFrame() = default; - - void Flush(); - void SafeFlush(); - - void ForceDump() { - ForceDump_ = true; - } - - template <class T> - inline void LogEvent(const T& ev) { - if (NeedAlwaysSafeAdd_) { - SafeLogEvent(ev); - } else { - UnSafeLogEvent(ev); - } - } - - template <class T> - inline void LogEvent(TEventTimestamp timestamp, const T& ev) { - if (NeedAlwaysSafeAdd_) { - SafeLogEvent(timestamp, ev); - } else { - UnSafeLogEvent(timestamp, ev); - } - } - - template <class T> - inline void UnSafeLogEvent(const T& ev) { - if (!IsEventIgnored(ev.ID)) - LogProtobufEvent(ev.ID, ev); - } - - template <class T> - inline void UnSafeLogEvent(TEventTimestamp timestamp, const T& ev) { - if (!IsEventIgnored(ev.ID)) - LogProtobufEvent(timestamp, ev.ID, ev); - } - - template <class T> - inline void SafeLogEvent(const T& ev) { - if (!IsEventIgnored(ev.ID)) { - TGuard<TMutex> g(Mtx_); - LogProtobufEvent(ev.ID, ev); - } - } - - template <class T> - inline void SafeLogEvent(TEventTimestamp timestamp, const T& ev) { - if (!IsEventIgnored(ev.ID)) { - TGuard<TMutex> g(Mtx_); - LogProtobufEvent(timestamp, ev.ID, ev); - } - } - - void VisitEvents(ILogFrameEventVisitor& visitor, IEventFactory* eventFactory); - - inline bool IsEventIgnored(size_t eventId) const { - Y_UNUSED(eventId); // in future we might want to selectively discard only some kinds of messages - return !IsDebugModeEnabled() && EvLog_ == nullptr && !ForceDump_; - } - - void Enable(IEventLog& evLog) { - EvLog_ = &evLog; - } - - void Disable() { - EvLog_ = nullptr; - } - - void SetNeedAlwaysSafeAdd(bool val) { - NeedAlwaysSafeAdd_ = val; - } - - void SetWriteFrameCallback(TWriteFrameCallbackPtr writeFrameCallback) { - WriteFrameCallback_ = writeFrameCallback; - } - - void AddMetaFlag(const TString& key, const TString& value) { - if (NeedAlwaysSafeAdd_) { - TGuard<TMutex> g(Mtx_); - MetaFlags_.emplace_back(key, value); - } else { - MetaFlags_.emplace_back(key, value); - } - } - -protected: - void LogProtobufEvent(size_t eventId, const NProtoBuf::Message& ev); - void LogProtobufEvent(TEventTimestamp timestamp, size_t eventId, const NProtoBuf::Message& ev); - -private: - static bool IsDebugModeEnabled() { - static struct TSelector { - bool Flag; - - TSelector() - : Flag(GetEnv("EVLOG_DEBUG") == TStringBuf("1")) - { - } - } selector; - - return selector.Flag; - } - - template <class T> - void DebugDump(const T& ev); - - // T must be a descendant of NEvClass::TEvent - template <class T> - inline void LogEventImpl(const T& ev) { - if (EvLog_ != nullptr || ForceDump_) { - TBuffer& b = Buf_.Buffer(); - size_t lastSize = b.size(); - ::Save(&Buf_, ui32(0)); - ev.FullSaveToBuffer(Buf_); - WriteUnaligned<ui32>(b.data() + lastSize, (ui32)(b.size() - lastSize)); - AddEvent(ev.Timestamp); - } - - if (IsDebugModeEnabled()) { - DebugDump(ev); - } - } - - void AddEvent(TEventTimestamp timestamp); - void DoInit(); - -private: - TBufferOutput Buf_; - TEventTimestamp StartTimestamp_, EndTimestamp_; - IEventLog* EvLog_; - TMutex Mtx_; - bool NeedAlwaysSafeAdd_; - bool ForceDump_; - TWriteFrameCallbackPtr WriteFrameCallback_; - TLogRecord::TMetaFlags MetaFlags_; - friend class TEventRecord; -}; - -class TSelfFlushLogFrame: public TEventLogFrame, public TAtomicRefCount<TSelfFlushLogFrame> { -public: - TSelfFlushLogFrame(bool needAlwaysSafeAdd = false, TWriteFrameCallbackPtr writeFrameCallback = nullptr); - TSelfFlushLogFrame(IEventLog& parentLog, bool needAlwaysSafeAdd = false, TWriteFrameCallbackPtr writeFrameCallback = nullptr); - TSelfFlushLogFrame(IEventLog* parentLog, bool needAlwaysSafeAdd = false, TWriteFrameCallbackPtr writeFrameCallback = nullptr); - - virtual ~TSelfFlushLogFrame(); -}; - -using TSelfFlushLogFramePtr = TIntrusivePtr<TSelfFlushLogFrame>; - -class IEventLog: public TAtomicRefCount<IEventLog> { -public: - class IErrorCallback { - public: - virtual ~IErrorCallback() { - } - - virtual void OnWriteError() = 0; - }; - - class ISuccessCallback { - public: - virtual ~ISuccessCallback() { - } - - virtual void OnWriteSuccess(const TBuffer& frameData) = 0; - }; - - virtual ~IEventLog(); - - virtual void ReopenLog() = 0; - virtual void CloseLog() = 0; - virtual void Flush() = 0; - virtual void SetErrorCallback(IErrorCallback*) { - } - virtual void SetSuccessCallback(ISuccessCallback*) { - } - - template <class T> - void LogEvent(const T& ev) { - TEventLogFrame frame(*this); - frame.LogEvent(ev); - frame.Flush(); - } - - virtual bool HasNullBackend() const = 0; - - virtual void WriteFrame(TBuffer& buffer, - TEventTimestamp startTimestamp, - TEventTimestamp endTimestamp, - TWriteFrameCallbackPtr writeFrameCallback = nullptr, - TLogRecord::TMetaFlags metaFlags = {}) = 0; -}; - -struct TEventLogBackendOptions { - bool UseSyncPageCacheBackend = false; - size_t SyncPageCacheBackendBufferSize = 0; - size_t SyncPageCacheBackendMaxPendingSize = 0; -}; - -class TEventLog: public IEventLog { -public: - /* - * Параметр contentformat указывает формат контента лога, например какие могут в логе - * встретится классы событий, какие параметры у этих событий, и пр. Старший байт параметра - * должен быть нулевым. - */ - TEventLog(const TString& fileName, TEventLogFormat contentFormat, const TEventLogBackendOptions& backendOpts, TMaybe<TEventLogFormat> logFormat); - TEventLog(const TString& fileName, TEventLogFormat contentFormat, const TEventLogBackendOptions& backendOpts = {}); - TEventLog(const TLog& log, TEventLogFormat contentFormat, TEventLogFormat logFormat = COMPRESSED_LOG_FORMAT_V4); - TEventLog(TEventLogFormat contentFormat, TEventLogFormat logFormat = COMPRESSED_LOG_FORMAT_V4); - - ~TEventLog() override; - - void ReopenLog() override; - void CloseLog() override; - void Flush() override; - void SetErrorCallback(IErrorCallback* errorCallback) override { - ErrorCallback_ = errorCallback; - } - void SetSuccessCallback(ISuccessCallback* successCallback) override { - SuccessCallback_ = successCallback; - } - - template <class T> - void LogEvent(const T& ev) { - TEventLogFrame frame(*this); - frame.LogEvent(ev); - frame.Flush(); - } - - bool HasNullBackend() const override { - return HasNullBackend_; - } - - void WriteFrame(TBuffer& buffer, - TEventTimestamp startTimestamp, - TEventTimestamp endTimestamp, - TWriteFrameCallbackPtr writeFrameCallback = nullptr, - TLogRecord::TMetaFlags metaFlags = {}) override; - -private: - mutable TLog Log_; - TEventLogFormat ContentFormat_; - const TEventLogFormat LogFormat_; - bool HasNullBackend_; - const NBlockCodecs::ICodec* const Lz4hcCodec_; - const NBlockCodecs::ICodec* const ZstdCodec_; - IErrorCallback* ErrorCallback_ = nullptr; - ISuccessCallback* SuccessCallback_ = nullptr; -}; - -using TEventLogPtr = TIntrusivePtr<IEventLog>; - -class TEventLogWithSlave: public IEventLog { -public: - TEventLogWithSlave(IEventLog& parentLog) - : Slave_(&parentLog) - { - } - - TEventLogWithSlave(const TEventLogPtr& parentLog) - : SlavePtr_(parentLog) - , Slave_(SlavePtr_.Get()) - { - } - - ~TEventLogWithSlave() override { - try { - Slave().Flush(); - } catch (...) { - } - } - - void Flush() override { - Slave().Flush(); - } - - void ReopenLog() override { - return Slave().ReopenLog(); - } - void CloseLog() override { - return Slave().CloseLog(); - } - - bool HasNullBackend() const override { - return Slave().HasNullBackend(); - } - - void WriteFrame(TBuffer& buffer, - TEventTimestamp startTimestamp, - TEventTimestamp endTimestamp, - TWriteFrameCallbackPtr writeFrameCallback = nullptr, - TLogRecord::TMetaFlags metaFlags = {}) override { - Slave().WriteFrame(buffer, startTimestamp, endTimestamp, writeFrameCallback, std::move(metaFlags)); - } - - void SetErrorCallback(IErrorCallback* errorCallback) override { - Slave().SetErrorCallback(errorCallback); - } - - void SetSuccessCallback(ISuccessCallback* successCallback) override { - Slave().SetSuccessCallback(successCallback); - } - -protected: - inline IEventLog& Slave() const { - return *Slave_; - } - -private: - TEventLogPtr SlavePtr_; - IEventLog* Slave_ = nullptr; -}; - -extern TAtomic eventlogFrameCounter; - -class TProtobufEventProcessor: public IEventProcessor { -public: - void ProcessEvent(const TEvent* ev) override final { - ProcessEvent(ev, &Cout); - } - - void ProcessEvent(const TEvent* ev, IOutputStream *out) { - UpdateEventState(ev); - DoProcessEvent(ev, out); - EventState_.PrevEventTime = ev->Timestamp; - } -protected: - virtual void DoProcessEvent(const TEvent * ev, IOutputStream *out) { - ev->Print(*out, Options_, EventState_); - (*out) << Endl; - } - ui32 CurrentFrameId_ = Max<ui32>(); - TEvent::TEventState EventState_; - -private: - void UpdateEventState(const TEvent *ev) { - if (ev->FrameId != CurrentFrameId_) { - EventState_.FrameStartTime = ev->Timestamp; - EventState_.PrevEventTime = ev->Timestamp; - CurrentFrameId_ = ev->FrameId; - } - } -}; - -class TProtobufEventFactory: public IEventFactory { -public: - TProtobufEventFactory(NProtoBuf::TEventFactory* factory = NProtoBuf::TEventFactory::Instance()) - : EventFactory_(factory) - { - } - - TEvent* CreateLogEvent(TEventClass c) override; - - TEventLogFormat CurrentFormat() override { - return 0; - } - - TEventClass ClassByName(TStringBuf name) const override; - - TEventClass EventClassBegin() const override; - - TEventClass EventClassEnd() const override; - - ~TProtobufEventFactory() override = default; - -private: - NProtoBuf::TEventFactory* EventFactory_; -}; - -THolder<TEvent> MakeProtobufLogEvent(TEventTimestamp ts, TEventClass eventId, google::protobuf::Message& ev); - -namespace NEvClass { - IEventFactory* Factory(); - IEventProcessor* Processor(); -} diff --git a/library/cpp/eventlog/eventlog_int.cpp b/library/cpp/eventlog/eventlog_int.cpp deleted file mode 100644 index faa8c42cbeb..00000000000 --- a/library/cpp/eventlog/eventlog_int.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "eventlog_int.h" - -#include <util/string/cast.h> - -TMaybe<TEventLogFormat> ParseEventLogFormat(TStringBuf str) { - EEventLogFormat format; - if (TryFromString(str, format)) { - return static_cast<TEventLogFormat>(format); - } else { - return {}; - } -} diff --git a/library/cpp/eventlog/eventlog_int.h b/library/cpp/eventlog/eventlog_int.h deleted file mode 100644 index eb00fecfab6..00000000000 --- a/library/cpp/eventlog/eventlog_int.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once - -#include <util/stream/output.h> -#include <util/generic/maybe.h> -#include <util/generic/utility.h> -#include <util/generic/yexception.h> -#include <util/ysaveload.h> - -using TEventClass = ui32; -using TEventLogFormat = ui32; -using TEventTimestamp = ui64; - -constexpr TStringBuf COMPRESSED_LOG_FRAME_SYNC_DATA = - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\xfe\x00\x00\xff\xff\x00\x00\xff\xff\x00" - "\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff" - "\xff\x00\x00\xff\xff\x00\x00\xff"sv; - -static_assert(COMPRESSED_LOG_FRAME_SYNC_DATA.size() == 64); - -/* - * Коды форматов логов. Форматом лога считается формат служебных - * структур лога. К примеру формат заголовка, наличие компрессии, и т.д. - * Имеет значение только 1 младший байт. - */ - -enum EEventLogFormat : TEventLogFormat { - // Формат версии 1. Используется компрессор LZQ. - COMPRESSED_LOG_FORMAT_V1 = 1, - - // Формат версии 2. Используется компрессор ZLIB. Добавлены CRC заголовка и данных, - // поле типа компрессора. - COMPRESSED_LOG_FORMAT_V2 = 2, - - // Формат версии 3. Используется компрессор ZLIB. В начинке фреймов перед каждым событием добавлен его размер. - COMPRESSED_LOG_FORMAT_V3 = 3, - - // Lz4hc codec + zlib - COMPRESSED_LOG_FORMAT_V4 = 4 /* "zlib_lz4" */, - - // zstd - COMPRESSED_LOG_FORMAT_V5 = 5 /* "zstd" */, -}; - -TMaybe<TEventLogFormat> ParseEventLogFormat(TStringBuf str); - -#pragma pack(push, 1) - -struct TCompressedFrameBaseHeader { - TEventLogFormat Format; - ui32 Length; // Длина остатка фрейма в байтах, после этого заголовка - ui32 FrameId; -}; - -struct TCompressedFrameHeader { - TEventTimestamp StartTimestamp; - TEventTimestamp EndTimestamp; - ui32 UncompressedDatalen; // Длина данных, которые были закомпрессированы - ui32 PayloadChecksum; // В логе версии 1 поле не используется -}; - -struct TCompressedFrameHeader2: public TCompressedFrameHeader { - ui8 CompressorVersion; // Сейчас не используется - ui32 HeaderChecksum; -}; - -#pragma pack(pop) - -Y_DECLARE_PODTYPE(TCompressedFrameBaseHeader); -Y_DECLARE_PODTYPE(TCompressedFrameHeader); -Y_DECLARE_PODTYPE(TCompressedFrameHeader2); diff --git a/library/cpp/eventlog/events_extension.h b/library/cpp/eventlog/events_extension.h deleted file mode 100644 index 0cf062f9590..00000000000 --- a/library/cpp/eventlog/events_extension.h +++ /dev/null @@ -1,161 +0,0 @@ -#pragma once - -#include "event_field_output.h" - -#include <google/protobuf/descriptor.h> -#include <google/protobuf/message.h> - -#include <library/cpp/threading/atomic/bool.h> -#include <library/cpp/string_utils/base64/base64.h> - -#include <util/generic/map.h> -#include <util/generic/deque.h> -#include <util/generic/singleton.h> -#include <util/string/hex.h> -#include <util/system/guard.h> -#include <util/system/mutex.h> - -namespace NProtoBuf { - class TEventFactory { - public: - typedef ::google::protobuf::Message Message; - typedef void (*TEventSerializer)(const Message* event, IOutputStream& output, EFieldOutputFlags flags); - typedef void (*TRegistrationFunc)(); - - private: - class TFactoryItem { - public: - TFactoryItem(const Message* prototype, const TEventSerializer serializer) - : Prototype_(prototype) - , Serializer_(serializer) - { - } - - TStringBuf GetName() const { - return Prototype_->GetDescriptor()->name(); - } - - Message* Create() const { - return Prototype_->New(); - } - - void PrintEvent(const Message* event, IOutputStream& out, EFieldOutputFlags flags) const { - (*Serializer_)(event, out, flags); - } - - private: - const Message* Prototype_; - const TEventSerializer Serializer_; - }; - - typedef TMap<size_t, TFactoryItem> TFactoryMap; - - public: - TEventFactory() - : FactoryItems_() - { - } - - void ScheduleRegistration(TRegistrationFunc func) { - EventRegistrators_.push_back(func); - } - - void RegisterEvent(size_t eventId, const Message* prototype, const TEventSerializer serializer) { - FactoryItems_.insert(std::make_pair(eventId, TFactoryItem(prototype, serializer))); - } - - size_t IdByName(TStringBuf eventname) { - DelayedRegistration(); - for (TFactoryMap::const_iterator it = FactoryItems_.begin(); it != FactoryItems_.end(); ++it) { - if (it->second.GetName() == eventname) - return it->first; - } - - ythrow yexception() << "do not know event '" << eventname << "'"; - } - - TStringBuf NameById(size_t id) { - DelayedRegistration(); - TFactoryMap::const_iterator it = FactoryItems_.find(id); - return it != FactoryItems_.end() ? it->second.GetName() : TStringBuf(); - } - - Message* CreateEvent(size_t eventId) { - DelayedRegistration(); - TFactoryMap::const_iterator it = FactoryItems_.find(eventId); - - if (it != FactoryItems_.end()) { - return it->second.Create(); - } - - return nullptr; - } - - const TMap<size_t, TFactoryItem>& FactoryItems() { - DelayedRegistration(); - return FactoryItems_; - } - - void PrintEvent( - size_t eventId, - const Message* event, - IOutputStream& output, - EFieldOutputFlags flags = {}) { - DelayedRegistration(); - TFactoryMap::const_iterator it = FactoryItems_.find(eventId); - - if (it != FactoryItems_.end()) { - it->second.PrintEvent(event, output, flags); - } - } - - static TEventFactory* Instance() { - return Singleton<TEventFactory>(); - } - - private: - void DelayedRegistration() { - if (!DelayedRegistrationDone_) { - TGuard<TMutex> guard(MutexEventRegistrators_); - Y_UNUSED(guard); - while (!EventRegistrators_.empty()) { - EventRegistrators_.front()(); - EventRegistrators_.pop_front(); - } - DelayedRegistrationDone_ = true; - } - } - - private: - TMap<size_t, TFactoryItem> FactoryItems_; - TDeque<TRegistrationFunc> EventRegistrators_; - NAtomic::TBool DelayedRegistrationDone_ = false; - TMutex MutexEventRegistrators_; - }; - - template <typename T> - void PrintAsBytes(const T& obj, IOutputStream& output) { - const ui8* b = reinterpret_cast<const ui8*>(&obj); - const ui8* e = b + sizeof(T); - const char* delim = ""; - - while (b != e) { - output << delim; - output << (int)*b++; - delim = "."; - } - } - - template <typename T> - void PrintAsHex(const T& obj, IOutputStream& output) { - output << "0x"; - output << HexEncode(&obj, sizeof(T)); - } - - inline void PrintAsBase64(TStringBuf data, IOutputStream& output) { - if (!data.empty()) { - output << Base64Encode(data); - } - } - -} diff --git a/library/cpp/eventlog/iterator.cpp b/library/cpp/eventlog/iterator.cpp deleted file mode 100644 index 71f955bca82..00000000000 --- a/library/cpp/eventlog/iterator.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include "iterator.h" - -#include <library/cpp/streams/growing_file_input/growing_file_input.h> - -#include <util/string/cast.h> -#include <util/string/split.h> -#include <util/string/type.h> -#include <util/stream/file.h> - -using namespace NEventLog; - -namespace { - inline TIntrusivePtr<TEventFilter> ConstructEventFilter(bool enableEvents, const TString& evList, IEventFactory* fac) { - if (evList.empty()) { - return nullptr; - } - - TVector<TString> events; - - StringSplitter(evList).Split(',').SkipEmpty().Collect(&events); - if (events.empty()) { - return nullptr; - } - - TIntrusivePtr<TEventFilter> filter(new TEventFilter(enableEvents)); - - for (const auto& event : events) { - if (IsNumber(event)) - filter->AddEventClass(FromString<size_t>(event)); - else - filter->AddEventClass(fac->ClassByName(event)); - } - - return filter; - } - - struct TIterator: public IIterator { - inline TIterator(const TOptions& o, IEventFactory* fac) - : First(true) - { - if (o.FileName.size()) { - if (o.ForceStreamMode || o.TailFMode) { - FileInput.Reset(o.TailFMode ? (IInputStream*)new TGrowingFileInput(o.FileName) : (IInputStream*)new TUnbufferedFileInput(o.FileName)); - FrameStream.Reset(new TFrameStreamer(*FileInput, fac, o.FrameFilter)); - } else { - FrameStream.Reset(new TFrameStreamer(o.FileName, o.StartTime, o.EndTime, o.MaxRequestDuration, fac, o.FrameFilter)); - } - } else { - FrameStream.Reset(new TFrameStreamer(*o.Input, fac, o.FrameFilter)); - } - - EvFilter = ConstructEventFilter(o.EnableEvents, o.EvList, fac); - EventStream.Reset(new TEventStreamer(*FrameStream, o.StartTime, o.EndTime, o.ForceStrongOrdering, EvFilter, o.ForceLosslessStrongOrdering)); - } - - TConstEventPtr Next() override { - if (First) { - First = false; - - if (!EventStream->Avail()) { - return nullptr; - } - } else { - if (!EventStream->Next()) { - return nullptr; - } - } - - return **EventStream; - } - - THolder<IInputStream> FileInput; - THolder<TFrameStreamer> FrameStream; - TIntrusivePtr<TEventFilter> EvFilter; - THolder<TEventStreamer> EventStream; - bool First; - }; -} - -IIterator::~IIterator() = default; - -THolder<IIterator> NEventLog::CreateIterator(const TOptions& o, IEventFactory* fac) { - return MakeHolder<TIterator>(o, fac); -} - -THolder<IIterator> NEventLog::CreateIterator(const TOptions& o) { - return MakeHolder<TIterator>(o, NEvClass::Factory()); -} diff --git a/library/cpp/eventlog/iterator.h b/library/cpp/eventlog/iterator.h deleted file mode 100644 index 71a61ed5494..00000000000 --- a/library/cpp/eventlog/iterator.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include <util/stream/input.h> -#include <util/generic/ptr.h> -#include <util/generic/string.h> -#include <util/generic/iterator.h> - -#include "eventlog.h" -#include "logparser.h" - -namespace NEventLog { - struct TOptions { - inline TOptions& SetFileName(const TString& fileName) { - FileName = fileName; - - return *this; - } - - inline TOptions& SetForceStrongOrdering(bool v) { - if(!ForceLosslessStrongOrdering) { - ForceStrongOrdering = v; - } - - return *this; - } - - ui64 StartTime = MIN_START_TIME; - ui64 EndTime = MAX_END_TIME; - ui64 MaxRequestDuration = MAX_REQUEST_DURATION; - TString FileName; - bool ForceStrongOrdering = false; - bool ForceWeakOrdering = false; - bool EnableEvents = true; - TString EvList; - bool ForceStreamMode = false; - bool ForceLosslessStrongOrdering = false; - bool TailFMode = false; - IInputStream* Input = &Cin; - IFrameFilterRef FrameFilter; - }; - - class IIterator: public TInputRangeAdaptor<IIterator> { - public: - virtual ~IIterator(); - - virtual TConstEventPtr Next() = 0; - }; - - THolder<IIterator> CreateIterator(const TOptions& o); - THolder<IIterator> CreateIterator(const TOptions& o, IEventFactory* fac); -} diff --git a/library/cpp/eventlog/logparser.cpp b/library/cpp/eventlog/logparser.cpp deleted file mode 100644 index 6f8959f7888..00000000000 --- a/library/cpp/eventlog/logparser.cpp +++ /dev/null @@ -1,814 +0,0 @@ -#include "logparser.h" -#include "evdecoder.h" - -#include <util/stream/output.h> -#include <util/stream/zlib.h> -#include <util/digest/murmur.h> -#include <util/generic/algorithm.h> -#include <util/generic/scope.h> -#include <util/generic/hash_set.h> -#include <util/string/split.h> -#include <util/string/cast.h> -#include <util/string/escape.h> -#include <util/string/builder.h> - -#include <contrib/libs/re2/re2/re2.h> - -#include <algorithm> -#include <array> - -namespace { - bool FastforwardUntilSyncHeader(IInputStream* in) { - // Usually this function finds the correct header at the first hit - std::array<char, COMPRESSED_LOG_FRAME_SYNC_DATA.size()> buffer; - if (in->Load(buffer.data(), buffer.size()) != buffer.size()) { - return false; - } - - auto begin = buffer.begin(); - - for (;;) { - if (std::mismatch( - begin, buffer.end(), - COMPRESSED_LOG_FRAME_SYNC_DATA.begin()).first == buffer.end() && - std::mismatch( - buffer.begin(), begin, - COMPRESSED_LOG_FRAME_SYNC_DATA.begin() + (buffer.end() - begin)).first == begin) { - return true; - } - if (!in->ReadChar(*begin)) { - return false; - } - ++begin; - if (begin == buffer.end()) { - begin = buffer.begin(); - } - } - } - - bool HasCorrectChecksum(const TFrameHeader& header) { - // Calculating hash over all the fields of the read header except for the field with the hash of the header itself. - const size_t baseSize = sizeof(TCompressedFrameBaseHeader) + sizeof(TCompressedFrameHeader2) - sizeof(ui32); - const ui32 checksum = MurmurHash<ui32>(&header.Basehdr, baseSize); - return checksum == header.Framehdr.HeaderChecksum; - } - - TMaybe<TFrameHeader> FindNextFrameHeader(IInputStream* in) { - for (;;) { - if (FastforwardUntilSyncHeader(in)) { - try { - return TFrameHeader(*in); - } catch (const TFrameLoadError& err) { - Cdbg << err.what() << Endl; - in->Skip(err.SkipAfter); - } - } else { - return Nothing(); - } - } - } - - std::pair<TMaybe<TFrameHeader>, TStringBuf> FindNextFrameHeader(TStringBuf span) { - for (;;) { - auto iter = std::search( - span.begin(), span.end(), - COMPRESSED_LOG_FRAME_SYNC_DATA.begin(), COMPRESSED_LOG_FRAME_SYNC_DATA.end()); - const size_t offset = iter - span.begin(); - - if (offset != span.size()) { - span = span.substr(offset); - try { - TMemoryInput in( - span.data() + COMPRESSED_LOG_FRAME_SYNC_DATA.size(), - span.size() - COMPRESSED_LOG_FRAME_SYNC_DATA.size()); - return {TFrameHeader(in), span}; - } catch (const TFrameLoadError& err) { - Cdbg << err.what() << Endl; - span = span.substr(err.SkipAfter); - } - } else { - return {Nothing(), {}}; - } - } - } - - size_t FindFrames(const TStringBuf span, ui64 start, ui64 end, ui64 maxRequestDuration) { - Y_ENSURE(start <= end); - - const auto leftTimeBound = start - Min(start, maxRequestDuration); - const auto rightTimeBound = end + Min(maxRequestDuration, Max<ui64>() - end); - - TStringBuf subspan = span; - TMaybe<TFrameHeader> maybeLeftFrame; - std::tie(maybeLeftFrame, subspan) = FindNextFrameHeader(subspan); - - if (!maybeLeftFrame || maybeLeftFrame->EndTime() > rightTimeBound) { - return span.size(); - } - - if (maybeLeftFrame->StartTime() > leftTimeBound) { - return 0; - } - - while (subspan.size() > maybeLeftFrame->FullLength()) { - const auto mid = subspan.data() + subspan.size() / 2; - auto [midFrame, rightHalfSpan] = FindNextFrameHeader({mid, subspan.data() + subspan.size()}); - if (!midFrame) { - // If mid is in the middle of the last frame, here we will lose it meaning that - // we will find previous frame as the result. - // This is fine because we will iterate frames starting from that. - subspan = subspan.substr(0, subspan.size() / 2); - continue; - } - if (midFrame->StartTime() <= leftTimeBound) { - maybeLeftFrame = midFrame; - subspan = rightHalfSpan; - } else { - subspan = subspan.substr(0, subspan.size() / 2); - } - } - - return subspan.data() - span.data(); - } -} - -TFrameHeader::TFrameHeader(IInputStream& in) { - try { - ::Load(&in, Basehdr); - - Y_ENSURE(Basehdr.Length, "Empty frame additional data"); - - ::Load(&in, Framehdr); - switch (LogFormat()) { - case COMPRESSED_LOG_FORMAT_V1: - break; - - case COMPRESSED_LOG_FORMAT_V2: - case COMPRESSED_LOG_FORMAT_V3: - case COMPRESSED_LOG_FORMAT_V4: - case COMPRESSED_LOG_FORMAT_V5: - Y_ENSURE(!Framehdr.CompressorVersion, "Wrong compressor"); - - Y_ENSURE(HasCorrectChecksum(*this), "Wrong header checksum"); - break; - - default: - ythrow yexception() << "Unsupported log structure format"; - }; - - Y_ENSURE(Framehdr.StartTimestamp <= Framehdr.EndTimestamp, "Wrong start/end timestamps"); - - // Each frame must contain at least one event. - Y_ENSURE(Framehdr.UncompressedDatalen, "Empty frame payload"); - } catch (...) { - TString location = ""; - if (const auto* cnt = dynamic_cast<TCountingInput *>(&in)) { - location = "@ " + ToString(cnt->Counter()); - } - ythrow TFrameLoadError(FrameLength()) << "Frame Load Error" << location << ": " << CurrentExceptionMessage(); - } -} - -TFrame::TFrame(IInputStream& in, TFrameHeader header, IEventFactory* fac) - : TFrameHeader(header) - , Limiter_(MakeHolder<TLengthLimitedInput>(&in, header.FrameLength())) - , Fac_(fac) -{ - if (auto* cnt = dynamic_cast<TCountingInput *>(&in)) { - Address_ = cnt->Counter() - sizeof(TFrameHeader); - } else { - Address_ = 0; - } -} - -TFrame::TIterator TFrame::GetIterator(TIntrusiveConstPtr<TEventFilter> eventFilter) const { - if (EventsCache_.empty()) { - for (TFrameDecoder decoder{*this, eventFilter.Get()}; decoder.Avail(); decoder.Next()) { - EventsCache_.emplace_back(*decoder); - } - } - - return TIterator(*this, eventFilter); -} - -void TFrame::ClearEventsCache() const { - EventsCache_.clear(); -} - -TString TFrame::GetCompressedFrame() const { - const auto left = Limiter_->Left(); - TString payload = Limiter_->ReadAll(); - Y_ENSURE(payload.size() == left, "Could not read frame payload: premature end of stream"); - const ui32 checksum = MurmurHash<ui32>(payload.data(), payload.size()); - Y_ENSURE(checksum == Framehdr.PayloadChecksum, "Invalid frame checksum"); - - return payload; -} - -TString TFrame::GetRawFrame() const { - TString frameBuf = GetCompressedFrame(); - TStringInput sin(frameBuf); - return TZLibDecompress{&sin}.ReadAll(); -} - -TFrame::TIterator::TIterator(const TFrame& frame, TIntrusiveConstPtr<TEventFilter> filter) - : Frame_(frame) - , Size_(frame.EventsCache_.size()) - , Filter_(filter) - , Index_(0) -{ - SkipToValidEvent(); -} - -TConstEventPtr TFrame::TIterator::operator*() const { - return Frame_.GetEvent(Index_); -} - -bool TFrame::TIterator::Next() { - Index_++; - SkipToValidEvent(); - return Index_ < Size_; -} - -void TFrame::TIterator::SkipToValidEvent() { - if (!Filter_) { - return; - } - - for (; Index_ < Size_; ++Index_) { - if (Filter_->EventAllowed(Frame_.GetEvent(Index_)->Class)) { - break; - } - } -} - -TMaybe<TFrame> FindNextFrame(IInputStream* in, IEventFactory* eventFactory) { - if (auto header = FindNextFrameHeader(in)) { - return TFrame{*in, *header, eventFactory}; - } else { - return Nothing(); - } -} - -TContainsEventFrameFilter::TContainsEventFrameFilter(const TString& unparsedMatchGroups, const IEventFactory* eventFactory) { - TVector<TStringBuf> tokens; - - SplitWithEscaping(tokens, unparsedMatchGroups, "/"); - - // Amount of match groups - size_t size = tokens.size(); - MatchGroups.resize(size); - - for (size_t i = 0; i < size; i++) { - TMatchGroup& group = MatchGroups[i]; - TVector<TStringBuf> groupTokens; - SplitWithEscaping(groupTokens, tokens[i], ":"); - - Y_ENSURE(groupTokens.size() == 3); - - try { - group.EventID = eventFactory->ClassByName(groupTokens[0]); - } catch (yexception& e) { - if (!TryFromString<TEventClass>(groupTokens[0], group.EventID)) { - e << "\nAppend:\n" << "Cannot derive EventId from EventType: " << groupTokens[0]; - throw e; - } - } - - group.FieldName = groupTokens[1]; - group.ValueToMatch = UnescapeCharacters(groupTokens[2], "/:"); - } -} - -bool TContainsEventFrameFilter::FrameAllowed(const TFrame& frame) const { - THashSet<size_t> toMatchSet; - for (size_t i = 0; i < MatchGroups.size(); i++) { - toMatchSet.insert(i); - } - - for (auto it = frame.GetIterator(); it.Avail(); it.Next()) { - TConstEventPtr event(*it); - TVector<size_t> indicesToErase; - - if (!toMatchSet.empty()) { - const NProtoBuf::Message* message = event->GetProto(); - const google::protobuf::Descriptor* descriptor = message->GetDescriptor(); - const google::protobuf::Reflection* reflection = message->GetReflection(); - - Y_ENSURE(descriptor); - Y_ENSURE(reflection); - - for (size_t groupIndex : toMatchSet) { - const TMatchGroup& group = MatchGroups[groupIndex]; - - if (event->Class == group.EventID) { - TVector<TString> parts = StringSplitter(group.FieldName).Split('.').ToList<TString>(); - TString lastPart = std::move(parts.back()); - parts.pop_back(); - - for (auto part : parts) { - auto fieldDescriptor = descriptor->FindFieldByName(part); - Y_ENSURE(fieldDescriptor, "Cannot find field \"" + part + "\". Full fieldname is \"" + group.FieldName + "\"."); - - message = &reflection->GetMessage(*message, fieldDescriptor); - descriptor = message->GetDescriptor(); - reflection = message->GetReflection(); - - Y_ENSURE(descriptor); - Y_ENSURE(reflection); - } - - const google::protobuf::FieldDescriptor* fieldDescriptor = descriptor->FindFieldByName(lastPart); - Y_ENSURE(fieldDescriptor, "Cannot find field \"" + lastPart + "\". Full fieldname is \"" + group.FieldName + "\"."); - - TString fieldValue = GetEventFieldAsString(message, fieldDescriptor, reflection); - if (re2::RE2::FullMatch(fieldValue, group.ValueToMatch)) { - indicesToErase.push_back(groupIndex); - } - } - } - - for (size_t idx : indicesToErase) { - toMatchSet.erase(idx); - } - - if (toMatchSet.empty()) { - return true; - } - } - } - - return toMatchSet.empty(); -} - -void SplitWithEscaping(TVector<TStringBuf>& tokens, const TStringBuf& stringToSplit, const TStringBuf& externalCharacterSet) { - size_t tokenStart = 0; - const TString characterSet = TString::Join("\\", externalCharacterSet); - - for (size_t position = stringToSplit.find_first_of(characterSet); position != TString::npos; position = stringToSplit.find_first_of(characterSet, position + 1)) { - if (stringToSplit[position] == '\\') { - position++; - } else { - if (tokenStart != position) { - tokens.push_back(TStringBuf(stringToSplit, tokenStart, position - tokenStart)); - } - tokenStart = position + 1; - } - } - - if (tokenStart < stringToSplit.size()) { - tokens.push_back(TStringBuf(stringToSplit, tokenStart, stringToSplit.size() - tokenStart)); - } -} - -TString UnescapeCharacters(const TStringBuf& stringToUnescape, const TStringBuf& characterSet) { - TStringBuilder stringBuilder; - size_t tokenStart = 0; - - for (size_t position = stringToUnescape.find('\\', 0u); position != TString::npos; position = stringToUnescape.find('\\', position + 2)) { - if (position + 1 < stringToUnescape.size() && characterSet.find(stringToUnescape[position + 1]) != TString::npos) { - stringBuilder << TStringBuf(stringToUnescape, tokenStart, position - tokenStart); - tokenStart = position + 1; - } - } - - if (tokenStart < stringToUnescape.size()) { - stringBuilder << TStringBuf(stringToUnescape, tokenStart, stringToUnescape.size() - tokenStart); - } - - return stringBuilder; -} - -TString GetEventFieldAsString(const NProtoBuf::Message* message, const google::protobuf::FieldDescriptor* fieldDescriptor, const google::protobuf::Reflection* reflection) { - Y_ENSURE(message); - Y_ENSURE(fieldDescriptor); - Y_ENSURE(reflection); - - TString result; - switch (fieldDescriptor->type()) { - case google::protobuf::FieldDescriptor::Type::TYPE_DOUBLE: - result = ToString(reflection->GetDouble(*message, fieldDescriptor)); - break; - case google::protobuf::FieldDescriptor::Type::TYPE_FLOAT: - result = ToString(reflection->GetFloat(*message, fieldDescriptor)); - break; - case google::protobuf::FieldDescriptor::Type::TYPE_BOOL: - result = ToString(reflection->GetBool(*message, fieldDescriptor)); - break; - case google::protobuf::FieldDescriptor::Type::TYPE_INT32: - result = ToString(reflection->GetInt32(*message, fieldDescriptor)); - break; - case google::protobuf::FieldDescriptor::Type::TYPE_UINT32: - result = ToString(reflection->GetUInt32(*message, fieldDescriptor)); - break; - case google::protobuf::FieldDescriptor::Type::TYPE_INT64: - result = ToString(reflection->GetInt64(*message, fieldDescriptor)); - break; - case google::protobuf::FieldDescriptor::Type::TYPE_UINT64: - result = ToString(reflection->GetUInt64(*message, fieldDescriptor)); - break; - case google::protobuf::FieldDescriptor::Type::TYPE_STRING: - result = ToString(reflection->GetString(*message, fieldDescriptor)); - break; - case google::protobuf::FieldDescriptor::Type::TYPE_ENUM: - { - const NProtoBuf::EnumValueDescriptor* enumValueDescriptor = reflection->GetEnum(*message, fieldDescriptor); - result = ToString(enumValueDescriptor->name()); - } - break; - default: - throw yexception() << "GetEventFieldAsString for type " << fieldDescriptor->type_name() << " is not implemented."; - } - return result; -} - -TFrameStreamer::TFrameStreamer(IInputStream& s, IEventFactory* fac, IFrameFilterRef ff) - : In_(&s) - , FrameFilter_(ff) - , EventFactory_(fac) -{ - Frame_ = FindNextFrame(&In_, EventFactory_); - - SkipToAllowedFrame(); -} - -TFrameStreamer::TFrameStreamer( - const TString& fileName, - ui64 startTime, - ui64 endTime, - ui64 maxRequestDuration, - IEventFactory* fac, - IFrameFilterRef ff) - : File_(TBlob::FromFile(fileName)) - , MemoryIn_(File_.Data(), File_.Size()) - , In_(&MemoryIn_) - , StartTime_(startTime) - , EndTime_(endTime) - , CutoffTime_(endTime + Min(maxRequestDuration, Max<ui64>() - endTime)) - , FrameFilter_(ff) - , EventFactory_(fac) -{ - In_.Skip(FindFrames(File_.AsStringBuf(), startTime, endTime, maxRequestDuration)); - Frame_ = FindNextFrame(&In_, fac); - SkipToAllowedFrame(); -} - -TFrameStreamer::~TFrameStreamer() = default; - -bool TFrameStreamer::Avail() const { - return Frame_.Defined(); -} - -const TFrame& TFrameStreamer::operator*() const { - Y_ENSURE(Frame_, "Frame streamer depleted"); - - return *Frame_; -} - -bool TFrameStreamer::Next() { - DoNext(); - SkipToAllowedFrame(); - - return Frame_.Defined(); -} - -bool TFrameStreamer::AllowedTimeRange(const TFrame& frame) const { - const bool allowedStartTime = (StartTime_ == 0) || ((StartTime_ <= frame.StartTime()) && (frame.StartTime() <= EndTime_)); - const bool allowedEndTime = (EndTime_ == 0) || ((StartTime_ <= frame.EndTime()) && (frame.EndTime() <= EndTime_)); - return allowedStartTime || allowedEndTime; -} - -bool TFrameStreamer::DoNext() { - if (!Frame_) { - return false; - } - In_.Skip(Frame_->Limiter_->Left()); - Frame_ = FindNextFrame(&In_, EventFactory_); - - if (Frame_ && CutoffTime_ > 0 && Frame_->EndTime() > CutoffTime_) { - Frame_.Clear(); - } - - return Frame_.Defined(); -} - -namespace { - struct TDecodeBuffer { - TDecodeBuffer(const TString codec, IInputStream& src, size_t bs) { - TBuffer from(bs); - - { - TBufferOutput b(from); - TransferData(&src, &b); - } - - NBlockCodecs::Codec(codec)->Decode(from, DecodeBuffer); - } - - explicit TDecodeBuffer(IInputStream& src) { - TBufferOutput b(DecodeBuffer); - TransferData(&src, &b); - } - - TBuffer DecodeBuffer; - }; - - class TBlockCodecStream: private TDecodeBuffer, public TBufferInput { - public: - TBlockCodecStream(const TString codec, IInputStream& src, size_t bs) - : TDecodeBuffer(codec, src, bs) - , TBufferInput(DecodeBuffer) - {} - - explicit TBlockCodecStream(IInputStream& src) - : TDecodeBuffer(src) - , TBufferInput(DecodeBuffer) - {} - }; -} - -TFrameDecoder::TFrameDecoder(const TFrame& fr, const TEventFilter* const filter, bool strict, bool withRawData) - : Frame_(fr) - , Event_(nullptr) - , Flt_(filter) - , Fac_(fr.Fac_) - , EndOfFrame_(new TEndOfFrameEvent(Frame_.EndTime())) - , Strict_(strict) - , WithRawData_(withRawData) -{ - switch (fr.LogFormat()) { - case COMPRESSED_LOG_FORMAT_V2: - case COMPRESSED_LOG_FORMAT_V3: - case COMPRESSED_LOG_FORMAT_V4: - case COMPRESSED_LOG_FORMAT_V5: { - const auto payload = fr.GetCompressedFrame(); - TMemoryInput payloadInput{payload}; - - if (fr.LogFormat() == COMPRESSED_LOG_FORMAT_V5) { - Decompressor_.Reset(new TBlockCodecStream("zstd_1", payloadInput, payload.size())); - } else { - TZLibDecompress zlib(&payloadInput); - Decompressor_.Reset(new TBlockCodecStream(zlib)); - if (fr.LogFormat() == COMPRESSED_LOG_FORMAT_V4) { - Decompressor_.Reset(new TBlockCodecStream("lz4hc", *Decompressor_, payload.size())); - } - } - - break; - } - - default: - ythrow yexception() << "unsupported log format: " << fr.LogFormat() << Endl; - break; - }; - - if (WithRawData_) { - TBufferOutput out(UncompressedData_); - TLengthLimitedInput limiter(Decompressor_.Get(), fr.Framehdr.UncompressedDatalen); - - TransferData(&limiter, &out); - Decompressor_.Reset(new TMemoryInput(UncompressedData_.data(), UncompressedData_.size())); - } - - Limiter_.Reset(new TLengthLimitedInput(Decompressor_.Get(), fr.Framehdr.UncompressedDatalen)); - - Decode(); -} - -TFrameDecoder::~TFrameDecoder() = default; - -bool TFrameDecoder::Avail() const { - return HaveData(); -} - -TConstEventPtr TFrameDecoder::operator*() const { - Y_ENSURE(HaveData(), "Decoder depleted"); - - return Event_; -} - -bool TFrameDecoder::Next() { - if (HaveData()) { - Decode(); - } - - return HaveData(); -} - -void TFrameDecoder::Decode() { - Event_ = nullptr; - const bool framed = (Frame_.LogFormat() == COMPRESSED_LOG_FORMAT_V3) || (Frame_.LogFormat() == COMPRESSED_LOG_FORMAT_V4 || Frame_.LogFormat() == COMPRESSED_LOG_FORMAT_V5); - - size_t evBegin = 0; - size_t evEnd = 0; - if (WithRawData_) - evBegin = UncompressedData_.Size() - Limiter_->Left(); - - while (Limiter_->Left() && !(Event_ = DecodeEvent(*Limiter_, framed, Frame_.Address(), Flt_, Fac_, Strict_).Release())) { - } - - if (WithRawData_) { - evEnd = UncompressedData_.Size() - Limiter_->Left(); - RawEventData_ = TStringBuf(UncompressedData_.data() + evBegin, UncompressedData_.data() + evEnd); - } - - if (!Event_ && (!Flt_ || (Flt_->EventAllowed(TEndOfFrameEvent::EventClass)))) { - Event_ = EndOfFrame_.Release(); - } - - if (!!Event_) { - Event_->FrameId = Frame_.FrameId(); - } -} - -const TStringBuf TFrameDecoder::GetRawEvent() const { - return RawEventData_; -} - -TEventStreamer::TEventStreamer(TFrameStream& fs, ui64 s, ui64 e, bool strongOrdering, TIntrusivePtr<TEventFilter> filter, bool losslessStrongOrdering) - : Frames_(fs) - , Start_(s) - , End_(e) - , MaxEndTimestamp_(0) - , Frontier_(0) - , StrongOrdering_(strongOrdering) - , LosslessStrongOrdering_(losslessStrongOrdering) - , EventFilter_(filter) -{ - - if (Start_ > End_) { - ythrow yexception() << "Wrong main interval"; - } - - TEventStreamer::Next(); -} - -TEventStreamer::~TEventStreamer() = default; - -bool TEventStreamer::Avail() const { - return Events_.Avail() && (*Events_)->Timestamp <= Frontier_; -} - -TConstEventPtr TEventStreamer::operator*() const { - Y_ENSURE(TEventStreamer::Avail(), "Event streamer depleted"); - - return *Events_; -} - -bool TEventStreamer::Next() { - if (Events_.Avail() && Events_.Next() && (*Events_)->Timestamp <= Frontier_) { - return true; - } - - for (;;) { - if (!LoadMoreEvents()) { - return false; - } - - if (TEventStreamer::Avail()) { - return true; - } - } -} - -/* -Two parameters are used in the function: -Frontier - the moment of time up to which inclusively all the log events made their way - into the buffer (and might have been already extracted out of it). -Horizon - the moment of time, that equals to Frontier + MAX_REQUEST_DURATION. -In order to get all the log events up to the Frontier inclusively, - frames need to be read until "end time" of the current frame exceeds the Horizon. -*/ -bool TEventStreamer::LoadMoreEvents() { - if (!Frames_.Avail()) { - return false; - } - - const TFrame& fr1 = *Frames_; - const ui64 maxRequestDuration = (StrongOrdering_ ? MAX_REQUEST_DURATION : 0); - - if (fr1.EndTime() <= Frontier_ + maxRequestDuration) { - ythrow yexception() << "Wrong frame stream state"; - } - - if (Frontier_ >= End_) { - return false; - } - - const ui64 old_frontier = Frontier_; - Frontier_ = fr1.EndTime(); - - { - Y_DEFER { - Events_.Reorder(StrongOrdering_); - }; - - for (; Frames_.Avail(); Frames_.Next()) { - const TFrame& fr2 = *Frames_; - - // Frames need to start later than the Frontier. - if (StrongOrdering_ && fr2.StartTime() <= old_frontier) { - Cdbg << "Invalid frame encountered" << Endl; - continue; - } - - if (fr2.EndTime() > MaxEndTimestamp_) { - MaxEndTimestamp_ = fr2.EndTime(); - } - - if (fr2.EndTime() > Frontier_ + maxRequestDuration && !LosslessStrongOrdering_) { - return true; - } - - // Checking for the frame to be within the main time borders. - if (fr2.EndTime() >= Start_ && fr2.StartTime() <= End_) { - TransferEvents(fr2); - } - } - } - - Frontier_ = MaxEndTimestamp_; - - return true; -} - -void TEventStreamer::TransferEvents(const TFrame& fr) { - Events_.SetCheckpoint(); - - try { - for (auto it = fr.GetIterator(EventFilter_); it.Avail(); it.Next()) { - TConstEventPtr ev = *it; - - if (ev->Timestamp > fr.EndTime() || ev->Timestamp < fr.StartTime()) { - ythrow TInvalidEventTimestamps() << "Event timestamp out of frame range"; - } - - if (ev->Timestamp >= Start_ && ev->Timestamp <= End_) { - Events_.Append(ev, StrongOrdering_); - } - } - } catch (const TInvalidEventTimestamps& err) { - Events_.Rollback(); - Cdbg << "EventsTransfer error: InvalidEventTimestamps: " << err.what() << Endl; - } catch (const TFrameLoadError& err) { - Events_.Rollback(); - Cdbg << "EventsTransfer error: " << err.what() << Endl; - } catch (const TEventDecoderError& err) { - Events_.Rollback(); - Cdbg << "EventsTransfer error: EventDecoder error: " << err.what() << Endl; - } catch (const TZLibDecompressorError& err) { - Events_.Rollback(); - Cdbg << "EventsTransfer error: ZLibDecompressor error: " << err.what() << Endl; - } catch (...) { - Events_.Rollback(); - throw; - } -} - -void TEventStreamer::TEventBuffer::SetCheckpoint() { - BufLen_ = Buffer_.size(); -} - -void TEventStreamer::TEventBuffer::Rollback() { - Buffer_.resize(BufLen_); -} - -void TEventStreamer::TEventBuffer::Reorder(bool strongOrdering) { - SetCheckpoint(); - - std::reverse(Buffer_.begin(), Buffer_.end()); - - if (strongOrdering) { - StableSort(Buffer_.begin(), Buffer_.end(), [&](const auto& a, const auto& b) { - return (a->Timestamp > b->Timestamp) || - ((a->Timestamp == b->Timestamp) && !a->Class && b->Class); - }); - } -} - -void TEventStreamer::TEventBuffer::Append(TConstEventPtr ev, bool strongOrdering) { - // Events in buffer output must be in an ascending order. - Y_ENSURE(!strongOrdering || ev->Timestamp >= LastTimestamp_, "Trying to append out-of-order event"); - - Buffer_.push_back(std::move(ev)); -} - -bool TEventStreamer::TEventBuffer::Avail() const { - return !Buffer_.empty(); -} - -TConstEventPtr TEventStreamer::TEventBuffer::operator*() const { - Y_ENSURE(!Buffer_.empty(), "Event buffer is empty"); - - return Buffer_.back(); -} - -bool TEventStreamer::TEventBuffer::Next() { - if (!Buffer_.empty()) { - LastTimestamp_ = Buffer_.back()->Timestamp; - Buffer_.pop_back(); - return !Buffer_.empty(); - } else { - return false; - } -} diff --git a/library/cpp/eventlog/logparser.h b/library/cpp/eventlog/logparser.h deleted file mode 100644 index f819e725894..00000000000 --- a/library/cpp/eventlog/logparser.h +++ /dev/null @@ -1,343 +0,0 @@ -#pragma once - -#include <util/generic/ptr.h> -#include <util/generic/yexception.h> -#include <util/generic/vector.h> -#include <util/generic/set.h> -#include <util/generic/maybe.h> -#include <util/memory/blob.h> -#include <util/stream/length.h> -#include <util/stream/mem.h> - -#include "eventlog_int.h" -#include "eventlog.h" -#include "common.h" - -class IInputStream; - -static const ui64 MAX_REQUEST_DURATION = 60'000'000; -static const ui64 MIN_START_TIME = MAX_REQUEST_DURATION; -static const ui64 MAX_END_TIME = ((ui64)-1) - MAX_REQUEST_DURATION; - -class TEventFilter: public TSet<TEventClass>, public TSimpleRefCount<TEventFilter> { -public: - TEventFilter(bool enableEvents) - : Enable_(enableEvents) - { - } - - void AddEventClass(TEventClass cls) { - insert(cls); - } - - bool EventAllowed(TEventClass cls) const { - bool found = (find(cls) != end()); - - return Enable_ == found; - } - -private: - bool Enable_; -}; - -using TEventStream = TPacketInputStream<TConstEventPtr>; - -struct TFrameHeader { - // Reads header from the stream. The caller must make sure that the - // sync data is present just befor the stream position. - explicit TFrameHeader(IInputStream& in); - - ui64 StartTime() const { - return Framehdr.StartTimestamp; - } - - ui64 EndTime() const { - return Framehdr.EndTimestamp; - } - - ui32 FrameId() const { - return Basehdr.FrameId; - } - - ui64 Duration() const { - return EndTime() - StartTime(); - } - - TEventLogFormat ContentFormat() const { - return Basehdr.Format & 0xffffff; - } - - TEventLogFormat LogFormat() const { - return Basehdr.Format >> 24; - } - - ui64 FrameLength() const { - return Basehdr.Length - sizeof(TCompressedFrameHeader2); - } - - // Length including the header - ui64 FullLength() const { - return sizeof(*this) + FrameLength(); - } - - TCompressedFrameBaseHeader Basehdr; - TCompressedFrameHeader2 Framehdr; -}; - -struct TFrameLoadError: public yexception { - explicit TFrameLoadError(size_t skipAfter) - : SkipAfter(skipAfter) - {} - - size_t SkipAfter; -}; - -class TFrame : public TFrameHeader { -public: - // Reads the frame after the header has been read. - TFrame(IInputStream& in, TFrameHeader header, IEventFactory*); - - TString GetRawFrame() const; - TString GetCompressedFrame() const; - - ui64 Address() const { return Address_; } - -private: - const TConstEventPtr& GetEvent(size_t index) const { - return EventsCache_[index]; - } - - void ClearEventsCache() const; - - THolder<TLengthLimitedInput> Limiter_; - mutable TVector<TConstEventPtr> EventsCache_; - - IEventFactory* Fac_; - ui64 Address_; - - friend class TFrameDecoder; - friend class TFrameStreamer; - -private: - class TIterator: TEventStream { - public: - TIterator(const TFrame& frame, TIntrusiveConstPtr<TEventFilter> filter); - ~TIterator() override = default; - - bool Avail() const override { - return Index_ < Size_; - } - - TConstEventPtr operator*() const override; - bool Next() override; - - private: - void SkipToValidEvent(); - - const TFrame& Frame_; - size_t Size_; - TIntrusiveConstPtr<TEventFilter> Filter_; - size_t Index_; - }; - -public: - TFrame::TIterator GetIterator(TIntrusiveConstPtr<TEventFilter> eventFilter = nullptr) const; -}; - -// If `in` is derived from TCountingInput, Frame's address will -// be set accorting to the in->Counter(). Otherwise it will be zeroO -TMaybe<TFrame> FindNextFrame(IInputStream* in, IEventFactory*); - -using TFrameStream = TPacketInputStream<const TFrame&>; - -class IFrameFilter: public TSimpleRefCount<IFrameFilter> { -public: - IFrameFilter() { - } - - virtual ~IFrameFilter() = default; - - virtual bool FrameAllowed(const TFrame& frame) const = 0; -}; - -using IFrameFilterRef = TIntrusivePtr<IFrameFilter>; - -class TDurationFrameFilter: public IFrameFilter { -public: - TDurationFrameFilter(ui64 minFrameDuration, ui64 maxFrameDuration = Max<ui64>()) - : MinDuration_(minFrameDuration) - , MaxDuration_(maxFrameDuration) - { - } - - bool FrameAllowed(const TFrame& frame) const override { - return frame.Duration() >= MinDuration_ && frame.Duration() <= MaxDuration_; - } - -private: - const ui64 MinDuration_; - const ui64 MaxDuration_; -}; - -class TFrameIdFrameFilter: public IFrameFilter { -public: - TFrameIdFrameFilter(ui32 frameId) - : FrameId_(frameId) - { - } - - bool FrameAllowed(const TFrame& frame) const override { - return frame.FrameId() == FrameId_; - } - -private: - const ui32 FrameId_; -}; - -class TContainsEventFrameFilter: public IFrameFilter { -public: - TContainsEventFrameFilter(const TString& args, const IEventFactory* fac); - - bool FrameAllowed(const TFrame& frame) const override; - -private: - struct TMatchGroup { - TEventClass EventID; - TString FieldName; - TString ValueToMatch; - }; - - TVector<TMatchGroup> MatchGroups; -}; - -void SplitWithEscaping(TVector<TStringBuf>& tokens, const TStringBuf& stringToSplit, const TStringBuf& externalCharacterSet); - -TString UnescapeCharacters(const TStringBuf& stringToUnescape, const TStringBuf& characterSet); - -TString GetEventFieldAsString(const NProtoBuf::Message* message, const google::protobuf::FieldDescriptor* fieldDescriptor, const google::protobuf::Reflection* reflection); - -class TFrameStreamer: public TFrameStream { -public: - TFrameStreamer(IInputStream&, IEventFactory* fac, IFrameFilterRef ff = nullptr); - TFrameStreamer( - const TString& fileName, - ui64 startTime, - ui64 endTime, - ui64 maxRequestDuration, - IEventFactory* fac, - IFrameFilterRef ff = nullptr); - ~TFrameStreamer() override; - - bool Avail() const override; - const TFrame& operator*() const override; - bool Next() override; - -private: - bool DoNext(); - bool AllowedTimeRange(const TFrame& frame) const; - - bool AllowedFrame(const TFrame& frame) const { - return AllowedTimeRange(frame) && (!FrameFilter_ || FrameFilter_->FrameAllowed(frame)); - } - - void SkipToAllowedFrame() { - if (Frame_) { - while (!AllowedFrame(*Frame_) && DoNext()) { - //do nothing - } - } - } - - TBlob File_; - TMemoryInput MemoryIn_; - TCountingInput In_; - THolder<IInputStream> Stream_; - ui64 StartTime_ = 0; - ui64 EndTime_ = 0; - ui64 CutoffTime_ = 0; - TMaybe<TFrame> Frame_; - IFrameFilterRef FrameFilter_; - IEventFactory* EventFactory_; -}; - -class TFrameDecoder: TEventStream { -public: - TFrameDecoder(const TFrame&, const TEventFilter* const filter, bool strict = false, bool withRawData = false); - ~TFrameDecoder() override; - - bool Avail() const override; - - TConstEventPtr operator*() const override; - bool Next() override; - - const TStringBuf GetRawEvent() const; - -private: - TFrameDecoder(const TFrameDecoder&); - void operator=(const TFrameDecoder&); - - inline bool HaveData() const { - return Event_ != nullptr; - } - - void Decode(); - -private: - const TFrame& Frame_; - THolder<IInputStream> Decompressor_; - THolder<TLengthLimitedInput> Limiter_; - TEventPtr Event_; - const TEventFilter* const Flt_; - IEventFactory* Fac_; - THolder<TEvent> EndOfFrame_; - bool Strict_; - TBuffer UncompressedData_; - TStringBuf RawEventData_; - bool WithRawData_; -}; - -class TEventStreamer: public TEventStream { -public: - TEventStreamer(TFrameStream&, ui64 start, ui64 end, bool strongOrdering, TIntrusivePtr<TEventFilter> filter, bool losslessStrongOrdering = false); - ~TEventStreamer() override; - - bool Avail() const override; - TConstEventPtr operator*() const override; - bool Next() override; - -private: - class TEventBuffer: public TEventStream { - public: - void SetCheckpoint(); - void Rollback(); - void Reorder(bool strongOrdering); - void Append(TConstEventPtr event, bool strongOrdering); - - bool Avail() const override; - TConstEventPtr operator*() const override; - bool Next() override; - - private: - TVector<TConstEventPtr> Buffer_; - size_t BufLen_ = 0; - ui64 LastTimestamp_ = 0; - }; - -private: - struct TInvalidEventTimestamps: public yexception { - }; - - bool LoadMoreEvents(); - void TransferEvents(const TFrame&); - -private: - TFrameStream& Frames_; - TEventBuffer Events_; - - ui64 Start_, End_; - ui64 MaxEndTimestamp_; - ui64 Frontier_; - bool StrongOrdering_; - bool LosslessStrongOrdering_; - TIntrusivePtr<TEventFilter> EventFilter_; -}; diff --git a/library/cpp/eventlog/proto/events_extension.proto b/library/cpp/eventlog/proto/events_extension.proto deleted file mode 100644 index 37a7d7e5614..00000000000 --- a/library/cpp/eventlog/proto/events_extension.proto +++ /dev/null @@ -1,22 +0,0 @@ -import "google/protobuf/descriptor.proto"; - -option go_package = "a.yandex-team.ru/library/cpp/eventlog/proto;extensions"; -option java_package = "NEventLogEventsExtension"; - -extend google.protobuf.MessageOptions { - optional uint32 message_id = 50001; - optional string realm_name = 50002; -} - -message Repr { - enum ReprType { - none = 0; - as_bytes = 1; // Only for primitive types - as_hex = 2; // Only for primitive types - as_base64 = 3; // Only for 'string' and 'bytes' fields - }; -} - -extend google.protobuf.FieldOptions { - optional Repr.ReprType repr = 55003 [default = none]; -} diff --git a/library/cpp/eventlog/proto/internal.proto b/library/cpp/eventlog/proto/internal.proto deleted file mode 100644 index 234230e0949..00000000000 --- a/library/cpp/eventlog/proto/internal.proto +++ /dev/null @@ -1,9 +0,0 @@ -option go_package = "a.yandex-team.ru/library/cpp/eventlog/proto;extensions"; - -package NEventLogInternal; - -message TUnknownEvent { -}; - -message TEndOfFrameEvent { -}; diff --git a/library/cpp/eventlog/threaded_eventlog.cpp b/library/cpp/eventlog/threaded_eventlog.cpp deleted file mode 100644 index 67839063fbd..00000000000 --- a/library/cpp/eventlog/threaded_eventlog.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "threaded_eventlog.h" diff --git a/library/cpp/eventlog/threaded_eventlog.h b/library/cpp/eventlog/threaded_eventlog.h deleted file mode 100644 index 52382b856d1..00000000000 --- a/library/cpp/eventlog/threaded_eventlog.h +++ /dev/null @@ -1,154 +0,0 @@ -#pragma once - -#include "eventlog.h" - -#include <util/generic/string.h> -#include <util/thread/pool.h> - -class TThreadedEventLog: public TEventLogWithSlave { -public: - class TWrapper; - using TOverflowCallback = std::function<void(TWrapper& wrapper)>; - - enum class EDegradationResult { - ShouldWrite, - ShouldDrop, - }; - using TDegradationCallback = std::function<EDegradationResult(float fillFactor)>; - -public: - TThreadedEventLog( - IEventLog& parentLog, - size_t threadCount, - size_t queueSize, - TOverflowCallback cb, - TDegradationCallback degradationCallback = {}) - : TEventLogWithSlave(parentLog) - , LogSaver(TThreadPoolParams().SetThreadName("ThreadedEventLog")) - , ThreadCount(threadCount) - , QueueSize(queueSize) - , OverflowCallback(std::move(cb)) - , DegradationCallback(std::move(degradationCallback)) - { - Init(); - } - - TThreadedEventLog( - const TEventLogPtr& parentLog, - size_t threadCount, - size_t queueSize, - TOverflowCallback cb, - TDegradationCallback degradationCallback = {}) - : TEventLogWithSlave(parentLog) - , LogSaver(TThreadPoolParams().SetThreadName("ThreadedEventLog")) - , ThreadCount(threadCount) - , QueueSize(queueSize) - , OverflowCallback(std::move(cb)) - , DegradationCallback(std::move(degradationCallback)) - { - Init(); - } - - TThreadedEventLog(IEventLog& parentLog) - : TThreadedEventLog(parentLog, 1, 0, TOverflowCallback()) - { - } - - TThreadedEventLog(const TEventLogPtr& parentLog) - : TThreadedEventLog(parentLog, 1, 0, TOverflowCallback()) - { - } - - ~TThreadedEventLog() override { - try { - LogSaver.Stop(); - } catch (...) { - } - } - - void ReopenLog() override { - TEventLogWithSlave::ReopenLog(); - } - - void CloseLog() override { - LogSaver.Stop(); - TEventLogWithSlave::CloseLog(); - } - - void WriteFrame(TBuffer& buffer, - TEventTimestamp startTimestamp, - TEventTimestamp endTimestamp, - TWriteFrameCallbackPtr writeFrameCallback = nullptr, - TLogRecord::TMetaFlags metaFlags = {}) override { - float fillFactor = 0.0f; - if (Y_LIKELY(LogSaver.GetMaxQueueSize() > 0)) { - fillFactor = static_cast<float>(LogSaver.Size()) / LogSaver.GetMaxQueueSize(); - } - - EDegradationResult status = EDegradationResult::ShouldWrite; - if (DegradationCallback) { - status = DegradationCallback(fillFactor); - } - if (Y_UNLIKELY(status == EDegradationResult::ShouldDrop)) { - return; - } - - THolder<TWrapper> wrapped; - wrapped.Reset(new TWrapper(buffer, startTimestamp, endTimestamp, Slave(), writeFrameCallback, std::move(metaFlags))); - - if (LogSaver.Add(wrapped.Get())) { - Y_UNUSED(wrapped.Release()); - } else if (OverflowCallback) { - OverflowCallback(*wrapped); - } - } - -private: - void Init() { - LogSaver.Start(ThreadCount, QueueSize); - } - -public: - class TWrapper: public IObjectInQueue { - public: - TWrapper(TBuffer& buffer, - TEventTimestamp startTimestamp, - TEventTimestamp endTimestamp, - IEventLog& slave, - TWriteFrameCallbackPtr writeFrameCallback = nullptr, - TLogRecord::TMetaFlags metaFlags = {}) - : StartTimestamp(startTimestamp) - , EndTimestamp(endTimestamp) - , Slave(&slave) - , WriteFrameCallback(writeFrameCallback) - , MetaFlags(std::move(metaFlags)) - { - Buffer.Swap(buffer); - } - - void Process(void*) override { - THolder<TWrapper> holder(this); - - WriteFrame(); - } - - void WriteFrame() { - Slave->WriteFrame(Buffer, StartTimestamp, EndTimestamp, WriteFrameCallback, std::move(MetaFlags)); - } - - private: - TBuffer Buffer; - TEventTimestamp StartTimestamp; - TEventTimestamp EndTimestamp; - IEventLog* Slave; - TWriteFrameCallbackPtr WriteFrameCallback; - TLogRecord::TMetaFlags MetaFlags; - }; - -private: - TThreadPool LogSaver; - const size_t ThreadCount; - const size_t QueueSize; - const TOverflowCallback OverflowCallback; - const TDegradationCallback DegradationCallback; -}; diff --git a/library/cpp/grpc/common/time_point.h b/library/cpp/grpc/common/time_point.h deleted file mode 100644 index c2b81262974..00000000000 --- a/library/cpp/grpc/common/time_point.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include <contrib/libs/grpc/include/grpcpp/support/time.h> - -#include <util/datetime/base.h> - -#include <chrono> - -namespace grpc { -// Specialization of TimePoint for TInstant -template <> -class TimePoint<TInstant> : public TimePoint<std::chrono::system_clock::time_point> { - using TChronoDuration = std::chrono::duration<TDuration::TValue, std::micro>; - -public: - TimePoint(const TInstant& time) - : TimePoint<std::chrono::system_clock::time_point>( - std::chrono::system_clock::time_point( - std::chrono::duration_cast<std::chrono::system_clock::duration>( - TChronoDuration(time.GetValue())))) { - } -}; -} // namespace grpc diff --git a/library/cpp/http/client/client.cpp b/library/cpp/http/client/client.cpp deleted file mode 100644 index f36aac37d74..00000000000 --- a/library/cpp/http/client/client.cpp +++ /dev/null @@ -1,232 +0,0 @@ -#include "client.h" -#include "request.h" - -#include <library/cpp/coroutine/dns/cache.h> -#include <library/cpp/coroutine/dns/coro.h> -#include <library/cpp/coroutine/dns/helpers.h> -#include <library/cpp/coroutine/engine/condvar.h> -#include <library/cpp/coroutine/engine/impl.h> -#include <library/cpp/coroutine/engine/network.h> -#include <library/cpp/coroutine/util/pipeque.h> - -#include <library/cpp/http/client/ssl/sslsock.h> -#include <library/cpp/http/client/fetch/coctx.h> -#include <library/cpp/http/client/fetch/codes.h> -#include <library/cpp/http/client/fetch/cosocket.h> -#include <library/cpp/http/client/fetch/fetch_single.h> - -#include <util/stream/output.h> -#include <util/thread/factory.h> -#include <util/system/event.h> -#include <util/system/spinlock.h> -#include <util/system/thread.h> - -namespace NHttp { - namespace { - using namespace NHttpFetcher; - - class TFetcher: private IThreadFactory::IThreadAble { - public: - TFetcher(const TClientOptions& options) - : Options_(options) - , FetchCoroutines(Max<size_t>(Options_.FetchCoroutines, 1)) - , RequestsQueue_(true, false) - , Done_(false) - { - } - - void Start() { - T_ = SystemThreadFactory()->Run(this); - } - - void Stop() { - if (T_) { - for (size_t i = 0; i < FetchCoroutines; ++i) { - RequestsQueue_.Push(nullptr); - } - - T_->Join(); - T_.Reset(); - } - } - - ~TFetcher() override { - Stop(); - } - - TFetchState FetchAsync(const TFetchRequestRef& req, NHttpFetcher::TCallBack cb) { - req->SetCallback(cb); - RequestsQueue_.Push(req); - return TFetchState(req); - } - - static TFetcher* Instance() { - static struct TFetcherHolder { - TFetcherHolder() { - Fetcher.Start(); - } - - TFetcher Fetcher{{}}; - } holder; - - return &holder.Fetcher; - } - - private: - void DoDrainLoop(TCont* c) { - TInstant nextDrain = TInstant::Now() + Options_.KeepAliveTimeout; - - while (true) { - DrainMutex_.LockI(c); - - while (true) { - if (Done_) { - DrainMutex_.UnLock(); - // All sockets in the connection pool should be cleared - // on some active couroutine. - SocketPool_.Clear(); - return; - } - if (DrainCond_.WaitD(c, &DrainMutex_, nextDrain) != 0) { - // In case of timeout the mutex will be in unlocked state. - break; - } - } - - SocketPool_.Drain(Options_.KeepAliveTimeout); - nextDrain = TInstant::Now() + Options_.KeepAliveTimeout; - } - } - - void DoFetchLoop(TCont* c) { - while (true) { - if (NCoro::PollI(c, RequestsQueue_.PopFd(), CONT_POLL_READ) == 0) { - TFetchRequestRef req; - - if (RequestsQueue_.Pop(&req)) { - if (!req) { - DrainMutex_.LockI(c); - const auto wasDone = Done_; - Done_ = true; - DrainMutex_.UnLock(); - if (!wasDone) { - DrainCond_.Signal(); - } - break; - } - - if (req->IsCancelled()) { - auto result = MakeIntrusive<TResult>(req->GetRequestImpl()->Url, FETCH_CANCELLED); - req->OnResponse(result); - continue; - } - - try { - while (true) { - auto getConnectionPool = [&] () -> TSocketPool* { - if (!Options_.KeepAlive || req->GetForceReconnect()) { - return nullptr; - } - return &SocketPool_; - }; - - auto sleep = req->OnResponse( - FetchSingleImpl(req->GetRequestImpl(), getConnectionPool())); - - if (!req->IsValid()) { - break; - } - - if (sleep != TDuration::Zero()) { - c->SleepT(sleep); - } - } - } catch (...) { - req->SetException(std::current_exception()); - } - } - } - } - } - - void DoExecute() override { - // Executor must be initialized in the same thread that will use it - // for fibers to work correctly on windows - TContExecutor executor(Options_.ExecutorStackSize); - - TThread::SetCurrentThreadName(Options_.Name.c_str()); - NAsyncDns::TOptions dnsOpts; - dnsOpts.SetMaxRequests(200); - NAsyncDns::TContResolver resolver(&executor, dnsOpts); - - THolder<NAsyncDns::TContDnsCache> dnsCache; - if (Options_.DnsCacheLifetime != TDuration::Zero()) { - NAsyncDns::TCacheOptions cacheOptions; - cacheOptions.SetEntryLifetime(Options_.DnsCacheLifetime); - dnsCache = MakeHolder<NAsyncDns::TContDnsCache>(&executor, cacheOptions); - } - - TCoCtxSetter ctxSetter(&executor, &resolver, dnsCache.Get()); - - for (size_t i = 0; i < FetchCoroutines; ++i) { - executor.Create<TFetcher, &TFetcher::DoFetchLoop>(this, "fetch_loop"); - } - - if (Options_.KeepAlive) { - executor.Create<TFetcher, &TFetcher::DoDrainLoop>(this, "drain_loop"); - } - - executor.Execute(); - executor.Abort(); - } - - private: - using IThreadRef = THolder<IThreadFactory::IThread>; - - const TClientOptions Options_; - const size_t FetchCoroutines; - - TContCondVar DrainCond_; - TContMutex DrainMutex_; - TSocketPool SocketPool_; - - /// Queue of incoming requests. - TPipeQueue<TFetchRequestRef> RequestsQueue_; - - bool Done_; - IThreadRef T_; - }; - - } - - class TFetchClient::TImpl: public TFetcher { - public: - inline TImpl(const TClientOptions& options) - : TFetcher(options) - { - } - }; - - TFetchClient::TFetchClient(const TClientOptions& options) - : Impl_(new TImpl(options)) - { - Impl_->Start(); - } - - TFetchClient::~TFetchClient() { - Impl_->Stop(); - } - - TFetchState TFetchClient::Fetch(const TFetchQuery& query, NHttpFetcher::TCallBack cb) { - return Impl_->FetchAsync(TFetchRequest::FromQuery(query), cb); - } - - TResultRef Fetch(const TFetchQuery& query) { - return FetchAsync(query, NHttpFetcher::TCallBack()).Get(); - } - - TFetchState FetchAsync(const TFetchQuery& query, NHttpFetcher::TCallBack cb) { - return TFetcher::Instance()->FetchAsync(TFetchRequest::FromQuery(query), cb); - } - -} diff --git a/library/cpp/http/client/client.h b/library/cpp/http/client/client.h deleted file mode 100644 index 717601989ef..00000000000 --- a/library/cpp/http/client/client.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include "query.h" -#include "request.h" - -namespace NHttp { - struct TClientOptions { -#define DECLARE_FIELD(name, type, default) \ - type name{default}; \ - inline TClientOptions& Set##name(const type& value) { \ - name = value; \ - return *this; \ - } - - /// The size of stack of fetching coroutine. - DECLARE_FIELD(ExecutorStackSize, size_t, 1 << 20); - - /// The number of fetching coroutines. - DECLARE_FIELD(FetchCoroutines, size_t, 3); - - DECLARE_FIELD(Name, TString, "GlobalFetcher"); - - /// The lifetime of entries in the DNS cache (if zero then cache is not used). - DECLARE_FIELD(DnsCacheLifetime, TDuration, TDuration::Zero()); - - /// Established connections will be keept for further usage. - DECLARE_FIELD(KeepAlive, bool, false); - - /// How long established connections should be keept. - DECLARE_FIELD(KeepAliveTimeout, TDuration, TDuration::Minutes(5)); - -#undef DECLARE_FIELD - }; - - /** - * Statefull fetching client. - * Can handle multiply fetching request simultaneously. Also it's may apply - * politeness policy to control load of each host. - */ - class TFetchClient { - public: - explicit TFetchClient(const TClientOptions& options = TClientOptions()); - ~TFetchClient(); - - /// Execute give fetch request in asynchronous fashion. - TFetchState Fetch(const TFetchQuery& query, NHttpFetcher::TCallBack cb); - - private: - class TImpl; - THolder<TImpl> Impl_; - }; - - /// Execute give fetch request in synchronous fashion. - NHttpFetcher::TResultRef Fetch(const TFetchQuery& query); - - /// Execute give fetch request in asynchronous fashion. - TFetchState FetchAsync(const TFetchQuery& query, NHttpFetcher::TCallBack cb); - -} diff --git a/library/cpp/http/client/cookies/cookie.h b/library/cpp/http/client/cookies/cookie.h deleted file mode 100644 index ff2f299cfb6..00000000000 --- a/library/cpp/http/client/cookies/cookie.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include <util/datetime/base.h> -#include <util/generic/string.h> - -namespace NHttp { - struct TCookie { - TString Name; - TString Value; - TString Domain; - TString Path; - TString Expires; - int MaxAge = -1; - bool IsSecure = false; - bool IsHttpOnly = false; - - static TCookie Parse(const TString& header); - }; - -} diff --git a/library/cpp/http/client/cookies/cookiestore.cpp b/library/cpp/http/client/cookies/cookiestore.cpp deleted file mode 100644 index cf053e2cf6b..00000000000 --- a/library/cpp/http/client/cookies/cookiestore.cpp +++ /dev/null @@ -1,280 +0,0 @@ -#include "cookiestore.h" - -#include <library/cpp/deprecated/split/split_iterator.h> - -#include <util/generic/algorithm.h> -#include <util/string/ascii.h> - -#include <time.h> - -namespace NHttp { - bool TCookieStore::TStoredCookie::IsEquivalent(const TStoredCookie& rhs) const { - return (IsHostOnly == rhs.IsHostOnly) && (Cookie.Domain == rhs.Cookie.Domain) && - (Cookie.Path == rhs.Cookie.Path) && (Cookie.Name == rhs.Cookie.Name); - } - - TCookieStore::TCookieStore() { - } - - TCookieStore::~TCookieStore() { - } - - bool TCookieStore::SetCookie(const NUri::TUri& requestUri, const TString& cookieHeader) { - // https://tools.ietf.org/html/rfc6265#section-5.3 - TStoredCookie stored; - stored.CreateTime = Now(); - try { - stored.Cookie = TCookie::Parse(cookieHeader); - } catch (const yexception&) { - // Parse failed, ignore cookie - return false; - } - if (stored.Cookie.Domain) { - if (!DomainMatch(requestUri.GetHost(), stored.Cookie.Domain)) { - // Cookie for other domain - return false; - } - stored.IsHostOnly = false; - } else { - stored.Cookie.Domain = requestUri.GetHost(); - stored.IsHostOnly = true; - } - if (!stored.Cookie.Path) { - stored.Cookie.Path = requestUri.GetField(NUri::TField::FieldPath); - } - stored.ExpireTime = GetExpireTime(stored.Cookie); - - auto g(Guard(Lock_)); - for (auto it = Cookies_.begin(); it != Cookies_.end(); ++it) { - if (it->IsEquivalent(stored)) { - *it = stored; - return true; - } - } - Cookies_.push_back(stored); - return true; - } - - TString TCookieStore::GetCookieString(const NUri::TUri& requestUri) const { - // https://tools.ietf.org/html/rfc6265#section-5.4 - const TInstant now = Now(); - auto g(Guard(Lock_)); - - TVector<TCookieVector::const_iterator> validCookies; - validCookies.reserve(Cookies_.size()); - - // Filter cookies - for (auto it = Cookies_.begin(); it != Cookies_.end(); ++it) { - if (it->IsHostOnly) { - if (!AsciiEqualsIgnoreCase(it->Cookie.Domain, requestUri.GetHost())) { - continue; - } - } else { - if (!DomainMatch(requestUri.GetHost(), it->Cookie.Domain)) { - continue; - } - } - if (!PathMatch(requestUri.GetField(NUri::TField::FieldPath), it->Cookie.Path)) { - continue; - } - if (it->Cookie.IsSecure && requestUri.GetScheme() != NUri::TScheme::SchemeHTTPS) { - continue; - } - if (now >= it->ExpireTime) { - continue; - } - validCookies.push_back(it); - } - // Sort cookies - Sort(validCookies.begin(), validCookies.end(), [](const TCookieVector::const_iterator& a, const TCookieVector::const_iterator& b) { - // Cookies with longer paths are listed before cookies with shorter paths. - auto pa = a->Cookie.Path.length(); - auto pb = b->Cookie.Path.length(); - if (pa != pb) { - return pa > pb; - } - // cookies with earlier creation-times are listed before cookies with later creation-times. - if (a->CreateTime != b->CreateTime) { - return a->CreateTime < b->CreateTime; - } - return &*a < &*b; //Any order - }); - TStringStream os; - for (auto it = validCookies.begin(); it != validCookies.end(); ++it) { - if (!os.Empty()) { - os << "; "; - } - const TStoredCookie& stored = **it; - os << stored.Cookie.Name << "=" << stored.Cookie.Value; - } - return os.Str(); - } - - void TCookieStore::Clear() { - auto g(Guard(Lock_)); - Cookies_.clear(); - } - - bool TCookieStore::DomainMatch(const TStringBuf& requestDomain, const TStringBuf& cookieDomain) const { - // https://tools.ietf.org/html/rfc6265#section-5.1.3 - if (AsciiEqualsIgnoreCase(requestDomain, cookieDomain)) { - return true; - } - if (requestDomain.length() > cookieDomain.length() && - AsciiHasSuffixIgnoreCase(requestDomain, cookieDomain) && - requestDomain[requestDomain.length() - cookieDomain.length() - 1] == '.') { - return true; - } - return false; - } - - bool TCookieStore::PathMatch(const TStringBuf& requestPath, const TStringBuf& cookiePath) const { - // https://tools.ietf.org/html/rfc6265#section-5.1.4 - if (cookiePath == requestPath) { - return true; - } - if (requestPath.StartsWith(cookiePath)) { - if (!cookiePath.empty() && cookiePath.back() == '/') { - return true; - } - if (requestPath.length() > cookiePath.length() && requestPath[cookiePath.length()] == '/') { - return true; - } - } - return false; - } - - TInstant TCookieStore::GetExpireTime(const TCookie& cookie) { - // Алгоритм скопирован из blink: net/cookies/canonical_cookie.cc:CanonExpiration - // First, try the Max-Age attribute. - if (cookie.MaxAge >= 0) { - return TDuration::Seconds(cookie.MaxAge).ToDeadLine(); - } - // Try the Expires attribute. - if (cookie.Expires) { - static const TStringBuf kMonths[] = { - TStringBuf("jan"), TStringBuf("feb"), TStringBuf("mar"), - TStringBuf("apr"), TStringBuf("may"), TStringBuf("jun"), - TStringBuf("jul"), TStringBuf("aug"), TStringBuf("sep"), - TStringBuf("oct"), TStringBuf("nov"), TStringBuf("dec")}; - static const int kMonthsLen = Y_ARRAY_SIZE(kMonths); - // We want to be pretty liberal, and support most non-ascii and non-digit - // characters as a delimiter. We can't treat : as a delimiter, because it - // is the delimiter for hh:mm:ss, and we want to keep this field together. - // We make sure to include - and +, since they could prefix numbers. - // If the cookie attribute came in in quotes (ex expires="XXX"), the quotes - // will be preserved, and we will get them here. So we make sure to include - // quote characters, and also \ for anything that was internally escaped. - static const TSplitDelimiters kDelimiters("\t !\"#$%&'()*+,-./;<=>?@[\\]^_`{|}~"); - - struct tm exploded; - Zero(exploded); - - TDelimitersSplit tokenizer(cookie.Expires.data(), cookie.Expires.size(), kDelimiters); - TDelimitersSplit::TIterator tokenizerIt = tokenizer.Iterator(); - - bool found_day_of_month = false; - bool found_month = false; - bool found_time = false; - bool found_year = false; - - while (true) { - const TStringBuf token = tokenizerIt.NextTok(); - if (!token.IsInited()) { - break; - } - if (token.empty()) { - continue; - } - - bool numerical = IsAsciiDigit(token[0]); - - // String field - if (!numerical) { - if (!found_month) { - for (int i = 0; i < kMonthsLen; ++i) { - // Match prefix, so we could match January, etc - if (AsciiHasPrefixIgnoreCase(token, kMonths[i])) { - exploded.tm_mon = i; - found_month = true; - break; - } - } - } else { - // If we've gotten here, it means we've already found and parsed our - // month, and we have another string, which we would expect to be the - // the time zone name. According to the RFC and my experiments with - // how sites format their expirations, we don't have much of a reason - // to support timezones. We don't want to ever barf on user input, - // but this DCHECK should pass for well-formed data. - // DCHECK(token == "GMT"); - } - // Numeric field w/ a colon - } else if (token.Contains(':')) { - if (!found_time && - sscanf( - token.data(), "%2u:%2u:%2u", &exploded.tm_hour, - &exploded.tm_min, &exploded.tm_sec) == 3) { - found_time = true; - } else { - // We should only ever encounter one time-like thing. If we're here, - // it means we've found a second, which shouldn't happen. We keep - // the first. This check should be ok for well-formed input: - // NOTREACHED(); - } - // Numeric field - } else { - // Overflow with atoi() is unspecified, so we enforce a max length. - if (!found_day_of_month && token.size() <= 2) { - exploded.tm_mday = atoi(token.data()); - found_day_of_month = true; - } else if (!found_year && token.size() <= 5) { - exploded.tm_year = atoi(token.data()); - found_year = true; - } else { - // If we're here, it means we've either found an extra numeric field, - // or a numeric field which was too long. For well-formed input, the - // following check would be reasonable: - // NOTREACHED(); - } - } - } - - if (!found_day_of_month || !found_month || !found_time || !found_year) { - // We didn't find all of the fields we need. For well-formed input, the - // following check would be reasonable: - // NOTREACHED() << "Cookie parse expiration failed: " << time_string; - return TInstant::Max(); - } - - // Normalize the year to expand abbreviated years to the full year. - if (exploded.tm_year >= 69 && exploded.tm_year <= 99) { - exploded.tm_year += 1900; - } - if (exploded.tm_year >= 0 && exploded.tm_year <= 68) { - exploded.tm_year += 2000; - } - - // If our values are within their correct ranges, we got our time. - if (exploded.tm_mday >= 1 && exploded.tm_mday <= 31 && - exploded.tm_mon >= 0 && exploded.tm_mon <= 11 && - exploded.tm_year >= 1601 && exploded.tm_year <= 30827 && - exploded.tm_hour <= 23 && exploded.tm_min <= 59 && exploded.tm_sec <= 59) - { - exploded.tm_year -= 1900; // Adopt to tm struct - // Convert to TInstant - time_t tt = TimeGM(&exploded); - if (tt != -1) { - return TInstant::Seconds(tt); - } - } - - // One of our values was out of expected range. For well-formed input, - // the following check would be reasonable: - // NOTREACHED() << "Cookie exploded expiration failed: " << time_string; - } - // Invalid or no expiration, persistent cookie. - return TInstant::Max(); - } - -} diff --git a/library/cpp/http/client/cookies/cookiestore.h b/library/cpp/http/client/cookies/cookiestore.h deleted file mode 100644 index 1bdc19bfe76..00000000000 --- a/library/cpp/http/client/cookies/cookiestore.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include "cookie.h" - -#include <library/cpp/uri/uri.h> - -#include <util/generic/vector.h> -#include <util/system/mutex.h> - -namespace NHttp { - /** - * Cookie storage for values obtained from a server via Set-Cookie header. - * - * Later client may use GetCookieString to build a cookie for sending - * back to the server via Cookie header. - */ - class TCookieStore { - public: - TCookieStore(); - ~TCookieStore(); - - /// Removes all cookies from store. - void Clear(); - - /// Builds Cookie header from the given url. - TString GetCookieString(const NUri::TUri& requestUri) const; - - /// Parses cookie from the Set-Cookie header and stores it. - bool SetCookie(const NUri::TUri& requestUri, const TString& cookieHeader); - - private: - bool DomainMatch(const TStringBuf& requestDomain, const TStringBuf& cookieDomain) const; - bool PathMatch(const TStringBuf& requestPath, const TStringBuf& cookiePath) const; - static TInstant GetExpireTime(const TCookie& cookie); - - private: - struct TStoredCookie { - TCookie Cookie; - TInstant CreateTime; - TInstant ExpireTime; - bool IsHostOnly = true; - - /// Compares only Domain, Path and name. - bool IsEquivalent(const TStoredCookie& rhs) const; - }; - - using TCookieVector = TVector<TStoredCookie>; - - - TMutex Lock_; - TCookieVector Cookies_; - }; - -} diff --git a/library/cpp/http/client/cookies/parser.rl6 b/library/cpp/http/client/cookies/parser.rl6 deleted file mode 100644 index 700140e5822..00000000000 --- a/library/cpp/http/client/cookies/parser.rl6 +++ /dev/null @@ -1,121 +0,0 @@ -#include <library/cpp/http/client/cookies/cookie.h> - -#include <util/datetime/parser.h> - -namespace NHttp { -namespace { -%%{ -machine http_cookie_parser; - -include HttpDateTimeParser "../../../../../util/datetime/parser.rl6"; - -alphtype unsigned char; - -################# Actions ################# -action set_name { - result.Name = TString((const char*)S_, p - S_); -} - -action set_value { - valueSet = true; - result.Value = TString((const char*)S_, p - S_); -} - -action set_expires { - // TODO take care about server's date ? - result.Expires = TString((const char*)S_, p - S_); -} - -action set_max_age { - // TODO take care about server's date ? - result.MaxAge = I; -} - -action set_domain { - result.Domain = TString((const char*)S_, p - S_); - result.Domain.to_lower(); -} - -action set_path { - result.Path = TString((const char*)S_, p - S_); -} - -action set_secure { - result.IsSecure = true; - -} -action set_httponly { - result.IsHttpOnly = true; -} - -################# Basic Rules ################# -ws = [ \t]; - -separators = '(' | ')' | '<' | '>' | '@' | ',' | ';' | ':' | '\\' | - '"' | '/' | '[' | ']' | '?' | '=' | '{' | '}' | 32 | 9; - -token_octet = 32..126 - separators; -token = token_octet+; - -other_octet = 32..126 - ';'; -other = other_octet+; - -cookie_name_octet = other_octet - '='; - -############ Set-Cookie line ################# -# See https://tools.ietf.org/html/rfc6265 -cookie_name = cookie_name_octet+ > { S_ = p; } %set_name; -cookie_value = other_octet* > { S_ = p; } %set_value; -cookie_pair = cookie_name "=" cookie_value; - -expires_av = "expires="i other > { S_ = p; } %set_expires; -max_age_av = "max-age="i int %set_max_age; -domain_av = "domain="i "."? other > { S_ = p; } %set_domain; -path_av = "path="i other > { S_ = p; } %set_path; -secure_av = "secure"i %set_secure; -httponly_av = "httponly"i %set_httponly; -extension_av = other; - -cookie_av = extension_av | expires_av | max_age_av | domain_av | - path_av | secure_av | httponly_av; - -set_cookie_string = cookie_pair ( ";" ws* cookie_av )*; - -################# main ############################ -main := set_cookie_string; - -}%% - -%% write data; - -} // namespace - -/////////////////////////////////////////////////////////////////////////////// - -TCookie TCookie::Parse(const TString& data) { - TCookie result; - { - const unsigned char* S_ = nullptr; - long I = -1; - int Dc; - int cs; - - const unsigned char *p = (const unsigned char*)data.data(); - const unsigned char *pe = p + data.size(); - const unsigned char* eof = pe; - bool valueSet = false; - %% write init; - %% write exec; - if (cs == %%{ write error; }%%) { - throw yexception() << "Cookie parse error"; - } - if (!valueSet) { - throw yexception() << "Cookie value not set"; - } - } - return result; -} - -/////////////////////////////////////////////////////////////////////////////// - -} // namespace NHttp diff --git a/library/cpp/http/client/fetch/coctx.cpp b/library/cpp/http/client/fetch/coctx.cpp deleted file mode 100644 index dfbb6943a3f..00000000000 --- a/library/cpp/http/client/fetch/coctx.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "coctx.h" diff --git a/library/cpp/http/client/fetch/coctx.h b/library/cpp/http/client/fetch/coctx.h deleted file mode 100644 index bd1b61cb593..00000000000 --- a/library/cpp/http/client/fetch/coctx.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include <library/cpp/coroutine/engine/impl.h> - -#include <util/thread/singleton.h> - -namespace NAsyncDns { - class TContResolver; - class TContDnsCache; -} - -namespace NHttpFetcher { - struct TCoCtx { - TContExecutor* Executor; - NAsyncDns::TContResolver* Resolver; - NAsyncDns::TContDnsCache* DnsCache; - - TCoCtx(TContExecutor* executor, NAsyncDns::TContResolver* resolver, NAsyncDns::TContDnsCache* dnsCache = nullptr) - : Executor(executor) - , Resolver(resolver) - , DnsCache(dnsCache) - { - } - - TCont* Cont() { - return Executor->Running(); - } - }; - - inline TCoCtx*& CoCtx() { - return *FastTlsSingletonWithPriority<TCoCtx*, 0>(); - } - - class TCoCtxSetter { - public: - TCoCtxSetter(TContExecutor* executor, NAsyncDns::TContResolver* resolver, NAsyncDns::TContDnsCache* dnsCache = nullptr) - : Instance(executor, resolver, dnsCache) - { - Y_VERIFY(!CoCtx(), "coCtx already exists"); - CoCtx() = &Instance; - } - - ~TCoCtxSetter() { - CoCtx() = nullptr; - } - - private: - TCoCtx Instance; - }; -} diff --git a/library/cpp/http/client/fetch/codes.h b/library/cpp/http/client/fetch/codes.h deleted file mode 100644 index 25d09c88f84..00000000000 --- a/library/cpp/http/client/fetch/codes.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -namespace NHttpFetcher { - const int FETCH_SUCCESS_CODE = 200; - const int SERVICE_UNAVAILABLE = 503; - const int ZORA_TIMEOUT_CODE = 5000; - const int URL_FILTER_CODE = 6000; - const int WRONG_HTTP_HEADER_CODE = 6001; - const int FETCH_LARGE_FILE = 6002; - const int FETCH_CANNOT_PARSE = 6003; - const int HOSTS_QUEUE_TIMEOUT = 6004; - const int WRONG_HTTP_RESPONSE = 6005; - const int UNKNOWN_ERROR = 6006; - const int FETCHER_QUEUE_TIMEOUT = 6007; - const int FETCH_IGNORE = 6008; - const int FETCH_CANCELLED = 6009; - - inline bool IsRedirectCode(int code) { - return 301 == code || 302 == code || 303 == code || - 305 == code || 307 == code || 308 == code; - } - - inline bool IsSuccessCode(int code) { - return code >= 200 && code < 300; - } - - inline bool NoRefetch(int code) { - return code == 415 || // Unsupported media type - code == 601 || // Large file - (code >= 400 && code < 500) || - code == 1003 || // disallowed by robots.txt - code == 1006 || // not found by dns server - code == 6008; // once ignored, always ignored - } - -} diff --git a/library/cpp/http/client/fetch/cosocket.h b/library/cpp/http/client/fetch/cosocket.h deleted file mode 100644 index 8230d36bbe3..00000000000 --- a/library/cpp/http/client/fetch/cosocket.h +++ /dev/null @@ -1,97 +0,0 @@ -#pragma once - -#include "coctx.h" - -#include <library/cpp/coroutine/engine/network.h> -#include <library/cpp/http/fetch_gpl/sockhandler.h> - -#include <util/system/error.h> - -namespace NHttpFetcher { - class TCoSocketHandler { - public: - TCoSocketHandler() = default; - - ~TCoSocketHandler() { - Disconnect(); - } - - int Good() const { - return (Fd != INVALID_SOCKET); - } - - int Connect(const TAddrList& addrs, TDuration timeout) { - TCont* cont = CoCtx()->Cont(); - Timeout = timeout; - for (const auto& item : addrs) { - try { - const sockaddr* sa = item->Addr(); - TSocketHolder s(NCoro::Socket(sa->sa_family, SOCK_STREAM, 0)); - if (s.Closed()) { - continue; - } - int err = NCoro::ConnectT(cont, s, sa, item->Len(), Timeout); - if (err) { - s.Close(); - errno = err; - continue; - } - SetZeroLinger(s); - SetKeepAlive(s, true); - Fd.Swap(s); - return 0; - } catch (const TSystemError&) { - } - } - return errno ? errno : EBADF; - } - - void Disconnect() { - if (Fd.Closed()) - return; - try { - ShutDown(Fd, SHUT_RDWR); - } catch (const TSystemError&) { - } - Fd.Close(); - } - - void shutdown() { - try { - ShutDown(Fd, SHUT_WR); - } catch (TSystemError&) { - } - } - - ssize_t send(const void* message, size_t messlen) { - TCont* cont = CoCtx()->Cont(); - TContIOStatus status = NCoro::WriteT(cont, Fd, message, messlen, Timeout); - errno = status.Status(); - return status.Status() ? -1 : (ssize_t)status.Processed(); - } - - bool peek() { - TCont* cont = CoCtx()->Cont(); - if ((errno = NCoro::PollT(cont, Fd, CONT_POLL_READ, Timeout))) - return false; - char buf[1]; -#ifdef _win32_ - return (1 == ::recv(Fd, buf, 1, MSG_PEEK)); -#else - return (1 == ::recv(Fd, buf, 1, MSG_PEEK | MSG_DONTWAIT)); -#endif - } - - ssize_t read(void* message, size_t messlen) { - TCont* cont = CoCtx()->Cont(); - TContIOStatus status = NCoro::ReadT(cont, Fd, message, messlen, Timeout); - errno = status.Status(); - return status.Status() ? -1 : (ssize_t)status.Processed(); - } - - protected: - TSocketHolder Fd; - TDuration Timeout; - static THolder<TIpAddress> AddrToBind; - }; -} diff --git a/library/cpp/http/client/fetch/fetch_request.cpp b/library/cpp/http/client/fetch/fetch_request.cpp deleted file mode 100644 index 2f8453fc457..00000000000 --- a/library/cpp/http/client/fetch/fetch_request.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include "fetch_request.h" - -#include <library/cpp/deprecated/atomic/atomic.h> - -// TRequest -namespace NHttpFetcher { - const TString DEFAULT_ACCEPT_ENCODING = "gzip, deflate"; - const size_t DEFAULT_MAX_HEADER_SIZE = 100 << 10; - const size_t DEFAULT_MAX_BODY_SIZE = 1 << 29; - - TRequest::TRequest(const TString& url, TCallBack onFetch) - : Url(url) - , Deadline(TInstant::Now() + DEFAULT_REQUEST_TIMEOUT) - , Freshness(DEFAULT_REQUEST_FRESHNESS) - , Priority(40) - , IgnoreRobotsTxt(false) - , LangRegion(ELR_RU) - , OnFetch(onFetch) - , AcceptEncoding(DEFAULT_ACCEPT_ENCODING) - , OnlyHeaders(false) - , MaxHeaderSize(DEFAULT_MAX_HEADER_SIZE) - , MaxBodySize(DEFAULT_MAX_BODY_SIZE) - { - GenerateSequence(); - } - - TRequest::TRequest(const TString& url, bool ignoreRobotsTxt, TDuration timeout, TDuration freshness, TCallBack onFetch) - : Url(url) - , Deadline(Now() + timeout) - , Freshness(freshness) - , Priority(40) - , IgnoreRobotsTxt(ignoreRobotsTxt) - , LangRegion(ELR_RU) - , OnFetch(onFetch) - , AcceptEncoding(DEFAULT_ACCEPT_ENCODING) - , OnlyHeaders(false) - , MaxHeaderSize(DEFAULT_MAX_HEADER_SIZE) - , MaxBodySize(DEFAULT_MAX_BODY_SIZE) - { - GenerateSequence(); - } - - TRequest::TRequest(const TString& url, TDuration timeout, TDuration freshness, bool ignoreRobots, - size_t priority, const TMaybe<TString>& login, const TMaybe<TString>& password, - ELangRegion langRegion, TCallBack onFetch) - : Url(url) - , Deadline(Now() + timeout) - , Freshness(freshness) - , Priority(priority) - , Login(login) - , Password(password) - , IgnoreRobotsTxt(ignoreRobots) - , LangRegion(langRegion) - , OnFetch(onFetch) - , AcceptEncoding(DEFAULT_ACCEPT_ENCODING) - , OnlyHeaders(false) - , MaxHeaderSize(DEFAULT_MAX_HEADER_SIZE) - , MaxBodySize(DEFAULT_MAX_BODY_SIZE) - { - GenerateSequence(); - } - - void TRequest::GenerateSequence() { - static TAtomic nextSeq = 0; - Sequence = AtomicIncrement(nextSeq); - } - - TRequestRef TRequest::Clone() { - THolder<TRequest> request = THolder<TRequest>(new TRequest(*this)); - request->GenerateSequence(); - return request.Release(); - } - - void TRequest::Dump(IOutputStream& out) { - out << "url: " << Url << "\n"; - out << "timeout: " << (Deadline - Now()).MilliSeconds() << " ms\n"; - out << "freshness: " << Freshness.Seconds() << "\n"; - out << "priority: " << Priority << "\n"; - if (!!Login) { - out << "login: " << *Login << "\n"; - } - if (!!Password) { - out << "password: " << *Password << "\n"; - } - if (!!OAuthToken) { - out << "oauth token: " << *OAuthToken << "\n"; - } - if (IgnoreRobotsTxt) { - out << "ignore robots: " << IgnoreRobotsTxt << "\n"; - } - out << "lang reg: " << LangRegion2Str(LangRegion) << "\n"; - if (!!CustomHost) { - out << "custom host: " << *CustomHost << "\n"; - } - if (!!UserAgent) { - out << "user agent: " << *UserAgent << "\n"; - } - if (!!AcceptEncoding) { - out << "accept enc: " << *AcceptEncoding << "\n"; - } - if (OnlyHeaders) { - out << "only headers: " << OnlyHeaders << "\n"; - } - out << "max header sz: " << MaxHeaderSize << "\n"; - out << "max body sz: " << MaxBodySize << "\n"; - if (!!PostData) { - out << "post data: " << *PostData << "\n"; - } - if (!!ContentType) { - out << "content type: " << *ContentType << "\n"; - } - } - -} diff --git a/library/cpp/http/client/fetch/fetch_request.h b/library/cpp/http/client/fetch/fetch_request.h deleted file mode 100644 index 169c2940d75..00000000000 --- a/library/cpp/http/client/fetch/fetch_request.h +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once - -#include "fetch_result.h" - -#include <kernel/langregion/langregion.h> - -#include <util/datetime/base.h> -#include <util/generic/ptr.h> - -namespace NHttpFetcher { - const TDuration DEFAULT_REQUEST_TIMEOUT = TDuration::Minutes(1); - const TDuration DEFAULT_REQUEST_FRESHNESS = TDuration::Seconds(10000); - - class TRequest; - using TRequestRef = TIntrusivePtr<TRequest>; - - class TRequest: public TAtomicRefCount<TRequest> { - private: - TRequest(const TRequest&) = default; - TRequest& operator=(const TRequest&) = default; - void GenerateSequence(); - - public: - TRequest(const TString& url = "", TCallBack onFetch = TCallBack()); - TRequest(const TString& url, bool ignoreRobotsTxt, TDuration timeout, - TDuration freshness, TCallBack onFetch = TCallBack()); - TRequest(const TString& url, TDuration timeout, TDuration freshness, bool ignoreRobots, - size_t priority, const TMaybe<TString>& login = TMaybe<TString>(), - const TMaybe<TString>& password = TMaybe<TString>(), - ELangRegion langRegion = ELR_RU, TCallBack onFetch = TCallBack()); - void Dump(IOutputStream& out); - TRequestRef Clone(); - - public: - TString Url; - TMaybe<TString> UnixSocketPath; - - TInstant Deadline; // [default = 1 min] - TDuration RdWrTimeout; - TMaybe<TDuration> ConnectTimeout; - TDuration Freshness; // [default = 1000 sec] - size_t Priority; // lower is more important; range [0, 100], default 40 - - TMaybe<TString> Login; - TMaybe<TString> Password; - TMaybe<TString> OAuthToken; - bool IgnoreRobotsTxt; // [default = false] - ELangRegion LangRegion; // [default = ELR_RU] - TCallBack OnFetch; // for async requests - ui64 Sequence; // unique id - TMaybe<TString> CustomHost; // Use custom host for "Host" header - TMaybe<TString> UserAgent; // custom user agen, [default = YandexNews] - TMaybe<TString> AcceptEncoding; // custom accept encoding, [default = "gzip, deflate"] - bool OnlyHeaders; // [default = false], if true - no content will be fetched (HEAD request) - size_t MaxHeaderSize; // returns 1002 error if exceeded - size_t MaxBodySize; // returns 1002 error if exceeded - TNeedDataCallback NeedDataCallback; // set this callback if you need to check data while fetching - // true - coninue fetching, false - stop - TMaybe<TString> Method; // for http exotics like "PUT ", "PATCH ", "DELETE ". if doesn't exist, GET or POST will br used - TMaybe<TString> PostData; // if exists - send post request - TMaybe<TString> ContentType; // custom content-type for post requests - // [default = "application/x-www-form-urlencoded"] - TVector<TString> ExtraHeaders; // needed for some servers (to auth, for ex.); don't forget to add "\r\n"! - }; -} diff --git a/library/cpp/http/client/fetch/fetch_result.cpp b/library/cpp/http/client/fetch/fetch_result.cpp deleted file mode 100644 index 0ba1b1e6bec..00000000000 --- a/library/cpp/http/client/fetch/fetch_result.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "codes.h" -#include "fetch_result.h" - -#include <library/cpp/charset/recyr.hh> - -namespace NHttpFetcher { - TResult::TResult(const TString& url, int code) - : RequestUrl(url) - , ResolvedUrl(url) - , Code(code) - , ConnectionReused(false) - { - } - - TString TResult::DecodeData(bool* decoded) const { - if (!!Encoding && *Encoding != CODES_UTF8) { - if (decoded) { - *decoded = true; - } - return Recode(*Encoding, CODES_UTF8, Data); - } - if (decoded) { - *decoded = false; - } - return Data; - } - - bool TResult::Success() const { - return Code == FETCH_SUCCESS_CODE; - } - -} diff --git a/library/cpp/http/client/fetch/fetch_result.h b/library/cpp/http/client/fetch/fetch_result.h deleted file mode 100644 index 24fe49e1f65..00000000000 --- a/library/cpp/http/client/fetch/fetch_result.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include <library/cpp/charset/doccodes.h> -#include <library/cpp/http/io/headers.h> -#include <library/cpp/langs/langs.h> - -#include <util/generic/maybe.h> -#include <util/generic/ptr.h> -#include <util/generic/string.h> -#include <util/generic/vector.h> - -#include <functional> - -namespace NHttpFetcher { - // Result - using TResultRef = TIntrusivePtr<struct TResult>; - struct TResult: public TAtomicRefCount<TResult> { - TResult(const TString& url, int code = 0); - TString DecodeData(bool* decoded = nullptr) const; - bool Success() const; - - public: - TString RequestUrl; - TString ResolvedUrl; - TString Location; - int Code; - bool ConnectionReused; - TString StatusStr; - TString MimeType; - THttpHeaders Headers; - TString Data; - TMaybe<ECharset> Encoding; - TMaybe<ELanguage> Language; - TVector<TResultRef> Redirects; - TString HttpVersion; - }; - - using TCallBack = std::function<void(TResultRef)>; - using TNeedDataCallback = std::function<bool(const TString&)>; -} diff --git a/library/cpp/http/client/fetch/fetch_single.cpp b/library/cpp/http/client/fetch/fetch_single.cpp deleted file mode 100644 index 27d0888b801..00000000000 --- a/library/cpp/http/client/fetch/fetch_single.cpp +++ /dev/null @@ -1,205 +0,0 @@ -#include "codes.h" -#include "fetch_single.h" -#include "parse.h" - -#include <library/cpp/string_utils/base64/base64.h> - -#include <util/string/ascii.h> -#include <util/string/cast.h> -#include <library/cpp/string_utils/url/url.h> - -namespace NHttpFetcher { - static sockaddr_in6 IPv6Loopback() { - sockaddr_in6 sock = {}; - sock.sin6_family = AF_INET6; - sock.sin6_addr = IN6ADDR_LOOPBACK_INIT; - return sock; - } - - class THeaders { - public: - inline void Build(const TRequestRef& request) { - if (!!request->Password || !!request->Login) { - TString pass; - TString login; - TString raw; - TString encoded; - - if (!!request->Password) { - pass = *request->Password; - } - if (!!request->Login) { - login = *request->Login; - } - raw = TString::Join(login, ":", pass); - Base64Encode(raw, encoded); - BasicAuth_ = TString::Join("Authorization: Basic ", encoded, "\r\n"); - Headers_.push_back(BasicAuth_.c_str()); - } - - if (request->ExtraHeaders) { - Headers_.reserve(Headers_.size() + request->ExtraHeaders.size()); - for (const TString& header : request->ExtraHeaders) { - if (AsciiHasSuffixIgnoreCase(header, "\r\n")) { - Headers_.push_back(header.c_str()); - } else { - Fixed_.push_back(header + "\r\n"); - Headers_.push_back(Fixed_.back().c_str()); - } - } - } - - if (!!request->OAuthToken) { - OAuth_ = TString::Join("Authorization: OAuth ", *request->OAuthToken, "\r\n"); - Headers_.push_back(OAuth_.c_str()); - } - - if (!!request->AcceptEncoding) { - AcceptEncoding_ = TString::Join("Accept-Encoding: ", *request->AcceptEncoding, "\r\n"); - Headers_.push_back(AcceptEncoding_.c_str()); - } - - ContentType_ = "application/x-www-form-urlencoded"; - if (!!request->PostData) { - if (!!request->ContentType) { - ContentType_ = *request->ContentType; - } - ContentLength_ = TString::Join("Content-Length: ", ToString(request->PostData->size()), "\r\n"); - ContentType_ = TString::Join("Content-Type: ", ContentType_, "\r\n"); - Headers_.push_back(ContentLength_.c_str()); - Headers_.push_back(ContentType_.c_str()); - } - - Headers_.push_back((const char*)nullptr); - } - - inline const char* const* Data() { - return Headers_.data(); - } - - private: - TVector<const char*> Headers_; - TVector<TString> Fixed_; - TString BasicAuth_; - TString OAuth_; - TString AcceptEncoding_; - TString ContentLength_; - TString ContentType_; - }; - - TResultRef FetchSingleImpl(TRequestRef request, TSocketPool* pool) { - Y_ASSERT(!!request->Url && "no url passed in fetch request"); - TResultRef result(new TResult(request->Url)); - try { - TSimpleFetcherFetcher fetcher; - THttpHeader header; - - THttpURL::EKind kind = THttpURL::SchemeHTTP; - ui16 port = 80; - TString host; - ParseUrl(request->Url, kind, host, port); - - TString path = ToString(GetPathAndQuery(request->Url)); - - bool defaultPort = (kind == THttpURL::SchemeHTTP && port == 80) || - (kind == THttpURL::SchemeHTTPS && port == 443); - - if (request->UnixSocketPath && !request->UnixSocketPath->empty()) { - TAddrList addrs; - addrs.emplace_back(new NAddr::TUnixSocketAddr{*request->UnixSocketPath}); - fetcher.SetHost(host.data(), port, addrs, kind); - } else if (host == "127.0.0.1") { - // todo: correctly handle /etc/hosts records && ip-addresses - - // bypass normal DNS resolving for localhost - TAddrList addrs({new NAddr::TIPv4Addr(TIpAddress(0x0100007F, port))}); - fetcher.SetHost(host.data(), port, addrs, kind); - } else if (host == "localhost") { - sockaddr_in6 ipv6Addr = IPv6Loopback(); - ipv6Addr.sin6_port = HostToInet(port); - - TAddrList addrs({new NAddr::TIPv6Addr(ipv6Addr), new NAddr::TIPv4Addr(TIpAddress(0x0100007F, port))}); - fetcher.SetHost(host.data(), port, addrs, kind); - } else { - Y_ASSERT(!!host && "no host detected in url passed"); - fetcher.SetHost(host.data(), port, kind); - } - header.Init(); - - THeaders headers; - headers.Build(request); - - TString hostHeader = (!!request->CustomHost ? *request->CustomHost : host) + - (defaultPort ? "" : ":" + ToString(port)); - fetcher.SetHostHeader(hostHeader.data()); - - if (!!request->UserAgent) { - fetcher.SetIdentification((*request->UserAgent).data(), nullptr); - } else { - fetcher.SetIdentification("Mozilla/5.0 (compatible; YandexNews/3.0; +http://yandex.com/bots)", nullptr); - } - - if (!!request->Method) { - fetcher.SetMethod(request->Method->data(), request->Method->size()); - } - - if (!!request->PostData) { - fetcher.SetPostData(request->PostData->data(), request->PostData->size()); - } - - fetcher.SetMaxBodySize(request->MaxBodySize); - fetcher.SetMaxHeaderSize(request->MaxHeaderSize); - - if (request->ConnectTimeout) { - fetcher.SetConnectTimeout(*request->ConnectTimeout); - } - - { - const TDuration rest = request->Deadline - Now(); - fetcher.SetTimeout(request->RdWrTimeout != TDuration::Zero() - ? ::Min(request->RdWrTimeout, rest) - : rest); - } - fetcher.SetNeedDataCallback(request->NeedDataCallback); - bool persistent = !request->OnlyHeaders; - void* handle = nullptr; - - if (pool) { - while (auto socket = pool->GetSocket(host, port)) { - if (socket->Good()) { - handle = socket.Get(); - - fetcher.SetSocket(socket.Release()); - fetcher.SetPersistent(true); - break; - } - } - } - - int fetchResult = fetcher.Fetch(&header, path.data(), headers.Data(), persistent, request->OnlyHeaders); - - if (!fetcher.Data.empty()) { - TStringInput httpIn(fetcher.Data.Str()); - ParseHttpResponse(*result, httpIn, kind, host, port); - } - - if (fetchResult < 0 || header.error != 0) { - result->Code = header.error; - } - - if (pool && persistent && !header.error && !header.connection_closed) { - THolder<TSocketPool::TSocketHandle> socket(fetcher.PickOutSocket()); - - if (!!socket && socket->Good()) { - if (handle == socket.Get()) { - result->ConnectionReused = true; - } - pool->ReturnSocket(host, port, std::move(socket)); - } - } - } catch (...) { - result->Code = UNKNOWN_ERROR; - } - return result; - } -} diff --git a/library/cpp/http/client/fetch/fetch_single.h b/library/cpp/http/client/fetch/fetch_single.h deleted file mode 100644 index 890c925cc9d..00000000000 --- a/library/cpp/http/client/fetch/fetch_single.h +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once - -#include "cosocket.h" -#include "fetch_request.h" -#include "fetch_result.h" -#include "pool.h" - -#include <library/cpp/coroutine/dns/helpers.h> -#include <library/cpp/http/client/ssl/sslsock.h> -#include <library/cpp/http/fetch_gpl/httpagent.h> -#include <library/cpp/http/fetch/httpfetcher.h> -#include <library/cpp/http/fetch/httpheader.h> - -#include <util/generic/algorithm.h> - -namespace NHttpFetcher { - class TCoIpResolver { - public: - TAddrList Resolve(const char* host, TIpPort port) const { - NAsyncDns::TAddrs addrs; - try { - NAsyncDns::ResolveAddr(*CoCtx()->Resolver, host, port, addrs, CoCtx()->DnsCache); - } catch (...) { - return TAddrList(); - } - - // prefer IPv6 - SortBy(addrs.begin(), addrs.end(), [](const auto& addr) { - return addr->Addr()->sa_family == AF_INET6 ? 0 : 1; - }); - - return TAddrList(addrs.begin(), addrs.end()); - } - }; - - struct TStringSaver { - int Write(const void* buf, size_t len) { - Data.Write(buf, len); - return 0; - } - TStringStream Data; - }; - - struct TSimpleCheck { - inline bool Check(THttpHeader*) { - return false; - } - void CheckDocPart(void* data, size_t size, THttpHeader*) { - if (!!NeedDataCallback) { - CheckData += TString(static_cast<const char*>(data), size); - if (!NeedDataCallback(CheckData)) { - BodyMax = 0; - } - } - } - void CheckEndDoc(THttpHeader*) { - } - size_t GetMaxHeaderSize() { - return HeaderMax; - } - size_t GetMaxBodySize(THttpHeader*) { - return BodyMax; - } - void SetMaxHeaderSize(size_t headerMax) { - HeaderMax = headerMax; - } - void SetMaxBodySize(size_t bodyMax) { - BodyMax = bodyMax; - } - void SetNeedDataCallback(const TNeedDataCallback& callback) { - NeedDataCallback = callback; - } - - private: - size_t HeaderMax; - size_t BodyMax; - TNeedDataCallback NeedDataCallback; - TString CheckData; - }; - - using TSimpleHttpAgent = THttpsAgent<TCoSocketHandler, TCoIpResolver, - TSslSocketBase::TFakeLogger, TNoTimer, - NHttpFetcher::TSslSocketHandler>; - using TSimpleFetcherFetcher = THttpFetcher<TFakeAlloc<>, TSimpleCheck, TStringSaver, TSimpleHttpAgent>; - - //! Private method of fetcher library. Don't use it in your code. - TResultRef FetchSingleImpl(TRequestRef request, TSocketPool* pool = nullptr); -} diff --git a/library/cpp/http/client/fetch/parse.cpp b/library/cpp/http/client/fetch/parse.cpp deleted file mode 100644 index 62d610102b4..00000000000 --- a/library/cpp/http/client/fetch/parse.cpp +++ /dev/null @@ -1,160 +0,0 @@ -#include "codes.h" -#include "parse.h" - -#include <library/cpp/charset/codepage.h> -#include <library/cpp/http/io/stream.h> -#include <library/cpp/mime/types/mime.h> -#include <library/cpp/uri/uri.h> - -#include <library/cpp/string_utils/url/url.h> -#include <util/string/vector.h> - -namespace NHttpFetcher { - namespace { - static TString MimeTypeFromUrl(const NUri::TUri& httpUrl) { - TStringBuf path = httpUrl.GetField(NUri::TField::FieldPath); - size_t pos = path.find_last_of('.'); - if (pos == TStringBuf::npos) { - return ""; - } - // TODO (stanly) replace TString with TStringBuf - TString ext = TString(path.substr(pos + 1)); - TString mime = mimetypeByExt(path.data()); - if (mime) { - return mime; - } - - if (ext == "jpg" || ext == "jpeg" || ext == "png" || ext == "gif") { - return "image/" + ext; - } else if (ext == "m4v" || ext == "mp4" || ext == "flv" || ext == "mpeg") { - return "video/" + ext; - } else if (ext == "mp3" || ext == "wav" || ext == "ogg") { - return "audio/" + ext; - } else if (ext == "zip" || ext == "doc" || ext == "docx" || ext == "xls" || ext == "xlsx" || ext == "pdf" || ext == "ppt") { - return "application/" + ext; - } else if (ext == "rar" || ext == "7z") { - return "application/x-" + ext + "-compressed"; - } else if (ext == "exe") { - return "application/octet-stream"; - } - - return ""; - } - - static TString MimeTypeFromUrl(const TString& url) { - static const ui64 flags = NUri::TFeature::FeaturesRobot | NUri::TFeature::FeatureToLower; - - NUri::TUri httpUrl; - if (httpUrl.Parse(url, flags) != NUri::TUri::ParsedOK) { - return ""; - } - - return MimeTypeFromUrl(httpUrl); - } - - // Extracts encoding & content-type from headers - static void ProcessHeaders(TResult& result) { - for (THttpHeaders::TConstIterator it = result.Headers.Begin(); it != result.Headers.End(); it++) { - TString name = it->Name(); - name.to_lower(); - if (name == "content-type") { - TString value = it->Value(); - value.to_lower(); - size_t delimPos = value.find(';'); - if (delimPos == TString::npos) { - delimPos = value.size(); - } - result.MimeType = value.substr(0, delimPos); - size_t charsetPos = value.find("charset="); - if (charsetPos == TString::npos) { - continue; - } - delimPos = value.find(';', charsetPos + 1); - TString charsetStr = value.substr(charsetPos + 8, - delimPos == TString::npos ? delimPos : delimPos - charsetPos - 8); - ECharset charset = CharsetByName(charsetStr.data()); - if (charset != CODES_UNSUPPORTED && charset != CODES_UNKNOWN) { - result.Encoding = charset; - } - } - } - - if (result.MimeType.empty() || result.MimeType == "application/octet-stream") { - const TString& detectedMimeType = MimeTypeFromUrl(result.ResolvedUrl); - if (detectedMimeType) { - result.MimeType = detectedMimeType; - } - } - } - - } - - void ParseHttpResponse(TResult& result, IInputStream& is, THttpURL::EKind kind, - TStringBuf host, ui16 port) { - THttpInput httpIn(&is); - TString firstLine = httpIn.FirstLine(); - TVector<TString> params = SplitString(firstLine, " "); - try { - if (params.size() < 2) { - ythrow yexception() << "failed to parse first line"; - } - result.HttpVersion = params[0]; - result.Code = FromString(params[1]); - } catch (const std::exception&) { - result.Code = WRONG_HTTP_HEADER_CODE; - } - for (auto it = httpIn.Headers().Begin(); it < httpIn.Headers().End(); ++it) { - const THttpInputHeader& header = *it; - TString name = header.Name(); - name.to_lower(); - if (name == "location" && IsRedirectCode(result.Code)) { - // TODO (stanly) use correct routine to parse location - result.Location = header.Value(); - result.ResolvedUrl = header.Value(); - if (result.ResolvedUrl.StartsWith('/')) { - const bool defaultPort = - (kind == THttpURL::SchemeHTTP && port == 80) || - (kind == THttpURL::SchemeHTTPS && port == 443); - - result.ResolvedUrl = TString(NUri::SchemeKindToString(kind)) + "://" + host + - (defaultPort ? "" : ":" + ToString(port)) + - result.ResolvedUrl; - } - } - } - try { - result.Headers = httpIn.Headers(); - result.Data = httpIn.ReadAll(); - ProcessHeaders(result); - // TODO (stanly) try to detect mime-type by content - } catch (const yexception& /* exception */) { - result.Code = WRONG_HTTP_RESPONSE; - } - } - - void ParseHttpResponse(TResult& result, IInputStream& stream, const TString& url) { - THttpURL::EKind kind; - TString host; - ui16 port; - ParseUrl(url, kind, host, port); - ParseHttpResponse(result, stream, kind, host, port); - } - - void ParseUrl(const TStringBuf url, THttpURL::EKind& kind, TString& host, ui16& port) { - using namespace NUri; - - static const int URI_PARSE_FLAGS = - TFeature::FeatureSchemeKnown | TFeature::FeatureConvertHostIDN | TFeature::FeatureEncodeExtendedDelim | TFeature::FeatureEncodePercent; - - TUri uri; - // Cut out url's path to speedup processing. - if (uri.Parse(GetSchemeHostAndPort(url, false, false), URI_PARSE_FLAGS) != TUri::ParsedOK) { - ythrow yexception() << "can't parse url: " << url; - } - - kind = uri.GetScheme(); - host = uri.GetField(TField::FieldHost); - port = uri.GetPort(); - } - -} diff --git a/library/cpp/http/client/fetch/parse.h b/library/cpp/http/client/fetch/parse.h deleted file mode 100644 index dacfa9bf845..00000000000 --- a/library/cpp/http/client/fetch/parse.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "fetch_result.h" -#include <library/cpp/uri/http_url.h> - -namespace NHttpFetcher { - void ParseUrl(const TStringBuf url, THttpURL::EKind& kind, TString& host, ui16& port); - - void ParseHttpResponse(TResult& result, IInputStream& stream, THttpURL::EKind kind, - TStringBuf host, ui16 port); - - void ParseHttpResponse(TResult& result, IInputStream& stream, const TString& url); - -} diff --git a/library/cpp/http/client/fetch/pool.cpp b/library/cpp/http/client/fetch/pool.cpp deleted file mode 100644 index f0a142eced7..00000000000 --- a/library/cpp/http/client/fetch/pool.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "pool.h" - -namespace NHttpFetcher { - void TSocketPool::Clear() { - TSocketMap sockets; - - { - auto g(Guard(Lock_)); - Sockets_.swap(sockets); - } - } - - void TSocketPool::Drain(const TDuration timeout) { - const TInstant now = TInstant::Now(); - TVector<THolder<TSocketHandle>> sockets; - - { - auto g(Guard(Lock_)); - for (auto si = Sockets_.begin(); si != Sockets_.end();) { - if (si->second.Touched + timeout < now) { - sockets.push_back(std::move(si->second.Socket)); - Sockets_.erase(si++); - } else { - ++si; - } - } - } - } - - THolder<TSocketPool::TSocketHandle> TSocketPool::GetSocket(const TString& host, const TIpPort port) { - THolder<TSocketPool::TSocketHandle> socket; - - { - auto g(Guard(Lock_)); - auto si = Sockets_.find(std::make_pair(host, port)); - if (si != Sockets_.end()) { - socket = std::move(si->second.Socket); - Sockets_.erase(si); - } - } - - return socket; - } - - void TSocketPool::ReturnSocket(const TString& host, const TIpPort port, THolder<TSocketHandle> socket) { - TConnection conn; - - conn.Socket = std::move(socket); - conn.Touched = TInstant::Now(); - - { - auto g(Guard(Lock_)); - Sockets_.emplace(std::make_pair(host, port), std::move(conn)); - } - } - -} diff --git a/library/cpp/http/client/fetch/pool.h b/library/cpp/http/client/fetch/pool.h deleted file mode 100644 index 73c3eda0c6e..00000000000 --- a/library/cpp/http/client/fetch/pool.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include "cosocket.h" - -#include <library/cpp/http/client/ssl/sslsock.h> - -#include <util/generic/hash_multi_map.h> -#include <util/generic/ptr.h> -#include <util/system/mutex.h> - -namespace NHttpFetcher { - class TSocketPool { - public: - using TSocketHandle = TSslSocketHandler<TCoSocketHandler, TSslSocketBase::TFakeLogger>; - - public: - /// Closes all sockets. - void Clear(); - - /// Closes all sockets that have been opened too long. - void Drain(const TDuration timeout); - - /// Returns socket for the given endpoint if available. - THolder<TSocketHandle> GetSocket(const TString& host, const TIpPort port); - - /// Puts socket to the pool. - void ReturnSocket(const TString& host, const TIpPort port, THolder<TSocketHandle> socket); - - private: - struct TConnection { - THolder<TSocketHandle> Socket; - TInstant Touched; - }; - - using TSocketMap = THashMultiMap<std::pair<TString, TIpPort>, TConnection>; - - TMutex Lock_; - TSocketMap Sockets_; - }; - -} diff --git a/library/cpp/http/client/query.cpp b/library/cpp/http/client/query.cpp deleted file mode 100644 index 36a946074b1..00000000000 --- a/library/cpp/http/client/query.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include "query.h" -#include "request.h" - -namespace NHttp { - TFetchQuery::TFetchQuery(const TString& url, - const TFetchOptions& options) - : Url_(url) - , Options_(options) - { - } - - TFetchQuery::TFetchQuery(const TString& url, - const TVector<TString>& headers, - const TFetchOptions& options) - : Url_(url) - , Headers_(headers) - , Options_(options) - { - } - - TFetchQuery::~TFetchQuery() = default; - - TString TFetchQuery::GetUrl() const { - return Url_; - } - - TFetchQuery& TFetchQuery::OnFail(TOnFail cb) { - OnFailCb_ = cb; - return *this; - } - - TFetchQuery& TFetchQuery::OnRedirect(TOnRedirect cb) { - OnRedirectCb_ = cb; - return *this; - } - - TFetchQuery& TFetchQuery::OnPartialRead(NHttpFetcher::TNeedDataCallback cb) { - OnPartialReadCb_ = cb; - return *this; - } - - TFetchRequestRef TFetchQuery::ConstructRequest() const { - TFetchRequestRef request = new TFetchRequest(Url_, Headers_, Options_); - if (OnFailCb_) { - request->SetOnFail(*OnFailCb_); - } - - if (OnRedirectCb_) { - request->SetOnRedirect(*OnRedirectCb_); - } - - if (OnPartialReadCb_) { - request->SetOnPartialRead(*OnPartialReadCb_); - } - - return request; - } - - TFetchState::TFetchState() { - } - - TFetchState::TFetchState(const TFetchRequestRef& req) - : Request_(req) - { - } - - void TFetchState::Cancel() const { - if (Request_) { - Request_->Cancel(); - } - } - - NHttpFetcher::TResultRef TFetchState::Get() const { - if (Request_) { - WaitI(); - return Request_->MakeResult(); - } - return NHttpFetcher::TResultRef(); - } - - void TFetchState::WaitI() const { - WaitT(TDuration::Max()); - } - - bool TFetchState::WaitT(TDuration timeout) const { - if (Request_) { - return Request_->WaitT(timeout); - } - return false; - } - -} diff --git a/library/cpp/http/client/query.h b/library/cpp/http/client/query.h deleted file mode 100644 index e3dbc3b7be4..00000000000 --- a/library/cpp/http/client/query.h +++ /dev/null @@ -1,162 +0,0 @@ -#pragma once - -#include <library/cpp/http/client/fetch/fetch_result.h> - -#include <util/datetime/base.h> -#include <util/generic/maybe.h> -#include <util/generic/string.h> - -#include <functional> - -namespace NHttp { - /** - * Various options for fetching a document. - */ - struct TFetchOptions { -#define DECLARE_FIELD(name, type, default) \ - type name{default}; \ - inline TFetchOptions& Set##name(const type& value) { \ - name = value; \ - return *this; \ - } - - /// Set a timeout for connection establishment - DECLARE_FIELD(ConnectTimeout, TMaybe<TDuration>, Nothing()); - - /// Total request timeout for each attempt - DECLARE_FIELD(Timeout, TDuration, TDuration::Minutes(1)); - - /// Count of additional attempts before return error code. - DECLARE_FIELD(RetryCount, ui32, 0); - - /// Sleep delay before next retry - DECLARE_FIELD(RetryDelay, TDuration, TDuration::Seconds(5)); - - /// Parse cookie from server's response and attach its to further - /// requests in case of redirects. - DECLARE_FIELD(UseCookie, bool, true); - - /// Finite numbers of following redirects to prevent hang on infinitiy - /// redirect sequence. - DECLARE_FIELD(RedirectDepth, ui32, 15); - - /// If true - no content will be fetched (HEAD request). - DECLARE_FIELD(OnlyHeaders, bool, false); - - /// Use custom host for "Host" header. - DECLARE_FIELD(CustomHost, TMaybe<TString>, Nothing()); - - /// Login for basic HTTP authorization. - DECLARE_FIELD(Login, TMaybe<TString>, Nothing()); - - /// Password for basic HTTP authorization. - DECLARE_FIELD(Password, TMaybe<TString>, Nothing()); - - /// OAuth token. - DECLARE_FIELD(OAuthToken, TMaybe<TString>, Nothing()); - - /// For http exotics like "PUT ", "PATCH ", "DELETE ". If doesn't exist, - /// GET or POST will be used. - DECLARE_FIELD(Method, TMaybe<TString>, Nothing()); - - /// If exists - send POST request. - DECLARE_FIELD(PostData, TMaybe<TString>, Nothing()); - - /// Custom content-type for POST requests. - DECLARE_FIELD(ContentType, TMaybe<TString>, Nothing()); - - /// Custom value for "UserAgent" header. - DECLARE_FIELD(UserAgent, TString, "Python-urllib/2.6"); - - /// Always establish new connection to the target host. - DECLARE_FIELD(ForceReconnect, bool, false); - - /// Set max header size if needed - DECLARE_FIELD(MaxHeaderSize, TMaybe<size_t>, Nothing()); - - /// Set max body size if needed - DECLARE_FIELD(MaxBodySize, TMaybe<size_t>, Nothing()); - - /// If set, unix domain socket will be used as a backend - DECLARE_FIELD(UnixSocketPath, TMaybe<TString>, Nothing()); - -#undef DECLARE_FIELD - }; - - using TFetchRequestRef = TIntrusivePtr<class TFetchRequest>; - - /// If handler will return true then try again else stop fetching. - using TOnFail = std::function<bool(const NHttpFetcher::TResultRef& reply)>; - - /// If handler will return true then follow redirect else stop fetching. - using TOnRedirect = std::function<bool(const TString& from, const TString& location)>; - - class TFetchQuery { - public: - TFetchQuery() = default; - TFetchQuery(const TString& url, - const TFetchOptions& options = TFetchOptions()); - TFetchQuery(const TString& url, - const TVector<TString>& headers, - const TFetchOptions& options = TFetchOptions()); - ~TFetchQuery(); - - /// Returns original request's url. - TString GetUrl() const; - - /// Set handler for fail's handling. - TFetchQuery& OnFail(TOnFail cb); - - /// Set handler for redirect's handling. - TFetchQuery& OnRedirect(TOnRedirect cb); - - /// Set handler which will be called periodically while reading data from peer - /// with ALL the data accumulated so far. One is able to cancel further data exchange - /// by returning false from the callback. - TFetchQuery& OnPartialRead(NHttpFetcher::TNeedDataCallback cb); - - TFetchRequestRef ConstructRequest() const; - - private: - friend class TFetchRequest; - - TString Url_; - TVector<TString> Headers_; - TFetchOptions Options_; - TMaybe<TOnFail> OnFailCb_; - TMaybe<TOnRedirect> OnRedirectCb_; - TMaybe<NHttpFetcher::TNeedDataCallback> OnPartialReadCb_; - }; - - class TFetchState { - public: - TFetchState(); - TFetchState(const TFetchRequestRef& req); - TFetchState(const TFetchState&) = default; - TFetchState(TFetchState&&) = default; - - ~TFetchState() = default; - - TFetchState& operator=(TFetchState&&) = default; - TFetchState& operator=(const TFetchState&) = default; - - /// Cancel the request. - void Cancel() const; - - /// Wait for completion of the request and return result. - NHttpFetcher::TResultRef Get() const; - - /// Waits for completion of the request. - void WaitI() const; - - /// Waits for completion of the request no more than given timeout. - /// - /// \return true if fetching is finished. - /// \return false if timed out. - bool WaitT(TDuration timeout) const; - - private: - TFetchRequestRef Request_; - }; - -} diff --git a/library/cpp/http/client/request.cpp b/library/cpp/http/client/request.cpp deleted file mode 100644 index 08cf73da7b6..00000000000 --- a/library/cpp/http/client/request.cpp +++ /dev/null @@ -1,249 +0,0 @@ -#include "request.h" - -#include <library/cpp/http/client/fetch/codes.h> -#include <library/cpp/uri/location.h> - -#include <util/string/ascii.h> - -namespace NHttp { - static const ui64 URI_PARSE_FLAGS = - (NUri::TFeature::FeaturesRecommended | NUri::TFeature::FeatureConvertHostIDN | NUri::TFeature::FeatureEncodeExtendedDelim | NUri::TFeature::FeatureEncodePercent) & ~NUri::TFeature::FeatureHashBangToEscapedFragment; - - /// Generates sequence of unique identifiers of requests. - static TAtomic RequestCounter = 0; - - TFetchRequest::TRedirects::TRedirects(bool parseCookie) { - if (parseCookie) { - CookieStore.Reset(new NHttp::TCookieStore); - } - } - - size_t TFetchRequest::TRedirects::Level() const { - return this->size(); - } - - void TFetchRequest::TRedirects::ParseCookies(const TString& url, - const THttpHeaders& headers) { - if (CookieStore) { - NUri::TUri uri; - if (uri.Parse(url, URI_PARSE_FLAGS) != NUri::TUri::ParsedOK) { - return; - } - if (!uri.IsValidGlobal()) { - return; - } - - for (THttpHeaders::TConstIterator it = headers.Begin(); it != headers.End(); it++) { - if (AsciiEqualsIgnoreCase(it->Name(), TStringBuf("Set-Cookie"))) { - CookieStore->SetCookie(uri, it->Value()); - } - } - } - } - - TFetchRequest::TFetchRequest(const TString& url, const TFetchOptions& options) - : Url_(url) - , Options_(options) - , Id_(AtomicIncrement(RequestCounter)) - , RetryAttempts_(options.RetryCount) - , RetryDelay_(options.RetryDelay) - , Cancel_(false) - , CurrentUrl_(url) - { - } - - TFetchRequest::TFetchRequest(const TString& url, TVector<TString> headers, const TFetchOptions& options) - : TFetchRequest(url, options) - { - Headers_ = std::move(headers); - } - - void TFetchRequest::Cancel() { - AtomicSet(Cancel_, 1); - } - - NHttpFetcher::TRequestRef TFetchRequest::GetRequestImpl() const { - NHttpFetcher::TRequestRef req(new NHttpFetcher::TRequest(CurrentUrl_)); - - req->UnixSocketPath = Options_.UnixSocketPath; - req->Login = Options_.Login; - req->Password = Options_.Password; - req->OAuthToken = Options_.OAuthToken; - req->OnlyHeaders = Options_.OnlyHeaders; - req->CustomHost = Options_.CustomHost; - req->Method = Options_.Method; - req->OAuthToken = Options_.OAuthToken; - req->ContentType = Options_.ContentType; - req->PostData = Options_.PostData; - req->UserAgent = Options_.UserAgent; - req->ExtraHeaders.assign(Headers_.begin(), Headers_.end()); - req->NeedDataCallback = OnPartialRead_; - req->Deadline = TInstant::Now() + Options_.Timeout; - - if (Options_.ConnectTimeout) { - req->ConnectTimeout = Options_.ConnectTimeout; - } - - if (Options_.MaxHeaderSize) { - req->MaxHeaderSize = Options_.MaxHeaderSize.GetRef(); - } - if (Options_.MaxBodySize) { - req->MaxBodySize = Options_.MaxBodySize.GetRef(); - } - - if (Redirects_ && Redirects_->CookieStore) { - NUri::TUri uri; - if (uri.Parse(CurrentUrl_, URI_PARSE_FLAGS) == NUri::TUri::ParsedOK) { - if (TString cookies = Redirects_->CookieStore->GetCookieString(uri)) { - req->ExtraHeaders.push_back("Cookie: " + cookies + "\r\n"); - } - } - } - - return req; - } - - bool TFetchRequest::IsValid() const { - auto g(Guard(Lock_)); - return IsValidNoLock(); - } - - bool TFetchRequest::IsCancelled() const { - return AtomicGet(Cancel_); - } - - bool TFetchRequest::GetForceReconnect() const { - return Options_.ForceReconnect; - } - - NHttpFetcher::TResultRef TFetchRequest::MakeResult() const { - if (Exception_) { - std::rethrow_exception(Exception_); - } - - return Result_; - } - - void TFetchRequest::SetException(std::exception_ptr ptr) { - Exception_ = ptr; - } - - void TFetchRequest::SetCallback(NHttpFetcher::TCallBack cb) { - Cb_ = cb; - } - - void TFetchRequest::SetOnFail(TOnFail cb) { - OnFail_ = cb; - } - - void TFetchRequest::SetOnRedirect(TOnRedirect cb) { - OnRedirect_ = cb; - } - - void TFetchRequest::SetOnPartialRead(NHttpFetcher::TNeedDataCallback cb) { - OnPartialRead_ = cb; - } - - bool TFetchRequest::WaitT(TDuration timeout) { - TCondVar c; - - { - auto g(Guard(Lock_)); - - if (IsValidNoLock()) { - THolder<TWaitState> state(new TWaitState(&c)); - Awaitings_.PushBack(state.Get()); - if (!c.WaitT(Lock_, timeout)) { - AtomicSet(Cancel_, 1); - // Удаляем элемент из очереди ожидания в случае, если - // истёк установленный период времени. - state->Unlink(); - return false; - } - } - } - - return true; - } - - bool TFetchRequest::IsValidNoLock() const { - return !Result_ && !Exception_ && !AtomicGet(Cancel_); - } - - void TFetchRequest::Reply(NHttpFetcher::TResultRef result) { - NHttpFetcher::TCallBack cb; - - { - auto g(Guard(Lock_)); - - cb.swap(Cb_); - Result_.Swap(result); - - if (Redirects_) { - Result_->Redirects.assign(Redirects_->begin(), Redirects_->end()); - } - } - - if (cb) { - try { - cb(Result_); - } catch (...) { - SetException(std::current_exception()); - } - } - - { - auto g(Guard(Lock_)); - while (!Awaitings_.Empty()) { - Awaitings_.PopFront()->Signal(); - } - } - } - - TDuration TFetchRequest::OnResponse(NHttpFetcher::TResultRef result) { - if (AtomicGet(Cancel_)) { - goto finish; - } - - if (NHttpFetcher::IsRedirectCode(result->Code)) { - auto location = NUri::ResolveRedirectLocation(CurrentUrl_, result->Location); - - if (!Redirects_) { - Redirects_.Reset(new TRedirects(true)); - } - result->ResolvedUrl = location; - Redirects_->push_back(result); - - if (Options_.UseCookie) { - Redirects_->ParseCookies(CurrentUrl_, result->Headers); - } - - if (Redirects_->Level() < Options_.RedirectDepth) { - if (OnRedirect_) { - if (!OnRedirect_(CurrentUrl_, location)) { - goto finish; - } - } - - CurrentUrl_ = location; - return TDuration::Zero(); - } - } else if (!NHttpFetcher::IsSuccessCode(result->Code)) { - bool again = RetryAttempts_ > 0; - - if (OnFail_ && !OnFail_(result)) { - again = false; - } - if (again) { - RetryAttempts_--; - return RetryDelay_; - } - } - - finish: - Reply(result); - - return TDuration::Zero(); - } - -} diff --git a/library/cpp/http/client/request.h b/library/cpp/http/client/request.h deleted file mode 100644 index 6dcf39ae9c7..00000000000 --- a/library/cpp/http/client/request.h +++ /dev/null @@ -1,133 +0,0 @@ -#pragma once - -#include "query.h" - -#include <library/cpp/deprecated/atomic/atomic.h> - -#include <library/cpp/http/client/fetch/fetch_request.h> -#include <library/cpp/http/client/fetch/fetch_result.h> - -#include <library/cpp/http/client/cookies/cookiestore.h> - -#include <util/generic/intrlist.h> -#include <util/system/condvar.h> -#include <util/system/spinlock.h> - -namespace NHttp { - class TFetchRequest: public TAtomicRefCount<TFetchRequest> { - public: - TFetchRequest(const TString& url, const TFetchOptions& options); - TFetchRequest(const TString& url, TVector<TString> headers, const TFetchOptions& options); - - /// Returns reference to request object. - static TFetchRequestRef FromQuery(const TFetchQuery& query) { - return query.ConstructRequest(); - } - - /// Cancel the request. - void Cancel(); - - /// Is the current request is still valid? - bool IsValid() const; - - /// Is the current request cancelled? - bool IsCancelled() const; - - /// Makes request in the format of underlining fetch subsystem. - NHttpFetcher::TRequestRef GetRequestImpl() const; - - /// Whether new connection should been established. - bool GetForceReconnect() const; - - /// Unique identifier of the request. - ui64 GetId() const { - return Id_; - } - - /// Returns url of original request. - TString GetUrl() const { - return Url_; - } - - /// Makes final result. - NHttpFetcher::TResultRef MakeResult() const; - - void SetException(std::exception_ptr ptr); - - void SetCallback(NHttpFetcher::TCallBack cb); - - void SetOnFail(TOnFail cb); - - void SetOnRedirect(TOnRedirect cb); - - void SetOnPartialRead(NHttpFetcher::TNeedDataCallback cb); - - /// Waits for completion of the request no more than given timeout. - /// - /// \return true if fetching is finished. - /// \return false if timed out. - bool WaitT(TDuration timeout); - - /// Response has been gotten. - TDuration OnResponse(NHttpFetcher::TResultRef result); - - private: - bool IsValidNoLock() const; - - void Reply(NHttpFetcher::TResultRef result); - - private: - /// State of redirects processing. - struct TRedirects: public std::vector<NHttpFetcher::TResultRef> { - THolder<NHttp::TCookieStore> CookieStore; - - explicit TRedirects(bool parseCookie); - - size_t Level() const; - - void ParseCookies(const TString& url, const THttpHeaders& headers); - }; - - struct TWaitState : TIntrusiveListItem<TWaitState> { - inline TWaitState(TCondVar* c) - : C_(c) - { - } - - inline void Signal() { - C_->Signal(); - } - - TCondVar* const C_; - }; - - const TString Url_; - const TFetchOptions Options_; - TVector<TString> Headers_; - - TAtomic Id_; - ui32 RetryAttempts_; - TDuration RetryDelay_; - - NHttpFetcher::TCallBack - Cb_; - TOnFail OnFail_; - TOnRedirect OnRedirect_; - NHttpFetcher::TNeedDataCallback OnPartialRead_; - - std::exception_ptr Exception_; - NHttpFetcher::TResultRef - Result_; - - TMutex Lock_; - TIntrusiveList<TWaitState> - Awaitings_; - TAtomic Cancel_; - - /// During following through redirects the url is changing. - /// So, this is actual url for the current step. - TString CurrentUrl_; - THolder<TRedirects> Redirects_; - }; - -} diff --git a/library/cpp/http/client/scheduler.cpp b/library/cpp/http/client/scheduler.cpp deleted file mode 100644 index 87670bfb458..00000000000 --- a/library/cpp/http/client/scheduler.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "scheduler.h" - -namespace NHttp { - namespace { - class TDefaultHostsPolicy: public IHostsPolicy { - public: - size_t GetMaxHostConnections(const TStringBuf&) const override { - return 20; - } - }; - - } - - TScheduler::TScheduler() - : HostsPolicy_(new TDefaultHostsPolicy) - { - } - - TFetchRequestRef TScheduler::Extract() { - { - auto g(Guard(Lock_)); - - if (!RequestQueue_.empty()) { - TFetchRequestRef result(RequestQueue_.front()); - RequestQueue_.pop(); - return result; - } - } - return TFetchRequestRef(); - } - - void TScheduler::Schedule(TFetchRequestRef req) { - auto g(Guard(Lock_)); - RequestQueue_.push(req); - } - -} diff --git a/library/cpp/http/client/scheduler.h b/library/cpp/http/client/scheduler.h deleted file mode 100644 index 6700d7cee90..00000000000 --- a/library/cpp/http/client/scheduler.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include "request.h" - -#include <util/generic/ptr.h> -#include <util/generic/queue.h> -#include <util/generic/strbuf.h> -#include <util/system/mutex.h> - -namespace NHttp { - using namespace NHttpFetcher; - - // Асинхронный механизм скачивания. - // Несколько документов одновременно. - // - несколько потоков - // - контроль нагрузки на хост => один объект на приложение. - // Редиректы - // Отмена запроса по таймеру. - - class IHostsPolicy { - public: - virtual ~IHostsPolicy() = default; - - //! Максимальное количество одновременных соединений к хосту. - virtual size_t GetMaxHostConnections(const TStringBuf& host) const = 0; - }; - - //! Управляет процессом скачивания документа по заданному урлу. - class TScheduler { - // host loading - // redirects - public: - TScheduler(); - - //! Получить запрос на скачивание. - TFetchRequestRef Extract(); - - //! Поместить запрос в очередь на скачивание. - void Schedule(TFetchRequestRef req); - - private: - THolder<IHostsPolicy> HostsPolicy_; - TMutex Lock_; - TQueue<TFetchRequestRef> RequestQueue_; - }; - -} diff --git a/library/cpp/http/client/ssl/sslsock.cpp b/library/cpp/http/client/ssl/sslsock.cpp deleted file mode 100644 index 97104de9ec3..00000000000 --- a/library/cpp/http/client/ssl/sslsock.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include "sslsock.h" - -#include <library/cpp/openssl/init/init.h> - -#include <util/datetime/base.h> -#include <util/draft/holder_vector.h> -#include <util/generic/singleton.h> -#include <util/stream/str.h> -#include <util/system/mutex.h> - -#include <contrib/libs/openssl/include/openssl/conf.h> -#include <contrib/libs/openssl/include/openssl/crypto.h> -#include <contrib/libs/openssl/include/openssl/err.h> -#include <contrib/libs/openssl/include/openssl/x509v3.h> - -#include <contrib/libs/libc_compat/string.h> - -namespace NHttpFetcher { - namespace { - struct TSslInit { - inline TSslInit() { - InitOpenSSL(); - } - } SSL_INIT; - } - - TString TSslSocketBase::GetSslErrors() { - TStringStream ss; - unsigned long err = 0; - while (err = ERR_get_error()) { - if (ss.Str().size()) { - ss << "\n"; - } - ss << ERR_error_string(err, nullptr); - } - return ss.Str(); - } - - class TSslSocketBase::TSslCtx { - public: - SSL_CTX* Ctx; - - TSslCtx() { - const SSL_METHOD* method = SSLv23_method(); - if (!method) { - TString err = GetSslErrors(); - Y_FAIL("SslSocket StaticInit: SSLv23_method failed: %s", err.data()); - } - Ctx = SSL_CTX_new(method); - if (!Ctx) { - TString err = GetSslErrors(); - Y_FAIL("SSL_CTX_new: %s", err.data()); - } - - SSL_CTX_set_options(Ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION); - SSL_CTX_set_verify(Ctx, SSL_VERIFY_NONE, nullptr); - } - - ~TSslCtx() { - SSL_CTX_free(Ctx); - } - }; - - SSL_CTX* TSslSocketBase::SslCtx() { - return Singleton<TSslCtx>()->Ctx; - } - - void TSslSocketBase::LoadCaCerts(const TString& caFile, const TString& caPath) { - if (1 != SSL_CTX_load_verify_locations(SslCtx(), - !!caFile ? caFile.data() : nullptr, - !!caPath ? caPath.data() : nullptr)) - { - ythrow yexception() << "Error loading CA certs: " << GetSslErrors(); - } - SSL_CTX_set_verify(SslCtx(), SSL_VERIFY_PEER, nullptr); - } - - namespace { - enum EMatchResult { - MATCH_FOUND, - NO_MATCH, - NO_EXTENSION, - ERROR - }; - - bool EqualNoCase(TStringBuf a, TStringBuf b) { - return (a.size() == b.size()) && (strncasecmp(a.data(), b.data(), a.size()) == 0); - } - - bool MatchDomainName(TStringBuf tmpl, TStringBuf name) { - // match wildcards only in the left-most part - // do not support (optional according to RFC) partial wildcards (ww*.yandex.ru) - // see RFC-6125 - TStringBuf tmplRest = tmpl; - TStringBuf tmplFirst = tmplRest.NextTok('.'); - if (tmplFirst == "*") { - tmpl = tmplRest; - name.NextTok('.'); - } - return EqualNoCase(tmpl, name); - } - - EMatchResult MatchCertCommonName(X509* cert, TStringBuf hostname) { - int commonNameLoc = X509_NAME_get_index_by_NID(X509_get_subject_name(cert), NID_commonName, -1); - if (commonNameLoc < 0) { - return ERROR; - } - - X509_NAME_ENTRY* commonNameEntry = X509_NAME_get_entry(X509_get_subject_name(cert), commonNameLoc); - if (!commonNameEntry) { - return ERROR; - } - - ASN1_STRING* commonNameAsn1 = X509_NAME_ENTRY_get_data(commonNameEntry); - if (!commonNameAsn1) { - return ERROR; - } - - TStringBuf commonName((const char*)ASN1_STRING_get0_data(commonNameAsn1), ASN1_STRING_length(commonNameAsn1)); - - return MatchDomainName(commonName, hostname) - ? MATCH_FOUND - : NO_MATCH; - } - - EMatchResult MatchCertAltNames(X509* cert, TStringBuf hostname) { - EMatchResult result = NO_MATCH; - STACK_OF(GENERAL_NAME)* names = (STACK_OF(GENERAL_NAME)*)X509_get_ext_d2i(cert, NID_subject_alt_name, nullptr, NULL); - if (!names) { - return NO_EXTENSION; - } - - int namesCt = sk_GENERAL_NAME_num(names); - for (int i = 0; i < namesCt; ++i) { - const GENERAL_NAME* name = sk_GENERAL_NAME_value(names, i); - - if (name->type == GEN_DNS) { - TStringBuf dnsName((const char*)ASN1_STRING_get0_data(name->d.dNSName), ASN1_STRING_length(name->d.dNSName)); - if (MatchDomainName(dnsName, hostname)) { - result = MATCH_FOUND; - break; - } - } - } - sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free); - return result; - } - } - - bool TSslSocketBase::CheckCertHostname(X509* cert, TStringBuf hostname) { - switch (MatchCertAltNames(cert, hostname)) { - case MATCH_FOUND: - return true; - break; - case NO_EXTENSION: - return MatchCertCommonName(cert, hostname) == MATCH_FOUND; - break; - default: - return false; - } - } - -} diff --git a/library/cpp/http/client/ssl/sslsock.h b/library/cpp/http/client/ssl/sslsock.h deleted file mode 100644 index 1e57ce4e56f..00000000000 --- a/library/cpp/http/client/ssl/sslsock.h +++ /dev/null @@ -1,414 +0,0 @@ -#pragma once - -#include <library/cpp/http/fetch/sockhandler.h> -#include <library/cpp/openssl/method/io.h> - -#include <util/generic/maybe.h> -#include <util/network/ip.h> -#include <util/network/socket.h> -#include <util/system/yassert.h> - -#include <contrib/libs/openssl/include/openssl/ssl.h> -#include <cerrno> -#include <util/generic/noncopyable.h> - -namespace NHttpFetcher { - class TSslSocketBase { - public: - enum ECertErrors { - SSL_CERT_VALIDATION_FAILED = 0x01, - SSL_CERT_HOSTNAME_MISMATCH = 0x02, - }; - - struct TSessIdDestructor { - static void Destroy(SSL_SESSION* session) { - SSL_SESSION_free(session); - } - }; - - static void LoadCaCerts(const TString& caFile, const TString& caPath); - - protected: - class TSocketCtx { - public: - ui16 SslError; - ui16 CertErrors; - const char* Host; - size_t HostLen; - - public: - TSocketCtx() - : SslError(0) - , CertErrors(0) - , Host(nullptr) - , HostLen(0) - { - } - - void AllocBuffers() { - } - - void FreeBuffers() { - } - }; - - protected: - static SSL_CTX* SslCtx(); - - static TString GetSslErrors(); - - static bool CheckCertHostname(X509* cert, TStringBuf hostname); - - private: - class TSslCtx; - - public: - class TFakeLogger { - public: - static void Write(const char* /*format*/, ...) { - } - }; - }; - - namespace NPrivate { - template <typename TSocketHandler> - class TSocketHandlerIO : public NOpenSSL::TAbstractIO { - private: - TSocketHandler& Sock; - - public: - TSocketHandlerIO(TSocketHandler& sock) - : Sock(sock) - { - } - - int Write(const char* data, size_t dlen, size_t* written) override { - int ret = Sock.send(data, dlen); - - if (ret <= 0) { - *written = 0; - return ret; - } - - *written = dlen; // send returns only 0 or 1 - return 1; - } - - int Read(char* data, size_t dlen, size_t* readbytes) override { - ssize_t ret = Sock.read(data, dlen); - - if (ret <= 0) { - *readbytes = 0; - return ret; - } - - *readbytes = ret; - return 1; - } - - int Puts(const char* buf) override { - TStringBuf sb(buf); - size_t written = 0; - - int ret = Write(sb.data(), sb.size(), &written); - - if (ret <= 0) { - return ret; - } - - return written; - } - - int Gets(char* buf, int size) override { - Y_UNUSED(buf); - Y_UNUSED(size); - return -1; - } - - void Flush() override { - } - }; - - class TDestroyBio { - public: - static void Destroy(BIO* bio) { - if (BIO_free(bio) != 1) { - Y_FAIL("BIO_free failed"); - } - } - }; - - class TDestroyCert { - public: - static void Destroy(X509* cert) { - X509_free(cert); - } - }; - - class TErrnoRestore { - private: - int Value; - - public: - TErrnoRestore() - : Value(errno) - { - } - - ~TErrnoRestore() { - errno = Value; - } - }; - } - - template <class TSocketHandler, class TErrorLogger = TSslSocketBase::TFakeLogger> - class TSslSocketHandler - : public TSslSocketBase, - protected TSocketHandler, - TNonCopyable { - private: - public: - struct TSocketCtx: public TSslSocketBase::TSocketCtx { - THolder<SSL_SESSION, TSessIdDestructor> CachedSession; - TMaybe<char> PeekedByte; - }; - - TSslSocketHandler() - : TSocketHandler() - { - } - - virtual ~TSslSocketHandler() { - Disconnect(); - } - - int Good() const { - return TSocketHandler::Good(); - } - bool HasSsl() const { - return !!SslBio; - } - - // set reconnect "true" to try to recover from cached session id - int Connect(TSocketCtx* ctx, const TAddrList& addrs, TDuration timeout, bool isHttps, bool reconnect = false); - - // for debug "file" socket - bool open(const char* name) { - Disconnect(); - return TSocketHandler::open(name); - } - - void Disconnect(TSocketCtx* ctx = nullptr) { // if ctx is non-NULL, cache session id in it. - if (!!SslBio) { - if (ctx) { - SSL* ssl; - if (!BIO_get_ssl(SslBio.Get(), &ssl)) { - Y_FAIL("BIO_get_ssl failed"); - } - SSL_SESSION* sess = SSL_get1_session(ssl); - if (!sess) { - TErrorLogger::Write("TSslSocketHandler::Disconnect: failed to create session id for host %s\n", TString(ctx->Host, ctx->HostLen).data()); - } - ctx->CachedSession.Reset(sess); - } - BIO_ssl_shutdown(SslBio.Get()); - SslBio.Destroy(); - SocketBio.Destroy(); - } - TSocketHandler::Disconnect(); - } - - void shutdown() { - TSocketHandler::shutdown(); - } - - ssize_t send(TSocketCtx* ctx, const void* message, size_t messlen) { - Y_ASSERT(TSocketHandler::Good()); - if (!SslBio) - return TSocketHandler::send(message, messlen); - int rc = SslWrite(ctx, static_cast<const char*>(message), (int)messlen); - if (rc < 0) { - NPrivate::TErrnoRestore errnoRest; - Disconnect(); - return false; - } - Y_ASSERT((size_t)rc == messlen); - return true; - } - - bool peek(TSocketCtx* ctx) { - if (!SslBio) - return TSocketHandler::peek(); - int rc; - rc = SslRead(ctx, nullptr, 0); - if (rc < 0) { - NPrivate::TErrnoRestore errnoRest; - Disconnect(); - return false; - } else { - return (rc > 0); - } - } - - ssize_t read(TSocketCtx* ctx, void* message, size_t messlen) { - if (!SslBio) - return TSocketHandler::read(message, messlen); - int rc; - if (!messlen) - return 0; - rc = SslRead(ctx, static_cast<char*>(message), (int)messlen); - if (rc < 0) { - NPrivate::TErrnoRestore errnoRest; - Disconnect(); - } - return rc; - } - - private: - int SslRead(TSocketCtx* ctx, char* buf, int buflen); - int SslWrite(TSocketCtx* ctx, const char* buf, int len); - - THolder<BIO, NPrivate::TDestroyBio> SslBio; - THolder<NPrivate::TSocketHandlerIO<TSocketHandler>> SocketBio; - }; - - template <typename TSocketHandler, typename TErrorLogger> - int TSslSocketHandler<TSocketHandler, TErrorLogger>::Connect(TSocketCtx* ctx, const TAddrList& addrs, TDuration timeout, bool isHttps, bool reconnect) { - ctx->SslError = 0; - ctx->CertErrors = 0; - Disconnect(); - int res = TSocketHandler::Connect(addrs, timeout); - if (!isHttps || res != 0) { - ctx->CachedSession.Destroy(); - return res; - } - - // create ssl session - SslBio.Reset(BIO_new_ssl(SslCtx(), /*client =*/1)); - if (!SslBio) { - ctx->SslError = 1; - NPrivate::TErrnoRestore errnoRest; - Disconnect(); - return -1; - } - - SSL* ssl; - if (BIO_get_ssl(SslBio.Get(), &ssl) != 1) { - Y_FAIL("BIO_get_ssl failed"); - } - - SSL_set_ex_data(ssl, /*index =*/0, ctx); - - if (reconnect) { - SSL_set_session(ssl, ctx->CachedSession.Get()); - } - - TString host(ctx->Host, ctx->HostLen); - host = host.substr(0, host.rfind(':')); - if (SSL_set_tlsext_host_name(ssl, host.data()) != 1) { - ctx->SslError = 1; - return -1; - } - - SocketBio.Reset(new NPrivate::TSocketHandlerIO<TSocketHandler>(*this)); - - BIO_push(SslBio.Get(), *SocketBio); - - ctx->CachedSession.Destroy(); - - // now it's time to perform handshake - if (BIO_do_handshake(SslBio.Get()) != 1) { - long verify_err = SSL_get_verify_result(ssl); - if (verify_err != X509_V_OK) { - // It failed because the certificate chain validation failed - TErrorLogger::Write("SSL Handshake failed: %s", GetSslErrors().data()); - ctx->CertErrors |= SSL_CERT_VALIDATION_FAILED; - } - ctx->SslError = 1; - return -1; - } - - THolder<X509, NPrivate::TDestroyCert> cert(SSL_get_peer_certificate(ssl)); - if (!cert) { - // The handshake was successful although the server did not provide a certificate - // Most likely using an insecure anonymous cipher suite... get out! - TErrorLogger::Write("No SSL certificate"); - ctx->SslError = 1; - return -1; - } - - if (!CheckCertHostname(cert.Get(), host)) { - ctx->SslError = 1; - ctx->CertErrors |= SSL_CERT_HOSTNAME_MISMATCH; - return -1; - } - - return 0; - } - - template <typename TSocketHandler, typename TErrorLogger> - int TSslSocketHandler<TSocketHandler, TErrorLogger>::SslRead(TSocketCtx* ctx, char* buf, int buflen) { - Y_ASSERT(SslCtx()); - - if (!SslBio || buflen < 0) - return -1; - - if (!buf) { - // peek - char byte; - int res = BIO_read(SslBio.Get(), &byte, 1); - if (res < 0) { - ctx->SslError = 1; - return -1; - } - if (res == 0) { - return 0; - } - Y_VERIFY(res == 1); - ctx->PeekedByte = byte; - return 1; - } - - if (buflen) { - size_t read = 0; - if (!!ctx->PeekedByte) { - *buf = *(ctx->PeekedByte); - ++buf; - --buflen; - ctx->PeekedByte.Clear(); - read = 1; - } - int res = BIO_read(SslBio.Get(), buf, buflen); - if (res < 0) { - ctx->SslError = 1; - return -1; - } - read += res; - return read; - } - - return 0; - } - - template <typename TSocketHandler, typename TErrorLogger> - int TSslSocketHandler<TSocketHandler, TErrorLogger>::SslWrite(TSocketCtx* ctx, const char* buf, int len) { - if (len <= 0) - return len ? -1 : 0; - - size_t remaining = len; - while (remaining) { - int res = BIO_write(SslBio.Get(), buf, len); - if (res < 0) { - ctx->SslError = 1; - return -1; - } - remaining -= res; - buf += res; - } - if (BIO_flush(SslBio.Get()) != 1) { - ctx->SslError = 1; - return -1; - } - return len; - } -} diff --git a/library/cpp/http/cookies/cookies.cpp b/library/cpp/http/cookies/cookies.cpp deleted file mode 100644 index 12b66c7f9df..00000000000 --- a/library/cpp/http/cookies/cookies.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "cookies.h" - -#include <library/cpp/string_utils/scan/scan.h> -#include <util/string/strip.h> -#include <util/string/builder.h> - -namespace { - struct TCookiesScanner { - THttpCookies* C; - - inline void operator()(const TStringBuf& key, const TStringBuf& val) { - C->Add(StripString(key), StripString(val)); - } - }; -} - -void THttpCookies::Scan(const TStringBuf& s) { - Clear(); - TCookiesScanner scan = {this}; - ScanKeyValue<true, ';', '='>(s, scan); -} - -/*** https://datatracker.ietf.org/doc/html/rfc6265#section-5.4 ***/ -TString THttpCookies::ToString() const { - TStringBuilder result; - for (const auto& [key, value] : *this) { - if (!result.empty()) { - result << "; "; - } - result << key << "=" << value; - } - return result; -} diff --git a/library/cpp/http/cookies/cookies.h b/library/cpp/http/cookies/cookies.h deleted file mode 100644 index d7a0030c8ba..00000000000 --- a/library/cpp/http/cookies/cookies.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "lctable.h" - -class THttpCookies: public TLowerCaseTable<TStringBuf> { -public: - inline THttpCookies(const TStringBuf& cookieString) { - Scan(cookieString); - } - - inline THttpCookies() noexcept { - } - - void Scan(const TStringBuf& cookieString); - - TString ToString() const; -}; diff --git a/library/cpp/http/cookies/lctable.h b/library/cpp/http/cookies/lctable.h deleted file mode 100644 index 09c88eafb80..00000000000 --- a/library/cpp/http/cookies/lctable.h +++ /dev/null @@ -1,86 +0,0 @@ -#pragma once - -#include <library/cpp/digest/lower_case/lchash.h> - -#include <util/generic/hash_multi_map.h> -#include <util/generic/strbuf.h> -#include <util/generic/algorithm.h> -#include <util/generic/singleton.h> - -struct TStrBufHash { - inline size_t operator()(const TStringBuf& s) const noexcept { - return FnvCaseLess<size_t>(s); - } -}; - -struct TStrBufEqualToCaseLess { - inline bool operator()(const TStringBuf& c1, const TStringBuf& c2) const noexcept { - typedef TLowerCaseIterator<const TStringBuf::TChar> TIter; - - return (c1.size() == c2.size()) && std::equal(TIter(c1.begin()), TIter(c1.end()), TIter(c2.begin())); - } -}; - -template <class T> -class TLowerCaseTable: private THashMultiMap<TStringBuf, T, TStrBufHash, TStrBufEqualToCaseLess> { - typedef THashMultiMap<TStringBuf, T, TStrBufHash, TStrBufEqualToCaseLess> TBase; - -public: - typedef typename TBase::const_iterator const_iterator; - typedef std::pair<const_iterator, const_iterator> TConstIteratorPair; - - using TBase::TBase; - using TBase::begin; - using TBase::end; - - inline TConstIteratorPair EqualRange(const TStringBuf& name) const { - return TBase::equal_range(name); - } - - inline const T& Get(const TStringBuf& name, size_t numOfValue = 0) const { - TConstIteratorPair range = EqualRange(name); - - if (range.first == TBase::end()) - return Default<T>(); - - if (numOfValue == 0) - return range.first->second; - - const_iterator next = range.first; - for (size_t c = 0; c < numOfValue; ++c) { - ++next; - if (next == range.second) - return Default<T>(); - } - - return next->second; - } - - inline bool Has(const TStringBuf& name) const { - return TBase::find(name) != TBase::end(); - } - - size_t NumOfValues(const TStringBuf& name) const { - return TBase::count(name); - } - - inline size_t Size() const noexcept { - return TBase::size(); - } - - inline bool Empty() const noexcept { - return TBase::empty(); - } - - inline void Add(const TStringBuf& key, const T& val) { - TBase::insert(typename TBase::value_type(key, val)); - } - - inline void Clear() noexcept { - TBase::clear(); - } - - inline size_t Erase(const TStringBuf& key) { - return TBase::erase(key); - } -}; diff --git a/library/cpp/http/fetch_gpl/httpagent.h b/library/cpp/http/fetch_gpl/httpagent.h deleted file mode 100644 index b77c246c4f1..00000000000 --- a/library/cpp/http/fetch_gpl/httpagent.h +++ /dev/null @@ -1,292 +0,0 @@ -#pragma once - -#include <library/cpp/http/fetch/httpagent.h> - -template <class TSockHndl = TSimpleSocketHandler, - class TDnsClient = TIpResolver, - class TErrorLogger = TSslSocketBase::TFakeLogger, - class TTimer = TNoTimer, - template <class, class> class TSslSocketImpl = TSslSocketHandler> -class THttpsAgent: public TTimer { -public: - typedef TSslSocketImpl<TSockHndl, TErrorLogger> TSocket; - THttpsAgent() - : Socket(new TSocket) - , Scheme(0) - , Persistent(0) - , Timeout(TDuration::MicroSeconds(150)) - , Hostheader(nullptr) - , Footer(nullptr) - , pHostBeg(nullptr) - , pHostEnd(nullptr) - , AltFooter(nullptr) - , PostData(nullptr) - , PostDataLen(0) - , Method(nullptr) - , MethodLen(0) - , HostheaderLen(0) - { - SetIdentification("YandexSomething/1.0", "webadmin@yandex.ru"); - } - - ~THttpsAgent() { - Disconnect(); - delete[] Hostheader; - delete[] Footer; - } - - void SetIdentification(const char* userAgent, const char* httpFrom) { - Y_VERIFY(Socket.Get(), "HttpsAgent: socket is picked out. Can't use until a valid socket is set"); - delete[] Footer; - size_t len = userAgent ? strlen(userAgent) + 15 : 0; - len += httpFrom ? strlen(httpFrom) + 9 : 0; - len += 3; - Footer = new char[len]; - if (userAgent) - strcat(strcat(strcpy(Footer, "User-Agent: "), userAgent), "\r\n"); - if (httpFrom) - strcat(strcat(strcat(Footer, "From: "), httpFrom), "\r\n"); - } - - void SetUserAgentFooter(const char* altFooter) { - AltFooter = altFooter; - } - - void SetPostData(const char* postData, size_t postDataLen) { - PostData = postData; - PostDataLen = postDataLen; - } - - void SetMethod(const char* method, size_t methodLen) { - Method = method; - MethodLen = methodLen; - } - - // deprecated - ui32 GetIp() const { - return Addrs.GetV4Addr().first; - } - - int GetScheme() const { - return Scheme; - } - - void SetTimeout(TDuration tim) { - Timeout = tim; - } - - void SetConnectTimeout(TDuration timeout) { - ConnectTimeout = timeout; - } - - int Disconnected() { - return !Persistent || !Socket.Get() || !Socket->Good(); - } - - int SetHost(const char* hostname, TIpPort port, int scheme = THttpURL::SchemeHTTP) { - TStringBuf host{hostname}; - if (host.StartsWith('[') && host.EndsWith(']')) { - TString tmp = ToString(host.Skip(1).Chop(1)); - TSockAddrInet6 sa(tmp.data(), port); - NAddr::IRemoteAddrRef addr = new NAddr::TIPv6Addr(sa); - SetHost(hostname, port, {addr}, scheme); - return 0; - } - TAddrList addrs = DnsClient.Resolve(hostname, port); - if (!addrs.size()) { - return 1; - } - SetHost(hostname, port, addrs, scheme); - return 0; - } - - int SetHost(const char* hostname, TIpPort port, const TAddrList& addrs, int scheme = THttpURL::SchemeHTTP) { - Disconnect(); - Addrs = addrs; - Scheme = scheme; - size_t reqHostheaderLen = strlen(hostname) + 20; - if (HostheaderLen < reqHostheaderLen) { - delete[] Hostheader; - Hostheader = new char[(HostheaderLen = reqHostheaderLen)]; - } - if (Scheme == THttpURL::SchemeHTTPS && port == 443 || port == 80) - sprintf(Hostheader, "Host: %s\r\n", hostname); - else - sprintf(Hostheader, "Host: %s:%u\r\n", hostname, port); - pHostBeg = strchr(Hostheader, ' ') + 1; - pHostEnd = strchr(pHostBeg, '\r'); - // convert hostname to lower case since some web server don't like - // uppper case (Task ROBOT-562) - for (char* p = pHostBeg; p < pHostEnd; p++) - *p = tolower(*p); - SocketCtx.Host = pHostBeg; - SocketCtx.HostLen = pHostEnd - pHostBeg; - return 0; - } - - // deprecated v4-only version - int SetHost(const char* hostname, TIpPort port, ui32 ip, int scheme = THttpURL::SchemeHTTP, TIpPort connPort = 0) { - connPort = connPort ? connPort : port; - return SetHost(hostname, port, TAddrList::MakeV4Addr(ip, connPort), scheme); - } - - void SetHostHeader(const char* host) { - size_t reqHostheaderLen = strlen(host) + 20; - if (HostheaderLen < reqHostheaderLen) { - delete[] Hostheader; - Hostheader = new char[(HostheaderLen = reqHostheaderLen)]; - } - sprintf(Hostheader, "Host: %s\r\n", host); - pHostBeg = strchr(Hostheader, ' ') + 1; - pHostEnd = strchr(pHostBeg, '\r'); - SocketCtx.Host = pHostBeg; - SocketCtx.HostLen = pHostEnd - pHostBeg; - } - - void SetSocket(TSocket* s) { - Y_VERIFY(s, "HttpsAgent: socket handler is null"); - SocketCtx.FreeBuffers(); - if (s->HasSsl()) - SocketCtx.AllocBuffers(); - Socket.Reset(s); - } - - void SetPersistent(const bool value) { - Persistent = value; - } - - TSocket* PickOutSocket() { - SocketCtx.FreeBuffers(); - SocketCtx.CachedSession.Destroy(); - return Socket.Release(); - } - - void Disconnect() { - if (Socket.Get()) - Socket->Disconnect(); - SocketCtx.FreeBuffers(); - SocketCtx.CachedSession.Destroy(); - } - - ssize_t read(void* buffer, size_t buflen) { - Y_VERIFY(Socket.Get(), "HttpsAgent: socket is picked out. Can't use until a valid socket is set"); - ssize_t ret = Socket->read(&SocketCtx, buffer, buflen); - TTimer::OnAfterRecv(); - return ret; - } - - int RequestGet(const char* url, const char* const* headers, int persistent = 1, bool head_request = false) { - Y_VERIFY(Socket.Get(), "HttpsAgent: socket is picked out. Can't use until a valid socket is set"); - if (!Addrs.size()) - return HTTP_DNS_FAILURE; - char message[MessageMax]; - ssize_t messlen = 0; - if (Method) { - strncpy(message, Method, MethodLen); - message[MethodLen] = ' '; - messlen = MethodLen + 1; - } else if (PostData) { - strcpy(message, "POST "); - messlen = 5; - } else if (head_request) { - strcpy(message, "HEAD "); - messlen = 5; - } else { - strcpy(message, "GET "); - messlen = 4; - } -#define _AppendMessage(mes) messlen += Min(MessageMax - messlen, \ - (ssize_t)strlcpy(message + messlen, (mes), MessageMax - messlen)) - _AppendMessage(url); - _AppendMessage(" HTTP/1.1\r\n"); - _AppendMessage(Hostheader); - _AppendMessage("Connection: "); - _AppendMessage(persistent ? "Keep-Alive\r\n" : "Close\r\n"); - while (headers && *headers) - _AppendMessage(*headers++); - if (AltFooter) - _AppendMessage(AltFooter); - else - _AppendMessage(Footer); - _AppendMessage("\r\n"); -#undef _AppendMessage - if (messlen >= MessageMax) - return HTTP_HEADER_TOO_LARGE; - - if (!Persistent) - Socket->Disconnect(&SocketCtx); - Persistent = persistent; - int connected = Socket->Good(); - SocketCtx.FreeBuffers(); - if (Scheme == THttpURL::SchemeHTTPS) { - SocketCtx.AllocBuffers(); - } - - bool success = false; - Y_SCOPE_EXIT(&success, this) { if (!success) { this->SocketCtx.FreeBuffers(); }; }; - - TTimer::OnBeforeSend(); - for (int attempt = !connected; attempt < 2; attempt++) { - const auto connectTimeout = ConnectTimeout ? ConnectTimeout : Timeout; - if (!Socket->Good() && Socket->Connect(&SocketCtx, Addrs, connectTimeout , Scheme == THttpURL::SchemeHTTPS, true)) { - return SocketCtx.SslError ? HTTP_SSL_ERROR : HTTP_CONNECT_FAILED; - } else { // We successfully connected - connected = true; - } - - int sendOk = Socket->send(&SocketCtx, message, messlen); - if (sendOk && PostData && PostDataLen) - sendOk = Socket->send(&SocketCtx, PostData, PostDataLen); - if (!sendOk) { - int err = errno; - Socket->Disconnect(&SocketCtx); - errno = err; - continue; - } - TTimer::OnAfterSend(); - - if (!Socket->peek(&SocketCtx)) { - int err = errno; - Socket->Disconnect(&SocketCtx); - if (err == EINTR) { - errno = err; - return HTTP_INTERRUPTED; - } - if (err == ETIMEDOUT) { - errno = err; - return HTTP_TIMEDOUT_WHILE_BYTES_RECEIVING; - } - } else { - TTimer::OnBeforeRecv(); - if (!persistent) { - Socket->shutdown(); - } - success = true; - return 0; - } - } - return SocketCtx.SslError ? HTTP_SSL_ERROR : (connected ? HTTP_CONNECTION_LOST : HTTP_CONNECT_FAILED); - } - - ui16 CertCheckErrors() const { - return SocketCtx.CertErrors; - } - -protected: - THolder<TSocket> Socket; - typename TSocket::TSocketCtx SocketCtx; - TIpResolverWrapper<TDnsClient> DnsClient; - TAddrList Addrs; - int Scheme; - int Persistent; - TDuration Timeout; - TDuration ConnectTimeout; - char *Hostheader, *Footer, *pHostBeg, *pHostEnd; - const char* AltFooter; // alternative footer can be set by the caller - const char* PostData; - size_t PostDataLen; - const char* Method; - size_t MethodLen; - unsigned short HostheaderLen; - static const ssize_t MessageMax = 65536; -}; diff --git a/library/cpp/http/fetch_gpl/sockhandler.cpp b/library/cpp/http/fetch_gpl/sockhandler.cpp deleted file mode 100644 index a3fa2e9de1f..00000000000 --- a/library/cpp/http/fetch_gpl/sockhandler.cpp +++ /dev/null @@ -1,135 +0,0 @@ -#include "sockhandler.h" - -#include <util/datetime/base.h> - -bool TSslSocketBase::Initialized = false; -sslKeys_t* TSslSocketBase::Keys = nullptr; -THolder<TSslSocketBase::TBufferAllocator> TSslSocketBase::BufAlloc; - -bool TSslSocketBase::StaticInit(const char* caFile) { - Y_VERIFY(!Initialized, "SslSocket StaticInit: already initialized"); - BufAlloc.Reset(new TSslSocketBase::TBufferAllocator); - if (matrixSslOpen() < 0) - Y_FAIL("SslSocket StaticInit: unable to initialize matrixSsl"); - Y_VERIFY(caFile && caFile[0], "SslSocket StaticInit: no certificate authority file"); - - if (matrixSslReadKeys(&Keys, nullptr, nullptr, nullptr, caFile) < 0) { - Y_FAIL("SslSocket StaticInit: unable to load ssl keys from %s", caFile); - } - Initialized = true; - return Initialized; -} - -bool TSslSocketBase::StaticInit(unsigned char* caBuff, int caLen) { - Y_VERIFY(!Initialized, "SslSocket StaticInit: already initialized"); - BufAlloc.Reset(new TSslSocketBase::TBufferAllocator); - if (matrixSslOpen() < 0) - Y_FAIL("SslSocket StaticInit: unable to initialize matrixSsl"); - Y_VERIFY(caBuff && caBuff[0] && caLen > 0, "SslSocket StaticInit: no certificate authority file"); - - if (matrixSslReadKeysMem(&Keys, nullptr, 0, nullptr, 0, caBuff, caLen) < 0) { - Y_FAIL("SslSocket StaticInit: unable to load ssl keys from memory"); - } - Initialized = true; - return Initialized; -} - -void TSslSocketBase::StaticTerm() { - Y_VERIFY(Initialized, "SslSocket StaticTerm: not initialized"); - matrixSslFreeKeys(Keys); - matrixSslClose(); - Keys = nullptr; - BufAlloc.Reset(nullptr); - Initialized = false; -} - -bool MatchPattern(const char* p, const char* pe, const char* s, const char* se, int maxAsteriskNum) { - if (maxAsteriskNum <= 0) - return false; - while (p < pe && s < se) { - if (*p == '*') { - ++p; - while (p < pe && *p == '*') - ++p; - while (s < se) { - if (MatchPattern(p, pe, s, se, maxAsteriskNum - 1)) - return true; - if (*s == '.') - return false; - ++s; - } - return p == pe; - } else { - if (*p != *s) - return false; - ++p; - ++s; - } - } - while (p < pe && *p == '*') - ++p; - return (p == pe && s == se); -} - -bool MatchHostName(const char* pattern, size_t patternLen, const char* name, size_t nameLen) { - // rfc 2818 says: - // wildcard character * can match any single domain name component or component fragment - Y_VERIFY(name && nameLen, "Ssl certificate check error: hostname is empty"); - if (!pattern || !patternLen) - return false; - const char* ne = strchr(name, ':'); - if (!ne || ne > name + nameLen) - ne = name + nameLen; - return MatchPattern(pattern, pattern + patternLen, name, ne, 5); -} - -bool IsExpired(const char* notBefore, const char* notAfter) { - time_t notbefore, notafter; - if (!ParseX509ValidityDateTimeDeprecated(notBefore, notbefore) || !ParseX509ValidityDateTimeDeprecated(notAfter, notafter)) - return true; - time_t t = Seconds(); - return notbefore > t || t > notafter; -} - -int TSslSocketBase::CertChecker(sslCertInfo_t* cert, void* arg) { - Y_ASSERT(cert); - Y_ASSERT(arg); - TSocketCtx* ctx = (TSocketCtx*)arg; - ctx->CertErrors = 0; - - // matching hostname - if (ctx->Host && ctx->HostLen) { - bool nameMatched = false; - sslSubjectAltNameEntry* an = cert->subjectAltName; - while (an) { - // dNSName id is 2. - if (an->id == 2 && MatchHostName((const char*)an->data, an->dataLen, ctx->Host, ctx->HostLen)) { - nameMatched = true; - break; - } - an = an->next; - } - if (!nameMatched && cert->subject.commonName) { - nameMatched = MatchHostName(cert->subject.commonName, strlen(cert->subject.commonName), ctx->Host, ctx->HostLen); - } - if (!nameMatched) - ctx->CertErrors |= SSL_CERT_HOSTNAME_MISMATCH; - } - - // walk through certificate chain and check if they are signed correctly and not expired - sslCertInfo_t* c = cert; - while (c->next) { - if (IsExpired(c->notBefore, c->notAfter)) - ctx->CertErrors |= SSL_CERT_EXPIRED; - if (c->verified < 0) { - ctx->CertErrors |= SSL_CERT_BAD_CHAIN; - } - c = c->next; - } - if (c->verified < 0) - ctx->CertErrors |= SSL_CERT_UNTRUSTED; - if (IsExpired(c->notBefore, c->notAfter)) - ctx->CertErrors |= SSL_CERT_EXPIRED; - - return SSL_ALLOW_ANON_CONNECTION; -} diff --git a/library/cpp/http/fetch_gpl/sockhandler.h b/library/cpp/http/fetch_gpl/sockhandler.h deleted file mode 100644 index 91d4f67a065..00000000000 --- a/library/cpp/http/fetch_gpl/sockhandler.h +++ /dev/null @@ -1,557 +0,0 @@ -#pragma once - -#include <library/cpp/http/fetch/sockhandler.h> -#include <contrib/libs/matrixssl/matrixSsl.h> - -class TSslSocketBase { -public: - static bool StaticInit(const char* caFile = nullptr); - static bool StaticInit(unsigned char* caBuff, int caLen); - static void StaticTerm(); - static int CertChecker(sslCertInfo_t* cert, void* arg); - enum ECertErrors { - SSL_CERT_UNTRUSTED = 0x01, - SSL_CERT_BAD_CHAIN = 0x02, - SSL_CERT_HOSTNAME_MISMATCH = 0x04, - SSL_CERT_EXPIRED = 0x08 - }; - - struct TSessIdDestructor { - static void Destroy(sslSessionId_t* id) { - matrixSslFreeSessionId(id); - } - }; - -protected: - enum ESslStatus { - SSLSOCKET_EOF = 0x1, - SSLSOCKET_CLOSE_NOTIFY = 0x2 - }; - struct TSocketCtx { - ui16 SslError; - ui16 CertErrors; - const char* Host; - size_t HostLen; - TSocketCtx() - : SslError(0) - , CertErrors(0) - , Host(nullptr) - , HostLen(0) - { - } - }; - -protected: - class TBufferAllocator { - class TChunk; - typedef TIntrusiveSListItem<TChunk> TChunkBase; - - class TChunk: public TChunkBase { - public: - inline unsigned char* ToPointer() { - //shut up clang warning - (void)Buf; - - return (unsigned char*)this; - - static_assert(sizeof(TChunk) >= SSL_MAX_BUF_SIZE, "expect sizeof(TChunk) >= SSL_MAX_BUF_SIZE"); - } - static inline TChunk* FromPointer(unsigned char* ptr) { - return (TChunk*)ptr; - } - - private: - unsigned char Buf[SSL_MAX_BUF_SIZE - sizeof(TChunkBase)]; - }; - - public: - TBufferAllocator() - : NFree(0) - , NAllocated(0) - { - static_assert(InitialItems > 0 && A1 > 0 && A2 > 0 && A1 >= A2, "expect InitialItems > 0 && A1 > 0 && A2 > 0 && A1 >= A2"); - ResizeList(InitialItems); - } - - ~TBufferAllocator() { - Y_VERIFY(!NAllocated, "Ssl bufferAllocator: %" PRISZT " blocks lost!", NAllocated); - ResizeList(0); - } - - unsigned char* Alloc() { - TGuard<TMutex> guard(Lock); - if (Free_.Empty()) - ResizeList(A2 * NAllocated); - - NAllocated++; - NFree--; - return Free_.PopFront()->ToPointer(); - } - - void Free(unsigned char* p) { - if (!p) - return; - TGuard<TMutex> guard(Lock); - Y_VERIFY(NAllocated, "Ssl bufferAllocator: multiple frees?"); - TChunk* ch = TChunk::FromPointer(p); - Free_.PushFront(ch); - NFree++; - NAllocated--; - - // destroy some items if NFree/NAllocated increased too much - size_t newSize = A2 * NAllocated; - if (NAllocated + newSize >= InitialItems && NFree >= A1 * NAllocated) - ResizeList(newSize); - } - - private: - inline void ResizeList(size_t newSize) { - while (NFree < newSize) { - Free_.PushFront(new TChunk); - NFree++; - } - while (NFree > newSize) { - TChunk* ch = Free_.PopFront(); - Y_VERIFY(ch, "Ssl bufferAllocator: internal error"); - delete ch; - NFree--; - } - } - - static const size_t InitialItems = 100; - static const unsigned A1 = 3; // maximum reserved/allocated ratio - static const unsigned A2 = 1; // if ratio A1 is reached, decrease by A2 - - TIntrusiveSList<TChunk> Free_; - size_t NFree; - size_t NAllocated; - TMutex Lock; - }; - - static bool Initialized; - static sslKeys_t* Keys; - static THolder<TBufferAllocator> BufAlloc; - -public: - class TFakeLogger { - public: - static void Write(const char* /*format*/, ...) { - } - }; -}; - -template <class TSocketHandler = TSimpleSocketHandler, class TErrorLogger = TSslSocketBase::TFakeLogger> -class TSslSocketHandler: public TSslSocketBase, protected TSocketHandler, TNonCopyable { -public: - struct TSocketCtx: public TSslSocketBase::TSocketCtx { - sslBuf_t InBuf; - sslBuf_t InSock; - THolder<sslSessionId_t, TSessIdDestructor> CachedSession; - TSocketCtx() { - Zero(InBuf); - Zero(InSock); - } - void AllocBuffers() { - Y_ASSERT(InBuf.size == 0); - InBuf.size = SSL_MAX_BUF_SIZE; - InBuf.start = InBuf.end = InBuf.buf = BufAlloc->Alloc(); - - Y_ASSERT(InSock.size == 0); - InSock.size = SSL_MAX_BUF_SIZE; - InSock.start = InSock.end = InSock.buf = BufAlloc->Alloc(); - } - void FreeBuffers() { - if (InBuf.buf) { - if (InBuf.end - InBuf.start) { - // We had some data read and decrypted. Too sad, nobody needs it now :( - TErrorLogger::Write("TSocketCtx::FreeBuffers: %i bytes of data lost in InBuf (%s)\n", (int)(InBuf.end - InBuf.start), TString(Host, HostLen).data()); - } - BufAlloc->Free(InBuf.buf); - Zero(InBuf); - } - if (InSock.buf) { - if (InSock.end - InSock.start) { - // We had some data read and waiting for decryption. Most likely we disconnected before server's "bye". - TErrorLogger::Write("TSocketCtx::FreeBuffers: %i bytes of data lost in InSock (%s)\n", (int)(InSock.end - InSock.start), TString(Host, HostLen).data()); - } - BufAlloc->Free(InSock.buf); - Zero(InSock); - } - } - void ResetBuffers() { - InBuf.start = InBuf.end = InBuf.buf; - InSock.start = InSock.end = InSock.buf; - } - }; - - TSslSocketHandler() - : TSocketHandler() - , Ssl(nullptr) - { - Y_VERIFY(TSslSocketBase::Initialized, "Ssl library isn't initialized. Call TSslSocketBase::StaticInit() first"); - } - - virtual ~TSslSocketHandler() { - Y_ASSERT(Initialized); - Disconnect(); - } - - int Good() const { - return TSocketHandler::Good(); - } - bool HasSsl() const { - return Ssl; - } - - // set reconnect "true" to try to recover from cached session id - int Connect(TSocketCtx* ctx, const TAddrList& addrs, TDuration timeout, bool isHttps, bool reconnect = false); - - // for debug "file" socket - bool open(const char* name) { - Y_ASSERT(Initialized); - Disconnect(); - return TSocketHandler::open(name); - } - - void Disconnect(TSocketCtx* ctx = nullptr) { // if ctx is non-NULL, cache session id in it. - Y_ASSERT(Initialized); - if (Ssl) { - if (ctx) { - sslSessionId_t* cs; - if (matrixSslGetSessionId(Ssl, &cs) < 0) { - cs = nullptr; - TErrorLogger::Write("TSslSocketHandler::Disconnect: failed to create session id for host %s\n", TString(ctx->Host, ctx->HostLen).data()); - } - ctx->CachedSession.Reset(cs); - } - matrixSslDeleteSession(Ssl); - Ssl = nullptr; - } - TSocketHandler::Disconnect(); - } - - void shutdown() { - TSocketHandler::shutdown(); - } - - ssize_t send(TSocketCtx* ctx, const void* message, size_t messlen) { - Y_ASSERT(TSocketHandler::Good()); - if (!Ssl) - return TSocketHandler::send(message, messlen); - int status; - int rc = SslWrite(ctx, static_cast<const char*>(message), (int)messlen, &status); - if (rc < 0) { - errno = status; - ctx->ResetBuffers(); - Disconnect(); - return false; - } - Y_ASSERT((size_t)rc == messlen); - return true; - } - - bool peek(TSocketCtx* ctx) { - if (!Ssl) - return TSocketHandler::peek(); - int rc; - int status; - while (true) { - rc = SslRead(ctx, nullptr, 0, &status); - if (rc < 0) { - errno = status; - ctx->ResetBuffers(); - Disconnect(); - return false; - } else if (rc > 0) { - return true; - } - // else if (rc == 0) - if (status) { - errno = status; - ctx->ResetBuffers(); - Disconnect(); - return false; - } - } - } - - ssize_t read(TSocketCtx* ctx, void* message, size_t messlen) { - if (!Ssl) - return TSocketHandler::read(message, messlen); - int rc; - int status; - if (!messlen) - return 0; - while (true) { - rc = SslRead(ctx, static_cast<char*>(message), (int)messlen, &status); - if (rc < 0) { - errno = status; - ctx->ResetBuffers(); - Disconnect(); - return rc; - } else if (rc > 0) - return rc; - // else if (rc == 0) - if (status) { - errno = status; - ctx->ResetBuffers(); - Disconnect(); - return 0; - } - } - } - -private: - int SslRead(TSocketCtx* ctx, char* buf, int buflen, int* status); - int SslWrite(TSocketCtx* ctx, const char* buf, int len, int* status); - - ssl_t* Ssl; -}; - -template <typename TSocketHandler, typename TErrorLogger> -int TSslSocketHandler<TSocketHandler, TErrorLogger>::Connect(TSocketCtx* ctx, const TAddrList& addrs, TDuration timeout, bool isHttps, bool reconnect) { - Y_ASSERT(Initialized); - ctx->SslError = 0; - ctx->ResetBuffers(); - Disconnect(); - int res = TSocketHandler::Connect(addrs, timeout); - if (!isHttps || res != 0) { - ctx->CachedSession.Destroy(); - return res; - } - - // create ssl session - if ((res = matrixSslNewSession(&Ssl, Keys, reconnect ? ctx->CachedSession.Get() : nullptr, 0)) < 0) { - ctx->SslError = 1; - ctx->ResetBuffers(); - Disconnect(); - return res; - } - ctx->CachedSession.Destroy(); - - matrixSslSetCertValidator(Ssl, CertChecker, ctx); - - // now it's time to perform handshake - sslBuf_t outsock; - outsock.buf = outsock.start = outsock.end = BufAlloc->Alloc(); - outsock.size = SSL_MAX_BUF_SIZE; - - res = matrixSslEncodeClientHello(Ssl, &outsock, 0); - if (res) { - TErrorLogger::Write("TSslSocketHandler::Connect: internal error %i\n", res); - BufAlloc->Free(outsock.buf); - ctx->SslError = 1; - ctx->ResetBuffers(); - Disconnect(); - return -1; - } - - if (!TSocketHandler::send(outsock.start, outsock.end - outsock.start)) { - BufAlloc->Free(outsock.buf); - ctx->SslError = 1; - ctx->ResetBuffers(); - Disconnect(); - return -1; - } - BufAlloc->Free(outsock.buf); - - // SslRead will handle handshake and is suppozed to return 0 - int status, rc; - int ncalls = 10; // FIXME: maybe it's better to check time - while (true) { - rc = SslRead(ctx, nullptr, 0, &status); - if (rc == 0) { - if (status == SSLSOCKET_EOF || status == SSLSOCKET_CLOSE_NOTIFY) { - ctx->SslError = 1; - ctx->ResetBuffers(); - Disconnect(); - return -1; - } - if (matrixSslHandshakeIsComplete(Ssl)) - break; - if (--ncalls <= 0) { - TErrorLogger::Write("TSslSocketHandler::Connect: handshake too long (server wants multiple handshakes maybe)\n"); - ctx->SslError = 1; - ctx->ResetBuffers(); - Disconnect(); - return -1; - } - continue; - } else if (rc > 0) { - TErrorLogger::Write("TSslSocketHandler::Connect: server sent data instead of a handshake\n"); - ctx->SslError = 1; - ctx->ResetBuffers(); - Disconnect(); - return -1; - } else { // rc < 0 - //this is an error - ctx->SslError = 1; - ctx->ResetBuffers(); - Disconnect(); - return -1; - } - } - - return 0; -} - -template <typename TSocketHandler, typename TErrorLogger> -int TSslSocketHandler<TSocketHandler, TErrorLogger>::SslRead(TSocketCtx* ctx, char* buf, int buflen, int* status) { - Y_ASSERT(Initialized); - int remaining, bytes, rc; - - *status = 0; - if (Ssl == nullptr || buflen < 0) - return -1; - - // Return data if we still have cached - if (ctx->InBuf.start < ctx->InBuf.end) { - remaining = (int)(ctx->InBuf.end - ctx->InBuf.start); - if (!buflen) // polling - return remaining; - bytes = Min(buflen, remaining); - memcpy(buf, ctx->InBuf.start, bytes); - ctx->InBuf.start += bytes; - return bytes; - } - - // Pack buffered socket data (if any) so that start is at zero. - if (ctx->InSock.buf < ctx->InSock.start) { - if (ctx->InSock.start == ctx->InSock.end) { - ctx->InSock.start = ctx->InSock.end = ctx->InSock.buf; - } else { - memmove(ctx->InSock.buf, ctx->InSock.start, ctx->InSock.end - ctx->InSock.start); - ctx->InSock.end -= (ctx->InSock.start - ctx->InSock.buf); - ctx->InSock.start = ctx->InSock.buf; - } - } - - bool performRead = false; - bool dontPerformRead = false; - unsigned char error; - unsigned char alertLevel; - unsigned char alertDescription; - - while (true) { - // Read data from socket - if (!dontPerformRead && (performRead || ctx->InSock.end == ctx->InSock.start)) { - performRead = true; - bytes = TSocketHandler::read((void*)ctx->InSock.end, (ctx->InSock.buf + ctx->InSock.size) - ctx->InSock.end); - if (bytes == SOCKET_ERROR) { - *status = errno; - return -1; - } - if (bytes == 0) { - *status = SSLSOCKET_EOF; - return 0; - } - ctx->InSock.end += bytes; - } - dontPerformRead = false; - - error = 0; - alertLevel = 0; - alertDescription = 0; - - ctx->InBuf.start = ctx->InBuf.end = ctx->InBuf.buf; - rc = matrixSslDecode(Ssl, &ctx->InSock, &ctx->InBuf, &error, &alertLevel, &alertDescription); - - switch (rc) { - // Successfully decoded a record that did not return data or require a response. - case SSL_SUCCESS: - return 0; - - case SSL_PROCESS_DATA: - rc = (int)(ctx->InBuf.end - ctx->InBuf.start); - if (!buflen) - return rc; - rc = Min(rc, buflen); - memcpy(buf, ctx->InBuf.start, rc); - ctx->InBuf.start += rc; - return rc; - - case SSL_SEND_RESPONSE: - if (!TSocketHandler::send(ctx->InBuf.start, ctx->InBuf.end - ctx->InBuf.start)) { - *status = errno; - return -1; - } - ctx->InBuf.start = ctx->InBuf.end = ctx->InBuf.buf; - return 0; - - case SSL_ERROR: - if (ctx->InBuf.start < ctx->InBuf.end) - TSocketHandler::send(ctx->InBuf.start, ctx->InBuf.end - ctx->InBuf.start); - ctx->InBuf.start = ctx->InBuf.end = ctx->InBuf.buf; - ctx->SslError = 1; - return -1; - - case SSL_ALERT: - if (alertDescription == SSL_ALERT_CLOSE_NOTIFY) { - *status = SSLSOCKET_CLOSE_NOTIFY; - ctx->InBuf.start = ctx->InBuf.end = ctx->InBuf.buf; - return 0; - } - ctx->InBuf.start = ctx->InBuf.end = ctx->InBuf.buf; - ctx->SslError = 1; - return -1; - - case SSL_PARTIAL: - if (ctx->InSock.start == ctx->InSock.buf && ctx->InSock.end == (ctx->InSock.buf + ctx->InSock.size)) { - ctx->InSock.start = ctx->InSock.end = ctx->InSock.buf; - ctx->SslError = 1; - return -1; - } - if (!performRead) { - performRead = 1; - ctx->InBuf.start = ctx->InBuf.end = ctx->InBuf.buf; - continue; - } else { - ctx->InBuf.start = ctx->InBuf.end = ctx->InBuf.buf; - return 0; - } - - case SSL_FULL: - ctx->InBuf.start = ctx->InBuf.end = ctx->InBuf.buf; - ctx->SslError = 1; - return -1; - } - } - - return 0; -} - -template <typename TSocketHandler, typename TErrorLogger> -int TSslSocketHandler<TSocketHandler, TErrorLogger>::SslWrite(TSocketCtx* ctx, const char* buf, int len, int* status) { - Y_ASSERT(Initialized); - if (len <= 0) - return len ? -1 : 0; - int rc; - *status = 0; - - sslBuf_t outsock; - outsock.size = SSL_MAX_BUF_SIZE; - outsock.start = outsock.end = outsock.buf = BufAlloc->Alloc(); - - size_t remaining = len; - while (remaining) { - size_t l = Min<size_t>(remaining, SSL_MAX_PLAINTEXT_LEN); - rc = matrixSslEncode(Ssl, (const unsigned char*)buf, l, &outsock); - if (rc <= 0) { - TErrorLogger::Write("TSslSocketHandler::SslWrite: internal error: %u\n", rc); - BufAlloc->Free(outsock.buf); - ctx->SslError = 1; - return -1; - } - rc = TSocketHandler::send(outsock.start, outsock.end - outsock.start); - if (!rc) { - *status = errno; - BufAlloc->Free(outsock.buf); - return -1; - } - remaining -= l; - buf += l; - outsock.start = outsock.end = outsock.buf; - } - BufAlloc->Free(outsock.buf); - return len; -} diff --git a/library/cpp/langmask/README.md b/library/cpp/langmask/README.md deleted file mode 100644 index efb6cb93134..00000000000 --- a/library/cpp/langmask/README.md +++ /dev/null @@ -1,4 +0,0 @@ -Здесь представлен класс [`TLangMask`](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/langmask/langmask.h) для битовой маски [enum'ов с языками](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/langs). - -Определено несколько [стандартных языковых масок](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/langmask/langmask.h?rev=r6913473#L64-69), в основном используемых в индексаторе. -Имеются [функции](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/langmask/serialization/langmask.h) для сериализации/десериализации языковых масок. diff --git a/library/cpp/langmask/langmask.cpp b/library/cpp/langmask/langmask.cpp deleted file mode 100644 index 19c34268649..00000000000 --- a/library/cpp/langmask/langmask.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include "langmask.h" - -#include <util/generic/hash.h> -#include <util/generic/singleton.h> -#include <util/string/split.h> -#include <util/string/strip.h> -#include <util/system/compiler.h> - -#include <array> - -namespace NLanguageMasks { - namespace { - struct TScriptMapX: public TScriptMap { - TScriptMapX() { - for (size_t i = 0; i != LANG_MAX; ++i) { - ELanguage language = static_cast<ELanguage>(i); - if (!UnknownLanguage(language)) - (*this)[ScriptByLanguage(language)].SafeSet(language); - } - } - }; - } - - const TScriptMap& ScriptMap() { - return *Singleton<TScriptMapX>(); - } - - const TLangMask& CyrillicLanguagesExt() { - return ScriptMap().find(SCRIPT_CYRILLIC)->second; - } - - const TLangMask& LatinLanguages() { - return ScriptMap().find(SCRIPT_LATIN)->second; - } - - const TLangMask& SameScriptLanguages(EScript scr) { - static const TLangMask empty; - TScriptMap::const_iterator it = ScriptMap().find(scr); - return ScriptMap().end() == it ? empty : it->second; - } - - TLangMask SameScriptLanguages(TLangMask src) { - TLangMask dst; - for (auto lg : src) { - TScriptMap::const_iterator it = ScriptMap().find(ScriptByLanguage(lg)); - if (ScriptMap().end() != it) { - dst |= it->second; - src &= ~it->second; // don't need others using the same script - } - } - return dst; - } - - template <typename T> - TLangMask CreateFromListImpl(const TString& list, T langGetter) { - TLangMask result; - TVector<TString> langVector; - StringSplitter(list).Split(',').SkipEmpty().Collect(&langVector); - for (const auto& i : langVector) { - ELanguage lang = langGetter(Strip(i).data()); - if (lang == LANG_MAX) - ythrow yexception() << "Unknown language: " << i; - result.SafeSet(lang); - } - return result; - } - - TLangMask CreateFromList(const TString& list) { - return CreateFromListImpl(list, LanguageByNameStrict); - } - - TLangMask SafeCreateFromList(const TString& list) { - return CreateFromListImpl(list, LanguageByName); - } - - TString ToString(const TLangMask& langMask) { - if (langMask.Empty()) - return NameByLanguage(LANG_UNK); - TString result; - for (auto lang : langMask) { - if (!!result) - result += ","; - result += NameByLanguage(lang); - } - return result; - } -} - -namespace { - struct TNewLanguageEnumToOldLanguageHelper { - TNewLanguageEnumToOldLanguageHelper() { - static const TOldLanguageEncoder::TLanguageId LI_UNKNOWN = 0x00000000; // special code - shall be zero - static const TOldLanguageEncoder::TLanguageId LI_ENGLISH = 0x00000001; - static const TOldLanguageEncoder::TLanguageId LI_RUSSIAN = 0x00000002; - static const TOldLanguageEncoder::TLanguageId LI_POLISH = 0x00000004; - static const TOldLanguageEncoder::TLanguageId LI_UKRAINIAN = 0x00000008; - static const TOldLanguageEncoder::TLanguageId LI_GERMAN = 0x00000010; - static const TOldLanguageEncoder::TLanguageId LI_FRENCH = 0x00000020; - // Beware: a hole should be left at 0x40 - 0x80, - // to prevent overlap with CC_UPPERCASE / CC_TITLECASE - static const TOldLanguageEncoder::TLanguageId LI_HUNGARIAN = 0x00000100; - // static const TOldLanguageEncoder::TLanguageId LI_UKRAINIAN_ABBYY = 0x00000200; - static const TOldLanguageEncoder::TLanguageId LI_ITALIAN = 0x00000400; - static const TOldLanguageEncoder::TLanguageId LI_BELORUSSIAN = 0x00000800; - static const TOldLanguageEncoder::TLanguageId LI_KAZAKH = 0x00008000; - - Direct[LANG_UNK] = LI_UNKNOWN; - Direct[LANG_ENG] = LI_ENGLISH; - Direct[LANG_RUS] = LI_RUSSIAN; - Direct[LANG_POL] = LI_POLISH; - Direct[LANG_UKR] = LI_UKRAINIAN; - Direct[LANG_GER] = LI_GERMAN; - Direct[LANG_FRE] = LI_FRENCH; - Direct[LANG_HUN] = LI_HUNGARIAN; - // Direct[] = LI_UKRAINIAN_ABBYY; - Direct[LANG_ITA] = LI_ITALIAN; - Direct[LANG_BEL] = LI_BELORUSSIAN; - Direct[LANG_KAZ] = LI_KAZAKH; - - for (auto i = Direct.size(); i > 0; --i) { - Reverse[Direct[i - 1]] = static_cast<ELanguage>(i - 1); - } - - Y_ENSURE(LANG_UNK == Reverse.find(LI_UNKNOWN)->second, "Must be equal"); - } - - THashMap< ::TOldLanguageEncoder::TLanguageId, ELanguage> Reverse; - std::array< ::TOldLanguageEncoder::TLanguageId, static_cast<size_t>(LANG_MAX)> Direct; - }; -} - -TOldLanguageEncoder::TLanguageId TOldLanguageEncoder::ToOld(ELanguage l) { - const auto& helper = Default<TNewLanguageEnumToOldLanguageHelper>(); - if (Y_UNLIKELY(static_cast<size_t>(l) >= helper.Direct.size())) { - l = LANG_UNK; - } - - return helper.Direct[l]; -} - -ELanguage TOldLanguageEncoder::FromOld1(TOldLanguageEncoder::TLanguageId l) { - const auto& helper = Default<TNewLanguageEnumToOldLanguageHelper>(); - const auto it = helper.Reverse.find(l); - if (Y_UNLIKELY(it == helper.Reverse.end())) { - return LANG_UNK; - } - - return it->second; -} diff --git a/library/cpp/langmask/langmask.h b/library/cpp/langmask/langmask.h deleted file mode 100644 index 96608bbe217..00000000000 --- a/library/cpp/langmask/langmask.h +++ /dev/null @@ -1,120 +0,0 @@ -#pragma once - -#include <library/cpp/enumbitset/enumbitset.h> -#include <library/cpp/langs/langs.h> - -#include <util/generic/fwd.h> - -typedef TSfEnumBitSet<ELanguage, static_cast<ELanguage>(LANG_UNK + 1), LANG_MAX> TLangMask; - -// Useful language sets -namespace NLanguageMasks { - using TScriptMap = THashMap<EScript, TLangMask>; - - const TScriptMap& ScriptMap(); - - inline const TLangMask& BasicLanguages() { - const static TLangMask ret(LANG_ENG, LANG_RUS, LANG_UKR); - return ret; - } - inline const TLangMask& DefaultRequestLanguages() { - const static TLangMask ret = BasicLanguages() | TLangMask(LANG_KAZ, LANG_BEL, LANG_TAT); - return ret; - } - inline const TLangMask& AllLanguages() { - const static TLangMask ret = ~TLangMask() & ~TLangMask(LANG_BASIC_ENG, LANG_BASIC_RUS); - return ret; - } - inline const TLangMask& CyrillicLanguages() { - const static TLangMask ret = TLangMask(LANG_RUS, LANG_UKR, LANG_BEL); - return ret; - } - const TLangMask& CyrillicLanguagesExt(); - const TLangMask& LatinLanguages(); - inline const TLangMask& LemmasInIndex() { - const static TLangMask ret = TLangMask(LANG_RUS, LANG_ENG, LANG_UKR, LANG_TUR) | - TLangMask(LANG_BASIC_RUS, LANG_BASIC_ENG); - return ret; - } - inline const TLangMask& NoBastardsInSearch() { - const static TLangMask ret = ~LemmasInIndex(); - return ret; - } - - TLangMask SameScriptLanguages(TLangMask mask); - - inline TLangMask RestrictLangMaskWithSameScripts(const TLangMask& mask, const TLangMask& by) { - return mask & ~SameScriptLanguages(by); - } - - const TLangMask& SameScriptLanguages(EScript scr); - - inline TLangMask OtherSameScriptLanguages(const TLangMask& mask) { - return ~mask & SameScriptLanguages(mask); - } - - //List is string with list of languages names splinted by ','. - TLangMask CreateFromList(const TString& list); // throws exception on unknown name - TLangMask SafeCreateFromList(const TString& list); // ignore unknown names - - TString ToString(const TLangMask& langMask); - -} - -#define LI_BASIC_LANGUAGES NLanguageMasks::BasicLanguages() -#define LI_DEFAULT_REQUEST_LANGUAGES NLanguageMasks::DefaultRequestLanguages() -#define LI_ALL_LANGUAGES NLanguageMasks::AllLanguages() -#define LI_CYRILLIC_LANGUAGES NLanguageMasks::CyrillicLanguages() -#define LI_CYRILLIC_LANGUAGES_EXT NLanguageMasks::CyrillicLanguagesExt() -#define LI_LATIN_LANGUAGES NLanguageMasks::LatinLanguages() - -// Casing and composition of a word. Used in bitwise unions. -using TCharCategory = long; -const TCharCategory CC_EMPTY = 0x0000; -const TCharCategory CC_ALPHA = 0x0001; -const TCharCategory CC_NMTOKEN = 0x0002; -const TCharCategory CC_NUMBER = 0x0004; -const TCharCategory CC_NUTOKEN = 0x0008; -// Beware: CC_ASCII .. CC_TITLECASE shall occupy bits 4 to 6. Don't move them. -const TCharCategory CC_ASCII = 0x0010; -const TCharCategory CC_NONASCII = 0x0020; -const TCharCategory CC_TITLECASE = 0x0040; -const TCharCategory CC_UPPERCASE = 0x0080; -const TCharCategory CC_LOWERCASE = 0x0100; -const TCharCategory CC_MIXEDCASE = 0x0200; -const TCharCategory CC_COMPOUND = 0x0400; -const TCharCategory CC_HAS_DIACRITIC = 0x0800; -const TCharCategory CC_DIFFERENT_ALPHABET = 0x1000; - -const TCharCategory CC_WHOLEMASK = 0x1FFF; - -struct TOldLanguageEncoder { - typedef long TLanguageId; - -public: - static TLanguageId ToOld(ELanguage l); - - static ELanguage FromOld1(TLanguageId l); - - static TLanguageId ToOld(const TLangMask& lm) { - TLanguageId ret = 0; - for (ELanguage lg : lm) { - TLanguageId id = ToOld(lg); - ret |= id; - } - return ret; - } - - static TLangMask FromOld(TLanguageId lm) { - static const TLanguageId allLangMask = TLanguageId(-1) & ~(0x40 | 0x80); - static const size_t numBits = sizeof(TLanguageId) * CHAR_BIT; - TLangMask ret; - lm &= allLangMask; - for (size_t i = 1; i < numBits; ++i) { - TLanguageId id = TLanguageId(1) << (i - 1); - if (lm & id) - ret.SafeSet(FromOld1(id)); - } - return ret; - } -}; diff --git a/library/cpp/langmask/proto/langmask.proto b/library/cpp/langmask/proto/langmask.proto deleted file mode 100644 index be23ecfbba4..00000000000 --- a/library/cpp/langmask/proto/langmask.proto +++ /dev/null @@ -1,6 +0,0 @@ -package NProto; - -message TLangMask { - repeated uint32 Bits = 1; // binary - optional string Names = 2; // human readable -} diff --git a/library/cpp/langs/README.md b/library/cpp/langs/README.md deleted file mode 100644 index 537ae31e1bb..00000000000 --- a/library/cpp/langs/README.md +++ /dev/null @@ -1,8 +0,0 @@ -Здесь описаны константы для [языков](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/langs/langs.h) и [письменностей](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/langs/scripts.h) (скриптов в терминах Unicode). - -В терминах этих констант языков работают [документная](https://a.yandex-team.ru/arc/trunk/arcadia/kernel/recshell/recshell.h) и [запросная](https://a.yandex-team.ru/arc/trunk/arcadia/dict/recognize/queryrec) распознавалки языка. - -Имеется [набор функций](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/langs/langs.h?rev=r6909333#L142-214) для преобразования констант в двухбуквенный или трехбуквенный код и обратного получения константы по строке с учетом синонимов. Есть [функции](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/langs/langs.h?rev=r6909333#L216-217) для определения письменности по языку и по символу). - -В списке констант представлены не все языки и письменности, а лишь те, которые представляли интерес для поиска Яндекса и машинного перевода. -Имеется несколько псевдоязыков типа `LANG_UZB_CYR` или `LANG_KAZ_LAT`. diff --git a/library/cpp/langs/generated/uniscripts.cpp b/library/cpp/langs/generated/uniscripts.cpp deleted file mode 100644 index 59cc6a70c25..00000000000 --- a/library/cpp/langs/generated/uniscripts.cpp +++ /dev/null @@ -1,458 +0,0 @@ -// Generated from http://www.unicode.org/Public/UNIDATA/Scripts.txt -// The best way to alter this file is to modify uniscripts.py -#include <library/cpp/langs/langs.h> -#include <util/system/yassert.h> - -#include <cstring> - -namespace NCharsetInternal { - struct TScriptRange { - EScript Script; - wchar32 Start; - wchar32 End; - }; - - const TScriptRange ScriptRanges[] = { - { SCRIPT_ETHIOPIC, 0x1200, 0x1248 }, - { SCRIPT_ETHIOPIC, 0x124A, 0x124D }, - { SCRIPT_ETHIOPIC, 0x1250, 0x1256 }, - { SCRIPT_ETHIOPIC, 0x1258, 0x1258 }, - { SCRIPT_ETHIOPIC, 0x125A, 0x125D }, - { SCRIPT_ETHIOPIC, 0x1260, 0x1288 }, - { SCRIPT_ETHIOPIC, 0x128A, 0x128D }, - { SCRIPT_ETHIOPIC, 0x1290, 0x12B0 }, - { SCRIPT_ETHIOPIC, 0x12B2, 0x12B5 }, - { SCRIPT_ETHIOPIC, 0x12B8, 0x12BE }, - { SCRIPT_ETHIOPIC, 0x12C0, 0x12C0 }, - { SCRIPT_ETHIOPIC, 0x12C2, 0x12C5 }, - { SCRIPT_ETHIOPIC, 0x12C8, 0x12D6 }, - { SCRIPT_ETHIOPIC, 0x12D8, 0x1310 }, - { SCRIPT_ETHIOPIC, 0x1312, 0x1315 }, - { SCRIPT_ETHIOPIC, 0x1318, 0x135A }, - { SCRIPT_ETHIOPIC, 0x135D, 0x137C }, - { SCRIPT_ETHIOPIC, 0x1380, 0x1399 }, - { SCRIPT_ETHIOPIC, 0x2D80, 0x2D96 }, - { SCRIPT_ETHIOPIC, 0x2DA0, 0x2DA6 }, - { SCRIPT_ETHIOPIC, 0x2DA8, 0x2DAE }, - { SCRIPT_ETHIOPIC, 0x2DB0, 0x2DB6 }, - { SCRIPT_ETHIOPIC, 0x2DB8, 0x2DBE }, - { SCRIPT_ETHIOPIC, 0x2DC0, 0x2DC6 }, - { SCRIPT_ETHIOPIC, 0x2DC8, 0x2DCE }, - { SCRIPT_ETHIOPIC, 0x2DD0, 0x2DD6 }, - { SCRIPT_ETHIOPIC, 0x2DD8, 0x2DDE }, - { SCRIPT_ETHIOPIC, 0xAB01, 0xAB06 }, - { SCRIPT_ETHIOPIC, 0xAB09, 0xAB0E }, - { SCRIPT_ETHIOPIC, 0xAB11, 0xAB16 }, - { SCRIPT_ETHIOPIC, 0xAB20, 0xAB26 }, - { SCRIPT_ETHIOPIC, 0xAB28, 0xAB2E }, - { SCRIPT_ARABIC, 0x600, 0x604 }, - { SCRIPT_ARABIC, 0x606, 0x60B }, - { SCRIPT_ARABIC, 0x60D, 0x61A }, - { SCRIPT_ARABIC, 0x61E, 0x61E }, - { SCRIPT_ARABIC, 0x620, 0x63F }, - { SCRIPT_ARABIC, 0x641, 0x64A }, - { SCRIPT_ARABIC, 0x656, 0x66F }, - { SCRIPT_ARABIC, 0x671, 0x6DC }, - { SCRIPT_ARABIC, 0x6DE, 0x6FF }, - { SCRIPT_ARABIC, 0x750, 0x77F }, - { SCRIPT_ARABIC, 0x8A0, 0x8B4 }, - { SCRIPT_ARABIC, 0x8B6, 0x8BD }, - { SCRIPT_ARABIC, 0x8D4, 0x8E1 }, - { SCRIPT_ARABIC, 0x8E3, 0x8FF }, - { SCRIPT_ARABIC, 0xFB50, 0xFBC1 }, - { SCRIPT_ARABIC, 0xFBD3, 0xFD3D }, - { SCRIPT_ARABIC, 0xFD50, 0xFD8F }, - { SCRIPT_ARABIC, 0xFD92, 0xFDC7 }, - { SCRIPT_ARABIC, 0xFDF0, 0xFDFD }, - { SCRIPT_ARABIC, 0xFE70, 0xFE74 }, - { SCRIPT_ARABIC, 0xFE76, 0xFEFC }, - { SCRIPT_MONGOLIAN, 0x1800, 0x1801 }, - { SCRIPT_MONGOLIAN, 0x1804, 0x1804 }, - { SCRIPT_MONGOLIAN, 0x1806, 0x180E }, - { SCRIPT_MONGOLIAN, 0x1810, 0x1819 }, - { SCRIPT_MONGOLIAN, 0x1820, 0x1877 }, - { SCRIPT_MONGOLIAN, 0x1880, 0x18AA }, - { SCRIPT_TAMIL, 0xB82, 0xB83 }, - { SCRIPT_TAMIL, 0xB85, 0xB8A }, - { SCRIPT_TAMIL, 0xB8E, 0xB90 }, - { SCRIPT_TAMIL, 0xB92, 0xB95 }, - { SCRIPT_TAMIL, 0xB99, 0xB9A }, - { SCRIPT_TAMIL, 0xB9C, 0xB9C }, - { SCRIPT_TAMIL, 0xB9E, 0xB9F }, - { SCRIPT_TAMIL, 0xBA3, 0xBA4 }, - { SCRIPT_TAMIL, 0xBA8, 0xBAA }, - { SCRIPT_TAMIL, 0xBAE, 0xBB9 }, - { SCRIPT_TAMIL, 0xBBE, 0xBC2 }, - { SCRIPT_TAMIL, 0xBC6, 0xBC8 }, - { SCRIPT_TAMIL, 0xBCA, 0xBCD }, - { SCRIPT_TAMIL, 0xBD0, 0xBD0 }, - { SCRIPT_TAMIL, 0xBD7, 0xBD7 }, - { SCRIPT_TAMIL, 0xBE6, 0xBFA }, - { SCRIPT_GUJARATI, 0xA81, 0xA83 }, - { SCRIPT_GUJARATI, 0xA85, 0xA8D }, - { SCRIPT_GUJARATI, 0xA8F, 0xA91 }, - { SCRIPT_GUJARATI, 0xA93, 0xAA8 }, - { SCRIPT_GUJARATI, 0xAAA, 0xAB0 }, - { SCRIPT_GUJARATI, 0xAB2, 0xAB3 }, - { SCRIPT_GUJARATI, 0xAB5, 0xAB9 }, - { SCRIPT_GUJARATI, 0xABC, 0xAC5 }, - { SCRIPT_GUJARATI, 0xAC7, 0xAC9 }, - { SCRIPT_GUJARATI, 0xACB, 0xACD }, - { SCRIPT_GUJARATI, 0xAD0, 0xAD0 }, - { SCRIPT_GUJARATI, 0xAE0, 0xAE3 }, - { SCRIPT_GUJARATI, 0xAE6, 0xAF1 }, - { SCRIPT_GUJARATI, 0xAF9, 0xAF9 }, - { SCRIPT_MALAYALAM, 0xD01, 0xD03 }, - { SCRIPT_MALAYALAM, 0xD05, 0xD0C }, - { SCRIPT_MALAYALAM, 0xD0E, 0xD10 }, - { SCRIPT_MALAYALAM, 0xD12, 0xD3A }, - { SCRIPT_MALAYALAM, 0xD3D, 0xD44 }, - { SCRIPT_MALAYALAM, 0xD46, 0xD48 }, - { SCRIPT_MALAYALAM, 0xD4A, 0xD4F }, - { SCRIPT_MALAYALAM, 0xD54, 0xD63 }, - { SCRIPT_MALAYALAM, 0xD66, 0xD7F }, - { SCRIPT_ARMENIAN, 0x531, 0x556 }, - { SCRIPT_ARMENIAN, 0x559, 0x55F }, - { SCRIPT_ARMENIAN, 0x561, 0x587 }, - { SCRIPT_ARMENIAN, 0x58A, 0x58A }, - { SCRIPT_ARMENIAN, 0x58D, 0x58F }, - { SCRIPT_ARMENIAN, 0xFB13, 0xFB17 }, - { SCRIPT_HANGUL, 0x1100, 0x11FF }, - { SCRIPT_HANGUL, 0x302E, 0x302F }, - { SCRIPT_HANGUL, 0x3131, 0x318E }, - { SCRIPT_HANGUL, 0x3200, 0x321E }, - { SCRIPT_HANGUL, 0x3260, 0x327E }, - { SCRIPT_HANGUL, 0xA960, 0xA97C }, - { SCRIPT_HANGUL, 0xAC00, 0xD7A3 }, - { SCRIPT_HANGUL, 0xD7B0, 0xD7C6 }, - { SCRIPT_HANGUL, 0xD7CB, 0xD7FB }, - { SCRIPT_HANGUL, 0xFFA0, 0xFFBE }, - { SCRIPT_HANGUL, 0xFFC2, 0xFFC7 }, - { SCRIPT_HANGUL, 0xFFCA, 0xFFCF }, - { SCRIPT_HANGUL, 0xFFD2, 0xFFD7 }, - { SCRIPT_HANGUL, 0xFFDA, 0xFFDC }, - { SCRIPT_GURMUKHI, 0xA01, 0xA03 }, - { SCRIPT_GURMUKHI, 0xA05, 0xA0A }, - { SCRIPT_GURMUKHI, 0xA0F, 0xA10 }, - { SCRIPT_GURMUKHI, 0xA13, 0xA28 }, - { SCRIPT_GURMUKHI, 0xA2A, 0xA30 }, - { SCRIPT_GURMUKHI, 0xA32, 0xA33 }, - { SCRIPT_GURMUKHI, 0xA35, 0xA36 }, - { SCRIPT_GURMUKHI, 0xA38, 0xA39 }, - { SCRIPT_GURMUKHI, 0xA3C, 0xA3C }, - { SCRIPT_GURMUKHI, 0xA3E, 0xA42 }, - { SCRIPT_GURMUKHI, 0xA47, 0xA48 }, - { SCRIPT_GURMUKHI, 0xA4B, 0xA4D }, - { SCRIPT_GURMUKHI, 0xA51, 0xA51 }, - { SCRIPT_GURMUKHI, 0xA59, 0xA5C }, - { SCRIPT_GURMUKHI, 0xA5E, 0xA5E }, - { SCRIPT_GURMUKHI, 0xA66, 0xA75 }, - { SCRIPT_CYRILLIC, 0x400, 0x484 }, - { SCRIPT_CYRILLIC, 0x487, 0x52F }, - { SCRIPT_CYRILLIC, 0x1C80, 0x1C88 }, - { SCRIPT_CYRILLIC, 0x1D2B, 0x1D2B }, - { SCRIPT_CYRILLIC, 0x1D78, 0x1D78 }, - { SCRIPT_CYRILLIC, 0x2DE0, 0x2DFF }, - { SCRIPT_CYRILLIC, 0xA640, 0xA69F }, - { SCRIPT_CYRILLIC, 0xFE2E, 0xFE2F }, - { SCRIPT_DEVANAGARI, 0x900, 0x950 }, - { SCRIPT_DEVANAGARI, 0x953, 0x963 }, - { SCRIPT_DEVANAGARI, 0x966, 0x97F }, - { SCRIPT_DEVANAGARI, 0xA8E0, 0xA8FD }, - { SCRIPT_HEBREW, 0x591, 0x5C7 }, - { SCRIPT_HEBREW, 0x5D0, 0x5EA }, - { SCRIPT_HEBREW, 0x5F0, 0x5F4 }, - { SCRIPT_HEBREW, 0xFB1D, 0xFB36 }, - { SCRIPT_HEBREW, 0xFB38, 0xFB3C }, - { SCRIPT_HEBREW, 0xFB3E, 0xFB3E }, - { SCRIPT_HEBREW, 0xFB40, 0xFB41 }, - { SCRIPT_HEBREW, 0xFB43, 0xFB44 }, - { SCRIPT_HEBREW, 0xFB46, 0xFB4F }, - { SCRIPT_THAI, 0xE01, 0xE3A }, - { SCRIPT_THAI, 0xE40, 0xE5B }, - { SCRIPT_SYRIAC, 0x700, 0x70D }, - { SCRIPT_SYRIAC, 0x70F, 0x74A }, - { SCRIPT_SYRIAC, 0x74D, 0x74F }, - { SCRIPT_KANNADA, 0xC80, 0xC83 }, - { SCRIPT_KANNADA, 0xC85, 0xC8C }, - { SCRIPT_KANNADA, 0xC8E, 0xC90 }, - { SCRIPT_KANNADA, 0xC92, 0xCA8 }, - { SCRIPT_KANNADA, 0xCAA, 0xCB3 }, - { SCRIPT_KANNADA, 0xCB5, 0xCB9 }, - { SCRIPT_KANNADA, 0xCBC, 0xCC4 }, - { SCRIPT_KANNADA, 0xCC6, 0xCC8 }, - { SCRIPT_KANNADA, 0xCCA, 0xCCD }, - { SCRIPT_KANNADA, 0xCD5, 0xCD6 }, - { SCRIPT_KANNADA, 0xCDE, 0xCDE }, - { SCRIPT_KANNADA, 0xCE0, 0xCE3 }, - { SCRIPT_KANNADA, 0xCE6, 0xCEF }, - { SCRIPT_KANNADA, 0xCF1, 0xCF2 }, - { SCRIPT_LAO, 0xE81, 0xE82 }, - { SCRIPT_LAO, 0xE84, 0xE84 }, - { SCRIPT_LAO, 0xE87, 0xE88 }, - { SCRIPT_LAO, 0xE8A, 0xE8A }, - { SCRIPT_LAO, 0xE8D, 0xE8D }, - { SCRIPT_LAO, 0xE94, 0xE97 }, - { SCRIPT_LAO, 0xE99, 0xE9F }, - { SCRIPT_LAO, 0xEA1, 0xEA3 }, - { SCRIPT_LAO, 0xEA5, 0xEA5 }, - { SCRIPT_LAO, 0xEA7, 0xEA7 }, - { SCRIPT_LAO, 0xEAA, 0xEAB }, - { SCRIPT_LAO, 0xEAD, 0xEB9 }, - { SCRIPT_LAO, 0xEBB, 0xEBD }, - { SCRIPT_LAO, 0xEC0, 0xEC4 }, - { SCRIPT_LAO, 0xEC6, 0xEC6 }, - { SCRIPT_LAO, 0xEC8, 0xECD }, - { SCRIPT_LAO, 0xED0, 0xED9 }, - { SCRIPT_LAO, 0xEDC, 0xEDF }, - { SCRIPT_TELUGU, 0xC00, 0xC03 }, - { SCRIPT_TELUGU, 0xC05, 0xC0C }, - { SCRIPT_TELUGU, 0xC0E, 0xC10 }, - { SCRIPT_TELUGU, 0xC12, 0xC28 }, - { SCRIPT_TELUGU, 0xC2A, 0xC39 }, - { SCRIPT_TELUGU, 0xC3D, 0xC44 }, - { SCRIPT_TELUGU, 0xC46, 0xC48 }, - { SCRIPT_TELUGU, 0xC4A, 0xC4D }, - { SCRIPT_TELUGU, 0xC55, 0xC56 }, - { SCRIPT_TELUGU, 0xC58, 0xC5A }, - { SCRIPT_TELUGU, 0xC60, 0xC63 }, - { SCRIPT_TELUGU, 0xC66, 0xC6F }, - { SCRIPT_TELUGU, 0xC78, 0xC7F }, - { SCRIPT_KHMER, 0x1780, 0x17DD }, - { SCRIPT_KHMER, 0x17E0, 0x17E9 }, - { SCRIPT_KHMER, 0x17F0, 0x17F9 }, - { SCRIPT_KHMER, 0x19E0, 0x19FF }, - { SCRIPT_LATIN, 0x41, 0x5A }, - { SCRIPT_LATIN, 0x61, 0x7A }, - { SCRIPT_LATIN, 0xAA, 0xAA }, - { SCRIPT_LATIN, 0xBA, 0xBA }, - { SCRIPT_LATIN, 0xC0, 0xD6 }, - { SCRIPT_LATIN, 0xD8, 0xF6 }, - { SCRIPT_LATIN, 0xF8, 0x2B8 }, - { SCRIPT_LATIN, 0x2E0, 0x2E4 }, - { SCRIPT_LATIN, 0x1D00, 0x1D25 }, - { SCRIPT_LATIN, 0x1D2C, 0x1D5C }, - { SCRIPT_LATIN, 0x1D62, 0x1D65 }, - { SCRIPT_LATIN, 0x1D6B, 0x1D77 }, - { SCRIPT_LATIN, 0x1D79, 0x1DBE }, - { SCRIPT_LATIN, 0x1E00, 0x1EFF }, - { SCRIPT_LATIN, 0x2071, 0x2071 }, - { SCRIPT_LATIN, 0x207F, 0x207F }, - { SCRIPT_LATIN, 0x2090, 0x209C }, - { SCRIPT_LATIN, 0x212A, 0x212B }, - { SCRIPT_LATIN, 0x2132, 0x2132 }, - { SCRIPT_LATIN, 0x214E, 0x214E }, - { SCRIPT_LATIN, 0x2160, 0x2188 }, - { SCRIPT_LATIN, 0x2C60, 0x2C7F }, - { SCRIPT_LATIN, 0xA722, 0xA787 }, - { SCRIPT_LATIN, 0xA78B, 0xA7AE }, - { SCRIPT_LATIN, 0xA7B0, 0xA7B7 }, - { SCRIPT_LATIN, 0xA7F7, 0xA7FF }, - { SCRIPT_LATIN, 0xAB30, 0xAB5A }, - { SCRIPT_LATIN, 0xAB5C, 0xAB64 }, - { SCRIPT_LATIN, 0xFB00, 0xFB06 }, - { SCRIPT_LATIN, 0xFF21, 0xFF3A }, - { SCRIPT_LATIN, 0xFF41, 0xFF5A }, - { SCRIPT_TIBETAN, 0xF00, 0xF47 }, - { SCRIPT_TIBETAN, 0xF49, 0xF6C }, - { SCRIPT_TIBETAN, 0xF71, 0xF97 }, - { SCRIPT_TIBETAN, 0xF99, 0xFBC }, - { SCRIPT_TIBETAN, 0xFBE, 0xFCC }, - { SCRIPT_TIBETAN, 0xFCE, 0xFD4 }, - { SCRIPT_TIBETAN, 0xFD9, 0xFDA }, - { SCRIPT_MYANMAR, 0x1000, 0x109F }, - { SCRIPT_MYANMAR, 0xA9E0, 0xA9FE }, - { SCRIPT_MYANMAR, 0xAA60, 0xAA7F }, - { SCRIPT_OTHER, 0x2EA, 0x2EB }, - { SCRIPT_OTHER, 0x7C0, 0x7FA }, - { SCRIPT_OTHER, 0x800, 0x82D }, - { SCRIPT_OTHER, 0x830, 0x83E }, - { SCRIPT_OTHER, 0x840, 0x85B }, - { SCRIPT_OTHER, 0x85E, 0x85E }, - { SCRIPT_OTHER, 0x13A0, 0x13F5 }, - { SCRIPT_OTHER, 0x13F8, 0x13FD }, - { SCRIPT_OTHER, 0x1400, 0x169C }, - { SCRIPT_OTHER, 0x1700, 0x170C }, - { SCRIPT_OTHER, 0x170E, 0x1714 }, - { SCRIPT_OTHER, 0x1720, 0x1734 }, - { SCRIPT_OTHER, 0x1740, 0x1753 }, - { SCRIPT_OTHER, 0x1760, 0x176C }, - { SCRIPT_OTHER, 0x176E, 0x1770 }, - { SCRIPT_OTHER, 0x1772, 0x1773 }, - { SCRIPT_OTHER, 0x18B0, 0x18F5 }, - { SCRIPT_OTHER, 0x1900, 0x191E }, - { SCRIPT_OTHER, 0x1920, 0x192B }, - { SCRIPT_OTHER, 0x1930, 0x193B }, - { SCRIPT_OTHER, 0x1940, 0x1940 }, - { SCRIPT_OTHER, 0x1944, 0x196D }, - { SCRIPT_OTHER, 0x1970, 0x1974 }, - { SCRIPT_OTHER, 0x1980, 0x19AB }, - { SCRIPT_OTHER, 0x19B0, 0x19C9 }, - { SCRIPT_OTHER, 0x19D0, 0x19DA }, - { SCRIPT_OTHER, 0x19DE, 0x19DF }, - { SCRIPT_OTHER, 0x1A00, 0x1A1B }, - { SCRIPT_OTHER, 0x1A1E, 0x1A5E }, - { SCRIPT_OTHER, 0x1A60, 0x1A7C }, - { SCRIPT_OTHER, 0x1A7F, 0x1A89 }, - { SCRIPT_OTHER, 0x1A90, 0x1A99 }, - { SCRIPT_OTHER, 0x1AA0, 0x1AAD }, - { SCRIPT_OTHER, 0x1B00, 0x1B4B }, - { SCRIPT_OTHER, 0x1B50, 0x1B7C }, - { SCRIPT_OTHER, 0x1B80, 0x1BF3 }, - { SCRIPT_OTHER, 0x1BFC, 0x1C37 }, - { SCRIPT_OTHER, 0x1C3B, 0x1C49 }, - { SCRIPT_OTHER, 0x1C4D, 0x1C7F }, - { SCRIPT_OTHER, 0x1CC0, 0x1CC7 }, - { SCRIPT_OTHER, 0x2800, 0x28FF }, - { SCRIPT_OTHER, 0x2C00, 0x2C2E }, - { SCRIPT_OTHER, 0x2C30, 0x2C5E }, - { SCRIPT_OTHER, 0x2D30, 0x2D67 }, - { SCRIPT_OTHER, 0x2D6F, 0x2D70 }, - { SCRIPT_OTHER, 0x2D7F, 0x2D7F }, - { SCRIPT_OTHER, 0x3105, 0x312D }, - { SCRIPT_OTHER, 0x31A0, 0x31BA }, - { SCRIPT_OTHER, 0xA000, 0xA48C }, - { SCRIPT_OTHER, 0xA490, 0xA4C6 }, - { SCRIPT_OTHER, 0xA4D0, 0xA62B }, - { SCRIPT_OTHER, 0xA6A0, 0xA6F7 }, - { SCRIPT_OTHER, 0xA800, 0xA82B }, - { SCRIPT_OTHER, 0xA840, 0xA877 }, - { SCRIPT_OTHER, 0xA880, 0xA8C5 }, - { SCRIPT_OTHER, 0xA8CE, 0xA8D9 }, - { SCRIPT_OTHER, 0xA900, 0xA92D }, - { SCRIPT_OTHER, 0xA92F, 0xA953 }, - { SCRIPT_OTHER, 0xA95F, 0xA95F }, - { SCRIPT_OTHER, 0xA980, 0xA9CD }, - { SCRIPT_OTHER, 0xA9D0, 0xA9D9 }, - { SCRIPT_OTHER, 0xA9DE, 0xA9DF }, - { SCRIPT_OTHER, 0xAA00, 0xAA36 }, - { SCRIPT_OTHER, 0xAA40, 0xAA4D }, - { SCRIPT_OTHER, 0xAA50, 0xAA59 }, - { SCRIPT_OTHER, 0xAA5C, 0xAA5F }, - { SCRIPT_OTHER, 0xAA80, 0xAAC2 }, - { SCRIPT_OTHER, 0xAADB, 0xAAF6 }, - { SCRIPT_OTHER, 0xAB70, 0xABED }, - { SCRIPT_OTHER, 0xABF0, 0xABF9 }, - { SCRIPT_HAN, 0x2E80, 0x2E99 }, - { SCRIPT_HAN, 0x2E9B, 0x2EF3 }, - { SCRIPT_HAN, 0x2F00, 0x2FD5 }, - { SCRIPT_HAN, 0x3005, 0x3005 }, - { SCRIPT_HAN, 0x3007, 0x3007 }, - { SCRIPT_HAN, 0x3021, 0x3029 }, - { SCRIPT_HAN, 0x3038, 0x303B }, - { SCRIPT_HAN, 0x3400, 0x4DB5 }, - { SCRIPT_HAN, 0x4E00, 0x9FD5 }, - { SCRIPT_HAN, 0xF900, 0xFA6D }, - { SCRIPT_HAN, 0xFA70, 0xFAD9 }, - { SCRIPT_THAANA, 0x780, 0x7B1 }, - { SCRIPT_HIRAGANA, 0x3041, 0x3096 }, - { SCRIPT_HIRAGANA, 0x309D, 0x309F }, - { SCRIPT_KATAKANA, 0x30A1, 0x30FA }, - { SCRIPT_KATAKANA, 0x30FD, 0x30FF }, - { SCRIPT_KATAKANA, 0x31F0, 0x31FF }, - { SCRIPT_KATAKANA, 0x32D0, 0x32FE }, - { SCRIPT_KATAKANA, 0x3300, 0x3357 }, - { SCRIPT_KATAKANA, 0xFF66, 0xFF6F }, - { SCRIPT_KATAKANA, 0xFF71, 0xFF9D }, - { SCRIPT_ORIYA, 0xB01, 0xB03 }, - { SCRIPT_ORIYA, 0xB05, 0xB0C }, - { SCRIPT_ORIYA, 0xB0F, 0xB10 }, - { SCRIPT_ORIYA, 0xB13, 0xB28 }, - { SCRIPT_ORIYA, 0xB2A, 0xB30 }, - { SCRIPT_ORIYA, 0xB32, 0xB33 }, - { SCRIPT_ORIYA, 0xB35, 0xB39 }, - { SCRIPT_ORIYA, 0xB3C, 0xB44 }, - { SCRIPT_ORIYA, 0xB47, 0xB48 }, - { SCRIPT_ORIYA, 0xB4B, 0xB4D }, - { SCRIPT_ORIYA, 0xB56, 0xB57 }, - { SCRIPT_ORIYA, 0xB5C, 0xB5D }, - { SCRIPT_ORIYA, 0xB5F, 0xB63 }, - { SCRIPT_ORIYA, 0xB66, 0xB77 }, - { SCRIPT_BENGALI, 0x980, 0x983 }, - { SCRIPT_BENGALI, 0x985, 0x98C }, - { SCRIPT_BENGALI, 0x98F, 0x990 }, - { SCRIPT_BENGALI, 0x993, 0x9A8 }, - { SCRIPT_BENGALI, 0x9AA, 0x9B0 }, - { SCRIPT_BENGALI, 0x9B2, 0x9B2 }, - { SCRIPT_BENGALI, 0x9B6, 0x9B9 }, - { SCRIPT_BENGALI, 0x9BC, 0x9C4 }, - { SCRIPT_BENGALI, 0x9C7, 0x9C8 }, - { SCRIPT_BENGALI, 0x9CB, 0x9CE }, - { SCRIPT_BENGALI, 0x9D7, 0x9D7 }, - { SCRIPT_BENGALI, 0x9DC, 0x9DD }, - { SCRIPT_BENGALI, 0x9DF, 0x9E3 }, - { SCRIPT_BENGALI, 0x9E6, 0x9FB }, - { SCRIPT_RUNIC, 0x16A0, 0x16EA }, - { SCRIPT_RUNIC, 0x16EE, 0x16F8 }, - { SCRIPT_SINHALA, 0xD82, 0xD83 }, - { SCRIPT_SINHALA, 0xD85, 0xD96 }, - { SCRIPT_SINHALA, 0xD9A, 0xDB1 }, - { SCRIPT_SINHALA, 0xDB3, 0xDBB }, - { SCRIPT_SINHALA, 0xDBD, 0xDBD }, - { SCRIPT_SINHALA, 0xDC0, 0xDC6 }, - { SCRIPT_SINHALA, 0xDCA, 0xDCA }, - { SCRIPT_SINHALA, 0xDCF, 0xDD4 }, - { SCRIPT_SINHALA, 0xDD6, 0xDD6 }, - { SCRIPT_SINHALA, 0xDD8, 0xDDF }, - { SCRIPT_SINHALA, 0xDE6, 0xDEF }, - { SCRIPT_SINHALA, 0xDF2, 0xDF4 }, - { SCRIPT_COPTIC, 0x3E2, 0x3EF }, - { SCRIPT_COPTIC, 0x2C80, 0x2CF3 }, - { SCRIPT_COPTIC, 0x2CF9, 0x2CFF }, - { SCRIPT_GEORGIAN, 0x10A0, 0x10C5 }, - { SCRIPT_GEORGIAN, 0x10C7, 0x10C7 }, - { SCRIPT_GEORGIAN, 0x10CD, 0x10CD }, - { SCRIPT_GEORGIAN, 0x10D0, 0x10FA }, - { SCRIPT_GEORGIAN, 0x10FC, 0x10FF }, - { SCRIPT_GEORGIAN, 0x2D00, 0x2D25 }, - { SCRIPT_GEORGIAN, 0x2D27, 0x2D27 }, - { SCRIPT_GEORGIAN, 0x2D2D, 0x2D2D }, - { SCRIPT_GREEK, 0x370, 0x373 }, - { SCRIPT_GREEK, 0x375, 0x377 }, - { SCRIPT_GREEK, 0x37A, 0x37D }, - { SCRIPT_GREEK, 0x37F, 0x37F }, - { SCRIPT_GREEK, 0x384, 0x384 }, - { SCRIPT_GREEK, 0x386, 0x386 }, - { SCRIPT_GREEK, 0x388, 0x38A }, - { SCRIPT_GREEK, 0x38C, 0x38C }, - { SCRIPT_GREEK, 0x38E, 0x3A1 }, - { SCRIPT_GREEK, 0x3A3, 0x3E1 }, - { SCRIPT_GREEK, 0x3F0, 0x3FF }, - { SCRIPT_GREEK, 0x1D26, 0x1D2A }, - { SCRIPT_GREEK, 0x1D5D, 0x1D61 }, - { SCRIPT_GREEK, 0x1D66, 0x1D6A }, - { SCRIPT_GREEK, 0x1DBF, 0x1DBF }, - { SCRIPT_GREEK, 0x1F00, 0x1F15 }, - { SCRIPT_GREEK, 0x1F18, 0x1F1D }, - { SCRIPT_GREEK, 0x1F20, 0x1F45 }, - { SCRIPT_GREEK, 0x1F48, 0x1F4D }, - { SCRIPT_GREEK, 0x1F50, 0x1F57 }, - { SCRIPT_GREEK, 0x1F59, 0x1F59 }, - { SCRIPT_GREEK, 0x1F5B, 0x1F5B }, - { SCRIPT_GREEK, 0x1F5D, 0x1F5D }, - { SCRIPT_GREEK, 0x1F5F, 0x1F7D }, - { SCRIPT_GREEK, 0x1F80, 0x1FB4 }, - { SCRIPT_GREEK, 0x1FB6, 0x1FC4 }, - { SCRIPT_GREEK, 0x1FC6, 0x1FD3 }, - { SCRIPT_GREEK, 0x1FD6, 0x1FDB }, - { SCRIPT_GREEK, 0x1FDD, 0x1FEF }, - { SCRIPT_GREEK, 0x1FF2, 0x1FF4 }, - { SCRIPT_GREEK, 0x1FF6, 0x1FFE }, - { SCRIPT_GREEK, 0x2126, 0x2126 }, - { SCRIPT_GREEK, 0xAB65, 0xAB65 }, - }; - - void InitScriptData(ui8 data[], size_t len) { - memset (data, 0, len * sizeof(ui8)); - for (auto range : ScriptRanges) { - Y_ASSERT(range.Start <= range.End); - Y_ASSERT((unsigned)range.Script < 0x100); - size_t end = range.End; - if (end >= len) - end = len; - for (size_t j = range.Start; j <= end; ++j) { - data[j] = (ui8)range.Script; - } - } - } -} diff --git a/library/cpp/langs/langs.cpp b/library/cpp/langs/langs.cpp deleted file mode 100644 index 2c508e16022..00000000000 --- a/library/cpp/langs/langs.cpp +++ /dev/null @@ -1,330 +0,0 @@ -#include "langs.h" - -#include <library/cpp/digest/lower_case/hash_ops.h> - -#include <util/generic/array_size.h> -#include <util/generic/hash.h> -#include <util/generic/singleton.h> -#include <util/generic/strbuf.h> -#include <util/generic/yexception.h> -#include <util/system/defaults.h> - -#include <array> -#include <cctype> - -/* - * define language by ELanguage - */ - -namespace { - struct TLanguageNameAndEnum { - ELanguage Language; - EScript Script; - const char* EnglishName; - const char* BiblioName; - const char* IsoName; - const char* Synonyms; - }; - - const TLanguageNameAndEnum LanguageNameAndEnum[] = { - {LANG_UNK, SCRIPT_OTHER, "Unknown", "unk", "mis", nullptr}, - {LANG_RUS, SCRIPT_CYRILLIC, "Russian", "rus", "ru", "ru-RU"}, - {LANG_ENG, SCRIPT_LATIN, "English", "eng", "en", "en-US, en-GB, en-CA, en-NZ, en-AU"}, - {LANG_POL, SCRIPT_LATIN, "Polish", "pol", "pl", nullptr}, - {LANG_HUN, SCRIPT_LATIN, "Hungarian", "hun", "hu", nullptr}, - {LANG_UKR, SCRIPT_CYRILLIC, "Ukrainian", "ukr", "uk", "uk-UA"}, - {LANG_GER, SCRIPT_LATIN, "German", "ger", "de", "deu"}, - {LANG_FRE, SCRIPT_LATIN, "French", "fre", "fr", "fra, frn, fr-FR, fr-CA"}, - {LANG_TAT, SCRIPT_CYRILLIC, "Tatar", "tat", "tt", nullptr}, - {LANG_BEL, SCRIPT_CYRILLIC, "Belarusian", "bel", "be", "blr, Belorussian"}, - {LANG_KAZ, SCRIPT_CYRILLIC, "Kazakh", "kaz", "kk", "kk-Cyrl"}, - {LANG_ALB, SCRIPT_LATIN, "Albanian", "alb", "sq", nullptr}, - {LANG_SPA, SCRIPT_LATIN, "Spanish", "spa", "es", nullptr}, - {LANG_ITA, SCRIPT_LATIN, "Italian", "ita", "it", nullptr}, - {LANG_ARM, SCRIPT_ARMENIAN, "Armenian", "arm", "hy", "hye"}, - {LANG_DAN, SCRIPT_LATIN, "Danish", "dan", "da", nullptr}, - {LANG_POR, SCRIPT_LATIN, "Portuguese", "por", "pt", nullptr}, - {LANG_ICE, SCRIPT_LATIN, "Icelandic", "ice", "is", "isl"}, - {LANG_SLO, SCRIPT_LATIN, "Slovak", "slo", "sk", "slk"}, - {LANG_SLV, SCRIPT_LATIN, "Slovene", "slv", "sl", "Slovenian"}, - {LANG_DUT, SCRIPT_LATIN, "Dutch", "dut", "nl", "nld"}, - {LANG_BUL, SCRIPT_CYRILLIC, "Bulgarian", "bul", "bg", nullptr}, - {LANG_CAT, SCRIPT_LATIN, "Catalan", "cat", "ca", nullptr}, - {LANG_HRV, SCRIPT_LATIN, "Croatian", "hrv", "hr", "scr"}, - {LANG_CZE, SCRIPT_LATIN, "Czech", "cze", "cs", "ces"}, - {LANG_GRE, SCRIPT_GREEK, "Greek", "gre", "el", "ell"}, - {LANG_HEB, SCRIPT_HEBREW, "Hebrew", "heb", "he", "iw"}, // 'iw' is old ISO-639 code - {LANG_NOR, SCRIPT_LATIN, "Norwegian", "nor", "no", nullptr}, - {LANG_MAC, SCRIPT_CYRILLIC, "Macedonian", "mac", "mk", nullptr}, - {LANG_SWE, SCRIPT_LATIN, "Swedish", "swe", "sv", nullptr}, - {LANG_KOR, SCRIPT_HANGUL, "Korean", "kor", "ko", nullptr}, - {LANG_LAT, SCRIPT_LATIN, "Latin", "lat", "la", nullptr}, - {LANG_BASIC_RUS, SCRIPT_CYRILLIC, "Basic Russian", "basic-rus", "bas-ru", nullptr}, - {LANG_BOS, SCRIPT_LATIN, "Bosnian", "bos", "bs", nullptr}, - {LANG_MLT, SCRIPT_LATIN, "Maltese", "mlt", "mt", nullptr}, - - {LANG_EMPTY, SCRIPT_OTHER, "Empty", "empty", nullptr, nullptr}, - {LANG_UNK_LAT, SCRIPT_LATIN, "Unknown Latin", "unklat", nullptr, nullptr}, - {LANG_UNK_CYR, SCRIPT_CYRILLIC, "Unknown Cyrillic", "unkcyr", nullptr, nullptr}, - {LANG_UNK_ALPHA, SCRIPT_OTHER, "Unknown Alpha", "unkalpha", nullptr, nullptr}, - - {LANG_FIN, SCRIPT_LATIN, "Finnish", "fin", "fi", nullptr}, - {LANG_EST, SCRIPT_LATIN, "Estonian", "est", "et", nullptr}, - {LANG_LAV, SCRIPT_LATIN, "Latvian", "lav", "lv", nullptr}, - {LANG_LIT, SCRIPT_LATIN, "Lithuanian", "lit", "lt", nullptr}, - {LANG_BAK, SCRIPT_CYRILLIC, "Bashkir", "bak", "ba", nullptr}, - {LANG_TUR, SCRIPT_LATIN, "Turkish", "tur", "tr", nullptr}, - {LANG_RUM, SCRIPT_LATIN, "Romanian", "rum", "ro", "ron"}, - {LANG_MON, SCRIPT_CYRILLIC, "Mongolian", "mon", "mn", nullptr}, - {LANG_UZB, SCRIPT_LATIN, "Uzbek", "uzb", "uz", "uz-Latn"}, - {LANG_KIR, SCRIPT_CYRILLIC, "Kirghiz", "kir", "ky", "Kyrgyz"}, - {LANG_TGK, SCRIPT_CYRILLIC, "Tajik", "tgk", "tg", nullptr}, - {LANG_TUK, SCRIPT_LATIN, "Turkmen", "tuk", "tk", nullptr}, - {LANG_SRP, SCRIPT_CYRILLIC, "Serbian", "srp", "sr", nullptr}, - {LANG_AZE, SCRIPT_LATIN, "Azerbaijani", "aze", "az", "Azeri"}, - {LANG_BASIC_ENG, SCRIPT_LATIN, "Basic English", "basic-eng", "bas-en", nullptr}, - {LANG_GEO, SCRIPT_GEORGIAN, "Georgian", "geo", "ka", "kat"}, - {LANG_ARA, SCRIPT_ARABIC, "Arabic", "ara", "ar", nullptr}, - {LANG_PER, SCRIPT_ARABIC, "Persian", "per", "fa", "fas"}, - {LANG_CHU, SCRIPT_CYRILLIC, "Church Slavonic", "chu", "cu", nullptr}, - {LANG_CHI, SCRIPT_HAN, "Chinese", "chi", "zh", "zho"}, - {LANG_JPN, SCRIPT_HIRAGANA, "Japanese", "jpn", "ja", nullptr}, - {LANG_IND, SCRIPT_LATIN, "Indonesian", "ind", "id", "in"}, // 'in' is old ISO-639 code - {LANG_MAY, SCRIPT_LATIN, "Malay", "may", "ms", "msa"}, - {LANG_THA, SCRIPT_THAI, "Thai", "tha", "th", nullptr}, - {LANG_VIE, SCRIPT_LATIN, "Vietnamese", "vie", "vi", nullptr}, - {LANG_GLE, SCRIPT_LATIN, "Irish", "gle", "ga", nullptr}, - {LANG_TGL, SCRIPT_LATIN, "Tagalog", "tgl", "tl", "fil"}, - {LANG_HIN, SCRIPT_DEVANAGARI, "Hindi", "hin", "hi", nullptr}, - {LANG_AFR, SCRIPT_LATIN, "Afrikaans", "afr", "af", nullptr}, - {LANG_URD, SCRIPT_ARABIC, "Urdu", "urd", "ur", nullptr}, - {LANG_MYA, SCRIPT_MYANMAR, "Burmese", "mya", "my", nullptr}, - {LANG_KHM, SCRIPT_KHMER, "Khmer", "khm", "km", nullptr}, - {LANG_LAO, SCRIPT_LAO, "Lao", "lao", "lo", "Laotian, Laothian"}, - {LANG_TAM, SCRIPT_TAMIL, "Tamil", "tam", "ta", nullptr}, - {LANG_BEN, SCRIPT_BENGALI, "Bengali", "ben", "bn", nullptr}, - {LANG_GUJ, SCRIPT_GUJARATI, "Gujarati", "guj", "gu", nullptr}, - {LANG_KAN, SCRIPT_KANNADA, "Kannada", "kan", "kn", nullptr}, - {LANG_PAN, SCRIPT_GURMUKHI, "Punjabi", "pan", "pa", nullptr}, - {LANG_SIN, SCRIPT_SINHALA, "Sinhalese", "sin", "si", nullptr}, - {LANG_SWA, SCRIPT_LATIN, "Swahili", "swa", "sw", nullptr}, - {LANG_BAQ, SCRIPT_LATIN, "Basque", "baq", "eu", "eus"}, - {LANG_WEL, SCRIPT_LATIN, "Welsh", "wel", "cy", "cym"}, - {LANG_GLG, SCRIPT_LATIN, "Galician", "glg", "gl", nullptr}, - {LANG_HAT, SCRIPT_LATIN, "Haitian Creole", "hat", "ht", "Haitian"}, - {LANG_MLG, SCRIPT_LATIN, "Malagasy", "mlg", "mg", nullptr}, - {LANG_CHV, SCRIPT_CYRILLIC, "Chuvash", "chv", "cv", nullptr}, - {LANG_UDM, SCRIPT_CYRILLIC, "Udmurt", "udm", "udm", nullptr}, - {LANG_KPV, SCRIPT_CYRILLIC, "Komi-Zyrian", "kpv", "kv", "Komi, kom"}, - {LANG_MHR, SCRIPT_CYRILLIC, "Meadow Mari", "mhr", "mhr", "EasternMari, Mari, chm"}, - {LANG_SJN, SCRIPT_LATIN, "Sindarin", "sjn", "sjn", nullptr}, - {LANG_MRJ, SCRIPT_CYRILLIC, "Hill Mari", "mrj", "mrj", "WesternMari"}, - {LANG_KOI, SCRIPT_CYRILLIC, "Komi-Permyak", "koi", "koi", nullptr}, - {LANG_LTZ, SCRIPT_LATIN, "Luxembourgish", "ltz", "lb", "Luxemburgish"}, - {LANG_GLA, SCRIPT_LATIN, "Scottish Gaelic", "gla", "gd", "Gaelic"}, - {LANG_CEB, SCRIPT_LATIN, "Cebuano", "ceb", "ceb", "Bisaya, Binisaya, Visayan"}, - {LANG_PUS, SCRIPT_ARABIC, "Pashto", "pus", "ps", nullptr}, - {LANG_KMR, SCRIPT_LATIN, "Kurmanji", "kmr", "ku", "Kurdish"}, - {LANG_AMH, SCRIPT_ETHIOPIC, "Amharic", "amh", "am", nullptr}, - {LANG_ZUL, SCRIPT_LATIN, "Zulu", "zul", "zu", nullptr}, - {LANG_IBO, SCRIPT_LATIN, "Igbo", "ibo", "ig", "Ibo"}, - {LANG_YOR, SCRIPT_LATIN, "Yoruba", "yor", "yo", nullptr}, - {LANG_COS, SCRIPT_LATIN, "Corsican", "cos", "co", nullptr}, - {LANG_XHO, SCRIPT_LATIN, "Xhosa", "xho", "xh", nullptr}, - {LANG_JAV, SCRIPT_LATIN, "Javanese", "jav", "jv", nullptr}, // Also SCRIPT_JAVANESE and SCRIPT_ARABIC - {LANG_NEP, SCRIPT_DEVANAGARI, "Nepali", "nep", "ne", nullptr}, - {LANG_SND, SCRIPT_DEVANAGARI, "Sindhi", "snd", "sd", nullptr}, // Also SCRIPT_ARABIC and SCRIPT_GUJARATI - {LANG_SOM, SCRIPT_LATIN, "Somali", "som", "so", nullptr}, - {LANG_EPO, SCRIPT_LATIN, "Esperanto", "epo", "eo", nullptr}, - {LANG_TEL, SCRIPT_TELUGU, "Telugu", "tel", "te", nullptr}, - {LANG_MAR, SCRIPT_DEVANAGARI, "Marathi", "mar", "mr", nullptr}, - {LANG_HAU, SCRIPT_LATIN, "Hausa", "hau", "ha", nullptr}, - {LANG_YID, SCRIPT_HEBREW, "Yiddish", "yid", "yi", nullptr}, - {LANG_MAL, SCRIPT_MALAYALAM, "Malayalam", "mal", "ml", nullptr}, - {LANG_MAO, SCRIPT_LATIN, "Maori", "mao", "mi", "mri"}, - {LANG_SUN, SCRIPT_LATIN, "Sundanese", "sun", "su", nullptr}, - {LANG_PAP, SCRIPT_LATIN, "Papiamento", "pap", "pap", nullptr}, - {LANG_UZB_CYR, SCRIPT_CYRILLIC, "Cyrillic Uzbek", "uzbcyr", "uz-Cyrl", nullptr}, // https://tools.ietf.org/html/rfc5646 - {LANG_TRANSCR_IPA, SCRIPT_LATIN, "International Phonetic Alphabet Transcription", "ipa", "tr-ipa", nullptr}, - {LANG_EMJ, SCRIPT_LATIN, "Emoji", "emj", "emj", nullptr}, - {LANG_UYG, SCRIPT_ARABIC, "Uyghur", "uig", "ug", nullptr}, - {LANG_BRE, SCRIPT_LATIN, "Breton", "bre", "br", nullptr}, - {LANG_SAH, SCRIPT_CYRILLIC, "Yakut", "sah", "sah", nullptr}, - {LANG_KAZ_LAT, SCRIPT_LATIN, "Latin Kazakh", "kazlat", "kk-Latn", nullptr}, - }; - - static_assert(static_cast<size_t>(LANG_MAX) == Y_ARRAY_SIZE(LanguageNameAndEnum), "Size doesn't match"); - - class TLanguagesMap { - private: - static const char* const EMPTY_NAME; - - using TNamesHash = THashMap<TStringBuf, ELanguage, TCIOps, TCIOps>; - TNamesHash Hash; - - using TNamesArray = std::array<const char*, static_cast<size_t>(LANG_MAX)>; - TNamesArray BiblioNames; - TNamesArray IsoNames; - TNamesArray FullNames; - - using TScripts = std::array<EScript, static_cast<size_t>(LANG_MAX)>; - TScripts Scripts; - - private: - void AddNameToHash(const TStringBuf& name, ELanguage language) { - if (Hash.find(name) != Hash.end()) { - Y_ASSERT(Hash.find(name)->second == language); - return; - } - - Hash[name] = language; - } - - void AddName(const char* name, ELanguage language, TNamesArray& names) { - if (name == nullptr || strlen(name) == 0) - return; - - Y_ASSERT(names[language] == EMPTY_NAME); - names[language] = name; - - AddNameToHash(name, language); - } - - void AddSynonyms(const char* syn, ELanguage language) { - static const char* del = " ,;"; - if (!syn) - return; - while (*syn) { - size_t len = strcspn(syn, del); - AddNameToHash(TStringBuf(syn, len), language); - syn += len; - while (*syn && strchr(del, *syn)) - ++syn; - } - } - - public: - TLanguagesMap() { - BiblioNames.fill(EMPTY_NAME); - IsoNames.fill(EMPTY_NAME); - FullNames.fill(EMPTY_NAME); - Scripts.fill(SCRIPT_OTHER); - - for (size_t i = 0; i != Y_ARRAY_SIZE(LanguageNameAndEnum); ++i) { - const TLanguageNameAndEnum& val = LanguageNameAndEnum[i]; - - ELanguage language = val.Language; - - AddName(val.BiblioName, language, BiblioNames); - AddName(val.IsoName, language, IsoNames); - AddName(val.EnglishName, language, FullNames); - AddSynonyms(val.Synonyms, language); - - if (Scripts[language] == SCRIPT_OTHER) { - Scripts[language] = val.Script; - } - } - } - - public: - inline ELanguage LanguageByName(const TStringBuf& name, ELanguage def) const { - if (!name) - return def; - - TNamesHash::const_iterator i = Hash.find(name); - if (i == Hash.end()) { - // Try to extract the primary language code from constructions like "en-cockney" or "zh_Hant" - size_t dash_pos = name.find_first_of("_-"); - if (dash_pos != TStringBuf::npos) - i = Hash.find(name.substr(0, dash_pos)); - if (i == Hash.end()) - return def; - } - - return i->second; - } - - inline const char* FullNameByLanguage(ELanguage language) const { - if (language < 0 || static_cast<size_t>(language) >= FullNames.size()) - return nullptr; - - return FullNames[language]; - } - inline const char* BiblioNameByLanguage(ELanguage language) const { - if (language < 0 || static_cast<size_t>(language) >= BiblioNames.size()) - return nullptr; - - return BiblioNames[language]; - } - inline const char* IsoNameByLanguage(ELanguage language) const { - if (language < 0 || static_cast<size_t>(language) >= IsoNames.size()) - return nullptr; - - return IsoNames[language]; - } - - inline EScript Script(ELanguage language) const { - return Scripts[language]; - } - }; -} - -const char* const TLanguagesMap::EMPTY_NAME = ""; - -const char* FullNameByLanguage(ELanguage language) { - return Singleton<TLanguagesMap>()->FullNameByLanguage(language); -} -const char* NameByLanguage(ELanguage language) { - return Singleton<TLanguagesMap>()->BiblioNameByLanguage(language); -} -const char* IsoNameByLanguage(ELanguage language) { - return Singleton<TLanguagesMap>()->IsoNameByLanguage(language); -} - -ELanguage LanguageByNameStrict(const TStringBuf& name) { - return Singleton<TLanguagesMap>()->LanguageByName(name, LANG_MAX); -} - -ELanguage LanguageByNameOrDie(const TStringBuf& name) { - ELanguage result = LanguageByNameStrict(name); - if (result == LANG_MAX) { - ythrow yexception() << "LanguageByNameOrDie: invalid language '" << name << "'"; - } - return result; -} - -ELanguage LanguageByName(const TStringBuf& name) { - return Singleton<TLanguagesMap>()->LanguageByName(name, LANG_UNK); -} - -EScript ScriptByLanguage(ELanguage language) { - return Singleton<TLanguagesMap>()->Script(language); -} - -namespace { - const size_t MAX_GLYPH = 0x10000; - class TScriptGlyphIndex { - public: - TScriptGlyphIndex() { - NCharsetInternal::InitScriptData(Data, MAX_GLYPH); - } - - EScript GetGlyphScript(wchar32 glyph) const { - if (glyph >= MAX_GLYPH) - return SCRIPT_UNKNOWN; - return (EScript)Data[glyph]; - } - - private: - ui8 Data[MAX_GLYPH]; - }; -} - -EScript ScriptByGlyph(wchar32 glyph) { - return HugeSingleton<TScriptGlyphIndex>()->GetGlyphScript(glyph); -} - -template <> -void Out<ELanguage>(IOutputStream& o, ELanguage lang) { - o << NameByLanguage(lang); -} diff --git a/library/cpp/langs/langs.h b/library/cpp/langs/langs.h deleted file mode 100644 index 360ab6a8321..00000000000 --- a/library/cpp/langs/langs.h +++ /dev/null @@ -1,229 +0,0 @@ -#pragma once - -#include "scripts.h" - -#include <util/generic/strbuf.h> -#include <util/system/defaults.h> - -#if defined(_win_) -// LANG_LAO is #define in WinNT.h -#undef LANG_LAO -#endif - -// Language names are given according to ISO 639-2/B -// Some languages are not present in ISO 639-2/B. Then ISO 639-3 is used. -// http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes -enum ELanguage { - LANG_UNK = 0, // Unknown - LANG_RUS = 1, // Russian - LANG_ENG = 2, // English - LANG_POL = 3, // Polish - LANG_HUN = 4, // Hungarian - LANG_UKR = 5, // Ukrainian - LANG_GER = 6, // German - LANG_FRE = 7, // French - LANG_TAT = 8, // Tatar - LANG_BEL = 9, // Belarusian - LANG_KAZ = 10, // Kazakh - LANG_ALB = 11, // Albanian - LANG_SPA = 12, // Spanish - LANG_ITA = 13, // Italian - LANG_ARM = 14, // Armenian - LANG_DAN = 15, // Danish - LANG_POR = 16, // Portuguese - LANG_ICE = 17, // Icelandic - LANG_SLO = 18, // Slovak - LANG_SLV = 19, // Slovene - LANG_DUT = 20, // Dutch (Netherlandish language) - LANG_BUL = 21, // Bulgarian - LANG_CAT = 22, // Catalan - LANG_HRV = 23, // Croatian - LANG_CZE = 24, // Czech - LANG_GRE = 25, // Greek - LANG_HEB = 26, // Hebrew - LANG_NOR = 27, // Norwegian - LANG_MAC = 28, // Macedonian - LANG_SWE = 29, // Swedish - LANG_KOR = 30, // Korean - LANG_LAT = 31, // Latin - LANG_BASIC_RUS = 32, // Simplified version of Russian (used at lemmer only) - LANG_BOS = 33, // Bosnian - LANG_MLT = 34, // Maltese - LANG_EMPTY = 35, // Indicate that document is empty - LANG_UNK_LAT = 36, // Any unrecognized latin language - LANG_UNK_CYR = 37, // Any unrecognized cyrillic language - LANG_UNK_ALPHA = 38, // Any unrecognized alphabetic language not fit into previous categories - LANG_FIN = 39, // Finnish - LANG_EST = 40, // Estonian - LANG_LAV = 41, // Latvian - LANG_LIT = 42, // Lithuanian - LANG_BAK = 43, // Bashkir - LANG_TUR = 44, // Turkish - LANG_RUM = 45, // Romanian (also Moldavian) - LANG_MON = 46, // Mongolian - LANG_UZB = 47, // Uzbek - LANG_KIR = 48, // Kirghiz - LANG_TGK = 49, // Tajik - LANG_TUK = 50, // Turkmen - LANG_SRP = 51, // Serbian - LANG_AZE = 52, // Azerbaijani - LANG_BASIC_ENG = 53, // Simplified version of English (used at lemmer only) - LANG_GEO = 54, // Georgian - LANG_ARA = 55, // Arabic - LANG_PER = 56, // Persian - LANG_CHU = 57, // Church Slavonic - LANG_CHI = 58, // Chinese - LANG_JPN = 59, // Japanese - LANG_IND = 60, // Indonesian - LANG_MAY = 61, // Malay - LANG_THA = 62, // Thai - LANG_VIE = 63, // Vietnamese - LANG_GLE = 64, // Irish (Gaelic) - LANG_TGL = 65, // Tagalog (Filipino) - LANG_HIN = 66, // Hindi - LANG_AFR = 67, // Afrikaans - LANG_URD = 68, // Urdu - LANG_MYA = 69, // Burmese - LANG_KHM = 70, // Khmer - LANG_LAO = 71, // Lao - LANG_TAM = 72, // Tamil - LANG_BEN = 73, // Bengali - LANG_GUJ = 74, // Gujarati - LANG_KAN = 75, // Kannada - LANG_PAN = 76, // Punjabi - LANG_SIN = 77, // Sinhalese - LANG_SWA = 78, // Swahili - LANG_BAQ = 79, // Basque - LANG_WEL = 80, // Welsh - LANG_GLG = 81, // Galician - LANG_HAT = 82, // Haitian Creole - LANG_MLG = 83, // Malagasy - LANG_CHV = 84, // Chuvash - LANG_UDM = 85, // Udmurt - LANG_KPV = 86, // Komi-Zyrian - LANG_MHR = 87, // Meadow Mari (Eastern Mari) - LANG_SJN = 88, // Sindarin - LANG_MRJ = 89, // Hill Mari (Western Mari) - LANG_KOI = 90, // Komi-Permyak - LANG_LTZ = 91, // Luxembourgish - LANG_GLA = 92, // Scottish Gaelic - LANG_CEB = 93, // Cebuano - LANG_PUS = 94, // Pashto - LANG_KMR = 95, // Kurmanji - LANG_AMH = 96, // Amharic - LANG_ZUL = 97, // Zulu - LANG_IBO = 98, // Igbo - LANG_YOR = 99, // Yoruba - LANG_COS = 100, // Corsican - LANG_XHO = 101, // Xhosa - LANG_JAV = 102, // Javanese - LANG_NEP = 103, // Nepali - LANG_SND = 104, // Sindhi - LANG_SOM = 105, // Somali - LANG_EPO = 106, // Esperanto - LANG_TEL = 107, // Telugu - LANG_MAR = 108, // Marathi - LANG_HAU = 109, // Hausa - LANG_YID = 110, // Yiddish - LANG_MAL = 111, // Malayalam - LANG_MAO = 112, // Maori - LANG_SUN = 113, // Sundanese - LANG_PAP = 114, // Papiamento - LANG_UZB_CYR = 115, // Cyrillic Uzbek - LANG_TRANSCR_IPA = 116, // International Phonetic Alphabet Transcription - LANG_EMJ = 117, // Emoji - LANG_UYG = 118, // Uyghur - LANG_BRE = 119, // Breton - LANG_SAH = 120, // Yakut - LANG_KAZ_LAT = 121, // Latin Kazakh - LANG_MAX -}; - -/** - * Converts string to corresponding enum. Will try to extract the primary language code from - * constructions like "en-cockney" or "zh_Hant". In case of failure will return `LANG_UNK`. - * - * @param name Language name - * @return Language enum - */ -ELanguage LanguageByName(const TStringBuf& name); - -/** - * Same as `LanguageByName`, but in case of failure will return `LANG_MAX`. - * - * @see LanguageByName - */ -ELanguage LanguageByNameStrict(const TStringBuf& name); - -/** - * Converts language enum to corresponding ISO 639-2/B alpha-3 code. For languages missing in ISO - * standard convertions are: - * - LANG_UNK: "unk" - * - LANG_BASIC_RUS: "basic-rus" - * - LANG_EMPTY: "empty" - * - LANG_UNK_LAT: "unklat" - * - LANG_UNK_CYR: "unkcyr" - * - LANG_UNK_ALPHA: "unkalpha" - * - LANG_BASIC_ENG: "basic-eng" - * - LANG_TRANSCR_IPA "transcr-ipa" - * If language is missing in `ELanguage` or if it is a `LANG_MAX` then return value will be - * `nullptr`. - * - * @param language Language enum - * @return Language ISO 639-2/B alpha-3 code - */ -const char* NameByLanguage(ELanguage language); - -/** - * Converts language enum to corresponding ISO 639-1 alpha-2 code. For languages missing in ISO - * standard convertions are: - * - LANG_UNK: "mis" - * - LANG_BASIC_RUS: "bas-ru" - * - LANG_EMPTY: "" - * - LANG_UNK_LAT: "" - * - LANG_UNK_CYR: "" - * - LANG_UNK_ALPHA: "" - * - LANG_BASIC_ENG: "bas-en" - * - LANG_TRANSCR_IPA "tr-ipa" - * If language is missing in `ELanguage` or if it is a `LANG_MAX` then return value will be - * `nullptr`. - * - * @param language Language enum - * @return Language ISO 639-1 alpha-2 code - */ -const char* IsoNameByLanguage(ELanguage language); - -/** - * Converts language enum to corresponding human-readable language name. E.g. "Russian" for - * `LANG_RUS` or "Basic Russian" for `LANG_BASIC_RUS`. If language is missing in `ELanguage` or if - * it is a `LANG_MAX` then return value will be `nullptr`. - * - * @param language Language enum - */ -const char* FullNameByLanguage(ELanguage language); - -/** - * Same as `LanguageByNameStrict` but in case of failure will throw `yexception`. - * - * @see LanguageByNameStrict - */ -ELanguage LanguageByNameOrDie(const TStringBuf& name); - -constexpr bool UnknownLanguage(const ELanguage language) noexcept { - return language == LANG_UNK || language == LANG_UNK_LAT || language == LANG_UNK_CYR || language == LANG_UNK_ALPHA || language == LANG_EMPTY; -} - -EScript ScriptByLanguage(ELanguage language); -EScript ScriptByGlyph(wchar32 glyph); - -namespace NCharsetInternal { - void InitScriptData(ui8 data[], size_t len); -} - -inline bool LatinScript(ELanguage language) { - return ScriptByLanguage(language) == SCRIPT_LATIN; -} - -inline bool CyrillicScript(ELanguage language) { - return ScriptByLanguage(language) == SCRIPT_CYRILLIC; -} diff --git a/library/cpp/langs/scripts.cpp b/library/cpp/langs/scripts.cpp deleted file mode 100644 index 41cc91d3ce6..00000000000 --- a/library/cpp/langs/scripts.cpp +++ /dev/null @@ -1,158 +0,0 @@ -#include "scripts.h" - -#include <library/cpp/digest/lower_case/hash_ops.h> - -#include <util/generic/hash.h> -#include <util/generic/singleton.h> -#include <util/generic/strbuf.h> -#include <util/generic/yexception.h> -#include <util/system/defaults.h> - -#include <array> - -namespace { - struct TScriptNameAndEnum { - EScript Script; - const char* EnglishName; - const char* IsoName; - }; - - const TScriptNameAndEnum ScriptNameAndEnum[] = { - {SCRIPT_UNKNOWN, "Unknown", "Zzzz"}, - {SCRIPT_LATIN, "Latin", "Latn"}, - {SCRIPT_CYRILLIC, "Cyrillic", "Cyrl"}, - - {SCRIPT_GREEK, "Greek", "Grek"}, - {SCRIPT_ARABIC, "Arabic", "Arab"}, - {SCRIPT_HEBREW, "Hebrew", "Hebr"}, - {SCRIPT_ARMENIAN, "Armenian", "Armn"}, - {SCRIPT_GEORGIAN, "Georgian", "Geor"}, - - {SCRIPT_HAN, "Han", "Hans"}, // We use more common Simpliied variant (as opposed to Traditional 'Hant') - {SCRIPT_KATAKANA, "Katakana", "Kana"}, - {SCRIPT_HIRAGANA, "Hiragana", "Hira"}, - {SCRIPT_HANGUL, "Hangul", "Hang"}, - - {SCRIPT_DEVANAGARI, "Devanagari", "Deva"}, - {SCRIPT_BENGALI, "Bengali", "Beng"}, - {SCRIPT_GUJARATI, "Gujarati", "Gujr"}, - {SCRIPT_GURMUKHI, "Gurmukhi", "Guru"}, - {SCRIPT_KANNADA, "Kannada", "Knda"}, - {SCRIPT_MALAYALAM, "Malayalam", "Mlym"}, - {SCRIPT_ORIYA, "Oriya", "Orya"}, - {SCRIPT_TAMIL, "Tamil", "Taml"}, - {SCRIPT_TELUGU, "Telugu", "Telu"}, - {SCRIPT_THAANA, "Thaana", "Thaa"}, - {SCRIPT_SINHALA, "Sinhala", "Sinh"}, - - {SCRIPT_MYANMAR, "Myanmar", "Mymr"}, - {SCRIPT_THAI, "Thai", "Thai"}, - {SCRIPT_LAO, "Lao", "Laoo"}, - {SCRIPT_KHMER, "Khmer", "Khmr"}, - {SCRIPT_TIBETAN, "Tibetan", "Tibt"}, - {SCRIPT_MONGOLIAN, "Mongolian", "Mong"}, - - {SCRIPT_ETHIOPIC, "Ethiopic", "Ethi"}, - {SCRIPT_RUNIC, "Runic", "Runr"}, - {SCRIPT_COPTIC, "Coptic", "Copt"}, - {SCRIPT_SYRIAC, "Syriac", "Syrc"}, - - {SCRIPT_OTHER, "Other", "Zyyy"}, - }; - - static_assert(static_cast<size_t>(SCRIPT_MAX) == Y_ARRAY_SIZE(ScriptNameAndEnum), "Size doesn't match"); - - class TScriptsMap { - private: - static const char* const EMPTY_NAME; - - using TNamesHash = THashMap<TStringBuf, EScript, TCIOps, TCIOps>; - TNamesHash Hash; - - using TNamesArray = std::array<const char*, static_cast<size_t>(SCRIPT_MAX)>; - TNamesArray IsoNames; - TNamesArray FullNames; - - private: - void AddNameToHash(const TStringBuf& name, EScript script) { - if (Hash.find(name) != Hash.end()) { - Y_ASSERT(Hash.find(name)->second == script); - return; - } - - Hash[name] = script; - } - - void AddName(const char* name, EScript script, TNamesArray& names) { - if (name == nullptr || strlen(name) == 0) - return; - - Y_ASSERT(names[script] == EMPTY_NAME); - names[script] = name; - - AddNameToHash(name, script); - } - - public: - TScriptsMap() { - IsoNames.fill(EMPTY_NAME); - FullNames.fill(EMPTY_NAME); - - for (const auto& val : ScriptNameAndEnum) { - EScript script = val.Script; - - AddName(val.IsoName, script, IsoNames); - AddName(val.EnglishName, script, FullNames); - } - } - - public: - inline EScript ScriptByName(const TStringBuf& name, EScript def) const { - if (!name) - return def; - - TNamesHash::const_iterator i = Hash.find(name); - if (i == Hash.end()) { - return def; - } - - return i->second; - } - - inline const char* FullNameByScript(EScript script) const { - if (script < 0 || static_cast<size_t>(script) >= FullNames.size()) - return nullptr; - - return FullNames[script]; - } - - inline const char* IsoNameByScript(EScript script) const { - if (script < 0 || static_cast<size_t>(script) >= IsoNames.size()) - return nullptr; - - return IsoNames[script]; - } - }; -} - -const char* const TScriptsMap::EMPTY_NAME = ""; - -const char* FullNameByScript(EScript script) { - return Singleton<TScriptsMap>()->FullNameByScript(script); -} - -const char* IsoNameByScript(EScript script) { - return Singleton<TScriptsMap>()->IsoNameByScript(script); -} - -EScript ScriptByName(const TStringBuf& name) { - return Singleton<TScriptsMap>()->ScriptByName(name, SCRIPT_UNKNOWN); -} - -EScript ScriptByNameOrDie(const TStringBuf& name) { - EScript result = ScriptByName(name); - if (result == SCRIPT_UNKNOWN) { - ythrow yexception() << "ScriptByNameOrDie: invalid script '" << name << "'"; - } - return result; -} diff --git a/library/cpp/langs/scripts.h b/library/cpp/langs/scripts.h deleted file mode 100644 index 4c47a33d2cb..00000000000 --- a/library/cpp/langs/scripts.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include <util/generic/strbuf.h> - -// Writing systems, a.k.a. scripts -// -enum EScript { - SCRIPT_UNKNOWN = 0, - SCRIPT_LATIN, - SCRIPT_CYRILLIC, - - SCRIPT_GREEK, - SCRIPT_ARABIC, - SCRIPT_HEBREW, - SCRIPT_ARMENIAN, - SCRIPT_GEORGIAN, - - SCRIPT_HAN, - SCRIPT_KATAKANA, - SCRIPT_HIRAGANA, - SCRIPT_HANGUL, - - SCRIPT_DEVANAGARI, - SCRIPT_BENGALI, - SCRIPT_GUJARATI, - SCRIPT_GURMUKHI, - SCRIPT_KANNADA, - SCRIPT_MALAYALAM, - SCRIPT_ORIYA, - SCRIPT_TAMIL, - SCRIPT_TELUGU, - SCRIPT_THAANA, - SCRIPT_SINHALA, - - SCRIPT_MYANMAR, - SCRIPT_THAI, - SCRIPT_LAO, - SCRIPT_KHMER, - SCRIPT_TIBETAN, - SCRIPT_MONGOLIAN, - - SCRIPT_ETHIOPIC, - SCRIPT_RUNIC, - SCRIPT_COPTIC, - SCRIPT_SYRIAC, - - SCRIPT_OTHER, - SCRIPT_MAX -}; - -// According to ISO 15924 codes. See https://en.wikipedia.org/wiki/ISO_15924 -// -EScript ScriptByName(const TStringBuf& name); -EScript ScriptByNameOrDie(const TStringBuf& name); -const char* IsoNameByScript(EScript script); -const char* FullNameByScript(EScript script); diff --git a/library/cpp/microbdb/align.h b/library/cpp/microbdb/align.h deleted file mode 100644 index 2f8567f1344..00000000000 --- a/library/cpp/microbdb/align.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include <util/system/defaults.h> - -using TDatAlign = int; - -static inline size_t DatFloor(size_t size) { - return (size - 1) & ~(sizeof(TDatAlign) - 1); -} - -static inline size_t DatCeil(size_t size) { - return DatFloor(size) + sizeof(TDatAlign); -} - -static inline void DatSet(void* ptr, size_t size) { - *(TDatAlign*)((char*)ptr + DatFloor(size)) = 0; -} diff --git a/library/cpp/microbdb/compressed.h b/library/cpp/microbdb/compressed.h deleted file mode 100644 index f0c9edfa925..00000000000 --- a/library/cpp/microbdb/compressed.h +++ /dev/null @@ -1,520 +0,0 @@ -#pragma once - -#include <util/stream/zlib.h> - -#include "microbdb.h" -#include "safeopen.h" - -class TCompressedInputFileManip: public TInputFileManip { -public: - inline i64 GetLength() const { - return -1; // Some microbdb logic rely on unknown size of compressed files - } - - inline i64 Seek(i64 offset, int whence) { - i64 oldPos = DoGetPosition(); - i64 newPos = offset; - switch (whence) { - case SEEK_CUR: - newPos += oldPos; - [[fallthrough]]; // Complier happy. Please fix it! - case SEEK_SET: - break; - default: - return -1L; - } - if (oldPos > newPos) { - VerifyRandomAccess(); - DoSeek(0, SEEK_SET, IsStreamOpen()); - oldPos = 0; - } - const size_t bufsize = 1 << 12; - char buf[bufsize]; - for (i64 i = oldPos; i < newPos; i += bufsize) - InputStream->Read(buf, (i + (i64)bufsize < newPos) ? bufsize : (size_t)(newPos - i)); - return newPos; - } - - i64 RealSeek(i64 offset, int whence) { - InputStream.Destroy(); - i64 ret = DoSeek(offset, whence, !!CompressedInput); - if (ret != -1) - DoStreamOpen(DoCreateStream(), true); - return ret; - } - -protected: - IInputStream* CreateStream(const TFile& file) override { - CompressedInput.Reset(new TUnbufferedFileInput(file)); - return DoCreateStream(); - } - inline IInputStream* DoCreateStream() { - return new TZLibDecompress(CompressedInput.Get(), ZLib::GZip); - //return new TLzqDecompress(CompressedInput.Get()); - } - THolder<IInputStream> CompressedInput; -}; - -class TCompressedBufferedInputFileManip: public TCompressedInputFileManip { -protected: - IInputStream* CreateStream(const TFile& file) override { - CompressedInput.Reset(new TFileInput(file, 0x100000)); - return DoCreateStream(); - } -}; - -using TCompressedInputPageFile = TInputPageFileImpl<TCompressedInputFileManip>; -using TCompressedBufferedInputPageFile = TInputPageFileImpl<TCompressedBufferedInputFileManip>; - -template <class TVal> -struct TGzKey { - ui64 Offset; - TVal Key; - - static const ui32 RecordSig = TVal::RecordSig + 0x50495a47; - - TGzKey() { - } - - TGzKey(ui64 offset, const TVal& key) - : Offset(offset) - , Key(key) - { - } - - size_t SizeOf() const { - if (this) - return sizeof(Offset) + ::SizeOf(&Key); - else { - size_t sizeOfKey = ::SizeOf((TVal*)NULL); - return sizeOfKey ? (sizeof(Offset) + sizeOfKey) : 0; - } - } -}; - -template <class TVal> -class TInZIndexFile: protected TInDatFileImpl<TGzKey<TVal>> { - typedef TInDatFileImpl<TGzKey<TVal>> TDatFile; - typedef TGzKey<TVal> TGzVal; - typedef typename TDatFile::TRecIter TRecIter; - typedef typename TRecIter::TPageIter TPageIter; - -public: - TInZIndexFile() - : Index0(nullptr) - { - } - - int Open(const char* fname, size_t pages = 1, int pagesOrBytes = 1, ui32* gotRecordSig = nullptr) { - int ret = TDatFile::Open(fname, pages, pagesOrBytes, gotRecordSig); - if (ret) - return ret; - if (!(Index0 = (TDatPage*)malloc(TPageIter::GetPageSize()))) { - TDatFile::Close(); - return MBDB_NO_MEMORY; - } - if (SizeOf((TGzVal*)NULL)) - RecsOnPage = (TPageIter::GetPageSize() - sizeof(TDatPage)) / DatCeil(SizeOf((TGzVal*)NULL)); - TDatFile::Next(); - memcpy(Index0, TPageIter::Current(), TPageIter::GetPageSize()); - return 0; - } - - int Close() { - free(Index0); - Index0 = NULL; - return TDatFile::Close(); - } - - inline int GetError() const { - return TDatFile::GetError(); - } - - int FindKey(const TVal* akey, const typename TExtInfoType<TVal>::TResult* = NULL) { - assert(IsOpen()); - if (!SizeOf((TVal*)NULL)) - return FindVszKey(akey); - int pageno; - i64 offset; - FindKeyOnPage(pageno, offset, Index0, akey); - TDatPage* page = TPageIter::GotoPage(pageno + 1); - int num_add = (int)offset; - FindKeyOnPage(pageno, offset, page, akey); - return pageno + num_add; - } - - using TDatFile::IsOpen; - - int FindVszKey(const TVal* akey, const typename TExtInfoType<TVal>::TResult* = NULL) { - int pageno; - i64 offset; - FindVszKeyOnPage(pageno, offset, Index0, akey); - TDatPage* page = TPageIter::GotoPage(pageno + 1); - int num_add = (int)offset; - FindVszKeyOnPage(pageno, offset, page, akey); - return pageno + num_add; - } - - i64 FindPage(int pageno) { - if (!SizeOf((TVal*)NULL)) - return FindVszPage(pageno); - int recsize = DatCeil(SizeOf((TGzVal*)NULL)); - TDatPage* page = TPageIter::GotoPage(1 + pageno / RecsOnPage); - if (!page) // can happen if pageno is beyond EOF - return -1; - unsigned int localpageno = pageno % RecsOnPage; - if (localpageno >= page->RecNum) // can happen if pageno is beyond EOF - return -1; - TGzVal* v = (TGzVal*)((char*)page + sizeof(TDatPage) + localpageno * recsize); - return v->Offset; - } - - i64 FindVszPage(int pageno) { - TGzVal* cur = (TGzVal*)((char*)Index0 + sizeof(TDatPage)); - TGzVal* prev = cur; - unsigned int n = 0; - while (n < Index0->RecNum && cur->Offset <= (unsigned int)pageno) { - prev = cur; - cur = (TGzVal*)((char*)cur + DatCeil(SizeOf(cur))); - n++; - } - TDatPage* page = TPageIter::GotoPage(n); - unsigned int num_add = (unsigned int)(prev->Offset); - n = 0; - cur = (TGzVal*)((char*)page + sizeof(TDatPage)); - while (n < page->RecNum && n + num_add < (unsigned int)pageno) { - cur = (TGzVal*)((char*)cur + DatCeil(SizeOf(cur))); - n++; - } - if (n == page->RecNum) // can happen if pageno is beyond EOF - return -1; - return cur->Offset; - } - -protected: - void FindKeyOnPage(int& pageno, i64& offset, TDatPage* page, const TVal* Key) { - int left = 0; - int right = page->RecNum - 1; - int recsize = DatCeil(SizeOf((TGzVal*)NULL)); - while (left < right) { - int middle = (left + right) >> 1; - if (((TGzVal*)((char*)page + sizeof(TDatPage) + middle * recsize))->Key < *Key) - left = middle + 1; - else - right = middle; - } - //borders check (left and right) - pageno = (left == 0 || ((TGzVal*)((char*)page + sizeof(TDatPage) + left * recsize))->Key < *Key) ? left : left - 1; - offset = ((TGzVal*)((char*)page + sizeof(TDatPage) + pageno * recsize))->Offset; - } - - void FindVszKeyOnPage(int& pageno, i64& offset, TDatPage* page, const TVal* key) { - TGzVal* cur = (TGzVal*)((char*)page + sizeof(TDatPage)); - ui32 RecordSig = page->RecNum; - i64 tmpoffset = cur->Offset; - for (; RecordSig > 0 && cur->Key < *key; --RecordSig) { - tmpoffset = cur->Offset; - cur = (TGzVal*)((char*)cur + DatCeil(SizeOf(cur))); - } - int idx = page->RecNum - RecordSig - 1; - pageno = (idx >= 0) ? idx : 0; - offset = tmpoffset; - } - - TDatPage* Index0; - int RecsOnPage; -}; - -template <class TKey> -class TCompressedIndexedInputPageFile: public TCompressedInputPageFile { -public: - int GotoPage(int pageno); - -protected: - TInZIndexFile<TKey> KeyFile; -}; - -template <class TVal, class TKey> -class TDirectCompressedInDatFile: public TDirectInDatFile<TVal, TKey, - TInDatFileImpl<TVal, TInputRecordIterator<TVal, - TInputPageIterator<TCompressedIndexedInputPageFile<TKey>>>>> { -}; - -class TCompressedOutputFileManip: public TOutputFileManip { -public: - inline i64 GetLength() const { - return -1; // Some microbdb logic rely on unknown size of compressed files - } - - inline i64 Seek(i64 offset, int whence) { - i64 oldPos = DoGetPosition(); - i64 newPos = offset; - switch (whence) { - case SEEK_CUR: - newPos += oldPos; - [[fallthrough]]; // Compler happy. Please fix it! - case SEEK_SET: - break; - default: - return -1L; - } - if (oldPos > newPos) - return -1L; - - const size_t bufsize = 1 << 12; - char buf[bufsize] = {0}; - for (i64 i = oldPos; i < newPos; i += bufsize) - OutputStream->Write(buf, (i + (i64)bufsize < newPos) ? bufsize : (size_t)(newPos - i)); - return newPos; - } - - i64 RealSeek(i64 offset, int whence) { - OutputStream.Destroy(); - i64 ret = DoSeek(offset, whence, !!CompressedOutput); - if (ret != -1) - DoStreamOpen(DoCreateStream(), true); - return ret; - } - -protected: - IOutputStream* CreateStream(const TFile& file) override { - CompressedOutput.Reset(new TUnbufferedFileOutput(file)); - return DoCreateStream(); - } - inline IOutputStream* DoCreateStream() { - return new TZLibCompress(CompressedOutput.Get(), ZLib::GZip, 1); - } - THolder<IOutputStream> CompressedOutput; -}; - -class TCompressedBufferedOutputFileManip: public TCompressedOutputFileManip { -protected: - IOutputStream* CreateStream(const TFile& file) override { - CompressedOutput.Reset(new TUnbufferedFileOutput(file)); - return DoCreateStream(); - } - inline IOutputStream* DoCreateStream() { - return new TZLibCompress(CompressedOutput.Get(), ZLib::GZip, 1, 0x100000); - } -}; - -using TCompressedOutputPageFile = TOutputPageFileImpl<TCompressedOutputFileManip>; -using TCompressedBufferedOutputPageFile = TOutputPageFileImpl<TCompressedBufferedOutputFileManip>; - -template <class TVal> -class TOutZIndexFile: public TOutDatFileImpl< - TGzKey<TVal>, - TOutputRecordIterator<TGzKey<TVal>, TOutputPageIterator<TOutputPageFile>, TCallbackIndexer>> { - typedef TOutDatFileImpl< - TGzKey<TVal>, - TOutputRecordIterator<TGzKey<TVal>, TOutputPageIterator<TOutputPageFile>, TCallbackIndexer>> - TDatFile; - typedef TOutZIndexFile<TVal> TMyType; - typedef TGzKey<TVal> TGzVal; - typedef typename TDatFile::TRecIter TRecIter; - typedef typename TRecIter::TPageIter TPageIter; - typedef typename TRecIter::TIndexer TIndexer; - -public: - TOutZIndexFile() { - TotalRecNum = 0; - TIndexer::SetCallback(this, DispatchCallback); - } - - int Open(const char* fname, size_t pagesize, size_t pages, int pagesOrBytes = 1) { - int ret = TDatFile::Open(fname, pagesize, pages, pagesOrBytes); - if (ret) - return ret; - if ((ret = TRecIter::GotoPage(1))) - TDatFile::Close(); - return ret; - } - - int Close() { - TPageIter::Unfreeze(); - if (TRecIter::RecNum) - NextPage(TPageIter::Current()); - int ret = 0; - if (Index0.size() && !(ret = TRecIter::GotoPage(0))) { - typename std::vector<TGzVal>::iterator it, end = Index0.end(); - for (it = Index0.begin(); it != end; ++it) - TRecIter::Push(&*it); - ret = (TPageIter::GetPageNum() != 0) ? MBDB_PAGE_OVERFLOW : TPageIter::GetError(); - } - Index0.clear(); - int ret1 = TDatFile::Close(); - return ret ? ret : ret1; - } - -protected: - int TotalRecNum; // should be enough because we have GotoPage(int) - std::vector<TGzVal> Index0; - - void NextPage(const TDatPage* page) { - TGzVal* rec = (TGzVal*)((char*)page + sizeof(TDatPage)); - Index0.push_back(TGzVal(TotalRecNum, rec->Key)); - TotalRecNum += TRecIter::RecNum; - } - - static void DispatchCallback(void* This, const TDatPage* page) { - ((TMyType*)This)->NextPage(page); - } -}; - -template <class TVal, class TKey, class TPageFile = TCompressedOutputPageFile> -class TOutDirectCompressedFileImpl: public TOutDatFileImpl< - TVal, - TOutputRecordIterator<TVal, TOutputPageIterator<TPageFile>, TCallbackIndexer>> { - typedef TOutDatFileImpl< - TVal, - TOutputRecordIterator<TVal, TOutputPageIterator<TPageFile>, TCallbackIndexer>> - TDatFile; - typedef TOutDirectCompressedFileImpl<TVal, TKey, TPageFile> TMyType; - typedef typename TDatFile::TRecIter TRecIter; - typedef typename TRecIter::TPageIter TPageIter; - typedef typename TRecIter::TIndexer TIndexer; - typedef TGzKey<TKey> TMyKey; - typedef TOutZIndexFile<TKey> TKeyFile; - -protected: - using TDatFile::Tell; - -public: - TOutDirectCompressedFileImpl() { - TIndexer::SetCallback(this, DispatchCallback); - } - - int Open(const char* fname, size_t pagesize, size_t ipagesize = 0) { - char iname[FILENAME_MAX]; - int ret; - if (ipagesize == 0) - ipagesize = pagesize; - - ret = TDatFile::Open(fname, pagesize, 1, 1); - ret = ret ? ret : DatNameToIdx(iname, fname); - ret = ret ? ret : KeyFile.Open(iname, ipagesize, 1, 1); - if (ret) - TDatFile::Close(); - return ret; - } - - int Close() { - if (TRecIter::RecNum) - NextPage(TPageIter::Current()); - int ret = KeyFile.Close(); - int ret1 = TDatFile::Close(); - return ret1 ? ret1 : ret; - } - - int GetError() const { - return TDatFile::GetError() ? TDatFile::GetError() : KeyFile.GetError(); - } - -protected: - TKeyFile KeyFile; - - void NextPage(const TDatPage* page) { - size_t sz = SizeOf((TMyKey*)NULL); - TMyKey* rec = KeyFile.Reserve(sz ? sz : MaxSizeOf<TMyKey>()); - if (rec) { - rec->Offset = Tell(); - rec->Key = *(TVal*)((char*)page + sizeof(TDatPage)); - KeyFile.ResetDat(); - } - } - - static void DispatchCallback(void* This, const TDatPage* page) { - ((TMyType*)This)->NextPage(page); - } -}; - -template <class TKey> -int TCompressedIndexedInputPageFile<TKey>::GotoPage(int pageno) { - if (Error) - return Error; - - Eof = 0; - - i64 offset = KeyFile.FindPage(pageno); - if (!offset) - return Error = MBDB_BAD_FILE_SIZE; - - if (offset != FileManip.RealSeek(offset, SEEK_SET)) - Error = MBDB_BAD_FILE_SIZE; - - return Error; -} - -template <typename TVal> -class TCompressedInDatFile: public TInDatFile<TVal, TCompressedInputPageFile> { -public: - TCompressedInDatFile(const char* name, size_t pages, int pagesOrBytes = 1) - : TInDatFile<TVal, TCompressedInputPageFile>(name, pages, pagesOrBytes) - { - } -}; - -template <typename TVal> -class TCompressedOutDatFile: public TOutDatFile<TVal, TFakeCompression, TCompressedOutputPageFile> { -public: - TCompressedOutDatFile(const char* name, size_t pagesize, size_t pages, int pagesOrBytes = 1) - : TOutDatFile<TVal, TFakeCompression, TCompressedOutputPageFile>(name, pagesize, pages, pagesOrBytes) - { - } -}; - -template <typename TVal, typename TKey, typename TPageFile = TCompressedOutputPageFile> -class TOutDirectCompressedFile: protected TOutDirectCompressedFileImpl<TVal, TKey, TPageFile> { - typedef TOutDirectCompressedFileImpl<TVal, TKey, TPageFile> TBase; - -public: - TOutDirectCompressedFile(const char* name, size_t pagesize, size_t ipagesize = 0) - : Name(strdup(name)) - , PageSize(pagesize) - , IdxPageSize(ipagesize) - { - } - - ~TOutDirectCompressedFile() { - Close(); - free(Name); - Name = NULL; - } - - void Open(const char* fname) { - int ret = TBase::Open(fname, PageSize, IdxPageSize); - if (ret) - ythrow yexception() << ErrorMessage(ret, "Failed to open output file", fname); - free(Name); - Name = strdup(fname); - } - - void Close() { - int ret; - if ((ret = TBase::GetError())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error before closing output file", Name); - if ((ret = TBase::Close())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error while closing output file", Name); - } - - const char* GetName() const { - return Name; - } - - using TBase::Freeze; - using TBase::Push; - using TBase::Reserve; - using TBase::Unfreeze; - -protected: - char* Name; - size_t PageSize, IdxPageSize; -}; - -class TCompressedInterFileTypes { -public: - typedef TCompressedBufferedOutputPageFile TOutPageFile; - typedef TCompressedBufferedInputPageFile TInPageFile; -}; diff --git a/library/cpp/microbdb/extinfo.h b/library/cpp/microbdb/extinfo.h deleted file mode 100644 index c8389e783cd..00000000000 --- a/library/cpp/microbdb/extinfo.h +++ /dev/null @@ -1,127 +0,0 @@ -#pragma once - -#include "header.h" - -#include <library/cpp/packedtypes/longs.h> - -#include <util/generic/typetraits.h> - -#include <library/cpp/microbdb/noextinfo.pb.h> - -inline bool operator<(const TNoExtInfo&, const TNoExtInfo&) { - return false; -} - -namespace NMicroBDB { - Y_HAS_MEMBER(TExtInfo); - - template <class, bool> - struct TSelectExtInfo; - - template <class T> - struct TSelectExtInfo<T, false> { - typedef TNoExtInfo TExtInfo; - }; - - template <class T> - struct TSelectExtInfo<T, true> { - typedef typename T::TExtInfo TExtInfo; - }; - - template <class T> - class TExtInfoType { - public: - static const bool Exists = THasTExtInfo<T>::value; - typedef typename TSelectExtInfo<T, Exists>::TExtInfo TResult; - }; - - Y_HAS_MEMBER(MakeExtKey); - - template <class, class, bool> - struct TSelectMakeExtKey; - - template <class TVal, class TKey> - struct TSelectMakeExtKey<TVal, TKey, false> { - static inline void Make(TKey* to, typename TExtInfoType<TKey>::TResult*, const TVal* from, const typename TExtInfoType<TVal>::TResult*) { - *to = *from; - } - }; - - template <class TVal, class TKey> - struct TSelectMakeExtKey<TVal, TKey, true> { - static inline void Make(TKey* to, typename TExtInfoType<TKey>::TResult* toExt, const TVal* from, const typename TExtInfoType<TVal>::TResult* fromExt) { - TVal::MakeExtKey(to, toExt, from, fromExt); - } - }; - - template <typename T> - inline size_t SizeOfExt(const T* rec, size_t* /*out*/ extLenSize = nullptr, size_t* /*out*/ extSize = nullptr) { - if (!TExtInfoType<T>::Exists) { - if (extLenSize) - *extLenSize = 0; - if (extSize) - *extSize = 0; - return SizeOf(rec); - } else { - size_t sz = SizeOf(rec); - i64 l; - int els = in_long(l, (const char*)rec + sz); - if (extLenSize) - *extLenSize = static_cast<size_t>(els); - if (extSize) - *extSize = static_cast<size_t>(l); - return sz; - } - } - - template <class T> - bool GetExtInfo(const T* rec, typename TExtInfoType<T>::TResult* extInfo) { - Y_VERIFY(TExtInfoType<T>::Exists, "GetExtInfo should only be used with extended records"); - if (!rec) - return false; - size_t els; - size_t es; - size_t s = SizeOfExt(rec, &els, &es); - const ui8* raw = (const ui8*)rec + s + els; - return extInfo->ParseFromArray(raw, es); - } - - template <class T> - const ui8* GetExtInfoRaw(const T* rec, size_t* len) { - Y_VERIFY(TExtInfoType<T>::Exists, "GetExtInfo should only be used with extended records"); - if (!rec) { - *len = 0; - return nullptr; - } - size_t els; - size_t es; - size_t s = SizeOfExt(rec, &els, &es); - *len = els + es; - return (const ui8*)rec + s; - } - - // Compares serialized extInfo (e.g. for stable sort) - template <class T> - int CompareExtInfo(const T* a, const T* b) { - Y_VERIFY(TExtInfoType<T>::Exists, "CompareExtInfo should only be used with extended records"); - size_t elsA, esA; - size_t elsB, esB; - SizeOfExt(a, &elsA, &esA); - SizeOfExt(a, &elsB, &esB); - if (esA != esB) - return esA - esB; - else - return memcmp((const ui8*)a + elsA, (const ui8*)b + elsB, esA); - } - -} - -using NMicroBDB::TExtInfoType; - -template <class TVal, class TKey> -struct TMakeExtKey { - static const bool Exists = NMicroBDB::THasMakeExtKey<TVal>::value; - static inline void Make(TKey* to, typename TExtInfoType<TKey>::TResult* toExt, const TVal* from, const typename TExtInfoType<TVal>::TResult* fromExt) { - NMicroBDB::TSelectMakeExtKey<TVal, TKey, Exists>::Make(to, toExt, from, fromExt); - } -}; diff --git a/library/cpp/microbdb/file.cpp b/library/cpp/microbdb/file.cpp deleted file mode 100644 index 599a7301a0f..00000000000 --- a/library/cpp/microbdb/file.cpp +++ /dev/null @@ -1,220 +0,0 @@ -#include "file.h" - -#include <fcntl.h> -#include <errno.h> -#include <sys/stat.h> - -#ifdef _win32_ -#define S_ISREG(x) !!(x & S_IFREG) -#endif - -TFileManipBase::TFileManipBase() - : FileBased(true) -{ -} - -i64 TFileManipBase::DoSeek(i64 offset, int whence, bool isStreamOpen) { - if (!isStreamOpen) - return -1; - VerifyRandomAccess(); - return File.Seek(offset, (SeekDir)whence); -} - -int TFileManipBase::DoFileOpen(const TFile& file) { - File = file; - SetFileBased(IsFileBased()); - return (File.IsOpen()) ? 0 : MBDB_OPEN_ERROR; -} - -int TFileManipBase::DoFileClose() { - if (File.IsOpen()) { - File.Close(); - return MBDB_ALREADY_INITIALIZED; - } - return 0; -} - -int TFileManipBase::IsFileBased() const { - bool fileBased = true; -#if defined(_win_) -#elif defined(_unix_) - FHANDLE h = File.GetHandle(); - struct stat sb; - fileBased = false; - if (h != INVALID_FHANDLE && !::fstat(h, &sb) && S_ISREG(sb.st_mode)) { - fileBased = true; - } -#else -#error -#endif - return fileBased; -} - -TInputFileManip::TInputFileManip() - : InputStream(nullptr) -{ -} - -int TInputFileManip::Open(const char* fname, bool direct) { - int ret; - return (ret = DoClose()) ? ret : DoStreamOpen(TFile(fname, RdOnly | (direct ? DirectAligned : EOpenMode()))); -} - -int TInputFileManip::Open(IInputStream& input) { - int ret; - return (ret = DoClose()) ? ret : DoStreamOpen(&input); -} - -int TInputFileManip::Open(TAutoPtr<IInputStream> input) { - int ret; - return (ret = DoClose()) ? ret : DoStreamOpen(input.Release()); -} - -int TInputFileManip::Init(const TFile& file) { - int ret; - if (ret = DoClose()) - return ret; - DoStreamOpen(file); - return 0; -} - -int TInputFileManip::Close() { - DoClose(); - return 0; -} - -ssize_t TInputFileManip::Read(void* buf, unsigned len) { - if (!IsStreamOpen()) - return -1; - return InputStream->Load(buf, len); -} - -IInputStream* TInputFileManip::CreateStream(const TFile& file) { - return new TUnbufferedFileInput(file); -} - -TMappedInputPageFile::TMappedInputPageFile() - : Pagesize(0) - , Error(0) - , Pagenum(0) - , Recordsig(0) - , Open(false) -{ - Term(); -} - -TMappedInputPageFile::~TMappedInputPageFile() { - Term(); -} - -int TMappedInputPageFile::Init(const char* fname, ui32 recsig, ui32* gotRecordSig, bool) { - Mappedfile.init(fname); - Open = true; - - TDatMetaPage* meta = (TDatMetaPage*)Mappedfile.getData(); - if (gotRecordSig) - *gotRecordSig = meta->RecordSig; - - if (meta->MetaSig != METASIG) - Error = MBDB_BAD_METAPAGE; - else if (meta->RecordSig != recsig) - Error = MBDB_BAD_RECORDSIG; - - if (Error) { - Mappedfile.term(); - return Error; - } - - size_t fsize = Mappedfile.getSize(); - if (fsize < METASIZE) - return Error = MBDB_BAD_FILE_SIZE; - fsize -= METASIZE; - if (fsize % meta->PageSize) - return Error = MBDB_BAD_FILE_SIZE; - Pagenum = (int)(fsize / meta->PageSize); - Pagesize = meta->PageSize; - Recordsig = meta->RecordSig; - Error = 0; - return Error; -} - -int TMappedInputPageFile::Term() { - Mappedfile.term(); - Open = false; - return 0; -} - -TOutputFileManip::TOutputFileManip() - : OutputStream(nullptr) -{ -} - -int TOutputFileManip::Open(const char* fname, EOpenMode mode) { - if (IsStreamOpen()) { - return MBDB_ALREADY_INITIALIZED; // should it be closed as TInputFileManip - } - - try { - if (unlink(fname) && errno != ENOENT) { - if (strncmp(fname, "/dev/std", 8)) - return MBDB_OPEN_ERROR; - } - TFile file(fname, mode); - DoStreamOpen(file); - } catch (const TFileError&) { - return MBDB_OPEN_ERROR; - } - return 0; -} - -int TOutputFileManip::Open(IOutputStream& output) { - if (IsStreamOpen()) - return MBDB_ALREADY_INITIALIZED; - DoStreamOpen(&output); - return 0; -} - -int TOutputFileManip::Open(TAutoPtr<IOutputStream> output) { - if (IsStreamOpen()) - return MBDB_ALREADY_INITIALIZED; - DoStreamOpen(output.Release()); - return 0; -} - -int TOutputFileManip::Init(const TFile& file) { - if (IsStreamOpen()) - return MBDB_ALREADY_INITIALIZED; // should it be closed as TInputFileManip - DoStreamOpen(file); - return 0; -} - -int TOutputFileManip::Rotate(const char* newfname) { - if (!IsStreamOpen()) { - return MBDB_NOT_INITIALIZED; - } - - try { - TFile file(newfname, WrOnly | OpenAlways | TruncExisting | ARW | AWOther); - DoClose(); - DoStreamOpen(file); - } catch (const TFileError&) { - return MBDB_OPEN_ERROR; - } - return 0; -} - -int TOutputFileManip::Close() { - DoClose(); - return 0; -} - -int TOutputFileManip::Write(const void* buf, unsigned len) { - if (!IsStreamOpen()) - return -1; - OutputStream->Write(buf, len); - return len; -} - -IOutputStream* TOutputFileManip::CreateStream(const TFile& file) { - return new TUnbufferedFileOutput(file); -} diff --git a/library/cpp/microbdb/file.h b/library/cpp/microbdb/file.h deleted file mode 100644 index f7c78183759..00000000000 --- a/library/cpp/microbdb/file.h +++ /dev/null @@ -1,225 +0,0 @@ -#pragma once - -#include "header.h" - -#include <library/cpp/deprecated/mapped_file/mapped_file.h> - -#include <util/generic/noncopyable.h> -#include <util/stream/file.h> -#include <util/system/filemap.h> - -#define FS_BLOCK_SIZE 512 - -class TFileManipBase { -protected: - TFileManipBase(); - - virtual ~TFileManipBase() { - } - - i64 DoSeek(i64 offset, int whence, bool isStreamOpen); - - int DoFileOpen(const TFile& file); - - int DoFileClose(); - - int IsFileBased() const; - - inline void SetFileBased(bool fileBased) { - FileBased = fileBased; - } - - inline i64 DoGetPosition() const { - Y_ASSERT(FileBased); - return File.GetPosition(); - } - - inline i64 DoGetLength() const { - return (FileBased) ? File.GetLength() : -1; - } - - inline void VerifyRandomAccess() const { - Y_VERIFY(FileBased, "non-file stream can not be accessed randomly"); - } - - inline i64 GetPosition() const { - return (i64)File.GetPosition(); - } - -private: - TFile File; - bool FileBased; -}; - -class TInputFileManip: public TFileManipBase { -public: - using TFileManipBase::GetPosition; - - TInputFileManip(); - - int Open(const char* fname, bool direct = false); - - int Open(IInputStream& input); - - int Open(TAutoPtr<IInputStream> input); - - int Init(const TFile& file); - - int Close(); - - ssize_t Read(void* buf, unsigned len); - - inline bool IsOpen() const { - return IsStreamOpen(); - } - - inline i64 GetLength() const { - return DoGetLength(); - } - - inline i64 Seek(i64 offset, int whence) { - return DoSeek(offset, whence, IsStreamOpen()); - } - - inline i64 RealSeek(i64 offset, int whence) { - return Seek(offset, whence); - } - -protected: - inline bool IsStreamOpen() const { - return !!InputStream; - } - - inline int DoStreamOpen(IInputStream* input, bool fileBased = false) { - InputStream.Reset(input); - SetFileBased(fileBased); - return 0; - } - - inline int DoStreamOpen(const TFile& file) { - int ret; - return (ret = DoFileOpen(file)) ? ret : DoStreamOpen(CreateStream(file), IsFileBased()); - } - - virtual IInputStream* CreateStream(const TFile& file); - - inline bool DoClose() { - if (IsStreamOpen()) { - InputStream.Destroy(); - return DoFileClose(); - } - return 0; - } - - THolder<IInputStream> InputStream; -}; - -class TMappedInputPageFile: private TNonCopyable { -public: - TMappedInputPageFile(); - - ~TMappedInputPageFile(); - - inline int GetError() const { - return Error; - } - - inline size_t GetPageSize() const { - return Pagesize; - } - - inline int GetLastPage() const { - return Pagenum; - } - - inline ui32 GetRecordSig() const { - return Recordsig; - } - - inline bool IsOpen() const { - return Open; - } - - inline char* GetData() const { - return Open ? (char*)Mappedfile.getData() : nullptr; - } - - inline size_t GetSize() const { - return Open ? Mappedfile.getSize() : 0; - } - -protected: - int Init(const char* fname, ui32 recsig, ui32* gotRecordSig = nullptr, bool direct = false); - - int Term(); - - TMappedFile Mappedfile; - size_t Pagesize; - int Error; - int Pagenum; - ui32 Recordsig; - bool Open; -}; - -class TOutputFileManip: public TFileManipBase { -public: - TOutputFileManip(); - - int Open(const char* fname, EOpenMode mode = WrOnly | CreateAlways | ARW | AWOther); - - int Open(IOutputStream& output); - - int Open(TAutoPtr<IOutputStream> output); - - int Init(const TFile& file); - - int Rotate(const char* newfname); - - int Write(const void* buf, unsigned len); - - int Close(); - - inline bool IsOpen() const { - return IsStreamOpen(); - } - - inline i64 GetLength() const { - return DoGetLength(); - } - - inline i64 Seek(i64 offset, int whence) { - return DoSeek(offset, whence, IsStreamOpen()); - } - - inline i64 RealSeek(i64 offset, int whence) { - return Seek(offset, whence); - } - -protected: - inline bool IsStreamOpen() const { - return !!OutputStream; - } - - inline int DoStreamOpen(IOutputStream* output, bool fileBased = false) { - OutputStream.Reset(output); - SetFileBased(fileBased); - return 0; - } - - inline int DoStreamOpen(const TFile& file) { - int ret; - return (ret = DoFileOpen(file)) ? ret : DoStreamOpen(CreateStream(file), true); - } - - virtual IOutputStream* CreateStream(const TFile& file); - - inline bool DoClose() { - if (IsStreamOpen()) { - OutputStream.Destroy(); - return DoFileClose(); - } - return 0; - } - - THolder<IOutputStream> OutputStream; -}; diff --git a/library/cpp/microbdb/hashes.h b/library/cpp/microbdb/hashes.h deleted file mode 100644 index bfd113c3ba4..00000000000 --- a/library/cpp/microbdb/hashes.h +++ /dev/null @@ -1,250 +0,0 @@ -#pragma once - -#include <library/cpp/on_disk/st_hash/static_hash.h> -#include <util/system/sysstat.h> -#include <util/stream/mem.h> -#include <util/string/printf.h> -#include <library/cpp/deprecated/fgood/fgood.h> - -#include "safeopen.h" - -/** This file currently implements creation of mappable read-only hash file. - Basic usage of these "static hashes" is defined in util/static_hash.h (see docs there). - Additional useful wrappers are available in util/static_hash_map.h - - There are two ways to create mappable hash file: - - A) Fill an THashMap/set structure in RAM, then dump it to disk. - This is usually done by save_hash_to_file* functions defined in static_hash.h - (see description in static_hash.h). - - B) Prepare all data using external sorter, then create hash file straight on disk. - This approach is necessary when there isn't enough RAM to hold entire original THashMap. - Implemented in this file as TStaticHashBuilder class. - - Current implementation's major drawback is that the size of the hash must be estimated - before the hash is built (bucketCount), which is not always possible. - Separate implementation with two sort passes is yet to be done. - - Another problem is that maximum stored size of the element (maxRecSize) must also be - known in advance, because we use TDatSorterMemo, etc. - */ - -template <class SizeType> -struct TSthashTmpRec { - SizeType HashVal; - SizeType RecSize; - char Buf[1]; - size_t SizeOf() const { - return &Buf[RecSize] - (char*)this; - } - bool operator<(const TSthashTmpRec& than) const { - return HashVal < than.HashVal; - } - static const ui32 RecordSig = 20100124 + sizeof(SizeType) - 4; -}; - -template <typename T> -struct TReplaceMerger { - T operator()(const T& oldRecord, const T& newRecord) const { - Y_UNUSED(oldRecord); - return newRecord; - } -}; - -/** TStaticHashBuilder template parameters: - HashType - THashMap map/set type for which we construct corresponding mappable hash; - SizeType - type used to store offsets and length in resulting hash; - MergerType - type of object to process records with equal key (see TReplaceMerger for example); - */ - -template <class HashType, class SizeType, class MergerType = TReplaceMerger<typename HashType::mapped_type>> -struct TStaticHashBuilder { - const size_t SrtIOPageSz; - const size_t WrBufSz; - typedef TSthashTmpRec<SizeType> TIoRec; - typedef TSthashWriter<typename HashType::key_type, typename HashType::mapped_type, SizeType> TKeySaver; - typedef typename HashType::value_type TValueType; - typedef typename HashType::mapped_type TMappedType; - typedef typename HashType::key_type TKeyType; - - TDatSorterMemo<TIoRec, TCompareByLess> Srt; - TBuffer IoRec, CurrentBlockRecs; - TKeySaver KeySaver; - typename HashType::hasher Hasher; - typename HashType::key_equal Equals; - MergerType merger; - TString HashFileName; - TString OurTmpDir; - size_t BucketCount; - int FreeBits; - - // memSz is the Sorter buffer size; - // maxRecSize is the maximum size (as reported by size_for_st) of our record(s) - TStaticHashBuilder(size_t memSz, size_t maxRecSize) - : SrtIOPageSz((maxRecSize * 16 + 65535) & ~size_t(65535)) - , WrBufSz(memSz / 16 >= SrtIOPageSz ? memSz / 16 : SrtIOPageSz) - , Srt("unused", memSz, SrtIOPageSz, WrBufSz, 0) - , IoRec(sizeof(TIoRec) + maxRecSize) - , CurrentBlockRecs(sizeof(TIoRec) + maxRecSize) - , BucketCount(0) - , FreeBits(0) - { - } - - ~TStaticHashBuilder() { - Close(); - } - - // if tmpDir is supplied, it must exist; - // bucketCount should be HashBucketCount() of the (estimated) element count - void Open(const char* fname, size_t bucketCount, const char* tmpDir = nullptr) { - if (!tmpDir) - tmpDir = ~(OurTmpDir = Sprintf("%s.temp", fname)); - Mkdir(tmpDir, MODE0775); - Srt.Open(tmpDir); - HashFileName = fname; - BucketCount = bucketCount; - int bitCount = 0; - while (((size_t)1 << bitCount) <= BucketCount && bitCount < int(8 * sizeof(size_t))) - ++bitCount; - FreeBits = 8 * sizeof(size_t) - bitCount; - } - - void Push(const TValueType& rec) { - TIoRec* ioRec = MakeIoRec(rec); - Srt.Push(ioRec); - } - TIoRec* MakeIoRec(const TValueType& rec) { - TIoRec* ioRec = (TIoRec*)IoRec.Data(); - size_t mask = (1 << FreeBits) - 1; - size_t hash = Hasher(rec.first); - ioRec->HashVal = ((hash % BucketCount) << FreeBits) + ((hash / BucketCount) & mask); - - TMemoryOutput output(ioRec->Buf, IoRec.Capacity() - offsetof(TIoRec, Buf)); - KeySaver.SaveRecord(&output, rec); - ioRec->RecSize = output.Buf() - ioRec->Buf; - return ioRec; - } - - bool Merge(TVector<std::pair<TKeyType, TMappedType>>& records, size_t newRecordSize) { - TSthashIterator<const TKeyType, const TMappedType, typename HashType::hasher, - typename HashType::key_equal> - newPtr(CurrentBlockRecs.End() - newRecordSize); - for (size_t i = 0; i < records.size(); ++i) { - if (newPtr.KeyEquals(Equals, records[i].first)) { - TMappedType oldValue = records[i].second; - TMappedType newValue = newPtr.Value(); - newValue = merger(oldValue, newValue); - records[i].second = newValue; - return true; - } - } - records.push_back(std::make_pair(newPtr.Key(), newPtr.Value())); - return false; - } - - void PutRecord(const char* buf, size_t rec_size, TFILEPtr& f, SizeType& cur_off) { - f.fsput(buf, rec_size); - cur_off += rec_size; - } - - void Finish() { - Srt.Sort(); - // We use variant 1. - // Variant 1: read sorter once, write records, fseeks to write buckets - // (this doesn't allow fname to be stdout) - // Variant 2: read sorter (probably temp. file) twice: write buckets, then write records - // (this allows fname to be stdout but seems to be longer) - TFILEPtr f(HashFileName, "wb"); - setvbuf(f, nullptr, _IOFBF, WrBufSz); - TVector<SizeType> bucketsBuf(WrBufSz, 0); - // prepare header (note: this code must be unified with save_stl.h) - typedef sthashtable_nvm_sv<typename HashType::hasher, typename HashType::key_equal, SizeType> sv_type; - sv_type sv = {Hasher, Equals, BucketCount, 0, 0}; - // to do: m.b. use just the size of corresponding object? - SizeType cur_off = sizeof(sv_type) + - (sv.num_buckets + 1) * sizeof(SizeType); - SizeType bkt_wroff = sizeof(sv_type), bkt_bufpos = 0, prev_bkt = 0, prev_hash = (SizeType)-1; - bucketsBuf[bkt_bufpos++] = cur_off; - // if might me better to write many zeroes here - f.seek(cur_off, SEEK_SET); - TVector<std::pair<TKeyType, TMappedType>> currentBlock; - bool emptyFile = true; - size_t prevRecSize = 0; - // seek forward - while (true) { - const TIoRec* rec = Srt.Next(); - if (currentBlock.empty() && !emptyFile) { - if (rec && prev_hash == rec->HashVal) { - Merge(currentBlock, prevRecSize); - } else { - // if there is only one record with this hash, don't recode it, just write - PutRecord(CurrentBlockRecs.Data(), prevRecSize, f, cur_off); - sv.num_elements++; - } - } - if (!rec || prev_hash != rec->HashVal) { - // write buckets table - for (size_t i = 0; i < currentBlock.size(); ++i) { - TIoRec* ioRec = MakeIoRec(TValueType(currentBlock[i])); - PutRecord(ioRec->Buf, ioRec->RecSize, f, cur_off); - } - sv.num_elements += currentBlock.size(); - currentBlock.clear(); - CurrentBlockRecs.Clear(); - if (rec) { - prev_hash = rec->HashVal; - } - } - // note: prev_bkt's semantics here is 'cur_bkt - 1', thus we are actually cycling - // until cur_bkt == rec->HashVal *inclusively* - while (!rec || prev_bkt != (rec->HashVal >> FreeBits)) { - bucketsBuf[bkt_bufpos++] = cur_off; - if (bkt_bufpos == bucketsBuf.size()) { - f.seek(bkt_wroff, SEEK_SET); - size_t sz = bkt_bufpos * sizeof(bucketsBuf[0]); - if (f.write(bucketsBuf.begin(), 1, sz) != sz) - throw yexception() << "could not write " << sz << " bytes to " << ~HashFileName; - bkt_wroff += sz; - bkt_bufpos = 0; - f.seek(cur_off, SEEK_SET); - } - prev_bkt++; - if (!rec) { - break; - } - assert(prev_bkt < BucketCount); - } - if (!rec) { - break; - } - emptyFile = false; - CurrentBlockRecs.Append(rec->Buf, rec->RecSize); - if (!currentBlock.empty()) { - Merge(currentBlock, rec->RecSize); - } else { - prevRecSize = rec->RecSize; - } - } - // finish buckets table - f.seek(bkt_wroff, SEEK_SET); - size_t sz = bkt_bufpos * sizeof(bucketsBuf[0]); - if (sz && f.write(bucketsBuf.begin(), 1, sz) != sz) - throw yexception() << "could not write " << sz << " bytes to " << ~HashFileName; - bkt_wroff += sz; - for (; prev_bkt < BucketCount; prev_bkt++) - f.fput(cur_off); - // finally write header - sv.data_end_off = cur_off; - f.seek(0, SEEK_SET); - f.fput(sv); - f.close(); - } - - void Close() { - Srt.Close(); - if (+OurTmpDir) - rmdir(~OurTmpDir); - } -}; diff --git a/library/cpp/microbdb/header.cpp b/library/cpp/microbdb/header.cpp deleted file mode 100644 index f4511d6fb62..00000000000 --- a/library/cpp/microbdb/header.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "header.h" - -#include <util/stream/output.h> -#include <util/stream/format.h> - -TString ToString(EMbdbErrors error) { - TString ret; - switch (error) { - case MBDB_ALREADY_INITIALIZED: - ret = "already initialized"; - break; - case MBDB_NOT_INITIALIZED: - ret = "not initialized"; - break; - case MBDB_BAD_DESCRIPTOR: - ret = "bad descriptor"; - break; - case MBDB_OPEN_ERROR: - ret = "open error"; - break; - case MBDB_READ_ERROR: - ret = "read error"; - break; - case MBDB_WRITE_ERROR: - ret = "write error"; - break; - case MBDB_CLOSE_ERROR: - ret = "close error"; - break; - case MBDB_EXPECTED_EOF: - ret = "expected eof"; - break; - case MBDB_UNEXPECTED_EOF: - ret = "unxepected eof"; - break; - case MBDB_BAD_FILENAME: - ret = "bad filename"; - break; - case MBDB_BAD_METAPAGE: - ret = "bad metapage"; - break; - case MBDB_BAD_RECORDSIG: - ret = "bad recordsig"; - break; - case MBDB_BAD_FILE_SIZE: - ret = "bad file size"; - break; - case MBDB_BAD_PAGESIG: - ret = "bad pagesig"; - break; - case MBDB_BAD_PAGESIZE: - ret = "bad pagesize"; - break; - case MBDB_BAD_PARM: - ret = "bad parm"; - break; - case MBDB_BAD_SYNC: - ret = "bad sync"; - break; - case MBDB_PAGE_OVERFLOW: - ret = "page overflow"; - break; - case MBDB_NO_MEMORY: - ret = "no memory"; - break; - case MBDB_MEMORY_LEAK: - ret = "memory leak"; - break; - case MBDB_NOT_SUPPORTED: - ret = "not supported"; - break; - default: - ret = "unknown"; - break; - } - return ret; -} - -TString ErrorMessage(int error, const TString& text, const TString& path, ui32 recordSig, ui32 gotRecordSig) { - TStringStream str; - str << text; - if (path.size()) - str << " '" << path << "'"; - str << ": " << ToString(static_cast<EMbdbErrors>(error)); - if (recordSig && (!gotRecordSig || recordSig != gotRecordSig)) - str << ". Expected RecordSig: " << Hex(recordSig, HF_ADDX); - if (recordSig && gotRecordSig && recordSig != gotRecordSig) - str << ", got: " << Hex(gotRecordSig, HF_ADDX); - str << ". Last system error text: " << LastSystemErrorText(); - return str.Str(); -} diff --git a/library/cpp/microbdb/header.h b/library/cpp/microbdb/header.h deleted file mode 100644 index 0951d610ea7..00000000000 --- a/library/cpp/microbdb/header.h +++ /dev/null @@ -1,159 +0,0 @@ -#pragma once - -#include <util/system/defaults.h> -#include <util/generic/typetraits.h> -#include <util/generic/string.h> -#include <util/str_stl.h> - -#include <stdio.h> - -#define METASIZE (1u << 12) -#define METASIG 0x12345678u -#define PAGESIG 0x87654321u - -enum EMbdbErrors { - MBDB_ALREADY_INITIALIZED = 200, - MBDB_NOT_INITIALIZED = 201, - MBDB_BAD_DESCRIPTOR = 202, - MBDB_OPEN_ERROR = 203, - MBDB_READ_ERROR = 204, - MBDB_WRITE_ERROR = 205, - MBDB_CLOSE_ERROR = 206, - MBDB_EXPECTED_EOF = 207, - MBDB_UNEXPECTED_EOF = 208, - MBDB_BAD_FILENAME = 209, - MBDB_BAD_METAPAGE = 210, - MBDB_BAD_RECORDSIG = 211, - MBDB_BAD_FILE_SIZE = 212, - MBDB_BAD_PAGESIG = 213, - MBDB_BAD_PAGESIZE = 214, - MBDB_BAD_PARM = 215, - MBDB_BAD_SYNC = 216, - MBDB_PAGE_OVERFLOW = 217, - MBDB_NO_MEMORY = 218, - MBDB_MEMORY_LEAK = 219, - MBDB_NOT_SUPPORTED = 220 -}; - -TString ToString(EMbdbErrors error); -TString ErrorMessage(int error, const TString& text, const TString& path = TString(), ui32 recordSig = 0, ui32 gotRecordSig = 0); - -enum EPageFormat { - MBDB_FORMAT_RAW = 0, - MBDB_FORMAT_COMPRESSED = 1, - MBDB_FORMAT_NULL = 255 -}; - -enum ECompressionAlgorithm { - MBDB_COMPRESSION_ZLIB = 1, - MBDB_COMPRESSION_FASTLZ = 2, - MBDB_COMPRESSION_SNAPPY = 3 -}; - -struct TDatMetaPage { - ui32 MetaSig; - ui32 RecordSig; - ui32 PageSize; -}; - -struct TDatPage { - ui32 RecNum; //!< number of records on this page - ui32 PageSig; - ui32 Format : 2; //!< one of EPageFormat - ui32 Reserved : 30; -}; - -/// Additional page header with compression info -struct TCompressedPage { - ui32 BlockCount; - ui32 Algorithm : 4; - ui32 Version : 4; - ui32 Reserved : 24; -}; - -namespace NMicroBDB { - /// Header of compressed block - struct TCompressedHeader { - ui32 Compressed; - ui32 Original; /// original size of block - ui32 Count; /// number of records in block - ui32 Reserved; - }; - - Y_HAS_MEMBER(AssertValid); - - template <typename T, bool TVal> - struct TAssertValid { - void operator()(const T*) { - } - }; - - template <typename T> - struct TAssertValid<T, true> { - void operator()(const T* rec) { - return rec->AssertValid(); - } - }; - - template <typename T> - void AssertValid(const T* rec) { - return NMicroBDB::TAssertValid<T, NMicroBDB::THasAssertValid<T>::value>()(rec); - } - - Y_HAS_MEMBER(SizeOf); - - template <typename T, bool TVal> - struct TGetSizeOf; - - template <typename T> - struct TGetSizeOf<T, true> { - size_t operator()(const T* rec) { - return rec->SizeOf(); - } - }; - - template <typename T> - struct TGetSizeOf<T, false> { - size_t operator()(const T*) { - return sizeof(T); - } - }; - - inline char* GetFirstRecord(const TDatPage* page) { - switch (page->Format) { - case MBDB_FORMAT_RAW: - return (char*)page + sizeof(TDatPage); - case MBDB_FORMAT_COMPRESSED: - // Первая запись на сжатой странице сохраняется несжатой - // сразу же после всех заголовков. - // Алгоритм сохранения смотреть в TOutputRecordIterator::FlushBuffer - return (char*)page + sizeof(TDatPage) + sizeof(TCompressedPage) + sizeof(NMicroBDB::TCompressedHeader); - } - return (char*)nullptr; - } -} - -template <typename T> -size_t SizeOf(const T* rec) { - return NMicroBDB::TGetSizeOf<T, NMicroBDB::THasSizeOf<T>::value>()(rec); -} - -template <typename T> -size_t MaxSizeOf() { - return sizeof(T); -} - -static inline int DatNameToIdx(char iname[/*FILENAME_MAX*/], const char* dname) { - if (!dname || !*dname) - return MBDB_BAD_FILENAME; - const char* ptr; - if (!(ptr = strrchr(dname, '/'))) - ptr = dname; - if (!(ptr = strrchr(ptr, '.'))) - ptr = strchr(dname, 0); - if (ptr - dname > FILENAME_MAX - 5) - return MBDB_BAD_FILENAME; - memcpy(iname, dname, ptr - dname); - strcpy(iname + (ptr - dname), ".idx"); - return 0; -} diff --git a/library/cpp/microbdb/heap.h b/library/cpp/microbdb/heap.h deleted file mode 100644 index ef5a53534cb..00000000000 --- a/library/cpp/microbdb/heap.h +++ /dev/null @@ -1,143 +0,0 @@ -#pragma once - -#include "header.h" -#include "extinfo.h" - -#include <util/generic/vector.h> - -#include <errno.h> - -/////////////////////////////////////////////////////////////////////////////// - -/// Default comparator -template <class TVal> -struct TCompareByLess { - inline bool operator()(const TVal* a, const TVal* b) const { - return TLess<TVal>()(*a, *b); - } -}; - -/////////////////////////////////////////////////////////////////////////////// - -template <class TVal, class TIterator, class TCompare = TCompareByLess<TVal>> -class THeapIter { -public: - int Init(TIterator** iters, int count) { - Term(); - if (!count) - return 0; - if (!(Heap = (TIterator**)malloc(count * sizeof(TIterator*)))) - return ENOMEM; - - Count = count; - count = 0; - while (count < Count) - if (count && !(*iters)->Next()) { //here first TIterator is NOT initialized! - Count--; - iters++; - } else { - Heap[count++] = *iters++; - } - count = Count / 2; - while (--count > 0) //Heap[0] is not changed! - Sift(count, Count); //do not try to replace this code by make_heap - return 0; - } - - int Init(TIterator* iters, int count) { - TVector<TIterator*> a(count); - for (int i = 0; i < count; ++i) - a[i] = &iters[i]; - return Init(&a[0], count); - } - - THeapIter() - : Heap(nullptr) - , Count(0) - { - } - - THeapIter(TIterator* a, TIterator* b) - : Heap(nullptr) - , Count(0) - { - TIterator* arr[] = {a, b}; - if (Init(arr, 2)) - ythrow yexception() << "can't Init THeapIter"; - } - - THeapIter(TVector<TIterator>& v) - : Heap(nullptr) - , Count(0) - { - if (Init(&v[0], v.size())) { - ythrow yexception() << "can't Init THeapIter"; - } - } - - ~THeapIter() { - Term(); - } - - inline const TVal* Current() const { - if (!Count) - return nullptr; - return (*Heap)->Current(); - } - - inline const TIterator* CurrentIter() const { - return *Heap; - } - - //for ends of last file will use Heap[0] = Heap[0] ! and - //returns Current of eof so Current of eof MUST return NULL - //possible this is bug and need fixing - const TVal* Next() { - if (!Count) - return nullptr; - if (!(*Heap)->Next()) //on first call unitialized first TIterator - *Heap = Heap[--Count]; //will be correctly initialized - - if (Count == 2) { - if (TCompare()(Heap[1]->Current(), Heap[0]->Current())) - DoSwap(Heap[1], Heap[0]); - } else - Sift(0, Count); - - return Current(); - } - - inline bool GetExtInfo(typename TExtInfoType<TVal>::TResult* extInfo) const { - return (*Heap)->GetExtInfo(extInfo); - } - - inline const ui8* GetExtInfoRaw(size_t* len) const { - return (*Heap)->GetExtInfoRaw(len); - } - - void Term() { - ::free(Heap); - Heap = nullptr; - Count = 0; - } - -protected: - void Sift(int node, int end) { - TIterator* x = Heap[node]; - int son; - for (son = 2 * node + 1; son < end; node = son, son = 2 * node + 1) { - if (son < (end - 1) && TCompare()(Heap[son + 1]->Current(), Heap[son]->Current())) - son++; - if (TCompare()(Heap[son]->Current(), x->Current())) - Heap[node] = Heap[son]; - else - break; - } - Heap[node] = x; - } - - TIterator** Heap; - int Count; -}; - -/////////////////////////////////////////////////////////////////////////////// diff --git a/library/cpp/microbdb/input.h b/library/cpp/microbdb/input.h deleted file mode 100644 index 13b12f28b79..00000000000 --- a/library/cpp/microbdb/input.h +++ /dev/null @@ -1,1027 +0,0 @@ -#pragma once - -#include "header.h" -#include "file.h" -#include "reader.h" - -#include <util/system/maxlen.h> -#include <util/system/event.h> -#include <util/system/thread.h> - -#include <thread> - -#include <sys/uio.h> - -#include <errno.h> - -template <class TFileManip> -inline ssize_t Readv(TFileManip& fileManip, const struct iovec* iov, int iovcnt) { - ssize_t read_count = 0; - for (int n = 0; n < iovcnt; n++) { - ssize_t last_read = fileManip.Read(iov[n].iov_base, iov[n].iov_len); - if (last_read < 0) - return -1; - read_count += last_read; - } - return read_count; -} - -template <class TVal, typename TBasePageIter> -class TInputRecordIterator: public TBasePageIter { - typedef THolder<NMicroBDB::IBasePageReader<TVal>> TReaderHolder; - -public: - typedef TBasePageIter TPageIter; - - TInputRecordIterator() { - Init(); - } - - ~TInputRecordIterator() { - Term(); - } - - const TVal* Current() const { - return Rec; - } - - bool GetExtInfo(typename TExtInfoType<TVal>::TResult* extInfo) const { - if (!Rec) - return false; - return Reader->GetExtInfo(extInfo); - } - - const ui8* GetExtInfoRaw(size_t* len) const { - if (!Rec) - return nullptr; - return Reader->GetExtInfoRaw(len); - } - - size_t GetRecSize() const { - return Reader->GetRecSize(); - } - - size_t GetExtSize() const { - return Reader->GetExtSize(); - } - - const TVal* Next() { - if (RecNum) - --RecNum; - else { - TDatPage* page = TPageIter::Next(); - if (!page) { - if (TPageIter::IsFrozen() && Reader.Get()) - Reader->SetClearFlag(); - return Rec = nullptr; - } else if (!!SelectReader()) - return Rec = nullptr; - RecNum = TPageIter::Current()->RecNum - 1; - } - return Rec = Reader->Next(); - } - - // Skip(0) == Current(); Skip(1) == Next() - const TVal* Skip(int& num) { - // Y_ASSERT(num >= 0); ? otherwise it gets into infinite loop - while (num > RecNum) { - num -= RecNum + 1; - if (!TPageIter::Next() || !!SelectReader()) { - RecNum = 0; - return Rec = nullptr; - } - RecNum = TPageIter::Current()->RecNum - 1; - Rec = Reader->Next(); - } - ++num; - while (--num) - Next(); - return Rec; - } - - // begin reading from next page - void Reset() { - Rec = NULL; - RecNum = 0; - if (Reader.Get()) - Reader->Reset(); - } - -protected: - int Init() { - Rec = nullptr; - RecNum = 0; - Format = MBDB_FORMAT_NULL; - return 0; - } - - int Term() { - Reader.Reset(nullptr); - Format = MBDB_FORMAT_NULL; - Rec = nullptr; - RecNum = 0; - return 0; - } - - const TVal* GotoPage(int pageno) { - if (!TPageIter::GotoPage(pageno) || !!SelectReader()) - return Rec = nullptr; - RecNum = TPageIter::Current()->RecNum - 1; - return Rec = Reader->Next(); - } - - int SelectReader() { - if (!TPageIter::Current()) - return MBDB_UNEXPECTED_EOF; - if (ui32(Format) != TPageIter::Current()->Format) { - switch (TPageIter::Current()->Format) { - case MBDB_FORMAT_RAW: - Reader.Reset(new NMicroBDB::TRawPageReader<TVal, TPageIter>(this)); - break; - case MBDB_FORMAT_COMPRESSED: - Reader.Reset(new NMicroBDB::TCompressedReader<TVal, TPageIter>(this)); - break; - default: - return MBDB_NOT_SUPPORTED; - } - Format = EPageFormat(TPageIter::Current()->Format); - } else { - Y_ASSERT(Reader.Get() != nullptr); - Reader->Reset(); - } - return 0; - } - - const TVal* Rec; - TReaderHolder Reader; - int RecNum; //!< number of records on the current page after the current record - EPageFormat Format; -}; - -template <class TBaseReader> -class TInputPageIterator: public TBaseReader { -public: - typedef TBaseReader TReader; - - TInputPageIterator() - : Buf(nullptr) - { - Term(); - } - - ~TInputPageIterator() { - Term(); - } - - TDatPage* Current() { - return CurPage; - } - - int Freeze() { - return (Frozen = (PageNum == -1) ? 0 : PageNum); - } - - void Unfreeze() { - Frozen = -1; - } - - inline int IsFrozen() const { - return Frozen + 1; - } - - inline size_t GetPageSize() const { - return TReader::GetPageSize(); - } - - inline int GetPageNum() const { - return PageNum; - } - - inline int IsEof() const { - return Eof; - } - - TDatPage* Next() { - if (PageNum >= Maxpage && ReadBuf()) { - Eof = Eof ? Eof : TReader::IsEof(); - return CurPage = nullptr; - } - return CurPage = (TDatPage*)(Buf + ((++PageNum) % Bufpages) * GetPageSize()); - } - - TDatPage* GotoPage(int pageno) { - if (pageno <= Maxpage && pageno >= (Maxpage - Pages + 1)) { - PageNum = pageno; - return CurPage = (TDatPage*)(Buf + (PageNum % Bufpages) * GetPageSize()); - } - if (IsFrozen() || TReader::GotoPage(pageno)) - return nullptr; - Maxpage = PageNum = pageno - 1; - Eof = 0; - return Next(); - } - -protected: - int Init(size_t pages, int pagesOrBytes) { - Term(); - if (pagesOrBytes == -1) - Bufpages = TReader::GetLastPage(); - else if (pagesOrBytes) - Bufpages = pages; - else - Bufpages = pages / GetPageSize(); - if (!TReader::GetLastPage()) { - Bufpages = 0; - assert(Eof == 1); - return 0; - } - int lastPage = TReader::GetLastPage(); - if (lastPage >= 0) - Bufpages = (int)Min(lastPage, Bufpages); - Bufpages = Max(2, Bufpages); - Eof = 0; - ABuf.Alloc(Bufpages * GetPageSize()); - return (Buf = ABuf.Begin()) ? 0 : ENOMEM; - // return (Buf = (char*)malloc(Bufpages * GetPageSize())) ? 0 : ENOMEM; - } - - int Term() { - // free(Buf); - ABuf.Dealloc(); - Buf = nullptr; - Maxpage = PageNum = Frozen = -1; - Bufpages = 0; - Pages = 0; - Eof = 1; - CurPage = nullptr; - return 0; - } - - int ReadBuf() { - int nvec; - iovec vec[2]; - int maxpage = (Frozen == -1 ? Maxpage + 1 : Frozen) + Bufpages - 1; - int minpage = Maxpage + 1; - if (maxpage < minpage) - return EAGAIN; - minpage %= Bufpages; - maxpage %= Bufpages; - if (maxpage < minpage) { - vec[0].iov_base = Buf + GetPageSize() * minpage; - vec[0].iov_len = GetPageSize() * (Bufpages - minpage); - vec[1].iov_base = Buf; - vec[1].iov_len = GetPageSize() * (maxpage + 1); - nvec = 2; - } else { - vec[0].iov_base = Buf + GetPageSize() * minpage; - vec[0].iov_len = GetPageSize() * (maxpage - minpage + 1); - nvec = 1; - } - TReader::ReadPages(vec, nvec, &Pages); - Maxpage += Pages; - return !Pages; - } - - int Maxpage, PageNum, Frozen, Bufpages, Eof, Pages; - TDatPage* CurPage; - // TMappedArray<char> ABuf; - TMappedAllocation ABuf; - char* Buf; -}; - -template <class TBaseReader> -class TInputPageIteratorMT: public TBaseReader { -public: - typedef TBaseReader TReader; - - TInputPageIteratorMT() - : CurBuf(0) - , CurReadBuf(0) - , Buf(nullptr) - { - Term(); - } - - ~TInputPageIteratorMT() { - Term(); - } - - TDatPage* Current() { - return CurPage; - } - - int Freeze() { - return (Frozen = (PageNum == -1) ? 0 : PageNum); - } - - void Unfreeze() { - Frozen = -1; - } - - inline int IsFrozen() const { - return Frozen + 1; - } - - inline size_t GetPageSize() const { - return TReader::GetPageSize(); - } - - inline int GetPageNum() const { - return PageNum; - } - - inline int IsEof() const { - return Eof; - } - - TDatPage* Next() { - if (Eof) - return CurPage = nullptr; - if (PageNum >= Maxpage && ReadBuf()) { - Eof = Eof ? Eof : TReader::IsEof(); - return CurPage = nullptr; - } - return CurPage = (TDatPage*)(Buf + ((++PageNum) % Bufpages) * GetPageSize()); - } - - TDatPage* GotoPage(int pageno) { - if (pageno <= Maxpage && pageno >= (Maxpage - Pages + 1)) { - PageNum = pageno; - return CurPage = (TDatPage*)(Buf + (PageNum % Bufpages) * GetPageSize()); - } - if (IsFrozen() || TReader::GotoPage(pageno)) - return nullptr; - Maxpage = PageNum = pageno - 1; - Eof = 0; - return Next(); - } - - void ReadPages() { - // fprintf(stderr, "ReadPages started\n"); - bool eof = false; - while (!eof) { - QEvent[CurBuf].Wait(); - if (Finish) - return; - int pages = ReadCurBuf(Bufs[CurBuf]); - PagesM[CurBuf] = pages; - eof = !pages; - AEvent[CurBuf].Signal(); - CurBuf ^= 1; - } - } - -protected: - int Init(size_t pages, int pagesOrBytes) { - Term(); - if (pagesOrBytes == -1) - Bufpages = TReader::GetLastPage(); - else if (pagesOrBytes) - Bufpages = pages; - else - Bufpages = pages / GetPageSize(); - if (!TReader::GetLastPage()) { - Bufpages = 0; - assert(Eof == 1); - return 0; - } - int lastPage = TReader::GetLastPage(); - if (lastPage >= 0) - Bufpages = (int)Min(lastPage, Bufpages); - Bufpages = Max(2, Bufpages); - Eof = 0; - ABuf.Alloc(Bufpages * GetPageSize() * 2); - Bufs[0] = ABuf.Begin(); - Bufs[1] = Bufs[0] + Bufpages * GetPageSize(); - // return (Buf = (char*)malloc(Bufpages * GetPageSize())) ? 0 : ENOMEM; - Finish = false; - ReadThread = std::thread([this]() { - TThread::SetCurrentThreadName("DatReader"); - ReadPages(); - }); - QEvent[0].Signal(); - return Bufs[0] ? 0 : ENOMEM; - } - - void StopThread() { - Finish = true; - QEvent[0].Signal(); - QEvent[1].Signal(); - ReadThread.join(); - } - - int Term() { - // free(Buf); - if (ReadThread.joinable()) - StopThread(); - ABuf.Dealloc(); - Buf = nullptr; - Bufs[0] = nullptr; - Bufs[1] = nullptr; - Maxpage = MaxpageR = PageNum = Frozen = -1; - Bufpages = 0; - Pages = 0; - Eof = 1; - CurPage = nullptr; - return 0; - } - - int ReadCurBuf(char* buf) { - int nvec; - iovec vec[2]; - int maxpage = (Frozen == -1 ? MaxpageR + 1 : Frozen) + Bufpages - 1; - int minpage = MaxpageR + 1; - if (maxpage < minpage) - return EAGAIN; - minpage %= Bufpages; - maxpage %= Bufpages; - if (maxpage < minpage) { - vec[0].iov_base = buf + GetPageSize() * minpage; - vec[0].iov_len = GetPageSize() * (Bufpages - minpage); - vec[1].iov_base = buf; - vec[1].iov_len = GetPageSize() * (maxpage + 1); - nvec = 2; - } else { - vec[0].iov_base = buf + GetPageSize() * minpage; - vec[0].iov_len = GetPageSize() * (maxpage - minpage + 1); - nvec = 1; - } - int pages; - TReader::ReadPages(vec, nvec, &pages); - MaxpageR += pages; - return pages; - } - - int ReadBuf() { - QEvent[CurReadBuf ^ 1].Signal(); - AEvent[CurReadBuf].Wait(); - Buf = Bufs[CurReadBuf]; - Maxpage += (Pages = PagesM[CurReadBuf]); - CurReadBuf ^= 1; - return !Pages; - } - - int Maxpage, MaxpageR, PageNum, Frozen, Bufpages, Eof, Pages; - TDatPage* CurPage; - // TMappedArray<char> ABuf; - ui32 CurBuf; - ui32 CurReadBuf; - TMappedAllocation ABuf; - char* Buf; - char* Bufs[2]; - ui32 PagesM[2]; - TAutoEvent QEvent[2]; - TAutoEvent AEvent[2]; - std::thread ReadThread; - bool Finish; -}; - -template <typename TFileManip> -class TInputPageFileImpl: private TNonCopyable { -protected: - TFileManip FileManip; - -public: - TInputPageFileImpl() - : Pagesize(0) - , Fd(-1) - , Eof(1) - , Error(0) - , Pagenum(0) - , Recordsig(0) - { - Term(); - } - - ~TInputPageFileImpl() { - Term(); - } - - inline int IsEof() const { - return Eof; - } - - inline int GetError() const { - return Error; - } - - inline size_t GetPageSize() const { - return Pagesize; - } - - inline int GetLastPage() const { - return Pagenum; - } - - inline ui32 GetRecordSig() const { - return Recordsig; - } - - inline bool IsOpen() const { - return FileManip.IsOpen(); - } - -protected: - int Init(const char* fname, ui32 recsig, ui32* gotrecsig = nullptr, bool direct = false) { - Error = FileManip.Open(fname, direct); - return Error ? Error : Init(TFile(), recsig, gotrecsig); - } - - int Init(const TFile& file, ui32 recsig, ui32* gotrecsig = nullptr) { - if (!file.IsOpen() && !FileManip.IsOpen()) - return MBDB_NOT_INITIALIZED; - if (file.IsOpen() && FileManip.IsOpen()) - return MBDB_ALREADY_INITIALIZED; - if (file.IsOpen()) { - Error = FileManip.Init(file); - if (Error) - return Error; - } - - // TArrayHolder<ui8> buf(new ui8[METASIZE + FS_BLOCK_SIZE]); - // ui8* ptr = (buf.Get() + FS_BLOCK_SIZE - ((ui64)buf.Get() & (FS_BLOCK_SIZE - 1))); - TMappedArray<ui8> buf; - buf.Create(METASIZE); - ui8* ptr = &buf[0]; - TDatMetaPage* meta = (TDatMetaPage*)ptr; - ssize_t size = METASIZE; - ssize_t ret; - while (size && (ret = FileManip.Read(ptr, (unsigned)size)) > 0) { - Y_ASSERT(ret <= size); - size -= ret; - ptr += ret; - } - if (size) { - FileManip.Close(); - return Error = MBDB_BAD_METAPAGE; - } - if (gotrecsig) - *gotrecsig = meta->RecordSig; - return Init(TFile(), meta, recsig); - } - - int Init(TAutoPtr<IInputStream> input, ui32 recsig, ui32* gotrecsig = nullptr) { - if (!input && !FileManip.IsOpen()) - return MBDB_NOT_INITIALIZED; - if (FileManip.IsOpen()) - return MBDB_ALREADY_INITIALIZED; - - Error = FileManip.Open(input); - if (Error) - return Error; - - TArrayHolder<ui8> buf(new ui8[METASIZE]); - ui8* ptr = buf.Get(); - ssize_t size = METASIZE; - ssize_t ret; - while (size && (ret = FileManip.Read(ptr, (unsigned)size)) > 0) { - Y_ASSERT(ret <= size); - size -= ret; - ptr += ret; - } - if (size) { - FileManip.Close(); - return Error = MBDB_BAD_METAPAGE; - } - TDatMetaPage* meta = (TDatMetaPage*)buf.Get(); - if (gotrecsig) - *gotrecsig = meta->RecordSig; - return Init(TFile(), meta, recsig); - } - - int Init(const TFile& file, const TDatMetaPage* meta, ui32 recsig) { - if (!file.IsOpen() && !FileManip.IsOpen()) - return MBDB_NOT_INITIALIZED; - if (file.IsOpen() && FileManip.IsOpen()) - return MBDB_ALREADY_INITIALIZED; - if (file.IsOpen()) { - Error = FileManip.Init(file); - if (Error) - return Error; - } - - if (meta->MetaSig != METASIG) - Error = MBDB_BAD_METAPAGE; - else if (meta->RecordSig != recsig) - Error = MBDB_BAD_RECORDSIG; - - if (Error) { - FileManip.Close(); - return Error; - } - - i64 flength = FileManip.GetLength(); - if (flength >= 0) { - i64 fsize = flength; - fsize -= METASIZE; - if (fsize % meta->PageSize) - return Error = MBDB_BAD_FILE_SIZE; - Pagenum = (int)(fsize / meta->PageSize); - } else { - Pagenum = -1; - } - Pagesize = meta->PageSize; - Recordsig = meta->RecordSig; - Error = Eof = 0; - return Error; - } - - int ReadPages(iovec* vec, int nvec, int* pages) { - *pages = 0; - - if (Eof || Error) - return Error; - - ssize_t size = 0, delta = 0, total = 0; - iovec* pvec = vec; - int vsize = nvec; - - while (vsize && (size = Readv(FileManip, pvec, (int)Min(vsize, 16))) > 0) { - total += size; - if (delta) { - size += delta; - pvec->iov_len += delta; - pvec->iov_base = (char*)pvec->iov_base - delta; - delta = 0; - } - while (size) { - if ((size_t)size >= pvec->iov_len) { - size -= pvec->iov_len; - ++pvec; - --vsize; - } else { - delta = size; - pvec->iov_len -= size; - pvec->iov_base = (char*)pvec->iov_base + size; - size = 0; - } - } - } - if (delta) { - pvec->iov_len += delta; - pvec->iov_base = (char*)pvec->iov_base - delta; - } - if (size < 0) - return Error = errno ? errno : MBDB_READ_ERROR; - if (total % Pagesize) - return Error = MBDB_BAD_FILE_SIZE; - if (vsize) - Eof = 1; - *pages = total / Pagesize; // it would be better to assign it after the for-loops - for (; total; ++vec, total -= size) - for (size = 0; size < total && (size_t)size < vec->iov_len; size += Pagesize) - if (((TDatPage*)((char*)vec->iov_base + size))->PageSig != PAGESIG) - return Error = MBDB_BAD_PAGESIG; - return Error; - } - - int GotoPage(int page) { - if (Error) - return Error; - Eof = 0; - i64 offset = (i64)page * Pagesize + METASIZE; - if (offset != FileManip.Seek(offset, SEEK_SET)) - Error = MBDB_BAD_FILE_SIZE; - return Error; - } - - int Term() { - return FileManip.Close(); - } - - size_t Pagesize; - int Fd; - int Eof; - int Error; - int Pagenum; //!< number of pages in this file - ui32 Recordsig; -}; - -template <class TBaseReader> -class TMappedInputPageIterator: public TBaseReader { -public: - typedef TBaseReader TReader; - - TMappedInputPageIterator() { - Term(); - } - - ~TMappedInputPageIterator() { - Term(); - } - - TDatPage* Current() { - return CurPage; - } - - inline size_t GetPageSize() const { - return TReader::GetPageSize(); - } - - inline int GetPageNum() const { - return PageNum; - } - - inline int IsEof() const { - return Eof; - } - - inline int IsFrozen() const { - return 0; - } - - TDatPage* Next() { - i64 pos = (i64)(++PageNum) * GetPageSize() + METASIZE; - if (pos < 0 || pos >= (i64)TReader::GetSize()) { - Eof = 1; - return CurPage = nullptr; - } - return CurPage = (TDatPage*)((char*)TReader::GetData() + pos); - } - -protected: - int Init(size_t /*pages*/, int /*pagesOrBytes*/) { - Term(); - Eof = 0; - return 0; - } - - int Term() { - PageNum = -1; - Eof = 1; - CurPage = nullptr; - return 0; - } - - TDatPage* GotoPage(int pageno) { - PageNum = pageno - 1; - Eof = 0; - return Next(); - } - - int PageNum, Eof, Pages, Pagenum; - TDatPage* CurPage; -}; - -using TInputPageFile = TInputPageFileImpl<TInputFileManip>; - -template <class TVal, - typename TBaseRecIter = TInputRecordIterator<TVal, TInputPageIterator<TInputPageFile>>> -class TInDatFileImpl: public TBaseRecIter { -public: - typedef TBaseRecIter TRecIter; - typedef typename TRecIter::TPageIter TPageIter; - typedef typename TRecIter::TPageIter::TReader TReader; - using TRecIter::GotoPage; - - int Open(const char* fname, size_t pages = 1, int pagesOrBytes = 1, ui32* gotRecordSig = nullptr, bool direct = false) { - int ret = TReader::Init(fname, TVal::RecordSig, gotRecordSig, direct); - return ret ? ret : Open2(pages, pagesOrBytes); - } - - int Open(const TFile& file, size_t pages = 1, int pagesOrBytes = 1, ui32* gotRecordSig = nullptr) { - int ret = TReader::Init(file, TVal::RecordSig, gotRecordSig); - return ret ? ret : Open2(pages, pagesOrBytes); - } - - int Open(TAutoPtr<IInputStream> input, size_t pages = 1, int pagesOrBytes = 1, ui32* gotRecordSig = nullptr) { - int ret = TReader::Init(input, TVal::RecordSig, gotRecordSig); - return ret ? ret : Open2(pages, pagesOrBytes); - } - - int Open(const TFile& file, const TDatMetaPage* meta, size_t pages = 1, int pagesOrBytes = 1) { - int ret = TReader::Init(file, meta, TVal::RecordSig); - return ret ? ret : Open2(pages, pagesOrBytes); - } - - int Close() { - int ret1 = TRecIter::Term(); - int ret2 = TPageIter::Term(); - int ret3 = TReader::Term(); - return ret1 ? ret1 : ret2 ? ret2 : ret3; - } - - const TVal* GotoLastPage() { - return TReader::GetLastPage() <= 0 ? nullptr : TRecIter::GotoPage(TReader::GetLastPage() - 1); - } - -private: - int Open2(size_t pages, int pagesOrBytes) { - int ret = TPageIter::Init(pages, pagesOrBytes); - if (!ret) - ret = TRecIter::Init(); - if (ret) - Close(); - return ret; - } -}; - -template <class TVal> -class TInIndexFile: protected TInDatFileImpl<TVal> { - typedef TInDatFileImpl<TVal> TDatFile; - typedef typename TDatFile::TRecIter TRecIter; - typedef typename TRecIter::TPageIter TPageIter; - typedef typename TExtInfoType<TVal>::TResult TExtInfo; - -public: - using TDatFile::IsOpen; - - TInIndexFile() - : Index0(nullptr) - { - } - - int Open(const char* fname, size_t pages = 2, int pagesOrBytes = 1, ui32* gotRecordSig = nullptr) { - int ret = TDatFile::Open(fname, pages, pagesOrBytes, gotRecordSig); - if (ret) - return ret; - if (!(Index0 = (TDatPage*)malloc(TPageIter::GetPageSize()))) { - TDatFile::Close(); - return MBDB_NO_MEMORY; - } - if (!TExtInfoType<TVal>::Exists && SizeOf((TVal*)nullptr)) - RecsOnPage = (TPageIter::GetPageSize() - sizeof(TDatPage)) / DatCeil(SizeOf((TVal*)nullptr)); - TDatFile::Next(); - memcpy(Index0, TPageIter::Current(), TPageIter::GetPageSize()); - return 0; - } - - int Close() { - free(Index0); - Index0 = nullptr; - return TDatFile::Close(); - } - - inline int GetError() const { - return TDatFile::GetError(); - } - - int FindKey(const TVal* akey, const TExtInfo* extInfo = nullptr) { - assert(IsOpen()); - if (TExtInfoType<TVal>::Exists || !SizeOf((TVal*)nullptr)) - return FindVszKey(akey, extInfo); - int num = FindKeyOnPage(Index0, akey); - TDatPage* page = TPageIter::GotoPage(num + 1); - if (!page) - return 0; - num = FindKeyOnPage(page, akey); - num += (TPageIter::GetPageNum() - 1) * RecsOnPage; - return num; - } - - int FindVszKey(const TVal* akey, const TExtInfo* extInfo = NULL) { - int num = FindVszKeyOnPage(Index0, akey, extInfo); - int num_add = 0; - for (int p = 0; p < num; p++) { - TDatPage* page = TPageIter::GotoPage(p + 1); - if (!page) - return 0; - num_add += page->RecNum; - } - TDatPage* page = TPageIter::GotoPage(num + 1); - if (!page) - return 0; - num = FindVszKeyOnPage(page, akey, extInfo); - num += num_add; - return num; - } - -protected: - int FindKeyOnPage(TDatPage* page, const TVal* key) { - int left = 0; - int right = page->RecNum - 1; - int recsize = DatCeil(SizeOf((TVal*)nullptr)); - while (left < right) { - int middle = (left + right) >> 1; - if (*((TVal*)((char*)page + sizeof(TDatPage) + middle * recsize)) < *key) - left = middle + 1; - else - right = middle; - } - //borders check (left and right) - return (left == 0 || *((TVal*)((char*)page + sizeof(TDatPage) + left * recsize)) < *key) ? left : left - 1; - } - - // will deserialize rawExtinfoA to extInfoA only if necessery - inline bool KeyLess_(const TVal* a, const TVal* b, - TExtInfo* extInfoA, const TExtInfo* extInfoB, - const ui8* rawExtInfoA, size_t rawLen) { - if (*a < *b) { - return true; - } else if (!extInfoB || *b < *a) { - return false; - } else { - // *a == *b && extInfoB - Y_PROTOBUF_SUPPRESS_NODISCARD extInfoA->ParseFromArray(rawExtInfoA, rawLen); - return (*extInfoA < *extInfoB); - } - } - - int FindVszKeyOnPage(TDatPage* page, const TVal* key, const TExtInfo* extInfo) { - TVal* cur = (TVal*)((char*)page + sizeof(TDatPage)); - ui32 recnum = page->RecNum; - if (!TExtInfoType<TVal>::Exists) { - for (; recnum > 0 && *cur < *key; --recnum) - cur = (TVal*)((char*)cur + DatCeil(SizeOf(cur))); - } else { - size_t ll; - size_t l; - size_t sz = NMicroBDB::SizeOfExt(cur, &ll, &l); - TExtInfo ei; - for (; recnum > 0 && KeyLess_(cur, key, &ei, extInfo, (ui8*)cur + sz + ll, l); --recnum) { - cur = (TVal*)((ui8*)cur + DatCeil(sz + ll + l)); - sz = NMicroBDB::SizeOfExt(cur, &ll, &l); - } - } - - int idx = page->RecNum - recnum - 1; - return (idx >= 0) ? idx : 0; - } - - TDatPage* Index0; - int RecsOnPage; -}; - -template <class TVal, class TKey, class TPageIterator = TInputPageIterator<TInputPageFile>> -class TKeyFileMixin: public TInDatFileImpl<TVal, TInputRecordIterator<TVal, TPageIterator>> { -protected: - TInIndexFile<TKey> KeyFile; -}; - -template <class TVal, class TKey, class TBase = TKeyFileMixin<TVal, TKey>> -class TDirectInDatFile: public TBase { - typedef TBase TDatFile; - typedef typename TDatFile::TRecIter TRecIter; - typedef typename TDatFile::TPageIter TPageIter; - -public: - void Open(const char* path, size_t pages = 1, size_t keypages = 1, int pagesOrBytes = 1) { - int ret; - ui32 gotRecordSig = 0; - - ret = TDatFile::Open(path, pages, pagesOrBytes, &gotRecordSig); - if (ret) { - ythrow yexception() << ErrorMessage(ret, "Failed to open input file", path, TVal::RecordSig, gotRecordSig); - } - char KeyName[PATH_MAX + 1]; - if (DatNameToIdx(KeyName, path)) { - ythrow yexception() << ErrorMessage(MBDB_BAD_FILENAME, "Failed to open input file", path); - } - gotRecordSig = 0; - ret = KeyFile.Open(KeyName, keypages, 1, &gotRecordSig); - if (ret) { - ythrow yexception() << ErrorMessage(ret, "Failed to open input keyfile", KeyName, TKey::RecordSig, gotRecordSig); - } - } - - void Close() { - int ret; - - if (TDatFile::IsOpen() && (ret = TDatFile::GetError())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error before closing input file"); - if ((ret = TDatFile::Close())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error while closing input file"); - - if (KeyFile.IsOpen() && (ret = KeyFile.GetError())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error before closing input keyfile"); - if ((ret = KeyFile.Close())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error while closing input keyfile"); - } - - const TVal* FindRecord(const TKey* key, const typename TExtInfoType<TKey>::TResult* extInfo = nullptr) { - int page = KeyFile.FindKey(key, extInfo); - const TVal* val = TRecIter::GotoPage(page); - if (!TExtInfoType<TVal>::Exists || !extInfo) { - TKey k; - while (val) { - TMakeExtKey<TVal, TKey>::Make(&k, nullptr, val, nullptr); - if (!(k < *key)) - break; - val = TRecIter::Next(); - } - } else { - typename TExtInfoType<TVal>::TResult valExt; - TKey k; - typename TExtInfoType<TKey>::TResult kExt; - while (val) { - TRecIter::GetExtInfo(&valExt); - TMakeExtKey<TVal, TKey>::Make(&k, &kExt, val, &valExt); - if (*key < k || !(k < *key) && !(kExt < *extInfo)) // k > *key || k == *key && kExt >= *extInfo - break; - val = TRecIter::Next(); - } - } - return val; - }; - - int FindPagesNo(const TKey* key, const typename TExtInfoType<TVal>::TResult* extInfo = NULL) { - return KeyFile.FindKey(key, extInfo); - } - -protected: - using TBase::KeyFile; -}; diff --git a/library/cpp/microbdb/microbdb.cpp b/library/cpp/microbdb/microbdb.cpp deleted file mode 100644 index c10dbdf1268..00000000000 --- a/library/cpp/microbdb/microbdb.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "microbdb.h" diff --git a/library/cpp/microbdb/microbdb.h b/library/cpp/microbdb/microbdb.h deleted file mode 100644 index 75218873374..00000000000 --- a/library/cpp/microbdb/microbdb.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include <util/folder/dirut.h> - -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4706) /*assignment within conditional expression*/ -#pragma warning(disable : 4267) /*conversion from 'size_t' to 'type', possible loss of data*/ -#endif - -#include "align.h" -#include "extinfo.h" -#include "header.h" -#include "reader.h" -#include "heap.h" -#include "file.h" -#include "sorter.h" -#include "input.h" -#include "output.h" -#include "sorterdef.h" - -inline int MakeSorterTempl(char path[/*FILENAME_MAX*/], const char* prefix) { - int ret = MakeTempDir(path, prefix); - if (!ret && strlcat(path, "%06d", FILENAME_MAX) > FILENAME_MAX - 100) - ret = EINVAL; - if (ret) - path[0] = 0; - return ret; -} - -inline int GetMeta(TFile& file, TDatMetaPage* meta) { - ui8 buf[METASIZE], *ptr = buf; - ssize_t size = sizeof(buf), ret; - while (size && (ret = file.Read(ptr, size)) > 0) { - size -= ret; - ptr += ret; - } - if (size) - return MBDB_BAD_FILE_SIZE; - ptr = buf; // gcc 4.4 warning fix - *meta = *(TDatMetaPage*)ptr; - return (meta->MetaSig == METASIG) ? 0 : MBDB_BAD_METAPAGE; -} - -template <class TRec> -inline bool IsDatFile(const char* fname) { - TDatMetaPage meta; - TFile f(fname, RdOnly); - return !GetMeta(f, &meta) && meta.RecordSig == TRec::RecordSig; -} - -#if defined(_MSC_VER) -#pragma warning(pop) -#endif diff --git a/library/cpp/microbdb/noextinfo.proto b/library/cpp/microbdb/noextinfo.proto deleted file mode 100644 index 6a78882e079..00000000000 --- a/library/cpp/microbdb/noextinfo.proto +++ /dev/null @@ -1,4 +0,0 @@ - -message TNoExtInfo { -} - diff --git a/library/cpp/microbdb/output.h b/library/cpp/microbdb/output.h deleted file mode 100644 index d0ecab21085..00000000000 --- a/library/cpp/microbdb/output.h +++ /dev/null @@ -1,1049 +0,0 @@ -#pragma once - -#include "header.h" -#include "file.h" - -#include <util/generic/buffer.h> -#include <util/memory/tempbuf.h> - -#include <sys/uio.h> - -template <class TFileManip> -inline ssize_t Writev(TFileManip& fileManip, const struct iovec* iov, int iovcnt) { - ssize_t written_count = 0; - for (int n = 0; n < iovcnt; n++) { - ssize_t last_write = fileManip.Write(iov[n].iov_base, iov[n].iov_len); - if (last_write < 0) - return -1; - written_count += last_write; - } - return written_count; -} - -//********************************************************************* -struct TFakeIndexer { - inline void NextPage(TDatPage*) noexcept { - } -}; - -struct TCallbackIndexer { - typedef void (*TCallback)(void* This, const TDatPage* page); - - TCallbackIndexer() { - Callback = nullptr; - } - - void SetCallback(void* t, TCallback c) { - This = t; - Callback = c; - } - - void NextPage(TDatPage* dat) { - Callback(This, dat); - } - - TCallback Callback; - void* This; -}; - -template <class TVal, typename TBasePageIter, typename TBaseIndexer = TFakeIndexer, typename TCompressor = TFakeCompression> -class TOutputRecordIterator; - -template <class TVal, typename TBasePageIter, typename TBaseIndexer> -class TOutputRecordIterator<TVal, TBasePageIter, TBaseIndexer, TFakeCompression> - : public TBasePageIter, public TBaseIndexer { -public: - enum EOffset { - WrongOffset = size_t(-1) - }; - - typedef TBasePageIter TPageIter; - typedef TBaseIndexer TIndexer; - - TOutputRecordIterator() { - Clear(); - } - - ~TOutputRecordIterator() { - Term(); - } - - inline const TVal* Current() const { - return Rec; - } - - const TVal* Push(const TVal* v, const typename TExtInfoType<TVal>::TResult* extInfo = nullptr) { - NMicroBDB::AssertValid(v); - size_t len = SizeOf(v); - if (!TExtInfoType<TVal>::Exists) - return (Reserve(len)) ? (TVal*)memcpy(Rec, v, len) : nullptr; - else if (extInfo) { - size_t extSize = extInfo->ByteSize(); - size_t extLenSize = len_long((i64)extSize); - if (!Reserve(len + extLenSize + extSize)) - return nullptr; - memcpy(Rec, v, len); - out_long((i64)extSize, (char*)Rec + len); - extInfo->SerializeWithCachedSizesToArray((ui8*)Rec + len + extLenSize); - return Rec; - } else { - size_t extLenSize = len_long((i64)0); - if (!Reserve(len + extLenSize)) - return nullptr; - memcpy(Rec, v, len); - out_long((i64)0, (char*)Rec + len); - return Rec; - } - } - - const TVal* Push(const TVal* v, const ui8* extInfoRaw, size_t extLen) { - NMicroBDB::AssertValid(v); - size_t sz = SizeOf(v); - if (!Reserve(sz + extLen)) - return nullptr; - memcpy(Rec, v, sz); - memcpy((ui8*)Rec + sz, extInfoRaw, extLen); - return Rec; - } - - // use values stored in microbdb readers/writers internal buffer only. - // method expects serialized extInfo after this record - const TVal* PushWithExtInfo(const TVal* v) { - NMicroBDB::AssertValid(v); - size_t extSize; - size_t extLenSize; - size_t sz = NMicroBDB::SizeOfExt(v, &extLenSize, &extSize); - sz += extLenSize + extSize; - if (!Reserve(sz)) - return nullptr; - memcpy(Rec, v, sz); - return Rec; - } - - TVal* Reserve(size_t len) { - if (CurLen + DatCeil(len) > TPageIter::GetPageSize()) { - if (sizeof(TDatPage) + DatCeil(len) > TPageIter::GetPageSize()) - return Rec = nullptr; - if (TPageIter::Current() && RecNum) { - TPageIter::Current()->RecNum = RecNum; - TPageIter::Current()->Format = MBDB_FORMAT_RAW; - memset((char*)TPageIter::Current() + CurLen, 0, TPageIter::GetPageSize() - CurLen); - TIndexer::NextPage(TPageIter::Current()); - RecNum = 0; - } - if (!TPageIter::Next()) { - CurLen = TPageIter::GetPageSize(); - return Rec = nullptr; - } - CurLen = sizeof(TDatPage); - } - LenForOffset = CurLen; - Rec = (TVal*)((char*)TPageIter::Current() + CurLen); - DatSet(Rec, len); - - CurLen += DatCeil(len); - - ++RecNum; - return Rec; - } - - void Flush() { - TPageIter::Current()->RecNum = RecNum; - TPageIter::Current()->Format = MBDB_FORMAT_RAW; - } - - size_t Offset() const { - return Rec ? TPageIter::Offset() + LenForOffset : WrongOffset; - } - - void ResetDat() { - CurLen = (char*)Rec - (char*)TPageIter::Current(); - size_t len; - if (!TExtInfoType<TVal>::Exists) { - len = SizeOf(Rec); - } else { - size_t ll; - size_t l; - len = NMicroBDB::SizeOfExt(Rec, &ll, &l); - len += ll + l; - } - CurLen += DatCeil(len); - } - -protected: - void Clear() { - Rec = nullptr; - RecNum = 0; - CurLen = 0; - LenForOffset = 0; - } - - int Init() { - Clear(); - CurLen = TPageIter::GetPageSize(); - return 0; - } - - int Term() { - if (TPageIter::Current()) { - TPageIter::Current()->RecNum = RecNum; - TPageIter::Current()->Format = MBDB_FORMAT_RAW; - memset((char*)TPageIter::Current() + CurLen, 0, TPageIter::GetPageSize() - CurLen); - RecNum = 0; - } - int ret = !TPageIter::Current() && RecNum; - Clear(); - return ret; - } - - int GotoPage(int pageno) { - if (TPageIter::Current()) { - TPageIter::Current()->RecNum = RecNum; - TPageIter::Current()->Format = MBDB_FORMAT_RAW; - memset((char*)TPageIter::Current() + CurLen, 0, TPageIter::GetPageSize() - CurLen); - } - int ret = TPageIter::GotoPage(pageno); - if (!ret) { - RecNum = 0; - CurLen = sizeof(TDatPage); - } - return ret; - } - - TVal* Rec; - int RecNum; - size_t CurLen; - size_t LenForOffset; -}; - -template <class TVal, typename TBasePageIter, typename TBaseIndexer, typename TAlgorithm> -class TOutputRecordIterator - : public TBasePageIter, - public TBaseIndexer, - private TAlgorithm { - class TPageBuffer { - public: - void Init(size_t page) { - Pos = 0; - RecNum = 0; - Size = Min(page / 2, size_t(64 << 10)); - Data.Reset(new ui8[Size]); - } - - void Clear() { - Pos = 0; - RecNum = 0; - } - - inline bool Empty() const { - return RecNum == 0; - } - - public: - size_t Size; - size_t Pos; - int RecNum; - TArrayHolder<ui8> Data; - }; - -public: - typedef TBasePageIter TPageIter; - typedef TBaseIndexer TIndexer; - - TOutputRecordIterator() - : Rec(nullptr) - , RecNum(0) - { - } - - ~TOutputRecordIterator() { - Term(); - } - - const TVal* Current() const { - return Rec; - } - - const TVal* Push(const TVal* v, const typename TExtInfoType<TVal>::TResult* extInfo = nullptr) { - NMicroBDB::AssertValid(v); - size_t len = SizeOf(v); - if (!TExtInfoType<TVal>::Exists) - return (Reserve(len)) ? (TVal*)memcpy((TVal*)Rec, v, len) : nullptr; - else if (extInfo) { - size_t extSize = extInfo->ByteSize(); - size_t extLenSize = len_long((i64)extSize); - if (!Reserve(len + extLenSize + extSize)) - return nullptr; - memcpy(Rec, v, len); - out_long((i64)extSize, (char*)Rec + len); - extInfo->SerializeWithCachedSizesToArray((ui8*)Rec + len + extLenSize); - return Rec; - } else { - size_t extLenSize = len_long((i64)0); - if (!Reserve(len + extLenSize)) - return nullptr; - memcpy(Rec, v, len); - out_long((i64)0, (char*)Rec + len); - return Rec; - } - } - - const TVal* Push(const TVal* v, const ui8* extInfoRaw, size_t extLen) { - NMicroBDB::AssertValid(v); - size_t sz = SizeOf(v); - if (!Reserve(sz + extLen)) - return NULL; - memcpy(Rec, v, sz); - memcpy((ui8*)Rec + sz, extInfoRaw, extLen); - return Rec; - } - - // use values stored in microbdb readers/writers internal buffer only. - // method expects serialized extInfo after this record - const TVal* PushWithExtInfo(const TVal* v) { - NMicroBDB::AssertValid(v); - size_t extSize; - size_t extLenSize; - size_t sz = NMicroBDB::SizeOfExt(v, &extLenSize, &extSize); - sz += extLenSize + extSize; - if (!Reserve(sz)) - return nullptr; - memcpy(Rec, v, sz); - return Rec; - } - - TVal* Reserve(const size_t len) { - const size_t aligned = DatCeil(len); - - if (!TPageIter::Current()) { // Allocate fist page - if (!TPageIter::Next()) { - CurLen = TPageIter::GetPageSize(); - return Rec = nullptr; - } - CurLen = sizeof(TDatPage) + sizeof(TCompressedPage); - } - - if (Buffer.Pos + aligned > Buffer.Size) { - if (Buffer.Pos == 0) - return Rec = nullptr; - if (FlushBuffer()) - return Rec = nullptr; - if (Buffer.Pos + aligned + sizeof(TDatPage) + sizeof(TCompressedPage) > Buffer.Size) - return Rec = nullptr; - } - - Rec = (TVal*)((char*)Buffer.Data.Get() + Buffer.Pos); - DatSet(Rec, len); // len is correct because DatSet set align tail to zero - - Buffer.RecNum++; - Buffer.Pos += aligned; - ++RecNum; - return Rec; - } - - void Flush() { - if (!Buffer.Empty()) { - FlushBuffer(); - TPageIter::Current()->RecNum = RecNum; - TPageIter::Current()->Format = MBDB_FORMAT_COMPRESSED; - } - } - - size_t Offset() const { - // According to vadya@ there is no evil to return 0 all the time - return 0; - } - - void ResetDat() { - Buffer.Pos = (char*)Rec - (char*)Buffer.Data.Get(); - size_t len = SizeOf(Rec); - Buffer.Pos += DatCeil(len); - } - -protected: - void Clear() { - RecNum = 0; - Rec = nullptr; - Count = 0; - CurLen = sizeof(TDatPage) + sizeof(TCompressedPage); - Buffer.Clear(); - } - - int Init() { - Clear(); - Buffer.Init(TPageIter::GetPageSize()); - TAlgorithm::Init(); - return 0; - } - - int Term() { - if (TPageIter::Current()) - Commit(); - int ret = !TPageIter::Current() && RecNum; - Clear(); - TAlgorithm::Term(); - return ret; - } - - int GotoPage(int pageno) { - if (TPageIter::Current()) - Commit(); - int ret = TPageIter::GotoPage(pageno); - if (!ret) - Reset(); - return ret; - } - -private: - void Commit() { - Flush(); - TPageIter::Current()->RecNum = RecNum; - TPageIter::Current()->Format = MBDB_FORMAT_COMPRESSED; - SetCompressedPageHeader(); - - memset((char*)TPageIter::Current() + CurLen, 0, TPageIter::GetPageSize() - CurLen); - RecNum = 0; - Count = 0; - } - - inline void SetCompressedPageHeader() { - TCompressedPage* const hdr = (TCompressedPage*)((ui8*)TPageIter::Current() + sizeof(TDatPage)); - - hdr->BlockCount = Count; - hdr->Algorithm = TAlgorithm::Code; - hdr->Version = 0; - hdr->Reserved = 0; - } - - inline void Reset() { - RecNum = 0; - CurLen = sizeof(TDatPage) + sizeof(TCompressedPage); - Count = 0; - Buffer.Clear(); - } - - int FlushBuffer() { - TArrayHolder<ui8> data; - const ui8* const buf = Buffer.Data.Get(); - size_t first = 0; - - if (!TExtInfoType<TVal>::Exists) - first = DatCeil(SizeOf((TVal*)buf)); - else { - size_t ll; - size_t l; - first = NMicroBDB::SizeOfExt((const TVal*)buf, &ll, &l); - first = DatCeil(first + ll + l); - } - - size_t total = sizeof(NMicroBDB::TCompressedHeader) + first + ((Buffer.RecNum == 1) ? 0 : TAlgorithm::CompressBound(Buffer.Pos - first)); - size_t real = total; - - { - ui8* p = nullptr; - NMicroBDB::TCompressedHeader* hdr = nullptr; - - // 1. Choose data destination (temporary buffer or dat-page) - if (CurLen + total > TPageIter::GetPageSize()) { - data.Reset(new ui8[total]); - - hdr = (NMicroBDB::TCompressedHeader*)data.Get(); - p = data.Get() + sizeof(NMicroBDB::TCompressedHeader); - } else { - p = (ui8*)TPageIter::Current() + CurLen; - hdr = (NMicroBDB::TCompressedHeader*)p; - p += sizeof(NMicroBDB::TCompressedHeader); - } - - // 2. Compress data - - // Fill header and first record - hdr->Original = Buffer.Pos; - hdr->Compressed = 0; - hdr->Count = Buffer.RecNum; - hdr->Reserved = 0; - memcpy(p, Buffer.Data.Get(), first); - // Fill compressed part - if (Buffer.RecNum > 1) { - size_t size = TAlgorithm::CompressBound(Buffer.Pos - first); - - p += first; - TAlgorithm::Compress(p, size, buf + first, Buffer.Pos - first); - - hdr->Compressed = size; - - real = sizeof(NMicroBDB::TCompressedHeader) + first + size; - } - } - - Y_ASSERT(sizeof(TDatPage) + sizeof(TCompressedPage) + real <= TPageIter::GetPageSize()); - - // 3. Check page capacity - - if (CurLen + real > TPageIter::GetPageSize()) { - Y_ASSERT(data.Get() != nullptr); - - if (TPageIter::Current() && RecNum) { - RecNum = RecNum - Buffer.RecNum; - TPageIter::Current()->RecNum = RecNum; - TPageIter::Current()->Format = MBDB_FORMAT_COMPRESSED; - SetCompressedPageHeader(); - memset((char*)TPageIter::Current() + CurLen, 0, TPageIter::GetPageSize() - CurLen); - TIndexer::NextPage(TPageIter::Current()); - RecNum = Buffer.RecNum; - Count = 0; - } - if (!TPageIter::Next()) { - CurLen = TPageIter::GetPageSize(); - return MBDB_NO_MEMORY; - } - CurLen = sizeof(TDatPage) + sizeof(TCompressedPage); - } - - // 4. Flush data and reset buffer state - - if (data.Get()) - memcpy((ui8*)TPageIter::Current() + CurLen, data.Get(), real); - CurLen += real; - ++Count; - Buffer.Clear(); - return 0; - } - -private: - size_t CurLen; - TPageBuffer Buffer; - TVal* Rec; - ui32 Count; //! < count of compressed blocks on page -public: - int RecNum; -}; - -template <typename TBaseWriter> -class TOutputPageIterator: public TBaseWriter { -public: - typedef TBaseWriter TWriter; - - TOutputPageIterator() - : Buf(nullptr) - { - Clear(); - } - - ~TOutputPageIterator() { - Term(); - } - - TDatPage* Current() { - return CurPage; - } - - size_t Offset() const { - //Cout << "PS = " << TWriter::GetPageSize() << "; PN = " << PageNum << "; MS = " << METASIZE << Endl; - return TWriter::GetPageSize() * PageNum + METASIZE; - } - - int Freeze() { - return (Frozen = (PageNum == -1) ? 0 : (int)PageNum); - } - - void Unfreeze() { - Frozen = -1; - } - - inline int IsFrozen() const { - return Frozen + 1; - } - - inline size_t GetPageSize() const { - return TWriter::GetPageSize(); - } - - inline int GetPageNum() const { - return (int)PageNum; - } - - TDatPage* Next() { - if (PageNum >= Maxpage && WriteBuf()) - return CurPage = nullptr; - CurPage = (TDatPage*)(Buf + ((++PageNum) % Bufpages) * GetPageSize()); - memset(CurPage, 0, sizeof(TDatPage)); - return CurPage; - } - -protected: - int Init(size_t pages, int pagesOrBytes) { - Term(); - if (pagesOrBytes) - Bufpages = pages; - else - Bufpages = pages / GetPageSize(); - Bufpages = Max<size_t>(1, Bufpages); - Maxpage = Bufpages - 1; - // if (!(Buf = (char*)malloc(Bufpages * GetPageSize()))) - // return ENOMEM; - ABuf.Alloc(Bufpages * GetPageSize()); - Buf = ABuf.Begin(); - if (TWriter::Memo) - Freeze(); - return 0; - } - - int Term() { - Unfreeze(); - int ret = (PageNum < 0) ? 0 : WriteBuf(); - Clear(); - return ret; - } - - int GotoPage(int pageno) { - int ret = EAGAIN; - if (IsFrozen() || PageNum >= 0 && ((ret = WriteBuf())) || ((ret = TWriter::GotoPage(pageno)))) - return ret; - PageNum = pageno; - Maxpage = Bufpages - 1 + pageno; - CurPage = (TDatPage*)(Buf + (PageNum % Bufpages) * GetPageSize()); - memset(CurPage, 0, sizeof(TDatPage)); - return 0; - } - - void Clear() { - ABuf.Dealloc(); - Buf = nullptr; - Maxpage = PageNum = Frozen = -1; - Bufpages = 0; - CurPage = nullptr; - } - - int WriteBuf() { - int nvec; - iovec vec[2]; - ssize_t minpage = Maxpage - Bufpages + 1; - ssize_t maxpage = Frozen == -1 ? PageNum : Frozen - 1; - if (maxpage < minpage) - return EAGAIN; - minpage %= Bufpages; - maxpage %= Bufpages; - if (maxpage < minpage) { - vec[0].iov_base = Buf + GetPageSize() * minpage; - vec[0].iov_len = GetPageSize() * (Bufpages - minpage); - vec[1].iov_base = Buf; - vec[1].iov_len = GetPageSize() * (maxpage + 1); - nvec = 2; - } else { - vec[0].iov_base = Buf + GetPageSize() * minpage; - vec[0].iov_len = GetPageSize() * (maxpage - minpage + 1); - nvec = 1; - } - if (TWriter::WritePages(vec, nvec)) - return EIO; - Maxpage += (maxpage < minpage) ? (Bufpages - minpage + maxpage + 1) : (maxpage - minpage + 1); - return 0; - } - - ssize_t Maxpage; - ssize_t Bufpages; - ssize_t PageNum; - int Frozen; - TDatPage* CurPage; - char* Buf; - TMappedAllocation ABuf; -}; - -template <class TFileManip> -class TOutputPageFileImpl: private TNonCopyable { -public: - TOutputPageFileImpl() - : Pagesize(0) - , Eof(1) - , Error(0) - , Memo(0) - , Recordsig(0) - { - } - - ~TOutputPageFileImpl() { - Term(); - } - - inline int IsEof() const { - return Eof; - } - - inline int GetError() const { - return Error; - } - - inline bool IsOpen() const { - return FileManip.IsOpen(); - } - - inline size_t GetPageSize() const { - return Pagesize; - } - - inline ui32 GetRecordSig() const { - return Recordsig; - } - - int Init(const char* fname, size_t pagesize, ui32 recsig, bool direct = false) { - Memo = 0; - if (FileManip.IsOpen()) - return MBDB_ALREADY_INITIALIZED; - - if (!fname) { - Eof = Error = 0; - Pagesize = pagesize; - Recordsig = recsig; - Memo = 1; - return 0; - } - - Error = FileManip.Open(fname, WrOnly | CreateAlways | ARW | AWOther | (direct ? DirectAligned : EOpenMode())); - if (Error) - return Error; - Error = Init(TFile(), pagesize, recsig); - if (Error) { - FileManip.Close(); - unlink(fname); - } - return Error; - } - - int Init(TAutoPtr<IOutputStream> output, size_t pagesize, ui32 recsig) { - Memo = 0; - if (FileManip.IsOpen()) { - return MBDB_ALREADY_INITIALIZED; - } - - if (!output) { - Eof = Error = 0; - Pagesize = pagesize; - Recordsig = recsig; - Memo = 1; - return 0; - } - - Error = FileManip.Open(output); - if (Error) - return Error; - Error = Init(TFile(), pagesize, recsig); - if (Error) { - FileManip.Close(); - } - return Error; - } - - int Init(const TFile& file, size_t pagesize, ui32 recsig) { - Memo = 0; - if (!file.IsOpen() && !FileManip.IsOpen()) - return MBDB_NOT_INITIALIZED; - if (file.IsOpen() && FileManip.IsOpen()) - return MBDB_ALREADY_INITIALIZED; - if (file.IsOpen()) { - Error = FileManip.Init(file); - if (Error) - return Error; - } - - Eof = 1; - TTempBuf buf(METASIZE + FS_BLOCK_SIZE); - const char* ptr = (buf.Data() + FS_BLOCK_SIZE - ((ui64)buf.Data() & (FS_BLOCK_SIZE - 1))); - TDatMetaPage* meta = (TDatMetaPage*)ptr; - - memset(buf.Data(), 0, buf.Size()); - meta->MetaSig = METASIG; - meta->PageSize = Pagesize = pagesize; - meta->RecordSig = Recordsig = recsig; - - ssize_t size = METASIZE, ret = 0; - while (size && (ret = FileManip.Write(ptr, (unsigned)size)) > 0) { - size -= ret; - ptr += ret; - } - if (size || ret <= 0) { - Term(); - return Error = errno ? errno : MBDB_WRITE_ERROR; - } - - Error = Eof = 0; - return Error; - } - -protected: - int WritePages(iovec* vec, int nvec) { - if (Error || Memo) - return Error; - - ssize_t size, delta; - iovec* pvec; - int vsize; - - for (vsize = 0, pvec = vec; vsize < nvec; vsize++, pvec++) - for (size = 0; (size_t)size < pvec->iov_len; size += Pagesize) - ((TDatPage*)((char*)pvec->iov_base + size))->PageSig = PAGESIG; - - delta = size = 0; - pvec = vec; - vsize = nvec; - while (vsize && (size = Writev(FileManip, pvec, (int)Min(vsize, 16))) > 0) { - if (delta) { - size += delta; - pvec->iov_len += delta; - pvec->iov_base = (char*)pvec->iov_base - delta; - delta = 0; - } - while (size) { - if ((size_t)size >= pvec->iov_len) { - size -= pvec->iov_len; - ++pvec; - --vsize; - } else { - delta = size; - pvec->iov_len -= size; - pvec->iov_base = (char*)pvec->iov_base + size; - size = 0; - } - } - } - if (delta) { - pvec->iov_len += delta; - pvec->iov_base = (char*)pvec->iov_base - delta; - } - return Error = (!size && !vsize) ? 0 : errno ? errno : MBDB_WRITE_ERROR; - } - - i64 Tell() { - return FileManip.RealSeek(0, SEEK_CUR); - } - - int GotoPage(int pageno) { - if (Error || Memo) - return Error; - Eof = 0; - i64 offset = (i64)pageno * Pagesize + METASIZE; - if (offset != FileManip.Seek(offset, SEEK_SET)) - Error = MBDB_BAD_FILE_SIZE; - return Error; - } - - int Term() { - int ret = FileManip.Close(); - Eof = 1; - Memo = 0; - if (!Error) - Error = ret; - return Error; - } - - size_t Pagesize; - int Eof; - int Error; - int Memo; - ui32 Recordsig; - -private: - TFileManip FileManip; -}; - -using TOutputPageFile = TOutputPageFileImpl<TOutputFileManip>; - -template <class TVal, - typename TBaseRecIter = TOutputRecordIterator<TVal, TOutputPageIterator<TOutputPageFile>>> -class TOutDatFileImpl: public TBaseRecIter { -public: - typedef TBaseRecIter TRecIter; - typedef typename TRecIter::TPageIter TPageIter; - typedef typename TRecIter::TPageIter::TWriter TWriter; - - int Open(const char* fname, size_t pagesize, size_t pages = 1, int pagesOrBytes = 1, bool direct = false) { - int ret = TWriter::Init(fname, pagesize, TVal::RecordSig, direct); - return ret ? ret : Open2(pages, pagesOrBytes); - } - - int Open(const TFile& file, size_t pagesize, size_t pages = 1, int pagesOrBytes = 1) { - int ret = TWriter::Init(file, pagesize, TVal::RecordSig); - return ret ? ret : Open2(pages, pagesOrBytes); - } - - int Open(TAutoPtr<IOutputStream> output, size_t pagesize, size_t pages = 1, int pagesOrBytes = 1) { - int ret = TWriter::Init(output, pagesize, TVal::RecordSig); - return ret ? ret : Open2(pages, pagesOrBytes); - } - - int Close() { - int ret1 = TRecIter::Term(); - int ret2 = TPageIter::Term(); - int ret3 = TWriter::Term(); - return ret1 ? ret1 : ret2 ? ret2 : ret3; - } - -private: - int Open2(size_t pages, int pagesOrBytes) { - int ret = TPageIter::Init(pages, pagesOrBytes); - if (!ret) - ret = TRecIter::Init(); - if (ret) - Close(); - return ret; - } -}; - -template <class TVal> -class TOutIndexFile: public TOutDatFileImpl< - TVal, - TOutputRecordIterator<TVal, TOutputPageIterator<TOutputPageFile>, TCallbackIndexer, TFakeCompression>> { - typedef TOutDatFileImpl< - TVal, - TOutputRecordIterator<TVal, TOutputPageIterator<TOutputPageFile>, TCallbackIndexer, TFakeCompression>> - TDatFile; - typedef TOutIndexFile<TVal> TMyType; - typedef typename TDatFile::TRecIter TRecIter; - typedef typename TRecIter::TPageIter TPageIter; - typedef typename TRecIter::TIndexer TIndexer; - -public: - TOutIndexFile() { - TIndexer::SetCallback(this, DispatchCallback); - } - - int Open(const char* fname, size_t pagesize, size_t pages, int pagesOrBytes = 1) { - int ret = TDatFile::Open(fname, pagesize, pages, pagesOrBytes); - if (ret) - return ret; - if ((ret = TRecIter::GotoPage(1))) { - TDatFile::Close(); - return ret; - } - Index0.Clear(); - return ret; - } - - int Close() { - TPageIter::Unfreeze(); - if (TRecIter::RecNum) { - TRecIter::Flush(); - NextPage(TPageIter::Current()); - } - int ret = 0; - if (Index0.Size() && !(ret = TRecIter::GotoPage(0))) { - const char* ptr = Index0.Begin(); - size_t recSize; - while (ptr < Index0.End()) { - Y_ASSERT((size_t)(Index0.End() - ptr) >= sizeof(size_t)); - memcpy(&recSize, ptr, sizeof(size_t)); - ptr += sizeof(size_t); - Y_ASSERT((size_t)(Index0.End() - ptr) >= recSize); - ui8* buf = (ui8*)TRecIter::Reserve(recSize); - if (!buf) { - ret = MBDB_PAGE_OVERFLOW; - break; - } - memcpy(buf, ptr, recSize); - TRecIter::ResetDat(); - ptr += recSize; - } - Index0.Clear(); - ret = (TPageIter::GetPageNum() != 0) ? MBDB_PAGE_OVERFLOW : TPageIter::GetError(); - } - int ret1 = TDatFile::Close(); - return ret ? ret : ret1; - } - -protected: - TBuffer Index0; - - void NextPage(const TDatPage* page) { - const TVal* first = (const TVal*)NMicroBDB::GetFirstRecord(page); - size_t sz; - if (!TExtInfoType<TVal>::Exists) { - sz = SizeOf(first); - } else { - size_t ll; - size_t l; - sz = NMicroBDB::SizeOfExt(first, &ll, &l); - sz += ll + l; - } - Index0.Append((const char*)&sz, sizeof(size_t)); - Index0.Append((const char*)first, sz); - } - - static void DispatchCallback(void* This, const TDatPage* page) { - ((TMyType*)This)->NextPage(page); - } -}; - -template <class TVal, class TKey, typename TCompressor = TFakeCompression, class TPageFile = TOutputPageFile> -class TOutDirectFileImpl: public TOutDatFileImpl< - TVal, - TOutputRecordIterator<TVal, TOutputPageIterator<TPageFile>, TCallbackIndexer, TCompressor>> { - typedef TOutDatFileImpl< - TVal, - TOutputRecordIterator<TVal, TOutputPageIterator<TPageFile>, TCallbackIndexer, TCompressor>> - TDatFile; - typedef TOutDirectFileImpl<TVal, TKey, TCompressor, TPageFile> TMyType; - typedef typename TDatFile::TRecIter TRecIter; - typedef typename TRecIter::TPageIter TPageIter; - typedef typename TRecIter::TIndexer TIndexer; - typedef TOutIndexFile<TKey> TKeyFile; - -public: - TOutDirectFileImpl() { - TIndexer::SetCallback(this, DispatchCallback); - } - - int Open(const char* fname, size_t pagesize, int pages = 1, size_t ipagesize = 0, size_t ipages = 1, int pagesOrBytes = 1) { - char iname[FILENAME_MAX]; - int ret; - if (ipagesize == 0) - ipagesize = pagesize; - ret = TDatFile::Open(fname, pagesize, pages, pagesOrBytes); - ret = ret ? ret : DatNameToIdx(iname, fname); - ret = ret ? ret : KeyFile.Open(iname, ipagesize, ipages, pagesOrBytes); - if (ret) - TDatFile::Close(); - return ret; - } - - int Close() { - if (TRecIter::RecNum) { - TRecIter::Flush(); - NextPage(TPageIter::Current()); - } - int ret = KeyFile.Close(); - int ret1 = TDatFile::Close(); - return ret1 ? ret1 : ret; - } - - int GetError() const { - return TDatFile::GetError() ? TDatFile::GetError() : KeyFile.GetError(); - } - -protected: - TKeyFile KeyFile; - - void NextPage(const TDatPage* page) { - typedef TMakeExtKey<TVal, TKey> TMakeExtKey; - - TVal* val = (TVal*)NMicroBDB::GetFirstRecord(page); - TKey key; - if (!TMakeExtKey::Exists) { - TMakeExtKey::Make(&key, nullptr, val, nullptr); - KeyFile.Push(&key); - } else { - size_t ll; - size_t l; - size_t sz = NMicroBDB::SizeOfExt(val, &ll, &l); - typename TExtInfoType<TVal>::TResult valExt; - if (TExtInfoType<TVal>::Exists) - Y_PROTOBUF_SUPPRESS_NODISCARD valExt.ParseFromArray((ui8*)val + sz + ll, l); - typename TExtInfoType<TKey>::TResult keyExt; - TMakeExtKey::Make(&key, &keyExt, val, &valExt); - KeyFile.Push(&key, &keyExt); - } - } - - static void DispatchCallback(void* This, const TDatPage* page) { - ((TMyType*)This)->NextPage(page); - } -}; diff --git a/library/cpp/microbdb/powersorter.h b/library/cpp/microbdb/powersorter.h deleted file mode 100644 index c40de9c23f0..00000000000 --- a/library/cpp/microbdb/powersorter.h +++ /dev/null @@ -1,667 +0,0 @@ -#pragma once - -#include "safeopen.h" - -#include <util/generic/vector.h> -#include <util/generic/deque.h> -#include <util/system/mutex.h> -#include <util/system/condvar.h> -#include <util/thread/pool.h> - -template < - class TRecord, - template <typename T> class TCompare, - class TSieve, - class TMemoFile = TOutDatFile<TRecord>> -class TDatSorterBuf { -public: - typedef TRecord TRec; - typedef TVector<TRec*> TVectorType; - typedef TMemoFile TMemo; - typedef TCompare<TRecord> TComp; - -public: - TDatSorterBuf(size_t memory, size_t pageSize) - : Memo("memo", pageSize, memory, 0) - , Cur() - { - Memo.Open(nullptr); - Memo.Freeze(); - } - - ~TDatSorterBuf() { - Vector.clear(); - Memo.Close(); - } - - const TRec* Push(const TRec* v) { - const TRec* u = Memo.Push(v); - if (u) - Vector.push_back((TRec*)u); - return u; - } - - const TRec* Next() { - if (Ptr == Vector.end()) { - if (Cur) - TSieve::Sieve(Cur, Cur); - Cur = nullptr; - } else { - Cur = *Ptr++; - if (!TIsSieveFake<TSieve>::Result) - while (Ptr != Vector.end() && TSieve::Sieve(Cur, *Ptr)) - ++Ptr; - } - return Cur; - } - - const TRec* Current() { - return Cur; - } - - size_t Size() { - return Vector.size(); - } - - void Sort() { - Ptr = Vector.begin(); - Cur = nullptr; - - MBDB_SORT_FUN(Vector.begin(), Vector.end(), TComp()); - } - - void Clear() { - Vector.clear(); - Memo.Freeze(); - Ptr = Vector.begin(); - Cur = nullptr; - } - -private: - TVectorType Vector; - TMemo Memo; - - typename TVectorType::iterator - Ptr; - TRec* Cur; -}; - -template < - class TRecord, - class TInput, - template <typename T> class TCompare, - class TSieve> -class TDatMerger { -public: - typedef TRecord TRec; - typedef TCompare<TRecord> TComp; - typedef TSimpleSharedPtr<TInput> TInputPtr; - typedef TVector<TInputPtr> TInputVector; - -public: - ~TDatMerger() { - Close(); - } - - void Init(const TInputVector& inputs) { - Inputs = inputs; - TVector<TInput*> v; - for (int i = 0; i < Inputs.ysize(); ++i) - v.push_back(Inputs[i].Get()); - HeapIter.Init(&v[0], v.size()); - if (!TIsSieveFake<TSieve>::Result) - PNext = HeapIter.Next(); - } - - const TRec* Next() { - if (TIsSieveFake<TSieve>::Result) { - return HeapIter.Next(); - } - - if (!PNext) { - if (PCur) { - TSieve::Sieve(PCur, PCur); - PCur = nullptr; - } - return nullptr; - } - - PCur = &Cur; - memcpy(PCur, PNext, SizeOf((const TRec*)PNext)); - - do { - PNext = HeapIter.Next(); - } while (PNext && TSieve::Sieve(PCur, PNext)); - - return PCur; - } - - const TRec* Current() { - return (TIsSieveFake<TSieve>::Result ? HeapIter.Current() : PCur); - } - - void Close() { - Inputs.clear(); - HeapIter.Term(); - } - -private: - TInputVector Inputs; - THeapIter<TRec, TInput, TComp> HeapIter; - TRec Cur; - TRec* PCur = nullptr; - const TRec* PNext = nullptr; -}; - -class TPortionManager { -public: - void Open(const char* tempDir) { - TGuard<TMutex> guard(Mutex); - TempDir = tempDir; - } - - TString Next() { - TGuard<TMutex> guard(Mutex); - if (Portions == 0) - DoOpen(); - TString fname = GeneratePortionFilename(Portions++); - return fname; - } - - void Close() { - TGuard<TMutex> guard(Mutex); - Portions = 0; - } - -private: - void DoOpen() { - if (MakeSorterTempl(PortionFilenameTempl, TempDir.data())) { - PortionFilenameTempl[0] = 0; - ythrow yexception() << "portion-manager: bad tempdir \"" << TempDir.data() << "\": " << LastSystemErrorText(); - } - } - - TString GeneratePortionFilename(int i) { - char str[FILENAME_MAX]; - snprintf(str, sizeof(str), PortionFilenameTempl, i); - return TString(str); - } - -private: - TMutex Mutex; - - TString TempDir; - char PortionFilenameTempl[FILENAME_MAX] = {}; - int Portions = 0; -}; - -// A merger powered by threads -template < - class TRecord, - template <typename T> class TCompare, - class TSieve, - class TInput = TInDatFile<TRecord>, - class TOutput = TOutDatFile<TRecord>> -class TPowerMerger { -public: - typedef TRecord TRec; - typedef TDatMerger<TRecord, TInput, TCompare, TSieve> TMerger; - typedef TSimpleSharedPtr<TMerger> TMergerPtr; - typedef TPowerMerger<TRecord, TCompare, TSieve, TInput, TOutput> TFileMerger; - - struct TMergePortionTask: public IObjectInQueue { - TFileMerger* FileMerger; - int Begin; - int End; - TString OutFname; - - TMergePortionTask(TFileMerger* fileMerger, int begin, int end, const TString& outFname) - : FileMerger(fileMerger) - , Begin(begin) - , End(end) - , OutFname(outFname) - { - } - - void Process(void*) override { - THolder<TMergePortionTask> This(this); - //fprintf(stderr, "MergePortion: (%i, %i, %s)\n", Begin, End, ~OutFname); - FileMerger->MergePortion(Begin, End, OutFname); - } - }; - -public: - TPowerMerger(const TSimpleSharedPtr<TThreadPool>& mtpQueue, const TSimpleSharedPtr<TPortionManager>& portMan, - int memory, int pageSize, bool autoUnlink) - : MtpQueue(mtpQueue) - , PortionManager(portMan) - , Memory(memory) - , PageSize(pageSize) - , AutoUnlink(autoUnlink) - { - } - - TPowerMerger(const TSimpleSharedPtr<TThreadPool>& mtpQueue, const char* tempDir, - int memory, int pageSize, bool autoUnlink) - : MtpQueue(mtpQueue) - , PortionManager(new TPortionManager) - , Memory(memory) - , PageSize(pageSize) - , AutoUnlink(autoUnlink) - { - PortionManager->Open(tempDir); - } - - ~TPowerMerger() { - Close(); - } - - void SetMtpQueue(const TSimpleSharedPtr<TThreadPool>& mtpQueue) { - MtpQueue = mtpQueue; - } - - void MergePortion(int begin, int end, const TString& outFname) { - TMerger merger; - InitMerger(merger, begin, end); - - TOutput out("mergeportion-tmpout", PageSize, BufSize, 0); - out.Open(outFname.data()); - const TRec* rec; - while ((rec = merger.Next())) - out.Push(rec); - out.Close(); - - merger.Close(); - - { - TGuard<TMutex> guard(Mutex); - UnlinkFiles(begin, end); - Files.push_back(outFname); - --Tasks; - TaskFinishedCond.Signal(); - } - } - - void Add(const TString& fname) { - TGuard<TMutex> guard(Mutex); - // fprintf(stderr, "TPowerMerger::Add: %s\n", ~fname); - Files.push_back(fname); - if (InitialFilesEnd > 0) - ythrow yexception() << "TPowerMerger::Add: no more files allowed"; - } - - void Merge(int maxPortions) { - TGuard<TMutex> guard(Mutex); - InitialFilesEnd = Files.ysize(); - if (!InitialFilesEnd) - ythrow yexception() << "TPowerMerger::Merge: no files added"; - Optimize(maxPortions); - MergeMT(); - InitMerger(Merger, CPortions, Files.ysize()); - } - - void Close() { - TGuard<TMutex> guard(Mutex); - Merger.Close(); - UnlinkFiles(CPortions, Files.ysize()); - InitialFilesEnd = CPortions = 0; - Files.clear(); - } - - const TRec* Next() { - return Merger.Next(); - } - - const TRec* Current() { - return Merger.Current(); - } - - int FileCount() const { - TGuard<TMutex> guard(Mutex); - return Files.ysize(); - } - -private: - void InitMerger(TMerger& merger, int begin, int end) { - TGuard<TMutex> guard(Mutex); - TVector<TSimpleSharedPtr<TInput>> inputs; - for (int i = begin; i < end; ++i) { - inputs.push_back(new TInput("mergeportion-tmpin", BufSize, 0)); - inputs.back()->Open(Files[i]); - // fprintf(stderr, "InitMerger: %i, %s\n", i, ~Files[i]); - } - merger.Init(inputs); - } - - void UnlinkFiles(int begin, int end) { - TGuard<TMutex> guard(Mutex); - for (int i = begin; i < end; ++i) { - if (i >= InitialFilesEnd || AutoUnlink) - unlink(Files[i].c_str()); - } - } - - void Optimize(int maxPortions, size_t maxBufSize = 4u << 20) { - TGuard<TMutex> guard(Mutex); - maxPortions = std::min(maxPortions, Memory / PageSize - 1); - maxBufSize = std::max((size_t)PageSize, maxBufSize); - - if (maxPortions <= 2) { - FPortions = MPortions = 2; - BufSize = PageSize; - return; - } - - int Portions = Files.ysize(); - if (maxPortions >= Portions) { - FPortions = MPortions = Portions; - } else if (((Portions + maxPortions - 1) / maxPortions) <= maxPortions) { - while (((Portions + maxPortions - 1) / maxPortions) <= maxPortions) - --maxPortions; - MPortions = ++maxPortions; - int total = ((Portions + MPortions - 1) / MPortions) + Portions; - FPortions = (total % MPortions) ? (total % MPortions) : (int)MPortions; - } else - FPortions = MPortions = maxPortions; - - BufSize = std::min((size_t)(Memory / (MPortions + 1)), maxBufSize); - // fprintf(stderr, "Optimize: Portions=%i; MPortions=%i; FPortions=%i; Memory=%i; BufSize=%i\n", - // (int)Portions, (int)MPortions, (int)FPortions, (int)Memory, (int)BufSize); - } - - void MergeMT() { - TGuard<TMutex> guard(Mutex); - do { - int n; - while ((n = Files.ysize() - CPortions) > MPortions) { - int m = std::min((CPortions == 0 ? (int)FPortions : (int)MPortions), n); - TString fname = PortionManager->Next(); - if (!MtpQueue->Add(new TMergePortionTask(this, CPortions, CPortions + m, fname))) - ythrow yexception() << "TPowerMerger::MergeMT: failed to add task"; - CPortions += m; - ++Tasks; - } - if (Tasks > 0) - TaskFinishedCond.Wait(Mutex); - } while (Tasks > 0); - } - -private: - TMutex Mutex; - TCondVar TaskFinishedCond; - - TMerger Merger; - TSimpleSharedPtr<TThreadPool> MtpQueue; - TSimpleSharedPtr<TPortionManager> PortionManager; - TVector<TString> Files; - int Tasks = 0; - int InitialFilesEnd = 0; - int CPortions = 0; - int MPortions = 0; - int FPortions = 0; - int Memory = 0; - int PageSize = 0; - int BufSize = 0; - bool AutoUnlink = false; -}; - -// A sorter powered by threads -template < - class TRecord, - template <typename T> class TCompare, - class TSieve = TFakeSieve<TRecord>, - class TTmpInput = TInDatFile<TRecord>, - class TTmpOutput = TOutDatFile<TRecord>> -class TPowerSorter { -public: - typedef TPowerSorter<TRecord, TCompare, TSieve, TTmpInput, TTmpOutput> TSorter; - typedef TRecord TRec; - typedef TTmpOutput TTmpOut; - typedef TTmpInput TTmpIn; - typedef TDatSorterBuf<TRecord, TCompare, TSieve> TSorterBuf; - typedef TCompare<TRecord> TComp; - typedef TPowerMerger<TRecord, TCompare, TSieve, TTmpInput, TTmpOutput> TFileMerger; - - struct TSortPortionTask: public IObjectInQueue { - TSorter* Sorter; - TSorterBuf* SorterBuf; - int Portion; - - TSortPortionTask(TSorter* sorter, TSorterBuf* sorterBuf, int portion) - : Sorter(sorter) - , SorterBuf(sorterBuf) - , Portion(portion) - { - } - - void Process(void*) override { - TAutoPtr<TSortPortionTask> This(this); - // fprintf(stderr, "SortPortion: %i\n", Portion); - Sorter->SortPortion(SorterBuf); - } - }; - - class TSorterBufQueue { - private: - TMutex Mutex; - TCondVar Cond; - TVector<TSimpleSharedPtr<TSorterBuf>> V; - TDeque<TSorterBuf*> Q; - - int Memory, PageSize, MaxSorterBufs; - - public: - TSorterBufQueue(int memory, int pageSize, int maxSorterBufs) - : Memory(memory) - , PageSize(pageSize) - , MaxSorterBufs(maxSorterBufs) - { - } - - void Push(TSorterBuf* sb) { - TGuard<TMutex> guard(Mutex); - sb->Clear(); - Q.push_back(sb); - Cond.Signal(); - } - - TSorterBuf* Pop() { - TGuard<TMutex> guard(Mutex); - if (!Q.size() && V.ysize() < MaxSorterBufs) { - V.push_back(new TSorterBuf(Memory / MaxSorterBufs, PageSize)); - return V.back().Get(); - } else { - while (!Q.size()) - Cond.Wait(Mutex); - TSorterBuf* t = Q.front(); - Q.pop_front(); - return t; - } - } - - void Clear() { - TGuard<TMutex> guard(Mutex); - Q.clear(); - V.clear(); - } - - void WaitAll() { - TGuard<TMutex> guard(Mutex); - while (Q.size() < V.size()) { - Cond.Wait(Mutex); - } - } - - int GetMaxSorterBufs() const { - return MaxSorterBufs; - } - }; - -public: - TPowerSorter(const TSimpleSharedPtr<TThreadPool>& mtpQueue, size_t maxSorterBufs, - const char* name, size_t memory, size_t pageSize, size_t bufSize) - : MaxSorterBufs(maxSorterBufs) - , Name(name) - , Memory(memory) - , PageSize(pageSize) - , BufSize(bufSize) - , MtpQueue(mtpQueue) - , PortionManager(new TPortionManager) - , SBQueue(Memory, PageSize, MaxSorterBufs) - , FileMerger(MtpQueue, PortionManager, Memory, PageSize, true) - { - } - - TPowerSorter(size_t maxSorterBufs, - const char* name, size_t memory, size_t pageSize, size_t bufSize) - : MaxSorterBufs(maxSorterBufs) - , Name(name) - , Memory(memory) - , PageSize(pageSize) - , BufSize(bufSize) - , PortionManager(new TPortionManager) - , SBQueue(Memory, PageSize, maxSorterBufs) - , FileMerger(MtpQueue, PortionManager, Memory, PageSize, true) - { - } - - TPowerSorter(const char* name, size_t memory, size_t pageSize, size_t bufSize) - : MaxSorterBufs(5) - , Name(name) - , Memory(memory) - , PageSize(pageSize) - , BufSize(bufSize) - , PortionManager(new TPortionManager) - , SBQueue(Memory, PageSize, MaxSorterBufs) - , FileMerger(MtpQueue, PortionManager, Memory, PageSize, true) - { - } - - ~TPowerSorter() { - Close(); - } - - void Open(const char* tempDir) { - Close(); - CurSB = SBQueue.Pop(); - PortionManager->Open(tempDir); - } - - void Reopen(const char* fname) { - Open(fname); - } - - void Close() { - CurSB = nullptr; - SBQueue.Clear(); - PortionCount = 0; - FileMerger.Close(); - PortionManager->Close(); - } - - const TRec* Push(const TRec* v) { - CheckOpen("Push"); - const TRec* u = CurSB->Push(v); - if (!u) { - NextPortion(); - u = CurSB->Push(v); - } - return u; - } - - void Sort(int maxPortions = 1000) { - CheckOpen("Sort"); - if (!PortionCount) { - CurSB->Sort(); - } else { - NextPortion(); - SBQueue.Push(CurSB); - CurSB = nullptr; - SBQueue.WaitAll(); - SBQueue.Clear(); - FileMerger.Merge(maxPortions); - } - } - - const TRec* Next() { - return PortionCount ? FileMerger.Next() : CurSB->Next(); - } - - const TRec* Current() { - return PortionCount ? FileMerger.Current() : CurSB->Current(); - } - - int GetBufSize() const { - return BufSize; - } - - int GetPageSize() const { - return PageSize; - } - - const char* GetName() const { - return Name.data(); - } - -private: - void CheckOpen(const char* m) { - if (!CurSB) - ythrow yexception() << "TPowerSorter::" << m << ": the sorter is not open"; - } - - void NextPortion() { - if (!CurSB->Size()) - return; - ++PortionCount; - if (MaxSorterBufs <= 1) { - SortPortion(CurSB); - } else { - if (!MtpQueue.Get()) { - MtpQueue.Reset(new TThreadPool); - MtpQueue->Start(MaxSorterBufs - 1); - FileMerger.SetMtpQueue(MtpQueue); - } - if (!MtpQueue->Add(new TSortPortionTask(this, CurSB, PortionCount))) - ythrow yexception() << "TPowerSorter::NextPortion: failed to add task"; - } - CurSB = SBQueue.Pop(); - } - - void SortPortion(TSorterBuf* sorterBuf) { - TString portionFilename = PortionManager->Next(); - try { - sorterBuf->Sort(); - - // fprintf(stderr, "TPowerSorter::SortPortion: -> %s\n", ~portionFilename); - TTmpOut out("powersorter-portion", PageSize, BufSize, 0); - out.Open(portionFilename.data()); - - while (sorterBuf->Next()) - out.Push(sorterBuf->Current()); - - out.Close(); - FileMerger.Add(portionFilename); - SBQueue.Push(sorterBuf); - } catch (const yexception& e) { - unlink(portionFilename.data()); - ythrow yexception() << "SortPortion: " << e.what(); - } - } - -private: - int MaxSorterBufs = 0; - TString Name; - int Memory = 0; - int PageSize = 0; - int BufSize = 0; - - TMutex Mutex; - TSimpleSharedPtr<TThreadPool> MtpQueue; - TSimpleSharedPtr<TPortionManager> PortionManager; - - TSorterBufQueue SBQueue; - TSorterBuf* CurSB = nullptr; - int PortionCount = 0; - - TFileMerger FileMerger; -}; diff --git a/library/cpp/microbdb/reader.h b/library/cpp/microbdb/reader.h deleted file mode 100644 index 694a2f17662..00000000000 --- a/library/cpp/microbdb/reader.h +++ /dev/null @@ -1,354 +0,0 @@ -#pragma once - -#include "align.h" -#include "header.h" -#include "extinfo.h" - -#include <contrib/libs/zlib/zlib.h> -#include <contrib/libs/fastlz/fastlz.h> -#include <contrib/libs/snappy/snappy.h> - -#include <util/generic/vector.h> -#include <util/memory/tempbuf.h> - -namespace NMicroBDB { - static const size_t DEFAULT_BUFFER_SIZE = (64 << 10); - - //! - template <class TVal> - class IBasePageReader { - public: - virtual size_t GetRecSize() const = 0; - virtual size_t GetExtSize() const = 0; - virtual bool GetExtInfo(typename TExtInfoType<TVal>::TResult* extInfo) const = 0; - virtual const ui8* GetExtInfoRaw(size_t* len) const = 0; - virtual const TVal* Next() = 0; - virtual void Reset() = 0; - //! set clearing flag, so temporary buffers will be cleared - //! in next call of Next() - virtual void SetClearFlag() { - } - - virtual ~IBasePageReader() { - } - }; - - template <class TVal, typename TPageIter> - class TRawPageReader: public IBasePageReader<TVal> { - public: - TRawPageReader(TPageIter* const iter) - : PageIter(iter) - { - Reset(); - } - - bool GetExtInfo(typename TExtInfoType<TVal>::TResult* extInfo) const override { - Y_VERIFY(TExtInfoType<TVal>::Exists, "GetExtInfo should only be used with extended records"); - if (!Rec) - return false; - ui8* raw = (ui8*)Rec + RecSize + ExtLenSize; - return extInfo->ParseFromArray(raw, ExtSize); - } - - size_t GetRecSize() const override { - return RecSize + ExtLenSize; - } - - size_t GetExtSize() const override { - return ExtSize; - } - - const ui8* GetExtInfoRaw(size_t* len) const override { - Y_VERIFY(TExtInfoType<TVal>::Exists, "GetExtInfo should only be used with extended records"); - if (!Rec) { - *len = 0; - return nullptr; - } - *len = ExtLenSize + ExtSize; - return (ui8*)Rec + RecSize; - } - - const TVal* Next() override { - if (!Rec) - Rec = (TVal*)((char*)PageIter->Current() + sizeof(TDatPage)); - else - Rec = (TVal*)((char*)Rec + DatCeil(RecSize + ExtLenSize + ExtSize)); - if (!TExtInfoType<TVal>::Exists) - RecSize = SizeOf(Rec); - else - RecSize = SizeOfExt(Rec, &ExtLenSize, &ExtSize); - return Rec; - } - - void Reset() override { - Rec = nullptr; - RecSize = 0; - ExtLenSize = 0; - ExtSize = 0; - } - - private: - const TVal* Rec; - size_t RecSize; - size_t ExtLenSize; - size_t ExtSize; - TPageIter* const PageIter; - }; - - template <class TVal, typename TPageIter> - class TCompressedReader: public IBasePageReader<TVal> { - inline size_t GetFirstRecordSize(const TVal* const in) const { - if (!TExtInfoType<TVal>::Exists) { - return DatCeil(SizeOf(in)); - } else { - size_t ll; - size_t l; - size_t ret = SizeOfExt(in, &ll, &l); - - return DatCeil(ret + ll + l); - } - } - - void DecompressBlock() { - if (PageIter->IsFrozen() && Buffer.Get()) - Blocks.push_back(Buffer.Release()); - - const TCompressedHeader* hdr = (const TCompressedHeader*)(Page); - - Page += sizeof(TCompressedHeader); - - const size_t first = GetFirstRecordSize((const TVal*)Page); - - if (!Buffer.Get() || Buffer->Size() < hdr->Original) - Buffer.Reset(new TTempBuf(Max<size_t>(hdr->Original, DEFAULT_BUFFER_SIZE))); - - memcpy(Buffer->Data(), Page, first); - Page += first; - - if (hdr->Count > 1) { - switch (Algo) { - case MBDB_COMPRESSION_ZLIB: { - uLongf dst = hdr->Original - first; - - int ret = uncompress((Bytef*)Buffer->Data() + first, &dst, Page, hdr->Compressed); - - if (ret != Z_OK) - ythrow yexception() << "error then uncompress " << ret; - } break; - case MBDB_COMPRESSION_FASTLZ: { - int dst = hdr->Original - first; - int ret = yfastlz_decompress(Page, hdr->Compressed, Buffer->Data() + first, dst); - - if (!ret) - ythrow yexception() << "error then uncompress"; - } break; - case MBDB_COMPRESSION_SNAPPY: { - if (!snappy::RawUncompress((const char*)Page, hdr->Compressed, Buffer->Data() + first)) - ythrow yexception() << "error then uncompress"; - } break; - } - } - - Rec = nullptr; - RecNum = hdr->Count; - Page += hdr->Compressed; - } - - void ClearBuffer() { - for (size_t i = 0; i < Blocks.size(); ++i) - delete Blocks[i]; - Blocks.clear(); - ClearFlag = false; - } - - public: - TCompressedReader(TPageIter* const iter) - : Rec(nullptr) - , RecSize(0) - , ExtLenSize(0) - , ExtSize(0) - , Page(nullptr) - , PageIter(iter) - , RecNum(0) - , BlockNum(0) - , ClearFlag(false) - { - } - - ~TCompressedReader() override { - ClearBuffer(); - } - - size_t GetRecSize() const override { - return RecSize + ExtLenSize; - } - - size_t GetExtSize() const override { - return ExtSize; - } - - bool GetExtInfo(typename TExtInfoType<TVal>::TResult* extInfo) const override { - Y_VERIFY(TExtInfoType<TVal>::Exists, "GetExtInfo should only be used with extended records"); - if (!Rec) - return false; - ui8* raw = (ui8*)Rec + RecSize + ExtLenSize; - return extInfo->ParseFromArray(raw, ExtSize); - } - - const ui8* GetExtInfoRaw(size_t* len) const override { - Y_VERIFY(TExtInfoType<TVal>::Exists, "GetExtInfo should only be used with extended records"); - if (!Rec) { - *len = 0; - return nullptr; - } - *len = ExtLenSize + ExtSize; - return (ui8*)Rec + RecSize; - } - - const TVal* Next() override { - Y_ASSERT(RecNum >= 0); - - if (ClearFlag) - ClearBuffer(); - - if (!Page) { - if (!PageIter->Current()) - return nullptr; - - Page = (ui8*)PageIter->Current() + sizeof(TDatPage); - - BlockNum = ((TCompressedPage*)Page)->BlockCount - 1; - Algo = (ECompressionAlgorithm)((TCompressedPage*)Page)->Algorithm; - Page += sizeof(TCompressedPage); - - DecompressBlock(); - } - - if (!RecNum) { - if (BlockNum <= 0) - return nullptr; - else { - --BlockNum; - DecompressBlock(); - } - } - - --RecNum; - if (!Rec) - Rec = (const TVal*)Buffer->Data(); - else - Rec = (const TVal*)((char*)Rec + DatCeil(RecSize + ExtLenSize + ExtSize)); - - if (!TExtInfoType<TVal>::Exists) - RecSize = SizeOf(Rec); - else - RecSize = SizeOfExt(Rec, &ExtLenSize, &ExtSize); - - return Rec; - } - - void Reset() override { - Page = nullptr; - BlockNum = 0; - Rec = nullptr; - RecSize = 0; - ExtLenSize = 0; - ExtSize = 0; - RecNum = 0; - } - - void SetClearFlag() override { - ClearFlag = true; - } - - public: - THolder<TTempBuf> Buffer; - TVector<TTempBuf*> Blocks; - const TVal* Rec; - size_t RecSize; - size_t ExtLenSize; - size_t ExtSize; - const ui8* Page; - TPageIter* const PageIter; - int RecNum; //!< count of recs in current block - int BlockNum; - ECompressionAlgorithm Algo; - bool ClearFlag; - }; - - class TZLibCompressionImpl { - public: - static const ECompressionAlgorithm Code = MBDB_COMPRESSION_ZLIB; - - inline void Init() { - // - - } - - inline void Term() { - // - - } - - inline size_t CompressBound(size_t size) const noexcept { - return ::compressBound(size); - } - - inline void Compress(void* out, size_t& outSize, const void* in, size_t inSize) { - uLongf size = outSize; - - if (compress((Bytef*)out, &size, (const Bytef*)in, inSize) != Z_OK) - ythrow yexception() << "not compressed"; - outSize = size; - } - }; - - class TFastlzCompressionImpl { - public: - static const ECompressionAlgorithm Code = MBDB_COMPRESSION_FASTLZ; - - inline void Init() { - // - - } - - inline void Term() { - // - - } - - inline size_t CompressBound(size_t size) const noexcept { - size_t rval = size_t(size * 1.07); - return rval < 66 ? 66 : rval; - } - - inline void Compress(void* out, size_t& outSize, const void* in, size_t inSize) { - outSize = yfastlz_compress_level(2, in, inSize, out); - if (!outSize) - ythrow yexception() << "not compressed"; - } - }; - - class TSnappyCompressionImpl { - public: - static const ECompressionAlgorithm Code = MBDB_COMPRESSION_SNAPPY; - - inline void Init() { - // - - } - - inline void Term() { - // - - } - - inline size_t CompressBound(size_t size) const noexcept { - return snappy::MaxCompressedLength(size); - } - - inline void Compress(void* out, size_t& outSize, const void* in, size_t inSize) { - snappy::RawCompress((const char*)in, inSize, (char*)out, &outSize); - } - }; - -} - -using TFakeCompression = void; -using TZLibCompression = NMicroBDB::TZLibCompressionImpl; -using TFastlzCompression = NMicroBDB::TFastlzCompressionImpl; -using TSnappyCompression = NMicroBDB::TSnappyCompressionImpl; diff --git a/library/cpp/microbdb/safeopen.h b/library/cpp/microbdb/safeopen.h deleted file mode 100644 index c328ffd575a..00000000000 --- a/library/cpp/microbdb/safeopen.h +++ /dev/null @@ -1,792 +0,0 @@ -#pragma once - -// util -#include <util/generic/yexception.h> -#include <util/generic/vector.h> -#include <util/string/util.h> -#include <util/system/mutex.h> -#include <thread> - -#include "microbdb.h" - -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4706) /*assignment within conditional expression*/ -#pragma warning(disable : 4267) /*conversion from 'size_t' to 'type', possible loss of data*/ -#endif - -template <typename TVal, typename TPageFile = TInputPageFile, typename TIterator = TInputPageIterator<TPageFile>> -class TInDatFile: protected TInDatFileImpl<TVal, TInputRecordIterator<TVal, TIterator>> { -public: - typedef TVal TRec; - typedef TInDatFileImpl<TVal, TInputRecordIterator<TVal, TIterator>> TBase; - - TInDatFile(const TString& name, size_t pages, int pagesOrBytes = 1) - : Name(name) - , Pages(pages) - , PagesOrBytes(pagesOrBytes) - { - } - - ~TInDatFile() { - Close(); - } - - void Open(const TString& fname, bool direct = false) { - ui32 gotRecordSig = 0; - int ret = TBase::Open(fname.data(), Pages, PagesOrBytes, &gotRecordSig, direct); - if (ret) { - // XXX: print record type name, not type sig - ythrow yexception() << ErrorMessage(ret, "Failed to open input file", fname, TVal::RecordSig, gotRecordSig); - } - Name = fname; - } - - void OpenStream(TAutoPtr<IInputStream> input) { - ui32 gotRecordSig = 0; - int ret = TBase::Open(input, Pages, PagesOrBytes, &gotRecordSig); - if (ret) { - // XXX: print record type name, not type sig - ythrow yexception() << ErrorMessage(ret, "Failed to open input file", Name, TVal::RecordSig, gotRecordSig); - } - } - - void Close() { - int ret; - if (IsOpen() && (ret = TBase::GetError())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error before closing input file", Name); - if ((ret = TBase::Close())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error while closing input file", Name); - } - - const char* GetName() const { - return Name.data(); - } - - using TBase::Current; - using TBase::Freeze; - using TBase::GetError; - using TBase::GetExtInfo; - using TBase::GetExtInfoRaw; - using TBase::GetExtSize; - using TBase::GetLastPage; - using TBase::GetPageNum; - using TBase::GetPageSize; - using TBase::GetRecSize; - using TBase::GotoLastPage; - using TBase::GotoPage; - using TBase::IsEof; - using TBase::IsOpen; - using TBase::Next; - using TBase::Skip; - using TBase::Unfreeze; - -protected: - TString Name; - size_t Pages; - int PagesOrBytes; -}; - -template <typename TVal> -class TMappedInDatFile: protected TInDatFileImpl<TVal, TInputRecordIterator<TVal, TMappedInputPageIterator<TMappedInputPageFile>>> { -public: - typedef TVal TRec; - typedef TInDatFileImpl<TVal, TInputRecordIterator<TVal, TMappedInputPageIterator<TMappedInputPageFile>>> TBase; - - TMappedInDatFile(const TString& name, size_t /* pages */, int /* pagesOrBytes */) - : Name(name) - { - } - - ~TMappedInDatFile() { - Close(); - } - - void Open(const TString& fname) { - int ret = TBase::Open(fname.data()); - if (ret) - ythrow yexception() << ErrorMessage(ret, "Failed to open mapped file", fname, TVal::RecordSig); - Name = fname; - } - - void Close() { - int ret; - if (IsOpen() && (ret = TBase::GetError())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error before closing mapped file", Name); - if ((ret = TBase::Close())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error while closing mapped file", Name); - } - - const char* GetName() const { - return Name.data(); - } - - using TBase::Current; - using TBase::GetError; - using TBase::GetExtInfo; - using TBase::GetExtInfoRaw; - using TBase::GetLastPage; - using TBase::GetPageNum; - using TBase::GetPageSize; - using TBase::GotoLastPage; - using TBase::GotoPage; - using TBase::IsEof; - using TBase::IsOpen; - using TBase::Next; - using TBase::Skip; - -protected: - TString Name; -}; - -template <typename TVal, typename TCompressor = TFakeCompression, typename TPageFile = TOutputPageFile> -class TOutDatFile: protected TOutDatFileImpl<TVal, TOutputRecordIterator<TVal, TOutputPageIterator<TPageFile>, TFakeIndexer, TCompressor>> { -public: - typedef TOutDatFileImpl<TVal, TOutputRecordIterator<TVal, TOutputPageIterator<TPageFile>, TFakeIndexer, TCompressor>> TBase; - - TOutDatFile(const TString& name, size_t pagesize, size_t pages, int pagesOrBytes = 1) - : Name(name) - , PageSize(pagesize) - , Pages(pages) - , PagesOrBytes(pagesOrBytes) - { - } - - ~TOutDatFile() { - Close(); - } - - void Open(const char* fname, bool direct = false) { - int ret = TBase::Open(fname, PageSize, Pages, PagesOrBytes, direct); - if (ret) - ythrow yexception() << ErrorMessage(ret, "Failed to open output file", fname); - Name = fname; - } - - void Open(const TString& fname) { - Open(fname.data()); - } - - void OpenStream(TAutoPtr<IOutputStream> output) { - int ret = TBase::Open(output, PageSize, Pages, PagesOrBytes); - if (ret) - ythrow yexception() << ErrorMessage(ret, "Failed to open output stream", Name); - } - - void Close() { - int ret; - if ((ret = TBase::GetError())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error before closing output file", Name); - if ((ret = TBase::Close())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error while closing output file", Name); - } - - const char* GetName() const { - return Name.data(); - } - - using TBase::Freeze; - using TBase::GetError; - using TBase::GetPageSize; - using TBase::IsEof; - using TBase::IsOpen; - using TBase::Offset; - using TBase::Push; - using TBase::PushWithExtInfo; - using TBase::Reserve; - using TBase::Unfreeze; - -protected: - TString Name; - size_t PageSize, Pages; - int PagesOrBytes; -}; - -template <typename TVal, typename TCompressor, typename TPageFile> -class TOutDatFileArray; - -template <typename TVal, typename TCompressor = TFakeCompression, typename TPageFile = TOutputPageFile> -class TOutDatFileArray { - typedef TOutDatFile<TVal, TCompressor, TPageFile> TFileType; - -public: - TOutDatFileArray(const TString& name, size_t pagesize, size_t pages, int pagesOrBytes = 1) - : Name(name) - , PageSize(pagesize) - , Pages(pages) - , PagesOrBytes(pagesOrBytes) - , NumFiles(0) - , Files(nullptr) - { - } - - ~TOutDatFileArray() { - for (int i = 0; i < NumFiles; ++i) { - Files[i].Close(); - Files[i].~TFileType(); - } - free(Files); - Files = nullptr; - NumFiles = 0; - } - - TFileType& operator[](size_t pos) { - return Files[pos]; - } - - void Open(int n, const TString& fname) { - char temp[FILENAME_MAX]; - - Name = fname; - NumFiles = CreateDatObjects(n, fname); - - int i; - try { - for (i = 0; i < NumFiles; ++i) { - sprintf(temp, fname.data(), i); - Files[i].Open(temp); - } - } catch (...) { - while (--i >= 0) - Files[i].Close(); - throw; - } - } - - template <typename TNameBuilder> - void OpenWithCallback(int n, const TNameBuilder& builder) { - NumFiles = CreateDatObjects(n, Name); - - for (int i = 0; i < NumFiles; ++i) - Files[i].Open(builder.GetName(i).data()); - } - - void Close() { - for (int i = 0; i < NumFiles; ++i) - Files[i].Close(); - } - - void CloseMT(ui32 threads) { - int current = 0; - TMutex mutex; - TVector<std::thread> thrs; - thrs.reserve(threads); - for (ui32 i = 0; i < threads; i++) { - thrs.emplace_back([this, ¤t, &mutex]() { - while (true) { - mutex.Acquire(); - int cur = current++; - mutex.Release(); - if (cur >= NumFiles) - break; - Files[cur].Close(); - } - }); - } - for (auto& thread : thrs) { - thread.join(); - } - } - - const char* GetName() const { - return Name.data(); - } - -protected: - int CreateDatObjects(int n, const TString& fname) { - if (!(Files = (TFileType*)malloc(n * sizeof(TFileType)))) - ythrow yexception() << "can't alloc \"" << fname << "\" file array: " << LastSystemErrorText(); - int num = 0; - char temp[FILENAME_MAX]; - for (int i = 0; i < n; ++i, ++num) { - sprintf(temp, "%s[%d]", fname.data(), i); - new (Files + i) TFileType(temp, PageSize, Pages, PagesOrBytes); - } - return num; - } - - TString Name; - size_t PageSize, Pages; - int PagesOrBytes, NumFiles; - TFileType* Files; -}; - -template <typename TVal, typename TKey, typename TCompressor = TFakeCompression, typename TPageFile = TOutputPageFile> -class TOutDirectFile: protected TOutDirectFileImpl<TVal, TKey, TCompressor, TPageFile> { - typedef TOutDirectFileImpl<TVal, TKey, TCompressor, TPageFile> TBase; - -public: - TOutDirectFile(const TString& name, size_t pagesize, size_t pages, size_t ipagesize, size_t ipages, int pagesOrBytes) - : Name(name) - , PageSize(pagesize) - , Pages(pages) - , IdxPageSize(ipagesize) - , IdxPages(ipages) - , PagesOrBytes(pagesOrBytes) - { - } - - ~TOutDirectFile() { - Close(); - } - - void Open(const TString& fname) { - int ret = TBase::Open(fname.data(), PageSize, Pages, IdxPageSize, IdxPages, PagesOrBytes); - if (ret) - ythrow yexception() << ErrorMessage(ret, "Failed to open output file", fname); - Name = fname; - } - - void Close() { - int ret; - if ((ret = TBase::GetError())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error before closing output file", Name); - if ((ret = TBase::Close())) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret, "Error while closing output file", Name); - } - - const char* GetName() const { - return Name.data(); - } - - using TBase::Freeze; - using TBase::Push; - using TBase::PushWithExtInfo; - using TBase::Reserve; - using TBase::Unfreeze; - -protected: - TString Name; - size_t PageSize, Pages, IdxPageSize, IdxPages; - int PagesOrBytes; -}; - -template < - typename TVal, - template <typename T> class TComparer, - typename TCompress = TFakeCompression, - typename TSieve = TFakeSieve<TVal>, - typename TPageFile = TOutputPageFile, - typename TFileTypes = TDefInterFileTypes> -class TDatSorter: protected TDatSorterImpl<TVal, TComparer<TVal>, TCompress, TSieve, TPageFile, TFileTypes> { - typedef TDatSorterImpl<TVal, TComparer<TVal>, TCompress, TSieve, TPageFile, TFileTypes> TBase; - -public: - typedef TVal TRec; - -public: - TDatSorter(const TString& name, size_t memory, size_t pagesize, size_t pages, int pagesOrBytes = 1) - : Name(name) - , Memory(memory) - , PageSize(pagesize) - , Pages(pages) - , PagesOrBytes(pagesOrBytes) - { - Templ[0] = 0; - } - - ~TDatSorter() { - Close(); - Templ[0] = 0; - } - - void Open(const TString& dirName) { - int ret; - if (ret = MakeSorterTempl(Templ, dirName.data())) { - Templ[0] = 0; - ythrow yexception() << ErrorMessage(ret, Name + " sorter: bad tempdir", dirName); - } - if ((ret = TBase::Open(Templ, PageSize, Pages, PagesOrBytes))) - ythrow yexception() << ErrorMessage(ret, Name + " sorter: open error, temp dir", Templ); - } - - void Sort(bool direct = false) { - int ret = TBase::Sort(Memory, 1000, direct); - if (ret) - ythrow yexception() << ErrorMessage(ret, Name + " sorter: sort error, temp dir", Templ, TVal::RecordSig); - } - - void SortToFile(const TString& name) { - int ret = TBase::SortToFile(name.data(), Memory); - if (ret) - ythrow yexception() << ErrorMessage(ret, Name + "sorter: error in SortToFile", name, TVal::RecordSig); - } - - void SortToStream(TAutoPtr<IOutputStream> output) { - int ret = TBase::SortToStream(output, Memory); - if (ret) - ythrow yexception() << ErrorMessage(ret, Name + "sorter: error in SortToStream", "", TVal::RecordSig); - } - - void Close() { - int ret1 = TBase::GetError(); - int ret2 = TBase::Close(); - if (Templ[0]) { - *strrchr(Templ, GetDirectorySeparator()) = 0; - RemoveDirWithContents(Templ); - Templ[0] = 0; - } - if (ret1) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret1, Name + "sorter: error before closing"); - if (ret2) - if (!std::uncaught_exception()) - ythrow yexception() << ErrorMessage(ret2, Name + "sorter: error while closing"); - } - - int Sort(size_t memory, int maxportions, bool direct = false) { - return TBase::Sort(memory, maxportions, direct); - } - - const char* GetName() const { - return Name.data(); - } - - using TBase::GetPageSize; - using TBase::GetPages; - using TBase::Next; - using TBase::NextPortion; - using TBase::Push; - using TBase::PushWithExtInfo; - using TBase::UseSegmentSorter; - -protected: - TString Name; - size_t Memory, PageSize, Pages; - int PagesOrBytes; - char Templ[FILENAME_MAX]; -}; - -template <typename TSorter> -class TSorterArray { -public: - typedef TSorter TDatSorter; - -public: - TSorterArray(const TString& name, size_t memory, size_t pagesize, size_t pages, int pagesOrBytes = 1) - : Name(name) - , Memory(memory) - , PageSize(pagesize) - , Pages(pages) - , PagesOrBytes(pagesOrBytes) - , NumSorters(0) - , Sorters(nullptr) - { - } - - ~TSorterArray() { - for (int i = 0; i < NumSorters; ++i) { - Sorters[i].Close(); - Sorters[i].~TSorter(); - } - free(Sorters); - Sorters = nullptr; - NumSorters = 0; - } - - TSorter& operator[](size_t pos) { - return Sorters[pos]; - } - - void Open(int n, const TString& fname, size_t memory = 0) { - if (!(Sorters = (TSorter*)malloc(n * sizeof(TSorter)))) - ythrow yexception() << "can't alloc \"" << fname << "\" sorter array: " << LastSystemErrorText(); - NumSorters = n; - char temp[FILENAME_MAX]; - if (memory) - Memory = memory; - for (int i = 0; i < NumSorters; ++i) { - sprintf(temp, "%s[%d]", Name.data(), i); - new (Sorters + i) TSorter(temp, Memory, PageSize, Pages, PagesOrBytes); - } - for (int i = 0; i < NumSorters; ++i) - Sorters[i].Open(fname); - } - - void Close() { - for (int i = 0; i < NumSorters; ++i) - Sorters[i].Close(); - } - - const char* GetName() const { - return Name.data(); - } - -protected: - TString Name; - size_t Memory, PageSize, Pages; - int PagesOrBytes, NumSorters; - TSorter* Sorters; -}; - -template <typename TVal, template <typename T> class TCompare, typename TSieve = TFakeSieve<TVal>> -class TDatSorterArray: public TSorterArray<TDatSorter<TVal, TCompare, TSieve>> { -public: - TDatSorterArray(const char* name, size_t memory, size_t pagesize, size_t pages, int pagesOrBytes = 1) - : TSorterArray<TDatSorter<TVal, TCompare, TSieve>>(name, memory, pagesize, pages, pagesOrBytes) - { - } -}; - -template <typename TVal, template <typename T> class TCompare, typename TCompress = TFakeCompression, - typename TSieve = TFakeSieve<TVal>, typename TPageFile = TOutputPageFile, typename TFileTypes = TDefInterFileTypes> -class TDatSorterMemo: public TDatSorter<TVal, TCompare, TCompress, TSieve, TPageFile, TFileTypes> { - typedef TDatSorter<TVal, TCompare, TCompress, TSieve, TPageFile, TFileTypes> TSorter; - -public: - TOutDatFile<TVal> Memo; - TString Home; - bool OpenReq; - bool Opened; - bool UseDirectWrite; - -public: - TDatSorterMemo(const char* name, size_t memory, size_t pagesize, size_t pages, int pagesOrBytes = 1) - : TSorter(name, memory, pagesize, pages, pagesOrBytes) - , Memo(name, pagesize, memory, 0) - { - OpenReq = false; - Opened = false; - UseDirectWrite = false; - } - - void Open(const TString& home) { - OpenReq = true; - // TSorter::Open(home); - Home = home; - Memo.Open(nullptr); - Memo.Freeze(); - } - - void Reopen(const char* home) { - Close(); - Open(home); - } - - void Open() { - if (!OpenReq) { - OpenReq = true; - Memo.Open(nullptr); - Memo.Freeze(); - } - } - - void OpenIfNeeded() { - if (OpenReq && !Opened) { - if (!Home) - ythrow yexception() << "Temp directory not specified, call Open(char*) first : " << TSorter::Name; - TSorter::Open(Home); - Opened = true; - } - } - - TVal* Reserve(size_t len) { - if (TExtInfoType<TVal>::Exists) - return ReserveWithExt(len, 0); - - TVal* u = Memo.Reserve(len); - if (!u) { - OpenIfNeeded(); - TSorter::NextPortion(UseDirectWrite); - Memo.Freeze(); - u = Memo.Reserve(len); - } - TSorter::PushWithExtInfo(u); - return u; - } - - TVal* ReserveWithExt(size_t len, size_t extSize) { - size_t fullLen = len + len_long((i64)extSize) + extSize; - TVal* u = Memo.Reserve(fullLen); - if (!u) { - OpenIfNeeded(); - TSorter::NextPortion(UseDirectWrite); - Memo.Freeze(); - u = Memo.Reserve(fullLen); - if (!u) { - if (fullLen > Memo.GetPageSize()) { - ythrow yexception() << "Size of element and " << len << " size of extInfo " << extSize - << " is larger than page size " << Memo.GetPageSize(); - } - ythrow yexception() << "going to insert a null pointer. Bad."; - } - } - out_long((i64)extSize, (char*)u + len); - TSorter::PushWithExtInfo(u); - return u; - } - - char* GetReservedExt(TVal* rec, size_t len, size_t extSize) { - return (char*)rec + len + len_long((i64)extSize); - } - - const TVal* Push(const TVal* v, const typename TExtInfoType<TVal>::TResult* extInfo = nullptr) { - const TVal* u = Memo.Push(v, extInfo); - if (!u) { - OpenIfNeeded(); - TSorter::NextPortion(UseDirectWrite); - Memo.Freeze(); - u = Memo.Push(v, extInfo); - if (!u) { - if (SizeOf(v) > Memo.GetPageSize()) { - ythrow yexception() << "Size of element " << SizeOf(v) - << " is larger than page size " << Memo.GetPageSize(); - } - ythrow yexception() << "going to insert a null pointer. Bad."; - } - } - TSorter::PushWithExtInfo(u); - return u; - } - - const TVal* Push(const TVal* v, const ui8* extInfoRaw, size_t extLen) { - const TVal* u = Memo.Push(v, extInfoRaw, extLen); - if (!u) { - OpenIfNeeded(); - TSorter::NextPortion(UseDirectWrite); - Memo.Freeze(); - u = Memo.Push(v, extInfoRaw, extLen); - if (!u) { - if (SizeOf(v) > Memo.GetPageSize()) { - ythrow yexception() << "Size of element " << SizeOf(v) - << " is larger than page size " << Memo.GetPageSize(); - } - ythrow yexception() << "going to insert a null pointer. Bad.."; - } - } - TSorter::PushWithExtInfo(u); - return u; - } - - const TVal* PushWithExtInfo(const TVal* v) { - const TVal* u = Memo.PushWithExtInfo(v); - if (!u) { - OpenIfNeeded(); - TSorter::NextPortion(UseDirectWrite); - Memo.Freeze(); - u = Memo.PushWithExtInfo(v); - if (!u) { - if (SizeOf(v) > Memo.GetPageSize()) { - ythrow yexception() << "Size of element " << SizeOf(v) - << " is larger than page size " << Memo.GetPageSize(); - } - ythrow yexception() << "going to insert a null pointer. Bad..."; - } - } - TSorter::PushWithExtInfo(u); - return u; - } - - void Sort(bool direct = false) { - if (Opened) { - TSorter::NextPortion(UseDirectWrite); - Memo.Close(); - OpenReq = false; - TSorter::Sort(direct); - } else { - TSorter::SortPortion(); - } - } - - const TVal* Next() { - return Opened ? TSorter::Next() : TSorter::Nextp(); - } - - bool GetExtInfo(typename TExtInfoType<TVal>::TResult* extInfo) const { - return NMicroBDB::GetExtInfo(Current(), extInfo); - } - - const ui8* GetExtInfoRaw(size_t* len) const { - return NMicroBDB::GetExtInfoRaw(Current(), len); - } - - const TVal* Current() const { - return Opened ? TSorter::Current() : TSorter::Currentp(); - } - - int NextPortion() { - OpenIfNeeded(); - return TSorter::NextPortion(UseDirectWrite); - } - - void SortToFile(const char* name) { - OpenIfNeeded(); - TSorter::NextPortion(UseDirectWrite); - Memo.Close(); - OpenReq = false; - TSorter::SortToFile(name); - } - - void SortToStream(TAutoPtr<IOutputStream> output) { - OpenIfNeeded(); - TSorter::NextPortion(UseDirectWrite); - Memo.Close(); - OpenReq = false; - TSorter::SortToStream(output); - } - - template <typename TKey, typename TOutCompress> - void SortToDirectFile(const char* name, size_t ipagesize, size_t ipages) { - Sort(); - TOutDirectFile<TVal, TKey, TOutCompress> out(TSorter::Name, TSorter::PageSize, TSorter::Pages, ipagesize, ipages, TSorter::PagesOrBytes); - out.Open(name); - while (const TVal* rec = Next()) - out.PushWithExtInfo(rec); - out.Close(); - } - - template <typename TKey> - void SortToDirectFile(const char* name, size_t ipagesize, size_t ipages) { - SortToDirectFile<TKey, TCompress>(name, ipagesize, ipages); - } - - void CloseSorter() { - if (Opened) - TSorter::Close(); - else - TSorter::Closep(); - Memo.Freeze(); - Opened = false; - } - - void Close() { - if (Opened) - TSorter::Close(); - else - TSorter::Closep(); - Memo.Close(); - OpenReq = false; - Opened = false; - } - - int SavePortions(const char* mask) { - return TSorter::SavePortions(mask, UseDirectWrite); - } - -public: - using TSorter::RestorePortions; -}; - -template <typename TVal, template <typename T> class TCompare, typename TCompress = TFakeCompression, - typename TSieve = TFakeSieve<TVal>, class TPageFile = TOutputPageFile, class TFileTypes = TDefInterFileTypes> -class TDatSorterMemoArray: public TSorterArray<TDatSorterMemo<TVal, TCompare, TCompress, TSieve, TPageFile, TFileTypes>> { -public: - typedef TSorterArray<TDatSorterMemo<TVal, TCompare, TCompress, TSieve, TPageFile, TFileTypes>> TBase; - - TDatSorterMemoArray(const char* name, size_t memory, size_t pagesize, size_t pages, int pagesOrBytes = 1) - : TBase(name, memory, pagesize, pages, pagesOrBytes) - { - } -}; - -#if defined(_MSC_VER) -#pragma warning(pop) -#endif diff --git a/library/cpp/microbdb/sorter.h b/library/cpp/microbdb/sorter.h deleted file mode 100644 index b2e7390377d..00000000000 --- a/library/cpp/microbdb/sorter.h +++ /dev/null @@ -1,677 +0,0 @@ -#pragma once - -#include <util/ysaveload.h> -#include <util/generic/algorithm.h> -#include <contrib/libs/libc_compat/include/link/link.h> - -#include "header.h" -#include "heap.h" -#include "extinfo.h" -#include "input.h" -#include "output.h" - -#ifdef TEST_MERGE -#define MBDB_SORT_FUN ::StableSort -#else -#define MBDB_SORT_FUN ::Sort -#endif - -template <class TVal, class TCompare, typename TCompress, typename TSieve, typename TOutPageFile, typename TFileTypes> -class TDatSorterImpl; - -template <class TVal> -struct TFakeSieve { - static inline int Sieve(TVal*, const TVal*) noexcept { - return 0; - } -}; - -template <class TSieve> -struct TIsSieveFake { - static const bool Result = false; -}; - -template <class T> -struct TIsSieveFake<TFakeSieve<T>> { - static const bool Result = true; -}; - -class TDefInterFileTypes { -public: - typedef TOutputPageFile TOutPageFile; - typedef TInputPageFile TInPageFile; -}; - -//class TCompressedInterFileTypes; - -template <class TVal, class TCompare, typename TCompress, typename TSieve, typename TOutPageFile = TOutputPageFile, typename TFileTypes = TDefInterFileTypes> -class TDatSorterImplBase: protected THeapIter<TVal, TInDatFileImpl<TVal, TInputRecordIterator<TVal, TInputPageIterator<typename TFileTypes::TInPageFile>>>, TCompare> { - typedef TOutputRecordIterator<TVal, TOutputPageIterator<typename TFileTypes::TOutPageFile>, TFakeIndexer, TCompress> TTmpRecIter; - typedef TInputRecordIterator<TVal, TInputPageIterator<typename TFileTypes::TInPageFile>> TInTmpRecIter; - -public: - typedef TOutDatFileImpl<TVal, TTmpRecIter> TTmpOut; - typedef TInDatFileImpl<TVal, TInTmpRecIter> TTmpIn; - - typedef TOutDatFileImpl<TVal, TOutputRecordIterator<TVal, TOutputPageIterator<TOutPageFile>, TFakeIndexer, TCompress>> TOut; - typedef THeapIter<TVal, TTmpIn, TCompare> TMyHeap; - typedef TVector<const TVal*> TMyVector; - typedef typename TMyVector::iterator TMyIterator; - - class IPortionSorter { - public: - virtual ~IPortionSorter() { - } - - virtual void Sort(TMyVector&, TTmpOut*) = 0; - }; - - class TDefaultSorter: public IPortionSorter { - public: - void Sort(TMyVector& vector, TTmpOut* out) override { - MBDB_SORT_FUN(vector.begin(), vector.end(), TCompare()); - - const typename TMyVector::const_iterator - end = (TIsSieveFake<TSieve>::Result) ? vector.end() : TDatSorterImplBase::SieveRange(vector.begin(), vector.end()); - - for (typename TMyVector::const_iterator it = vector.begin(); it != end; ++it) { - out->PushWithExtInfo(*it); - } - } - }; - - class TSegmentedSorter: public IPortionSorter { - class TAdaptor { - typedef typename TMyVector::const_iterator TConstIterator; - - public: - TAdaptor(TConstIterator b, TConstIterator e) - : Curr_(b) - , End_(e) - { - --Curr_; - } - - inline const TVal* Current() const { - return *Curr_; - } - - inline const TVal* Next() { - ++Curr_; - - if (Curr_ == End_) { - return nullptr; - } - - return *Curr_; - } - - private: - TConstIterator Curr_; - TConstIterator End_; - }; - - typedef THeapIter<TVal, TAdaptor, TCompare> TPortionsHeap; - - public: - void Sort(TMyVector& vector, TTmpOut* out) override { - TVector<TAdaptor> bounds; - typename TMyVector::iterator - it = vector.begin(); - const size_t portions = Max<size_t>(1, (vector.size() * sizeof(TVal)) / (4 << 20)); - const size_t step = vector.size() / portions; - - // Sort segments - while (it != vector.end()) { - const typename TMyVector::iterator - end = Min(it + step, vector.end()); - - MBDB_SORT_FUN(it, end, TCompare()); - - bounds.push_back(TAdaptor(it, end)); - - it = end; - } - - // - // Merge result - // - - TPortionsHeap heap(bounds); - - if (TIsSieveFake<TSieve>::Result) { - while (const TVal* val = heap.Next()) { - out->PushWithExtInfo(val); - } - } else { - const TVal* val = heap.Next(); - const TVal* prev = out->PushWithExtInfo(val); - - for (val = heap.Next(); val && prev; val = heap.Next()) { - if (TSieve::Sieve((TVal*)prev, val)) { - continue; - } - - prev = out->PushWithExtInfo(val); - } - - if (prev) { - TSieve::Sieve((TVal*)prev, prev); - } - } - } - }; - -public: - TDatSorterImplBase() - : Sorter(new TDefaultSorter) - { - InFiles = nullptr; - TempBuf = nullptr; - Ptr = Vector.end(); - Cur = nullptr; - Portions = CPortions = Error = 0; - } - - ~TDatSorterImplBase() { - Close(); - } - - int Open(const char* templ, size_t pagesize, size_t pages, int pagesOrBytes = 1) { - Portions = CPortions = Error = 0; - TempBuf = strdup(templ); - Pagesize = pagesize; - if (pagesOrBytes) - Pages = pages; - else - Pages = pages / pagesize; - Pages = Max(1, Pages); - return 0; - } - - void Push(const TVal* v) { - // Serialized extInfo must follow a record being pushed, therefore, to avoid - // unintentional misusage (as if when you are adding TExtInfo in your record - // type: you may forget to check your sorting routines and get a segfault as - // a result). - // PushWithExtInfo(v) should be called on records with extInfo. - static_assert(!TExtInfoType<TVal>::Exists, "expect !TExtInfoType<TVal>::Exists"); - - Vector.push_back(v); - } - - void PushWithExtInfo(const TVal* v) { - Vector.push_back(v); - } - - int SortPortion() { - Ptr = Vector.end(); - Cur = nullptr; - if (!Vector.size() || Error) - return Error; - - MBDB_SORT_FUN(Vector.begin(), Vector.end(), TCompare()); - - if (!TIsSieveFake<TSieve>::Result) { - const typename TMyVector::iterator - end = SieveRange(Vector.begin(), Vector.end()); - - Vector.resize(end - Vector.begin()); - } - - Ptr = Vector.begin(); - Cur = nullptr; - return 0; - } - - const TVal* Nextp() { - Cur = Ptr == Vector.end() ? nullptr : *Ptr++; - return Cur; - } - - const TVal* Currentp() const { - return Cur; - } - - void Closep() { - Vector.clear(); - Ptr = Vector.end(); - Cur = nullptr; - } - - int NextPortion(bool direct = false) { - if (!Vector.size() || Error) - return Error; - - TTmpOut out; - int ret, ret1; - char fname[FILENAME_MAX]; - - snprintf(fname, sizeof(fname), TempBuf, Portions++); - if ((ret = out.Open(fname, Pagesize, Pages, 1, direct))) - return Error = ret; - - Sorter->Sort(Vector, &out); - - Vector.erase(Vector.begin(), Vector.end()); - ret = out.GetError(); - ret1 = out.Close(); - Error = Error ? Error : ret ? ret : ret1; - if (Error) - unlink(fname); - return Error; - } - - int SavePortions(const char* mask, bool direct = false) { - char srcname[PATH_MAX], dstname[PATH_MAX]; - if (Vector.size()) - NextPortion(direct); - for (int i = 0; i < Portions; i++) { - char num[10]; - sprintf(num, "%i", i); - snprintf(srcname, sizeof(srcname), TempBuf, i); - snprintf(dstname, sizeof(dstname), mask, num); - int res = rename(srcname, dstname); - if (res) - return res; - } - snprintf(dstname, sizeof(dstname), mask, "count"); - TOFStream fcount(dstname); - Save(&fcount, Portions); - fcount.Finish(); - return 0; - } - - int RestorePortions(const char* mask) { - char srcname[PATH_MAX], dstname[PATH_MAX]; - snprintf(srcname, sizeof(srcname), mask, "count"); - TIFStream fcount(srcname); - Load(&fcount, Portions); - for (int i = 0; i < Portions; i++) { - char num[10]; - sprintf(num, "%i", i); - snprintf(dstname, sizeof(dstname), TempBuf, i); - snprintf(srcname, sizeof(srcname), mask, num); - unlink(dstname); - int res = link(srcname, dstname); - if (res) - return res; - } - return 0; - } - - int RestorePortions(const char* mask, ui32 count) { - char srcname[PATH_MAX], dstname[PATH_MAX]; - ui32 portions; - TVector<ui32> counts; - for (ui32 j = 0; j < count; j++) { - snprintf(srcname, sizeof(srcname), mask, j, "count"); - TIFStream fcount(srcname); - Load(&fcount, portions); - counts.push_back(portions); - Portions += portions; - } - ui32 p = 0; - for (ui32 j = 0; j < count; j++) { - int cnt = counts[j]; - for (int i = 0; i < cnt; i++, p++) { - char num[10]; - sprintf(num, "%i", i); - snprintf(dstname, sizeof(dstname), TempBuf, p); - snprintf(srcname, sizeof(srcname), mask, j, num); - unlink(dstname); - int res = link(srcname, dstname); - if (res) { - fprintf(stderr, "Can not link %s to %s\n", srcname, dstname); - return res; - } - } - } - return 0; - } - - int Sort(size_t memory, int maxportions = 1000, bool direct = false) { - int ret, end, beg, i; - char fname[FILENAME_MAX]; - - if (Vector.size()) - NextPortion(); - - if (Error) - return Error; - if (!Portions) { - TMyHeap::Init(&DummyFile, 1); // closed file - HPages = 1; - return 0; - } - - Optimize(memory, maxportions); - if (!(InFiles = new TTmpIn[MPortions])) - return MBDB_NO_MEMORY; - - for (beg = 0; beg < Portions && !Error; beg = end) { - end = (int)Min(beg + FPortions, Portions); - for (i = beg; i < end && !Error; i++) { - snprintf(fname, sizeof(fname), TempBuf, i); - if ((ret = InFiles[i - beg].Open(fname, HPages, 1, nullptr, direct))) - Error = Error ? Error : ret; - } - if (Error) - return Error; - TMyHeap::Init(InFiles, end - beg); - if (end != Portions) { - TTmpOut out; - const TVal* v; - snprintf(fname, sizeof(fname), TempBuf, Portions++); - if ((ret = out.Open(fname, Pagesize, HPages))) - return Error = Error ? Error : ret; - while ((v = TMyHeap::Next())) - out.PushWithExtInfo(v); - ret = out.GetError(); - Error = Error ? Error : ret; - ret = out.Close(); - Error = Error ? Error : ret; - for (i = beg; i < end; i++) { - ret = InFiles[i - beg].Close(); - Error = Error ? Error : ret; - snprintf(fname, sizeof(fname), TempBuf, CPortions++); - unlink(fname); - } - } - FPortions = MPortions; - } - return Error; - } - - int Close() { - char fname[FILENAME_MAX]; - delete[] InFiles; - InFiles = nullptr; - Closep(); - for (int i = CPortions; i < Portions; i++) { - snprintf(fname, sizeof(fname), TempBuf, i); - unlink(fname); - } - CPortions = Portions = 0; - free(TempBuf); - TempBuf = nullptr; - return Error; - } - - void UseSegmentSorter() { - Sorter.Reset(new TSegmentedSorter); - } - - inline int GetError() const { - return Error; - } - - inline int GetPages() const { - return Pages; - } - - inline int GetPageSize() const { - return Pagesize; - } - -private: - static TMyIterator SieveRange(const TMyIterator begin, const TMyIterator end) { - TMyIterator it = begin; - TMyIterator prev = begin; - - for (++it; it != end; ++it) { - if (TSieve::Sieve((TVal*)*prev, *it)) { - continue; - } - - ++prev; - - if (it != prev) { - *prev = *it; - } - } - - TSieve::Sieve((TVal*)*prev, *prev); - - return ++prev; - } - -protected: - void Optimize(size_t memory, int maxportions, size_t fbufmax = 256u << 20) { - maxportions = (int)Min((size_t)maxportions, memory / Pagesize) - 1; - size_t maxpages = Max((size_t)1u, fbufmax / Pagesize); - - if (maxportions <= 2) { - FPortions = MPortions = 2; - HPages = 1; - return; - } - if (maxportions >= Portions) { - FPortions = MPortions = Portions; - HPages = (int)Min(memory / ((Portions + 1) * Pagesize), maxpages); - return; - } - if (((Portions + maxportions - 1) / maxportions) <= maxportions) { - while (((Portions + maxportions - 1) / maxportions) <= maxportions) - --maxportions; - MPortions = ++maxportions; - int total = ((Portions + maxportions - 1) / maxportions) + Portions; - FPortions = (total % maxportions) ? (total % maxportions) : MPortions; - HPages = (int)Min(memory / ((MPortions + 1) * Pagesize), maxpages); - return; - } - FPortions = MPortions = maxportions; - HPages = (int)Min(memory / ((MPortions + 1) * Pagesize), maxpages); - } - - TMyVector Vector; - typename TMyVector::iterator Ptr; - const TVal* Cur; - TTmpIn *InFiles, DummyFile; - char* TempBuf; - int Portions, CPortions, Pagesize, Pages, Error; - int FPortions, MPortions, HPages; - THolder<IPortionSorter> Sorter; -}; - -template <class TVal, class TCompare, typename TCompress> -class TDatSorterImpl<TVal, TCompare, TCompress, TFakeSieve<TVal>, TOutputPageFile, TDefInterFileTypes> - : public TDatSorterImplBase<TVal, TCompare, TCompress, TFakeSieve<TVal>, TOutputPageFile, TDefInterFileTypes> { - typedef TDatSorterImplBase<TVal, TCompare, TCompress, TFakeSieve<TVal>, TOutputPageFile, TDefInterFileTypes> TBase; - -public: - int SortToFile(const char* name, size_t memory, int maxportions = 1000) { - int ret = TBase::Sort(memory, maxportions); - if (ret) - return ret; - typename TBase::TOut out; - if ((ret = out.Open(name, TBase::Pagesize, TBase::HPages))) - return ret; - const TVal* rec; - while ((rec = Next())) - out.PushWithExtInfo(rec); - if ((ret = out.GetError())) - return ret; - if ((ret = out.Close())) - return ret; - if ((ret = TBase::Close())) - return ret; - return 0; - } - - int SortToStream(TAutoPtr<IOutputStream> output, size_t memory, int maxportions = 1000) { - int ret = TBase::Sort(memory, maxportions); - if (ret) - return ret; - typename TBase::TOut out; - if ((ret = out.Open(output, TBase::Pagesize, TBase::HPages))) - return ret; - const TVal* rec; - while ((rec = Next())) - out.PushWithExtInfo(rec); - if ((ret = out.GetError())) - return ret; - if ((ret = out.Close())) - return ret; - if ((ret = TBase::Close())) - return ret; - return 0; - } - - const TVal* Next() { - return TBase::TMyHeap::Next(); - } - - const TVal* Current() const { - return TBase::TMyHeap::Current(); - } - - bool GetExtInfo(typename TExtInfoType<TVal>::TResult* extInfo) const { - return TBase::TMyHeap::GetExtInfo(extInfo); - } - - const ui8* GetExtInfoRaw(size_t* len) const { - return TBase::TMyHeap::GetExtInfoRaw(len); - } -}; - -template <class TVal, class TCompare, typename TCompress, typename TSieve, - typename TOutPageFile = TOutputPageFile, typename TFileTypes = TDefInterFileTypes> -class TDatSorterImpl: public TDatSorterImplBase<TVal, TCompare, TCompress, TSieve, TOutPageFile, TFileTypes> { - typedef TDatSorterImplBase<TVal, TCompare, TCompress, TSieve, TOutPageFile, TFileTypes> TBase; - -public: - TDatSorterImpl() - : Cur(nullptr) - , Prev(nullptr) - { - } - - int SortToFile(const char* name, size_t memory, int maxportions = 1000) { - int ret = Sort(memory, maxportions); - if (ret) - return ret; - typename TBase::TOut out; - if ((ret = out.Open(name, TBase::Pagesize, TBase::HPages))) - return ret; - const TVal* rec; - while ((rec = Next())) - out.PushWithExtInfo(rec); - if ((ret = out.GetError())) - return ret; - if ((ret = out.Close())) - return ret; - if ((ret = TBase::Close())) - return ret; - return 0; - } - - int SortToStream(TAutoPtr<IOutputStream> output, size_t memory, int maxportions = 1000) { - int ret = Sort(memory, maxportions); - if (ret) - return ret; - typename TBase::TOut out; - if ((ret = out.Open(output, TBase::Pagesize, TBase::HPages))) - return ret; - const TVal* rec; - while ((rec = Next())) - out.PushWithExtInfo(rec); - if ((ret = out.GetError())) - return ret; - if ((ret = out.Close())) - return ret; - if ((ret = TBase::Close())) - return ret; - return 0; - } - - int Open(const char* templ, size_t pagesize, size_t pages, int pagesOrBytes = 1) { - int res = TBase::Open(templ, pagesize, pages, pagesOrBytes); - Prev = nullptr; - Cur = nullptr; - return res; - } - - int Sort(size_t memory, int maxportions = 1000, bool direct = false) { - int res = TBase::Sort(memory, maxportions, direct); - if (!res) { - const TVal* rec = TBase::TMyHeap::Next(); - if (rec) { - size_t els, es; - size_t sz = NMicroBDB::SizeOfExt(rec, &els, &es); - sz += els + es; - if (!TExtInfoType<TVal>::Exists) - Cur = (TVal*)malloc(sizeof(TVal)); - else - Cur = (TVal*)malloc(TBase::Pagesize); - memcpy(Cur, rec, sz); - } - } - return res; - } - - // Prev = last returned - // Cur = current accumlating with TSieve - - const TVal* Next() { - if (!Cur) { - if (Prev) { - free(Prev); - Prev = nullptr; - } - return nullptr; - } - const TVal* rec; - - if (TIsSieveFake<TSieve>::Result) - rec = TBase::TMyHeap::Next(); - else { - do { - rec = TBase::TMyHeap::Next(); - } while (rec && TSieve::Sieve((TVal*)Cur, rec)); - } - - if (!Prev) { - if (!TExtInfoType<TVal>::Exists) - Prev = (TVal*)malloc(sizeof(TVal)); - else - Prev = (TVal*)malloc(TBase::Pagesize); - } - size_t els, es; - size_t sz = NMicroBDB::SizeOfExt(Cur, &els, &es); - sz += els + es; - memcpy(Prev, Cur, sz); - - if (rec) { - sz = NMicroBDB::SizeOfExt(rec, &els, &es); - sz += els + es; - memcpy(Cur, rec, sz); - } else { - TSieve::Sieve((TVal*)Cur, Cur); - free(Cur); - Cur = nullptr; - } - return Prev; - } - - const TVal* Current() const { - return Prev; - } - - int Close() { - int res = TBase::Close(); - if (Prev) { - free(Prev); - Prev = nullptr; - } - if (Cur) { - free(Cur); - Cur = nullptr; - } - return res; - } - -protected: - TVal* Cur; - TVal* Prev; -}; diff --git a/library/cpp/microbdb/sorterdef.h b/library/cpp/microbdb/sorterdef.h deleted file mode 100644 index 8834b5fff80..00000000000 --- a/library/cpp/microbdb/sorterdef.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#define MAKESORTERTMPL(TRecord, MemberFunc) \ - template <typename T> \ - struct MemberFunc; \ - template <> \ - struct MemberFunc<TRecord> { \ - bool operator()(const TRecord* l, const TRecord* r) { \ - return TRecord ::MemberFunc(l, r) < 0; \ - } \ - int operator()(const TRecord* l, const TRecord* r, int) { \ - return TRecord ::MemberFunc(l, r); \ - } \ - } - -template <typename T> -static inline int compare(const T& a, const T& b) { - return (a < b) ? -1 : (a > b); -} diff --git a/library/cpp/microbdb/utility.h b/library/cpp/microbdb/utility.h deleted file mode 100644 index 5c86061bca0..00000000000 --- a/library/cpp/microbdb/utility.h +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once - -#include "microbdb.h" - -template <class TRecord, template <class T> class TCompare> -int SortData(const TFile& ifile, const TFile& ofile, const TDatMetaPage* meta, size_t memory, const char* tmpDir = nullptr) { - char templ[FILENAME_MAX]; - TInDatFileImpl<TRecord> datin; - TOutDatFileImpl<TRecord> datout; - TDatSorterImpl<TRecord, TCompare<TRecord>, TFakeCompression, TFakeSieve<TRecord>> sorter; - const TRecord* u; - int ret; - - const size_t minMemory = (2u << 20); - memory = Max(memory, minMemory + minMemory / 2); - if (datin.Open(ifile, meta, memory - minMemory, 0)) - err(1, "can't read input file"); - - size_t outpages = Max((size_t)2u, minMemory / datin.GetPageSize()); - memory -= outpages * datin.GetPageSize(); - - if (ret = MakeSorterTempl(templ, tmpDir)) - err(1, "can't create tempdir in \"%s\"; error: %d\n", templ, ret); - - if (sorter.Open(templ, datin.GetPageSize(), outpages)) { - *strrchr(templ, LOCSLASH_C) = 0; - RemoveDirWithContents(templ); - err(1, "can't open sorter"); - } - - while (1) { - datin.Freeze(); - while ((u = datin.Next())) - sorter.PushWithExtInfo(u); - sorter.NextPortion(); - if (datin.GetError() || datin.IsEof()) - break; - } - - if (datin.GetError()) { - *strrchr(templ, LOCSLASH_C) = 0; - RemoveDirWithContents(templ); - err(1, "in data file error %d", datin.GetError()); - } - if (datin.Close()) { - *strrchr(templ, LOCSLASH_C) = 0; - RemoveDirWithContents(templ); - err(1, "can't close in data file"); - } - - sorter.Sort(memory); - - if (datout.Open(ofile, datin.GetPageSize(), outpages)) { - *strrchr(templ, LOCSLASH_C) = 0; - RemoveDirWithContents(templ); - err(1, "can't write out file"); - } - - while ((u = sorter.Next())) - datout.PushWithExtInfo(u); - - if (sorter.GetError()) - err(1, "sorter error %d", sorter.GetError()); - if (sorter.Close()) - err(1, "can't close sorter"); - - *strrchr(templ, LOCSLASH_C) = 0; - RemoveDirWithContents(templ); - - if (datout.GetError()) - err(1, "out data file error %d", datout.GetError()); - if (datout.Close()) - err(1, "can't close out data file"); - return 0; -} diff --git a/library/cpp/microbdb/wrappers.h b/library/cpp/microbdb/wrappers.h deleted file mode 100644 index 38eb8edebc0..00000000000 --- a/library/cpp/microbdb/wrappers.h +++ /dev/null @@ -1,637 +0,0 @@ -#pragma once - -#include "microbdb.h" - -#define MAKEFILTERTMPL(TRecord, MemberFunc, NS) \ - template <typename T> \ - struct MemberFunc; \ - template <> \ - struct MemberFunc<TRecord> { \ - bool operator()(const TRecord* r) { \ - return NS::MemberFunc(r); \ - } \ - } - -#define MAKEJOINTMPL(TRecordA, TRecordB, MemberFunc, NS, TMergeType) \ - template <typename A, typename B> \ - struct MemberFunc; \ - template <> \ - struct MemberFunc<TRecordA, TRecordB> { \ - int operator()(const TRecordA* l, const TRecordB* r) { \ - return NS::MemberFunc(l, r); \ - } \ - }; \ - typedef TMergeRec<TRecordA, TRecordB> TMergeType - -#define MAKEJOINTMPL2(TRecordA, TRecordB, MemberFunc, StructName, TMergeType) \ - template <typename A, typename B> \ - struct StructName; \ - template <> \ - struct StructName<TRecordA, TRecordB> { \ - int operator()(const TRecordA* l, const TRecordB* r) { \ - return MemberFunc(l, r); \ - } \ - }; \ - typedef TMergeRec<TRecordA, TRecordB> TMergeType - -#define MAKEJOINTMPLLEFT(TRecordA, TRecordB, MemberFunc, NS, TMergeType) \ - template <typename A, typename B> \ - struct MemberFunc; \ - template <> \ - struct MemberFunc<TRecordA, TRecordB> { \ - int operator()(const TRecordA* l, const TRecordB* r) { \ - return NS::MemberFunc(l->RecA, r); \ - } \ - }; \ - typedef TMergeRec<TRecordA, TRecordB> TMergeType - -template <class TRec> -class IDatNextSource { -public: - virtual const TRec* Next() = 0; - virtual void Work() { - } -}; - -template <class TRec> -class IDatNextReceiver { -public: - IDatNextReceiver(IDatNextSource<TRec>& source) - : Source(source) - { - } - - virtual void Work() { - Source.Work(); - } - -protected: - IDatNextSource<TRec>& Source; -}; - -template <class TInRec, class TOutRec> -class IDatNextChannel: public IDatNextReceiver<TInRec>, public IDatNextSource<TOutRec> { -public: - IDatNextChannel(IDatNextSource<TInRec>& source) - : IDatNextReceiver<TInRec>(source) - { - } - - virtual void Work() { - IDatNextReceiver<TInRec>::Work(); - } -}; - -class IDatWorker { -public: - virtual void Work() = 0; -}; - -template <class TRec> -class IDatPushReceiver { -public: - virtual void Push(const TRec* rec) = 0; - virtual void Work() = 0; -}; - -template <class TRec> -class IDatPushSource { -public: - IDatPushSource(IDatPushReceiver<TRec>& receiver) - : Receiver(receiver) - { - } - - virtual void Work() { - Receiver.Work(); - } - -protected: - IDatPushReceiver<TRec>& Receiver; -}; - -template <class TInRec, class TOutRec> -class IDatPushChannel: public IDatPushReceiver<TInRec>, public IDatPushSource<TOutRec> { -public: - IDatPushChannel(IDatPushReceiver<TOutRec>& receiver) - : IDatPushSource<TOutRec>(receiver) - { - } - - virtual void Work() { - IDatPushSource<TOutRec>::Work(); - } -}; - -template <class TRec> -class IDatNextToPush: public IDatNextReceiver<TRec>, public IDatPushSource<TRec> { - typedef IDatNextReceiver<TRec> TNextReceiver; - typedef IDatPushSource<TRec> TPushSource; - -public: - IDatNextToPush(IDatNextSource<TRec>& source, IDatPushReceiver<TRec>& receiver) - : TNextReceiver(source) - , TPushSource(receiver) - { - } - - virtual void Work() { - const TRec* rec; - while (rec = TNextReceiver::Source.Next()) - TPushSource::Receiver.Push(rec); - TPushSource::Work(); - TNextReceiver::Work(); - } -}; - -template <class TRec> -class TDatNextPNSplitter: public IDatNextReceiver<TRec>, public IDatNextSource<TRec>, public IDatPushSource<TRec> { -public: - TDatNextPNSplitter(IDatNextSource<TRec>& source, IDatPushReceiver<TRec>& receiver) - : IDatNextReceiver<TRec>(source) - , IDatNextSource<TRec>() - , IDatPushSource<TRec>(receiver) - { - } - - const TRec* Next() { - const TRec* rec = IDatNextReceiver<TRec>::Source.Next(); - if (rec) { - IDatPushSource<TRec>::Receiver.Push(rec); - return rec; - } else { - return 0; - } - } - - virtual void Work() { - IDatNextReceiver<TRec>::Work(); - IDatPushSource<TRec>::Work(); - } -}; - -template <class TRec, class TOutRecA = TRec, class TOutRecB = TRec> -class TDatPushPPSplitter: public IDatPushReceiver<TRec>, public IDatPushSource<TOutRecA>, public IDatPushSource<TOutRecB> { -public: - TDatPushPPSplitter(IDatPushReceiver<TOutRecA>& receiverA, IDatPushReceiver<TOutRecB>& receiverB) - : IDatPushSource<TOutRecA>(receiverA) - , IDatPushSource<TOutRecB>(receiverB) - { - } - - void Push(const TRec* rec) { - IDatPushSource<TOutRecA>::Receiver.Push(rec); - IDatPushSource<TOutRecB>::Receiver.Push(rec); - } - - void Work() { - IDatPushSource<TOutRecA>::Work(); - IDatPushSource<TOutRecB>::Work(); - } -}; - -template <class TRec> -class TFastInDatFile: public TInDatFile<TRec>, public IDatNextSource<TRec> { -public: - typedef TInDatFile<TRec> Base; - - TFastInDatFile(const char* name, bool open = true, size_t pages = dbcfg::fbufsize, int pagesOrBytes = 0) - : TInDatFile<TRec>(name, pages, pagesOrBytes) - , FileName(name) - { - if (open) - Base::Open(name); - } - - void Open() { - Base::Open(FileName); - } - - template <class TPassRec> - bool PassToUid(const TRec* inrec, const TPassRec* torec) { - inrec = Base::Current(); - while (inrec && CompareUids(inrec, torec) < 0) - inrec = Base::Next(); - return (inrec && CompareUids(inrec, torec) == 0); - } - - void Work() { - Base::Close(); - } - - const TRec* Next() { - return Base::Next(); - } - -private: - TString FileName; -}; - -template <class TRec> -class TPushOutDatFile: public TOutDatFile<TRec>, public IDatPushReceiver<TRec> { -public: - typedef TOutDatFile<TRec> Base; - - TPushOutDatFile(const char* name, bool open = true) - : Base(name, dbcfg::pg_docuid, dbcfg::fbufsize, 0) - , FileName(name) - { - if (open) - Base::Open(name); - } - - void Open() { - Base::Open(~FileName); - } - - void Push(const TRec* rec) { - Base::Push(rec); - } - - void Work() { - Base::Close(); - } - -private: - TString FileName; -}; - -template <class TRec> -class TNextOutDatFile: public IDatNextToPush<TRec> { -public: - typedef IDatNextToPush<TRec> TBase; - - TNextOutDatFile(const char* name, IDatNextSource<TRec>& source, bool open = true) - : TBase(source, File) - , File(name, open) - { - } - - void Open() { - File.Open(); - } - -private: - TPushOutDatFile<TRec> File; -}; - -template <class TVal, template <typename T> class TCompare> -class TNextDatSorterMemo: public TDatSorterMemo<TVal, TCompare>, public IDatNextChannel<TVal, TVal> { - typedef TDatSorterMemo<TVal, TCompare> TImpl; - -public: - TNextDatSorterMemo(IDatNextSource<TVal>& source, const char* dir = dbcfg::fname_temp, const char* name = "yet another sorter", size_t memory = dbcfg::small_sorter_size, size_t pagesize = dbcfg::pg_docuid, size_t pages = dbcfg::fbufsize, int pagesOrBytes = 0) - : TImpl(name, memory, pagesize, pages, pagesOrBytes) - , IDatNextChannel<TVal, TVal>(source) - , Sorted(false) - { - TImpl::Open(dir); - } - - void Sort() { - const TVal* rec; - while (rec = IDatNextChannel<TVal, TVal>::Source.Next()) { - TImpl::Push(rec); - } - TImpl::Sort(); - Sorted = true; - } - - const TVal* Next() { - if (!Sorted) - Sort(); - return TImpl::Next(); - } - -private: - bool Sorted; - TString Dir; -}; - -template <class TInRec, class TOutRec> -class TDatConverter: public IDatNextChannel<TInRec, TOutRec> { -public: - TDatConverter(IDatNextSource<TInRec>& source) - : IDatNextChannel<TInRec, TOutRec>(source) - { - } - - virtual void Convert(const TInRec& inrec, TOutRec& outrec) { - outrec(inrec); - } - - const TOutRec* Next() { - const TInRec* rec = IDatNextChannel<TInRec, TOutRec>::Source.Next(); - if (!rec) - return 0; - Convert(*rec, CurrentRec); - return &CurrentRec; - } - -private: - TOutRec CurrentRec; -}; - -template <class TRecA, class TRecB> -class TMergeRec { -public: - const TRecA* RecA; - const TRecB* RecB; -}; - -enum NMergeTypes { - MT_JOIN = 0, - MT_ADD = 1, - MT_OVERWRITE = 2, - MT_TYPENUM -}; - -template <class TRecA, class TRecB, template <typename TA, typename TB> class TCompare> -class TNextDatMerger: public IDatNextReceiver<TRecA>, public IDatNextReceiver<TRecB>, public IDatNextSource<TMergeRec<TRecA, TRecB>> { -public: - TNextDatMerger(IDatNextSource<TRecA>& sourceA, IDatNextSource<TRecB>& sourceB, ui8 mergeType) - : IDatNextReceiver<TRecA>(sourceA) - , IDatNextReceiver<TRecB>(sourceB) - , MergeType(mergeType) - , MoveA(false) - , MoveB(false) - , NotInit(true) - { - } - - const TMergeRec<TRecA, TRecB>* Next() { - if (MoveA || NotInit) - SourceARec = IDatNextReceiver<TRecA>::Source.Next(); - if (MoveB || NotInit) - SourceBRec = IDatNextReceiver<TRecB>::Source.Next(); - NotInit = false; - - // Cout << "Next " << SourceARec->HostId << "\t" << SourceBRec->HostId << "\t" << TCompare<TRecA, TRecB>()(SourceARec, SourceBRec) << "\t" << ::compare(SourceARec->HostId, SourceBRec->HostId) << "\t" << ::compare(1, 2) << "\t" << ::compare(2,1) << Endl; - if (MergeType == MT_ADD && SourceARec && (!SourceBRec || TCompare<TRecA, TRecB>()(SourceARec, SourceBRec) < 0)) { - MergeRec.RecA = SourceARec; - MergeRec.RecB = 0; - MoveA = true; - MoveB = false; - return &MergeRec; - } - - if (MergeType == MT_ADD && SourceBRec && (!SourceARec || TCompare<TRecA, TRecB>()(SourceARec, SourceBRec) < 0)) { - MergeRec.RecA = 0; - MergeRec.RecB = SourceBRec; - MoveA = false; - MoveB = true; - return &MergeRec; - } - - if (MergeType == MT_ADD && SourceARec && SourceBRec && TCompare<TRecA, TRecB>()(SourceARec, SourceBRec) == 0) { - MergeRec.RecA = SourceARec; - MergeRec.RecB = SourceBRec; - MoveA = true; - MoveB = true; - return &MergeRec; - } - - while (MergeType == MT_JOIN && SourceARec && SourceBRec && TCompare<TRecA, TRecB>()(SourceARec, SourceBRec) != 0) { - while (SourceARec && TCompare<TRecA, TRecB>()(SourceARec, SourceBRec) < 0) { - SourceARec = IDatNextReceiver<TRecA>::Source.Next(); - } - while (SourceARec && SourceBRec && TCompare<TRecA, TRecB>()(SourceARec, SourceBRec) > 0) { - SourceBRec = IDatNextReceiver<TRecB>::Source.Next(); - } - } - - if (MergeType == MT_JOIN && SourceARec && SourceBRec) { - MergeRec.RecA = SourceARec; - MergeRec.RecB = SourceBRec; - MoveA = true; - MoveB = true; - return &MergeRec; - } - - MergeRec.RecA = 0; - MergeRec.RecB = 0; - return 0; - } - - void Work() { - IDatNextReceiver<TRecA>::Source.Work(); - IDatNextReceiver<TRecB>::Source.Work(); - } - -private: - TMergeRec<TRecA, TRecB> MergeRec; - const TRecA* SourceARec; - const TRecB* SourceBRec; - ui8 MergeType; - bool MoveA; - bool MoveB; - bool NotInit; -}; - -/*template<class TRec, class TSource, template <typename T> class TCompare, class TReceiver = TPushOutDatFile<TRec> > -class TPushDatMerger { -public: - TPushDatMerger(TSource& source, TReceiver& receiver, ui8 mergeType) - : Source(source) - , Receiver(receiver) - , MergeType(mergeType) - { - } - - virtual void Init() { - SourceRec = Source.Next(); - } - - virtual void Push(const TRec* rec) { - while (SourceRec && TCompare<TRec>()(SourceRec, rec, 0) < 0) { - if (MergeType == MT_OVERWRITE || MergeType == MT_ADD) - Receiver.Push(SourceRec); - SourceRec = Source.Next(); - } - - bool intersected = false; - while (SourceRec && TCompare<TRec>()(SourceRec, rec, 0) == 0) { - intersected = true; - if (MergeType == MT_ADD) - Receiver.Push(SourceRec); - SourceRec = Source.Next(); - } - - if (intersected && MergeType == MT_JOIN) - Receiver.Push(rec); - - if (MergeType == MT_OVERWRITE || MergeType == MT_ADD) - Receiver.Push(rec); - } - - virtual void Term() { - if (MergeType == MT_OVERWRITE || MergeType == MT_ADD) { - while (SourceRec) { - Receiver.Push(SourceRec); - SourceRec = Source.Next(); - } - } - } - -private: - TSource& Source; - const TRec* SourceRec; - TReceiver& Receiver; - ui8 MergeType; -};*/ - -/*template <class TRec, class TSourceA, class TSourceB, template <typename T> class TCompare, class TReceiver = TPushOutDatFile<TRec> > -class TNextDatMerger: public TPushDatMerger<TRec, TSourceA, TCompare, TReceiver> { - typedef TPushDatMerger<TRec, TSourceA, TCompare, TReceiver> TImpl; -public: - TNextDatMerger(TSourceA& sourceA, TSourceB& sourceB, TReceiver& receiver, ui8 mergeType) - : TImpl(sourceA, receiver, mergeType) - , SourceB(sourceB) - { - } - - virtual void Work() { - TImpl::Init(); - while (SourceBRec = SourceB.Next()) { - TImpl::Push(SourceBRec); - } - TImpl::Term(); - } -private: - TSourceB& SourceB; - const TRec* SourceBRec; -};*/ - -/*template <class TRec, template <typename T> class TCompare, class TReceiver = TPushOutDatFile<TRec> > -class TFilePushDatMerger: public TPushDatMerger<TRec, TFastInDatFile<TRec>, TCompare, TReceiver> { - typedef TPushDatMerger<TRec, TFastInDatFile<TRec>, TCompare, TReceiver> TImpl; -public: - TFilePushDatMerger(const char* name, TReceiver& receiver, ui8 mergeType) - : TImpl(SourceFile, receiver, mergeType) - , SourceFile(name) - { - } - - virtual void Push(const TRec* rec) { - TImpl::Push(rec); - } - - virtual void Term() { - TImpl::Term(); - } -private: - TFastInDatFile<TRec> SourceFile; -};*/ - -/*template <class TRec, template <typename T> class TCompare, class TReceiver = TPushOutDatFile<TRec> > -class TFileNextDatMerger: public TNextDatMerger<TRec, TFastInDatFile<TRec>, TFastInDatFile<TRec>, TCompare, TReceiver> { - typedef TNextDatMerger<TRec, TFastInDatFile<TRec>, TFastInDatFile<TRec>, TCompare, TReceiver> TImpl; -public: - TFileNextDatMerger(const char* sourceAname, const char* sourceBname, TReceiver& receiver, ui8 mergeType) - : TImpl(FileA, FileB, receiver, mergeType) - , FileA(sourceAname) - , FileB(sourceBname) - { - } - - virtual void Work() { - TImpl::Work(); - } -private: - TFastInDatFile<TRec> FileA; - TFastInDatFile<TRec> FileB; -};*/ - -template <class TRec, template <typename T> class TPredicate> -class TDatNextFilter: public IDatNextChannel<TRec, TRec> { -public: - TDatNextFilter(IDatNextSource<TRec>& source) - : IDatNextChannel<TRec, TRec>(source) - { - } - - virtual const TRec* Next() { - const TRec* rec; - while ((rec = IDatNextChannel<TRec, TRec>::Source.Next()) != 0 && !Check(rec)) { - } - if (!rec) - return 0; - return rec; - } - -protected: - virtual bool Check(const TRec* rec) { - return TPredicate<TRec>()(rec); - } -}; - -template <class TRec, template <typename T> class TPredicate> -class TDatPushFilter: public IDatPushChannel<TRec, TRec> { -public: - TDatPushFilter(IDatPushReceiver<TRec>& receiver) - : IDatPushChannel<TRec, TRec>(receiver) - { - } - - virtual void Push(const TRec* rec) { - if (Check(rec)) - IDatPushChannel<TRec, TRec>::Receiver.Push(rec); - } - -private: - virtual bool Check(const TRec* rec) { - return TPredicate<TRec>()(rec); - } -}; - -template <class TInRec, class TOutRec, template <typename T> class TCompare> -class TDatGrouper: public IDatNextChannel<TInRec, TOutRec> { -public: - TDatGrouper(IDatNextSource<TInRec>& source) - : IDatNextChannel<TInRec, TOutRec>(source) - , Begin(true) - , Finish(false) - , HasOutput(false) - { - } - - const TOutRec* Next() { - while (CurrentRec = IDatNextChannel<TInRec, TOutRec>::Source.Next()) { - int cmp = 0; - if (Begin) { - Begin = false; - OnStart(); - } else if ((cmp = TCompare<TInRec>()(CurrentRec, LastRec, 0)) != 0) { - OnFinish(); - OnStart(); - } - OnRecord(); - LastRec = CurrentRec; - if (HasOutput) { - HasOutput = false; - return &OutRec; - } - } - if (!Finish) - OnFinish(); - Finish = true; - if (HasOutput) { - HasOutput = false; - return &OutRec; - } - return 0; - } - -protected: - virtual void OnStart() = 0; - virtual void OnRecord() = 0; - virtual void OnFinish() = 0; - - const TInRec* CurrentRec; - const TInRec* LastRec; - TOutRec OutRec; - - bool Begin; - bool Finish; - bool HasOutput; -}; diff --git a/library/cpp/monlib/encode/legacy_protobuf/legacy_proto_decoder.cpp b/library/cpp/monlib/encode/legacy_protobuf/legacy_proto_decoder.cpp deleted file mode 100644 index f87a2d7e8f4..00000000000 --- a/library/cpp/monlib/encode/legacy_protobuf/legacy_proto_decoder.cpp +++ /dev/null @@ -1,527 +0,0 @@ -#include "legacy_protobuf.h" - -#include <library/cpp/monlib/encode/legacy_protobuf/protos/metric_meta.pb.h> -#include <library/cpp/monlib/metrics/metric_consumer.h> -#include <library/cpp/monlib/metrics/labels.h> - -#include <util/generic/yexception.h> -#include <util/generic/maybe.h> -#include <util/datetime/base.h> -#include <util/string/split.h> - -#include <google/protobuf/reflection.h> - -#include <algorithm> - -#ifdef LEGACY_PB_TRACE -#define TRACE(msg) \ - Cerr << msg << Endl -#else -#define TRACE(...) ; -#endif - -namespace NMonitoring { - namespace { - using TMaybeMeta = TMaybe<NMonProto::TMetricMeta>; - - TString ReadLabelValue(const NProtoBuf::Message& msg, const NProtoBuf::FieldDescriptor* d, const NProtoBuf::Reflection& r) { - using namespace NProtoBuf; - - switch (d->type()) { - case FieldDescriptor::TYPE_UINT32: - return ::ToString(r.GetUInt32(msg, d)); - case FieldDescriptor::TYPE_UINT64: - return ::ToString(r.GetUInt64(msg, d)); - case FieldDescriptor::TYPE_STRING: - return r.GetString(msg, d); - case FieldDescriptor::TYPE_ENUM: { - auto val = r.GetEnumValue(msg, d); - auto* valDesc = d->enum_type()->FindValueByNumber(val); - return valDesc->name(); - } - - default: - ythrow yexception() << "type " << d->type_name() << " cannot be used as a field value"; - } - - return {}; - } - - double ReadFieldAsDouble(const NProtoBuf::Message& msg, const NProtoBuf::FieldDescriptor* d, const NProtoBuf::Reflection& r) { - using namespace NProtoBuf; - - switch (d->type()) { - case FieldDescriptor::TYPE_DOUBLE: - return r.GetDouble(msg, d); - case FieldDescriptor::TYPE_BOOL: - return r.GetBool(msg, d) ? 1 : 0; - case FieldDescriptor::TYPE_INT32: - return r.GetInt32(msg, d); - case FieldDescriptor::TYPE_INT64: - return r.GetInt64(msg, d); - case FieldDescriptor::TYPE_UINT32: - return r.GetUInt32(msg, d); - case FieldDescriptor::TYPE_UINT64: - return r.GetUInt64(msg, d); - case FieldDescriptor::TYPE_SINT32: - return r.GetInt32(msg, d); - case FieldDescriptor::TYPE_SINT64: - return r.GetInt64(msg, d); - case FieldDescriptor::TYPE_FIXED32: - return r.GetUInt32(msg, d); - case FieldDescriptor::TYPE_FIXED64: - return r.GetUInt64(msg, d); - case FieldDescriptor::TYPE_SFIXED32: - return r.GetInt32(msg, d); - case FieldDescriptor::TYPE_SFIXED64: - return r.GetInt64(msg, d); - case FieldDescriptor::TYPE_FLOAT: - return r.GetFloat(msg, d); - case FieldDescriptor::TYPE_ENUM: - return r.GetEnumValue(msg, d); - default: - ythrow yexception() << "type " << d->type_name() << " cannot be used as a field value"; - } - - return std::numeric_limits<double>::quiet_NaN(); - } - - double ReadRepeatedAsDouble(const NProtoBuf::Message& msg, const NProtoBuf::FieldDescriptor* d, const NProtoBuf::Reflection& r, size_t i) { - using namespace NProtoBuf; - - switch (d->type()) { - case FieldDescriptor::TYPE_DOUBLE: - return r.GetRepeatedDouble(msg, d, i); - case FieldDescriptor::TYPE_BOOL: - return r.GetRepeatedBool(msg, d, i) ? 1 : 0; - case FieldDescriptor::TYPE_INT32: - return r.GetRepeatedInt32(msg, d, i); - case FieldDescriptor::TYPE_INT64: - return r.GetRepeatedInt64(msg, d, i); - case FieldDescriptor::TYPE_UINT32: - return r.GetRepeatedUInt32(msg, d, i); - case FieldDescriptor::TYPE_UINT64: - return r.GetRepeatedUInt64(msg, d, i); - case FieldDescriptor::TYPE_SINT32: - return r.GetRepeatedInt32(msg, d, i); - case FieldDescriptor::TYPE_SINT64: - return r.GetRepeatedInt64(msg, d, i); - case FieldDescriptor::TYPE_FIXED32: - return r.GetRepeatedUInt32(msg, d, i); - case FieldDescriptor::TYPE_FIXED64: - return r.GetRepeatedUInt64(msg, d, i); - case FieldDescriptor::TYPE_SFIXED32: - return r.GetRepeatedInt32(msg, d, i); - case FieldDescriptor::TYPE_SFIXED64: - return r.GetRepeatedInt64(msg, d, i); - case FieldDescriptor::TYPE_FLOAT: - return r.GetRepeatedFloat(msg, d, i); - case FieldDescriptor::TYPE_ENUM: - return r.GetRepeatedEnumValue(msg, d, i); - default: - ythrow yexception() << "type " << d->type_name() << " cannot be used as a field value"; - } - - return std::numeric_limits<double>::quiet_NaN(); - } - - TString LabelFromField(const NProtoBuf::Message& msg, const TString& name) { - const auto* fieldDesc = msg.GetDescriptor()->FindFieldByName(name); - const auto* reflection = msg.GetReflection(); - Y_ENSURE(fieldDesc && reflection, "Unable to get meta for field " << name); - - auto s = ReadLabelValue(msg, fieldDesc, *reflection); - std::replace(std::begin(s), s.vend(), ' ', '_'); - - return s; - } - - TMaybeMeta MaybeGetMeta(const NProtoBuf::FieldOptions& opts) { - if (opts.HasExtension(NMonProto::Metric)) { - return opts.GetExtension(NMonProto::Metric); - } - - return Nothing(); - } - - class ILabelGetter: public TThrRefBase { - public: - enum class EType { - Fixed = 1, - Lazy = 2, - }; - - virtual TLabel Get(const NProtoBuf::Message&) = 0; - virtual EType Type() const = 0; - }; - - class TFixedLabel: public ILabelGetter { - public: - explicit TFixedLabel(TLabel&& l) - : Label_{std::move(l)} - { - TRACE("found fixed label " << l); - } - - EType Type() const override { - return EType::Fixed; - } - TLabel Get(const NProtoBuf::Message&) override { - return Label_; - } - - private: - TLabel Label_; - }; - - using TFunction = std::function<TLabel(const NProtoBuf::Message&)>; - - class TLazyLabel: public ILabelGetter { - public: - TLazyLabel(TFunction&& fn) - : Fn_{std::move(fn)} - { - TRACE("found lazy label"); - } - - EType Type() const override { - return EType::Lazy; - } - TLabel Get(const NProtoBuf::Message& msg) override { - return Fn_(msg); - } - - private: - TFunction Fn_; - }; - - class TDecoderContext { - public: - void Init(const NProtoBuf::Message* msg) { - Message_ = msg; - Y_ENSURE(Message_); - Reflection_ = msg->GetReflection(); - Y_ENSURE(Reflection_); - - for (auto it = Labels_.begin(); it != Labels_.end(); ++it) { - if ((*it)->Type() == ILabelGetter::EType::Lazy) { - auto l = (*it)->Get(Message()); - *it = ::MakeIntrusive<TFixedLabel>(std::move(l)); - } else { - auto l = (*it)->Get(Message()); - } - } - } - - void Clear() noexcept { - Message_ = nullptr; - Reflection_ = nullptr; - } - - TDecoderContext CreateChildFromMeta(const NMonProto::TMetricMeta& metricMeta, const TString& name, i64 repeatedIdx = -1) { - TDecoderContext child{*this}; - child.Clear(); - - if (metricMeta.HasCustomPath()) { - if (const auto& nodePath = metricMeta.GetCustomPath()) { - child.AppendPath(nodePath); - } - } else if (metricMeta.GetPath()) { - child.AppendPath(name); - } - - if (metricMeta.HasKeys()) { - child.ParseKeys(metricMeta.GetKeys(), repeatedIdx); - } - - return child; - } - - TDecoderContext CreateChildFromRepeatedScalar(const NMonProto::TMetricMeta& metricMeta, i64 repeatedIdx = -1) { - TDecoderContext child{*this}; - child.Clear(); - - if (metricMeta.HasKeys()) { - child.ParseKeys(metricMeta.GetKeys(), repeatedIdx); - } - - return child; - } - - TDecoderContext CreateChildFromEls(const TString& name, const NMonProto::TExtraLabelMetrics& metrics, size_t idx, TMaybeMeta maybeMeta) { - TDecoderContext child{*this}; - child.Clear(); - - auto usePath = [&maybeMeta] { - return !maybeMeta->HasPath() || maybeMeta->GetPath(); - }; - - if (!name.empty() && (!maybeMeta || usePath())) { - child.AppendPath(name); - } - - child.Labels_.push_back(::MakeIntrusive<TLazyLabel>( - [ labelName = metrics.GetlabelName(), idx, &metrics ](const auto&) { - const auto& val = metrics.Getvalues(idx); - TString labelVal; - const auto uintLabel = val.GetlabelValueUint(); - - if (uintLabel) { - labelVal = ::ToString(uintLabel); - } else { - labelVal = val.GetlabelValue(); - } - - return TLabel{labelName, labelVal}; - })); - - return child; - } - - void ParseKeys(TStringBuf keys, i64 repeatedIdx = -1) { - auto parts = StringSplitter(keys) - .Split(' ') - .SkipEmpty(); - - for (auto part : parts) { - auto str = part.Token(); - - TStringBuf lhs, rhs; - - const bool isDynamic = str.TrySplit(':', lhs, rhs); - const bool isIndexing = isDynamic && rhs == TStringBuf("#"); - - if (isIndexing) { - TRACE("parsed index labels"); - - // <label_name>:# means that we should use index of the repeated - // field as label value - Y_ENSURE(repeatedIdx != -1); - Labels_.push_back(::MakeIntrusive<TLazyLabel>([=](const auto&) { - return TLabel{lhs, ::ToString(repeatedIdx)}; - })); - } else if (isDynamic) { - TRACE("parsed dynamic labels"); - - // <label_name>:<field_name> means that we need to take label value - // later from message's field - Labels_.push_back(::MakeIntrusive<TLazyLabel>([=](const auto& msg) { - return TLabel{lhs, LabelFromField(msg, TString{rhs})}; - })); - } else if (str.TrySplit('=', lhs, rhs)) { - TRACE("parsed static labels"); - - // <label_name>=<label_value> stands for constant label - Labels_.push_back(::MakeIntrusive<TFixedLabel>(TLabel{lhs, rhs})); - } else { - ythrow yexception() << "Incorrect Keys format"; - } - } - } - - void AppendPath(TStringBuf fieldName) { - Path_ += '/'; - Path_ += fieldName; - } - - const TString& Path() const { - return Path_; - } - - TLabels Labels() const { - TLabels result; - for (auto&& l : Labels_) { - result.Add(l->Get(Message())); - } - - return result; - } - - const NProtoBuf::Message& Message() const { - Y_VERIFY_DEBUG(Message_); - return *Message_; - } - - const NProtoBuf::Reflection& Reflection() const { - return *Reflection_; - } - - private: - const NProtoBuf::Message* Message_{nullptr}; - const NProtoBuf::Reflection* Reflection_{nullptr}; - - TString Path_; - TVector<TIntrusivePtr<ILabelGetter>> Labels_; - }; - - class TDecoder { - public: - TDecoder(IMetricConsumer* consumer, const NProtoBuf::Message& message, TInstant timestamp) - : Consumer_{consumer} - , Message_{message} - , Timestamp_{timestamp} - { - } - - void Decode() const { - Consumer_->OnStreamBegin(); - DecodeToStream(); - Consumer_->OnStreamEnd(); - } - - void DecodeToStream() const { - DecodeImpl(Message_, {}); - } - - private: - static const NMonProto::TExtraLabelMetrics& ExtractExtraMetrics(TDecoderContext& ctx, const NProtoBuf::FieldDescriptor& f) { - const auto& parent = ctx.Message(); - const auto& reflection = ctx.Reflection(); - auto& subMessage = reflection.GetMessage(parent, &f); - - return dynamic_cast<const NMonProto::TExtraLabelMetrics&>(subMessage); - } - - void DecodeImpl(const NProtoBuf::Message& msg, TDecoderContext ctx) const { - std::vector<const NProtoBuf::FieldDescriptor*> fields; - - ctx.Init(&msg); - - ctx.Reflection().ListFields(msg, &fields); - - for (const auto* f : fields) { - Y_ENSURE(f); - - const auto& opts = f->options(); - const auto isMessage = f->type() == NProtoBuf::FieldDescriptor::TYPE_MESSAGE; - const auto isExtraLabelMetrics = isMessage && f->message_type()->full_name() == "NMonProto.TExtraLabelMetrics"; - const auto maybeMeta = MaybeGetMeta(opts); - - if (!(maybeMeta || isExtraLabelMetrics)) { - continue; - } - - if (isExtraLabelMetrics) { - const auto& extra = ExtractExtraMetrics(ctx, *f); - RecurseExtraLabelMetrics(ctx, extra, f->name(), maybeMeta); - } else if (isMessage) { - RecurseMessage(ctx, *maybeMeta, *f); - } else if (f->is_repeated()) { - RecurseRepeatedScalar(ctx, *maybeMeta, *f); - } else if (maybeMeta->HasType()) { - const auto val = ReadFieldAsDouble(msg, f, ctx.Reflection()); - const bool isRate = maybeMeta->GetType() == NMonProto::EMetricType::RATE; - WriteMetric(val, ctx, f->name(), isRate); - } - } - } - - void RecurseRepeatedScalar(TDecoderContext ctx, const NMonProto::TMetricMeta& meta, const NProtoBuf::FieldDescriptor& f) const { - auto&& msg = ctx.Message(); - auto&& reflection = ctx.Reflection(); - const bool isRate = meta.GetType() == NMonProto::EMetricType::RATE; - - // this is a repeated scalar field, which makes metric only if it's indexing - for (auto i = 0; i < reflection.FieldSize(msg, &f); ++i) { - auto subCtx = ctx.CreateChildFromRepeatedScalar(meta, i); - subCtx.Init(&msg); - auto val = ReadRepeatedAsDouble(msg, &f, reflection, i); - WriteMetric(val, subCtx, f.name(), isRate); - } - } - - void RecurseExtraLabelMetrics(TDecoderContext ctx, const NMonProto::TExtraLabelMetrics& msg, const TString& name, const TMaybeMeta& meta) const { - auto i = 0; - for (const auto& val : msg.Getvalues()) { - auto subCtx = ctx.CreateChildFromEls(name, msg, i++, meta); - subCtx.Init(&val); - - const bool isRate = val.Hastype() - ? val.Gettype() == NMonProto::EMetricType::RATE - : meta->GetType() == NMonProto::EMetricType::RATE; - - double metricVal{0}; - if (isRate) { - metricVal = val.GetlongValue(); - } else { - metricVal = val.GetdoubleValue(); - } - - WriteMetric(metricVal, subCtx, "", isRate); - - for (const auto& child : val.Getchildren()) { - RecurseExtraLabelMetrics(subCtx, child, "", meta); - } - } - } - - void RecurseMessage(TDecoderContext ctx, const NMonProto::TMetricMeta& metricMeta, const NProtoBuf::FieldDescriptor& f) const { - const auto& msg = ctx.Message(); - const auto& reflection = ctx.Reflection(); - - if (f.is_repeated()) { - TRACE("recurse into repeated message " << f.name()); - for (auto i = 0; i < reflection.FieldSize(msg, &f); ++i) { - auto& subMessage = reflection.GetRepeatedMessage(msg, &f, i); - DecodeImpl(subMessage, ctx.CreateChildFromMeta(metricMeta, f.name(), i)); - } - } else { - TRACE("recurse into message " << f.name()); - auto& subMessage = reflection.GetMessage(msg, &f); - DecodeImpl(subMessage, ctx.CreateChildFromMeta(metricMeta, f.name())); - } - } - - inline void WriteValue(ui64 value) const { - Consumer_->OnUint64(Timestamp_, value); - } - - inline void WriteValue(double value) const { - Consumer_->OnDouble(Timestamp_, value); - } - - void WriteMetric(double value, const TDecoderContext& ctx, const TString& name, bool isRate) const { - if (isRate) { - Consumer_->OnMetricBegin(EMetricType::RATE); - WriteValue(static_cast<ui64>(value)); - } else { - Consumer_->OnMetricBegin(EMetricType::GAUGE); - WriteValue(static_cast<double>(value)); - } - - Consumer_->OnLabelsBegin(); - - for (const auto& label : ctx.Labels()) { - Consumer_->OnLabel(label.Name(), label.Value()); - } - - const auto fullPath = name.empty() - ? ctx.Path() - : ctx.Path() + '/' + name; - - if (fullPath) { - Consumer_->OnLabel("path", fullPath); - } - - Consumer_->OnLabelsEnd(); - Consumer_->OnMetricEnd(); - } - - private: - IMetricConsumer* Consumer_{nullptr}; - const NProtoBuf::Message& Message_; - TInstant Timestamp_; - }; - - } - - void DecodeLegacyProto(const NProtoBuf::Message& data, IMetricConsumer* consumer, TInstant ts) { - Y_ENSURE(consumer); - TDecoder(consumer, data, ts).Decode(); - } - - void DecodeLegacyProtoToStream(const NProtoBuf::Message& data, IMetricConsumer* consumer, TInstant ts) { - Y_ENSURE(consumer); - TDecoder(consumer, data, ts).DecodeToStream(); - } -} diff --git a/library/cpp/monlib/encode/legacy_protobuf/legacy_protobuf.h b/library/cpp/monlib/encode/legacy_protobuf/legacy_protobuf.h deleted file mode 100644 index 7cf8985d656..00000000000 --- a/library/cpp/monlib/encode/legacy_protobuf/legacy_protobuf.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include <google/protobuf/message.h> -#include <util/datetime/base.h> - -namespace NMonitoring { - // Unsupported features of the original format: - // - histograms; - // - memOnly; - // - dropHost/ignorePath - - void DecodeLegacyProto(const NProtoBuf::Message& data, class IMetricConsumer* c, TInstant ts = TInstant::Zero()); - - /// Does not open/close consumer stream unlike the above function. - void DecodeLegacyProtoToStream(const NProtoBuf::Message& data, class IMetricConsumer* c, TInstant ts = TInstant::Zero()); -} diff --git a/library/cpp/monlib/encode/unistat/unistat.h b/library/cpp/monlib/encode/unistat/unistat.h deleted file mode 100644 index 300fb6270fa..00000000000 --- a/library/cpp/monlib/encode/unistat/unistat.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include <util/generic/fwd.h> -#include <util/datetime/base.h> - -namespace NMonitoring { - /// Decodes unistat-style metrics - /// https://wiki.yandex-team.ru/golovan/stat-handle - void DecodeUnistat(TStringBuf data, class IMetricConsumer* c, TStringBuf metricNameLabel = "sensor", TInstant ts = TInstant::Zero()); - - /// Assumes consumer's stream is open by the caller - void DecodeUnistatToStream(TStringBuf data, class IMetricConsumer* c, TStringBuf metricNameLabel = "sensor", TInstant ts = TInstant::Zero()); -} diff --git a/library/cpp/monlib/encode/unistat/unistat_decoder.cpp b/library/cpp/monlib/encode/unistat/unistat_decoder.cpp deleted file mode 100644 index 8c34dbefc0b..00000000000 --- a/library/cpp/monlib/encode/unistat/unistat_decoder.cpp +++ /dev/null @@ -1,255 +0,0 @@ -#include "unistat.h" - -#include <library/cpp/monlib/metrics/histogram_collector.h> -#include <library/cpp/monlib/metrics/labels.h> -#include <library/cpp/monlib/metrics/metric_type.h> -#include <library/cpp/monlib/metrics/metric_value.h> -#include <library/cpp/monlib/metrics/metric_consumer.h> - -#include <library/cpp/json/json_reader.h> - -#include <util/datetime/base.h> -#include <util/string/split.h> - -#include <contrib/libs/re2/re2/re2.h> - -using namespace NJson; - -const re2::RE2 NAME_RE{R"((?:[a-zA-Z0-9\.\-/@_]+_)+(?:[ad][vehmntx]{3}|summ|hgram|max))"}; - -namespace NMonitoring { - namespace { - bool IsNumber(const NJson::TJsonValue& j) { - switch (j.GetType()) { - case EJsonValueType::JSON_INTEGER: - case EJsonValueType::JSON_UINTEGER: - case EJsonValueType::JSON_DOUBLE: - return true; - - default: - return false; - } - } - - template <typename T> - T ExtractNumber(const TJsonValue& val) { - switch (val.GetType()) { - case EJsonValueType::JSON_INTEGER: - return static_cast<T>(val.GetInteger()); - case EJsonValueType::JSON_UINTEGER: - return static_cast<T>(val.GetUInteger()); - case EJsonValueType::JSON_DOUBLE: - return static_cast<T>(val.GetDouble()); - - default: - ythrow yexception() << "Expected number, but found " << val.GetType(); - } - } - - auto ExtractDouble = ExtractNumber<double>; - auto ExtractUi64 = ExtractNumber<ui64>; - - class THistogramBuilder { - public: - void Add(TBucketBound bound, TBucketValue value) { - /// XXX: yasm uses left-closed intervals, while in monlib we use right-closed ones, - /// so (-inf; 0) [0, 100) [100; +inf) - /// becomes (-inf; 0] (0, 100] (100; +inf) - /// but since we've already lost some information these no way to avoid this kind of error here - Bounds_.push_back(bound); - - /// this will always be 0 for the first bucket, - /// since there's no way to make (-inf; N) bucket in yasm - Values_.push_back(NextValue_); - - /// we will write this value into the next bucket so that [[0, 10], [100, 20], [200, 50]] - /// becomes (-inf; 0] -> 0; (0; 100] -> 10; (100; 200] -> 20; (200; +inf) -> 50 - NextValue_ = value; - } - - IHistogramSnapshotPtr Finalize() { - Bounds_.push_back(std::numeric_limits<TBucketBound>::max()); - Values_.push_back(NextValue_); - - Y_ENSURE(Bounds_.size() <= HISTOGRAM_MAX_BUCKETS_COUNT, - "Histogram is only allowed to have " << HISTOGRAM_MAX_BUCKETS_COUNT << " buckets, but has " << Bounds_.size()); - - return ExplicitHistogramSnapshot(Bounds_, Values_); - } - - public: - TBucketValue NextValue_ {0}; - TBucketBounds Bounds_; - TBucketValues Values_; - }; - - class TDecoderUnistat { - private: - public: - explicit TDecoderUnistat(IMetricConsumer* consumer, IInputStream* is, TStringBuf metricNameLabel, TInstant ts) - : Consumer_{consumer}, - MetricNameLabel(metricNameLabel), - Timestamp_{ts} { - ReadJsonTree(is, &Json_, /* throw */ true); - } - - void Decode() { - Y_ENSURE(Json_.IsArray(), "Expected array at the top level, but found " << Json_.GetType()); - - for (auto&& metric : Json_.GetArray()) { - Y_ENSURE(metric.IsArray(), "Metric must be an array"); - auto&& arr = metric.GetArray(); - Y_ENSURE(arr.size() == 2, "Metric must be an array of 2 elements"); - auto&& name = arr[0]; - auto&& value = arr[1]; - MetricContext_ = {}; - - ParseName(name.GetString()); - - if (value.IsArray()) { - OnHistogram(value); - } else if (IsNumber(value)) { - OnScalar(value); - } else { - ythrow yexception() << "Expected list or number, but found " << value.GetType(); - } - - WriteValue(); - } - } - - private: - void OnScalar(const TJsonValue& jsonValue) { - if (MetricContext_.IsDeriv) { - MetricContext_.Type = EMetricType::RATE; - MetricContext_.Value = TMetricValue{ExtractUi64(jsonValue)}; - } else { - MetricContext_.Type = EMetricType::GAUGE; - MetricContext_.Value = TMetricValue{ExtractDouble(jsonValue)}; - } - } - - void OnHistogram(const TJsonValue& jsonHist) { - if (MetricContext_.IsDeriv) { - MetricContext_.Type = EMetricType::HIST_RATE; - } else { - MetricContext_.Type = EMetricType::HIST; - } - - auto histogramBuilder = THistogramBuilder(); - - for (auto&& bucket : jsonHist.GetArray()) { - Y_ENSURE(bucket.IsArray(), "Expected an array, but found " << bucket.GetType()); - auto&& arr = bucket.GetArray(); - Y_ENSURE(arr.size() == 2, "Histogram bucket must be an array of 2 elements"); - const auto bound = ExtractDouble(arr[0]); - const auto weight = ExtractUi64(arr[1]); - histogramBuilder.Add(bound, weight); - } - - MetricContext_.Histogram = histogramBuilder.Finalize(); - MetricContext_.Value = TMetricValue{MetricContext_.Histogram.Get()}; - } - - bool IsDeriv(TStringBuf name) { - TStringBuf ignore, suffix; - name.RSplit('_', ignore, suffix); - - Y_ENSURE(suffix.size() >= 3 && suffix.size() <= 5, "Disallowed suffix value: " << suffix); - - if (suffix == TStringBuf("summ") || suffix == TStringBuf("hgram")) { - return true; - } else if (suffix == TStringBuf("max")) { - return false; - } - - return suffix[0] == 'd'; - } - - void ParseName(TStringBuf value) { - TVector<TStringBuf> parts; - StringSplitter(value).Split(';').SkipEmpty().Collect(&parts); - - Y_ENSURE(parts.size() >= 1 && parts.size() <= 16); - - TStringBuf name = parts.back(); - parts.pop_back(); - - Y_ENSURE(RE2::FullMatch(re2::StringPiece{name.data(), name.size()}, NAME_RE), - "Metric name " << name << " doesn't match regex " << NAME_RE.pattern()); - - MetricContext_.Name = name; - MetricContext_.IsDeriv = IsDeriv(MetricContext_.Name); - - for (auto tag : parts) { - TStringBuf n, v; - tag.Split('=', n, v); - Y_ENSURE(n && v, "Unexpected tag format in " << tag); - MetricContext_.Labels.Add(n, v); - } - } - - private: - void WriteValue() { - Consumer_->OnMetricBegin(MetricContext_.Type); - - Consumer_->OnLabelsBegin(); - Consumer_->OnLabel(MetricNameLabel, TString{MetricContext_.Name}); - for (auto&& l : MetricContext_.Labels) { - Consumer_->OnLabel(l.Name(), l.Value()); - } - - Consumer_->OnLabelsEnd(); - - switch (MetricContext_.Type) { - case EMetricType::GAUGE: - Consumer_->OnDouble(Timestamp_, MetricContext_.Value.AsDouble()); - break; - case EMetricType::RATE: - Consumer_->OnUint64(Timestamp_, MetricContext_.Value.AsUint64()); - break; - case EMetricType::HIST: - case EMetricType::HIST_RATE: - Consumer_->OnHistogram(Timestamp_, MetricContext_.Value.AsHistogram()); - break; - case EMetricType::LOGHIST: - case EMetricType::DSUMMARY: - case EMetricType::IGAUGE: - case EMetricType::COUNTER: - case EMetricType::UNKNOWN: - ythrow yexception() << "Unexpected metric type: " << MetricContext_.Type; - } - - Consumer_->OnMetricEnd(); - } - - private: - IMetricConsumer* Consumer_; - NJson::TJsonValue Json_; - TStringBuf MetricNameLabel; - TInstant Timestamp_; - - struct { - TStringBuf Name; - EMetricType Type{EMetricType::UNKNOWN}; - TMetricValue Value; - bool IsDeriv{false}; - TLabels Labels; - IHistogramSnapshotPtr Histogram; - } MetricContext_; - }; - - } - - void DecodeUnistat(TStringBuf data, IMetricConsumer* c, TStringBuf metricNameLabel, TInstant ts) { - c->OnStreamBegin(); - DecodeUnistatToStream(data, c, metricNameLabel, ts); - c->OnStreamEnd(); - } - - void DecodeUnistatToStream(TStringBuf data, IMetricConsumer* c, TStringBuf metricNameLabel, TInstant ts) { - TMemoryInput in{data.data(), data.size()}; - TDecoderUnistat decoder(c, &in, metricNameLabel, ts); - decoder.Decode(); - } -} diff --git a/library/cpp/monlib/service/auth/tvm/auth.cpp b/library/cpp/monlib/service/auth/tvm/auth.cpp deleted file mode 100644 index e071c11ebc8..00000000000 --- a/library/cpp/monlib/service/auth/tvm/auth.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "auth.h" - -#include <util/generic/hash_set.h> - - -using namespace NTvmAuth; - - -namespace NMonitoring { -namespace { - template <class TTvmClientPtr = THolder<TTvmClient>> - class TTvmManager final: public ITvmManager { - public: - TTvmManager(NTvmApi::TClientSettings settings, TVector<TTvmId> clients, TLoggerPtr logger) - : AllowedClients_{clients.begin(), clients.end()} - , Tvm_(new TTvmClient{std::move(settings), std::move(logger)}) - { - } - - TTvmManager(NTvmTool::TClientSettings settings, TVector<TTvmId> clients, TLoggerPtr logger) - : AllowedClients_{clients.begin(), clients.end()} - , Tvm_(new TTvmClient{std::move(settings), std::move(logger)}) - { - } - - TTvmManager(TTvmClientPtr tvm, TVector<TTvmId> clients) - : AllowedClients_{clients.begin(), clients.end()} - , Tvm_(std::move(tvm)) - { - } - - bool IsAllowedClient(TTvmId clientId) override { - return AllowedClients_.contains(clientId); - } - - TCheckedServiceTicket CheckServiceTicket(TStringBuf ticket) override { - return Tvm_->CheckServiceTicket(ticket); - } - - private: - THashSet<TTvmId> AllowedClients_; - TTvmClientPtr Tvm_; - }; - - class TTvmAuthProvider final: public IAuthProvider { - public: - TTvmAuthProvider(THolder<ITvmManager> manager) - : TvmManager_{std::move(manager)} - { - } - - TAuthResult Check(const IHttpRequest& req) override { - auto ticketHeader = req.GetHeaders().FindHeader("X-Ya-Service-Ticket"); - if (!ticketHeader) { - return TAuthResult::NoCredentials(); - } - - const auto ticket = TvmManager_->CheckServiceTicket(ticketHeader->Value()); - if (!ticket) { - return TAuthResult::Denied(); - } - - return TvmManager_->IsAllowedClient(ticket.GetSrc()) - ? TAuthResult::Ok() - : TAuthResult::Denied(); - } - - private: - THolder<ITvmManager> TvmManager_; - }; -} // namespace - -THolder<ITvmManager> CreateDefaultTvmManager(NTvmApi::TClientSettings settings, TVector<TTvmId> allowedClients, TLoggerPtr logger) { - return MakeHolder<TTvmManager<>>(std::move(settings), std::move(allowedClients), std::move(logger)); -} - -THolder<ITvmManager> CreateDefaultTvmManager(NTvmTool::TClientSettings settings, TVector<TTvmId> allowedClients, TLoggerPtr logger) { - return MakeHolder<TTvmManager<>>(std::move(settings), std::move(allowedClients), std::move(logger)); -} - -THolder<ITvmManager> CreateDefaultTvmManager(TAtomicSharedPtr<NTvmAuth::TTvmClient> client, TVector<TTvmId> allowedClients) { - return MakeHolder<TTvmManager<TAtomicSharedPtr<NTvmAuth::TTvmClient>>>(std::move(client), std::move(allowedClients)); -} - -THolder<ITvmManager> CreateDefaultTvmManager(std::shared_ptr<NTvmAuth::TTvmClient> client, TVector<TTvmId> allowedClients) { - return MakeHolder<TTvmManager<std::shared_ptr<NTvmAuth::TTvmClient>>>(std::move(client), std::move(allowedClients)); -} - -THolder<IAuthProvider> CreateTvmAuth(THolder<ITvmManager> manager) { - return MakeHolder<TTvmAuthProvider>(std::move(manager)); -} - -} // namespace NMonitoring diff --git a/library/cpp/monlib/service/auth/tvm/auth.h b/library/cpp/monlib/service/auth/tvm/auth.h deleted file mode 100644 index 432beff9d6d..00000000000 --- a/library/cpp/monlib/service/auth/tvm/auth.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include <library/cpp/monlib/service/mon_service_http_request.h> -#include <library/cpp/monlib/service/auth.h> -#include <library/cpp/tvmauth/client/facade.h> - -namespace NMonitoring { - struct ITvmManager { - virtual ~ITvmManager() = default; - virtual bool IsAllowedClient(NTvmAuth::TTvmId clientId) = 0; - virtual NTvmAuth::TCheckedServiceTicket CheckServiceTicket(TStringBuf ticket) = 0; - }; - - THolder<ITvmManager> CreateDefaultTvmManager( - NTvmAuth::NTvmApi::TClientSettings settings, - TVector<NTvmAuth::TTvmId> allowedClients, - NTvmAuth::TLoggerPtr logger = NTvmAuth::TDevNullLogger::IAmBrave()); - - THolder<ITvmManager> CreateDefaultTvmManager( - NTvmAuth::NTvmTool::TClientSettings settings, - TVector<NTvmAuth::TTvmId> allowedClients, - NTvmAuth::TLoggerPtr logger = NTvmAuth::TDevNullLogger::IAmBrave()); - - THolder<ITvmManager> CreateDefaultTvmManager( - TAtomicSharedPtr<NTvmAuth::TTvmClient> client, - TVector<NTvmAuth::TTvmId> allowedClients); - - THolder<ITvmManager> CreateDefaultTvmManager( - std::shared_ptr<NTvmAuth::TTvmClient> client, - TVector<NTvmAuth::TTvmId> allowedClients); - - THolder<IAuthProvider> CreateTvmAuth(THolder<ITvmManager> tvmManager); -} // namespace NMonitoring diff --git a/library/cpp/on_disk/st_hash/fake.cpp b/library/cpp/on_disk/st_hash/fake.cpp deleted file mode 100644 index ef5af4d432b..00000000000 --- a/library/cpp/on_disk/st_hash/fake.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "save_stl.h" -#include "static_hash.h" -#include "static_hash_map.h" -#include "sthash_iterators.h" diff --git a/library/cpp/on_disk/st_hash/save_stl.h b/library/cpp/on_disk/st_hash/save_stl.h deleted file mode 100644 index 00f8f0e20db..00000000000 --- a/library/cpp/on_disk/st_hash/save_stl.h +++ /dev/null @@ -1,84 +0,0 @@ -#pragma once - -#include <util/generic/hash.h> -#include <util/system/yassert.h> -#include <util/stream/output.h> - -// this structure might be replaced with sthashtable class -template <class HF, class Eq, class size_type> -struct sthashtable_nvm_sv { - sthashtable_nvm_sv() { - if (sizeof(sthashtable_nvm_sv) != sizeof(HF) + sizeof(Eq) + 3 * sizeof(size_type)) { - memset(this, 0, sizeof(sthashtable_nvm_sv)); - } - } - - sthashtable_nvm_sv(const HF& phf, const Eq& peq, const size_type& pnb, const size_type& pne, const size_type& pnd) - : sthashtable_nvm_sv() - { - hf = phf; - eq = peq; - num_buckets = pnb; - num_elements = pne; - data_end_off = pnd; - } - - HF hf; - Eq eq; - size_type num_buckets; - size_type num_elements; - size_type data_end_off; -}; - -/** - * Some hack to save both THashMap and sthash. - * Working with stHash does not depend on the template parameters, because the content of stHash is not used inside this method. - */ -template <class V, class K, class HF, class Ex, class Eq, class A> -template <class KeySaver> -inline int THashTable<V, K, HF, Ex, Eq, A>::save_for_st(IOutputStream* stream, KeySaver& ks, sthash<int, int, THash<int>, TEqualTo<int>, typename KeySaver::TSizeType>* stHash) const { - Y_ASSERT(!stHash || stHash->bucket_count() == bucket_count()); - typedef sthashtable_nvm_sv<HF, Eq, typename KeySaver::TSizeType> sv_type; - sv_type sv = {this->_get_hash_fun(), this->_get_key_eq(), static_cast<typename KeySaver::TSizeType>(buckets.size()), static_cast<typename KeySaver::TSizeType>(num_elements), 0}; - // to do: m.b. use just the size of corresponding object? - typename KeySaver::TSizeType cur_off = sizeof(sv_type) + - (sv.num_buckets + 1) * sizeof(typename KeySaver::TSizeType); - sv.data_end_off = cur_off; - const_iterator n; - for (n = begin(); n != end(); ++n) { - sv.data_end_off += static_cast<typename KeySaver::TSizeType>(ks.GetRecordSize(*n)); - } - typename KeySaver::TSizeType* sb = stHash ? (typename KeySaver::TSizeType*)(stHash->buckets()) : nullptr; - if (stHash) - sv.data_end_off += static_cast<typename KeySaver::TSizeType>(sb[buckets.size()] - sb[0]); - //saver.Align(sizeof(char*)); - stream->Write(&sv, sizeof(sv)); - - size_type i; - //save vector - for (i = 0; i < buckets.size(); ++i) { - node* cur = buckets[i]; - stream->Write(&cur_off, sizeof(cur_off)); - if (cur) { - while (!((uintptr_t)cur & 1)) { - cur_off += static_cast<typename KeySaver::TSizeType>(ks.GetRecordSize(cur->val)); - cur = cur->next; - } - } - if (stHash) - cur_off += static_cast<typename KeySaver::TSizeType>(sb[i + 1] - sb[i]); - } - stream->Write(&cur_off, sizeof(cur_off)); // end mark - for (i = 0; i < buckets.size(); ++i) { - node* cur = buckets[i]; - if (cur) { - while (!((uintptr_t)cur & 1)) { - ks.SaveRecord(stream, cur->val); - cur = cur->next; - } - } - if (stHash) - stream->Write((const char*)stHash + sb[i], sb[i + 1] - sb[i]); - } - return 0; -} diff --git a/library/cpp/on_disk/st_hash/static_hash.h b/library/cpp/on_disk/st_hash/static_hash.h deleted file mode 100644 index ca7a6ccd369..00000000000 --- a/library/cpp/on_disk/st_hash/static_hash.h +++ /dev/null @@ -1,420 +0,0 @@ -#pragma once - -#include "save_stl.h" -#include "sthash_iterators.h" - -#include <util/generic/hash.h> -#include <util/generic/vector.h> -#include <util/generic/buffer.h> -#include <util/generic/cast.h> -#include <util/generic/yexception.h> // for save/load only -#include <util/stream/file.h> -#include <util/stream/buffer.h> -#include <utility> - -#include <memory> -#include <algorithm> -#include <functional> - -#include <cstdlib> -#include <cstddef> - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4624) // 'destructor could not be generated because a base class destructor is inaccessible' -#endif - -template <class HashType, class KeySaver> -inline void SaveHashToStreamEx(HashType& hash, IOutputStream* stream) { - KeySaver ks; - if (hash.save_for_st(stream, ks)) - ythrow yexception() << "Could not save hash to stream"; -} - -template <class HashType> -inline void SaveHashToStream(HashType& hash, IOutputStream* stream) { - typedef TSthashWriter<typename HashType::key_type, typename HashType::mapped_type, ui64> KeySaver; - return SaveHashToStreamEx<HashType, KeySaver>(hash, stream); -} - -template <class HashType, class KeySaver> -inline void SaveHashToFileEx(HashType& hash, const char* fileName) { - TFileOutput output(fileName); - SaveHashToStreamEx<HashType, KeySaver>(hash, &output); -} - -template <class HashType> -inline void SaveHashToFile(HashType& hash, const char* fileName) { - typedef TSthashWriter<typename HashType::key_type, typename HashType::mapped_type, ui64> KeySaver; - return SaveHashToFileEx<HashType, KeySaver>(hash, fileName); -} - -template <class HashType> -inline void SaveHashSetToFile(HashType& hash, const char* fileName) { - typedef TSthashSetWriter<typename HashType::key_type, ui64> KeySaver; - return SaveHashToFileEx<HashType, KeySaver>(hash, fileName); -} - -template <class HashType> -inline void SaveHashToFile32(HashType& hash, const char* fileName) { - typedef TSthashWriter<typename HashType::key_type, typename HashType::mapped_type, ui32> KeySaver; - return SaveHashToFileEx<HashType, KeySaver>(hash, fileName); -} - -template <class HashType, class KeySaver> -inline void SaveHashToBufferEx(HashType& hash, TBuffer& buffer, sthash<int, int, THash<int>, TEqualTo<int>, typename KeySaver::TSizeType>* stHash = nullptr) { - TBufferOutput stream(buffer); - KeySaver ks; - if (hash.save_for_st(&stream, ks, stHash)) - ythrow yexception() << "Could not save hash to memory"; -} - -template <class HashType> -inline void SaveHashToBuffer(HashType& hash, TBuffer& buffer) { - typedef TSthashWriter<typename HashType::key_type, typename HashType::mapped_type, ui64> KeySaver; - SaveHashToBufferEx<HashType, KeySaver>(hash, buffer); -} - -/** - * Some hack to save both THashMap and sthash. - * THashMap and sthash must have same bucket_count(). - */ -template <class HashType, class StHashType> -inline void SaveHashToBuffer(HashType& hash, TBuffer& buffer, StHashType* stHash) { - typedef TSthashWriter<typename HashType::key_type, typename HashType::mapped_type, ui64> KeySaver; - typedef sthash<int, int, THash<int>, TEqualTo<int>, typename KeySaver::TSizeType>* SH; - - SH sh = reinterpret_cast<SH>(stHash); - SaveHashToBufferEx<HashType, KeySaver>(hash, buffer, sh); -} - -template <class HashType> -inline void SaveHashToBuffer32(HashType& hash, TBuffer& buffer) { - typedef TSthashWriter<typename HashType::key_type, typename HashType::mapped_type, ui32> KeySaver; - SaveHashToBufferEx<HashType, KeySaver>(hash, buffer); -} - -template <class Iter, typename size_type_f = ui64> -class sthashtable { -public: - typedef typename Iter::TKeyType key_type; - typedef typename Iter::TValueType value_type; - typedef typename Iter::THasherType hasher; - typedef typename Iter::TKeyEqualType key_equal; - - typedef size_type_f size_type; - typedef ptrdiff_t difference_type; - typedef const value_type* const_pointer; - typedef const value_type& const_reference; - - typedef Iter const_iterator; - - const hasher hash_funct() const { - return hash; - } - const key_equal key_eq() const { - return equals; - } - -private: - const hasher hash; - const key_equal equals; - -private: - const_iterator iter_at_bucket(size_type bucket) const { - return (const_iterator)(((char*)this + buckets()[bucket])); - } - - const_iterator iter_at_bucket_or_end(size_type bucket) const { - if (bucket < num_buckets) - return (const_iterator)(((char*)this + buckets()[bucket])); - else - return end(); - } - - const size_type num_buckets; - const size_type num_elements; - const size_type data_end_off; - -protected: //shut up gcc warning - // we can't construct/destroy this object at all! - sthashtable(); - sthashtable(const sthashtable& ht); - ~sthashtable(); - -public: - // const size_type *buckets; - const size_type* buckets() const { - return (size_type*)((char*)this + sizeof(*this)); - } - const size_type buckets(size_type n) const { - return buckets()[n]; - } - - size_type size() const { - return num_elements; - } - size_type max_size() const { - return size_type(-1); - } - bool empty() const { - return size() == 0; - } - - const_iterator begin() const { - return num_buckets ? iter_at_bucket(0) : end(); - } - - const_iterator end() const { - return (const_iterator)(((char*)this + data_end_off)); - } - -public: - size_type size_in_bytes() const { - return data_end_off; - } - - size_type bucket_count() const { - return num_buckets; - } - - size_type elems_in_bucket(size_type bucket) const { - size_type result = 0; - const_iterator first = iter_at_bucket(bucket); - const_iterator last = iter_at_bucket_or_end(bucket + 1); - - for (; first != last; ++first) - ++result; - return result; - } - - template <class TheKey> - const_iterator find(const TheKey& key) const { - size_type n = bkt_num_key(key); - const_iterator first(iter_at_bucket(n)), last(iter_at_bucket_or_end(n + 1)); - for (; - first != last && !first.KeyEquals(equals, key); - ++first) { - } - if (first != last) - return first; - return end(); - } - - size_type count(const key_type& key) const { - const size_type n = bkt_num_key(key); - size_type result = 0; - const_iterator first = iter_at_bucket(n); - const_iterator last = iter_at_bucket_or_end(n + 1); - - for (; first != last; ++first) - if (first.KeyEquals(equals, key)) - ++result; - return result; - } - - std::pair<const_iterator, const_iterator> equal_range(const key_type& key) const; - -private: - template <class TheKey> - size_type bkt_num_key(const TheKey& key) const { - return hash(key) % num_buckets; - } -}; - -template <class I, class size_type_f> -std::pair<I, I> sthashtable<I, size_type_f>::equal_range(const key_type& key) const { - typedef std::pair<const_iterator, const_iterator> pii; - const size_type n = bkt_num_key(key); - const_iterator first = iter_at_bucket(n); - const_iterator last = iter_at_bucket_or_end(n + 1); - - for (; first != last; ++first) { - if (first.KeyEquals(equals, key)) { - const_iterator cur = first; - ++cur; - for (; cur != last; ++cur) - if (!cur.KeyEquals(equals, key)) - return pii(const_iterator(first), - const_iterator(cur)); - return pii(const_iterator(first), - const_iterator(last)); - } - } - return pii(end(), end()); -} - -/* end __SGI_STL_HASHTABLE_H */ - -template <class Key, class T, class HashFcn /*= hash<Key>*/, - class EqualKey = TEqualTo<Key>, typename size_type_f = ui64> -class sthash { -private: - typedef sthashtable<TSthashIterator<const Key, const T, HashFcn, EqualKey>, size_type_f> ht; - ht rep; - -public: - typedef typename ht::key_type key_type; - typedef typename ht::value_type value_type; - typedef typename ht::hasher hasher; - typedef typename ht::key_equal key_equal; - typedef T mapped_type; - - typedef typename ht::size_type size_type; - typedef typename ht::difference_type difference_type; - typedef typename ht::const_pointer const_pointer; - typedef typename ht::const_reference const_reference; - - typedef typename ht::const_iterator const_iterator; - - const hasher hash_funct() const { - return rep.hash_funct(); - } - const key_equal key_eq() const { - return rep.key_eq(); - } - -public: - size_type size() const { - return rep.size(); - } - size_type max_size() const { - return rep.max_size(); - } - bool empty() const { - return rep.empty(); - } - - const_iterator begin() const { - return rep.begin(); - } - const_iterator end() const { - return rep.end(); - } - -public: - template <class TheKey> - const_iterator find(const TheKey& key) const { - return rep.find(key); - } - template <class TheKey> - bool has(const TheKey& key) const { - return rep.find(key) != rep.end(); - } - - size_type count(const key_type& key) const { - return rep.count(key); - } - - std::pair<const_iterator, const_iterator> equal_range(const key_type& key) const { - return rep.equal_range(key); - } - - size_type size_in_bytes() const { - return rep.size_in_bytes(); - } - - size_type bucket_count() const { - return rep.bucket_count(); - } - size_type max_bucket_count() const { - return rep.max_bucket_count(); - } - size_type elems_in_bucket(size_type n) const { - return rep.elems_in_bucket(n); - } - - const size_type* buckets() const { - return rep.buckets(); - } - const size_type buckets(size_type n) const { - return rep.buckets()[n]; - } -}; - -template <class Key, class HashFcn, - class EqualKey = TEqualTo<Key>, typename size_type_f = ui64> -class sthash_set: public sthash<Key, TEmptyValue, HashFcn, EqualKey, size_type_f> { - typedef sthash<Key, TEmptyValue, HashFcn, EqualKey, size_type_f> Base; - -public: - using Base::const_iterator; - using Base::hasher; - using Base::key_equal; - using Base::key_type; - using Base::size_type; - using Base::value_type; -}; - -template <class Key, class T, class HashFcn /*= hash<Key>*/, - class EqualKey = TEqualTo<Key>, typename size_type_f = ui64> -class sthash_mm { -private: - typedef sthashtable<TSthashIterator<const Key, T, HashFcn, EqualKey>, size_type_f> ht; - ht rep; - -public: - typedef typename ht::key_type key_type; - typedef typename ht::value_type value_type; - typedef typename ht::hasher hasher; - typedef typename ht::key_equal key_equal; - typedef T mapped_type; - - typedef typename ht::size_type size_type; - typedef typename ht::difference_type difference_type; - typedef typename ht::const_pointer const_pointer; - typedef typename ht::const_reference const_reference; - - typedef typename ht::const_iterator const_iterator; - - const hasher hash_funct() const { - return rep.hash_funct(); - } - const key_equal key_eq() const { - return rep.key_eq(); - } - -public: - size_type size() const { - return rep.size(); - } - size_type max_size() const { - return rep.max_size(); - } - bool empty() const { - return rep.empty(); - } - - const_iterator begin() const { - return rep.begin(); - } - const_iterator end() const { - return rep.end(); - } - - const_iterator find(const key_type& key) const { - return rep.find(key); - } - - size_type count(const key_type& key) const { - return rep.count(key); - } - - std::pair<const_iterator, const_iterator> equal_range(const key_type& key) const { - return rep.equal_range(key); - } - - size_type bucket_count() const { - return rep.bucket_count(); - } - size_type max_bucket_count() const { - return rep.max_bucket_count(); - } - size_type elems_in_bucket(size_type n) const { - return rep.elems_in_bucket(n); - } -}; - -#ifdef _MSC_VER -#pragma warning(pop) -#endif diff --git a/library/cpp/on_disk/st_hash/static_hash_map.h b/library/cpp/on_disk/st_hash/static_hash_map.h deleted file mode 100644 index 5dc50abd392..00000000000 --- a/library/cpp/on_disk/st_hash/static_hash_map.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include "static_hash.h" - -#include <library/cpp/deprecated/mapped_file/mapped_file.h> - -#include <util/system/filemap.h> - -template <class SH> -struct sthash_mapped_c { - typedef SH H; - typedef typename H::const_iterator const_iterator; - TMappedFile M; - H* hsh; - sthash_mapped_c() - : M() - , hsh(nullptr) - { - } - sthash_mapped_c(const char* fname, bool precharge) - : M() - , hsh(nullptr) - { - Open(fname, precharge); - } - void Open(const char* fname, bool precharge) { - M.init(fname); - if (precharge) - M.precharge(); - hsh = (H*)M.getData(); - if (M.getSize() < sizeof(H) || (ssize_t)M.getSize() != hsh->end().Data - (char*)hsh) - ythrow yexception() << "Could not map hash: " << fname << " is damaged"; - } - H* operator->() { - return hsh; - } - const H* operator->() const { - return hsh; - } - H* GetSthash() { - return hsh; - } - const H* GetSthash() const { - return hsh; - } -}; - -template <class Key, class T, class Hash> -struct sthash_mapped: public sthash_mapped_c<sthash<Key, T, Hash>> { - typedef sthash<Key, T, Hash> H; - sthash_mapped(const char* fname, bool precharge) - : sthash_mapped_c<H>(fname, precharge) - { - } - sthash_mapped() - : sthash_mapped_c<H>() - { - } -}; diff --git a/library/cpp/on_disk/st_hash/sthash_iterators.h b/library/cpp/on_disk/st_hash/sthash_iterators.h deleted file mode 100644 index 6a9ebdd6c3f..00000000000 --- a/library/cpp/on_disk/st_hash/sthash_iterators.h +++ /dev/null @@ -1,334 +0,0 @@ -#pragma once - -#include "save_stl.h" - -#include <util/system/align.h> - -/** - This file provides functionality for saving some relatively simple THashMap object - to disk in a form that can be mapped read-only (via mmap) at any address. - That saved object is accessed via pointer to sthash object (that must have - the same parameters as original THashMap object) - - If either key or value are variable-sized (i.e. contain pointers), user must - write his own instantiation of TSthashIterator (read iterator for sthash) and - TSthashWriter (write iterator for THashMap). - An example for <const char *, B> pair is in here. -**/ - -// TEmptyValue and SizeOfEx are helpers for sthash_set -struct TEmptyValue { - TEmptyValue() = default; -}; - -template <class T> -inline size_t SizeOfEx() { - return sizeof(T); -} - -template <> -inline size_t SizeOfEx<TEmptyValue>() { - return 0; -} -template <> -inline size_t SizeOfEx<const TEmptyValue>() { - return 0; -} - -template <class TKey, class TValue, class HashFcn, class EqualKey> -struct TSthashIterator { - // Implementation for simple types - typedef const TKey TKeyType; - typedef const TValue TValueType; - typedef EqualKey TKeyEqualType; - typedef HashFcn THasherType; - - const char* Data; - TSthashIterator() - : Data(nullptr) - { - } - explicit TSthashIterator(const char* data) - : Data(data) - { - } - void operator++() { - Data += GetLength(); - } - - bool operator!=(const TSthashIterator& that) const { - return Data != that.Data; - } - bool operator==(const TSthashIterator& that) const { - return Data == that.Data; - } - TKey& Key() const { - return *(TKey*)Data; - } - TValue& Value() { - return *(TValue*)(Data + sizeof(TKey)); - } - const TValue& Value() const { - return *(const TValue*)(Data + sizeof(TKey)); - } - - template <class AnotherKeyType> - bool KeyEquals(const EqualKey& eq, const AnotherKeyType& key) const { - return eq(*(TKey*)Data, key); - } - - size_t GetLength() const { - return sizeof(TKey) + SizeOfEx<TValue>(); - } -}; - -template <class Key, class Value, typename size_type_o = ui64> -struct TSthashWriter { - typedef size_type_o TSizeType; - size_t GetRecordSize(const std::pair<const Key, const Value>&) const { - return sizeof(Key) + SizeOfEx<Value>(); - } - int SaveRecord(IOutputStream* stream, const std::pair<const Key, const Value>& record) const { - stream->Write(&record.first, sizeof(Key)); - stream->Write(&record.second, SizeOfEx<Value>()); - return 0; - } -}; - -// Remember that this simplified implementation makes a copy of `key' in std::make_pair. -// It can also waste some memory on undesired alignment. -template <class Key, typename size_type_o = ui64> -struct TSthashSetWriter: public TSthashWriter<Key, TEmptyValue, size_type_o> { - typedef TSthashWriter<Key, TEmptyValue, size_type_o> MapWriter; - size_t GetRecordSize(const Key& key) const { - return MapWriter::GetRecordSize(std::make_pair(key, TEmptyValue())); - } - int SaveRecord(IOutputStream* stream, const Key& key) const { - return MapWriter::SaveRecord(stream, std::make_pair(key, TEmptyValue())); - } -}; - -// we can't save something with pointers without additional tricks - -template <class A, class B, class HashFcn, class EqualKey> -struct TSthashIterator<A*, B, HashFcn, EqualKey> {}; - -template <class A, class B, class HashFcn, class EqualKey> -struct TSthashIterator<A, B*, HashFcn, EqualKey> {}; - -template <class A, class B, typename size_type_o> -struct TSthashWriter<A*, B*, size_type_o> {}; - -template <class A, class B, typename size_type_o> -struct TSthashWriter<A*, B, size_type_o> {}; - -template <class A, class B, typename size_type_o> -struct TSthashWriter<A, B*, size_type_o> {}; - -template <class T> -inline size_t AlignForChrKey() { - return 4; // TODO: change this (requeres rebuilt of a few existing files) -} - -template <> -inline size_t AlignForChrKey<TEmptyValue>() { - return 1; -} - -template <> -inline size_t AlignForChrKey<const TEmptyValue>() { - return AlignForChrKey<TEmptyValue>(); -} - -// !! note that for char*, physical placement of key and value is swapped -template <class TValue, class HashFcn, class EqualKey> -struct TSthashIterator<const char* const, TValue, HashFcn, EqualKey> { - typedef const TValue TValueType; - typedef const char* TKeyType; - typedef EqualKey TKeyEqualType; - typedef HashFcn THasherType; - - const char* Data; - TSthashIterator() - : Data(nullptr) - { - } - TSthashIterator(const char* data) - : Data(data) - { - } - void operator++() { - Data += GetLength(); - } - - bool operator!=(const TSthashIterator& that) const { - return Data != that.Data; - } - bool operator==(const TSthashIterator& that) const { - return Data == that.Data; - } - const char* Key() const { - return Data + SizeOfEx<TValue>(); - } - TValue& Value() { - return *(TValue*)Data; - } - const TValue& Value() const { - return *(const TValue*)Data; - } - - template <class K> - bool KeyEquals(const EqualKey& eq, const K& k) const { - return eq(Data + SizeOfEx<TValue>(), k); - } - - size_t GetLength() const { - size_t length = strlen(Data + SizeOfEx<TValue>()) + 1 + SizeOfEx<TValue>(); - length = AlignUp(length, AlignForChrKey<TValue>()); - return length; - } -}; - -template <class Value, typename size_type_o> -struct TSthashWriter<const char*, Value, size_type_o> { - typedef size_type_o TSizeType; - size_t GetRecordSize(const std::pair<const char*, const Value>& record) const { - size_t length = strlen(record.first) + 1 + SizeOfEx<Value>(); - length = AlignUp(length, AlignForChrKey<Value>()); - return length; - } - int SaveRecord(IOutputStream* stream, const std::pair<const char*, const Value>& record) const { - const char* alignBuffer = "qqqq"; - stream->Write(&record.second, SizeOfEx<Value>()); - size_t length = strlen(record.first) + 1; - stream->Write(record.first, length); - length = AlignUpSpace(length, AlignForChrKey<Value>()); - if (length) - stream->Write(alignBuffer, length); - return 0; - } -}; - -template <class TKey, class HashFcn, class EqualKey> -struct TSthashIterator<TKey, const char* const, HashFcn, EqualKey> { - typedef const TKey TKeyType; - typedef const char* TValueType; - typedef EqualKey TKeyEqualType; - typedef HashFcn THasherType; - - const char* Data; - TSthashIterator() - : Data(nullptr) - { - } - TSthashIterator(const char* data) - : Data(data) - { - } - void operator++() { - Data += GetLength(); - } - - bool operator!=(const TSthashIterator& that) const { - return Data != that.Data; - } - bool operator==(const TSthashIterator& that) const { - return Data == that.Data; - } - TKey& Key() { - return *(TKey*)Data; - } - const char* Value() const { - return Data + sizeof(TKey); - } - - template <class K> - bool KeyEquals(const EqualKey& eq, const K& k) const { - return eq(*(TKey*)Data, k); - } - - size_t GetLength() const { - size_t length = strlen(Data + sizeof(TKey)) + 1 + sizeof(TKey); - length = AlignUp(length, (size_t)4); - return length; - } -}; - -template <class Key, typename size_type_o> -struct TSthashWriter<Key, const char*, size_type_o> { - typedef size_type_o TSizeType; - size_t GetRecordSize(const std::pair<const Key, const char*>& record) const { - size_t length = strlen(record.second) + 1 + sizeof(Key); - length = AlignUp(length, (size_t)4); - return length; - } - int SaveRecord(IOutputStream* stream, const std::pair<const Key, const char*>& record) const { - const char* alignBuffer = "qqqq"; - stream->Write(&record.first, sizeof(Key)); - size_t length = strlen(record.second) + 1; - stream->Write(record.second, length); - length = AlignUpSpace(length, (size_t)4); - if (length) - stream->Write(alignBuffer, length); - return 0; - } -}; - -template <class HashFcn, class EqualKey> -struct TSthashIterator<const char* const, const char* const, HashFcn, EqualKey> { - typedef const char* TKeyType; - typedef const char* TValueType; - typedef EqualKey TKeyEqualType; - typedef HashFcn THasherType; - - const char* Data; - TSthashIterator() - : Data(nullptr) - { - } - TSthashIterator(const char* data) - : Data(data) - { - } - void operator++() { - Data += GetLength(); - } - - bool operator!=(const TSthashIterator& that) const { - return Data != that.Data; - } - bool operator==(const TSthashIterator& that) const { - return Data == that.Data; - } - const char* Key() const { - return Data; - } - const char* Value() const { - return Data + strlen(Data) + 1; - } - - template <class K> - bool KeyEquals(const EqualKey& eq, const K& k) const { - return eq(Data, k); - } - - size_t GetLength() const { - size_t length = strlen(Data) + 1; - length += strlen(Data + length) + 1; - return length; - } -}; - -template <typename size_type_o> -struct TSthashWriter<const char*, const char*, size_type_o> { - typedef size_type_o TSizeType; - size_t GetRecordSize(const std::pair<const char*, const char*>& record) const { - size_t size = strlen(record.first) + strlen(record.second) + 2; - return size; - } - int SaveRecord(IOutputStream* stream, const std::pair<const char*, const char*>& record) const { - stream->Write(record.first, strlen(record.first) + 1); - stream->Write(record.second, strlen(record.second) + 1); - return 0; - } -}; diff --git a/library/cpp/openssl/big_integer/big_integer.cpp b/library/cpp/openssl/big_integer/big_integer.cpp deleted file mode 100644 index 9b6802369a9..00000000000 --- a/library/cpp/openssl/big_integer/big_integer.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "big_integer.h" - -#include <util/generic/yexception.h> -#include <util/generic/scope.h> -#include <util/stream/output.h> - -#include <openssl/bn.h> - -using namespace NOpenSsl; - -TBigInteger::~TBigInteger() noexcept { - BN_free(Impl_); -} - -TBigInteger TBigInteger::FromULong(ui64 value) { - TBigInteger result(BN_new()); - - Y_ENSURE(result.Impl(), "BN_new() failed"); - Y_ENSURE(BN_set_word(result.Impl(), value) == 1, "BN_set_word() failed"); - - return result; -} - -TBigInteger TBigInteger::FromRegion(const void* ptr, size_t len) { - auto result = BN_bin2bn((ui8*)(ptr), len, nullptr); - - Y_ENSURE(result, "BN_bin2bn() failed"); - - return result; -} - -int TBigInteger::Compare(const TBigInteger& a, const TBigInteger& b) noexcept { - return BN_cmp(a.Impl(), b.Impl()); -} - -size_t TBigInteger::NumBytes() const noexcept { - return BN_num_bytes(Impl_); -} - -size_t TBigInteger::ToRegion(void* to) const noexcept { - const auto ret = BN_bn2bin(Impl_, (unsigned char*)to); - - Y_VERIFY(ret >= 0, "it happens"); - - return ret; -} - -TString TBigInteger::ToDecimalString() const { - auto res = BN_bn2dec(Impl_); - - Y_DEFER { - OPENSSL_free(res); - }; - - return res; -} - -template <> -void Out<TBigInteger>(IOutputStream& out, const TBigInteger& bi) { - out << bi.ToDecimalString(); -} diff --git a/library/cpp/openssl/big_integer/big_integer.h b/library/cpp/openssl/big_integer/big_integer.h deleted file mode 100644 index 07763c5e137..00000000000 --- a/library/cpp/openssl/big_integer/big_integer.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once - -#include <util/generic/ptr.h> -#include <util/generic/strbuf.h> -#include <util/generic/utility.h> -#include <util/generic/string.h> - -struct bignum_st; - -namespace NOpenSsl { - class TBigInteger { - inline TBigInteger(bignum_st* impl) noexcept - : Impl_(impl) - { - } - - static int Compare(const TBigInteger& a, const TBigInteger& b) noexcept; - - public: - inline TBigInteger(TBigInteger&& other) noexcept { - Swap(other); - } - - ~TBigInteger() noexcept; - - static TBigInteger FromULong(ui64 value); - static TBigInteger FromRegion(const void* ptr, size_t len); - - inline const bignum_st* Impl() const noexcept { - return Impl_; - } - - inline bignum_st* Impl() noexcept { - return Impl_; - } - - inline void Swap(TBigInteger& other) noexcept { - DoSwap(Impl_, other.Impl_); - } - - inline friend bool operator==(const TBigInteger& a, const TBigInteger& b) noexcept { - return Compare(a, b) == 0; - } - - inline friend bool operator!=(const TBigInteger& a, const TBigInteger& b) noexcept { - return !(a == b); - } - - size_t NumBytes() const noexcept; - size_t ToRegion(void* to) const noexcept; - - TString ToDecimalString() const; - - private: - bignum_st* Impl_ = nullptr; - }; -} diff --git a/library/cpp/openssl/crypto/rsa.cpp b/library/cpp/openssl/crypto/rsa.cpp deleted file mode 100644 index 4b1d6648268..00000000000 --- a/library/cpp/openssl/crypto/rsa.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "rsa.h" - -#include <library/cpp/openssl/big_integer/big_integer.h> -#include <library/cpp/openssl/init/init.h> - -#include <util/generic/yexception.h> -#include <util/generic/buffer.h> - -#include <openssl/bn.h> -#include <openssl/rsa.h> - -using namespace NOpenSsl; -using namespace NOpenSsl::NRsa; - -namespace { - struct TInit { - inline TInit() { - InitOpenSSL(); - } - } INIT; -} - -TPublicKey::TPublicKey(const TBigInteger& e, const TBigInteger& n) - : Key_(RSA_new()) -{ - Y_ENSURE(Key_, "RSA_new() failed"); - - RSA_set0_key(Key_, BN_dup(n.Impl()), BN_dup(e.Impl()), nullptr); -} - -TPublicKey::~TPublicKey() noexcept { - RSA_free(Key_); -} - -size_t TPublicKey::OutputLength() const noexcept { - return RSA_size(Key_); -} - -size_t TPublicKey::EncryptNoPad(void* dst, const void* src, size_t size) const { - auto len = RSA_public_encrypt(size, (const ui8*)src, (ui8*)dst, Key_, RSA_NO_PADDING); - - Y_ENSURE(len >= 0, "RSA_public_encrypt() failed"); - - return len; -} - -TBigInteger TPublicKey::EncryptNoPad(const TBigInteger& src) const { - const auto len1 = OutputLength(); - const auto len2 = src.NumBytes(); - TBuffer buf(len1 + len2); - - char* buf1 = (char*)buf.Data(); - char* buf2 = buf1 + len1; - - return TBigInteger::FromRegion(buf1, EncryptNoPad(buf1, buf2, src.ToRegion(buf2))); -} diff --git a/library/cpp/openssl/crypto/rsa.h b/library/cpp/openssl/crypto/rsa.h deleted file mode 100644 index 3bf9e4a233c..00000000000 --- a/library/cpp/openssl/crypto/rsa.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include <util/generic/utility.h> -#include <util/generic/noncopyable.h> - -struct rsa_st; - -namespace NOpenSsl { - class TBigInteger; - - namespace NRsa { - class TPublicKey: public TNonCopyable { - public: - inline TPublicKey(TPublicKey&& other) noexcept { - Swap(other); - } - - TPublicKey(const TBigInteger& e, const TBigInteger& n); - ~TPublicKey() noexcept; - - size_t OutputLength() const noexcept; - - TBigInteger EncryptNoPad(const TBigInteger& src) const; - size_t EncryptNoPad(void* dst, const void* src, size_t size) const; - - inline void Swap(TPublicKey& other) noexcept { - DoSwap(Key_, other.Key_); - } - - private: - rsa_st* Key_ = nullptr; - }; - }; -} diff --git a/library/cpp/openssl/crypto/sha.cpp b/library/cpp/openssl/crypto/sha.cpp deleted file mode 100644 index c142b6635e1..00000000000 --- a/library/cpp/openssl/crypto/sha.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include "sha.h" - -#include <util/generic/yexception.h> - -#include <openssl/sha.h> - -namespace NOpenSsl { - namespace NSha1 { - static_assert(DIGEST_LENGTH == SHA_DIGEST_LENGTH); - - TDigest Calc(const void* data, size_t dataSize) { - TDigest digest; - Y_ENSURE(SHA1(static_cast<const ui8*>(data), dataSize, digest.data()) != nullptr); - return digest; - } - - TCalcer::TCalcer() - : Context{new SHAstate_st} { - Y_ENSURE(SHA1_Init(Context.Get()) == 1); - } - - TCalcer::~TCalcer() { - } - - void TCalcer::Update(const void* data, size_t dataSize) { - Y_ENSURE(SHA1_Update(Context.Get(), data, dataSize) == 1); - } - - TDigest TCalcer::Final() { - TDigest digest; - Y_ENSURE(SHA1_Final(digest.data(), Context.Get()) == 1); - return digest; - } - } - namespace NSha256 { - static_assert(DIGEST_LENGTH == SHA256_DIGEST_LENGTH); - - TDigest Calc(const void* data, size_t dataSize) { - TDigest digest; - Y_ENSURE(SHA256(static_cast<const ui8*>(data), dataSize, digest.data()) != nullptr); - return digest; - } - - TCalcer::TCalcer() - : Context{new SHA256state_st} { - Y_ENSURE(SHA256_Init(Context.Get()) == 1); - } - - TCalcer::~TCalcer() { - } - - void TCalcer::Update(const void* data, size_t dataSize) { - Y_ENSURE(SHA256_Update(Context.Get(), data, dataSize) == 1); - } - - TDigest TCalcer::Final() { - TDigest digest; - Y_ENSURE(SHA256_Final(digest.data(), Context.Get()) == 1); - return digest; - } - } -} diff --git a/library/cpp/openssl/crypto/sha.h b/library/cpp/openssl/crypto/sha.h deleted file mode 100644 index dbc2dfa526d..00000000000 --- a/library/cpp/openssl/crypto/sha.h +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once - -#include <util/generic/ptr.h> -#include <util/generic/strbuf.h> -#include <util/system/types.h> - -#include <array> - -struct SHAstate_st; -struct SHA256state_st; - -namespace NOpenSsl::NSha1 { - constexpr size_t DIGEST_LENGTH = 20; - using TDigest = std::array<ui8, DIGEST_LENGTH>; - - // not fragmented input - TDigest Calc(const void* data, size_t dataSize); - - inline TDigest Calc(TStringBuf s) { - return Calc(s.data(), s.length()); - } - - // fragmented input - class TCalcer { - public: - TCalcer(); - ~TCalcer(); - void Update(const void* data, size_t dataSize); - - void Update(TStringBuf s) { - Update(s.data(), s.length()); - } - - template <typename T> - void UpdateWithPodValue(const T& value) { - Update(&value, sizeof(value)); - } - - TDigest Final(); - - private: - THolder<SHAstate_st> Context; - }; -} - -namespace NOpenSsl::NSha256 { - constexpr size_t DIGEST_LENGTH = 32; - using TDigest = std::array<ui8, DIGEST_LENGTH>; - - // not fragmented input - TDigest Calc(const void* data, size_t dataSize); - - inline TDigest Calc(TStringBuf s) { - return Calc(s.data(), s.length()); - } - - // fragmented input - class TCalcer { - public: - TCalcer(); - ~TCalcer(); - void Update(const void* data, size_t dataSize); - - void Update(TStringBuf s) { - Update(s.data(), s.length()); - } - - template <typename T> - void UpdateWithPodValue(const T& value) { - Update(&value, sizeof(value)); - } - - TDigest Final(); - - private: - THolder<SHA256state_st> Context; - }; -} diff --git a/library/cpp/pybind/ptr.h b/library/cpp/pybind/ptr.h deleted file mode 100644 index e1367366904..00000000000 --- a/library/cpp/pybind/ptr.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#define PY_SSIZE_T_CLEAN -#include <Python.h> -#include <util/generic/ptr.h> - -namespace NPyBind { - template <class T> - class TPythonIntrusivePtrOps { - public: - static inline void Ref(T* t) noexcept { - Py_XINCREF(t); - } - - static inline void UnRef(T* t) noexcept { - Py_XDECREF(t); - } - - static inline void DecRef(T* t) noexcept { - Py_XDECREF(t); - } - }; - - class TPyObjectPtr: public TIntrusivePtr<PyObject, TPythonIntrusivePtrOps<PyObject>> { - private: - typedef TIntrusivePtr<PyObject, TPythonIntrusivePtrOps<PyObject>> TParent; - typedef TPythonIntrusivePtrOps<PyObject> TOps; - - public: - inline TPyObjectPtr() noexcept { - } - - inline explicit TPyObjectPtr(PyObject* obj) noexcept - : TParent(obj) - { - } - - inline TPyObjectPtr(PyObject* obj, bool unref) noexcept - : TParent(obj) - { - if (unref) - TOps::UnRef(TParent::Get()); - } - - inline PyObject* RefGet() { - TOps::Ref(TParent::Get()); - return TParent::Get(); - } - }; - -} diff --git a/library/cpp/regex/glob/glob.cpp b/library/cpp/regex/glob/glob.cpp deleted file mode 100644 index 9da058122a7..00000000000 --- a/library/cpp/regex/glob/glob.cpp +++ /dev/null @@ -1,921 +0,0 @@ -#define FROM_IMPLEMENTATION -#include "glob_compat.h" - -#if defined(USE_INTERNAL_GLOB) -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Guido van Rossum. - * - * 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. - * 2. 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University 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 REGENTS 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. - */ - -#include <library/cpp/charset/ci_string.h> -#include <util/system/compat.h> -#include <util/folder/dirut.h> - -/* - * glob(3) -- a superset of the one defined in POSIX 1003.2. - * - * The [!...] convention to negate a range is supported (SysV, Posix, ksh). - * - * Optional extra services, controlled by flags not defined by POSIX: - * - * GLOB_QUOTE: - * Escaping convention: \ inhibits any special meaning the following - * character might have (except \ at end of string is retained). - * GLOB_MAGCHAR: - * Set in gl_flags if pattern contained a globbing character. - * GLOB_NOMAGIC: - * Same as GLOB_NOCHECK, but it will only append pattern if it did - * not contain any magic characters. [Used in csh style globbing] - * GLOB_ALTDIRFUNC: - * Use alternately specified directory access functions. - * GLOB_TILDE: - * expand ~user/foo to the /home/dir/of/user/foo - * GLOB_BRACE: - * expand {1,2}{a,b} to 1a 1b 2a 2b - * gl_matchc: - * Number of matches in the current invocation of glob. - */ - -/* - * Some notes on multibyte character support: - * 1. Patterns with illegal byte sequences match nothing - even if - * GLOB_NOCHECK is specified. - * 2. Illegal byte sequences in filenames are handled by treating them as - * single-byte characters with a value of the first byte of the sequence - * cast to wchar_t. - * 3. State-dependent encodings are not currently supported. - */ - -//#include <sys/param.h> -#include <sys/stat.h> - -#include <ctype.h> -//#include <dirent.h> -#include <errno.h> -#include <limits.h> -//#include <pwd.h> -//#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#if defined(_unix_) -#include <unistd.h> -#endif -#include <wchar.h> - -#if !defined(_unix_) -// silly replacement for compilation -using uint_fast64_t = ui64; -using u_int = unsigned int; -using u_char = unsigned char; -#define ARG_MAX 256 -#define S_ISDIR(x) ((x) & _S_IFDIR) -#define S_ISLNK(x) 0 -#define lstat stat -inline bool issetugid() { return false; } -inline char *getlogin() { return 0; } -inline int getuid() { return 0; } -struct passwd { - char *pw_dir; -}; -inline passwd *getpwuid(int) { return 0; } -inline passwd *getpwnam(char *) { return 0; } -#endif - -#define __collate_load_error 1 -inline int __collate_range_cmp(int, int) { return 0; } -#undef COMMA // was defined in stroka.h -// end silly replacement - -//#include "collate.h" - -#define DOLLAR '$' -#define DOT '.' -#define EOS '\0' -#define LBRACKET '[' -#define NOT '!' -#define QUESTION '?' -#define QUOTE '\\' -#define RANGE '-' -#define RBRACKET ']' -#define SEP '/' -#define STAR '*' -#define TILDE '~' -#define UNDERSCORE '_' -#define LBRACE '{' -#define RBRACE '}' -#define SLASH '/' -#define COMMA ',' - -#ifndef DEBUG - -#define M_QUOTE 0x8000000000ULL -#define M_PROTECT 0x4000000000ULL -#define M_MASK 0xffffffffffULL -#define M_CHAR 0x00ffffffffULL - -using Char = uint_fast64_t; - -#else - -#define M_QUOTE 0x80 -#define M_PROTECT 0x40 -#define M_MASK 0xff -#define M_CHAR 0x7f - -using Char = char; - -#endif - - -#define CHAR(c) ((Char)((c)&M_CHAR)) -#define META(c) ((Char)((c)|M_QUOTE)) -#define M_ALL META('*') -#define M_END META(']') -#define M_NOT META('!') -#define M_ONE META('?') -#define M_RNG META('-') -#define M_SET META('[') -#define ismeta(c) (((c)&M_QUOTE) != 0) - - -static int compare(const void *, const void *); -static int g_Ctoc(const Char *, char *, u_int); -static int g_lstat(Char *, struct stat *, glob_t *); -static DIR *g_opendir(Char *, glob_t *); -static Char *g_strchr(Char *, wchar_t); -#ifdef notdef -static Char *g_strcat(Char *, const Char *); -#endif -static int glob0(const Char *, glob_t *, int *); -static int glob1(Char *, glob_t *, int *); -static int glob2(Char *, Char *, Char *, Char *, glob_t *, int *); -static int glob3(Char *, Char *, Char *, Char *, Char *, glob_t *, int *); -static int globextend(const Char *, glob_t *, int *); -static const Char * - globtilde(const Char *, Char *, size_t, glob_t *); -static int globexp1(const Char *, glob_t *, int *); -static int globexp2(const Char *, const Char *, glob_t *, int *, int *); -static int match(Char *, Char *, Char *); -#ifdef DEBUG -static void qprintf(const char *, Char *); -#endif - -int -glob(const char *pattern, int flags, int (*errfunc)(const char *, int), glob_t *pglob) -{ - const u_char *patnext; - int limit; - Char *bufnext, *bufend, patbuf[MAXPATHLEN], prot; - mbstate_t mbs; - wchar_t wc; - size_t clen; - - patnext = (u_char *) pattern; - if (!(flags & GLOB_APPEND)) { - pglob->gl_pathc = 0; - pglob->gl_pathv = NULL; - if (!(flags & GLOB_DOOFFS)) - pglob->gl_offs = 0; - } - if (flags & GLOB_LIMIT) { - limit = pglob->gl_matchc; - if (limit == 0) - limit = ARG_MAX; - } else - limit = 0; - pglob->gl_flags = flags & ~GLOB_MAGCHAR; - pglob->gl_errfunc = errfunc; - pglob->gl_matchc = 0; - - bufnext = patbuf; - bufend = bufnext + MAXPATHLEN - 1; - if (flags & GLOB_NOESCAPE) { - memset(&mbs, 0, sizeof(mbs)); - while (bufend - bufnext >= MB_CUR_MAX) { - clen = mbrtowc(&wc, (const char*)patnext, MB_LEN_MAX, &mbs); - if (clen == (size_t)-1 || clen == (size_t)-2) - return (GLOB_NOMATCH); - else if (clen == 0) - break; - *bufnext++ = wc; - patnext += clen; - } - } else { - /* Protect the quoted characters. */ - memset(&mbs, 0, sizeof(mbs)); - while (bufend - bufnext >= MB_CUR_MAX) { - if (*patnext == QUOTE) { - if (*++patnext == EOS) { - *bufnext++ = QUOTE | M_PROTECT; - continue; - } - prot = M_PROTECT; - } else - prot = 0; - clen = mbrtowc(&wc, (const char*)patnext, MB_LEN_MAX, &mbs); - if (clen == (size_t)-1 || clen == (size_t)-2) - return (GLOB_NOMATCH); - else if (clen == 0) - break; - *bufnext++ = wc | prot; - patnext += clen; - } - } - *bufnext = EOS; - - if (flags & GLOB_BRACE) - return globexp1(patbuf, pglob, &limit); - else - return glob0(patbuf, pglob, &limit); -} - -/* - * Expand recursively a glob {} pattern. When there is no more expansion - * invoke the standard globbing routine to glob the rest of the magic - * characters - */ -static int -globexp1(const Char *pattern, glob_t *pglob, int *limit) -{ - const Char* ptr = pattern; - int rv; - - /* Protect a single {}, for find(1), like csh */ - if (pattern[0] == LBRACE && pattern[1] == RBRACE && pattern[2] == EOS) - return glob0(pattern, pglob, limit); - - while ((ptr = (const Char *) g_strchr((Char *) ptr, LBRACE)) != NULL) - if (!globexp2(ptr, pattern, pglob, &rv, limit)) - return rv; - - return glob0(pattern, pglob, limit); -} - - -/* - * Recursive brace globbing helper. Tries to expand a single brace. - * If it succeeds then it invokes globexp1 with the new pattern. - * If it fails then it tries to glob the rest of the pattern and returns. - */ -static int -globexp2(const Char *ptr, const Char *pattern, glob_t *pglob, int *rv, int *limit) -{ - int i; - Char *lm, *ls; - const Char *pe, *pm, *pm1, *pl; - Char patbuf[MAXPATHLEN]; - - /* copy part up to the brace */ - for (lm = patbuf, pm = pattern; pm != ptr; *lm++ = *pm++) - continue; - *lm = EOS; - ls = lm; - - /* Find the balanced brace */ - for (i = 0, pe = ++ptr; *pe; pe++) - if (*pe == LBRACKET) { - /* Ignore everything between [] */ - for (pm = pe++; *pe != RBRACKET && *pe != EOS; pe++) - continue; - if (*pe == EOS) { - /* - * We could not find a matching RBRACKET. - * Ignore and just look for RBRACE - */ - pe = pm; - } - } - else if (*pe == LBRACE) - i++; - else if (*pe == RBRACE) { - if (i == 0) - break; - i--; - } - - /* Non matching braces; just glob the pattern */ - if (i != 0 || *pe == EOS) { - *rv = glob0(patbuf, pglob, limit); - return 0; - } - - for (i = 0, pl = pm = ptr; pm <= pe; pm++) - switch (*pm) { - case LBRACKET: - /* Ignore everything between [] */ - for (pm1 = pm++; *pm != RBRACKET && *pm != EOS; pm++) - continue; - if (*pm == EOS) { - /* - * We could not find a matching RBRACKET. - * Ignore and just look for RBRACE - */ - pm = pm1; - } - break; - - case LBRACE: - i++; - break; - - case RBRACE: - if (i) { - i--; - break; - } - [[fallthrough]]; - case COMMA: - if (i && *pm == COMMA) - break; - else { - /* Append the current string */ - for (lm = ls; (pl < pm); *lm++ = *pl++) - continue; - /* - * Append the rest of the pattern after the - * closing brace - */ - for (pl = pe + 1; (*lm++ = *pl++) != EOS;) - continue; - - /* Expand the current pattern */ -#ifdef DEBUG - qprintf("globexp2:", patbuf); -#endif - *rv = globexp1(patbuf, pglob, limit); - - /* move after the comma, to the next string */ - pl = pm + 1; - } - break; - - default: - break; - } - *rv = 0; - return 0; -} - - - -/* - * expand tilde from the passwd file. - */ -static const Char * -globtilde(const Char *pattern, Char *patbuf, size_t patbuf_len, glob_t *pglob) -{ - struct passwd *pwd; - char *h; - const Char *p; - Char *b, *eb; - - if (*pattern != TILDE || !(pglob->gl_flags & GLOB_TILDE)) - return pattern; - - /* - * Copy up to the end of the string or / - */ - eb = &patbuf[patbuf_len - 1]; - for (p = pattern + 1, h = (char *) patbuf; - h < (char *)eb && *p && *p != SLASH; *h++ = (char)*p++) - continue; - - *h = EOS; - - if (((char *) patbuf)[0] == EOS) { - /* - * handle a plain ~ or ~/ by expanding $HOME first (iff - * we're not running setuid or setgid) and then trying - * the password file - */ - if (issetugid() != 0 || - (h = ::getenv("HOME")) == NULL) { - if (((h = getlogin()) != NULL && - (pwd = getpwnam(h)) != NULL) || - (pwd = getpwuid(getuid())) != NULL) - h = pwd->pw_dir; - else - return pattern; - } - } - else { - /* - * Expand a ~user - */ - if ((pwd = getpwnam((char*) patbuf)) == NULL) - return pattern; - else - h = pwd->pw_dir; - } - - /* Copy the home directory */ - for (b = patbuf; b < eb && *h; *b++ = *h++) - continue; - - /* Append the rest of the pattern */ - while (b < eb && (*b++ = *p++) != EOS) - continue; - *b = EOS; - - return patbuf; -} - - -/* - * The main glob() routine: compiles the pattern (optionally processing - * quotes), calls glob1() to do the real pattern matching, and finally - * sorts the list (unless unsorted operation is requested). Returns 0 - * if things went well, nonzero if errors occurred. - */ -static int -glob0(const Char *pattern, glob_t *pglob, int *limit) -{ - const Char *qpatnext; - int c, err, oldpathc; - Char *bufnext, patbuf[MAXPATHLEN]; - - qpatnext = globtilde(pattern, patbuf, MAXPATHLEN, pglob); - oldpathc = pglob->gl_pathc; - bufnext = patbuf; - - /* We don't need to check for buffer overflow any more. */ - while ((c = (char)*qpatnext++) != EOS) { - switch (c) { - case LBRACKET: - c = (char)*qpatnext; - if (c == NOT) - ++qpatnext; - if (*qpatnext == EOS || - g_strchr((Char *) qpatnext+1, RBRACKET) == NULL) { - *bufnext++ = LBRACKET; - if (c == NOT) - --qpatnext; - break; - } - *bufnext++ = M_SET; - if (c == NOT) - *bufnext++ = M_NOT; - c = (char)*qpatnext++; - do { - *bufnext++ = CHAR(c); - if (*qpatnext == RANGE && - (c = (char)qpatnext[1]) != RBRACKET) { - *bufnext++ = M_RNG; - *bufnext++ = CHAR(c); - qpatnext += 2; - } - } while ((c = (char)*qpatnext++) != RBRACKET); - pglob->gl_flags |= GLOB_MAGCHAR; - *bufnext++ = M_END; - break; - case QUESTION: - pglob->gl_flags |= GLOB_MAGCHAR; - *bufnext++ = M_ONE; - break; - case STAR: - pglob->gl_flags |= GLOB_MAGCHAR; - /* collapse adjacent stars to one, - * to avoid exponential behavior - */ - if (bufnext == patbuf || bufnext[-1] != M_ALL) - *bufnext++ = M_ALL; - break; - default: - *bufnext++ = CHAR(c); - break; - } - } - *bufnext = EOS; -#ifdef DEBUG - qprintf("glob0:", patbuf); -#endif - - if ((err = glob1(patbuf, pglob, limit)) != 0) - return(err); - - /* - * If there was no match we are going to append the pattern - * if GLOB_NOCHECK was specified or if GLOB_NOMAGIC was specified - * and the pattern did not contain any magic characters - * GLOB_NOMAGIC is there just for compatibility with csh. - */ - if (pglob->gl_pathc == oldpathc) { - if (((pglob->gl_flags & GLOB_NOCHECK) || - ((pglob->gl_flags & GLOB_NOMAGIC) && - !(pglob->gl_flags & GLOB_MAGCHAR)))) - return(globextend(pattern, pglob, limit)); - else - return(GLOB_NOMATCH); - } - if (!(pglob->gl_flags & GLOB_NOSORT)) - qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc, - pglob->gl_pathc - oldpathc, sizeof(char *), compare); - return(0); -} - -static int -compare(const void *p, const void *q) -{ - return(strcmp(*(char **)p, *(char **)q)); -} - -static int -glob1(Char *pattern, glob_t *pglob, int *limit) -{ - Char pathbuf[MAXPATHLEN]; - - /* A null pathname is invalid -- POSIX 1003.1 sect. 2.4. */ - if (*pattern == EOS) - return(0); - return(glob2(pathbuf, pathbuf, pathbuf + MAXPATHLEN - 1, - pattern, pglob, limit)); -} - -/* - * The functions glob2 and glob3 are mutually recursive; there is one level - * of recursion for each segment in the pattern that contains one or more - * meta characters. - */ -static int -glob2(Char *pathbuf, Char *pathend, Char *pathend_last, Char *pattern, glob_t *pglob, int *limit) -{ - struct stat sb; - Char *p, *q; - int anymeta; - - /* - * Loop over pattern segments until end of pattern or until - * segment with meta character found. - */ - for (anymeta = 0;;) { - if (*pattern == EOS) { /* End of pattern? */ - *pathend = EOS; - if (g_lstat(pathbuf, &sb, pglob)) - return(0); - - if (((pglob->gl_flags & GLOB_MARK) && - pathend[-1] != SEP) && (S_ISDIR(sb.st_mode))) { - if (pathend + 1 > pathend_last) - return (GLOB_ABORTED); - *pathend++ = SEP; - *pathend = EOS; - } - ++pglob->gl_matchc; - return(globextend(pathbuf, pglob, limit)); - } - - /* Find end of next segment, copy tentatively to pathend. */ - q = pathend; - p = pattern; - while (*p != EOS && *p != SEP) { - if (ismeta(*p)) - anymeta = 1; - if (q + 1 > pathend_last) - return (GLOB_ABORTED); - *q++ = *p++; - } - - if (!anymeta) { /* No expansion, do next segment. */ - pathend = q; - pattern = p; - while (*pattern == SEP) { - if (pathend + 1 > pathend_last) - return (GLOB_ABORTED); - *pathend++ = *pattern++; - } - } else /* Need expansion, recurse. */ - return(glob3(pathbuf, pathend, pathend_last, pattern, p, - pglob, limit)); - } - /* NOTREACHED */ -} - -static int -glob3(Char *pathbuf, Char *pathend, Char *pathend_last, Char *pattern, Char *restpattern, glob_t *pglob, int *limit) -{ - struct dirent *dp; - DIR *dirp; - int err; - char buf[MAXPATHLEN]; - - /* - * The readdirfunc declaration can't be prototyped, because it is - * assigned, below, to two functions which are prototyped in glob.h - * and dirent.h as taking pointers to differently typed opaque - * structures. - */ - typedef struct dirent *(*readdirfunc_t)(void*); - readdirfunc_t readdirfunc; - - if (pathend > pathend_last) - return (GLOB_ABORTED); - *pathend = EOS; - errno = 0; - - if ((dirp = g_opendir(pathbuf, pglob)) == NULL) { - /* TODO: don't call for ENOENT or ENOTDIR? */ - if (pglob->gl_errfunc) { - if (g_Ctoc(pathbuf, buf, sizeof(buf))) - return (GLOB_ABORTED); - if (pglob->gl_errfunc(buf, errno) || - pglob->gl_flags & GLOB_ERR) - return (GLOB_ABORTED); - } - return(0); - } - - err = 0; - - /* Search directory for matching names. */ - if (pglob->gl_flags & GLOB_ALTDIRFUNC) - readdirfunc = pglob->gl_readdir; - else - readdirfunc = (readdirfunc_t)readdir; - while ((dp = (*readdirfunc)(dirp))) { - u_char *sc; - Char *dc; - wchar_t wc; - size_t clen; - mbstate_t mbs; - - /* Initial DOT must be matched literally. */ - if (dp->d_name[0] == DOT && *pattern != DOT) - continue; - memset(&mbs, 0, sizeof(mbs)); - dc = pathend; - sc = (u_char *) dp->d_name; - while (dc < pathend_last) { - clen = mbrtowc(&wc, (const char*)sc, MB_LEN_MAX, &mbs); - if (clen == (size_t)-1 || clen == (size_t)-2) { - wc = *sc; - clen = 1; - memset(&mbs, 0, sizeof(mbs)); - } - if ((*dc++ = wc) == EOS) - break; - sc += clen; - } - if (!match(pathend, pattern, restpattern)) { - *pathend = EOS; - continue; - } - err = glob2(pathbuf, --dc, pathend_last, restpattern, - pglob, limit); - if (err) - break; - } - - if (pglob->gl_flags & GLOB_ALTDIRFUNC) - (*pglob->gl_closedir)(dirp); - else - closedir(dirp); - return(err); -} - - -/* - * Extend the gl_pathv member of a glob_t structure to accomodate a new item, - * add the new item, and update gl_pathc. - * - * This assumes the BSD realloc, which only copies the block when its size - * crosses a power-of-two boundary; for v7 realloc, this would cause quadratic - * behavior. - * - * Return 0 if new item added, error code if memory couldn't be allocated. - * - * Invariant of the glob_t structure: - * Either gl_pathc is zero and gl_pathv is NULL; or gl_pathc > 0 and - * gl_pathv points to (gl_offs + gl_pathc + 1) items. - */ -static int -globextend(const Char *path, glob_t *pglob, int *limit) -{ - char **pathv; - int i; - size_t newsize, len; - char *copy; - const Char *p; - - if (*limit && pglob->gl_pathc > *limit) { - errno = 0; - return (GLOB_NOSPACE); - } - - newsize = sizeof(*pathv) * (2 + pglob->gl_pathc + pglob->gl_offs); - pathv = pglob->gl_pathv ? - (char**)realloc((char *)pglob->gl_pathv, newsize) : - (char**)malloc(newsize); - if (pathv == NULL) { - if (pglob->gl_pathv) { - free(pglob->gl_pathv); - pglob->gl_pathv = NULL; - } - return(GLOB_NOSPACE); - } - - if (pglob->gl_pathv == NULL && pglob->gl_offs > 0) { - /* first time around -- clear initial gl_offs items */ - pathv += pglob->gl_offs; - for (i = pglob->gl_offs; --i >= 0; ) - *--pathv = NULL; - } - pglob->gl_pathv = pathv; - - for (p = path; *p++;) - continue; - len = MB_CUR_MAX * (size_t)(p - path); /* XXX overallocation */ - if ((copy = (char*)malloc(len)) != NULL) { - if (g_Ctoc(path, copy, (u_int)len)) { - free(copy); - return (GLOB_NOSPACE); - } - pathv[pglob->gl_offs + pglob->gl_pathc++] = copy; - } - pathv[pglob->gl_offs + pglob->gl_pathc] = NULL; - return(copy == NULL ? GLOB_NOSPACE : 0); -} - -/* - * pattern matching function for filenames. Each occurrence of the * - * pattern causes a recursion level. - */ -static int -match(Char *name, Char *pat, Char *patend) -{ - int ok, negate_range; - Char c, k; - - while (pat < patend) { - c = *pat++; - switch (c & M_MASK) { - case M_ALL: - if (pat == patend) - return(1); - do - if (match(name, pat, patend)) - return(1); - while (*name++ != EOS); - return(0); - case M_ONE: - if (*name++ == EOS) - return(0); - break; - case M_SET: - ok = 0; - if ((k = *name++) == EOS) - return(0); - if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS) - ++pat; - while (((c = *pat++) & M_MASK) != M_END) - if ((*pat & M_MASK) == M_RNG) { - if (__collate_load_error ? - CHAR(c) <= CHAR(k) && CHAR(k) <= CHAR(pat[1]) : - __collate_range_cmp((int)CHAR(c), (int)CHAR(k)) <= 0 - && __collate_range_cmp((int)CHAR(k), (int)CHAR(pat[1])) <= 0 - ) - ok = 1; - pat += 2; - } else if (c == k) - ok = 1; - if (ok == negate_range) - return(0); - break; - default: - if (*name++ != c) - return(0); - break; - } - } - return(*name == EOS); -} - -/* Free allocated data belonging to a glob_t structure. */ -void -globfree(glob_t *pglob) -{ - int i; - char **pp; - - if (pglob->gl_pathv != NULL) { - pp = pglob->gl_pathv + pglob->gl_offs; - for (i = pglob->gl_pathc; i--; ++pp) - if (*pp) - free(*pp); - free(pglob->gl_pathv); - pglob->gl_pathv = NULL; - } -} - -static DIR * -g_opendir(Char *str, glob_t *pglob) -{ - char buf[MAXPATHLEN]; - - if (!*str) - strcpy(buf, "."); - else { - if (g_Ctoc(str, buf, sizeof(buf))) - return (NULL); - } - - if (pglob->gl_flags & GLOB_ALTDIRFUNC) - return (DIR*)((*pglob->gl_opendir)(buf)); - - return(opendir(buf)); -} - -static int -g_lstat(Char *fn, struct stat *sb, glob_t *pglob) -{ - char buf[MAXPATHLEN]; - - if (g_Ctoc(fn, buf, sizeof(buf))) { - errno = ENAMETOOLONG; - return (-1); - } - if (pglob->gl_flags & GLOB_ALTDIRFUNC) - return((*pglob->gl_lstat)(buf, sb)); - return(lstat(buf, sb)); -} - -static Char * -g_strchr(Char *str, wchar_t ch) -{ - do { - if (*str == ch) - return (str); - } while (*str++); - return (NULL); -} - -static int -g_Ctoc(const Char *str, char *buf, u_int len) -{ - mbstate_t mbs; - size_t clen; - - memset(&mbs, 0, sizeof(mbs)); - while ((int)len >= MB_CUR_MAX) { - clen = wcrtomb(buf, (wchar_t)*str, &mbs); - if (clen == (size_t)-1) - return (1); - if (*str == L'\0') - return (0); - str++; - buf += clen; - len -= (u_int)clen; - } - return (1); -} - -#ifdef DEBUG -static void -qprintf(const char *str, Char *s) -{ - Char *p; - - (void)printf("%s:\n", str); - for (p = s; *p; p++) - (void)printf("%c", CHAR(*p)); - (void)printf("\n"); - for (p = s; *p; p++) - (void)printf("%c", *p & M_PROTECT ? '"' : ' '); - (void)printf("\n"); - for (p = s; *p; p++) - (void)printf("%c", ismeta(*p) ? '_' : ' '); - (void)printf("\n"); -} -#endif -#endif diff --git a/library/cpp/regex/glob/glob_compat.h b/library/cpp/regex/glob/glob_compat.h deleted file mode 100644 index 0dc518d51bd..00000000000 --- a/library/cpp/regex/glob/glob_compat.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once - -#include <util/system/defaults.h> - -#if defined(_MSC_VER) || defined(_bionic_) -#define USE_INTERNAL_GLOB -#endif - -#if !defined(USE_INTERNAL_GLOB) -#include <glob.h> -#else - -struct stat; -typedef struct { - int gl_pathc; /* Count of total paths so far. */ - int gl_matchc; /* Count of paths matching pattern. */ - int gl_offs; /* Reserved at beginning of gl_pathv. */ - int gl_flags; /* Copy of flags parameter to glob. */ - char** gl_pathv; /* List of paths matching pattern. */ - /* Copy of errfunc parameter to glob. */ - int (*gl_errfunc)(const char*, int); - - /* - * Alternate filesystem access methods for glob; replacement - * versions of closedir(3), readdir(3), opendir(3), stat(2) - * and lstat(2). - */ - void (*gl_closedir)(void*); - struct dirent* (*gl_readdir)(void*); - void* (*gl_opendir)(const char*); - int (*gl_lstat)(const char*, struct stat*); - int (*gl_stat)(const char*, struct stat*); -} glob_t; - -//#if __POSIX_VISIBLE >= 199209 -/* Believed to have been introduced in 1003.2-1992 */ -#define GLOB_APPEND 0x0001 /* Append to output from previous call. */ -#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */ -#define GLOB_ERR 0x0004 /* Return on error. */ -#define GLOB_MARK 0x0008 /* Append / to matching directories. */ -#define GLOB_NOCHECK 0x0010 /* Return pattern itself if nothing matches. */ -#define GLOB_NOSORT 0x0020 /* Don't sort. */ -#define GLOB_NOESCAPE 0x2000 /* Disable backslash escaping. */ - -/* Error values returned by glob(3) */ -#define GLOB_NOSPACE (-1) /* Malloc call failed. */ -#define GLOB_ABORTED (-2) /* Unignored error. */ -#define GLOB_NOMATCH (-3) /* No match and GLOB_NOCHECK was not set. */ -#define GLOB_NOSYS (-4) /* Obsolete: source comptability only. */ -//#endif /* __POSIX_VISIBLE >= 199209 */ - -//#if __BSD_VISIBLE -#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */ -#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */ -#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */ -#define GLOB_NOMAGIC 0x0200 /* GLOB_NOCHECK without magic chars (csh). */ -#define GLOB_QUOTE 0x0400 /* Quote special chars with \. */ -#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */ -#define GLOB_LIMIT 0x1000 /* limit number of returned paths */ - -/* source compatibility, these are the old names */ -#define GLOB_MAXPATH GLOB_LIMIT -#define GLOB_ABEND GLOB_ABORTED -//#endif /* __BSD_VISIBLE */ - -int glob(const char*, int, int (*)(const char*, int), glob_t*); -void globfree(glob_t*); - -#endif /* _MSC_VER */ - -#if !defined(FROM_IMPLEMENTATION) -#undef USE_INTERNAL_GLOB -#endif diff --git a/library/cpp/regex/glob/glob_iterator.cpp b/library/cpp/regex/glob/glob_iterator.cpp deleted file mode 100644 index 746b49f3975..00000000000 --- a/library/cpp/regex/glob/glob_iterator.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "glob_iterator.h" diff --git a/library/cpp/regex/glob/glob_iterator.h b/library/cpp/regex/glob/glob_iterator.h deleted file mode 100644 index e25481e594e..00000000000 --- a/library/cpp/regex/glob/glob_iterator.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "glob_compat.h" - -#include <util/generic/noncopyable.h> -#include <util/generic/string.h> -#include <util/generic/yexception.h> - -class TGlobPaths : TNonCopyable { -public: - TGlobPaths(const char* pattern) { - Impl.gl_pathc = 0; - int result = glob(pattern, 0, nullptr, &Impl); - Y_ENSURE(result == 0 || result == GLOB_NOMATCH, "glob failed"); - } - - TGlobPaths(const TString& pattern) - : TGlobPaths(pattern.data()) - { - } - - ~TGlobPaths() { - globfree(&Impl); - } - - const char** begin() { - return const_cast<const char**>(Impl.gl_pathv); - } - - const char** end() { - return const_cast<const char**>(Impl.gl_pathv + Impl.gl_pathc); - } - -private: - glob_t Impl; -}; diff --git a/library/cpp/robots_txt/constants.h b/library/cpp/robots_txt/constants.h deleted file mode 100644 index e5e2a57e189..00000000000 --- a/library/cpp/robots_txt/constants.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include <util/generic/size_literals.h> -#include <util/system/defaults.h> - - -constexpr auto robots_max = 500_KB; -constexpr auto max_rules_count = 10'000; -constexpr auto max_rule_length = 10_KB; diff --git a/library/cpp/robots_txt/prefix_tree.cpp b/library/cpp/robots_txt/prefix_tree.cpp deleted file mode 100644 index f7b1848a43c..00000000000 --- a/library/cpp/robots_txt/prefix_tree.cpp +++ /dev/null @@ -1,172 +0,0 @@ -#include <cstring> -#include <algorithm> - -#include "prefix_tree.h" - -TPrefixTreeNodeElement::TPrefixTreeNodeElement() - : Key(nullptr) - , KeyLen(0) - , Val(-1) - , Index(-1) -{ -} - -TPrefixTreeNodeElement::TPrefixTreeNodeElement(const char* key, i32 keyLen = 0, i32 val = -1, i32 index = -1) - : Key(key) - , KeyLen(keyLen) - , Val(val) - , Index(index) -{ -} - -TPrefixTreeNode::TPrefixTreeNode() - : Elements() -{ -} - -int TPrefixTreeNode::Find(char ch) const { - for (size_t i = 0; i < Elements.size(); ++i) - if (ch == *(Elements[i].Key)) - return i; - return -1; -} - -void TPrefixTreeNode::Set(const char* key, i32 keyLen, i32 val, i32 index) { - TPrefixTreeNodeElement element(key, keyLen, val, index); - int i = Find(*key); - if (i < 0) - Elements.push_back(element); - else - Elements[i] = element; -} - -void TPrefixTreeNode::Dump(FILE* logFile) const { - if (!logFile) - logFile = stderr; - fprintf(logFile, "size=%" PRISZT "\n", Elements.size()); - static char b[1234]; - for (size_t i = 0; i < Elements.size(); ++i) { - strncpy(b, Elements[i].Key, Elements[i].KeyLen); - b[Elements[i].KeyLen] = 0; - fprintf(logFile, "{key=[%s]:%d, val=%d, index=%d}\n", b, Elements[i].KeyLen, Elements[i].Val, Elements[i].Index); - } -} - -void TPrefixTree::Dump(FILE* logFile) const { - if (!logFile) - logFile = stderr; - fprintf(logFile, "%" PRISZT " nodes\n", Nodes.size()); - for (size_t i = 0; i < Nodes.size(); ++i) { - fprintf(logFile, "%" PRISZT ": ", i); - Nodes[i].Dump(logFile); - fprintf(logFile, "\n"); - } -} - -TPrefixTree::TPrefixTree(int maxSize) { - Init(maxSize); -} - -void TPrefixTree::Init(int maxSize) { - Nodes.clear(); - Nodes.reserve(std::max(maxSize + 1, 1)); - Nodes.push_back(TPrefixTreeNode()); -} - -void TPrefixTree::Clear() { - Nodes.clear(); - Init(0); -} - -void TPrefixTree::Add(const char* s, i32 index) { - AddInternal(s, Nodes[0], index); -} - -void TPrefixTree::AddInternal(const char* s, TPrefixTreeNode& node, i32 index) { - if (!s || !*s) - return; - - int i = node.Find(*s); - if (i >= 0) { - TPrefixTreeNodeElement& d = node.Elements[i]; - const char* p = d.Key; - while (*s && (p - d.Key) < d.KeyLen && *s == *p) - ++s, ++p; - - if (*s) { - if ((p - d.Key) < d.KeyLen) { - Nodes.push_back(TPrefixTreeNode()); - Nodes.back().Set(p, d.KeyLen - (p - d.Key), d.Val, d.Index); - Nodes.back().Set(s, strlen(s), -1, index); - - d.Val = Nodes.size() - 1; - d.KeyLen = p - d.Key; - d.Index = INDEX_BOUND; - } else { - if (d.Val != -1 && index < d.Index) - AddInternal(s, Nodes[d.Val], index); - } - } else { - if ((p - d.Key) < d.KeyLen) { - Nodes.push_back(TPrefixTreeNode()); - Nodes.back().Set(p, d.KeyLen - (p - d.Key), d.Val, d.Index); - d.Val = Nodes.size() - 1; - d.KeyLen = p - d.Key; - d.Index = index; - } else { - d.Index = std::min(d.Index, index); - } - } - } else { - node.Set(s, strlen(s), -1, index); - } -} - -int TPrefixTree::GetMemorySize() const { - int res = Nodes.capacity() * sizeof(TPrefixTreeNode); - for (size_t i = 0; i < Nodes.size(); ++i) - res += Nodes[i].Elements.capacity() * sizeof(TPrefixTreeNodeElement); - return res; -} - -void TPrefixTree::Compress() { - Nodes.shrink_to_fit(); - for (size_t i = 0; i < Nodes.size(); ++i) - Nodes[i].Elements.shrink_to_fit(); -} - -i32 TPrefixTree::MinPrefixIndex(const char* s) const { - if (!*s) - return -1; - int i = Nodes[0].Find(*s); - if (i < 0) - return -1; - const TPrefixTreeNodeElement* d = &Nodes[0].Elements[i]; - - const char* p = d->Key; - if (!p || !*p) - return -1; - - i32 result = INDEX_BOUND; - i32 nodeIndex = 0; - while (*s == *p) { - if (++p - d->Key >= d->KeyLen) - result = std::min(result, d->Index); - if (!*++s) - break; - - if (p - d->Key >= d->KeyLen) { - nodeIndex = d->Val; - if (nodeIndex == -1) - break; - i = Nodes[nodeIndex].Find(*s); - if (i < 0) - break; - d = &Nodes[nodeIndex].Elements[i]; - p = d->Key; - if (!p || !*p) - break; - } - } - return result < INDEX_BOUND ? result : -1; -} diff --git a/library/cpp/robots_txt/prefix_tree.h b/library/cpp/robots_txt/prefix_tree.h deleted file mode 100644 index 5feafcb74d1..00000000000 --- a/library/cpp/robots_txt/prefix_tree.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include <util/generic/ptr.h> -#include <util/generic/vector.h> -#include <cstdio> -#include <util/generic/noncopyable.h> - -struct TPrefixTreeNodeElement { - const char* Key; - i32 KeyLen; - i32 Val; - i32 Index; - - TPrefixTreeNodeElement(); - TPrefixTreeNodeElement(const char*, i32, i32, i32); -}; - -class TPrefixTreeNode { -public: - TVector<TPrefixTreeNodeElement> Elements; - TPrefixTreeNode(); - - int Find(char) const; - void Set(const char*, i32, i32, i32); - void Dump(FILE*) const; -}; - -class TPrefixTree : TNonCopyable { -private: - static const i32 INDEX_BOUND = 1 << 30; - - TVector<TPrefixTreeNode> Nodes; - -public: - void Init(int); - TPrefixTree(int); - - void Add(const char*, i32); - i32 MinPrefixIndex(const char*) const; - void Clear(); - void Dump(FILE*) const; - int GetMemorySize() const; - void Compress(); - -private: - void AddInternal(const char*, TPrefixTreeNode&, i32); -}; diff --git a/library/cpp/robots_txt/prefix_tree_rules_handler.cpp b/library/cpp/robots_txt/prefix_tree_rules_handler.cpp deleted file mode 100644 index 8dd579d060b..00000000000 --- a/library/cpp/robots_txt/prefix_tree_rules_handler.cpp +++ /dev/null @@ -1,706 +0,0 @@ -#include "robots_txt.h" - -#include <util/digest/fnv.h> -#include <util/system/tls.h> -#include <util/generic/buffer.h> -#include <util/generic/yexception.h> - -namespace { - -TString NormalizeRule(TStringBuf rule) { - TString result; - result.reserve(rule.size() + 1); - - // remove consecutive '*' - for (auto c : rule) { - if (c != '*' || !result.EndsWith('*')) { - result.append(c); - } - } - - if (rule == "*") { - result = "/*"; - return result; - } - - // unify suffix - if (result.EndsWith('$')) { - result.pop_back(); - } else if (!result.EndsWith('*')) { - result.append('*'); - } - - return result; -} - -// Prefix rules -bool IsPrefixRule(TStringBuf rule) { - return rule.EndsWith('*') && !TStringBuf(rule.begin(), rule.end() - 1).Contains('*'); -} - -// Converts rule to internal representation, i.e. -// For prefix rules: "/foo", 'D' -> 'D', "/foo" -// For generic rules: "/*foo", 'D' -> ("/*/*foo*", 'd') or ("/*foo$", 'A') -> ("/*foo", 'a') -// The distinction is in uppercase/lowercase rule type -std::pair<TString, char> ConvertRule(TStringBuf rule, char type) { - switch (type) { - case 'H': - case 'S': - case 'C': - case 'P': - return {TString(rule), type}; - case 'A': - case 'D': - break; - default: - return {{}, type}; - } - - auto result = NormalizeRule(rule); - if (IsPrefixRule(result)) { - result.pop_back(); // remove extra '*' from the end - } else { - type = tolower(type); - } - - return {std::move(result), type}; -} - -} // namespace - -TPrefixTreeRobotsTxtRulesHandler::TPrefixTreeRobotsTxtRulesHandler( - TBotIdSet supportedBotIds, - int robotsMaxSize, - int maxRulesNumber, - bool saveDataForAnyBot) - : TRobotsTxtRulesHandlerBase(supportedBotIds, robotsMaxSize, maxRulesNumber, saveDataForAnyBot) -{} - -TPrefixTreeRobotsTxtRulesHandler::TPrefixTreeRobotsTxtRulesHandler( - std::initializer_list<ui32> supportedBotIds, - int robotsMaxSize, - int maxRulesNumber, - bool saveDataForAnyBot) - : TRobotsTxtRulesHandlerBase(TBotIdSet(supportedBotIds), robotsMaxSize, maxRulesNumber, saveDataForAnyBot) -{} - -TPrefixTreeRobotsTxtRulesHandler::TPrefixTreeRobotsTxtRulesHandler( - const TSet<ui32>& supportedBotIds, - int robotsMaxSize, - int maxRulesNumber, - bool saveDataForAnyBot) - : TRobotsTxtRulesHandlerBase(supportedBotIds, robotsMaxSize, maxRulesNumber, saveDataForAnyBot) -{} - -bool TPrefixTreeRobotsTxtRulesHandler::Empty(const ui32 botId) const { - const auto& botInfo = BotIdToPrefixTreeBotInfo[GetNotOptimizedBotId(botId)]; - return !botInfo || (botInfo->BufferPosition <= sizeof(botInfo->BufferPosition)); -} - -TRobotsTxtRulesIterator TPrefixTreeRobotsTxtRulesHandler::GetRulesIterator(const ui32 botId) const { - const auto& botInfo = BotIdToPrefixTreeBotInfo[GetNotOptimizedBotId(botId)]; - if (!botInfo) { - return {}; - } - return TRobotsTxtRulesIterator(botInfo->Buffer.Get() + sizeof(botInfo->BufferPosition), botInfo->Buffer.Get() + botInfo->BufferPosition); -} - -size_t TPrefixTreeRobotsTxtRulesHandler::GetMemorySize() { - size_t allBotsSize = 0; - for (const auto& botInfo : BotIdToPrefixTreeBotInfo) { - if (!botInfo) { - continue; - } - - allBotsSize += botInfo->PrefixRules.GetMemorySize() - + botInfo->BufferSize * sizeof(char) - + botInfo->ComplexRulesSize * sizeof(char**) - + botInfo->RulesSize * sizeof(char*) + (1 << 8); - } - return allBotsSize; -} - -void TPrefixTreeRobotsTxtRulesHandler::ClearInternal(const ui32 botId) { - if (botId >= BotIdToPrefixTreeBotInfo.size()) { - return; - } - BotIdToPrefixTreeBotInfo[botId].Reset(); - TRobotsTxtRulesHandlerBase::ClearInternal(botId); -} - -bool TPrefixTreeRobotsTxtRulesHandler::OptimizeSize() { - ResetOptimized(); - - TMap<ui64, ui32> hashToBotId; - for (auto botId : LoadedBotIds) { - auto& botInfo = BotIdToPrefixTreeBotInfo[botId]; - if (botInfo->BufferPosition <= sizeof(ui32)) { - botInfo.Reset(); - LoadedBotIds.remove(botId); - continue; - } - - ui64 hash = FnvHash<ui64>(botInfo->Buffer.Get(), botInfo->BufferPosition); - if (auto p = hashToBotId.FindPtr(hash)) { - OptimizedBotIdToStoredBotId[botId] = *p; - ClearInternal(botId); - botInfo.Reset(); - } else { - hashToBotId[hash] = botId; - } - } - - if (IsFullTotal()) { - DoAllowAll(); - return false; - } - - return true; -} - -void TPrefixTreeRobotsTxtRulesHandler::Clear() { - for (size_t botId = 0; botId < robotstxtcfg::max_botid; ++botId) - if (IsBotIdSupported(botId)) - ClearInternal(botId); - TRobotsTxtRulesHandlerBase::Clear(); -} - -void TPrefixTreeRobotsTxtRulesHandler::ResizeBuffer(const ui32 botId, int newSize) { - auto& botInfo = GetInfo(botId); - TArrayHolder<char> newBuffer(new char[newSize]); - memcpy(newBuffer.Get(), botInfo.Buffer.Get(), std::min(botInfo.BufferSize, newSize)); - botInfo.Buffer.Swap(newBuffer); - botInfo.BufferSize = newSize; -} - -bool TPrefixTreeRobotsTxtRulesHandler::AddRule(const ui32 botId, TStringBuf rule, char type) { - if (rule.empty() || rule.Contains('\0')) { - return true; - } - - auto& botInfo = GetInfo(botId); - - if (IsFull(botId, rule.size())) { - DoAllowAll(); - return false; - } - - auto [convertedRule, convertedType] = ConvertRule(rule, type); - const auto len = convertedRule.size() + 2; // 1 byte for convertedType and another for '\0' - - if (auto newPos = botInfo.BufferPosition + len; newPos >= size_t(botInfo.BufferSize)) { - size_t newSize = botInfo.BufferSize; - while (newPos >= newSize) - newSize *= 2; - ResizeBuffer(botId, newSize); - } - - auto out = botInfo.Buffer.Get() + botInfo.BufferPosition; - *out++ = convertedType; - strcpy(out, convertedRule.data()); - botInfo.BufferPosition += len; - - if (type == 'A' || type == 'D') { - botInfo.RulesPosition++; - } - - return true; -} - -const char* TPrefixTreeRobotsTxtRulesHandler::GetRule(const ui32 botId, const char* s, char type) const { - const auto& botInfo = BotIdToPrefixTreeBotInfo[GetNotOptimizedBotId(botId)]; - if (!botInfo) { - return nullptr; - } - - int m = botInfo->RulesPosition + 1; - int k = botInfo->PrefixRules.MinPrefixIndex(s); - if (k >= 0) - m = k; - char* rule; - int j; - for (int i = 0; i < botInfo->ComplexRulesPosition; ++i) { - rule = *botInfo->ComplexRules.Get()[i]; - j = botInfo->ComplexRules.Get()[i] - botInfo->Rules.Get(); - if (j >= m) - break; - if (CheckRule(s, rule)) { - m = j; - break; - } - } - if (m >= botInfo->RulesPosition) - return nullptr; - return toupper(*(botInfo->Rules.Get()[m] - 1)) == type ? botInfo->Rules.Get()[m] : nullptr; -} - -inline bool TPrefixTreeRobotsTxtRulesHandler::IsAllowAll(const ui32 botId) const { - const auto id = GetMappedBotId(botId, false); - auto& botInfo = BotIdToPrefixTreeBotInfo[id ? *id : robotstxtcfg::id_anybot]; - return botInfo && botInfo->AllowAll; -} - -inline bool TPrefixTreeRobotsTxtRulesHandler::IsAllowAll() const { - for (ui32 botId = 0; botId < robotstxtcfg::max_botid; ++botId) - if (robotstxtcfg::IsYandexBotId(botId) && IsBotIdSupported(botId) && !IsAllowAll(botId)) { - return false; - } - - return true; -} - -inline bool TPrefixTreeRobotsTxtRulesHandler::IsDisallowAll(const ui32 botId, bool useAny) const { - const auto id = GetMappedBotId(botId, false); - if (id) { - const auto& botInfo = BotIdToPrefixTreeBotInfo[*id]; - return botInfo && botInfo->DisallowAll; - } - - auto& botInfo = BotIdToPrefixTreeBotInfo[robotstxtcfg::id_anybot]; - return useAny && botInfo && botInfo->DisallowAll; -} - -inline bool TPrefixTreeRobotsTxtRulesHandler::IsDisallowAll() const { - for (ui32 botId = 0; botId < robotstxtcfg::max_botid; ++botId) - if (robotstxtcfg::IsYandexBotId(botId) && IsBotIdSupported(botId) && !IsDisallowAll(botId)) - return false; - - return true; -} - -void TPrefixTreeRobotsTxtRulesHandler::DoAllowAll() { - using robotstxtcfg::id_anybot; - - // Drop all bots to default - SupportedBotIds.insert(id_anybot); - for (ui32 botId = 0; botId < robotstxtcfg::max_botid; ++botId) { - if (IsBotIdSupported(botId)) { - ClearInternal(botId); - OptimizedBotIdToStoredBotId[botId] = id_anybot; - LoadedBotIds.insert(botId); - } - } - - // Initialize anybot with "allow all" rule - AddRule(id_anybot, "/", 'A'); - GetInfo(id_anybot).AllowAll = true; - SaveRulesToBuffer(); -} - -void TPrefixTreeRobotsTxtRulesHandler::DoDisallowAll() { - for (ui32 botId = 0; botId < robotstxtcfg::max_botid; ++botId) { - if (!IsBotIdSupported(botId)) - continue; - ClearInternal(botId); - if (botId == robotstxtcfg::id_anybot) { - auto& botInfo = GetInfo(botId); - AddRule(botId, "/", 'D'); - botInfo.DisallowAll = true; - SaveRulesToBuffer(); - } else { - OptimizedBotIdToStoredBotId[botId] = robotstxtcfg::id_anybot; - } - LoadedBotIds.insert(botId); - } -} - -const char* TPrefixTreeRobotsTxtRulesHandler::IsDisallow(const ui32 botId, const char* s, bool useAny) const { - const auto id = GetMappedBotId(botId, useAny); - if (!id) - return nullptr; - - const auto& botInfo = BotIdToPrefixTreeBotInfo[*id]; - if (botInfo && IsDisallowAll(*id, useAny)) { - int index = (const_cast<TPrefixTreeRobotsTxtRulesHandler*>(this))->FindRuleAll(*botInfo, 'D'); - if (index < 0) { //o_O - return botInfo->Rules.Get()[0]; - } else { - return botInfo->Rules.Get()[index]; - } - } - - return GetRule(*id, s, 'D'); -} - -const char* TPrefixTreeRobotsTxtRulesHandler::IsAllow(const ui32 botId, const char* s) const { - const auto id = GetMappedBotId(botId, true); - if (auto p = GetRule(*id, s, 'A')) - return p; - return GetRule(*id, s, 'D') ? nullptr : "/"; -} - -int TPrefixTreeRobotsTxtRulesHandler::StrLenWithoutStars(const char* s) { - int len = 0; - - for (size_t index = 0; s[index]; ++index) { - if (s[index] != '*') { - ++len; - } - } - - return len; -} - -int TPrefixTreeRobotsTxtRulesHandler::TraceBuffer(const ui32 botId, int countRules, const TArrayHolder<TRuleInfo>* ruleInfos) { - CheckBotIdValidity(botId); - auto& prefixBotInfo = GetInfo(botId); - TBotInfo& botInfo = BotIdToInfo[botId]; - - bool store = countRules >= 0; - if (store) { - prefixBotInfo.Rules.Reset(new char*[prefixBotInfo.RulesSize = countRules]); - } - - int beg = -1, n = 0; - *((int*)prefixBotInfo.Buffer.Get()) = prefixBotInfo.BufferSize; - for (size_t i = sizeof(prefixBotInfo.BufferPosition); i < prefixBotInfo.BufferPosition; ++i) - if (prefixBotInfo.Buffer.Get()[i] == '\n' || prefixBotInfo.Buffer.Get()[i] == 0) { - if (beg < 0 || beg + 1 == (int)i) - continue; - - char* s = prefixBotInfo.Buffer.Get() + beg; - if (store) { - switch (*s) { - case 'H': - HostDirective = s + 1; - break; - case 'S': - SiteMaps.insert(s + 1); - break; - case 'C': - ParseCrawlDelay(s + 1, botInfo.CrawlDelay); - break; - case 'P': - CleanParams.insert(s + 1); - break; - default: - prefixBotInfo.Rules.Get()[n] = s + 1; - (*ruleInfos).Get()[n].Len = StrLenWithoutStars(s + 1); - (*ruleInfos).Get()[n].Allow = toupper(*s) == 'A'; - - prefixBotInfo.HasAllow |= toupper(*s) == 'A'; - prefixBotInfo.HasDisallow |= toupper(*s) == 'D'; - break; - } - } - n += (*s != 'H' && *s != 'S' && *s != 'C' && *s != 'P'); - beg = -1; - } else if (beg < 0) - beg = i; - - return n; -} - -int TPrefixTreeRobotsTxtRulesHandler::FindRuleAll(const TPrefixTreeBotInfo& prefixBotInfo, const char neededType) { - static const char* all[] = {"*", "/", "*/", "/*", "*/*"}; - for (int ruleNumber = prefixBotInfo.RulesSize - 1; ruleNumber >= 0; --ruleNumber) { - const char* curRule = prefixBotInfo.Rules.Get()[ruleNumber]; - char ruleType = *(curRule - 1); - - if (strlen(curRule) > 3) - break; - if (neededType != ruleType) - continue; - - for (size_t i = 0; i < sizeof(all) / sizeof(char*); ++i) - if (strcmp(all[i], curRule) == 0) - return ruleNumber; - } - return -1; -} - -bool TPrefixTreeRobotsTxtRulesHandler::HasDisallowRulePrevAllowAll(const TPrefixTreeBotInfo& prefixBotInfo, int ruleAllAllow) { - for (int ruleNumber = ruleAllAllow - 1; ruleNumber >= 0; --ruleNumber) { - const char* curRule = prefixBotInfo.Rules.Get()[ruleNumber]; - char ruleType = *(curRule - 1); - if (tolower(ruleType) == 'd') - return true; - } - return false; -} - -bool TPrefixTreeRobotsTxtRulesHandler::CheckAllowDisallowAll(const ui32 botId, const bool checkDisallow) { - CheckBotIdValidity(botId); - - auto& botInfo = GetInfo(botId); - - if (botInfo.RulesSize == 0) - return !checkDisallow; - if (botInfo.RulesPosition <= 0) - return 0; - - if (checkDisallow) - return !botInfo.HasAllow && FindRuleAll(botInfo, 'D') >= 0; - int ruleAllAllow = FindRuleAll(botInfo, 'A'); - if (ruleAllAllow == -1) - return !botInfo.HasDisallow; - return !HasDisallowRulePrevAllowAll(botInfo, ruleAllAllow); -} - -void TPrefixTreeRobotsTxtRulesHandler::SortRules( - TPrefixTreeBotInfo& prefixBotInfo, - size_t count, - const TArrayHolder<TRuleInfo>* ruleInfos) { - TVector<size_t> indexes(count); - for (size_t index = 0; index < count; ++index) - indexes[index] = index; - - TRulesSortFunc sortFunc(ruleInfos); - std::sort(indexes.begin(), indexes.end(), sortFunc); - - TArrayHolder<char*> workingCopy; - workingCopy.Reset(new char*[count]); - - for (size_t index = 0; index < count; ++index) - workingCopy.Get()[index] = prefixBotInfo.Rules.Get()[index]; - for (size_t index = 0; index < count; ++index) - prefixBotInfo.Rules.Get()[index] = workingCopy.Get()[indexes[index]]; -} - -void TPrefixTreeRobotsTxtRulesHandler::SaveRulesToBuffer() { - // as sitemaps, clean-params and HostDirective from prefix tree was deleted - for (const auto& sitemap: SiteMaps) - AddRule(robotstxtcfg::id_anybot, sitemap, 'S'); - for (const auto& param : CleanParams) - AddRule(robotstxtcfg::id_anybot, param, 'P'); - if (!HostDirective.empty()) - AddRule(robotstxtcfg::id_anybot, HostDirective, 'H'); -} - -void TPrefixTreeRobotsTxtRulesHandler::SaveRulesFromBuffer(const ui32 botId) { - CheckBotIdValidity(botId); - - auto& botInfo = GetInfo(botId); - - TArrayHolder<TRuleInfo> ruleInfos; - - int n = TraceBuffer(botId, -1, nullptr), countPrefix = 0; - ruleInfos.Reset(new TRuleInfo[n]); - botInfo.RulesPosition = TraceBuffer(botId, n, &ruleInfos); - assert(botInfo.RulesPosition == n); - - SortRules(botInfo, n, &ruleInfos); - - botInfo.DisallowAll = CheckAllowDisallowAll(botId, true); - botInfo.AllowAll = CheckAllowDisallowAll(botId, false); - - for (int i = 0; i < n; ++i) - countPrefix += !!isupper(*(botInfo.Rules.Get()[i] - 1)); - - botInfo.PrefixRules.Init(countPrefix); - botInfo.ComplexRules.Reset(new char**[botInfo.ComplexRulesSize = n - countPrefix]); - botInfo.ComplexRulesPosition = 0; - - for (int i = 0; i < n; ++i) { - char* s = botInfo.Rules.Get()[i]; - if (isupper(*(s - 1))) - botInfo.PrefixRules.Add(s, i); - else - botInfo.ComplexRules.Get()[botInfo.ComplexRulesPosition++] = &botInfo.Rules.Get()[i]; - } - botInfo.PrefixRules.Compress(); -} - -void TPrefixTreeRobotsTxtRulesHandler::AfterParse(const ui32 botId) { - CheckBotIdValidity(botId); - - auto& botInfo = GetInfo(botId); - - ResizeBuffer(botId, botInfo.BufferPosition); - SaveRulesFromBuffer(botId); - - if (botInfo.RulesPosition == 0) { - AddRule(botId, "/", 'A'); - } -} - -TPrefixTreeRobotsTxtRulesHandler::TPrefixTreeBotInfo& TPrefixTreeRobotsTxtRulesHandler::GetInfo(ui32 botId) { - Y_ENSURE(botId < robotstxtcfg::max_botid); - auto& res = BotIdToPrefixTreeBotInfo[botId]; - if (!res) { - res = MakeHolder<TPrefixTreeBotInfo>(); - } - return *res; -} - -bool TPrefixTreeRobotsTxtRulesHandler::CheckRule(const char* s, const char* rule) { - const char* r = rule; - const char* s_end = s + strlen(s); - const char* r_end = r + strlen(r); - // assert( r && !strstr(r, "**") ); - for (; *s; ++s) { - if ((s_end - s + 1) * 2 < (r_end - r)) - return 0; - while (*r == '*') - ++r; - - if (*s == *r) { - ++r; - } else { - while (r != rule && *r != '*') - --r; - - if (*r != '*') - return 0; - if (*r == '*') - ++r; - if (*r == *s) - ++r; - } - } - return !*r || (!*(r + 1) && *r == '*'); -} - -bool TPrefixTreeRobotsTxtRulesHandler::IsFull(ui32 botId, size_t length) const { - Y_ENSURE(botId < robotstxtcfg::max_botid); - const auto& botInfo = BotIdToPrefixTreeBotInfo[botId]; - if (!botInfo) { - return false; - } - - return (size_t(botInfo->RulesPosition) >= MaxRulesNumber) || (botInfo->BufferPosition + length + 300 > size_t(RobotsMaxSize)); -} - -bool TPrefixTreeRobotsTxtRulesHandler::IsFullTotal() const { - size_t allBotsRulesCount = 0; - size_t allBotsBufferSize = 0; - - for (const auto& botInfo : BotIdToPrefixTreeBotInfo) { - if (botInfo) { - allBotsRulesCount += botInfo->RulesPosition; - allBotsBufferSize += botInfo->BufferPosition; - } - } - - return (allBotsRulesCount >= MaxRulesNumber) || (allBotsBufferSize + 300 > size_t(RobotsMaxSize)); -} - -size_t TPrefixTreeRobotsTxtRulesHandler::GetPacked(const char*& data) const { - Y_STATIC_THREAD(TBuffer) - packedRepresentation; - - // calculate size, needed for packed data - size_t totalPackedSize = sizeof(ui32); // num of botids - ui32 numOfSupportedBots = 0; - - for (size_t botId = 0; botId < robotstxtcfg::max_botid; ++botId) { - if (!IsBotIdSupported(botId)) { - continue; - } - - const auto& botInfo = BotIdToPrefixTreeBotInfo[GetNotOptimizedBotId(botId)]; - // botId + packedDataSize + packedData - totalPackedSize += sizeof(ui32) + (botInfo ? botInfo->BufferPosition : sizeof(ui32)); - ++numOfSupportedBots; - } - - ((TBuffer&)packedRepresentation).Reserve(totalPackedSize); - - // fill packed data - char* packedPtr = ((TBuffer&)packedRepresentation).Data(); - - *((ui32*)packedPtr) = numOfSupportedBots; - packedPtr += sizeof(ui32); - - for (size_t botId = 0; botId < robotstxtcfg::max_botid; ++botId) { - if (!IsBotIdSupported(botId)) { - continue; - } - - const auto& botInfo = BotIdToPrefixTreeBotInfo[GetNotOptimizedBotId(botId)]; - memcpy(packedPtr, &botId, sizeof(ui32)); - packedPtr += sizeof(ui32); - - if (botInfo) { - *((ui32*)botInfo->Buffer.Get()) = botInfo->BufferPosition; - memcpy(packedPtr, botInfo->Buffer.Get(), botInfo->BufferPosition); - packedPtr += botInfo->BufferPosition; - } else { - // In absense of bot info we serialize only size of its buffer, which is 4 because it takes 4 bytes - ui32 emptyBufferPosition = sizeof(ui32); - memcpy(packedPtr, &emptyBufferPosition, sizeof(ui32)); - packedPtr += sizeof(ui32); - } - } - - data = ((TBuffer&)packedRepresentation).Data(); - return totalPackedSize; -} - -void TPrefixTreeRobotsTxtRulesHandler::LoadPacked(const char* botsData, const char* botsDataEnd) { - Clear(); - - if (Y_UNLIKELY(botsDataEnd != nullptr && botsData >= botsDataEnd)) { - ythrow yexception() << "Buffer overflow"; - } - - ui32 numOfBots = *((ui32*)botsData); - botsData += sizeof(ui32); - - for (ui32 botIndex = 0; botIndex < numOfBots; ++botIndex) { - if (Y_UNLIKELY(botsDataEnd != nullptr && botsData >= botsDataEnd)) { - ythrow yexception() << "Buffer overflow"; - } - - ui32 botId = 0; - memcpy(&botId, botsData, sizeof(ui32)); - botsData += sizeof(ui32); - - // skip bot id's, that not supported for now - if (botId >= robotstxtcfg::max_botid || !IsBotIdSupported(botId)) { - if (Y_UNLIKELY(botsDataEnd != nullptr && botsData >= botsDataEnd)) { - ythrow yexception() << "Buffer overflow"; - } - - ui32 oneBotPackedSize = 0; - memcpy(&oneBotPackedSize, botsData, sizeof(ui32)); - botsData += oneBotPackedSize; - - continue; - } - - //SupportedBotIds.insert(botId); - - auto& botInfo = GetInfo(botId); - - if (Y_UNLIKELY(botsDataEnd != nullptr && botsData >= botsDataEnd)) { - ythrow yexception() << "Buffer overflow"; - } - - static_assert(sizeof(botInfo.BufferSize) == sizeof(ui32), "BufferSize must be 4 bytes"); - static_assert(sizeof(botInfo.BufferPosition) == sizeof(ui32), "BufferPosition must be 4 bytes"); - - memcpy(&botInfo.BufferSize, botsData, sizeof(ui32)); - memcpy(&botInfo.BufferPosition, botsData, sizeof(ui32)); - - if (Y_UNLIKELY(botsDataEnd != nullptr && (botsData + botInfo.BufferSize) > botsDataEnd)) { - ythrow yexception() << "Buffer overflow"; - } - - botInfo.Buffer.Reset(new char[botInfo.BufferSize]); - memcpy(botInfo.Buffer.Get(), botsData, botInfo.BufferSize); - SaveRulesFromBuffer(botId); - - if (botInfo.BufferSize > (int)sizeof(ui32)) { // empty data for robots means, that we don't have section for this bot - LoadedBotIds.insert(botId); - } - - botsData += botInfo.BufferSize; - } - - OptimizeSize(); -} - -void TPrefixTreeRobotsTxtRulesHandler::Dump(const ui32 botId, FILE* dumpFile) { - if (!dumpFile) - dumpFile = stderr; - fprintf(dumpFile, "User-Agent: %s\n", robotstxtcfg::GetFullName(botId).data()); - for (TRobotsTxtRulesIterator it = GetRulesIterator(botId); it.HasRule(); it.Next()) - fprintf(dumpFile, "%s: %s\n", DirTypeToName(it.GetRuleType()), it.GetInitialRule().data()); -} - -void TPrefixTreeRobotsTxtRulesHandler::Dump(const ui32 botId, IOutputStream& out) { - out << "User-Agent: " << robotstxtcfg::GetFullName(botId) << Endl; - for (TRobotsTxtRulesIterator it = GetRulesIterator(botId); it.HasRule(); it.Next()) - out << DirTypeToName(it.GetRuleType()) << ": " << it.GetInitialRule() << Endl; -} diff --git a/library/cpp/robots_txt/robots_txt.h b/library/cpp/robots_txt/robots_txt.h deleted file mode 100644 index 5ee48fb14f5..00000000000 --- a/library/cpp/robots_txt/robots_txt.h +++ /dev/null @@ -1,605 +0,0 @@ -#pragma once - -#include "constants.h" -#include "robots_txt_parser.h" -#include "prefix_tree.h" -#include "robotstxtcfg.h" - -#include <util/generic/noncopyable.h> -#include <util/generic/map.h> -#include <util/generic/maybe.h> -#include <util/generic/ptr.h> -#include <util/generic/set.h> - -#include <array> -#include <utility> - - -enum EDirectiveType { - USER_AGENT = 1, - DISALLOW = 2, - ALLOW = 3, - HOST = 4, - SITEMAP = 5, - CRAWL_DELAY = 6, - CLEAN_PARAM = 7, - UNKNOWN = 9, -}; - -enum EFormatErrorType { - ERROR_RULE_NOT_SLASH = 1, - ERROR_ASTERISK_MULTI = 2, - ERROR_HOST_MULTI = 3, - ERROR_ROBOTS_HUGE = 4, - ERROR_RULE_BEFORE_USER_AGENT = 5, - ERROR_RULE_HUGE = 6, - ERROR_HOST_FORMAT = 7, - ERROR_TRASH = 8, - ERROR_SITEMAP_FORMAT = 9, - ERROR_CRAWL_DELAY_FORMAT = 10, - ERROR_CRAWL_DELAY_MULTI = 11, - ERROR_CLEAN_PARAM_FORMAT = 12, - - WARNING_EMPTY_RULE = 30, - WARNING_SUSPECT_SYMBOL = 31, - WARNING_UNKNOWN_FIELD = 33, - WARNING_UPPER_REGISTER = 34, - WARNING_SITEMAP = 35, -}; - -class TRobotsTxtRulesIterator { -private: - const char* Begin = nullptr; - const char* End = nullptr; - -public: - TRobotsTxtRulesIterator() = default; - TRobotsTxtRulesIterator(const char* begin, const char* end); - void Next(); - bool HasRule() const; - const char* GetRule() const; - TString GetInitialRule() const; // unlike GetRule(), it neither omits trailing '$' nor adds redundant '*' - EDirectiveType GetRuleType() const; - - static EDirectiveType CharToDirType(char ch); -}; - -class TRobotsTxtRulesHandlerBase { -public: - typedef TVector<std::pair<EFormatErrorType, int>> TErrorVector; - - TRobotsTxtRulesHandlerBase( - TBotIdSet supportedBotIds, - int robotsMaxSize, - int maxRulesNumber, - bool saveDataForAnyBot); - - TRobotsTxtRulesHandlerBase( - const TSet<ui32>& supportedBotIds, - int robotsMaxSize, - int maxRulesNumber, - bool saveDataForAnyBot); - - virtual ~TRobotsTxtRulesHandlerBase(); - - int GetCrawlDelay(ui32 botId, bool* realInfo = nullptr) const; - int GetMinCrawlDelay(int defaultCrawlDelay = -1) const; - bool IsHandlingErrors() const; - const TString& GetHostDirective() const; - const TVector<TString> GetSiteMaps() const; - const TVector<TString> GetCleanParams() const; - const TErrorVector& GetErrors() const; - TVector<int> GetAcceptedLines(ui32 botId = robotstxtcfg::id_yandexbot) const; - - template <class THostHandler> - static int ParseRules(TRobotsTxtParser& parser, TRobotsTxtRulesHandlerBase* rulesHandler, THostHandler* hostHandler, const char* host = nullptr); - static inline void ClearAllExceptCrossSection(TRobotsTxtParser& parser, TRobotsTxtRulesHandlerBase* rulesHandler, ui32 botId); - static int CheckHost(const char* host); - static int CheckSitemapUrl(const char* url, const char* host, TString& modifiedUrl); - static int CheckRule(const char* value, int line, TRobotsTxtRulesHandlerBase* rulesHandler); - static int CheckAndNormCleanParam(TString& s); - static int ParseCrawlDelay(const char* value, int& crawlDelay); - static EDirectiveType NameToDirType(const char* d); - static const char* DirTypeToName(EDirectiveType t); - - void SetErrorsHandling(bool handleErrors); - void SetHostDirective(const char* hostDirective); - void SetCrawlDelay(ui32 botId, int crawlDelay); - void AddAcceptedLine(ui32 line, const TBotIdSet& botIds, bool isCrossSection); - void AddSiteMap(const char* sitemap); - void AddCleanParam(const char* cleanParam); - bool AddRuleWithErrorCheck(ui32 botId, TStringBuf rule, char type, TRobotsTxtParser& parser); - int OnHost(ui32 botId, TRobotsTxtParser& parser, const char* value, TRobotsTxtRulesHandlerBase*& rulesHandler); - - virtual void Clear(); - virtual bool IsAllowAll(ui32 botId) const = 0; - virtual bool IsAllowAll() const = 0; - virtual bool IsDisallowAll(ui32 botId, bool useAny = true) const = 0; - virtual bool IsDisallowAll() const = 0; - virtual const char* IsDisallow(ui32 botId, const char* s, bool useAny = true) const = 0; - virtual const char* IsAllow(ui32 botId, const char* s) const = 0; - virtual TRobotsTxtRulesIterator GetRulesIterator(ui32 botId) const = 0; - virtual void Dump(ui32 botId, FILE* logFile) = 0; - virtual void Dump(ui32 botId, IOutputStream& out) = 0; - virtual bool Empty(ui32 botId) const = 0; - virtual void LoadPacked(const char* botsData, const char* botsDataEnd = nullptr) = 0; - virtual size_t GetPacked(const char*& data) const = 0; - virtual void AfterParse(ui32 botId) = 0; - virtual void DoAllowAll() = 0; - virtual void DoDisallowAll() = 0; - bool IsBotIdLoaded(ui32 botId) const; - bool IsBotIdSupported(ui32 botId) const; - ui32 GetNotOptimizedBotId(ui32 botId) const; - TMaybe<ui32> GetMappedBotId(ui32 botId, bool useAny = true) const; - -protected: - void CheckBotIdValidity(ui32 botId) const; - virtual bool OptimizeSize() = 0; - -private: - bool HandleErrors; - -protected: - struct TBotInfo { - int CrawlDelay; - - TBotInfo() - : CrawlDelay(-1) - { - } - }; - - TBotIdSet LoadedBotIds; - TSet<TString> SiteMaps; - TSet<TString> CleanParams; - TString HostDirective; - TErrorVector Errors; - typedef std::pair<ui32, ui32> TBotIdAcceptedLine; - TVector<TBotIdAcceptedLine> AcceptedLines; - TVector<ui32> CrossSectionAcceptedLines; - - TVector<TBotInfo> BotIdToInfo; - int CrawlDelay; - size_t RobotsMaxSize; - size_t MaxRulesNumber; - bool SaveDataForAnyBot; - - TBotIdSet SupportedBotIds; - std::array<ui8, robotstxtcfg::max_botid> OptimizedBotIdToStoredBotId; - - virtual bool IsFull(ui32 botId, size_t length) const = 0; - virtual bool IsFullTotal() const = 0; - virtual bool AddRule(ui32 botId, TStringBuf rule, char type) = 0; - //parts of ParseRules - inline static void CheckRobotsLines(TRobotsTxtRulesHandlerBase* rulesHandler, TVector<int>& nonRobotsLines); - inline static void CheckAsterisk(TRobotsTxtRulesHandlerBase* rulesHandler, const char* value, ui32 lineNumber, bool& wasAsterisk); - inline static bool CheckWasUserAgent(TRobotsTxtRulesHandlerBase* rulesHandler, bool wasUserAgent, bool& ruleBeforeUserAgent, bool& wasRule, ui32 lineNumber); - inline static bool CheckRuleNotSlash(TRobotsTxtRulesHandlerBase* rulesHandler, const char* value, ui32 lineNumber); - inline static bool CheckSupportedBots(const TBotIdSet& currentBotIds, TBotIdSet& wasRuleForBot, const TBotIdSet& isSupportedBot); - inline static bool CheckEmptyRule(TRobotsTxtRulesHandlerBase* rulesHandler, const char* value, EDirectiveType& type, ui32 lineNumber); - inline static bool ProcessSitemap(TRobotsTxtRulesHandlerBase* rulesHandler, TRobotsTxtParser& parser, const char* value, const char* host); - inline static bool ProcessCleanParam(TRobotsTxtRulesHandlerBase* rulesHandler, TRobotsTxtParser& parser, TString& value); - inline static bool AddRules( - TRobotsTxtRulesHandlerBase* rulesHandler, - TRobotsTxtParser& parser, - const char* value, - char type, - const TBotIdSet& currentBotIds, - const TBotIdSet& isSupportedBot); - - inline static bool ProcessCrawlDelay( - TRobotsTxtRulesHandlerBase* rulesHandler, - TRobotsTxtParser& parser, - const TBotIdSet& currentBotIds, - const TBotIdSet& isSupportedBot, - const char* value); - - inline static void ProcessUserAgent( - TRobotsTxtRulesHandlerBase* rulesHandler, - TRobotsTxtParser& parser, - const TBotIdSet& currentBotIds, - TBotIdSet& wasRuleForBot, - TBotIdSet& isSupportedBot, - TVector<ui32>& botIdToMaxAppropriateUserAgentNameLength, - const char* value); - - bool CheckRobot( - const char* userAgent, - TBotIdSet& botIds, - const TVector<ui32>* botIdToMaxAppropriateUserAgentNameLength = nullptr) const; - - virtual void ClearInternal(ui32 botId); - - void AddError(EFormatErrorType type, int line); - - void ResetOptimized() noexcept; -}; - -class TPrefixTreeRobotsTxtRulesHandler: public TRobotsTxtRulesHandlerBase, TNonCopyable { -private: - static const int INIT_BUFFER_SIZE = 1 << 6; - - struct TRuleInfo { - size_t Len; - bool Allow; - }; - - bool IsFull(ui32 botId, size_t length) const override; - bool IsFullTotal() const override; - bool AddRule(ui32 botId, TStringBuf rule, char type) override; - const char* GetRule(ui32 botId, const char* s, char type) const; - void ResizeBuffer(ui32 botId, int newSize); - void SaveRulesFromBuffer(ui32 botId); - int TraceBuffer(ui32 botId, int countRules, const TArrayHolder<TRuleInfo>* ruleInfos); - bool CheckAllowDisallowAll(ui32 botId, bool checkDisallow); - void SaveRulesToBuffer(); - int StrLenWithoutStars(const char* s); - -protected: - class TRulesSortFunc { - private: - const TArrayHolder<TRuleInfo>* RuleInfos; - - public: - TRulesSortFunc(const TArrayHolder<TRuleInfo>* ruleInfos) - : RuleInfos(ruleInfos) - { - } - bool operator()(const size_t& lhs, const size_t& rhs) { - const TRuleInfo& left = (*RuleInfos).Get()[lhs]; - const TRuleInfo& right = (*RuleInfos).Get()[rhs]; - return (left.Len == right.Len) ? left.Allow && !right.Allow : left.Len > right.Len; - } - }; - - struct TPrefixTreeBotInfo { - bool DisallowAll = false; - bool AllowAll = false; - bool HasDisallow = false; - bool HasAllow = false; - - TArrayHolder<char> Buffer{new char[INIT_BUFFER_SIZE]}; - ui32 BufferPosition = sizeof(BufferPosition); - int BufferSize = INIT_BUFFER_SIZE; - - TArrayHolder<char*> Rules = nullptr; - int RulesPosition = 0; - int RulesSize = 0; - - TArrayHolder<char**> ComplexRules = nullptr; - int ComplexRulesPosition = 0; - int ComplexRulesSize = 0; - - TPrefixTree PrefixRules {0}; - }; - - std::array<THolder<TPrefixTreeBotInfo>, robotstxtcfg::max_botid> BotIdToPrefixTreeBotInfo; - - TPrefixTreeBotInfo& GetInfo(ui32 botId); - static bool CheckRule(const char* s, const char* rule); - void ClearInternal(ui32 botId) override; - bool OptimizeSize() override; - -private: - void SortRules(TPrefixTreeBotInfo& prefixBotInfo, size_t count, const TArrayHolder<TRuleInfo>* ruleInfos); - bool HasDisallowRulePrevAllowAll(const TPrefixTreeBotInfo& prefixBotInfo, int ruleAllAllow); - int FindRuleAll(const TPrefixTreeBotInfo& prefixBotInfo, char neededType); - -public: - TPrefixTreeRobotsTxtRulesHandler( - TBotIdSet supportedBotIds = robotstxtcfg::defaultSupportedBotIds, - int robotsMaxSize = robots_max, - int maxRulesCount = -1, - bool saveDataForAnyBot = true); - - TPrefixTreeRobotsTxtRulesHandler( - std::initializer_list<ui32> supportedBotIds, - int robotsMaxSize = robots_max, - int maxRulesCount = -1, - bool saveDataForAnyBot = true); - - TPrefixTreeRobotsTxtRulesHandler( - const TSet<ui32>& supportedBotIds, - int robotsMaxSize = robots_max, - int maxRulesCount = -1, - bool saveDataForAnyBot = true); - - void Clear() override; - void AfterParse(ui32 botId) override; - bool IsAllowAll(ui32 botId) const override; - bool IsAllowAll() const override; - bool IsDisallowAll(ui32 botId, bool useAny = true) const override; - bool IsDisallowAll() const override; - const char* IsDisallow(ui32 botId, const char* s, bool useAny = true) const override; - const char* IsAllow(ui32 botId, const char* s) const override; - TRobotsTxtRulesIterator GetRulesIterator(ui32 botId) const override; - void DoAllowAll() override; - void DoDisallowAll() override; - bool Empty(ui32 botId) const override; - - void LoadPacked(const char* botsData, const char* botsDataEnd = nullptr) override; - size_t GetPacked(const char*& data) const override; - void Dump(ui32 botId, FILE* logFile) override; - void Dump(ui32 botId, IOutputStream& out) override; - size_t GetMemorySize(); -}; - -using TRobotsTxt = TPrefixTreeRobotsTxtRulesHandler; - -void TRobotsTxtRulesHandlerBase::ClearAllExceptCrossSection(TRobotsTxtParser& parser, TRobotsTxtRulesHandlerBase* rulesHandler, ui32 botId) { - rulesHandler->ClearInternal(botId); - if (botId == robotstxtcfg::id_anybot) { - // as sitemaps, clean-params and HostDirective from prefix tree was deleted - for (const auto& sitemap : rulesHandler->SiteMaps) { - rulesHandler->AddRuleWithErrorCheck(robotstxtcfg::id_anybot, sitemap, 'S', parser); - } - for (const auto& param : rulesHandler->CleanParams) { - rulesHandler->AddRuleWithErrorCheck(robotstxtcfg::id_anybot, param, 'P', parser); - } - if (!rulesHandler->HostDirective.empty()) { - rulesHandler->AddRuleWithErrorCheck(robotstxtcfg::id_anybot, rulesHandler->HostDirective, 'H', parser); - } - } -} - -void TRobotsTxtRulesHandlerBase::CheckRobotsLines(TRobotsTxtRulesHandlerBase* rulesHandler, TVector<int>& nonRobotsLines) { - if (rulesHandler->IsHandlingErrors()) { - for (size_t i = 0; i < nonRobotsLines.size(); ++i) - rulesHandler->AddError(ERROR_TRASH, nonRobotsLines[i]); - nonRobotsLines.clear(); - } -} - -void TRobotsTxtRulesHandlerBase::CheckAsterisk(TRobotsTxtRulesHandlerBase* rulesHandler, const char* value, ui32 lineNumber, bool& wasAsterisk) { - if (strcmp(value, "*") == 0) { - if (wasAsterisk) - rulesHandler->AddError(ERROR_ASTERISK_MULTI, lineNumber); - wasAsterisk = true; - } -} - -bool TRobotsTxtRulesHandlerBase::CheckWasUserAgent(TRobotsTxtRulesHandlerBase* rulesHandler, bool wasUserAgent, bool& ruleBeforeUserAgent, bool& wasRule, ui32 lineNumber) { - if (wasUserAgent) { - wasRule = true; - return false; - } - if (!ruleBeforeUserAgent) { - ruleBeforeUserAgent = true; - rulesHandler->AddError(ERROR_RULE_BEFORE_USER_AGENT, lineNumber); - } - return true; -} - -bool TRobotsTxtRulesHandlerBase::CheckRuleNotSlash(TRobotsTxtRulesHandlerBase* rulesHandler, const char* value, ui32 lineNumber) { - if (*value && *value != '/' && *value != '*') { - rulesHandler->AddError(ERROR_RULE_NOT_SLASH, lineNumber); - return true; - } - return false; -} - -bool TRobotsTxtRulesHandlerBase::CheckSupportedBots( - const TBotIdSet& currentBotIds, - TBotIdSet& wasRuleForBot, - const TBotIdSet& isSupportedBot) -{ - bool hasAtLeastOneSupportedBot = false; - for (ui32 currentBotId : currentBotIds) { - wasRuleForBot.insert(currentBotId); - hasAtLeastOneSupportedBot = hasAtLeastOneSupportedBot || isSupportedBot.contains(currentBotId); - } - return hasAtLeastOneSupportedBot; -} - -bool TRobotsTxtRulesHandlerBase::CheckEmptyRule(TRobotsTxtRulesHandlerBase* rulesHandler, const char* value, EDirectiveType& type, ui32 lineNumber) { - if (value && strlen(value) == 0) { - rulesHandler->AddError(WARNING_EMPTY_RULE, lineNumber); - type = type == ALLOW ? DISALLOW : ALLOW; - return true; - } - return false; -} - -bool TRobotsTxtRulesHandlerBase::AddRules( - TRobotsTxtRulesHandlerBase* rulesHandler, - TRobotsTxtParser& parser, - const char* value, - char type, - const TBotIdSet& currentBotIds, - const TBotIdSet& isSupportedBot) -{ - for (ui32 currentBotId : currentBotIds) { - if (!isSupportedBot.contains(currentBotId)) - continue; - if (!rulesHandler->AddRuleWithErrorCheck(currentBotId, value, type, parser)) - return true; - } - return false; -} - -bool TRobotsTxtRulesHandlerBase::ProcessSitemap(TRobotsTxtRulesHandlerBase* rulesHandler, TRobotsTxtParser& parser, const char* value, const char* host) { - TString modifiedUrl; - if (!CheckSitemapUrl(value, host, modifiedUrl)) - rulesHandler->AddError(ERROR_SITEMAP_FORMAT, parser.GetLineNumber()); - else { - rulesHandler->AddSiteMap(modifiedUrl.data()); - if (!rulesHandler->AddRuleWithErrorCheck(robotstxtcfg::id_anybot, modifiedUrl.data(), 'S', parser)) - return true; - } - return false; -} - -bool TRobotsTxtRulesHandlerBase::ProcessCleanParam(TRobotsTxtRulesHandlerBase* rulesHandler, TRobotsTxtParser& parser, TString& value) { - if (!CheckAndNormCleanParam(value)) - rulesHandler->AddError(ERROR_CLEAN_PARAM_FORMAT, parser.GetLineNumber()); - else { - rulesHandler->AddCleanParam(value.data()); - if (!rulesHandler->AddRuleWithErrorCheck(robotstxtcfg::id_anybot, value.data(), 'P', parser)) - return true; - } - return false; -} - -bool TRobotsTxtRulesHandlerBase::ProcessCrawlDelay( - TRobotsTxtRulesHandlerBase* rulesHandler, - TRobotsTxtParser& parser, - const TBotIdSet& currentBotIds, - const TBotIdSet& isSupportedBot, - const char* value) { - for (ui32 currentBotId : currentBotIds) { - if (!isSupportedBot.contains(currentBotId)) - continue; - if (rulesHandler->BotIdToInfo[currentBotId].CrawlDelay >= 0) { - rulesHandler->AddError(ERROR_CRAWL_DELAY_MULTI, parser.GetLineNumber()); - break; - } - int crawlDelay = -1; - if (!ParseCrawlDelay(value, crawlDelay)) - rulesHandler->AddError(ERROR_CRAWL_DELAY_FORMAT, parser.GetLineNumber()); - else { - rulesHandler->SetCrawlDelay(currentBotId, crawlDelay); - if (!rulesHandler->AddRuleWithErrorCheck(currentBotId, value, 'C', parser)) - return true; - } - } - return false; -} - -void TRobotsTxtRulesHandlerBase::ProcessUserAgent( - TRobotsTxtRulesHandlerBase* rulesHandler, - TRobotsTxtParser& parser, - const TBotIdSet& currentBotIds, - TBotIdSet& wasSupportedBot, - TBotIdSet& isSupportedBot, - TVector<ui32>& botIdToMaxAppropriateUserAgentNameLength, - const char* value) -{ - ui32 userAgentNameLength = (ui32)strlen(value); - - for (ui32 currentBotId : currentBotIds) { - bool userAgentNameLonger = userAgentNameLength > botIdToMaxAppropriateUserAgentNameLength[currentBotId]; - bool userAgentNameSame = userAgentNameLength == botIdToMaxAppropriateUserAgentNameLength[currentBotId]; - - if (!wasSupportedBot.contains(currentBotId) || userAgentNameLonger) - ClearAllExceptCrossSection(parser, rulesHandler, currentBotId); - - wasSupportedBot.insert(currentBotId); - if (userAgentNameLonger || userAgentNameSame) { - isSupportedBot.insert(currentBotId); // Allow multiple blocks for the same user agent - } - botIdToMaxAppropriateUserAgentNameLength[currentBotId] = Max(userAgentNameLength, botIdToMaxAppropriateUserAgentNameLength[currentBotId]); - } -} - -template <class THostHandler> -int TRobotsTxtRulesHandlerBase::ParseRules(TRobotsTxtParser& parser, TRobotsTxtRulesHandlerBase* rulesHandler, THostHandler* hostHandler, const char* host) { - rulesHandler->Clear(); - - TBotIdSet wasSupportedBot; - TBotIdSet wasRuleForBot; - bool wasAsterisk = false; - TVector<int> nonRobotsLines; - TVector<ui32> botIdToMaxAppropriateUserAgentNameLength(robotstxtcfg::max_botid, 0); - static char all[] = "/"; - EDirectiveType prevType = USER_AGENT; - while (parser.HasRecord()) { - TRobotsTxtRulesRecord record = parser.NextRecord(); - bool wasUserAgent = false; - bool isRobotsRecordUseful = false; - TBotIdSet isSupportedBot; - TBotIdSet currentBotIds; - TString field; - TString value; - bool ruleBeforeUserAgent = false; - int ret = 0; - bool wasRule = false; - bool wasBlank = false; - while (record.NextPair(field, value, isRobotsRecordUseful && rulesHandler->IsHandlingErrors(), nonRobotsLines, &wasBlank)) { - CheckRobotsLines(rulesHandler, nonRobotsLines); - EDirectiveType type = NameToDirType(field.data()); - EDirectiveType typeBeforeChange = type; - - if ((prevType != type || wasBlank) && type == USER_AGENT) { - currentBotIds.clear(); - } - prevType = type; - - switch (type) { - case USER_AGENT: - if (wasUserAgent && wasRule) { - wasRule = false; - currentBotIds.clear(); - isSupportedBot.clear(); - } - wasUserAgent = true; - value.to_lower(); - CheckAsterisk(rulesHandler, value.data(), parser.GetLineNumber(), wasAsterisk); - isRobotsRecordUseful = rulesHandler->CheckRobot(value.data(), currentBotIds, &botIdToMaxAppropriateUserAgentNameLength); - if (isRobotsRecordUseful) - ProcessUserAgent(rulesHandler, parser, currentBotIds, wasSupportedBot, isSupportedBot, botIdToMaxAppropriateUserAgentNameLength, value.data()); - break; - - case DISALLOW: - case ALLOW: - if (CheckWasUserAgent(rulesHandler, wasUserAgent, ruleBeforeUserAgent, wasRule, parser.GetLineNumber())) - break; - if (CheckRuleNotSlash(rulesHandler, value.data(), parser.GetLineNumber())) - break; - CheckRule(value.data(), parser.GetLineNumber(), rulesHandler); - if (!CheckSupportedBots(currentBotIds, wasRuleForBot, isSupportedBot)) { - break; - } - if (CheckEmptyRule(rulesHandler, value.data(), type, parser.GetLineNumber())) { - value = all; - if (typeBeforeChange == ALLOW) - continue; - } - - if (AddRules(rulesHandler, parser, value.data(), type == ALLOW ? 'A' : 'D', currentBotIds, isSupportedBot)) - return 2; - break; - - case HOST: - value.to_lower(); - ret = hostHandler->OnHost(robotstxtcfg::id_anybot, parser, value.data(), rulesHandler); - if (ret) - return ret; - break; - - case SITEMAP: - if (ProcessSitemap(rulesHandler, parser, value.data(), host)) - return 2; - break; - - case CLEAN_PARAM: - if (ProcessCleanParam(rulesHandler, parser, value)) - return 2; - break; - - case CRAWL_DELAY: - if (ProcessCrawlDelay(rulesHandler, parser, currentBotIds, isSupportedBot, value.data())) - return 2; - break; - - default: - rulesHandler->AddError(WARNING_UNKNOWN_FIELD, parser.GetLineNumber()); - break; - } - bool isCrossSection = type == SITEMAP || type == HOST || type == CLEAN_PARAM; - if (rulesHandler->IsHandlingErrors() && (isRobotsRecordUseful || isCrossSection)) - rulesHandler->AddAcceptedLine(parser.GetLineNumber(), currentBotIds, isCrossSection); - } - } - - for (auto botId : wasSupportedBot) { - rulesHandler->LoadedBotIds.insert(botId); - if (rulesHandler->IsBotIdSupported(botId)) - rulesHandler->AfterParse(botId); - } - - if (!rulesHandler->OptimizeSize()) { - return 2; - } - - return 1; -} diff --git a/library/cpp/robots_txt/robots_txt_parser.cpp b/library/cpp/robots_txt/robots_txt_parser.cpp deleted file mode 100644 index 8e2fe6073d8..00000000000 --- a/library/cpp/robots_txt/robots_txt_parser.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "robots_txt_parser.h" -#include <util/generic/string.h> -#include <util/stream/output.h> - -TRobotsTxtParser::TRobotsTxtParser(IInputStream& inputStream) - : InputStream(inputStream) - , LineNumber(0) - , IsLastSymbolCR(false) -{ -} - -int TRobotsTxtParser::GetLineNumber() { - return LineNumber; -} - -const char* TRobotsTxtParser::ReadLine() { - Line = ""; - char c; - - if (IsLastSymbolCR) { - if (!InputStream.ReadChar(c)) - return nullptr; - if (c != '\n') - Line.append(c); - } - - bool hasMoreSymbols; - while (hasMoreSymbols = InputStream.ReadChar(c)) { - if (c == '\r') { - IsLastSymbolCR = true; - break; - } else { - IsLastSymbolCR = false; - if (c == '\n') - break; - Line.append(c); - } - } - if (!hasMoreSymbols && Line.empty()) - return nullptr; - - // BOM UTF-8: EF BB BF - if (0 == LineNumber && Line.size() >= 3 && Line[0] == '\xEF' && Line[1] == '\xBB' && Line[2] == '\xBF') - Line = Line.substr(3, Line.size() - 3); - - ++LineNumber; - int i = Line.find('#'); - if (i == 0) - Line = ""; - else if (i > 0) - Line = Line.substr(0, i); - return Line.data(); -} - -bool TRobotsTxtParser::IsBlankLine(const char* s) { - for (const char* p = s; *p; ++p) - if (!isspace(*p)) - return 0; - return 1; -} - -char* TRobotsTxtParser::Trim(char* s) { - while (isspace(*s)) - ++s; - char* p = s + strlen(s) - 1; - while (s < p && isspace(*p)) - --p; - *(p + 1) = 0; - return s; -} - -inline bool TRobotsTxtParser::IsRobotsLine(const char* s) { - return strchr(s, ':'); -} - -bool TRobotsTxtParser::HasRecord() { - while (!IsRobotsLine(Line.data())) - if (!ReadLine()) - return 0; - return 1; -} - -TRobotsTxtRulesRecord TRobotsTxtParser::NextRecord() { - return TRobotsTxtRulesRecord(*this); -} - -TRobotsTxtRulesRecord::TRobotsTxtRulesRecord(TRobotsTxtParser& parser) - : Parser(parser) -{ -} - -bool TRobotsTxtRulesRecord::NextPair(TString& field, TString& value, bool handleErrors, TVector<int>& nonRobotsLines, bool* wasBlank) { - if (wasBlank) { - *wasBlank = false; - } - while (!Parser.IsRobotsLine(Parser.Line.data())) { - if (!Parser.ReadLine()) - return 0; - if (Parser.IsBlankLine(Parser.Line.data())) { - if (wasBlank) { - *wasBlank = true; - } - continue; - } - if (handleErrors && !Parser.IsRobotsLine(Parser.Line.data())) - nonRobotsLines.push_back(Parser.GetLineNumber()); - } - - char* s = strchr(Parser.Line.begin(), ':'); - *s = 0; - char* p = s + 1; - - field = TRobotsTxtParser::Trim(strlwr(Parser.Line.begin())); - value = TRobotsTxtParser::Trim(p); - return 1; -} diff --git a/library/cpp/robots_txt/robots_txt_parser.h b/library/cpp/robots_txt/robots_txt_parser.h deleted file mode 100644 index 8032d0d20b2..00000000000 --- a/library/cpp/robots_txt/robots_txt_parser.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include <algorithm> -#include <util/generic/string.h> -#include <util/generic/vector.h> -#include <util/stream/input.h> - -class TRobotsTxtParser; - -class TRobotsTxtRulesRecord { -private: - TRobotsTxtParser& Parser; - -public: - TRobotsTxtRulesRecord(TRobotsTxtParser& parser); - bool NextPair(TString& field, TString& value, bool handleErrors, TVector<int>& nonRobotsLines, bool* wasBlank = nullptr); -}; - -class TRobotsTxtParser { - friend class TRobotsTxtRulesRecord; - -private: - IInputStream& InputStream; - TString Line; - int LineNumber; - bool IsLastSymbolCR; - - const char* ReadLine(); - static bool IsBlankLine(const char*); - static bool IsRobotsLine(const char*); - -public: - static char* Trim(char*); - TRobotsTxtParser(IInputStream& inputStream); - bool HasRecord(); - TRobotsTxtRulesRecord NextRecord(); - int GetLineNumber(); -}; diff --git a/library/cpp/robots_txt/robotstxtcfg.h b/library/cpp/robots_txt/robotstxtcfg.h deleted file mode 100644 index 5ca1682a0c7..00000000000 --- a/library/cpp/robots_txt/robotstxtcfg.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include <library/cpp/robots_txt/robotstxtcfg/robotstxtcfg.h> diff --git a/library/cpp/robots_txt/robotstxtcfg/bot_id_set.cpp b/library/cpp/robots_txt/robotstxtcfg/bot_id_set.cpp deleted file mode 100644 index aec668582c5..00000000000 --- a/library/cpp/robots_txt/robotstxtcfg/bot_id_set.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "bot_id_set.h" -// header compile test diff --git a/library/cpp/robots_txt/robotstxtcfg/bot_id_set.h b/library/cpp/robots_txt/robotstxtcfg/bot_id_set.h deleted file mode 100644 index 08aaa68a50e..00000000000 --- a/library/cpp/robots_txt/robotstxtcfg/bot_id_set.h +++ /dev/null @@ -1,132 +0,0 @@ -#pragma once - -#include "user_agents.h" - -#include <bitset> - - -/// Simple vector-based set for bot ids, meant to optimize memory and lookups -class TBotIdSet -{ -public: - using TData = std::bitset<robotstxtcfg::max_botid>; - - constexpr TBotIdSet() noexcept = default; - constexpr TBotIdSet(const TBotIdSet&) noexcept = default; - constexpr TBotIdSet(TBotIdSet&&) noexcept = default; - constexpr TBotIdSet& operator = (const TBotIdSet&) noexcept = default; - constexpr TBotIdSet& operator = (TBotIdSet&&) noexcept = default; - - TBotIdSet(std::initializer_list<ui32> botIds) { - for (auto id : botIds) { - insert(id); - } - } - - static TBotIdSet All() noexcept { - TBotIdSet res; - res.Bots.set(); - return res; - } - - constexpr bool contains(ui32 botId) const noexcept { - return (botId < Bots.size()) && Bots[botId]; - } - - bool insert(ui32 botId) noexcept { - if (botId >= Bots.size() || Bots[botId]) { - return false; - } - Bots[botId] = true; - return true; - } - - bool remove(ui32 botId) noexcept { - if (botId >= Bots.size() || !Bots[botId]) { - return false; - } - Bots[botId] = false; - return true; - } - - void clear() noexcept { - Bots.reset(); - } - - size_t size() const noexcept { - return Bots.count(); - } - - bool empty() const noexcept { - return Bots.none(); - } - - bool operator==(const TBotIdSet& rhs) const noexcept = default; - - TBotIdSet operator&(TBotIdSet rhs) const noexcept { - rhs.Bots &= Bots; - return rhs; - } - - TBotIdSet operator|(TBotIdSet rhs) const noexcept { - rhs.Bots |= Bots; - return rhs; - } - - TBotIdSet operator~() const noexcept { - TBotIdSet result; - result.Bots = ~Bots; - return result; - } - - class iterator - { - public: - auto operator * () const noexcept { - return BotId; - } - - iterator& operator ++ () noexcept { - while (BotId < Bots.size()) { - if (Bots[++BotId]) { - break; - } - } - return *this; - } - - bool operator == (const iterator& rhs) const noexcept { - return (&Bots == &rhs.Bots) && (BotId == rhs.BotId); - } - - bool operator != (const iterator& rhs) const noexcept { - return !(*this == rhs); - } - - private: - friend class TBotIdSet; - iterator(const TData& bots, ui32 botId) - : Bots(bots) - , BotId(botId) - { - while (BotId < Bots.size() && !Bots[BotId]) { - ++BotId; - } - } - - private: - const TData& Bots; - ui32 BotId; - }; - - iterator begin() const noexcept { - return {Bots, robotstxtcfg::id_anybot}; - } - - iterator end() const noexcept { - return {Bots, robotstxtcfg::max_botid}; - } - -private: - TData Bots {}; -}; diff --git a/library/cpp/robots_txt/robotstxtcfg/robotstxtcfg.cpp b/library/cpp/robots_txt/robotstxtcfg/robotstxtcfg.cpp deleted file mode 100644 index c5652b81c53..00000000000 --- a/library/cpp/robots_txt/robotstxtcfg/robotstxtcfg.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "robotstxtcfg.h" -// header compile test diff --git a/library/cpp/robots_txt/robotstxtcfg/robotstxtcfg.h b/library/cpp/robots_txt/robotstxtcfg/robotstxtcfg.h deleted file mode 100644 index 2cf9430d7ce..00000000000 --- a/library/cpp/robots_txt/robotstxtcfg/robotstxtcfg.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include "bot_id_set.h" - - -namespace robotstxtcfg { - -static const TBotIdSet defaultSupportedBotIds = {id_defbot}; -static const TBotIdSet allSupportedBotIds = TBotIdSet::All(); - -} // namespace robotstxtcfg diff --git a/library/cpp/robots_txt/robotstxtcfg/user_agents.cpp b/library/cpp/robots_txt/robotstxtcfg/user_agents.cpp deleted file mode 100644 index 60b353a427a..00000000000 --- a/library/cpp/robots_txt/robotstxtcfg/user_agents.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "user_agents.h" -// header compile test diff --git a/library/cpp/robots_txt/robotstxtcfg/user_agents.h b/library/cpp/robots_txt/robotstxtcfg/user_agents.h deleted file mode 100644 index a56e5b66f45..00000000000 --- a/library/cpp/robots_txt/robotstxtcfg/user_agents.h +++ /dev/null @@ -1,292 +0,0 @@ -#pragma once - -#include <library/cpp/case_insensitive_string/case_insensitive_string.h> - - -namespace robotstxtcfg { - // robots.txt agents and identifiers - - enum EBots : ui32 { - id_anybot = 0, - id_yandexbot = 1, - id_yandexmediabot = 2, - id_yandeximagesbot = 3, - id_googlebot = 4, - id_yandexbotmirr = 5, - id_yahooslurp = 6, - id_msnbot = 7, - id_yandexcatalogbot = 8, - id_yandexdirectbot = 9, - id_yandexblogsbot = 10, - id_yandexnewsbot = 11, - id_yandexpagechk = 12, - id_yandexmetrikabot = 13, - id_yandexbrowser = 14, - id_yandexmarketbot = 15, - id_yandexcalendarbot = 16, - id_yandexwebmasterbot = 17, - id_yandexvideobot = 18, - id_yandeximageresizerbot = 19, - id_yandexadnetbot = 20, - id_yandexpartnerbot = 21, - id_yandexdirectdbot = 22, - id_yandextravelbot = 23, - id_yandexmobilebot = 24, - id_yandexrcabot = 25, - id_yandexdirectdynbot = 26, - id_yandexmobilebot_ed = 27, - id_yandexaccessibilitybot = 28, - id_baidubot = 29, - id_yandexscreenshotbot = 30, - id_yandexmetrikayabs = 31, - id_yandexvideoparserbot = 32, - id_yandexnewsbot4 = 33, - id_yandexmarketbot2 = 34, - id_yandexmedianabot = 35, - id_yandexsearchshopbot = 36, - id_yandexontodbbot = 37, - id_yandexontodbapibot = 38, - id_yandexampbot = 39, - id_yandexvideohosting = 40, - id_yandexmediaselling = 41, - id_yandexverticals = 42, - id_yandexturbobot = 43, - id_yandexzenbot = 44, - id_yandextrackerbot = 45, - id_yandexmetrikabot4 = 46, - id_yandexmobilescreenshotbot = 47, - id_yandexfaviconsbot = 48, - max_botid - }; - - static const ui32 id_defbot = id_yandexbot; - - struct TBotInfo { - TCaseInsensitiveStringBuf ReqPrefix; - TCaseInsensitiveStringBuf FullName; - TStringBuf FromField = {}; - TStringBuf UserAgent = {}; - TStringBuf RotorUserAgent = {}; - bool ExplicitDisallow = false; - }; - - static constexpr TStringBuf UserAgentFrom("support@search.yandex.ru"); - - static constexpr TBotInfo BotInfoArr[] = { - {"*", "*"}, - {"Yandex", "YandexBot/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Yandex", "YandexMedia/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexMedia/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexMedia/3.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Yandex", "YandexImages/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Google", "GoogleBot"}, - {"Yandex", "YandexBot/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexBot/3.0; MirrorDetector; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexBot/3.0; MirrorDetector; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Slurp", "Slurp"}, - {"msn", "msnbot"}, - {"Yandex", "YandexCatalog/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexCatalog/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexCatalog/3.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"YaDirectFetcher", "YaDirectFetcher/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YaDirectFetcher/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YaDirectFetcher/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - - {"Yandex", "YandexBlogs/0.99", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexBlogs/0.99; robot; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexBlogs/0.99; robot; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Yandex", "YandexNews/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexNews/3.0; robot; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexNews/3.0; robot; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Yandex", "YandexPagechecker/2.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexPagechecker/2.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexPagechecker/2.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Yandex", "YandexMetrika/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexMetrika/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexMetrika/3.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Yandex", "YandexBrowser/1.0", UserAgentFrom, - "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/1.0.1084.5402 Chrome/19.0.1084.5409 Safari/536.5", - "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/1.0.1084.5402 Chrome/19.0.1084.5409 Safari/536.5", - false}, - {"Yandex", "YandexMarket/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexMarket/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexMarket/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"YandexCalendar", "YandexCalendar/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexCalendar/1.0 +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexCalendar/1.0 +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"Yandex", "YandexWebmaster/2.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexWebmaster/2.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexWebmaster/2.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Yandex", "YandexVideo/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexVideo/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexVideo/3.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Yandex", "YandexImageResizer/2.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexImageResizer/2.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexImageResizer/2.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - - {"YandexDirect", "YandexDirect/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexDirect/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexDirect/3.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexPartner", "YandexPartner/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexPartner/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexPartner/3.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YaDirectFetcher", "YaDirectFetcher/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YaDirectFetcher/1.0; Dyatel; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YaDirectFetcher/1.0; Dyatel; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"Yandex", "YandexTravel/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexTravel/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexTravel/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"Yandex", "YandexBot/3.0", UserAgentFrom, - "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4 (compatible; YandexBot/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4 (compatible; YandexBot/3.0; +http://yandex.com/bots)", - false}, - {"YandexRCA", "YandexRCA/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexRCA/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexRCA/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexDirectDyn", "YandexDirectDyn/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexDirectDyn/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexDirectDyn/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexMobileBot", "YandexMobileBot/3.0", UserAgentFrom, - "Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1 (compatible; YandexMobileBot/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1 (compatible; YandexMobileBot/3.0; +http://yandex.com/bots)", - true}, - {"YandexAccessibilityBot", "YandexAccessibilityBot/3.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexAccessibilityBot/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexAccessibilityBot/3.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"Baidu", "Baiduspider"}, - - {"YandexScreenshotBot", "YandexScreenshotBot/3.0", UserAgentFrom, - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 (compatible; YandexScreenshotBot/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 (compatible; YandexScreenshotBot/3.0; +http://yandex.com/bots)", - true}, - {"YandexMetrika", "YandexMetrika/2.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexMetrika/2.0; +http://yandex.com/bots yabs01)", - "Mozilla/5.0 (compatible; YandexMetrika/2.0; +http://yandex.com/bots yabs01) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexVideoParser", "YandexVideoParser/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexVideoParser/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexVideoParser/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"Yandex", "YandexNews/4.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexNews/4.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexNews/4.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexMarket", "YandexMarket/2.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexMarket/2.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexMarket/2.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexMedianaBot", "YandexMedianaBot/1.0", UserAgentFrom, - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 (compatible; YandexMedianaBot/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 (compatible; YandexMedianaBot/1.0; +http://yandex.com/bots)", - true}, - {"YandexSearchShop", "YandexSearchShop/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexSearchShop/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexSearchShop/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"Yandex", "YandexOntoDB/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexOntoDB/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexOntoDB/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - false}, - {"YandexOntoDBAPI", "YandexOntoDBAPI/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexOntoDBAPI/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexOntoDBAPI/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"Yandex-AMPHTML", "Yandex-AMPHTML", UserAgentFrom, - "Mozilla/5.0 (compatible; Yandex-AMPHTML; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; Yandex-AMPHTML; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - - {"YandexVideoHosting", "YandexVideoHosting/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexVideoHosting/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexVideoHosting/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexMediaSelling", "YandexMediaSelling/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexMediaSelling/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexMediaSelling/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexVerticals", "YandexVerticals/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexVerticals/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexVerticals/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexTurbo", "YandexTurbo/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexTurbo/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexTurbo/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexZenRss", "YandexZenRss/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexZenRss/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexZenRss/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexTracker", "YandexTracker/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexTracker/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexTracker/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexMetrika", "YandexMetrika/4.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexMetrika/4.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexMetrika/4.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}, - {"YandexMobileScreenShotBot", "YandexMobileScreenShotBot/1.0", UserAgentFrom, - "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/11.0 Mobile/12B411 Safari/600.1.4 (compatible; YandexBot/3.0; +http://yandex.com/bots)", - "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/11.0 Mobile/12B411 Safari/600.1.4 (compatible; YandexBot/3.0; +http://yandex.com/bots)", - true}, - {"YandexFavicons", "YandexFavicons/1.0", UserAgentFrom, - "Mozilla/5.0 (compatible; YandexFavicons/1.0; +http://yandex.com/bots)", - "Mozilla/5.0 (compatible; YandexFavicons/1.0; +http://yandex.com/bots) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.268", - true}}; - - static_assert(std::size(BotInfoArr) == max_botid); - - constexpr auto GetReqPrefix(ui32 botId) { - return BotInfoArr[botId].ReqPrefix; - } - - constexpr auto GetFullName(ui32 botId) { - return BotInfoArr[botId].FullName; - } - - constexpr auto GetFromField(ui32 botId) { - return BotInfoArr[botId].FromField; - } - - constexpr auto GetUserAgent(ui32 botId) { - return BotInfoArr[botId].UserAgent; - } - - constexpr auto GetRotorUserAgent(ui32 botId) { - return BotInfoArr[botId].RotorUserAgent; - } - - constexpr bool IsExplicitDisallow(ui32 botId) { - return BotInfoArr[botId].ExplicitDisallow; - } - - constexpr bool IsYandexBotId(ui32 botId) { - return !BotInfoArr[botId].UserAgent.empty(); - } - -} // namespace robotstxtcfg diff --git a/library/cpp/robots_txt/rules_handler.cpp b/library/cpp/robots_txt/rules_handler.cpp deleted file mode 100644 index 14f68109481..00000000000 --- a/library/cpp/robots_txt/rules_handler.cpp +++ /dev/null @@ -1,514 +0,0 @@ -#include "robots_txt.h" -#include "constants.h" - -#include <library/cpp/uri/http_url.h> -#include <library/cpp/charset/ci_string.h> -#include <library/cpp/string_utils/url/url.h> -#include <util/system/maxlen.h> -#include <util/generic/yexception.h> -#include <util/generic/algorithm.h> - - -namespace { - -TBotIdSet ConvertBotIdSet(const TSet<ui32>& botIds) noexcept { - TBotIdSet result; - for (auto id : botIds) { - result.insert(id); - } - return result; -} - -} // namespace - -TRobotsTxtRulesIterator::TRobotsTxtRulesIterator(const char* begin, const char* end) - : Begin(begin) - , End(end) -{ -} - -void TRobotsTxtRulesIterator::Next() { - while (Begin < End && *Begin) - ++Begin; - while (Begin < End && !isalpha(*Begin)) - ++Begin; -} - -bool TRobotsTxtRulesIterator::HasRule() const { - return Begin < End; -} - -const char* TRobotsTxtRulesIterator::GetRule() const { - return Begin + 1; -} - -TString TRobotsTxtRulesIterator::GetInitialRule() const { - auto begin = Begin + 1; - TStringBuf rule(begin, strlen(begin)); - - switch (*Begin) { - case 'a': - case 'd': - return rule.EndsWith('*') ? TString(rule.Chop(1)) : TString::Join(rule, '$'); - default: - return TString(rule); - } -} - -EDirectiveType TRobotsTxtRulesIterator::GetRuleType() const { - return CharToDirType(*Begin); -} - -EDirectiveType TRobotsTxtRulesIterator::CharToDirType(char ch) { - switch (toupper(ch)) { - case 'A': - return ALLOW; - case 'C': - return CRAWL_DELAY; - case 'D': - return DISALLOW; - case 'H': - return HOST; - case 'P': - return CLEAN_PARAM; - case 'S': - return SITEMAP; - } - return UNKNOWN; -} - -TRobotsTxtRulesHandlerBase::TRobotsTxtRulesHandlerBase( - TBotIdSet supportedBotIds, - int robotsMaxSize, - int maxRulesNumber, - bool saveDataForAnyBot) - : HandleErrors(false) - , SiteMaps() - , CleanParams() - , HostDirective("") - , Errors() - , AcceptedLines() - , CrossSectionAcceptedLines() - , BotIdToInfo(robotstxtcfg::max_botid) - , RobotsMaxSize(robotsMaxSize) - , MaxRulesNumber(maxRulesNumber) - , SaveDataForAnyBot(saveDataForAnyBot) - , SupportedBotIds(supportedBotIds) -{ - Y_ENSURE(!supportedBotIds.empty()); - - if (RobotsMaxSize <= 0) - RobotsMaxSize = robots_max; - if (MaxRulesNumber <= 0) - MaxRulesNumber = max_rules_count; - - ResetOptimized(); -} - -TRobotsTxtRulesHandlerBase::TRobotsTxtRulesHandlerBase( - const TSet<ui32>& supportedBotIds, - int robotsMaxSize, - int maxRulesNumber, - bool saveDataForAnyBot) - : TRobotsTxtRulesHandlerBase(ConvertBotIdSet(supportedBotIds), robotsMaxSize, maxRulesNumber, saveDataForAnyBot) -{} - -TRobotsTxtRulesHandlerBase::~TRobotsTxtRulesHandlerBase() = default; - -void TRobotsTxtRulesHandlerBase::CheckBotIdValidity(const ui32 botId) const { - if (botId >= robotstxtcfg::max_botid || !IsBotIdSupported(botId)) - ythrow yexception() << "robots.txt parser requested for invalid or unsupported botId = " << botId << Endl; - ; -} - -int TRobotsTxtRulesHandlerBase::GetCrawlDelay(const ui32 botId, bool* realInfo) const { - const auto id = GetMappedBotId(botId, false); - if (realInfo) - *realInfo = bool(id); - return BotIdToInfo[id.GetOrElse(robotstxtcfg::id_anybot)].CrawlDelay; -} - -int TRobotsTxtRulesHandlerBase::GetMinCrawlDelay(int defaultCrawlDelay) const { - int res = INT_MAX; - bool useDefault = false; - for (ui32 botId = 0; botId < robotstxtcfg::max_botid; ++botId) { - if (robotstxtcfg::IsYandexBotId(botId) && IsBotIdSupported(botId) && !IsDisallowAll(botId)) { - bool realInfo; - int curCrawlDelay = GetCrawlDelay(botId, &realInfo); - if (realInfo) { - if (curCrawlDelay == -1) { - useDefault = true; - } else { - res = Min(res, curCrawlDelay); - } - } - } - } - - if (useDefault && defaultCrawlDelay < res) { - return -1; - } - - if (res == INT_MAX) { - res = GetCrawlDelay(robotstxtcfg::id_anybot); - } - - return res; -} - -void TRobotsTxtRulesHandlerBase::SetCrawlDelay(const ui32 botId, int crawlDelay) { - CheckBotIdValidity(botId); - BotIdToInfo[botId].CrawlDelay = crawlDelay; -} - -const TVector<TString> TRobotsTxtRulesHandlerBase::GetSiteMaps() const { - return TVector<TString>(SiteMaps.begin(), SiteMaps.end()); -} - -void TRobotsTxtRulesHandlerBase::AddSiteMap(const char* sitemap) { - SiteMaps.insert(sitemap); -} - -const TVector<TString> TRobotsTxtRulesHandlerBase::GetCleanParams() const { - return TVector<TString>(CleanParams.begin(), CleanParams.end()); -} - -void TRobotsTxtRulesHandlerBase::AddCleanParam(const char* cleanParam) { - CleanParams.insert(cleanParam); -} - -const TString& TRobotsTxtRulesHandlerBase::GetHostDirective() const { - return HostDirective; -} - -void TRobotsTxtRulesHandlerBase::SetHostDirective(const char* hostDirective) { - HostDirective = hostDirective; -} - -const TRobotsTxtRulesHandlerBase::TErrorVector& TRobotsTxtRulesHandlerBase::GetErrors() const { - return Errors; -} - -TVector<int> TRobotsTxtRulesHandlerBase::GetAcceptedLines(const ui32 botId) const { - TVector<int> ret; - for (size_t i = 0; i < CrossSectionAcceptedLines.size(); ++i) - ret.push_back(CrossSectionAcceptedLines[i]); - - bool hasLinesForBotId = false; - for (size_t i = 0; i < AcceptedLines.size(); ++i) { - if (AcceptedLines[i].first == botId) { - hasLinesForBotId = true; - break; - } - } - - for (size_t i = 0; i < AcceptedLines.size(); ++i) { - if (hasLinesForBotId && AcceptedLines[i].first == botId) { - ret.push_back(AcceptedLines[i].second); - } else if (!hasLinesForBotId && AcceptedLines[i].first == robotstxtcfg::id_anybot) { - ret.push_back(AcceptedLines[i].second); - } - } - - Sort(ret.begin(), ret.end()); - - return ret; -} - -void TRobotsTxtRulesHandlerBase::AddAcceptedLine(ui32 line, const TBotIdSet& botIds, bool isCrossSection) { - if (isCrossSection) { - CrossSectionAcceptedLines.push_back(line); - return; - } - - for (auto botId : botIds) { - AcceptedLines.push_back(TBotIdAcceptedLine(botId, line)); - } -} - -void TRobotsTxtRulesHandlerBase::SetErrorsHandling(bool handleErrors) { - HandleErrors = handleErrors; -} - -bool TRobotsTxtRulesHandlerBase::IsHandlingErrors() const { - return HandleErrors; -} - -EDirectiveType TRobotsTxtRulesHandlerBase::NameToDirType(const char* d) { - if (!strcmp("disallow", d)) - return DISALLOW; - if (!strcmp("allow", d)) - return ALLOW; - if (!strcmp("user-agent", d)) - return USER_AGENT; - if (!strcmp("host", d)) - return HOST; - if (!strcmp("sitemap", d)) - return SITEMAP; - if (!strcmp("clean-param", d)) - return CLEAN_PARAM; - if (!strcmp("crawl-delay", d)) - return CRAWL_DELAY; - return UNKNOWN; -}; - -const char* TRobotsTxtRulesHandlerBase::DirTypeToName(EDirectiveType t) { - static const char* name[] = {"Allow", "Crawl-Delay", "Disallow", "Host", "Clean-Param", "Sitemap", "User-Agent", "Unknown"}; - switch (t) { - case ALLOW: - return name[0]; - case CRAWL_DELAY: - return name[1]; - case DISALLOW: - return name[2]; - case HOST: - return name[3]; - case CLEAN_PARAM: - return name[4]; - case SITEMAP: - return name[5]; - case USER_AGENT: - return name[6]; - case UNKNOWN: - return name[7]; - } - return name[7]; -}; - -bool TRobotsTxtRulesHandlerBase::CheckRobot( - const char* userAgent, - TBotIdSet& botIds, - const TVector<ui32>* botIdToMaxAppropriateUserAgentNameLength) const -{ - TCaseInsensitiveStringBuf agent(userAgent); - - for (size_t botIndex = 0; botIndex < robotstxtcfg::max_botid; ++botIndex) { - if (!IsBotIdSupported(botIndex)) - continue; - - bool hasRequiredAgentNamePrefix = agent.StartsWith(robotstxtcfg::GetReqPrefix(botIndex)); - bool isContainedInFullName = robotstxtcfg::GetFullName(botIndex).StartsWith(agent); - bool wasMoreImportantAgent = false; - if (botIdToMaxAppropriateUserAgentNameLength) - wasMoreImportantAgent = agent.size() < (*botIdToMaxAppropriateUserAgentNameLength)[botIndex]; - - if (hasRequiredAgentNamePrefix && isContainedInFullName && !wasMoreImportantAgent) { - botIds.insert(botIndex); - } - } - - return !botIds.empty(); -} - -int TRobotsTxtRulesHandlerBase::CheckRule(const char* value, int line, TRobotsTxtRulesHandlerBase* rulesHandler) { - if (!rulesHandler->IsHandlingErrors()) - return 0; - - if (auto len = strlen(value); len > max_rule_length) { - rulesHandler->AddError(ERROR_RULE_HUGE, line); - } - - bool upper = false, suspect = false; - for (const char* r = value; *r; ++r) { - if (!upper && isupper(*r)) - upper = true; - if (!suspect && !isalnum(*r) && !strchr("/_?=.-*%&~[]:;@", *r) && (*(r + 1) || *r != '$')) - suspect = true; - } - if (suspect) - rulesHandler->AddError(WARNING_SUSPECT_SYMBOL, line); - if (upper) - rulesHandler->AddError(WARNING_UPPER_REGISTER, line); - return suspect || upper; -} - -void TRobotsTxtRulesHandlerBase::AddError(EFormatErrorType type, int line) { - if (!HandleErrors) - return; - Errors.push_back(std::make_pair(type, line)); -} - -void TRobotsTxtRulesHandlerBase::ResetOptimized() noexcept { - for (ui32 i = 0; i < OptimizedBotIdToStoredBotId.size(); ++i) { - OptimizedBotIdToStoredBotId[i] = i; // by default, every bot maps to itself - } -} - -void TRobotsTxtRulesHandlerBase::Clear() { - SiteMaps.clear(); - CleanParams.clear(); - HostDirective = ""; - if (HandleErrors) { - AcceptedLines.clear(); - CrossSectionAcceptedLines.clear(); - Errors.clear(); - } - - for (size_t botId = 0; botId < BotIdToInfo.size(); ++botId) { - BotIdToInfo[botId].CrawlDelay = -1; - } - - LoadedBotIds.clear(); -} - -void TRobotsTxtRulesHandlerBase::ClearInternal(const ui32 botId) { - CheckBotIdValidity(botId); - BotIdToInfo[botId].CrawlDelay = -1; - - TVector<TBotIdAcceptedLine> newAcceptedLines; - for (size_t i = 0; i < AcceptedLines.size(); ++i) - if (AcceptedLines[i].first != botId) - newAcceptedLines.push_back(AcceptedLines[i]); - - AcceptedLines.swap(newAcceptedLines); -} - -int TRobotsTxtRulesHandlerBase::CheckHost(const char* host) { - THttpURL parsed; - TString copyHost = host; - - if (GetHttpPrefixSize(copyHost) == 0) { - copyHost = TString("http://") + copyHost; - } - - return parsed.Parse(copyHost.data(), THttpURL::FeaturesRobot) == THttpURL::ParsedOK && parsed.GetField(THttpURL::FieldHost) != TString(""); -} - -int TRobotsTxtRulesHandlerBase::CheckSitemapUrl(const char* url, const char* host, TString& modifiedUrl) { - if (host != nullptr && strlen(url) > 0 && url[0] == '/') { - modifiedUrl = TString(host) + url; - } else { - modifiedUrl = url; - } - - url = modifiedUrl.data(); - - if (strlen(url) >= URL_MAX - 8) - return 0; - THttpURL parsed; - if (parsed.Parse(url, THttpURL::FeaturesRobot) || !parsed.IsValidAbs()) - return 0; - if (parsed.GetScheme() != THttpURL::SchemeHTTP && parsed.GetScheme() != THttpURL::SchemeHTTPS) - return 0; - return CheckHost(parsed.PrintS(THttpURL::FlagHostPort).data()); -} - -// s - is space separated pair of clean-params (separated by &) and path prefix -int TRobotsTxtRulesHandlerBase::CheckAndNormCleanParam(TString& value) { - if (value.find(' ') == TString::npos) { - value.push_back(' '); - } - - const char* s = value.data(); - if (!s || !*s || strlen(s) > URL_MAX / 2 - 9) - return 0; - const char* p = s; - while (*p && !isspace(*p)) - ++p; - for (; s != p; ++s) { - // allowed only following not alpha-numerical symbols - if (!isalnum(*s) && !strchr("+-=_&%[]{}():.", *s)) - return 0; - // clean-params for prefix can be enumerated by & symbol, && not allowed syntax - if (*s == '&' && *(s + 1) == '&') - return 0; - } - const char* pathPrefix = p + 1; - while (isspace(*p)) - ++p; - char r[URL_MAX]; - char* pr = r; - for (; *p; ++p) { - if (!isalnum(*p) && !strchr(".-/*_,;:%", *p)) - return 0; - if (*p == '*') - *pr++ = '.'; - if (*p == '.') - *pr++ = '\\'; - *pr++ = *p; - } - *pr++ = '.'; - *pr++ = '*'; - *pr = 0; - TString params = value.substr(0, pathPrefix - value.data()); - value = params + r; - return 1; -} - -int TRobotsTxtRulesHandlerBase::ParseCrawlDelay(const char* value, int& crawlDelay) { - static const int MAX_CRAWL_DELAY = 1 << 10; - int val = 0; - const char* p = value; - for (; isdigit(*p); ++p) { - val = val * 10 + *p - '0'; - if (val > MAX_CRAWL_DELAY) - return 0; - } - if (*p) { - if (*p++ != '.') - return 0; - if (strspn(p, "1234567890") != strlen(p)) - return 0; - } - for (const char* s = p; s - p < 3; ++s) - val = val * 10 + (s < p + strlen(p) ? *s - '0' : 0); - crawlDelay = val; - return 1; -} - -bool TRobotsTxtRulesHandlerBase::AddRuleWithErrorCheck(const ui32 botId, TStringBuf rule, char type, TRobotsTxtParser& parser) { - if (!IsBotIdSupported(botId)) - return true; - - if (!AddRule(botId, rule, type)) { - AddError(ERROR_ROBOTS_HUGE, parser.GetLineNumber()); - AfterParse(botId); - return false; - } - return true; -} - -int TRobotsTxtRulesHandlerBase::OnHost(const ui32 botId, TRobotsTxtParser& parser, const char* value, TRobotsTxtRulesHandlerBase*& rulesHandler) { - // Temporary hack for correct repacking robots.txt from new format to old - // Remove it, when robot-stable-2010-10-17 will be deployed in production - if (!IsBotIdSupported(botId)) - return 0; - // end of hack - - if (rulesHandler->HostDirective != "") - rulesHandler->AddError(ERROR_HOST_MULTI, parser.GetLineNumber()); - else { - if (!CheckHost(value)) - rulesHandler->AddError(ERROR_HOST_FORMAT, parser.GetLineNumber()); - else { - rulesHandler->SetHostDirective(value); - if (!rulesHandler->AddRuleWithErrorCheck(botId, value, 'H', parser)) - return 2; - } - } - return 0; -} - -bool TRobotsTxtRulesHandlerBase::IsBotIdLoaded(const ui32 botId) const { - return LoadedBotIds.contains(botId); -} - -bool TRobotsTxtRulesHandlerBase::IsBotIdSupported(const ui32 botId) const { - return (SaveDataForAnyBot && botId == robotstxtcfg::id_anybot) || SupportedBotIds.contains(botId); -} - -ui32 TRobotsTxtRulesHandlerBase::GetNotOptimizedBotId(const ui32 botId) const { - return (botId < OptimizedBotIdToStoredBotId.size()) - ? OptimizedBotIdToStoredBotId[botId] - : botId; -} - -TMaybe<ui32> TRobotsTxtRulesHandlerBase::GetMappedBotId(ui32 botId, bool useAny) const { - botId = GetNotOptimizedBotId(botId); - CheckBotIdValidity(botId); - if (IsBotIdLoaded(botId)) - return botId; - if (useAny) - return robotstxtcfg::id_anybot; - return {}; -} diff --git a/library/cpp/skiff/public.h b/library/cpp/skiff/public.h deleted file mode 100644 index 127c0f2efc8..00000000000 --- a/library/cpp/skiff/public.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -#include <vector> -#include <memory> - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -enum class EWireType -{ - Nothing /* "nothing" */, - Int8 /* "int8" */, - Int16 /* "int16" */, - Int32 /* "int32" */, - Int64 /* "int64" */, - Int128 /* "int128" */, - Uint8 /* "uint8" */, - Uint16 /* "uint16" */, - Uint32 /* "uint32" */, - Uint64 /* "uint64" */, - Uint128 /* "uint128" */, - Double /* "double" */, - Boolean /* "boolean" */, - String32 /* "string32" */, - Yson32 /* "yson32" */, - - Tuple /* "tuple" */, - Variant8 /* "variant8" */, - Variant16 /* "variant16" */, - RepeatedVariant8 /* "repeated_variant8" */, - RepeatedVariant16 /* "repeated_variant16" */, -}; - -//////////////////////////////////////////////////////////////////////////////// - -class TSkiffSchema; -using TSkiffSchemaList = std::vector<std::shared_ptr<TSkiffSchema>>; - -class TSkiffValidator; - -class TUncheckedSkiffParser; -class TCheckedSkiffParser; - -class TUncheckedSkiffWriter; -class TCheckedSkiffWriter; - -#ifdef DEBUG -using TCheckedInDebugSkiffParser = TCheckedSkiffParser; -using TCheckedInDebugSkiffWriter = TCheckedSkiffWriter; -#else -using TCheckedInDebugSkiffParser = TUncheckedSkiffParser; -using TCheckedInDebugSkiffWriter = TUncheckedSkiffWriter; -#endif - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NSkiff diff --git a/library/cpp/skiff/skiff-inl.h b/library/cpp/skiff/skiff-inl.h deleted file mode 100644 index a3f68a93745..00000000000 --- a/library/cpp/skiff/skiff-inl.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#ifndef SKIFF_H -#error "Direct inclusion of this file is not allowed, include skiff.h" -// For the sake of sane code completion. -#include "skiff.h" -#endif -#undef SKIFF_H - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -template <EWireType wireType> -constexpr auto TUnderlyingIntegerType<wireType>::F() { - if constexpr (wireType == EWireType::Int8) { - return i8{}; - } else if constexpr (wireType == EWireType::Int16) { - return i16{}; - } else if constexpr (wireType == EWireType::Int32) { - return i32{}; - } else if constexpr (wireType == EWireType::Int64) { - return i64{}; - } else if constexpr (wireType == EWireType::Uint8) { - return ui8{}; - } else if constexpr (wireType == EWireType::Uint16) { - return ui16{}; - } else if constexpr (wireType == EWireType::Uint32) { - return ui32{}; - } else if constexpr (wireType == EWireType::Uint64) { - return ui64{}; - } else { - static_assert(wireType == EWireType::Int8, "expected integer wire type"); - } -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NSkiff diff --git a/library/cpp/skiff/skiff.cpp b/library/cpp/skiff/skiff.cpp deleted file mode 100644 index cbdbdfe3649..00000000000 --- a/library/cpp/skiff/skiff.cpp +++ /dev/null @@ -1,591 +0,0 @@ -#include "skiff.h" - -#include "skiff_validator.h" - -#include <util/stream/buffered.h> -#include <util/system/byteorder.h> -#include <util/system/unaligned_mem.h> - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -bool operator==(TInt128 lhs, TInt128 rhs) -{ - return lhs.Low == rhs.Low && lhs.High == rhs.High; -} - -bool operator!=(TInt128 lhs, TInt128 rhs) -{ - return !(lhs == rhs); -} - -bool operator==(TUint128 lhs, TUint128 rhs) -{ - return lhs.Low == rhs.Low && lhs.High == rhs.High; -} - -bool operator!=(TUint128 lhs, TUint128 rhs) -{ - return !(lhs == rhs); -} - -//////////////////////////////////////////////////////////////////////////////// - -TUncheckedSkiffParser::TUncheckedSkiffParser(IZeroCopyInput* underlying) - : Underlying_(underlying) - , Buffer_(512 * 1024) -{ } - -TUncheckedSkiffParser::TUncheckedSkiffParser(const std::shared_ptr<TSkiffSchema>& /*schema*/, IZeroCopyInput* underlying) - : TUncheckedSkiffParser(underlying) -{ } - -i8 TUncheckedSkiffParser::ParseInt8() -{ - return ParseSimple<i8>(); -} - -i16 TUncheckedSkiffParser::ParseInt16() -{ - return ParseSimple<i16>(); -} - -i32 TUncheckedSkiffParser::ParseInt32() -{ - return ParseSimple<i32>(); -} - -i64 TUncheckedSkiffParser::ParseInt64() -{ - return ParseSimple<i64>(); -} - -ui8 TUncheckedSkiffParser::ParseUint8() -{ - return ParseSimple<ui8>(); -} - -ui16 TUncheckedSkiffParser::ParseUint16() -{ - return ParseSimple<ui16>(); -} - -ui32 TUncheckedSkiffParser::ParseUint32() -{ - return ParseSimple<ui32>(); -} - -ui64 TUncheckedSkiffParser::ParseUint64() -{ - return ParseSimple<ui64>(); -} - -TInt128 TUncheckedSkiffParser::ParseInt128() -{ - auto low = ParseSimple<ui64>(); - auto high = ParseSimple<i64>(); - return {low, high}; -} - -TUint128 TUncheckedSkiffParser::ParseUint128() -{ - auto low = ParseSimple<ui64>(); - auto high = ParseSimple<ui64>(); - return {low, high}; -} - -double TUncheckedSkiffParser::ParseDouble() -{ - return ParseSimple<double>(); -} - -bool TUncheckedSkiffParser::ParseBoolean() -{ - ui8 result = ParseSimple<ui8>(); - if (result > 1) { - ythrow TSkiffException() << "Invalid boolean value \"" << result << "\""; - } - return result; -} - -TStringBuf TUncheckedSkiffParser::ParseString32() -{ - ui32 len = ParseSimple<ui32>(); - const void* data = GetData(len); - return TStringBuf(static_cast<const char*>(data), len); -} - -TStringBuf TUncheckedSkiffParser::ParseYson32() -{ - return ParseString32(); -} - -ui8 TUncheckedSkiffParser::ParseVariant8Tag() -{ - return ParseSimple<ui8>(); -} - -ui16 TUncheckedSkiffParser::ParseVariant16Tag() -{ - return ParseSimple<ui16>(); -} - -template <typename T> -T TUncheckedSkiffParser::ParseSimple() -{ - return ReadUnaligned<T>(GetData(sizeof(T))); -} - -const void* TUncheckedSkiffParser::GetData(size_t size) -{ - if (RemainingBytes() >= size) { - const void* result = Position_; - Advance(size); - return result; - } - - return GetDataViaBuffer(size); -} - -const void* TUncheckedSkiffParser::GetDataViaBuffer(size_t size) -{ - Buffer_.Clear(); - Buffer_.Reserve(size); - while (Buffer_.Size() < size) { - size_t toCopy = Min(size - Buffer_.Size(), RemainingBytes()); - Buffer_.Append(Position_, toCopy); - Advance(toCopy); - - if (RemainingBytes() == 0) { - RefillBuffer(); - if (Exhausted_ && Buffer_.Size() < size) { - ythrow TSkiffException() << "Premature end of stream while parsing Skiff"; - } - } - } - return Buffer_.Data(); -} - -size_t TUncheckedSkiffParser::RemainingBytes() const -{ - Y_ASSERT(End_ >= Position_); - return End_ - Position_; -} - -void TUncheckedSkiffParser::Advance(size_t size) -{ - Y_ASSERT(size <= RemainingBytes()); - Position_ += size; - ReadBytesCount_ += size; -} - -void TUncheckedSkiffParser::RefillBuffer() -{ - size_t bufferSize = Underlying_->Next(&Position_); - End_ = Position_ + bufferSize; - if (bufferSize == 0) { - Exhausted_ = true; - } -} - -bool TUncheckedSkiffParser::HasMoreData() -{ - if (RemainingBytes() == 0 && !Exhausted_) { - RefillBuffer(); - } - return !(RemainingBytes() == 0 && Exhausted_); -} - -void TUncheckedSkiffParser::ValidateFinished() -{ } - -ui64 TUncheckedSkiffParser::GetReadBytesCount() const -{ - return ReadBytesCount_; -} - -//////////////////////////////////////////////////////////////////////////////// - -TCheckedSkiffParser::TCheckedSkiffParser(const std::shared_ptr<TSkiffSchema>& schema, IZeroCopyInput* stream) - : Parser_(stream) - , Validator_(std::make_unique<TSkiffValidator>(schema)) -{ } - -TCheckedSkiffParser::~TCheckedSkiffParser() = default; - -i8 TCheckedSkiffParser::ParseInt8() -{ - Validator_->OnSimpleType(EWireType::Int8); - return Parser_.ParseInt8(); -} - -i16 TCheckedSkiffParser::ParseInt16() -{ - Validator_->OnSimpleType(EWireType::Int16); - return Parser_.ParseInt16(); -} - -i32 TCheckedSkiffParser::ParseInt32() -{ - Validator_->OnSimpleType(EWireType::Int32); - return Parser_.ParseInt32(); -} - -i64 TCheckedSkiffParser::ParseInt64() -{ - Validator_->OnSimpleType(EWireType::Int64); - return Parser_.ParseInt64(); -} - -ui8 TCheckedSkiffParser::ParseUint8() -{ - Validator_->OnSimpleType(EWireType::Uint8); - return Parser_.ParseUint8(); -} - -ui16 TCheckedSkiffParser::ParseUint16() -{ - Validator_->OnSimpleType(EWireType::Uint16); - return Parser_.ParseUint16(); -} - -ui32 TCheckedSkiffParser::ParseUint32() -{ - Validator_->OnSimpleType(EWireType::Uint32); - return Parser_.ParseUint32(); -} - -ui64 TCheckedSkiffParser::ParseUint64() -{ - Validator_->OnSimpleType(EWireType::Uint64); - return Parser_.ParseUint64(); -} - -TInt128 TCheckedSkiffParser::ParseInt128() -{ - Validator_->OnSimpleType(EWireType::Int128); - return Parser_.ParseInt128(); -} - -TUint128 TCheckedSkiffParser::ParseUint128() -{ - Validator_->OnSimpleType(EWireType::Uint128); - return Parser_.ParseUint128(); -} - -double TCheckedSkiffParser::ParseDouble() -{ - Validator_->OnSimpleType(EWireType::Double); - return Parser_.ParseDouble(); -} - -bool TCheckedSkiffParser::ParseBoolean() -{ - Validator_->OnSimpleType(EWireType::Boolean); - return Parser_.ParseBoolean(); -} - -TStringBuf TCheckedSkiffParser::ParseString32() -{ - Validator_->OnSimpleType(EWireType::String32); - return Parser_.ParseString32(); -} - -TStringBuf TCheckedSkiffParser::ParseYson32() -{ - Validator_->OnSimpleType(EWireType::Yson32); - return Parser_.ParseYson32(); -} - -ui8 TCheckedSkiffParser::ParseVariant8Tag() -{ - Validator_->BeforeVariant8Tag(); - auto result = Parser_.ParseVariant8Tag(); - Validator_->OnVariant8Tag(result); - return result; -} - -ui16 TCheckedSkiffParser::ParseVariant16Tag() -{ - Validator_->BeforeVariant16Tag(); - auto result = Parser_.ParseVariant16Tag(); - Validator_->OnVariant16Tag(result); - return result; -} - -bool TCheckedSkiffParser::HasMoreData() -{ - return Parser_.HasMoreData(); -} - -void TCheckedSkiffParser::ValidateFinished() -{ - Validator_->ValidateFinished(); - Parser_.ValidateFinished(); -} - -ui64 TCheckedSkiffParser::GetReadBytesCount() const -{ - return Parser_.GetReadBytesCount(); -} - -//////////////////////////////////////////////////////////////////////////////// - -TUncheckedSkiffWriter::TUncheckedSkiffWriter(IZeroCopyOutput* underlying) - : Underlying_(underlying) -{ } - -TUncheckedSkiffWriter::TUncheckedSkiffWriter(IOutputStream* underlying) - : BufferedOutput_(MakeHolder<TBufferedOutput>(underlying)) - , Underlying_(BufferedOutput_.Get()) -{ } - -TUncheckedSkiffWriter::TUncheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& /*schema*/, IZeroCopyOutput* underlying) - : TUncheckedSkiffWriter(underlying) -{ } - -TUncheckedSkiffWriter::TUncheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& /*schema*/, IOutputStream* underlying) - : TUncheckedSkiffWriter(underlying) -{ } - -TUncheckedSkiffWriter::~TUncheckedSkiffWriter() -{ - try { - Flush(); - } catch (...) { - } -} - -void TUncheckedSkiffWriter::WriteInt8(i8 value) -{ - WriteSimple<i8>(value); -} - -void TUncheckedSkiffWriter::WriteInt16(i16 value) -{ - WriteSimple<i16>(value); -} - -void TUncheckedSkiffWriter::WriteInt32(i32 value) -{ - WriteSimple<i32>(value); -} - -void TUncheckedSkiffWriter::WriteInt64(i64 value) -{ - WriteSimple<i64>(value); -} - -void TUncheckedSkiffWriter::WriteInt128(TInt128 value) -{ - WriteSimple<ui64>(value.Low); - WriteSimple<i64>(value.High); -} - -void TUncheckedSkiffWriter::WriteUint128(TUint128 value) -{ - WriteSimple<ui64>(value.Low); - WriteSimple<ui64>(value.High); -} - -void TUncheckedSkiffWriter::WriteUint8(ui8 value) -{ - WriteSimple<ui8>(value); -} - -void TUncheckedSkiffWriter::WriteUint16(ui16 value) -{ - WriteSimple<ui16>(value); -} - -void TUncheckedSkiffWriter::WriteUint32(ui32 value) -{ - WriteSimple<ui32>(value); -} - -void TUncheckedSkiffWriter::WriteUint64(ui64 value) -{ - WriteSimple<ui64>(value); -} - -void TUncheckedSkiffWriter::WriteDouble(double value) -{ - return WriteSimple<double>(value); -} - -void TUncheckedSkiffWriter::WriteBoolean(bool value) -{ - return WriteSimple<ui8>(value ? 1 : 0); -} - -void TUncheckedSkiffWriter::WriteString32(TStringBuf value) -{ - WriteSimple<ui32>(value.size()); - Underlying_.Write(value.data(), value.size()); -} - -void TUncheckedSkiffWriter::WriteYson32(TStringBuf value) -{ - WriteSimple<ui32>(value.size()); - Underlying_.Write(value.data(), value.size()); -} - -void TUncheckedSkiffWriter::WriteVariant8Tag(ui8 tag) -{ - WriteSimple<ui8>(tag); -} - -void TUncheckedSkiffWriter::WriteVariant16Tag(ui16 tag) -{ - WriteSimple<ui16>(tag); -} - -void TUncheckedSkiffWriter::Flush() -{ - Underlying_.UndoRemaining(); - if (BufferedOutput_) { - BufferedOutput_->Flush(); - } -} - -template <typename T> -Y_FORCE_INLINE void TUncheckedSkiffWriter::WriteSimple(T value) -{ - if constexpr (std::is_integral_v<T>) { - value = HostToLittle(value); - Underlying_.Write(&value, sizeof(T)); - } else { - Underlying_.Write(&value, sizeof(T)); - } -} - -void TUncheckedSkiffWriter::Finish() -{ - Flush(); -} - -//////////////////////////////////////////////////////////////////////////////// - -TCheckedSkiffWriter::TCheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& schema, IZeroCopyOutput* underlying) - : Writer_(underlying) - , Validator_(std::make_unique<TSkiffValidator>(schema)) -{ } - -TCheckedSkiffWriter::TCheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& schema, IOutputStream* underlying) - : Writer_(underlying) - , Validator_(std::make_unique<TSkiffValidator>(schema)) -{ } - -TCheckedSkiffWriter::~TCheckedSkiffWriter() = default; - -void TCheckedSkiffWriter::WriteDouble(double value) -{ - Validator_->OnSimpleType(EWireType::Double); - Writer_.WriteDouble(value); -} - -void TCheckedSkiffWriter::WriteBoolean(bool value) -{ - Validator_->OnSimpleType(EWireType::Boolean); - Writer_.WriteBoolean(value); -} - -void TCheckedSkiffWriter::WriteInt8(i8 value) -{ - Validator_->OnSimpleType(EWireType::Int8); - Writer_.WriteInt8(value); -} - -void TCheckedSkiffWriter::WriteInt16(i16 value) -{ - Validator_->OnSimpleType(EWireType::Int16); - Writer_.WriteInt16(value); -} - -void TCheckedSkiffWriter::WriteInt32(i32 value) -{ - Validator_->OnSimpleType(EWireType::Int32); - Writer_.WriteInt32(value); -} - -void TCheckedSkiffWriter::WriteInt64(i64 value) -{ - Validator_->OnSimpleType(EWireType::Int64); - Writer_.WriteInt64(value); -} - -void TCheckedSkiffWriter::WriteUint8(ui8 value) -{ - Validator_->OnSimpleType(EWireType::Uint8); - Writer_.WriteUint8(value); -} - -void TCheckedSkiffWriter::WriteUint16(ui16 value) -{ - Validator_->OnSimpleType(EWireType::Uint16); - Writer_.WriteUint16(value); -} - -void TCheckedSkiffWriter::WriteUint32(ui32 value) -{ - Validator_->OnSimpleType(EWireType::Uint32); - Writer_.WriteUint32(value); -} - -void TCheckedSkiffWriter::WriteUint64(ui64 value) -{ - Validator_->OnSimpleType(EWireType::Uint64); - Writer_.WriteUint64(value); -} - -void TCheckedSkiffWriter::WriteInt128(TInt128 value) -{ - Validator_->OnSimpleType(EWireType::Int128); - Writer_.WriteInt128(value); -} - -void TCheckedSkiffWriter::WriteUint128(TUint128 value) -{ - Validator_->OnSimpleType(EWireType::Uint128); - Writer_.WriteUint128(value); -} - -void TCheckedSkiffWriter::WriteString32(TStringBuf value) -{ - Validator_->OnSimpleType(EWireType::String32); - Writer_.WriteString32(value); -} - -void TCheckedSkiffWriter::WriteYson32(TStringBuf value) -{ - Validator_->OnSimpleType(EWireType::Yson32); - Writer_.WriteYson32(value); -} - -void TCheckedSkiffWriter::WriteVariant8Tag(ui8 tag) -{ - Validator_->OnVariant8Tag(tag); - Writer_.WriteVariant8Tag(tag); -} - -void TCheckedSkiffWriter::WriteVariant16Tag(ui16 tag) -{ - Validator_->OnVariant16Tag(tag); - Writer_.WriteVariant16Tag(tag); -} - -void TCheckedSkiffWriter::Flush() -{ - Writer_.Flush(); -} - -void TCheckedSkiffWriter::Finish() -{ - Validator_->ValidateFinished(); - Writer_.Finish(); -} - -//////////////////////////////////////////////////////////////////// - -} // namespace NSkiff diff --git a/library/cpp/skiff/skiff.h b/library/cpp/skiff/skiff.h deleted file mode 100644 index 183c1127006..00000000000 --- a/library/cpp/skiff/skiff.h +++ /dev/null @@ -1,259 +0,0 @@ -#pragma once - -#include "public.h" - -#include "zerocopy_output_writer.h" - -#include <util/generic/buffer.h> -#include <util/generic/yexception.h> - -#include <util/stream/input.h> -#include <util/stream/output.h> - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -class TSkiffException - : public yexception -{ }; - -//////////////////////////////////////////////////////////////////////////////// - -template <typename T> -constexpr T EndOfSequenceTag() -{ - static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value, "T must be unsigned integer"); - return T(-1); -} - -//////////////////////////////////////////////////////////////////////////////// - -struct TInt128 -{ - ui64 Low = 0; - i64 High = 0; -}; - -struct TUint128 -{ - ui64 Low = 0; - ui64 High = 0; -}; - -bool operator==(TInt128 lhs, TInt128 rhs); -bool operator!=(TInt128 lhs, TInt128 rhs); - -bool operator==(TUint128 lhs, TUint128 rhs); -bool operator!=(TUint128 lhs, TUint128 rhs); - -//////////////////////////////////////////////////////////////////////////////// - -class TUncheckedSkiffParser -{ -public: - explicit TUncheckedSkiffParser(IZeroCopyInput* stream); - TUncheckedSkiffParser(const std::shared_ptr<TSkiffSchema>& schema, IZeroCopyInput* stream); - - i8 ParseInt8(); - i16 ParseInt16(); - i32 ParseInt32(); - i64 ParseInt64(); - - ui8 ParseUint8(); - ui16 ParseUint16(); - ui32 ParseUint32(); - ui64 ParseUint64(); - - TInt128 ParseInt128(); - TUint128 ParseUint128(); - - double ParseDouble(); - - bool ParseBoolean(); - - TStringBuf ParseString32(); - - TStringBuf ParseYson32(); - - ui8 ParseVariant8Tag(); - ui16 ParseVariant16Tag(); - - bool HasMoreData(); - - void ValidateFinished(); - - ui64 GetReadBytesCount() const; - -private: - const void* GetData(size_t size); - const void* GetDataViaBuffer(size_t size); - - size_t RemainingBytes() const; - void Advance(size_t size); - void RefillBuffer(); - - template <typename T> - T ParseSimple(); - -private: - IZeroCopyInput* const Underlying_; - - TBuffer Buffer_; - ui64 ReadBytesCount_ = 0; - char* Position_ = nullptr; - char* End_ = nullptr; - bool Exhausted_ = false; -}; - -//////////////////////////////////////////////////////////////////////////////// - -class TCheckedSkiffParser -{ -public: - TCheckedSkiffParser(const std::shared_ptr<TSkiffSchema>& schema, IZeroCopyInput* stream); - ~TCheckedSkiffParser(); - - i8 ParseInt8(); - i16 ParseInt16(); - i32 ParseInt32(); - i64 ParseInt64(); - - ui8 ParseUint8(); - ui16 ParseUint16(); - ui32 ParseUint32(); - ui64 ParseUint64(); - - TInt128 ParseInt128(); - TUint128 ParseUint128(); - - double ParseDouble(); - - bool ParseBoolean(); - - TStringBuf ParseString32(); - - TStringBuf ParseYson32(); - - ui8 ParseVariant8Tag(); - ui16 ParseVariant16Tag(); - - bool HasMoreData(); - - void ValidateFinished(); - - ui64 GetReadBytesCount() const; - -private: - TUncheckedSkiffParser Parser_; - std::unique_ptr<TSkiffValidator> Validator_; -}; - -//////////////////////////////////////////////////////////////////// - -class TUncheckedSkiffWriter -{ -public: - explicit TUncheckedSkiffWriter(IZeroCopyOutput* underlying); - explicit TUncheckedSkiffWriter(IOutputStream* underlying); - TUncheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& schema, IZeroCopyOutput* underlying); - TUncheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& schema, IOutputStream* underlying); - - ~TUncheckedSkiffWriter(); - - void WriteDouble(double value); - void WriteBoolean(bool value); - - void WriteInt8(i8 value); - void WriteInt16(i16 value); - void WriteInt32(i32 value); - void WriteInt64(i64 value); - - void WriteUint8(ui8 value); - void WriteUint16(ui16 value); - void WriteUint32(ui32 value); - void WriteUint64(ui64 value); - - void WriteInt128(TInt128 value); - void WriteUint128(TUint128 value); - - void WriteString32(TStringBuf value); - - void WriteYson32(TStringBuf value); - - void WriteVariant8Tag(ui8 tag); - void WriteVariant16Tag(ui16 tag); - - void Flush(); - void Finish(); - -private: - - template <typename T> - void WriteSimple(T data); - -private: - THolder<TBufferedOutput> BufferedOutput_; - TZeroCopyOutputStreamWriter Underlying_; -}; - -//////////////////////////////////////////////////////////////////////////////// - -class TCheckedSkiffWriter -{ -public: - TCheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& schema, IZeroCopyOutput* underlying); - TCheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& schema, IOutputStream* underlying); - - ~TCheckedSkiffWriter(); - - void WriteInt8(i8 value); - void WriteInt16(i16 value); - void WriteInt32(i32 value); - void WriteInt64(i64 value); - - void WriteUint8(ui8 value); - void WriteUint16(ui16 value); - void WriteUint32(ui32 value); - void WriteUint64(ui64 value); - - void WriteDouble(double value); - void WriteBoolean(bool value); - - void WriteInt128(TInt128 value); - void WriteUint128(TUint128 value); - - void WriteString32(TStringBuf value); - - void WriteYson32(TStringBuf value); - - void WriteVariant8Tag(ui8 tag); - void WriteVariant16Tag(ui16 tag); - - void Flush(); - void Finish(); - -private: - TUncheckedSkiffWriter Writer_; - std::unique_ptr<TSkiffValidator> Validator_; -}; - -//////////////////////////////////////////////////////////////////////////////// - -template <EWireType wireType> -class TUnderlyingIntegerType { -private: - TUnderlyingIntegerType() = default; - static constexpr auto F(); - -public: - using TValue = decltype(TUnderlyingIntegerType::F()); -}; - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NSkiff - -#define SKIFF_H -#include "skiff-inl.h" -#undef SKIFF_H diff --git a/library/cpp/skiff/skiff_schema-inl.h b/library/cpp/skiff/skiff_schema-inl.h deleted file mode 100644 index d66325b222d..00000000000 --- a/library/cpp/skiff/skiff_schema-inl.h +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -#ifndef SKIFF_SCHEMA_H -#error "Direct inclusion of this file is not allowed, include skiff_schema.h" -// For the sake of sane code completion. -#include "skiff_schema.h" -#endif -#undef SKIFF_SCHEMA_H - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -inline bool IsSimpleType(EWireType type) -{ - switch (type) { - case EWireType::Int8: - case EWireType::Int16: - case EWireType::Int32: - case EWireType::Int64: - case EWireType::Int128: - - case EWireType::Uint8: - case EWireType::Uint16: - case EWireType::Uint32: - case EWireType::Uint64: - case EWireType::Uint128: - - case EWireType::Double: - case EWireType::Boolean: - case EWireType::String32: - case EWireType::Yson32: - case EWireType::Nothing: - return true; - case EWireType::Tuple: - case EWireType::Variant8: - case EWireType::Variant16: - case EWireType::RepeatedVariant8: - case EWireType::RepeatedVariant16: - return false; - } - Y_FAIL(); -} - -//////////////////////////////////////////////////////////////////////////////// - -template <EWireType WireType> -TComplexSchema<WireType>::TComplexSchema(TSkiffSchemaList elements) - : TSkiffSchema(WireType) - , Elements_(std::move(elements)) -{ } - -template <EWireType WireType> -const TSkiffSchemaList& TComplexSchema<WireType>::GetChildren() const -{ - return Elements_; -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NSkiff diff --git a/library/cpp/skiff/skiff_schema.cpp b/library/cpp/skiff/skiff_schema.cpp deleted file mode 100644 index c762896ad02..00000000000 --- a/library/cpp/skiff/skiff_schema.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include "skiff_schema.h" - -#include "skiff.h" - -#include <util/generic/hash.h> - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -bool operator==(const TSkiffSchema& lhs, const TSkiffSchema& rhs) -{ - if (lhs.GetWireType() != rhs.GetWireType() || lhs.GetName() != rhs.GetName()) { - return false; - } - const auto& lhsChildren = lhs.GetChildren(); - const auto& rhsChildren = rhs.GetChildren(); - return std::equal( - std::begin(lhsChildren), - std::end(lhsChildren), - std::begin(rhsChildren), - std::end(rhsChildren), - TSkiffSchemaPtrEqual()); -} - -bool operator!=(const TSkiffSchema& lhs, const TSkiffSchema& rhs) -{ - return !(lhs == rhs); -} - -//////////////////////////////////////////////////////////////////////////////// - -void PrintShortDebugString(const std::shared_ptr<const TSkiffSchema>& schema, IOutputStream* out) -{ - (*out) << ToString(schema->GetWireType()); - if (!IsSimpleType(schema->GetWireType())) { - auto children = schema->GetChildren(); - if (!children.empty()) { - (*out) << '<'; - for (const auto& child : children) { - PrintShortDebugString(child, out); - (*out) << ';'; - } - (*out) << '>'; - } - } -} - -TString GetShortDebugString(const std::shared_ptr<const TSkiffSchema>& schema) -{ - TStringStream out; - PrintShortDebugString(schema, &out); - return out.Str(); -} - -std::shared_ptr<TSimpleTypeSchema> CreateSimpleTypeSchema(EWireType type) -{ - return std::make_shared<TSimpleTypeSchema>(type); -} - -static void VerifyNonemptyChildren(const TSkiffSchemaList& children, EWireType wireType) -{ - if (children.empty()) { - ythrow TSkiffException() << "\"" << ToString(wireType) << "\" must have at least one child"; - } -} - -std::shared_ptr<TTupleSchema> CreateTupleSchema(TSkiffSchemaList children) -{ - return std::make_shared<TTupleSchema>(std::move(children)); -} - -std::shared_ptr<TVariant8Schema> CreateVariant8Schema(TSkiffSchemaList children) -{ - VerifyNonemptyChildren(children, EWireType::Variant8); - return std::make_shared<TVariant8Schema>(std::move(children)); -} - -std::shared_ptr<TVariant16Schema> CreateVariant16Schema(TSkiffSchemaList children) -{ - VerifyNonemptyChildren(children, EWireType::Variant16); - return std::make_shared<TVariant16Schema>(std::move(children)); -} - -std::shared_ptr<TRepeatedVariant8Schema> CreateRepeatedVariant8Schema(TSkiffSchemaList children) -{ - VerifyNonemptyChildren(children, EWireType::RepeatedVariant8); - return std::make_shared<TRepeatedVariant8Schema>(std::move(children)); -} - -std::shared_ptr<TRepeatedVariant16Schema> CreateRepeatedVariant16Schema(TSkiffSchemaList children) -{ - VerifyNonemptyChildren(children, EWireType::RepeatedVariant16); - return std::make_shared<TRepeatedVariant16Schema>(std::move(children)); -} - -//////////////////////////////////////////////////////////////////////////////// - -TSkiffSchema::TSkiffSchema(EWireType type) - : Type_(type) -{ } - -EWireType TSkiffSchema::GetWireType() const -{ - return Type_; -} - -std::shared_ptr<TSkiffSchema> TSkiffSchema::SetName(TString name) -{ - Name_ = std::move(name); - return shared_from_this(); -} - -const TString& TSkiffSchema::GetName() const -{ - return Name_; -} - -const TSkiffSchemaList& TSkiffSchema::GetChildren() const -{ - static const TSkiffSchemaList children; - return children; -} - -//////////////////////////////////////////////////////////////////////////////// - -TSimpleTypeSchema::TSimpleTypeSchema(EWireType type) - : TSkiffSchema(type) -{ - Y_VERIFY(IsSimpleType(type)); -} - -//////////////////////////////////////////////////////////////////////////////// - -size_t TSkiffSchemaPtrHasher::operator()(const std::shared_ptr<TSkiffSchema>& schema) const -{ - return THash<NSkiff::TSkiffSchema>()(*schema); -} - -size_t TSkiffSchemaPtrEqual::operator()( - const std::shared_ptr<TSkiffSchema>& lhs, - const std::shared_ptr<TSkiffSchema>& rhs) const -{ - return *lhs == *rhs; -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NSkiff - -//////////////////////////////////////////////////////////////////////////////// - -size_t THash<NSkiff::TSkiffSchema>::operator()(const NSkiff::TSkiffSchema &schema) const -{ - auto hash = CombineHashes( - THash<TString>()(schema.GetName()), - static_cast<size_t>(schema.GetWireType())); - for (const auto& child : schema.GetChildren()) { - hash = CombineHashes(hash, (*this)(*child)); - } - return hash; -} - -//////////////////////////////////////////////////////////////////////////////// diff --git a/library/cpp/skiff/skiff_schema.h b/library/cpp/skiff/skiff_schema.h deleted file mode 100644 index bf82c5da671..00000000000 --- a/library/cpp/skiff/skiff_schema.h +++ /dev/null @@ -1,113 +0,0 @@ -#pragma once - -#include "public.h" - -#include <util/generic/string.h> -#include <util/string/cast.h> - -#include <vector> - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -template <EWireType WireType> -class TComplexSchema; - -using TTupleSchema = TComplexSchema<EWireType::Tuple>; -using TVariant8Schema = TComplexSchema<EWireType::Variant8>; -using TVariant16Schema = TComplexSchema<EWireType::Variant16>; -using TRepeatedVariant8Schema = TComplexSchema<EWireType::RepeatedVariant8>; -using TRepeatedVariant16Schema = TComplexSchema<EWireType::RepeatedVariant16>; - -//////////////////////////////////////////////////////////////////////////////// - -class TSkiffSchema - : public std::enable_shared_from_this<TSkiffSchema> -{ -public: - virtual ~TSkiffSchema() = default; - - EWireType GetWireType() const; - std::shared_ptr<TSkiffSchema> SetName(TString name); - const TString& GetName() const; - - virtual const TSkiffSchemaList& GetChildren() const; - -protected: - explicit TSkiffSchema(EWireType type); - -private: - const EWireType Type_; - TString Name_; -}; - -bool operator==(const TSkiffSchema& lhs, const TSkiffSchema& rhs); -bool operator!=(const TSkiffSchema& lhs, const TSkiffSchema& rhs); - -//////////////////////////////////////////////////////////////////////////////// - -class TSimpleTypeSchema - : public TSkiffSchema -{ -public: - explicit TSimpleTypeSchema(EWireType type); -}; - -//////////////////////////////////////////////////////////////////////////////// - -template <EWireType WireType> -class TComplexSchema - : public TSkiffSchema -{ -public: - explicit TComplexSchema(TSkiffSchemaList elements); - - virtual const TSkiffSchemaList& GetChildren() const override; - -private: - const TSkiffSchemaList Elements_; -}; - -//////////////////////////////////////////////////////////////////////////////// - -bool IsSimpleType(EWireType type); -TString GetShortDebugString(const std::shared_ptr<const TSkiffSchema>& schema); -void PrintShortDebugString(const std::shared_ptr<const TSkiffSchema>& schema, IOutputStream* out); - -std::shared_ptr<TSimpleTypeSchema> CreateSimpleTypeSchema(EWireType type); -std::shared_ptr<TTupleSchema> CreateTupleSchema(TSkiffSchemaList children); -std::shared_ptr<TVariant8Schema> CreateVariant8Schema(TSkiffSchemaList children); -std::shared_ptr<TVariant16Schema> CreateVariant16Schema(TSkiffSchemaList children); -std::shared_ptr<TRepeatedVariant8Schema> CreateRepeatedVariant8Schema(TSkiffSchemaList children); -std::shared_ptr<TRepeatedVariant16Schema> CreateRepeatedVariant16Schema(TSkiffSchemaList children); - -//////////////////////////////////////////////////////////////////////////////// - -struct TSkiffSchemaPtrHasher -{ - size_t operator()(const std::shared_ptr<TSkiffSchema>& schema) const; -}; - -struct TSkiffSchemaPtrEqual -{ - size_t operator()( - const std::shared_ptr<TSkiffSchema>& lhs, - const std::shared_ptr<TSkiffSchema>& rhs) const; -}; - -} // namespace NSkiff - -//////////////////////////////////////////////////////////////////////////////// - -template <> -struct THash<NSkiff::TSkiffSchema> -{ - size_t operator()(const NSkiff::TSkiffSchema& schema) const; -}; - -//////////////////////////////////////////////////////////////////////////////// - -#define SKIFF_SCHEMA_H -#include "skiff_schema-inl.h" -#undef SKIFF_SCHEMA_H diff --git a/library/cpp/skiff/skiff_validator.cpp b/library/cpp/skiff/skiff_validator.cpp deleted file mode 100644 index 1b1b98d5a62..00000000000 --- a/library/cpp/skiff/skiff_validator.cpp +++ /dev/null @@ -1,396 +0,0 @@ -#include "skiff.h" -#include "skiff_validator.h" - -#include <vector> -#include <stack> - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -struct IValidatorNode; - -using TValidatorNodeList = std::vector<std::shared_ptr<IValidatorNode>>; -using TSkiffSchemaList = std::vector<std::shared_ptr<TSkiffSchema>>; - -static std::shared_ptr<IValidatorNode> CreateUsageValidatorNode(const std::shared_ptr<TSkiffSchema>& skiffSchema); -static TValidatorNodeList CreateUsageValidatorNodeList(const TSkiffSchemaList& skiffSchemaList); - -//////////////////////////////////////////////////////////////////////////////// - -template <typename T> -inline void ThrowUnexpectedParseWrite(T wireType) -{ - ythrow TSkiffException() << "Unexpected parse/write of \"" << ::ToString(wireType) << "\" token"; -} - -//////////////////////////////////////////////////////////////////////////////// - -struct IValidatorNode -{ - virtual ~IValidatorNode() = default; - - virtual void OnBegin(TValidatorNodeStack* /*validatorNodeStack*/) - { } - - virtual void OnChildDone(TValidatorNodeStack* /*validatorNodeStack*/) - { - Y_FAIL(); - } - - virtual void OnSimpleType(TValidatorNodeStack* /*validatorNodeStack*/, EWireType wireType) - { - ThrowUnexpectedParseWrite(wireType); - } - - virtual void BeforeVariant8Tag() - { - ThrowUnexpectedParseWrite(EWireType::Variant8); - } - - virtual void OnVariant8Tag(TValidatorNodeStack* /*validatorNodeStack*/, ui8 /*tag*/) - { - IValidatorNode::BeforeVariant8Tag(); - } - - virtual void BeforeVariant16Tag() - { - ThrowUnexpectedParseWrite(EWireType::Variant16); - } - - virtual void OnVariant16Tag(TValidatorNodeStack* /*validatorNodeStack*/, ui16 /*tag*/) - { - IValidatorNode::BeforeVariant16Tag(); - } -}; - -//////////////////////////////////////////////////////////////////////////////// - -class TValidatorNodeStack -{ -public: - explicit TValidatorNodeStack(std::shared_ptr<IValidatorNode> validator) - : RootValidator_(std::move(validator)) - { } - - void PushValidator(IValidatorNode* validator) - { - ValidatorStack_.push(validator); - validator->OnBegin(this); - } - - void PopValidator() - { - Y_VERIFY(!ValidatorStack_.empty()); - ValidatorStack_.pop(); - if (!ValidatorStack_.empty()) { - ValidatorStack_.top()->OnChildDone(this); - } - } - - void PushRootIfRequired() - { - if (ValidatorStack_.empty()) { - PushValidator(RootValidator_.get()); - } - } - - IValidatorNode* Top() const - { - Y_VERIFY(!ValidatorStack_.empty()); - return ValidatorStack_.top(); - } - - bool IsFinished() const - { - return ValidatorStack_.empty(); - } - -private: - const std::shared_ptr<IValidatorNode> RootValidator_; - std::stack<IValidatorNode*> ValidatorStack_; -}; - -//////////////////////////////////////////////////////////////////////////////// - -class TNothingTypeValidator - : public IValidatorNode -{ -public: - void OnBegin(TValidatorNodeStack* validatorNodeStack) override - { - validatorNodeStack->PopValidator(); - } -}; - -//////////////////////////////////////////////////////////////////////////////// - -class TSimpleTypeUsageValidator - : public IValidatorNode -{ -public: - explicit TSimpleTypeUsageValidator(EWireType type) - : Type_(type) - { } - - void OnSimpleType(TValidatorNodeStack* validatorNodeStack, EWireType type) override - { - if (type != Type_) { - ThrowUnexpectedParseWrite(type); - } - validatorNodeStack->PopValidator(); - } - -private: - const EWireType Type_; -}; - -//////////////////////////////////////////////////////////////////////////////// - -template <typename TTag> -void ValidateVariantTag(TValidatorNodeStack* validatorNodeStack, TTag tag, const TValidatorNodeList& children) -{ - if (tag == EndOfSequenceTag<TTag>()) { - // Root validator is pushed into the stack before variant tag - // if the stack is empty. - validatorNodeStack->PopValidator(); - } else if (tag >= children.size()) { - ythrow TSkiffException() << "Variant tag \"" << tag << "\" " - << "exceeds number of children \"" << children.size(); - } else { - validatorNodeStack->PushValidator(children[tag].get()); - } -} - -class TVariant8TypeUsageValidator - : public IValidatorNode -{ -public: - explicit TVariant8TypeUsageValidator(TValidatorNodeList children) - : Children_(std::move(children)) - { } - - void BeforeVariant8Tag() override - { } - - void OnVariant8Tag(TValidatorNodeStack* validatorNodeStack, ui8 tag) override - { - ValidateVariantTag(validatorNodeStack, tag, Children_); - } - - void OnChildDone(TValidatorNodeStack* validatorNodeStack) override - { - validatorNodeStack->PopValidator(); - } - -private: - const TValidatorNodeList Children_; -}; - -//////////////////////////////////////////////////////////////////////////////// - -class TVariant16TypeUsageValidator - : public IValidatorNode -{ -public: - explicit TVariant16TypeUsageValidator(TValidatorNodeList children) - : Children_(std::move(children)) - { } - - void BeforeVariant16Tag() override - { } - - void OnVariant16Tag(TValidatorNodeStack* validatorNodeStack, ui16 tag) override - { - ValidateVariantTag(validatorNodeStack, tag, Children_); - } - - void OnChildDone(TValidatorNodeStack* validatorNodeStack) override - { - validatorNodeStack->PopValidator(); - } - -private: - const TValidatorNodeList Children_; -}; - -//////////////////////////////////////////////////////////////////////////////// - -class TRepeatedVariant8TypeUsageValidator - : public IValidatorNode -{ -public: - explicit TRepeatedVariant8TypeUsageValidator(TValidatorNodeList children) - : Children_(std::move(children)) - { } - - void BeforeVariant8Tag() override - { } - - void OnVariant8Tag(TValidatorNodeStack* validatorNodeStack, ui8 tag) override - { - ValidateVariantTag(validatorNodeStack, tag, Children_); - } - - void OnChildDone(TValidatorNodeStack* /*validatorNodeStack*/) override - { } - -private: - const TValidatorNodeList Children_; -}; - -//////////////////////////////////////////////////////////////////////////////// - -class TRepeatedVariant16TypeUsageValidator - : public IValidatorNode -{ -public: - explicit TRepeatedVariant16TypeUsageValidator(TValidatorNodeList children) - : Children_(std::move(children)) - { } - - void BeforeVariant16Tag() override - { } - - void OnVariant16Tag(TValidatorNodeStack* validatorNodeStack, ui16 tag) override - { - ValidateVariantTag(validatorNodeStack, tag, Children_); - } - - void OnChildDone(TValidatorNodeStack* /*validatorNodeStack*/) override - { } - -private: - const TValidatorNodeList Children_; -}; - -//////////////////////////////////////////////////////////////////////////////// - -class TTupleTypeUsageValidator - : public IValidatorNode -{ -public: - explicit TTupleTypeUsageValidator(TValidatorNodeList children) - : Children_(std::move(children)) - { } - - void OnBegin(TValidatorNodeStack* validatorNodeStack) override - { - Position_ = 0; - if (!Children_.empty()) { - validatorNodeStack->PushValidator(Children_[0].get()); - } - } - - void OnChildDone(TValidatorNodeStack* validatorNodeStack) override - { - Position_++; - if (Position_ < Children_.size()) { - validatorNodeStack->PushValidator(Children_[Position_].get()); - } else { - validatorNodeStack->PopValidator(); - } - } - -private: - const TValidatorNodeList Children_; - ui32 Position_ = 0; -}; - -//////////////////////////////////////////////////////////////////////////////// - -TSkiffValidator::TSkiffValidator(std::shared_ptr<TSkiffSchema> skiffSchema) - : Context_(std::make_unique<TValidatorNodeStack>(CreateUsageValidatorNode(std::move(skiffSchema)))) -{ } - -TSkiffValidator::~TSkiffValidator() -{ } - -void TSkiffValidator::BeforeVariant8Tag() -{ - Context_->PushRootIfRequired(); - Context_->Top()->BeforeVariant8Tag(); -} - -void TSkiffValidator::OnVariant8Tag(ui8 tag) -{ - Context_->PushRootIfRequired(); - Context_->Top()->OnVariant8Tag(Context_.get(), tag); -} - -void TSkiffValidator::BeforeVariant16Tag() -{ - Context_->PushRootIfRequired(); - Context_->Top()->BeforeVariant16Tag(); -} - -void TSkiffValidator::OnVariant16Tag(ui16 tag) -{ - Context_->PushRootIfRequired(); - Context_->Top()->OnVariant16Tag(Context_.get(), tag); -} - -void TSkiffValidator::OnSimpleType(EWireType value) -{ - Context_->PushRootIfRequired(); - Context_->Top()->OnSimpleType(Context_.get(), value); -} - -void TSkiffValidator::ValidateFinished() -{ - if (!Context_->IsFinished()) { - ythrow TSkiffException() << "Parse/write is not finished"; - } -} - -//////////////////////////////////////////////////////////////////////////////// - -TValidatorNodeList CreateUsageValidatorNodeList(const TSkiffSchemaList& skiffSchemaList) -{ - TValidatorNodeList result; - result.reserve(skiffSchemaList.size()); - for (const auto& skiffSchema : skiffSchemaList) { - result.push_back(CreateUsageValidatorNode(skiffSchema)); - } - return result; -} - -std::shared_ptr<IValidatorNode> CreateUsageValidatorNode(const std::shared_ptr<TSkiffSchema>& skiffSchema) -{ - switch (skiffSchema->GetWireType()) { - case EWireType::Int8: - case EWireType::Int16: - case EWireType::Int32: - case EWireType::Int64: - case EWireType::Int128: - - case EWireType::Uint8: - case EWireType::Uint16: - case EWireType::Uint32: - case EWireType::Uint64: - case EWireType::Uint128: - - case EWireType::Double: - case EWireType::Boolean: - case EWireType::String32: - case EWireType::Yson32: - return std::make_shared<TSimpleTypeUsageValidator>(skiffSchema->GetWireType()); - case EWireType::Nothing: - return std::make_shared<TNothingTypeValidator>(); - case EWireType::Tuple: - return std::make_shared<TTupleTypeUsageValidator>(CreateUsageValidatorNodeList(skiffSchema->GetChildren())); - case EWireType::Variant8: - return std::make_shared<TVariant8TypeUsageValidator>(CreateUsageValidatorNodeList(skiffSchema->GetChildren())); - case EWireType::Variant16: - return std::make_shared<TVariant16TypeUsageValidator>(CreateUsageValidatorNodeList(skiffSchema->GetChildren())); - case EWireType::RepeatedVariant8: - return std::make_shared<TRepeatedVariant8TypeUsageValidator>(CreateUsageValidatorNodeList(skiffSchema->GetChildren())); - case EWireType::RepeatedVariant16: - return std::make_shared<TRepeatedVariant16TypeUsageValidator>(CreateUsageValidatorNodeList(skiffSchema->GetChildren())); - } - Y_FAIL(); -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NSkiff diff --git a/library/cpp/skiff/skiff_validator.h b/library/cpp/skiff/skiff_validator.h deleted file mode 100644 index 522cc74db68..00000000000 --- a/library/cpp/skiff/skiff_validator.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include "public.h" - -#include "skiff_schema.h" - -#include <util/string/cast.h> - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -class TValidatorNodeStack; - -//////////////////////////////////////////////////////////////////////////////// - -class TSkiffValidator -{ -public: - explicit TSkiffValidator(std::shared_ptr<TSkiffSchema> skiffSchema); - ~TSkiffValidator(); - - void BeforeVariant8Tag(); - void OnVariant8Tag(ui8 tag); - - void BeforeVariant16Tag(); - void OnVariant16Tag(ui16 tag); - - void OnSimpleType(EWireType value); - - void ValidateFinished(); - -private: - const std::unique_ptr<TValidatorNodeStack> Context_; -}; - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NSkiff diff --git a/library/cpp/skiff/zerocopy_output_writer-inl.h b/library/cpp/skiff/zerocopy_output_writer-inl.h deleted file mode 100644 index 6bd067c9fa7..00000000000 --- a/library/cpp/skiff/zerocopy_output_writer-inl.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once -#ifndef ZEROCOPY_OUTPUT_WRITER_INL_H_ -#error "Direct inclusion of this file is not allowed, include zerocopy_output_writer.h" -// For the sake of sane code completion. -#include "zerocopy_output_writer.h" -#endif - -#include <util/system/yassert.h> - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -char* TZeroCopyOutputStreamWriter::Current() const -{ - return Current_; -} - -ui64 TZeroCopyOutputStreamWriter::RemainingBytes() const -{ - return RemainingBytes_; -} - -void TZeroCopyOutputStreamWriter::Advance(size_t bytes) -{ - Y_VERIFY(bytes <= RemainingBytes_); - Current_ += bytes; - RemainingBytes_ -= bytes; -} - -void TZeroCopyOutputStreamWriter::Write(const void* buffer, size_t length) -{ - if (length > RemainingBytes_) { - UndoRemaining(); - Output_->Write(buffer, length); - TotalWrittenBlockSize_ += length; - ObtainNextBlock(); - } else { - memcpy(Current_, buffer, length); - Advance(length); - } -} - -ui64 TZeroCopyOutputStreamWriter::GetTotalWrittenSize() const -{ - return TotalWrittenBlockSize_ - RemainingBytes_; -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NSkiff diff --git a/library/cpp/skiff/zerocopy_output_writer.cpp b/library/cpp/skiff/zerocopy_output_writer.cpp deleted file mode 100644 index 49492b55a4a..00000000000 --- a/library/cpp/skiff/zerocopy_output_writer.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "zerocopy_output_writer.h" - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -TZeroCopyOutputStreamWriter::TZeroCopyOutputStreamWriter(IZeroCopyOutput* output) - : Output_(output) -{ - ObtainNextBlock(); -} - -TZeroCopyOutputStreamWriter::~TZeroCopyOutputStreamWriter() -{ - if (RemainingBytes_ > 0) { - UndoRemaining(); - } -} - -void TZeroCopyOutputStreamWriter::ObtainNextBlock() -{ - if (RemainingBytes_ > 0) { - UndoRemaining(); - } - RemainingBytes_ = Output_->Next(&Current_); - TotalWrittenBlockSize_ += RemainingBytes_; -} - -void TZeroCopyOutputStreamWriter::UndoRemaining() -{ - Output_->Undo(RemainingBytes_); - TotalWrittenBlockSize_ -= RemainingBytes_; - RemainingBytes_ = 0; -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NSkiff diff --git a/library/cpp/skiff/zerocopy_output_writer.h b/library/cpp/skiff/zerocopy_output_writer.h deleted file mode 100644 index b0bccc5a63b..00000000000 --- a/library/cpp/skiff/zerocopy_output_writer.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include <util/stream/zerocopy_output.h> - -namespace NSkiff { - -//////////////////////////////////////////////////////////////////////////////// - -// Simple wrapper around -class TZeroCopyOutputStreamWriter - : private TNonCopyable -{ -public: - explicit TZeroCopyOutputStreamWriter(IZeroCopyOutput* output); - - ~TZeroCopyOutputStreamWriter(); - - Y_FORCE_INLINE char* Current() const; - Y_FORCE_INLINE ui64 RemainingBytes() const; - Y_FORCE_INLINE void Advance(size_t bytes); - void UndoRemaining(); - Y_FORCE_INLINE void Write(const void* buffer, size_t length); - Y_FORCE_INLINE ui64 GetTotalWrittenSize() const; - -private: - void ObtainNextBlock(); - -private: - IZeroCopyOutput* Output_; - char* Current_ = nullptr; - ui64 RemainingBytes_ = 0; - ui64 TotalWrittenBlockSize_ = 0; -}; - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NSkiff - -#define ZEROCOPY_OUTPUT_WRITER_INL_H_ -#include "zerocopy_output_writer-inl.h" -#undef ZEROCOPY_OUTPUT_WRITER_INL_H_ diff --git a/library/cpp/stopwords/README.md b/library/cpp/stopwords/README.md deleted file mode 100644 index cb48a4e345c..00000000000 --- a/library/cpp/stopwords/README.md +++ /dev/null @@ -1 +0,0 @@ -Библиотека для работы с файлами стоп-слов, заданными в [таком формате](https://a.yandex-team.ru/arc/trunk/arcadia/search/wizard/data/wizard/language/stopword.lst). diff --git a/library/cpp/stopwords/stopwords.cpp b/library/cpp/stopwords/stopwords.cpp deleted file mode 100644 index 54186ca1bb1..00000000000 --- a/library/cpp/stopwords/stopwords.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include <algorithm> - -#include <library/cpp/charset/wide.h> -#include <util/memory/tempbuf.h> -#include <util/string/vector.h> -#include <util/generic/yexception.h> -#include <util/digest/murmur.h> -#include <util/string/split.h> - -#include "stopwords.h" - -const EStickySide DefaultStickiness = STICK_RIGHT; -const TWordFilter TWordFilter::EmptyFilter; - -struct TToLower { - wchar16 operator()(wchar16 c) { - return (wchar16)ToLower(c); - } -}; - -size_t TTCharStrIHashImpl(const wchar16* ptr) { - const size_t len = ptr ? std::char_traits<wchar16>::length(ptr) : 0; - TCharTemp buf(len); - std::transform(ptr, ptr + len, buf.Data(), TToLower()); - return MurmurHash<size_t>((void*)buf.Data(), len * sizeof(wchar16)); -} - -bool TTCharStrIEqualToImpl(const wchar16* s1, const wchar16* s2) { - if (!s1 || !s2) - return !s1 == !s2; - for (; *s1 && *s2; ++s1, ++s2) - if (ToLower(*s1) != ToLower(*s2)) - return false; - return *s1 == *s2; -} - -namespace { - struct TReaderImpl: public TWordListReader { - TWordFilter::TWideStopWordsHash* Res; - ELanguage CurrentLanguage; - EStickySide CurrentStickiness; - TReaderImpl(TWordFilter::TWideStopWordsHash* res) - : Res(res) - , CurrentLanguage(LANG_UNK) - , CurrentStickiness(DefaultStickiness) - { - } - void ParseLine(const TUtf16String& line, ELanguage langcode, int version) override; - void ReadDataFile(const char* s) { - TWordListReader::ReadDataFile(s); - } - void ReadDataFile(IInputStream& in) { - TWordListReader::ReadDataFile(in); - } - }; -} - -bool TWordFilter::InitStopWordsList(const char* filename) { - if (!filename || !*filename) - return true; - TBuffered<TUnbufferedFileInput> src(4096, filename); - return InitStopWordsList(src); -} - -bool TWordFilter::InitStopWordsList(IInputStream& instream) { - TermStopWordsList(); - WordFilter.Reset(new TStopWordsHash); - WideWordFilter.Reset(new TWideStopWordsHash); - PlainWordFilter.Reset(new HashSet); - TReaderImpl reader(WideWordFilter.Get()); - reader.ReadDataFile(instream); - InitNarrowFilter(); - return true; -} - -// Deprecated initializer - no language data, default stickiness -bool TWordFilter::InitStopWordsList(const char** s, size_t n) { - TermStopWordsList(); - if (!s) - return false; - WordFilter.Reset(new TStopWordsHash); - WideWordFilter.Reset(new TWideStopWordsHash); - PlainWordFilter.Reset(new HashSet); - for (size_t i = 0; i < n; i++) { - if (s[i]) - WordFilter->Add(s[i], TStopWordInfo(LI_ALL_LANGUAGES, DefaultStickiness)); - } - InitWideFilter(); - return true; -} - -void TWordFilter::InitWideFilter() { - for (TStopWordsHash::const_iterator it = WordFilter->begin(); it != WordFilter->end(); ++it) { - TUtf16String tmp = UTF8ToWide(it->first); - PlainWordFilter->Add(WideToChar(tmp.data(), tmp.size(), CODES_YANDEX).c_str()); - WideWordFilter->insert_copy(tmp.c_str(), tmp.size() + 1, it->second); - } -} - -void TWordFilter::InitNarrowFilter() { - TString tmp; - for (TWideStopWordsHash::const_iterator it = WideWordFilter->begin(); it != WideWordFilter->end(); ++it) { - const wchar16* const str = it->first; - const size_t len = std::char_traits<wchar16>::length(str); - tmp.resize(len); - WideToChar(str, len, tmp.begin(), CODES_YANDEX); - PlainWordFilter->Add(tmp.c_str()); - WordFilter->Add(WideToUTF8(it->first).c_str(), it->second); - } -} - -void TReaderImpl::ParseLine(const TUtf16String& line, ELanguage langcode, int version) { - static const TUtf16String delimiters = u" \t\r\n,;"; - static const TUtf16String strNone = u"NONE:"; - static const TUtf16String strLeft = u"LEFT:"; - static const TUtf16String strRight = u"RIGHT:"; - static const TUtf16String strBoth = u"BOTH:"; - - if (langcode != CurrentLanguage) { - CurrentStickiness = DefaultStickiness; // reset stickiness at the beginning of each zone - CurrentLanguage = langcode; - } - TLangMask langCode = langcode != LANG_UNK ? TLangMask(langcode) : LI_ALL_LANGUAGES; - - TVector<TUtf16String> tokens; - StringSplitter(line).SplitBySet(delimiters.c_str()).SkipEmpty().Collect(&tokens); - TVector<TUtf16String>::const_iterator it; - for (it = tokens.begin(); it != tokens.end(); it++) { - if (it->empty()) - continue; // due diligence - if (version > 1) { // support for stickiness comes from version 2 - if (*it == strNone) { - CurrentStickiness = STICK_NONE; - continue; - } else if (*it == strLeft) { - CurrentStickiness = STICK_LEFT; - continue; - } else if (*it == strRight) { - CurrentStickiness = STICK_RIGHT; - continue; - } else if (*it == strBoth) { - CurrentStickiness = STICK_BOTH; - continue; - } - } - TWordFilter::TWideStopWordsHash::iterator fit = Res->find(it->c_str()); - if (fit == Res->end()) - Res->insert_copy(it->c_str(), it->length() + 1, TWordFilter::TStopWordInfo(langCode, CurrentStickiness)); - else - fit->second.Language.SafeSet(langcode); - } -} diff --git a/library/cpp/stopwords/stopwords.h b/library/cpp/stopwords/stopwords.h deleted file mode 100644 index fab28a34884..00000000000 --- a/library/cpp/stopwords/stopwords.h +++ /dev/null @@ -1,143 +0,0 @@ -#pragma once - -#include <library/cpp/charset/wide.h> -#include <library/cpp/containers/str_map/str_map.h> -#include <library/cpp/containers/str_hash/str_hash.h> -#include <library/cpp/wordlistreader/wordlistreader.h> -#include <util/generic/hash.h> -#include <util/generic/ptr.h> -#include <util/charset/wide.h> -#include <util/memory/tempbuf.h> - -#include <type_traits> - -enum EStickySide { - STICK_NONE = 0, - STICK_LEFT = 1, - STICK_RIGHT = 2, - STICK_BOTH = 3, -}; - -size_t TTCharStrIHashImpl(const wchar16* ptr); -bool TTCharStrIEqualToImpl(const wchar16* s1, const wchar16* s2); - -struct TTCharStrIHasher { - size_t operator()(const wchar16* s) const { - return TTCharStrIHashImpl(s); - } -}; - -struct TTCharStrIEqualTo { - bool operator()(const wchar16* s1, const wchar16* s2) { - return TTCharStrIEqualToImpl(s1, s2); - } -}; - -// Hash of stop words, plus facilities to load it from a file -class TWordFilter { -public: - struct TStopWordInfo { - ::TLangMask Language; - EStickySide Stickiness; - TStopWordInfo(::TLangMask lang = LI_ALL_LANGUAGES, EStickySide side = STICK_NONE) - : Language(lang) - , Stickiness(side) - { - } - }; - typedef Hash<TStopWordInfo> TStopWordsHash; - typedef THashWithSegmentedPoolForKeys<wchar16, TStopWordInfo, TTCharStrIHasher, TTCharStrIEqualTo> TWideStopWordsHash; - template <class TTChar> - struct THashType; - - inline TWordFilter() { - } - - // Recommended initialization - from a config file - bool InitStopWordsList(const char* filename); - bool InitStopWordsList(IInputStream& instream); - - // Deprecated initialization - just words in single-byte encoding, no language data, no i18n - bool InitStopWordsList(const char** s, size_t n); - - void TermStopWordsList() { - WordFilter = nullptr; - WideWordFilter = nullptr; - PlainWordFilter = nullptr; - } - - //in case TTChar == char, assumes csYandex - //see MORPH-74 - template <class TTChar> - bool IsStopWord(const TTChar* word, ::TLangMask lang = ::TLangMask(), EStickySide* side = nullptr) const { - if (!word || !*word) - return false; - typedef typename THashType<TTChar>::Type THash; - const TAtomicSharedPtr<THash>& wordFilter = GetHashPtr<TTChar>(); - if (!wordFilter) - return false; - - typename THash::const_iterator it = wordFilter->find(word); - if (it == wordFilter->end()) - return false; - if (lang.none() || (it->second.Language & lang).any()) { - if (side) - *side = it->second.Stickiness; - return true; - } - return false; - } - - // assumes word is in UTF8 - bool IsStopWord(const TString& word, ::TLangMask lang = ::TLangMask(), EStickySide* side = nullptr) const { - return IsStopWord(word.c_str(), lang, side); - } - - bool IsStopWord(const TUtf16String& word, ::TLangMask lang = ::TLangMask(), EStickySide* side = nullptr) const { - return IsStopWord(word.c_str(), lang, side); - } - - template <class TTChar> - bool IsStopWord(const TTChar* word, size_t len, ::TLangMask lang = ::TLangMask(), EStickySide* side = nullptr) const { - TTempArray<TTChar> str(len + 1); - memcpy((void*)str.Data(), word, len * sizeof(TTChar)); - str.Data()[len] = 0; - return IsStopWord(str.Data(), lang, side); - } - - // Deprecated interface - get a plain list of single-byte strings - const HashSet* GetWordFilter() const { - return PlainWordFilter.Get(); - } - - static const TWordFilter EmptyFilter; - -private: - //in csYandex - TAtomicSharedPtr<HashSet> PlainWordFilter; // compatibility: will be gone when no one uses GetWordFilter() - //in UTF8 - TAtomicSharedPtr<TStopWordsHash> WordFilter; - //in UTF16 - TAtomicSharedPtr<TWideStopWordsHash> WideWordFilter; - void InitWideFilter(); - void InitNarrowFilter(); - - template <class TTChar> - inline const TAtomicSharedPtr<typename THashType<TTChar>::Type>& GetHashPtr() const; -}; -template <> -struct TWordFilter::THashType<char> { - typedef TStopWordsHash Type; -}; -template <> -struct TWordFilter::THashType<wchar16> { - typedef TWideStopWordsHash Type; -}; -template <> -inline const TAtomicSharedPtr<TWordFilter::TStopWordsHash>& TWordFilter::GetHashPtr<char>() const { - return WordFilter; -} -template <> -inline const TAtomicSharedPtr<TWordFilter::TWideStopWordsHash>& TWordFilter::GetHashPtr<wchar16>() const { - return WideWordFilter; -} diff --git a/library/cpp/streams/base64/base64stream.cpp b/library/cpp/streams/base64/base64stream.cpp deleted file mode 100644 index b49d238829c..00000000000 --- a/library/cpp/streams/base64/base64stream.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "base64stream.h" diff --git a/library/cpp/streams/base64/base64stream.h b/library/cpp/streams/base64/base64stream.h deleted file mode 100644 index b156c468958..00000000000 --- a/library/cpp/streams/base64/base64stream.h +++ /dev/null @@ -1,129 +0,0 @@ -#pragma once - -#include <library/cpp/string_utils/base64/base64.h> - -#include <util/generic/ptr.h> -#include <util/stream/input.h> -#include <util/stream/output.h> - -class TStringDataInputStream: public IInputStream { -protected: - const char* (*GetLine)(size_t); - size_t BufferSize; - TArrayHolder<char> OutBuf; - size_t Line; - size_t LineLength; - size_t Cursor; - -private: - bool NextLine() { - Cursor = 0; - const TStringBuf str(GetLine(Line)); - if (str.empty()) { - LineLength = 0; - return false; - } - - ++Line; - - const size_t size = Base64DecodeBufSize(str.size()); - - if (BufferSize < size) { - OutBuf.Reset(new char[size]); - BufferSize = size; - } - - LineLength = Base64Decode(str, OutBuf.Get()).size(); - Y_ASSERT(LineLength <= BufferSize); - - return LineLength > 0; - } - - size_t ReadDataFromLine(char* buf, size_t len) { - size_t n = Min(len, LineLength - Cursor); - memcpy(static_cast<void*>(buf), static_cast<void*>(OutBuf.Get() + Cursor), n); - Cursor += n; - return n; - } - -protected: - size_t DoRead(void* buf, size_t len) override { - size_t readed = 0; - while (readed < len) { - readed += ReadDataFromLine(static_cast<char*>(buf) + readed, len - readed); - if (readed < len && !NextLine()) - break; - } - return readed; - } - -public: - TStringDataInputStream(const char* (*getLine)(size_t), size_t bufferSize = 0) - : GetLine(getLine) - , BufferSize(bufferSize) - , OutBuf(new char[BufferSize]) - , Line(0) - , LineLength(0) - , Cursor(0) - { - } -}; - -class TStringDataOutputStream: public IOutputStream { -public: - TStringDataOutputStream(IOutputStream* out, const int maxOutStrLen) - : mStream(out) - , MaxReadLen(Base64DecodeBufSize(maxOutStrLen)) - , BufRead(new unsigned char[MaxReadLen]) - , BufReadOffset(0) - , BufOut(new char[maxOutStrLen + 1]){}; - - ~TStringDataOutputStream() override { - try { - Finish(); - } catch (...) { - } - } - -private: - IOutputStream* mStream; - size_t MaxReadLen; - TArrayHolder<unsigned char> BufRead; - size_t BufReadOffset; - TArrayHolder<char> BufOut; - - void WriteLine() { - if (BufReadOffset > 0) { - mStream->Write(" \""); - Y_ASSERT(BufReadOffset <= MaxReadLen); - char* b = BufOut.Get(); - char* e = Base64Encode(b, BufRead.Get(), BufReadOffset); - mStream->Write(b, e - b); - mStream->Write("\",\n"); - BufReadOffset = 0; - } - } - - void DoWrite(const void* buf, size_t size) override { - size_t res = Min(MaxReadLen - BufReadOffset, size); - size_t buf_offset = 0; - while (res > 0) { - memcpy(BufRead.Get() + BufReadOffset, (const char*)buf + buf_offset, res); - BufReadOffset += res; - if (BufReadOffset < MaxReadLen) - return; - WriteLine(); - buf_offset += res; - size -= res; - res = Min(MaxReadLen - BufReadOffset, size); - } - } - - void DoFlush() override { - WriteLine(); - } - - void DoFinish() override { - DoFlush(); - } -}; diff --git a/library/cpp/streams/base64/static_data.cpp b/library/cpp/streams/base64/static_data.cpp deleted file mode 100644 index 8fe346da6ce..00000000000 --- a/library/cpp/streams/base64/static_data.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "static_data.h" diff --git a/library/cpp/streams/base64/static_data.h b/library/cpp/streams/base64/static_data.h deleted file mode 100644 index 584ac182995..00000000000 --- a/library/cpp/streams/base64/static_data.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include "base64stream.h" - -#include <util/memory/blob.h> -#include <util/stream/zlib.h> -#include <util/generic/ptr.h> - -class TCompressedStaticData { -public: - using TDataFunction = const char* (*)(size_t); - using TData = TBlob; - - class TDataInputStream: public IInputStream { - public: - TDataInputStream(TDataFunction function) - : Compressed(function) - , Decompressed(&Compressed) - { - } - - private: - size_t DoRead(void* buf, size_t len) override { - return Decompressed.Read(buf, len); - } - - private: - TStringDataInputStream Compressed; - TZLibDecompress Decompressed; - }; - - TCompressedStaticData(TDataFunction function) { - TDataInputStream inp(function); - Data = TBlob::FromStream(inp); - } - - const TData& GetData() const { - return Data; - } - -private: - TData Data; -}; diff --git a/library/cpp/streams/growing_file_input/growing_file_input.cpp b/library/cpp/streams/growing_file_input/growing_file_input.cpp deleted file mode 100644 index 0bbfa5ade9e..00000000000 --- a/library/cpp/streams/growing_file_input/growing_file_input.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "growing_file_input.h" - -#include <util/datetime/base.h> -#include <util/generic/yexception.h> - -TGrowingFileInput::TGrowingFileInput(const TString& path) - : File_(path, OpenExisting | RdOnly | Seq) -{ - if (!File_.IsOpen()) { - ythrow TIoException() << "file " << path << " not open"; - } - - File_.Seek(0, sEnd); -} - -TGrowingFileInput::TGrowingFileInput(const TFile& file) - : File_(file) -{ - if (!File_.IsOpen()) { - ythrow TIoException() << "file (" << file.GetName() << ") not open"; - } - - File_.Seek(0, sEnd); -} - -size_t TGrowingFileInput::DoRead(void* buf, size_t len) { - for (int sleepTime = 1;;) { - size_t rr = File_.Read(buf, len); - - if (rr != 0) { - return rr; - } - - NanoSleep((ui64)sleepTime * 1000000); - - if (sleepTime < 2000) { - sleepTime <<= 1; - } - } -} diff --git a/library/cpp/streams/growing_file_input/growing_file_input.h b/library/cpp/streams/growing_file_input/growing_file_input.h deleted file mode 100644 index 9054a5f3dac..00000000000 --- a/library/cpp/streams/growing_file_input/growing_file_input.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include <util/stream/input.h> -#include <util/system/file.h> - -/** - * Growing file input stream. - * - * File descriptor offsets to the end of the file, when the object is created. - * - * Read function waites for reading at least one byte. - */ -class TGrowingFileInput: public IInputStream { -public: - TGrowingFileInput(const TFile& file); - TGrowingFileInput(const TString& path); - -private: - size_t DoRead(void* buf, size_t len) override; - -private: - TFile File_; -}; diff --git a/library/cpp/streams/lz/common/compressor.h b/library/cpp/streams/lz/common/compressor.h deleted file mode 100644 index ffa1b198ae7..00000000000 --- a/library/cpp/streams/lz/common/compressor.h +++ /dev/null @@ -1,349 +0,0 @@ -#pragma once - -#include <util/system/yassert.h> -#include <util/system/byteorder.h> -#include <util/memory/addstorage.h> -#include <util/generic/buffer.h> -#include <util/generic/utility.h> -#include <util/generic/singleton.h> -#include <util/stream/mem.h> - -#include "error.h" - -static inline ui8 HostToLittle(ui8 t) noexcept { - return t; -} - -static inline ui8 LittleToHost(ui8 t) noexcept { - return t; -} - -struct TCommonData { - static const size_t overhead = sizeof(ui16) + sizeof(ui8); -}; - -const size_t SIGNATURE_SIZE = 4; - -template <class TCompressor, class TBase> -class TCompressorBase: public TAdditionalStorage<TCompressorBase<TCompressor, TBase>>, public TCompressor, public TCommonData { -public: - inline TCompressorBase(IOutputStream* slave, ui16 blockSize) - : Slave_(slave) - , BlockSize_(blockSize) - { - /* - * save signature - */ - static_assert(sizeof(TCompressor::signature) - 1 == SIGNATURE_SIZE, "expect sizeof(TCompressor::signature) - 1 == SIGNATURE_SIZE"); - Slave_->Write(TCompressor::signature, sizeof(TCompressor::signature) - 1); - - /* - * save version - */ - this->Save((ui32)1); - - /* - * save block size - */ - this->Save(BlockSize()); - } - - inline ~TCompressorBase() { - } - - inline void Write(const char* buf, size_t len) { - while (len) { - const ui16 toWrite = (ui16)Min<size_t>(len, this->BlockSize()); - - this->WriteBlock(buf, toWrite); - - buf += toWrite; - len -= toWrite; - } - } - - inline void Flush() { - } - - inline void Finish() { - this->Flush(); - this->WriteBlock(nullptr, 0); - } - - template <class T> - static inline void Save(T t, IOutputStream* out) { - t = HostToLittle(t); - - out->Write(&t, sizeof(t)); - } - - template <class T> - inline void Save(T t) { - Save(t, Slave_); - } - -private: - inline void* Block() const noexcept { - return this->AdditionalData(); - } - - inline ui16 BlockSize() const noexcept { - return BlockSize_; - } - - inline void WriteBlock(const void* ptr, ui16 len) { - Y_ASSERT(len <= this->BlockSize()); - - ui8 compressed = false; - - if (len) { - const size_t out = this->Compress((const char*)ptr, len, (char*)Block(), this->AdditionalDataLength()); - // catch compressor buffer overrun (e.g. SEARCH-2043) - //Y_VERIFY(out <= this->Hint(this->BlockSize())); - - if (out < len || TCompressor::SaveIncompressibleChunks()) { - compressed = true; - ptr = Block(); - len = (ui16)out; - } - } - - char tmp[overhead]; - TMemoryOutput header(tmp, sizeof(tmp)); - - this->Save(len, &header); - this->Save(compressed, &header); - - using TPart = IOutputStream::TPart; - if (ptr) { - const TPart parts[] = { - TPart(tmp, sizeof(tmp)), - TPart(ptr, len), - }; - - Slave_->Write(parts, sizeof(parts) / sizeof(*parts)); - } else { - Slave_->Write(tmp, sizeof(tmp)); - } - } - -private: - IOutputStream* Slave_; - const ui16 BlockSize_; -}; - -template <class T> -static inline T GLoad(IInputStream* input) { - T t; - - if (input->Load(&t, sizeof(t)) != sizeof(t)) { - ythrow TDecompressorError() << "stream error"; - } - - return LittleToHost(t); -} - -class TDecompressSignature { -public: - inline TDecompressSignature(IInputStream* input) { - if (input->Load(Buffer_, SIGNATURE_SIZE) != SIGNATURE_SIZE) { - ythrow TDecompressorError() << "can not load stream signature"; - } - } - - template <class TDecompressor> - inline bool Check() const { - static_assert(sizeof(TDecompressor::signature) - 1 == SIGNATURE_SIZE, "expect sizeof(TDecompressor::signature) - 1 == SIGNATURE_SIZE"); - return memcmp(TDecompressor::signature, Buffer_, SIGNATURE_SIZE) == 0; - } - -private: - char Buffer_[SIGNATURE_SIZE]; -}; - -template <class TDecompressor> -static inline IInputStream* ConsumeSignature(IInputStream* input) { - TDecompressSignature sign(input); - if (!sign.Check<TDecompressor>()) { - ythrow TDecompressorError() << "incorrect signature"; - } - return input; -} - -template <class TDecompressor> -class TDecompressorBaseImpl: public TDecompressor, public TCommonData { -public: - static inline ui32 CheckVer(ui32 v) { - if (v != 1) { - ythrow yexception() << TStringBuf("incorrect stream version: ") << v; - } - - return v; - } - - inline TDecompressorBaseImpl(IInputStream* slave) - : Slave_(slave) - , Input_(nullptr, 0) - , Eof_(false) - , Version_(CheckVer(Load<ui32>())) - , BlockSize_(Load<ui16>()) - , OutBufSize_(TDecompressor::Hint(BlockSize_)) - , Tmp_(2 * OutBufSize_) - , In_(Tmp_.Data()) - , Out_(In_ + OutBufSize_) - { - this->InitFromStream(Slave_); - } - - inline ~TDecompressorBaseImpl() { - } - - inline size_t Read(void* buf, size_t len) { - size_t ret = Input_.Read(buf, len); - - if (ret) { - return ret; - } - - if (Eof_) { - return 0; - } - - this->FillNextBlock(); - - ret = Input_.Read(buf, len); - - if (ret) { - return ret; - } - - Eof_ = true; - - return 0; - } - - inline void FillNextBlock() { - char tmp[overhead]; - - if (Slave_->Load(tmp, sizeof(tmp)) != sizeof(tmp)) { - ythrow TDecompressorError() << "can not read block header"; - } - - TMemoryInput header(tmp, sizeof(tmp)); - - const ui16 len = GLoad<ui16>(&header); - if (len > Tmp_.Capacity()) { - ythrow TDecompressorError() << "invalid len inside block header"; - } - const ui8 compressed = GLoad<ui8>(&header); - - if (compressed > 1) { - ythrow TDecompressorError() << "broken header"; - } - - if (Slave_->Load(In_, len) != len) { - ythrow TDecompressorError() << "can not read data"; - } - - if (compressed) { - const size_t ret = this->Decompress(In_, len, Out_, OutBufSize_); - - Input_.Reset(Out_, ret); - } else { - Input_.Reset(In_, len); - } - } - - template <class T> - inline T Load() { - return GLoad<T>(Slave_); - } - -protected: - IInputStream* Slave_; - TMemoryInput Input_; - bool Eof_; - const ui32 Version_; - const ui16 BlockSize_; - const size_t OutBufSize_; - TBuffer Tmp_; - char* In_; - char* Out_; -}; - -template <class TDecompressor, class TBase> -class TDecompressorBase: public TDecompressorBaseImpl<TDecompressor> { -public: - inline TDecompressorBase(IInputStream* slave) - : TDecompressorBaseImpl<TDecompressor>(ConsumeSignature<TDecompressor>(slave)) - { - } - - inline ~TDecompressorBase() { - } -}; - -#define DEF_COMPRESSOR_COMMON(rname, name) \ - rname::~rname() { \ - try { \ - Finish(); \ - } catch (...) { \ - } \ - } \ - \ - void rname::DoWrite(const void* buf, size_t len) { \ - if (!Impl_) { \ - ythrow yexception() << "can not write to finalized stream"; \ - } \ - \ - Impl_->Write((const char*)buf, len); \ - } \ - \ - void rname::DoFlush() { \ - if (!Impl_) { \ - ythrow yexception() << "can not flush finalized stream"; \ - } \ - \ - Impl_->Flush(); \ - } \ - \ - void rname::DoFinish() { \ - THolder<TImpl> impl(Impl_.Release()); \ - \ - if (impl) { \ - impl->Finish(); \ - } \ - } - -#define DEF_COMPRESSOR(rname, name) \ - class rname::TImpl: public TCompressorBase<name, TImpl> { \ - public: \ - inline TImpl(IOutputStream* out, ui16 blockSize) \ - : TCompressorBase<name, TImpl>(out, blockSize) { \ - } \ - }; \ - \ - rname::rname(IOutputStream* slave, ui16 blockSize) \ - : Impl_(new (TImpl::Hint(blockSize)) TImpl(slave, blockSize)) { \ - } \ - \ - DEF_COMPRESSOR_COMMON(rname, name) - -#define DEF_DECOMPRESSOR(rname, name) \ - class rname::TImpl: public TDecompressorBase<name, TImpl> { \ - public: \ - inline TImpl(IInputStream* in) \ - : TDecompressorBase<name, TImpl>(in) { \ - } \ - }; \ - \ - rname::rname(IInputStream* slave) \ - : Impl_(new TImpl(slave)) { \ - } \ - \ - rname::~rname() { \ - } \ - \ - size_t rname::DoRead(void* buf, size_t len) { \ - return Impl_->Read(buf, len); \ - } diff --git a/library/cpp/streams/lz/lz.cpp b/library/cpp/streams/lz/lz.cpp deleted file mode 100644 index 63c6e964875..00000000000 --- a/library/cpp/streams/lz/lz.cpp +++ /dev/null @@ -1,324 +0,0 @@ -#include "lz.h" - -#include <util/system/yassert.h> -#include <util/system/byteorder.h> -#include <util/memory/addstorage.h> -#include <util/generic/buffer.h> -#include <util/generic/utility.h> -#include <util/generic/singleton.h> -#include <util/generic/yexception.h> -#include <util/stream/mem.h> - -#include <library/cpp/streams/lz/common/compressor.h> - -#include <library/cpp/streams/lz/lz4/block.h> -#include <library/cpp/streams/lz/snappy/block.h> - -#include <contrib/libs/fastlz/fastlz.h> -#include <contrib/libs/quicklz/quicklz.h> -#include <contrib/libs/minilzo/minilzo.h> - -/* - * MiniLzo - */ -class TMiniLzo { - class TInit { - public: - inline TInit() { - if (lzo_init() != LZO_E_OK) { - ythrow yexception() << "can not init lzo engine"; - } - } - }; - -public: - static const char signature[]; - - inline TMiniLzo() { - Singleton<TInit>(); - } - - inline ~TMiniLzo() { - } - - static inline size_t Hint(size_t len) noexcept { - // see SEARCH-2043 and, e.g. examples at - // http://stackoverflow.com/questions/4235019/how-to-get-lzo-to-work-with-a-file-stream - return len + (len / 16) + 64 + 3; - } - - static inline bool SaveIncompressibleChunks() noexcept { - return false; - } -}; - -const char TMiniLzo::signature[] = "YLZO"; - -template <size_t N> -class TFixedArray { -public: - inline TFixedArray() noexcept { - memset(WorkMem_, 0, sizeof(WorkMem_)); - } - -protected: - char WorkMem_[N]; -}; - -class TMiniLzoCompressor: public TMiniLzo, public TFixedArray<LZO1X_MEM_COMPRESS + 1> { -public: - inline size_t Compress(const char* data, size_t len, char* ptr, size_t /*dstMaxSize*/) { - lzo_uint out = 0; - lzo1x_1_compress((const lzo_bytep)data, len, (lzo_bytep)ptr, &out, WorkMem_); - - return out; - } -}; - -class TMiniLzoDecompressor: public TMiniLzo, public TFixedArray<LZO1X_MEM_DECOMPRESS + 1> { -public: - inline size_t Decompress(const char* data, size_t len, char* ptr, size_t /*max*/) { - lzo_uint ret = 0; - - lzo1x_decompress((const lzo_bytep)data, len, (lzo_bytep)ptr, &ret, WorkMem_); - - return ret; - } - - inline void InitFromStream(IInputStream*) const noexcept { - } -}; - -DEF_COMPRESSOR(TLzoCompress, TMiniLzoCompressor) -DEF_DECOMPRESSOR(TLzoDecompress, TMiniLzoDecompressor) - -/* - * FastLZ - */ -class TFastLZ { -public: - static const char signature[]; - - static inline size_t Hint(size_t len) noexcept { - return Max<size_t>((size_t)(len * 1.06), 100); - } - - inline size_t Compress(const char* data, size_t len, char* ptr, size_t /*dstMaxSize*/) { - return fastlz_compress(data, len, ptr); - } - - inline size_t Decompress(const char* data, size_t len, char* ptr, size_t max) { - return fastlz_decompress(data, len, ptr, max); - } - - inline void InitFromStream(IInputStream*) const noexcept { - } - - static inline bool SaveIncompressibleChunks() noexcept { - return false; - } -}; - -const char TFastLZ::signature[] = "YLZF"; - -DEF_COMPRESSOR(TLzfCompress, TFastLZ) -DEF_DECOMPRESSOR(TLzfDecompress, TFastLZ) - -/* - * QuickLZ - */ -class TQuickLZBase { -public: - static const char signature[]; - - static inline size_t Hint(size_t len) noexcept { - return len + 500; - } - - inline TQuickLZBase() - : Table_(nullptr) - { - } - - inline void Init(unsigned ver, unsigned lev, unsigned mod, unsigned type) { - Table_ = LzqTable(ver, lev, mod); - - if (!Table_) { - ythrow yexception() << "unsupported lzq stream(" << ver << ", " << lev << ", " << mod << ")"; - } - - const size_t size = Table_->Setting(3) + Table_->Setting(type); - - Mem_.Reset(::operator new(size)); - memset(Mem_.Get(), 0, size); - } - - inline bool SaveIncompressibleChunks() const noexcept { - // we must save incompressible chunks "as is" - // after compressor run in streaming mode - return Table_->Setting(3); - } - -protected: - const TQuickLZMethods* Table_; - THolder<void> Mem_; -}; - -const char TQuickLZBase::signature[] = "YLZQ"; - -class TQuickLZCompress: public TQuickLZBase { -public: - inline size_t Compress(const char* data, size_t len, char* ptr, size_t /*dstMaxSize*/) { - return Table_->Compress(data, ptr, len, (char*)Mem_.Get()); - } -}; - -class TQuickLZDecompress: public TQuickLZBase { -public: - inline size_t Decompress(const char* data, size_t /*len*/, char* ptr, size_t /*max*/) { - return Table_->Decompress(data, ptr, (char*)Mem_.Get()); - } - - inline void InitFromStream(IInputStream* in) { - const ui8 ver = ::GLoad<ui8>(in); - const ui8 lev = ::GLoad<ui8>(in); - const ui8 mod = ::GLoad<ui8>(in); - - Init(ver, lev, mod, 2); - } -}; - -class TLzqCompress::TImpl: public TCompressorBase<TQuickLZCompress, TImpl> { -public: - inline TImpl(IOutputStream* out, ui16 blockSize, EVersion ver, unsigned level, EMode mode) - : TCompressorBase<TQuickLZCompress, TImpl>(out, blockSize) - { - memset(AdditionalData(), 0, AdditionalDataLength()); - - Init(ver, level, mode, 1); - - Save((ui8)ver); - Save((ui8)level); - Save((ui8)mode); - } -}; - -TLzqCompress::TLzqCompress(IOutputStream* slave, ui16 blockSize, EVersion ver, unsigned level, EMode mode) - : Impl_(new (TImpl::Hint(blockSize)) TImpl(slave, blockSize, ver, level, mode)) -{ -} - -DEF_COMPRESSOR_COMMON(TLzqCompress, TQuickLZCompress) -DEF_DECOMPRESSOR(TLzqDecompress, TQuickLZDecompress) - -namespace { - template <class T> - struct TInputHolder { - static inline T Set(T t) noexcept { - return t; - } - }; - - template <class T> - struct TInputHolder<TAutoPtr<T>> { - inline T* Set(TAutoPtr<T> v) noexcept { - V_ = v; - - return V_.Get(); - } - - TAutoPtr<T> V_; - }; - - // Decompressing input streams without signature verification - template <class TInput, class TDecompressor> - class TLzDecompressInput: public TInputHolder<TInput>, public IInputStream { - public: - inline TLzDecompressInput(TInput in) - : Impl_(this->Set(in)) - { - } - - private: - size_t DoRead(void* buf, size_t len) override { - return Impl_.Read(buf, len); - } - - private: - TDecompressorBaseImpl<TDecompressor> Impl_; - }; -} - -template <class T> -static TAutoPtr<IInputStream> TryOpenLzDecompressorX(const TDecompressSignature& s, T input) { - if (s.Check<TLZ4>()) - return new TLzDecompressInput<T, TLZ4>(input); - - if (s.Check<TSnappy>()) - return new TLzDecompressInput<T, TSnappy>(input); - - if (s.Check<TMiniLzo>()) - return new TLzDecompressInput<T, TMiniLzoDecompressor>(input); - - if (s.Check<TFastLZ>()) - return new TLzDecompressInput<T, TFastLZ>(input); - - if (s.Check<TQuickLZDecompress>()) - return new TLzDecompressInput<T, TQuickLZDecompress>(input); - - return nullptr; -} - -template <class T> -static inline TAutoPtr<IInputStream> TryOpenLzDecompressorImpl(const TStringBuf& signature, T input) { - if (signature.size() == SIGNATURE_SIZE) { - TMemoryInput mem(signature.data(), signature.size()); - TDecompressSignature s(&mem); - - return TryOpenLzDecompressorX(s, input); - } - - return nullptr; -} - -template <class T> -static inline TAutoPtr<IInputStream> TryOpenLzDecompressorImpl(T input) { - TDecompressSignature s(&*input); - - return TryOpenLzDecompressorX(s, input); -} - -template <class T> -static inline TAutoPtr<IInputStream> OpenLzDecompressorImpl(T input) { - TAutoPtr<IInputStream> ret = TryOpenLzDecompressorImpl(input); - - if (!ret) { - ythrow TDecompressorError() << "Unknown compression format"; - } - - return ret; -} - -TAutoPtr<IInputStream> OpenLzDecompressor(IInputStream* input) { - return OpenLzDecompressorImpl(input); -} - -TAutoPtr<IInputStream> TryOpenLzDecompressor(IInputStream* input) { - return TryOpenLzDecompressorImpl(input); -} - -TAutoPtr<IInputStream> TryOpenLzDecompressor(const TStringBuf& signature, IInputStream* input) { - return TryOpenLzDecompressorImpl(signature, input); -} - -TAutoPtr<IInputStream> OpenOwnedLzDecompressor(TAutoPtr<IInputStream> input) { - return OpenLzDecompressorImpl(input); -} - -TAutoPtr<IInputStream> TryOpenOwnedLzDecompressor(TAutoPtr<IInputStream> input) { - return TryOpenLzDecompressorImpl(input); -} - -TAutoPtr<IInputStream> TryOpenOwnedLzDecompressor(const TStringBuf& signature, TAutoPtr<IInputStream> input) { - return TryOpenLzDecompressorImpl(signature, input); -} diff --git a/library/cpp/streams/lz/lz4/block.h b/library/cpp/streams/lz/lz4/block.h deleted file mode 100644 index 9a912c0be20..00000000000 --- a/library/cpp/streams/lz/lz4/block.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include <library/cpp/streams/lz/common/compressor.h> - -#include <contrib/libs/lz4/lz4.h> - -/* - * LZ4 - */ -class TLZ4 { -public: - static constexpr char signature[]= "LZ.4"; - - static inline size_t Hint(size_t len) noexcept { - return Max<size_t>((size_t)(len * 1.06), 100); - } - - inline size_t Compress(const char* data, size_t len, char* ptr, size_t dstMaxSize) { - return LZ4_compress_default(data, ptr, len, dstMaxSize); - } - - inline size_t Decompress(const char* data, size_t len, char* ptr, size_t max) { - int res = LZ4_decompress_safe(data, ptr, len, max); - if (res < 0) - ythrow TDecompressorError(); - return res; - } - - inline void InitFromStream(IInputStream*) const noexcept { - } - - static inline bool SaveIncompressibleChunks() noexcept { - return false; - } -}; diff --git a/library/cpp/streams/lz/lz4/lz4.cpp b/library/cpp/streams/lz/lz4/lz4.cpp deleted file mode 100644 index 220e358c076..00000000000 --- a/library/cpp/streams/lz/lz4/lz4.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "lz4.h" -#include "block.h" - -DEF_COMPRESSOR(TLz4Compress, TLZ4) -DEF_DECOMPRESSOR(TLz4Decompress, TLZ4) diff --git a/library/cpp/streams/lz/lz_ut.cpp b/library/cpp/streams/lz/lz_ut.cpp deleted file mode 100644 index 6876f070fc0..00000000000 --- a/library/cpp/streams/lz/lz_ut.cpp +++ /dev/null @@ -1,287 +0,0 @@ -#include "lz.h" - -#include <library/cpp/testing/unittest/registar.h> -#include <library/cpp/resource/resource.h> - -#include <util/stream/file.h> -#include <util/generic/vector.h> -#include <util/system/tempfile.h> -#include <util/generic/singleton.h> - -#define LDATA "./ldata" -#define LDATA_RANDOM "./ldata.random" - -static const TString data = "aa aaa aa aaa aa aaa bb bbb bb bbb bb bbb"; - -namespace { - /** - * Produces well-formed random crap - **/ - TString RandomString(size_t size) { - TString entropy(NResource::Find("/random.data")); - TString result; - size_t seed = 1; - size_t j = 0; - for (size_t i = 0; i < size; ++i) { - seed *= 3; - char sym; - do { - sym = char((seed ^ i) % 256); - if (!sym) { - seed += 1; - } - } while (!sym); - Y_ASSERT(sym); - j = (j + 1) % entropy.size(); - result += char(sym + entropy[j]); - } - return result; - } - - TVector<TString> InitRandomData() { - static const TVector<size_t> sizes = { - 0, - 1, - 127, - 2017, - 32767, - }; - - TVector<TString> result; - for (auto size : sizes) { - result.push_back(RandomString(size)); - } - result.push_back(NResource::Find("/request.data")); - return result; - } - - TString TestFileName(const TString& d, size_t bufferSize) { - return LDATA_RANDOM + TString(".") + ToString(d.size()) + TString(".") + ToString(bufferSize); - } - - struct TRandomData: public TVector<TString> { - inline TRandomData() { - InitRandomData().swap(*this); - } - }; -} - -static const TVector<size_t> bufferSizes = { - 127, - 1024, - 32768, -}; - -namespace { - template <TLzqCompress::EVersion Ver, int Level, TLzqCompress::EMode Mode> - struct TLzqCompressX: public TLzqCompress { - inline TLzqCompressX(IOutputStream* out, size_t bufLen) - : TLzqCompress(out, bufLen, Ver, Level, Mode) - { - } - }; -} - -template <class C> -static inline void TestGoodDataCompress() { - TFixedBufferFileOutput o(LDATA); - C c(&o, 1024); - - TString d = data; - - for (size_t i = 0; i < 10; ++i) { - c.Write(d.data(), d.size()); - c << Endl; - d = d + d; - } - - c.Finish(); - o.Finish(); -} - -template <class C> -static inline void TestIncompressibleDataCompress(const TString& d, size_t bufferSize) { - TString testFileName = TestFileName(d, bufferSize); - TFixedBufferFileOutput o(testFileName); - C c(&o, bufferSize); - c.Write(d.data(), d.size()); - c.Finish(); - o.Finish(); -} - -template <class C> -static inline void TestCompress() { - TestGoodDataCompress<C>(); - for (auto bufferSize : bufferSizes) { - for (auto rd : *Singleton<TRandomData>()) { - TestIncompressibleDataCompress<C>(rd, bufferSize); - } - } -} - -template <class D> -static inline void TestGoodDataDecompress() { - TTempFile tmpFile(LDATA); - - { - TFileInput i1(LDATA); - D ld(&i1); - - TString d = data; - - for (size_t i2 = 0; i2 < 10; ++i2) { - UNIT_ASSERT_EQUAL(ld.ReadLine(), d); - - d = d + d; - } - } -} - -template <class D> -static inline void TestIncompressibleDataDecompress(const TString& d, size_t bufferSize) { - TString testFileName = TestFileName(d, bufferSize); - TTempFile tmpFile(testFileName); - - { - TFileInput i(testFileName); - D ld(&i); - - UNIT_ASSERT_EQUAL(ld.ReadAll(), d); - } -} - -template <class D> -static inline void TestDecompress() { - TestGoodDataDecompress<D>(); - for (auto bufferSize : bufferSizes) { - for (auto rd : *Singleton<TRandomData>()) { - TestIncompressibleDataDecompress<D>(rd, bufferSize); - } - } -} - -class TMixedDecompress: public IInputStream { -public: - TMixedDecompress(IInputStream* input) - : Slave_(OpenLzDecompressor(input).Release()) - { - } - -private: - size_t DoRead(void* buf, size_t len) override { - return Slave_->Read(buf, len); - } - -private: - THolder<IInputStream> Slave_; -}; - -template <class C> -static inline void TestMixedDecompress() { - TestCompress<C>(); - TestDecompress<TMixedDecompress>(); -} - -template <class D, class C> -static inline void TestDecompressError() { - TestCompress<C>(); - UNIT_ASSERT_EXCEPTION(TestDecompress<D>(), TDecompressorError); -} - -Y_UNIT_TEST_SUITE(TLzTest) { - Y_UNIT_TEST(TestLzo) { - TestCompress<TLzoCompress>(); - TestDecompress<TLzoDecompress>(); - } - - Y_UNIT_TEST(TestLzf) { - TestCompress<TLzfCompress>(); - TestDecompress<TLzfDecompress>(); - } - - Y_UNIT_TEST(TestLzq) { - TestCompress<TLzqCompress>(); - TestDecompress<TLzqDecompress>(); - } - - Y_UNIT_TEST(TestLzq151_1) { - TestCompress<TLzqCompressX<TLzqCompress::V_1_51, 1, TLzqCompress::M_0>>(); - TestDecompress<TLzqDecompress>(); - } - - Y_UNIT_TEST(TestLzq151_2) { - TestCompress<TLzqCompressX<TLzqCompress::V_1_51, 2, TLzqCompress::M_100000>>(); - TestDecompress<TLzqDecompress>(); - } - - Y_UNIT_TEST(TestLzq151_3) { - TestCompress<TLzqCompressX<TLzqCompress::V_1_51, 3, TLzqCompress::M_1000000>>(); - TestDecompress<TLzqDecompress>(); - } - - Y_UNIT_TEST(TestLzq140_1) { - TestCompress<TLzqCompressX<TLzqCompress::V_1_40, 1, TLzqCompress::M_0>>(); - TestDecompress<TLzqDecompress>(); - } - - Y_UNIT_TEST(TestLzq140_2) { - TestCompress<TLzqCompressX<TLzqCompress::V_1_40, 2, TLzqCompress::M_100000>>(); - TestDecompress<TLzqDecompress>(); - } - - Y_UNIT_TEST(TestLzq140_3) { - TestCompress<TLzqCompressX<TLzqCompress::V_1_40, 3, TLzqCompress::M_1000000>>(); - TestDecompress<TLzqDecompress>(); - } - - Y_UNIT_TEST(TestLz4) { - TestCompress<TLz4Compress>(); - TestDecompress<TLz4Decompress>(); - } - - Y_UNIT_TEST(TestSnappy) { - TestCompress<TSnappyCompress>(); - TestDecompress<TSnappyDecompress>(); - } - - Y_UNIT_TEST(TestGeneric) { - TestMixedDecompress<TLzoCompress>(); - TestMixedDecompress<TLzfCompress>(); - TestMixedDecompress<TLzqCompress>(); - TestMixedDecompress<TLz4Compress>(); - TestMixedDecompress<TSnappyCompress>(); - } - - Y_UNIT_TEST(TestDecompressorError) { - TestDecompressError<TLzoDecompress, TLzfCompress>(); - TestDecompressError<TLzfDecompress, TLzqCompress>(); - TestDecompressError<TLzqDecompress, TLz4Compress>(); - TestDecompressError<TLz4Decompress, TSnappyCompress>(); - TestDecompressError<TSnappyDecompress, TBufferedOutput>(); - TestDecompressError<TMixedDecompress, TBufferedOutput>(); - } - - Y_UNIT_TEST(TestFactory) { - TStringStream ss; - - { - TLz4Compress c(&ss); - - c.Write("123456789", 9); - c.Finish(); - } - - TAutoPtr<IInputStream> is(OpenOwnedLzDecompressor(new TStringInput(ss.Str()))); - - UNIT_ASSERT_EQUAL(is->ReadAll(), "123456789"); - } - - Y_UNIT_TEST(TestYQ609) { - auto data = NResource::Find("/yq_609.data"); - - TMemoryInput input(data.Data(), data.Size()); - - TLz4Decompress d(&input); - UNIT_ASSERT_EXCEPTION(d.ReadAll(), TDecompressorError); - } -} diff --git a/library/cpp/streams/lz/snappy/block.h b/library/cpp/streams/lz/snappy/block.h deleted file mode 100644 index 2a09a17dad5..00000000000 --- a/library/cpp/streams/lz/snappy/block.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include <library/cpp/streams/lz/common/compressor.h> - -#include <contrib/libs/snappy/snappy.h> - -/* - * Snappy - */ -class TSnappy { -public: - static constexpr char signature[] = "Snap"; - - static inline size_t Hint(size_t len) noexcept { - return Max<size_t>(snappy::MaxCompressedLength(len), 100); - } - - inline size_t Compress(const char* data, size_t len, char* ptr, size_t /*dstMaxSize*/) { - size_t reslen = 0; - snappy::RawCompress(data, len, ptr, &reslen); - return reslen; - } - - inline size_t Decompress(const char* data, size_t len, char* ptr, size_t) { - size_t srclen = 0; - if (!snappy::GetUncompressedLength(data, len, &srclen) || !snappy::RawUncompress(data, len, ptr)) - ythrow TDecompressorError(); - return srclen; - } - - inline void InitFromStream(IInputStream*) const noexcept { - } - - static inline bool SaveIncompressibleChunks() noexcept { - return false; - } -}; diff --git a/library/cpp/streams/lz/snappy/snappy.cpp b/library/cpp/streams/lz/snappy/snappy.cpp deleted file mode 100644 index bdb27db9b66..00000000000 --- a/library/cpp/streams/lz/snappy/snappy.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "snappy.h" -#include "block.h" - -DEF_COMPRESSOR(TSnappyCompress, TSnappy) -DEF_DECOMPRESSOR(TSnappyDecompress, TSnappy) diff --git a/library/cpp/streams/lz/ut/random.data b/library/cpp/streams/lz/ut/random.data Binary files differdeleted file mode 100644 index 6b3c159b58f..00000000000 --- a/library/cpp/streams/lz/ut/random.data +++ /dev/null diff --git a/library/cpp/streams/lz/ut/request.data b/library/cpp/streams/lz/ut/request.data deleted file mode 100644 index 6a29bfe6af3..00000000000 --- a/library/cpp/streams/lz/ut/request.data +++ /dev/null @@ -1 +0,0 @@ -pron=snipfactors&pron=grmult_QUICK_SAMOHOD_ON_MIDDLE%3Ad%3A0.1%3A0.1&pron=umrfull&pron=usemiddleownerdata&pron=onlyfastrank&pron=sortbyfastmn&pron=rtb2000000&pron=tbs120000&pron=multbs0.63&pron=versiontbs2&pron=wffrm_ru.fast.download&pron=whrm_ru.hast.download&pron=rcy-lzo&qtree=cHic7V0NdFXVlb7nvpuXxyFhXgNx4Z0ljURpYFkbwZlxaR2s80apf0VmlrVvqgNIgBRI4kuE6KxZTYJABIZg_VlqUSnIj2hfIAiEAAEELag479k1SrV1KuMvrXUW2pnxr875ufe-87PvvS_JKyrGtQzvvrP3vufs_e2zz88-5-ErcEmsKB4daVSgKrPaKDNsY7QxzhhvXFgSM-IG-d6oMqqNS4omFU02rjemRmejlch4ABlrkNGFjD3IIP8dQkYGzbBfQfgHmLPFCBsVVzztlqb6m6bNsFGFJ7ZYEGtMMqjY2Y8fOd0V67Io0quNC9ClDTEUN2yXYrRRRfiq0SQ0-S6T1M2YjVJXYLc0jkayd1xgTEHtSXNdenqM8NIXD5-OySfzG43kc2T6kLhpI_ejYaNv0I-zjWbzNjNmzi5uKG5BBqmbfbAUz1JaNyzbmunJbM4uIf-3ZZfTRqKKgFa-id1GKpxQW58pYY1VKEmb38SkyebktW6TVxVhhShuek03SFtN28x0sQbGicBYtj2zObM108u-YaXZDvZ5GPkczWyTyzLbnM-IfN4pfN7tfCaazC4UZK0QeLtzNPnI8eipnEU5Gqd-JeR7K7vQeUNJ3LItUtvdzpNBytq8t0QIV5v2di6hPbs8R-XUBeDP7BL4Nws17hY-i5rao9HHCU0ssydQ370F0beqG_q0rAA655roFb5fJryhjWlyuGJ5w9U98SKUei6Kyzx4dme6vrIQFYHB4Aa2kNeq14-qIPDgJcsK2vKT7XIiAFW7egDkDpi94ySgidWH4LvQGMIEQ04Jc6dqobPvJtrrpnGmCjmeNIxoMco9jDrm7FizQcIYEsLY00W4XgljZZktmW1E6N7MLspK-qteKZQNAULZymI3lAHcUDg7aLFwBlCTkLayWA5p_4IBOtJlIDegtyYNoifEvAvSuOtDw6dXxIfYI4mYXk0gwMk0fMzEI1Ri0pfuFLos1JKMpHfsJ1WIsCrsESCwJ9TFOV1Yxb9Mzl8Rx31U8njVwhqUXW32-gB5E8L_oACZKV-CrglAd7HpQpfR62C1Lv17hlVWTNC52HTRiaaaBJ2VmJU4eEAXmFPQEoJHb3hJG6hUdnEUGDy2EJu0MmfuzewOHTw-Pio3eJQ4IW9bXuQMHiVKOmAeJXvaOIxzNIr-qQZ6GQqY_lOtJhYFdqsuYW1Kd-9jf_c7XSvc7f45Au9Awubw_DyH4fZRFKCDSPu-w0lzU1prPe8nChEc4DGj1gpW13G4RLS_ZF3-rpxtx2EFKxJ1DtqU9hwcl2mJL8jUKEetOML_mYAjtGV6icAW2pFm20Id4eDUnCNInJAj_Ak5jiBREkc4OFV2hLXUsBKRbNhnkubGNDSN9MYpRh6GzEGRR69eZ9Qrw8AUwOgNuZlJqeqlSvZB9UsQ_p6ienPCeKC7RD7qJtSQisdQNpsUjh5a7f43YXzV3dVEwUwE1e9thlCTByJ4ilKTyPTaJqkqEcDyb6cjbl0oPVSZbSazNy0mRiYM8vLAZZiWxFFuJNGvpYHUVZqcO5Lm6q1JtEUQxXg4-1Bil0hTzQznwbQjtXWzPGk_wBaRViOuWBBxa7aS_7tyJuXyanLVadSkkYcIfU-dJ3o0jhLR82rmKDCJSDAR1zm6EP6-Ypxo5onMrmxHqH0e8MzjcECx9bvMQA4BsdEDETm6no2dsr7E11dNfelpQW3djPoFjaH9yfFzvKUnhwUC1gnekbgkpOLHz5Gx9V0c5YUqvDq9qkdgeA1X4XW1IEqAhLU6vbVXFQaAioiLOJKZuAnYrbZQNbO9M4nWqXD1W_1aDXQezQ22ETzUSh_xVgsJNaTWiUyrpJAolFDLGh2FSQFTARSIlCqOpguZeKRZYVUVVRujS2M_jrcg8hjJ41FmVZ8QQSJMGSSGNi_5MkFNuWFMS9iHEP6hosAYXamcUdM4x0ZjR6MqR48xQI9rHq509egxQdpMMm16JKOp4iSN_hX2CgVome1pGQoCSnUsjLZoK6qs5BbLbdzDFp6EKQRMVvWgheTopChrkv8ycgbhGb6aGlIx5ltV51WcN7biS6Qx-y2Ea9Qm1dbNr6lrqk9R4-daFdCkT372757SPG7_VXKPRG_TldgrLPAq-WgOAuoQVjXtu5GCmbVWLF5-91VTEvadhcTMS7p3WdRsIF4sQLkfPenFLsYI6bWWzwppsa7TSZgV5KtPNsiryWPb4QWEk-pYiW2oAKiBYvLLH47wxkw-uyoz-ZCJ76ggbcBU-L2UUJQsicRi5ce2zk3YfzRxrTpfIBOrLjoKpqtgmSekzhOK79sPPeYBR-GFtPGhM2OQKR3NSDNnhSRgxvQzhOMysbN8gJzpxV4yvVjfKYz1CjG1EGaY0tqPPrVA6oDKsYSRPI6Iv7I-_qgOxCjfapMsEAUs0H3fsZW5oSFnglQ_lw8NOYGORTLA4kXCkKAfcEQ-Ac1IHiA6KL-otDlhbzH1aE3GT3Vz67nrBcae54_m-mmXCWrukxxpHo3e4snYKwyZa4QPBfnI8kpYYiGc2qJOTZy3h455Lty8IGFvRPo8r2HGTEmBUJ_V9bCnQEoP6S7B-yxSqmvtLEy_F_qsSPu6tDKB8Kv872nl_7OBQOBlHe_FJGCmSNgM7XLuXW95cwqHB2pEHZ9SOBR6Q67AblmhO2C3uetGkOZ-uIrY6q4RBQzHR4rwgjw2GaDgXJDNhgNBmw1ocK9hcK-hb3sNr5biZg3PO-gCL10IJZ-6ef4HMCaD8LwvFyAAMRCgf1niAFqj1gG9fygW6bZrG-40fmw5MH1w131w131w1z10193rQr9K6T0cVwuF9u-QfPbU6zWYxfuc8tWX5DP-bp4wJfsnC-3ZDiFpqhprXb0SsgRpbIp5rs5BOn3fKaky3fOfkPNx4p5SMk68dPX8hP1YKW4ICIXb3VTIscFDOp8QuN0_H3KjHgK3ezmRSgh8Mo8QGNly8MhgDByMgQOKgb6pj4MxcDAGful6jZMZA1X_1GPg-Uof3o9sRy9-raXxa97q-oR9ZyluUuLXCPYaJUFZimAYiGAtr5a6EQwUAMWwpTyGgfR6FDs6FIOUQhwz7zhC5nIHifaKCD43n4KYHEzz_6Kk-auWF2NdhLSf4fOUR-DgWGpwLDXgLH6fKHUoQqIUvp7MsrZH9CglH6Ih3Q2pZmiUOvFf3jwLFABFqU6eQwfS61HqU4RBSil9cr9_-qSQ9CgBBNq9FIEavifKhxTLPWMGvK1_bwgw5fvFxJSfPEYGHK8Va2vHp-nnobKtNL9OMOZQwJivvzTBNaaPCMicL0aZOX04dIOuiWIfWtGkdxx8nu5AnkaAPSzT5Xb1lMpxSsuOkuGc-1xGnjF3UpmGrst7z3Q4t1N53i08E0dnecfiO1Z4z3HyTMOQv0QeqHaToWSr56YUI-rTcuF9i2RpQpvY-6iLC99EifxtQp3ZG2n36EmV38jL27l-nbcUKXU2FQlxQhFjOxm5mtJ2divPvYHvbPPeOVzQpNjyNo9jBOEocTvgL7mNuRX7YtVhxKqcYnmI199OO_CL1y5I2CdMLYmtxHOqHnpKJSRnInOkzPV1iRHy8I95IoFEp_v1WoQlCmGPkyegkM7Znef3CNGwh8VwtbsOT0MRY35eKSlOhnuukr3akRShPkGzPTNWVV59XhOZ7Zn6Jn7jnGk3zZ4Wvom_8q2R3ia-wwMp_xEnMdgh0Xfxz8duGcu4QOEJhKjZpHv_OleBsl2olozkJpqKN_OREU_a91n435Cipgr5SDl0RFDQXxzKu3p_8ddcBYZKgzT7v3wcEsqrQ30bwqFcDP4ot8V_bjxuj6H7yiGM0F76uPhwe3Q_-IQ9eJqDlboEh0hhuQHyNkBOAt0GuCS44X3d-WZgsYhLHbFiZ5a_89T1CXuXpaVGDZle09gwd1pTXb2QMQKt-i99-m9cROR4INM_F2GmzxHpbvXXOFfaF8caB_NpOUKI5eGDtP3J7ETs1Ejfxfl6darKR1qL1gw_ylaN8lofypCMsyEE08BxFLDzsQienFS7z35562CqXf_Styzmlb-hWvz6AqLFZ038j2oC9MxUTY2kQSjx-eB-T4OMAdLe61x7rFzX3IWYFYhtlCDIm5LKdX6NTYKONF6_g1SuwpGvwoGKtOZZER_97qcnHJaMuTlhd1p4qqJfnOtaJS0XAVp-cdVcV8sCG6Tr3bznE6j08PYwwkK5EMi-EOcUaSBb5VdDq_2n9Izs51y9KlwixkX_I5Qsy9uj1KJvjLzDb0vdxdByiqE5V5M5wUcRfIu29aAOE7ozO0MXdZ57_21h7wGQAB5gc1Z1IHodYvuAxETvtLMXaIo2prsJ4qx15B_FLIVa8wxf3x3ez7W5FdIMpMOv3v1KO4QS6jkcHqRw-OzYDQl7mZUXHHpC4bDi6ftmBMGhB4LDwogvHHp0OKxDIBx65L6nkI4NzR4DnZw59qN51bPQfWS_6uqDj-N04fDpi-cn7KPF-DZ14VBrG5sRhC4cZt64d5l364WPEAgkzzpLhzCHDpMdCPvQiiGg5aF0dzKykZph3T5nBrL5pG2WaV0GA05XXjVvX-VgXL3gwVlwA65lkKvHl6L0Hbs-92Gs0h_kU2m0NGltTBNlR9al9wXey3HyNyr71-wt-TTb646-EKbycfZP6GmTrxu1Cfs4AsaXT5C2tfDLYULGl7uXluXGlx4b5NLNzvDSI9K9eAw7gU-KQ-6DGYsFMeqJiYDT-l7z_4dOX0p_PCthv27iuUrz48S8XSzc9pK3qAtO0GRw1bve_YoaM6SKN_i0RqPVNbIIYY1KbfCoeIx0lHz9SCSE1n3s-FC7LA86cXXHSQuVucLWg3wU30oHIYcua0rY70XwPFXxom_lpfjtn-70zjtp3JDm3-NjUY1W1_zP6clJhUrwcrNlZdLc1Jk0N3TSA5RJ89FOeuEC7ev2sm7vcDKyPr2P_tlPQg79s47-2USKIxvon_X0z6P0zyZKt4mWbqCfNnAOUrCx8xmhC6XU7A8t7jwsLaCg1NTA6jqzH1rhTWQAsrGTD0Ro5TekeQPWp3kjHk2zhkiDFPaGavkN_VjR4xh4njrf7QfJQGO3GYwBemo1FAOPPLYWgxig3OBEF-kYoLQ6Bs7VWrxZwTwSMZ_6Z42-VzpsSzejB2ICH4Wm6ebPlbdPTdirIkBvtoigYVe2g3ivPmaDFPrmi9fkejOFGdLng45PqbS6Pt-jvZlCJeaUtXSfSiMG__DzAo2-H9zbnLD3IXy9erY5dUtjY2342eb7fuF1fQ4LZJzr-MlmTqAvoU3ATtFALuWIxWOkUfdQtz5_y60JeyGw98XfUhe69_XRf3vntV0eqFn3OntfDonesDHYLfNdHmRLd1eAdIVZKuV6eYF657VWPTF2BDdquTUtbM-6lS5xuBe7hc67X_12LrUG4IcU1uOm1gD0uqO2mxiklE-HSoswA7t3r-9LKSch0Q30YG7UDgr2TAfx4E-Bo-YEUaFHzXs_zh01J_SQze7jIKfFOsC_hen3QftPyq7N5SpDPzeTfGD-LoX5d5qnJ-xXIrhV3dS1SXe_jcTEbnpvn3yNoaSpUujEzkPHPVUFyIE0-DRHfQCXjv0VJg6gH_QAx97vUA-IbLkxYb9k4pvVg1lcaSwVpo2pcXPowaxjv3jXu4of4AcPJ3MHAajBJBSATsoVdFJR3HV41wonMQnFR9d_oLp-6T8aEvavTSCnz23V7bxN2cXkc3hOX9f7V-dy-kARkMqzyMnpAzl0tT-IsA8tpHr3tgMfReWdppmXuQIUzjaJZ6L5bJP4BnWT2GlPT-gW57H0wtwuscsFaXUv1SrNtnNodD3ej7BXKs0plLXvCQJoKwUtVApaqBS0UCmAtlIAbaW0nlwpdB2VAmgr3VnJVCgkrKQhYd5bsxL2n4CtdrdfDdXi8baxihKzrZASO3hn79EEKTHbKiWhfc47g3SFZYxwH3LQvqBI1-tP5wPst-n6y9Gz5ibsFy3cokVp8XZdMkXbkV2WXQLMGqEovXqZl3MVIAZMkeAbQgFcuiWXRnAAfUCQHhMvtUexxTKQG1wMq4j_hT0SpP9zXIryeZ7bKMwkl0PtMPlQ_tpPahP2Dgv_EzQfnFM_L3Q--ObOD6LShJAwQSA6HMlNCAmJPl6u5DPdOfWSz7Ch7TzPuc7HroC-JHZVQVxgWtcEWP66JEqrA3cpIVNn6mfq1vdAWf3MNaICx4AC9UwwmE7LAwMnFwa9HCtWvvSBU_9yLBzHpLkP0cD5_bduSdjLI3o2d2YLO5Gqd8vQKtHKp8Z72dwiI9Twe3gAlej0rvd3CEsUX60FvGHxYaRv-zhKDHT_3U0J-50onq1dK78w0-OMeNXzvBAsW1YmcvfKS6yQkf7g_sCCRKmb6RwskYRc4nF3EVYkSkduDhzhvYMpTYxOvROXX5i7WJzDIe1f3ZsPArzvAI5Z5T0VNWR2hgt4d-ABU3NlPH3aTXNmpepvqZsB3hkIHnx8dai3I55jh1z5EJ9LC1R6sLkaC8UDXqJOTfET1_90Y-Xa4BcRTilaHFpb11Qzd27tLBqkBTVqV9ZByxSL77jOVacoB9LnFKZOkUrX5zgslosBXNsbUBr2ip4pEGtKTatrnFmTCmwVtMd2d_tp3pzWFQI16ddO-rhLA16p7RYOHB4_goX1BRzshyBSMGwsf9hsNfF07bxUTWp-7U014O2G4N7RPV6qmcsL6bTXPTfFScABnlM2cI1eA8oKTjX3O9QQcp110JN0sxbtRY3kE_Sq6zcWkTH1moi-CclHeKG7GL9tieV-eYOxQBrfwQeWDgWYVu6UyasyTrrk-s7PfXXmLBxzxrwhazOcKjhfOydNuygtaAWHm40M0mPl437TyLZZtaFnpivTTUYGT9AGKktrkMf0_n5M7oJyiRUyY7t7QblEqZvzBqyQaEu9_U6CgAYFZfEyopc9FM4398xN2I9FgJvbvfrQO-pC9fL49l_FAcVQ3oB7CxRKcA9CofkiHqG4MaCSVvtP9w4wj8jHfr10uejOjtkJ-3Er2H554Prl5_eaoP1gYG-O6PaDgD0OKyQBN-8fNXGZTOxNlr1Fkkh6x75c1yCZ-su7htj32cCo-BCewCjrK-_zDRxAR-gPBuCLfvV39i6Eb1QPijo_Q9TcELoPuXTn5d5RUY8LQs2V_KSoR6MPJM7GudJ4vr8mRNszgsxyVtM9qAefXZCwVwT9xlSIJ-T3G1NrtN-Y0n8BoVA_MTXw34QiKhrBVLST5lHd-vOmhL0B6acQs4uyLZJ-oB-KOvHpmd4pRMoAaec7_BAiLdb7hArMCgTHls2rw5XX_YRFJrGrRtYl7N8W8vdoFptaOne0uSlVM68GnMBCS4YHX77MG9NxVkgpd3HIOBQgYnjRwBetz4ZEaUvMyoTiBMI_UuehDTWpmfWpedPqfCYV0Pzzg3e9E28iP6SS-Xz-KVDparkGi-WFXkD2H_NT0BnUYWLlh38y389hMntDHabtrssFh8nsDXSYzF4fh8ns7aPDGORpKToTs19MKTs9huxy4j9fSxdPPOMv0ZUXVRjfpHWodmiIFhya08svfu22iWcYRstEXxq7nBZzGvxN-k81cmkshwaXU94zxuMbLtDkWN67ai--AnyXpcq5y06qcixBzv0N_xoix7_OVjzmyel48o_fPuPYvrGqnKhA89RzV4HvytH4vwvHsUMTKz990e_-FpKTozm9_J1ru0No_N9Fpj-hNPF43HsX03Pzm7ep7yKjBQ8_2bXVE8-Y1ZpVbUEisEfz4WcTQZoRAk3VDzsuVmnKHGzgWGxKNIbKzOsm8y-pYr0vJ5Mvh5MvS0jrhpIvi8mXkWsm1_BvaT3Eb4k__D_2jF58&rdba=clon&relev=ad_cat%3DO;ad_filtr%3D10;cl%3D2;cm2%3D0.0181118;cm%3D0.0869565;country%3Dru;ct%3D520-87%3A11886-13;dmoz_th%3D174-83%7C179-12;dnorm%3D32+autocad+bit+windows+xp+%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9+%D1%82%D0%BE%D1%80%D1%80%D0%B5%D0%BD%D1%82;dnorm_nav%3D32+autocad+bit+windows+xp+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE+%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9+%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C+%D1%82%D0%BE%D1%80%D1%80%D0%B5%D0%BD%D1%82;dnorm_old%3D32+autocad+bit+windows+xp+%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9+%D1%82%D0%BE%D1%80%D1%80%D0%B5%D0%BD%D1%82;dnorm_w%3Dautoc+%D1%81%D0%BA%D0%B0%D1%87%D0%B0+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB+%D0%BD%D0%B0+%D1%80%D1%83%D1%81%D1%81%D0%BA+%D1%82%D0%BE%D1%80%D1%80%D0%B5+32+bit+%D0%B4%D0%BB%D1%8F+windo+xp;fe%3D6.48773;fir%3D0.267373;forum%3D0.59255;fqwg%3D5.218048216e-15;frqcls%3Dstrong_tail;fsm%3D177;fsml%3D11;geov%3D-0.000436704;hpq%3D0;iad%3D1;iad_vw%3D-33.57460785;il%3D0;ilp%3D0.001022;im%3D536870912;imgintent%3D0.56;is_music_ext%3D0.000;isorg%3D0.460;issite%3D0.460;issoft%3D0.750;ldatopicru%3D197;mum%3D0;mut%3D15;navmx%3D0.268605;norm%3Dautocad+%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE+%D0%BD%D0%B0+%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC+%D1%82%D0%BE%D1%80%D1%80%D0%B5%D0%BD%D1%82+32+bit+%D0%B4%D0%BB%D1%8F+windows+xp;ow%3D52;prel%3D3;qc%3D3;qlu%3D1;qmpl%3Dru;qr2r%3D0;qr2u%3D1;qr2v%3D0;qrr%3D0;qru%3D1;qrv%3D0;qt%3Dru_nloc;relev_locale%3Dru;synnorm%3D32bit+autcad+pyc+winxp+%D1%82%D0%BE%D1%80%D0%B5%D0%BD%D1%82;syq%3D1.136661591e-07;th3561%3D0.0179;th3973%3D0.0682;topicality%3D36.0447;tvm%3D0.00222546;uil%3Dru;utq%3Ddownload+here+upon+russian+for+autodesk+inventor+auto+cad+%D0%B0%D0%B2%D1%82%D0%BE%D0%BA%D0%B0%D0%B4+autoca+pdf+torrent+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE+%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%B8%D1%82%D1%8C+feed+load+%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B6%D0%B0%D1%82%D1%8C+%D0%B7%D0%B0%D0%BA%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D1%82%D1%8C+%D1%81%D0%BA%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D1%81%D0%BA%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F+%D1%81%D0%BA%D0%B0%D1%87%D0%BA%D0%B0+galloping+skachat+besplatno+free+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%BA+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BD%D1%8B%D0%B9+%D0%B4%D0%B0%D1%80%D0%BE%D0%BC+gift+%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE+freely+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D0%BD%D0%BE+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BE+%D1%85%D0%B0%D0%BB%D1%8F%D0%B2%D0%BD%D1%8B%D0%B9+russia+%D1%80%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9+rus+%D0%B2%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9+%D1%80%D1%83%D1%81%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0+%D1%80%D1%83%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F+russification+%D1%80%D1%83%D1%81%D0%BA+%D1%80%D1%83%D1%81%D1%81+%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D1%8F%D0%B7%D1%8B%D1%87%D0%BD%D1%8B%D0%B9+russkom+%D0%B1%D0%B8%D1%82%D0%BD%D1%8B%D0%B9+%D1%83%D0%BA%D1%83%D1%81%D0%B8%D1%82%D1%8C+background+intelligent+transfer+service+%D0%B1%D0%B8%D1%82+bit+%D0%B2%D0%B8%D0%BD%D0%B4%D0%BE%D0%B2%D1%81+%D0%B2%D0%B8%D0%BD%D0%B4%D0%BE%D1%83%D0%B7+%D0%B2%D0%B8%D0%BD%D0%B4%D0%BE%D1%83%D1%81+windowsxp+windows+xtreme+performance+%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE;vcomm%3D0.248625;vintent%3D0.95;vm%3D268435456;vnorm%3Dautocad+32+bit+%D0%B4%D0%BB%D1%8F+windows+xp;vnorm_dopp%3D32+autocad+bit+windows+xp;vnorm_syn%3D32bit+autcad+winxp;vqi2tvec%3D1%7C0rkjACu_CrE81xPoE93gAB5X2uKgUsx_JvATChj78_A%2C;vqsemvec%3D371364212%091370421533%093362250591%092760956004;wizqbundle%3DehRMWi40AQAAAACAUzAB-F8KZipZehRMWi40AQAAAACARwAB8wYSXBJGEgdhdXRvY2FkGAAgAioMCggPAHNzEAAqDQoJDgAQJw8AJAsKLAAnEAEcAIRzJxAAIJMCKh0AoDICCAI4AUAAIAAAAAAwo7-XscucoK7PAQr0ByrmB2oA8P9S1AMB9g8SjxcShgkSDtGB0LrQsNGH0LDRgtGMGAAgASoQCgwWAIfQuRAAKhYKEhIAfbLRiNC40YUYAMe90L3QvtC1EAAqEgpYAE3QtdGCLAABRAAt0LwYAH290L3Rg9GORAA9vdC-LABRtdC80YJwADsYChSgAAAcAB2DMgACdgAP0gADH7WOAAMh0L4CAQrSAD290YtcAAD-AD2w0Y-6AD-70LiiAAQRs9QACloAP7vQsFoAAS_Ri54AAy_RiwABAACKAB--AAEFA14BCjIBAjIAApAACv4BHbuOAABEARG1dgAKKgAdveYAAMwBMYvQvAABCuYAD2wBAQBYAB-4WAAAH7KCAAIRuGoBCYIAATYCCtgAAlQAD4IAACHRjpQCCZYAAAADLxAB7AIAAtYBNxQKEGQCX7XRiNGM8gABI9CwSAEMMAACqgIKSgMCeAEABgMJigAARgAN9gABLAAB5LYA8HMB5AANigAAFgAEigANdAAh0Ys-AQ8YAAEA1gMKYAATuWQDCi4AAGAAH7UaAwARu9QCDywAAAG6AAoYAAIgAna5EAAS6A0SYQQyuNCyjQEBjQQ1GgoWdwECGgAzjtGJgQII7QEBHAAAawQBQwINNgABsQACyQENHABP0Y7RiRcDAANSlAHwZdMAAhoAAusADU4AAGoAA04ACEkBAzQADzIAAQCAAA8NBQABMgABlQIKOQECGAACwQI_HAoYHgEABPMCD5wAAgOLAQ6cAAAXBQ8yAAMC7QUNbAAA6gAFxwQPOgADAiMCDToAAfIABDoADx4ABQLBBA5YAAAaRwDw2Q0cAAFYAA_mAQQBrgACYQQNcgAA5gEAYwUBSQMNVgAAHgADBwYOcgIfuXICBgGoAAEjAw9wAAIFKQQOVAABHgAPKgIHAXsHDsABACkFDWoAAhIBA5MEDtoAABYDEbhbBg1QAAGxAw0yAAFQAAJDBw0cAAJiAQ-aAQgCtQUOOAAAKgEC9QcOHAAAogAP7gMHDoUFAR4DALIBAaMHDVAAA8AAAKUICI0EAjYAAn0HDTQAAk4AASYBDWABAfQAAcAAC4MFAlIAAL4AAP8HDzgAAw-hBQECOAACNQgPigAEAQACDhwAAWwAAXAJAOAAUgICaQYOHAAAOAACkXYA8GcBOAABCgIOIAIA6wgPMgAED4QFBAAoAQKxCA4QAQFqAAOoAg6aAQKgAA42AAC8AATuBA4eAAJUAA9IBAQBCgICWAANxgACHAAB-AAPjAAAATsIDTQAACYCDxYBBQJQAACcAUcgowIqHAsA3wWgMgIIATgBQAAgRQT4AjDk_fqeq-3Q-OMBCqgCKpoC9wPwCAgBAf0XEr0GEqABEhLQsdC10YHQv9C7-QMA1gPxARgBIAEqHAoY0L_Qvh4An7UABPAlGAoUGgAELxYKUgAAHxBQAAkftVAABn21EAAS-AQSawBv0YvQuRgApQAKD1UABR--vwAFTwME-4W_AAKdtdC9EAAqGgoW8QBfsNCz0L69AAYAJwEPDQEFDz8BAT--0LyAAAI_vdGLZAADT9GL0Y8aAAYfhRoABQEaAQ_OAAFfvtC80YM2AAYAnAAPtgABEbCEAA_oAAEfsEwAAyHQvoIAD18CHgD0AQ-IAQQfvogBCBG-1gEP8AAAb9GL0LzQuKQABAFAAk8gowIqzAIAKwHovMHs0NOEgNjdAQpIKjspAfEAKQAB8QISJxIUEgTQvdCwFAXBCAoMAGEQASCjAioLbAUAdQESAWwF-AHYpuGipb-7vI8BCu0BKt8BTADxBM0AAfcPEvEEEuwCEg7RgNGD0YFyBRC4NwEEbAUhaL5RBREoAAWRFAA-vtGOFACIZwXgFAoQTgBN0LzRgxYAe7jVAPAfEAB6AAASAAw-AB-zkAAAP7jQuXwAADq8EAG4ACHRg6QAClIAH7BSAAQAugAK9iAA8Cm8ZgAADnoAH7geAQCPuNGFEAAS5AFvAQIKkQAPIQELDCwAD70AAw6VAAIPAQo-AA_7ACsP5wAGSO0AYy4C0L7QvPAAA2UC-QDW3teX_ICvr_gBCqMBKpbwAPEMhAAB-g8SmAIS-gESDtGC0L7RgNGA0LXQvdGC8ACiFgoSFgCg0L7Qst0A8hMMAAYuAE_RixAALgAAP7DQvC4AAS_QsC4AAy_RhS4AAnq1hgJQcgBv0LD_APIESAACH752AAN70YMQACoSCugAa5cBFRWXAQOnANjLxM6v-_j5l1oKRyo6lAH0GCgAAXQSJxIZEgswAQDwDTMyGAAgACoGCgIzMhABIAAqAjMyMgA4AksH-QCA877ojIGuoecBCqQBKpfvAPFthQAB9hESvQESMhIDYml0GAEgAioICgRiaXRzEAAqCQoFYml0JwsAcHMnEAAqBworAEYQARI1NADwAQsKB2JpdHRpbmcQACoKCgYNAEdlZBAATQAFNwAgQBJgADVlGABsABdlNQAVbgwAAk0AAoQAEGWEAARCAEAgkwIqg_AAB_MH2J-xsZ7qkK_2ewpJKj3wAPECKwAB8wQSLRIYEgbQtNC70Y-KAVIKCg4AYzsBEQ1LAAfSAunHnYGH9bv932YKkQEqhPIA8QNyAAHyBhLFARJBEgZ3aW5kb3f1AGEMCggOAHPnAPEaCgocAGMQACoLCgcaACYQAScAZSdzEAASQkMAPwAgAjUABzINCglCAFb8APEKRAB0ZWQQABIoEl8AD4gAAAh8AEQgkwIqK5QAB98A2MbplNn6pa_fAwpDKjffALElAAASIRIQEgJ4cDIJcAYKAnhwEAFFADoCeHAXCdiHlbXAt_bOjnUKVypKRQCwOAAB9AcSQxIsEgh-CUFkZXNrTQBgDgoKEAB1wABiKgwKIABlWAAcD50A-QDmvbXihY6InIYBCpgBKosyAR95WwAcJPEHtADwHxJiEksSCGludmVudG9yRQA0DQoJEAAARAA0DgoKDwAEVAAEEAAgEAFyAAQOAEF9AUdkAAQRnAAAWgr5ADC5xvmm0_qipSoKoAEqkpsAsIAAAfADEkwSORIE9gAB8gBhCgoGDABx8gBwCAoYAGAQAcoBQBYAVGVhAPUAIwCBZXMQACCTAiokAPECqgAQRAID8A5jYWRNAGEJCgVjYWQ1ADAICgQLACMQABUAAWEAIP4CfCAQAUcAAAqiAK_p2fTEnaq4t64BowAC4PwREpoCEvwBEhDQsNCyVQQAswoj0LSbBWAYChQYAJwcBAFTBIEyAB-1FgABjCAEURYKEkYASgQCVgTwAAI_vtGOGAADL9C5RgABingE8AIqEgoOdAAvEAGIAAGL0LwQAPcEES2jAAASAwNNBOjw7e2q0ZnMoLYBCmUqWDoCcEYAAfIFElYQAwBEASFjYUYBARADEEYyATEOAHNNATAKCipwAwBNARAoIAMAQwERGmcAB8QD6JGI7ved-9fU6wEKfypzZwDzBWEAAfUHErABEkwSCGRvd25sb2FkegNQEABkEAEfDNEeAHRzEAAqDwoLDwCUXgNxKg4KChEAb2ID0EtOABkHPQAqcydNAIWTAACCAByMggCeq4T0m6vIyclDNgWhABIkEhISA3BkZuMAIAcKCwACEQMACgAEDAICFQfosbOQvtqmg6CnAQpjKlbKABZE6QxxdG9ycmVudE8AAekMAcAAAekMwBknDwAQJx4AJAsKO-AAAK0AHA6tAPgB_Ma8_MTw4JzsAQqrCiqdCmcALwsF7wjrJPANtgfgEpoYEvgXEhLQt9Cw0LOFCODQtkIDJdGMmwIJGgBj0N8N8Du1qwAAkQAGHgAzt9C4HgAANQIKHABzttCw0LXQvLkBOxQKEHAAAAMCAH8BBk4AMLbQtd8ADS4AU7fQuNGCQwEILgABYAADKQEAl4YM8AIFKwENmgBl0Y7RidC4AwIGOi8L8GMF6QEGGAAAbgAACAEEOwMPUgAEAesBOBIKDuwAAZ0CCuoAAWYATtGMEAEYAS_Qu-oAAQKwAAFpAwzqADG10L2dAgLTAwqYAASgARG40gAKbAAAHAAAHQMNmgAAUAUNhAAALgAAAAEC4gAMhAADigEDJAK2CvAWHgARu28ED5wAAxW16QIJbgEC8gABDwQKOAAAUAABigABHAAK1AYA8WQNQAIAFgAAoAIOmAARtVgCDBgAAFIBAAUECngABQIBDzYCAyHQu5UDCjQAAkwABM0DD2gAAQCHBQ1OAQH8AARqAgweAACeAB-92gIGAx4AAaQAD4wAAgOQAwwcAANUAQFiAgAvBQaMAQX4AA2MAAQaAAQchgDwB1QAE7VMAw5uAAIaBACWAQ8cAAIDVQa7APAbcAAfvFIABQE0ARG1wAAPMgECAOwED4YCAAMyAQNfBwqOAzG30Y8gAg2iXwHw9AJUAw0cAAMQBQStBgZIAQEQAS_QvPoEAgAQBD2I0Yx2AwSeAAI0AA1sAAGIAA98BQUAJAMCHAAMeAIBfgEPbAAAA1AAAZADD0QBAwRrBwqKAACYAQBuAAKmAA5uAA9QBAEDhgADeAEK6AEBHAADEAEMiAAE2AAG8wcKYgEfuSACAgSiAALyBArmAQFkAQ3cAgRqABO4bQcK8gABNAABNgIA6AEN8gAv0Y44AgMAAAIDnAMKJAYRt14DDGQAAuwAAlYBChwABdAAAQQFCiQBBBwABEAECjoABFYAAvwGChwABDoAAr4CClYABR4CD0YDDABSBgpgAQBWAA_UBgIAKgMDvQoUAvAeMgAAUAIEfAEPHgIAAEgBDcICAzgAA1QACtwAAPgAADYCAmEKDbIBD74FAgNQjgLwAw1UBgEcAA2CAABmAAK6AA_aBBcBQQA0Ag4XAvGyD1IAAQKWAwHCBw_UAAQPoAAAAbABD04AAQDOAAPLCg0GAQGUCA-OAQUAPgEAZwsKrAEA8gAB1gQPGAIEAtgAApgFDr4AAPQAAgAICowAAF4BAjQIDW4AAw4BAowADlIAARoAD_oAAgIaBwItDQ5-AQHEAA8wAQEBcAAChAMPNgADD8IHAgNmAQ-mAAMCigAP_gYDAxwAD9gDAAHSAQC2Cg-SBAkDDAINGAEAOgACGAECHQwGNQUAewbQgtGMMgIIAV0GEAEUEvgBi5Xsua2Avp3ZAQqeCCqRCH4SX_8DAfoTKQQBAB8OIdGMMgpyHAoYGgD3ATAEANENAt8NBDQEYx25HAD3AjMEJNGLvwwQOMkCIWqPTRKxhgBdtdC90YsuAF85BPIJYAAFb9C-0Y4QALYAAAJ8AD-80Lg6AAFvOQQghADYAvEKAbIADwgBAxOwCAEKugABNgAv0YxqAAcBIDsE8QgEAS3Rg-oAADQBH7tGAAgfvOoAAHO10KgSYZgAD6ABAy0EwIQBALwBAFAADcoAT_MOwGgAAAFSAQ9oAA4A6DEN8Q4AOgAfuzwCCQHAAQq4AAAgAgKiAR-FDgEBAXQCAiIEwQBsAB-yVgECD5gAAx8EEbAfBPENAgEKlAAAMAEACgMPNgIEL9C7agICAEwAE72kAiEEglQDDWoCAZ4CIQRDAVIADyAEs9oCCsAABRwAAQwCIgSAEgI3GAoUqAIiBC8UAiIEASOeAyIEZi_QvooABB8EGTYfBLwWASHQvqIDCyIDISAEogFIAR-1ZAEEP7UdBJBABB-IQAQCAdAYEgccBBCs9wAAHAR1iAAPWAMBAhwE8QAxvtC8tgQKigAECAIP2gAjBPQEUAQKNAAAGAAADgECeAEPOgIBAiAEbwKIAA44ACAEBPIAH7hCBgQCmAERvugBDWABHAT2BAIQBwGcAwoMBhG3XgMOIgEAxAEcBBkgHARoBdgAAYYAHAT5AASSBQTsAwo6AAYQAQBABCEEUS_Rg24CIQTzAvoABHwBDuYBAAACACgICoYAIwQQHCMEZwE2AAEyASMEIrYBIwT6BA9EAwEA1gAD8AcOggAC1gAAEAkjBIpqAg5SAAHUACUE8AgPuAIGTILRjBACCgHqAAIGAQH8Aw0YAgoCNW4CCyAEphG1qAAKkgEAdAAhBCAABFEAoBoAAVIADBwAAbL6A_YADn4BAIwEDvQHAUYBI9GJJASCARQBDy4FAwQkBPEDAqYAAqYCD_wAAwQWAw_gAAMCZwJwAU4JAvwASuMKW3ULAfcBFBHp16ff677V8PFICo8IKoEhBNHvAwH3FRLkGBLAGBIUSggCNxY3uNCyIwRwFAoQHAC3sFASAh0EEBZiFBBBRQiQHAA9FgoSHABoWBbwABgKZgAASgC9vdCw0Y8QAHgSoDIAAU4AATgACmyPAZAh0LNsAAxUAF-dCHC4VAAMHbzAJBNkE75UAA9wHBIgxABdBPMDEbWmAD8eChrEAAQCOgAP5AAAQQTwET4ABgBcABOwlAAP6AADH4U8AQQAOgARuOgAD5YABQRYBwDxDAAByAEPmAEKIdGLXAAK6AF_sNC50YLQtZIAB8oSUEIBAFG9tATgOAAPrAABA8oAL9C4tAF9CPGKE7UgAQ_IAAQh0YskATcSCg6cAQKOAg8yAAcPkgIFAnAAAJICDBQDEbugAAqkAQEUAwBGAy0QAYAAH7sIAQAAXgACdgEOXgAesBYAT9GO0YJsAQMBVgIRtVIBCpIAAVQDA6QBDNYDEbXSAQwwAAa2AQ0wAA9-AAUByAACggMP0AEFBLQBDG4AABAEEb4OAw-cAQQh0L7WAA8ekwDxIjwADNoAEbsoBAysAgGmAA2GAQG0AQNwAQ-eAAADTgIKIAQCNAATuVgBCjYAAhwAAiwJAPCyggAftVYECg9MAwQD4AEA3gMPCgEBAdoAAQoBD3IAAQT4AwwQAR-1wAAJARwCCjIAAtoAH7LmAQQA2AATi7YDChIBBKAAD9wACwBkAww4AAIeAgA4AAwaAAbyAA-kAAEAbAMLFAIBlgMOIAECigQfvBgCBQNyAwx-AAM2AA9-AAMBigYPCAMAAcQBE7giAQ_GAQUC5AELPAQPRAUHD2wABQGSAwCSAQDABg8UAgEPiAAIAqgAAUQFD6YAAAEeABG1kv8A8poAA3gAALIBCnYAAjwCAJIAHYuCAwFQAQOkBw84AQUAOgAAzAAPigEBAmQGCggCAN4CEYjyAQ9SAAAA3gIF-gcPUgAAIdC-4AALQgIADAQPfgUDAFAAA9AGCk4AAvYAAioGDxABBAHoBQvwAQ9kAwUCfAED_gYNngABSgAKgAABWgEDJAUPCAEAAVAABB4EDIQAH73sAAgCcgEP0gACA1QEDxwCAAFuAAIGSRfQsAEPOgAEA0oIDx4AAHEG8glGBw8eAAUCsAIMHAEARAQCGgAPOAAFAq7cAPAOzAAAkAUPzAABAFoAAL4ID3IAAgE4BA9UAAYB0gNDAPAMADgAA5gCClYABGQCAKILChoAA4gAAXAACh4DiwnwAuQCD2oAAQG-AA8ABAoBbgFIDgRZ3QsCVQAzCBAAMwj4AZy27ceGip-f2QEK4wEq1gEzCNHEAAH9FBKMBBLoAxIU1RQARxoBEARh0L3QuNC1NQiSGAocAK7RjNGOEARQNgBv0Y9mD1A2AAEAUncPQDYABY-UFAAEBBBSmg_wAbhwAAUv0LVwAAgANgAPwABxA_AAwAAFL9GMwAAJL9GP2gADGQDwARoAA0_QuNC5GgADIdGM1ADYAvART9GM0LXuAAMAGgAB7gAPegEAAIQAD0QBBQAcAAJEAU3qAEzPAQBF-AT4AJi7qpKGyID3PQrsAyrfA-YA2s0BAfsXErYLEpALEhbmAAAZCSPRgU8TYB4KGh4AcPEMYbXQtSIAauUEwBQgACPQuxoADToAjzcJABsXQCAACU9OG_IIIAAKM7DRjyAAKxoKuADr0LvQvtGB0YwJAfAGlgACXAACHgAPOgABBBwAPyAKHDoABw3wBrNcAA_YAAIBEgEzuNC5mAAP-AACT18F8BwgAAwPQAALH7hAAAcBgAAGQAANkgEBcgEAFgEPmgADFbhSAQ0gAAJaAAFAAQfwEg8cAQUzvNGD3AAOWgEztdGCHAANXgAAEAIHXgANIAABfloAYA8EWAENnjIA8lUfsLoBCQKCAAXMAg9CAAMxuNC8HgIAAgEPpAAED7QCBwKEAAViAQ1iAAGCAA9iABAFpAANYgEl0Y5iAQ72AjG50YI6AAD-AQ0YAgWyAg5UAAMCBB8QAAQAA7IAD64CDQQgBA1cmgnwDqYDBhe1sAANLAEBTAEA8AEEbgIPIgAFBqwDDSIAtQLwHBQCCgBmAAemBA5UATK10YggBQ_-BAEB6gEAbgEPKgIFD74EBwDaAAFmAkvvAVvbBASTBecG6enM4IPgrJuYeQqUASqH1QLUdQAB8AES7gES0gESDO8BMQYAeB4ZYRAKFAB3uHcWsQ4mAD2-0LkUAJewvQLxChQKECgAMbDQvD4AClAAK7AQYgAt0YNOAD3MF-I9sNC8TAAbtRIAmLXQumMSRMEAsLCiDwIzEdiW1aqNnOWslW4KcCpjhALxBFEAAfMHEocBEikSB3NrYWNoYXT7EWANCgkPAHTLEfASKgsKHgBKEAESRisAMwwKCCsAACoABjkAKXMnDwANSABEPxEcVj8R-AC80eakh8SnqcABCosBKn9zANRtAAHwERKkAhL0ARIgCAEC8wIGOxpAEAD_AesHAR0BMCoKJjsaMywADDwa8AwmCiIoABIPVAAVH7VUABQAKAAvJArQAA5vEAGZATsnAA6XAen5xY6Ulab6tjMKrAEqnpcB8QaMAAH1CRKhAxIvEgliZXNwbGF0bm8EAWEPCgsRAHYEAfERDQoiAEwQARIeMQALIAAcUiAACFEAEGVRADUQCgxiAF_BFPAldAAOH1BUAAkBQgA1DgoKVAAAZAAIdQAPxgAhD-YAHgjVADtpbmeDACxlZBEAAKUACjoBRj0BEWo0BAerE-iJnJWDwt20i4EBCnwqcDwB8QFeAAHwBBKkARIrEgRmcmVlqAByCQoFDABwcu0XUQsAcXN0YRWxIwBOEAESNy0AcGTGAUEHLQBUuhOwRQAZczkAD2YAGUF_ABxxvAHp5MjfwIHK0NUTCpoBKo0tAdZ7AAH2CxK5AxLOARIKrgEBpgGBEAoMEgCG0YsrFTAQEgATEgI6FXAOCjoAZxABDxWwJgBavtC8EABMAE3GDVAmAByyJs8CwCYAH7BMAAAesCYAT_YCQNEAvkfLARFoHAEHLhXpy6ShvsiwpJVTCvoBKu2dANbbAAH_FBLQBBKsBBIUnQAAWwIBNgYVuTYGIAG9_BkDkhxQOgARtR4HB2ACL9GFGgDADBC5BwCRuNC8GgAGfbkQWxqAggAfuDIABS9LHDQEnbV1BvAPTAB_tdC80YMQAGgAAQ9OAAUh0Y5OAA8CAQERtc4Apw1QP7jQvLgYAMCPagAPcAEHADwBD1RIChCP6A7yBvIABQGmAQ82AAAj0LU2AA9aAQF_tcYDWhMCAbC5xwOfxY7vtvKou7MXxwICj_8UEp8FErwC_QACEbqkAQAzBzECbxBxD0A2AAFvghtgEAAeAAh_NRtgGgoWPAACgACBKh4KGhwAAl_CAfESPAAIDxwACC_RgzgACB-wrgAIP7DRhR4ACQDqAA8_Af8tBx07YgICdQP4AcaI8fa1rMGLsQEKpgIqmALJAt0GAQH_FhKnCxK4AhIWrAERvfwd4AEgASoaCh4AAz-8EAAclAeAvtC5HAAIDziNACCOOFUBkIMcAD4cChiqAMsAELPNARAFJwBgtRwABQDkBAiyVgAGP7zRgzoABY8RDPAXErw7ASIAOwAPOwEDD1cBCS_Ri8kABwNXAQ_JAAUCHwEPHgACAHIaCBAeLQiwsFsBCQ8_ASef0YuYAvEuEsgDegIhDz8BIw-WAgkPWwEQDwYDAg-yAi4PkwEpDzwAAgAJAg-2AggPDAMPD-gAAgKvAQ-zAgMPCgP_MygBPGYFA9cB6Pnp99egktmV6QEKTSpBJwGwLwAB9wgSORIgEgqVGCDRgLEBAcoBMA4KElQDACQDApcZByQDn8HXhZeluLalHj8EAPUH-xEStAESlAESENGB0LLQvtCx0L7QtGsFYhYKEhgA3aIfMBoKFncFMBwAbS4D8gMUCkwAHxBKAAMALgAPSgAFfbmnAhFLPwQHfgDY6IT9ysKFy7o5ClcqS80AuDkAAf0OEnkSLBIQ8gEFfAAwFAoYsgExLgAbTgkcRVkA2N3H666P0qrwTApTKkdZABE1WQAcS1kAAM8ZAfMDAFkAEm0sARwXVQDpn_CL1IKJ3ethCrwBKq5QBPAInAAB_RASiAMS6AISENGF0LDQu9GP0LKyDQNjHwBZAPAKHxAWAAE9tRAALAA_g9GOFgAAPovRjxYAL7EGoQEv0L5YAAGr0L70IMAWChKyAD680LgYAG7KAUDRg3IAnyCQhS4AAj6z0L4u7CPxBw8WAAARsMwAC4oAL9CwRAADINGLRAATARxTDgXorN7M1fKtjPSPAQpUKkgUARE2PBq0OxImEgZydXNzaWEKGQY1GhAcNRoAAgYCpR0HgQbY2YSlusPR2boqCm0qYFYAsk4AAfQFEngSGhIHVgCSbhgBIAIqCwoPIwhyHAAzDQoJKz4mAmEmoykQADkAByoAhCfdGw0sCPkA-6qwpt32g5SJAQrUASrGhAGgtAAB8AkS_AMS2AoMMYDQvuUgMLjQuTkIMQgAfuABANYEEV_uD_EQGgACT7jQuRA0AAM_vtGONAAGH7UaAAMv0YM0AAh9vCoUQBK4AH4WIWAaChYYAE-FAWE0AAQfuIAhDPAF6AAHL9GFaAAGEbOEAA84AQERvrYADBABmApghgAPHAABAiFiCg88AQSu1gEAgwMgvwEwDAqtBa-q4bqf8pLDtqYBdQkAsfALEmQSHBIDcnVzQgFQCAoEcnXUG_AAKgcKFQBGEAESNB4AeQoKvQFAZSAAQfEfEBXyHDQLAIBJASBAAHEFB7cB-QDj_o6a2pz4xI8BCt0BKs9JAfEIvQAB_xoS7gQSxAQSGtCy0LXQu9C40LpGIRGDVQEQusMAAVABYR4KIgAFn6gHgSogChxCAAR_ZiPAEABCAAoftSAACj-4XwwQC5ML8AKiAAkfuaIAChO-ogA_HAoYxE0BoUAADD-80YOiAAnqEPAMIAAJL9C4AgEMH75AAA0v0YVgAAw_uRABpAEIWAEQ5DEHkQcPwgELELCiASYFMCUCBY8AClIB-QDxkqauxviIwsEBCqIBKpXgANCDAAH-ExK0AhKSAhISiRqB0YHQuNGB0YLmAAJqI1EYChQaACMOADwkUBoAAX7QcwswFgpQYxRQD04AAozkBaAqFAoQTgAPMAAERAJhYgAEH7UYRALTGAADP9CwEOAAA56-0P8EHcVsC-nkupf52uG8oTcKqQEqm6UAgIkAAf8XEsoC_goVFqUAEoSjAEPRhtC4QSFxHAoYHgADj40AAf4NIwOfhR7xIhoKXAACARwAD1oABE_QtdGOHgAHAFoAD1gAB0_RjxABdAAFAVYAD5AABR-5cgAHr9DLBQCjAmrLAALA0Y9RAfkAsJKumbn30cyuAQqTASqGrADTdAAB9AkS0AESuAESCKwAEbofAmAQCgwQAGo0I6IQABIAK9GFEgCVdiNgDgoKNgBlVAHxAgwKVgAaEFQAEb5UADUSCg4wwgzyATQAB0QAK9GDVAAbtRAAdbCaABFlyAIHQga_-oj2o4emraw2CpVFDQAq9QiWACHRgREHBK0eZBAKDB4AaZ4AEpiZAGESCg4kAITuAfAIDgoKFAAr0Ys2ADuw0YUiABuDIgARvmqaAHMq0LUyAIXQlwAcq5cA-QD_-tm7xIeol4cBCqECKpTQCCACAV8DcrIGEogGEhouAQCiBKfQvtGP0LfRi9GHNgYAXwMSBt0B0BwKGEIABa8QACoiCh5tB-AiAANv0LXQtRAAYgAKf8AUYCAKHEAAAw4ncLzQuEIACy-IBPEXEB-5RAAJDyAADhGwpgAPKAEGIdC-hAAPIAAGAGoBLxAB5gAHb9C1AzBqAQn3KDBgAAefBvU14AAKEb4gAA_IAQU_tdC9PgAKAsQBD6QBBgD-AC_Rg0IACSHRiwYCD4AABT-90LA-AAkh0L4-AA-AAAkCPgEPIAEGr9D8AkzpAgbApAPpiY66wtOj_skWCpwBKo9SAhF9bA4gzgJsDgA-BjFrb238BA9sDgCRGisACRwAGigccw7QRwANRgAaRioABnEATCUF8RWAAA9IAAgaR0gAMw4KCnIAOWluZ0kAL2VkSQALD9cACQ8cAAiYDhEdMQcHIwXp1JyM4sqUsu1pCr4BKrCfAPAAngAB9QwSxAISqAISDNCxfh4HtQEAoQ8QpLQHAk4CwiYAatC-0LPQvhQAiBIo8BUQADoATNGL0LUSACrRhTgAI9CwTAAHcgAATAANOAAbjzgAW75tBvALJgA6g9GOEgAs0L6CAC3QviQAEbBcAAeAAEpPBmNIAAAYAWWsCDwBABOEAvkAgone2__i_ODlAQr7AyrtUBLzAtsBAfQOEv4IEuAIEg7Rg9C6BQUEfS1gEgoWAJeIMicA4wJxFAADKgBmEPMJoD4AIdCyLgA3tRBrGTESANvlGgHsAGEYChQwAFlKAmAyAANKAElpEsF2AAJKAAosAAIUAFmsC2BEAAMYACtvCUADXACryAQCRwUwjgB0DgQB9y1gSdGP0YKEIhLwjz-I0YzKAAITtcoAClYAMbzRghIBBvoAACoAAxIBKdGDtgAEngARtfoADzIAAQ8sAQQh0LDQAAe6ACHQuHABNA4KCswAAdwADVQAT9GL0LwaAAMFmgEGDAIAoAARuy4AD_gBAQDgAQYYAAPmACHRi5oADEQAAMYBBpwAG4gIAQU8AAE6AQ9UAAAB3AAGGAAAmAAAfAI_uNGFmgECE7jkdgAAahLyKwQCfAIJUAELCgIBpAAp0YvAAQEUAAB2AgHAAQZuAAUYAAFuAAaEAQS4ABO1CgIJcAAt0Lt6AgJKAgrWDvAIIdC7rgMGfgAGZgAPJAMDAjwCBjAAAJB_F_MLAU4BBhgABEgAEbhUAwaGAAEwAAkIAQYqAHQlJF5NBAA_AzQV-QDDn9HZ2s_81sUBCt0CKtCCBPEHPgEB9goSxgESVRIKYmFja2dyb3VuZGEDcg8KCxIAdnOJAXARAB0nEgB3RwPwEioOCkcATRABElZXADYRCg1GAF9pbmcQAGoADC5lZFgARx0KRGkA8gxEA-ESPBIiEgtpbnRlbGxpZ18j8xDJAAcTAAI9AAglAAU-AOHTARJLEgh0cmFuc2ZlcgUBWCYg8QC2AfAqDwABAQElDAovACAQAf0ABB4AAA0BKxJvTQA0EAoMIAAScvoAD18ABwH2AApfADQPCgs_AAI-AAcRIQHAABYBBZAABdYA1KMByjDyAXNlcnZpY2XVAAMPAACnAERuCoICkwADDgAB4t0jYEoQARJFSK4S8AIAowEFOQACnQAGHQAAOQEIRzQAIQRVXwMCHwQByB6fkNmj0NC6popBvxMCIPIHDQdCogESBh8EA3gGQQgOAIIzKhAO-Sgik9BzBhQKSjEgV7BJA3E6ABmLOgA4OQ9gKdCwDgBzVQ1AEAoMZl4DoLzQuD4AEL5cAEOrBxF5lwAHEQfY4__2qtGk64MoClIqRZAL8AQzAAH7DBJFEigSDtCy0LjQvdC0fwAh0YGpBwDxAw_DKgWvrNbfha7H8saFAacIAoj6DxLCAhL6AVgAQdGD0LfzAAFqKxKbYwfxBCoSCi4AHxAsAAERviwAD0QAAIy3CPAHFAoQXAAPFgABL9GDFgACH4sWAAGM0PQAQBgKFFh4C2HQuIoAAn8tAVASKPwAAl4bAVgVHPn_APkA8omD97a-ic6qAQqCAir1tgXW4wAB_xIS5AQSxgQSEgQBAdQKAEUQEQCwACQaADcXMjIAjxgHMBAAMp0AQIUYAAIZBwAHAECL0LUYJCwgtRj7CVDQvDAAAZ4No48YAAEh0LAYAHsSD_MWxgACZAA7FAoQGAAA2gAOFgAfsGAAAhG-2AA6EgoORAAuEAE2AbIHckYAAw9oAQRVHHEyAAEATAAPUADyC744AQ6yARO-sgEN2AAv0YsgAQgfuWQAAgEYBgEc9QYB2ODPj6GB5K3DQApMKkAFArIuAAH2BxI2Eh4SCTcrE3OvKjANChHiBQDGAxEQTgAC6gL4AwAAAAAw-tq7zK_BqvY-CnIqZk4AEVSGKx-BhisaASkWQRIoEhsBAjEIOAB9BxwrdAC_0omXtNqDmvtTCkcXLwZB0YXRgL0CDxcvAgO9AOmOm_CVjYH8lQMKrwEqohACEZD4DqJwEkESBnh0cmVtIxVgCwoHDgBjAgUwCgob9w4ALgSQGQA2JxAADgBpUQ2AEhhDAAc2AEMtAUVDAPcS8wT3J3QSWhILcGVyZm9ybWFuY2UYACACKhEKDRMAAFUACxMAAXYANxAKDCYAAKIAKA8KSwACcQAIEvsAAVkEn4-3-KiRx_W-bxIwCE_RhdC_-wAO8BHs9vjQu-y-q9sBEpIPCAsQABoQCgYqBBCszRkSAggAGgQA0A8KBSoDEOYKEgIIARoEAAIRAHCQBxICCAIaBAACEQBwhgISAggDGgQAAhEAcKweEgIIBBoEAAIRAHDEYBICCAUaBAAHEQAgBhoEAAJ4AIDorgMSAggHGgQAAiMAEJoRACAIGgQAAhEAcOosEgIICRoEAAI0AICuzQESAggKGgQAgB0KEwgBEAEhlQLhACCMQCoEEKKfIxICCAvLADoeChQfAFAFEPyhzz8AEQwgAAI_AJAQIXyXoXOSSYo_AHHa-RQSAggNHwACPwCQCCFY7o9JfJaNPwAwtsirPwARDiAAMR8KFT8ABX4AYAYQuJjikMIAEQ8hAAJgAJABIV24LWmnAY9gACDO2EAAERBZAQQfAHDuyi08B_aOHwAgsp8fABkRHwBhB0ZK1hsOPgB5lqYEEgIIEh8AYc2MfSSf8z4AEcBdABkTHwBnMTCaOAjUHwAZFB8AcBUHTKcN9I18AHmA3g0SAggVHwBhZmEqRwHLPgAg8uObABkWHwBhMKIgeX_1PgB55NczEgIIFx8AYawhD5xn9D4Ad9DNEhICCBgfAIEoIWSP8_0lhh8AcZDnGBICCBkfABEgtgHzDBAhbBwBtIyUQsAqBRC284YREgIIGhoECAEQAjkBkCEhxLnuH70Yi70AcYrGNxICCBugAgIfAIEBIZNP1el_OjkBBncBBh8AYTE2JtPjLh8AIMTB3AAZHD4AYXDHgNvQJJ4AcdacbBICCB0fAAIVAvABASHyO1hVremOQCoFEMzz6DoBGR4gAHASbDrXX7yLIACBjsaYZBICCB8gAAI1ApABIbYJAsO4x441AkDQ5ZaLTQMRICEABb4AUSGu6wMgXAEgvIo9ARkhHwBhMMdbmuHv8wIgnO2tAxEiHwAEnwBhrl2R_tiInwAwtv25NgIZIyAAYcP9JXiQ2CAAMKSro0AAESQgAAR-AGGLK-daiRBfAHnm1k4SAgglHwBh7EZcgN4SPAEgmMdeABEm-AMEPgBhRGexjSY2HwAg-vAQAxEnHwAxHAoSkAPxAtC9FxyK4I1AKgMQ3jwSAggoHgAEPQBh9t5A8_kRPQAgvvuYAREpHwARHhcCkAEhlLRkGAhPjFkBMMCe6iAAGSogAGFpZIFpINZ5ATDix-3YBBErIAAEXwBhtIzr7boa2AFxsvNNEgIILB8ABF8AYYY1tLkswBkBMOKug18AES0gAAQ_AGHSNJus7fwZAXnqgikSAgguHwBh8NvF-JqEtgEgoIu0AhEvHwACXgCBCCGBc64oXDJLBIHmufQGEgIIMCAAAl4AgQghOBnAMVET_AAG7AMTBfECgQEh7slu6-q8vABxkMUyEgIIMTsFAj4AgQEhMPynFpOSHwB3gJBEEgIIMh8AgQQh8KgtOBekuwB3holWEgIIMx8AgQghAReekbwQfAB54IAIEgIINB8AYdq5_0ule10Acb7sJhICCDWVBQTaAGFGheYVTpfaAImsttkQEgIINiAAYeB_xxzyESAAMNrOv-8CETcgABEfwwWRECEQW242YSd7zAPFuUcSAgg4GgQICRAKNQJwB8SqrXP5jjUCARQGGTkCBmGCqTQor5WeAHfy_SESAgg6HwCBBCHoEquIE8OXAXfE2kYSAgg7HwCBCCEMRqorWdI-ACCCk30AEDwfAC0iAAIAIQkJ7QXxCADwPy0AAIA_MgYSBBCc-QcyBRIDEKgIBwAhzAYHACGGAgcAIaARBwAhkFIHACHEYDIAIriRHQAhmgMWAJCULDIFEgMQhiQAAAA%2C;wmaxone%3D1.000;wminone%3D1.000;ydngd_mean%3D0.261882;ydngi%3D0.5063;ynhg_mean%3D0.1904;zsset%3DeNptV0ty20YQvUrvsrJLkiuu5DggMCRh4ucBYIlekZJtKbFd3Lkqt6AkgoIpkroCULlQ3usBTMpOSWj09Pz687ob9CIj7by9bJbtJf4W8urk5emZjEqTFxKbUuIyKiQzNk8Tae6autk1m3YuzbZZNpumbhfNWk5fc8/p69fy%2Bx8nJ%2BL5RYjVXhCIF1rxkrQYG7xtWiYQ5fjP8R9iyblnAxl4/gQkikCKAgoNjFeADFMLPko5mw7E9xI%2BvxWgeNI0AimTwtgXeWHDiRHfeu%2BnEnh2AlKUsQTGC0iKMWicShAaCdIRnoQPjgrSc7DW5Dlo%2BA7TZTEVMxwavxATi7E2tWJy38uMmHcww1zI0PMNiMWTj2nqMByNC1DoCwLPDSPMCAzgwjKRkRcbGYVDPDaSURoFBsI0DWRkvYSUJo%2B9aChj6gx/pTIOCwljb2QkzCOuCotc3mQjeVPGmUxCOGwSJqMgjSXyBiaSCAqChgPr2alEKQ6K0mQksWdDDxRGxvB6nAbG8gVzQeCTdDgU6CRpEk0lzfBvrKdBTEtE3yv8sWS%2BZKFflLAxi7ypZDg4S8ME8ymCOUDcMpv69GSWv5K3iiBLT8G2COdak5WDKPTFhjmE1M6m0N3CIgsf5R4Pyz1olRvfGvBjD/GRPIwznJ5nxgSgqcVMYQ0XlFBU8mk8CAEOoGxYkE5B4BhSwKtICy8CLWFEAb%2BUmSCOUwH28NA0UBxzPg5xy3kY4klUECYXIMWYTrg4EyD%2BjnmCZ/ZsgERYUvCIfJgr62TNStn2Uppbld02tWPnmK6w%2BbbZN49OdNPskH5gq2at2fjFDXZ81Vh7x5NveUnzgCys2k%2Bi%2B2/dS7OSzJbHMVcrXs0LeBUFYHFNhfld%2B7n5DhEUqTiP83a4dEHRZ71v5nRAbYDwXk/ZuyP0CrWY4l3H4q4r6LXXGrGRZqWLKzIV2fbaLeRwy31k15DP%2BOaAx7qtvNytxlYM3KErVbPmmRWurpsnZ1eFGSx9wJ57%2Btzt5JD3bES12jrf11SU0x3j3OwGupa%2B1SrXLvq5rV40Y60Tnt1%2B4AEbdfCcCmzgkyUN2mhwNmRgIHxLh3/RIfZvGcXDUOPCCGho9xBDWOGuPUW6joLuim6Dns4I3D9j4dxKMVUzqlut0rWo/eobx3RBx4CwaD/xCKJv234GLNRrW5h9LYqFGUr7yrFzVXXlfK8Ch6v2S3/mToNcuU4iehsFTInNM4GzbN88AS0Oy/QVQXeYVEgo8J0rFADSQQhmPenKazK1Tt479hNMWpLdPw8vBUy3mbJYBMjj%2Bu9u%2BBUR19A%2BOf9r4F1Q1F6Ka0Jdbb7rsuVoascTsUMzX0U/wtEJ9kRjx0K%2B7dlL7L7TwzYqghfWDoZ0zwPCMlP926suPpoYD0w1CJx1auZcAbLs7lQ7iArnvLrLoEM%2Bq2BNJ3eGVopWB59fJvdyQCveXKE1Qq%2BaE/kadLLQeof0vVQNNk70USufzrssXnbugwDJhS2PdDnDThEi034UzZ1Nn/rtX245wzXrvabAg4p0yfrYuF5U/biHCnUvLdnOO4teVHUoPQwB7NvngsWva1yBgODzEdjoCtZE0WtYVREGceYhkTsV5pRd0RdMM7fxStdeK8r6BgBfXGuf6Kz9oIVo%2B4NRUOtgwVfdw%2BSD1vwb4W6tX7VWXIJGs64fcLe%2BFIJ0M5QgACcDKQI5OX15cionZ6RnZ6/k7E9%2B5/lGu2OArx2/wMcRvj/QufktVMhoIOGFTN5LPM3fRvgyyMoIbdaizeclzvQzKZOwQJs1gzhN0Km1j95ru2In09cLhdV317Rql0eO0aLPSqStSq28Zop0Vd01kco1F1c8rrBjd6iplWujD3rtXgvwUemheO9eTxqoG8Va3ybY1RGSS%2BaKtgKubD%2B6qucawE%2BiQ1F2vYGJdimaS7dqSMXKxuGG9ZhWPbbfiJ0OUVfOsO1RFi9cPX%2Bg14jwtVItwlxw33WXVS/QOXwm0BjMdBWbgr%2BBvbnW7q6g7bu0n7uavXb5evgOcI1QG%2B7BLf8j7Fer27vKq1l51/dAN3xgV9J62WnlqqVGk78wDoVyr33isRd0FRfRXR61IYXNSvSj5t4BgTnXta%2Bjoq5W37sq476Tbg7l4qoP3k/lHpXM2VO7zdddI9zpd077VdnnrRhlY6eAa79BlRsXiidNwJVEU4uP4UnIX1exF4XJRJr1v/8wHtKdsDoCZ/uNv2HM5D%2Bak0fD;relevgeo%3D225;geochanged%3D1;;udbts%3D1459797057;downerprotobundle%3DCAwVQbwCVw%2C%2C&reqid=1461253060957657-600715567702129748010289-myt1-1909&snip=exps%3Dmarker_ratings_info%2Cmarker_movie_rating%3D0;report%3Dwww;reps%3Dall_on;snip_width%3D550;uil%3Dru;dqsigml%3D4&snip=t%3D0&text=%28autocad%3A%3A209750+^+autodesk%3A%3A288721+^+%28%28autodesk%3A%3A288721+%26/%281+1%29+inventor%3A%3A1697918%29%29+^+%28%28auto%3A%3A28861+%26/%281+1%29+cad%3A%3A171629%29%29+^+%D0%B0%D0%B2%D1%82%D0%BE%D0%BA%D0%B0%D0%B4%3A%3A1405467+^+autoca%3A%3A420234780%29+%26%26/%28-3+5%29+%28%28%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C%3A%3A691+^+download%3A%3A13863+^+pdf%3A%3A10201+^+torrent%3A%3A35211+^+%28%28%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE%3A%3A456+%26/%281+1%29+%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%B8%D1%82%D1%8C%3A%3A13856%29%29+^+%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B6%D0%B0%D1%82%D1%8C%3A%3A13856+^+%D0%B7%D0%B0%D0%BA%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D1%82%D1%8C%3A%3A112512+^+%D1%81%D0%BA%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%3A%3A14585+^+%D1%81%D0%BA%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F%3A%3A423410+^+%D1%81%D0%BA%D0%B0%D1%87%D0%BA%D0%B0%3A%3A152424+^+skachat%3A%3A203208%29+%26/%28-64+64%29+%28%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE%3A%3A456+^+besplatno%3A%3A455045+^+download%3A%3A13863+^+free%3A%3A12386+^+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%3A%3A886571+^+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9%3A%3A14490854+^+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%BA%3A%3A105058695+^+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BD%D1%8B%D0%B9%3A%3A280156520+^+%D0%B4%D0%B0%D1%80%D0%BE%D0%BC%3A%3A148126+^+%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%3A%3A88910+^+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D0%BD%D0%BE%3A%3A4669275+^+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BE%3A%3A10775250+^+%D1%85%D0%B0%D0%BB%D1%8F%D0%B2%D0%BD%D1%8B%D0%B9%3A%3A644531%29%29+^+%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE%3A%3A17882331+%26/%28-64+64%29+%D0%BD%D0%B0%3A%3A131+%26/%28-64+64%29+%28%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%3A%3A1942+^+russia%3A%3A37324+^+russian%3A%3A31805+^+%D1%80%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9%3A%3A3887+^+rus%3A%3A16095+^+%D0%B2%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%3A%3A1918880+^+%D1%80%D1%83%D1%81%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0%3A%3A27111921+^+%D1%80%D1%83%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F%3A%3A638169+^+!!%D1%80%D1%83%D1%81%D0%BA%3A%3A1076145+^+%D1%80%D1%83%D1%81%D1%81%3A%3A336053+^+%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D1%8F%D0%B7%D1%8B%D1%87%D0%BD%D1%8B%D0%B9%3A%3A139984+^+russkom%3A%3A7245427%29+%26%26/%28-3+5%29+%28%D1%82%D0%BE%D1%80%D1%80%D0%B5%D0%BD%D1%82%3A%3A6178+^+torrent%3A%3A35211%29+%26%26/%28-3+5%29+32%3A%3A6178+%26/%28-1+1%29+%28bit%3A%3A27572+^+%D0%B1%D0%B8%D1%82%D0%BD%D1%8B%D0%B9%3A%3A414024+^+%D1%83%D0%BA%D1%83%D1%81%D0%B8%D1%82%D1%8C%3A%3A558080+^+%28%28background%3A%3A96185+%26/%281+1%29+intelligent%3A%3A705091+%26/%281+1%29+transfer%3A%3A180746+%26/%281+1%29+service%3A%3A17789%29%29+^+%D0%B1%D0%B8%D1%82%3A%3A65584%29+%26%26/%28-3+5%29+%D0%B4%D0%BB%D1%8F%3A%3A205+%26/%28-64+64%29+%28%28windows%3A%3A2869+^+%D0%B2%D0%B8%D0%BD%D0%B4%D0%BE%D0%B2%D1%81%3A%3A318239+^+%D0%B2%D0%B8%D0%BD%D0%B4%D0%BE%D1%83%D0%B7%3A%3A17509782+^+%D0%B2%D0%B8%D0%BD%D0%B4%D0%BE%D1%83%D1%81%3A%3A2618285%29+%26%26/%28-3+5%29+%28xp%3A%3A13143+^+windows%3A%3A2869+^+%D1%85%D1%80%3A%3A278393+^+%28%28xtreme%3A%3A579234+%26/%281+1%29+performance%3A%3A113530%29%29+^+%D1%85%D0%BF%3A%3A582849%29%29+^+windowsxp%3A%3A585285+softness%3A6&tld=ru&uil=ru&user_request=autocad+%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C+%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE+%D0%BD%D0%B0+%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC+%D1%82%D0%BE%D1%80%D1%80%D0%B5%D0%BD%D1%82+32+bit+%D0%B4%D0%BB%D1%8F+windows+xp
\ No newline at end of file diff --git a/library/cpp/streams/lz/ut/yq_609.data b/library/cpp/streams/lz/ut/yq_609.data Binary files differdeleted file mode 100644 index 9694b0c97f1..00000000000 --- a/library/cpp/streams/lz/ut/yq_609.data +++ /dev/null diff --git a/library/cpp/streams/lzop/lzop.cpp b/library/cpp/streams/lzop/lzop.cpp deleted file mode 100644 index 5d1ad33f700..00000000000 --- a/library/cpp/streams/lzop/lzop.cpp +++ /dev/null @@ -1,827 +0,0 @@ -#include "lzop.h" - -#include <util/generic/buffer.h> - -#include <util/system/info.h> - -#include <contrib/libs/minilzo/minilzo.h> - -// See https://svn.yandex.ru/statbox/packages/yandex/statbox-binaries/include/Statbox/LZOP.h -// https://github.yandex-team.ru/logbroker/push-client/blob/c820971a769df920d6ea9152a053474e75986914/src/lzo.c -// https://github.yandex-team.ru/logbroker/push-client/blob/c820971a769df920d6ea9152a053474e75986914/src/lzo.h -// As the source for the inspiration. -//////////////////////////////////////////////////////////////////////////////// - -namespace NPrivate { - namespace NLzop { - static unsigned const char MAGIC[9] = - { - 0x89, 0x4c, 0x5a, 0x4f, - 0x00, - 0x0d, 0x0a, 0x1a, 0x0a}; - - // 32-bit Version. - inline unsigned int RoundUpToPow2(unsigned int x) { - x -= 1; - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - return x + 1; - } - - inline unsigned char* Get8(unsigned char* p, unsigned* v, ui32* adler32, ui32* crc32) { - *v = 0; - *v |= (unsigned)(*p++); - - *adler32 = lzo_adler32(*adler32, (const unsigned char*)(p - 1), 1); - *crc32 = lzo_crc32(*crc32, (const unsigned char*)(p - 1), 1); - - return p; - } - - inline unsigned char* Put8(unsigned char* p, unsigned v, ui32* adler32, ui32* crc32) { - *p++ = v & 0xff; - - *adler32 = lzo_adler32(*adler32, (const unsigned char*)(p - 1), 1); - *crc32 = lzo_crc32(*crc32, (const unsigned char*)(p - 1), 1); - - return p; - } - - inline unsigned char* Get16(unsigned char* p, unsigned* v, ui32* adler32, ui32* crc32) { - *v = 0; - *v |= (unsigned)(*p++) << 8; - *v |= (unsigned)(*p++); - - *adler32 = lzo_adler32(*adler32, (const unsigned char*)(p - 2), 2); - *crc32 = lzo_crc32(*crc32, (const unsigned char*)(p - 2), 2); - - return p; - } - - inline unsigned char* Put16(unsigned char* p, unsigned v, ui32* adler32, ui32* crc32) { - *p++ = (v >> 8) & 0xff; - *p++ = (v)&0xff; - - *adler32 = lzo_adler32(*adler32, (const unsigned char*)(p - 2), 2); - *crc32 = lzo_crc32(*crc32, (const unsigned char*)(p - 2), 2); - - return p; - } - - inline unsigned char* Get32(unsigned char* p, unsigned* v, ui32* adler32, ui32* crc32) { - *v = 0; - *v |= (unsigned)(*p++) << 24; - *v |= (unsigned)(*p++) << 16; - *v |= (unsigned)(*p++) << 8; - *v |= (unsigned)(*p++); - - *adler32 = lzo_adler32(*adler32, (const unsigned char*)(p - 4), 4); - *crc32 = lzo_crc32(*crc32, (const unsigned char*)(p - 4), 4); - - return p; - } - - inline unsigned char* Put32(unsigned char* p, unsigned v, ui32* adler32, ui32* crc32) { - *p++ = (v >> 24) & 0xff; - *p++ = (v >> 16) & 0xff; - *p++ = (v >> 8) & 0xff; - *p++ = (v)&0xff; - - *adler32 = lzo_adler32(*adler32, (const unsigned char*)(p - 4), 4); - *crc32 = lzo_crc32(*crc32, (const unsigned char*)(p - 4), 4); - - return p; - } - - enum ELzoFlag { - LZO_ADLER32_D = 0x00000001L, - LZO_ADLER32_C = 0x00000002L, - LZO_STDIN = 0x00000004L, - LZO_STDOUT = 0x00000008L, - LZO_NAME_DEFAULT = 0x00000010L, - LZO_DOSISH = 0x00000020L, - LZO_H_EXTRA_FIELD = 0x00000040L, - LZO_H_GMTDIFF = 0x00000080L, - LZO_CRC32_D = 0x00000100L, - LZO_CRC32_C = 0x00000200L, - LZO_MULTIPART = 0x00000400L, - LZO_H_FILTER = 0x00000800L, - LZO_H_CRC32 = 0x00001000L, - LZO_H_PATH = 0x00002000L, - LZO_MASK = 0x00003FFFL - }; - - enum ELzoResult { - LZO_END_OF_STREAM = 0, - LZO_MORE_DATA = 1, - LZO_OK = 2, - LZO_WRONG_MAGIC = -12, - LZO_VERSION_TOO_LOW = -13, - LZO_EXTRACT_VERSION_TOO_HIGH = -14, - LZO_EXTRACT_VERSION_TOO_LOW = -15, - LZO_WRONG_CHECKSUM = -16, - LZO_WRONG_METHOD = -18, - LZO_COMPRESS_ERROR = -1, - LZO_WRONG_DST_LEN = -2, - LZO_DST_LEN_TOO_BIG = -3, - LZO_WRONG_SRC_LEN = -4, - LZO_INVALID_SRC_ADLER32 = -5, - LZO_INVALID_SRC_CRC32 = -6, - LZO_DECOMPRESS_ERROR = -7, - LZO_INVALID_DST_ADLER32 = -8, - LZO_INVALID_DST_CRC32 = -9, - }; - - // XXX(sandello): I don't really know where this comes from. - struct THeader { - unsigned Version; - unsigned LibVersion; - unsigned VersionNeededToExtract; - unsigned char Method; - unsigned char Level; - - ui32 Flags; - ui32 Filter; - ui32 Mode; - ui32 MTimeLow; - ui32 MTimeHigh; - - ui32 HeaderChecksum; - - ui32 ExtraFieldLen; - ui32 ExtraFieldChecksum; - - const unsigned char* MethodName; - - char Name[255 + 1]; - }; - - } -} - -//////////////////////////////////////////////////////////////////////////////// - -class TLzopCompress::TImpl - : public IOutputStream { -public: - inline TImpl(IOutputStream* slave, ui16 blockSize) - : Slave(slave) - , HeaderWasWritten(false) - , UncompressedBuffer(blockSize) - , CompressedBuffer(8 + 4 * blockSize) - { - ResetHeader(); - } - -protected: - void DoWrite(const void* buffer, size_t length) override; - void DoFlush() override; - void DoFinish() override; - -private: - IOutputStream* Slave; - - NPrivate::NLzop::THeader Header; - bool HeaderWasWritten; - - TBuffer UncompressedBuffer; - TBuffer CompressedBuffer; - - void EnsureCompressedSpace(size_t demand); - void EnsureUncompressedSpace(size_t demand); - - void ProduceHeader(); - void ProduceData(); - void ProduceTrailer(); - void ResetHeader(); -}; - -void TLzopCompress::TImpl::DoWrite(const void* buffer, size_t length) { - const char* data = (const char*)buffer; - while (length > 0) { - size_t bytesToFit = Min(UncompressedBuffer.Capacity(), length); - size_t bytesToWrite = Min(UncompressedBuffer.Avail(), length); - if (bytesToWrite > 0) { - UncompressedBuffer.Append(data, bytesToWrite); - data += bytesToWrite; - length -= bytesToWrite; - } else { - EnsureUncompressedSpace(bytesToFit); - } - } -} - -void TLzopCompress::TImpl::DoFlush() { - EnsureUncompressedSpace(UncompressedBuffer.Capacity()); - EnsureCompressedSpace(CompressedBuffer.Capacity()); -} - -void TLzopCompress::TImpl::DoFinish() { - EnsureUncompressedSpace(UncompressedBuffer.Capacity()); - ProduceTrailer(); - Flush(); -} - -void TLzopCompress::TImpl::EnsureCompressedSpace(size_t demand) { - Y_ASSERT(demand <= CompressedBuffer.Capacity()); - if (CompressedBuffer.Avail() < demand) { - Slave->Write(CompressedBuffer.Data(), CompressedBuffer.Size()); - CompressedBuffer.Clear(); - } - Y_ASSERT(demand <= CompressedBuffer.Avail()); -} - -void TLzopCompress::TImpl::EnsureUncompressedSpace(size_t demand) { - Y_ASSERT(demand <= UncompressedBuffer.Capacity()); - if (UncompressedBuffer.Avail() < demand) { - ProduceData(); - } - Y_ASSERT(demand <= UncompressedBuffer.Avail()); -} - -void TLzopCompress::TImpl::ResetHeader() { - ::memset(&Header, 0, sizeof(Header)); -} - -void TLzopCompress::TImpl::ProduceHeader() { - using namespace NPrivate::NLzop; - - ui32 adler32 = 1; - ui32 crc32 = 0; - - unsigned char* p; - unsigned char* pb; - - EnsureCompressedSpace(sizeof(MAGIC) + sizeof(Header)); - pb = p = (unsigned char*)CompressedBuffer.Pos(); - - // Magic. - ::memcpy(p, MAGIC, sizeof(MAGIC)); - p += sizeof(MAGIC); - - // .Version - p = Put16(p, 0x1030U, &adler32, &crc32); - // .LibVersion - p = Put16(p, lzo_version() & 0xFFFFU, &adler32, &crc32); - // .VersionNeededToExtract - p = Put16(p, 0x0900, &adler32, &crc32); - // .Method - // XXX(sandello): Method deviates from Statbox' implementation. - // In compatibility we trust. - p = Put8(p, 2, &adler32, &crc32); // 1 = LZO1X_1, 2 = LZO1X_1_15 - // .Level - p = Put8(p, 3, &adler32, &crc32); - // .Flags - p = Put32(p, 0, &adler32, &crc32); - // .Mode - p = Put32(p, 0644, &adler32, &crc32); - // .MTimeLow - p = Put32(p, 0, &adler32, &crc32); - // .MTimeHigh - p = Put32(p, 0, &adler32, &crc32); - // .Name - p = Put8(p, 0, &adler32, &crc32); - // .HeaderChecksum - p = Put32(p, adler32, &adler32, &crc32); - - CompressedBuffer.Proceed(CompressedBuffer.Size() + (p - pb)); -} - -void TLzopCompress::TImpl::ProduceTrailer() { - using namespace NPrivate::NLzop; - - ui32 adler32 = 1; - ui32 crc32 = 0; - - unsigned char* p; - unsigned char* pb; - - EnsureCompressedSpace(4); - pb = p = (unsigned char*)CompressedBuffer.Pos(); - - p = Put32(p, 0, &adler32, &crc32); - - CompressedBuffer.Proceed(CompressedBuffer.Size() + (p - pb)); -} - -void TLzopCompress::TImpl::ProduceData() { - using namespace NPrivate::NLzop; - - ui32 srcLen = (ui32)UncompressedBuffer.Size(); - ui32 dstLen; - - ui32 adler32 = 1; - ui32 crc32 = 0; - - unsigned char* p; - unsigned char* pb; - - lzo_uint result; - - // See include/lzo/lzo1x.h from lzo-2.06. - // const size_t LZO1X_1_MEM_COMPRESS = (lzo_uint32)(16384L * lzo_sizeof_dict_t); - unsigned char scratch[LZO1X_1_MEM_COMPRESS]; - - if (!HeaderWasWritten) { - ProduceHeader(); - HeaderWasWritten = true; - } - - EnsureCompressedSpace(8 + 4 * srcLen); - pb = p = (unsigned char*)CompressedBuffer.Pos(); - - p = Put32(p, srcLen, &adler32, &crc32); - p += 4; - - // XXX(sandello): Used compression Method deviates from Statbox's implementation. - // Here we use |lzo1x_1_compress| (implemented in minilzo) whilst Statbox - // uses |lzo1x_1_15_compress|. - if (lzo1x_1_compress( - (unsigned char*)UncompressedBuffer.Data(), - UncompressedBuffer.Size(), - p, - &result, - scratch) != LZO_E_OK) - { - ythrow yexception() << "LZOP Error: " << (int)LZO_COMPRESS_ERROR; - } - - dstLen = result; - - if (dstLen < srcLen) { - Put32(pb + 4, dstLen, &adler32, &crc32); - /**/ - result = dstLen; - } else { - Put32(pb + 4, srcLen, &adler32, &crc32); - ::memcpy(p, UncompressedBuffer.Data(), UncompressedBuffer.Size()); - result = srcLen; - } - - result += 4 + 4; // srcLen + dstLen + (adler32|crc32, disabled) - - UncompressedBuffer.Clear(); - CompressedBuffer.Proceed(CompressedBuffer.Size() + result); -} - -TLzopCompress::TLzopCompress(IOutputStream* slave, ui16 maxBlockSize) - : Impl_(new TImpl(slave, maxBlockSize)) -{ -} - -TLzopCompress::~TLzopCompress() { - try { - Finish(); - } catch (...) { - } -} - -void TLzopCompress::DoWrite(const void* buffer, size_t length) { - if (!Impl_) { - ythrow yexception() << "Stream is dead"; - } - Impl_->Write((const char*)buffer, length); -} - -void TLzopCompress::DoFlush() { - if (!Impl_) { - ythrow yexception() << "Stream is dead"; - } - Impl_->Flush(); -} - -void TLzopCompress::DoFinish() { - THolder<TImpl> impl(Impl_.Release()); - if (!!impl) { - impl->Finish(); - } -} - -//////////////////////////////////////////////////////////////////////////////// - -class TLzopDecompress::TImpl - : public IInputStream { -public: - inline TImpl(IInputStream* slave, ui32 initialBufferSize) - : Slave(slave) - , Exhausted(false) - , Hint(0) - , InputData(NPrivate::NLzop::RoundUpToPow2(initialBufferSize)) - , OutputData(NPrivate::NLzop::RoundUpToPow2(initialBufferSize)) - , InputOffset(0) - , OutputOffset(0) - { - ResetHeader(); - } - -protected: - size_t DoRead(void* buffer, size_t length) override; - -private: - IInputStream* Slave; - bool Exhausted; - unsigned int Hint; - - NPrivate::NLzop::THeader Header; - - TBuffer InputData; - TBuffer OutputData; - - size_t InputOffset; - size_t OutputOffset; - - void Trim(TBuffer& buffer, size_t& length); - - int ConsumeHeader(); - int ConsumeData(); - void ResetHeader(); -}; - -size_t TLzopDecompress::TImpl::DoRead(void* buffer, size_t length) { - size_t bytesRead = 0; - size_t bytesAvailable = 0; - - do { - bytesAvailable = Min(OutputData.Size() - OutputOffset, length); - if (!bytesAvailable && !Exhausted) { - int rv; - while ((rv = ConsumeData()) == NPrivate::NLzop::LZO_MORE_DATA) { - if (Hint) { - InputData.Reserve(NPrivate::NLzop::RoundUpToPow2(Hint)); - Hint = 0; - } else if (InputData.Avail() == 0) { - InputData.Reserve(2 * InputData.Capacity()); - } - - size_t tmp = Slave->Load(InputData.Pos(), InputData.Avail()); - if (tmp) { - InputData.Advance(tmp); - } else { - Exhausted = true; - break; - } - } - - Trim(InputData, InputOffset); - - switch (rv) { - case NPrivate::NLzop::LZO_OK: - case NPrivate::NLzop::LZO_MORE_DATA: - break; - case NPrivate::NLzop::LZO_END_OF_STREAM: - ResetHeader(); - break; - default: - ythrow yexception() << "LZOP Error: " << rv; - break; - } - } else if (bytesAvailable) { - ::memcpy( - (char*)buffer + bytesRead, - OutputData.Data() + OutputOffset, - bytesAvailable); - bytesRead += bytesAvailable; - OutputOffset += bytesAvailable; - - Trim(OutputData, OutputOffset); - } else { - break; - } - } while (!bytesRead); - - return bytesRead; -} - -void TLzopDecompress::TImpl::ResetHeader() { - ::memset(&Header, 0, sizeof(Header)); -} - -void TLzopDecompress::TImpl::Trim(TBuffer& buffer, size_t& length) { - size_t remaining = buffer.Size() - length; - ::memmove( - buffer.Data(), - buffer.Data() + length, - remaining); - buffer.Resize(remaining); - length = 0; -} - -int TLzopDecompress::TImpl::ConsumeHeader() { - using namespace NPrivate::NLzop; - - THeader* h = &Header; - - ui32 adler32 = 1; - ui32 crc32 = 0; - ui32 checksum; - - unsigned tmp; - - unsigned char* p; - unsigned char* pb; - unsigned char* pe; - - pb = p = (unsigned char*)InputData.Data() + InputOffset; - pe = (unsigned char*)InputData.Pos(); - - // Magic. - if (pe < p + sizeof(MAGIC)) - return LZO_MORE_DATA; - if (memcmp(MAGIC, p, sizeof(MAGIC)) != 0) { - return LZO_WRONG_MAGIC; - } - p += sizeof(MAGIC); - - // .Version - if (pe - p < 2) - return LZO_MORE_DATA; - p = Get16(p, &h->Version, &adler32, &crc32); - if (h->Version < 0x0900) { - return LZO_VERSION_TOO_LOW; - } - - // .LibVersion, .VersionNeededToExtract - if (pe - p < 2) - return LZO_MORE_DATA; - p = Get16(p, &h->LibVersion, &adler32, &crc32); - if (h->Version >= 0x0940) { - if (pe - p < 2) - return LZO_MORE_DATA; - p = Get16(p, &h->VersionNeededToExtract, &adler32, &crc32); - if (h->VersionNeededToExtract > 0x1030) { - return LZO_EXTRACT_VERSION_TOO_HIGH; - } - if (h->VersionNeededToExtract < 0x0900) { - return LZO_EXTRACT_VERSION_TOO_LOW; - } - } - - // .Method, .Level - if (pe - p < 1) - return LZO_MORE_DATA; - p = Get8(p, &tmp, &adler32, &crc32); - h->Method = tmp; - if (h->Version >= 0x0940) { - if (pe - p < 1) - return LZO_MORE_DATA; - p = Get8(p, &tmp, &adler32, &crc32); - h->Level = tmp; - } - - // .Flags - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &h->Flags, &adler32, &crc32); - - // .Filter - if (h->Flags & LZO_H_FILTER) { - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &h->Filter, &adler32, &crc32); - } - - // .Mode - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &h->Mode, &adler32, &crc32); - - // .MTimeLow - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &h->MTimeLow, &adler32, &crc32); - - // .MTimeHigh - if (h->Version >= 0x0940) { - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &h->MTimeHigh, &adler32, &crc32); - } - if (h->Version < 0x0120) { - if (h->MTimeLow == 0xffffffffUL) { - h->MTimeLow = 0; - } - h->MTimeHigh = 0; - } - - // .Name - if (pe - p < 1) - return LZO_MORE_DATA; - p = Get8(p, &tmp, &adler32, &crc32); - if (tmp > 0) { - if (pe - p < tmp) - return LZO_MORE_DATA; - adler32 = lzo_adler32(adler32, p, tmp); - crc32 = lzo_crc32(crc32, p, tmp); - - ::memcpy(h->Name, p, tmp); - p += tmp; - } - - if (h->Flags & LZO_H_CRC32) { - checksum = crc32; - } else { - checksum = adler32; - } - - // .HeaderChecksum - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &h->HeaderChecksum, &adler32, &crc32); - if (h->HeaderChecksum != checksum) { - return LZO_WRONG_CHECKSUM; - } - - // XXX(sandello): This is internal Statbox constraint. - // XXX(aozeritsky): Statbox uses Method = 2, Java uses Method = 1 - // XXX(aozeritsky): Both methods use the same decompression function - if (!(h->Method == 1 || h->Method == 2)) { - return LZO_WRONG_METHOD; - } - - if (h->Flags & LZO_H_EXTRA_FIELD) { - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &h->ExtraFieldLen, &adler32, &crc32); - if (pe - p < h->ExtraFieldLen) - return LZO_MORE_DATA; - p += h->ExtraFieldLen; - } - - // OK - InputOffset += p - pb; - return LZO_OK; -} - -int TLzopDecompress::TImpl::ConsumeData() { - using namespace NPrivate::NLzop; - - THeader* h = &Header; - - ui32 adler32 = 1; - ui32 crc32 = 0; - - ui32 dAdler32 = 1; - ui32 dCrc32 = 0; - ui32 cAdler32 = 1; - ui32 cCrc32 = 0; - - ui32 dstLen; - ui32 srcLen; - - unsigned char* p; - unsigned char* pb; - unsigned char* pe; - - if (h->Version == 0) { - return ConsumeHeader(); - } - - pb = p = (unsigned char*)InputData.Data() + InputOffset; - pe = (unsigned char*)InputData.Pos(); - - // dstLen - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &dstLen, &adler32, &crc32); - - if (dstLen == 0) { - InputOffset += p - pb; - return LZO_END_OF_STREAM; - } - if (dstLen == 0xffffffffUL) { - return LZO_WRONG_DST_LEN; - } - if (dstLen > 64 * 1024 * 1024) { - return LZO_DST_LEN_TOO_BIG; - } - - // srcLen - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &srcLen, &adler32, &crc32); - - if (srcLen <= 0 || srcLen > dstLen) { - return LZO_WRONG_SRC_LEN; - } - - if (h->Flags & LZO_ADLER32_D) { - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &dAdler32, &adler32, &crc32); - } - if (h->Flags & LZO_CRC32_D) { - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &dCrc32, &adler32, &crc32); - } - - if (h->Flags & LZO_ADLER32_C) { - if (srcLen < dstLen) { - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &cAdler32, &adler32, &crc32); - } else { - if (!(h->Flags & LZO_ADLER32_D)) - ythrow yexception() << "h->Flags & LZO_ADLER32_C & ~LZO_ADLER32_D"; - cAdler32 = dAdler32; - } - } - if (h->Flags & LZO_CRC32_C) { - if (srcLen < dstLen) { - if (pe - p < 4) - return LZO_MORE_DATA; - p = Get32(p, &cCrc32, &adler32, &crc32); - } else { - if (!(h->Flags & LZO_CRC32_D)) - ythrow yexception() << "h->Flags & LZO_CRC32_C & ~LZO_CRC32_D"; - cCrc32 = dCrc32; - } - } - - // Rock'n'roll! Check'n'consume! - if (pe - p < srcLen) { - Hint = (p - pb) + srcLen; - return LZO_MORE_DATA; - } - - if (h->Flags & LZO_ADLER32_C) { - ui32 checksum; - checksum = lzo_adler32(1, p, srcLen); - if (checksum != cAdler32) { - return LZO_INVALID_SRC_ADLER32; - } - } - if (h->Flags & LZO_CRC32_C) { - ui32 checksum; - checksum = lzo_crc32(1, p, srcLen); - if (checksum != cCrc32) { - return LZO_INVALID_SRC_CRC32; - } - } - - if (OutputData.Avail() < dstLen) { - OutputData.Reserve(RoundUpToPow2(2 * (OutputData.Size() + dstLen))); - } - - unsigned char* output = (unsigned char*)OutputData.Pos(); - OutputData.Advance(dstLen); - - if (srcLen < dstLen) { - lzo_uint tmp; - int rv; - - tmp = dstLen; - rv = lzo1x_decompress_safe( - p, - srcLen, - output, - &tmp, - 0); - - if (rv != LZO_E_OK || tmp != dstLen) { - return LZO_DECOMPRESS_ERROR; - } - } else { - if (!(dstLen == srcLen)) { - ythrow yexception() << "dstLen == srcLen"; - } - ::memcpy(output, p, srcLen); - } - - p += srcLen; - - // Check again. - if (h->Flags & LZO_ADLER32_D) { - ui32 checksum; - checksum = lzo_adler32(1, output, dstLen); - if (checksum != dAdler32) { - return LZO_INVALID_DST_ADLER32; - } - } - if (h->Flags & LZO_CRC32_D) { - ui32 checksum; - checksum = lzo_crc32(1, output, dstLen); - if (checksum != dCrc32) { - return LZO_INVALID_DST_CRC32; - } - } - - // OK - InputOffset += p - pb; - return LZO_OK; -} - -TLzopDecompress::TLzopDecompress(IInputStream* slave, ui32 initialBufferSize) - : Impl_(new TImpl(slave, initialBufferSize)) -{ -} - -TLzopDecompress::~TLzopDecompress() { -} - -size_t TLzopDecompress::DoRead(void* buffer, size_t length) { - return Impl_->Read(buffer, length); -} diff --git a/library/cpp/streams/lzop/lzop.h b/library/cpp/streams/lzop/lzop.h deleted file mode 100644 index 523e5ad01bc..00000000000 --- a/library/cpp/streams/lzop/lzop.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include <util/generic/ptr.h> -#include <util/generic/yexception.h> -#include <util/stream/input.h> -#include <util/stream/output.h> - -class TLzopCompress: public IOutputStream { -public: - TLzopCompress(IOutputStream* slave, ui16 maxBlockSize = 1 << 15); - ~TLzopCompress() override; - -private: - void DoWrite(const void* buf, size_t len) override; - void DoFlush() override; - void DoFinish() override; - -private: - class TImpl; - THolder<TImpl> Impl_; -}; - -class TLzopDecompress: public IInputStream { -public: - TLzopDecompress(IInputStream* slave, ui32 initialBufferSize = 1 << 16); - ~TLzopDecompress() override; - -private: - size_t DoRead(void* buf, size_t len) override; - -private: - class TImpl; - THolder<TImpl> Impl_; -}; diff --git a/library/cpp/streams/xz/README.md b/library/cpp/streams/xz/README.md deleted file mode 100644 index edb344c0fb4..00000000000 --- a/library/cpp/streams/xz/README.md +++ /dev/null @@ -1,9 +0,0 @@ -XZ -=== -`TXzDecompress` supports file formats: -1) `.xz` - could be generated with CLI-tool `xz`. This format allows concatenating compressed files as is: -``` - echo foo | xz > foobar.xz - echo bar | xz >> foobar.xz -``` -2) `.lzma` - could be generated with CLI-tool `lzma` - it is legacy: https://fossies.org/linux/xz/README diff --git a/library/cpp/streams/xz/decompress.cpp b/library/cpp/streams/xz/decompress.cpp deleted file mode 100644 index 361b3cff14c..00000000000 --- a/library/cpp/streams/xz/decompress.cpp +++ /dev/null @@ -1,326 +0,0 @@ -#include "decompress.h" - -#include <contrib/libs/lzma/liblzma/api/lzma.h> - -#include <util/generic/yexception.h> -#include <util/stream/output.h> -#include <util/stream/str.h> -#include <util/stream/zerocopy.h> - -// Based on https://fossies.org/linux/xz/doc/examples/02_decompress.c - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file 02_decompress.c -/// \brief Decompress .xz files to stdout -/// -/// Usage: ./02_decompress INPUT_FILES... > OUTFILE -/// -/// Example: ./02_decompress foo.xz bar.xz > foobar -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -namespace { - class IInput { - public: - virtual ~IInput() = default; - virtual size_t Next(const ui8*& ptr) = 0; - }; - - class TCopyInput: public IInput { - public: - TCopyInput(IInputStream* slave) - : Slave_(slave) - { - } - - size_t Next(const ui8*& ptr) override { - ptr = Inbuf_; - return Slave_->Read(Inbuf_, sizeof(Inbuf_)); - } - - private: - IInputStream* Slave_; - ui8 Inbuf_[4096]; - }; - - class TZeroCopy: public IInput { - public: - TZeroCopy(IZeroCopyInput* slave) - : Slave_(slave) - { - } - - size_t Next(const ui8*& ptr) override { - return Slave_->Next(&ptr); - } - - private: - IZeroCopyInput* Slave_; - }; - - std::unique_ptr<IInput> createInput(IInputStream* slave) { - return std::make_unique<TCopyInput>(slave); - } - - std::unique_ptr<IInput> createInput(IZeroCopyInput* slave) { - return std::make_unique<TZeroCopy>(slave); - } -} - -class TUnbufferedXzDecompress::TImpl { -public: - template <class T> - TImpl(T* slave) - : Input_(createInput(slave)) - , Strm_(LZMA_STREAM_INIT) - { - TString err; - Y_ENSURE(initDecoder(&Strm_, err), - "Error initializing the decoder: " << err); - Strm_.next_in = NULL; - Strm_.avail_in = 0; - } - - ~TImpl() { - // Free the memory allocated for the decoder - lzma_end(&Strm_); - } - - size_t DoRead(void* buf, size_t len) { - if (IsOutFinished_) { - return 0; - } - - size_t res; - TString err; - - Y_ENSURE(decompress(buf, len, res, err), - "lzma decoder error: " << err); - - return res; - } - -private: - bool decompress(void* buf, size_t len, size_t& outLen, TString& err) { - // When LZMA_CONCATENATED flag was used when initializing the decoder, - // we need to tell lzma_code() when there will be no more input. - // This is done by setting action to LZMA_FINISH instead of LZMA_RUN - // in the same way as it is done when encoding. - // - // When LZMA_CONCATENATED isn't used, there is no need to use - // LZMA_FINISH to tell when all the input has been read, but it - // is still OK to use it if you want. When LZMA_CONCATENATED isn't - // used, the decoder will stop after the first .xz stream. In that - // case some unused data may be left in strm->next_in. - lzma_action action = LZMA_RUN; - - Strm_.next_out = (ui8*)buf; - Strm_.avail_out = len; - - while (true) { - if (Strm_.avail_in == 0 && !IsInFinished_) { - size_t size = Input_->Next(Strm_.next_in); - - if (size == 0) { - IsInFinished_ = true; - } else { - Strm_.avail_in = size; - } - - // Once the end of the input file has been reached, - // we need to tell lzma_code() that no more input - // will be coming. As said before, this isn't required - // if the LZMA_CONCATENATED flag isn't used when - // initializing the decoder. - if (IsInFinished_) - action = LZMA_FINISH; - } - - lzma_ret ret = lzma_code(&Strm_, action); - - if (ret == LZMA_STREAM_END) { - // Once everything has been decoded successfully, the - // return value of lzma_code() will be LZMA_STREAM_END. - // - // It is important to check for LZMA_STREAM_END. Do not - // assume that getting ret != LZMA_OK would mean that - // everything has gone well or that when you aren't - // getting more output it must have successfully - // decoded everything. - IsOutFinished_ = true; - } - - if (Strm_.avail_out == 0 || ret == LZMA_STREAM_END) { - outLen = len - Strm_.avail_out; - return true; - } - - if (ret != LZMA_OK) { - // It's not LZMA_OK nor LZMA_STREAM_END, - // so it must be an error code. See lzma/base.h - // (src/liblzma/api/lzma/base.h in the source package - // or e.g. /usr/include/lzma/base.h depending on the - // install prefix) for the list and documentation of - // possible values. Many values listen in lzma_ret - // enumeration aren't possible in this example, but - // can be made possible by enabling memory usage limit - // or adding flags to the decoder initialization. - switch (ret) { - case LZMA_MEM_ERROR: - err = "Memory allocation failed"; - break; - - case LZMA_FORMAT_ERROR: - // .xz magic bytes weren't found. - err = "The input is not in the .xz format"; - break; - - case LZMA_OPTIONS_ERROR: - // For example, the headers specify a filter - // that isn't supported by this liblzma - // version (or it hasn't been enabled when - // building liblzma, but no-one sane does - // that unless building liblzma for an - // embedded system). Upgrading to a newer - // liblzma might help. - // - // Note that it is unlikely that the file has - // accidentally became corrupt if you get this - // error. The integrity of the .xz headers is - // always verified with a CRC32, so - // unintentionally corrupt files can be - // distinguished from unsupported files. - err = "Unsupported compression options"; - break; - - case LZMA_DATA_ERROR: - err = "Compressed file is corrupt"; - break; - - case LZMA_BUF_ERROR: - // Typically this error means that a valid - // file has got truncated, but it might also - // be a damaged part in the file that makes - // the decoder think the file is truncated. - // If you prefer, you can use the same error - // message for this as for LZMA_DATA_ERROR. - err = "Compressed file is truncated or " - "otherwise corrupt"; - break; - - default: - // This is most likely LZMA_PROG_ERROR. - err = "Unknown error, possibly a bug"; - break; - } - - TStringOutput out(err); - out << "[" << (int)ret << "]"; - return false; - } - } - } - - static bool initDecoder(lzma_stream* strm, TString& err) { - // Initialize a .xz decoder. The decoder supports a memory usage limit - // and a set of flags. - // - // The memory usage of the decompressor depends on the settings used - // to compress a .xz file. It can vary from less than a megabyte to - // a few gigabytes, but in practice (at least for now) it rarely - // exceeds 65 MiB because that's how much memory is required to - // decompress files created with "xz -9". Settings requiring more - // memory take extra effort to use and don't (at least for now) - // provide significantly better compression in most cases. - // - // Memory usage limit is useful if it is important that the - // decompressor won't consume gigabytes of memory. The need - // for limiting depends on the application. In this example, - // no memory usage limiting is used. This is done by setting - // the limit to UINT64_MAX. - // - // The .xz format allows concatenating compressed files as is: - // - // echo foo | xz > foobar.xz - // echo bar | xz >> foobar.xz - // - // When decompressing normal standalone .xz files, LZMA_CONCATENATED - // should always be used to support decompression of concatenated - // .xz files. If LZMA_CONCATENATED isn't used, the decoder will stop - // after the first .xz stream. This can be useful when .xz data has - // been embedded inside another file format. - // - // Flags other than LZMA_CONCATENATED are supported too, and can - // be combined with bitwise-or. See lzma/container.h - // (src/liblzma/api/lzma/container.h in the source package or e.g. - // /usr/include/lzma/container.h depending on the install prefix) - // for details. - lzma_ret ret = lzma_auto_decoder( - strm, UINT64_MAX, LZMA_CONCATENATED); - - // Return successfully if the initialization went fine. - if (ret == LZMA_OK) - return true; - - // Something went wrong. The possible errors are documented in - // lzma/container.h (src/liblzma/api/lzma/container.h in the source - // package or e.g. /usr/include/lzma/container.h depending on the - // install prefix). - // - // Note that LZMA_MEMLIMIT_ERROR is never possible here. If you - // specify a very tiny limit, the error will be delayed until - // the first headers have been parsed by a call to lzma_code(). - switch (ret) { - case LZMA_MEM_ERROR: - err = "Memory allocation failed"; - break; - - case LZMA_OPTIONS_ERROR: - err = "Unsupported decompressor flags"; - break; - - default: - // This is most likely LZMA_PROG_ERROR indicating a bug in - // this program or in liblzma. It is inconvenient to have a - // separate error message for errors that should be impossible - // to occur, but knowing the error code is important for - // debugging. That's why it is good to print the error code - // at least when there is no good error message to show. - err = "Unknown error, possibly a bug"; - break; - } - - TStringOutput out(err); - out << "[" << (int)ret << "]"; - return false; - } - -private: - std::unique_ptr<IInput> Input_; - lzma_stream Strm_; - - bool IsInFinished_ = false; - bool IsOutFinished_ = false; -}; - -TUnbufferedXzDecompress::TUnbufferedXzDecompress(IInputStream* slave) - : Impl_(std::make_unique<TImpl>(slave)) -{ -} - -TUnbufferedXzDecompress::TUnbufferedXzDecompress(IZeroCopyInput* slave) - : Impl_(std::make_unique<TImpl>(slave)) -{ -} - -TUnbufferedXzDecompress::~TUnbufferedXzDecompress() = default; - -size_t TUnbufferedXzDecompress::DoRead(void* buf, size_t len) { - return Impl_->DoRead(buf, len); -} diff --git a/library/cpp/streams/xz/decompress.h b/library/cpp/streams/xz/decompress.h deleted file mode 100644 index 8389cbdaf91..00000000000 --- a/library/cpp/streams/xz/decompress.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include <util/stream/buffered.h> -#include <util/stream/input.h> - -class IZeroCopyInput; - -/** - * Unbuffered decompressing stream for .XZ and .LZMA files. - * - * Do not use it for reading in small pieces. - */ -class TUnbufferedXzDecompress: public IInputStream { -public: - TUnbufferedXzDecompress(IInputStream* slave); - TUnbufferedXzDecompress(IZeroCopyInput* slave); - ~TUnbufferedXzDecompress() override; - -private: - size_t DoRead(void* buf, size_t len) override; - -private: - class TImpl; - std::unique_ptr<TImpl> Impl_; -}; - -/** - * Buffered decompressing stream for .XZ and .LZMA files. - * - * Supports efficient `ReadLine` calls and similar "reading in small pieces" - * usage patterns. - */ -class TXzDecompress: public TBuffered<TUnbufferedXzDecompress> { -public: - template <class T> - inline TXzDecompress(T&& t, size_t buf = 1 << 13) - : TBuffered<TUnbufferedXzDecompress>(buf, std::forward<T>(t)) - { - } -}; diff --git a/library/cpp/streams/xz/ut/decompress_ut.cpp b/library/cpp/streams/xz/ut/decompress_ut.cpp deleted file mode 100644 index 2ebeca4e85a..00000000000 --- a/library/cpp/streams/xz/ut/decompress_ut.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include <library/cpp/streams/xz/decompress.h> - -#include <library/cpp/string_utils/base64/base64.h> -#include <library/cpp/testing/unittest/registar.h> - -Y_UNIT_TEST_SUITE(XzDecompress) { - Y_UNIT_TEST(decompress) { - TStringStream in; - in << Base64Decode("/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4ANQAUVdABkMHARbg7qMApbl/qwEvrgQKpvF7Rbp/QJJdquZ88M3I5x3ANhSSpxvtnSoyPDeC6M8vz0vNKiOCsbIqvsGIwxrx+6YNqT87gDxVS8S3fHeoAZTf+zbg1DpDtv7Xh7Q3ug24wxNbPMi2p+WAo3V0LAi+lGUQmA44nJlabRv0XZ5CWhwgYtEWrrbPxoFjONeCa4p5BoX+TVgWegToFQMeJhVXMbDGWOIFL56X/F7nDJ47pjAy2GJIHHI5W/wrGH6uB0TCwpudW96peQaEgwMSZE07PfPE+XkfEymxhkxTs5Mnpc2rmQCiZ+3I6PqP+Qj8fuqaxb0fAJPQrbWYsqqeXP/3VNOeDRk+Szr9H3TMGI6yepUgkrgqNpaIYYcbxTU43eofcnTdwdsgi8fpH99tx3rrKq4zveStkZgZQqeY+MCvineIAAAAAAA2X8RUfmPU3kAAeEC0QYAANTt6P6xxGf7AgAAAAAEWVo="); - - TXzDecompress xz(&in); - - UNIT_ASSERT_VALUES_EQUAL( - xz.ReadAll(), - "2020-08-27T18:22:02.332 INFO: Starting blackbox module\n" - "2020-08-27T18:22:02.850 INFO: Init libauth (root kspace=<yandex_ru>, sign with key #49)\n" - "2020-08-27T18:22:02.851 DEBUG: KeyRing: randoms: table name loaded. Took 0.000918s\n" - "2020-08-27T18:22:02.853 DEBUG: KeyRing: randoms: min-max key id loaded. Took 0.001249s\n" - "2020-08-27T18:22:02.863 DEBUG: KeyRing: randoms: new keys loaded. Took 0.010837s\n" - "2020-08-27T18:22:02.865 DEBUG: Loaded 2389 new key(s) for keyspace 'yandex_ru'. Key ids: 330589-335364\n" - "2020-08-27T18:22:02.866 INFO: Attempt to load second time for spacename yandex_ru\n" - "2020-08-27T18:22:02.867 DEBUG: KeyRing: randoms_ua: table name loaded. Took 0.000926s\n" - "2020-08-27T18:22:02.868 DEBUG: KeyRing: randoms_ua: min-max key id loaded. Took 0.001212s\n" - "2020-08-27T18:22:02.871 DEBUG: KeyRing: randoms_ua: new keys loaded. Took 0.003202s\n"); - } -} diff --git a/library/cpp/string_utils/secret_string/secret_string.cpp b/library/cpp/string_utils/secret_string/secret_string.cpp deleted file mode 100644 index 3b68d3cd274..00000000000 --- a/library/cpp/string_utils/secret_string/secret_string.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "secret_string.h" - -#include <util/system/madvise.h> - -namespace NSecretString { - TSecretString::TSecretString(TStringBuf value) { - Init(value); - } - - TSecretString::~TSecretString() { - try { - Clear(); - } catch (...) { - } - } - - TSecretString& TSecretString::operator=(const TSecretString& o) { - if (&o == this) { - return *this; - } - - Init(o.Value_); - - return *this; - } - - /** - * It is not honest "move". Actually it is copy-assignment with cleaning of other instance. - * This way allowes to avoid side effects of string optimizations: - * Copy-On-Write or Short-String-Optimization - */ - TSecretString& TSecretString::operator=(TSecretString&& o) { - if (&o == this) { - return *this; - } - - Init(o.Value_); - o.Clear(); - - return *this; - } - - TSecretString& TSecretString::operator=(const TStringBuf o) { - Init(o); - - return *this; - } - - void TSecretString::Init(TStringBuf value) { - Clear(); - if (value.empty()) { - return; - } - - Value_ = value; - MadviseExcludeFromCoreDump(Value_); - } - - void TSecretString::Clear() { - if (Value_.empty()) { - return; - } - - SecureZero((void*)Value_.data(), Value_.size()); - MadviseIncludeIntoCoreDump(Value_); - Value_.clear(); - } -} diff --git a/library/cpp/string_utils/secret_string/secret_string.h b/library/cpp/string_utils/secret_string/secret_string.h deleted file mode 100644 index fdb9f6a85ce..00000000000 --- a/library/cpp/string_utils/secret_string/secret_string.h +++ /dev/null @@ -1,74 +0,0 @@ -#pragma once - -#include <library/cpp/string_utils/ztstrbuf/ztstrbuf.h> - -#include <util/generic/string.h> - -namespace NSecretString { - /** - * TSecretString allowes to store some long lived secrets in "secure" storage in memory. - * Common usage: - * 1) read secret value from disk/env/etc - * 2) put it into TSecretString - * 3) destory secret copy from 1) - * - * Useful scenerios for TSecretString: - * - in memory only tasks: using key to create crypto signature; - * - rare network cases: db password on connection or OAuth token in background tasks. - * These cases disclosure the secret - * because of sending it over network with some I/O frameworks. - * Usually such frameworks copy input params to provide network protocol: gRPC, for example. - * - * Supported features: - * 1. Exclude secret from core dump. - * madvise(MADV_DONTDUMP) in ctor excludes full memory page from core dump. - * madvise(MADV_DODUMP) in dtor reverts previous action. - * 2. Zero memory before free. - * - * Code dump looks like this: -(gdb) print s -$1 = (const TSecretString &) @0x7fff23c4c560: { - Value_ = {<TStringBase<TBasicString<char, std::__y1::char_traits<char> >, char, std::__y1::char_traits<char> >> = { - static npos = <optimized out>}, Data_ = 0x107c001d8 <error: Cannot access memory at address 0x107c001d8>}} - */ - - class TSecretString { - public: - TSecretString() = default; - TSecretString(TStringBuf value); - ~TSecretString(); - - TSecretString(const TSecretString& o) - : TSecretString(o.Value()) - { - } - - TSecretString(TSecretString&& o) - : TSecretString(o.Value()) - { - o.Clear(); - } - - TSecretString& operator=(const TSecretString& o); - TSecretString& operator=(TSecretString&& o); - - TSecretString& operator=(const TStringBuf o); - - operator TZtStringBuf() const { - return Value(); - } - - // Provides zero terminated string - TZtStringBuf Value() const { - return TZtStringBuf(Value_); - } - - private: - // TStringBuf breaks Copy-On-Write to provide correct copy-ctor and copy-assignment - void Init(TStringBuf value); - void Clear(); - - private: - TString Value_; - }; -} diff --git a/library/cpp/string_utils/secret_string/ut/secret_string_ut.cpp b/library/cpp/string_utils/secret_string/ut/secret_string_ut.cpp deleted file mode 100644 index 681b75368f0..00000000000 --- a/library/cpp/string_utils/secret_string/ut/secret_string_ut.cpp +++ /dev/null @@ -1,147 +0,0 @@ -#include <library/cpp/string_utils/secret_string/secret_string.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NSecretString; - -Y_UNIT_TEST_SUITE(SecretTest) { - Y_UNIT_TEST(Common) { - TSecretString s; - UNIT_ASSERT_VALUES_EQUAL("", s.Value()); - UNIT_ASSERT_VALUES_EQUAL("", (TStringBuf)s); - - TSecretString s2("qwerty"); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - UNIT_ASSERT_VALUES_EQUAL("qwerty", (TStringBuf)s2); - } - - Y_UNIT_TEST(CopyCtor1) { - TSecretString s1("qwerty"); - - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1.Value()); - - { - TSecretString s2(s1); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1.Value()); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - } - - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1.Value()); - } - - Y_UNIT_TEST(CopyCtor2) { - auto s1 = MakeHolder<TSecretString>("qwerty"); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1->Value()); - - TSecretString s2(*s1); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1->Value()); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - - s1.Reset(); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - } - - Y_UNIT_TEST(MoveCtor1) { - TSecretString s1("qwerty"); - - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1.Value()); - - { - TSecretString s2(std::move(s1)); - UNIT_ASSERT_VALUES_EQUAL("", s1.Value()); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - } - - UNIT_ASSERT_VALUES_EQUAL("", s1.Value()); - } - - Y_UNIT_TEST(MoveCtor2) { - auto s1 = MakeHolder<TSecretString>("qwerty"); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1->Value()); - - TSecretString s2(std::move(*s1)); - UNIT_ASSERT_VALUES_EQUAL("", s1->Value()); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - - s1.Reset(); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - } - - Y_UNIT_TEST(CopyAssignment1) { - TSecretString s1("qwerty"); - - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1.Value()); - - { - TSecretString s2; - UNIT_ASSERT_VALUES_EQUAL("", s2.Value()); - - s2 = s1; - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1.Value()); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - } - - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1.Value()); - } - - Y_UNIT_TEST(CopyAssignment2) { - auto s1 = MakeHolder<TSecretString>("qwerty"); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1->Value()); - - TSecretString s2; - UNIT_ASSERT_VALUES_EQUAL("", s2.Value()); - - s2 = *s1; - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1->Value()); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - - s1.Reset(); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - - TSecretString s3; - s2 = s3; - UNIT_ASSERT_VALUES_EQUAL("", s2.Value()); - } - - Y_UNIT_TEST(MoveAssignment1) { - TSecretString s1("qwerty"); - - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1.Value()); - - { - TSecretString s2; - UNIT_ASSERT_VALUES_EQUAL("", s2.Value()); - - s2 = std::move(s1); - UNIT_ASSERT_VALUES_EQUAL("", s1.Value()); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - } - - UNIT_ASSERT_VALUES_EQUAL("", s1.Value()); - } - - Y_UNIT_TEST(MoveAssignment2) { - auto s1 = MakeHolder<TSecretString>("qwerty"); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s1->Value()); - - TSecretString s2; - UNIT_ASSERT_VALUES_EQUAL("", s2.Value()); - - s2 = std::move(*s1); - UNIT_ASSERT_VALUES_EQUAL("", s1->Value()); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - - s1.Reset(); - UNIT_ASSERT_VALUES_EQUAL("qwerty", s2.Value()); - - TSecretString s3; - s2 = std::move(s3); - UNIT_ASSERT_VALUES_EQUAL("", s2.Value()); - } - - Y_UNIT_TEST(ZeroTerminated) { - TSecretString s("qwerty"); - - UNIT_ASSERT_VALUES_EQUAL(s.Value().size(), strlen(s.Value().data())); - } -} diff --git a/library/cpp/string_utils/tskv_format/builder.cpp b/library/cpp/string_utils/tskv_format/builder.cpp deleted file mode 100644 index ede90740221..00000000000 --- a/library/cpp/string_utils/tskv_format/builder.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "builder.h" diff --git a/library/cpp/string_utils/tskv_format/builder.h b/library/cpp/string_utils/tskv_format/builder.h deleted file mode 100644 index 40689ddc85e..00000000000 --- a/library/cpp/string_utils/tskv_format/builder.h +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once - -#include "escape.h" - -#include <util/stream/str.h> - -namespace NTskvFormat { - class TLogBuilder { - private: - TStringStream Out; - - public: - TLogBuilder() = default; - - TLogBuilder(TStringBuf logType, ui32 unixtime) { - Begin(logType, unixtime); - } - - TLogBuilder(TStringBuf logType) { - Begin(logType); - } - - TLogBuilder& Add(TStringBuf fieldName, TStringBuf fieldValue) { - if (!Out.Empty()) { - Out << '\t'; - } - Escape(fieldName, Out.Str()); - Out << '='; - Escape(fieldValue, Out.Str()); - - return *this; - } - - TLogBuilder& AddUnescaped(TStringBuf fieldName, TStringBuf fieldValue) { - if (!Out.Empty()) { - Out << '\t'; - } - Out << fieldName << '=' << fieldValue; - return *this; - } - - TLogBuilder& Begin(TStringBuf logType, ui32 unixtime) { - Out << "tskv\ttskv_format=" << logType << "\tunixtime=" << unixtime; - return *this; - } - - TLogBuilder& Begin(TStringBuf logType) { - Out << "tskv\ttskv_format=" << logType; - return *this; - } - - TLogBuilder& End() { - Out << '\n'; - return *this; - } - - TLogBuilder& Clear() { - Out.Clear(); - return *this; - } - - TString& Str() { - return Out.Str(); - } - }; - -} diff --git a/library/cpp/string_utils/tskv_format/escape.cpp b/library/cpp/string_utils/tskv_format/escape.cpp deleted file mode 100644 index 3dc78bec8c0..00000000000 --- a/library/cpp/string_utils/tskv_format/escape.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#include <util/generic/yexception.h> -#include "escape.h" - -namespace NTskvFormat { - namespace { - const TStringBuf ESCAPE_CHARS("\t\n\r\\\0=\"", 7); - - TString& EscapeImpl(const char* src, size_t len, TString& dst) { - TStringBuf srcStr(src, len); - size_t noEscapeStart = 0; - - while (noEscapeStart < len) { - size_t noEscapeEnd = srcStr.find_first_of(ESCAPE_CHARS, noEscapeStart); - - if (noEscapeEnd == TStringBuf::npos) { - dst.append(src + noEscapeStart, len - noEscapeStart); - break; - } - - dst.append(src + noEscapeStart, noEscapeEnd - noEscapeStart); - - switch (src[noEscapeEnd]) { - case '\t': - dst.append(TStringBuf("\\t")); - break; - case '\n': - dst.append(TStringBuf("\\n")); - break; - case '\r': - dst.append(TStringBuf("\\r")); - break; - case '\0': - dst.append(TStringBuf("\\0")); - break; - case '\\': - dst.append(TStringBuf("\\\\")); - break; - case '=': - dst.append(TStringBuf("\\=")); - break; - case '"': - dst.append(TStringBuf("\\\"")); - break; - } - - noEscapeStart = noEscapeEnd + 1; - } - - return dst; - } - - TString& UnescapeImpl(const char* src, const size_t len, TString& dst) { - TStringBuf srcStr(src, len); - size_t noEscapeStart = 0; - - while (noEscapeStart < len) { - size_t noEscapeEnd = srcStr.find('\\', noEscapeStart); - - if (noEscapeEnd == TStringBuf::npos) { - dst.append(src + noEscapeStart, len - noEscapeStart); - break; - } - - dst.append(src + noEscapeStart, noEscapeEnd - noEscapeStart); - - if (noEscapeEnd + 1 >= len) { - throw yexception() << "expected (t|n|r|0|\\|=|\"|) after \\. Got end of line."; - } - - switch (src[noEscapeEnd + 1]) { - case 't': - dst.append('\t'); - break; - case 'n': - dst.append('\n'); - break; - case 'r': - dst.append('\r'); - break; - case '0': - dst.append('\0'); - break; - case '\\': - dst.append('\\'); - break; - case '=': - dst.append('='); - break; - case '"': - dst.append('"'); - break; - default: - throw yexception() << "unexpected symbol '" << src[noEscapeEnd + 1] << "' after \\"; - } - - noEscapeStart = noEscapeEnd + 2; - } - - return dst; - } - - } - - TString& Escape(const TStringBuf& src, TString& dst) { - return EscapeImpl(src.data(), src.size(), dst); - } - - TString& Unescape(const TStringBuf& src, TString& dst) { - return UnescapeImpl(src.data(), src.size(), dst); - } - -} diff --git a/library/cpp/string_utils/tskv_format/escape.h b/library/cpp/string_utils/tskv_format/escape.h deleted file mode 100644 index 2e3dd02c983..00000000000 --- a/library/cpp/string_utils/tskv_format/escape.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include <util/generic/strbuf.h> -#include <util/generic/string.h> - -namespace NTskvFormat { - TString& Escape(const TStringBuf& src, TString& dst); - TString& Unescape(const TStringBuf& src, TString& dst); - -} diff --git a/library/cpp/string_utils/tskv_format/tskv_map.cpp b/library/cpp/string_utils/tskv_format/tskv_map.cpp deleted file mode 100644 index 99e5f19731b..00000000000 --- a/library/cpp/string_utils/tskv_format/tskv_map.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "tskv_map.h" - -namespace { - void Split(const TStringBuf& kv, TStringBuf& key, TStringBuf& value, bool& keyHasEscapes) { - size_t delimiter = 0; - keyHasEscapes = false; - for (delimiter = 0; delimiter < kv.size() && kv[delimiter] != '='; ++delimiter) { - if (kv[delimiter] == '\\') { - ++delimiter; - keyHasEscapes = true; - } - } - - if (delimiter < kv.size()) { - key = kv.Head(delimiter); - value = kv.Tail(delimiter + 1); - } else { - throw yexception() << "Incorrect tskv format"; - } - } - - TStringBuf DeserializeTokenToBuffer(const TStringBuf& token, TString& buffer) { - size_t tokenStart = buffer.size(); - NTskvFormat::Unescape(token, buffer); - return TStringBuf(buffer).Tail(tokenStart); - } - - void DeserializeTokenToString(const TStringBuf& token, TString& result, bool unescape) { - if (unescape) { - result.clear(); - NTskvFormat::Unescape(token, result); - } else { - result = token; - } - - } -} - -void NTskvFormat::NDetail::DeserializeKvToStringBufs(const TStringBuf& kv, TStringBuf& key, TStringBuf& value, TString& buffer, bool unescape) { - bool keyHasEscapes = false; - Split(kv, key, value, keyHasEscapes); - if (unescape) { - if (keyHasEscapes) { - key = DeserializeTokenToBuffer(key, buffer); - } - if (value.Contains('\\')) { - value = DeserializeTokenToBuffer(value, buffer); - } - } -} - -void NTskvFormat::NDetail::DeserializeKvToStrings(const TStringBuf& kv, TString& key, TString& value, bool unescape) { - TStringBuf keyBuf, valueBuf; - bool keyHasEscapes = false; - Split(kv, keyBuf, valueBuf, keyHasEscapes); - - Y_UNUSED(keyHasEscapes); - DeserializeTokenToString(keyBuf, key, unescape); - DeserializeTokenToString(valueBuf, value, unescape); -} diff --git a/library/cpp/string_utils/tskv_format/tskv_map.h b/library/cpp/string_utils/tskv_format/tskv_map.h deleted file mode 100644 index 4f4978fcf50..00000000000 --- a/library/cpp/string_utils/tskv_format/tskv_map.h +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once - -#include "escape.h" -#include <util/string/cast.h> -#include <util/string/split.h> - -namespace NTskvFormat { - namespace NDetail { - void DeserializeKvToStringBufs(const TStringBuf& kv, TStringBuf& key, TStringBuf& value, TString& buffer, bool unescape); - void DeserializeKvToStrings(const TStringBuf& kv, TString& key, TString& value, bool unescape); - } - - template <typename T> - TString& SerializeMap(const T& data, TString& result) { - result.clear(); - for (const auto& kv : data) { - if (result.size() > 0) { - result.push_back('\t'); - } - Escape(ToString(kv.first), result); - result.push_back('='); - Escape(ToString(kv.second), result); - } - return result; - } - - /** - * Deserializing to TStringBuf is faster, just remember that `data' - * must not be invalidated while `result' is still in use. - */ - template <typename T> - void DeserializeMap(const TStringBuf& data, T& result, TString& buffer, bool unescape = true) { - result.clear(); - buffer.clear(); - buffer.reserve(data.size()); - TStringBuf key, value; - - StringSplitter(data.begin(), data.end()).Split('\t').Consume([&](const TStringBuf kv){ - NDetail::DeserializeKvToStringBufs(kv, key, value, buffer, unescape); - result[key] = value; - }); - - Y_ASSERT(buffer.size() <= data.size()); - } - - template <typename T> - void DeserializeMap(const TStringBuf& data, T& result, bool unescape = true) { - if constexpr(std::is_same<typename T::key_type, TStringBuf>::value || - std::is_same<typename T::mapped_type, TStringBuf>::value) - { - DeserializeMap(data, result, result.DeserializeBuffer, unescape); // we can't unescape values w/o buffer - return; - } - result.clear(); - TString key, value; - - StringSplitter(data.begin(), data.end()).Split('\t').Consume([&](const TStringBuf kv){ - NDetail::DeserializeKvToStrings(kv, key, value, unescape); - result[key] = value; - }); - } -} diff --git a/library/cpp/testing/gtest/friend.h b/library/cpp/testing/gtest/friend.h deleted file mode 100644 index 551a218be08..00000000000 --- a/library/cpp/testing/gtest/friend.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -// Using absolute path to gtest headers in order to allow using friend.h without PEERDIRing gtest. -#include <contrib/restricted/googletest/googletest/include/gtest/gtest_prod.h> - diff --git a/library/cpp/threading/blocking_queue/blocking_queue.cpp b/library/cpp/threading/blocking_queue/blocking_queue.cpp deleted file mode 100644 index db199c80be5..00000000000 --- a/library/cpp/threading/blocking_queue/blocking_queue.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "blocking_queue.h" - -// just check compilability diff --git a/library/cpp/threading/blocking_queue/blocking_queue.h b/library/cpp/threading/blocking_queue/blocking_queue.h deleted file mode 100644 index 48d3762f68a..00000000000 --- a/library/cpp/threading/blocking_queue/blocking_queue.h +++ /dev/null @@ -1,158 +0,0 @@ -#pragma once - -#include <util/generic/deque.h> -#include <util/generic/maybe.h> -#include <util/generic/yexception.h> -#include <util/system/condvar.h> -#include <util/system/guard.h> -#include <util/system/mutex.h> - -#include <utility> - -namespace NThreading { - /// - /// TBlockingQueue is a queue of elements of limited or unlimited size. - /// Queue provides Push and Pop operations that block if operation can't be executed - /// (queue is empty or maximum size is reached). - /// - /// Queue can be stopped, in that case all blocked operation will return `Nothing` / false. - /// - /// All operations are thread safe. - /// - /// - /// Example of usage: - /// TBlockingQueue<int> queue; - /// - /// ... - /// - /// // thread 1 - /// queue.Push(42); - /// queue.Push(100500); - /// - /// ... - /// - /// // thread 2 - /// while (TMaybe<int> number = queue.Pop()) { - /// ProcessNumber(number.GetRef()); - /// } - template <class TElement> - class TBlockingQueue { - public: - /// - /// Creates blocking queue with given maxSize - /// if maxSize == 0 then queue is unlimited - TBlockingQueue(size_t maxSize) - : MaxSize(maxSize == 0 ? Max<size_t>() : maxSize) - , Stopped(false) - { - } - - /// - /// Blocks until queue has some elements or queue is stopped or deadline is reached. - /// Returns `Nothing` if queue is stopped or deadline is reached. - /// Returns element otherwise. - TMaybe<TElement> Pop(TInstant deadline = TInstant::Max()) { - TGuard<TMutex> g(Lock); - - const auto canPop = [this]() { return CanPop(); }; - if (!CanPopCV.WaitD(Lock, deadline, canPop)) { - return Nothing(); - } - - if (Stopped && Queue.empty()) { - return Nothing(); - } - TElement e = std::move(Queue.front()); - Queue.pop_front(); - CanPushCV.Signal(); - return std::move(e); - } - - TMaybe<TElement> Pop(TDuration duration) { - return Pop(TInstant::Now() + duration); - } - - /// - /// Blocks until queue has space for new elements or queue is stopped or deadline is reached. - /// Returns false exception if queue is stopped and push failed or deadline is reached. - /// Pushes element to queue and returns true otherwise. - bool Push(const TElement& e, TInstant deadline = TInstant::Max()) { - return PushRef(e, deadline); - } - - bool Push(TElement&& e, TInstant deadline = TInstant::Max()) { - return PushRef(std::move(e), deadline); - } - - bool Push(const TElement& e, TDuration duration) { - return Push(e, TInstant::Now() + duration); - } - - bool Push(TElement&& e, TDuration duration) { - return Push(std::move(e), TInstant::Now() + duration); - } - - /// - /// Stops the queue, all blocked operations will be aborted. - void Stop() { - TGuard<TMutex> g(Lock); - Stopped = true; - CanPopCV.BroadCast(); - CanPushCV.BroadCast(); - } - - /// - /// Checks whether queue is empty. - bool Empty() const { - TGuard<TMutex> g(Lock); - return Queue.empty(); - } - - /// - /// Returns size of the queue. - size_t Size() const { - TGuard<TMutex> g(Lock); - return Queue.size(); - } - - /// - /// Checks whether queue is stopped. - bool IsStopped() const { - TGuard<TMutex> g(Lock); - return Stopped; - } - - private: - bool CanPush() const { - return Queue.size() < MaxSize || Stopped; - } - - bool CanPop() const { - return !Queue.empty() || Stopped; - } - - template <typename Ref> - bool PushRef(Ref e, TInstant deadline) { - TGuard<TMutex> g(Lock); - const auto canPush = [this]() { return CanPush(); }; - if (!CanPushCV.WaitD(Lock, deadline, canPush)) { - return false; - } - if (Stopped) { - return false; - } - Queue.push_back(std::forward<TElement>(e)); - CanPopCV.Signal(); - return true; - } - - private: - TMutex Lock; - TCondVar CanPopCV; - TCondVar CanPushCV; - TDeque<TElement> Queue; - size_t MaxSize; - bool Stopped; - }; - -} diff --git a/library/cpp/threading/cancellation/README.md b/library/cpp/threading/cancellation/README.md deleted file mode 100644 index 98e0e9b299f..00000000000 --- a/library/cpp/threading/cancellation/README.md +++ /dev/null @@ -1,112 +0,0 @@ -The Cancellation library -======================== - -Intro ------ - -This small library provides primitives for implementation of a cooperative cancellation of long running or asynchronous operations. -The design has been copied from the well-known CancellationTokenSource/CancellationToken classes of the .NET Framework - -To use the library include `cancellation_token.h`. - -Examples --------- - -1. Simple check for cancellation - - ```c++ - void LongRunningOperation(TCancellationToken token) { - ... - if (token.IsCancellationRequested()) { - return; - } - ... - } - - TCancellationTokenSource source; - TThread thread([token = source.Token()]() { LongRunningOperation(std::move(token)); }); - thread.Start(); - ... - source.Cancel(); - thread.Join(); - ``` - -2. Exit via an exception - - ```c++ - void LongRunningOperation(TCancellationToken token) { - try { - for (;;) { - ... - token.ThrowIfCancellationRequested(); - ... - } - } catch (TOperationCancelledException const&) { - return; - } catch (...) { - Y_FAIL("Never should be there") - } - } - - TCancellationTokenSource source; - TThread thread([token = source.Token()]() { LongRunningOperation(std::move(token)); }); - thread.Start(); - ... - source.Cancel(); - thread.Join(); - ``` - -3. Periodic poll with cancellation - - ```c++ - void LongRunningOperation(TCancellationToken token) { - while (!token.Wait(PollInterval)) { - ... - } - } - - TCancellationTokenSource source; - TThread thread([token = source.Token()]() { LongRunningOperation(std::move(token)); }); - thread.Start(); - ... - source.Cancel(); - thread.Join(); - ``` - -4. Waiting on the future - - ```c++ - TFuture<void> InnerOperation(); - TFuture<void> OuterOperation(TCancellationToken token) { - return WaitAny(FirstOperation(), token.Future()) - .Apply([token = std::move(token)](auto&&) { - token.ThrowIfCancellationRequested(); - }); - } - - TCancellationTokenSource source; - auto future = OuterOperation(); - ... - source.Cancel() - ... - try { - auto value = future.ExtractValueSync(); - } catch (TOperationCancelledException const&) { - // cancelled - } - ``` - -5. Using default token when no cancellation needed - - ```c++ - void LongRunningOperation(TCancellationToken token) { - ... - if (token.IsCancellationRequested()) { - return; - } - ... - } - - // We do not want to cancel the operation. So, there is no need to create a cancellation token source - LongRunningOperation(TCancellationToken::Default); - ``` diff --git a/library/cpp/threading/cancellation/cancellation_token.cpp b/library/cpp/threading/cancellation/cancellation_token.cpp deleted file mode 100644 index 1a0a19f690f..00000000000 --- a/library/cpp/threading/cancellation/cancellation_token.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "cancellation_token.h" diff --git a/library/cpp/threading/cancellation/cancellation_token.h b/library/cpp/threading/cancellation/cancellation_token.h deleted file mode 100644 index 337e2cfda0a..00000000000 --- a/library/cpp/threading/cancellation/cancellation_token.h +++ /dev/null @@ -1,105 +0,0 @@ -#pragma once - -#include "operation_cancelled_exception.h" - -#include <library/cpp/threading/future/future.h> - -#include <util/generic/ptr.h> -#include <util/generic/singleton.h> - -namespace NThreading { - -class TCancellationTokenSource; - -//! A cancellation token could be passed to an async or long running operation to perform a cooperative operation cancel -class TCancellationToken { -private: - TFuture<void> Future_; - -public: - TCancellationToken() = delete; - TCancellationToken(const TCancellationToken&) noexcept = default; - TCancellationToken(TCancellationToken&&) noexcept = default; - TCancellationToken& operator = (const TCancellationToken&) noexcept = default; - TCancellationToken& operator = (TCancellationToken&&) noexcept = default; - - //! Shows whether a cancellation has been requested - bool IsCancellationRequested() const { - return Future_.HasValue(); - } - - //! Throws the TOperationCancelledException if a cancellation has been requested - void ThrowIfCancellationRequested() const { - if (IsCancellationRequested()) { - ythrow TOperationCancelledException(); - } - } - - //! Waits for a cancellation - bool Wait(TDuration duration) const { - return Future_.Wait(duration); - } - - bool Wait(TInstant deadline) const { - return Future_.Wait(deadline); - } - - void Wait() const { - return Future_.Wait(); - } - - //! Returns a future that could be used for waiting for a cancellation - TFuture<void> const& Future() const noexcept { - return Future_; - } - - //! The default cancellation token that cannot be cancelled - static TCancellationToken const& Default() { - return *SingletonWithPriority<TCancellationToken, 0>(NewPromise()); - } - -private: - TCancellationToken(TFuture<void> future) - : Future_(std::move(future)) - { - } - -private: - friend class TCancellationTokenSource; - - Y_DECLARE_SINGLETON_FRIEND(); -}; - -//! A cancellation token source produces cancellation tokens to be passed to cancellable operations -class TCancellationTokenSource { -private: - TPromise<void> Promise; - -public: - TCancellationTokenSource() - : Promise(NewPromise()) - { - } - - TCancellationTokenSource(TCancellationTokenSource const&) = delete; - TCancellationTokenSource(TCancellationTokenSource&&) = delete; - TCancellationTokenSource& operator=(TCancellationTokenSource const&) = delete; - TCancellationTokenSource& operator=(TCancellationTokenSource&&) = delete; - - //! Shows whether a cancellation has been requested - bool IsCancellationRequested() const noexcept { - return Promise.HasValue(); - } - - //! Produces a cancellation token - TCancellationToken Token() const { - return TCancellationToken(Promise.GetFuture()); - } - - //! Propagates a cancel request to all produced tokens - void Cancel() noexcept { - Promise.TrySetValue(); - } -}; - -} diff --git a/library/cpp/token/accent.cpp b/library/cpp/token/accent.cpp deleted file mode 100644 index be2797b0893..00000000000 --- a/library/cpp/token/accent.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "charfilter.h" - -namespace { - struct TRange { - wchar16 First; - wchar16 Last; - }; -} - -TAccentTable::TAccentTable() { - // values of yc_80 copied from "library/cpp/tokenizer/charclasses_16.rl" - TRange ranges[] = { - {0x0300, 0x0357}, {0x035D, 0x036F}, {0x0483, 0x0486}, {0x0488, 0x0489}, {0x0591, 0x05A1}, {0x05A3, 0x05B9}, {0x05BB, 0x05BD}, {0x05BF, 0x0000}, {0x05C1, 0x05C2}, {0x05C4, 0x0000}, {0x0610, 0x0615}, {0x064B, 0x0658}, {0x0670, 0x0000}, {0x06D6, 0x06DC}, {0x06DE, 0x06E4}, {0x06E7, 0x06E8}, {0x06EA, 0x06ED}, {0x0711, 0x0000}, {0x0730, 0x074A}, {0x07A6, 0x07B0}, {0x0901, 0x0903}, {0x093C, 0x0000}, {0x093E, 0x094D}, {0x0951, 0x0954}, {0x0962, 0x0963}, {0x0981, 0x0983}, {0x09BC, 0x0000}, {0x09BE, 0x09C4}, {0x09C7, 0x09C8}, {0x09CB, 0x09CD}, {0x09D7, 0x0000}, {0x09E2, 0x09E3}, {0x0A01, 0x0A03}, {0x0A3C, 0x0000}, {0x0A3E, 0x0A42}, {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A70, 0x0A71}, {0x0A81, 0x0A83}, {0x0ABC, 0x0000}, {0x0ABE, 0x0AC5}, {0x0AC7, 0x0AC9}, {0x0ACB, 0x0ACD}, {0x0AE2, 0x0AE3}, {0x0B01, 0x0B03}, {0x0B3C, 0x0000}, {0x0B3E, 0x0B43}, {0x0B47, 0x0B48}, {0x0B4B, 0x0B4D}, {0x0B56, 0x0B57}, {0x0B82, 0x0000}, {0x0BBE, 0x0BC2}, {0x0BC6, 0x0BC8}, {0x0BCA, 0x0BCD}, {0x0BD7, 0x0000}, {0x0C01, 0x0C03}, {0x0C3E, 0x0C44}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, {0x0C55, 0x0C56}, {0x0C82, 0x0C83}, {0x0CBC, 0x0000}, {0x0CBE, 0x0CC4}, {0x0CC6, 0x0CC8}, {0x0CCA, 0x0CCD}, {0x0CD5, 0x0CD6}, {0x0D02, 0x0D03}, {0x0D3E, 0x0D43}, {0x0D46, 0x0D48}, {0x0D4A, 0x0D4D}, {0x0D57, 0x0000}, {0x0D82, 0x0D83}, {0x0DCA, 0x0000}, {0x0DCF, 0x0DD4}, {0x0DD6, 0x0000}, {0x0DD8, 0x0DDF}, {0x0DF2, 0x0DF3}, {0x0E31, 0x0000}, {0x0E34, 0x0E3A}, {0x0E47, 0x0E4E}, {0x0EB1, 0x0000}, {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC}, {0x0EC8, 0x0ECD}, {0x0F18, 0x0F19}, {0x0F35, 0x0000}, {0x0F37, 0x0000}, {0x0F39, 0x0000}, {0x0F3E, 0x0F3F}, {0x0F71, 0x0F84}, {0x0F86, 0x0F87}, {0x0F90, 0x0F97}, {0x0F99, 0x0FBC}, {0x0FC6, 0x0000}, {0x102C, 0x1032}, {0x1036, 0x1039}, {0x1056, 0x1059}, {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753}, {0x1772, 0x1773}, {0x17B6, 0x17D3}, {0x17DD, 0x0000}, {0x180B, 0x180D}, {0x18A9, 0x0000}, {0x1920, 0x192B}, {0x1930, 0x193B}, {0x20D0, 0x20EA}, {0x302A, 0x302F}, {0x3099, 0x309A}, {0xFB1E, 0x0000}, {0xFE00, 0xFE0F}, {0xFE20, 0xFE23}}; - - TRange* const e = ranges + Y_ARRAY_SIZE(ranges); - - // @todo remove this line for static Data - memset(Data, 0, DATA_SIZE); - - for (TRange* r = ranges; r != e; ++r) { - if (r->Last) { - for (wchar16 c = r->First; c <= r->Last; ++c) { - Y_ASSERT((int)c < DATA_SIZE); - Data[c] = 1; - } - } else { - Y_ASSERT((int)r->First < DATA_SIZE); - Data[r->First] = 1; - } - } -} diff --git a/library/cpp/token/charfilter.h b/library/cpp/token/charfilter.h deleted file mode 100644 index 6e95b05aeab..00000000000 --- a/library/cpp/token/charfilter.h +++ /dev/null @@ -1,224 +0,0 @@ -#pragma once - -#include <util/charset/wide.h> -#include <util/generic/singleton.h> - -#include "token_structure.h" - -//! represents a set of accent characters -//! @note this class is intended to be a singleton because if has quite large array (65 KB) -class TAccentTable: private TNonCopyable { -public: - TAccentTable(); - - bool operator[](wchar16 c) const { - return Data[c]; - } - -private: - enum { DATA_SIZE = 0xFFFF }; - unsigned char Data[DATA_SIZE]; -}; - -//! represents an accessor to the accent table, this class is able to be copied -class TAccents { -public: - TAccents() - : Table(*HugeSingleton<TAccentTable>()) - { - } - - //! retruns @c true if character is an accent symbol - bool Check(wchar16 c) const { - return Table[c]; - } - -private: - const TAccentTable& Table; -}; - -//! removes characters from @c TWideToken using a filter -//! @note the checker class must have the default constructor and @c Check member function -template <typename TChecker> -class TCharFilter { - TWideToken Token; - TCharTemp Buffer; - TChecker Checker; - -private: - //! copies already verified data - characters and subtokens - wchar16* CopyData(const TWideToken& token, size_t n, size_t t, wchar16* const data) { - std::char_traits<wchar16>::copy(data, token.Token, n); // without current character - - Token.SubTokens.clear(); - for (size_t i = 0; i < t; ++i) { - Token.SubTokens.push_back(token.SubTokens[i]); - } - - return data + n; - } - -public: - explicit TCharFilter(size_t bufSize) - : Buffer(bufSize) - { - } - - //! removes accent characters from token - //! @return if there is no any accent character the function returns the source token - //! otherwise the function returns the internal token - const TWideToken& Filter(const TWideToken& token) { - if (token.SubTokens.empty()) - return FilterTokenNoSubtokens(token); - else - return FilterTokenWithSubtokens(token); - } - - static bool HasChars(const TWideToken& token) { - TChecker checker; - const TTokenStructure& subtokens = token.SubTokens; - const wchar16* const s = token.Token; // source character sequence - size_t i = 0; // the index of the current source character - size_t t = 0; // the index of the next source subtoken - - while (i < token.Leng) { - if (t < subtokens.size()) { - if (i >= subtokens[t].Pos && i < subtokens[t].EndPos()) { - // inside a token - if (checker.Check(s[i])) { - return true; - } - } - - ++i; - - if (i >= subtokens[t].EndPos()) { - ++t; - } - } else { - break; - } - } - - return false; - } - -private: - const TWideToken& FilterTokenWithSubtokens(const TWideToken& token) { - Y_ASSERT(!token.SubTokens.empty()); - Y_ASSERT(token.SubTokens.back().EndPos() <= token.Leng); - - const TTokenStructure& subtokens = token.SubTokens; - const wchar16* const s = token.Token; // source character sequence - size_t i = 0; // the index of the current source character - size_t t = 0; // the index of the next source subtoken - - while (i < token.Leng) { - if (t < subtokens.size()) { - if (i >= subtokens[t].Pos && i < subtokens[t].EndPos()) { - // inside a token - if (Checker.Check(s[i])) - return FilterTokenWithSubtokens(token, s, i, t, Buffer.Data()); - } - - ++i; - - if (i >= subtokens[t].EndPos()) { - ++t; - } - } else { - break; - } - } - - return token; - } - - const TWideToken& FilterTokenWithSubtokens( - const TWideToken& token, const wchar16* s, size_t i, size_t t, wchar16* const buffer) { - Y_ASSERT(i < token.Leng && t < token.SubTokens.size() && s >= token.Token); - - const TTokenStructure& subtokens = token.SubTokens; - wchar16* d = CopyData(token, i, t, buffer); // destination character - TCharSpan span = subtokens[t]; - - while (i < token.Leng) { - if (t < subtokens.size()) { - if (i >= subtokens[t].Pos && i < subtokens[t].EndPos()) { - // inside a token - if (Checker.Check(s[i])) { - Y_ASSERT(span.Len); - --span.Len; - } else { - *d++ = s[i]; - } - } else { - // outside of tokens - *d++ = s[i]; - } - - ++i; - - if (i >= subtokens[t].EndPos()) { - ++t; - - if (span.Len) - Token.SubTokens.push_back(span); - - if (t < subtokens.size()) { - const size_t diff = i - (d - buffer); - Y_ASSERT(subtokens[t].Pos >= diff); - span.Pos = subtokens[t].Pos - diff; - span.Len = subtokens[t].Len; - } - } - } else { - // copy the remainder of characters - const size_t n = token.Leng - i; - std::char_traits<wchar16>::copy(d, &s[i], n); - d += n; - break; - } - } - - Token.Token = buffer; - Token.Leng = d - buffer; - Y_ASSERT(!Token.SubTokens.size() || (Token.SubTokens.size() && Token.Leng >= Token.SubTokens.back().EndPos())); - return Token; - } - - const TWideToken& FilterTokenNoSubtokens(const TWideToken& token) { - Y_ASSERT(token.SubTokens.empty()); - const wchar16* s = token.Token; - const wchar16* const e = s + token.Leng; - - for (; s != e; ++s) { - if (Checker.Check(*s)) - return FilterTokenNoSubtokens(token.Token, s, e, Buffer.Data()); - } - - return token; - } - - const TWideToken& FilterTokenNoSubtokens( - const wchar16* const token, const wchar16* s, const wchar16* const e, wchar16* const buffer) { - const size_t n = s - token; - std::char_traits<wchar16>::copy(buffer, token, n); - wchar16* d = buffer + n; - - for (; s != e; ++s) { - if (!Checker.Check(*s)) - *d++ = *s; - } - - Token.Token = buffer; - Token.Leng = d - buffer; - Y_ASSERT(Token.Leng); - return Token; - } -}; - -const wchar32* LemmerDecomposition(wchar32 ch, bool advancedGermanUmlauts = true, bool extTable = false); -size_t NormalizeUnicode(const wchar16* word, size_t length, wchar16* converted, size_t bufLen, bool advancedGermanUmlauts = true, bool extTable = false); -TUtf16String NormalizeUnicode(const TUtf16String& w, bool advancedGermanUmlauts = true, bool extTable = false); -TUtf16String NormalizeUnicode(const TWtringBuf& wbuf, bool advancedGermanUmlauts = true, bool extTable = false); diff --git a/library/cpp/token/decomposition.cpp b/library/cpp/token/decomposition.cpp deleted file mode 100644 index 7ccb51fc6a4..00000000000 --- a/library/cpp/token/decomposition.cpp +++ /dev/null @@ -1,169 +0,0 @@ -#include "charfilter.h" -#include <library/cpp/unicode/normalization/normalization.h> -#include <util/charset/unidata.h> - -namespace NUnicode { - namespace NPrivate { - const TDecompositionTable& LemmerDecomposition(); - } -} - -static const wchar32* LemmerDecompositionInt(wchar32 ch, bool advancedGermanUmlauts, bool extTable) { - static const wchar32 ae[] = {'a', 'e', 0}; - static const wchar32 oe[] = {'o', 'e', 0}; - static const wchar32 ue[] = {'u', 'e', 0}; - - if (advancedGermanUmlauts) { - switch (ch) { - case 0x00E4: // ä - return ae; - case 0x00F6: // ö - return oe; - case 0x00FC: // ü - return ue; - } - } - - if (extTable) - return NUnicode::NPrivate::Decomposition(NUnicode::NPrivate::LemmerDecomposition(), ch); - - static const wchar32 I[] = {'I', 0}; - static const wchar32 i[] = {'i', 0}; - static const wchar32 ss[] = {'s', 's', 0}; - - switch (ch) { - // case 0x040E: // Ў - // case 0x045E: // ў - case 0x0419: // Й - case 0x0439: // й - case 0x0407: // Ї - case 0x0457: // ї - return nullptr; - case 0x0130: // I with dot - return I; - case 0x0131: // dotless i - return i; - case 0x00DF: // ß - return ss; - } - return NUnicode::Decomposition<true>(ch); -} - -const wchar32* LemmerDecomposition(wchar32 ch, bool advancedGermanUmlauts, bool extTable) { - const wchar32* dec = LemmerDecompositionInt(ch, advancedGermanUmlauts, extTable); - if (dec && dec[0] == ch && dec[1] == 0) - return nullptr; - return dec; -} - -static size_t CharSize(wchar32 c) { - if (c <= 0xFFFF) - return 1; - return 2; -} - -static void CheckAddChar(wchar16*& r, size_t& bufLen, wchar32 c) { - if (IsCombining(c)) - return; - c = ToLower(c); - if (CharSize(c) > bufLen) { - bufLen = 0; - return; - } - size_t sz = WriteSymbol(c, r); - bufLen -= sz; -} - -bool IsDecomp(ui16 c, bool extTable) { - const wchar32* decomp = LemmerDecompositionInt(c, false, extTable); - return decomp != nullptr && (decomp[0] != c || decomp[1] != 0); -} - -bool IsDecomp(ui16 c) { - return IsDecomp(c, false) || IsDecomp(c, true); -} - -const ui32 UI16_COUNT = 0x10000; - -class TLower { -public: - static const TLower DefaultTLower; - -public: - ui16 Lower[UI16_COUNT]; - -public: - TLower() { - for (ui32 i = 0; i < UI16_COUNT; i++) { - if (IsW16SurrogateLead(i) || IsW16SurrogateTail(i) || IsDecomp(i) || IsCombining(i)) { - Lower[i] = 0; - } else { - Lower[i] = ::ToLower(i); - } - } - } - - inline ui16 ToLower(ui16 c) const noexcept { - return Lower[c]; - } -}; - -const TLower TLower::DefaultTLower; - -bool NormalizeUnicodeInt(const wchar16* word, size_t length, wchar16*& res, size_t bufLen, bool advancedGermanUmlauts, bool extTable) { - const wchar16* end = word + length; - while (word != end && bufLen > 0) { - wchar16 lw = TLower::DefaultTLower.ToLower(*word); - if (lw != 0) { - *(res++) = lw; - word++; - bufLen--; - continue; - } - wchar32 ch = ReadSymbolAndAdvance(word, end); - const wchar32* decomp = LemmerDecompositionInt(ch, advancedGermanUmlauts, extTable); - if (decomp != nullptr) { - for (; *decomp != 0 && bufLen > 0; ++decomp) - CheckAddChar(res, bufLen, *decomp); - } else { - CheckAddChar(res, bufLen, ch); - } - } - return word >= end; -} - -size_t NormalizeUnicode(const wchar16* word, size_t length, wchar16* converted, size_t bufLen, bool advancedGermanUmlauts, bool extTable) { - wchar16* p = converted; - NormalizeUnicodeInt(word, length, p, bufLen, advancedGermanUmlauts, extTable); - return p - converted; -} - -const ui32 MAX_DECOMPOSED_LEN = 18; - -bool NormalizeUnicode(const TWtringBuf& wbuf, bool advancedGermanUmlauts, bool extTable, TUtf16String& ret, ui32 mult) { - size_t buflen = wbuf.size() * mult + MAX_DECOMPOSED_LEN; // for 1 symbol with longest sequence - ret.reserve(buflen); - wchar16* p = ret.begin(); - wchar16* converted = p; - bool ok = NormalizeUnicodeInt(wbuf.data(), wbuf.size(), p, buflen, advancedGermanUmlauts, extTable); - if (!ok) { -#ifndef NDEBUG - fprintf(stderr, "[WARNING]\tOut of buffer %zu %u\n", wbuf.size(), (unsigned int)mult); -#endif - return false; - } - ret.ReserveAndResize(p - converted); - return true; -} - -TUtf16String NormalizeUnicode(const TWtringBuf& wbuf, bool advancedGermanUmlauts, bool extTable) { - TUtf16String ret; - if (NormalizeUnicode(wbuf, advancedGermanUmlauts, extTable, ret, 2)) // First try buffer with size twice of original, enough in most cases - return ret; - NormalizeUnicode(wbuf, advancedGermanUmlauts, extTable, ret, MAX_DECOMPOSED_LEN); // 18 is enough, because 1 source char can produce no more than 18 - return ret; -} - -TUtf16String NormalizeUnicode(const TUtf16String& word, bool advancedGermanUmlauts, bool extTable) { - return NormalizeUnicode(TWtringBuf(word), advancedGermanUmlauts, extTable); -} diff --git a/library/cpp/token/formtype.h b/library/cpp/token/formtype.h deleted file mode 100644 index 47fb744fad8..00000000000 --- a/library/cpp/token/formtype.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include <util/generic/fwd.h> -#include <util/system/defaults.h> - -enum TFormType { - fGeneral, - fExactWord, //! - fExactLemma, //!! - fWeirdExactWord -}; - -const TString& ToString(TFormType); -bool FromString(const TString& name, TFormType& ret); diff --git a/library/cpp/token/generated/custom_decompositions.cpp b/library/cpp/token/generated/custom_decompositions.cpp deleted file mode 100644 index 0340a57ed9b..00000000000 --- a/library/cpp/token/generated/custom_decompositions.cpp +++ /dev/null @@ -1,43017 +0,0 @@ -#include <library/cpp/unicode/normalization/normalization.h> - -namespace { namespace NLemmerDecompositionGenerated { - using TV = const NUnicode::NPrivate::TDecompositionTable::TStored; - - static const TV V = { -#undef V0 -#define V0 (V + 0) - 0x41, 0x300, 0, -#undef V1 -#define V1 (V + 3) - 0x41, 0x301, 0, -#undef V2 -#define V2 (V + 6) - 0x41, 0x302, 0, -#undef V3 -#define V3 (V + 9) - 0x41, 0x303, 0, -#undef V4 -#define V4 (V + 12) - 0x41, 0x308, 0, -#undef V5 -#define V5 (V + 15) - 0x41, 0x30a, 0, -#undef V6 -#define V6 (V + 18) - 0x41, 0x45, 0, -#undef V7 -#define V7 (V + 21) - 0x43, 0x327, 0, -#undef V8 -#define V8 (V + 24) - 0x45, 0x300, 0, -#undef V9 -#define V9 (V + 27) - 0x45, 0x301, 0, -#undef V10 -#define V10 (V + 30) - 0x45, 0x302, 0, -#undef V11 -#define V11 (V + 33) - 0x45, 0x308, 0, -#undef V12 -#define V12 (V + 36) - 0x49, 0x300, 0, -#undef V13 -#define V13 (V + 39) - 0x49, 0x301, 0, -#undef V14 -#define V14 (V + 42) - 0x49, 0x302, 0, -#undef V15 -#define V15 (V + 45) - 0x49, 0x308, 0, -#undef V16 -#define V16 (V + 48) - 0x44, 0, -#undef V17 -#define V17 (V + 50) - 0x4e, 0x303, 0, -#undef V18 -#define V18 (V + 53) - 0x4f, 0x300, 0, -#undef V19 -#define V19 (V + 56) - 0x4f, 0x301, 0, -#undef V20 -#define V20 (V + 59) - 0x4f, 0x302, 0, -#undef V21 -#define V21 (V + 62) - 0x4f, 0x303, 0, -#undef V22 -#define V22 (V + 65) - 0x4f, 0x308, 0, -#undef V23 -#define V23 (V + 68) - 0x4f, 0, -#undef V24 -#define V24 (V + 70) - 0x55, 0x300, 0, -#undef V25 -#define V25 (V + 73) - 0x55, 0x301, 0, -#undef V26 -#define V26 (V + 76) - 0x55, 0x302, 0, -#undef V27 -#define V27 (V + 79) - 0x55, 0x308, 0, -#undef V28 -#define V28 (V + 82) - 0x59, 0x301, 0, -#undef V29 -#define V29 (V + 85) - 0x73, 0x73, 0, -#undef V30 -#define V30 (V + 88) - 0x61, 0x300, 0, -#undef V31 -#define V31 (V + 91) - 0x61, 0x301, 0, -#undef V32 -#define V32 (V + 94) - 0x61, 0x302, 0, -#undef V33 -#define V33 (V + 97) - 0x61, 0x303, 0, -#undef V34 -#define V34 (V + 100) - 0x61, 0x308, 0, -#undef V35 -#define V35 (V + 103) - 0x61, 0x30a, 0, -#undef V36 -#define V36 (V + 106) - 0x61, 0x65, 0, -#undef V37 -#define V37 (V + 109) - 0x63, 0x327, 0, -#undef V38 -#define V38 (V + 112) - 0x65, 0x300, 0, -#undef V39 -#define V39 (V + 115) - 0x65, 0x301, 0, -#undef V40 -#define V40 (V + 118) - 0x65, 0x302, 0, -#undef V41 -#define V41 (V + 121) - 0x65, 0x308, 0, -#undef V42 -#define V42 (V + 124) - 0x69, 0x300, 0, -#undef V43 -#define V43 (V + 127) - 0x69, 0x301, 0, -#undef V44 -#define V44 (V + 130) - 0x69, 0x302, 0, -#undef V45 -#define V45 (V + 133) - 0x69, 0x308, 0, -#undef V46 -#define V46 (V + 136) - 0x64, 0, -#undef V47 -#define V47 (V + 138) - 0x6e, 0x303, 0, -#undef V48 -#define V48 (V + 141) - 0x6f, 0x300, 0, -#undef V49 -#define V49 (V + 144) - 0x6f, 0x301, 0, -#undef V50 -#define V50 (V + 147) - 0x6f, 0x302, 0, -#undef V51 -#define V51 (V + 150) - 0x6f, 0x303, 0, -#undef V52 -#define V52 (V + 153) - 0x6f, 0x308, 0, -#undef V53 -#define V53 (V + 156) - 0x6f, 0, -#undef V54 -#define V54 (V + 158) - 0x75, 0x300, 0, -#undef V55 -#define V55 (V + 161) - 0x75, 0x301, 0, -#undef V56 -#define V56 (V + 164) - 0x75, 0x302, 0, -#undef V57 -#define V57 (V + 167) - 0x75, 0x308, 0, -#undef V58 -#define V58 (V + 170) - 0x79, 0x301, 0, -#undef V59 -#define V59 (V + 173) - 0x79, 0x308, 0, -#undef V60 -#define V60 (V + 176) - 0x41, 0x304, 0, -#undef V61 -#define V61 (V + 179) - 0x61, 0x304, 0, -#undef V62 -#define V62 (V + 182) - 0x41, 0x306, 0, -#undef V63 -#define V63 (V + 185) - 0x61, 0x306, 0, -#undef V64 -#define V64 (V + 188) - 0x41, 0x328, 0, -#undef V65 -#define V65 (V + 191) - 0x61, 0x328, 0, -#undef V66 -#define V66 (V + 194) - 0x43, 0x301, 0, -#undef V67 -#define V67 (V + 197) - 0x63, 0x301, 0, -#undef V68 -#define V68 (V + 200) - 0x43, 0x302, 0, -#undef V69 -#define V69 (V + 203) - 0x63, 0x302, 0, -#undef V70 -#define V70 (V + 206) - 0x43, 0x307, 0, -#undef V71 -#define V71 (V + 209) - 0x63, 0x307, 0, -#undef V72 -#define V72 (V + 212) - 0x43, 0x30c, 0, -#undef V73 -#define V73 (V + 215) - 0x63, 0x30c, 0, -#undef V74 -#define V74 (V + 218) - 0x44, 0x30c, 0, -#undef V75 -#define V75 (V + 221) - 0x64, 0x30c, 0, -#undef V76 -#define V76 (V + 224) - 0x45, 0x304, 0, -#undef V77 -#define V77 (V + 227) - 0x65, 0x304, 0, -#undef V78 -#define V78 (V + 230) - 0x45, 0x306, 0, -#undef V79 -#define V79 (V + 233) - 0x65, 0x306, 0, -#undef V80 -#define V80 (V + 236) - 0x45, 0x307, 0, -#undef V81 -#define V81 (V + 239) - 0x65, 0x307, 0, -#undef V82 -#define V82 (V + 242) - 0x45, 0x328, 0, -#undef V83 -#define V83 (V + 245) - 0x65, 0x328, 0, -#undef V84 -#define V84 (V + 248) - 0x45, 0x30c, 0, -#undef V85 -#define V85 (V + 251) - 0x65, 0x30c, 0, -#undef V86 -#define V86 (V + 254) - 0x47, 0x302, 0, -#undef V87 -#define V87 (V + 257) - 0x67, 0x302, 0, -#undef V88 -#define V88 (V + 260) - 0x47, 0x306, 0, -#undef V89 -#define V89 (V + 263) - 0x67, 0x306, 0, -#undef V90 -#define V90 (V + 266) - 0x47, 0x307, 0, -#undef V91 -#define V91 (V + 269) - 0x67, 0x307, 0, -#undef V92 -#define V92 (V + 272) - 0x47, 0x327, 0, -#undef V93 -#define V93 (V + 275) - 0x67, 0x327, 0, -#undef V94 -#define V94 (V + 278) - 0x48, 0x302, 0, -#undef V95 -#define V95 (V + 281) - 0x68, 0x302, 0, -#undef V96 -#define V96 (V + 284) - 0x48, 0, -#undef V97 -#define V97 (V + 286) - 0x68, 0, -#undef V98 -#define V98 (V + 288) - 0x49, 0x303, 0, -#undef V99 -#define V99 (V + 291) - 0x69, 0x303, 0, -#undef V100 -#define V100 (V + 294) - 0x49, 0x304, 0, -#undef V101 -#define V101 (V + 297) - 0x69, 0x304, 0, -#undef V102 -#define V102 (V + 300) - 0x49, 0x306, 0, -#undef V103 -#define V103 (V + 303) - 0x69, 0x306, 0, -#undef V104 -#define V104 (V + 306) - 0x49, 0x328, 0, -#undef V105 -#define V105 (V + 309) - 0x69, 0x328, 0, -#undef V106 -#define V106 (V + 312) - 0x49, 0x307, 0, -#undef V107 -#define V107 (V + 315) - 0x69, 0, -#undef V108 -#define V108 (V + 317) - 0x4a, 0x302, 0, -#undef V109 -#define V109 (V + 320) - 0x6a, 0x302, 0, -#undef V110 -#define V110 (V + 323) - 0x4b, 0x327, 0, -#undef V111 -#define V111 (V + 326) - 0x6b, 0x327, 0, -#undef V112 -#define V112 (V + 329) - 0x4c, 0x301, 0, -#undef V113 -#define V113 (V + 332) - 0x6c, 0x301, 0, -#undef V114 -#define V114 (V + 335) - 0x4c, 0x327, 0, -#undef V115 -#define V115 (V + 338) - 0x6c, 0x327, 0, -#undef V116 -#define V116 (V + 341) - 0x4c, 0x30c, 0, -#undef V117 -#define V117 (V + 344) - 0x6c, 0x30c, 0, -#undef V118 -#define V118 (V + 347) - 0x4c, 0, -#undef V119 -#define V119 (V + 349) - 0x6c, 0, -#undef V120 -#define V120 (V + 351) - 0x4e, 0x301, 0, -#undef V121 -#define V121 (V + 354) - 0x6e, 0x301, 0, -#undef V122 -#define V122 (V + 357) - 0x4e, 0x327, 0, -#undef V123 -#define V123 (V + 360) - 0x6e, 0x327, 0, -#undef V124 -#define V124 (V + 363) - 0x4e, 0x30c, 0, -#undef V125 -#define V125 (V + 366) - 0x6e, 0x30c, 0, -#undef V126 -#define V126 (V + 369) - 0x4f, 0x304, 0, -#undef V127 -#define V127 (V + 372) - 0x6f, 0x304, 0, -#undef V128 -#define V128 (V + 375) - 0x4f, 0x306, 0, -#undef V129 -#define V129 (V + 378) - 0x6f, 0x306, 0, -#undef V130 -#define V130 (V + 381) - 0x4f, 0x30b, 0, -#undef V131 -#define V131 (V + 384) - 0x6f, 0x30b, 0, -#undef V132 -#define V132 (V + 387) - 0x4f, 0x45, 0, -#undef V133 -#define V133 (V + 390) - 0x6f, 0x65, 0, -#undef V134 -#define V134 (V + 393) - 0x52, 0x301, 0, -#undef V135 -#define V135 (V + 396) - 0x72, 0x301, 0, -#undef V136 -#define V136 (V + 399) - 0x52, 0x327, 0, -#undef V137 -#define V137 (V + 402) - 0x72, 0x327, 0, -#undef V138 -#define V138 (V + 405) - 0x52, 0x30c, 0, -#undef V139 -#define V139 (V + 408) - 0x72, 0x30c, 0, -#undef V140 -#define V140 (V + 411) - 0x53, 0x301, 0, -#undef V141 -#define V141 (V + 414) - 0x73, 0x301, 0, -#undef V142 -#define V142 (V + 417) - 0x53, 0x302, 0, -#undef V143 -#define V143 (V + 420) - 0x73, 0x302, 0, -#undef V144 -#define V144 (V + 423) - 0x53, 0x327, 0, -#undef V145 -#define V145 (V + 426) - 0x73, 0x327, 0, -#undef V146 -#define V146 (V + 429) - 0x53, 0x30c, 0, -#undef V147 -#define V147 (V + 432) - 0x73, 0x30c, 0, -#undef V148 -#define V148 (V + 435) - 0x54, 0x327, 0, -#undef V149 -#define V149 (V + 438) - 0x74, 0x327, 0, -#undef V150 -#define V150 (V + 441) - 0x54, 0x30c, 0, -#undef V151 -#define V151 (V + 444) - 0x74, 0x30c, 0, -#undef V152 -#define V152 (V + 447) - 0x54, 0, -#undef V153 -#define V153 (V + 449) - 0x74, 0, -#undef V154 -#define V154 (V + 451) - 0x55, 0x303, 0, -#undef V155 -#define V155 (V + 454) - 0x75, 0x303, 0, -#undef V156 -#define V156 (V + 457) - 0x55, 0x304, 0, -#undef V157 -#define V157 (V + 460) - 0x75, 0x304, 0, -#undef V158 -#define V158 (V + 463) - 0x55, 0x306, 0, -#undef V159 -#define V159 (V + 466) - 0x75, 0x306, 0, -#undef V160 -#define V160 (V + 469) - 0x55, 0x30a, 0, -#undef V161 -#define V161 (V + 472) - 0x75, 0x30a, 0, -#undef V162 -#define V162 (V + 475) - 0x55, 0x30b, 0, -#undef V163 -#define V163 (V + 478) - 0x75, 0x30b, 0, -#undef V164 -#define V164 (V + 481) - 0x55, 0x328, 0, -#undef V165 -#define V165 (V + 484) - 0x75, 0x328, 0, -#undef V166 -#define V166 (V + 487) - 0x57, 0x302, 0, -#undef V167 -#define V167 (V + 490) - 0x77, 0x302, 0, -#undef V168 -#define V168 (V + 493) - 0x59, 0x302, 0, -#undef V169 -#define V169 (V + 496) - 0x79, 0x302, 0, -#undef V170 -#define V170 (V + 499) - 0x59, 0x308, 0, -#undef V171 -#define V171 (V + 502) - 0x5a, 0x301, 0, -#undef V172 -#define V172 (V + 505) - 0x7a, 0x301, 0, -#undef V173 -#define V173 (V + 508) - 0x5a, 0x307, 0, -#undef V174 -#define V174 (V + 511) - 0x7a, 0x307, 0, -#undef V175 -#define V175 (V + 514) - 0x5a, 0x30c, 0, -#undef V176 -#define V176 (V + 517) - 0x7a, 0x30c, 0, -#undef V177 -#define V177 (V + 520) - 0x62, 0, -#undef V178 -#define V178 (V + 522) - 0x42, 0, -#undef V179 -#define V179 (V + 524) - 0x43, 0, -#undef V180 -#define V180 (V + 526) - 0x63, 0, -#undef V181 -#define V181 (V + 528) - 0x110, 0, -#undef V182 -#define V182 (V + 530) - 0x45, 0, -#undef V183 -#define V183 (V + 532) - 0x46, 0, -#undef V184 -#define V184 (V + 534) - 0x66, 0, -#undef V185 -#define V185 (V + 536) - 0x47, 0, -#undef V186 -#define V186 (V + 538) - 0x68, 0x76, 0, -#undef V187 -#define V187 (V + 541) - 0x49, 0, -#undef V188 -#define V188 (V + 543) - 0x4b, 0, -#undef V189 -#define V189 (V + 545) - 0x6b, 0, -#undef V190 -#define V190 (V + 547) - 0x4e, 0, -#undef V191 -#define V191 (V + 549) - 0x6e, 0, -#undef V192 -#define V192 (V + 551) - 0x4f, 0x31b, 0, -#undef V193 -#define V193 (V + 554) - 0x6f, 0x31b, 0, -#undef V194 -#define V194 (V + 557) - 0x4f, 0x49, 0, -#undef V195 -#define V195 (V + 560) - 0x6f, 0x69, 0, -#undef V196 -#define V196 (V + 563) - 0x50, 0, -#undef V197 -#define V197 (V + 565) - 0x70, 0, -#undef V198 -#define V198 (V + 567) - 0x55, 0x31b, 0, -#undef V199 -#define V199 (V + 570) - 0x75, 0x31b, 0, -#undef V200 -#define V200 (V + 573) - 0x56, 0, -#undef V201 -#define V201 (V + 575) - 0x59, 0, -#undef V202 -#define V202 (V + 577) - 0x79, 0, -#undef V203 -#define V203 (V + 579) - 0x5a, 0, -#undef V204 -#define V204 (V + 581) - 0x7a, 0, -#undef V205 -#define V205 (V + 583) - 0x292, 0, -#undef V206 -#define V206 (V + 585) - 0x41, 0x30c, 0, -#undef V207 -#define V207 (V + 588) - 0x61, 0x30c, 0, -#undef V208 -#define V208 (V + 591) - 0x49, 0x30c, 0, -#undef V209 -#define V209 (V + 594) - 0x69, 0x30c, 0, -#undef V210 -#define V210 (V + 597) - 0x4f, 0x30c, 0, -#undef V211 -#define V211 (V + 600) - 0x6f, 0x30c, 0, -#undef V212 -#define V212 (V + 603) - 0x55, 0x30c, 0, -#undef V213 -#define V213 (V + 606) - 0x75, 0x30c, 0, -#undef V214 -#define V214 (V + 609) - 0x55, 0x308, 0x304, 0, -#undef V215 -#define V215 (V + 613) - 0x75, 0x308, 0x304, 0, -#undef V216 -#define V216 (V + 617) - 0x55, 0x308, 0x301, 0, -#undef V217 -#define V217 (V + 621) - 0x75, 0x308, 0x301, 0, -#undef V218 -#define V218 (V + 625) - 0x55, 0x308, 0x30c, 0, -#undef V219 -#define V219 (V + 629) - 0x75, 0x308, 0x30c, 0, -#undef V220 -#define V220 (V + 633) - 0x55, 0x308, 0x300, 0, -#undef V221 -#define V221 (V + 637) - 0x75, 0x308, 0x300, 0, -#undef V222 -#define V222 (V + 641) - 0x41, 0x308, 0x304, 0, -#undef V223 -#define V223 (V + 645) - 0x61, 0x308, 0x304, 0, -#undef V224 -#define V224 (V + 649) - 0x41, 0x307, 0x304, 0, -#undef V225 -#define V225 (V + 653) - 0x61, 0x307, 0x304, 0, -#undef V226 -#define V226 (V + 657) - 0xc6, 0x304, 0, -#undef V227 -#define V227 (V + 660) - 0xe6, 0x304, 0, -#undef V228 -#define V228 (V + 663) - 0x67, 0, -#undef V229 -#define V229 (V + 665) - 0x47, 0x30c, 0, -#undef V230 -#define V230 (V + 668) - 0x67, 0x30c, 0, -#undef V231 -#define V231 (V + 671) - 0x4b, 0x30c, 0, -#undef V232 -#define V232 (V + 674) - 0x6b, 0x30c, 0, -#undef V233 -#define V233 (V + 677) - 0x4f, 0x328, 0, -#undef V234 -#define V234 (V + 680) - 0x6f, 0x328, 0, -#undef V235 -#define V235 (V + 683) - 0x4f, 0x328, 0x304, 0, -#undef V236 -#define V236 (V + 687) - 0x6f, 0x328, 0x304, 0, -#undef V237 -#define V237 (V + 691) - 0x1b7, 0x30c, 0, -#undef V238 -#define V238 (V + 694) - 0x292, 0x30c, 0, -#undef V239 -#define V239 (V + 697) - 0x6a, 0x30c, 0, -#undef V240 -#define V240 (V + 700) - 0x47, 0x301, 0, -#undef V241 -#define V241 (V + 703) - 0x67, 0x301, 0, -#undef V242 -#define V242 (V + 706) - 0x4e, 0x300, 0, -#undef V243 -#define V243 (V + 709) - 0x6e, 0x300, 0, -#undef V244 -#define V244 (V + 712) - 0x41, 0x30a, 0x301, 0, -#undef V245 -#define V245 (V + 716) - 0x61, 0x30a, 0x301, 0, -#undef V246 -#define V246 (V + 720) - 0xc6, 0x301, 0, -#undef V247 -#define V247 (V + 723) - 0xe6, 0x301, 0, -#undef V248 -#define V248 (V + 726) - 0xd8, 0x301, 0, -#undef V249 -#define V249 (V + 729) - 0xf8, 0x301, 0, -#undef V250 -#define V250 (V + 732) - 0x41, 0x30f, 0, -#undef V251 -#define V251 (V + 735) - 0x61, 0x30f, 0, -#undef V252 -#define V252 (V + 738) - 0x41, 0x311, 0, -#undef V253 -#define V253 (V + 741) - 0x61, 0x311, 0, -#undef V254 -#define V254 (V + 744) - 0x45, 0x30f, 0, -#undef V255 -#define V255 (V + 747) - 0x65, 0x30f, 0, -#undef V256 -#define V256 (V + 750) - 0x45, 0x311, 0, -#undef V257 -#define V257 (V + 753) - 0x65, 0x311, 0, -#undef V258 -#define V258 (V + 756) - 0x49, 0x30f, 0, -#undef V259 -#define V259 (V + 759) - 0x69, 0x30f, 0, -#undef V260 -#define V260 (V + 762) - 0x49, 0x311, 0, -#undef V261 -#define V261 (V + 765) - 0x69, 0x311, 0, -#undef V262 -#define V262 (V + 768) - 0x4f, 0x30f, 0, -#undef V263 -#define V263 (V + 771) - 0x6f, 0x30f, 0, -#undef V264 -#define V264 (V + 774) - 0x4f, 0x311, 0, -#undef V265 -#define V265 (V + 777) - 0x6f, 0x311, 0, -#undef V266 -#define V266 (V + 780) - 0x52, 0x30f, 0, -#undef V267 -#define V267 (V + 783) - 0x72, 0x30f, 0, -#undef V268 -#define V268 (V + 786) - 0x52, 0x311, 0, -#undef V269 -#define V269 (V + 789) - 0x72, 0x311, 0, -#undef V270 -#define V270 (V + 792) - 0x55, 0x30f, 0, -#undef V271 -#define V271 (V + 795) - 0x75, 0x30f, 0, -#undef V272 -#define V272 (V + 798) - 0x55, 0x311, 0, -#undef V273 -#define V273 (V + 801) - 0x75, 0x311, 0, -#undef V274 -#define V274 (V + 804) - 0x53, 0x326, 0, -#undef V275 -#define V275 (V + 807) - 0x73, 0x326, 0, -#undef V276 -#define V276 (V + 810) - 0x54, 0x326, 0, -#undef V277 -#define V277 (V + 813) - 0x74, 0x326, 0, -#undef V278 -#define V278 (V + 816) - 0x48, 0x30c, 0, -#undef V279 -#define V279 (V + 819) - 0x68, 0x30c, 0, -#undef V280 -#define V280 (V + 822) - 0x41, 0x307, 0, -#undef V281 -#define V281 (V + 825) - 0x61, 0x307, 0, -#undef V282 -#define V282 (V + 828) - 0x45, 0x327, 0, -#undef V283 -#define V283 (V + 831) - 0x65, 0x327, 0, -#undef V284 -#define V284 (V + 834) - 0x4f, 0x308, 0x304, 0, -#undef V285 -#define V285 (V + 838) - 0x6f, 0x308, 0x304, 0, -#undef V286 -#define V286 (V + 842) - 0x4f, 0x303, 0x304, 0, -#undef V287 -#define V287 (V + 846) - 0x6f, 0x303, 0x304, 0, -#undef V288 -#define V288 (V + 850) - 0x4f, 0x307, 0, -#undef V289 -#define V289 (V + 853) - 0x6f, 0x307, 0, -#undef V290 -#define V290 (V + 856) - 0x4f, 0x307, 0x304, 0, -#undef V291 -#define V291 (V + 860) - 0x6f, 0x307, 0x304, 0, -#undef V292 -#define V292 (V + 864) - 0x59, 0x304, 0, -#undef V293 -#define V293 (V + 867) - 0x79, 0x304, 0, -#undef V294 -#define V294 (V + 870) - 0x6a, 0, -#undef V295 -#define V295 (V + 872) - 0x64, 0x62, 0, -#undef V296 -#define V296 (V + 875) - 0x71, 0x70, 0, -#undef V297 -#define V297 (V + 878) - 0x41, 0, -#undef V298 -#define V298 (V + 880) - 0x73, 0, -#undef V299 -#define V299 (V + 882) - 0x55, 0, -#undef V300 -#define V300 (V + 884) - 0x65, 0, -#undef V301 -#define V301 (V + 886) - 0x4a, 0, -#undef V302 -#define V302 (V + 888) - 0x71, 0, -#undef V303 -#define V303 (V + 890) - 0x52, 0, -#undef V304 -#define V304 (V + 892) - 0x72, 0, -#undef V305 -#define V305 (V + 894) - 0x61, 0, -#undef V306 -#define V306 (V + 896) - 0x259, 0, -#undef V307 -#define V307 (V + 898) - 0x237, 0, -#undef V308 -#define V308 (V + 900) - 0xa727, 0, -#undef V309 -#define V309 (V + 902) - 0x6c, 0x292, 0, -#undef V310 -#define V310 (V + 905) - 0x6d, 0, -#undef V311 -#define V311 (V + 907) - 0x283, 0, -#undef V312 -#define V312 (V + 909) - 0x75, 0, -#undef V313 -#define V313 (V + 911) - 0x76, 0, -#undef V314 -#define V314 (V + 913) - 0x64, 0x7a, 0, -#undef V315 -#define V315 (V + 916) - 0x64, 0x292, 0, -#undef V316 -#define V316 (V + 919) - 0x2a3, 0, -#undef V317 -#define V317 (V + 921) - 0x74, 0x73, 0, -#undef V318 -#define V318 (V + 924) - 0x74, 0x283, 0, -#undef V319 -#define V319 (V + 927) - 0x66, 0x14b, 0, -#undef V320 -#define V320 (V + 930) - 0x6c, 0x73, 0, -#undef V321 -#define V321 (V + 933) - 0x6c, 0x7a, 0, -#undef V322 -#define V322 (V + 936) - 0x300, 0, -#undef V323 -#define V323 (V + 938) - 0x301, 0, -#undef V324 -#define V324 (V + 940) - 0x313, 0, -#undef V325 -#define V325 (V + 942) - 0x308, 0x301, 0, -#undef V326 -#define V326 (V + 945) - 0x2b9, 0, -#undef V327 -#define V327 (V + 947) - 0x3b, 0, -#undef V328 -#define V328 (V + 949) - 0xa8, 0x301, 0, -#undef V329 -#define V329 (V + 952) - 0x391, 0x301, 0, -#undef V330 -#define V330 (V + 955) - 0xb7, 0, -#undef V331 -#define V331 (V + 957) - 0x395, 0x301, 0, -#undef V332 -#define V332 (V + 960) - 0x397, 0x301, 0, -#undef V333 -#define V333 (V + 963) - 0x399, 0x301, 0, -#undef V334 -#define V334 (V + 966) - 0x39f, 0x301, 0, -#undef V335 -#define V335 (V + 969) - 0x3a5, 0x301, 0, -#undef V336 -#define V336 (V + 972) - 0x3a9, 0x301, 0, -#undef V337 -#define V337 (V + 975) - 0x3b9, 0x308, 0x301, 0, -#undef V338 -#define V338 (V + 979) - 0x399, 0x308, 0, -#undef V339 -#define V339 (V + 982) - 0x3a5, 0x308, 0, -#undef V340 -#define V340 (V + 985) - 0x3b1, 0x301, 0, -#undef V341 -#define V341 (V + 988) - 0x3b5, 0x301, 0, -#undef V342 -#define V342 (V + 991) - 0x3b7, 0x301, 0, -#undef V343 -#define V343 (V + 994) - 0x3b9, 0x301, 0, -#undef V344 -#define V344 (V + 997) - 0x3c5, 0x308, 0x301, 0, -#undef V345 -#define V345 (V + 1001) - 0x3b9, 0x308, 0, -#undef V346 -#define V346 (V + 1004) - 0x3c5, 0x308, 0, -#undef V347 -#define V347 (V + 1007) - 0x3bf, 0x301, 0, -#undef V348 -#define V348 (V + 1010) - 0x3c5, 0x301, 0, -#undef V349 -#define V349 (V + 1013) - 0x3c9, 0x301, 0, -#undef V350 -#define V350 (V + 1016) - 0x3d2, 0x301, 0, -#undef V351 -#define V351 (V + 1019) - 0x3d2, 0x308, 0, -#undef V352 -#define V352 (V + 1022) - 0x415, 0x300, 0, -#undef V353 -#define V353 (V + 1025) - 0x415, 0x308, 0, -#undef V354 -#define V354 (V + 1028) - 0x413, 0x301, 0, -#undef V355 -#define V355 (V + 1031) - 0x407, 0, -#undef V356 -#define V356 (V + 1033) - 0x41b, 0x42c, 0, -#undef V357 -#define V357 (V + 1036) - 0x41d, 0x42c, 0, -#undef V358 -#define V358 (V + 1039) - 0x41a, 0x301, 0, -#undef V359 -#define V359 (V + 1042) - 0x418, 0x300, 0, -#undef V360 -#define V360 (V + 1045) - 0x423, 0x306, 0, -#undef V361 -#define V361 (V + 1048) - 0x419, 0, -#undef V362 -#define V362 (V + 1050) - 0x439, 0, -#undef V363 -#define V363 (V + 1052) - 0x435, 0x300, 0, -#undef V364 -#define V364 (V + 1055) - 0x435, 0x308, 0, -#undef V365 -#define V365 (V + 1058) - 0x433, 0x301, 0, -#undef V366 -#define V366 (V + 1061) - 0x457, 0, -#undef V367 -#define V367 (V + 1063) - 0x43b, 0x44c, 0, -#undef V368 -#define V368 (V + 1066) - 0x43d, 0x44c, 0, -#undef V369 -#define V369 (V + 1069) - 0x43a, 0x301, 0, -#undef V370 -#define V370 (V + 1072) - 0x438, 0x300, 0, -#undef V371 -#define V371 (V + 1075) - 0x443, 0x306, 0, -#undef V372 -#define V372 (V + 1078) - 0x474, 0x30f, 0, -#undef V373 -#define V373 (V + 1081) - 0x475, 0x30f, 0, -#undef V374 -#define V374 (V + 1084) - 0x42c, 0, -#undef V375 -#define V375 (V + 1086) - 0x44c, 0, -#undef V376 -#define V376 (V + 1088) - 0x420, 0, -#undef V377 -#define V377 (V + 1090) - 0x440, 0, -#undef V378 -#define V378 (V + 1092) - 0x413, 0, -#undef V379 -#define V379 (V + 1094) - 0x433, 0, -#undef V380 -#define V380 (V + 1096) - 0x416, 0, -#undef V381 -#define V381 (V + 1098) - 0x436, 0, -#undef V382 -#define V382 (V + 1100) - 0x417, 0, -#undef V383 -#define V383 (V + 1102) - 0x437, 0, -#undef V384 -#define V384 (V + 1104) - 0x41a, 0, -#undef V385 -#define V385 (V + 1106) - 0x43a, 0, -#undef V386 -#define V386 (V + 1108) - 0x41d, 0, -#undef V387 -#define V387 (V + 1110) - 0x43d, 0, -#undef V388 -#define V388 (V + 1112) - 0x41d, 0x413, 0, -#undef V389 -#define V389 (V + 1115) - 0x43d, 0x433, 0, -#undef V390 -#define V390 (V + 1118) - 0x41f, 0, -#undef V391 -#define V391 (V + 1120) - 0x43f, 0, -#undef V392 -#define V392 (V + 1122) - 0x421, 0, -#undef V393 -#define V393 (V + 1124) - 0x441, 0, -#undef V394 -#define V394 (V + 1126) - 0x422, 0, -#undef V395 -#define V395 (V + 1128) - 0x442, 0, -#undef V396 -#define V396 (V + 1130) - 0x423, 0, -#undef V397 -#define V397 (V + 1132) - 0x443, 0, -#undef V398 -#define V398 (V + 1134) - 0x4ae, 0, -#undef V399 -#define V399 (V + 1136) - 0x4af, 0, -#undef V400 -#define V400 (V + 1138) - 0x425, 0, -#undef V401 -#define V401 (V + 1140) - 0x445, 0, -#undef V402 -#define V402 (V + 1142) - 0x422, 0x426, 0, -#undef V403 -#define V403 (V + 1145) - 0x442, 0x446, 0, -#undef V404 -#define V404 (V + 1148) - 0x427, 0, -#undef V405 -#define V405 (V + 1150) - 0x447, 0, -#undef V406 -#define V406 (V + 1152) - 0x4bc, 0, -#undef V407 -#define V407 (V + 1154) - 0x4bd, 0, -#undef V408 -#define V408 (V + 1156) - 0x416, 0x306, 0, -#undef V409 -#define V409 (V + 1159) - 0x436, 0x306, 0, -#undef V410 -#define V410 (V + 1162) - 0x41b, 0, -#undef V411 -#define V411 (V + 1164) - 0x43b, 0, -#undef V412 -#define V412 (V + 1166) - 0x41c, 0, -#undef V413 -#define V413 (V + 1168) - 0x43c, 0, -#undef V414 -#define V414 (V + 1170) - 0x410, 0x306, 0, -#undef V415 -#define V415 (V + 1173) - 0x430, 0x306, 0, -#undef V416 -#define V416 (V + 1176) - 0x410, 0x308, 0, -#undef V417 -#define V417 (V + 1179) - 0x430, 0x308, 0, -#undef V418 -#define V418 (V + 1182) - 0x410, 0x415, 0, -#undef V419 -#define V419 (V + 1185) - 0x430, 0x435, 0, -#undef V420 -#define V420 (V + 1188) - 0x415, 0x306, 0, -#undef V421 -#define V421 (V + 1191) - 0x435, 0x306, 0, -#undef V422 -#define V422 (V + 1194) - 0x4d8, 0x308, 0, -#undef V423 -#define V423 (V + 1197) - 0x4d9, 0x308, 0, -#undef V424 -#define V424 (V + 1200) - 0x416, 0x308, 0, -#undef V425 -#define V425 (V + 1203) - 0x436, 0x308, 0, -#undef V426 -#define V426 (V + 1206) - 0x417, 0x308, 0, -#undef V427 -#define V427 (V + 1209) - 0x437, 0x308, 0, -#undef V428 -#define V428 (V + 1212) - 0x41e, 0x308, 0, -#undef V429 -#define V429 (V + 1215) - 0x43e, 0x308, 0, -#undef V430 -#define V430 (V + 1218) - 0x41e, 0, -#undef V431 -#define V431 (V + 1220) - 0x43e, 0, -#undef V432 -#define V432 (V + 1222) - 0x4e8, 0x308, 0, -#undef V433 -#define V433 (V + 1225) - 0x4e9, 0x308, 0, -#undef V434 -#define V434 (V + 1228) - 0x42d, 0x308, 0, -#undef V435 -#define V435 (V + 1231) - 0x44d, 0x308, 0, -#undef V436 -#define V436 (V + 1234) - 0x423, 0x304, 0, -#undef V437 -#define V437 (V + 1237) - 0x443, 0x304, 0, -#undef V438 -#define V438 (V + 1240) - 0x423, 0x308, 0, -#undef V439 -#define V439 (V + 1243) - 0x443, 0x308, 0, -#undef V440 -#define V440 (V + 1246) - 0x423, 0x30b, 0, -#undef V441 -#define V441 (V + 1249) - 0x443, 0x30b, 0, -#undef V442 -#define V442 (V + 1252) - 0x427, 0x308, 0, -#undef V443 -#define V443 (V + 1255) - 0x447, 0x308, 0, -#undef V444 -#define V444 (V + 1258) - 0x42b, 0x308, 0, -#undef V445 -#define V445 (V + 1261) - 0x44b, 0x308, 0, -#undef V446 -#define V446 (V + 1264) - 0x41b, 0x425, 0, -#undef V447 -#define V447 (V + 1267) - 0x43b, 0x445, 0, -#undef V448 -#define V448 (V + 1270) - 0x420, 0x425, 0, -#undef V449 -#define V449 (V + 1273) - 0x440, 0x445, 0, -#undef V450 -#define V450 (V + 1276) - 0x42f, 0x415, 0, -#undef V451 -#define V451 (V + 1279) - 0x44f, 0x435, 0, -#undef V452 -#define V452 (V + 1282) - 0x4ba, 0, -#undef V453 -#define V453 (V + 1284) - 0x4bb, 0, -#undef V454 -#define V454 (V + 1286) - 0x627, 0x653, 0, -#undef V455 -#define V455 (V + 1289) - 0x627, 0x654, 0, -#undef V456 -#define V456 (V + 1292) - 0x648, 0x654, 0, -#undef V457 -#define V457 (V + 1295) - 0x627, 0x655, 0, -#undef V458 -#define V458 (V + 1298) - 0x64a, 0x654, 0, -#undef V459 -#define V459 (V + 1301) - 0x6d5, 0x654, 0, -#undef V460 -#define V460 (V + 1304) - 0x6c1, 0x654, 0, -#undef V461 -#define V461 (V + 1307) - 0x6d2, 0x654, 0, -#undef V462 -#define V462 (V + 1310) - 0x928, 0x93c, 0, -#undef V463 -#define V463 (V + 1313) - 0x930, 0x93c, 0, -#undef V464 -#define V464 (V + 1316) - 0x933, 0x93c, 0, -#undef V465 -#define V465 (V + 1319) - 0x915, 0x93c, 0, -#undef V466 -#define V466 (V + 1322) - 0x916, 0x93c, 0, -#undef V467 -#define V467 (V + 1325) - 0x917, 0x93c, 0, -#undef V468 -#define V468 (V + 1328) - 0x91c, 0x93c, 0, -#undef V469 -#define V469 (V + 1331) - 0x921, 0x93c, 0, -#undef V470 -#define V470 (V + 1334) - 0x922, 0x93c, 0, -#undef V471 -#define V471 (V + 1337) - 0x92b, 0x93c, 0, -#undef V472 -#define V472 (V + 1340) - 0x92f, 0x93c, 0, -#undef V473 -#define V473 (V + 1343) - 0x9c7, 0x9be, 0, -#undef V474 -#define V474 (V + 1346) - 0x9c7, 0x9d7, 0, -#undef V475 -#define V475 (V + 1349) - 0x9a1, 0x9bc, 0, -#undef V476 -#define V476 (V + 1352) - 0x9a2, 0x9bc, 0, -#undef V477 -#define V477 (V + 1355) - 0x9af, 0x9bc, 0, -#undef V478 -#define V478 (V + 1358) - 0xa32, 0xa3c, 0, -#undef V479 -#define V479 (V + 1361) - 0xa38, 0xa3c, 0, -#undef V480 -#define V480 (V + 1364) - 0xa16, 0xa3c, 0, -#undef V481 -#define V481 (V + 1367) - 0xa17, 0xa3c, 0, -#undef V482 -#define V482 (V + 1370) - 0xa1c, 0xa3c, 0, -#undef V483 -#define V483 (V + 1373) - 0xa2b, 0xa3c, 0, -#undef V484 -#define V484 (V + 1376) - 0xb47, 0xb56, 0, -#undef V485 -#define V485 (V + 1379) - 0xb47, 0xb3e, 0, -#undef V486 -#define V486 (V + 1382) - 0xb47, 0xb57, 0, -#undef V487 -#define V487 (V + 1385) - 0xb21, 0xb3c, 0, -#undef V488 -#define V488 (V + 1388) - 0xb22, 0xb3c, 0, -#undef V489 -#define V489 (V + 1391) - 0xb92, 0xbd7, 0, -#undef V490 -#define V490 (V + 1394) - 0xbc6, 0xbbe, 0, -#undef V491 -#define V491 (V + 1397) - 0xbc7, 0xbbe, 0, -#undef V492 -#define V492 (V + 1400) - 0xbc6, 0xbd7, 0, -#undef V493 -#define V493 (V + 1403) - 0xc46, 0xc56, 0, -#undef V494 -#define V494 (V + 1406) - 0xcbf, 0xcd5, 0, -#undef V495 -#define V495 (V + 1409) - 0xcc6, 0xcd5, 0, -#undef V496 -#define V496 (V + 1412) - 0xcc6, 0xcd6, 0, -#undef V497 -#define V497 (V + 1415) - 0xcc6, 0xcc2, 0, -#undef V498 -#define V498 (V + 1418) - 0xcc6, 0xcc2, 0xcd5, 0, -#undef V499 -#define V499 (V + 1422) - 0xd46, 0xd3e, 0, -#undef V500 -#define V500 (V + 1425) - 0xd47, 0xd3e, 0, -#undef V501 -#define V501 (V + 1428) - 0xd46, 0xd57, 0, -#undef V502 -#define V502 (V + 1431) - 0xdd9, 0xdca, 0, -#undef V503 -#define V503 (V + 1434) - 0xdd9, 0xdcf, 0, -#undef V504 -#define V504 (V + 1437) - 0xdd9, 0xdcf, 0xdca, 0, -#undef V505 -#define V505 (V + 1441) - 0xdd9, 0xddf, 0, -#undef V506 -#define V506 (V + 1444) - 0xf42, 0xfb7, 0, -#undef V507 -#define V507 (V + 1447) - 0xf4c, 0xfb7, 0, -#undef V508 -#define V508 (V + 1450) - 0xf51, 0xfb7, 0, -#undef V509 -#define V509 (V + 1453) - 0xf56, 0xfb7, 0, -#undef V510 -#define V510 (V + 1456) - 0xf5b, 0xfb7, 0, -#undef V511 -#define V511 (V + 1459) - 0xf40, 0xfb5, 0, -#undef V512 -#define V512 (V + 1462) - 0xf71, 0xf72, 0, -#undef V513 -#define V513 (V + 1465) - 0xf71, 0xf74, 0, -#undef V514 -#define V514 (V + 1468) - 0xfb2, 0xf80, 0, -#undef V515 -#define V515 (V + 1471) - 0xfb3, 0xf80, 0, -#undef V516 -#define V516 (V + 1474) - 0xf71, 0xf80, 0, -#undef V517 -#define V517 (V + 1477) - 0xf92, 0xfb7, 0, -#undef V518 -#define V518 (V + 1480) - 0xf9c, 0xfb7, 0, -#undef V519 -#define V519 (V + 1483) - 0xfa1, 0xfb7, 0, -#undef V520 -#define V520 (V + 1486) - 0xfa6, 0xfb7, 0, -#undef V521 -#define V521 (V + 1489) - 0xfab, 0xfb7, 0, -#undef V522 -#define V522 (V + 1492) - 0xf90, 0xfb5, 0, -#undef V523 -#define V523 (V + 1495) - 0x1025, 0x102e, 0, -#undef V524 -#define V524 (V + 1498) - 0x1b05, 0x1b35, 0, -#undef V525 -#define V525 (V + 1501) - 0x1b07, 0x1b35, 0, -#undef V526 -#define V526 (V + 1504) - 0x1b09, 0x1b35, 0, -#undef V527 -#define V527 (V + 1507) - 0x1b0b, 0x1b35, 0, -#undef V528 -#define V528 (V + 1510) - 0x1b0d, 0x1b35, 0, -#undef V529 -#define V529 (V + 1513) - 0x1b11, 0x1b35, 0, -#undef V530 -#define V530 (V + 1516) - 0x1b3a, 0x1b35, 0, -#undef V531 -#define V531 (V + 1519) - 0x1b3c, 0x1b35, 0, -#undef V532 -#define V532 (V + 1522) - 0x1b3e, 0x1b35, 0, -#undef V533 -#define V533 (V + 1525) - 0x1b3f, 0x1b35, 0, -#undef V534 -#define V534 (V + 1528) - 0x1b42, 0x1b35, 0, -#undef V535 -#define V535 (V + 1531) - 0x41, 0x325, 0, -#undef V536 -#define V536 (V + 1534) - 0x61, 0x325, 0, -#undef V537 -#define V537 (V + 1537) - 0x42, 0x307, 0, -#undef V538 -#define V538 (V + 1540) - 0x62, 0x307, 0, -#undef V539 -#define V539 (V + 1543) - 0x42, 0x323, 0, -#undef V540 -#define V540 (V + 1546) - 0x62, 0x323, 0, -#undef V541 -#define V541 (V + 1549) - 0x42, 0x331, 0, -#undef V542 -#define V542 (V + 1552) - 0x62, 0x331, 0, -#undef V543 -#define V543 (V + 1555) - 0x43, 0x327, 0x301, 0, -#undef V544 -#define V544 (V + 1559) - 0x63, 0x327, 0x301, 0, -#undef V545 -#define V545 (V + 1563) - 0x44, 0x307, 0, -#undef V546 -#define V546 (V + 1566) - 0x64, 0x307, 0, -#undef V547 -#define V547 (V + 1569) - 0x44, 0x323, 0, -#undef V548 -#define V548 (V + 1572) - 0x64, 0x323, 0, -#undef V549 -#define V549 (V + 1575) - 0x44, 0x331, 0, -#undef V550 -#define V550 (V + 1578) - 0x64, 0x331, 0, -#undef V551 -#define V551 (V + 1581) - 0x44, 0x327, 0, -#undef V552 -#define V552 (V + 1584) - 0x64, 0x327, 0, -#undef V553 -#define V553 (V + 1587) - 0x44, 0x32d, 0, -#undef V554 -#define V554 (V + 1590) - 0x64, 0x32d, 0, -#undef V555 -#define V555 (V + 1593) - 0x45, 0x304, 0x300, 0, -#undef V556 -#define V556 (V + 1597) - 0x65, 0x304, 0x300, 0, -#undef V557 -#define V557 (V + 1601) - 0x45, 0x304, 0x301, 0, -#undef V558 -#define V558 (V + 1605) - 0x65, 0x304, 0x301, 0, -#undef V559 -#define V559 (V + 1609) - 0x45, 0x32d, 0, -#undef V560 -#define V560 (V + 1612) - 0x65, 0x32d, 0, -#undef V561 -#define V561 (V + 1615) - 0x45, 0x330, 0, -#undef V562 -#define V562 (V + 1618) - 0x65, 0x330, 0, -#undef V563 -#define V563 (V + 1621) - 0x45, 0x327, 0x306, 0, -#undef V564 -#define V564 (V + 1625) - 0x65, 0x327, 0x306, 0, -#undef V565 -#define V565 (V + 1629) - 0x46, 0x307, 0, -#undef V566 -#define V566 (V + 1632) - 0x66, 0x307, 0, -#undef V567 -#define V567 (V + 1635) - 0x47, 0x304, 0, -#undef V568 -#define V568 (V + 1638) - 0x67, 0x304, 0, -#undef V569 -#define V569 (V + 1641) - 0x48, 0x307, 0, -#undef V570 -#define V570 (V + 1644) - 0x68, 0x307, 0, -#undef V571 -#define V571 (V + 1647) - 0x48, 0x323, 0, -#undef V572 -#define V572 (V + 1650) - 0x68, 0x323, 0, -#undef V573 -#define V573 (V + 1653) - 0x48, 0x308, 0, -#undef V574 -#define V574 (V + 1656) - 0x68, 0x308, 0, -#undef V575 -#define V575 (V + 1659) - 0x48, 0x327, 0, -#undef V576 -#define V576 (V + 1662) - 0x68, 0x327, 0, -#undef V577 -#define V577 (V + 1665) - 0x48, 0x32e, 0, -#undef V578 -#define V578 (V + 1668) - 0x68, 0x32e, 0, -#undef V579 -#define V579 (V + 1671) - 0x49, 0x330, 0, -#undef V580 -#define V580 (V + 1674) - 0x69, 0x330, 0, -#undef V581 -#define V581 (V + 1677) - 0x49, 0x308, 0x301, 0, -#undef V582 -#define V582 (V + 1681) - 0x69, 0x308, 0x301, 0, -#undef V583 -#define V583 (V + 1685) - 0x4b, 0x301, 0, -#undef V584 -#define V584 (V + 1688) - 0x6b, 0x301, 0, -#undef V585 -#define V585 (V + 1691) - 0x4b, 0x323, 0, -#undef V586 -#define V586 (V + 1694) - 0x6b, 0x323, 0, -#undef V587 -#define V587 (V + 1697) - 0x4b, 0x331, 0, -#undef V588 -#define V588 (V + 1700) - 0x6b, 0x331, 0, -#undef V589 -#define V589 (V + 1703) - 0x4c, 0x323, 0, -#undef V590 -#define V590 (V + 1706) - 0x6c, 0x323, 0, -#undef V591 -#define V591 (V + 1709) - 0x4c, 0x323, 0x304, 0, -#undef V592 -#define V592 (V + 1713) - 0x6c, 0x323, 0x304, 0, -#undef V593 -#define V593 (V + 1717) - 0x4c, 0x331, 0, -#undef V594 -#define V594 (V + 1720) - 0x6c, 0x331, 0, -#undef V595 -#define V595 (V + 1723) - 0x4c, 0x32d, 0, -#undef V596 -#define V596 (V + 1726) - 0x6c, 0x32d, 0, -#undef V597 -#define V597 (V + 1729) - 0x4d, 0x301, 0, -#undef V598 -#define V598 (V + 1732) - 0x6d, 0x301, 0, -#undef V599 -#define V599 (V + 1735) - 0x4d, 0x307, 0, -#undef V600 -#define V600 (V + 1738) - 0x6d, 0x307, 0, -#undef V601 -#define V601 (V + 1741) - 0x4d, 0x323, 0, -#undef V602 -#define V602 (V + 1744) - 0x6d, 0x323, 0, -#undef V603 -#define V603 (V + 1747) - 0x4e, 0x307, 0, -#undef V604 -#define V604 (V + 1750) - 0x6e, 0x307, 0, -#undef V605 -#define V605 (V + 1753) - 0x4e, 0x323, 0, -#undef V606 -#define V606 (V + 1756) - 0x6e, 0x323, 0, -#undef V607 -#define V607 (V + 1759) - 0x4e, 0x331, 0, -#undef V608 -#define V608 (V + 1762) - 0x6e, 0x331, 0, -#undef V609 -#define V609 (V + 1765) - 0x4e, 0x32d, 0, -#undef V610 -#define V610 (V + 1768) - 0x6e, 0x32d, 0, -#undef V611 -#define V611 (V + 1771) - 0x4f, 0x303, 0x301, 0, -#undef V612 -#define V612 (V + 1775) - 0x6f, 0x303, 0x301, 0, -#undef V613 -#define V613 (V + 1779) - 0x4f, 0x303, 0x308, 0, -#undef V614 -#define V614 (V + 1783) - 0x6f, 0x303, 0x308, 0, -#undef V615 -#define V615 (V + 1787) - 0x4f, 0x304, 0x300, 0, -#undef V616 -#define V616 (V + 1791) - 0x6f, 0x304, 0x300, 0, -#undef V617 -#define V617 (V + 1795) - 0x4f, 0x304, 0x301, 0, -#undef V618 -#define V618 (V + 1799) - 0x6f, 0x304, 0x301, 0, -#undef V619 -#define V619 (V + 1803) - 0x50, 0x301, 0, -#undef V620 -#define V620 (V + 1806) - 0x70, 0x301, 0, -#undef V621 -#define V621 (V + 1809) - 0x50, 0x307, 0, -#undef V622 -#define V622 (V + 1812) - 0x70, 0x307, 0, -#undef V623 -#define V623 (V + 1815) - 0x52, 0x307, 0, -#undef V624 -#define V624 (V + 1818) - 0x72, 0x307, 0, -#undef V625 -#define V625 (V + 1821) - 0x52, 0x323, 0, -#undef V626 -#define V626 (V + 1824) - 0x72, 0x323, 0, -#undef V627 -#define V627 (V + 1827) - 0x52, 0x323, 0x304, 0, -#undef V628 -#define V628 (V + 1831) - 0x72, 0x323, 0x304, 0, -#undef V629 -#define V629 (V + 1835) - 0x52, 0x331, 0, -#undef V630 -#define V630 (V + 1838) - 0x72, 0x331, 0, -#undef V631 -#define V631 (V + 1841) - 0x53, 0x307, 0, -#undef V632 -#define V632 (V + 1844) - 0x73, 0x307, 0, -#undef V633 -#define V633 (V + 1847) - 0x53, 0x323, 0, -#undef V634 -#define V634 (V + 1850) - 0x73, 0x323, 0, -#undef V635 -#define V635 (V + 1853) - 0x53, 0x301, 0x307, 0, -#undef V636 -#define V636 (V + 1857) - 0x73, 0x301, 0x307, 0, -#undef V637 -#define V637 (V + 1861) - 0x53, 0x30c, 0x307, 0, -#undef V638 -#define V638 (V + 1865) - 0x73, 0x30c, 0x307, 0, -#undef V639 -#define V639 (V + 1869) - 0x53, 0x323, 0x307, 0, -#undef V640 -#define V640 (V + 1873) - 0x73, 0x323, 0x307, 0, -#undef V641 -#define V641 (V + 1877) - 0x54, 0x307, 0, -#undef V642 -#define V642 (V + 1880) - 0x74, 0x307, 0, -#undef V643 -#define V643 (V + 1883) - 0x54, 0x323, 0, -#undef V644 -#define V644 (V + 1886) - 0x74, 0x323, 0, -#undef V645 -#define V645 (V + 1889) - 0x54, 0x331, 0, -#undef V646 -#define V646 (V + 1892) - 0x74, 0x331, 0, -#undef V647 -#define V647 (V + 1895) - 0x54, 0x32d, 0, -#undef V648 -#define V648 (V + 1898) - 0x74, 0x32d, 0, -#undef V649 -#define V649 (V + 1901) - 0x55, 0x324, 0, -#undef V650 -#define V650 (V + 1904) - 0x75, 0x324, 0, -#undef V651 -#define V651 (V + 1907) - 0x55, 0x330, 0, -#undef V652 -#define V652 (V + 1910) - 0x75, 0x330, 0, -#undef V653 -#define V653 (V + 1913) - 0x55, 0x32d, 0, -#undef V654 -#define V654 (V + 1916) - 0x75, 0x32d, 0, -#undef V655 -#define V655 (V + 1919) - 0x55, 0x303, 0x301, 0, -#undef V656 -#define V656 (V + 1923) - 0x75, 0x303, 0x301, 0, -#undef V657 -#define V657 (V + 1927) - 0x55, 0x304, 0x308, 0, -#undef V658 -#define V658 (V + 1931) - 0x75, 0x304, 0x308, 0, -#undef V659 -#define V659 (V + 1935) - 0x56, 0x303, 0, -#undef V660 -#define V660 (V + 1938) - 0x76, 0x303, 0, -#undef V661 -#define V661 (V + 1941) - 0x56, 0x323, 0, -#undef V662 -#define V662 (V + 1944) - 0x76, 0x323, 0, -#undef V663 -#define V663 (V + 1947) - 0x57, 0x300, 0, -#undef V664 -#define V664 (V + 1950) - 0x77, 0x300, 0, -#undef V665 -#define V665 (V + 1953) - 0x57, 0x301, 0, -#undef V666 -#define V666 (V + 1956) - 0x77, 0x301, 0, -#undef V667 -#define V667 (V + 1959) - 0x57, 0x308, 0, -#undef V668 -#define V668 (V + 1962) - 0x77, 0x308, 0, -#undef V669 -#define V669 (V + 1965) - 0x57, 0x307, 0, -#undef V670 -#define V670 (V + 1968) - 0x77, 0x307, 0, -#undef V671 -#define V671 (V + 1971) - 0x57, 0x323, 0, -#undef V672 -#define V672 (V + 1974) - 0x77, 0x323, 0, -#undef V673 -#define V673 (V + 1977) - 0x58, 0x307, 0, -#undef V674 -#define V674 (V + 1980) - 0x78, 0x307, 0, -#undef V675 -#define V675 (V + 1983) - 0x58, 0x308, 0, -#undef V676 -#define V676 (V + 1986) - 0x78, 0x308, 0, -#undef V677 -#define V677 (V + 1989) - 0x59, 0x307, 0, -#undef V678 -#define V678 (V + 1992) - 0x79, 0x307, 0, -#undef V679 -#define V679 (V + 1995) - 0x5a, 0x302, 0, -#undef V680 -#define V680 (V + 1998) - 0x7a, 0x302, 0, -#undef V681 -#define V681 (V + 2001) - 0x5a, 0x323, 0, -#undef V682 -#define V682 (V + 2004) - 0x7a, 0x323, 0, -#undef V683 -#define V683 (V + 2007) - 0x5a, 0x331, 0, -#undef V684 -#define V684 (V + 2010) - 0x7a, 0x331, 0, -#undef V685 -#define V685 (V + 2013) - 0x68, 0x331, 0, -#undef V686 -#define V686 (V + 2016) - 0x74, 0x308, 0, -#undef V687 -#define V687 (V + 2019) - 0x77, 0x30a, 0, -#undef V688 -#define V688 (V + 2022) - 0x79, 0x30a, 0, -#undef V689 -#define V689 (V + 2025) - 0x17f, 0x307, 0, -#undef V690 -#define V690 (V + 2028) - 0x41, 0x323, 0, -#undef V691 -#define V691 (V + 2031) - 0x61, 0x323, 0, -#undef V692 -#define V692 (V + 2034) - 0x41, 0x309, 0, -#undef V693 -#define V693 (V + 2037) - 0x61, 0x309, 0, -#undef V694 -#define V694 (V + 2040) - 0x41, 0x302, 0x301, 0, -#undef V695 -#define V695 (V + 2044) - 0x61, 0x302, 0x301, 0, -#undef V696 -#define V696 (V + 2048) - 0x41, 0x302, 0x300, 0, -#undef V697 -#define V697 (V + 2052) - 0x61, 0x302, 0x300, 0, -#undef V698 -#define V698 (V + 2056) - 0x41, 0x302, 0x309, 0, -#undef V699 -#define V699 (V + 2060) - 0x61, 0x302, 0x309, 0, -#undef V700 -#define V700 (V + 2064) - 0x41, 0x302, 0x303, 0, -#undef V701 -#define V701 (V + 2068) - 0x61, 0x302, 0x303, 0, -#undef V702 -#define V702 (V + 2072) - 0x41, 0x323, 0x302, 0, -#undef V703 -#define V703 (V + 2076) - 0x61, 0x323, 0x302, 0, -#undef V704 -#define V704 (V + 2080) - 0x41, 0x306, 0x301, 0, -#undef V705 -#define V705 (V + 2084) - 0x61, 0x306, 0x301, 0, -#undef V706 -#define V706 (V + 2088) - 0x41, 0x306, 0x300, 0, -#undef V707 -#define V707 (V + 2092) - 0x61, 0x306, 0x300, 0, -#undef V708 -#define V708 (V + 2096) - 0x41, 0x306, 0x309, 0, -#undef V709 -#define V709 (V + 2100) - 0x61, 0x306, 0x309, 0, -#undef V710 -#define V710 (V + 2104) - 0x41, 0x306, 0x303, 0, -#undef V711 -#define V711 (V + 2108) - 0x61, 0x306, 0x303, 0, -#undef V712 -#define V712 (V + 2112) - 0x41, 0x323, 0x306, 0, -#undef V713 -#define V713 (V + 2116) - 0x61, 0x323, 0x306, 0, -#undef V714 -#define V714 (V + 2120) - 0x45, 0x323, 0, -#undef V715 -#define V715 (V + 2123) - 0x65, 0x323, 0, -#undef V716 -#define V716 (V + 2126) - 0x45, 0x309, 0, -#undef V717 -#define V717 (V + 2129) - 0x65, 0x309, 0, -#undef V718 -#define V718 (V + 2132) - 0x45, 0x303, 0, -#undef V719 -#define V719 (V + 2135) - 0x65, 0x303, 0, -#undef V720 -#define V720 (V + 2138) - 0x45, 0x302, 0x301, 0, -#undef V721 -#define V721 (V + 2142) - 0x65, 0x302, 0x301, 0, -#undef V722 -#define V722 (V + 2146) - 0x45, 0x302, 0x300, 0, -#undef V723 -#define V723 (V + 2150) - 0x65, 0x302, 0x300, 0, -#undef V724 -#define V724 (V + 2154) - 0x45, 0x302, 0x309, 0, -#undef V725 -#define V725 (V + 2158) - 0x65, 0x302, 0x309, 0, -#undef V726 -#define V726 (V + 2162) - 0x45, 0x302, 0x303, 0, -#undef V727 -#define V727 (V + 2166) - 0x65, 0x302, 0x303, 0, -#undef V728 -#define V728 (V + 2170) - 0x45, 0x323, 0x302, 0, -#undef V729 -#define V729 (V + 2174) - 0x65, 0x323, 0x302, 0, -#undef V730 -#define V730 (V + 2178) - 0x49, 0x309, 0, -#undef V731 -#define V731 (V + 2181) - 0x69, 0x309, 0, -#undef V732 -#define V732 (V + 2184) - 0x49, 0x323, 0, -#undef V733 -#define V733 (V + 2187) - 0x69, 0x323, 0, -#undef V734 -#define V734 (V + 2190) - 0x4f, 0x323, 0, -#undef V735 -#define V735 (V + 2193) - 0x6f, 0x323, 0, -#undef V736 -#define V736 (V + 2196) - 0x4f, 0x309, 0, -#undef V737 -#define V737 (V + 2199) - 0x6f, 0x309, 0, -#undef V738 -#define V738 (V + 2202) - 0x4f, 0x302, 0x301, 0, -#undef V739 -#define V739 (V + 2206) - 0x6f, 0x302, 0x301, 0, -#undef V740 -#define V740 (V + 2210) - 0x4f, 0x302, 0x300, 0, -#undef V741 -#define V741 (V + 2214) - 0x6f, 0x302, 0x300, 0, -#undef V742 -#define V742 (V + 2218) - 0x4f, 0x302, 0x309, 0, -#undef V743 -#define V743 (V + 2222) - 0x6f, 0x302, 0x309, 0, -#undef V744 -#define V744 (V + 2226) - 0x4f, 0x302, 0x303, 0, -#undef V745 -#define V745 (V + 2230) - 0x6f, 0x302, 0x303, 0, -#undef V746 -#define V746 (V + 2234) - 0x4f, 0x323, 0x302, 0, -#undef V747 -#define V747 (V + 2238) - 0x6f, 0x323, 0x302, 0, -#undef V748 -#define V748 (V + 2242) - 0x4f, 0x31b, 0x301, 0, -#undef V749 -#define V749 (V + 2246) - 0x6f, 0x31b, 0x301, 0, -#undef V750 -#define V750 (V + 2250) - 0x4f, 0x31b, 0x300, 0, -#undef V751 -#define V751 (V + 2254) - 0x6f, 0x31b, 0x300, 0, -#undef V752 -#define V752 (V + 2258) - 0x4f, 0x31b, 0x309, 0, -#undef V753 -#define V753 (V + 2262) - 0x6f, 0x31b, 0x309, 0, -#undef V754 -#define V754 (V + 2266) - 0x4f, 0x31b, 0x303, 0, -#undef V755 -#define V755 (V + 2270) - 0x6f, 0x31b, 0x303, 0, -#undef V756 -#define V756 (V + 2274) - 0x4f, 0x31b, 0x323, 0, -#undef V757 -#define V757 (V + 2278) - 0x6f, 0x31b, 0x323, 0, -#undef V758 -#define V758 (V + 2282) - 0x55, 0x323, 0, -#undef V759 -#define V759 (V + 2285) - 0x75, 0x323, 0, -#undef V760 -#define V760 (V + 2288) - 0x55, 0x309, 0, -#undef V761 -#define V761 (V + 2291) - 0x75, 0x309, 0, -#undef V762 -#define V762 (V + 2294) - 0x55, 0x31b, 0x301, 0, -#undef V763 -#define V763 (V + 2298) - 0x75, 0x31b, 0x301, 0, -#undef V764 -#define V764 (V + 2302) - 0x55, 0x31b, 0x300, 0, -#undef V765 -#define V765 (V + 2306) - 0x75, 0x31b, 0x300, 0, -#undef V766 -#define V766 (V + 2310) - 0x55, 0x31b, 0x309, 0, -#undef V767 -#define V767 (V + 2314) - 0x75, 0x31b, 0x309, 0, -#undef V768 -#define V768 (V + 2318) - 0x55, 0x31b, 0x303, 0, -#undef V769 -#define V769 (V + 2322) - 0x75, 0x31b, 0x303, 0, -#undef V770 -#define V770 (V + 2326) - 0x55, 0x31b, 0x323, 0, -#undef V771 -#define V771 (V + 2330) - 0x75, 0x31b, 0x323, 0, -#undef V772 -#define V772 (V + 2334) - 0x59, 0x300, 0, -#undef V773 -#define V773 (V + 2337) - 0x79, 0x300, 0, -#undef V774 -#define V774 (V + 2340) - 0x59, 0x323, 0, -#undef V775 -#define V775 (V + 2343) - 0x79, 0x323, 0, -#undef V776 -#define V776 (V + 2346) - 0x59, 0x309, 0, -#undef V777 -#define V777 (V + 2349) - 0x79, 0x309, 0, -#undef V778 -#define V778 (V + 2352) - 0x59, 0x303, 0, -#undef V779 -#define V779 (V + 2355) - 0x79, 0x303, 0, -#undef V780 -#define V780 (V + 2358) - 0x3b1, 0x313, 0, -#undef V781 -#define V781 (V + 2361) - 0x3b1, 0x314, 0, -#undef V782 -#define V782 (V + 2364) - 0x3b1, 0x313, 0x300, 0, -#undef V783 -#define V783 (V + 2368) - 0x3b1, 0x314, 0x300, 0, -#undef V784 -#define V784 (V + 2372) - 0x3b1, 0x313, 0x301, 0, -#undef V785 -#define V785 (V + 2376) - 0x3b1, 0x314, 0x301, 0, -#undef V786 -#define V786 (V + 2380) - 0x3b1, 0x313, 0x342, 0, -#undef V787 -#define V787 (V + 2384) - 0x3b1, 0x314, 0x342, 0, -#undef V788 -#define V788 (V + 2388) - 0x391, 0x313, 0, -#undef V789 -#define V789 (V + 2391) - 0x391, 0x314, 0, -#undef V790 -#define V790 (V + 2394) - 0x391, 0x313, 0x300, 0, -#undef V791 -#define V791 (V + 2398) - 0x391, 0x314, 0x300, 0, -#undef V792 -#define V792 (V + 2402) - 0x391, 0x313, 0x301, 0, -#undef V793 -#define V793 (V + 2406) - 0x391, 0x314, 0x301, 0, -#undef V794 -#define V794 (V + 2410) - 0x391, 0x313, 0x342, 0, -#undef V795 -#define V795 (V + 2414) - 0x391, 0x314, 0x342, 0, -#undef V796 -#define V796 (V + 2418) - 0x3b5, 0x313, 0, -#undef V797 -#define V797 (V + 2421) - 0x3b5, 0x314, 0, -#undef V798 -#define V798 (V + 2424) - 0x3b5, 0x313, 0x300, 0, -#undef V799 -#define V799 (V + 2428) - 0x3b5, 0x314, 0x300, 0, -#undef V800 -#define V800 (V + 2432) - 0x3b5, 0x313, 0x301, 0, -#undef V801 -#define V801 (V + 2436) - 0x3b5, 0x314, 0x301, 0, -#undef V802 -#define V802 (V + 2440) - 0x395, 0x313, 0, -#undef V803 -#define V803 (V + 2443) - 0x395, 0x314, 0, -#undef V804 -#define V804 (V + 2446) - 0x395, 0x313, 0x300, 0, -#undef V805 -#define V805 (V + 2450) - 0x395, 0x314, 0x300, 0, -#undef V806 -#define V806 (V + 2454) - 0x395, 0x313, 0x301, 0, -#undef V807 -#define V807 (V + 2458) - 0x395, 0x314, 0x301, 0, -#undef V808 -#define V808 (V + 2462) - 0x3b7, 0x313, 0, -#undef V809 -#define V809 (V + 2465) - 0x3b7, 0x314, 0, -#undef V810 -#define V810 (V + 2468) - 0x3b7, 0x313, 0x300, 0, -#undef V811 -#define V811 (V + 2472) - 0x3b7, 0x314, 0x300, 0, -#undef V812 -#define V812 (V + 2476) - 0x3b7, 0x313, 0x301, 0, -#undef V813 -#define V813 (V + 2480) - 0x3b7, 0x314, 0x301, 0, -#undef V814 -#define V814 (V + 2484) - 0x3b7, 0x313, 0x342, 0, -#undef V815 -#define V815 (V + 2488) - 0x3b7, 0x314, 0x342, 0, -#undef V816 -#define V816 (V + 2492) - 0x397, 0x313, 0, -#undef V817 -#define V817 (V + 2495) - 0x397, 0x314, 0, -#undef V818 -#define V818 (V + 2498) - 0x397, 0x313, 0x300, 0, -#undef V819 -#define V819 (V + 2502) - 0x397, 0x314, 0x300, 0, -#undef V820 -#define V820 (V + 2506) - 0x397, 0x313, 0x301, 0, -#undef V821 -#define V821 (V + 2510) - 0x397, 0x314, 0x301, 0, -#undef V822 -#define V822 (V + 2514) - 0x397, 0x313, 0x342, 0, -#undef V823 -#define V823 (V + 2518) - 0x397, 0x314, 0x342, 0, -#undef V824 -#define V824 (V + 2522) - 0x3b9, 0x313, 0, -#undef V825 -#define V825 (V + 2525) - 0x3b9, 0x314, 0, -#undef V826 -#define V826 (V + 2528) - 0x3b9, 0x313, 0x300, 0, -#undef V827 -#define V827 (V + 2532) - 0x3b9, 0x314, 0x300, 0, -#undef V828 -#define V828 (V + 2536) - 0x3b9, 0x313, 0x301, 0, -#undef V829 -#define V829 (V + 2540) - 0x3b9, 0x314, 0x301, 0, -#undef V830 -#define V830 (V + 2544) - 0x3b9, 0x313, 0x342, 0, -#undef V831 -#define V831 (V + 2548) - 0x3b9, 0x314, 0x342, 0, -#undef V832 -#define V832 (V + 2552) - 0x399, 0x313, 0, -#undef V833 -#define V833 (V + 2555) - 0x399, 0x314, 0, -#undef V834 -#define V834 (V + 2558) - 0x399, 0x313, 0x300, 0, -#undef V835 -#define V835 (V + 2562) - 0x399, 0x314, 0x300, 0, -#undef V836 -#define V836 (V + 2566) - 0x399, 0x313, 0x301, 0, -#undef V837 -#define V837 (V + 2570) - 0x399, 0x314, 0x301, 0, -#undef V838 -#define V838 (V + 2574) - 0x399, 0x313, 0x342, 0, -#undef V839 -#define V839 (V + 2578) - 0x399, 0x314, 0x342, 0, -#undef V840 -#define V840 (V + 2582) - 0x3bf, 0x313, 0, -#undef V841 -#define V841 (V + 2585) - 0x3bf, 0x314, 0, -#undef V842 -#define V842 (V + 2588) - 0x3bf, 0x313, 0x300, 0, -#undef V843 -#define V843 (V + 2592) - 0x3bf, 0x314, 0x300, 0, -#undef V844 -#define V844 (V + 2596) - 0x3bf, 0x313, 0x301, 0, -#undef V845 -#define V845 (V + 2600) - 0x3bf, 0x314, 0x301, 0, -#undef V846 -#define V846 (V + 2604) - 0x39f, 0x313, 0, -#undef V847 -#define V847 (V + 2607) - 0x39f, 0x314, 0, -#undef V848 -#define V848 (V + 2610) - 0x39f, 0x313, 0x300, 0, -#undef V849 -#define V849 (V + 2614) - 0x39f, 0x314, 0x300, 0, -#undef V850 -#define V850 (V + 2618) - 0x39f, 0x313, 0x301, 0, -#undef V851 -#define V851 (V + 2622) - 0x39f, 0x314, 0x301, 0, -#undef V852 -#define V852 (V + 2626) - 0x3c5, 0x313, 0, -#undef V853 -#define V853 (V + 2629) - 0x3c5, 0x314, 0, -#undef V854 -#define V854 (V + 2632) - 0x3c5, 0x313, 0x300, 0, -#undef V855 -#define V855 (V + 2636) - 0x3c5, 0x314, 0x300, 0, -#undef V856 -#define V856 (V + 2640) - 0x3c5, 0x313, 0x301, 0, -#undef V857 -#define V857 (V + 2644) - 0x3c5, 0x314, 0x301, 0, -#undef V858 -#define V858 (V + 2648) - 0x3c5, 0x313, 0x342, 0, -#undef V859 -#define V859 (V + 2652) - 0x3c5, 0x314, 0x342, 0, -#undef V860 -#define V860 (V + 2656) - 0x3a5, 0x314, 0, -#undef V861 -#define V861 (V + 2659) - 0x3a5, 0x314, 0x300, 0, -#undef V862 -#define V862 (V + 2663) - 0x3a5, 0x314, 0x301, 0, -#undef V863 -#define V863 (V + 2667) - 0x3a5, 0x314, 0x342, 0, -#undef V864 -#define V864 (V + 2671) - 0x3c9, 0x313, 0, -#undef V865 -#define V865 (V + 2674) - 0x3c9, 0x314, 0, -#undef V866 -#define V866 (V + 2677) - 0x3c9, 0x313, 0x300, 0, -#undef V867 -#define V867 (V + 2681) - 0x3c9, 0x314, 0x300, 0, -#undef V868 -#define V868 (V + 2685) - 0x3c9, 0x313, 0x301, 0, -#undef V869 -#define V869 (V + 2689) - 0x3c9, 0x314, 0x301, 0, -#undef V870 -#define V870 (V + 2693) - 0x3c9, 0x313, 0x342, 0, -#undef V871 -#define V871 (V + 2697) - 0x3c9, 0x314, 0x342, 0, -#undef V872 -#define V872 (V + 2701) - 0x3a9, 0x313, 0, -#undef V873 -#define V873 (V + 2704) - 0x3a9, 0x314, 0, -#undef V874 -#define V874 (V + 2707) - 0x3a9, 0x313, 0x300, 0, -#undef V875 -#define V875 (V + 2711) - 0x3a9, 0x314, 0x300, 0, -#undef V876 -#define V876 (V + 2715) - 0x3a9, 0x313, 0x301, 0, -#undef V877 -#define V877 (V + 2719) - 0x3a9, 0x314, 0x301, 0, -#undef V878 -#define V878 (V + 2723) - 0x3a9, 0x313, 0x342, 0, -#undef V879 -#define V879 (V + 2727) - 0x3a9, 0x314, 0x342, 0, -#undef V880 -#define V880 (V + 2731) - 0x3b1, 0x300, 0, -#undef V881 -#define V881 (V + 2734) - 0x3b5, 0x300, 0, -#undef V882 -#define V882 (V + 2737) - 0x3b7, 0x300, 0, -#undef V883 -#define V883 (V + 2740) - 0x3b9, 0x300, 0, -#undef V884 -#define V884 (V + 2743) - 0x3bf, 0x300, 0, -#undef V885 -#define V885 (V + 2746) - 0x3c5, 0x300, 0, -#undef V886 -#define V886 (V + 2749) - 0x3c9, 0x300, 0, -#undef V887 -#define V887 (V + 2752) - 0x3b1, 0x313, 0x345, 0, -#undef V888 -#define V888 (V + 2756) - 0x3b1, 0x314, 0x345, 0, -#undef V889 -#define V889 (V + 2760) - 0x3b1, 0x313, 0x300, 0x345, 0, -#undef V890 -#define V890 (V + 2765) - 0x3b1, 0x314, 0x300, 0x345, 0, -#undef V891 -#define V891 (V + 2770) - 0x3b1, 0x313, 0x301, 0x345, 0, -#undef V892 -#define V892 (V + 2775) - 0x3b1, 0x314, 0x301, 0x345, 0, -#undef V893 -#define V893 (V + 2780) - 0x3b1, 0x313, 0x342, 0x345, 0, -#undef V894 -#define V894 (V + 2785) - 0x3b1, 0x314, 0x342, 0x345, 0, -#undef V895 -#define V895 (V + 2790) - 0x391, 0x313, 0x345, 0, -#undef V896 -#define V896 (V + 2794) - 0x391, 0x314, 0x345, 0, -#undef V897 -#define V897 (V + 2798) - 0x391, 0x313, 0x300, 0x345, 0, -#undef V898 -#define V898 (V + 2803) - 0x391, 0x314, 0x300, 0x345, 0, -#undef V899 -#define V899 (V + 2808) - 0x391, 0x313, 0x301, 0x345, 0, -#undef V900 -#define V900 (V + 2813) - 0x391, 0x314, 0x301, 0x345, 0, -#undef V901 -#define V901 (V + 2818) - 0x391, 0x313, 0x342, 0x345, 0, -#undef V902 -#define V902 (V + 2823) - 0x391, 0x314, 0x342, 0x345, 0, -#undef V903 -#define V903 (V + 2828) - 0x3b7, 0x313, 0x345, 0, -#undef V904 -#define V904 (V + 2832) - 0x3b7, 0x314, 0x345, 0, -#undef V905 -#define V905 (V + 2836) - 0x3b7, 0x313, 0x300, 0x345, 0, -#undef V906 -#define V906 (V + 2841) - 0x3b7, 0x314, 0x300, 0x345, 0, -#undef V907 -#define V907 (V + 2846) - 0x3b7, 0x313, 0x301, 0x345, 0, -#undef V908 -#define V908 (V + 2851) - 0x3b7, 0x314, 0x301, 0x345, 0, -#undef V909 -#define V909 (V + 2856) - 0x3b7, 0x313, 0x342, 0x345, 0, -#undef V910 -#define V910 (V + 2861) - 0x3b7, 0x314, 0x342, 0x345, 0, -#undef V911 -#define V911 (V + 2866) - 0x397, 0x313, 0x345, 0, -#undef V912 -#define V912 (V + 2870) - 0x397, 0x314, 0x345, 0, -#undef V913 -#define V913 (V + 2874) - 0x397, 0x313, 0x300, 0x345, 0, -#undef V914 -#define V914 (V + 2879) - 0x397, 0x314, 0x300, 0x345, 0, -#undef V915 -#define V915 (V + 2884) - 0x397, 0x313, 0x301, 0x345, 0, -#undef V916 -#define V916 (V + 2889) - 0x397, 0x314, 0x301, 0x345, 0, -#undef V917 -#define V917 (V + 2894) - 0x397, 0x313, 0x342, 0x345, 0, -#undef V918 -#define V918 (V + 2899) - 0x397, 0x314, 0x342, 0x345, 0, -#undef V919 -#define V919 (V + 2904) - 0x3c9, 0x313, 0x345, 0, -#undef V920 -#define V920 (V + 2908) - 0x3c9, 0x314, 0x345, 0, -#undef V921 -#define V921 (V + 2912) - 0x3c9, 0x313, 0x300, 0x345, 0, -#undef V922 -#define V922 (V + 2917) - 0x3c9, 0x314, 0x300, 0x345, 0, -#undef V923 -#define V923 (V + 2922) - 0x3c9, 0x313, 0x301, 0x345, 0, -#undef V924 -#define V924 (V + 2927) - 0x3c9, 0x314, 0x301, 0x345, 0, -#undef V925 -#define V925 (V + 2932) - 0x3c9, 0x313, 0x342, 0x345, 0, -#undef V926 -#define V926 (V + 2937) - 0x3c9, 0x314, 0x342, 0x345, 0, -#undef V927 -#define V927 (V + 2942) - 0x3a9, 0x313, 0x345, 0, -#undef V928 -#define V928 (V + 2946) - 0x3a9, 0x314, 0x345, 0, -#undef V929 -#define V929 (V + 2950) - 0x3a9, 0x313, 0x300, 0x345, 0, -#undef V930 -#define V930 (V + 2955) - 0x3a9, 0x314, 0x300, 0x345, 0, -#undef V931 -#define V931 (V + 2960) - 0x3a9, 0x313, 0x301, 0x345, 0, -#undef V932 -#define V932 (V + 2965) - 0x3a9, 0x314, 0x301, 0x345, 0, -#undef V933 -#define V933 (V + 2970) - 0x3a9, 0x313, 0x342, 0x345, 0, -#undef V934 -#define V934 (V + 2975) - 0x3a9, 0x314, 0x342, 0x345, 0, -#undef V935 -#define V935 (V + 2980) - 0x3b1, 0x306, 0, -#undef V936 -#define V936 (V + 2983) - 0x3b1, 0x304, 0, -#undef V937 -#define V937 (V + 2986) - 0x3b1, 0x300, 0x345, 0, -#undef V938 -#define V938 (V + 2990) - 0x3b1, 0x345, 0, -#undef V939 -#define V939 (V + 2993) - 0x3b1, 0x301, 0x345, 0, -#undef V940 -#define V940 (V + 2997) - 0x3b1, 0x342, 0, -#undef V941 -#define V941 (V + 3000) - 0x3b1, 0x342, 0x345, 0, -#undef V942 -#define V942 (V + 3004) - 0x391, 0x306, 0, -#undef V943 -#define V943 (V + 3007) - 0x391, 0x304, 0, -#undef V944 -#define V944 (V + 3010) - 0x391, 0x300, 0, -#undef V945 -#define V945 (V + 3013) - 0x391, 0x345, 0, -#undef V946 -#define V946 (V + 3016) - 0x3b9, 0, -#undef V947 -#define V947 (V + 3018) - 0xa8, 0x342, 0, -#undef V948 -#define V948 (V + 3021) - 0x3b7, 0x300, 0x345, 0, -#undef V949 -#define V949 (V + 3025) - 0x3b7, 0x345, 0, -#undef V950 -#define V950 (V + 3028) - 0x3b7, 0x301, 0x345, 0, -#undef V951 -#define V951 (V + 3032) - 0x3b7, 0x342, 0, -#undef V952 -#define V952 (V + 3035) - 0x3b7, 0x342, 0x345, 0, -#undef V953 -#define V953 (V + 3039) - 0x395, 0x300, 0, -#undef V954 -#define V954 (V + 3042) - 0x397, 0x300, 0, -#undef V955 -#define V955 (V + 3045) - 0x397, 0x345, 0, -#undef V956 -#define V956 (V + 3048) - 0x1fbf, 0x300, 0, -#undef V957 -#define V957 (V + 3051) - 0x1fbf, 0x301, 0, -#undef V958 -#define V958 (V + 3054) - 0x1fbf, 0x342, 0, -#undef V959 -#define V959 (V + 3057) - 0x3b9, 0x306, 0, -#undef V960 -#define V960 (V + 3060) - 0x3b9, 0x304, 0, -#undef V961 -#define V961 (V + 3063) - 0x3b9, 0x308, 0x300, 0, -#undef V962 -#define V962 (V + 3067) - 0x3b9, 0x342, 0, -#undef V963 -#define V963 (V + 3070) - 0x3b9, 0x308, 0x342, 0, -#undef V964 -#define V964 (V + 3074) - 0x399, 0x306, 0, -#undef V965 -#define V965 (V + 3077) - 0x399, 0x304, 0, -#undef V966 -#define V966 (V + 3080) - 0x399, 0x300, 0, -#undef V967 -#define V967 (V + 3083) - 0x1ffe, 0x300, 0, -#undef V968 -#define V968 (V + 3086) - 0x1ffe, 0x301, 0, -#undef V969 -#define V969 (V + 3089) - 0x1ffe, 0x342, 0, -#undef V970 -#define V970 (V + 3092) - 0x3c5, 0x306, 0, -#undef V971 -#define V971 (V + 3095) - 0x3c5, 0x304, 0, -#undef V972 -#define V972 (V + 3098) - 0x3c5, 0x308, 0x300, 0, -#undef V973 -#define V973 (V + 3102) - 0x3c1, 0x313, 0, -#undef V974 -#define V974 (V + 3105) - 0x3c1, 0x314, 0, -#undef V975 -#define V975 (V + 3108) - 0x3c5, 0x342, 0, -#undef V976 -#define V976 (V + 3111) - 0x3c5, 0x308, 0x342, 0, -#undef V977 -#define V977 (V + 3115) - 0x3a5, 0x306, 0, -#undef V978 -#define V978 (V + 3118) - 0x3a5, 0x304, 0, -#undef V979 -#define V979 (V + 3121) - 0x3a5, 0x300, 0, -#undef V980 -#define V980 (V + 3124) - 0x3a1, 0x314, 0, -#undef V981 -#define V981 (V + 3127) - 0xa8, 0x300, 0, -#undef V982 -#define V982 (V + 3130) - 0x60, 0, -#undef V983 -#define V983 (V + 3132) - 0x3c9, 0x300, 0x345, 0, -#undef V984 -#define V984 (V + 3136) - 0x3c9, 0x345, 0, -#undef V985 -#define V985 (V + 3139) - 0x3c9, 0x301, 0x345, 0, -#undef V986 -#define V986 (V + 3143) - 0x3c9, 0x342, 0, -#undef V987 -#define V987 (V + 3146) - 0x3c9, 0x342, 0x345, 0, -#undef V988 -#define V988 (V + 3150) - 0x39f, 0x300, 0, -#undef V989 -#define V989 (V + 3153) - 0x3a9, 0x300, 0, -#undef V990 -#define V990 (V + 3156) - 0x3a9, 0x345, 0, -#undef V991 -#define V991 (V + 3159) - 0xb4, 0, -#undef V992 -#define V992 (V + 3161) - 0x2002, 0, -#undef V993 -#define V993 (V + 3163) - 0x2003, 0, -#undef V994 -#define V994 (V + 3165) - 0x3a9, 0, -#undef V995 -#define V995 (V + 3167) - 0x2190, 0x338, 0, -#undef V996 -#define V996 (V + 3170) - 0x2192, 0x338, 0, -#undef V997 -#define V997 (V + 3173) - 0x2194, 0x338, 0, -#undef V998 -#define V998 (V + 3176) - 0x21d0, 0x338, 0, -#undef V999 -#define V999 (V + 3179) - 0x21d4, 0x338, 0, -#undef V1000 -#define V1000 (V + 3182) - 0x21d2, 0x338, 0, -#undef V1001 -#define V1001 (V + 3185) - 0x2203, 0x338, 0, -#undef V1002 -#define V1002 (V + 3188) - 0x2208, 0x338, 0, -#undef V1003 -#define V1003 (V + 3191) - 0x220b, 0x338, 0, -#undef V1004 -#define V1004 (V + 3194) - 0x2223, 0x338, 0, -#undef V1005 -#define V1005 (V + 3197) - 0x2225, 0x338, 0, -#undef V1006 -#define V1006 (V + 3200) - 0x223c, 0x338, 0, -#undef V1007 -#define V1007 (V + 3203) - 0x2243, 0x338, 0, -#undef V1008 -#define V1008 (V + 3206) - 0x2245, 0x338, 0, -#undef V1009 -#define V1009 (V + 3209) - 0x2248, 0x338, 0, -#undef V1010 -#define V1010 (V + 3212) - 0x3d, 0x338, 0, -#undef V1011 -#define V1011 (V + 3215) - 0x2261, 0x338, 0, -#undef V1012 -#define V1012 (V + 3218) - 0x224d, 0x338, 0, -#undef V1013 -#define V1013 (V + 3221) - 0x3c, 0x338, 0, -#undef V1014 -#define V1014 (V + 3224) - 0x3e, 0x338, 0, -#undef V1015 -#define V1015 (V + 3227) - 0x2264, 0x338, 0, -#undef V1016 -#define V1016 (V + 3230) - 0x2265, 0x338, 0, -#undef V1017 -#define V1017 (V + 3233) - 0x2272, 0x338, 0, -#undef V1018 -#define V1018 (V + 3236) - 0x2273, 0x338, 0, -#undef V1019 -#define V1019 (V + 3239) - 0x2276, 0x338, 0, -#undef V1020 -#define V1020 (V + 3242) - 0x2277, 0x338, 0, -#undef V1021 -#define V1021 (V + 3245) - 0x227a, 0x338, 0, -#undef V1022 -#define V1022 (V + 3248) - 0x227b, 0x338, 0, -#undef V1023 -#define V1023 (V + 3251) - 0x2282, 0x338, 0, -#undef V1024 -#define V1024 (V + 3254) - 0x2283, 0x338, 0, -#undef V1025 -#define V1025 (V + 3257) - 0x2286, 0x338, 0, -#undef V1026 -#define V1026 (V + 3260) - 0x2287, 0x338, 0, -#undef V1027 -#define V1027 (V + 3263) - 0x22a2, 0x338, 0, -#undef V1028 -#define V1028 (V + 3266) - 0x22a8, 0x338, 0, -#undef V1029 -#define V1029 (V + 3269) - 0x22a9, 0x338, 0, -#undef V1030 -#define V1030 (V + 3272) - 0x22ab, 0x338, 0, -#undef V1031 -#define V1031 (V + 3275) - 0x227c, 0x338, 0, -#undef V1032 -#define V1032 (V + 3278) - 0x227d, 0x338, 0, -#undef V1033 -#define V1033 (V + 3281) - 0x2291, 0x338, 0, -#undef V1034 -#define V1034 (V + 3284) - 0x2292, 0x338, 0, -#undef V1035 -#define V1035 (V + 3287) - 0x22b2, 0x338, 0, -#undef V1036 -#define V1036 (V + 3290) - 0x22b3, 0x338, 0, -#undef V1037 -#define V1037 (V + 3293) - 0x22b4, 0x338, 0, -#undef V1038 -#define V1038 (V + 3296) - 0x22b5, 0x338, 0, -#undef V1039 -#define V1039 (V + 3299) - 0x3008, 0, -#undef V1040 -#define V1040 (V + 3301) - 0x3009, 0, -#undef V1041 -#define V1041 (V + 3303) - 0x2add, 0x338, 0, -#undef V1042 -#define V1042 (V + 3306) - 0x304b, 0x3099, 0, -#undef V1043 -#define V1043 (V + 3309) - 0x304d, 0x3099, 0, -#undef V1044 -#define V1044 (V + 3312) - 0x304f, 0x3099, 0, -#undef V1045 -#define V1045 (V + 3315) - 0x3051, 0x3099, 0, -#undef V1046 -#define V1046 (V + 3318) - 0x3053, 0x3099, 0, -#undef V1047 -#define V1047 (V + 3321) - 0x3055, 0x3099, 0, -#undef V1048 -#define V1048 (V + 3324) - 0x3057, 0x3099, 0, -#undef V1049 -#define V1049 (V + 3327) - 0x3059, 0x3099, 0, -#undef V1050 -#define V1050 (V + 3330) - 0x305b, 0x3099, 0, -#undef V1051 -#define V1051 (V + 3333) - 0x305d, 0x3099, 0, -#undef V1052 -#define V1052 (V + 3336) - 0x305f, 0x3099, 0, -#undef V1053 -#define V1053 (V + 3339) - 0x3061, 0x3099, 0, -#undef V1054 -#define V1054 (V + 3342) - 0x3064, 0x3099, 0, -#undef V1055 -#define V1055 (V + 3345) - 0x3066, 0x3099, 0, -#undef V1056 -#define V1056 (V + 3348) - 0x3068, 0x3099, 0, -#undef V1057 -#define V1057 (V + 3351) - 0x306f, 0x3099, 0, -#undef V1058 -#define V1058 (V + 3354) - 0x306f, 0x309a, 0, -#undef V1059 -#define V1059 (V + 3357) - 0x3072, 0x3099, 0, -#undef V1060 -#define V1060 (V + 3360) - 0x3072, 0x309a, 0, -#undef V1061 -#define V1061 (V + 3363) - 0x3075, 0x3099, 0, -#undef V1062 -#define V1062 (V + 3366) - 0x3075, 0x309a, 0, -#undef V1063 -#define V1063 (V + 3369) - 0x3078, 0x3099, 0, -#undef V1064 -#define V1064 (V + 3372) - 0x3078, 0x309a, 0, -#undef V1065 -#define V1065 (V + 3375) - 0x307b, 0x3099, 0, -#undef V1066 -#define V1066 (V + 3378) - 0x307b, 0x309a, 0, -#undef V1067 -#define V1067 (V + 3381) - 0x3046, 0x3099, 0, -#undef V1068 -#define V1068 (V + 3384) - 0x309d, 0x3099, 0, -#undef V1069 -#define V1069 (V + 3387) - 0x30ab, 0x3099, 0, -#undef V1070 -#define V1070 (V + 3390) - 0x30ad, 0x3099, 0, -#undef V1071 -#define V1071 (V + 3393) - 0x30af, 0x3099, 0, -#undef V1072 -#define V1072 (V + 3396) - 0x30b1, 0x3099, 0, -#undef V1073 -#define V1073 (V + 3399) - 0x30b3, 0x3099, 0, -#undef V1074 -#define V1074 (V + 3402) - 0x30b5, 0x3099, 0, -#undef V1075 -#define V1075 (V + 3405) - 0x30b7, 0x3099, 0, -#undef V1076 -#define V1076 (V + 3408) - 0x30b9, 0x3099, 0, -#undef V1077 -#define V1077 (V + 3411) - 0x30bb, 0x3099, 0, -#undef V1078 -#define V1078 (V + 3414) - 0x30bd, 0x3099, 0, -#undef V1079 -#define V1079 (V + 3417) - 0x30bf, 0x3099, 0, -#undef V1080 -#define V1080 (V + 3420) - 0x30c1, 0x3099, 0, -#undef V1081 -#define V1081 (V + 3423) - 0x30c4, 0x3099, 0, -#undef V1082 -#define V1082 (V + 3426) - 0x30c6, 0x3099, 0, -#undef V1083 -#define V1083 (V + 3429) - 0x30c8, 0x3099, 0, -#undef V1084 -#define V1084 (V + 3432) - 0x30cf, 0x3099, 0, -#undef V1085 -#define V1085 (V + 3435) - 0x30cf, 0x309a, 0, -#undef V1086 -#define V1086 (V + 3438) - 0x30d2, 0x3099, 0, -#undef V1087 -#define V1087 (V + 3441) - 0x30d2, 0x309a, 0, -#undef V1088 -#define V1088 (V + 3444) - 0x30d5, 0x3099, 0, -#undef V1089 -#define V1089 (V + 3447) - 0x30d5, 0x309a, 0, -#undef V1090 -#define V1090 (V + 3450) - 0x30d8, 0x3099, 0, -#undef V1091 -#define V1091 (V + 3453) - 0x30d8, 0x309a, 0, -#undef V1092 -#define V1092 (V + 3456) - 0x30db, 0x3099, 0, -#undef V1093 -#define V1093 (V + 3459) - 0x30db, 0x309a, 0, -#undef V1094 -#define V1094 (V + 3462) - 0x30a6, 0x3099, 0, -#undef V1095 -#define V1095 (V + 3465) - 0x30ef, 0x3099, 0, -#undef V1096 -#define V1096 (V + 3468) - 0x30f0, 0x3099, 0, -#undef V1097 -#define V1097 (V + 3471) - 0x30f1, 0x3099, 0, -#undef V1098 -#define V1098 (V + 3474) - 0x30f2, 0x3099, 0, -#undef V1099 -#define V1099 (V + 3477) - 0x30fd, 0x3099, 0, -#undef V1100 -#define V1100 (V + 3480) - 0x1100, 0x1161, 0, -#undef V1101 -#define V1101 (V + 3483) - 0x1100, 0x1161, 0x11a8, 0, -#undef V1102 -#define V1102 (V + 3487) - 0x1100, 0x1161, 0x11a9, 0, -#undef V1103 -#define V1103 (V + 3491) - 0x1100, 0x1161, 0x11aa, 0, -#undef V1104 -#define V1104 (V + 3495) - 0x1100, 0x1161, 0x11ab, 0, -#undef V1105 -#define V1105 (V + 3499) - 0x1100, 0x1161, 0x11ac, 0, -#undef V1106 -#define V1106 (V + 3503) - 0x1100, 0x1161, 0x11ad, 0, -#undef V1107 -#define V1107 (V + 3507) - 0x1100, 0x1161, 0x11ae, 0, -#undef V1108 -#define V1108 (V + 3511) - 0x1100, 0x1161, 0x11af, 0, -#undef V1109 -#define V1109 (V + 3515) - 0x1100, 0x1161, 0x11b0, 0, -#undef V1110 -#define V1110 (V + 3519) - 0x1100, 0x1161, 0x11b1, 0, -#undef V1111 -#define V1111 (V + 3523) - 0x1100, 0x1161, 0x11b2, 0, -#undef V1112 -#define V1112 (V + 3527) - 0x1100, 0x1161, 0x11b3, 0, -#undef V1113 -#define V1113 (V + 3531) - 0x1100, 0x1161, 0x11b4, 0, -#undef V1114 -#define V1114 (V + 3535) - 0x1100, 0x1161, 0x11b5, 0, -#undef V1115 -#define V1115 (V + 3539) - 0x1100, 0x1161, 0x11b6, 0, -#undef V1116 -#define V1116 (V + 3543) - 0x1100, 0x1161, 0x11b7, 0, -#undef V1117 -#define V1117 (V + 3547) - 0x1100, 0x1161, 0x11b8, 0, -#undef V1118 -#define V1118 (V + 3551) - 0x1100, 0x1161, 0x11b9, 0, -#undef V1119 -#define V1119 (V + 3555) - 0x1100, 0x1161, 0x11ba, 0, -#undef V1120 -#define V1120 (V + 3559) - 0x1100, 0x1161, 0x11bb, 0, -#undef V1121 -#define V1121 (V + 3563) - 0x1100, 0x1161, 0x11bc, 0, -#undef V1122 -#define V1122 (V + 3567) - 0x1100, 0x1161, 0x11bd, 0, -#undef V1123 -#define V1123 (V + 3571) - 0x1100, 0x1161, 0x11be, 0, -#undef V1124 -#define V1124 (V + 3575) - 0x1100, 0x1161, 0x11bf, 0, -#undef V1125 -#define V1125 (V + 3579) - 0x1100, 0x1161, 0x11c0, 0, -#undef V1126 -#define V1126 (V + 3583) - 0x1100, 0x1161, 0x11c1, 0, -#undef V1127 -#define V1127 (V + 3587) - 0x1100, 0x1161, 0x11c2, 0, -#undef V1128 -#define V1128 (V + 3591) - 0x1100, 0x1162, 0, -#undef V1129 -#define V1129 (V + 3594) - 0x1100, 0x1162, 0x11a8, 0, -#undef V1130 -#define V1130 (V + 3598) - 0x1100, 0x1162, 0x11a9, 0, -#undef V1131 -#define V1131 (V + 3602) - 0x1100, 0x1162, 0x11aa, 0, -#undef V1132 -#define V1132 (V + 3606) - 0x1100, 0x1162, 0x11ab, 0, -#undef V1133 -#define V1133 (V + 3610) - 0x1100, 0x1162, 0x11ac, 0, -#undef V1134 -#define V1134 (V + 3614) - 0x1100, 0x1162, 0x11ad, 0, -#undef V1135 -#define V1135 (V + 3618) - 0x1100, 0x1162, 0x11ae, 0, -#undef V1136 -#define V1136 (V + 3622) - 0x1100, 0x1162, 0x11af, 0, -#undef V1137 -#define V1137 (V + 3626) - 0x1100, 0x1162, 0x11b0, 0, -#undef V1138 -#define V1138 (V + 3630) - 0x1100, 0x1162, 0x11b1, 0, -#undef V1139 -#define V1139 (V + 3634) - 0x1100, 0x1162, 0x11b2, 0, -#undef V1140 -#define V1140 (V + 3638) - 0x1100, 0x1162, 0x11b3, 0, -#undef V1141 -#define V1141 (V + 3642) - 0x1100, 0x1162, 0x11b4, 0, -#undef V1142 -#define V1142 (V + 3646) - 0x1100, 0x1162, 0x11b5, 0, -#undef V1143 -#define V1143 (V + 3650) - 0x1100, 0x1162, 0x11b6, 0, -#undef V1144 -#define V1144 (V + 3654) - 0x1100, 0x1162, 0x11b7, 0, -#undef V1145 -#define V1145 (V + 3658) - 0x1100, 0x1162, 0x11b8, 0, -#undef V1146 -#define V1146 (V + 3662) - 0x1100, 0x1162, 0x11b9, 0, -#undef V1147 -#define V1147 (V + 3666) - 0x1100, 0x1162, 0x11ba, 0, -#undef V1148 -#define V1148 (V + 3670) - 0x1100, 0x1162, 0x11bb, 0, -#undef V1149 -#define V1149 (V + 3674) - 0x1100, 0x1162, 0x11bc, 0, -#undef V1150 -#define V1150 (V + 3678) - 0x1100, 0x1162, 0x11bd, 0, -#undef V1151 -#define V1151 (V + 3682) - 0x1100, 0x1162, 0x11be, 0, -#undef V1152 -#define V1152 (V + 3686) - 0x1100, 0x1162, 0x11bf, 0, -#undef V1153 -#define V1153 (V + 3690) - 0x1100, 0x1162, 0x11c0, 0, -#undef V1154 -#define V1154 (V + 3694) - 0x1100, 0x1162, 0x11c1, 0, -#undef V1155 -#define V1155 (V + 3698) - 0x1100, 0x1162, 0x11c2, 0, -#undef V1156 -#define V1156 (V + 3702) - 0x1100, 0x1163, 0, -#undef V1157 -#define V1157 (V + 3705) - 0x1100, 0x1163, 0x11a8, 0, -#undef V1158 -#define V1158 (V + 3709) - 0x1100, 0x1163, 0x11a9, 0, -#undef V1159 -#define V1159 (V + 3713) - 0x1100, 0x1163, 0x11aa, 0, -#undef V1160 -#define V1160 (V + 3717) - 0x1100, 0x1163, 0x11ab, 0, -#undef V1161 -#define V1161 (V + 3721) - 0x1100, 0x1163, 0x11ac, 0, -#undef V1162 -#define V1162 (V + 3725) - 0x1100, 0x1163, 0x11ad, 0, -#undef V1163 -#define V1163 (V + 3729) - 0x1100, 0x1163, 0x11ae, 0, -#undef V1164 -#define V1164 (V + 3733) - 0x1100, 0x1163, 0x11af, 0, -#undef V1165 -#define V1165 (V + 3737) - 0x1100, 0x1163, 0x11b0, 0, -#undef V1166 -#define V1166 (V + 3741) - 0x1100, 0x1163, 0x11b1, 0, -#undef V1167 -#define V1167 (V + 3745) - 0x1100, 0x1163, 0x11b2, 0, -#undef V1168 -#define V1168 (V + 3749) - 0x1100, 0x1163, 0x11b3, 0, -#undef V1169 -#define V1169 (V + 3753) - 0x1100, 0x1163, 0x11b4, 0, -#undef V1170 -#define V1170 (V + 3757) - 0x1100, 0x1163, 0x11b5, 0, -#undef V1171 -#define V1171 (V + 3761) - 0x1100, 0x1163, 0x11b6, 0, -#undef V1172 -#define V1172 (V + 3765) - 0x1100, 0x1163, 0x11b7, 0, -#undef V1173 -#define V1173 (V + 3769) - 0x1100, 0x1163, 0x11b8, 0, -#undef V1174 -#define V1174 (V + 3773) - 0x1100, 0x1163, 0x11b9, 0, -#undef V1175 -#define V1175 (V + 3777) - 0x1100, 0x1163, 0x11ba, 0, -#undef V1176 -#define V1176 (V + 3781) - 0x1100, 0x1163, 0x11bb, 0, -#undef V1177 -#define V1177 (V + 3785) - 0x1100, 0x1163, 0x11bc, 0, -#undef V1178 -#define V1178 (V + 3789) - 0x1100, 0x1163, 0x11bd, 0, -#undef V1179 -#define V1179 (V + 3793) - 0x1100, 0x1163, 0x11be, 0, -#undef V1180 -#define V1180 (V + 3797) - 0x1100, 0x1163, 0x11bf, 0, -#undef V1181 -#define V1181 (V + 3801) - 0x1100, 0x1163, 0x11c0, 0, -#undef V1182 -#define V1182 (V + 3805) - 0x1100, 0x1163, 0x11c1, 0, -#undef V1183 -#define V1183 (V + 3809) - 0x1100, 0x1163, 0x11c2, 0, -#undef V1184 -#define V1184 (V + 3813) - 0x1100, 0x1164, 0, -#undef V1185 -#define V1185 (V + 3816) - 0x1100, 0x1164, 0x11a8, 0, -#undef V1186 -#define V1186 (V + 3820) - 0x1100, 0x1164, 0x11a9, 0, -#undef V1187 -#define V1187 (V + 3824) - 0x1100, 0x1164, 0x11aa, 0, -#undef V1188 -#define V1188 (V + 3828) - 0x1100, 0x1164, 0x11ab, 0, -#undef V1189 -#define V1189 (V + 3832) - 0x1100, 0x1164, 0x11ac, 0, -#undef V1190 -#define V1190 (V + 3836) - 0x1100, 0x1164, 0x11ad, 0, -#undef V1191 -#define V1191 (V + 3840) - 0x1100, 0x1164, 0x11ae, 0, -#undef V1192 -#define V1192 (V + 3844) - 0x1100, 0x1164, 0x11af, 0, -#undef V1193 -#define V1193 (V + 3848) - 0x1100, 0x1164, 0x11b0, 0, -#undef V1194 -#define V1194 (V + 3852) - 0x1100, 0x1164, 0x11b1, 0, -#undef V1195 -#define V1195 (V + 3856) - 0x1100, 0x1164, 0x11b2, 0, -#undef V1196 -#define V1196 (V + 3860) - 0x1100, 0x1164, 0x11b3, 0, -#undef V1197 -#define V1197 (V + 3864) - 0x1100, 0x1164, 0x11b4, 0, -#undef V1198 -#define V1198 (V + 3868) - 0x1100, 0x1164, 0x11b5, 0, -#undef V1199 -#define V1199 (V + 3872) - 0x1100, 0x1164, 0x11b6, 0, -#undef V1200 -#define V1200 (V + 3876) - 0x1100, 0x1164, 0x11b7, 0, -#undef V1201 -#define V1201 (V + 3880) - 0x1100, 0x1164, 0x11b8, 0, -#undef V1202 -#define V1202 (V + 3884) - 0x1100, 0x1164, 0x11b9, 0, -#undef V1203 -#define V1203 (V + 3888) - 0x1100, 0x1164, 0x11ba, 0, -#undef V1204 -#define V1204 (V + 3892) - 0x1100, 0x1164, 0x11bb, 0, -#undef V1205 -#define V1205 (V + 3896) - 0x1100, 0x1164, 0x11bc, 0, -#undef V1206 -#define V1206 (V + 3900) - 0x1100, 0x1164, 0x11bd, 0, -#undef V1207 -#define V1207 (V + 3904) - 0x1100, 0x1164, 0x11be, 0, -#undef V1208 -#define V1208 (V + 3908) - 0x1100, 0x1164, 0x11bf, 0, -#undef V1209 -#define V1209 (V + 3912) - 0x1100, 0x1164, 0x11c0, 0, -#undef V1210 -#define V1210 (V + 3916) - 0x1100, 0x1164, 0x11c1, 0, -#undef V1211 -#define V1211 (V + 3920) - 0x1100, 0x1164, 0x11c2, 0, -#undef V1212 -#define V1212 (V + 3924) - 0x1100, 0x1165, 0, -#undef V1213 -#define V1213 (V + 3927) - 0x1100, 0x1165, 0x11a8, 0, -#undef V1214 -#define V1214 (V + 3931) - 0x1100, 0x1165, 0x11a9, 0, -#undef V1215 -#define V1215 (V + 3935) - 0x1100, 0x1165, 0x11aa, 0, -#undef V1216 -#define V1216 (V + 3939) - 0x1100, 0x1165, 0x11ab, 0, -#undef V1217 -#define V1217 (V + 3943) - 0x1100, 0x1165, 0x11ac, 0, -#undef V1218 -#define V1218 (V + 3947) - 0x1100, 0x1165, 0x11ad, 0, -#undef V1219 -#define V1219 (V + 3951) - 0x1100, 0x1165, 0x11ae, 0, -#undef V1220 -#define V1220 (V + 3955) - 0x1100, 0x1165, 0x11af, 0, -#undef V1221 -#define V1221 (V + 3959) - 0x1100, 0x1165, 0x11b0, 0, -#undef V1222 -#define V1222 (V + 3963) - 0x1100, 0x1165, 0x11b1, 0, -#undef V1223 -#define V1223 (V + 3967) - 0x1100, 0x1165, 0x11b2, 0, -#undef V1224 -#define V1224 (V + 3971) - 0x1100, 0x1165, 0x11b3, 0, -#undef V1225 -#define V1225 (V + 3975) - 0x1100, 0x1165, 0x11b4, 0, -#undef V1226 -#define V1226 (V + 3979) - 0x1100, 0x1165, 0x11b5, 0, -#undef V1227 -#define V1227 (V + 3983) - 0x1100, 0x1165, 0x11b6, 0, -#undef V1228 -#define V1228 (V + 3987) - 0x1100, 0x1165, 0x11b7, 0, -#undef V1229 -#define V1229 (V + 3991) - 0x1100, 0x1165, 0x11b8, 0, -#undef V1230 -#define V1230 (V + 3995) - 0x1100, 0x1165, 0x11b9, 0, -#undef V1231 -#define V1231 (V + 3999) - 0x1100, 0x1165, 0x11ba, 0, -#undef V1232 -#define V1232 (V + 4003) - 0x1100, 0x1165, 0x11bb, 0, -#undef V1233 -#define V1233 (V + 4007) - 0x1100, 0x1165, 0x11bc, 0, -#undef V1234 -#define V1234 (V + 4011) - 0x1100, 0x1165, 0x11bd, 0, -#undef V1235 -#define V1235 (V + 4015) - 0x1100, 0x1165, 0x11be, 0, -#undef V1236 -#define V1236 (V + 4019) - 0x1100, 0x1165, 0x11bf, 0, -#undef V1237 -#define V1237 (V + 4023) - 0x1100, 0x1165, 0x11c0, 0, -#undef V1238 -#define V1238 (V + 4027) - 0x1100, 0x1165, 0x11c1, 0, -#undef V1239 -#define V1239 (V + 4031) - 0x1100, 0x1165, 0x11c2, 0, -#undef V1240 -#define V1240 (V + 4035) - 0x1100, 0x1166, 0, -#undef V1241 -#define V1241 (V + 4038) - 0x1100, 0x1166, 0x11a8, 0, -#undef V1242 -#define V1242 (V + 4042) - 0x1100, 0x1166, 0x11a9, 0, -#undef V1243 -#define V1243 (V + 4046) - 0x1100, 0x1166, 0x11aa, 0, -#undef V1244 -#define V1244 (V + 4050) - 0x1100, 0x1166, 0x11ab, 0, -#undef V1245 -#define V1245 (V + 4054) - 0x1100, 0x1166, 0x11ac, 0, -#undef V1246 -#define V1246 (V + 4058) - 0x1100, 0x1166, 0x11ad, 0, -#undef V1247 -#define V1247 (V + 4062) - 0x1100, 0x1166, 0x11ae, 0, -#undef V1248 -#define V1248 (V + 4066) - 0x1100, 0x1166, 0x11af, 0, -#undef V1249 -#define V1249 (V + 4070) - 0x1100, 0x1166, 0x11b0, 0, -#undef V1250 -#define V1250 (V + 4074) - 0x1100, 0x1166, 0x11b1, 0, -#undef V1251 -#define V1251 (V + 4078) - 0x1100, 0x1166, 0x11b2, 0, -#undef V1252 -#define V1252 (V + 4082) - 0x1100, 0x1166, 0x11b3, 0, -#undef V1253 -#define V1253 (V + 4086) - 0x1100, 0x1166, 0x11b4, 0, -#undef V1254 -#define V1254 (V + 4090) - 0x1100, 0x1166, 0x11b5, 0, -#undef V1255 -#define V1255 (V + 4094) - 0x1100, 0x1166, 0x11b6, 0, -#undef V1256 -#define V1256 (V + 4098) - 0x1100, 0x1166, 0x11b7, 0, -#undef V1257 -#define V1257 (V + 4102) - 0x1100, 0x1166, 0x11b8, 0, -#undef V1258 -#define V1258 (V + 4106) - 0x1100, 0x1166, 0x11b9, 0, -#undef V1259 -#define V1259 (V + 4110) - 0x1100, 0x1166, 0x11ba, 0, -#undef V1260 -#define V1260 (V + 4114) - 0x1100, 0x1166, 0x11bb, 0, -#undef V1261 -#define V1261 (V + 4118) - 0x1100, 0x1166, 0x11bc, 0, -#undef V1262 -#define V1262 (V + 4122) - 0x1100, 0x1166, 0x11bd, 0, -#undef V1263 -#define V1263 (V + 4126) - 0x1100, 0x1166, 0x11be, 0, -#undef V1264 -#define V1264 (V + 4130) - 0x1100, 0x1166, 0x11bf, 0, -#undef V1265 -#define V1265 (V + 4134) - 0x1100, 0x1166, 0x11c0, 0, -#undef V1266 -#define V1266 (V + 4138) - 0x1100, 0x1166, 0x11c1, 0, -#undef V1267 -#define V1267 (V + 4142) - 0x1100, 0x1166, 0x11c2, 0, -#undef V1268 -#define V1268 (V + 4146) - 0x1100, 0x1167, 0, -#undef V1269 -#define V1269 (V + 4149) - 0x1100, 0x1167, 0x11a8, 0, -#undef V1270 -#define V1270 (V + 4153) - 0x1100, 0x1167, 0x11a9, 0, -#undef V1271 -#define V1271 (V + 4157) - 0x1100, 0x1167, 0x11aa, 0, -#undef V1272 -#define V1272 (V + 4161) - 0x1100, 0x1167, 0x11ab, 0, -#undef V1273 -#define V1273 (V + 4165) - 0x1100, 0x1167, 0x11ac, 0, -#undef V1274 -#define V1274 (V + 4169) - 0x1100, 0x1167, 0x11ad, 0, -#undef V1275 -#define V1275 (V + 4173) - 0x1100, 0x1167, 0x11ae, 0, -#undef V1276 -#define V1276 (V + 4177) - 0x1100, 0x1167, 0x11af, 0, -#undef V1277 -#define V1277 (V + 4181) - 0x1100, 0x1167, 0x11b0, 0, -#undef V1278 -#define V1278 (V + 4185) - 0x1100, 0x1167, 0x11b1, 0, -#undef V1279 -#define V1279 (V + 4189) - 0x1100, 0x1167, 0x11b2, 0, -#undef V1280 -#define V1280 (V + 4193) - 0x1100, 0x1167, 0x11b3, 0, -#undef V1281 -#define V1281 (V + 4197) - 0x1100, 0x1167, 0x11b4, 0, -#undef V1282 -#define V1282 (V + 4201) - 0x1100, 0x1167, 0x11b5, 0, -#undef V1283 -#define V1283 (V + 4205) - 0x1100, 0x1167, 0x11b6, 0, -#undef V1284 -#define V1284 (V + 4209) - 0x1100, 0x1167, 0x11b7, 0, -#undef V1285 -#define V1285 (V + 4213) - 0x1100, 0x1167, 0x11b8, 0, -#undef V1286 -#define V1286 (V + 4217) - 0x1100, 0x1167, 0x11b9, 0, -#undef V1287 -#define V1287 (V + 4221) - 0x1100, 0x1167, 0x11ba, 0, -#undef V1288 -#define V1288 (V + 4225) - 0x1100, 0x1167, 0x11bb, 0, -#undef V1289 -#define V1289 (V + 4229) - 0x1100, 0x1167, 0x11bc, 0, -#undef V1290 -#define V1290 (V + 4233) - 0x1100, 0x1167, 0x11bd, 0, -#undef V1291 -#define V1291 (V + 4237) - 0x1100, 0x1167, 0x11be, 0, -#undef V1292 -#define V1292 (V + 4241) - 0x1100, 0x1167, 0x11bf, 0, -#undef V1293 -#define V1293 (V + 4245) - 0x1100, 0x1167, 0x11c0, 0, -#undef V1294 -#define V1294 (V + 4249) - 0x1100, 0x1167, 0x11c1, 0, -#undef V1295 -#define V1295 (V + 4253) - 0x1100, 0x1167, 0x11c2, 0, -#undef V1296 -#define V1296 (V + 4257) - 0x1100, 0x1168, 0, -#undef V1297 -#define V1297 (V + 4260) - 0x1100, 0x1168, 0x11a8, 0, -#undef V1298 -#define V1298 (V + 4264) - 0x1100, 0x1168, 0x11a9, 0, -#undef V1299 -#define V1299 (V + 4268) - 0x1100, 0x1168, 0x11aa, 0, -#undef V1300 -#define V1300 (V + 4272) - 0x1100, 0x1168, 0x11ab, 0, -#undef V1301 -#define V1301 (V + 4276) - 0x1100, 0x1168, 0x11ac, 0, -#undef V1302 -#define V1302 (V + 4280) - 0x1100, 0x1168, 0x11ad, 0, -#undef V1303 -#define V1303 (V + 4284) - 0x1100, 0x1168, 0x11ae, 0, -#undef V1304 -#define V1304 (V + 4288) - 0x1100, 0x1168, 0x11af, 0, -#undef V1305 -#define V1305 (V + 4292) - 0x1100, 0x1168, 0x11b0, 0, -#undef V1306 -#define V1306 (V + 4296) - 0x1100, 0x1168, 0x11b1, 0, -#undef V1307 -#define V1307 (V + 4300) - 0x1100, 0x1168, 0x11b2, 0, -#undef V1308 -#define V1308 (V + 4304) - 0x1100, 0x1168, 0x11b3, 0, -#undef V1309 -#define V1309 (V + 4308) - 0x1100, 0x1168, 0x11b4, 0, -#undef V1310 -#define V1310 (V + 4312) - 0x1100, 0x1168, 0x11b5, 0, -#undef V1311 -#define V1311 (V + 4316) - 0x1100, 0x1168, 0x11b6, 0, -#undef V1312 -#define V1312 (V + 4320) - 0x1100, 0x1168, 0x11b7, 0, -#undef V1313 -#define V1313 (V + 4324) - 0x1100, 0x1168, 0x11b8, 0, -#undef V1314 -#define V1314 (V + 4328) - 0x1100, 0x1168, 0x11b9, 0, -#undef V1315 -#define V1315 (V + 4332) - 0x1100, 0x1168, 0x11ba, 0, -#undef V1316 -#define V1316 (V + 4336) - 0x1100, 0x1168, 0x11bb, 0, -#undef V1317 -#define V1317 (V + 4340) - 0x1100, 0x1168, 0x11bc, 0, -#undef V1318 -#define V1318 (V + 4344) - 0x1100, 0x1168, 0x11bd, 0, -#undef V1319 -#define V1319 (V + 4348) - 0x1100, 0x1168, 0x11be, 0, -#undef V1320 -#define V1320 (V + 4352) - 0x1100, 0x1168, 0x11bf, 0, -#undef V1321 -#define V1321 (V + 4356) - 0x1100, 0x1168, 0x11c0, 0, -#undef V1322 -#define V1322 (V + 4360) - 0x1100, 0x1168, 0x11c1, 0, -#undef V1323 -#define V1323 (V + 4364) - 0x1100, 0x1168, 0x11c2, 0, -#undef V1324 -#define V1324 (V + 4368) - 0x1100, 0x1169, 0, -#undef V1325 -#define V1325 (V + 4371) - 0x1100, 0x1169, 0x11a8, 0, -#undef V1326 -#define V1326 (V + 4375) - 0x1100, 0x1169, 0x11a9, 0, -#undef V1327 -#define V1327 (V + 4379) - 0x1100, 0x1169, 0x11aa, 0, -#undef V1328 -#define V1328 (V + 4383) - 0x1100, 0x1169, 0x11ab, 0, -#undef V1329 -#define V1329 (V + 4387) - 0x1100, 0x1169, 0x11ac, 0, -#undef V1330 -#define V1330 (V + 4391) - 0x1100, 0x1169, 0x11ad, 0, -#undef V1331 -#define V1331 (V + 4395) - 0x1100, 0x1169, 0x11ae, 0, -#undef V1332 -#define V1332 (V + 4399) - 0x1100, 0x1169, 0x11af, 0, -#undef V1333 -#define V1333 (V + 4403) - 0x1100, 0x1169, 0x11b0, 0, -#undef V1334 -#define V1334 (V + 4407) - 0x1100, 0x1169, 0x11b1, 0, -#undef V1335 -#define V1335 (V + 4411) - 0x1100, 0x1169, 0x11b2, 0, -#undef V1336 -#define V1336 (V + 4415) - 0x1100, 0x1169, 0x11b3, 0, -#undef V1337 -#define V1337 (V + 4419) - 0x1100, 0x1169, 0x11b4, 0, -#undef V1338 -#define V1338 (V + 4423) - 0x1100, 0x1169, 0x11b5, 0, -#undef V1339 -#define V1339 (V + 4427) - 0x1100, 0x1169, 0x11b6, 0, -#undef V1340 -#define V1340 (V + 4431) - 0x1100, 0x1169, 0x11b7, 0, -#undef V1341 -#define V1341 (V + 4435) - 0x1100, 0x1169, 0x11b8, 0, -#undef V1342 -#define V1342 (V + 4439) - 0x1100, 0x1169, 0x11b9, 0, -#undef V1343 -#define V1343 (V + 4443) - 0x1100, 0x1169, 0x11ba, 0, -#undef V1344 -#define V1344 (V + 4447) - 0x1100, 0x1169, 0x11bb, 0, -#undef V1345 -#define V1345 (V + 4451) - 0x1100, 0x1169, 0x11bc, 0, -#undef V1346 -#define V1346 (V + 4455) - 0x1100, 0x1169, 0x11bd, 0, -#undef V1347 -#define V1347 (V + 4459) - 0x1100, 0x1169, 0x11be, 0, -#undef V1348 -#define V1348 (V + 4463) - 0x1100, 0x1169, 0x11bf, 0, -#undef V1349 -#define V1349 (V + 4467) - 0x1100, 0x1169, 0x11c0, 0, -#undef V1350 -#define V1350 (V + 4471) - 0x1100, 0x1169, 0x11c1, 0, -#undef V1351 -#define V1351 (V + 4475) - 0x1100, 0x1169, 0x11c2, 0, -#undef V1352 -#define V1352 (V + 4479) - 0x1100, 0x116a, 0, -#undef V1353 -#define V1353 (V + 4482) - 0x1100, 0x116a, 0x11a8, 0, -#undef V1354 -#define V1354 (V + 4486) - 0x1100, 0x116a, 0x11a9, 0, -#undef V1355 -#define V1355 (V + 4490) - 0x1100, 0x116a, 0x11aa, 0, -#undef V1356 -#define V1356 (V + 4494) - 0x1100, 0x116a, 0x11ab, 0, -#undef V1357 -#define V1357 (V + 4498) - 0x1100, 0x116a, 0x11ac, 0, -#undef V1358 -#define V1358 (V + 4502) - 0x1100, 0x116a, 0x11ad, 0, -#undef V1359 -#define V1359 (V + 4506) - 0x1100, 0x116a, 0x11ae, 0, -#undef V1360 -#define V1360 (V + 4510) - 0x1100, 0x116a, 0x11af, 0, -#undef V1361 -#define V1361 (V + 4514) - 0x1100, 0x116a, 0x11b0, 0, -#undef V1362 -#define V1362 (V + 4518) - 0x1100, 0x116a, 0x11b1, 0, -#undef V1363 -#define V1363 (V + 4522) - 0x1100, 0x116a, 0x11b2, 0, -#undef V1364 -#define V1364 (V + 4526) - 0x1100, 0x116a, 0x11b3, 0, -#undef V1365 -#define V1365 (V + 4530) - 0x1100, 0x116a, 0x11b4, 0, -#undef V1366 -#define V1366 (V + 4534) - 0x1100, 0x116a, 0x11b5, 0, -#undef V1367 -#define V1367 (V + 4538) - 0x1100, 0x116a, 0x11b6, 0, -#undef V1368 -#define V1368 (V + 4542) - 0x1100, 0x116a, 0x11b7, 0, -#undef V1369 -#define V1369 (V + 4546) - 0x1100, 0x116a, 0x11b8, 0, -#undef V1370 -#define V1370 (V + 4550) - 0x1100, 0x116a, 0x11b9, 0, -#undef V1371 -#define V1371 (V + 4554) - 0x1100, 0x116a, 0x11ba, 0, -#undef V1372 -#define V1372 (V + 4558) - 0x1100, 0x116a, 0x11bb, 0, -#undef V1373 -#define V1373 (V + 4562) - 0x1100, 0x116a, 0x11bc, 0, -#undef V1374 -#define V1374 (V + 4566) - 0x1100, 0x116a, 0x11bd, 0, -#undef V1375 -#define V1375 (V + 4570) - 0x1100, 0x116a, 0x11be, 0, -#undef V1376 -#define V1376 (V + 4574) - 0x1100, 0x116a, 0x11bf, 0, -#undef V1377 -#define V1377 (V + 4578) - 0x1100, 0x116a, 0x11c0, 0, -#undef V1378 -#define V1378 (V + 4582) - 0x1100, 0x116a, 0x11c1, 0, -#undef V1379 -#define V1379 (V + 4586) - 0x1100, 0x116a, 0x11c2, 0, -#undef V1380 -#define V1380 (V + 4590) - 0x1100, 0x116b, 0, -#undef V1381 -#define V1381 (V + 4593) - 0x1100, 0x116b, 0x11a8, 0, -#undef V1382 -#define V1382 (V + 4597) - 0x1100, 0x116b, 0x11a9, 0, -#undef V1383 -#define V1383 (V + 4601) - 0x1100, 0x116b, 0x11aa, 0, -#undef V1384 -#define V1384 (V + 4605) - 0x1100, 0x116b, 0x11ab, 0, -#undef V1385 -#define V1385 (V + 4609) - 0x1100, 0x116b, 0x11ac, 0, -#undef V1386 -#define V1386 (V + 4613) - 0x1100, 0x116b, 0x11ad, 0, -#undef V1387 -#define V1387 (V + 4617) - 0x1100, 0x116b, 0x11ae, 0, -#undef V1388 -#define V1388 (V + 4621) - 0x1100, 0x116b, 0x11af, 0, -#undef V1389 -#define V1389 (V + 4625) - 0x1100, 0x116b, 0x11b0, 0, -#undef V1390 -#define V1390 (V + 4629) - 0x1100, 0x116b, 0x11b1, 0, -#undef V1391 -#define V1391 (V + 4633) - 0x1100, 0x116b, 0x11b2, 0, -#undef V1392 -#define V1392 (V + 4637) - 0x1100, 0x116b, 0x11b3, 0, -#undef V1393 -#define V1393 (V + 4641) - 0x1100, 0x116b, 0x11b4, 0, -#undef V1394 -#define V1394 (V + 4645) - 0x1100, 0x116b, 0x11b5, 0, -#undef V1395 -#define V1395 (V + 4649) - 0x1100, 0x116b, 0x11b6, 0, -#undef V1396 -#define V1396 (V + 4653) - 0x1100, 0x116b, 0x11b7, 0, -#undef V1397 -#define V1397 (V + 4657) - 0x1100, 0x116b, 0x11b8, 0, -#undef V1398 -#define V1398 (V + 4661) - 0x1100, 0x116b, 0x11b9, 0, -#undef V1399 -#define V1399 (V + 4665) - 0x1100, 0x116b, 0x11ba, 0, -#undef V1400 -#define V1400 (V + 4669) - 0x1100, 0x116b, 0x11bb, 0, -#undef V1401 -#define V1401 (V + 4673) - 0x1100, 0x116b, 0x11bc, 0, -#undef V1402 -#define V1402 (V + 4677) - 0x1100, 0x116b, 0x11bd, 0, -#undef V1403 -#define V1403 (V + 4681) - 0x1100, 0x116b, 0x11be, 0, -#undef V1404 -#define V1404 (V + 4685) - 0x1100, 0x116b, 0x11bf, 0, -#undef V1405 -#define V1405 (V + 4689) - 0x1100, 0x116b, 0x11c0, 0, -#undef V1406 -#define V1406 (V + 4693) - 0x1100, 0x116b, 0x11c1, 0, -#undef V1407 -#define V1407 (V + 4697) - 0x1100, 0x116b, 0x11c2, 0, -#undef V1408 -#define V1408 (V + 4701) - 0x1100, 0x116c, 0, -#undef V1409 -#define V1409 (V + 4704) - 0x1100, 0x116c, 0x11a8, 0, -#undef V1410 -#define V1410 (V + 4708) - 0x1100, 0x116c, 0x11a9, 0, -#undef V1411 -#define V1411 (V + 4712) - 0x1100, 0x116c, 0x11aa, 0, -#undef V1412 -#define V1412 (V + 4716) - 0x1100, 0x116c, 0x11ab, 0, -#undef V1413 -#define V1413 (V + 4720) - 0x1100, 0x116c, 0x11ac, 0, -#undef V1414 -#define V1414 (V + 4724) - 0x1100, 0x116c, 0x11ad, 0, -#undef V1415 -#define V1415 (V + 4728) - 0x1100, 0x116c, 0x11ae, 0, -#undef V1416 -#define V1416 (V + 4732) - 0x1100, 0x116c, 0x11af, 0, -#undef V1417 -#define V1417 (V + 4736) - 0x1100, 0x116c, 0x11b0, 0, -#undef V1418 -#define V1418 (V + 4740) - 0x1100, 0x116c, 0x11b1, 0, -#undef V1419 -#define V1419 (V + 4744) - 0x1100, 0x116c, 0x11b2, 0, -#undef V1420 -#define V1420 (V + 4748) - 0x1100, 0x116c, 0x11b3, 0, -#undef V1421 -#define V1421 (V + 4752) - 0x1100, 0x116c, 0x11b4, 0, -#undef V1422 -#define V1422 (V + 4756) - 0x1100, 0x116c, 0x11b5, 0, -#undef V1423 -#define V1423 (V + 4760) - 0x1100, 0x116c, 0x11b6, 0, -#undef V1424 -#define V1424 (V + 4764) - 0x1100, 0x116c, 0x11b7, 0, -#undef V1425 -#define V1425 (V + 4768) - 0x1100, 0x116c, 0x11b8, 0, -#undef V1426 -#define V1426 (V + 4772) - 0x1100, 0x116c, 0x11b9, 0, -#undef V1427 -#define V1427 (V + 4776) - 0x1100, 0x116c, 0x11ba, 0, -#undef V1428 -#define V1428 (V + 4780) - 0x1100, 0x116c, 0x11bb, 0, -#undef V1429 -#define V1429 (V + 4784) - 0x1100, 0x116c, 0x11bc, 0, -#undef V1430 -#define V1430 (V + 4788) - 0x1100, 0x116c, 0x11bd, 0, -#undef V1431 -#define V1431 (V + 4792) - 0x1100, 0x116c, 0x11be, 0, -#undef V1432 -#define V1432 (V + 4796) - 0x1100, 0x116c, 0x11bf, 0, -#undef V1433 -#define V1433 (V + 4800) - 0x1100, 0x116c, 0x11c0, 0, -#undef V1434 -#define V1434 (V + 4804) - 0x1100, 0x116c, 0x11c1, 0, -#undef V1435 -#define V1435 (V + 4808) - 0x1100, 0x116c, 0x11c2, 0, -#undef V1436 -#define V1436 (V + 4812) - 0x1100, 0x116d, 0, -#undef V1437 -#define V1437 (V + 4815) - 0x1100, 0x116d, 0x11a8, 0, -#undef V1438 -#define V1438 (V + 4819) - 0x1100, 0x116d, 0x11a9, 0, -#undef V1439 -#define V1439 (V + 4823) - 0x1100, 0x116d, 0x11aa, 0, -#undef V1440 -#define V1440 (V + 4827) - 0x1100, 0x116d, 0x11ab, 0, -#undef V1441 -#define V1441 (V + 4831) - 0x1100, 0x116d, 0x11ac, 0, -#undef V1442 -#define V1442 (V + 4835) - 0x1100, 0x116d, 0x11ad, 0, -#undef V1443 -#define V1443 (V + 4839) - 0x1100, 0x116d, 0x11ae, 0, -#undef V1444 -#define V1444 (V + 4843) - 0x1100, 0x116d, 0x11af, 0, -#undef V1445 -#define V1445 (V + 4847) - 0x1100, 0x116d, 0x11b0, 0, -#undef V1446 -#define V1446 (V + 4851) - 0x1100, 0x116d, 0x11b1, 0, -#undef V1447 -#define V1447 (V + 4855) - 0x1100, 0x116d, 0x11b2, 0, -#undef V1448 -#define V1448 (V + 4859) - 0x1100, 0x116d, 0x11b3, 0, -#undef V1449 -#define V1449 (V + 4863) - 0x1100, 0x116d, 0x11b4, 0, -#undef V1450 -#define V1450 (V + 4867) - 0x1100, 0x116d, 0x11b5, 0, -#undef V1451 -#define V1451 (V + 4871) - 0x1100, 0x116d, 0x11b6, 0, -#undef V1452 -#define V1452 (V + 4875) - 0x1100, 0x116d, 0x11b7, 0, -#undef V1453 -#define V1453 (V + 4879) - 0x1100, 0x116d, 0x11b8, 0, -#undef V1454 -#define V1454 (V + 4883) - 0x1100, 0x116d, 0x11b9, 0, -#undef V1455 -#define V1455 (V + 4887) - 0x1100, 0x116d, 0x11ba, 0, -#undef V1456 -#define V1456 (V + 4891) - 0x1100, 0x116d, 0x11bb, 0, -#undef V1457 -#define V1457 (V + 4895) - 0x1100, 0x116d, 0x11bc, 0, -#undef V1458 -#define V1458 (V + 4899) - 0x1100, 0x116d, 0x11bd, 0, -#undef V1459 -#define V1459 (V + 4903) - 0x1100, 0x116d, 0x11be, 0, -#undef V1460 -#define V1460 (V + 4907) - 0x1100, 0x116d, 0x11bf, 0, -#undef V1461 -#define V1461 (V + 4911) - 0x1100, 0x116d, 0x11c0, 0, -#undef V1462 -#define V1462 (V + 4915) - 0x1100, 0x116d, 0x11c1, 0, -#undef V1463 -#define V1463 (V + 4919) - 0x1100, 0x116d, 0x11c2, 0, -#undef V1464 -#define V1464 (V + 4923) - 0x1100, 0x116e, 0, -#undef V1465 -#define V1465 (V + 4926) - 0x1100, 0x116e, 0x11a8, 0, -#undef V1466 -#define V1466 (V + 4930) - 0x1100, 0x116e, 0x11a9, 0, -#undef V1467 -#define V1467 (V + 4934) - 0x1100, 0x116e, 0x11aa, 0, -#undef V1468 -#define V1468 (V + 4938) - 0x1100, 0x116e, 0x11ab, 0, -#undef V1469 -#define V1469 (V + 4942) - 0x1100, 0x116e, 0x11ac, 0, -#undef V1470 -#define V1470 (V + 4946) - 0x1100, 0x116e, 0x11ad, 0, -#undef V1471 -#define V1471 (V + 4950) - 0x1100, 0x116e, 0x11ae, 0, -#undef V1472 -#define V1472 (V + 4954) - 0x1100, 0x116e, 0x11af, 0, -#undef V1473 -#define V1473 (V + 4958) - 0x1100, 0x116e, 0x11b0, 0, -#undef V1474 -#define V1474 (V + 4962) - 0x1100, 0x116e, 0x11b1, 0, -#undef V1475 -#define V1475 (V + 4966) - 0x1100, 0x116e, 0x11b2, 0, -#undef V1476 -#define V1476 (V + 4970) - 0x1100, 0x116e, 0x11b3, 0, -#undef V1477 -#define V1477 (V + 4974) - 0x1100, 0x116e, 0x11b4, 0, -#undef V1478 -#define V1478 (V + 4978) - 0x1100, 0x116e, 0x11b5, 0, -#undef V1479 -#define V1479 (V + 4982) - 0x1100, 0x116e, 0x11b6, 0, -#undef V1480 -#define V1480 (V + 4986) - 0x1100, 0x116e, 0x11b7, 0, -#undef V1481 -#define V1481 (V + 4990) - 0x1100, 0x116e, 0x11b8, 0, -#undef V1482 -#define V1482 (V + 4994) - 0x1100, 0x116e, 0x11b9, 0, -#undef V1483 -#define V1483 (V + 4998) - 0x1100, 0x116e, 0x11ba, 0, -#undef V1484 -#define V1484 (V + 5002) - 0x1100, 0x116e, 0x11bb, 0, -#undef V1485 -#define V1485 (V + 5006) - 0x1100, 0x116e, 0x11bc, 0, -#undef V1486 -#define V1486 (V + 5010) - 0x1100, 0x116e, 0x11bd, 0, -#undef V1487 -#define V1487 (V + 5014) - 0x1100, 0x116e, 0x11be, 0, -#undef V1488 -#define V1488 (V + 5018) - 0x1100, 0x116e, 0x11bf, 0, -#undef V1489 -#define V1489 (V + 5022) - 0x1100, 0x116e, 0x11c0, 0, -#undef V1490 -#define V1490 (V + 5026) - 0x1100, 0x116e, 0x11c1, 0, -#undef V1491 -#define V1491 (V + 5030) - 0x1100, 0x116e, 0x11c2, 0, -#undef V1492 -#define V1492 (V + 5034) - 0x1100, 0x116f, 0, -#undef V1493 -#define V1493 (V + 5037) - 0x1100, 0x116f, 0x11a8, 0, -#undef V1494 -#define V1494 (V + 5041) - 0x1100, 0x116f, 0x11a9, 0, -#undef V1495 -#define V1495 (V + 5045) - 0x1100, 0x116f, 0x11aa, 0, -#undef V1496 -#define V1496 (V + 5049) - 0x1100, 0x116f, 0x11ab, 0, -#undef V1497 -#define V1497 (V + 5053) - 0x1100, 0x116f, 0x11ac, 0, -#undef V1498 -#define V1498 (V + 5057) - 0x1100, 0x116f, 0x11ad, 0, -#undef V1499 -#define V1499 (V + 5061) - 0x1100, 0x116f, 0x11ae, 0, -#undef V1500 -#define V1500 (V + 5065) - 0x1100, 0x116f, 0x11af, 0, -#undef V1501 -#define V1501 (V + 5069) - 0x1100, 0x116f, 0x11b0, 0, -#undef V1502 -#define V1502 (V + 5073) - 0x1100, 0x116f, 0x11b1, 0, -#undef V1503 -#define V1503 (V + 5077) - 0x1100, 0x116f, 0x11b2, 0, -#undef V1504 -#define V1504 (V + 5081) - 0x1100, 0x116f, 0x11b3, 0, -#undef V1505 -#define V1505 (V + 5085) - 0x1100, 0x116f, 0x11b4, 0, -#undef V1506 -#define V1506 (V + 5089) - 0x1100, 0x116f, 0x11b5, 0, -#undef V1507 -#define V1507 (V + 5093) - 0x1100, 0x116f, 0x11b6, 0, -#undef V1508 -#define V1508 (V + 5097) - 0x1100, 0x116f, 0x11b7, 0, -#undef V1509 -#define V1509 (V + 5101) - 0x1100, 0x116f, 0x11b8, 0, -#undef V1510 -#define V1510 (V + 5105) - 0x1100, 0x116f, 0x11b9, 0, -#undef V1511 -#define V1511 (V + 5109) - 0x1100, 0x116f, 0x11ba, 0, -#undef V1512 -#define V1512 (V + 5113) - 0x1100, 0x116f, 0x11bb, 0, -#undef V1513 -#define V1513 (V + 5117) - 0x1100, 0x116f, 0x11bc, 0, -#undef V1514 -#define V1514 (V + 5121) - 0x1100, 0x116f, 0x11bd, 0, -#undef V1515 -#define V1515 (V + 5125) - 0x1100, 0x116f, 0x11be, 0, -#undef V1516 -#define V1516 (V + 5129) - 0x1100, 0x116f, 0x11bf, 0, -#undef V1517 -#define V1517 (V + 5133) - 0x1100, 0x116f, 0x11c0, 0, -#undef V1518 -#define V1518 (V + 5137) - 0x1100, 0x116f, 0x11c1, 0, -#undef V1519 -#define V1519 (V + 5141) - 0x1100, 0x116f, 0x11c2, 0, -#undef V1520 -#define V1520 (V + 5145) - 0x1100, 0x1170, 0, -#undef V1521 -#define V1521 (V + 5148) - 0x1100, 0x1170, 0x11a8, 0, -#undef V1522 -#define V1522 (V + 5152) - 0x1100, 0x1170, 0x11a9, 0, -#undef V1523 -#define V1523 (V + 5156) - 0x1100, 0x1170, 0x11aa, 0, -#undef V1524 -#define V1524 (V + 5160) - 0x1100, 0x1170, 0x11ab, 0, -#undef V1525 -#define V1525 (V + 5164) - 0x1100, 0x1170, 0x11ac, 0, -#undef V1526 -#define V1526 (V + 5168) - 0x1100, 0x1170, 0x11ad, 0, -#undef V1527 -#define V1527 (V + 5172) - 0x1100, 0x1170, 0x11ae, 0, -#undef V1528 -#define V1528 (V + 5176) - 0x1100, 0x1170, 0x11af, 0, -#undef V1529 -#define V1529 (V + 5180) - 0x1100, 0x1170, 0x11b0, 0, -#undef V1530 -#define V1530 (V + 5184) - 0x1100, 0x1170, 0x11b1, 0, -#undef V1531 -#define V1531 (V + 5188) - 0x1100, 0x1170, 0x11b2, 0, -#undef V1532 -#define V1532 (V + 5192) - 0x1100, 0x1170, 0x11b3, 0, -#undef V1533 -#define V1533 (V + 5196) - 0x1100, 0x1170, 0x11b4, 0, -#undef V1534 -#define V1534 (V + 5200) - 0x1100, 0x1170, 0x11b5, 0, -#undef V1535 -#define V1535 (V + 5204) - 0x1100, 0x1170, 0x11b6, 0, -#undef V1536 -#define V1536 (V + 5208) - 0x1100, 0x1170, 0x11b7, 0, -#undef V1537 -#define V1537 (V + 5212) - 0x1100, 0x1170, 0x11b8, 0, -#undef V1538 -#define V1538 (V + 5216) - 0x1100, 0x1170, 0x11b9, 0, -#undef V1539 -#define V1539 (V + 5220) - 0x1100, 0x1170, 0x11ba, 0, -#undef V1540 -#define V1540 (V + 5224) - 0x1100, 0x1170, 0x11bb, 0, -#undef V1541 -#define V1541 (V + 5228) - 0x1100, 0x1170, 0x11bc, 0, -#undef V1542 -#define V1542 (V + 5232) - 0x1100, 0x1170, 0x11bd, 0, -#undef V1543 -#define V1543 (V + 5236) - 0x1100, 0x1170, 0x11be, 0, -#undef V1544 -#define V1544 (V + 5240) - 0x1100, 0x1170, 0x11bf, 0, -#undef V1545 -#define V1545 (V + 5244) - 0x1100, 0x1170, 0x11c0, 0, -#undef V1546 -#define V1546 (V + 5248) - 0x1100, 0x1170, 0x11c1, 0, -#undef V1547 -#define V1547 (V + 5252) - 0x1100, 0x1170, 0x11c2, 0, -#undef V1548 -#define V1548 (V + 5256) - 0x1100, 0x1171, 0, -#undef V1549 -#define V1549 (V + 5259) - 0x1100, 0x1171, 0x11a8, 0, -#undef V1550 -#define V1550 (V + 5263) - 0x1100, 0x1171, 0x11a9, 0, -#undef V1551 -#define V1551 (V + 5267) - 0x1100, 0x1171, 0x11aa, 0, -#undef V1552 -#define V1552 (V + 5271) - 0x1100, 0x1171, 0x11ab, 0, -#undef V1553 -#define V1553 (V + 5275) - 0x1100, 0x1171, 0x11ac, 0, -#undef V1554 -#define V1554 (V + 5279) - 0x1100, 0x1171, 0x11ad, 0, -#undef V1555 -#define V1555 (V + 5283) - 0x1100, 0x1171, 0x11ae, 0, -#undef V1556 -#define V1556 (V + 5287) - 0x1100, 0x1171, 0x11af, 0, -#undef V1557 -#define V1557 (V + 5291) - 0x1100, 0x1171, 0x11b0, 0, -#undef V1558 -#define V1558 (V + 5295) - 0x1100, 0x1171, 0x11b1, 0, -#undef V1559 -#define V1559 (V + 5299) - 0x1100, 0x1171, 0x11b2, 0, -#undef V1560 -#define V1560 (V + 5303) - 0x1100, 0x1171, 0x11b3, 0, -#undef V1561 -#define V1561 (V + 5307) - 0x1100, 0x1171, 0x11b4, 0, -#undef V1562 -#define V1562 (V + 5311) - 0x1100, 0x1171, 0x11b5, 0, -#undef V1563 -#define V1563 (V + 5315) - 0x1100, 0x1171, 0x11b6, 0, -#undef V1564 -#define V1564 (V + 5319) - 0x1100, 0x1171, 0x11b7, 0, -#undef V1565 -#define V1565 (V + 5323) - 0x1100, 0x1171, 0x11b8, 0, -#undef V1566 -#define V1566 (V + 5327) - 0x1100, 0x1171, 0x11b9, 0, -#undef V1567 -#define V1567 (V + 5331) - 0x1100, 0x1171, 0x11ba, 0, -#undef V1568 -#define V1568 (V + 5335) - 0x1100, 0x1171, 0x11bb, 0, -#undef V1569 -#define V1569 (V + 5339) - 0x1100, 0x1171, 0x11bc, 0, -#undef V1570 -#define V1570 (V + 5343) - 0x1100, 0x1171, 0x11bd, 0, -#undef V1571 -#define V1571 (V + 5347) - 0x1100, 0x1171, 0x11be, 0, -#undef V1572 -#define V1572 (V + 5351) - 0x1100, 0x1171, 0x11bf, 0, -#undef V1573 -#define V1573 (V + 5355) - 0x1100, 0x1171, 0x11c0, 0, -#undef V1574 -#define V1574 (V + 5359) - 0x1100, 0x1171, 0x11c1, 0, -#undef V1575 -#define V1575 (V + 5363) - 0x1100, 0x1171, 0x11c2, 0, -#undef V1576 -#define V1576 (V + 5367) - 0x1100, 0x1172, 0, -#undef V1577 -#define V1577 (V + 5370) - 0x1100, 0x1172, 0x11a8, 0, -#undef V1578 -#define V1578 (V + 5374) - 0x1100, 0x1172, 0x11a9, 0, -#undef V1579 -#define V1579 (V + 5378) - 0x1100, 0x1172, 0x11aa, 0, -#undef V1580 -#define V1580 (V + 5382) - 0x1100, 0x1172, 0x11ab, 0, -#undef V1581 -#define V1581 (V + 5386) - 0x1100, 0x1172, 0x11ac, 0, -#undef V1582 -#define V1582 (V + 5390) - 0x1100, 0x1172, 0x11ad, 0, -#undef V1583 -#define V1583 (V + 5394) - 0x1100, 0x1172, 0x11ae, 0, -#undef V1584 -#define V1584 (V + 5398) - 0x1100, 0x1172, 0x11af, 0, -#undef V1585 -#define V1585 (V + 5402) - 0x1100, 0x1172, 0x11b0, 0, -#undef V1586 -#define V1586 (V + 5406) - 0x1100, 0x1172, 0x11b1, 0, -#undef V1587 -#define V1587 (V + 5410) - 0x1100, 0x1172, 0x11b2, 0, -#undef V1588 -#define V1588 (V + 5414) - 0x1100, 0x1172, 0x11b3, 0, -#undef V1589 -#define V1589 (V + 5418) - 0x1100, 0x1172, 0x11b4, 0, -#undef V1590 -#define V1590 (V + 5422) - 0x1100, 0x1172, 0x11b5, 0, -#undef V1591 -#define V1591 (V + 5426) - 0x1100, 0x1172, 0x11b6, 0, -#undef V1592 -#define V1592 (V + 5430) - 0x1100, 0x1172, 0x11b7, 0, -#undef V1593 -#define V1593 (V + 5434) - 0x1100, 0x1172, 0x11b8, 0, -#undef V1594 -#define V1594 (V + 5438) - 0x1100, 0x1172, 0x11b9, 0, -#undef V1595 -#define V1595 (V + 5442) - 0x1100, 0x1172, 0x11ba, 0, -#undef V1596 -#define V1596 (V + 5446) - 0x1100, 0x1172, 0x11bb, 0, -#undef V1597 -#define V1597 (V + 5450) - 0x1100, 0x1172, 0x11bc, 0, -#undef V1598 -#define V1598 (V + 5454) - 0x1100, 0x1172, 0x11bd, 0, -#undef V1599 -#define V1599 (V + 5458) - 0x1100, 0x1172, 0x11be, 0, -#undef V1600 -#define V1600 (V + 5462) - 0x1100, 0x1172, 0x11bf, 0, -#undef V1601 -#define V1601 (V + 5466) - 0x1100, 0x1172, 0x11c0, 0, -#undef V1602 -#define V1602 (V + 5470) - 0x1100, 0x1172, 0x11c1, 0, -#undef V1603 -#define V1603 (V + 5474) - 0x1100, 0x1172, 0x11c2, 0, -#undef V1604 -#define V1604 (V + 5478) - 0x1100, 0x1173, 0, -#undef V1605 -#define V1605 (V + 5481) - 0x1100, 0x1173, 0x11a8, 0, -#undef V1606 -#define V1606 (V + 5485) - 0x1100, 0x1173, 0x11a9, 0, -#undef V1607 -#define V1607 (V + 5489) - 0x1100, 0x1173, 0x11aa, 0, -#undef V1608 -#define V1608 (V + 5493) - 0x1100, 0x1173, 0x11ab, 0, -#undef V1609 -#define V1609 (V + 5497) - 0x1100, 0x1173, 0x11ac, 0, -#undef V1610 -#define V1610 (V + 5501) - 0x1100, 0x1173, 0x11ad, 0, -#undef V1611 -#define V1611 (V + 5505) - 0x1100, 0x1173, 0x11ae, 0, -#undef V1612 -#define V1612 (V + 5509) - 0x1100, 0x1173, 0x11af, 0, -#undef V1613 -#define V1613 (V + 5513) - 0x1100, 0x1173, 0x11b0, 0, -#undef V1614 -#define V1614 (V + 5517) - 0x1100, 0x1173, 0x11b1, 0, -#undef V1615 -#define V1615 (V + 5521) - 0x1100, 0x1173, 0x11b2, 0, -#undef V1616 -#define V1616 (V + 5525) - 0x1100, 0x1173, 0x11b3, 0, -#undef V1617 -#define V1617 (V + 5529) - 0x1100, 0x1173, 0x11b4, 0, -#undef V1618 -#define V1618 (V + 5533) - 0x1100, 0x1173, 0x11b5, 0, -#undef V1619 -#define V1619 (V + 5537) - 0x1100, 0x1173, 0x11b6, 0, -#undef V1620 -#define V1620 (V + 5541) - 0x1100, 0x1173, 0x11b7, 0, -#undef V1621 -#define V1621 (V + 5545) - 0x1100, 0x1173, 0x11b8, 0, -#undef V1622 -#define V1622 (V + 5549) - 0x1100, 0x1173, 0x11b9, 0, -#undef V1623 -#define V1623 (V + 5553) - 0x1100, 0x1173, 0x11ba, 0, -#undef V1624 -#define V1624 (V + 5557) - 0x1100, 0x1173, 0x11bb, 0, -#undef V1625 -#define V1625 (V + 5561) - 0x1100, 0x1173, 0x11bc, 0, -#undef V1626 -#define V1626 (V + 5565) - 0x1100, 0x1173, 0x11bd, 0, -#undef V1627 -#define V1627 (V + 5569) - 0x1100, 0x1173, 0x11be, 0, -#undef V1628 -#define V1628 (V + 5573) - 0x1100, 0x1173, 0x11bf, 0, -#undef V1629 -#define V1629 (V + 5577) - 0x1100, 0x1173, 0x11c0, 0, -#undef V1630 -#define V1630 (V + 5581) - 0x1100, 0x1173, 0x11c1, 0, -#undef V1631 -#define V1631 (V + 5585) - 0x1100, 0x1173, 0x11c2, 0, -#undef V1632 -#define V1632 (V + 5589) - 0x1100, 0x1174, 0, -#undef V1633 -#define V1633 (V + 5592) - 0x1100, 0x1174, 0x11a8, 0, -#undef V1634 -#define V1634 (V + 5596) - 0x1100, 0x1174, 0x11a9, 0, -#undef V1635 -#define V1635 (V + 5600) - 0x1100, 0x1174, 0x11aa, 0, -#undef V1636 -#define V1636 (V + 5604) - 0x1100, 0x1174, 0x11ab, 0, -#undef V1637 -#define V1637 (V + 5608) - 0x1100, 0x1174, 0x11ac, 0, -#undef V1638 -#define V1638 (V + 5612) - 0x1100, 0x1174, 0x11ad, 0, -#undef V1639 -#define V1639 (V + 5616) - 0x1100, 0x1174, 0x11ae, 0, -#undef V1640 -#define V1640 (V + 5620) - 0x1100, 0x1174, 0x11af, 0, -#undef V1641 -#define V1641 (V + 5624) - 0x1100, 0x1174, 0x11b0, 0, -#undef V1642 -#define V1642 (V + 5628) - 0x1100, 0x1174, 0x11b1, 0, -#undef V1643 -#define V1643 (V + 5632) - 0x1100, 0x1174, 0x11b2, 0, -#undef V1644 -#define V1644 (V + 5636) - 0x1100, 0x1174, 0x11b3, 0, -#undef V1645 -#define V1645 (V + 5640) - 0x1100, 0x1174, 0x11b4, 0, -#undef V1646 -#define V1646 (V + 5644) - 0x1100, 0x1174, 0x11b5, 0, -#undef V1647 -#define V1647 (V + 5648) - 0x1100, 0x1174, 0x11b6, 0, -#undef V1648 -#define V1648 (V + 5652) - 0x1100, 0x1174, 0x11b7, 0, -#undef V1649 -#define V1649 (V + 5656) - 0x1100, 0x1174, 0x11b8, 0, -#undef V1650 -#define V1650 (V + 5660) - 0x1100, 0x1174, 0x11b9, 0, -#undef V1651 -#define V1651 (V + 5664) - 0x1100, 0x1174, 0x11ba, 0, -#undef V1652 -#define V1652 (V + 5668) - 0x1100, 0x1174, 0x11bb, 0, -#undef V1653 -#define V1653 (V + 5672) - 0x1100, 0x1174, 0x11bc, 0, -#undef V1654 -#define V1654 (V + 5676) - 0x1100, 0x1174, 0x11bd, 0, -#undef V1655 -#define V1655 (V + 5680) - 0x1100, 0x1174, 0x11be, 0, -#undef V1656 -#define V1656 (V + 5684) - 0x1100, 0x1174, 0x11bf, 0, -#undef V1657 -#define V1657 (V + 5688) - 0x1100, 0x1174, 0x11c0, 0, -#undef V1658 -#define V1658 (V + 5692) - 0x1100, 0x1174, 0x11c1, 0, -#undef V1659 -#define V1659 (V + 5696) - 0x1100, 0x1174, 0x11c2, 0, -#undef V1660 -#define V1660 (V + 5700) - 0x1100, 0x1175, 0, -#undef V1661 -#define V1661 (V + 5703) - 0x1100, 0x1175, 0x11a8, 0, -#undef V1662 -#define V1662 (V + 5707) - 0x1100, 0x1175, 0x11a9, 0, -#undef V1663 -#define V1663 (V + 5711) - 0x1100, 0x1175, 0x11aa, 0, -#undef V1664 -#define V1664 (V + 5715) - 0x1100, 0x1175, 0x11ab, 0, -#undef V1665 -#define V1665 (V + 5719) - 0x1100, 0x1175, 0x11ac, 0, -#undef V1666 -#define V1666 (V + 5723) - 0x1100, 0x1175, 0x11ad, 0, -#undef V1667 -#define V1667 (V + 5727) - 0x1100, 0x1175, 0x11ae, 0, -#undef V1668 -#define V1668 (V + 5731) - 0x1100, 0x1175, 0x11af, 0, -#undef V1669 -#define V1669 (V + 5735) - 0x1100, 0x1175, 0x11b0, 0, -#undef V1670 -#define V1670 (V + 5739) - 0x1100, 0x1175, 0x11b1, 0, -#undef V1671 -#define V1671 (V + 5743) - 0x1100, 0x1175, 0x11b2, 0, -#undef V1672 -#define V1672 (V + 5747) - 0x1100, 0x1175, 0x11b3, 0, -#undef V1673 -#define V1673 (V + 5751) - 0x1100, 0x1175, 0x11b4, 0, -#undef V1674 -#define V1674 (V + 5755) - 0x1100, 0x1175, 0x11b5, 0, -#undef V1675 -#define V1675 (V + 5759) - 0x1100, 0x1175, 0x11b6, 0, -#undef V1676 -#define V1676 (V + 5763) - 0x1100, 0x1175, 0x11b7, 0, -#undef V1677 -#define V1677 (V + 5767) - 0x1100, 0x1175, 0x11b8, 0, -#undef V1678 -#define V1678 (V + 5771) - 0x1100, 0x1175, 0x11b9, 0, -#undef V1679 -#define V1679 (V + 5775) - 0x1100, 0x1175, 0x11ba, 0, -#undef V1680 -#define V1680 (V + 5779) - 0x1100, 0x1175, 0x11bb, 0, -#undef V1681 -#define V1681 (V + 5783) - 0x1100, 0x1175, 0x11bc, 0, -#undef V1682 -#define V1682 (V + 5787) - 0x1100, 0x1175, 0x11bd, 0, -#undef V1683 -#define V1683 (V + 5791) - 0x1100, 0x1175, 0x11be, 0, -#undef V1684 -#define V1684 (V + 5795) - 0x1100, 0x1175, 0x11bf, 0, -#undef V1685 -#define V1685 (V + 5799) - 0x1100, 0x1175, 0x11c0, 0, -#undef V1686 -#define V1686 (V + 5803) - 0x1100, 0x1175, 0x11c1, 0, -#undef V1687 -#define V1687 (V + 5807) - 0x1100, 0x1175, 0x11c2, 0, -#undef V1688 -#define V1688 (V + 5811) - 0x1101, 0x1161, 0, -#undef V1689 -#define V1689 (V + 5814) - 0x1101, 0x1161, 0x11a8, 0, -#undef V1690 -#define V1690 (V + 5818) - 0x1101, 0x1161, 0x11a9, 0, -#undef V1691 -#define V1691 (V + 5822) - 0x1101, 0x1161, 0x11aa, 0, -#undef V1692 -#define V1692 (V + 5826) - 0x1101, 0x1161, 0x11ab, 0, -#undef V1693 -#define V1693 (V + 5830) - 0x1101, 0x1161, 0x11ac, 0, -#undef V1694 -#define V1694 (V + 5834) - 0x1101, 0x1161, 0x11ad, 0, -#undef V1695 -#define V1695 (V + 5838) - 0x1101, 0x1161, 0x11ae, 0, -#undef V1696 -#define V1696 (V + 5842) - 0x1101, 0x1161, 0x11af, 0, -#undef V1697 -#define V1697 (V + 5846) - 0x1101, 0x1161, 0x11b0, 0, -#undef V1698 -#define V1698 (V + 5850) - 0x1101, 0x1161, 0x11b1, 0, -#undef V1699 -#define V1699 (V + 5854) - 0x1101, 0x1161, 0x11b2, 0, -#undef V1700 -#define V1700 (V + 5858) - 0x1101, 0x1161, 0x11b3, 0, -#undef V1701 -#define V1701 (V + 5862) - 0x1101, 0x1161, 0x11b4, 0, -#undef V1702 -#define V1702 (V + 5866) - 0x1101, 0x1161, 0x11b5, 0, -#undef V1703 -#define V1703 (V + 5870) - 0x1101, 0x1161, 0x11b6, 0, -#undef V1704 -#define V1704 (V + 5874) - 0x1101, 0x1161, 0x11b7, 0, -#undef V1705 -#define V1705 (V + 5878) - 0x1101, 0x1161, 0x11b8, 0, -#undef V1706 -#define V1706 (V + 5882) - 0x1101, 0x1161, 0x11b9, 0, -#undef V1707 -#define V1707 (V + 5886) - 0x1101, 0x1161, 0x11ba, 0, -#undef V1708 -#define V1708 (V + 5890) - 0x1101, 0x1161, 0x11bb, 0, -#undef V1709 -#define V1709 (V + 5894) - 0x1101, 0x1161, 0x11bc, 0, -#undef V1710 -#define V1710 (V + 5898) - 0x1101, 0x1161, 0x11bd, 0, -#undef V1711 -#define V1711 (V + 5902) - 0x1101, 0x1161, 0x11be, 0, -#undef V1712 -#define V1712 (V + 5906) - 0x1101, 0x1161, 0x11bf, 0, -#undef V1713 -#define V1713 (V + 5910) - 0x1101, 0x1161, 0x11c0, 0, -#undef V1714 -#define V1714 (V + 5914) - 0x1101, 0x1161, 0x11c1, 0, -#undef V1715 -#define V1715 (V + 5918) - 0x1101, 0x1161, 0x11c2, 0, -#undef V1716 -#define V1716 (V + 5922) - 0x1101, 0x1162, 0, -#undef V1717 -#define V1717 (V + 5925) - 0x1101, 0x1162, 0x11a8, 0, -#undef V1718 -#define V1718 (V + 5929) - 0x1101, 0x1162, 0x11a9, 0, -#undef V1719 -#define V1719 (V + 5933) - 0x1101, 0x1162, 0x11aa, 0, -#undef V1720 -#define V1720 (V + 5937) - 0x1101, 0x1162, 0x11ab, 0, -#undef V1721 -#define V1721 (V + 5941) - 0x1101, 0x1162, 0x11ac, 0, -#undef V1722 -#define V1722 (V + 5945) - 0x1101, 0x1162, 0x11ad, 0, -#undef V1723 -#define V1723 (V + 5949) - 0x1101, 0x1162, 0x11ae, 0, -#undef V1724 -#define V1724 (V + 5953) - 0x1101, 0x1162, 0x11af, 0, -#undef V1725 -#define V1725 (V + 5957) - 0x1101, 0x1162, 0x11b0, 0, -#undef V1726 -#define V1726 (V + 5961) - 0x1101, 0x1162, 0x11b1, 0, -#undef V1727 -#define V1727 (V + 5965) - 0x1101, 0x1162, 0x11b2, 0, -#undef V1728 -#define V1728 (V + 5969) - 0x1101, 0x1162, 0x11b3, 0, -#undef V1729 -#define V1729 (V + 5973) - 0x1101, 0x1162, 0x11b4, 0, -#undef V1730 -#define V1730 (V + 5977) - 0x1101, 0x1162, 0x11b5, 0, -#undef V1731 -#define V1731 (V + 5981) - 0x1101, 0x1162, 0x11b6, 0, -#undef V1732 -#define V1732 (V + 5985) - 0x1101, 0x1162, 0x11b7, 0, -#undef V1733 -#define V1733 (V + 5989) - 0x1101, 0x1162, 0x11b8, 0, -#undef V1734 -#define V1734 (V + 5993) - 0x1101, 0x1162, 0x11b9, 0, -#undef V1735 -#define V1735 (V + 5997) - 0x1101, 0x1162, 0x11ba, 0, -#undef V1736 -#define V1736 (V + 6001) - 0x1101, 0x1162, 0x11bb, 0, -#undef V1737 -#define V1737 (V + 6005) - 0x1101, 0x1162, 0x11bc, 0, -#undef V1738 -#define V1738 (V + 6009) - 0x1101, 0x1162, 0x11bd, 0, -#undef V1739 -#define V1739 (V + 6013) - 0x1101, 0x1162, 0x11be, 0, -#undef V1740 -#define V1740 (V + 6017) - 0x1101, 0x1162, 0x11bf, 0, -#undef V1741 -#define V1741 (V + 6021) - 0x1101, 0x1162, 0x11c0, 0, -#undef V1742 -#define V1742 (V + 6025) - 0x1101, 0x1162, 0x11c1, 0, -#undef V1743 -#define V1743 (V + 6029) - 0x1101, 0x1162, 0x11c2, 0, -#undef V1744 -#define V1744 (V + 6033) - 0x1101, 0x1163, 0, -#undef V1745 -#define V1745 (V + 6036) - 0x1101, 0x1163, 0x11a8, 0, -#undef V1746 -#define V1746 (V + 6040) - 0x1101, 0x1163, 0x11a9, 0, -#undef V1747 -#define V1747 (V + 6044) - 0x1101, 0x1163, 0x11aa, 0, -#undef V1748 -#define V1748 (V + 6048) - 0x1101, 0x1163, 0x11ab, 0, -#undef V1749 -#define V1749 (V + 6052) - 0x1101, 0x1163, 0x11ac, 0, -#undef V1750 -#define V1750 (V + 6056) - 0x1101, 0x1163, 0x11ad, 0, -#undef V1751 -#define V1751 (V + 6060) - 0x1101, 0x1163, 0x11ae, 0, -#undef V1752 -#define V1752 (V + 6064) - 0x1101, 0x1163, 0x11af, 0, -#undef V1753 -#define V1753 (V + 6068) - 0x1101, 0x1163, 0x11b0, 0, -#undef V1754 -#define V1754 (V + 6072) - 0x1101, 0x1163, 0x11b1, 0, -#undef V1755 -#define V1755 (V + 6076) - 0x1101, 0x1163, 0x11b2, 0, -#undef V1756 -#define V1756 (V + 6080) - 0x1101, 0x1163, 0x11b3, 0, -#undef V1757 -#define V1757 (V + 6084) - 0x1101, 0x1163, 0x11b4, 0, -#undef V1758 -#define V1758 (V + 6088) - 0x1101, 0x1163, 0x11b5, 0, -#undef V1759 -#define V1759 (V + 6092) - 0x1101, 0x1163, 0x11b6, 0, -#undef V1760 -#define V1760 (V + 6096) - 0x1101, 0x1163, 0x11b7, 0, -#undef V1761 -#define V1761 (V + 6100) - 0x1101, 0x1163, 0x11b8, 0, -#undef V1762 -#define V1762 (V + 6104) - 0x1101, 0x1163, 0x11b9, 0, -#undef V1763 -#define V1763 (V + 6108) - 0x1101, 0x1163, 0x11ba, 0, -#undef V1764 -#define V1764 (V + 6112) - 0x1101, 0x1163, 0x11bb, 0, -#undef V1765 -#define V1765 (V + 6116) - 0x1101, 0x1163, 0x11bc, 0, -#undef V1766 -#define V1766 (V + 6120) - 0x1101, 0x1163, 0x11bd, 0, -#undef V1767 -#define V1767 (V + 6124) - 0x1101, 0x1163, 0x11be, 0, -#undef V1768 -#define V1768 (V + 6128) - 0x1101, 0x1163, 0x11bf, 0, -#undef V1769 -#define V1769 (V + 6132) - 0x1101, 0x1163, 0x11c0, 0, -#undef V1770 -#define V1770 (V + 6136) - 0x1101, 0x1163, 0x11c1, 0, -#undef V1771 -#define V1771 (V + 6140) - 0x1101, 0x1163, 0x11c2, 0, -#undef V1772 -#define V1772 (V + 6144) - 0x1101, 0x1164, 0, -#undef V1773 -#define V1773 (V + 6147) - 0x1101, 0x1164, 0x11a8, 0, -#undef V1774 -#define V1774 (V + 6151) - 0x1101, 0x1164, 0x11a9, 0, -#undef V1775 -#define V1775 (V + 6155) - 0x1101, 0x1164, 0x11aa, 0, -#undef V1776 -#define V1776 (V + 6159) - 0x1101, 0x1164, 0x11ab, 0, -#undef V1777 -#define V1777 (V + 6163) - 0x1101, 0x1164, 0x11ac, 0, -#undef V1778 -#define V1778 (V + 6167) - 0x1101, 0x1164, 0x11ad, 0, -#undef V1779 -#define V1779 (V + 6171) - 0x1101, 0x1164, 0x11ae, 0, -#undef V1780 -#define V1780 (V + 6175) - 0x1101, 0x1164, 0x11af, 0, -#undef V1781 -#define V1781 (V + 6179) - 0x1101, 0x1164, 0x11b0, 0, -#undef V1782 -#define V1782 (V + 6183) - 0x1101, 0x1164, 0x11b1, 0, -#undef V1783 -#define V1783 (V + 6187) - 0x1101, 0x1164, 0x11b2, 0, -#undef V1784 -#define V1784 (V + 6191) - 0x1101, 0x1164, 0x11b3, 0, -#undef V1785 -#define V1785 (V + 6195) - 0x1101, 0x1164, 0x11b4, 0, -#undef V1786 -#define V1786 (V + 6199) - 0x1101, 0x1164, 0x11b5, 0, -#undef V1787 -#define V1787 (V + 6203) - 0x1101, 0x1164, 0x11b6, 0, -#undef V1788 -#define V1788 (V + 6207) - 0x1101, 0x1164, 0x11b7, 0, -#undef V1789 -#define V1789 (V + 6211) - 0x1101, 0x1164, 0x11b8, 0, -#undef V1790 -#define V1790 (V + 6215) - 0x1101, 0x1164, 0x11b9, 0, -#undef V1791 -#define V1791 (V + 6219) - 0x1101, 0x1164, 0x11ba, 0, -#undef V1792 -#define V1792 (V + 6223) - 0x1101, 0x1164, 0x11bb, 0, -#undef V1793 -#define V1793 (V + 6227) - 0x1101, 0x1164, 0x11bc, 0, -#undef V1794 -#define V1794 (V + 6231) - 0x1101, 0x1164, 0x11bd, 0, -#undef V1795 -#define V1795 (V + 6235) - 0x1101, 0x1164, 0x11be, 0, -#undef V1796 -#define V1796 (V + 6239) - 0x1101, 0x1164, 0x11bf, 0, -#undef V1797 -#define V1797 (V + 6243) - 0x1101, 0x1164, 0x11c0, 0, -#undef V1798 -#define V1798 (V + 6247) - 0x1101, 0x1164, 0x11c1, 0, -#undef V1799 -#define V1799 (V + 6251) - 0x1101, 0x1164, 0x11c2, 0, -#undef V1800 -#define V1800 (V + 6255) - 0x1101, 0x1165, 0, -#undef V1801 -#define V1801 (V + 6258) - 0x1101, 0x1165, 0x11a8, 0, -#undef V1802 -#define V1802 (V + 6262) - 0x1101, 0x1165, 0x11a9, 0, -#undef V1803 -#define V1803 (V + 6266) - 0x1101, 0x1165, 0x11aa, 0, -#undef V1804 -#define V1804 (V + 6270) - 0x1101, 0x1165, 0x11ab, 0, -#undef V1805 -#define V1805 (V + 6274) - 0x1101, 0x1165, 0x11ac, 0, -#undef V1806 -#define V1806 (V + 6278) - 0x1101, 0x1165, 0x11ad, 0, -#undef V1807 -#define V1807 (V + 6282) - 0x1101, 0x1165, 0x11ae, 0, -#undef V1808 -#define V1808 (V + 6286) - 0x1101, 0x1165, 0x11af, 0, -#undef V1809 -#define V1809 (V + 6290) - 0x1101, 0x1165, 0x11b0, 0, -#undef V1810 -#define V1810 (V + 6294) - 0x1101, 0x1165, 0x11b1, 0, -#undef V1811 -#define V1811 (V + 6298) - 0x1101, 0x1165, 0x11b2, 0, -#undef V1812 -#define V1812 (V + 6302) - 0x1101, 0x1165, 0x11b3, 0, -#undef V1813 -#define V1813 (V + 6306) - 0x1101, 0x1165, 0x11b4, 0, -#undef V1814 -#define V1814 (V + 6310) - 0x1101, 0x1165, 0x11b5, 0, -#undef V1815 -#define V1815 (V + 6314) - 0x1101, 0x1165, 0x11b6, 0, -#undef V1816 -#define V1816 (V + 6318) - 0x1101, 0x1165, 0x11b7, 0, -#undef V1817 -#define V1817 (V + 6322) - 0x1101, 0x1165, 0x11b8, 0, -#undef V1818 -#define V1818 (V + 6326) - 0x1101, 0x1165, 0x11b9, 0, -#undef V1819 -#define V1819 (V + 6330) - 0x1101, 0x1165, 0x11ba, 0, -#undef V1820 -#define V1820 (V + 6334) - 0x1101, 0x1165, 0x11bb, 0, -#undef V1821 -#define V1821 (V + 6338) - 0x1101, 0x1165, 0x11bc, 0, -#undef V1822 -#define V1822 (V + 6342) - 0x1101, 0x1165, 0x11bd, 0, -#undef V1823 -#define V1823 (V + 6346) - 0x1101, 0x1165, 0x11be, 0, -#undef V1824 -#define V1824 (V + 6350) - 0x1101, 0x1165, 0x11bf, 0, -#undef V1825 -#define V1825 (V + 6354) - 0x1101, 0x1165, 0x11c0, 0, -#undef V1826 -#define V1826 (V + 6358) - 0x1101, 0x1165, 0x11c1, 0, -#undef V1827 -#define V1827 (V + 6362) - 0x1101, 0x1165, 0x11c2, 0, -#undef V1828 -#define V1828 (V + 6366) - 0x1101, 0x1166, 0, -#undef V1829 -#define V1829 (V + 6369) - 0x1101, 0x1166, 0x11a8, 0, -#undef V1830 -#define V1830 (V + 6373) - 0x1101, 0x1166, 0x11a9, 0, -#undef V1831 -#define V1831 (V + 6377) - 0x1101, 0x1166, 0x11aa, 0, -#undef V1832 -#define V1832 (V + 6381) - 0x1101, 0x1166, 0x11ab, 0, -#undef V1833 -#define V1833 (V + 6385) - 0x1101, 0x1166, 0x11ac, 0, -#undef V1834 -#define V1834 (V + 6389) - 0x1101, 0x1166, 0x11ad, 0, -#undef V1835 -#define V1835 (V + 6393) - 0x1101, 0x1166, 0x11ae, 0, -#undef V1836 -#define V1836 (V + 6397) - 0x1101, 0x1166, 0x11af, 0, -#undef V1837 -#define V1837 (V + 6401) - 0x1101, 0x1166, 0x11b0, 0, -#undef V1838 -#define V1838 (V + 6405) - 0x1101, 0x1166, 0x11b1, 0, -#undef V1839 -#define V1839 (V + 6409) - 0x1101, 0x1166, 0x11b2, 0, -#undef V1840 -#define V1840 (V + 6413) - 0x1101, 0x1166, 0x11b3, 0, -#undef V1841 -#define V1841 (V + 6417) - 0x1101, 0x1166, 0x11b4, 0, -#undef V1842 -#define V1842 (V + 6421) - 0x1101, 0x1166, 0x11b5, 0, -#undef V1843 -#define V1843 (V + 6425) - 0x1101, 0x1166, 0x11b6, 0, -#undef V1844 -#define V1844 (V + 6429) - 0x1101, 0x1166, 0x11b7, 0, -#undef V1845 -#define V1845 (V + 6433) - 0x1101, 0x1166, 0x11b8, 0, -#undef V1846 -#define V1846 (V + 6437) - 0x1101, 0x1166, 0x11b9, 0, -#undef V1847 -#define V1847 (V + 6441) - 0x1101, 0x1166, 0x11ba, 0, -#undef V1848 -#define V1848 (V + 6445) - 0x1101, 0x1166, 0x11bb, 0, -#undef V1849 -#define V1849 (V + 6449) - 0x1101, 0x1166, 0x11bc, 0, -#undef V1850 -#define V1850 (V + 6453) - 0x1101, 0x1166, 0x11bd, 0, -#undef V1851 -#define V1851 (V + 6457) - 0x1101, 0x1166, 0x11be, 0, -#undef V1852 -#define V1852 (V + 6461) - 0x1101, 0x1166, 0x11bf, 0, -#undef V1853 -#define V1853 (V + 6465) - 0x1101, 0x1166, 0x11c0, 0, -#undef V1854 -#define V1854 (V + 6469) - 0x1101, 0x1166, 0x11c1, 0, -#undef V1855 -#define V1855 (V + 6473) - 0x1101, 0x1166, 0x11c2, 0, -#undef V1856 -#define V1856 (V + 6477) - 0x1101, 0x1167, 0, -#undef V1857 -#define V1857 (V + 6480) - 0x1101, 0x1167, 0x11a8, 0, -#undef V1858 -#define V1858 (V + 6484) - 0x1101, 0x1167, 0x11a9, 0, -#undef V1859 -#define V1859 (V + 6488) - 0x1101, 0x1167, 0x11aa, 0, -#undef V1860 -#define V1860 (V + 6492) - 0x1101, 0x1167, 0x11ab, 0, -#undef V1861 -#define V1861 (V + 6496) - 0x1101, 0x1167, 0x11ac, 0, -#undef V1862 -#define V1862 (V + 6500) - 0x1101, 0x1167, 0x11ad, 0, -#undef V1863 -#define V1863 (V + 6504) - 0x1101, 0x1167, 0x11ae, 0, -#undef V1864 -#define V1864 (V + 6508) - 0x1101, 0x1167, 0x11af, 0, -#undef V1865 -#define V1865 (V + 6512) - 0x1101, 0x1167, 0x11b0, 0, -#undef V1866 -#define V1866 (V + 6516) - 0x1101, 0x1167, 0x11b1, 0, -#undef V1867 -#define V1867 (V + 6520) - 0x1101, 0x1167, 0x11b2, 0, -#undef V1868 -#define V1868 (V + 6524) - 0x1101, 0x1167, 0x11b3, 0, -#undef V1869 -#define V1869 (V + 6528) - 0x1101, 0x1167, 0x11b4, 0, -#undef V1870 -#define V1870 (V + 6532) - 0x1101, 0x1167, 0x11b5, 0, -#undef V1871 -#define V1871 (V + 6536) - 0x1101, 0x1167, 0x11b6, 0, -#undef V1872 -#define V1872 (V + 6540) - 0x1101, 0x1167, 0x11b7, 0, -#undef V1873 -#define V1873 (V + 6544) - 0x1101, 0x1167, 0x11b8, 0, -#undef V1874 -#define V1874 (V + 6548) - 0x1101, 0x1167, 0x11b9, 0, -#undef V1875 -#define V1875 (V + 6552) - 0x1101, 0x1167, 0x11ba, 0, -#undef V1876 -#define V1876 (V + 6556) - 0x1101, 0x1167, 0x11bb, 0, -#undef V1877 -#define V1877 (V + 6560) - 0x1101, 0x1167, 0x11bc, 0, -#undef V1878 -#define V1878 (V + 6564) - 0x1101, 0x1167, 0x11bd, 0, -#undef V1879 -#define V1879 (V + 6568) - 0x1101, 0x1167, 0x11be, 0, -#undef V1880 -#define V1880 (V + 6572) - 0x1101, 0x1167, 0x11bf, 0, -#undef V1881 -#define V1881 (V + 6576) - 0x1101, 0x1167, 0x11c0, 0, -#undef V1882 -#define V1882 (V + 6580) - 0x1101, 0x1167, 0x11c1, 0, -#undef V1883 -#define V1883 (V + 6584) - 0x1101, 0x1167, 0x11c2, 0, -#undef V1884 -#define V1884 (V + 6588) - 0x1101, 0x1168, 0, -#undef V1885 -#define V1885 (V + 6591) - 0x1101, 0x1168, 0x11a8, 0, -#undef V1886 -#define V1886 (V + 6595) - 0x1101, 0x1168, 0x11a9, 0, -#undef V1887 -#define V1887 (V + 6599) - 0x1101, 0x1168, 0x11aa, 0, -#undef V1888 -#define V1888 (V + 6603) - 0x1101, 0x1168, 0x11ab, 0, -#undef V1889 -#define V1889 (V + 6607) - 0x1101, 0x1168, 0x11ac, 0, -#undef V1890 -#define V1890 (V + 6611) - 0x1101, 0x1168, 0x11ad, 0, -#undef V1891 -#define V1891 (V + 6615) - 0x1101, 0x1168, 0x11ae, 0, -#undef V1892 -#define V1892 (V + 6619) - 0x1101, 0x1168, 0x11af, 0, -#undef V1893 -#define V1893 (V + 6623) - 0x1101, 0x1168, 0x11b0, 0, -#undef V1894 -#define V1894 (V + 6627) - 0x1101, 0x1168, 0x11b1, 0, -#undef V1895 -#define V1895 (V + 6631) - 0x1101, 0x1168, 0x11b2, 0, -#undef V1896 -#define V1896 (V + 6635) - 0x1101, 0x1168, 0x11b3, 0, -#undef V1897 -#define V1897 (V + 6639) - 0x1101, 0x1168, 0x11b4, 0, -#undef V1898 -#define V1898 (V + 6643) - 0x1101, 0x1168, 0x11b5, 0, -#undef V1899 -#define V1899 (V + 6647) - 0x1101, 0x1168, 0x11b6, 0, -#undef V1900 -#define V1900 (V + 6651) - 0x1101, 0x1168, 0x11b7, 0, -#undef V1901 -#define V1901 (V + 6655) - 0x1101, 0x1168, 0x11b8, 0, -#undef V1902 -#define V1902 (V + 6659) - 0x1101, 0x1168, 0x11b9, 0, -#undef V1903 -#define V1903 (V + 6663) - 0x1101, 0x1168, 0x11ba, 0, -#undef V1904 -#define V1904 (V + 6667) - 0x1101, 0x1168, 0x11bb, 0, -#undef V1905 -#define V1905 (V + 6671) - 0x1101, 0x1168, 0x11bc, 0, -#undef V1906 -#define V1906 (V + 6675) - 0x1101, 0x1168, 0x11bd, 0, -#undef V1907 -#define V1907 (V + 6679) - 0x1101, 0x1168, 0x11be, 0, -#undef V1908 -#define V1908 (V + 6683) - 0x1101, 0x1168, 0x11bf, 0, -#undef V1909 -#define V1909 (V + 6687) - 0x1101, 0x1168, 0x11c0, 0, -#undef V1910 -#define V1910 (V + 6691) - 0x1101, 0x1168, 0x11c1, 0, -#undef V1911 -#define V1911 (V + 6695) - 0x1101, 0x1168, 0x11c2, 0, -#undef V1912 -#define V1912 (V + 6699) - 0x1101, 0x1169, 0, -#undef V1913 -#define V1913 (V + 6702) - 0x1101, 0x1169, 0x11a8, 0, -#undef V1914 -#define V1914 (V + 6706) - 0x1101, 0x1169, 0x11a9, 0, -#undef V1915 -#define V1915 (V + 6710) - 0x1101, 0x1169, 0x11aa, 0, -#undef V1916 -#define V1916 (V + 6714) - 0x1101, 0x1169, 0x11ab, 0, -#undef V1917 -#define V1917 (V + 6718) - 0x1101, 0x1169, 0x11ac, 0, -#undef V1918 -#define V1918 (V + 6722) - 0x1101, 0x1169, 0x11ad, 0, -#undef V1919 -#define V1919 (V + 6726) - 0x1101, 0x1169, 0x11ae, 0, -#undef V1920 -#define V1920 (V + 6730) - 0x1101, 0x1169, 0x11af, 0, -#undef V1921 -#define V1921 (V + 6734) - 0x1101, 0x1169, 0x11b0, 0, -#undef V1922 -#define V1922 (V + 6738) - 0x1101, 0x1169, 0x11b1, 0, -#undef V1923 -#define V1923 (V + 6742) - 0x1101, 0x1169, 0x11b2, 0, -#undef V1924 -#define V1924 (V + 6746) - 0x1101, 0x1169, 0x11b3, 0, -#undef V1925 -#define V1925 (V + 6750) - 0x1101, 0x1169, 0x11b4, 0, -#undef V1926 -#define V1926 (V + 6754) - 0x1101, 0x1169, 0x11b5, 0, -#undef V1927 -#define V1927 (V + 6758) - 0x1101, 0x1169, 0x11b6, 0, -#undef V1928 -#define V1928 (V + 6762) - 0x1101, 0x1169, 0x11b7, 0, -#undef V1929 -#define V1929 (V + 6766) - 0x1101, 0x1169, 0x11b8, 0, -#undef V1930 -#define V1930 (V + 6770) - 0x1101, 0x1169, 0x11b9, 0, -#undef V1931 -#define V1931 (V + 6774) - 0x1101, 0x1169, 0x11ba, 0, -#undef V1932 -#define V1932 (V + 6778) - 0x1101, 0x1169, 0x11bb, 0, -#undef V1933 -#define V1933 (V + 6782) - 0x1101, 0x1169, 0x11bc, 0, -#undef V1934 -#define V1934 (V + 6786) - 0x1101, 0x1169, 0x11bd, 0, -#undef V1935 -#define V1935 (V + 6790) - 0x1101, 0x1169, 0x11be, 0, -#undef V1936 -#define V1936 (V + 6794) - 0x1101, 0x1169, 0x11bf, 0, -#undef V1937 -#define V1937 (V + 6798) - 0x1101, 0x1169, 0x11c0, 0, -#undef V1938 -#define V1938 (V + 6802) - 0x1101, 0x1169, 0x11c1, 0, -#undef V1939 -#define V1939 (V + 6806) - 0x1101, 0x1169, 0x11c2, 0, -#undef V1940 -#define V1940 (V + 6810) - 0x1101, 0x116a, 0, -#undef V1941 -#define V1941 (V + 6813) - 0x1101, 0x116a, 0x11a8, 0, -#undef V1942 -#define V1942 (V + 6817) - 0x1101, 0x116a, 0x11a9, 0, -#undef V1943 -#define V1943 (V + 6821) - 0x1101, 0x116a, 0x11aa, 0, -#undef V1944 -#define V1944 (V + 6825) - 0x1101, 0x116a, 0x11ab, 0, -#undef V1945 -#define V1945 (V + 6829) - 0x1101, 0x116a, 0x11ac, 0, -#undef V1946 -#define V1946 (V + 6833) - 0x1101, 0x116a, 0x11ad, 0, -#undef V1947 -#define V1947 (V + 6837) - 0x1101, 0x116a, 0x11ae, 0, -#undef V1948 -#define V1948 (V + 6841) - 0x1101, 0x116a, 0x11af, 0, -#undef V1949 -#define V1949 (V + 6845) - 0x1101, 0x116a, 0x11b0, 0, -#undef V1950 -#define V1950 (V + 6849) - 0x1101, 0x116a, 0x11b1, 0, -#undef V1951 -#define V1951 (V + 6853) - 0x1101, 0x116a, 0x11b2, 0, -#undef V1952 -#define V1952 (V + 6857) - 0x1101, 0x116a, 0x11b3, 0, -#undef V1953 -#define V1953 (V + 6861) - 0x1101, 0x116a, 0x11b4, 0, -#undef V1954 -#define V1954 (V + 6865) - 0x1101, 0x116a, 0x11b5, 0, -#undef V1955 -#define V1955 (V + 6869) - 0x1101, 0x116a, 0x11b6, 0, -#undef V1956 -#define V1956 (V + 6873) - 0x1101, 0x116a, 0x11b7, 0, -#undef V1957 -#define V1957 (V + 6877) - 0x1101, 0x116a, 0x11b8, 0, -#undef V1958 -#define V1958 (V + 6881) - 0x1101, 0x116a, 0x11b9, 0, -#undef V1959 -#define V1959 (V + 6885) - 0x1101, 0x116a, 0x11ba, 0, -#undef V1960 -#define V1960 (V + 6889) - 0x1101, 0x116a, 0x11bb, 0, -#undef V1961 -#define V1961 (V + 6893) - 0x1101, 0x116a, 0x11bc, 0, -#undef V1962 -#define V1962 (V + 6897) - 0x1101, 0x116a, 0x11bd, 0, -#undef V1963 -#define V1963 (V + 6901) - 0x1101, 0x116a, 0x11be, 0, -#undef V1964 -#define V1964 (V + 6905) - 0x1101, 0x116a, 0x11bf, 0, -#undef V1965 -#define V1965 (V + 6909) - 0x1101, 0x116a, 0x11c0, 0, -#undef V1966 -#define V1966 (V + 6913) - 0x1101, 0x116a, 0x11c1, 0, -#undef V1967 -#define V1967 (V + 6917) - 0x1101, 0x116a, 0x11c2, 0, -#undef V1968 -#define V1968 (V + 6921) - 0x1101, 0x116b, 0, -#undef V1969 -#define V1969 (V + 6924) - 0x1101, 0x116b, 0x11a8, 0, -#undef V1970 -#define V1970 (V + 6928) - 0x1101, 0x116b, 0x11a9, 0, -#undef V1971 -#define V1971 (V + 6932) - 0x1101, 0x116b, 0x11aa, 0, -#undef V1972 -#define V1972 (V + 6936) - 0x1101, 0x116b, 0x11ab, 0, -#undef V1973 -#define V1973 (V + 6940) - 0x1101, 0x116b, 0x11ac, 0, -#undef V1974 -#define V1974 (V + 6944) - 0x1101, 0x116b, 0x11ad, 0, -#undef V1975 -#define V1975 (V + 6948) - 0x1101, 0x116b, 0x11ae, 0, -#undef V1976 -#define V1976 (V + 6952) - 0x1101, 0x116b, 0x11af, 0, -#undef V1977 -#define V1977 (V + 6956) - 0x1101, 0x116b, 0x11b0, 0, -#undef V1978 -#define V1978 (V + 6960) - 0x1101, 0x116b, 0x11b1, 0, -#undef V1979 -#define V1979 (V + 6964) - 0x1101, 0x116b, 0x11b2, 0, -#undef V1980 -#define V1980 (V + 6968) - 0x1101, 0x116b, 0x11b3, 0, -#undef V1981 -#define V1981 (V + 6972) - 0x1101, 0x116b, 0x11b4, 0, -#undef V1982 -#define V1982 (V + 6976) - 0x1101, 0x116b, 0x11b5, 0, -#undef V1983 -#define V1983 (V + 6980) - 0x1101, 0x116b, 0x11b6, 0, -#undef V1984 -#define V1984 (V + 6984) - 0x1101, 0x116b, 0x11b7, 0, -#undef V1985 -#define V1985 (V + 6988) - 0x1101, 0x116b, 0x11b8, 0, -#undef V1986 -#define V1986 (V + 6992) - 0x1101, 0x116b, 0x11b9, 0, -#undef V1987 -#define V1987 (V + 6996) - 0x1101, 0x116b, 0x11ba, 0, -#undef V1988 -#define V1988 (V + 7000) - 0x1101, 0x116b, 0x11bb, 0, -#undef V1989 -#define V1989 (V + 7004) - 0x1101, 0x116b, 0x11bc, 0, -#undef V1990 -#define V1990 (V + 7008) - 0x1101, 0x116b, 0x11bd, 0, -#undef V1991 -#define V1991 (V + 7012) - 0x1101, 0x116b, 0x11be, 0, -#undef V1992 -#define V1992 (V + 7016) - 0x1101, 0x116b, 0x11bf, 0, -#undef V1993 -#define V1993 (V + 7020) - 0x1101, 0x116b, 0x11c0, 0, -#undef V1994 -#define V1994 (V + 7024) - 0x1101, 0x116b, 0x11c1, 0, -#undef V1995 -#define V1995 (V + 7028) - 0x1101, 0x116b, 0x11c2, 0, -#undef V1996 -#define V1996 (V + 7032) - 0x1101, 0x116c, 0, -#undef V1997 -#define V1997 (V + 7035) - 0x1101, 0x116c, 0x11a8, 0, -#undef V1998 -#define V1998 (V + 7039) - 0x1101, 0x116c, 0x11a9, 0, -#undef V1999 -#define V1999 (V + 7043) - 0x1101, 0x116c, 0x11aa, 0, -#undef V2000 -#define V2000 (V + 7047) - 0x1101, 0x116c, 0x11ab, 0, -#undef V2001 -#define V2001 (V + 7051) - 0x1101, 0x116c, 0x11ac, 0, -#undef V2002 -#define V2002 (V + 7055) - 0x1101, 0x116c, 0x11ad, 0, -#undef V2003 -#define V2003 (V + 7059) - 0x1101, 0x116c, 0x11ae, 0, -#undef V2004 -#define V2004 (V + 7063) - 0x1101, 0x116c, 0x11af, 0, -#undef V2005 -#define V2005 (V + 7067) - 0x1101, 0x116c, 0x11b0, 0, -#undef V2006 -#define V2006 (V + 7071) - 0x1101, 0x116c, 0x11b1, 0, -#undef V2007 -#define V2007 (V + 7075) - 0x1101, 0x116c, 0x11b2, 0, -#undef V2008 -#define V2008 (V + 7079) - 0x1101, 0x116c, 0x11b3, 0, -#undef V2009 -#define V2009 (V + 7083) - 0x1101, 0x116c, 0x11b4, 0, -#undef V2010 -#define V2010 (V + 7087) - 0x1101, 0x116c, 0x11b5, 0, -#undef V2011 -#define V2011 (V + 7091) - 0x1101, 0x116c, 0x11b6, 0, -#undef V2012 -#define V2012 (V + 7095) - 0x1101, 0x116c, 0x11b7, 0, -#undef V2013 -#define V2013 (V + 7099) - 0x1101, 0x116c, 0x11b8, 0, -#undef V2014 -#define V2014 (V + 7103) - 0x1101, 0x116c, 0x11b9, 0, -#undef V2015 -#define V2015 (V + 7107) - 0x1101, 0x116c, 0x11ba, 0, -#undef V2016 -#define V2016 (V + 7111) - 0x1101, 0x116c, 0x11bb, 0, -#undef V2017 -#define V2017 (V + 7115) - 0x1101, 0x116c, 0x11bc, 0, -#undef V2018 -#define V2018 (V + 7119) - 0x1101, 0x116c, 0x11bd, 0, -#undef V2019 -#define V2019 (V + 7123) - 0x1101, 0x116c, 0x11be, 0, -#undef V2020 -#define V2020 (V + 7127) - 0x1101, 0x116c, 0x11bf, 0, -#undef V2021 -#define V2021 (V + 7131) - 0x1101, 0x116c, 0x11c0, 0, -#undef V2022 -#define V2022 (V + 7135) - 0x1101, 0x116c, 0x11c1, 0, -#undef V2023 -#define V2023 (V + 7139) - 0x1101, 0x116c, 0x11c2, 0, -#undef V2024 -#define V2024 (V + 7143) - 0x1101, 0x116d, 0, -#undef V2025 -#define V2025 (V + 7146) - 0x1101, 0x116d, 0x11a8, 0, -#undef V2026 -#define V2026 (V + 7150) - 0x1101, 0x116d, 0x11a9, 0, -#undef V2027 -#define V2027 (V + 7154) - 0x1101, 0x116d, 0x11aa, 0, -#undef V2028 -#define V2028 (V + 7158) - 0x1101, 0x116d, 0x11ab, 0, -#undef V2029 -#define V2029 (V + 7162) - 0x1101, 0x116d, 0x11ac, 0, -#undef V2030 -#define V2030 (V + 7166) - 0x1101, 0x116d, 0x11ad, 0, -#undef V2031 -#define V2031 (V + 7170) - 0x1101, 0x116d, 0x11ae, 0, -#undef V2032 -#define V2032 (V + 7174) - 0x1101, 0x116d, 0x11af, 0, -#undef V2033 -#define V2033 (V + 7178) - 0x1101, 0x116d, 0x11b0, 0, -#undef V2034 -#define V2034 (V + 7182) - 0x1101, 0x116d, 0x11b1, 0, -#undef V2035 -#define V2035 (V + 7186) - 0x1101, 0x116d, 0x11b2, 0, -#undef V2036 -#define V2036 (V + 7190) - 0x1101, 0x116d, 0x11b3, 0, -#undef V2037 -#define V2037 (V + 7194) - 0x1101, 0x116d, 0x11b4, 0, -#undef V2038 -#define V2038 (V + 7198) - 0x1101, 0x116d, 0x11b5, 0, -#undef V2039 -#define V2039 (V + 7202) - 0x1101, 0x116d, 0x11b6, 0, -#undef V2040 -#define V2040 (V + 7206) - 0x1101, 0x116d, 0x11b7, 0, -#undef V2041 -#define V2041 (V + 7210) - 0x1101, 0x116d, 0x11b8, 0, -#undef V2042 -#define V2042 (V + 7214) - 0x1101, 0x116d, 0x11b9, 0, -#undef V2043 -#define V2043 (V + 7218) - 0x1101, 0x116d, 0x11ba, 0, -#undef V2044 -#define V2044 (V + 7222) - 0x1101, 0x116d, 0x11bb, 0, -#undef V2045 -#define V2045 (V + 7226) - 0x1101, 0x116d, 0x11bc, 0, -#undef V2046 -#define V2046 (V + 7230) - 0x1101, 0x116d, 0x11bd, 0, -#undef V2047 -#define V2047 (V + 7234) - 0x1101, 0x116d, 0x11be, 0, -#undef V2048 -#define V2048 (V + 7238) - 0x1101, 0x116d, 0x11bf, 0, -#undef V2049 -#define V2049 (V + 7242) - 0x1101, 0x116d, 0x11c0, 0, -#undef V2050 -#define V2050 (V + 7246) - 0x1101, 0x116d, 0x11c1, 0, -#undef V2051 -#define V2051 (V + 7250) - 0x1101, 0x116d, 0x11c2, 0, -#undef V2052 -#define V2052 (V + 7254) - 0x1101, 0x116e, 0, -#undef V2053 -#define V2053 (V + 7257) - 0x1101, 0x116e, 0x11a8, 0, -#undef V2054 -#define V2054 (V + 7261) - 0x1101, 0x116e, 0x11a9, 0, -#undef V2055 -#define V2055 (V + 7265) - 0x1101, 0x116e, 0x11aa, 0, -#undef V2056 -#define V2056 (V + 7269) - 0x1101, 0x116e, 0x11ab, 0, -#undef V2057 -#define V2057 (V + 7273) - 0x1101, 0x116e, 0x11ac, 0, -#undef V2058 -#define V2058 (V + 7277) - 0x1101, 0x116e, 0x11ad, 0, -#undef V2059 -#define V2059 (V + 7281) - 0x1101, 0x116e, 0x11ae, 0, -#undef V2060 -#define V2060 (V + 7285) - 0x1101, 0x116e, 0x11af, 0, -#undef V2061 -#define V2061 (V + 7289) - 0x1101, 0x116e, 0x11b0, 0, -#undef V2062 -#define V2062 (V + 7293) - 0x1101, 0x116e, 0x11b1, 0, -#undef V2063 -#define V2063 (V + 7297) - 0x1101, 0x116e, 0x11b2, 0, -#undef V2064 -#define V2064 (V + 7301) - 0x1101, 0x116e, 0x11b3, 0, -#undef V2065 -#define V2065 (V + 7305) - 0x1101, 0x116e, 0x11b4, 0, -#undef V2066 -#define V2066 (V + 7309) - 0x1101, 0x116e, 0x11b5, 0, -#undef V2067 -#define V2067 (V + 7313) - 0x1101, 0x116e, 0x11b6, 0, -#undef V2068 -#define V2068 (V + 7317) - 0x1101, 0x116e, 0x11b7, 0, -#undef V2069 -#define V2069 (V + 7321) - 0x1101, 0x116e, 0x11b8, 0, -#undef V2070 -#define V2070 (V + 7325) - 0x1101, 0x116e, 0x11b9, 0, -#undef V2071 -#define V2071 (V + 7329) - 0x1101, 0x116e, 0x11ba, 0, -#undef V2072 -#define V2072 (V + 7333) - 0x1101, 0x116e, 0x11bb, 0, -#undef V2073 -#define V2073 (V + 7337) - 0x1101, 0x116e, 0x11bc, 0, -#undef V2074 -#define V2074 (V + 7341) - 0x1101, 0x116e, 0x11bd, 0, -#undef V2075 -#define V2075 (V + 7345) - 0x1101, 0x116e, 0x11be, 0, -#undef V2076 -#define V2076 (V + 7349) - 0x1101, 0x116e, 0x11bf, 0, -#undef V2077 -#define V2077 (V + 7353) - 0x1101, 0x116e, 0x11c0, 0, -#undef V2078 -#define V2078 (V + 7357) - 0x1101, 0x116e, 0x11c1, 0, -#undef V2079 -#define V2079 (V + 7361) - 0x1101, 0x116e, 0x11c2, 0, -#undef V2080 -#define V2080 (V + 7365) - 0x1101, 0x116f, 0, -#undef V2081 -#define V2081 (V + 7368) - 0x1101, 0x116f, 0x11a8, 0, -#undef V2082 -#define V2082 (V + 7372) - 0x1101, 0x116f, 0x11a9, 0, -#undef V2083 -#define V2083 (V + 7376) - 0x1101, 0x116f, 0x11aa, 0, -#undef V2084 -#define V2084 (V + 7380) - 0x1101, 0x116f, 0x11ab, 0, -#undef V2085 -#define V2085 (V + 7384) - 0x1101, 0x116f, 0x11ac, 0, -#undef V2086 -#define V2086 (V + 7388) - 0x1101, 0x116f, 0x11ad, 0, -#undef V2087 -#define V2087 (V + 7392) - 0x1101, 0x116f, 0x11ae, 0, -#undef V2088 -#define V2088 (V + 7396) - 0x1101, 0x116f, 0x11af, 0, -#undef V2089 -#define V2089 (V + 7400) - 0x1101, 0x116f, 0x11b0, 0, -#undef V2090 -#define V2090 (V + 7404) - 0x1101, 0x116f, 0x11b1, 0, -#undef V2091 -#define V2091 (V + 7408) - 0x1101, 0x116f, 0x11b2, 0, -#undef V2092 -#define V2092 (V + 7412) - 0x1101, 0x116f, 0x11b3, 0, -#undef V2093 -#define V2093 (V + 7416) - 0x1101, 0x116f, 0x11b4, 0, -#undef V2094 -#define V2094 (V + 7420) - 0x1101, 0x116f, 0x11b5, 0, -#undef V2095 -#define V2095 (V + 7424) - 0x1101, 0x116f, 0x11b6, 0, -#undef V2096 -#define V2096 (V + 7428) - 0x1101, 0x116f, 0x11b7, 0, -#undef V2097 -#define V2097 (V + 7432) - 0x1101, 0x116f, 0x11b8, 0, -#undef V2098 -#define V2098 (V + 7436) - 0x1101, 0x116f, 0x11b9, 0, -#undef V2099 -#define V2099 (V + 7440) - 0x1101, 0x116f, 0x11ba, 0, -#undef V2100 -#define V2100 (V + 7444) - 0x1101, 0x116f, 0x11bb, 0, -#undef V2101 -#define V2101 (V + 7448) - 0x1101, 0x116f, 0x11bc, 0, -#undef V2102 -#define V2102 (V + 7452) - 0x1101, 0x116f, 0x11bd, 0, -#undef V2103 -#define V2103 (V + 7456) - 0x1101, 0x116f, 0x11be, 0, -#undef V2104 -#define V2104 (V + 7460) - 0x1101, 0x116f, 0x11bf, 0, -#undef V2105 -#define V2105 (V + 7464) - 0x1101, 0x116f, 0x11c0, 0, -#undef V2106 -#define V2106 (V + 7468) - 0x1101, 0x116f, 0x11c1, 0, -#undef V2107 -#define V2107 (V + 7472) - 0x1101, 0x116f, 0x11c2, 0, -#undef V2108 -#define V2108 (V + 7476) - 0x1101, 0x1170, 0, -#undef V2109 -#define V2109 (V + 7479) - 0x1101, 0x1170, 0x11a8, 0, -#undef V2110 -#define V2110 (V + 7483) - 0x1101, 0x1170, 0x11a9, 0, -#undef V2111 -#define V2111 (V + 7487) - 0x1101, 0x1170, 0x11aa, 0, -#undef V2112 -#define V2112 (V + 7491) - 0x1101, 0x1170, 0x11ab, 0, -#undef V2113 -#define V2113 (V + 7495) - 0x1101, 0x1170, 0x11ac, 0, -#undef V2114 -#define V2114 (V + 7499) - 0x1101, 0x1170, 0x11ad, 0, -#undef V2115 -#define V2115 (V + 7503) - 0x1101, 0x1170, 0x11ae, 0, -#undef V2116 -#define V2116 (V + 7507) - 0x1101, 0x1170, 0x11af, 0, -#undef V2117 -#define V2117 (V + 7511) - 0x1101, 0x1170, 0x11b0, 0, -#undef V2118 -#define V2118 (V + 7515) - 0x1101, 0x1170, 0x11b1, 0, -#undef V2119 -#define V2119 (V + 7519) - 0x1101, 0x1170, 0x11b2, 0, -#undef V2120 -#define V2120 (V + 7523) - 0x1101, 0x1170, 0x11b3, 0, -#undef V2121 -#define V2121 (V + 7527) - 0x1101, 0x1170, 0x11b4, 0, -#undef V2122 -#define V2122 (V + 7531) - 0x1101, 0x1170, 0x11b5, 0, -#undef V2123 -#define V2123 (V + 7535) - 0x1101, 0x1170, 0x11b6, 0, -#undef V2124 -#define V2124 (V + 7539) - 0x1101, 0x1170, 0x11b7, 0, -#undef V2125 -#define V2125 (V + 7543) - 0x1101, 0x1170, 0x11b8, 0, -#undef V2126 -#define V2126 (V + 7547) - 0x1101, 0x1170, 0x11b9, 0, -#undef V2127 -#define V2127 (V + 7551) - 0x1101, 0x1170, 0x11ba, 0, -#undef V2128 -#define V2128 (V + 7555) - 0x1101, 0x1170, 0x11bb, 0, -#undef V2129 -#define V2129 (V + 7559) - 0x1101, 0x1170, 0x11bc, 0, -#undef V2130 -#define V2130 (V + 7563) - 0x1101, 0x1170, 0x11bd, 0, -#undef V2131 -#define V2131 (V + 7567) - 0x1101, 0x1170, 0x11be, 0, -#undef V2132 -#define V2132 (V + 7571) - 0x1101, 0x1170, 0x11bf, 0, -#undef V2133 -#define V2133 (V + 7575) - 0x1101, 0x1170, 0x11c0, 0, -#undef V2134 -#define V2134 (V + 7579) - 0x1101, 0x1170, 0x11c1, 0, -#undef V2135 -#define V2135 (V + 7583) - 0x1101, 0x1170, 0x11c2, 0, -#undef V2136 -#define V2136 (V + 7587) - 0x1101, 0x1171, 0, -#undef V2137 -#define V2137 (V + 7590) - 0x1101, 0x1171, 0x11a8, 0, -#undef V2138 -#define V2138 (V + 7594) - 0x1101, 0x1171, 0x11a9, 0, -#undef V2139 -#define V2139 (V + 7598) - 0x1101, 0x1171, 0x11aa, 0, -#undef V2140 -#define V2140 (V + 7602) - 0x1101, 0x1171, 0x11ab, 0, -#undef V2141 -#define V2141 (V + 7606) - 0x1101, 0x1171, 0x11ac, 0, -#undef V2142 -#define V2142 (V + 7610) - 0x1101, 0x1171, 0x11ad, 0, -#undef V2143 -#define V2143 (V + 7614) - 0x1101, 0x1171, 0x11ae, 0, -#undef V2144 -#define V2144 (V + 7618) - 0x1101, 0x1171, 0x11af, 0, -#undef V2145 -#define V2145 (V + 7622) - 0x1101, 0x1171, 0x11b0, 0, -#undef V2146 -#define V2146 (V + 7626) - 0x1101, 0x1171, 0x11b1, 0, -#undef V2147 -#define V2147 (V + 7630) - 0x1101, 0x1171, 0x11b2, 0, -#undef V2148 -#define V2148 (V + 7634) - 0x1101, 0x1171, 0x11b3, 0, -#undef V2149 -#define V2149 (V + 7638) - 0x1101, 0x1171, 0x11b4, 0, -#undef V2150 -#define V2150 (V + 7642) - 0x1101, 0x1171, 0x11b5, 0, -#undef V2151 -#define V2151 (V + 7646) - 0x1101, 0x1171, 0x11b6, 0, -#undef V2152 -#define V2152 (V + 7650) - 0x1101, 0x1171, 0x11b7, 0, -#undef V2153 -#define V2153 (V + 7654) - 0x1101, 0x1171, 0x11b8, 0, -#undef V2154 -#define V2154 (V + 7658) - 0x1101, 0x1171, 0x11b9, 0, -#undef V2155 -#define V2155 (V + 7662) - 0x1101, 0x1171, 0x11ba, 0, -#undef V2156 -#define V2156 (V + 7666) - 0x1101, 0x1171, 0x11bb, 0, -#undef V2157 -#define V2157 (V + 7670) - 0x1101, 0x1171, 0x11bc, 0, -#undef V2158 -#define V2158 (V + 7674) - 0x1101, 0x1171, 0x11bd, 0, -#undef V2159 -#define V2159 (V + 7678) - 0x1101, 0x1171, 0x11be, 0, -#undef V2160 -#define V2160 (V + 7682) - 0x1101, 0x1171, 0x11bf, 0, -#undef V2161 -#define V2161 (V + 7686) - 0x1101, 0x1171, 0x11c0, 0, -#undef V2162 -#define V2162 (V + 7690) - 0x1101, 0x1171, 0x11c1, 0, -#undef V2163 -#define V2163 (V + 7694) - 0x1101, 0x1171, 0x11c2, 0, -#undef V2164 -#define V2164 (V + 7698) - 0x1101, 0x1172, 0, -#undef V2165 -#define V2165 (V + 7701) - 0x1101, 0x1172, 0x11a8, 0, -#undef V2166 -#define V2166 (V + 7705) - 0x1101, 0x1172, 0x11a9, 0, -#undef V2167 -#define V2167 (V + 7709) - 0x1101, 0x1172, 0x11aa, 0, -#undef V2168 -#define V2168 (V + 7713) - 0x1101, 0x1172, 0x11ab, 0, -#undef V2169 -#define V2169 (V + 7717) - 0x1101, 0x1172, 0x11ac, 0, -#undef V2170 -#define V2170 (V + 7721) - 0x1101, 0x1172, 0x11ad, 0, -#undef V2171 -#define V2171 (V + 7725) - 0x1101, 0x1172, 0x11ae, 0, -#undef V2172 -#define V2172 (V + 7729) - 0x1101, 0x1172, 0x11af, 0, -#undef V2173 -#define V2173 (V + 7733) - 0x1101, 0x1172, 0x11b0, 0, -#undef V2174 -#define V2174 (V + 7737) - 0x1101, 0x1172, 0x11b1, 0, -#undef V2175 -#define V2175 (V + 7741) - 0x1101, 0x1172, 0x11b2, 0, -#undef V2176 -#define V2176 (V + 7745) - 0x1101, 0x1172, 0x11b3, 0, -#undef V2177 -#define V2177 (V + 7749) - 0x1101, 0x1172, 0x11b4, 0, -#undef V2178 -#define V2178 (V + 7753) - 0x1101, 0x1172, 0x11b5, 0, -#undef V2179 -#define V2179 (V + 7757) - 0x1101, 0x1172, 0x11b6, 0, -#undef V2180 -#define V2180 (V + 7761) - 0x1101, 0x1172, 0x11b7, 0, -#undef V2181 -#define V2181 (V + 7765) - 0x1101, 0x1172, 0x11b8, 0, -#undef V2182 -#define V2182 (V + 7769) - 0x1101, 0x1172, 0x11b9, 0, -#undef V2183 -#define V2183 (V + 7773) - 0x1101, 0x1172, 0x11ba, 0, -#undef V2184 -#define V2184 (V + 7777) - 0x1101, 0x1172, 0x11bb, 0, -#undef V2185 -#define V2185 (V + 7781) - 0x1101, 0x1172, 0x11bc, 0, -#undef V2186 -#define V2186 (V + 7785) - 0x1101, 0x1172, 0x11bd, 0, -#undef V2187 -#define V2187 (V + 7789) - 0x1101, 0x1172, 0x11be, 0, -#undef V2188 -#define V2188 (V + 7793) - 0x1101, 0x1172, 0x11bf, 0, -#undef V2189 -#define V2189 (V + 7797) - 0x1101, 0x1172, 0x11c0, 0, -#undef V2190 -#define V2190 (V + 7801) - 0x1101, 0x1172, 0x11c1, 0, -#undef V2191 -#define V2191 (V + 7805) - 0x1101, 0x1172, 0x11c2, 0, -#undef V2192 -#define V2192 (V + 7809) - 0x1101, 0x1173, 0, -#undef V2193 -#define V2193 (V + 7812) - 0x1101, 0x1173, 0x11a8, 0, -#undef V2194 -#define V2194 (V + 7816) - 0x1101, 0x1173, 0x11a9, 0, -#undef V2195 -#define V2195 (V + 7820) - 0x1101, 0x1173, 0x11aa, 0, -#undef V2196 -#define V2196 (V + 7824) - 0x1101, 0x1173, 0x11ab, 0, -#undef V2197 -#define V2197 (V + 7828) - 0x1101, 0x1173, 0x11ac, 0, -#undef V2198 -#define V2198 (V + 7832) - 0x1101, 0x1173, 0x11ad, 0, -#undef V2199 -#define V2199 (V + 7836) - 0x1101, 0x1173, 0x11ae, 0, -#undef V2200 -#define V2200 (V + 7840) - 0x1101, 0x1173, 0x11af, 0, -#undef V2201 -#define V2201 (V + 7844) - 0x1101, 0x1173, 0x11b0, 0, -#undef V2202 -#define V2202 (V + 7848) - 0x1101, 0x1173, 0x11b1, 0, -#undef V2203 -#define V2203 (V + 7852) - 0x1101, 0x1173, 0x11b2, 0, -#undef V2204 -#define V2204 (V + 7856) - 0x1101, 0x1173, 0x11b3, 0, -#undef V2205 -#define V2205 (V + 7860) - 0x1101, 0x1173, 0x11b4, 0, -#undef V2206 -#define V2206 (V + 7864) - 0x1101, 0x1173, 0x11b5, 0, -#undef V2207 -#define V2207 (V + 7868) - 0x1101, 0x1173, 0x11b6, 0, -#undef V2208 -#define V2208 (V + 7872) - 0x1101, 0x1173, 0x11b7, 0, -#undef V2209 -#define V2209 (V + 7876) - 0x1101, 0x1173, 0x11b8, 0, -#undef V2210 -#define V2210 (V + 7880) - 0x1101, 0x1173, 0x11b9, 0, -#undef V2211 -#define V2211 (V + 7884) - 0x1101, 0x1173, 0x11ba, 0, -#undef V2212 -#define V2212 (V + 7888) - 0x1101, 0x1173, 0x11bb, 0, -#undef V2213 -#define V2213 (V + 7892) - 0x1101, 0x1173, 0x11bc, 0, -#undef V2214 -#define V2214 (V + 7896) - 0x1101, 0x1173, 0x11bd, 0, -#undef V2215 -#define V2215 (V + 7900) - 0x1101, 0x1173, 0x11be, 0, -#undef V2216 -#define V2216 (V + 7904) - 0x1101, 0x1173, 0x11bf, 0, -#undef V2217 -#define V2217 (V + 7908) - 0x1101, 0x1173, 0x11c0, 0, -#undef V2218 -#define V2218 (V + 7912) - 0x1101, 0x1173, 0x11c1, 0, -#undef V2219 -#define V2219 (V + 7916) - 0x1101, 0x1173, 0x11c2, 0, -#undef V2220 -#define V2220 (V + 7920) - 0x1101, 0x1174, 0, -#undef V2221 -#define V2221 (V + 7923) - 0x1101, 0x1174, 0x11a8, 0, -#undef V2222 -#define V2222 (V + 7927) - 0x1101, 0x1174, 0x11a9, 0, -#undef V2223 -#define V2223 (V + 7931) - 0x1101, 0x1174, 0x11aa, 0, -#undef V2224 -#define V2224 (V + 7935) - 0x1101, 0x1174, 0x11ab, 0, -#undef V2225 -#define V2225 (V + 7939) - 0x1101, 0x1174, 0x11ac, 0, -#undef V2226 -#define V2226 (V + 7943) - 0x1101, 0x1174, 0x11ad, 0, -#undef V2227 -#define V2227 (V + 7947) - 0x1101, 0x1174, 0x11ae, 0, -#undef V2228 -#define V2228 (V + 7951) - 0x1101, 0x1174, 0x11af, 0, -#undef V2229 -#define V2229 (V + 7955) - 0x1101, 0x1174, 0x11b0, 0, -#undef V2230 -#define V2230 (V + 7959) - 0x1101, 0x1174, 0x11b1, 0, -#undef V2231 -#define V2231 (V + 7963) - 0x1101, 0x1174, 0x11b2, 0, -#undef V2232 -#define V2232 (V + 7967) - 0x1101, 0x1174, 0x11b3, 0, -#undef V2233 -#define V2233 (V + 7971) - 0x1101, 0x1174, 0x11b4, 0, -#undef V2234 -#define V2234 (V + 7975) - 0x1101, 0x1174, 0x11b5, 0, -#undef V2235 -#define V2235 (V + 7979) - 0x1101, 0x1174, 0x11b6, 0, -#undef V2236 -#define V2236 (V + 7983) - 0x1101, 0x1174, 0x11b7, 0, -#undef V2237 -#define V2237 (V + 7987) - 0x1101, 0x1174, 0x11b8, 0, -#undef V2238 -#define V2238 (V + 7991) - 0x1101, 0x1174, 0x11b9, 0, -#undef V2239 -#define V2239 (V + 7995) - 0x1101, 0x1174, 0x11ba, 0, -#undef V2240 -#define V2240 (V + 7999) - 0x1101, 0x1174, 0x11bb, 0, -#undef V2241 -#define V2241 (V + 8003) - 0x1101, 0x1174, 0x11bc, 0, -#undef V2242 -#define V2242 (V + 8007) - 0x1101, 0x1174, 0x11bd, 0, -#undef V2243 -#define V2243 (V + 8011) - 0x1101, 0x1174, 0x11be, 0, -#undef V2244 -#define V2244 (V + 8015) - 0x1101, 0x1174, 0x11bf, 0, -#undef V2245 -#define V2245 (V + 8019) - 0x1101, 0x1174, 0x11c0, 0, -#undef V2246 -#define V2246 (V + 8023) - 0x1101, 0x1174, 0x11c1, 0, -#undef V2247 -#define V2247 (V + 8027) - 0x1101, 0x1174, 0x11c2, 0, -#undef V2248 -#define V2248 (V + 8031) - 0x1101, 0x1175, 0, -#undef V2249 -#define V2249 (V + 8034) - 0x1101, 0x1175, 0x11a8, 0, -#undef V2250 -#define V2250 (V + 8038) - 0x1101, 0x1175, 0x11a9, 0, -#undef V2251 -#define V2251 (V + 8042) - 0x1101, 0x1175, 0x11aa, 0, -#undef V2252 -#define V2252 (V + 8046) - 0x1101, 0x1175, 0x11ab, 0, -#undef V2253 -#define V2253 (V + 8050) - 0x1101, 0x1175, 0x11ac, 0, -#undef V2254 -#define V2254 (V + 8054) - 0x1101, 0x1175, 0x11ad, 0, -#undef V2255 -#define V2255 (V + 8058) - 0x1101, 0x1175, 0x11ae, 0, -#undef V2256 -#define V2256 (V + 8062) - 0x1101, 0x1175, 0x11af, 0, -#undef V2257 -#define V2257 (V + 8066) - 0x1101, 0x1175, 0x11b0, 0, -#undef V2258 -#define V2258 (V + 8070) - 0x1101, 0x1175, 0x11b1, 0, -#undef V2259 -#define V2259 (V + 8074) - 0x1101, 0x1175, 0x11b2, 0, -#undef V2260 -#define V2260 (V + 8078) - 0x1101, 0x1175, 0x11b3, 0, -#undef V2261 -#define V2261 (V + 8082) - 0x1101, 0x1175, 0x11b4, 0, -#undef V2262 -#define V2262 (V + 8086) - 0x1101, 0x1175, 0x11b5, 0, -#undef V2263 -#define V2263 (V + 8090) - 0x1101, 0x1175, 0x11b6, 0, -#undef V2264 -#define V2264 (V + 8094) - 0x1101, 0x1175, 0x11b7, 0, -#undef V2265 -#define V2265 (V + 8098) - 0x1101, 0x1175, 0x11b8, 0, -#undef V2266 -#define V2266 (V + 8102) - 0x1101, 0x1175, 0x11b9, 0, -#undef V2267 -#define V2267 (V + 8106) - 0x1101, 0x1175, 0x11ba, 0, -#undef V2268 -#define V2268 (V + 8110) - 0x1101, 0x1175, 0x11bb, 0, -#undef V2269 -#define V2269 (V + 8114) - 0x1101, 0x1175, 0x11bc, 0, -#undef V2270 -#define V2270 (V + 8118) - 0x1101, 0x1175, 0x11bd, 0, -#undef V2271 -#define V2271 (V + 8122) - 0x1101, 0x1175, 0x11be, 0, -#undef V2272 -#define V2272 (V + 8126) - 0x1101, 0x1175, 0x11bf, 0, -#undef V2273 -#define V2273 (V + 8130) - 0x1101, 0x1175, 0x11c0, 0, -#undef V2274 -#define V2274 (V + 8134) - 0x1101, 0x1175, 0x11c1, 0, -#undef V2275 -#define V2275 (V + 8138) - 0x1101, 0x1175, 0x11c2, 0, -#undef V2276 -#define V2276 (V + 8142) - 0x1102, 0x1161, 0, -#undef V2277 -#define V2277 (V + 8145) - 0x1102, 0x1161, 0x11a8, 0, -#undef V2278 -#define V2278 (V + 8149) - 0x1102, 0x1161, 0x11a9, 0, -#undef V2279 -#define V2279 (V + 8153) - 0x1102, 0x1161, 0x11aa, 0, -#undef V2280 -#define V2280 (V + 8157) - 0x1102, 0x1161, 0x11ab, 0, -#undef V2281 -#define V2281 (V + 8161) - 0x1102, 0x1161, 0x11ac, 0, -#undef V2282 -#define V2282 (V + 8165) - 0x1102, 0x1161, 0x11ad, 0, -#undef V2283 -#define V2283 (V + 8169) - 0x1102, 0x1161, 0x11ae, 0, -#undef V2284 -#define V2284 (V + 8173) - 0x1102, 0x1161, 0x11af, 0, -#undef V2285 -#define V2285 (V + 8177) - 0x1102, 0x1161, 0x11b0, 0, -#undef V2286 -#define V2286 (V + 8181) - 0x1102, 0x1161, 0x11b1, 0, -#undef V2287 -#define V2287 (V + 8185) - 0x1102, 0x1161, 0x11b2, 0, -#undef V2288 -#define V2288 (V + 8189) - 0x1102, 0x1161, 0x11b3, 0, -#undef V2289 -#define V2289 (V + 8193) - 0x1102, 0x1161, 0x11b4, 0, -#undef V2290 -#define V2290 (V + 8197) - 0x1102, 0x1161, 0x11b5, 0, -#undef V2291 -#define V2291 (V + 8201) - 0x1102, 0x1161, 0x11b6, 0, -#undef V2292 -#define V2292 (V + 8205) - 0x1102, 0x1161, 0x11b7, 0, -#undef V2293 -#define V2293 (V + 8209) - 0x1102, 0x1161, 0x11b8, 0, -#undef V2294 -#define V2294 (V + 8213) - 0x1102, 0x1161, 0x11b9, 0, -#undef V2295 -#define V2295 (V + 8217) - 0x1102, 0x1161, 0x11ba, 0, -#undef V2296 -#define V2296 (V + 8221) - 0x1102, 0x1161, 0x11bb, 0, -#undef V2297 -#define V2297 (V + 8225) - 0x1102, 0x1161, 0x11bc, 0, -#undef V2298 -#define V2298 (V + 8229) - 0x1102, 0x1161, 0x11bd, 0, -#undef V2299 -#define V2299 (V + 8233) - 0x1102, 0x1161, 0x11be, 0, -#undef V2300 -#define V2300 (V + 8237) - 0x1102, 0x1161, 0x11bf, 0, -#undef V2301 -#define V2301 (V + 8241) - 0x1102, 0x1161, 0x11c0, 0, -#undef V2302 -#define V2302 (V + 8245) - 0x1102, 0x1161, 0x11c1, 0, -#undef V2303 -#define V2303 (V + 8249) - 0x1102, 0x1161, 0x11c2, 0, -#undef V2304 -#define V2304 (V + 8253) - 0x1102, 0x1162, 0, -#undef V2305 -#define V2305 (V + 8256) - 0x1102, 0x1162, 0x11a8, 0, -#undef V2306 -#define V2306 (V + 8260) - 0x1102, 0x1162, 0x11a9, 0, -#undef V2307 -#define V2307 (V + 8264) - 0x1102, 0x1162, 0x11aa, 0, -#undef V2308 -#define V2308 (V + 8268) - 0x1102, 0x1162, 0x11ab, 0, -#undef V2309 -#define V2309 (V + 8272) - 0x1102, 0x1162, 0x11ac, 0, -#undef V2310 -#define V2310 (V + 8276) - 0x1102, 0x1162, 0x11ad, 0, -#undef V2311 -#define V2311 (V + 8280) - 0x1102, 0x1162, 0x11ae, 0, -#undef V2312 -#define V2312 (V + 8284) - 0x1102, 0x1162, 0x11af, 0, -#undef V2313 -#define V2313 (V + 8288) - 0x1102, 0x1162, 0x11b0, 0, -#undef V2314 -#define V2314 (V + 8292) - 0x1102, 0x1162, 0x11b1, 0, -#undef V2315 -#define V2315 (V + 8296) - 0x1102, 0x1162, 0x11b2, 0, -#undef V2316 -#define V2316 (V + 8300) - 0x1102, 0x1162, 0x11b3, 0, -#undef V2317 -#define V2317 (V + 8304) - 0x1102, 0x1162, 0x11b4, 0, -#undef V2318 -#define V2318 (V + 8308) - 0x1102, 0x1162, 0x11b5, 0, -#undef V2319 -#define V2319 (V + 8312) - 0x1102, 0x1162, 0x11b6, 0, -#undef V2320 -#define V2320 (V + 8316) - 0x1102, 0x1162, 0x11b7, 0, -#undef V2321 -#define V2321 (V + 8320) - 0x1102, 0x1162, 0x11b8, 0, -#undef V2322 -#define V2322 (V + 8324) - 0x1102, 0x1162, 0x11b9, 0, -#undef V2323 -#define V2323 (V + 8328) - 0x1102, 0x1162, 0x11ba, 0, -#undef V2324 -#define V2324 (V + 8332) - 0x1102, 0x1162, 0x11bb, 0, -#undef V2325 -#define V2325 (V + 8336) - 0x1102, 0x1162, 0x11bc, 0, -#undef V2326 -#define V2326 (V + 8340) - 0x1102, 0x1162, 0x11bd, 0, -#undef V2327 -#define V2327 (V + 8344) - 0x1102, 0x1162, 0x11be, 0, -#undef V2328 -#define V2328 (V + 8348) - 0x1102, 0x1162, 0x11bf, 0, -#undef V2329 -#define V2329 (V + 8352) - 0x1102, 0x1162, 0x11c0, 0, -#undef V2330 -#define V2330 (V + 8356) - 0x1102, 0x1162, 0x11c1, 0, -#undef V2331 -#define V2331 (V + 8360) - 0x1102, 0x1162, 0x11c2, 0, -#undef V2332 -#define V2332 (V + 8364) - 0x1102, 0x1163, 0, -#undef V2333 -#define V2333 (V + 8367) - 0x1102, 0x1163, 0x11a8, 0, -#undef V2334 -#define V2334 (V + 8371) - 0x1102, 0x1163, 0x11a9, 0, -#undef V2335 -#define V2335 (V + 8375) - 0x1102, 0x1163, 0x11aa, 0, -#undef V2336 -#define V2336 (V + 8379) - 0x1102, 0x1163, 0x11ab, 0, -#undef V2337 -#define V2337 (V + 8383) - 0x1102, 0x1163, 0x11ac, 0, -#undef V2338 -#define V2338 (V + 8387) - 0x1102, 0x1163, 0x11ad, 0, -#undef V2339 -#define V2339 (V + 8391) - 0x1102, 0x1163, 0x11ae, 0, -#undef V2340 -#define V2340 (V + 8395) - 0x1102, 0x1163, 0x11af, 0, -#undef V2341 -#define V2341 (V + 8399) - 0x1102, 0x1163, 0x11b0, 0, -#undef V2342 -#define V2342 (V + 8403) - 0x1102, 0x1163, 0x11b1, 0, -#undef V2343 -#define V2343 (V + 8407) - 0x1102, 0x1163, 0x11b2, 0, -#undef V2344 -#define V2344 (V + 8411) - 0x1102, 0x1163, 0x11b3, 0, -#undef V2345 -#define V2345 (V + 8415) - 0x1102, 0x1163, 0x11b4, 0, -#undef V2346 -#define V2346 (V + 8419) - 0x1102, 0x1163, 0x11b5, 0, -#undef V2347 -#define V2347 (V + 8423) - 0x1102, 0x1163, 0x11b6, 0, -#undef V2348 -#define V2348 (V + 8427) - 0x1102, 0x1163, 0x11b7, 0, -#undef V2349 -#define V2349 (V + 8431) - 0x1102, 0x1163, 0x11b8, 0, -#undef V2350 -#define V2350 (V + 8435) - 0x1102, 0x1163, 0x11b9, 0, -#undef V2351 -#define V2351 (V + 8439) - 0x1102, 0x1163, 0x11ba, 0, -#undef V2352 -#define V2352 (V + 8443) - 0x1102, 0x1163, 0x11bb, 0, -#undef V2353 -#define V2353 (V + 8447) - 0x1102, 0x1163, 0x11bc, 0, -#undef V2354 -#define V2354 (V + 8451) - 0x1102, 0x1163, 0x11bd, 0, -#undef V2355 -#define V2355 (V + 8455) - 0x1102, 0x1163, 0x11be, 0, -#undef V2356 -#define V2356 (V + 8459) - 0x1102, 0x1163, 0x11bf, 0, -#undef V2357 -#define V2357 (V + 8463) - 0x1102, 0x1163, 0x11c0, 0, -#undef V2358 -#define V2358 (V + 8467) - 0x1102, 0x1163, 0x11c1, 0, -#undef V2359 -#define V2359 (V + 8471) - 0x1102, 0x1163, 0x11c2, 0, -#undef V2360 -#define V2360 (V + 8475) - 0x1102, 0x1164, 0, -#undef V2361 -#define V2361 (V + 8478) - 0x1102, 0x1164, 0x11a8, 0, -#undef V2362 -#define V2362 (V + 8482) - 0x1102, 0x1164, 0x11a9, 0, -#undef V2363 -#define V2363 (V + 8486) - 0x1102, 0x1164, 0x11aa, 0, -#undef V2364 -#define V2364 (V + 8490) - 0x1102, 0x1164, 0x11ab, 0, -#undef V2365 -#define V2365 (V + 8494) - 0x1102, 0x1164, 0x11ac, 0, -#undef V2366 -#define V2366 (V + 8498) - 0x1102, 0x1164, 0x11ad, 0, -#undef V2367 -#define V2367 (V + 8502) - 0x1102, 0x1164, 0x11ae, 0, -#undef V2368 -#define V2368 (V + 8506) - 0x1102, 0x1164, 0x11af, 0, -#undef V2369 -#define V2369 (V + 8510) - 0x1102, 0x1164, 0x11b0, 0, -#undef V2370 -#define V2370 (V + 8514) - 0x1102, 0x1164, 0x11b1, 0, -#undef V2371 -#define V2371 (V + 8518) - 0x1102, 0x1164, 0x11b2, 0, -#undef V2372 -#define V2372 (V + 8522) - 0x1102, 0x1164, 0x11b3, 0, -#undef V2373 -#define V2373 (V + 8526) - 0x1102, 0x1164, 0x11b4, 0, -#undef V2374 -#define V2374 (V + 8530) - 0x1102, 0x1164, 0x11b5, 0, -#undef V2375 -#define V2375 (V + 8534) - 0x1102, 0x1164, 0x11b6, 0, -#undef V2376 -#define V2376 (V + 8538) - 0x1102, 0x1164, 0x11b7, 0, -#undef V2377 -#define V2377 (V + 8542) - 0x1102, 0x1164, 0x11b8, 0, -#undef V2378 -#define V2378 (V + 8546) - 0x1102, 0x1164, 0x11b9, 0, -#undef V2379 -#define V2379 (V + 8550) - 0x1102, 0x1164, 0x11ba, 0, -#undef V2380 -#define V2380 (V + 8554) - 0x1102, 0x1164, 0x11bb, 0, -#undef V2381 -#define V2381 (V + 8558) - 0x1102, 0x1164, 0x11bc, 0, -#undef V2382 -#define V2382 (V + 8562) - 0x1102, 0x1164, 0x11bd, 0, -#undef V2383 -#define V2383 (V + 8566) - 0x1102, 0x1164, 0x11be, 0, -#undef V2384 -#define V2384 (V + 8570) - 0x1102, 0x1164, 0x11bf, 0, -#undef V2385 -#define V2385 (V + 8574) - 0x1102, 0x1164, 0x11c0, 0, -#undef V2386 -#define V2386 (V + 8578) - 0x1102, 0x1164, 0x11c1, 0, -#undef V2387 -#define V2387 (V + 8582) - 0x1102, 0x1164, 0x11c2, 0, -#undef V2388 -#define V2388 (V + 8586) - 0x1102, 0x1165, 0, -#undef V2389 -#define V2389 (V + 8589) - 0x1102, 0x1165, 0x11a8, 0, -#undef V2390 -#define V2390 (V + 8593) - 0x1102, 0x1165, 0x11a9, 0, -#undef V2391 -#define V2391 (V + 8597) - 0x1102, 0x1165, 0x11aa, 0, -#undef V2392 -#define V2392 (V + 8601) - 0x1102, 0x1165, 0x11ab, 0, -#undef V2393 -#define V2393 (V + 8605) - 0x1102, 0x1165, 0x11ac, 0, -#undef V2394 -#define V2394 (V + 8609) - 0x1102, 0x1165, 0x11ad, 0, -#undef V2395 -#define V2395 (V + 8613) - 0x1102, 0x1165, 0x11ae, 0, -#undef V2396 -#define V2396 (V + 8617) - 0x1102, 0x1165, 0x11af, 0, -#undef V2397 -#define V2397 (V + 8621) - 0x1102, 0x1165, 0x11b0, 0, -#undef V2398 -#define V2398 (V + 8625) - 0x1102, 0x1165, 0x11b1, 0, -#undef V2399 -#define V2399 (V + 8629) - 0x1102, 0x1165, 0x11b2, 0, -#undef V2400 -#define V2400 (V + 8633) - 0x1102, 0x1165, 0x11b3, 0, -#undef V2401 -#define V2401 (V + 8637) - 0x1102, 0x1165, 0x11b4, 0, -#undef V2402 -#define V2402 (V + 8641) - 0x1102, 0x1165, 0x11b5, 0, -#undef V2403 -#define V2403 (V + 8645) - 0x1102, 0x1165, 0x11b6, 0, -#undef V2404 -#define V2404 (V + 8649) - 0x1102, 0x1165, 0x11b7, 0, -#undef V2405 -#define V2405 (V + 8653) - 0x1102, 0x1165, 0x11b8, 0, -#undef V2406 -#define V2406 (V + 8657) - 0x1102, 0x1165, 0x11b9, 0, -#undef V2407 -#define V2407 (V + 8661) - 0x1102, 0x1165, 0x11ba, 0, -#undef V2408 -#define V2408 (V + 8665) - 0x1102, 0x1165, 0x11bb, 0, -#undef V2409 -#define V2409 (V + 8669) - 0x1102, 0x1165, 0x11bc, 0, -#undef V2410 -#define V2410 (V + 8673) - 0x1102, 0x1165, 0x11bd, 0, -#undef V2411 -#define V2411 (V + 8677) - 0x1102, 0x1165, 0x11be, 0, -#undef V2412 -#define V2412 (V + 8681) - 0x1102, 0x1165, 0x11bf, 0, -#undef V2413 -#define V2413 (V + 8685) - 0x1102, 0x1165, 0x11c0, 0, -#undef V2414 -#define V2414 (V + 8689) - 0x1102, 0x1165, 0x11c1, 0, -#undef V2415 -#define V2415 (V + 8693) - 0x1102, 0x1165, 0x11c2, 0, -#undef V2416 -#define V2416 (V + 8697) - 0x1102, 0x1166, 0, -#undef V2417 -#define V2417 (V + 8700) - 0x1102, 0x1166, 0x11a8, 0, -#undef V2418 -#define V2418 (V + 8704) - 0x1102, 0x1166, 0x11a9, 0, -#undef V2419 -#define V2419 (V + 8708) - 0x1102, 0x1166, 0x11aa, 0, -#undef V2420 -#define V2420 (V + 8712) - 0x1102, 0x1166, 0x11ab, 0, -#undef V2421 -#define V2421 (V + 8716) - 0x1102, 0x1166, 0x11ac, 0, -#undef V2422 -#define V2422 (V + 8720) - 0x1102, 0x1166, 0x11ad, 0, -#undef V2423 -#define V2423 (V + 8724) - 0x1102, 0x1166, 0x11ae, 0, -#undef V2424 -#define V2424 (V + 8728) - 0x1102, 0x1166, 0x11af, 0, -#undef V2425 -#define V2425 (V + 8732) - 0x1102, 0x1166, 0x11b0, 0, -#undef V2426 -#define V2426 (V + 8736) - 0x1102, 0x1166, 0x11b1, 0, -#undef V2427 -#define V2427 (V + 8740) - 0x1102, 0x1166, 0x11b2, 0, -#undef V2428 -#define V2428 (V + 8744) - 0x1102, 0x1166, 0x11b3, 0, -#undef V2429 -#define V2429 (V + 8748) - 0x1102, 0x1166, 0x11b4, 0, -#undef V2430 -#define V2430 (V + 8752) - 0x1102, 0x1166, 0x11b5, 0, -#undef V2431 -#define V2431 (V + 8756) - 0x1102, 0x1166, 0x11b6, 0, -#undef V2432 -#define V2432 (V + 8760) - 0x1102, 0x1166, 0x11b7, 0, -#undef V2433 -#define V2433 (V + 8764) - 0x1102, 0x1166, 0x11b8, 0, -#undef V2434 -#define V2434 (V + 8768) - 0x1102, 0x1166, 0x11b9, 0, -#undef V2435 -#define V2435 (V + 8772) - 0x1102, 0x1166, 0x11ba, 0, -#undef V2436 -#define V2436 (V + 8776) - 0x1102, 0x1166, 0x11bb, 0, -#undef V2437 -#define V2437 (V + 8780) - 0x1102, 0x1166, 0x11bc, 0, -#undef V2438 -#define V2438 (V + 8784) - 0x1102, 0x1166, 0x11bd, 0, -#undef V2439 -#define V2439 (V + 8788) - 0x1102, 0x1166, 0x11be, 0, -#undef V2440 -#define V2440 (V + 8792) - 0x1102, 0x1166, 0x11bf, 0, -#undef V2441 -#define V2441 (V + 8796) - 0x1102, 0x1166, 0x11c0, 0, -#undef V2442 -#define V2442 (V + 8800) - 0x1102, 0x1166, 0x11c1, 0, -#undef V2443 -#define V2443 (V + 8804) - 0x1102, 0x1166, 0x11c2, 0, -#undef V2444 -#define V2444 (V + 8808) - 0x1102, 0x1167, 0, -#undef V2445 -#define V2445 (V + 8811) - 0x1102, 0x1167, 0x11a8, 0, -#undef V2446 -#define V2446 (V + 8815) - 0x1102, 0x1167, 0x11a9, 0, -#undef V2447 -#define V2447 (V + 8819) - 0x1102, 0x1167, 0x11aa, 0, -#undef V2448 -#define V2448 (V + 8823) - 0x1102, 0x1167, 0x11ab, 0, -#undef V2449 -#define V2449 (V + 8827) - 0x1102, 0x1167, 0x11ac, 0, -#undef V2450 -#define V2450 (V + 8831) - 0x1102, 0x1167, 0x11ad, 0, -#undef V2451 -#define V2451 (V + 8835) - 0x1102, 0x1167, 0x11ae, 0, -#undef V2452 -#define V2452 (V + 8839) - 0x1102, 0x1167, 0x11af, 0, -#undef V2453 -#define V2453 (V + 8843) - 0x1102, 0x1167, 0x11b0, 0, -#undef V2454 -#define V2454 (V + 8847) - 0x1102, 0x1167, 0x11b1, 0, -#undef V2455 -#define V2455 (V + 8851) - 0x1102, 0x1167, 0x11b2, 0, -#undef V2456 -#define V2456 (V + 8855) - 0x1102, 0x1167, 0x11b3, 0, -#undef V2457 -#define V2457 (V + 8859) - 0x1102, 0x1167, 0x11b4, 0, -#undef V2458 -#define V2458 (V + 8863) - 0x1102, 0x1167, 0x11b5, 0, -#undef V2459 -#define V2459 (V + 8867) - 0x1102, 0x1167, 0x11b6, 0, -#undef V2460 -#define V2460 (V + 8871) - 0x1102, 0x1167, 0x11b7, 0, -#undef V2461 -#define V2461 (V + 8875) - 0x1102, 0x1167, 0x11b8, 0, -#undef V2462 -#define V2462 (V + 8879) - 0x1102, 0x1167, 0x11b9, 0, -#undef V2463 -#define V2463 (V + 8883) - 0x1102, 0x1167, 0x11ba, 0, -#undef V2464 -#define V2464 (V + 8887) - 0x1102, 0x1167, 0x11bb, 0, -#undef V2465 -#define V2465 (V + 8891) - 0x1102, 0x1167, 0x11bc, 0, -#undef V2466 -#define V2466 (V + 8895) - 0x1102, 0x1167, 0x11bd, 0, -#undef V2467 -#define V2467 (V + 8899) - 0x1102, 0x1167, 0x11be, 0, -#undef V2468 -#define V2468 (V + 8903) - 0x1102, 0x1167, 0x11bf, 0, -#undef V2469 -#define V2469 (V + 8907) - 0x1102, 0x1167, 0x11c0, 0, -#undef V2470 -#define V2470 (V + 8911) - 0x1102, 0x1167, 0x11c1, 0, -#undef V2471 -#define V2471 (V + 8915) - 0x1102, 0x1167, 0x11c2, 0, -#undef V2472 -#define V2472 (V + 8919) - 0x1102, 0x1168, 0, -#undef V2473 -#define V2473 (V + 8922) - 0x1102, 0x1168, 0x11a8, 0, -#undef V2474 -#define V2474 (V + 8926) - 0x1102, 0x1168, 0x11a9, 0, -#undef V2475 -#define V2475 (V + 8930) - 0x1102, 0x1168, 0x11aa, 0, -#undef V2476 -#define V2476 (V + 8934) - 0x1102, 0x1168, 0x11ab, 0, -#undef V2477 -#define V2477 (V + 8938) - 0x1102, 0x1168, 0x11ac, 0, -#undef V2478 -#define V2478 (V + 8942) - 0x1102, 0x1168, 0x11ad, 0, -#undef V2479 -#define V2479 (V + 8946) - 0x1102, 0x1168, 0x11ae, 0, -#undef V2480 -#define V2480 (V + 8950) - 0x1102, 0x1168, 0x11af, 0, -#undef V2481 -#define V2481 (V + 8954) - 0x1102, 0x1168, 0x11b0, 0, -#undef V2482 -#define V2482 (V + 8958) - 0x1102, 0x1168, 0x11b1, 0, -#undef V2483 -#define V2483 (V + 8962) - 0x1102, 0x1168, 0x11b2, 0, -#undef V2484 -#define V2484 (V + 8966) - 0x1102, 0x1168, 0x11b3, 0, -#undef V2485 -#define V2485 (V + 8970) - 0x1102, 0x1168, 0x11b4, 0, -#undef V2486 -#define V2486 (V + 8974) - 0x1102, 0x1168, 0x11b5, 0, -#undef V2487 -#define V2487 (V + 8978) - 0x1102, 0x1168, 0x11b6, 0, -#undef V2488 -#define V2488 (V + 8982) - 0x1102, 0x1168, 0x11b7, 0, -#undef V2489 -#define V2489 (V + 8986) - 0x1102, 0x1168, 0x11b8, 0, -#undef V2490 -#define V2490 (V + 8990) - 0x1102, 0x1168, 0x11b9, 0, -#undef V2491 -#define V2491 (V + 8994) - 0x1102, 0x1168, 0x11ba, 0, -#undef V2492 -#define V2492 (V + 8998) - 0x1102, 0x1168, 0x11bb, 0, -#undef V2493 -#define V2493 (V + 9002) - 0x1102, 0x1168, 0x11bc, 0, -#undef V2494 -#define V2494 (V + 9006) - 0x1102, 0x1168, 0x11bd, 0, -#undef V2495 -#define V2495 (V + 9010) - 0x1102, 0x1168, 0x11be, 0, -#undef V2496 -#define V2496 (V + 9014) - 0x1102, 0x1168, 0x11bf, 0, -#undef V2497 -#define V2497 (V + 9018) - 0x1102, 0x1168, 0x11c0, 0, -#undef V2498 -#define V2498 (V + 9022) - 0x1102, 0x1168, 0x11c1, 0, -#undef V2499 -#define V2499 (V + 9026) - 0x1102, 0x1168, 0x11c2, 0, -#undef V2500 -#define V2500 (V + 9030) - 0x1102, 0x1169, 0, -#undef V2501 -#define V2501 (V + 9033) - 0x1102, 0x1169, 0x11a8, 0, -#undef V2502 -#define V2502 (V + 9037) - 0x1102, 0x1169, 0x11a9, 0, -#undef V2503 -#define V2503 (V + 9041) - 0x1102, 0x1169, 0x11aa, 0, -#undef V2504 -#define V2504 (V + 9045) - 0x1102, 0x1169, 0x11ab, 0, -#undef V2505 -#define V2505 (V + 9049) - 0x1102, 0x1169, 0x11ac, 0, -#undef V2506 -#define V2506 (V + 9053) - 0x1102, 0x1169, 0x11ad, 0, -#undef V2507 -#define V2507 (V + 9057) - 0x1102, 0x1169, 0x11ae, 0, -#undef V2508 -#define V2508 (V + 9061) - 0x1102, 0x1169, 0x11af, 0, -#undef V2509 -#define V2509 (V + 9065) - 0x1102, 0x1169, 0x11b0, 0, -#undef V2510 -#define V2510 (V + 9069) - 0x1102, 0x1169, 0x11b1, 0, -#undef V2511 -#define V2511 (V + 9073) - 0x1102, 0x1169, 0x11b2, 0, -#undef V2512 -#define V2512 (V + 9077) - 0x1102, 0x1169, 0x11b3, 0, -#undef V2513 -#define V2513 (V + 9081) - 0x1102, 0x1169, 0x11b4, 0, -#undef V2514 -#define V2514 (V + 9085) - 0x1102, 0x1169, 0x11b5, 0, -#undef V2515 -#define V2515 (V + 9089) - 0x1102, 0x1169, 0x11b6, 0, -#undef V2516 -#define V2516 (V + 9093) - 0x1102, 0x1169, 0x11b7, 0, -#undef V2517 -#define V2517 (V + 9097) - 0x1102, 0x1169, 0x11b8, 0, -#undef V2518 -#define V2518 (V + 9101) - 0x1102, 0x1169, 0x11b9, 0, -#undef V2519 -#define V2519 (V + 9105) - 0x1102, 0x1169, 0x11ba, 0, -#undef V2520 -#define V2520 (V + 9109) - 0x1102, 0x1169, 0x11bb, 0, -#undef V2521 -#define V2521 (V + 9113) - 0x1102, 0x1169, 0x11bc, 0, -#undef V2522 -#define V2522 (V + 9117) - 0x1102, 0x1169, 0x11bd, 0, -#undef V2523 -#define V2523 (V + 9121) - 0x1102, 0x1169, 0x11be, 0, -#undef V2524 -#define V2524 (V + 9125) - 0x1102, 0x1169, 0x11bf, 0, -#undef V2525 -#define V2525 (V + 9129) - 0x1102, 0x1169, 0x11c0, 0, -#undef V2526 -#define V2526 (V + 9133) - 0x1102, 0x1169, 0x11c1, 0, -#undef V2527 -#define V2527 (V + 9137) - 0x1102, 0x1169, 0x11c2, 0, -#undef V2528 -#define V2528 (V + 9141) - 0x1102, 0x116a, 0, -#undef V2529 -#define V2529 (V + 9144) - 0x1102, 0x116a, 0x11a8, 0, -#undef V2530 -#define V2530 (V + 9148) - 0x1102, 0x116a, 0x11a9, 0, -#undef V2531 -#define V2531 (V + 9152) - 0x1102, 0x116a, 0x11aa, 0, -#undef V2532 -#define V2532 (V + 9156) - 0x1102, 0x116a, 0x11ab, 0, -#undef V2533 -#define V2533 (V + 9160) - 0x1102, 0x116a, 0x11ac, 0, -#undef V2534 -#define V2534 (V + 9164) - 0x1102, 0x116a, 0x11ad, 0, -#undef V2535 -#define V2535 (V + 9168) - 0x1102, 0x116a, 0x11ae, 0, -#undef V2536 -#define V2536 (V + 9172) - 0x1102, 0x116a, 0x11af, 0, -#undef V2537 -#define V2537 (V + 9176) - 0x1102, 0x116a, 0x11b0, 0, -#undef V2538 -#define V2538 (V + 9180) - 0x1102, 0x116a, 0x11b1, 0, -#undef V2539 -#define V2539 (V + 9184) - 0x1102, 0x116a, 0x11b2, 0, -#undef V2540 -#define V2540 (V + 9188) - 0x1102, 0x116a, 0x11b3, 0, -#undef V2541 -#define V2541 (V + 9192) - 0x1102, 0x116a, 0x11b4, 0, -#undef V2542 -#define V2542 (V + 9196) - 0x1102, 0x116a, 0x11b5, 0, -#undef V2543 -#define V2543 (V + 9200) - 0x1102, 0x116a, 0x11b6, 0, -#undef V2544 -#define V2544 (V + 9204) - 0x1102, 0x116a, 0x11b7, 0, -#undef V2545 -#define V2545 (V + 9208) - 0x1102, 0x116a, 0x11b8, 0, -#undef V2546 -#define V2546 (V + 9212) - 0x1102, 0x116a, 0x11b9, 0, -#undef V2547 -#define V2547 (V + 9216) - 0x1102, 0x116a, 0x11ba, 0, -#undef V2548 -#define V2548 (V + 9220) - 0x1102, 0x116a, 0x11bb, 0, -#undef V2549 -#define V2549 (V + 9224) - 0x1102, 0x116a, 0x11bc, 0, -#undef V2550 -#define V2550 (V + 9228) - 0x1102, 0x116a, 0x11bd, 0, -#undef V2551 -#define V2551 (V + 9232) - 0x1102, 0x116a, 0x11be, 0, -#undef V2552 -#define V2552 (V + 9236) - 0x1102, 0x116a, 0x11bf, 0, -#undef V2553 -#define V2553 (V + 9240) - 0x1102, 0x116a, 0x11c0, 0, -#undef V2554 -#define V2554 (V + 9244) - 0x1102, 0x116a, 0x11c1, 0, -#undef V2555 -#define V2555 (V + 9248) - 0x1102, 0x116a, 0x11c2, 0, -#undef V2556 -#define V2556 (V + 9252) - 0x1102, 0x116b, 0, -#undef V2557 -#define V2557 (V + 9255) - 0x1102, 0x116b, 0x11a8, 0, -#undef V2558 -#define V2558 (V + 9259) - 0x1102, 0x116b, 0x11a9, 0, -#undef V2559 -#define V2559 (V + 9263) - 0x1102, 0x116b, 0x11aa, 0, -#undef V2560 -#define V2560 (V + 9267) - 0x1102, 0x116b, 0x11ab, 0, -#undef V2561 -#define V2561 (V + 9271) - 0x1102, 0x116b, 0x11ac, 0, -#undef V2562 -#define V2562 (V + 9275) - 0x1102, 0x116b, 0x11ad, 0, -#undef V2563 -#define V2563 (V + 9279) - 0x1102, 0x116b, 0x11ae, 0, -#undef V2564 -#define V2564 (V + 9283) - 0x1102, 0x116b, 0x11af, 0, -#undef V2565 -#define V2565 (V + 9287) - 0x1102, 0x116b, 0x11b0, 0, -#undef V2566 -#define V2566 (V + 9291) - 0x1102, 0x116b, 0x11b1, 0, -#undef V2567 -#define V2567 (V + 9295) - 0x1102, 0x116b, 0x11b2, 0, -#undef V2568 -#define V2568 (V + 9299) - 0x1102, 0x116b, 0x11b3, 0, -#undef V2569 -#define V2569 (V + 9303) - 0x1102, 0x116b, 0x11b4, 0, -#undef V2570 -#define V2570 (V + 9307) - 0x1102, 0x116b, 0x11b5, 0, -#undef V2571 -#define V2571 (V + 9311) - 0x1102, 0x116b, 0x11b6, 0, -#undef V2572 -#define V2572 (V + 9315) - 0x1102, 0x116b, 0x11b7, 0, -#undef V2573 -#define V2573 (V + 9319) - 0x1102, 0x116b, 0x11b8, 0, -#undef V2574 -#define V2574 (V + 9323) - 0x1102, 0x116b, 0x11b9, 0, -#undef V2575 -#define V2575 (V + 9327) - 0x1102, 0x116b, 0x11ba, 0, -#undef V2576 -#define V2576 (V + 9331) - 0x1102, 0x116b, 0x11bb, 0, -#undef V2577 -#define V2577 (V + 9335) - 0x1102, 0x116b, 0x11bc, 0, -#undef V2578 -#define V2578 (V + 9339) - 0x1102, 0x116b, 0x11bd, 0, -#undef V2579 -#define V2579 (V + 9343) - 0x1102, 0x116b, 0x11be, 0, -#undef V2580 -#define V2580 (V + 9347) - 0x1102, 0x116b, 0x11bf, 0, -#undef V2581 -#define V2581 (V + 9351) - 0x1102, 0x116b, 0x11c0, 0, -#undef V2582 -#define V2582 (V + 9355) - 0x1102, 0x116b, 0x11c1, 0, -#undef V2583 -#define V2583 (V + 9359) - 0x1102, 0x116b, 0x11c2, 0, -#undef V2584 -#define V2584 (V + 9363) - 0x1102, 0x116c, 0, -#undef V2585 -#define V2585 (V + 9366) - 0x1102, 0x116c, 0x11a8, 0, -#undef V2586 -#define V2586 (V + 9370) - 0x1102, 0x116c, 0x11a9, 0, -#undef V2587 -#define V2587 (V + 9374) - 0x1102, 0x116c, 0x11aa, 0, -#undef V2588 -#define V2588 (V + 9378) - 0x1102, 0x116c, 0x11ab, 0, -#undef V2589 -#define V2589 (V + 9382) - 0x1102, 0x116c, 0x11ac, 0, -#undef V2590 -#define V2590 (V + 9386) - 0x1102, 0x116c, 0x11ad, 0, -#undef V2591 -#define V2591 (V + 9390) - 0x1102, 0x116c, 0x11ae, 0, -#undef V2592 -#define V2592 (V + 9394) - 0x1102, 0x116c, 0x11af, 0, -#undef V2593 -#define V2593 (V + 9398) - 0x1102, 0x116c, 0x11b0, 0, -#undef V2594 -#define V2594 (V + 9402) - 0x1102, 0x116c, 0x11b1, 0, -#undef V2595 -#define V2595 (V + 9406) - 0x1102, 0x116c, 0x11b2, 0, -#undef V2596 -#define V2596 (V + 9410) - 0x1102, 0x116c, 0x11b3, 0, -#undef V2597 -#define V2597 (V + 9414) - 0x1102, 0x116c, 0x11b4, 0, -#undef V2598 -#define V2598 (V + 9418) - 0x1102, 0x116c, 0x11b5, 0, -#undef V2599 -#define V2599 (V + 9422) - 0x1102, 0x116c, 0x11b6, 0, -#undef V2600 -#define V2600 (V + 9426) - 0x1102, 0x116c, 0x11b7, 0, -#undef V2601 -#define V2601 (V + 9430) - 0x1102, 0x116c, 0x11b8, 0, -#undef V2602 -#define V2602 (V + 9434) - 0x1102, 0x116c, 0x11b9, 0, -#undef V2603 -#define V2603 (V + 9438) - 0x1102, 0x116c, 0x11ba, 0, -#undef V2604 -#define V2604 (V + 9442) - 0x1102, 0x116c, 0x11bb, 0, -#undef V2605 -#define V2605 (V + 9446) - 0x1102, 0x116c, 0x11bc, 0, -#undef V2606 -#define V2606 (V + 9450) - 0x1102, 0x116c, 0x11bd, 0, -#undef V2607 -#define V2607 (V + 9454) - 0x1102, 0x116c, 0x11be, 0, -#undef V2608 -#define V2608 (V + 9458) - 0x1102, 0x116c, 0x11bf, 0, -#undef V2609 -#define V2609 (V + 9462) - 0x1102, 0x116c, 0x11c0, 0, -#undef V2610 -#define V2610 (V + 9466) - 0x1102, 0x116c, 0x11c1, 0, -#undef V2611 -#define V2611 (V + 9470) - 0x1102, 0x116c, 0x11c2, 0, -#undef V2612 -#define V2612 (V + 9474) - 0x1102, 0x116d, 0, -#undef V2613 -#define V2613 (V + 9477) - 0x1102, 0x116d, 0x11a8, 0, -#undef V2614 -#define V2614 (V + 9481) - 0x1102, 0x116d, 0x11a9, 0, -#undef V2615 -#define V2615 (V + 9485) - 0x1102, 0x116d, 0x11aa, 0, -#undef V2616 -#define V2616 (V + 9489) - 0x1102, 0x116d, 0x11ab, 0, -#undef V2617 -#define V2617 (V + 9493) - 0x1102, 0x116d, 0x11ac, 0, -#undef V2618 -#define V2618 (V + 9497) - 0x1102, 0x116d, 0x11ad, 0, -#undef V2619 -#define V2619 (V + 9501) - 0x1102, 0x116d, 0x11ae, 0, -#undef V2620 -#define V2620 (V + 9505) - 0x1102, 0x116d, 0x11af, 0, -#undef V2621 -#define V2621 (V + 9509) - 0x1102, 0x116d, 0x11b0, 0, -#undef V2622 -#define V2622 (V + 9513) - 0x1102, 0x116d, 0x11b1, 0, -#undef V2623 -#define V2623 (V + 9517) - 0x1102, 0x116d, 0x11b2, 0, -#undef V2624 -#define V2624 (V + 9521) - 0x1102, 0x116d, 0x11b3, 0, -#undef V2625 -#define V2625 (V + 9525) - 0x1102, 0x116d, 0x11b4, 0, -#undef V2626 -#define V2626 (V + 9529) - 0x1102, 0x116d, 0x11b5, 0, -#undef V2627 -#define V2627 (V + 9533) - 0x1102, 0x116d, 0x11b6, 0, -#undef V2628 -#define V2628 (V + 9537) - 0x1102, 0x116d, 0x11b7, 0, -#undef V2629 -#define V2629 (V + 9541) - 0x1102, 0x116d, 0x11b8, 0, -#undef V2630 -#define V2630 (V + 9545) - 0x1102, 0x116d, 0x11b9, 0, -#undef V2631 -#define V2631 (V + 9549) - 0x1102, 0x116d, 0x11ba, 0, -#undef V2632 -#define V2632 (V + 9553) - 0x1102, 0x116d, 0x11bb, 0, -#undef V2633 -#define V2633 (V + 9557) - 0x1102, 0x116d, 0x11bc, 0, -#undef V2634 -#define V2634 (V + 9561) - 0x1102, 0x116d, 0x11bd, 0, -#undef V2635 -#define V2635 (V + 9565) - 0x1102, 0x116d, 0x11be, 0, -#undef V2636 -#define V2636 (V + 9569) - 0x1102, 0x116d, 0x11bf, 0, -#undef V2637 -#define V2637 (V + 9573) - 0x1102, 0x116d, 0x11c0, 0, -#undef V2638 -#define V2638 (V + 9577) - 0x1102, 0x116d, 0x11c1, 0, -#undef V2639 -#define V2639 (V + 9581) - 0x1102, 0x116d, 0x11c2, 0, -#undef V2640 -#define V2640 (V + 9585) - 0x1102, 0x116e, 0, -#undef V2641 -#define V2641 (V + 9588) - 0x1102, 0x116e, 0x11a8, 0, -#undef V2642 -#define V2642 (V + 9592) - 0x1102, 0x116e, 0x11a9, 0, -#undef V2643 -#define V2643 (V + 9596) - 0x1102, 0x116e, 0x11aa, 0, -#undef V2644 -#define V2644 (V + 9600) - 0x1102, 0x116e, 0x11ab, 0, -#undef V2645 -#define V2645 (V + 9604) - 0x1102, 0x116e, 0x11ac, 0, -#undef V2646 -#define V2646 (V + 9608) - 0x1102, 0x116e, 0x11ad, 0, -#undef V2647 -#define V2647 (V + 9612) - 0x1102, 0x116e, 0x11ae, 0, -#undef V2648 -#define V2648 (V + 9616) - 0x1102, 0x116e, 0x11af, 0, -#undef V2649 -#define V2649 (V + 9620) - 0x1102, 0x116e, 0x11b0, 0, -#undef V2650 -#define V2650 (V + 9624) - 0x1102, 0x116e, 0x11b1, 0, -#undef V2651 -#define V2651 (V + 9628) - 0x1102, 0x116e, 0x11b2, 0, -#undef V2652 -#define V2652 (V + 9632) - 0x1102, 0x116e, 0x11b3, 0, -#undef V2653 -#define V2653 (V + 9636) - 0x1102, 0x116e, 0x11b4, 0, -#undef V2654 -#define V2654 (V + 9640) - 0x1102, 0x116e, 0x11b5, 0, -#undef V2655 -#define V2655 (V + 9644) - 0x1102, 0x116e, 0x11b6, 0, -#undef V2656 -#define V2656 (V + 9648) - 0x1102, 0x116e, 0x11b7, 0, -#undef V2657 -#define V2657 (V + 9652) - 0x1102, 0x116e, 0x11b8, 0, -#undef V2658 -#define V2658 (V + 9656) - 0x1102, 0x116e, 0x11b9, 0, -#undef V2659 -#define V2659 (V + 9660) - 0x1102, 0x116e, 0x11ba, 0, -#undef V2660 -#define V2660 (V + 9664) - 0x1102, 0x116e, 0x11bb, 0, -#undef V2661 -#define V2661 (V + 9668) - 0x1102, 0x116e, 0x11bc, 0, -#undef V2662 -#define V2662 (V + 9672) - 0x1102, 0x116e, 0x11bd, 0, -#undef V2663 -#define V2663 (V + 9676) - 0x1102, 0x116e, 0x11be, 0, -#undef V2664 -#define V2664 (V + 9680) - 0x1102, 0x116e, 0x11bf, 0, -#undef V2665 -#define V2665 (V + 9684) - 0x1102, 0x116e, 0x11c0, 0, -#undef V2666 -#define V2666 (V + 9688) - 0x1102, 0x116e, 0x11c1, 0, -#undef V2667 -#define V2667 (V + 9692) - 0x1102, 0x116e, 0x11c2, 0, -#undef V2668 -#define V2668 (V + 9696) - 0x1102, 0x116f, 0, -#undef V2669 -#define V2669 (V + 9699) - 0x1102, 0x116f, 0x11a8, 0, -#undef V2670 -#define V2670 (V + 9703) - 0x1102, 0x116f, 0x11a9, 0, -#undef V2671 -#define V2671 (V + 9707) - 0x1102, 0x116f, 0x11aa, 0, -#undef V2672 -#define V2672 (V + 9711) - 0x1102, 0x116f, 0x11ab, 0, -#undef V2673 -#define V2673 (V + 9715) - 0x1102, 0x116f, 0x11ac, 0, -#undef V2674 -#define V2674 (V + 9719) - 0x1102, 0x116f, 0x11ad, 0, -#undef V2675 -#define V2675 (V + 9723) - 0x1102, 0x116f, 0x11ae, 0, -#undef V2676 -#define V2676 (V + 9727) - 0x1102, 0x116f, 0x11af, 0, -#undef V2677 -#define V2677 (V + 9731) - 0x1102, 0x116f, 0x11b0, 0, -#undef V2678 -#define V2678 (V + 9735) - 0x1102, 0x116f, 0x11b1, 0, -#undef V2679 -#define V2679 (V + 9739) - 0x1102, 0x116f, 0x11b2, 0, -#undef V2680 -#define V2680 (V + 9743) - 0x1102, 0x116f, 0x11b3, 0, -#undef V2681 -#define V2681 (V + 9747) - 0x1102, 0x116f, 0x11b4, 0, -#undef V2682 -#define V2682 (V + 9751) - 0x1102, 0x116f, 0x11b5, 0, -#undef V2683 -#define V2683 (V + 9755) - 0x1102, 0x116f, 0x11b6, 0, -#undef V2684 -#define V2684 (V + 9759) - 0x1102, 0x116f, 0x11b7, 0, -#undef V2685 -#define V2685 (V + 9763) - 0x1102, 0x116f, 0x11b8, 0, -#undef V2686 -#define V2686 (V + 9767) - 0x1102, 0x116f, 0x11b9, 0, -#undef V2687 -#define V2687 (V + 9771) - 0x1102, 0x116f, 0x11ba, 0, -#undef V2688 -#define V2688 (V + 9775) - 0x1102, 0x116f, 0x11bb, 0, -#undef V2689 -#define V2689 (V + 9779) - 0x1102, 0x116f, 0x11bc, 0, -#undef V2690 -#define V2690 (V + 9783) - 0x1102, 0x116f, 0x11bd, 0, -#undef V2691 -#define V2691 (V + 9787) - 0x1102, 0x116f, 0x11be, 0, -#undef V2692 -#define V2692 (V + 9791) - 0x1102, 0x116f, 0x11bf, 0, -#undef V2693 -#define V2693 (V + 9795) - 0x1102, 0x116f, 0x11c0, 0, -#undef V2694 -#define V2694 (V + 9799) - 0x1102, 0x116f, 0x11c1, 0, -#undef V2695 -#define V2695 (V + 9803) - 0x1102, 0x116f, 0x11c2, 0, -#undef V2696 -#define V2696 (V + 9807) - 0x1102, 0x1170, 0, -#undef V2697 -#define V2697 (V + 9810) - 0x1102, 0x1170, 0x11a8, 0, -#undef V2698 -#define V2698 (V + 9814) - 0x1102, 0x1170, 0x11a9, 0, -#undef V2699 -#define V2699 (V + 9818) - 0x1102, 0x1170, 0x11aa, 0, -#undef V2700 -#define V2700 (V + 9822) - 0x1102, 0x1170, 0x11ab, 0, -#undef V2701 -#define V2701 (V + 9826) - 0x1102, 0x1170, 0x11ac, 0, -#undef V2702 -#define V2702 (V + 9830) - 0x1102, 0x1170, 0x11ad, 0, -#undef V2703 -#define V2703 (V + 9834) - 0x1102, 0x1170, 0x11ae, 0, -#undef V2704 -#define V2704 (V + 9838) - 0x1102, 0x1170, 0x11af, 0, -#undef V2705 -#define V2705 (V + 9842) - 0x1102, 0x1170, 0x11b0, 0, -#undef V2706 -#define V2706 (V + 9846) - 0x1102, 0x1170, 0x11b1, 0, -#undef V2707 -#define V2707 (V + 9850) - 0x1102, 0x1170, 0x11b2, 0, -#undef V2708 -#define V2708 (V + 9854) - 0x1102, 0x1170, 0x11b3, 0, -#undef V2709 -#define V2709 (V + 9858) - 0x1102, 0x1170, 0x11b4, 0, -#undef V2710 -#define V2710 (V + 9862) - 0x1102, 0x1170, 0x11b5, 0, -#undef V2711 -#define V2711 (V + 9866) - 0x1102, 0x1170, 0x11b6, 0, -#undef V2712 -#define V2712 (V + 9870) - 0x1102, 0x1170, 0x11b7, 0, -#undef V2713 -#define V2713 (V + 9874) - 0x1102, 0x1170, 0x11b8, 0, -#undef V2714 -#define V2714 (V + 9878) - 0x1102, 0x1170, 0x11b9, 0, -#undef V2715 -#define V2715 (V + 9882) - 0x1102, 0x1170, 0x11ba, 0, -#undef V2716 -#define V2716 (V + 9886) - 0x1102, 0x1170, 0x11bb, 0, -#undef V2717 -#define V2717 (V + 9890) - 0x1102, 0x1170, 0x11bc, 0, -#undef V2718 -#define V2718 (V + 9894) - 0x1102, 0x1170, 0x11bd, 0, -#undef V2719 -#define V2719 (V + 9898) - 0x1102, 0x1170, 0x11be, 0, -#undef V2720 -#define V2720 (V + 9902) - 0x1102, 0x1170, 0x11bf, 0, -#undef V2721 -#define V2721 (V + 9906) - 0x1102, 0x1170, 0x11c0, 0, -#undef V2722 -#define V2722 (V + 9910) - 0x1102, 0x1170, 0x11c1, 0, -#undef V2723 -#define V2723 (V + 9914) - 0x1102, 0x1170, 0x11c2, 0, -#undef V2724 -#define V2724 (V + 9918) - 0x1102, 0x1171, 0, -#undef V2725 -#define V2725 (V + 9921) - 0x1102, 0x1171, 0x11a8, 0, -#undef V2726 -#define V2726 (V + 9925) - 0x1102, 0x1171, 0x11a9, 0, -#undef V2727 -#define V2727 (V + 9929) - 0x1102, 0x1171, 0x11aa, 0, -#undef V2728 -#define V2728 (V + 9933) - 0x1102, 0x1171, 0x11ab, 0, -#undef V2729 -#define V2729 (V + 9937) - 0x1102, 0x1171, 0x11ac, 0, -#undef V2730 -#define V2730 (V + 9941) - 0x1102, 0x1171, 0x11ad, 0, -#undef V2731 -#define V2731 (V + 9945) - 0x1102, 0x1171, 0x11ae, 0, -#undef V2732 -#define V2732 (V + 9949) - 0x1102, 0x1171, 0x11af, 0, -#undef V2733 -#define V2733 (V + 9953) - 0x1102, 0x1171, 0x11b0, 0, -#undef V2734 -#define V2734 (V + 9957) - 0x1102, 0x1171, 0x11b1, 0, -#undef V2735 -#define V2735 (V + 9961) - 0x1102, 0x1171, 0x11b2, 0, -#undef V2736 -#define V2736 (V + 9965) - 0x1102, 0x1171, 0x11b3, 0, -#undef V2737 -#define V2737 (V + 9969) - 0x1102, 0x1171, 0x11b4, 0, -#undef V2738 -#define V2738 (V + 9973) - 0x1102, 0x1171, 0x11b5, 0, -#undef V2739 -#define V2739 (V + 9977) - 0x1102, 0x1171, 0x11b6, 0, -#undef V2740 -#define V2740 (V + 9981) - 0x1102, 0x1171, 0x11b7, 0, -#undef V2741 -#define V2741 (V + 9985) - 0x1102, 0x1171, 0x11b8, 0, -#undef V2742 -#define V2742 (V + 9989) - 0x1102, 0x1171, 0x11b9, 0, -#undef V2743 -#define V2743 (V + 9993) - 0x1102, 0x1171, 0x11ba, 0, -#undef V2744 -#define V2744 (V + 9997) - 0x1102, 0x1171, 0x11bb, 0, -#undef V2745 -#define V2745 (V + 10001) - 0x1102, 0x1171, 0x11bc, 0, -#undef V2746 -#define V2746 (V + 10005) - 0x1102, 0x1171, 0x11bd, 0, -#undef V2747 -#define V2747 (V + 10009) - 0x1102, 0x1171, 0x11be, 0, -#undef V2748 -#define V2748 (V + 10013) - 0x1102, 0x1171, 0x11bf, 0, -#undef V2749 -#define V2749 (V + 10017) - 0x1102, 0x1171, 0x11c0, 0, -#undef V2750 -#define V2750 (V + 10021) - 0x1102, 0x1171, 0x11c1, 0, -#undef V2751 -#define V2751 (V + 10025) - 0x1102, 0x1171, 0x11c2, 0, -#undef V2752 -#define V2752 (V + 10029) - 0x1102, 0x1172, 0, -#undef V2753 -#define V2753 (V + 10032) - 0x1102, 0x1172, 0x11a8, 0, -#undef V2754 -#define V2754 (V + 10036) - 0x1102, 0x1172, 0x11a9, 0, -#undef V2755 -#define V2755 (V + 10040) - 0x1102, 0x1172, 0x11aa, 0, -#undef V2756 -#define V2756 (V + 10044) - 0x1102, 0x1172, 0x11ab, 0, -#undef V2757 -#define V2757 (V + 10048) - 0x1102, 0x1172, 0x11ac, 0, -#undef V2758 -#define V2758 (V + 10052) - 0x1102, 0x1172, 0x11ad, 0, -#undef V2759 -#define V2759 (V + 10056) - 0x1102, 0x1172, 0x11ae, 0, -#undef V2760 -#define V2760 (V + 10060) - 0x1102, 0x1172, 0x11af, 0, -#undef V2761 -#define V2761 (V + 10064) - 0x1102, 0x1172, 0x11b0, 0, -#undef V2762 -#define V2762 (V + 10068) - 0x1102, 0x1172, 0x11b1, 0, -#undef V2763 -#define V2763 (V + 10072) - 0x1102, 0x1172, 0x11b2, 0, -#undef V2764 -#define V2764 (V + 10076) - 0x1102, 0x1172, 0x11b3, 0, -#undef V2765 -#define V2765 (V + 10080) - 0x1102, 0x1172, 0x11b4, 0, -#undef V2766 -#define V2766 (V + 10084) - 0x1102, 0x1172, 0x11b5, 0, -#undef V2767 -#define V2767 (V + 10088) - 0x1102, 0x1172, 0x11b6, 0, -#undef V2768 -#define V2768 (V + 10092) - 0x1102, 0x1172, 0x11b7, 0, -#undef V2769 -#define V2769 (V + 10096) - 0x1102, 0x1172, 0x11b8, 0, -#undef V2770 -#define V2770 (V + 10100) - 0x1102, 0x1172, 0x11b9, 0, -#undef V2771 -#define V2771 (V + 10104) - 0x1102, 0x1172, 0x11ba, 0, -#undef V2772 -#define V2772 (V + 10108) - 0x1102, 0x1172, 0x11bb, 0, -#undef V2773 -#define V2773 (V + 10112) - 0x1102, 0x1172, 0x11bc, 0, -#undef V2774 -#define V2774 (V + 10116) - 0x1102, 0x1172, 0x11bd, 0, -#undef V2775 -#define V2775 (V + 10120) - 0x1102, 0x1172, 0x11be, 0, -#undef V2776 -#define V2776 (V + 10124) - 0x1102, 0x1172, 0x11bf, 0, -#undef V2777 -#define V2777 (V + 10128) - 0x1102, 0x1172, 0x11c0, 0, -#undef V2778 -#define V2778 (V + 10132) - 0x1102, 0x1172, 0x11c1, 0, -#undef V2779 -#define V2779 (V + 10136) - 0x1102, 0x1172, 0x11c2, 0, -#undef V2780 -#define V2780 (V + 10140) - 0x1102, 0x1173, 0, -#undef V2781 -#define V2781 (V + 10143) - 0x1102, 0x1173, 0x11a8, 0, -#undef V2782 -#define V2782 (V + 10147) - 0x1102, 0x1173, 0x11a9, 0, -#undef V2783 -#define V2783 (V + 10151) - 0x1102, 0x1173, 0x11aa, 0, -#undef V2784 -#define V2784 (V + 10155) - 0x1102, 0x1173, 0x11ab, 0, -#undef V2785 -#define V2785 (V + 10159) - 0x1102, 0x1173, 0x11ac, 0, -#undef V2786 -#define V2786 (V + 10163) - 0x1102, 0x1173, 0x11ad, 0, -#undef V2787 -#define V2787 (V + 10167) - 0x1102, 0x1173, 0x11ae, 0, -#undef V2788 -#define V2788 (V + 10171) - 0x1102, 0x1173, 0x11af, 0, -#undef V2789 -#define V2789 (V + 10175) - 0x1102, 0x1173, 0x11b0, 0, -#undef V2790 -#define V2790 (V + 10179) - 0x1102, 0x1173, 0x11b1, 0, -#undef V2791 -#define V2791 (V + 10183) - 0x1102, 0x1173, 0x11b2, 0, -#undef V2792 -#define V2792 (V + 10187) - 0x1102, 0x1173, 0x11b3, 0, -#undef V2793 -#define V2793 (V + 10191) - 0x1102, 0x1173, 0x11b4, 0, -#undef V2794 -#define V2794 (V + 10195) - 0x1102, 0x1173, 0x11b5, 0, -#undef V2795 -#define V2795 (V + 10199) - 0x1102, 0x1173, 0x11b6, 0, -#undef V2796 -#define V2796 (V + 10203) - 0x1102, 0x1173, 0x11b7, 0, -#undef V2797 -#define V2797 (V + 10207) - 0x1102, 0x1173, 0x11b8, 0, -#undef V2798 -#define V2798 (V + 10211) - 0x1102, 0x1173, 0x11b9, 0, -#undef V2799 -#define V2799 (V + 10215) - 0x1102, 0x1173, 0x11ba, 0, -#undef V2800 -#define V2800 (V + 10219) - 0x1102, 0x1173, 0x11bb, 0, -#undef V2801 -#define V2801 (V + 10223) - 0x1102, 0x1173, 0x11bc, 0, -#undef V2802 -#define V2802 (V + 10227) - 0x1102, 0x1173, 0x11bd, 0, -#undef V2803 -#define V2803 (V + 10231) - 0x1102, 0x1173, 0x11be, 0, -#undef V2804 -#define V2804 (V + 10235) - 0x1102, 0x1173, 0x11bf, 0, -#undef V2805 -#define V2805 (V + 10239) - 0x1102, 0x1173, 0x11c0, 0, -#undef V2806 -#define V2806 (V + 10243) - 0x1102, 0x1173, 0x11c1, 0, -#undef V2807 -#define V2807 (V + 10247) - 0x1102, 0x1173, 0x11c2, 0, -#undef V2808 -#define V2808 (V + 10251) - 0x1102, 0x1174, 0, -#undef V2809 -#define V2809 (V + 10254) - 0x1102, 0x1174, 0x11a8, 0, -#undef V2810 -#define V2810 (V + 10258) - 0x1102, 0x1174, 0x11a9, 0, -#undef V2811 -#define V2811 (V + 10262) - 0x1102, 0x1174, 0x11aa, 0, -#undef V2812 -#define V2812 (V + 10266) - 0x1102, 0x1174, 0x11ab, 0, -#undef V2813 -#define V2813 (V + 10270) - 0x1102, 0x1174, 0x11ac, 0, -#undef V2814 -#define V2814 (V + 10274) - 0x1102, 0x1174, 0x11ad, 0, -#undef V2815 -#define V2815 (V + 10278) - 0x1102, 0x1174, 0x11ae, 0, -#undef V2816 -#define V2816 (V + 10282) - 0x1102, 0x1174, 0x11af, 0, -#undef V2817 -#define V2817 (V + 10286) - 0x1102, 0x1174, 0x11b0, 0, -#undef V2818 -#define V2818 (V + 10290) - 0x1102, 0x1174, 0x11b1, 0, -#undef V2819 -#define V2819 (V + 10294) - 0x1102, 0x1174, 0x11b2, 0, -#undef V2820 -#define V2820 (V + 10298) - 0x1102, 0x1174, 0x11b3, 0, -#undef V2821 -#define V2821 (V + 10302) - 0x1102, 0x1174, 0x11b4, 0, -#undef V2822 -#define V2822 (V + 10306) - 0x1102, 0x1174, 0x11b5, 0, -#undef V2823 -#define V2823 (V + 10310) - 0x1102, 0x1174, 0x11b6, 0, -#undef V2824 -#define V2824 (V + 10314) - 0x1102, 0x1174, 0x11b7, 0, -#undef V2825 -#define V2825 (V + 10318) - 0x1102, 0x1174, 0x11b8, 0, -#undef V2826 -#define V2826 (V + 10322) - 0x1102, 0x1174, 0x11b9, 0, -#undef V2827 -#define V2827 (V + 10326) - 0x1102, 0x1174, 0x11ba, 0, -#undef V2828 -#define V2828 (V + 10330) - 0x1102, 0x1174, 0x11bb, 0, -#undef V2829 -#define V2829 (V + 10334) - 0x1102, 0x1174, 0x11bc, 0, -#undef V2830 -#define V2830 (V + 10338) - 0x1102, 0x1174, 0x11bd, 0, -#undef V2831 -#define V2831 (V + 10342) - 0x1102, 0x1174, 0x11be, 0, -#undef V2832 -#define V2832 (V + 10346) - 0x1102, 0x1174, 0x11bf, 0, -#undef V2833 -#define V2833 (V + 10350) - 0x1102, 0x1174, 0x11c0, 0, -#undef V2834 -#define V2834 (V + 10354) - 0x1102, 0x1174, 0x11c1, 0, -#undef V2835 -#define V2835 (V + 10358) - 0x1102, 0x1174, 0x11c2, 0, -#undef V2836 -#define V2836 (V + 10362) - 0x1102, 0x1175, 0, -#undef V2837 -#define V2837 (V + 10365) - 0x1102, 0x1175, 0x11a8, 0, -#undef V2838 -#define V2838 (V + 10369) - 0x1102, 0x1175, 0x11a9, 0, -#undef V2839 -#define V2839 (V + 10373) - 0x1102, 0x1175, 0x11aa, 0, -#undef V2840 -#define V2840 (V + 10377) - 0x1102, 0x1175, 0x11ab, 0, -#undef V2841 -#define V2841 (V + 10381) - 0x1102, 0x1175, 0x11ac, 0, -#undef V2842 -#define V2842 (V + 10385) - 0x1102, 0x1175, 0x11ad, 0, -#undef V2843 -#define V2843 (V + 10389) - 0x1102, 0x1175, 0x11ae, 0, -#undef V2844 -#define V2844 (V + 10393) - 0x1102, 0x1175, 0x11af, 0, -#undef V2845 -#define V2845 (V + 10397) - 0x1102, 0x1175, 0x11b0, 0, -#undef V2846 -#define V2846 (V + 10401) - 0x1102, 0x1175, 0x11b1, 0, -#undef V2847 -#define V2847 (V + 10405) - 0x1102, 0x1175, 0x11b2, 0, -#undef V2848 -#define V2848 (V + 10409) - 0x1102, 0x1175, 0x11b3, 0, -#undef V2849 -#define V2849 (V + 10413) - 0x1102, 0x1175, 0x11b4, 0, -#undef V2850 -#define V2850 (V + 10417) - 0x1102, 0x1175, 0x11b5, 0, -#undef V2851 -#define V2851 (V + 10421) - 0x1102, 0x1175, 0x11b6, 0, -#undef V2852 -#define V2852 (V + 10425) - 0x1102, 0x1175, 0x11b7, 0, -#undef V2853 -#define V2853 (V + 10429) - 0x1102, 0x1175, 0x11b8, 0, -#undef V2854 -#define V2854 (V + 10433) - 0x1102, 0x1175, 0x11b9, 0, -#undef V2855 -#define V2855 (V + 10437) - 0x1102, 0x1175, 0x11ba, 0, -#undef V2856 -#define V2856 (V + 10441) - 0x1102, 0x1175, 0x11bb, 0, -#undef V2857 -#define V2857 (V + 10445) - 0x1102, 0x1175, 0x11bc, 0, -#undef V2858 -#define V2858 (V + 10449) - 0x1102, 0x1175, 0x11bd, 0, -#undef V2859 -#define V2859 (V + 10453) - 0x1102, 0x1175, 0x11be, 0, -#undef V2860 -#define V2860 (V + 10457) - 0x1102, 0x1175, 0x11bf, 0, -#undef V2861 -#define V2861 (V + 10461) - 0x1102, 0x1175, 0x11c0, 0, -#undef V2862 -#define V2862 (V + 10465) - 0x1102, 0x1175, 0x11c1, 0, -#undef V2863 -#define V2863 (V + 10469) - 0x1102, 0x1175, 0x11c2, 0, -#undef V2864 -#define V2864 (V + 10473) - 0x1103, 0x1161, 0, -#undef V2865 -#define V2865 (V + 10476) - 0x1103, 0x1161, 0x11a8, 0, -#undef V2866 -#define V2866 (V + 10480) - 0x1103, 0x1161, 0x11a9, 0, -#undef V2867 -#define V2867 (V + 10484) - 0x1103, 0x1161, 0x11aa, 0, -#undef V2868 -#define V2868 (V + 10488) - 0x1103, 0x1161, 0x11ab, 0, -#undef V2869 -#define V2869 (V + 10492) - 0x1103, 0x1161, 0x11ac, 0, -#undef V2870 -#define V2870 (V + 10496) - 0x1103, 0x1161, 0x11ad, 0, -#undef V2871 -#define V2871 (V + 10500) - 0x1103, 0x1161, 0x11ae, 0, -#undef V2872 -#define V2872 (V + 10504) - 0x1103, 0x1161, 0x11af, 0, -#undef V2873 -#define V2873 (V + 10508) - 0x1103, 0x1161, 0x11b0, 0, -#undef V2874 -#define V2874 (V + 10512) - 0x1103, 0x1161, 0x11b1, 0, -#undef V2875 -#define V2875 (V + 10516) - 0x1103, 0x1161, 0x11b2, 0, -#undef V2876 -#define V2876 (V + 10520) - 0x1103, 0x1161, 0x11b3, 0, -#undef V2877 -#define V2877 (V + 10524) - 0x1103, 0x1161, 0x11b4, 0, -#undef V2878 -#define V2878 (V + 10528) - 0x1103, 0x1161, 0x11b5, 0, -#undef V2879 -#define V2879 (V + 10532) - 0x1103, 0x1161, 0x11b6, 0, -#undef V2880 -#define V2880 (V + 10536) - 0x1103, 0x1161, 0x11b7, 0, -#undef V2881 -#define V2881 (V + 10540) - 0x1103, 0x1161, 0x11b8, 0, -#undef V2882 -#define V2882 (V + 10544) - 0x1103, 0x1161, 0x11b9, 0, -#undef V2883 -#define V2883 (V + 10548) - 0x1103, 0x1161, 0x11ba, 0, -#undef V2884 -#define V2884 (V + 10552) - 0x1103, 0x1161, 0x11bb, 0, -#undef V2885 -#define V2885 (V + 10556) - 0x1103, 0x1161, 0x11bc, 0, -#undef V2886 -#define V2886 (V + 10560) - 0x1103, 0x1161, 0x11bd, 0, -#undef V2887 -#define V2887 (V + 10564) - 0x1103, 0x1161, 0x11be, 0, -#undef V2888 -#define V2888 (V + 10568) - 0x1103, 0x1161, 0x11bf, 0, -#undef V2889 -#define V2889 (V + 10572) - 0x1103, 0x1161, 0x11c0, 0, -#undef V2890 -#define V2890 (V + 10576) - 0x1103, 0x1161, 0x11c1, 0, -#undef V2891 -#define V2891 (V + 10580) - 0x1103, 0x1161, 0x11c2, 0, -#undef V2892 -#define V2892 (V + 10584) - 0x1103, 0x1162, 0, -#undef V2893 -#define V2893 (V + 10587) - 0x1103, 0x1162, 0x11a8, 0, -#undef V2894 -#define V2894 (V + 10591) - 0x1103, 0x1162, 0x11a9, 0, -#undef V2895 -#define V2895 (V + 10595) - 0x1103, 0x1162, 0x11aa, 0, -#undef V2896 -#define V2896 (V + 10599) - 0x1103, 0x1162, 0x11ab, 0, -#undef V2897 -#define V2897 (V + 10603) - 0x1103, 0x1162, 0x11ac, 0, -#undef V2898 -#define V2898 (V + 10607) - 0x1103, 0x1162, 0x11ad, 0, -#undef V2899 -#define V2899 (V + 10611) - 0x1103, 0x1162, 0x11ae, 0, -#undef V2900 -#define V2900 (V + 10615) - 0x1103, 0x1162, 0x11af, 0, -#undef V2901 -#define V2901 (V + 10619) - 0x1103, 0x1162, 0x11b0, 0, -#undef V2902 -#define V2902 (V + 10623) - 0x1103, 0x1162, 0x11b1, 0, -#undef V2903 -#define V2903 (V + 10627) - 0x1103, 0x1162, 0x11b2, 0, -#undef V2904 -#define V2904 (V + 10631) - 0x1103, 0x1162, 0x11b3, 0, -#undef V2905 -#define V2905 (V + 10635) - 0x1103, 0x1162, 0x11b4, 0, -#undef V2906 -#define V2906 (V + 10639) - 0x1103, 0x1162, 0x11b5, 0, -#undef V2907 -#define V2907 (V + 10643) - 0x1103, 0x1162, 0x11b6, 0, -#undef V2908 -#define V2908 (V + 10647) - 0x1103, 0x1162, 0x11b7, 0, -#undef V2909 -#define V2909 (V + 10651) - 0x1103, 0x1162, 0x11b8, 0, -#undef V2910 -#define V2910 (V + 10655) - 0x1103, 0x1162, 0x11b9, 0, -#undef V2911 -#define V2911 (V + 10659) - 0x1103, 0x1162, 0x11ba, 0, -#undef V2912 -#define V2912 (V + 10663) - 0x1103, 0x1162, 0x11bb, 0, -#undef V2913 -#define V2913 (V + 10667) - 0x1103, 0x1162, 0x11bc, 0, -#undef V2914 -#define V2914 (V + 10671) - 0x1103, 0x1162, 0x11bd, 0, -#undef V2915 -#define V2915 (V + 10675) - 0x1103, 0x1162, 0x11be, 0, -#undef V2916 -#define V2916 (V + 10679) - 0x1103, 0x1162, 0x11bf, 0, -#undef V2917 -#define V2917 (V + 10683) - 0x1103, 0x1162, 0x11c0, 0, -#undef V2918 -#define V2918 (V + 10687) - 0x1103, 0x1162, 0x11c1, 0, -#undef V2919 -#define V2919 (V + 10691) - 0x1103, 0x1162, 0x11c2, 0, -#undef V2920 -#define V2920 (V + 10695) - 0x1103, 0x1163, 0, -#undef V2921 -#define V2921 (V + 10698) - 0x1103, 0x1163, 0x11a8, 0, -#undef V2922 -#define V2922 (V + 10702) - 0x1103, 0x1163, 0x11a9, 0, -#undef V2923 -#define V2923 (V + 10706) - 0x1103, 0x1163, 0x11aa, 0, -#undef V2924 -#define V2924 (V + 10710) - 0x1103, 0x1163, 0x11ab, 0, -#undef V2925 -#define V2925 (V + 10714) - 0x1103, 0x1163, 0x11ac, 0, -#undef V2926 -#define V2926 (V + 10718) - 0x1103, 0x1163, 0x11ad, 0, -#undef V2927 -#define V2927 (V + 10722) - 0x1103, 0x1163, 0x11ae, 0, -#undef V2928 -#define V2928 (V + 10726) - 0x1103, 0x1163, 0x11af, 0, -#undef V2929 -#define V2929 (V + 10730) - 0x1103, 0x1163, 0x11b0, 0, -#undef V2930 -#define V2930 (V + 10734) - 0x1103, 0x1163, 0x11b1, 0, -#undef V2931 -#define V2931 (V + 10738) - 0x1103, 0x1163, 0x11b2, 0, -#undef V2932 -#define V2932 (V + 10742) - 0x1103, 0x1163, 0x11b3, 0, -#undef V2933 -#define V2933 (V + 10746) - 0x1103, 0x1163, 0x11b4, 0, -#undef V2934 -#define V2934 (V + 10750) - 0x1103, 0x1163, 0x11b5, 0, -#undef V2935 -#define V2935 (V + 10754) - 0x1103, 0x1163, 0x11b6, 0, -#undef V2936 -#define V2936 (V + 10758) - 0x1103, 0x1163, 0x11b7, 0, -#undef V2937 -#define V2937 (V + 10762) - 0x1103, 0x1163, 0x11b8, 0, -#undef V2938 -#define V2938 (V + 10766) - 0x1103, 0x1163, 0x11b9, 0, -#undef V2939 -#define V2939 (V + 10770) - 0x1103, 0x1163, 0x11ba, 0, -#undef V2940 -#define V2940 (V + 10774) - 0x1103, 0x1163, 0x11bb, 0, -#undef V2941 -#define V2941 (V + 10778) - 0x1103, 0x1163, 0x11bc, 0, -#undef V2942 -#define V2942 (V + 10782) - 0x1103, 0x1163, 0x11bd, 0, -#undef V2943 -#define V2943 (V + 10786) - 0x1103, 0x1163, 0x11be, 0, -#undef V2944 -#define V2944 (V + 10790) - 0x1103, 0x1163, 0x11bf, 0, -#undef V2945 -#define V2945 (V + 10794) - 0x1103, 0x1163, 0x11c0, 0, -#undef V2946 -#define V2946 (V + 10798) - 0x1103, 0x1163, 0x11c1, 0, -#undef V2947 -#define V2947 (V + 10802) - 0x1103, 0x1163, 0x11c2, 0, -#undef V2948 -#define V2948 (V + 10806) - 0x1103, 0x1164, 0, -#undef V2949 -#define V2949 (V + 10809) - 0x1103, 0x1164, 0x11a8, 0, -#undef V2950 -#define V2950 (V + 10813) - 0x1103, 0x1164, 0x11a9, 0, -#undef V2951 -#define V2951 (V + 10817) - 0x1103, 0x1164, 0x11aa, 0, -#undef V2952 -#define V2952 (V + 10821) - 0x1103, 0x1164, 0x11ab, 0, -#undef V2953 -#define V2953 (V + 10825) - 0x1103, 0x1164, 0x11ac, 0, -#undef V2954 -#define V2954 (V + 10829) - 0x1103, 0x1164, 0x11ad, 0, -#undef V2955 -#define V2955 (V + 10833) - 0x1103, 0x1164, 0x11ae, 0, -#undef V2956 -#define V2956 (V + 10837) - 0x1103, 0x1164, 0x11af, 0, -#undef V2957 -#define V2957 (V + 10841) - 0x1103, 0x1164, 0x11b0, 0, -#undef V2958 -#define V2958 (V + 10845) - 0x1103, 0x1164, 0x11b1, 0, -#undef V2959 -#define V2959 (V + 10849) - 0x1103, 0x1164, 0x11b2, 0, -#undef V2960 -#define V2960 (V + 10853) - 0x1103, 0x1164, 0x11b3, 0, -#undef V2961 -#define V2961 (V + 10857) - 0x1103, 0x1164, 0x11b4, 0, -#undef V2962 -#define V2962 (V + 10861) - 0x1103, 0x1164, 0x11b5, 0, -#undef V2963 -#define V2963 (V + 10865) - 0x1103, 0x1164, 0x11b6, 0, -#undef V2964 -#define V2964 (V + 10869) - 0x1103, 0x1164, 0x11b7, 0, -#undef V2965 -#define V2965 (V + 10873) - 0x1103, 0x1164, 0x11b8, 0, -#undef V2966 -#define V2966 (V + 10877) - 0x1103, 0x1164, 0x11b9, 0, -#undef V2967 -#define V2967 (V + 10881) - 0x1103, 0x1164, 0x11ba, 0, -#undef V2968 -#define V2968 (V + 10885) - 0x1103, 0x1164, 0x11bb, 0, -#undef V2969 -#define V2969 (V + 10889) - 0x1103, 0x1164, 0x11bc, 0, -#undef V2970 -#define V2970 (V + 10893) - 0x1103, 0x1164, 0x11bd, 0, -#undef V2971 -#define V2971 (V + 10897) - 0x1103, 0x1164, 0x11be, 0, -#undef V2972 -#define V2972 (V + 10901) - 0x1103, 0x1164, 0x11bf, 0, -#undef V2973 -#define V2973 (V + 10905) - 0x1103, 0x1164, 0x11c0, 0, -#undef V2974 -#define V2974 (V + 10909) - 0x1103, 0x1164, 0x11c1, 0, -#undef V2975 -#define V2975 (V + 10913) - 0x1103, 0x1164, 0x11c2, 0, -#undef V2976 -#define V2976 (V + 10917) - 0x1103, 0x1165, 0, -#undef V2977 -#define V2977 (V + 10920) - 0x1103, 0x1165, 0x11a8, 0, -#undef V2978 -#define V2978 (V + 10924) - 0x1103, 0x1165, 0x11a9, 0, -#undef V2979 -#define V2979 (V + 10928) - 0x1103, 0x1165, 0x11aa, 0, -#undef V2980 -#define V2980 (V + 10932) - 0x1103, 0x1165, 0x11ab, 0, -#undef V2981 -#define V2981 (V + 10936) - 0x1103, 0x1165, 0x11ac, 0, -#undef V2982 -#define V2982 (V + 10940) - 0x1103, 0x1165, 0x11ad, 0, -#undef V2983 -#define V2983 (V + 10944) - 0x1103, 0x1165, 0x11ae, 0, -#undef V2984 -#define V2984 (V + 10948) - 0x1103, 0x1165, 0x11af, 0, -#undef V2985 -#define V2985 (V + 10952) - 0x1103, 0x1165, 0x11b0, 0, -#undef V2986 -#define V2986 (V + 10956) - 0x1103, 0x1165, 0x11b1, 0, -#undef V2987 -#define V2987 (V + 10960) - 0x1103, 0x1165, 0x11b2, 0, -#undef V2988 -#define V2988 (V + 10964) - 0x1103, 0x1165, 0x11b3, 0, -#undef V2989 -#define V2989 (V + 10968) - 0x1103, 0x1165, 0x11b4, 0, -#undef V2990 -#define V2990 (V + 10972) - 0x1103, 0x1165, 0x11b5, 0, -#undef V2991 -#define V2991 (V + 10976) - 0x1103, 0x1165, 0x11b6, 0, -#undef V2992 -#define V2992 (V + 10980) - 0x1103, 0x1165, 0x11b7, 0, -#undef V2993 -#define V2993 (V + 10984) - 0x1103, 0x1165, 0x11b8, 0, -#undef V2994 -#define V2994 (V + 10988) - 0x1103, 0x1165, 0x11b9, 0, -#undef V2995 -#define V2995 (V + 10992) - 0x1103, 0x1165, 0x11ba, 0, -#undef V2996 -#define V2996 (V + 10996) - 0x1103, 0x1165, 0x11bb, 0, -#undef V2997 -#define V2997 (V + 11000) - 0x1103, 0x1165, 0x11bc, 0, -#undef V2998 -#define V2998 (V + 11004) - 0x1103, 0x1165, 0x11bd, 0, -#undef V2999 -#define V2999 (V + 11008) - 0x1103, 0x1165, 0x11be, 0, -#undef V3000 -#define V3000 (V + 11012) - 0x1103, 0x1165, 0x11bf, 0, -#undef V3001 -#define V3001 (V + 11016) - 0x1103, 0x1165, 0x11c0, 0, -#undef V3002 -#define V3002 (V + 11020) - 0x1103, 0x1165, 0x11c1, 0, -#undef V3003 -#define V3003 (V + 11024) - 0x1103, 0x1165, 0x11c2, 0, -#undef V3004 -#define V3004 (V + 11028) - 0x1103, 0x1166, 0, -#undef V3005 -#define V3005 (V + 11031) - 0x1103, 0x1166, 0x11a8, 0, -#undef V3006 -#define V3006 (V + 11035) - 0x1103, 0x1166, 0x11a9, 0, -#undef V3007 -#define V3007 (V + 11039) - 0x1103, 0x1166, 0x11aa, 0, -#undef V3008 -#define V3008 (V + 11043) - 0x1103, 0x1166, 0x11ab, 0, -#undef V3009 -#define V3009 (V + 11047) - 0x1103, 0x1166, 0x11ac, 0, -#undef V3010 -#define V3010 (V + 11051) - 0x1103, 0x1166, 0x11ad, 0, -#undef V3011 -#define V3011 (V + 11055) - 0x1103, 0x1166, 0x11ae, 0, -#undef V3012 -#define V3012 (V + 11059) - 0x1103, 0x1166, 0x11af, 0, -#undef V3013 -#define V3013 (V + 11063) - 0x1103, 0x1166, 0x11b0, 0, -#undef V3014 -#define V3014 (V + 11067) - 0x1103, 0x1166, 0x11b1, 0, -#undef V3015 -#define V3015 (V + 11071) - 0x1103, 0x1166, 0x11b2, 0, -#undef V3016 -#define V3016 (V + 11075) - 0x1103, 0x1166, 0x11b3, 0, -#undef V3017 -#define V3017 (V + 11079) - 0x1103, 0x1166, 0x11b4, 0, -#undef V3018 -#define V3018 (V + 11083) - 0x1103, 0x1166, 0x11b5, 0, -#undef V3019 -#define V3019 (V + 11087) - 0x1103, 0x1166, 0x11b6, 0, -#undef V3020 -#define V3020 (V + 11091) - 0x1103, 0x1166, 0x11b7, 0, -#undef V3021 -#define V3021 (V + 11095) - 0x1103, 0x1166, 0x11b8, 0, -#undef V3022 -#define V3022 (V + 11099) - 0x1103, 0x1166, 0x11b9, 0, -#undef V3023 -#define V3023 (V + 11103) - 0x1103, 0x1166, 0x11ba, 0, -#undef V3024 -#define V3024 (V + 11107) - 0x1103, 0x1166, 0x11bb, 0, -#undef V3025 -#define V3025 (V + 11111) - 0x1103, 0x1166, 0x11bc, 0, -#undef V3026 -#define V3026 (V + 11115) - 0x1103, 0x1166, 0x11bd, 0, -#undef V3027 -#define V3027 (V + 11119) - 0x1103, 0x1166, 0x11be, 0, -#undef V3028 -#define V3028 (V + 11123) - 0x1103, 0x1166, 0x11bf, 0, -#undef V3029 -#define V3029 (V + 11127) - 0x1103, 0x1166, 0x11c0, 0, -#undef V3030 -#define V3030 (V + 11131) - 0x1103, 0x1166, 0x11c1, 0, -#undef V3031 -#define V3031 (V + 11135) - 0x1103, 0x1166, 0x11c2, 0, -#undef V3032 -#define V3032 (V + 11139) - 0x1103, 0x1167, 0, -#undef V3033 -#define V3033 (V + 11142) - 0x1103, 0x1167, 0x11a8, 0, -#undef V3034 -#define V3034 (V + 11146) - 0x1103, 0x1167, 0x11a9, 0, -#undef V3035 -#define V3035 (V + 11150) - 0x1103, 0x1167, 0x11aa, 0, -#undef V3036 -#define V3036 (V + 11154) - 0x1103, 0x1167, 0x11ab, 0, -#undef V3037 -#define V3037 (V + 11158) - 0x1103, 0x1167, 0x11ac, 0, -#undef V3038 -#define V3038 (V + 11162) - 0x1103, 0x1167, 0x11ad, 0, -#undef V3039 -#define V3039 (V + 11166) - 0x1103, 0x1167, 0x11ae, 0, -#undef V3040 -#define V3040 (V + 11170) - 0x1103, 0x1167, 0x11af, 0, -#undef V3041 -#define V3041 (V + 11174) - 0x1103, 0x1167, 0x11b0, 0, -#undef V3042 -#define V3042 (V + 11178) - 0x1103, 0x1167, 0x11b1, 0, -#undef V3043 -#define V3043 (V + 11182) - 0x1103, 0x1167, 0x11b2, 0, -#undef V3044 -#define V3044 (V + 11186) - 0x1103, 0x1167, 0x11b3, 0, -#undef V3045 -#define V3045 (V + 11190) - 0x1103, 0x1167, 0x11b4, 0, -#undef V3046 -#define V3046 (V + 11194) - 0x1103, 0x1167, 0x11b5, 0, -#undef V3047 -#define V3047 (V + 11198) - 0x1103, 0x1167, 0x11b6, 0, -#undef V3048 -#define V3048 (V + 11202) - 0x1103, 0x1167, 0x11b7, 0, -#undef V3049 -#define V3049 (V + 11206) - 0x1103, 0x1167, 0x11b8, 0, -#undef V3050 -#define V3050 (V + 11210) - 0x1103, 0x1167, 0x11b9, 0, -#undef V3051 -#define V3051 (V + 11214) - 0x1103, 0x1167, 0x11ba, 0, -#undef V3052 -#define V3052 (V + 11218) - 0x1103, 0x1167, 0x11bb, 0, -#undef V3053 -#define V3053 (V + 11222) - 0x1103, 0x1167, 0x11bc, 0, -#undef V3054 -#define V3054 (V + 11226) - 0x1103, 0x1167, 0x11bd, 0, -#undef V3055 -#define V3055 (V + 11230) - 0x1103, 0x1167, 0x11be, 0, -#undef V3056 -#define V3056 (V + 11234) - 0x1103, 0x1167, 0x11bf, 0, -#undef V3057 -#define V3057 (V + 11238) - 0x1103, 0x1167, 0x11c0, 0, -#undef V3058 -#define V3058 (V + 11242) - 0x1103, 0x1167, 0x11c1, 0, -#undef V3059 -#define V3059 (V + 11246) - 0x1103, 0x1167, 0x11c2, 0, -#undef V3060 -#define V3060 (V + 11250) - 0x1103, 0x1168, 0, -#undef V3061 -#define V3061 (V + 11253) - 0x1103, 0x1168, 0x11a8, 0, -#undef V3062 -#define V3062 (V + 11257) - 0x1103, 0x1168, 0x11a9, 0, -#undef V3063 -#define V3063 (V + 11261) - 0x1103, 0x1168, 0x11aa, 0, -#undef V3064 -#define V3064 (V + 11265) - 0x1103, 0x1168, 0x11ab, 0, -#undef V3065 -#define V3065 (V + 11269) - 0x1103, 0x1168, 0x11ac, 0, -#undef V3066 -#define V3066 (V + 11273) - 0x1103, 0x1168, 0x11ad, 0, -#undef V3067 -#define V3067 (V + 11277) - 0x1103, 0x1168, 0x11ae, 0, -#undef V3068 -#define V3068 (V + 11281) - 0x1103, 0x1168, 0x11af, 0, -#undef V3069 -#define V3069 (V + 11285) - 0x1103, 0x1168, 0x11b0, 0, -#undef V3070 -#define V3070 (V + 11289) - 0x1103, 0x1168, 0x11b1, 0, -#undef V3071 -#define V3071 (V + 11293) - 0x1103, 0x1168, 0x11b2, 0, -#undef V3072 -#define V3072 (V + 11297) - 0x1103, 0x1168, 0x11b3, 0, -#undef V3073 -#define V3073 (V + 11301) - 0x1103, 0x1168, 0x11b4, 0, -#undef V3074 -#define V3074 (V + 11305) - 0x1103, 0x1168, 0x11b5, 0, -#undef V3075 -#define V3075 (V + 11309) - 0x1103, 0x1168, 0x11b6, 0, -#undef V3076 -#define V3076 (V + 11313) - 0x1103, 0x1168, 0x11b7, 0, -#undef V3077 -#define V3077 (V + 11317) - 0x1103, 0x1168, 0x11b8, 0, -#undef V3078 -#define V3078 (V + 11321) - 0x1103, 0x1168, 0x11b9, 0, -#undef V3079 -#define V3079 (V + 11325) - 0x1103, 0x1168, 0x11ba, 0, -#undef V3080 -#define V3080 (V + 11329) - 0x1103, 0x1168, 0x11bb, 0, -#undef V3081 -#define V3081 (V + 11333) - 0x1103, 0x1168, 0x11bc, 0, -#undef V3082 -#define V3082 (V + 11337) - 0x1103, 0x1168, 0x11bd, 0, -#undef V3083 -#define V3083 (V + 11341) - 0x1103, 0x1168, 0x11be, 0, -#undef V3084 -#define V3084 (V + 11345) - 0x1103, 0x1168, 0x11bf, 0, -#undef V3085 -#define V3085 (V + 11349) - 0x1103, 0x1168, 0x11c0, 0, -#undef V3086 -#define V3086 (V + 11353) - 0x1103, 0x1168, 0x11c1, 0, -#undef V3087 -#define V3087 (V + 11357) - 0x1103, 0x1168, 0x11c2, 0, -#undef V3088 -#define V3088 (V + 11361) - 0x1103, 0x1169, 0, -#undef V3089 -#define V3089 (V + 11364) - 0x1103, 0x1169, 0x11a8, 0, -#undef V3090 -#define V3090 (V + 11368) - 0x1103, 0x1169, 0x11a9, 0, -#undef V3091 -#define V3091 (V + 11372) - 0x1103, 0x1169, 0x11aa, 0, -#undef V3092 -#define V3092 (V + 11376) - 0x1103, 0x1169, 0x11ab, 0, -#undef V3093 -#define V3093 (V + 11380) - 0x1103, 0x1169, 0x11ac, 0, -#undef V3094 -#define V3094 (V + 11384) - 0x1103, 0x1169, 0x11ad, 0, -#undef V3095 -#define V3095 (V + 11388) - 0x1103, 0x1169, 0x11ae, 0, -#undef V3096 -#define V3096 (V + 11392) - 0x1103, 0x1169, 0x11af, 0, -#undef V3097 -#define V3097 (V + 11396) - 0x1103, 0x1169, 0x11b0, 0, -#undef V3098 -#define V3098 (V + 11400) - 0x1103, 0x1169, 0x11b1, 0, -#undef V3099 -#define V3099 (V + 11404) - 0x1103, 0x1169, 0x11b2, 0, -#undef V3100 -#define V3100 (V + 11408) - 0x1103, 0x1169, 0x11b3, 0, -#undef V3101 -#define V3101 (V + 11412) - 0x1103, 0x1169, 0x11b4, 0, -#undef V3102 -#define V3102 (V + 11416) - 0x1103, 0x1169, 0x11b5, 0, -#undef V3103 -#define V3103 (V + 11420) - 0x1103, 0x1169, 0x11b6, 0, -#undef V3104 -#define V3104 (V + 11424) - 0x1103, 0x1169, 0x11b7, 0, -#undef V3105 -#define V3105 (V + 11428) - 0x1103, 0x1169, 0x11b8, 0, -#undef V3106 -#define V3106 (V + 11432) - 0x1103, 0x1169, 0x11b9, 0, -#undef V3107 -#define V3107 (V + 11436) - 0x1103, 0x1169, 0x11ba, 0, -#undef V3108 -#define V3108 (V + 11440) - 0x1103, 0x1169, 0x11bb, 0, -#undef V3109 -#define V3109 (V + 11444) - 0x1103, 0x1169, 0x11bc, 0, -#undef V3110 -#define V3110 (V + 11448) - 0x1103, 0x1169, 0x11bd, 0, -#undef V3111 -#define V3111 (V + 11452) - 0x1103, 0x1169, 0x11be, 0, -#undef V3112 -#define V3112 (V + 11456) - 0x1103, 0x1169, 0x11bf, 0, -#undef V3113 -#define V3113 (V + 11460) - 0x1103, 0x1169, 0x11c0, 0, -#undef V3114 -#define V3114 (V + 11464) - 0x1103, 0x1169, 0x11c1, 0, -#undef V3115 -#define V3115 (V + 11468) - 0x1103, 0x1169, 0x11c2, 0, -#undef V3116 -#define V3116 (V + 11472) - 0x1103, 0x116a, 0, -#undef V3117 -#define V3117 (V + 11475) - 0x1103, 0x116a, 0x11a8, 0, -#undef V3118 -#define V3118 (V + 11479) - 0x1103, 0x116a, 0x11a9, 0, -#undef V3119 -#define V3119 (V + 11483) - 0x1103, 0x116a, 0x11aa, 0, -#undef V3120 -#define V3120 (V + 11487) - 0x1103, 0x116a, 0x11ab, 0, -#undef V3121 -#define V3121 (V + 11491) - 0x1103, 0x116a, 0x11ac, 0, -#undef V3122 -#define V3122 (V + 11495) - 0x1103, 0x116a, 0x11ad, 0, -#undef V3123 -#define V3123 (V + 11499) - 0x1103, 0x116a, 0x11ae, 0, -#undef V3124 -#define V3124 (V + 11503) - 0x1103, 0x116a, 0x11af, 0, -#undef V3125 -#define V3125 (V + 11507) - 0x1103, 0x116a, 0x11b0, 0, -#undef V3126 -#define V3126 (V + 11511) - 0x1103, 0x116a, 0x11b1, 0, -#undef V3127 -#define V3127 (V + 11515) - 0x1103, 0x116a, 0x11b2, 0, -#undef V3128 -#define V3128 (V + 11519) - 0x1103, 0x116a, 0x11b3, 0, -#undef V3129 -#define V3129 (V + 11523) - 0x1103, 0x116a, 0x11b4, 0, -#undef V3130 -#define V3130 (V + 11527) - 0x1103, 0x116a, 0x11b5, 0, -#undef V3131 -#define V3131 (V + 11531) - 0x1103, 0x116a, 0x11b6, 0, -#undef V3132 -#define V3132 (V + 11535) - 0x1103, 0x116a, 0x11b7, 0, -#undef V3133 -#define V3133 (V + 11539) - 0x1103, 0x116a, 0x11b8, 0, -#undef V3134 -#define V3134 (V + 11543) - 0x1103, 0x116a, 0x11b9, 0, -#undef V3135 -#define V3135 (V + 11547) - 0x1103, 0x116a, 0x11ba, 0, -#undef V3136 -#define V3136 (V + 11551) - 0x1103, 0x116a, 0x11bb, 0, -#undef V3137 -#define V3137 (V + 11555) - 0x1103, 0x116a, 0x11bc, 0, -#undef V3138 -#define V3138 (V + 11559) - 0x1103, 0x116a, 0x11bd, 0, -#undef V3139 -#define V3139 (V + 11563) - 0x1103, 0x116a, 0x11be, 0, -#undef V3140 -#define V3140 (V + 11567) - 0x1103, 0x116a, 0x11bf, 0, -#undef V3141 -#define V3141 (V + 11571) - 0x1103, 0x116a, 0x11c0, 0, -#undef V3142 -#define V3142 (V + 11575) - 0x1103, 0x116a, 0x11c1, 0, -#undef V3143 -#define V3143 (V + 11579) - 0x1103, 0x116a, 0x11c2, 0, -#undef V3144 -#define V3144 (V + 11583) - 0x1103, 0x116b, 0, -#undef V3145 -#define V3145 (V + 11586) - 0x1103, 0x116b, 0x11a8, 0, -#undef V3146 -#define V3146 (V + 11590) - 0x1103, 0x116b, 0x11a9, 0, -#undef V3147 -#define V3147 (V + 11594) - 0x1103, 0x116b, 0x11aa, 0, -#undef V3148 -#define V3148 (V + 11598) - 0x1103, 0x116b, 0x11ab, 0, -#undef V3149 -#define V3149 (V + 11602) - 0x1103, 0x116b, 0x11ac, 0, -#undef V3150 -#define V3150 (V + 11606) - 0x1103, 0x116b, 0x11ad, 0, -#undef V3151 -#define V3151 (V + 11610) - 0x1103, 0x116b, 0x11ae, 0, -#undef V3152 -#define V3152 (V + 11614) - 0x1103, 0x116b, 0x11af, 0, -#undef V3153 -#define V3153 (V + 11618) - 0x1103, 0x116b, 0x11b0, 0, -#undef V3154 -#define V3154 (V + 11622) - 0x1103, 0x116b, 0x11b1, 0, -#undef V3155 -#define V3155 (V + 11626) - 0x1103, 0x116b, 0x11b2, 0, -#undef V3156 -#define V3156 (V + 11630) - 0x1103, 0x116b, 0x11b3, 0, -#undef V3157 -#define V3157 (V + 11634) - 0x1103, 0x116b, 0x11b4, 0, -#undef V3158 -#define V3158 (V + 11638) - 0x1103, 0x116b, 0x11b5, 0, -#undef V3159 -#define V3159 (V + 11642) - 0x1103, 0x116b, 0x11b6, 0, -#undef V3160 -#define V3160 (V + 11646) - 0x1103, 0x116b, 0x11b7, 0, -#undef V3161 -#define V3161 (V + 11650) - 0x1103, 0x116b, 0x11b8, 0, -#undef V3162 -#define V3162 (V + 11654) - 0x1103, 0x116b, 0x11b9, 0, -#undef V3163 -#define V3163 (V + 11658) - 0x1103, 0x116b, 0x11ba, 0, -#undef V3164 -#define V3164 (V + 11662) - 0x1103, 0x116b, 0x11bb, 0, -#undef V3165 -#define V3165 (V + 11666) - 0x1103, 0x116b, 0x11bc, 0, -#undef V3166 -#define V3166 (V + 11670) - 0x1103, 0x116b, 0x11bd, 0, -#undef V3167 -#define V3167 (V + 11674) - 0x1103, 0x116b, 0x11be, 0, -#undef V3168 -#define V3168 (V + 11678) - 0x1103, 0x116b, 0x11bf, 0, -#undef V3169 -#define V3169 (V + 11682) - 0x1103, 0x116b, 0x11c0, 0, -#undef V3170 -#define V3170 (V + 11686) - 0x1103, 0x116b, 0x11c1, 0, -#undef V3171 -#define V3171 (V + 11690) - 0x1103, 0x116b, 0x11c2, 0, -#undef V3172 -#define V3172 (V + 11694) - 0x1103, 0x116c, 0, -#undef V3173 -#define V3173 (V + 11697) - 0x1103, 0x116c, 0x11a8, 0, -#undef V3174 -#define V3174 (V + 11701) - 0x1103, 0x116c, 0x11a9, 0, -#undef V3175 -#define V3175 (V + 11705) - 0x1103, 0x116c, 0x11aa, 0, -#undef V3176 -#define V3176 (V + 11709) - 0x1103, 0x116c, 0x11ab, 0, -#undef V3177 -#define V3177 (V + 11713) - 0x1103, 0x116c, 0x11ac, 0, -#undef V3178 -#define V3178 (V + 11717) - 0x1103, 0x116c, 0x11ad, 0, -#undef V3179 -#define V3179 (V + 11721) - 0x1103, 0x116c, 0x11ae, 0, -#undef V3180 -#define V3180 (V + 11725) - 0x1103, 0x116c, 0x11af, 0, -#undef V3181 -#define V3181 (V + 11729) - 0x1103, 0x116c, 0x11b0, 0, -#undef V3182 -#define V3182 (V + 11733) - 0x1103, 0x116c, 0x11b1, 0, -#undef V3183 -#define V3183 (V + 11737) - 0x1103, 0x116c, 0x11b2, 0, -#undef V3184 -#define V3184 (V + 11741) - 0x1103, 0x116c, 0x11b3, 0, -#undef V3185 -#define V3185 (V + 11745) - 0x1103, 0x116c, 0x11b4, 0, -#undef V3186 -#define V3186 (V + 11749) - 0x1103, 0x116c, 0x11b5, 0, -#undef V3187 -#define V3187 (V + 11753) - 0x1103, 0x116c, 0x11b6, 0, -#undef V3188 -#define V3188 (V + 11757) - 0x1103, 0x116c, 0x11b7, 0, -#undef V3189 -#define V3189 (V + 11761) - 0x1103, 0x116c, 0x11b8, 0, -#undef V3190 -#define V3190 (V + 11765) - 0x1103, 0x116c, 0x11b9, 0, -#undef V3191 -#define V3191 (V + 11769) - 0x1103, 0x116c, 0x11ba, 0, -#undef V3192 -#define V3192 (V + 11773) - 0x1103, 0x116c, 0x11bb, 0, -#undef V3193 -#define V3193 (V + 11777) - 0x1103, 0x116c, 0x11bc, 0, -#undef V3194 -#define V3194 (V + 11781) - 0x1103, 0x116c, 0x11bd, 0, -#undef V3195 -#define V3195 (V + 11785) - 0x1103, 0x116c, 0x11be, 0, -#undef V3196 -#define V3196 (V + 11789) - 0x1103, 0x116c, 0x11bf, 0, -#undef V3197 -#define V3197 (V + 11793) - 0x1103, 0x116c, 0x11c0, 0, -#undef V3198 -#define V3198 (V + 11797) - 0x1103, 0x116c, 0x11c1, 0, -#undef V3199 -#define V3199 (V + 11801) - 0x1103, 0x116c, 0x11c2, 0, -#undef V3200 -#define V3200 (V + 11805) - 0x1103, 0x116d, 0, -#undef V3201 -#define V3201 (V + 11808) - 0x1103, 0x116d, 0x11a8, 0, -#undef V3202 -#define V3202 (V + 11812) - 0x1103, 0x116d, 0x11a9, 0, -#undef V3203 -#define V3203 (V + 11816) - 0x1103, 0x116d, 0x11aa, 0, -#undef V3204 -#define V3204 (V + 11820) - 0x1103, 0x116d, 0x11ab, 0, -#undef V3205 -#define V3205 (V + 11824) - 0x1103, 0x116d, 0x11ac, 0, -#undef V3206 -#define V3206 (V + 11828) - 0x1103, 0x116d, 0x11ad, 0, -#undef V3207 -#define V3207 (V + 11832) - 0x1103, 0x116d, 0x11ae, 0, -#undef V3208 -#define V3208 (V + 11836) - 0x1103, 0x116d, 0x11af, 0, -#undef V3209 -#define V3209 (V + 11840) - 0x1103, 0x116d, 0x11b0, 0, -#undef V3210 -#define V3210 (V + 11844) - 0x1103, 0x116d, 0x11b1, 0, -#undef V3211 -#define V3211 (V + 11848) - 0x1103, 0x116d, 0x11b2, 0, -#undef V3212 -#define V3212 (V + 11852) - 0x1103, 0x116d, 0x11b3, 0, -#undef V3213 -#define V3213 (V + 11856) - 0x1103, 0x116d, 0x11b4, 0, -#undef V3214 -#define V3214 (V + 11860) - 0x1103, 0x116d, 0x11b5, 0, -#undef V3215 -#define V3215 (V + 11864) - 0x1103, 0x116d, 0x11b6, 0, -#undef V3216 -#define V3216 (V + 11868) - 0x1103, 0x116d, 0x11b7, 0, -#undef V3217 -#define V3217 (V + 11872) - 0x1103, 0x116d, 0x11b8, 0, -#undef V3218 -#define V3218 (V + 11876) - 0x1103, 0x116d, 0x11b9, 0, -#undef V3219 -#define V3219 (V + 11880) - 0x1103, 0x116d, 0x11ba, 0, -#undef V3220 -#define V3220 (V + 11884) - 0x1103, 0x116d, 0x11bb, 0, -#undef V3221 -#define V3221 (V + 11888) - 0x1103, 0x116d, 0x11bc, 0, -#undef V3222 -#define V3222 (V + 11892) - 0x1103, 0x116d, 0x11bd, 0, -#undef V3223 -#define V3223 (V + 11896) - 0x1103, 0x116d, 0x11be, 0, -#undef V3224 -#define V3224 (V + 11900) - 0x1103, 0x116d, 0x11bf, 0, -#undef V3225 -#define V3225 (V + 11904) - 0x1103, 0x116d, 0x11c0, 0, -#undef V3226 -#define V3226 (V + 11908) - 0x1103, 0x116d, 0x11c1, 0, -#undef V3227 -#define V3227 (V + 11912) - 0x1103, 0x116d, 0x11c2, 0, -#undef V3228 -#define V3228 (V + 11916) - 0x1103, 0x116e, 0, -#undef V3229 -#define V3229 (V + 11919) - 0x1103, 0x116e, 0x11a8, 0, -#undef V3230 -#define V3230 (V + 11923) - 0x1103, 0x116e, 0x11a9, 0, -#undef V3231 -#define V3231 (V + 11927) - 0x1103, 0x116e, 0x11aa, 0, -#undef V3232 -#define V3232 (V + 11931) - 0x1103, 0x116e, 0x11ab, 0, -#undef V3233 -#define V3233 (V + 11935) - 0x1103, 0x116e, 0x11ac, 0, -#undef V3234 -#define V3234 (V + 11939) - 0x1103, 0x116e, 0x11ad, 0, -#undef V3235 -#define V3235 (V + 11943) - 0x1103, 0x116e, 0x11ae, 0, -#undef V3236 -#define V3236 (V + 11947) - 0x1103, 0x116e, 0x11af, 0, -#undef V3237 -#define V3237 (V + 11951) - 0x1103, 0x116e, 0x11b0, 0, -#undef V3238 -#define V3238 (V + 11955) - 0x1103, 0x116e, 0x11b1, 0, -#undef V3239 -#define V3239 (V + 11959) - 0x1103, 0x116e, 0x11b2, 0, -#undef V3240 -#define V3240 (V + 11963) - 0x1103, 0x116e, 0x11b3, 0, -#undef V3241 -#define V3241 (V + 11967) - 0x1103, 0x116e, 0x11b4, 0, -#undef V3242 -#define V3242 (V + 11971) - 0x1103, 0x116e, 0x11b5, 0, -#undef V3243 -#define V3243 (V + 11975) - 0x1103, 0x116e, 0x11b6, 0, -#undef V3244 -#define V3244 (V + 11979) - 0x1103, 0x116e, 0x11b7, 0, -#undef V3245 -#define V3245 (V + 11983) - 0x1103, 0x116e, 0x11b8, 0, -#undef V3246 -#define V3246 (V + 11987) - 0x1103, 0x116e, 0x11b9, 0, -#undef V3247 -#define V3247 (V + 11991) - 0x1103, 0x116e, 0x11ba, 0, -#undef V3248 -#define V3248 (V + 11995) - 0x1103, 0x116e, 0x11bb, 0, -#undef V3249 -#define V3249 (V + 11999) - 0x1103, 0x116e, 0x11bc, 0, -#undef V3250 -#define V3250 (V + 12003) - 0x1103, 0x116e, 0x11bd, 0, -#undef V3251 -#define V3251 (V + 12007) - 0x1103, 0x116e, 0x11be, 0, -#undef V3252 -#define V3252 (V + 12011) - 0x1103, 0x116e, 0x11bf, 0, -#undef V3253 -#define V3253 (V + 12015) - 0x1103, 0x116e, 0x11c0, 0, -#undef V3254 -#define V3254 (V + 12019) - 0x1103, 0x116e, 0x11c1, 0, -#undef V3255 -#define V3255 (V + 12023) - 0x1103, 0x116e, 0x11c2, 0, -#undef V3256 -#define V3256 (V + 12027) - 0x1103, 0x116f, 0, -#undef V3257 -#define V3257 (V + 12030) - 0x1103, 0x116f, 0x11a8, 0, -#undef V3258 -#define V3258 (V + 12034) - 0x1103, 0x116f, 0x11a9, 0, -#undef V3259 -#define V3259 (V + 12038) - 0x1103, 0x116f, 0x11aa, 0, -#undef V3260 -#define V3260 (V + 12042) - 0x1103, 0x116f, 0x11ab, 0, -#undef V3261 -#define V3261 (V + 12046) - 0x1103, 0x116f, 0x11ac, 0, -#undef V3262 -#define V3262 (V + 12050) - 0x1103, 0x116f, 0x11ad, 0, -#undef V3263 -#define V3263 (V + 12054) - 0x1103, 0x116f, 0x11ae, 0, -#undef V3264 -#define V3264 (V + 12058) - 0x1103, 0x116f, 0x11af, 0, -#undef V3265 -#define V3265 (V + 12062) - 0x1103, 0x116f, 0x11b0, 0, -#undef V3266 -#define V3266 (V + 12066) - 0x1103, 0x116f, 0x11b1, 0, -#undef V3267 -#define V3267 (V + 12070) - 0x1103, 0x116f, 0x11b2, 0, -#undef V3268 -#define V3268 (V + 12074) - 0x1103, 0x116f, 0x11b3, 0, -#undef V3269 -#define V3269 (V + 12078) - 0x1103, 0x116f, 0x11b4, 0, -#undef V3270 -#define V3270 (V + 12082) - 0x1103, 0x116f, 0x11b5, 0, -#undef V3271 -#define V3271 (V + 12086) - 0x1103, 0x116f, 0x11b6, 0, -#undef V3272 -#define V3272 (V + 12090) - 0x1103, 0x116f, 0x11b7, 0, -#undef V3273 -#define V3273 (V + 12094) - 0x1103, 0x116f, 0x11b8, 0, -#undef V3274 -#define V3274 (V + 12098) - 0x1103, 0x116f, 0x11b9, 0, -#undef V3275 -#define V3275 (V + 12102) - 0x1103, 0x116f, 0x11ba, 0, -#undef V3276 -#define V3276 (V + 12106) - 0x1103, 0x116f, 0x11bb, 0, -#undef V3277 -#define V3277 (V + 12110) - 0x1103, 0x116f, 0x11bc, 0, -#undef V3278 -#define V3278 (V + 12114) - 0x1103, 0x116f, 0x11bd, 0, -#undef V3279 -#define V3279 (V + 12118) - 0x1103, 0x116f, 0x11be, 0, -#undef V3280 -#define V3280 (V + 12122) - 0x1103, 0x116f, 0x11bf, 0, -#undef V3281 -#define V3281 (V + 12126) - 0x1103, 0x116f, 0x11c0, 0, -#undef V3282 -#define V3282 (V + 12130) - 0x1103, 0x116f, 0x11c1, 0, -#undef V3283 -#define V3283 (V + 12134) - 0x1103, 0x116f, 0x11c2, 0, -#undef V3284 -#define V3284 (V + 12138) - 0x1103, 0x1170, 0, -#undef V3285 -#define V3285 (V + 12141) - 0x1103, 0x1170, 0x11a8, 0, -#undef V3286 -#define V3286 (V + 12145) - 0x1103, 0x1170, 0x11a9, 0, -#undef V3287 -#define V3287 (V + 12149) - 0x1103, 0x1170, 0x11aa, 0, -#undef V3288 -#define V3288 (V + 12153) - 0x1103, 0x1170, 0x11ab, 0, -#undef V3289 -#define V3289 (V + 12157) - 0x1103, 0x1170, 0x11ac, 0, -#undef V3290 -#define V3290 (V + 12161) - 0x1103, 0x1170, 0x11ad, 0, -#undef V3291 -#define V3291 (V + 12165) - 0x1103, 0x1170, 0x11ae, 0, -#undef V3292 -#define V3292 (V + 12169) - 0x1103, 0x1170, 0x11af, 0, -#undef V3293 -#define V3293 (V + 12173) - 0x1103, 0x1170, 0x11b0, 0, -#undef V3294 -#define V3294 (V + 12177) - 0x1103, 0x1170, 0x11b1, 0, -#undef V3295 -#define V3295 (V + 12181) - 0x1103, 0x1170, 0x11b2, 0, -#undef V3296 -#define V3296 (V + 12185) - 0x1103, 0x1170, 0x11b3, 0, -#undef V3297 -#define V3297 (V + 12189) - 0x1103, 0x1170, 0x11b4, 0, -#undef V3298 -#define V3298 (V + 12193) - 0x1103, 0x1170, 0x11b5, 0, -#undef V3299 -#define V3299 (V + 12197) - 0x1103, 0x1170, 0x11b6, 0, -#undef V3300 -#define V3300 (V + 12201) - 0x1103, 0x1170, 0x11b7, 0, -#undef V3301 -#define V3301 (V + 12205) - 0x1103, 0x1170, 0x11b8, 0, -#undef V3302 -#define V3302 (V + 12209) - 0x1103, 0x1170, 0x11b9, 0, -#undef V3303 -#define V3303 (V + 12213) - 0x1103, 0x1170, 0x11ba, 0, -#undef V3304 -#define V3304 (V + 12217) - 0x1103, 0x1170, 0x11bb, 0, -#undef V3305 -#define V3305 (V + 12221) - 0x1103, 0x1170, 0x11bc, 0, -#undef V3306 -#define V3306 (V + 12225) - 0x1103, 0x1170, 0x11bd, 0, -#undef V3307 -#define V3307 (V + 12229) - 0x1103, 0x1170, 0x11be, 0, -#undef V3308 -#define V3308 (V + 12233) - 0x1103, 0x1170, 0x11bf, 0, -#undef V3309 -#define V3309 (V + 12237) - 0x1103, 0x1170, 0x11c0, 0, -#undef V3310 -#define V3310 (V + 12241) - 0x1103, 0x1170, 0x11c1, 0, -#undef V3311 -#define V3311 (V + 12245) - 0x1103, 0x1170, 0x11c2, 0, -#undef V3312 -#define V3312 (V + 12249) - 0x1103, 0x1171, 0, -#undef V3313 -#define V3313 (V + 12252) - 0x1103, 0x1171, 0x11a8, 0, -#undef V3314 -#define V3314 (V + 12256) - 0x1103, 0x1171, 0x11a9, 0, -#undef V3315 -#define V3315 (V + 12260) - 0x1103, 0x1171, 0x11aa, 0, -#undef V3316 -#define V3316 (V + 12264) - 0x1103, 0x1171, 0x11ab, 0, -#undef V3317 -#define V3317 (V + 12268) - 0x1103, 0x1171, 0x11ac, 0, -#undef V3318 -#define V3318 (V + 12272) - 0x1103, 0x1171, 0x11ad, 0, -#undef V3319 -#define V3319 (V + 12276) - 0x1103, 0x1171, 0x11ae, 0, -#undef V3320 -#define V3320 (V + 12280) - 0x1103, 0x1171, 0x11af, 0, -#undef V3321 -#define V3321 (V + 12284) - 0x1103, 0x1171, 0x11b0, 0, -#undef V3322 -#define V3322 (V + 12288) - 0x1103, 0x1171, 0x11b1, 0, -#undef V3323 -#define V3323 (V + 12292) - 0x1103, 0x1171, 0x11b2, 0, -#undef V3324 -#define V3324 (V + 12296) - 0x1103, 0x1171, 0x11b3, 0, -#undef V3325 -#define V3325 (V + 12300) - 0x1103, 0x1171, 0x11b4, 0, -#undef V3326 -#define V3326 (V + 12304) - 0x1103, 0x1171, 0x11b5, 0, -#undef V3327 -#define V3327 (V + 12308) - 0x1103, 0x1171, 0x11b6, 0, -#undef V3328 -#define V3328 (V + 12312) - 0x1103, 0x1171, 0x11b7, 0, -#undef V3329 -#define V3329 (V + 12316) - 0x1103, 0x1171, 0x11b8, 0, -#undef V3330 -#define V3330 (V + 12320) - 0x1103, 0x1171, 0x11b9, 0, -#undef V3331 -#define V3331 (V + 12324) - 0x1103, 0x1171, 0x11ba, 0, -#undef V3332 -#define V3332 (V + 12328) - 0x1103, 0x1171, 0x11bb, 0, -#undef V3333 -#define V3333 (V + 12332) - 0x1103, 0x1171, 0x11bc, 0, -#undef V3334 -#define V3334 (V + 12336) - 0x1103, 0x1171, 0x11bd, 0, -#undef V3335 -#define V3335 (V + 12340) - 0x1103, 0x1171, 0x11be, 0, -#undef V3336 -#define V3336 (V + 12344) - 0x1103, 0x1171, 0x11bf, 0, -#undef V3337 -#define V3337 (V + 12348) - 0x1103, 0x1171, 0x11c0, 0, -#undef V3338 -#define V3338 (V + 12352) - 0x1103, 0x1171, 0x11c1, 0, -#undef V3339 -#define V3339 (V + 12356) - 0x1103, 0x1171, 0x11c2, 0, -#undef V3340 -#define V3340 (V + 12360) - 0x1103, 0x1172, 0, -#undef V3341 -#define V3341 (V + 12363) - 0x1103, 0x1172, 0x11a8, 0, -#undef V3342 -#define V3342 (V + 12367) - 0x1103, 0x1172, 0x11a9, 0, -#undef V3343 -#define V3343 (V + 12371) - 0x1103, 0x1172, 0x11aa, 0, -#undef V3344 -#define V3344 (V + 12375) - 0x1103, 0x1172, 0x11ab, 0, -#undef V3345 -#define V3345 (V + 12379) - 0x1103, 0x1172, 0x11ac, 0, -#undef V3346 -#define V3346 (V + 12383) - 0x1103, 0x1172, 0x11ad, 0, -#undef V3347 -#define V3347 (V + 12387) - 0x1103, 0x1172, 0x11ae, 0, -#undef V3348 -#define V3348 (V + 12391) - 0x1103, 0x1172, 0x11af, 0, -#undef V3349 -#define V3349 (V + 12395) - 0x1103, 0x1172, 0x11b0, 0, -#undef V3350 -#define V3350 (V + 12399) - 0x1103, 0x1172, 0x11b1, 0, -#undef V3351 -#define V3351 (V + 12403) - 0x1103, 0x1172, 0x11b2, 0, -#undef V3352 -#define V3352 (V + 12407) - 0x1103, 0x1172, 0x11b3, 0, -#undef V3353 -#define V3353 (V + 12411) - 0x1103, 0x1172, 0x11b4, 0, -#undef V3354 -#define V3354 (V + 12415) - 0x1103, 0x1172, 0x11b5, 0, -#undef V3355 -#define V3355 (V + 12419) - 0x1103, 0x1172, 0x11b6, 0, -#undef V3356 -#define V3356 (V + 12423) - 0x1103, 0x1172, 0x11b7, 0, -#undef V3357 -#define V3357 (V + 12427) - 0x1103, 0x1172, 0x11b8, 0, -#undef V3358 -#define V3358 (V + 12431) - 0x1103, 0x1172, 0x11b9, 0, -#undef V3359 -#define V3359 (V + 12435) - 0x1103, 0x1172, 0x11ba, 0, -#undef V3360 -#define V3360 (V + 12439) - 0x1103, 0x1172, 0x11bb, 0, -#undef V3361 -#define V3361 (V + 12443) - 0x1103, 0x1172, 0x11bc, 0, -#undef V3362 -#define V3362 (V + 12447) - 0x1103, 0x1172, 0x11bd, 0, -#undef V3363 -#define V3363 (V + 12451) - 0x1103, 0x1172, 0x11be, 0, -#undef V3364 -#define V3364 (V + 12455) - 0x1103, 0x1172, 0x11bf, 0, -#undef V3365 -#define V3365 (V + 12459) - 0x1103, 0x1172, 0x11c0, 0, -#undef V3366 -#define V3366 (V + 12463) - 0x1103, 0x1172, 0x11c1, 0, -#undef V3367 -#define V3367 (V + 12467) - 0x1103, 0x1172, 0x11c2, 0, -#undef V3368 -#define V3368 (V + 12471) - 0x1103, 0x1173, 0, -#undef V3369 -#define V3369 (V + 12474) - 0x1103, 0x1173, 0x11a8, 0, -#undef V3370 -#define V3370 (V + 12478) - 0x1103, 0x1173, 0x11a9, 0, -#undef V3371 -#define V3371 (V + 12482) - 0x1103, 0x1173, 0x11aa, 0, -#undef V3372 -#define V3372 (V + 12486) - 0x1103, 0x1173, 0x11ab, 0, -#undef V3373 -#define V3373 (V + 12490) - 0x1103, 0x1173, 0x11ac, 0, -#undef V3374 -#define V3374 (V + 12494) - 0x1103, 0x1173, 0x11ad, 0, -#undef V3375 -#define V3375 (V + 12498) - 0x1103, 0x1173, 0x11ae, 0, -#undef V3376 -#define V3376 (V + 12502) - 0x1103, 0x1173, 0x11af, 0, -#undef V3377 -#define V3377 (V + 12506) - 0x1103, 0x1173, 0x11b0, 0, -#undef V3378 -#define V3378 (V + 12510) - 0x1103, 0x1173, 0x11b1, 0, -#undef V3379 -#define V3379 (V + 12514) - 0x1103, 0x1173, 0x11b2, 0, -#undef V3380 -#define V3380 (V + 12518) - 0x1103, 0x1173, 0x11b3, 0, -#undef V3381 -#define V3381 (V + 12522) - 0x1103, 0x1173, 0x11b4, 0, -#undef V3382 -#define V3382 (V + 12526) - 0x1103, 0x1173, 0x11b5, 0, -#undef V3383 -#define V3383 (V + 12530) - 0x1103, 0x1173, 0x11b6, 0, -#undef V3384 -#define V3384 (V + 12534) - 0x1103, 0x1173, 0x11b7, 0, -#undef V3385 -#define V3385 (V + 12538) - 0x1103, 0x1173, 0x11b8, 0, -#undef V3386 -#define V3386 (V + 12542) - 0x1103, 0x1173, 0x11b9, 0, -#undef V3387 -#define V3387 (V + 12546) - 0x1103, 0x1173, 0x11ba, 0, -#undef V3388 -#define V3388 (V + 12550) - 0x1103, 0x1173, 0x11bb, 0, -#undef V3389 -#define V3389 (V + 12554) - 0x1103, 0x1173, 0x11bc, 0, -#undef V3390 -#define V3390 (V + 12558) - 0x1103, 0x1173, 0x11bd, 0, -#undef V3391 -#define V3391 (V + 12562) - 0x1103, 0x1173, 0x11be, 0, -#undef V3392 -#define V3392 (V + 12566) - 0x1103, 0x1173, 0x11bf, 0, -#undef V3393 -#define V3393 (V + 12570) - 0x1103, 0x1173, 0x11c0, 0, -#undef V3394 -#define V3394 (V + 12574) - 0x1103, 0x1173, 0x11c1, 0, -#undef V3395 -#define V3395 (V + 12578) - 0x1103, 0x1173, 0x11c2, 0, -#undef V3396 -#define V3396 (V + 12582) - 0x1103, 0x1174, 0, -#undef V3397 -#define V3397 (V + 12585) - 0x1103, 0x1174, 0x11a8, 0, -#undef V3398 -#define V3398 (V + 12589) - 0x1103, 0x1174, 0x11a9, 0, -#undef V3399 -#define V3399 (V + 12593) - 0x1103, 0x1174, 0x11aa, 0, -#undef V3400 -#define V3400 (V + 12597) - 0x1103, 0x1174, 0x11ab, 0, -#undef V3401 -#define V3401 (V + 12601) - 0x1103, 0x1174, 0x11ac, 0, -#undef V3402 -#define V3402 (V + 12605) - 0x1103, 0x1174, 0x11ad, 0, -#undef V3403 -#define V3403 (V + 12609) - 0x1103, 0x1174, 0x11ae, 0, -#undef V3404 -#define V3404 (V + 12613) - 0x1103, 0x1174, 0x11af, 0, -#undef V3405 -#define V3405 (V + 12617) - 0x1103, 0x1174, 0x11b0, 0, -#undef V3406 -#define V3406 (V + 12621) - 0x1103, 0x1174, 0x11b1, 0, -#undef V3407 -#define V3407 (V + 12625) - 0x1103, 0x1174, 0x11b2, 0, -#undef V3408 -#define V3408 (V + 12629) - 0x1103, 0x1174, 0x11b3, 0, -#undef V3409 -#define V3409 (V + 12633) - 0x1103, 0x1174, 0x11b4, 0, -#undef V3410 -#define V3410 (V + 12637) - 0x1103, 0x1174, 0x11b5, 0, -#undef V3411 -#define V3411 (V + 12641) - 0x1103, 0x1174, 0x11b6, 0, -#undef V3412 -#define V3412 (V + 12645) - 0x1103, 0x1174, 0x11b7, 0, -#undef V3413 -#define V3413 (V + 12649) - 0x1103, 0x1174, 0x11b8, 0, -#undef V3414 -#define V3414 (V + 12653) - 0x1103, 0x1174, 0x11b9, 0, -#undef V3415 -#define V3415 (V + 12657) - 0x1103, 0x1174, 0x11ba, 0, -#undef V3416 -#define V3416 (V + 12661) - 0x1103, 0x1174, 0x11bb, 0, -#undef V3417 -#define V3417 (V + 12665) - 0x1103, 0x1174, 0x11bc, 0, -#undef V3418 -#define V3418 (V + 12669) - 0x1103, 0x1174, 0x11bd, 0, -#undef V3419 -#define V3419 (V + 12673) - 0x1103, 0x1174, 0x11be, 0, -#undef V3420 -#define V3420 (V + 12677) - 0x1103, 0x1174, 0x11bf, 0, -#undef V3421 -#define V3421 (V + 12681) - 0x1103, 0x1174, 0x11c0, 0, -#undef V3422 -#define V3422 (V + 12685) - 0x1103, 0x1174, 0x11c1, 0, -#undef V3423 -#define V3423 (V + 12689) - 0x1103, 0x1174, 0x11c2, 0, -#undef V3424 -#define V3424 (V + 12693) - 0x1103, 0x1175, 0, -#undef V3425 -#define V3425 (V + 12696) - 0x1103, 0x1175, 0x11a8, 0, -#undef V3426 -#define V3426 (V + 12700) - 0x1103, 0x1175, 0x11a9, 0, -#undef V3427 -#define V3427 (V + 12704) - 0x1103, 0x1175, 0x11aa, 0, -#undef V3428 -#define V3428 (V + 12708) - 0x1103, 0x1175, 0x11ab, 0, -#undef V3429 -#define V3429 (V + 12712) - 0x1103, 0x1175, 0x11ac, 0, -#undef V3430 -#define V3430 (V + 12716) - 0x1103, 0x1175, 0x11ad, 0, -#undef V3431 -#define V3431 (V + 12720) - 0x1103, 0x1175, 0x11ae, 0, -#undef V3432 -#define V3432 (V + 12724) - 0x1103, 0x1175, 0x11af, 0, -#undef V3433 -#define V3433 (V + 12728) - 0x1103, 0x1175, 0x11b0, 0, -#undef V3434 -#define V3434 (V + 12732) - 0x1103, 0x1175, 0x11b1, 0, -#undef V3435 -#define V3435 (V + 12736) - 0x1103, 0x1175, 0x11b2, 0, -#undef V3436 -#define V3436 (V + 12740) - 0x1103, 0x1175, 0x11b3, 0, -#undef V3437 -#define V3437 (V + 12744) - 0x1103, 0x1175, 0x11b4, 0, -#undef V3438 -#define V3438 (V + 12748) - 0x1103, 0x1175, 0x11b5, 0, -#undef V3439 -#define V3439 (V + 12752) - 0x1103, 0x1175, 0x11b6, 0, -#undef V3440 -#define V3440 (V + 12756) - 0x1103, 0x1175, 0x11b7, 0, -#undef V3441 -#define V3441 (V + 12760) - 0x1103, 0x1175, 0x11b8, 0, -#undef V3442 -#define V3442 (V + 12764) - 0x1103, 0x1175, 0x11b9, 0, -#undef V3443 -#define V3443 (V + 12768) - 0x1103, 0x1175, 0x11ba, 0, -#undef V3444 -#define V3444 (V + 12772) - 0x1103, 0x1175, 0x11bb, 0, -#undef V3445 -#define V3445 (V + 12776) - 0x1103, 0x1175, 0x11bc, 0, -#undef V3446 -#define V3446 (V + 12780) - 0x1103, 0x1175, 0x11bd, 0, -#undef V3447 -#define V3447 (V + 12784) - 0x1103, 0x1175, 0x11be, 0, -#undef V3448 -#define V3448 (V + 12788) - 0x1103, 0x1175, 0x11bf, 0, -#undef V3449 -#define V3449 (V + 12792) - 0x1103, 0x1175, 0x11c0, 0, -#undef V3450 -#define V3450 (V + 12796) - 0x1103, 0x1175, 0x11c1, 0, -#undef V3451 -#define V3451 (V + 12800) - 0x1103, 0x1175, 0x11c2, 0, -#undef V3452 -#define V3452 (V + 12804) - 0x1104, 0x1161, 0, -#undef V3453 -#define V3453 (V + 12807) - 0x1104, 0x1161, 0x11a8, 0, -#undef V3454 -#define V3454 (V + 12811) - 0x1104, 0x1161, 0x11a9, 0, -#undef V3455 -#define V3455 (V + 12815) - 0x1104, 0x1161, 0x11aa, 0, -#undef V3456 -#define V3456 (V + 12819) - 0x1104, 0x1161, 0x11ab, 0, -#undef V3457 -#define V3457 (V + 12823) - 0x1104, 0x1161, 0x11ac, 0, -#undef V3458 -#define V3458 (V + 12827) - 0x1104, 0x1161, 0x11ad, 0, -#undef V3459 -#define V3459 (V + 12831) - 0x1104, 0x1161, 0x11ae, 0, -#undef V3460 -#define V3460 (V + 12835) - 0x1104, 0x1161, 0x11af, 0, -#undef V3461 -#define V3461 (V + 12839) - 0x1104, 0x1161, 0x11b0, 0, -#undef V3462 -#define V3462 (V + 12843) - 0x1104, 0x1161, 0x11b1, 0, -#undef V3463 -#define V3463 (V + 12847) - 0x1104, 0x1161, 0x11b2, 0, -#undef V3464 -#define V3464 (V + 12851) - 0x1104, 0x1161, 0x11b3, 0, -#undef V3465 -#define V3465 (V + 12855) - 0x1104, 0x1161, 0x11b4, 0, -#undef V3466 -#define V3466 (V + 12859) - 0x1104, 0x1161, 0x11b5, 0, -#undef V3467 -#define V3467 (V + 12863) - 0x1104, 0x1161, 0x11b6, 0, -#undef V3468 -#define V3468 (V + 12867) - 0x1104, 0x1161, 0x11b7, 0, -#undef V3469 -#define V3469 (V + 12871) - 0x1104, 0x1161, 0x11b8, 0, -#undef V3470 -#define V3470 (V + 12875) - 0x1104, 0x1161, 0x11b9, 0, -#undef V3471 -#define V3471 (V + 12879) - 0x1104, 0x1161, 0x11ba, 0, -#undef V3472 -#define V3472 (V + 12883) - 0x1104, 0x1161, 0x11bb, 0, -#undef V3473 -#define V3473 (V + 12887) - 0x1104, 0x1161, 0x11bc, 0, -#undef V3474 -#define V3474 (V + 12891) - 0x1104, 0x1161, 0x11bd, 0, -#undef V3475 -#define V3475 (V + 12895) - 0x1104, 0x1161, 0x11be, 0, -#undef V3476 -#define V3476 (V + 12899) - 0x1104, 0x1161, 0x11bf, 0, -#undef V3477 -#define V3477 (V + 12903) - 0x1104, 0x1161, 0x11c0, 0, -#undef V3478 -#define V3478 (V + 12907) - 0x1104, 0x1161, 0x11c1, 0, -#undef V3479 -#define V3479 (V + 12911) - 0x1104, 0x1161, 0x11c2, 0, -#undef V3480 -#define V3480 (V + 12915) - 0x1104, 0x1162, 0, -#undef V3481 -#define V3481 (V + 12918) - 0x1104, 0x1162, 0x11a8, 0, -#undef V3482 -#define V3482 (V + 12922) - 0x1104, 0x1162, 0x11a9, 0, -#undef V3483 -#define V3483 (V + 12926) - 0x1104, 0x1162, 0x11aa, 0, -#undef V3484 -#define V3484 (V + 12930) - 0x1104, 0x1162, 0x11ab, 0, -#undef V3485 -#define V3485 (V + 12934) - 0x1104, 0x1162, 0x11ac, 0, -#undef V3486 -#define V3486 (V + 12938) - 0x1104, 0x1162, 0x11ad, 0, -#undef V3487 -#define V3487 (V + 12942) - 0x1104, 0x1162, 0x11ae, 0, -#undef V3488 -#define V3488 (V + 12946) - 0x1104, 0x1162, 0x11af, 0, -#undef V3489 -#define V3489 (V + 12950) - 0x1104, 0x1162, 0x11b0, 0, -#undef V3490 -#define V3490 (V + 12954) - 0x1104, 0x1162, 0x11b1, 0, -#undef V3491 -#define V3491 (V + 12958) - 0x1104, 0x1162, 0x11b2, 0, -#undef V3492 -#define V3492 (V + 12962) - 0x1104, 0x1162, 0x11b3, 0, -#undef V3493 -#define V3493 (V + 12966) - 0x1104, 0x1162, 0x11b4, 0, -#undef V3494 -#define V3494 (V + 12970) - 0x1104, 0x1162, 0x11b5, 0, -#undef V3495 -#define V3495 (V + 12974) - 0x1104, 0x1162, 0x11b6, 0, -#undef V3496 -#define V3496 (V + 12978) - 0x1104, 0x1162, 0x11b7, 0, -#undef V3497 -#define V3497 (V + 12982) - 0x1104, 0x1162, 0x11b8, 0, -#undef V3498 -#define V3498 (V + 12986) - 0x1104, 0x1162, 0x11b9, 0, -#undef V3499 -#define V3499 (V + 12990) - 0x1104, 0x1162, 0x11ba, 0, -#undef V3500 -#define V3500 (V + 12994) - 0x1104, 0x1162, 0x11bb, 0, -#undef V3501 -#define V3501 (V + 12998) - 0x1104, 0x1162, 0x11bc, 0, -#undef V3502 -#define V3502 (V + 13002) - 0x1104, 0x1162, 0x11bd, 0, -#undef V3503 -#define V3503 (V + 13006) - 0x1104, 0x1162, 0x11be, 0, -#undef V3504 -#define V3504 (V + 13010) - 0x1104, 0x1162, 0x11bf, 0, -#undef V3505 -#define V3505 (V + 13014) - 0x1104, 0x1162, 0x11c0, 0, -#undef V3506 -#define V3506 (V + 13018) - 0x1104, 0x1162, 0x11c1, 0, -#undef V3507 -#define V3507 (V + 13022) - 0x1104, 0x1162, 0x11c2, 0, -#undef V3508 -#define V3508 (V + 13026) - 0x1104, 0x1163, 0, -#undef V3509 -#define V3509 (V + 13029) - 0x1104, 0x1163, 0x11a8, 0, -#undef V3510 -#define V3510 (V + 13033) - 0x1104, 0x1163, 0x11a9, 0, -#undef V3511 -#define V3511 (V + 13037) - 0x1104, 0x1163, 0x11aa, 0, -#undef V3512 -#define V3512 (V + 13041) - 0x1104, 0x1163, 0x11ab, 0, -#undef V3513 -#define V3513 (V + 13045) - 0x1104, 0x1163, 0x11ac, 0, -#undef V3514 -#define V3514 (V + 13049) - 0x1104, 0x1163, 0x11ad, 0, -#undef V3515 -#define V3515 (V + 13053) - 0x1104, 0x1163, 0x11ae, 0, -#undef V3516 -#define V3516 (V + 13057) - 0x1104, 0x1163, 0x11af, 0, -#undef V3517 -#define V3517 (V + 13061) - 0x1104, 0x1163, 0x11b0, 0, -#undef V3518 -#define V3518 (V + 13065) - 0x1104, 0x1163, 0x11b1, 0, -#undef V3519 -#define V3519 (V + 13069) - 0x1104, 0x1163, 0x11b2, 0, -#undef V3520 -#define V3520 (V + 13073) - 0x1104, 0x1163, 0x11b3, 0, -#undef V3521 -#define V3521 (V + 13077) - 0x1104, 0x1163, 0x11b4, 0, -#undef V3522 -#define V3522 (V + 13081) - 0x1104, 0x1163, 0x11b5, 0, -#undef V3523 -#define V3523 (V + 13085) - 0x1104, 0x1163, 0x11b6, 0, -#undef V3524 -#define V3524 (V + 13089) - 0x1104, 0x1163, 0x11b7, 0, -#undef V3525 -#define V3525 (V + 13093) - 0x1104, 0x1163, 0x11b8, 0, -#undef V3526 -#define V3526 (V + 13097) - 0x1104, 0x1163, 0x11b9, 0, -#undef V3527 -#define V3527 (V + 13101) - 0x1104, 0x1163, 0x11ba, 0, -#undef V3528 -#define V3528 (V + 13105) - 0x1104, 0x1163, 0x11bb, 0, -#undef V3529 -#define V3529 (V + 13109) - 0x1104, 0x1163, 0x11bc, 0, -#undef V3530 -#define V3530 (V + 13113) - 0x1104, 0x1163, 0x11bd, 0, -#undef V3531 -#define V3531 (V + 13117) - 0x1104, 0x1163, 0x11be, 0, -#undef V3532 -#define V3532 (V + 13121) - 0x1104, 0x1163, 0x11bf, 0, -#undef V3533 -#define V3533 (V + 13125) - 0x1104, 0x1163, 0x11c0, 0, -#undef V3534 -#define V3534 (V + 13129) - 0x1104, 0x1163, 0x11c1, 0, -#undef V3535 -#define V3535 (V + 13133) - 0x1104, 0x1163, 0x11c2, 0, -#undef V3536 -#define V3536 (V + 13137) - 0x1104, 0x1164, 0, -#undef V3537 -#define V3537 (V + 13140) - 0x1104, 0x1164, 0x11a8, 0, -#undef V3538 -#define V3538 (V + 13144) - 0x1104, 0x1164, 0x11a9, 0, -#undef V3539 -#define V3539 (V + 13148) - 0x1104, 0x1164, 0x11aa, 0, -#undef V3540 -#define V3540 (V + 13152) - 0x1104, 0x1164, 0x11ab, 0, -#undef V3541 -#define V3541 (V + 13156) - 0x1104, 0x1164, 0x11ac, 0, -#undef V3542 -#define V3542 (V + 13160) - 0x1104, 0x1164, 0x11ad, 0, -#undef V3543 -#define V3543 (V + 13164) - 0x1104, 0x1164, 0x11ae, 0, -#undef V3544 -#define V3544 (V + 13168) - 0x1104, 0x1164, 0x11af, 0, -#undef V3545 -#define V3545 (V + 13172) - 0x1104, 0x1164, 0x11b0, 0, -#undef V3546 -#define V3546 (V + 13176) - 0x1104, 0x1164, 0x11b1, 0, -#undef V3547 -#define V3547 (V + 13180) - 0x1104, 0x1164, 0x11b2, 0, -#undef V3548 -#define V3548 (V + 13184) - 0x1104, 0x1164, 0x11b3, 0, -#undef V3549 -#define V3549 (V + 13188) - 0x1104, 0x1164, 0x11b4, 0, -#undef V3550 -#define V3550 (V + 13192) - 0x1104, 0x1164, 0x11b5, 0, -#undef V3551 -#define V3551 (V + 13196) - 0x1104, 0x1164, 0x11b6, 0, -#undef V3552 -#define V3552 (V + 13200) - 0x1104, 0x1164, 0x11b7, 0, -#undef V3553 -#define V3553 (V + 13204) - 0x1104, 0x1164, 0x11b8, 0, -#undef V3554 -#define V3554 (V + 13208) - 0x1104, 0x1164, 0x11b9, 0, -#undef V3555 -#define V3555 (V + 13212) - 0x1104, 0x1164, 0x11ba, 0, -#undef V3556 -#define V3556 (V + 13216) - 0x1104, 0x1164, 0x11bb, 0, -#undef V3557 -#define V3557 (V + 13220) - 0x1104, 0x1164, 0x11bc, 0, -#undef V3558 -#define V3558 (V + 13224) - 0x1104, 0x1164, 0x11bd, 0, -#undef V3559 -#define V3559 (V + 13228) - 0x1104, 0x1164, 0x11be, 0, -#undef V3560 -#define V3560 (V + 13232) - 0x1104, 0x1164, 0x11bf, 0, -#undef V3561 -#define V3561 (V + 13236) - 0x1104, 0x1164, 0x11c0, 0, -#undef V3562 -#define V3562 (V + 13240) - 0x1104, 0x1164, 0x11c1, 0, -#undef V3563 -#define V3563 (V + 13244) - 0x1104, 0x1164, 0x11c2, 0, -#undef V3564 -#define V3564 (V + 13248) - 0x1104, 0x1165, 0, -#undef V3565 -#define V3565 (V + 13251) - 0x1104, 0x1165, 0x11a8, 0, -#undef V3566 -#define V3566 (V + 13255) - 0x1104, 0x1165, 0x11a9, 0, -#undef V3567 -#define V3567 (V + 13259) - 0x1104, 0x1165, 0x11aa, 0, -#undef V3568 -#define V3568 (V + 13263) - 0x1104, 0x1165, 0x11ab, 0, -#undef V3569 -#define V3569 (V + 13267) - 0x1104, 0x1165, 0x11ac, 0, -#undef V3570 -#define V3570 (V + 13271) - 0x1104, 0x1165, 0x11ad, 0, -#undef V3571 -#define V3571 (V + 13275) - 0x1104, 0x1165, 0x11ae, 0, -#undef V3572 -#define V3572 (V + 13279) - 0x1104, 0x1165, 0x11af, 0, -#undef V3573 -#define V3573 (V + 13283) - 0x1104, 0x1165, 0x11b0, 0, -#undef V3574 -#define V3574 (V + 13287) - 0x1104, 0x1165, 0x11b1, 0, -#undef V3575 -#define V3575 (V + 13291) - 0x1104, 0x1165, 0x11b2, 0, -#undef V3576 -#define V3576 (V + 13295) - 0x1104, 0x1165, 0x11b3, 0, -#undef V3577 -#define V3577 (V + 13299) - 0x1104, 0x1165, 0x11b4, 0, -#undef V3578 -#define V3578 (V + 13303) - 0x1104, 0x1165, 0x11b5, 0, -#undef V3579 -#define V3579 (V + 13307) - 0x1104, 0x1165, 0x11b6, 0, -#undef V3580 -#define V3580 (V + 13311) - 0x1104, 0x1165, 0x11b7, 0, -#undef V3581 -#define V3581 (V + 13315) - 0x1104, 0x1165, 0x11b8, 0, -#undef V3582 -#define V3582 (V + 13319) - 0x1104, 0x1165, 0x11b9, 0, -#undef V3583 -#define V3583 (V + 13323) - 0x1104, 0x1165, 0x11ba, 0, -#undef V3584 -#define V3584 (V + 13327) - 0x1104, 0x1165, 0x11bb, 0, -#undef V3585 -#define V3585 (V + 13331) - 0x1104, 0x1165, 0x11bc, 0, -#undef V3586 -#define V3586 (V + 13335) - 0x1104, 0x1165, 0x11bd, 0, -#undef V3587 -#define V3587 (V + 13339) - 0x1104, 0x1165, 0x11be, 0, -#undef V3588 -#define V3588 (V + 13343) - 0x1104, 0x1165, 0x11bf, 0, -#undef V3589 -#define V3589 (V + 13347) - 0x1104, 0x1165, 0x11c0, 0, -#undef V3590 -#define V3590 (V + 13351) - 0x1104, 0x1165, 0x11c1, 0, -#undef V3591 -#define V3591 (V + 13355) - 0x1104, 0x1165, 0x11c2, 0, -#undef V3592 -#define V3592 (V + 13359) - 0x1104, 0x1166, 0, -#undef V3593 -#define V3593 (V + 13362) - 0x1104, 0x1166, 0x11a8, 0, -#undef V3594 -#define V3594 (V + 13366) - 0x1104, 0x1166, 0x11a9, 0, -#undef V3595 -#define V3595 (V + 13370) - 0x1104, 0x1166, 0x11aa, 0, -#undef V3596 -#define V3596 (V + 13374) - 0x1104, 0x1166, 0x11ab, 0, -#undef V3597 -#define V3597 (V + 13378) - 0x1104, 0x1166, 0x11ac, 0, -#undef V3598 -#define V3598 (V + 13382) - 0x1104, 0x1166, 0x11ad, 0, -#undef V3599 -#define V3599 (V + 13386) - 0x1104, 0x1166, 0x11ae, 0, -#undef V3600 -#define V3600 (V + 13390) - 0x1104, 0x1166, 0x11af, 0, -#undef V3601 -#define V3601 (V + 13394) - 0x1104, 0x1166, 0x11b0, 0, -#undef V3602 -#define V3602 (V + 13398) - 0x1104, 0x1166, 0x11b1, 0, -#undef V3603 -#define V3603 (V + 13402) - 0x1104, 0x1166, 0x11b2, 0, -#undef V3604 -#define V3604 (V + 13406) - 0x1104, 0x1166, 0x11b3, 0, -#undef V3605 -#define V3605 (V + 13410) - 0x1104, 0x1166, 0x11b4, 0, -#undef V3606 -#define V3606 (V + 13414) - 0x1104, 0x1166, 0x11b5, 0, -#undef V3607 -#define V3607 (V + 13418) - 0x1104, 0x1166, 0x11b6, 0, -#undef V3608 -#define V3608 (V + 13422) - 0x1104, 0x1166, 0x11b7, 0, -#undef V3609 -#define V3609 (V + 13426) - 0x1104, 0x1166, 0x11b8, 0, -#undef V3610 -#define V3610 (V + 13430) - 0x1104, 0x1166, 0x11b9, 0, -#undef V3611 -#define V3611 (V + 13434) - 0x1104, 0x1166, 0x11ba, 0, -#undef V3612 -#define V3612 (V + 13438) - 0x1104, 0x1166, 0x11bb, 0, -#undef V3613 -#define V3613 (V + 13442) - 0x1104, 0x1166, 0x11bc, 0, -#undef V3614 -#define V3614 (V + 13446) - 0x1104, 0x1166, 0x11bd, 0, -#undef V3615 -#define V3615 (V + 13450) - 0x1104, 0x1166, 0x11be, 0, -#undef V3616 -#define V3616 (V + 13454) - 0x1104, 0x1166, 0x11bf, 0, -#undef V3617 -#define V3617 (V + 13458) - 0x1104, 0x1166, 0x11c0, 0, -#undef V3618 -#define V3618 (V + 13462) - 0x1104, 0x1166, 0x11c1, 0, -#undef V3619 -#define V3619 (V + 13466) - 0x1104, 0x1166, 0x11c2, 0, -#undef V3620 -#define V3620 (V + 13470) - 0x1104, 0x1167, 0, -#undef V3621 -#define V3621 (V + 13473) - 0x1104, 0x1167, 0x11a8, 0, -#undef V3622 -#define V3622 (V + 13477) - 0x1104, 0x1167, 0x11a9, 0, -#undef V3623 -#define V3623 (V + 13481) - 0x1104, 0x1167, 0x11aa, 0, -#undef V3624 -#define V3624 (V + 13485) - 0x1104, 0x1167, 0x11ab, 0, -#undef V3625 -#define V3625 (V + 13489) - 0x1104, 0x1167, 0x11ac, 0, -#undef V3626 -#define V3626 (V + 13493) - 0x1104, 0x1167, 0x11ad, 0, -#undef V3627 -#define V3627 (V + 13497) - 0x1104, 0x1167, 0x11ae, 0, -#undef V3628 -#define V3628 (V + 13501) - 0x1104, 0x1167, 0x11af, 0, -#undef V3629 -#define V3629 (V + 13505) - 0x1104, 0x1167, 0x11b0, 0, -#undef V3630 -#define V3630 (V + 13509) - 0x1104, 0x1167, 0x11b1, 0, -#undef V3631 -#define V3631 (V + 13513) - 0x1104, 0x1167, 0x11b2, 0, -#undef V3632 -#define V3632 (V + 13517) - 0x1104, 0x1167, 0x11b3, 0, -#undef V3633 -#define V3633 (V + 13521) - 0x1104, 0x1167, 0x11b4, 0, -#undef V3634 -#define V3634 (V + 13525) - 0x1104, 0x1167, 0x11b5, 0, -#undef V3635 -#define V3635 (V + 13529) - 0x1104, 0x1167, 0x11b6, 0, -#undef V3636 -#define V3636 (V + 13533) - 0x1104, 0x1167, 0x11b7, 0, -#undef V3637 -#define V3637 (V + 13537) - 0x1104, 0x1167, 0x11b8, 0, -#undef V3638 -#define V3638 (V + 13541) - 0x1104, 0x1167, 0x11b9, 0, -#undef V3639 -#define V3639 (V + 13545) - 0x1104, 0x1167, 0x11ba, 0, -#undef V3640 -#define V3640 (V + 13549) - 0x1104, 0x1167, 0x11bb, 0, -#undef V3641 -#define V3641 (V + 13553) - 0x1104, 0x1167, 0x11bc, 0, -#undef V3642 -#define V3642 (V + 13557) - 0x1104, 0x1167, 0x11bd, 0, -#undef V3643 -#define V3643 (V + 13561) - 0x1104, 0x1167, 0x11be, 0, -#undef V3644 -#define V3644 (V + 13565) - 0x1104, 0x1167, 0x11bf, 0, -#undef V3645 -#define V3645 (V + 13569) - 0x1104, 0x1167, 0x11c0, 0, -#undef V3646 -#define V3646 (V + 13573) - 0x1104, 0x1167, 0x11c1, 0, -#undef V3647 -#define V3647 (V + 13577) - 0x1104, 0x1167, 0x11c2, 0, -#undef V3648 -#define V3648 (V + 13581) - 0x1104, 0x1168, 0, -#undef V3649 -#define V3649 (V + 13584) - 0x1104, 0x1168, 0x11a8, 0, -#undef V3650 -#define V3650 (V + 13588) - 0x1104, 0x1168, 0x11a9, 0, -#undef V3651 -#define V3651 (V + 13592) - 0x1104, 0x1168, 0x11aa, 0, -#undef V3652 -#define V3652 (V + 13596) - 0x1104, 0x1168, 0x11ab, 0, -#undef V3653 -#define V3653 (V + 13600) - 0x1104, 0x1168, 0x11ac, 0, -#undef V3654 -#define V3654 (V + 13604) - 0x1104, 0x1168, 0x11ad, 0, -#undef V3655 -#define V3655 (V + 13608) - 0x1104, 0x1168, 0x11ae, 0, -#undef V3656 -#define V3656 (V + 13612) - 0x1104, 0x1168, 0x11af, 0, -#undef V3657 -#define V3657 (V + 13616) - 0x1104, 0x1168, 0x11b0, 0, -#undef V3658 -#define V3658 (V + 13620) - 0x1104, 0x1168, 0x11b1, 0, -#undef V3659 -#define V3659 (V + 13624) - 0x1104, 0x1168, 0x11b2, 0, -#undef V3660 -#define V3660 (V + 13628) - 0x1104, 0x1168, 0x11b3, 0, -#undef V3661 -#define V3661 (V + 13632) - 0x1104, 0x1168, 0x11b4, 0, -#undef V3662 -#define V3662 (V + 13636) - 0x1104, 0x1168, 0x11b5, 0, -#undef V3663 -#define V3663 (V + 13640) - 0x1104, 0x1168, 0x11b6, 0, -#undef V3664 -#define V3664 (V + 13644) - 0x1104, 0x1168, 0x11b7, 0, -#undef V3665 -#define V3665 (V + 13648) - 0x1104, 0x1168, 0x11b8, 0, -#undef V3666 -#define V3666 (V + 13652) - 0x1104, 0x1168, 0x11b9, 0, -#undef V3667 -#define V3667 (V + 13656) - 0x1104, 0x1168, 0x11ba, 0, -#undef V3668 -#define V3668 (V + 13660) - 0x1104, 0x1168, 0x11bb, 0, -#undef V3669 -#define V3669 (V + 13664) - 0x1104, 0x1168, 0x11bc, 0, -#undef V3670 -#define V3670 (V + 13668) - 0x1104, 0x1168, 0x11bd, 0, -#undef V3671 -#define V3671 (V + 13672) - 0x1104, 0x1168, 0x11be, 0, -#undef V3672 -#define V3672 (V + 13676) - 0x1104, 0x1168, 0x11bf, 0, -#undef V3673 -#define V3673 (V + 13680) - 0x1104, 0x1168, 0x11c0, 0, -#undef V3674 -#define V3674 (V + 13684) - 0x1104, 0x1168, 0x11c1, 0, -#undef V3675 -#define V3675 (V + 13688) - 0x1104, 0x1168, 0x11c2, 0, -#undef V3676 -#define V3676 (V + 13692) - 0x1104, 0x1169, 0, -#undef V3677 -#define V3677 (V + 13695) - 0x1104, 0x1169, 0x11a8, 0, -#undef V3678 -#define V3678 (V + 13699) - 0x1104, 0x1169, 0x11a9, 0, -#undef V3679 -#define V3679 (V + 13703) - 0x1104, 0x1169, 0x11aa, 0, -#undef V3680 -#define V3680 (V + 13707) - 0x1104, 0x1169, 0x11ab, 0, -#undef V3681 -#define V3681 (V + 13711) - 0x1104, 0x1169, 0x11ac, 0, -#undef V3682 -#define V3682 (V + 13715) - 0x1104, 0x1169, 0x11ad, 0, -#undef V3683 -#define V3683 (V + 13719) - 0x1104, 0x1169, 0x11ae, 0, -#undef V3684 -#define V3684 (V + 13723) - 0x1104, 0x1169, 0x11af, 0, -#undef V3685 -#define V3685 (V + 13727) - 0x1104, 0x1169, 0x11b0, 0, -#undef V3686 -#define V3686 (V + 13731) - 0x1104, 0x1169, 0x11b1, 0, -#undef V3687 -#define V3687 (V + 13735) - 0x1104, 0x1169, 0x11b2, 0, -#undef V3688 -#define V3688 (V + 13739) - 0x1104, 0x1169, 0x11b3, 0, -#undef V3689 -#define V3689 (V + 13743) - 0x1104, 0x1169, 0x11b4, 0, -#undef V3690 -#define V3690 (V + 13747) - 0x1104, 0x1169, 0x11b5, 0, -#undef V3691 -#define V3691 (V + 13751) - 0x1104, 0x1169, 0x11b6, 0, -#undef V3692 -#define V3692 (V + 13755) - 0x1104, 0x1169, 0x11b7, 0, -#undef V3693 -#define V3693 (V + 13759) - 0x1104, 0x1169, 0x11b8, 0, -#undef V3694 -#define V3694 (V + 13763) - 0x1104, 0x1169, 0x11b9, 0, -#undef V3695 -#define V3695 (V + 13767) - 0x1104, 0x1169, 0x11ba, 0, -#undef V3696 -#define V3696 (V + 13771) - 0x1104, 0x1169, 0x11bb, 0, -#undef V3697 -#define V3697 (V + 13775) - 0x1104, 0x1169, 0x11bc, 0, -#undef V3698 -#define V3698 (V + 13779) - 0x1104, 0x1169, 0x11bd, 0, -#undef V3699 -#define V3699 (V + 13783) - 0x1104, 0x1169, 0x11be, 0, -#undef V3700 -#define V3700 (V + 13787) - 0x1104, 0x1169, 0x11bf, 0, -#undef V3701 -#define V3701 (V + 13791) - 0x1104, 0x1169, 0x11c0, 0, -#undef V3702 -#define V3702 (V + 13795) - 0x1104, 0x1169, 0x11c1, 0, -#undef V3703 -#define V3703 (V + 13799) - 0x1104, 0x1169, 0x11c2, 0, -#undef V3704 -#define V3704 (V + 13803) - 0x1104, 0x116a, 0, -#undef V3705 -#define V3705 (V + 13806) - 0x1104, 0x116a, 0x11a8, 0, -#undef V3706 -#define V3706 (V + 13810) - 0x1104, 0x116a, 0x11a9, 0, -#undef V3707 -#define V3707 (V + 13814) - 0x1104, 0x116a, 0x11aa, 0, -#undef V3708 -#define V3708 (V + 13818) - 0x1104, 0x116a, 0x11ab, 0, -#undef V3709 -#define V3709 (V + 13822) - 0x1104, 0x116a, 0x11ac, 0, -#undef V3710 -#define V3710 (V + 13826) - 0x1104, 0x116a, 0x11ad, 0, -#undef V3711 -#define V3711 (V + 13830) - 0x1104, 0x116a, 0x11ae, 0, -#undef V3712 -#define V3712 (V + 13834) - 0x1104, 0x116a, 0x11af, 0, -#undef V3713 -#define V3713 (V + 13838) - 0x1104, 0x116a, 0x11b0, 0, -#undef V3714 -#define V3714 (V + 13842) - 0x1104, 0x116a, 0x11b1, 0, -#undef V3715 -#define V3715 (V + 13846) - 0x1104, 0x116a, 0x11b2, 0, -#undef V3716 -#define V3716 (V + 13850) - 0x1104, 0x116a, 0x11b3, 0, -#undef V3717 -#define V3717 (V + 13854) - 0x1104, 0x116a, 0x11b4, 0, -#undef V3718 -#define V3718 (V + 13858) - 0x1104, 0x116a, 0x11b5, 0, -#undef V3719 -#define V3719 (V + 13862) - 0x1104, 0x116a, 0x11b6, 0, -#undef V3720 -#define V3720 (V + 13866) - 0x1104, 0x116a, 0x11b7, 0, -#undef V3721 -#define V3721 (V + 13870) - 0x1104, 0x116a, 0x11b8, 0, -#undef V3722 -#define V3722 (V + 13874) - 0x1104, 0x116a, 0x11b9, 0, -#undef V3723 -#define V3723 (V + 13878) - 0x1104, 0x116a, 0x11ba, 0, -#undef V3724 -#define V3724 (V + 13882) - 0x1104, 0x116a, 0x11bb, 0, -#undef V3725 -#define V3725 (V + 13886) - 0x1104, 0x116a, 0x11bc, 0, -#undef V3726 -#define V3726 (V + 13890) - 0x1104, 0x116a, 0x11bd, 0, -#undef V3727 -#define V3727 (V + 13894) - 0x1104, 0x116a, 0x11be, 0, -#undef V3728 -#define V3728 (V + 13898) - 0x1104, 0x116a, 0x11bf, 0, -#undef V3729 -#define V3729 (V + 13902) - 0x1104, 0x116a, 0x11c0, 0, -#undef V3730 -#define V3730 (V + 13906) - 0x1104, 0x116a, 0x11c1, 0, -#undef V3731 -#define V3731 (V + 13910) - 0x1104, 0x116a, 0x11c2, 0, -#undef V3732 -#define V3732 (V + 13914) - 0x1104, 0x116b, 0, -#undef V3733 -#define V3733 (V + 13917) - 0x1104, 0x116b, 0x11a8, 0, -#undef V3734 -#define V3734 (V + 13921) - 0x1104, 0x116b, 0x11a9, 0, -#undef V3735 -#define V3735 (V + 13925) - 0x1104, 0x116b, 0x11aa, 0, -#undef V3736 -#define V3736 (V + 13929) - 0x1104, 0x116b, 0x11ab, 0, -#undef V3737 -#define V3737 (V + 13933) - 0x1104, 0x116b, 0x11ac, 0, -#undef V3738 -#define V3738 (V + 13937) - 0x1104, 0x116b, 0x11ad, 0, -#undef V3739 -#define V3739 (V + 13941) - 0x1104, 0x116b, 0x11ae, 0, -#undef V3740 -#define V3740 (V + 13945) - 0x1104, 0x116b, 0x11af, 0, -#undef V3741 -#define V3741 (V + 13949) - 0x1104, 0x116b, 0x11b0, 0, -#undef V3742 -#define V3742 (V + 13953) - 0x1104, 0x116b, 0x11b1, 0, -#undef V3743 -#define V3743 (V + 13957) - 0x1104, 0x116b, 0x11b2, 0, -#undef V3744 -#define V3744 (V + 13961) - 0x1104, 0x116b, 0x11b3, 0, -#undef V3745 -#define V3745 (V + 13965) - 0x1104, 0x116b, 0x11b4, 0, -#undef V3746 -#define V3746 (V + 13969) - 0x1104, 0x116b, 0x11b5, 0, -#undef V3747 -#define V3747 (V + 13973) - 0x1104, 0x116b, 0x11b6, 0, -#undef V3748 -#define V3748 (V + 13977) - 0x1104, 0x116b, 0x11b7, 0, -#undef V3749 -#define V3749 (V + 13981) - 0x1104, 0x116b, 0x11b8, 0, -#undef V3750 -#define V3750 (V + 13985) - 0x1104, 0x116b, 0x11b9, 0, -#undef V3751 -#define V3751 (V + 13989) - 0x1104, 0x116b, 0x11ba, 0, -#undef V3752 -#define V3752 (V + 13993) - 0x1104, 0x116b, 0x11bb, 0, -#undef V3753 -#define V3753 (V + 13997) - 0x1104, 0x116b, 0x11bc, 0, -#undef V3754 -#define V3754 (V + 14001) - 0x1104, 0x116b, 0x11bd, 0, -#undef V3755 -#define V3755 (V + 14005) - 0x1104, 0x116b, 0x11be, 0, -#undef V3756 -#define V3756 (V + 14009) - 0x1104, 0x116b, 0x11bf, 0, -#undef V3757 -#define V3757 (V + 14013) - 0x1104, 0x116b, 0x11c0, 0, -#undef V3758 -#define V3758 (V + 14017) - 0x1104, 0x116b, 0x11c1, 0, -#undef V3759 -#define V3759 (V + 14021) - 0x1104, 0x116b, 0x11c2, 0, -#undef V3760 -#define V3760 (V + 14025) - 0x1104, 0x116c, 0, -#undef V3761 -#define V3761 (V + 14028) - 0x1104, 0x116c, 0x11a8, 0, -#undef V3762 -#define V3762 (V + 14032) - 0x1104, 0x116c, 0x11a9, 0, -#undef V3763 -#define V3763 (V + 14036) - 0x1104, 0x116c, 0x11aa, 0, -#undef V3764 -#define V3764 (V + 14040) - 0x1104, 0x116c, 0x11ab, 0, -#undef V3765 -#define V3765 (V + 14044) - 0x1104, 0x116c, 0x11ac, 0, -#undef V3766 -#define V3766 (V + 14048) - 0x1104, 0x116c, 0x11ad, 0, -#undef V3767 -#define V3767 (V + 14052) - 0x1104, 0x116c, 0x11ae, 0, -#undef V3768 -#define V3768 (V + 14056) - 0x1104, 0x116c, 0x11af, 0, -#undef V3769 -#define V3769 (V + 14060) - 0x1104, 0x116c, 0x11b0, 0, -#undef V3770 -#define V3770 (V + 14064) - 0x1104, 0x116c, 0x11b1, 0, -#undef V3771 -#define V3771 (V + 14068) - 0x1104, 0x116c, 0x11b2, 0, -#undef V3772 -#define V3772 (V + 14072) - 0x1104, 0x116c, 0x11b3, 0, -#undef V3773 -#define V3773 (V + 14076) - 0x1104, 0x116c, 0x11b4, 0, -#undef V3774 -#define V3774 (V + 14080) - 0x1104, 0x116c, 0x11b5, 0, -#undef V3775 -#define V3775 (V + 14084) - 0x1104, 0x116c, 0x11b6, 0, -#undef V3776 -#define V3776 (V + 14088) - 0x1104, 0x116c, 0x11b7, 0, -#undef V3777 -#define V3777 (V + 14092) - 0x1104, 0x116c, 0x11b8, 0, -#undef V3778 -#define V3778 (V + 14096) - 0x1104, 0x116c, 0x11b9, 0, -#undef V3779 -#define V3779 (V + 14100) - 0x1104, 0x116c, 0x11ba, 0, -#undef V3780 -#define V3780 (V + 14104) - 0x1104, 0x116c, 0x11bb, 0, -#undef V3781 -#define V3781 (V + 14108) - 0x1104, 0x116c, 0x11bc, 0, -#undef V3782 -#define V3782 (V + 14112) - 0x1104, 0x116c, 0x11bd, 0, -#undef V3783 -#define V3783 (V + 14116) - 0x1104, 0x116c, 0x11be, 0, -#undef V3784 -#define V3784 (V + 14120) - 0x1104, 0x116c, 0x11bf, 0, -#undef V3785 -#define V3785 (V + 14124) - 0x1104, 0x116c, 0x11c0, 0, -#undef V3786 -#define V3786 (V + 14128) - 0x1104, 0x116c, 0x11c1, 0, -#undef V3787 -#define V3787 (V + 14132) - 0x1104, 0x116c, 0x11c2, 0, -#undef V3788 -#define V3788 (V + 14136) - 0x1104, 0x116d, 0, -#undef V3789 -#define V3789 (V + 14139) - 0x1104, 0x116d, 0x11a8, 0, -#undef V3790 -#define V3790 (V + 14143) - 0x1104, 0x116d, 0x11a9, 0, -#undef V3791 -#define V3791 (V + 14147) - 0x1104, 0x116d, 0x11aa, 0, -#undef V3792 -#define V3792 (V + 14151) - 0x1104, 0x116d, 0x11ab, 0, -#undef V3793 -#define V3793 (V + 14155) - 0x1104, 0x116d, 0x11ac, 0, -#undef V3794 -#define V3794 (V + 14159) - 0x1104, 0x116d, 0x11ad, 0, -#undef V3795 -#define V3795 (V + 14163) - 0x1104, 0x116d, 0x11ae, 0, -#undef V3796 -#define V3796 (V + 14167) - 0x1104, 0x116d, 0x11af, 0, -#undef V3797 -#define V3797 (V + 14171) - 0x1104, 0x116d, 0x11b0, 0, -#undef V3798 -#define V3798 (V + 14175) - 0x1104, 0x116d, 0x11b1, 0, -#undef V3799 -#define V3799 (V + 14179) - 0x1104, 0x116d, 0x11b2, 0, -#undef V3800 -#define V3800 (V + 14183) - 0x1104, 0x116d, 0x11b3, 0, -#undef V3801 -#define V3801 (V + 14187) - 0x1104, 0x116d, 0x11b4, 0, -#undef V3802 -#define V3802 (V + 14191) - 0x1104, 0x116d, 0x11b5, 0, -#undef V3803 -#define V3803 (V + 14195) - 0x1104, 0x116d, 0x11b6, 0, -#undef V3804 -#define V3804 (V + 14199) - 0x1104, 0x116d, 0x11b7, 0, -#undef V3805 -#define V3805 (V + 14203) - 0x1104, 0x116d, 0x11b8, 0, -#undef V3806 -#define V3806 (V + 14207) - 0x1104, 0x116d, 0x11b9, 0, -#undef V3807 -#define V3807 (V + 14211) - 0x1104, 0x116d, 0x11ba, 0, -#undef V3808 -#define V3808 (V + 14215) - 0x1104, 0x116d, 0x11bb, 0, -#undef V3809 -#define V3809 (V + 14219) - 0x1104, 0x116d, 0x11bc, 0, -#undef V3810 -#define V3810 (V + 14223) - 0x1104, 0x116d, 0x11bd, 0, -#undef V3811 -#define V3811 (V + 14227) - 0x1104, 0x116d, 0x11be, 0, -#undef V3812 -#define V3812 (V + 14231) - 0x1104, 0x116d, 0x11bf, 0, -#undef V3813 -#define V3813 (V + 14235) - 0x1104, 0x116d, 0x11c0, 0, -#undef V3814 -#define V3814 (V + 14239) - 0x1104, 0x116d, 0x11c1, 0, -#undef V3815 -#define V3815 (V + 14243) - 0x1104, 0x116d, 0x11c2, 0, -#undef V3816 -#define V3816 (V + 14247) - 0x1104, 0x116e, 0, -#undef V3817 -#define V3817 (V + 14250) - 0x1104, 0x116e, 0x11a8, 0, -#undef V3818 -#define V3818 (V + 14254) - 0x1104, 0x116e, 0x11a9, 0, -#undef V3819 -#define V3819 (V + 14258) - 0x1104, 0x116e, 0x11aa, 0, -#undef V3820 -#define V3820 (V + 14262) - 0x1104, 0x116e, 0x11ab, 0, -#undef V3821 -#define V3821 (V + 14266) - 0x1104, 0x116e, 0x11ac, 0, -#undef V3822 -#define V3822 (V + 14270) - 0x1104, 0x116e, 0x11ad, 0, -#undef V3823 -#define V3823 (V + 14274) - 0x1104, 0x116e, 0x11ae, 0, -#undef V3824 -#define V3824 (V + 14278) - 0x1104, 0x116e, 0x11af, 0, -#undef V3825 -#define V3825 (V + 14282) - 0x1104, 0x116e, 0x11b0, 0, -#undef V3826 -#define V3826 (V + 14286) - 0x1104, 0x116e, 0x11b1, 0, -#undef V3827 -#define V3827 (V + 14290) - 0x1104, 0x116e, 0x11b2, 0, -#undef V3828 -#define V3828 (V + 14294) - 0x1104, 0x116e, 0x11b3, 0, -#undef V3829 -#define V3829 (V + 14298) - 0x1104, 0x116e, 0x11b4, 0, -#undef V3830 -#define V3830 (V + 14302) - 0x1104, 0x116e, 0x11b5, 0, -#undef V3831 -#define V3831 (V + 14306) - 0x1104, 0x116e, 0x11b6, 0, -#undef V3832 -#define V3832 (V + 14310) - 0x1104, 0x116e, 0x11b7, 0, -#undef V3833 -#define V3833 (V + 14314) - 0x1104, 0x116e, 0x11b8, 0, -#undef V3834 -#define V3834 (V + 14318) - 0x1104, 0x116e, 0x11b9, 0, -#undef V3835 -#define V3835 (V + 14322) - 0x1104, 0x116e, 0x11ba, 0, -#undef V3836 -#define V3836 (V + 14326) - 0x1104, 0x116e, 0x11bb, 0, -#undef V3837 -#define V3837 (V + 14330) - 0x1104, 0x116e, 0x11bc, 0, -#undef V3838 -#define V3838 (V + 14334) - 0x1104, 0x116e, 0x11bd, 0, -#undef V3839 -#define V3839 (V + 14338) - 0x1104, 0x116e, 0x11be, 0, -#undef V3840 -#define V3840 (V + 14342) - 0x1104, 0x116e, 0x11bf, 0, -#undef V3841 -#define V3841 (V + 14346) - 0x1104, 0x116e, 0x11c0, 0, -#undef V3842 -#define V3842 (V + 14350) - 0x1104, 0x116e, 0x11c1, 0, -#undef V3843 -#define V3843 (V + 14354) - 0x1104, 0x116e, 0x11c2, 0, -#undef V3844 -#define V3844 (V + 14358) - 0x1104, 0x116f, 0, -#undef V3845 -#define V3845 (V + 14361) - 0x1104, 0x116f, 0x11a8, 0, -#undef V3846 -#define V3846 (V + 14365) - 0x1104, 0x116f, 0x11a9, 0, -#undef V3847 -#define V3847 (V + 14369) - 0x1104, 0x116f, 0x11aa, 0, -#undef V3848 -#define V3848 (V + 14373) - 0x1104, 0x116f, 0x11ab, 0, -#undef V3849 -#define V3849 (V + 14377) - 0x1104, 0x116f, 0x11ac, 0, -#undef V3850 -#define V3850 (V + 14381) - 0x1104, 0x116f, 0x11ad, 0, -#undef V3851 -#define V3851 (V + 14385) - 0x1104, 0x116f, 0x11ae, 0, -#undef V3852 -#define V3852 (V + 14389) - 0x1104, 0x116f, 0x11af, 0, -#undef V3853 -#define V3853 (V + 14393) - 0x1104, 0x116f, 0x11b0, 0, -#undef V3854 -#define V3854 (V + 14397) - 0x1104, 0x116f, 0x11b1, 0, -#undef V3855 -#define V3855 (V + 14401) - 0x1104, 0x116f, 0x11b2, 0, -#undef V3856 -#define V3856 (V + 14405) - 0x1104, 0x116f, 0x11b3, 0, -#undef V3857 -#define V3857 (V + 14409) - 0x1104, 0x116f, 0x11b4, 0, -#undef V3858 -#define V3858 (V + 14413) - 0x1104, 0x116f, 0x11b5, 0, -#undef V3859 -#define V3859 (V + 14417) - 0x1104, 0x116f, 0x11b6, 0, -#undef V3860 -#define V3860 (V + 14421) - 0x1104, 0x116f, 0x11b7, 0, -#undef V3861 -#define V3861 (V + 14425) - 0x1104, 0x116f, 0x11b8, 0, -#undef V3862 -#define V3862 (V + 14429) - 0x1104, 0x116f, 0x11b9, 0, -#undef V3863 -#define V3863 (V + 14433) - 0x1104, 0x116f, 0x11ba, 0, -#undef V3864 -#define V3864 (V + 14437) - 0x1104, 0x116f, 0x11bb, 0, -#undef V3865 -#define V3865 (V + 14441) - 0x1104, 0x116f, 0x11bc, 0, -#undef V3866 -#define V3866 (V + 14445) - 0x1104, 0x116f, 0x11bd, 0, -#undef V3867 -#define V3867 (V + 14449) - 0x1104, 0x116f, 0x11be, 0, -#undef V3868 -#define V3868 (V + 14453) - 0x1104, 0x116f, 0x11bf, 0, -#undef V3869 -#define V3869 (V + 14457) - 0x1104, 0x116f, 0x11c0, 0, -#undef V3870 -#define V3870 (V + 14461) - 0x1104, 0x116f, 0x11c1, 0, -#undef V3871 -#define V3871 (V + 14465) - 0x1104, 0x116f, 0x11c2, 0, -#undef V3872 -#define V3872 (V + 14469) - 0x1104, 0x1170, 0, -#undef V3873 -#define V3873 (V + 14472) - 0x1104, 0x1170, 0x11a8, 0, -#undef V3874 -#define V3874 (V + 14476) - 0x1104, 0x1170, 0x11a9, 0, -#undef V3875 -#define V3875 (V + 14480) - 0x1104, 0x1170, 0x11aa, 0, -#undef V3876 -#define V3876 (V + 14484) - 0x1104, 0x1170, 0x11ab, 0, -#undef V3877 -#define V3877 (V + 14488) - 0x1104, 0x1170, 0x11ac, 0, -#undef V3878 -#define V3878 (V + 14492) - 0x1104, 0x1170, 0x11ad, 0, -#undef V3879 -#define V3879 (V + 14496) - 0x1104, 0x1170, 0x11ae, 0, -#undef V3880 -#define V3880 (V + 14500) - 0x1104, 0x1170, 0x11af, 0, -#undef V3881 -#define V3881 (V + 14504) - 0x1104, 0x1170, 0x11b0, 0, -#undef V3882 -#define V3882 (V + 14508) - 0x1104, 0x1170, 0x11b1, 0, -#undef V3883 -#define V3883 (V + 14512) - 0x1104, 0x1170, 0x11b2, 0, -#undef V3884 -#define V3884 (V + 14516) - 0x1104, 0x1170, 0x11b3, 0, -#undef V3885 -#define V3885 (V + 14520) - 0x1104, 0x1170, 0x11b4, 0, -#undef V3886 -#define V3886 (V + 14524) - 0x1104, 0x1170, 0x11b5, 0, -#undef V3887 -#define V3887 (V + 14528) - 0x1104, 0x1170, 0x11b6, 0, -#undef V3888 -#define V3888 (V + 14532) - 0x1104, 0x1170, 0x11b7, 0, -#undef V3889 -#define V3889 (V + 14536) - 0x1104, 0x1170, 0x11b8, 0, -#undef V3890 -#define V3890 (V + 14540) - 0x1104, 0x1170, 0x11b9, 0, -#undef V3891 -#define V3891 (V + 14544) - 0x1104, 0x1170, 0x11ba, 0, -#undef V3892 -#define V3892 (V + 14548) - 0x1104, 0x1170, 0x11bb, 0, -#undef V3893 -#define V3893 (V + 14552) - 0x1104, 0x1170, 0x11bc, 0, -#undef V3894 -#define V3894 (V + 14556) - 0x1104, 0x1170, 0x11bd, 0, -#undef V3895 -#define V3895 (V + 14560) - 0x1104, 0x1170, 0x11be, 0, -#undef V3896 -#define V3896 (V + 14564) - 0x1104, 0x1170, 0x11bf, 0, -#undef V3897 -#define V3897 (V + 14568) - 0x1104, 0x1170, 0x11c0, 0, -#undef V3898 -#define V3898 (V + 14572) - 0x1104, 0x1170, 0x11c1, 0, -#undef V3899 -#define V3899 (V + 14576) - 0x1104, 0x1170, 0x11c2, 0, -#undef V3900 -#define V3900 (V + 14580) - 0x1104, 0x1171, 0, -#undef V3901 -#define V3901 (V + 14583) - 0x1104, 0x1171, 0x11a8, 0, -#undef V3902 -#define V3902 (V + 14587) - 0x1104, 0x1171, 0x11a9, 0, -#undef V3903 -#define V3903 (V + 14591) - 0x1104, 0x1171, 0x11aa, 0, -#undef V3904 -#define V3904 (V + 14595) - 0x1104, 0x1171, 0x11ab, 0, -#undef V3905 -#define V3905 (V + 14599) - 0x1104, 0x1171, 0x11ac, 0, -#undef V3906 -#define V3906 (V + 14603) - 0x1104, 0x1171, 0x11ad, 0, -#undef V3907 -#define V3907 (V + 14607) - 0x1104, 0x1171, 0x11ae, 0, -#undef V3908 -#define V3908 (V + 14611) - 0x1104, 0x1171, 0x11af, 0, -#undef V3909 -#define V3909 (V + 14615) - 0x1104, 0x1171, 0x11b0, 0, -#undef V3910 -#define V3910 (V + 14619) - 0x1104, 0x1171, 0x11b1, 0, -#undef V3911 -#define V3911 (V + 14623) - 0x1104, 0x1171, 0x11b2, 0, -#undef V3912 -#define V3912 (V + 14627) - 0x1104, 0x1171, 0x11b3, 0, -#undef V3913 -#define V3913 (V + 14631) - 0x1104, 0x1171, 0x11b4, 0, -#undef V3914 -#define V3914 (V + 14635) - 0x1104, 0x1171, 0x11b5, 0, -#undef V3915 -#define V3915 (V + 14639) - 0x1104, 0x1171, 0x11b6, 0, -#undef V3916 -#define V3916 (V + 14643) - 0x1104, 0x1171, 0x11b7, 0, -#undef V3917 -#define V3917 (V + 14647) - 0x1104, 0x1171, 0x11b8, 0, -#undef V3918 -#define V3918 (V + 14651) - 0x1104, 0x1171, 0x11b9, 0, -#undef V3919 -#define V3919 (V + 14655) - 0x1104, 0x1171, 0x11ba, 0, -#undef V3920 -#define V3920 (V + 14659) - 0x1104, 0x1171, 0x11bb, 0, -#undef V3921 -#define V3921 (V + 14663) - 0x1104, 0x1171, 0x11bc, 0, -#undef V3922 -#define V3922 (V + 14667) - 0x1104, 0x1171, 0x11bd, 0, -#undef V3923 -#define V3923 (V + 14671) - 0x1104, 0x1171, 0x11be, 0, -#undef V3924 -#define V3924 (V + 14675) - 0x1104, 0x1171, 0x11bf, 0, -#undef V3925 -#define V3925 (V + 14679) - 0x1104, 0x1171, 0x11c0, 0, -#undef V3926 -#define V3926 (V + 14683) - 0x1104, 0x1171, 0x11c1, 0, -#undef V3927 -#define V3927 (V + 14687) - 0x1104, 0x1171, 0x11c2, 0, -#undef V3928 -#define V3928 (V + 14691) - 0x1104, 0x1172, 0, -#undef V3929 -#define V3929 (V + 14694) - 0x1104, 0x1172, 0x11a8, 0, -#undef V3930 -#define V3930 (V + 14698) - 0x1104, 0x1172, 0x11a9, 0, -#undef V3931 -#define V3931 (V + 14702) - 0x1104, 0x1172, 0x11aa, 0, -#undef V3932 -#define V3932 (V + 14706) - 0x1104, 0x1172, 0x11ab, 0, -#undef V3933 -#define V3933 (V + 14710) - 0x1104, 0x1172, 0x11ac, 0, -#undef V3934 -#define V3934 (V + 14714) - 0x1104, 0x1172, 0x11ad, 0, -#undef V3935 -#define V3935 (V + 14718) - 0x1104, 0x1172, 0x11ae, 0, -#undef V3936 -#define V3936 (V + 14722) - 0x1104, 0x1172, 0x11af, 0, -#undef V3937 -#define V3937 (V + 14726) - 0x1104, 0x1172, 0x11b0, 0, -#undef V3938 -#define V3938 (V + 14730) - 0x1104, 0x1172, 0x11b1, 0, -#undef V3939 -#define V3939 (V + 14734) - 0x1104, 0x1172, 0x11b2, 0, -#undef V3940 -#define V3940 (V + 14738) - 0x1104, 0x1172, 0x11b3, 0, -#undef V3941 -#define V3941 (V + 14742) - 0x1104, 0x1172, 0x11b4, 0, -#undef V3942 -#define V3942 (V + 14746) - 0x1104, 0x1172, 0x11b5, 0, -#undef V3943 -#define V3943 (V + 14750) - 0x1104, 0x1172, 0x11b6, 0, -#undef V3944 -#define V3944 (V + 14754) - 0x1104, 0x1172, 0x11b7, 0, -#undef V3945 -#define V3945 (V + 14758) - 0x1104, 0x1172, 0x11b8, 0, -#undef V3946 -#define V3946 (V + 14762) - 0x1104, 0x1172, 0x11b9, 0, -#undef V3947 -#define V3947 (V + 14766) - 0x1104, 0x1172, 0x11ba, 0, -#undef V3948 -#define V3948 (V + 14770) - 0x1104, 0x1172, 0x11bb, 0, -#undef V3949 -#define V3949 (V + 14774) - 0x1104, 0x1172, 0x11bc, 0, -#undef V3950 -#define V3950 (V + 14778) - 0x1104, 0x1172, 0x11bd, 0, -#undef V3951 -#define V3951 (V + 14782) - 0x1104, 0x1172, 0x11be, 0, -#undef V3952 -#define V3952 (V + 14786) - 0x1104, 0x1172, 0x11bf, 0, -#undef V3953 -#define V3953 (V + 14790) - 0x1104, 0x1172, 0x11c0, 0, -#undef V3954 -#define V3954 (V + 14794) - 0x1104, 0x1172, 0x11c1, 0, -#undef V3955 -#define V3955 (V + 14798) - 0x1104, 0x1172, 0x11c2, 0, -#undef V3956 -#define V3956 (V + 14802) - 0x1104, 0x1173, 0, -#undef V3957 -#define V3957 (V + 14805) - 0x1104, 0x1173, 0x11a8, 0, -#undef V3958 -#define V3958 (V + 14809) - 0x1104, 0x1173, 0x11a9, 0, -#undef V3959 -#define V3959 (V + 14813) - 0x1104, 0x1173, 0x11aa, 0, -#undef V3960 -#define V3960 (V + 14817) - 0x1104, 0x1173, 0x11ab, 0, -#undef V3961 -#define V3961 (V + 14821) - 0x1104, 0x1173, 0x11ac, 0, -#undef V3962 -#define V3962 (V + 14825) - 0x1104, 0x1173, 0x11ad, 0, -#undef V3963 -#define V3963 (V + 14829) - 0x1104, 0x1173, 0x11ae, 0, -#undef V3964 -#define V3964 (V + 14833) - 0x1104, 0x1173, 0x11af, 0, -#undef V3965 -#define V3965 (V + 14837) - 0x1104, 0x1173, 0x11b0, 0, -#undef V3966 -#define V3966 (V + 14841) - 0x1104, 0x1173, 0x11b1, 0, -#undef V3967 -#define V3967 (V + 14845) - 0x1104, 0x1173, 0x11b2, 0, -#undef V3968 -#define V3968 (V + 14849) - 0x1104, 0x1173, 0x11b3, 0, -#undef V3969 -#define V3969 (V + 14853) - 0x1104, 0x1173, 0x11b4, 0, -#undef V3970 -#define V3970 (V + 14857) - 0x1104, 0x1173, 0x11b5, 0, -#undef V3971 -#define V3971 (V + 14861) - 0x1104, 0x1173, 0x11b6, 0, -#undef V3972 -#define V3972 (V + 14865) - 0x1104, 0x1173, 0x11b7, 0, -#undef V3973 -#define V3973 (V + 14869) - 0x1104, 0x1173, 0x11b8, 0, -#undef V3974 -#define V3974 (V + 14873) - 0x1104, 0x1173, 0x11b9, 0, -#undef V3975 -#define V3975 (V + 14877) - 0x1104, 0x1173, 0x11ba, 0, -#undef V3976 -#define V3976 (V + 14881) - 0x1104, 0x1173, 0x11bb, 0, -#undef V3977 -#define V3977 (V + 14885) - 0x1104, 0x1173, 0x11bc, 0, -#undef V3978 -#define V3978 (V + 14889) - 0x1104, 0x1173, 0x11bd, 0, -#undef V3979 -#define V3979 (V + 14893) - 0x1104, 0x1173, 0x11be, 0, -#undef V3980 -#define V3980 (V + 14897) - 0x1104, 0x1173, 0x11bf, 0, -#undef V3981 -#define V3981 (V + 14901) - 0x1104, 0x1173, 0x11c0, 0, -#undef V3982 -#define V3982 (V + 14905) - 0x1104, 0x1173, 0x11c1, 0, -#undef V3983 -#define V3983 (V + 14909) - 0x1104, 0x1173, 0x11c2, 0, -#undef V3984 -#define V3984 (V + 14913) - 0x1104, 0x1174, 0, -#undef V3985 -#define V3985 (V + 14916) - 0x1104, 0x1174, 0x11a8, 0, -#undef V3986 -#define V3986 (V + 14920) - 0x1104, 0x1174, 0x11a9, 0, -#undef V3987 -#define V3987 (V + 14924) - 0x1104, 0x1174, 0x11aa, 0, -#undef V3988 -#define V3988 (V + 14928) - 0x1104, 0x1174, 0x11ab, 0, -#undef V3989 -#define V3989 (V + 14932) - 0x1104, 0x1174, 0x11ac, 0, -#undef V3990 -#define V3990 (V + 14936) - 0x1104, 0x1174, 0x11ad, 0, -#undef V3991 -#define V3991 (V + 14940) - 0x1104, 0x1174, 0x11ae, 0, -#undef V3992 -#define V3992 (V + 14944) - 0x1104, 0x1174, 0x11af, 0, -#undef V3993 -#define V3993 (V + 14948) - 0x1104, 0x1174, 0x11b0, 0, -#undef V3994 -#define V3994 (V + 14952) - 0x1104, 0x1174, 0x11b1, 0, -#undef V3995 -#define V3995 (V + 14956) - 0x1104, 0x1174, 0x11b2, 0, -#undef V3996 -#define V3996 (V + 14960) - 0x1104, 0x1174, 0x11b3, 0, -#undef V3997 -#define V3997 (V + 14964) - 0x1104, 0x1174, 0x11b4, 0, -#undef V3998 -#define V3998 (V + 14968) - 0x1104, 0x1174, 0x11b5, 0, -#undef V3999 -#define V3999 (V + 14972) - 0x1104, 0x1174, 0x11b6, 0, -#undef V4000 -#define V4000 (V + 14976) - 0x1104, 0x1174, 0x11b7, 0, -#undef V4001 -#define V4001 (V + 14980) - 0x1104, 0x1174, 0x11b8, 0, -#undef V4002 -#define V4002 (V + 14984) - 0x1104, 0x1174, 0x11b9, 0, -#undef V4003 -#define V4003 (V + 14988) - 0x1104, 0x1174, 0x11ba, 0, -#undef V4004 -#define V4004 (V + 14992) - 0x1104, 0x1174, 0x11bb, 0, -#undef V4005 -#define V4005 (V + 14996) - 0x1104, 0x1174, 0x11bc, 0, -#undef V4006 -#define V4006 (V + 15000) - 0x1104, 0x1174, 0x11bd, 0, -#undef V4007 -#define V4007 (V + 15004) - 0x1104, 0x1174, 0x11be, 0, -#undef V4008 -#define V4008 (V + 15008) - 0x1104, 0x1174, 0x11bf, 0, -#undef V4009 -#define V4009 (V + 15012) - 0x1104, 0x1174, 0x11c0, 0, -#undef V4010 -#define V4010 (V + 15016) - 0x1104, 0x1174, 0x11c1, 0, -#undef V4011 -#define V4011 (V + 15020) - 0x1104, 0x1174, 0x11c2, 0, -#undef V4012 -#define V4012 (V + 15024) - 0x1104, 0x1175, 0, -#undef V4013 -#define V4013 (V + 15027) - 0x1104, 0x1175, 0x11a8, 0, -#undef V4014 -#define V4014 (V + 15031) - 0x1104, 0x1175, 0x11a9, 0, -#undef V4015 -#define V4015 (V + 15035) - 0x1104, 0x1175, 0x11aa, 0, -#undef V4016 -#define V4016 (V + 15039) - 0x1104, 0x1175, 0x11ab, 0, -#undef V4017 -#define V4017 (V + 15043) - 0x1104, 0x1175, 0x11ac, 0, -#undef V4018 -#define V4018 (V + 15047) - 0x1104, 0x1175, 0x11ad, 0, -#undef V4019 -#define V4019 (V + 15051) - 0x1104, 0x1175, 0x11ae, 0, -#undef V4020 -#define V4020 (V + 15055) - 0x1104, 0x1175, 0x11af, 0, -#undef V4021 -#define V4021 (V + 15059) - 0x1104, 0x1175, 0x11b0, 0, -#undef V4022 -#define V4022 (V + 15063) - 0x1104, 0x1175, 0x11b1, 0, -#undef V4023 -#define V4023 (V + 15067) - 0x1104, 0x1175, 0x11b2, 0, -#undef V4024 -#define V4024 (V + 15071) - 0x1104, 0x1175, 0x11b3, 0, -#undef V4025 -#define V4025 (V + 15075) - 0x1104, 0x1175, 0x11b4, 0, -#undef V4026 -#define V4026 (V + 15079) - 0x1104, 0x1175, 0x11b5, 0, -#undef V4027 -#define V4027 (V + 15083) - 0x1104, 0x1175, 0x11b6, 0, -#undef V4028 -#define V4028 (V + 15087) - 0x1104, 0x1175, 0x11b7, 0, -#undef V4029 -#define V4029 (V + 15091) - 0x1104, 0x1175, 0x11b8, 0, -#undef V4030 -#define V4030 (V + 15095) - 0x1104, 0x1175, 0x11b9, 0, -#undef V4031 -#define V4031 (V + 15099) - 0x1104, 0x1175, 0x11ba, 0, -#undef V4032 -#define V4032 (V + 15103) - 0x1104, 0x1175, 0x11bb, 0, -#undef V4033 -#define V4033 (V + 15107) - 0x1104, 0x1175, 0x11bc, 0, -#undef V4034 -#define V4034 (V + 15111) - 0x1104, 0x1175, 0x11bd, 0, -#undef V4035 -#define V4035 (V + 15115) - 0x1104, 0x1175, 0x11be, 0, -#undef V4036 -#define V4036 (V + 15119) - 0x1104, 0x1175, 0x11bf, 0, -#undef V4037 -#define V4037 (V + 15123) - 0x1104, 0x1175, 0x11c0, 0, -#undef V4038 -#define V4038 (V + 15127) - 0x1104, 0x1175, 0x11c1, 0, -#undef V4039 -#define V4039 (V + 15131) - 0x1104, 0x1175, 0x11c2, 0, -#undef V4040 -#define V4040 (V + 15135) - 0x1105, 0x1161, 0, -#undef V4041 -#define V4041 (V + 15138) - 0x1105, 0x1161, 0x11a8, 0, -#undef V4042 -#define V4042 (V + 15142) - 0x1105, 0x1161, 0x11a9, 0, -#undef V4043 -#define V4043 (V + 15146) - 0x1105, 0x1161, 0x11aa, 0, -#undef V4044 -#define V4044 (V + 15150) - 0x1105, 0x1161, 0x11ab, 0, -#undef V4045 -#define V4045 (V + 15154) - 0x1105, 0x1161, 0x11ac, 0, -#undef V4046 -#define V4046 (V + 15158) - 0x1105, 0x1161, 0x11ad, 0, -#undef V4047 -#define V4047 (V + 15162) - 0x1105, 0x1161, 0x11ae, 0, -#undef V4048 -#define V4048 (V + 15166) - 0x1105, 0x1161, 0x11af, 0, -#undef V4049 -#define V4049 (V + 15170) - 0x1105, 0x1161, 0x11b0, 0, -#undef V4050 -#define V4050 (V + 15174) - 0x1105, 0x1161, 0x11b1, 0, -#undef V4051 -#define V4051 (V + 15178) - 0x1105, 0x1161, 0x11b2, 0, -#undef V4052 -#define V4052 (V + 15182) - 0x1105, 0x1161, 0x11b3, 0, -#undef V4053 -#define V4053 (V + 15186) - 0x1105, 0x1161, 0x11b4, 0, -#undef V4054 -#define V4054 (V + 15190) - 0x1105, 0x1161, 0x11b5, 0, -#undef V4055 -#define V4055 (V + 15194) - 0x1105, 0x1161, 0x11b6, 0, -#undef V4056 -#define V4056 (V + 15198) - 0x1105, 0x1161, 0x11b7, 0, -#undef V4057 -#define V4057 (V + 15202) - 0x1105, 0x1161, 0x11b8, 0, -#undef V4058 -#define V4058 (V + 15206) - 0x1105, 0x1161, 0x11b9, 0, -#undef V4059 -#define V4059 (V + 15210) - 0x1105, 0x1161, 0x11ba, 0, -#undef V4060 -#define V4060 (V + 15214) - 0x1105, 0x1161, 0x11bb, 0, -#undef V4061 -#define V4061 (V + 15218) - 0x1105, 0x1161, 0x11bc, 0, -#undef V4062 -#define V4062 (V + 15222) - 0x1105, 0x1161, 0x11bd, 0, -#undef V4063 -#define V4063 (V + 15226) - 0x1105, 0x1161, 0x11be, 0, -#undef V4064 -#define V4064 (V + 15230) - 0x1105, 0x1161, 0x11bf, 0, -#undef V4065 -#define V4065 (V + 15234) - 0x1105, 0x1161, 0x11c0, 0, -#undef V4066 -#define V4066 (V + 15238) - 0x1105, 0x1161, 0x11c1, 0, -#undef V4067 -#define V4067 (V + 15242) - 0x1105, 0x1161, 0x11c2, 0, -#undef V4068 -#define V4068 (V + 15246) - 0x1105, 0x1162, 0, -#undef V4069 -#define V4069 (V + 15249) - 0x1105, 0x1162, 0x11a8, 0, -#undef V4070 -#define V4070 (V + 15253) - 0x1105, 0x1162, 0x11a9, 0, -#undef V4071 -#define V4071 (V + 15257) - 0x1105, 0x1162, 0x11aa, 0, -#undef V4072 -#define V4072 (V + 15261) - 0x1105, 0x1162, 0x11ab, 0, -#undef V4073 -#define V4073 (V + 15265) - 0x1105, 0x1162, 0x11ac, 0, -#undef V4074 -#define V4074 (V + 15269) - 0x1105, 0x1162, 0x11ad, 0, -#undef V4075 -#define V4075 (V + 15273) - 0x1105, 0x1162, 0x11ae, 0, -#undef V4076 -#define V4076 (V + 15277) - 0x1105, 0x1162, 0x11af, 0, -#undef V4077 -#define V4077 (V + 15281) - 0x1105, 0x1162, 0x11b0, 0, -#undef V4078 -#define V4078 (V + 15285) - 0x1105, 0x1162, 0x11b1, 0, -#undef V4079 -#define V4079 (V + 15289) - 0x1105, 0x1162, 0x11b2, 0, -#undef V4080 -#define V4080 (V + 15293) - 0x1105, 0x1162, 0x11b3, 0, -#undef V4081 -#define V4081 (V + 15297) - 0x1105, 0x1162, 0x11b4, 0, -#undef V4082 -#define V4082 (V + 15301) - 0x1105, 0x1162, 0x11b5, 0, -#undef V4083 -#define V4083 (V + 15305) - 0x1105, 0x1162, 0x11b6, 0, -#undef V4084 -#define V4084 (V + 15309) - 0x1105, 0x1162, 0x11b7, 0, -#undef V4085 -#define V4085 (V + 15313) - 0x1105, 0x1162, 0x11b8, 0, -#undef V4086 -#define V4086 (V + 15317) - 0x1105, 0x1162, 0x11b9, 0, -#undef V4087 -#define V4087 (V + 15321) - 0x1105, 0x1162, 0x11ba, 0, -#undef V4088 -#define V4088 (V + 15325) - 0x1105, 0x1162, 0x11bb, 0, -#undef V4089 -#define V4089 (V + 15329) - 0x1105, 0x1162, 0x11bc, 0, -#undef V4090 -#define V4090 (V + 15333) - 0x1105, 0x1162, 0x11bd, 0, -#undef V4091 -#define V4091 (V + 15337) - 0x1105, 0x1162, 0x11be, 0, -#undef V4092 -#define V4092 (V + 15341) - 0x1105, 0x1162, 0x11bf, 0, -#undef V4093 -#define V4093 (V + 15345) - 0x1105, 0x1162, 0x11c0, 0, -#undef V4094 -#define V4094 (V + 15349) - 0x1105, 0x1162, 0x11c1, 0, -#undef V4095 -#define V4095 (V + 15353) - 0x1105, 0x1162, 0x11c2, 0, -#undef V4096 -#define V4096 (V + 15357) - 0x1105, 0x1163, 0, -#undef V4097 -#define V4097 (V + 15360) - 0x1105, 0x1163, 0x11a8, 0, -#undef V4098 -#define V4098 (V + 15364) - 0x1105, 0x1163, 0x11a9, 0, -#undef V4099 -#define V4099 (V + 15368) - 0x1105, 0x1163, 0x11aa, 0, -#undef V4100 -#define V4100 (V + 15372) - 0x1105, 0x1163, 0x11ab, 0, -#undef V4101 -#define V4101 (V + 15376) - 0x1105, 0x1163, 0x11ac, 0, -#undef V4102 -#define V4102 (V + 15380) - 0x1105, 0x1163, 0x11ad, 0, -#undef V4103 -#define V4103 (V + 15384) - 0x1105, 0x1163, 0x11ae, 0, -#undef V4104 -#define V4104 (V + 15388) - 0x1105, 0x1163, 0x11af, 0, -#undef V4105 -#define V4105 (V + 15392) - 0x1105, 0x1163, 0x11b0, 0, -#undef V4106 -#define V4106 (V + 15396) - 0x1105, 0x1163, 0x11b1, 0, -#undef V4107 -#define V4107 (V + 15400) - 0x1105, 0x1163, 0x11b2, 0, -#undef V4108 -#define V4108 (V + 15404) - 0x1105, 0x1163, 0x11b3, 0, -#undef V4109 -#define V4109 (V + 15408) - 0x1105, 0x1163, 0x11b4, 0, -#undef V4110 -#define V4110 (V + 15412) - 0x1105, 0x1163, 0x11b5, 0, -#undef V4111 -#define V4111 (V + 15416) - 0x1105, 0x1163, 0x11b6, 0, -#undef V4112 -#define V4112 (V + 15420) - 0x1105, 0x1163, 0x11b7, 0, -#undef V4113 -#define V4113 (V + 15424) - 0x1105, 0x1163, 0x11b8, 0, -#undef V4114 -#define V4114 (V + 15428) - 0x1105, 0x1163, 0x11b9, 0, -#undef V4115 -#define V4115 (V + 15432) - 0x1105, 0x1163, 0x11ba, 0, -#undef V4116 -#define V4116 (V + 15436) - 0x1105, 0x1163, 0x11bb, 0, -#undef V4117 -#define V4117 (V + 15440) - 0x1105, 0x1163, 0x11bc, 0, -#undef V4118 -#define V4118 (V + 15444) - 0x1105, 0x1163, 0x11bd, 0, -#undef V4119 -#define V4119 (V + 15448) - 0x1105, 0x1163, 0x11be, 0, -#undef V4120 -#define V4120 (V + 15452) - 0x1105, 0x1163, 0x11bf, 0, -#undef V4121 -#define V4121 (V + 15456) - 0x1105, 0x1163, 0x11c0, 0, -#undef V4122 -#define V4122 (V + 15460) - 0x1105, 0x1163, 0x11c1, 0, -#undef V4123 -#define V4123 (V + 15464) - 0x1105, 0x1163, 0x11c2, 0, -#undef V4124 -#define V4124 (V + 15468) - 0x1105, 0x1164, 0, -#undef V4125 -#define V4125 (V + 15471) - 0x1105, 0x1164, 0x11a8, 0, -#undef V4126 -#define V4126 (V + 15475) - 0x1105, 0x1164, 0x11a9, 0, -#undef V4127 -#define V4127 (V + 15479) - 0x1105, 0x1164, 0x11aa, 0, -#undef V4128 -#define V4128 (V + 15483) - 0x1105, 0x1164, 0x11ab, 0, -#undef V4129 -#define V4129 (V + 15487) - 0x1105, 0x1164, 0x11ac, 0, -#undef V4130 -#define V4130 (V + 15491) - 0x1105, 0x1164, 0x11ad, 0, -#undef V4131 -#define V4131 (V + 15495) - 0x1105, 0x1164, 0x11ae, 0, -#undef V4132 -#define V4132 (V + 15499) - 0x1105, 0x1164, 0x11af, 0, -#undef V4133 -#define V4133 (V + 15503) - 0x1105, 0x1164, 0x11b0, 0, -#undef V4134 -#define V4134 (V + 15507) - 0x1105, 0x1164, 0x11b1, 0, -#undef V4135 -#define V4135 (V + 15511) - 0x1105, 0x1164, 0x11b2, 0, -#undef V4136 -#define V4136 (V + 15515) - 0x1105, 0x1164, 0x11b3, 0, -#undef V4137 -#define V4137 (V + 15519) - 0x1105, 0x1164, 0x11b4, 0, -#undef V4138 -#define V4138 (V + 15523) - 0x1105, 0x1164, 0x11b5, 0, -#undef V4139 -#define V4139 (V + 15527) - 0x1105, 0x1164, 0x11b6, 0, -#undef V4140 -#define V4140 (V + 15531) - 0x1105, 0x1164, 0x11b7, 0, -#undef V4141 -#define V4141 (V + 15535) - 0x1105, 0x1164, 0x11b8, 0, -#undef V4142 -#define V4142 (V + 15539) - 0x1105, 0x1164, 0x11b9, 0, -#undef V4143 -#define V4143 (V + 15543) - 0x1105, 0x1164, 0x11ba, 0, -#undef V4144 -#define V4144 (V + 15547) - 0x1105, 0x1164, 0x11bb, 0, -#undef V4145 -#define V4145 (V + 15551) - 0x1105, 0x1164, 0x11bc, 0, -#undef V4146 -#define V4146 (V + 15555) - 0x1105, 0x1164, 0x11bd, 0, -#undef V4147 -#define V4147 (V + 15559) - 0x1105, 0x1164, 0x11be, 0, -#undef V4148 -#define V4148 (V + 15563) - 0x1105, 0x1164, 0x11bf, 0, -#undef V4149 -#define V4149 (V + 15567) - 0x1105, 0x1164, 0x11c0, 0, -#undef V4150 -#define V4150 (V + 15571) - 0x1105, 0x1164, 0x11c1, 0, -#undef V4151 -#define V4151 (V + 15575) - 0x1105, 0x1164, 0x11c2, 0, -#undef V4152 -#define V4152 (V + 15579) - 0x1105, 0x1165, 0, -#undef V4153 -#define V4153 (V + 15582) - 0x1105, 0x1165, 0x11a8, 0, -#undef V4154 -#define V4154 (V + 15586) - 0x1105, 0x1165, 0x11a9, 0, -#undef V4155 -#define V4155 (V + 15590) - 0x1105, 0x1165, 0x11aa, 0, -#undef V4156 -#define V4156 (V + 15594) - 0x1105, 0x1165, 0x11ab, 0, -#undef V4157 -#define V4157 (V + 15598) - 0x1105, 0x1165, 0x11ac, 0, -#undef V4158 -#define V4158 (V + 15602) - 0x1105, 0x1165, 0x11ad, 0, -#undef V4159 -#define V4159 (V + 15606) - 0x1105, 0x1165, 0x11ae, 0, -#undef V4160 -#define V4160 (V + 15610) - 0x1105, 0x1165, 0x11af, 0, -#undef V4161 -#define V4161 (V + 15614) - 0x1105, 0x1165, 0x11b0, 0, -#undef V4162 -#define V4162 (V + 15618) - 0x1105, 0x1165, 0x11b1, 0, -#undef V4163 -#define V4163 (V + 15622) - 0x1105, 0x1165, 0x11b2, 0, -#undef V4164 -#define V4164 (V + 15626) - 0x1105, 0x1165, 0x11b3, 0, -#undef V4165 -#define V4165 (V + 15630) - 0x1105, 0x1165, 0x11b4, 0, -#undef V4166 -#define V4166 (V + 15634) - 0x1105, 0x1165, 0x11b5, 0, -#undef V4167 -#define V4167 (V + 15638) - 0x1105, 0x1165, 0x11b6, 0, -#undef V4168 -#define V4168 (V + 15642) - 0x1105, 0x1165, 0x11b7, 0, -#undef V4169 -#define V4169 (V + 15646) - 0x1105, 0x1165, 0x11b8, 0, -#undef V4170 -#define V4170 (V + 15650) - 0x1105, 0x1165, 0x11b9, 0, -#undef V4171 -#define V4171 (V + 15654) - 0x1105, 0x1165, 0x11ba, 0, -#undef V4172 -#define V4172 (V + 15658) - 0x1105, 0x1165, 0x11bb, 0, -#undef V4173 -#define V4173 (V + 15662) - 0x1105, 0x1165, 0x11bc, 0, -#undef V4174 -#define V4174 (V + 15666) - 0x1105, 0x1165, 0x11bd, 0, -#undef V4175 -#define V4175 (V + 15670) - 0x1105, 0x1165, 0x11be, 0, -#undef V4176 -#define V4176 (V + 15674) - 0x1105, 0x1165, 0x11bf, 0, -#undef V4177 -#define V4177 (V + 15678) - 0x1105, 0x1165, 0x11c0, 0, -#undef V4178 -#define V4178 (V + 15682) - 0x1105, 0x1165, 0x11c1, 0, -#undef V4179 -#define V4179 (V + 15686) - 0x1105, 0x1165, 0x11c2, 0, -#undef V4180 -#define V4180 (V + 15690) - 0x1105, 0x1166, 0, -#undef V4181 -#define V4181 (V + 15693) - 0x1105, 0x1166, 0x11a8, 0, -#undef V4182 -#define V4182 (V + 15697) - 0x1105, 0x1166, 0x11a9, 0, -#undef V4183 -#define V4183 (V + 15701) - 0x1105, 0x1166, 0x11aa, 0, -#undef V4184 -#define V4184 (V + 15705) - 0x1105, 0x1166, 0x11ab, 0, -#undef V4185 -#define V4185 (V + 15709) - 0x1105, 0x1166, 0x11ac, 0, -#undef V4186 -#define V4186 (V + 15713) - 0x1105, 0x1166, 0x11ad, 0, -#undef V4187 -#define V4187 (V + 15717) - 0x1105, 0x1166, 0x11ae, 0, -#undef V4188 -#define V4188 (V + 15721) - 0x1105, 0x1166, 0x11af, 0, -#undef V4189 -#define V4189 (V + 15725) - 0x1105, 0x1166, 0x11b0, 0, -#undef V4190 -#define V4190 (V + 15729) - 0x1105, 0x1166, 0x11b1, 0, -#undef V4191 -#define V4191 (V + 15733) - 0x1105, 0x1166, 0x11b2, 0, -#undef V4192 -#define V4192 (V + 15737) - 0x1105, 0x1166, 0x11b3, 0, -#undef V4193 -#define V4193 (V + 15741) - 0x1105, 0x1166, 0x11b4, 0, -#undef V4194 -#define V4194 (V + 15745) - 0x1105, 0x1166, 0x11b5, 0, -#undef V4195 -#define V4195 (V + 15749) - 0x1105, 0x1166, 0x11b6, 0, -#undef V4196 -#define V4196 (V + 15753) - 0x1105, 0x1166, 0x11b7, 0, -#undef V4197 -#define V4197 (V + 15757) - 0x1105, 0x1166, 0x11b8, 0, -#undef V4198 -#define V4198 (V + 15761) - 0x1105, 0x1166, 0x11b9, 0, -#undef V4199 -#define V4199 (V + 15765) - 0x1105, 0x1166, 0x11ba, 0, -#undef V4200 -#define V4200 (V + 15769) - 0x1105, 0x1166, 0x11bb, 0, -#undef V4201 -#define V4201 (V + 15773) - 0x1105, 0x1166, 0x11bc, 0, -#undef V4202 -#define V4202 (V + 15777) - 0x1105, 0x1166, 0x11bd, 0, -#undef V4203 -#define V4203 (V + 15781) - 0x1105, 0x1166, 0x11be, 0, -#undef V4204 -#define V4204 (V + 15785) - 0x1105, 0x1166, 0x11bf, 0, -#undef V4205 -#define V4205 (V + 15789) - 0x1105, 0x1166, 0x11c0, 0, -#undef V4206 -#define V4206 (V + 15793) - 0x1105, 0x1166, 0x11c1, 0, -#undef V4207 -#define V4207 (V + 15797) - 0x1105, 0x1166, 0x11c2, 0, -#undef V4208 -#define V4208 (V + 15801) - 0x1105, 0x1167, 0, -#undef V4209 -#define V4209 (V + 15804) - 0x1105, 0x1167, 0x11a8, 0, -#undef V4210 -#define V4210 (V + 15808) - 0x1105, 0x1167, 0x11a9, 0, -#undef V4211 -#define V4211 (V + 15812) - 0x1105, 0x1167, 0x11aa, 0, -#undef V4212 -#define V4212 (V + 15816) - 0x1105, 0x1167, 0x11ab, 0, -#undef V4213 -#define V4213 (V + 15820) - 0x1105, 0x1167, 0x11ac, 0, -#undef V4214 -#define V4214 (V + 15824) - 0x1105, 0x1167, 0x11ad, 0, -#undef V4215 -#define V4215 (V + 15828) - 0x1105, 0x1167, 0x11ae, 0, -#undef V4216 -#define V4216 (V + 15832) - 0x1105, 0x1167, 0x11af, 0, -#undef V4217 -#define V4217 (V + 15836) - 0x1105, 0x1167, 0x11b0, 0, -#undef V4218 -#define V4218 (V + 15840) - 0x1105, 0x1167, 0x11b1, 0, -#undef V4219 -#define V4219 (V + 15844) - 0x1105, 0x1167, 0x11b2, 0, -#undef V4220 -#define V4220 (V + 15848) - 0x1105, 0x1167, 0x11b3, 0, -#undef V4221 -#define V4221 (V + 15852) - 0x1105, 0x1167, 0x11b4, 0, -#undef V4222 -#define V4222 (V + 15856) - 0x1105, 0x1167, 0x11b5, 0, -#undef V4223 -#define V4223 (V + 15860) - 0x1105, 0x1167, 0x11b6, 0, -#undef V4224 -#define V4224 (V + 15864) - 0x1105, 0x1167, 0x11b7, 0, -#undef V4225 -#define V4225 (V + 15868) - 0x1105, 0x1167, 0x11b8, 0, -#undef V4226 -#define V4226 (V + 15872) - 0x1105, 0x1167, 0x11b9, 0, -#undef V4227 -#define V4227 (V + 15876) - 0x1105, 0x1167, 0x11ba, 0, -#undef V4228 -#define V4228 (V + 15880) - 0x1105, 0x1167, 0x11bb, 0, -#undef V4229 -#define V4229 (V + 15884) - 0x1105, 0x1167, 0x11bc, 0, -#undef V4230 -#define V4230 (V + 15888) - 0x1105, 0x1167, 0x11bd, 0, -#undef V4231 -#define V4231 (V + 15892) - 0x1105, 0x1167, 0x11be, 0, -#undef V4232 -#define V4232 (V + 15896) - 0x1105, 0x1167, 0x11bf, 0, -#undef V4233 -#define V4233 (V + 15900) - 0x1105, 0x1167, 0x11c0, 0, -#undef V4234 -#define V4234 (V + 15904) - 0x1105, 0x1167, 0x11c1, 0, -#undef V4235 -#define V4235 (V + 15908) - 0x1105, 0x1167, 0x11c2, 0, -#undef V4236 -#define V4236 (V + 15912) - 0x1105, 0x1168, 0, -#undef V4237 -#define V4237 (V + 15915) - 0x1105, 0x1168, 0x11a8, 0, -#undef V4238 -#define V4238 (V + 15919) - 0x1105, 0x1168, 0x11a9, 0, -#undef V4239 -#define V4239 (V + 15923) - 0x1105, 0x1168, 0x11aa, 0, -#undef V4240 -#define V4240 (V + 15927) - 0x1105, 0x1168, 0x11ab, 0, -#undef V4241 -#define V4241 (V + 15931) - 0x1105, 0x1168, 0x11ac, 0, -#undef V4242 -#define V4242 (V + 15935) - 0x1105, 0x1168, 0x11ad, 0, -#undef V4243 -#define V4243 (V + 15939) - 0x1105, 0x1168, 0x11ae, 0, -#undef V4244 -#define V4244 (V + 15943) - 0x1105, 0x1168, 0x11af, 0, -#undef V4245 -#define V4245 (V + 15947) - 0x1105, 0x1168, 0x11b0, 0, -#undef V4246 -#define V4246 (V + 15951) - 0x1105, 0x1168, 0x11b1, 0, -#undef V4247 -#define V4247 (V + 15955) - 0x1105, 0x1168, 0x11b2, 0, -#undef V4248 -#define V4248 (V + 15959) - 0x1105, 0x1168, 0x11b3, 0, -#undef V4249 -#define V4249 (V + 15963) - 0x1105, 0x1168, 0x11b4, 0, -#undef V4250 -#define V4250 (V + 15967) - 0x1105, 0x1168, 0x11b5, 0, -#undef V4251 -#define V4251 (V + 15971) - 0x1105, 0x1168, 0x11b6, 0, -#undef V4252 -#define V4252 (V + 15975) - 0x1105, 0x1168, 0x11b7, 0, -#undef V4253 -#define V4253 (V + 15979) - 0x1105, 0x1168, 0x11b8, 0, -#undef V4254 -#define V4254 (V + 15983) - 0x1105, 0x1168, 0x11b9, 0, -#undef V4255 -#define V4255 (V + 15987) - 0x1105, 0x1168, 0x11ba, 0, -#undef V4256 -#define V4256 (V + 15991) - 0x1105, 0x1168, 0x11bb, 0, -#undef V4257 -#define V4257 (V + 15995) - 0x1105, 0x1168, 0x11bc, 0, -#undef V4258 -#define V4258 (V + 15999) - 0x1105, 0x1168, 0x11bd, 0, -#undef V4259 -#define V4259 (V + 16003) - 0x1105, 0x1168, 0x11be, 0, -#undef V4260 -#define V4260 (V + 16007) - 0x1105, 0x1168, 0x11bf, 0, -#undef V4261 -#define V4261 (V + 16011) - 0x1105, 0x1168, 0x11c0, 0, -#undef V4262 -#define V4262 (V + 16015) - 0x1105, 0x1168, 0x11c1, 0, -#undef V4263 -#define V4263 (V + 16019) - 0x1105, 0x1168, 0x11c2, 0, -#undef V4264 -#define V4264 (V + 16023) - 0x1105, 0x1169, 0, -#undef V4265 -#define V4265 (V + 16026) - 0x1105, 0x1169, 0x11a8, 0, -#undef V4266 -#define V4266 (V + 16030) - 0x1105, 0x1169, 0x11a9, 0, -#undef V4267 -#define V4267 (V + 16034) - 0x1105, 0x1169, 0x11aa, 0, -#undef V4268 -#define V4268 (V + 16038) - 0x1105, 0x1169, 0x11ab, 0, -#undef V4269 -#define V4269 (V + 16042) - 0x1105, 0x1169, 0x11ac, 0, -#undef V4270 -#define V4270 (V + 16046) - 0x1105, 0x1169, 0x11ad, 0, -#undef V4271 -#define V4271 (V + 16050) - 0x1105, 0x1169, 0x11ae, 0, -#undef V4272 -#define V4272 (V + 16054) - 0x1105, 0x1169, 0x11af, 0, -#undef V4273 -#define V4273 (V + 16058) - 0x1105, 0x1169, 0x11b0, 0, -#undef V4274 -#define V4274 (V + 16062) - 0x1105, 0x1169, 0x11b1, 0, -#undef V4275 -#define V4275 (V + 16066) - 0x1105, 0x1169, 0x11b2, 0, -#undef V4276 -#define V4276 (V + 16070) - 0x1105, 0x1169, 0x11b3, 0, -#undef V4277 -#define V4277 (V + 16074) - 0x1105, 0x1169, 0x11b4, 0, -#undef V4278 -#define V4278 (V + 16078) - 0x1105, 0x1169, 0x11b5, 0, -#undef V4279 -#define V4279 (V + 16082) - 0x1105, 0x1169, 0x11b6, 0, -#undef V4280 -#define V4280 (V + 16086) - 0x1105, 0x1169, 0x11b7, 0, -#undef V4281 -#define V4281 (V + 16090) - 0x1105, 0x1169, 0x11b8, 0, -#undef V4282 -#define V4282 (V + 16094) - 0x1105, 0x1169, 0x11b9, 0, -#undef V4283 -#define V4283 (V + 16098) - 0x1105, 0x1169, 0x11ba, 0, -#undef V4284 -#define V4284 (V + 16102) - 0x1105, 0x1169, 0x11bb, 0, -#undef V4285 -#define V4285 (V + 16106) - 0x1105, 0x1169, 0x11bc, 0, -#undef V4286 -#define V4286 (V + 16110) - 0x1105, 0x1169, 0x11bd, 0, -#undef V4287 -#define V4287 (V + 16114) - 0x1105, 0x1169, 0x11be, 0, -#undef V4288 -#define V4288 (V + 16118) - 0x1105, 0x1169, 0x11bf, 0, -#undef V4289 -#define V4289 (V + 16122) - 0x1105, 0x1169, 0x11c0, 0, -#undef V4290 -#define V4290 (V + 16126) - 0x1105, 0x1169, 0x11c1, 0, -#undef V4291 -#define V4291 (V + 16130) - 0x1105, 0x1169, 0x11c2, 0, -#undef V4292 -#define V4292 (V + 16134) - 0x1105, 0x116a, 0, -#undef V4293 -#define V4293 (V + 16137) - 0x1105, 0x116a, 0x11a8, 0, -#undef V4294 -#define V4294 (V + 16141) - 0x1105, 0x116a, 0x11a9, 0, -#undef V4295 -#define V4295 (V + 16145) - 0x1105, 0x116a, 0x11aa, 0, -#undef V4296 -#define V4296 (V + 16149) - 0x1105, 0x116a, 0x11ab, 0, -#undef V4297 -#define V4297 (V + 16153) - 0x1105, 0x116a, 0x11ac, 0, -#undef V4298 -#define V4298 (V + 16157) - 0x1105, 0x116a, 0x11ad, 0, -#undef V4299 -#define V4299 (V + 16161) - 0x1105, 0x116a, 0x11ae, 0, -#undef V4300 -#define V4300 (V + 16165) - 0x1105, 0x116a, 0x11af, 0, -#undef V4301 -#define V4301 (V + 16169) - 0x1105, 0x116a, 0x11b0, 0, -#undef V4302 -#define V4302 (V + 16173) - 0x1105, 0x116a, 0x11b1, 0, -#undef V4303 -#define V4303 (V + 16177) - 0x1105, 0x116a, 0x11b2, 0, -#undef V4304 -#define V4304 (V + 16181) - 0x1105, 0x116a, 0x11b3, 0, -#undef V4305 -#define V4305 (V + 16185) - 0x1105, 0x116a, 0x11b4, 0, -#undef V4306 -#define V4306 (V + 16189) - 0x1105, 0x116a, 0x11b5, 0, -#undef V4307 -#define V4307 (V + 16193) - 0x1105, 0x116a, 0x11b6, 0, -#undef V4308 -#define V4308 (V + 16197) - 0x1105, 0x116a, 0x11b7, 0, -#undef V4309 -#define V4309 (V + 16201) - 0x1105, 0x116a, 0x11b8, 0, -#undef V4310 -#define V4310 (V + 16205) - 0x1105, 0x116a, 0x11b9, 0, -#undef V4311 -#define V4311 (V + 16209) - 0x1105, 0x116a, 0x11ba, 0, -#undef V4312 -#define V4312 (V + 16213) - 0x1105, 0x116a, 0x11bb, 0, -#undef V4313 -#define V4313 (V + 16217) - 0x1105, 0x116a, 0x11bc, 0, -#undef V4314 -#define V4314 (V + 16221) - 0x1105, 0x116a, 0x11bd, 0, -#undef V4315 -#define V4315 (V + 16225) - 0x1105, 0x116a, 0x11be, 0, -#undef V4316 -#define V4316 (V + 16229) - 0x1105, 0x116a, 0x11bf, 0, -#undef V4317 -#define V4317 (V + 16233) - 0x1105, 0x116a, 0x11c0, 0, -#undef V4318 -#define V4318 (V + 16237) - 0x1105, 0x116a, 0x11c1, 0, -#undef V4319 -#define V4319 (V + 16241) - 0x1105, 0x116a, 0x11c2, 0, -#undef V4320 -#define V4320 (V + 16245) - 0x1105, 0x116b, 0, -#undef V4321 -#define V4321 (V + 16248) - 0x1105, 0x116b, 0x11a8, 0, -#undef V4322 -#define V4322 (V + 16252) - 0x1105, 0x116b, 0x11a9, 0, -#undef V4323 -#define V4323 (V + 16256) - 0x1105, 0x116b, 0x11aa, 0, -#undef V4324 -#define V4324 (V + 16260) - 0x1105, 0x116b, 0x11ab, 0, -#undef V4325 -#define V4325 (V + 16264) - 0x1105, 0x116b, 0x11ac, 0, -#undef V4326 -#define V4326 (V + 16268) - 0x1105, 0x116b, 0x11ad, 0, -#undef V4327 -#define V4327 (V + 16272) - 0x1105, 0x116b, 0x11ae, 0, -#undef V4328 -#define V4328 (V + 16276) - 0x1105, 0x116b, 0x11af, 0, -#undef V4329 -#define V4329 (V + 16280) - 0x1105, 0x116b, 0x11b0, 0, -#undef V4330 -#define V4330 (V + 16284) - 0x1105, 0x116b, 0x11b1, 0, -#undef V4331 -#define V4331 (V + 16288) - 0x1105, 0x116b, 0x11b2, 0, -#undef V4332 -#define V4332 (V + 16292) - 0x1105, 0x116b, 0x11b3, 0, -#undef V4333 -#define V4333 (V + 16296) - 0x1105, 0x116b, 0x11b4, 0, -#undef V4334 -#define V4334 (V + 16300) - 0x1105, 0x116b, 0x11b5, 0, -#undef V4335 -#define V4335 (V + 16304) - 0x1105, 0x116b, 0x11b6, 0, -#undef V4336 -#define V4336 (V + 16308) - 0x1105, 0x116b, 0x11b7, 0, -#undef V4337 -#define V4337 (V + 16312) - 0x1105, 0x116b, 0x11b8, 0, -#undef V4338 -#define V4338 (V + 16316) - 0x1105, 0x116b, 0x11b9, 0, -#undef V4339 -#define V4339 (V + 16320) - 0x1105, 0x116b, 0x11ba, 0, -#undef V4340 -#define V4340 (V + 16324) - 0x1105, 0x116b, 0x11bb, 0, -#undef V4341 -#define V4341 (V + 16328) - 0x1105, 0x116b, 0x11bc, 0, -#undef V4342 -#define V4342 (V + 16332) - 0x1105, 0x116b, 0x11bd, 0, -#undef V4343 -#define V4343 (V + 16336) - 0x1105, 0x116b, 0x11be, 0, -#undef V4344 -#define V4344 (V + 16340) - 0x1105, 0x116b, 0x11bf, 0, -#undef V4345 -#define V4345 (V + 16344) - 0x1105, 0x116b, 0x11c0, 0, -#undef V4346 -#define V4346 (V + 16348) - 0x1105, 0x116b, 0x11c1, 0, -#undef V4347 -#define V4347 (V + 16352) - 0x1105, 0x116b, 0x11c2, 0, -#undef V4348 -#define V4348 (V + 16356) - 0x1105, 0x116c, 0, -#undef V4349 -#define V4349 (V + 16359) - 0x1105, 0x116c, 0x11a8, 0, -#undef V4350 -#define V4350 (V + 16363) - 0x1105, 0x116c, 0x11a9, 0, -#undef V4351 -#define V4351 (V + 16367) - 0x1105, 0x116c, 0x11aa, 0, -#undef V4352 -#define V4352 (V + 16371) - 0x1105, 0x116c, 0x11ab, 0, -#undef V4353 -#define V4353 (V + 16375) - 0x1105, 0x116c, 0x11ac, 0, -#undef V4354 -#define V4354 (V + 16379) - 0x1105, 0x116c, 0x11ad, 0, -#undef V4355 -#define V4355 (V + 16383) - 0x1105, 0x116c, 0x11ae, 0, -#undef V4356 -#define V4356 (V + 16387) - 0x1105, 0x116c, 0x11af, 0, -#undef V4357 -#define V4357 (V + 16391) - 0x1105, 0x116c, 0x11b0, 0, -#undef V4358 -#define V4358 (V + 16395) - 0x1105, 0x116c, 0x11b1, 0, -#undef V4359 -#define V4359 (V + 16399) - 0x1105, 0x116c, 0x11b2, 0, -#undef V4360 -#define V4360 (V + 16403) - 0x1105, 0x116c, 0x11b3, 0, -#undef V4361 -#define V4361 (V + 16407) - 0x1105, 0x116c, 0x11b4, 0, -#undef V4362 -#define V4362 (V + 16411) - 0x1105, 0x116c, 0x11b5, 0, -#undef V4363 -#define V4363 (V + 16415) - 0x1105, 0x116c, 0x11b6, 0, -#undef V4364 -#define V4364 (V + 16419) - 0x1105, 0x116c, 0x11b7, 0, -#undef V4365 -#define V4365 (V + 16423) - 0x1105, 0x116c, 0x11b8, 0, -#undef V4366 -#define V4366 (V + 16427) - 0x1105, 0x116c, 0x11b9, 0, -#undef V4367 -#define V4367 (V + 16431) - 0x1105, 0x116c, 0x11ba, 0, -#undef V4368 -#define V4368 (V + 16435) - 0x1105, 0x116c, 0x11bb, 0, -#undef V4369 -#define V4369 (V + 16439) - 0x1105, 0x116c, 0x11bc, 0, -#undef V4370 -#define V4370 (V + 16443) - 0x1105, 0x116c, 0x11bd, 0, -#undef V4371 -#define V4371 (V + 16447) - 0x1105, 0x116c, 0x11be, 0, -#undef V4372 -#define V4372 (V + 16451) - 0x1105, 0x116c, 0x11bf, 0, -#undef V4373 -#define V4373 (V + 16455) - 0x1105, 0x116c, 0x11c0, 0, -#undef V4374 -#define V4374 (V + 16459) - 0x1105, 0x116c, 0x11c1, 0, -#undef V4375 -#define V4375 (V + 16463) - 0x1105, 0x116c, 0x11c2, 0, -#undef V4376 -#define V4376 (V + 16467) - 0x1105, 0x116d, 0, -#undef V4377 -#define V4377 (V + 16470) - 0x1105, 0x116d, 0x11a8, 0, -#undef V4378 -#define V4378 (V + 16474) - 0x1105, 0x116d, 0x11a9, 0, -#undef V4379 -#define V4379 (V + 16478) - 0x1105, 0x116d, 0x11aa, 0, -#undef V4380 -#define V4380 (V + 16482) - 0x1105, 0x116d, 0x11ab, 0, -#undef V4381 -#define V4381 (V + 16486) - 0x1105, 0x116d, 0x11ac, 0, -#undef V4382 -#define V4382 (V + 16490) - 0x1105, 0x116d, 0x11ad, 0, -#undef V4383 -#define V4383 (V + 16494) - 0x1105, 0x116d, 0x11ae, 0, -#undef V4384 -#define V4384 (V + 16498) - 0x1105, 0x116d, 0x11af, 0, -#undef V4385 -#define V4385 (V + 16502) - 0x1105, 0x116d, 0x11b0, 0, -#undef V4386 -#define V4386 (V + 16506) - 0x1105, 0x116d, 0x11b1, 0, -#undef V4387 -#define V4387 (V + 16510) - 0x1105, 0x116d, 0x11b2, 0, -#undef V4388 -#define V4388 (V + 16514) - 0x1105, 0x116d, 0x11b3, 0, -#undef V4389 -#define V4389 (V + 16518) - 0x1105, 0x116d, 0x11b4, 0, -#undef V4390 -#define V4390 (V + 16522) - 0x1105, 0x116d, 0x11b5, 0, -#undef V4391 -#define V4391 (V + 16526) - 0x1105, 0x116d, 0x11b6, 0, -#undef V4392 -#define V4392 (V + 16530) - 0x1105, 0x116d, 0x11b7, 0, -#undef V4393 -#define V4393 (V + 16534) - 0x1105, 0x116d, 0x11b8, 0, -#undef V4394 -#define V4394 (V + 16538) - 0x1105, 0x116d, 0x11b9, 0, -#undef V4395 -#define V4395 (V + 16542) - 0x1105, 0x116d, 0x11ba, 0, -#undef V4396 -#define V4396 (V + 16546) - 0x1105, 0x116d, 0x11bb, 0, -#undef V4397 -#define V4397 (V + 16550) - 0x1105, 0x116d, 0x11bc, 0, -#undef V4398 -#define V4398 (V + 16554) - 0x1105, 0x116d, 0x11bd, 0, -#undef V4399 -#define V4399 (V + 16558) - 0x1105, 0x116d, 0x11be, 0, -#undef V4400 -#define V4400 (V + 16562) - 0x1105, 0x116d, 0x11bf, 0, -#undef V4401 -#define V4401 (V + 16566) - 0x1105, 0x116d, 0x11c0, 0, -#undef V4402 -#define V4402 (V + 16570) - 0x1105, 0x116d, 0x11c1, 0, -#undef V4403 -#define V4403 (V + 16574) - 0x1105, 0x116d, 0x11c2, 0, -#undef V4404 -#define V4404 (V + 16578) - 0x1105, 0x116e, 0, -#undef V4405 -#define V4405 (V + 16581) - 0x1105, 0x116e, 0x11a8, 0, -#undef V4406 -#define V4406 (V + 16585) - 0x1105, 0x116e, 0x11a9, 0, -#undef V4407 -#define V4407 (V + 16589) - 0x1105, 0x116e, 0x11aa, 0, -#undef V4408 -#define V4408 (V + 16593) - 0x1105, 0x116e, 0x11ab, 0, -#undef V4409 -#define V4409 (V + 16597) - 0x1105, 0x116e, 0x11ac, 0, -#undef V4410 -#define V4410 (V + 16601) - 0x1105, 0x116e, 0x11ad, 0, -#undef V4411 -#define V4411 (V + 16605) - 0x1105, 0x116e, 0x11ae, 0, -#undef V4412 -#define V4412 (V + 16609) - 0x1105, 0x116e, 0x11af, 0, -#undef V4413 -#define V4413 (V + 16613) - 0x1105, 0x116e, 0x11b0, 0, -#undef V4414 -#define V4414 (V + 16617) - 0x1105, 0x116e, 0x11b1, 0, -#undef V4415 -#define V4415 (V + 16621) - 0x1105, 0x116e, 0x11b2, 0, -#undef V4416 -#define V4416 (V + 16625) - 0x1105, 0x116e, 0x11b3, 0, -#undef V4417 -#define V4417 (V + 16629) - 0x1105, 0x116e, 0x11b4, 0, -#undef V4418 -#define V4418 (V + 16633) - 0x1105, 0x116e, 0x11b5, 0, -#undef V4419 -#define V4419 (V + 16637) - 0x1105, 0x116e, 0x11b6, 0, -#undef V4420 -#define V4420 (V + 16641) - 0x1105, 0x116e, 0x11b7, 0, -#undef V4421 -#define V4421 (V + 16645) - 0x1105, 0x116e, 0x11b8, 0, -#undef V4422 -#define V4422 (V + 16649) - 0x1105, 0x116e, 0x11b9, 0, -#undef V4423 -#define V4423 (V + 16653) - 0x1105, 0x116e, 0x11ba, 0, -#undef V4424 -#define V4424 (V + 16657) - 0x1105, 0x116e, 0x11bb, 0, -#undef V4425 -#define V4425 (V + 16661) - 0x1105, 0x116e, 0x11bc, 0, -#undef V4426 -#define V4426 (V + 16665) - 0x1105, 0x116e, 0x11bd, 0, -#undef V4427 -#define V4427 (V + 16669) - 0x1105, 0x116e, 0x11be, 0, -#undef V4428 -#define V4428 (V + 16673) - 0x1105, 0x116e, 0x11bf, 0, -#undef V4429 -#define V4429 (V + 16677) - 0x1105, 0x116e, 0x11c0, 0, -#undef V4430 -#define V4430 (V + 16681) - 0x1105, 0x116e, 0x11c1, 0, -#undef V4431 -#define V4431 (V + 16685) - 0x1105, 0x116e, 0x11c2, 0, -#undef V4432 -#define V4432 (V + 16689) - 0x1105, 0x116f, 0, -#undef V4433 -#define V4433 (V + 16692) - 0x1105, 0x116f, 0x11a8, 0, -#undef V4434 -#define V4434 (V + 16696) - 0x1105, 0x116f, 0x11a9, 0, -#undef V4435 -#define V4435 (V + 16700) - 0x1105, 0x116f, 0x11aa, 0, -#undef V4436 -#define V4436 (V + 16704) - 0x1105, 0x116f, 0x11ab, 0, -#undef V4437 -#define V4437 (V + 16708) - 0x1105, 0x116f, 0x11ac, 0, -#undef V4438 -#define V4438 (V + 16712) - 0x1105, 0x116f, 0x11ad, 0, -#undef V4439 -#define V4439 (V + 16716) - 0x1105, 0x116f, 0x11ae, 0, -#undef V4440 -#define V4440 (V + 16720) - 0x1105, 0x116f, 0x11af, 0, -#undef V4441 -#define V4441 (V + 16724) - 0x1105, 0x116f, 0x11b0, 0, -#undef V4442 -#define V4442 (V + 16728) - 0x1105, 0x116f, 0x11b1, 0, -#undef V4443 -#define V4443 (V + 16732) - 0x1105, 0x116f, 0x11b2, 0, -#undef V4444 -#define V4444 (V + 16736) - 0x1105, 0x116f, 0x11b3, 0, -#undef V4445 -#define V4445 (V + 16740) - 0x1105, 0x116f, 0x11b4, 0, -#undef V4446 -#define V4446 (V + 16744) - 0x1105, 0x116f, 0x11b5, 0, -#undef V4447 -#define V4447 (V + 16748) - 0x1105, 0x116f, 0x11b6, 0, -#undef V4448 -#define V4448 (V + 16752) - 0x1105, 0x116f, 0x11b7, 0, -#undef V4449 -#define V4449 (V + 16756) - 0x1105, 0x116f, 0x11b8, 0, -#undef V4450 -#define V4450 (V + 16760) - 0x1105, 0x116f, 0x11b9, 0, -#undef V4451 -#define V4451 (V + 16764) - 0x1105, 0x116f, 0x11ba, 0, -#undef V4452 -#define V4452 (V + 16768) - 0x1105, 0x116f, 0x11bb, 0, -#undef V4453 -#define V4453 (V + 16772) - 0x1105, 0x116f, 0x11bc, 0, -#undef V4454 -#define V4454 (V + 16776) - 0x1105, 0x116f, 0x11bd, 0, -#undef V4455 -#define V4455 (V + 16780) - 0x1105, 0x116f, 0x11be, 0, -#undef V4456 -#define V4456 (V + 16784) - 0x1105, 0x116f, 0x11bf, 0, -#undef V4457 -#define V4457 (V + 16788) - 0x1105, 0x116f, 0x11c0, 0, -#undef V4458 -#define V4458 (V + 16792) - 0x1105, 0x116f, 0x11c1, 0, -#undef V4459 -#define V4459 (V + 16796) - 0x1105, 0x116f, 0x11c2, 0, -#undef V4460 -#define V4460 (V + 16800) - 0x1105, 0x1170, 0, -#undef V4461 -#define V4461 (V + 16803) - 0x1105, 0x1170, 0x11a8, 0, -#undef V4462 -#define V4462 (V + 16807) - 0x1105, 0x1170, 0x11a9, 0, -#undef V4463 -#define V4463 (V + 16811) - 0x1105, 0x1170, 0x11aa, 0, -#undef V4464 -#define V4464 (V + 16815) - 0x1105, 0x1170, 0x11ab, 0, -#undef V4465 -#define V4465 (V + 16819) - 0x1105, 0x1170, 0x11ac, 0, -#undef V4466 -#define V4466 (V + 16823) - 0x1105, 0x1170, 0x11ad, 0, -#undef V4467 -#define V4467 (V + 16827) - 0x1105, 0x1170, 0x11ae, 0, -#undef V4468 -#define V4468 (V + 16831) - 0x1105, 0x1170, 0x11af, 0, -#undef V4469 -#define V4469 (V + 16835) - 0x1105, 0x1170, 0x11b0, 0, -#undef V4470 -#define V4470 (V + 16839) - 0x1105, 0x1170, 0x11b1, 0, -#undef V4471 -#define V4471 (V + 16843) - 0x1105, 0x1170, 0x11b2, 0, -#undef V4472 -#define V4472 (V + 16847) - 0x1105, 0x1170, 0x11b3, 0, -#undef V4473 -#define V4473 (V + 16851) - 0x1105, 0x1170, 0x11b4, 0, -#undef V4474 -#define V4474 (V + 16855) - 0x1105, 0x1170, 0x11b5, 0, -#undef V4475 -#define V4475 (V + 16859) - 0x1105, 0x1170, 0x11b6, 0, -#undef V4476 -#define V4476 (V + 16863) - 0x1105, 0x1170, 0x11b7, 0, -#undef V4477 -#define V4477 (V + 16867) - 0x1105, 0x1170, 0x11b8, 0, -#undef V4478 -#define V4478 (V + 16871) - 0x1105, 0x1170, 0x11b9, 0, -#undef V4479 -#define V4479 (V + 16875) - 0x1105, 0x1170, 0x11ba, 0, -#undef V4480 -#define V4480 (V + 16879) - 0x1105, 0x1170, 0x11bb, 0, -#undef V4481 -#define V4481 (V + 16883) - 0x1105, 0x1170, 0x11bc, 0, -#undef V4482 -#define V4482 (V + 16887) - 0x1105, 0x1170, 0x11bd, 0, -#undef V4483 -#define V4483 (V + 16891) - 0x1105, 0x1170, 0x11be, 0, -#undef V4484 -#define V4484 (V + 16895) - 0x1105, 0x1170, 0x11bf, 0, -#undef V4485 -#define V4485 (V + 16899) - 0x1105, 0x1170, 0x11c0, 0, -#undef V4486 -#define V4486 (V + 16903) - 0x1105, 0x1170, 0x11c1, 0, -#undef V4487 -#define V4487 (V + 16907) - 0x1105, 0x1170, 0x11c2, 0, -#undef V4488 -#define V4488 (V + 16911) - 0x1105, 0x1171, 0, -#undef V4489 -#define V4489 (V + 16914) - 0x1105, 0x1171, 0x11a8, 0, -#undef V4490 -#define V4490 (V + 16918) - 0x1105, 0x1171, 0x11a9, 0, -#undef V4491 -#define V4491 (V + 16922) - 0x1105, 0x1171, 0x11aa, 0, -#undef V4492 -#define V4492 (V + 16926) - 0x1105, 0x1171, 0x11ab, 0, -#undef V4493 -#define V4493 (V + 16930) - 0x1105, 0x1171, 0x11ac, 0, -#undef V4494 -#define V4494 (V + 16934) - 0x1105, 0x1171, 0x11ad, 0, -#undef V4495 -#define V4495 (V + 16938) - 0x1105, 0x1171, 0x11ae, 0, -#undef V4496 -#define V4496 (V + 16942) - 0x1105, 0x1171, 0x11af, 0, -#undef V4497 -#define V4497 (V + 16946) - 0x1105, 0x1171, 0x11b0, 0, -#undef V4498 -#define V4498 (V + 16950) - 0x1105, 0x1171, 0x11b1, 0, -#undef V4499 -#define V4499 (V + 16954) - 0x1105, 0x1171, 0x11b2, 0, -#undef V4500 -#define V4500 (V + 16958) - 0x1105, 0x1171, 0x11b3, 0, -#undef V4501 -#define V4501 (V + 16962) - 0x1105, 0x1171, 0x11b4, 0, -#undef V4502 -#define V4502 (V + 16966) - 0x1105, 0x1171, 0x11b5, 0, -#undef V4503 -#define V4503 (V + 16970) - 0x1105, 0x1171, 0x11b6, 0, -#undef V4504 -#define V4504 (V + 16974) - 0x1105, 0x1171, 0x11b7, 0, -#undef V4505 -#define V4505 (V + 16978) - 0x1105, 0x1171, 0x11b8, 0, -#undef V4506 -#define V4506 (V + 16982) - 0x1105, 0x1171, 0x11b9, 0, -#undef V4507 -#define V4507 (V + 16986) - 0x1105, 0x1171, 0x11ba, 0, -#undef V4508 -#define V4508 (V + 16990) - 0x1105, 0x1171, 0x11bb, 0, -#undef V4509 -#define V4509 (V + 16994) - 0x1105, 0x1171, 0x11bc, 0, -#undef V4510 -#define V4510 (V + 16998) - 0x1105, 0x1171, 0x11bd, 0, -#undef V4511 -#define V4511 (V + 17002) - 0x1105, 0x1171, 0x11be, 0, -#undef V4512 -#define V4512 (V + 17006) - 0x1105, 0x1171, 0x11bf, 0, -#undef V4513 -#define V4513 (V + 17010) - 0x1105, 0x1171, 0x11c0, 0, -#undef V4514 -#define V4514 (V + 17014) - 0x1105, 0x1171, 0x11c1, 0, -#undef V4515 -#define V4515 (V + 17018) - 0x1105, 0x1171, 0x11c2, 0, -#undef V4516 -#define V4516 (V + 17022) - 0x1105, 0x1172, 0, -#undef V4517 -#define V4517 (V + 17025) - 0x1105, 0x1172, 0x11a8, 0, -#undef V4518 -#define V4518 (V + 17029) - 0x1105, 0x1172, 0x11a9, 0, -#undef V4519 -#define V4519 (V + 17033) - 0x1105, 0x1172, 0x11aa, 0, -#undef V4520 -#define V4520 (V + 17037) - 0x1105, 0x1172, 0x11ab, 0, -#undef V4521 -#define V4521 (V + 17041) - 0x1105, 0x1172, 0x11ac, 0, -#undef V4522 -#define V4522 (V + 17045) - 0x1105, 0x1172, 0x11ad, 0, -#undef V4523 -#define V4523 (V + 17049) - 0x1105, 0x1172, 0x11ae, 0, -#undef V4524 -#define V4524 (V + 17053) - 0x1105, 0x1172, 0x11af, 0, -#undef V4525 -#define V4525 (V + 17057) - 0x1105, 0x1172, 0x11b0, 0, -#undef V4526 -#define V4526 (V + 17061) - 0x1105, 0x1172, 0x11b1, 0, -#undef V4527 -#define V4527 (V + 17065) - 0x1105, 0x1172, 0x11b2, 0, -#undef V4528 -#define V4528 (V + 17069) - 0x1105, 0x1172, 0x11b3, 0, -#undef V4529 -#define V4529 (V + 17073) - 0x1105, 0x1172, 0x11b4, 0, -#undef V4530 -#define V4530 (V + 17077) - 0x1105, 0x1172, 0x11b5, 0, -#undef V4531 -#define V4531 (V + 17081) - 0x1105, 0x1172, 0x11b6, 0, -#undef V4532 -#define V4532 (V + 17085) - 0x1105, 0x1172, 0x11b7, 0, -#undef V4533 -#define V4533 (V + 17089) - 0x1105, 0x1172, 0x11b8, 0, -#undef V4534 -#define V4534 (V + 17093) - 0x1105, 0x1172, 0x11b9, 0, -#undef V4535 -#define V4535 (V + 17097) - 0x1105, 0x1172, 0x11ba, 0, -#undef V4536 -#define V4536 (V + 17101) - 0x1105, 0x1172, 0x11bb, 0, -#undef V4537 -#define V4537 (V + 17105) - 0x1105, 0x1172, 0x11bc, 0, -#undef V4538 -#define V4538 (V + 17109) - 0x1105, 0x1172, 0x11bd, 0, -#undef V4539 -#define V4539 (V + 17113) - 0x1105, 0x1172, 0x11be, 0, -#undef V4540 -#define V4540 (V + 17117) - 0x1105, 0x1172, 0x11bf, 0, -#undef V4541 -#define V4541 (V + 17121) - 0x1105, 0x1172, 0x11c0, 0, -#undef V4542 -#define V4542 (V + 17125) - 0x1105, 0x1172, 0x11c1, 0, -#undef V4543 -#define V4543 (V + 17129) - 0x1105, 0x1172, 0x11c2, 0, -#undef V4544 -#define V4544 (V + 17133) - 0x1105, 0x1173, 0, -#undef V4545 -#define V4545 (V + 17136) - 0x1105, 0x1173, 0x11a8, 0, -#undef V4546 -#define V4546 (V + 17140) - 0x1105, 0x1173, 0x11a9, 0, -#undef V4547 -#define V4547 (V + 17144) - 0x1105, 0x1173, 0x11aa, 0, -#undef V4548 -#define V4548 (V + 17148) - 0x1105, 0x1173, 0x11ab, 0, -#undef V4549 -#define V4549 (V + 17152) - 0x1105, 0x1173, 0x11ac, 0, -#undef V4550 -#define V4550 (V + 17156) - 0x1105, 0x1173, 0x11ad, 0, -#undef V4551 -#define V4551 (V + 17160) - 0x1105, 0x1173, 0x11ae, 0, -#undef V4552 -#define V4552 (V + 17164) - 0x1105, 0x1173, 0x11af, 0, -#undef V4553 -#define V4553 (V + 17168) - 0x1105, 0x1173, 0x11b0, 0, -#undef V4554 -#define V4554 (V + 17172) - 0x1105, 0x1173, 0x11b1, 0, -#undef V4555 -#define V4555 (V + 17176) - 0x1105, 0x1173, 0x11b2, 0, -#undef V4556 -#define V4556 (V + 17180) - 0x1105, 0x1173, 0x11b3, 0, -#undef V4557 -#define V4557 (V + 17184) - 0x1105, 0x1173, 0x11b4, 0, -#undef V4558 -#define V4558 (V + 17188) - 0x1105, 0x1173, 0x11b5, 0, -#undef V4559 -#define V4559 (V + 17192) - 0x1105, 0x1173, 0x11b6, 0, -#undef V4560 -#define V4560 (V + 17196) - 0x1105, 0x1173, 0x11b7, 0, -#undef V4561 -#define V4561 (V + 17200) - 0x1105, 0x1173, 0x11b8, 0, -#undef V4562 -#define V4562 (V + 17204) - 0x1105, 0x1173, 0x11b9, 0, -#undef V4563 -#define V4563 (V + 17208) - 0x1105, 0x1173, 0x11ba, 0, -#undef V4564 -#define V4564 (V + 17212) - 0x1105, 0x1173, 0x11bb, 0, -#undef V4565 -#define V4565 (V + 17216) - 0x1105, 0x1173, 0x11bc, 0, -#undef V4566 -#define V4566 (V + 17220) - 0x1105, 0x1173, 0x11bd, 0, -#undef V4567 -#define V4567 (V + 17224) - 0x1105, 0x1173, 0x11be, 0, -#undef V4568 -#define V4568 (V + 17228) - 0x1105, 0x1173, 0x11bf, 0, -#undef V4569 -#define V4569 (V + 17232) - 0x1105, 0x1173, 0x11c0, 0, -#undef V4570 -#define V4570 (V + 17236) - 0x1105, 0x1173, 0x11c1, 0, -#undef V4571 -#define V4571 (V + 17240) - 0x1105, 0x1173, 0x11c2, 0, -#undef V4572 -#define V4572 (V + 17244) - 0x1105, 0x1174, 0, -#undef V4573 -#define V4573 (V + 17247) - 0x1105, 0x1174, 0x11a8, 0, -#undef V4574 -#define V4574 (V + 17251) - 0x1105, 0x1174, 0x11a9, 0, -#undef V4575 -#define V4575 (V + 17255) - 0x1105, 0x1174, 0x11aa, 0, -#undef V4576 -#define V4576 (V + 17259) - 0x1105, 0x1174, 0x11ab, 0, -#undef V4577 -#define V4577 (V + 17263) - 0x1105, 0x1174, 0x11ac, 0, -#undef V4578 -#define V4578 (V + 17267) - 0x1105, 0x1174, 0x11ad, 0, -#undef V4579 -#define V4579 (V + 17271) - 0x1105, 0x1174, 0x11ae, 0, -#undef V4580 -#define V4580 (V + 17275) - 0x1105, 0x1174, 0x11af, 0, -#undef V4581 -#define V4581 (V + 17279) - 0x1105, 0x1174, 0x11b0, 0, -#undef V4582 -#define V4582 (V + 17283) - 0x1105, 0x1174, 0x11b1, 0, -#undef V4583 -#define V4583 (V + 17287) - 0x1105, 0x1174, 0x11b2, 0, -#undef V4584 -#define V4584 (V + 17291) - 0x1105, 0x1174, 0x11b3, 0, -#undef V4585 -#define V4585 (V + 17295) - 0x1105, 0x1174, 0x11b4, 0, -#undef V4586 -#define V4586 (V + 17299) - 0x1105, 0x1174, 0x11b5, 0, -#undef V4587 -#define V4587 (V + 17303) - 0x1105, 0x1174, 0x11b6, 0, -#undef V4588 -#define V4588 (V + 17307) - 0x1105, 0x1174, 0x11b7, 0, -#undef V4589 -#define V4589 (V + 17311) - 0x1105, 0x1174, 0x11b8, 0, -#undef V4590 -#define V4590 (V + 17315) - 0x1105, 0x1174, 0x11b9, 0, -#undef V4591 -#define V4591 (V + 17319) - 0x1105, 0x1174, 0x11ba, 0, -#undef V4592 -#define V4592 (V + 17323) - 0x1105, 0x1174, 0x11bb, 0, -#undef V4593 -#define V4593 (V + 17327) - 0x1105, 0x1174, 0x11bc, 0, -#undef V4594 -#define V4594 (V + 17331) - 0x1105, 0x1174, 0x11bd, 0, -#undef V4595 -#define V4595 (V + 17335) - 0x1105, 0x1174, 0x11be, 0, -#undef V4596 -#define V4596 (V + 17339) - 0x1105, 0x1174, 0x11bf, 0, -#undef V4597 -#define V4597 (V + 17343) - 0x1105, 0x1174, 0x11c0, 0, -#undef V4598 -#define V4598 (V + 17347) - 0x1105, 0x1174, 0x11c1, 0, -#undef V4599 -#define V4599 (V + 17351) - 0x1105, 0x1174, 0x11c2, 0, -#undef V4600 -#define V4600 (V + 17355) - 0x1105, 0x1175, 0, -#undef V4601 -#define V4601 (V + 17358) - 0x1105, 0x1175, 0x11a8, 0, -#undef V4602 -#define V4602 (V + 17362) - 0x1105, 0x1175, 0x11a9, 0, -#undef V4603 -#define V4603 (V + 17366) - 0x1105, 0x1175, 0x11aa, 0, -#undef V4604 -#define V4604 (V + 17370) - 0x1105, 0x1175, 0x11ab, 0, -#undef V4605 -#define V4605 (V + 17374) - 0x1105, 0x1175, 0x11ac, 0, -#undef V4606 -#define V4606 (V + 17378) - 0x1105, 0x1175, 0x11ad, 0, -#undef V4607 -#define V4607 (V + 17382) - 0x1105, 0x1175, 0x11ae, 0, -#undef V4608 -#define V4608 (V + 17386) - 0x1105, 0x1175, 0x11af, 0, -#undef V4609 -#define V4609 (V + 17390) - 0x1105, 0x1175, 0x11b0, 0, -#undef V4610 -#define V4610 (V + 17394) - 0x1105, 0x1175, 0x11b1, 0, -#undef V4611 -#define V4611 (V + 17398) - 0x1105, 0x1175, 0x11b2, 0, -#undef V4612 -#define V4612 (V + 17402) - 0x1105, 0x1175, 0x11b3, 0, -#undef V4613 -#define V4613 (V + 17406) - 0x1105, 0x1175, 0x11b4, 0, -#undef V4614 -#define V4614 (V + 17410) - 0x1105, 0x1175, 0x11b5, 0, -#undef V4615 -#define V4615 (V + 17414) - 0x1105, 0x1175, 0x11b6, 0, -#undef V4616 -#define V4616 (V + 17418) - 0x1105, 0x1175, 0x11b7, 0, -#undef V4617 -#define V4617 (V + 17422) - 0x1105, 0x1175, 0x11b8, 0, -#undef V4618 -#define V4618 (V + 17426) - 0x1105, 0x1175, 0x11b9, 0, -#undef V4619 -#define V4619 (V + 17430) - 0x1105, 0x1175, 0x11ba, 0, -#undef V4620 -#define V4620 (V + 17434) - 0x1105, 0x1175, 0x11bb, 0, -#undef V4621 -#define V4621 (V + 17438) - 0x1105, 0x1175, 0x11bc, 0, -#undef V4622 -#define V4622 (V + 17442) - 0x1105, 0x1175, 0x11bd, 0, -#undef V4623 -#define V4623 (V + 17446) - 0x1105, 0x1175, 0x11be, 0, -#undef V4624 -#define V4624 (V + 17450) - 0x1105, 0x1175, 0x11bf, 0, -#undef V4625 -#define V4625 (V + 17454) - 0x1105, 0x1175, 0x11c0, 0, -#undef V4626 -#define V4626 (V + 17458) - 0x1105, 0x1175, 0x11c1, 0, -#undef V4627 -#define V4627 (V + 17462) - 0x1105, 0x1175, 0x11c2, 0, -#undef V4628 -#define V4628 (V + 17466) - 0x1106, 0x1161, 0, -#undef V4629 -#define V4629 (V + 17469) - 0x1106, 0x1161, 0x11a8, 0, -#undef V4630 -#define V4630 (V + 17473) - 0x1106, 0x1161, 0x11a9, 0, -#undef V4631 -#define V4631 (V + 17477) - 0x1106, 0x1161, 0x11aa, 0, -#undef V4632 -#define V4632 (V + 17481) - 0x1106, 0x1161, 0x11ab, 0, -#undef V4633 -#define V4633 (V + 17485) - 0x1106, 0x1161, 0x11ac, 0, -#undef V4634 -#define V4634 (V + 17489) - 0x1106, 0x1161, 0x11ad, 0, -#undef V4635 -#define V4635 (V + 17493) - 0x1106, 0x1161, 0x11ae, 0, -#undef V4636 -#define V4636 (V + 17497) - 0x1106, 0x1161, 0x11af, 0, -#undef V4637 -#define V4637 (V + 17501) - 0x1106, 0x1161, 0x11b0, 0, -#undef V4638 -#define V4638 (V + 17505) - 0x1106, 0x1161, 0x11b1, 0, -#undef V4639 -#define V4639 (V + 17509) - 0x1106, 0x1161, 0x11b2, 0, -#undef V4640 -#define V4640 (V + 17513) - 0x1106, 0x1161, 0x11b3, 0, -#undef V4641 -#define V4641 (V + 17517) - 0x1106, 0x1161, 0x11b4, 0, -#undef V4642 -#define V4642 (V + 17521) - 0x1106, 0x1161, 0x11b5, 0, -#undef V4643 -#define V4643 (V + 17525) - 0x1106, 0x1161, 0x11b6, 0, -#undef V4644 -#define V4644 (V + 17529) - 0x1106, 0x1161, 0x11b7, 0, -#undef V4645 -#define V4645 (V + 17533) - 0x1106, 0x1161, 0x11b8, 0, -#undef V4646 -#define V4646 (V + 17537) - 0x1106, 0x1161, 0x11b9, 0, -#undef V4647 -#define V4647 (V + 17541) - 0x1106, 0x1161, 0x11ba, 0, -#undef V4648 -#define V4648 (V + 17545) - 0x1106, 0x1161, 0x11bb, 0, -#undef V4649 -#define V4649 (V + 17549) - 0x1106, 0x1161, 0x11bc, 0, -#undef V4650 -#define V4650 (V + 17553) - 0x1106, 0x1161, 0x11bd, 0, -#undef V4651 -#define V4651 (V + 17557) - 0x1106, 0x1161, 0x11be, 0, -#undef V4652 -#define V4652 (V + 17561) - 0x1106, 0x1161, 0x11bf, 0, -#undef V4653 -#define V4653 (V + 17565) - 0x1106, 0x1161, 0x11c0, 0, -#undef V4654 -#define V4654 (V + 17569) - 0x1106, 0x1161, 0x11c1, 0, -#undef V4655 -#define V4655 (V + 17573) - 0x1106, 0x1161, 0x11c2, 0, -#undef V4656 -#define V4656 (V + 17577) - 0x1106, 0x1162, 0, -#undef V4657 -#define V4657 (V + 17580) - 0x1106, 0x1162, 0x11a8, 0, -#undef V4658 -#define V4658 (V + 17584) - 0x1106, 0x1162, 0x11a9, 0, -#undef V4659 -#define V4659 (V + 17588) - 0x1106, 0x1162, 0x11aa, 0, -#undef V4660 -#define V4660 (V + 17592) - 0x1106, 0x1162, 0x11ab, 0, -#undef V4661 -#define V4661 (V + 17596) - 0x1106, 0x1162, 0x11ac, 0, -#undef V4662 -#define V4662 (V + 17600) - 0x1106, 0x1162, 0x11ad, 0, -#undef V4663 -#define V4663 (V + 17604) - 0x1106, 0x1162, 0x11ae, 0, -#undef V4664 -#define V4664 (V + 17608) - 0x1106, 0x1162, 0x11af, 0, -#undef V4665 -#define V4665 (V + 17612) - 0x1106, 0x1162, 0x11b0, 0, -#undef V4666 -#define V4666 (V + 17616) - 0x1106, 0x1162, 0x11b1, 0, -#undef V4667 -#define V4667 (V + 17620) - 0x1106, 0x1162, 0x11b2, 0, -#undef V4668 -#define V4668 (V + 17624) - 0x1106, 0x1162, 0x11b3, 0, -#undef V4669 -#define V4669 (V + 17628) - 0x1106, 0x1162, 0x11b4, 0, -#undef V4670 -#define V4670 (V + 17632) - 0x1106, 0x1162, 0x11b5, 0, -#undef V4671 -#define V4671 (V + 17636) - 0x1106, 0x1162, 0x11b6, 0, -#undef V4672 -#define V4672 (V + 17640) - 0x1106, 0x1162, 0x11b7, 0, -#undef V4673 -#define V4673 (V + 17644) - 0x1106, 0x1162, 0x11b8, 0, -#undef V4674 -#define V4674 (V + 17648) - 0x1106, 0x1162, 0x11b9, 0, -#undef V4675 -#define V4675 (V + 17652) - 0x1106, 0x1162, 0x11ba, 0, -#undef V4676 -#define V4676 (V + 17656) - 0x1106, 0x1162, 0x11bb, 0, -#undef V4677 -#define V4677 (V + 17660) - 0x1106, 0x1162, 0x11bc, 0, -#undef V4678 -#define V4678 (V + 17664) - 0x1106, 0x1162, 0x11bd, 0, -#undef V4679 -#define V4679 (V + 17668) - 0x1106, 0x1162, 0x11be, 0, -#undef V4680 -#define V4680 (V + 17672) - 0x1106, 0x1162, 0x11bf, 0, -#undef V4681 -#define V4681 (V + 17676) - 0x1106, 0x1162, 0x11c0, 0, -#undef V4682 -#define V4682 (V + 17680) - 0x1106, 0x1162, 0x11c1, 0, -#undef V4683 -#define V4683 (V + 17684) - 0x1106, 0x1162, 0x11c2, 0, -#undef V4684 -#define V4684 (V + 17688) - 0x1106, 0x1163, 0, -#undef V4685 -#define V4685 (V + 17691) - 0x1106, 0x1163, 0x11a8, 0, -#undef V4686 -#define V4686 (V + 17695) - 0x1106, 0x1163, 0x11a9, 0, -#undef V4687 -#define V4687 (V + 17699) - 0x1106, 0x1163, 0x11aa, 0, -#undef V4688 -#define V4688 (V + 17703) - 0x1106, 0x1163, 0x11ab, 0, -#undef V4689 -#define V4689 (V + 17707) - 0x1106, 0x1163, 0x11ac, 0, -#undef V4690 -#define V4690 (V + 17711) - 0x1106, 0x1163, 0x11ad, 0, -#undef V4691 -#define V4691 (V + 17715) - 0x1106, 0x1163, 0x11ae, 0, -#undef V4692 -#define V4692 (V + 17719) - 0x1106, 0x1163, 0x11af, 0, -#undef V4693 -#define V4693 (V + 17723) - 0x1106, 0x1163, 0x11b0, 0, -#undef V4694 -#define V4694 (V + 17727) - 0x1106, 0x1163, 0x11b1, 0, -#undef V4695 -#define V4695 (V + 17731) - 0x1106, 0x1163, 0x11b2, 0, -#undef V4696 -#define V4696 (V + 17735) - 0x1106, 0x1163, 0x11b3, 0, -#undef V4697 -#define V4697 (V + 17739) - 0x1106, 0x1163, 0x11b4, 0, -#undef V4698 -#define V4698 (V + 17743) - 0x1106, 0x1163, 0x11b5, 0, -#undef V4699 -#define V4699 (V + 17747) - 0x1106, 0x1163, 0x11b6, 0, -#undef V4700 -#define V4700 (V + 17751) - 0x1106, 0x1163, 0x11b7, 0, -#undef V4701 -#define V4701 (V + 17755) - 0x1106, 0x1163, 0x11b8, 0, -#undef V4702 -#define V4702 (V + 17759) - 0x1106, 0x1163, 0x11b9, 0, -#undef V4703 -#define V4703 (V + 17763) - 0x1106, 0x1163, 0x11ba, 0, -#undef V4704 -#define V4704 (V + 17767) - 0x1106, 0x1163, 0x11bb, 0, -#undef V4705 -#define V4705 (V + 17771) - 0x1106, 0x1163, 0x11bc, 0, -#undef V4706 -#define V4706 (V + 17775) - 0x1106, 0x1163, 0x11bd, 0, -#undef V4707 -#define V4707 (V + 17779) - 0x1106, 0x1163, 0x11be, 0, -#undef V4708 -#define V4708 (V + 17783) - 0x1106, 0x1163, 0x11bf, 0, -#undef V4709 -#define V4709 (V + 17787) - 0x1106, 0x1163, 0x11c0, 0, -#undef V4710 -#define V4710 (V + 17791) - 0x1106, 0x1163, 0x11c1, 0, -#undef V4711 -#define V4711 (V + 17795) - 0x1106, 0x1163, 0x11c2, 0, -#undef V4712 -#define V4712 (V + 17799) - 0x1106, 0x1164, 0, -#undef V4713 -#define V4713 (V + 17802) - 0x1106, 0x1164, 0x11a8, 0, -#undef V4714 -#define V4714 (V + 17806) - 0x1106, 0x1164, 0x11a9, 0, -#undef V4715 -#define V4715 (V + 17810) - 0x1106, 0x1164, 0x11aa, 0, -#undef V4716 -#define V4716 (V + 17814) - 0x1106, 0x1164, 0x11ab, 0, -#undef V4717 -#define V4717 (V + 17818) - 0x1106, 0x1164, 0x11ac, 0, -#undef V4718 -#define V4718 (V + 17822) - 0x1106, 0x1164, 0x11ad, 0, -#undef V4719 -#define V4719 (V + 17826) - 0x1106, 0x1164, 0x11ae, 0, -#undef V4720 -#define V4720 (V + 17830) - 0x1106, 0x1164, 0x11af, 0, -#undef V4721 -#define V4721 (V + 17834) - 0x1106, 0x1164, 0x11b0, 0, -#undef V4722 -#define V4722 (V + 17838) - 0x1106, 0x1164, 0x11b1, 0, -#undef V4723 -#define V4723 (V + 17842) - 0x1106, 0x1164, 0x11b2, 0, -#undef V4724 -#define V4724 (V + 17846) - 0x1106, 0x1164, 0x11b3, 0, -#undef V4725 -#define V4725 (V + 17850) - 0x1106, 0x1164, 0x11b4, 0, -#undef V4726 -#define V4726 (V + 17854) - 0x1106, 0x1164, 0x11b5, 0, -#undef V4727 -#define V4727 (V + 17858) - 0x1106, 0x1164, 0x11b6, 0, -#undef V4728 -#define V4728 (V + 17862) - 0x1106, 0x1164, 0x11b7, 0, -#undef V4729 -#define V4729 (V + 17866) - 0x1106, 0x1164, 0x11b8, 0, -#undef V4730 -#define V4730 (V + 17870) - 0x1106, 0x1164, 0x11b9, 0, -#undef V4731 -#define V4731 (V + 17874) - 0x1106, 0x1164, 0x11ba, 0, -#undef V4732 -#define V4732 (V + 17878) - 0x1106, 0x1164, 0x11bb, 0, -#undef V4733 -#define V4733 (V + 17882) - 0x1106, 0x1164, 0x11bc, 0, -#undef V4734 -#define V4734 (V + 17886) - 0x1106, 0x1164, 0x11bd, 0, -#undef V4735 -#define V4735 (V + 17890) - 0x1106, 0x1164, 0x11be, 0, -#undef V4736 -#define V4736 (V + 17894) - 0x1106, 0x1164, 0x11bf, 0, -#undef V4737 -#define V4737 (V + 17898) - 0x1106, 0x1164, 0x11c0, 0, -#undef V4738 -#define V4738 (V + 17902) - 0x1106, 0x1164, 0x11c1, 0, -#undef V4739 -#define V4739 (V + 17906) - 0x1106, 0x1164, 0x11c2, 0, -#undef V4740 -#define V4740 (V + 17910) - 0x1106, 0x1165, 0, -#undef V4741 -#define V4741 (V + 17913) - 0x1106, 0x1165, 0x11a8, 0, -#undef V4742 -#define V4742 (V + 17917) - 0x1106, 0x1165, 0x11a9, 0, -#undef V4743 -#define V4743 (V + 17921) - 0x1106, 0x1165, 0x11aa, 0, -#undef V4744 -#define V4744 (V + 17925) - 0x1106, 0x1165, 0x11ab, 0, -#undef V4745 -#define V4745 (V + 17929) - 0x1106, 0x1165, 0x11ac, 0, -#undef V4746 -#define V4746 (V + 17933) - 0x1106, 0x1165, 0x11ad, 0, -#undef V4747 -#define V4747 (V + 17937) - 0x1106, 0x1165, 0x11ae, 0, -#undef V4748 -#define V4748 (V + 17941) - 0x1106, 0x1165, 0x11af, 0, -#undef V4749 -#define V4749 (V + 17945) - 0x1106, 0x1165, 0x11b0, 0, -#undef V4750 -#define V4750 (V + 17949) - 0x1106, 0x1165, 0x11b1, 0, -#undef V4751 -#define V4751 (V + 17953) - 0x1106, 0x1165, 0x11b2, 0, -#undef V4752 -#define V4752 (V + 17957) - 0x1106, 0x1165, 0x11b3, 0, -#undef V4753 -#define V4753 (V + 17961) - 0x1106, 0x1165, 0x11b4, 0, -#undef V4754 -#define V4754 (V + 17965) - 0x1106, 0x1165, 0x11b5, 0, -#undef V4755 -#define V4755 (V + 17969) - 0x1106, 0x1165, 0x11b6, 0, -#undef V4756 -#define V4756 (V + 17973) - 0x1106, 0x1165, 0x11b7, 0, -#undef V4757 -#define V4757 (V + 17977) - 0x1106, 0x1165, 0x11b8, 0, -#undef V4758 -#define V4758 (V + 17981) - 0x1106, 0x1165, 0x11b9, 0, -#undef V4759 -#define V4759 (V + 17985) - 0x1106, 0x1165, 0x11ba, 0, -#undef V4760 -#define V4760 (V + 17989) - 0x1106, 0x1165, 0x11bb, 0, -#undef V4761 -#define V4761 (V + 17993) - 0x1106, 0x1165, 0x11bc, 0, -#undef V4762 -#define V4762 (V + 17997) - 0x1106, 0x1165, 0x11bd, 0, -#undef V4763 -#define V4763 (V + 18001) - 0x1106, 0x1165, 0x11be, 0, -#undef V4764 -#define V4764 (V + 18005) - 0x1106, 0x1165, 0x11bf, 0, -#undef V4765 -#define V4765 (V + 18009) - 0x1106, 0x1165, 0x11c0, 0, -#undef V4766 -#define V4766 (V + 18013) - 0x1106, 0x1165, 0x11c1, 0, -#undef V4767 -#define V4767 (V + 18017) - 0x1106, 0x1165, 0x11c2, 0, -#undef V4768 -#define V4768 (V + 18021) - 0x1106, 0x1166, 0, -#undef V4769 -#define V4769 (V + 18024) - 0x1106, 0x1166, 0x11a8, 0, -#undef V4770 -#define V4770 (V + 18028) - 0x1106, 0x1166, 0x11a9, 0, -#undef V4771 -#define V4771 (V + 18032) - 0x1106, 0x1166, 0x11aa, 0, -#undef V4772 -#define V4772 (V + 18036) - 0x1106, 0x1166, 0x11ab, 0, -#undef V4773 -#define V4773 (V + 18040) - 0x1106, 0x1166, 0x11ac, 0, -#undef V4774 -#define V4774 (V + 18044) - 0x1106, 0x1166, 0x11ad, 0, -#undef V4775 -#define V4775 (V + 18048) - 0x1106, 0x1166, 0x11ae, 0, -#undef V4776 -#define V4776 (V + 18052) - 0x1106, 0x1166, 0x11af, 0, -#undef V4777 -#define V4777 (V + 18056) - 0x1106, 0x1166, 0x11b0, 0, -#undef V4778 -#define V4778 (V + 18060) - 0x1106, 0x1166, 0x11b1, 0, -#undef V4779 -#define V4779 (V + 18064) - 0x1106, 0x1166, 0x11b2, 0, -#undef V4780 -#define V4780 (V + 18068) - 0x1106, 0x1166, 0x11b3, 0, -#undef V4781 -#define V4781 (V + 18072) - 0x1106, 0x1166, 0x11b4, 0, -#undef V4782 -#define V4782 (V + 18076) - 0x1106, 0x1166, 0x11b5, 0, -#undef V4783 -#define V4783 (V + 18080) - 0x1106, 0x1166, 0x11b6, 0, -#undef V4784 -#define V4784 (V + 18084) - 0x1106, 0x1166, 0x11b7, 0, -#undef V4785 -#define V4785 (V + 18088) - 0x1106, 0x1166, 0x11b8, 0, -#undef V4786 -#define V4786 (V + 18092) - 0x1106, 0x1166, 0x11b9, 0, -#undef V4787 -#define V4787 (V + 18096) - 0x1106, 0x1166, 0x11ba, 0, -#undef V4788 -#define V4788 (V + 18100) - 0x1106, 0x1166, 0x11bb, 0, -#undef V4789 -#define V4789 (V + 18104) - 0x1106, 0x1166, 0x11bc, 0, -#undef V4790 -#define V4790 (V + 18108) - 0x1106, 0x1166, 0x11bd, 0, -#undef V4791 -#define V4791 (V + 18112) - 0x1106, 0x1166, 0x11be, 0, -#undef V4792 -#define V4792 (V + 18116) - 0x1106, 0x1166, 0x11bf, 0, -#undef V4793 -#define V4793 (V + 18120) - 0x1106, 0x1166, 0x11c0, 0, -#undef V4794 -#define V4794 (V + 18124) - 0x1106, 0x1166, 0x11c1, 0, -#undef V4795 -#define V4795 (V + 18128) - 0x1106, 0x1166, 0x11c2, 0, -#undef V4796 -#define V4796 (V + 18132) - 0x1106, 0x1167, 0, -#undef V4797 -#define V4797 (V + 18135) - 0x1106, 0x1167, 0x11a8, 0, -#undef V4798 -#define V4798 (V + 18139) - 0x1106, 0x1167, 0x11a9, 0, -#undef V4799 -#define V4799 (V + 18143) - 0x1106, 0x1167, 0x11aa, 0, -#undef V4800 -#define V4800 (V + 18147) - 0x1106, 0x1167, 0x11ab, 0, -#undef V4801 -#define V4801 (V + 18151) - 0x1106, 0x1167, 0x11ac, 0, -#undef V4802 -#define V4802 (V + 18155) - 0x1106, 0x1167, 0x11ad, 0, -#undef V4803 -#define V4803 (V + 18159) - 0x1106, 0x1167, 0x11ae, 0, -#undef V4804 -#define V4804 (V + 18163) - 0x1106, 0x1167, 0x11af, 0, -#undef V4805 -#define V4805 (V + 18167) - 0x1106, 0x1167, 0x11b0, 0, -#undef V4806 -#define V4806 (V + 18171) - 0x1106, 0x1167, 0x11b1, 0, -#undef V4807 -#define V4807 (V + 18175) - 0x1106, 0x1167, 0x11b2, 0, -#undef V4808 -#define V4808 (V + 18179) - 0x1106, 0x1167, 0x11b3, 0, -#undef V4809 -#define V4809 (V + 18183) - 0x1106, 0x1167, 0x11b4, 0, -#undef V4810 -#define V4810 (V + 18187) - 0x1106, 0x1167, 0x11b5, 0, -#undef V4811 -#define V4811 (V + 18191) - 0x1106, 0x1167, 0x11b6, 0, -#undef V4812 -#define V4812 (V + 18195) - 0x1106, 0x1167, 0x11b7, 0, -#undef V4813 -#define V4813 (V + 18199) - 0x1106, 0x1167, 0x11b8, 0, -#undef V4814 -#define V4814 (V + 18203) - 0x1106, 0x1167, 0x11b9, 0, -#undef V4815 -#define V4815 (V + 18207) - 0x1106, 0x1167, 0x11ba, 0, -#undef V4816 -#define V4816 (V + 18211) - 0x1106, 0x1167, 0x11bb, 0, -#undef V4817 -#define V4817 (V + 18215) - 0x1106, 0x1167, 0x11bc, 0, -#undef V4818 -#define V4818 (V + 18219) - 0x1106, 0x1167, 0x11bd, 0, -#undef V4819 -#define V4819 (V + 18223) - 0x1106, 0x1167, 0x11be, 0, -#undef V4820 -#define V4820 (V + 18227) - 0x1106, 0x1167, 0x11bf, 0, -#undef V4821 -#define V4821 (V + 18231) - 0x1106, 0x1167, 0x11c0, 0, -#undef V4822 -#define V4822 (V + 18235) - 0x1106, 0x1167, 0x11c1, 0, -#undef V4823 -#define V4823 (V + 18239) - 0x1106, 0x1167, 0x11c2, 0, -#undef V4824 -#define V4824 (V + 18243) - 0x1106, 0x1168, 0, -#undef V4825 -#define V4825 (V + 18246) - 0x1106, 0x1168, 0x11a8, 0, -#undef V4826 -#define V4826 (V + 18250) - 0x1106, 0x1168, 0x11a9, 0, -#undef V4827 -#define V4827 (V + 18254) - 0x1106, 0x1168, 0x11aa, 0, -#undef V4828 -#define V4828 (V + 18258) - 0x1106, 0x1168, 0x11ab, 0, -#undef V4829 -#define V4829 (V + 18262) - 0x1106, 0x1168, 0x11ac, 0, -#undef V4830 -#define V4830 (V + 18266) - 0x1106, 0x1168, 0x11ad, 0, -#undef V4831 -#define V4831 (V + 18270) - 0x1106, 0x1168, 0x11ae, 0, -#undef V4832 -#define V4832 (V + 18274) - 0x1106, 0x1168, 0x11af, 0, -#undef V4833 -#define V4833 (V + 18278) - 0x1106, 0x1168, 0x11b0, 0, -#undef V4834 -#define V4834 (V + 18282) - 0x1106, 0x1168, 0x11b1, 0, -#undef V4835 -#define V4835 (V + 18286) - 0x1106, 0x1168, 0x11b2, 0, -#undef V4836 -#define V4836 (V + 18290) - 0x1106, 0x1168, 0x11b3, 0, -#undef V4837 -#define V4837 (V + 18294) - 0x1106, 0x1168, 0x11b4, 0, -#undef V4838 -#define V4838 (V + 18298) - 0x1106, 0x1168, 0x11b5, 0, -#undef V4839 -#define V4839 (V + 18302) - 0x1106, 0x1168, 0x11b6, 0, -#undef V4840 -#define V4840 (V + 18306) - 0x1106, 0x1168, 0x11b7, 0, -#undef V4841 -#define V4841 (V + 18310) - 0x1106, 0x1168, 0x11b8, 0, -#undef V4842 -#define V4842 (V + 18314) - 0x1106, 0x1168, 0x11b9, 0, -#undef V4843 -#define V4843 (V + 18318) - 0x1106, 0x1168, 0x11ba, 0, -#undef V4844 -#define V4844 (V + 18322) - 0x1106, 0x1168, 0x11bb, 0, -#undef V4845 -#define V4845 (V + 18326) - 0x1106, 0x1168, 0x11bc, 0, -#undef V4846 -#define V4846 (V + 18330) - 0x1106, 0x1168, 0x11bd, 0, -#undef V4847 -#define V4847 (V + 18334) - 0x1106, 0x1168, 0x11be, 0, -#undef V4848 -#define V4848 (V + 18338) - 0x1106, 0x1168, 0x11bf, 0, -#undef V4849 -#define V4849 (V + 18342) - 0x1106, 0x1168, 0x11c0, 0, -#undef V4850 -#define V4850 (V + 18346) - 0x1106, 0x1168, 0x11c1, 0, -#undef V4851 -#define V4851 (V + 18350) - 0x1106, 0x1168, 0x11c2, 0, -#undef V4852 -#define V4852 (V + 18354) - 0x1106, 0x1169, 0, -#undef V4853 -#define V4853 (V + 18357) - 0x1106, 0x1169, 0x11a8, 0, -#undef V4854 -#define V4854 (V + 18361) - 0x1106, 0x1169, 0x11a9, 0, -#undef V4855 -#define V4855 (V + 18365) - 0x1106, 0x1169, 0x11aa, 0, -#undef V4856 -#define V4856 (V + 18369) - 0x1106, 0x1169, 0x11ab, 0, -#undef V4857 -#define V4857 (V + 18373) - 0x1106, 0x1169, 0x11ac, 0, -#undef V4858 -#define V4858 (V + 18377) - 0x1106, 0x1169, 0x11ad, 0, -#undef V4859 -#define V4859 (V + 18381) - 0x1106, 0x1169, 0x11ae, 0, -#undef V4860 -#define V4860 (V + 18385) - 0x1106, 0x1169, 0x11af, 0, -#undef V4861 -#define V4861 (V + 18389) - 0x1106, 0x1169, 0x11b0, 0, -#undef V4862 -#define V4862 (V + 18393) - 0x1106, 0x1169, 0x11b1, 0, -#undef V4863 -#define V4863 (V + 18397) - 0x1106, 0x1169, 0x11b2, 0, -#undef V4864 -#define V4864 (V + 18401) - 0x1106, 0x1169, 0x11b3, 0, -#undef V4865 -#define V4865 (V + 18405) - 0x1106, 0x1169, 0x11b4, 0, -#undef V4866 -#define V4866 (V + 18409) - 0x1106, 0x1169, 0x11b5, 0, -#undef V4867 -#define V4867 (V + 18413) - 0x1106, 0x1169, 0x11b6, 0, -#undef V4868 -#define V4868 (V + 18417) - 0x1106, 0x1169, 0x11b7, 0, -#undef V4869 -#define V4869 (V + 18421) - 0x1106, 0x1169, 0x11b8, 0, -#undef V4870 -#define V4870 (V + 18425) - 0x1106, 0x1169, 0x11b9, 0, -#undef V4871 -#define V4871 (V + 18429) - 0x1106, 0x1169, 0x11ba, 0, -#undef V4872 -#define V4872 (V + 18433) - 0x1106, 0x1169, 0x11bb, 0, -#undef V4873 -#define V4873 (V + 18437) - 0x1106, 0x1169, 0x11bc, 0, -#undef V4874 -#define V4874 (V + 18441) - 0x1106, 0x1169, 0x11bd, 0, -#undef V4875 -#define V4875 (V + 18445) - 0x1106, 0x1169, 0x11be, 0, -#undef V4876 -#define V4876 (V + 18449) - 0x1106, 0x1169, 0x11bf, 0, -#undef V4877 -#define V4877 (V + 18453) - 0x1106, 0x1169, 0x11c0, 0, -#undef V4878 -#define V4878 (V + 18457) - 0x1106, 0x1169, 0x11c1, 0, -#undef V4879 -#define V4879 (V + 18461) - 0x1106, 0x1169, 0x11c2, 0, -#undef V4880 -#define V4880 (V + 18465) - 0x1106, 0x116a, 0, -#undef V4881 -#define V4881 (V + 18468) - 0x1106, 0x116a, 0x11a8, 0, -#undef V4882 -#define V4882 (V + 18472) - 0x1106, 0x116a, 0x11a9, 0, -#undef V4883 -#define V4883 (V + 18476) - 0x1106, 0x116a, 0x11aa, 0, -#undef V4884 -#define V4884 (V + 18480) - 0x1106, 0x116a, 0x11ab, 0, -#undef V4885 -#define V4885 (V + 18484) - 0x1106, 0x116a, 0x11ac, 0, -#undef V4886 -#define V4886 (V + 18488) - 0x1106, 0x116a, 0x11ad, 0, -#undef V4887 -#define V4887 (V + 18492) - 0x1106, 0x116a, 0x11ae, 0, -#undef V4888 -#define V4888 (V + 18496) - 0x1106, 0x116a, 0x11af, 0, -#undef V4889 -#define V4889 (V + 18500) - 0x1106, 0x116a, 0x11b0, 0, -#undef V4890 -#define V4890 (V + 18504) - 0x1106, 0x116a, 0x11b1, 0, -#undef V4891 -#define V4891 (V + 18508) - 0x1106, 0x116a, 0x11b2, 0, -#undef V4892 -#define V4892 (V + 18512) - 0x1106, 0x116a, 0x11b3, 0, -#undef V4893 -#define V4893 (V + 18516) - 0x1106, 0x116a, 0x11b4, 0, -#undef V4894 -#define V4894 (V + 18520) - 0x1106, 0x116a, 0x11b5, 0, -#undef V4895 -#define V4895 (V + 18524) - 0x1106, 0x116a, 0x11b6, 0, -#undef V4896 -#define V4896 (V + 18528) - 0x1106, 0x116a, 0x11b7, 0, -#undef V4897 -#define V4897 (V + 18532) - 0x1106, 0x116a, 0x11b8, 0, -#undef V4898 -#define V4898 (V + 18536) - 0x1106, 0x116a, 0x11b9, 0, -#undef V4899 -#define V4899 (V + 18540) - 0x1106, 0x116a, 0x11ba, 0, -#undef V4900 -#define V4900 (V + 18544) - 0x1106, 0x116a, 0x11bb, 0, -#undef V4901 -#define V4901 (V + 18548) - 0x1106, 0x116a, 0x11bc, 0, -#undef V4902 -#define V4902 (V + 18552) - 0x1106, 0x116a, 0x11bd, 0, -#undef V4903 -#define V4903 (V + 18556) - 0x1106, 0x116a, 0x11be, 0, -#undef V4904 -#define V4904 (V + 18560) - 0x1106, 0x116a, 0x11bf, 0, -#undef V4905 -#define V4905 (V + 18564) - 0x1106, 0x116a, 0x11c0, 0, -#undef V4906 -#define V4906 (V + 18568) - 0x1106, 0x116a, 0x11c1, 0, -#undef V4907 -#define V4907 (V + 18572) - 0x1106, 0x116a, 0x11c2, 0, -#undef V4908 -#define V4908 (V + 18576) - 0x1106, 0x116b, 0, -#undef V4909 -#define V4909 (V + 18579) - 0x1106, 0x116b, 0x11a8, 0, -#undef V4910 -#define V4910 (V + 18583) - 0x1106, 0x116b, 0x11a9, 0, -#undef V4911 -#define V4911 (V + 18587) - 0x1106, 0x116b, 0x11aa, 0, -#undef V4912 -#define V4912 (V + 18591) - 0x1106, 0x116b, 0x11ab, 0, -#undef V4913 -#define V4913 (V + 18595) - 0x1106, 0x116b, 0x11ac, 0, -#undef V4914 -#define V4914 (V + 18599) - 0x1106, 0x116b, 0x11ad, 0, -#undef V4915 -#define V4915 (V + 18603) - 0x1106, 0x116b, 0x11ae, 0, -#undef V4916 -#define V4916 (V + 18607) - 0x1106, 0x116b, 0x11af, 0, -#undef V4917 -#define V4917 (V + 18611) - 0x1106, 0x116b, 0x11b0, 0, -#undef V4918 -#define V4918 (V + 18615) - 0x1106, 0x116b, 0x11b1, 0, -#undef V4919 -#define V4919 (V + 18619) - 0x1106, 0x116b, 0x11b2, 0, -#undef V4920 -#define V4920 (V + 18623) - 0x1106, 0x116b, 0x11b3, 0, -#undef V4921 -#define V4921 (V + 18627) - 0x1106, 0x116b, 0x11b4, 0, -#undef V4922 -#define V4922 (V + 18631) - 0x1106, 0x116b, 0x11b5, 0, -#undef V4923 -#define V4923 (V + 18635) - 0x1106, 0x116b, 0x11b6, 0, -#undef V4924 -#define V4924 (V + 18639) - 0x1106, 0x116b, 0x11b7, 0, -#undef V4925 -#define V4925 (V + 18643) - 0x1106, 0x116b, 0x11b8, 0, -#undef V4926 -#define V4926 (V + 18647) - 0x1106, 0x116b, 0x11b9, 0, -#undef V4927 -#define V4927 (V + 18651) - 0x1106, 0x116b, 0x11ba, 0, -#undef V4928 -#define V4928 (V + 18655) - 0x1106, 0x116b, 0x11bb, 0, -#undef V4929 -#define V4929 (V + 18659) - 0x1106, 0x116b, 0x11bc, 0, -#undef V4930 -#define V4930 (V + 18663) - 0x1106, 0x116b, 0x11bd, 0, -#undef V4931 -#define V4931 (V + 18667) - 0x1106, 0x116b, 0x11be, 0, -#undef V4932 -#define V4932 (V + 18671) - 0x1106, 0x116b, 0x11bf, 0, -#undef V4933 -#define V4933 (V + 18675) - 0x1106, 0x116b, 0x11c0, 0, -#undef V4934 -#define V4934 (V + 18679) - 0x1106, 0x116b, 0x11c1, 0, -#undef V4935 -#define V4935 (V + 18683) - 0x1106, 0x116b, 0x11c2, 0, -#undef V4936 -#define V4936 (V + 18687) - 0x1106, 0x116c, 0, -#undef V4937 -#define V4937 (V + 18690) - 0x1106, 0x116c, 0x11a8, 0, -#undef V4938 -#define V4938 (V + 18694) - 0x1106, 0x116c, 0x11a9, 0, -#undef V4939 -#define V4939 (V + 18698) - 0x1106, 0x116c, 0x11aa, 0, -#undef V4940 -#define V4940 (V + 18702) - 0x1106, 0x116c, 0x11ab, 0, -#undef V4941 -#define V4941 (V + 18706) - 0x1106, 0x116c, 0x11ac, 0, -#undef V4942 -#define V4942 (V + 18710) - 0x1106, 0x116c, 0x11ad, 0, -#undef V4943 -#define V4943 (V + 18714) - 0x1106, 0x116c, 0x11ae, 0, -#undef V4944 -#define V4944 (V + 18718) - 0x1106, 0x116c, 0x11af, 0, -#undef V4945 -#define V4945 (V + 18722) - 0x1106, 0x116c, 0x11b0, 0, -#undef V4946 -#define V4946 (V + 18726) - 0x1106, 0x116c, 0x11b1, 0, -#undef V4947 -#define V4947 (V + 18730) - 0x1106, 0x116c, 0x11b2, 0, -#undef V4948 -#define V4948 (V + 18734) - 0x1106, 0x116c, 0x11b3, 0, -#undef V4949 -#define V4949 (V + 18738) - 0x1106, 0x116c, 0x11b4, 0, -#undef V4950 -#define V4950 (V + 18742) - 0x1106, 0x116c, 0x11b5, 0, -#undef V4951 -#define V4951 (V + 18746) - 0x1106, 0x116c, 0x11b6, 0, -#undef V4952 -#define V4952 (V + 18750) - 0x1106, 0x116c, 0x11b7, 0, -#undef V4953 -#define V4953 (V + 18754) - 0x1106, 0x116c, 0x11b8, 0, -#undef V4954 -#define V4954 (V + 18758) - 0x1106, 0x116c, 0x11b9, 0, -#undef V4955 -#define V4955 (V + 18762) - 0x1106, 0x116c, 0x11ba, 0, -#undef V4956 -#define V4956 (V + 18766) - 0x1106, 0x116c, 0x11bb, 0, -#undef V4957 -#define V4957 (V + 18770) - 0x1106, 0x116c, 0x11bc, 0, -#undef V4958 -#define V4958 (V + 18774) - 0x1106, 0x116c, 0x11bd, 0, -#undef V4959 -#define V4959 (V + 18778) - 0x1106, 0x116c, 0x11be, 0, -#undef V4960 -#define V4960 (V + 18782) - 0x1106, 0x116c, 0x11bf, 0, -#undef V4961 -#define V4961 (V + 18786) - 0x1106, 0x116c, 0x11c0, 0, -#undef V4962 -#define V4962 (V + 18790) - 0x1106, 0x116c, 0x11c1, 0, -#undef V4963 -#define V4963 (V + 18794) - 0x1106, 0x116c, 0x11c2, 0, -#undef V4964 -#define V4964 (V + 18798) - 0x1106, 0x116d, 0, -#undef V4965 -#define V4965 (V + 18801) - 0x1106, 0x116d, 0x11a8, 0, -#undef V4966 -#define V4966 (V + 18805) - 0x1106, 0x116d, 0x11a9, 0, -#undef V4967 -#define V4967 (V + 18809) - 0x1106, 0x116d, 0x11aa, 0, -#undef V4968 -#define V4968 (V + 18813) - 0x1106, 0x116d, 0x11ab, 0, -#undef V4969 -#define V4969 (V + 18817) - 0x1106, 0x116d, 0x11ac, 0, -#undef V4970 -#define V4970 (V + 18821) - 0x1106, 0x116d, 0x11ad, 0, -#undef V4971 -#define V4971 (V + 18825) - 0x1106, 0x116d, 0x11ae, 0, -#undef V4972 -#define V4972 (V + 18829) - 0x1106, 0x116d, 0x11af, 0, -#undef V4973 -#define V4973 (V + 18833) - 0x1106, 0x116d, 0x11b0, 0, -#undef V4974 -#define V4974 (V + 18837) - 0x1106, 0x116d, 0x11b1, 0, -#undef V4975 -#define V4975 (V + 18841) - 0x1106, 0x116d, 0x11b2, 0, -#undef V4976 -#define V4976 (V + 18845) - 0x1106, 0x116d, 0x11b3, 0, -#undef V4977 -#define V4977 (V + 18849) - 0x1106, 0x116d, 0x11b4, 0, -#undef V4978 -#define V4978 (V + 18853) - 0x1106, 0x116d, 0x11b5, 0, -#undef V4979 -#define V4979 (V + 18857) - 0x1106, 0x116d, 0x11b6, 0, -#undef V4980 -#define V4980 (V + 18861) - 0x1106, 0x116d, 0x11b7, 0, -#undef V4981 -#define V4981 (V + 18865) - 0x1106, 0x116d, 0x11b8, 0, -#undef V4982 -#define V4982 (V + 18869) - 0x1106, 0x116d, 0x11b9, 0, -#undef V4983 -#define V4983 (V + 18873) - 0x1106, 0x116d, 0x11ba, 0, -#undef V4984 -#define V4984 (V + 18877) - 0x1106, 0x116d, 0x11bb, 0, -#undef V4985 -#define V4985 (V + 18881) - 0x1106, 0x116d, 0x11bc, 0, -#undef V4986 -#define V4986 (V + 18885) - 0x1106, 0x116d, 0x11bd, 0, -#undef V4987 -#define V4987 (V + 18889) - 0x1106, 0x116d, 0x11be, 0, -#undef V4988 -#define V4988 (V + 18893) - 0x1106, 0x116d, 0x11bf, 0, -#undef V4989 -#define V4989 (V + 18897) - 0x1106, 0x116d, 0x11c0, 0, -#undef V4990 -#define V4990 (V + 18901) - 0x1106, 0x116d, 0x11c1, 0, -#undef V4991 -#define V4991 (V + 18905) - 0x1106, 0x116d, 0x11c2, 0, -#undef V4992 -#define V4992 (V + 18909) - 0x1106, 0x116e, 0, -#undef V4993 -#define V4993 (V + 18912) - 0x1106, 0x116e, 0x11a8, 0, -#undef V4994 -#define V4994 (V + 18916) - 0x1106, 0x116e, 0x11a9, 0, -#undef V4995 -#define V4995 (V + 18920) - 0x1106, 0x116e, 0x11aa, 0, -#undef V4996 -#define V4996 (V + 18924) - 0x1106, 0x116e, 0x11ab, 0, -#undef V4997 -#define V4997 (V + 18928) - 0x1106, 0x116e, 0x11ac, 0, -#undef V4998 -#define V4998 (V + 18932) - 0x1106, 0x116e, 0x11ad, 0, -#undef V4999 -#define V4999 (V + 18936) - 0x1106, 0x116e, 0x11ae, 0, -#undef V5000 -#define V5000 (V + 18940) - 0x1106, 0x116e, 0x11af, 0, -#undef V5001 -#define V5001 (V + 18944) - 0x1106, 0x116e, 0x11b0, 0, -#undef V5002 -#define V5002 (V + 18948) - 0x1106, 0x116e, 0x11b1, 0, -#undef V5003 -#define V5003 (V + 18952) - 0x1106, 0x116e, 0x11b2, 0, -#undef V5004 -#define V5004 (V + 18956) - 0x1106, 0x116e, 0x11b3, 0, -#undef V5005 -#define V5005 (V + 18960) - 0x1106, 0x116e, 0x11b4, 0, -#undef V5006 -#define V5006 (V + 18964) - 0x1106, 0x116e, 0x11b5, 0, -#undef V5007 -#define V5007 (V + 18968) - 0x1106, 0x116e, 0x11b6, 0, -#undef V5008 -#define V5008 (V + 18972) - 0x1106, 0x116e, 0x11b7, 0, -#undef V5009 -#define V5009 (V + 18976) - 0x1106, 0x116e, 0x11b8, 0, -#undef V5010 -#define V5010 (V + 18980) - 0x1106, 0x116e, 0x11b9, 0, -#undef V5011 -#define V5011 (V + 18984) - 0x1106, 0x116e, 0x11ba, 0, -#undef V5012 -#define V5012 (V + 18988) - 0x1106, 0x116e, 0x11bb, 0, -#undef V5013 -#define V5013 (V + 18992) - 0x1106, 0x116e, 0x11bc, 0, -#undef V5014 -#define V5014 (V + 18996) - 0x1106, 0x116e, 0x11bd, 0, -#undef V5015 -#define V5015 (V + 19000) - 0x1106, 0x116e, 0x11be, 0, -#undef V5016 -#define V5016 (V + 19004) - 0x1106, 0x116e, 0x11bf, 0, -#undef V5017 -#define V5017 (V + 19008) - 0x1106, 0x116e, 0x11c0, 0, -#undef V5018 -#define V5018 (V + 19012) - 0x1106, 0x116e, 0x11c1, 0, -#undef V5019 -#define V5019 (V + 19016) - 0x1106, 0x116e, 0x11c2, 0, -#undef V5020 -#define V5020 (V + 19020) - 0x1106, 0x116f, 0, -#undef V5021 -#define V5021 (V + 19023) - 0x1106, 0x116f, 0x11a8, 0, -#undef V5022 -#define V5022 (V + 19027) - 0x1106, 0x116f, 0x11a9, 0, -#undef V5023 -#define V5023 (V + 19031) - 0x1106, 0x116f, 0x11aa, 0, -#undef V5024 -#define V5024 (V + 19035) - 0x1106, 0x116f, 0x11ab, 0, -#undef V5025 -#define V5025 (V + 19039) - 0x1106, 0x116f, 0x11ac, 0, -#undef V5026 -#define V5026 (V + 19043) - 0x1106, 0x116f, 0x11ad, 0, -#undef V5027 -#define V5027 (V + 19047) - 0x1106, 0x116f, 0x11ae, 0, -#undef V5028 -#define V5028 (V + 19051) - 0x1106, 0x116f, 0x11af, 0, -#undef V5029 -#define V5029 (V + 19055) - 0x1106, 0x116f, 0x11b0, 0, -#undef V5030 -#define V5030 (V + 19059) - 0x1106, 0x116f, 0x11b1, 0, -#undef V5031 -#define V5031 (V + 19063) - 0x1106, 0x116f, 0x11b2, 0, -#undef V5032 -#define V5032 (V + 19067) - 0x1106, 0x116f, 0x11b3, 0, -#undef V5033 -#define V5033 (V + 19071) - 0x1106, 0x116f, 0x11b4, 0, -#undef V5034 -#define V5034 (V + 19075) - 0x1106, 0x116f, 0x11b5, 0, -#undef V5035 -#define V5035 (V + 19079) - 0x1106, 0x116f, 0x11b6, 0, -#undef V5036 -#define V5036 (V + 19083) - 0x1106, 0x116f, 0x11b7, 0, -#undef V5037 -#define V5037 (V + 19087) - 0x1106, 0x116f, 0x11b8, 0, -#undef V5038 -#define V5038 (V + 19091) - 0x1106, 0x116f, 0x11b9, 0, -#undef V5039 -#define V5039 (V + 19095) - 0x1106, 0x116f, 0x11ba, 0, -#undef V5040 -#define V5040 (V + 19099) - 0x1106, 0x116f, 0x11bb, 0, -#undef V5041 -#define V5041 (V + 19103) - 0x1106, 0x116f, 0x11bc, 0, -#undef V5042 -#define V5042 (V + 19107) - 0x1106, 0x116f, 0x11bd, 0, -#undef V5043 -#define V5043 (V + 19111) - 0x1106, 0x116f, 0x11be, 0, -#undef V5044 -#define V5044 (V + 19115) - 0x1106, 0x116f, 0x11bf, 0, -#undef V5045 -#define V5045 (V + 19119) - 0x1106, 0x116f, 0x11c0, 0, -#undef V5046 -#define V5046 (V + 19123) - 0x1106, 0x116f, 0x11c1, 0, -#undef V5047 -#define V5047 (V + 19127) - 0x1106, 0x116f, 0x11c2, 0, -#undef V5048 -#define V5048 (V + 19131) - 0x1106, 0x1170, 0, -#undef V5049 -#define V5049 (V + 19134) - 0x1106, 0x1170, 0x11a8, 0, -#undef V5050 -#define V5050 (V + 19138) - 0x1106, 0x1170, 0x11a9, 0, -#undef V5051 -#define V5051 (V + 19142) - 0x1106, 0x1170, 0x11aa, 0, -#undef V5052 -#define V5052 (V + 19146) - 0x1106, 0x1170, 0x11ab, 0, -#undef V5053 -#define V5053 (V + 19150) - 0x1106, 0x1170, 0x11ac, 0, -#undef V5054 -#define V5054 (V + 19154) - 0x1106, 0x1170, 0x11ad, 0, -#undef V5055 -#define V5055 (V + 19158) - 0x1106, 0x1170, 0x11ae, 0, -#undef V5056 -#define V5056 (V + 19162) - 0x1106, 0x1170, 0x11af, 0, -#undef V5057 -#define V5057 (V + 19166) - 0x1106, 0x1170, 0x11b0, 0, -#undef V5058 -#define V5058 (V + 19170) - 0x1106, 0x1170, 0x11b1, 0, -#undef V5059 -#define V5059 (V + 19174) - 0x1106, 0x1170, 0x11b2, 0, -#undef V5060 -#define V5060 (V + 19178) - 0x1106, 0x1170, 0x11b3, 0, -#undef V5061 -#define V5061 (V + 19182) - 0x1106, 0x1170, 0x11b4, 0, -#undef V5062 -#define V5062 (V + 19186) - 0x1106, 0x1170, 0x11b5, 0, -#undef V5063 -#define V5063 (V + 19190) - 0x1106, 0x1170, 0x11b6, 0, -#undef V5064 -#define V5064 (V + 19194) - 0x1106, 0x1170, 0x11b7, 0, -#undef V5065 -#define V5065 (V + 19198) - 0x1106, 0x1170, 0x11b8, 0, -#undef V5066 -#define V5066 (V + 19202) - 0x1106, 0x1170, 0x11b9, 0, -#undef V5067 -#define V5067 (V + 19206) - 0x1106, 0x1170, 0x11ba, 0, -#undef V5068 -#define V5068 (V + 19210) - 0x1106, 0x1170, 0x11bb, 0, -#undef V5069 -#define V5069 (V + 19214) - 0x1106, 0x1170, 0x11bc, 0, -#undef V5070 -#define V5070 (V + 19218) - 0x1106, 0x1170, 0x11bd, 0, -#undef V5071 -#define V5071 (V + 19222) - 0x1106, 0x1170, 0x11be, 0, -#undef V5072 -#define V5072 (V + 19226) - 0x1106, 0x1170, 0x11bf, 0, -#undef V5073 -#define V5073 (V + 19230) - 0x1106, 0x1170, 0x11c0, 0, -#undef V5074 -#define V5074 (V + 19234) - 0x1106, 0x1170, 0x11c1, 0, -#undef V5075 -#define V5075 (V + 19238) - 0x1106, 0x1170, 0x11c2, 0, -#undef V5076 -#define V5076 (V + 19242) - 0x1106, 0x1171, 0, -#undef V5077 -#define V5077 (V + 19245) - 0x1106, 0x1171, 0x11a8, 0, -#undef V5078 -#define V5078 (V + 19249) - 0x1106, 0x1171, 0x11a9, 0, -#undef V5079 -#define V5079 (V + 19253) - 0x1106, 0x1171, 0x11aa, 0, -#undef V5080 -#define V5080 (V + 19257) - 0x1106, 0x1171, 0x11ab, 0, -#undef V5081 -#define V5081 (V + 19261) - 0x1106, 0x1171, 0x11ac, 0, -#undef V5082 -#define V5082 (V + 19265) - 0x1106, 0x1171, 0x11ad, 0, -#undef V5083 -#define V5083 (V + 19269) - 0x1106, 0x1171, 0x11ae, 0, -#undef V5084 -#define V5084 (V + 19273) - 0x1106, 0x1171, 0x11af, 0, -#undef V5085 -#define V5085 (V + 19277) - 0x1106, 0x1171, 0x11b0, 0, -#undef V5086 -#define V5086 (V + 19281) - 0x1106, 0x1171, 0x11b1, 0, -#undef V5087 -#define V5087 (V + 19285) - 0x1106, 0x1171, 0x11b2, 0, -#undef V5088 -#define V5088 (V + 19289) - 0x1106, 0x1171, 0x11b3, 0, -#undef V5089 -#define V5089 (V + 19293) - 0x1106, 0x1171, 0x11b4, 0, -#undef V5090 -#define V5090 (V + 19297) - 0x1106, 0x1171, 0x11b5, 0, -#undef V5091 -#define V5091 (V + 19301) - 0x1106, 0x1171, 0x11b6, 0, -#undef V5092 -#define V5092 (V + 19305) - 0x1106, 0x1171, 0x11b7, 0, -#undef V5093 -#define V5093 (V + 19309) - 0x1106, 0x1171, 0x11b8, 0, -#undef V5094 -#define V5094 (V + 19313) - 0x1106, 0x1171, 0x11b9, 0, -#undef V5095 -#define V5095 (V + 19317) - 0x1106, 0x1171, 0x11ba, 0, -#undef V5096 -#define V5096 (V + 19321) - 0x1106, 0x1171, 0x11bb, 0, -#undef V5097 -#define V5097 (V + 19325) - 0x1106, 0x1171, 0x11bc, 0, -#undef V5098 -#define V5098 (V + 19329) - 0x1106, 0x1171, 0x11bd, 0, -#undef V5099 -#define V5099 (V + 19333) - 0x1106, 0x1171, 0x11be, 0, -#undef V5100 -#define V5100 (V + 19337) - 0x1106, 0x1171, 0x11bf, 0, -#undef V5101 -#define V5101 (V + 19341) - 0x1106, 0x1171, 0x11c0, 0, -#undef V5102 -#define V5102 (V + 19345) - 0x1106, 0x1171, 0x11c1, 0, -#undef V5103 -#define V5103 (V + 19349) - 0x1106, 0x1171, 0x11c2, 0, -#undef V5104 -#define V5104 (V + 19353) - 0x1106, 0x1172, 0, -#undef V5105 -#define V5105 (V + 19356) - 0x1106, 0x1172, 0x11a8, 0, -#undef V5106 -#define V5106 (V + 19360) - 0x1106, 0x1172, 0x11a9, 0, -#undef V5107 -#define V5107 (V + 19364) - 0x1106, 0x1172, 0x11aa, 0, -#undef V5108 -#define V5108 (V + 19368) - 0x1106, 0x1172, 0x11ab, 0, -#undef V5109 -#define V5109 (V + 19372) - 0x1106, 0x1172, 0x11ac, 0, -#undef V5110 -#define V5110 (V + 19376) - 0x1106, 0x1172, 0x11ad, 0, -#undef V5111 -#define V5111 (V + 19380) - 0x1106, 0x1172, 0x11ae, 0, -#undef V5112 -#define V5112 (V + 19384) - 0x1106, 0x1172, 0x11af, 0, -#undef V5113 -#define V5113 (V + 19388) - 0x1106, 0x1172, 0x11b0, 0, -#undef V5114 -#define V5114 (V + 19392) - 0x1106, 0x1172, 0x11b1, 0, -#undef V5115 -#define V5115 (V + 19396) - 0x1106, 0x1172, 0x11b2, 0, -#undef V5116 -#define V5116 (V + 19400) - 0x1106, 0x1172, 0x11b3, 0, -#undef V5117 -#define V5117 (V + 19404) - 0x1106, 0x1172, 0x11b4, 0, -#undef V5118 -#define V5118 (V + 19408) - 0x1106, 0x1172, 0x11b5, 0, -#undef V5119 -#define V5119 (V + 19412) - 0x1106, 0x1172, 0x11b6, 0, -#undef V5120 -#define V5120 (V + 19416) - 0x1106, 0x1172, 0x11b7, 0, -#undef V5121 -#define V5121 (V + 19420) - 0x1106, 0x1172, 0x11b8, 0, -#undef V5122 -#define V5122 (V + 19424) - 0x1106, 0x1172, 0x11b9, 0, -#undef V5123 -#define V5123 (V + 19428) - 0x1106, 0x1172, 0x11ba, 0, -#undef V5124 -#define V5124 (V + 19432) - 0x1106, 0x1172, 0x11bb, 0, -#undef V5125 -#define V5125 (V + 19436) - 0x1106, 0x1172, 0x11bc, 0, -#undef V5126 -#define V5126 (V + 19440) - 0x1106, 0x1172, 0x11bd, 0, -#undef V5127 -#define V5127 (V + 19444) - 0x1106, 0x1172, 0x11be, 0, -#undef V5128 -#define V5128 (V + 19448) - 0x1106, 0x1172, 0x11bf, 0, -#undef V5129 -#define V5129 (V + 19452) - 0x1106, 0x1172, 0x11c0, 0, -#undef V5130 -#define V5130 (V + 19456) - 0x1106, 0x1172, 0x11c1, 0, -#undef V5131 -#define V5131 (V + 19460) - 0x1106, 0x1172, 0x11c2, 0, -#undef V5132 -#define V5132 (V + 19464) - 0x1106, 0x1173, 0, -#undef V5133 -#define V5133 (V + 19467) - 0x1106, 0x1173, 0x11a8, 0, -#undef V5134 -#define V5134 (V + 19471) - 0x1106, 0x1173, 0x11a9, 0, -#undef V5135 -#define V5135 (V + 19475) - 0x1106, 0x1173, 0x11aa, 0, -#undef V5136 -#define V5136 (V + 19479) - 0x1106, 0x1173, 0x11ab, 0, -#undef V5137 -#define V5137 (V + 19483) - 0x1106, 0x1173, 0x11ac, 0, -#undef V5138 -#define V5138 (V + 19487) - 0x1106, 0x1173, 0x11ad, 0, -#undef V5139 -#define V5139 (V + 19491) - 0x1106, 0x1173, 0x11ae, 0, -#undef V5140 -#define V5140 (V + 19495) - 0x1106, 0x1173, 0x11af, 0, -#undef V5141 -#define V5141 (V + 19499) - 0x1106, 0x1173, 0x11b0, 0, -#undef V5142 -#define V5142 (V + 19503) - 0x1106, 0x1173, 0x11b1, 0, -#undef V5143 -#define V5143 (V + 19507) - 0x1106, 0x1173, 0x11b2, 0, -#undef V5144 -#define V5144 (V + 19511) - 0x1106, 0x1173, 0x11b3, 0, -#undef V5145 -#define V5145 (V + 19515) - 0x1106, 0x1173, 0x11b4, 0, -#undef V5146 -#define V5146 (V + 19519) - 0x1106, 0x1173, 0x11b5, 0, -#undef V5147 -#define V5147 (V + 19523) - 0x1106, 0x1173, 0x11b6, 0, -#undef V5148 -#define V5148 (V + 19527) - 0x1106, 0x1173, 0x11b7, 0, -#undef V5149 -#define V5149 (V + 19531) - 0x1106, 0x1173, 0x11b8, 0, -#undef V5150 -#define V5150 (V + 19535) - 0x1106, 0x1173, 0x11b9, 0, -#undef V5151 -#define V5151 (V + 19539) - 0x1106, 0x1173, 0x11ba, 0, -#undef V5152 -#define V5152 (V + 19543) - 0x1106, 0x1173, 0x11bb, 0, -#undef V5153 -#define V5153 (V + 19547) - 0x1106, 0x1173, 0x11bc, 0, -#undef V5154 -#define V5154 (V + 19551) - 0x1106, 0x1173, 0x11bd, 0, -#undef V5155 -#define V5155 (V + 19555) - 0x1106, 0x1173, 0x11be, 0, -#undef V5156 -#define V5156 (V + 19559) - 0x1106, 0x1173, 0x11bf, 0, -#undef V5157 -#define V5157 (V + 19563) - 0x1106, 0x1173, 0x11c0, 0, -#undef V5158 -#define V5158 (V + 19567) - 0x1106, 0x1173, 0x11c1, 0, -#undef V5159 -#define V5159 (V + 19571) - 0x1106, 0x1173, 0x11c2, 0, -#undef V5160 -#define V5160 (V + 19575) - 0x1106, 0x1174, 0, -#undef V5161 -#define V5161 (V + 19578) - 0x1106, 0x1174, 0x11a8, 0, -#undef V5162 -#define V5162 (V + 19582) - 0x1106, 0x1174, 0x11a9, 0, -#undef V5163 -#define V5163 (V + 19586) - 0x1106, 0x1174, 0x11aa, 0, -#undef V5164 -#define V5164 (V + 19590) - 0x1106, 0x1174, 0x11ab, 0, -#undef V5165 -#define V5165 (V + 19594) - 0x1106, 0x1174, 0x11ac, 0, -#undef V5166 -#define V5166 (V + 19598) - 0x1106, 0x1174, 0x11ad, 0, -#undef V5167 -#define V5167 (V + 19602) - 0x1106, 0x1174, 0x11ae, 0, -#undef V5168 -#define V5168 (V + 19606) - 0x1106, 0x1174, 0x11af, 0, -#undef V5169 -#define V5169 (V + 19610) - 0x1106, 0x1174, 0x11b0, 0, -#undef V5170 -#define V5170 (V + 19614) - 0x1106, 0x1174, 0x11b1, 0, -#undef V5171 -#define V5171 (V + 19618) - 0x1106, 0x1174, 0x11b2, 0, -#undef V5172 -#define V5172 (V + 19622) - 0x1106, 0x1174, 0x11b3, 0, -#undef V5173 -#define V5173 (V + 19626) - 0x1106, 0x1174, 0x11b4, 0, -#undef V5174 -#define V5174 (V + 19630) - 0x1106, 0x1174, 0x11b5, 0, -#undef V5175 -#define V5175 (V + 19634) - 0x1106, 0x1174, 0x11b6, 0, -#undef V5176 -#define V5176 (V + 19638) - 0x1106, 0x1174, 0x11b7, 0, -#undef V5177 -#define V5177 (V + 19642) - 0x1106, 0x1174, 0x11b8, 0, -#undef V5178 -#define V5178 (V + 19646) - 0x1106, 0x1174, 0x11b9, 0, -#undef V5179 -#define V5179 (V + 19650) - 0x1106, 0x1174, 0x11ba, 0, -#undef V5180 -#define V5180 (V + 19654) - 0x1106, 0x1174, 0x11bb, 0, -#undef V5181 -#define V5181 (V + 19658) - 0x1106, 0x1174, 0x11bc, 0, -#undef V5182 -#define V5182 (V + 19662) - 0x1106, 0x1174, 0x11bd, 0, -#undef V5183 -#define V5183 (V + 19666) - 0x1106, 0x1174, 0x11be, 0, -#undef V5184 -#define V5184 (V + 19670) - 0x1106, 0x1174, 0x11bf, 0, -#undef V5185 -#define V5185 (V + 19674) - 0x1106, 0x1174, 0x11c0, 0, -#undef V5186 -#define V5186 (V + 19678) - 0x1106, 0x1174, 0x11c1, 0, -#undef V5187 -#define V5187 (V + 19682) - 0x1106, 0x1174, 0x11c2, 0, -#undef V5188 -#define V5188 (V + 19686) - 0x1106, 0x1175, 0, -#undef V5189 -#define V5189 (V + 19689) - 0x1106, 0x1175, 0x11a8, 0, -#undef V5190 -#define V5190 (V + 19693) - 0x1106, 0x1175, 0x11a9, 0, -#undef V5191 -#define V5191 (V + 19697) - 0x1106, 0x1175, 0x11aa, 0, -#undef V5192 -#define V5192 (V + 19701) - 0x1106, 0x1175, 0x11ab, 0, -#undef V5193 -#define V5193 (V + 19705) - 0x1106, 0x1175, 0x11ac, 0, -#undef V5194 -#define V5194 (V + 19709) - 0x1106, 0x1175, 0x11ad, 0, -#undef V5195 -#define V5195 (V + 19713) - 0x1106, 0x1175, 0x11ae, 0, -#undef V5196 -#define V5196 (V + 19717) - 0x1106, 0x1175, 0x11af, 0, -#undef V5197 -#define V5197 (V + 19721) - 0x1106, 0x1175, 0x11b0, 0, -#undef V5198 -#define V5198 (V + 19725) - 0x1106, 0x1175, 0x11b1, 0, -#undef V5199 -#define V5199 (V + 19729) - 0x1106, 0x1175, 0x11b2, 0, -#undef V5200 -#define V5200 (V + 19733) - 0x1106, 0x1175, 0x11b3, 0, -#undef V5201 -#define V5201 (V + 19737) - 0x1106, 0x1175, 0x11b4, 0, -#undef V5202 -#define V5202 (V + 19741) - 0x1106, 0x1175, 0x11b5, 0, -#undef V5203 -#define V5203 (V + 19745) - 0x1106, 0x1175, 0x11b6, 0, -#undef V5204 -#define V5204 (V + 19749) - 0x1106, 0x1175, 0x11b7, 0, -#undef V5205 -#define V5205 (V + 19753) - 0x1106, 0x1175, 0x11b8, 0, -#undef V5206 -#define V5206 (V + 19757) - 0x1106, 0x1175, 0x11b9, 0, -#undef V5207 -#define V5207 (V + 19761) - 0x1106, 0x1175, 0x11ba, 0, -#undef V5208 -#define V5208 (V + 19765) - 0x1106, 0x1175, 0x11bb, 0, -#undef V5209 -#define V5209 (V + 19769) - 0x1106, 0x1175, 0x11bc, 0, -#undef V5210 -#define V5210 (V + 19773) - 0x1106, 0x1175, 0x11bd, 0, -#undef V5211 -#define V5211 (V + 19777) - 0x1106, 0x1175, 0x11be, 0, -#undef V5212 -#define V5212 (V + 19781) - 0x1106, 0x1175, 0x11bf, 0, -#undef V5213 -#define V5213 (V + 19785) - 0x1106, 0x1175, 0x11c0, 0, -#undef V5214 -#define V5214 (V + 19789) - 0x1106, 0x1175, 0x11c1, 0, -#undef V5215 -#define V5215 (V + 19793) - 0x1106, 0x1175, 0x11c2, 0, -#undef V5216 -#define V5216 (V + 19797) - 0x1107, 0x1161, 0, -#undef V5217 -#define V5217 (V + 19800) - 0x1107, 0x1161, 0x11a8, 0, -#undef V5218 -#define V5218 (V + 19804) - 0x1107, 0x1161, 0x11a9, 0, -#undef V5219 -#define V5219 (V + 19808) - 0x1107, 0x1161, 0x11aa, 0, -#undef V5220 -#define V5220 (V + 19812) - 0x1107, 0x1161, 0x11ab, 0, -#undef V5221 -#define V5221 (V + 19816) - 0x1107, 0x1161, 0x11ac, 0, -#undef V5222 -#define V5222 (V + 19820) - 0x1107, 0x1161, 0x11ad, 0, -#undef V5223 -#define V5223 (V + 19824) - 0x1107, 0x1161, 0x11ae, 0, -#undef V5224 -#define V5224 (V + 19828) - 0x1107, 0x1161, 0x11af, 0, -#undef V5225 -#define V5225 (V + 19832) - 0x1107, 0x1161, 0x11b0, 0, -#undef V5226 -#define V5226 (V + 19836) - 0x1107, 0x1161, 0x11b1, 0, -#undef V5227 -#define V5227 (V + 19840) - 0x1107, 0x1161, 0x11b2, 0, -#undef V5228 -#define V5228 (V + 19844) - 0x1107, 0x1161, 0x11b3, 0, -#undef V5229 -#define V5229 (V + 19848) - 0x1107, 0x1161, 0x11b4, 0, -#undef V5230 -#define V5230 (V + 19852) - 0x1107, 0x1161, 0x11b5, 0, -#undef V5231 -#define V5231 (V + 19856) - 0x1107, 0x1161, 0x11b6, 0, -#undef V5232 -#define V5232 (V + 19860) - 0x1107, 0x1161, 0x11b7, 0, -#undef V5233 -#define V5233 (V + 19864) - 0x1107, 0x1161, 0x11b8, 0, -#undef V5234 -#define V5234 (V + 19868) - 0x1107, 0x1161, 0x11b9, 0, -#undef V5235 -#define V5235 (V + 19872) - 0x1107, 0x1161, 0x11ba, 0, -#undef V5236 -#define V5236 (V + 19876) - 0x1107, 0x1161, 0x11bb, 0, -#undef V5237 -#define V5237 (V + 19880) - 0x1107, 0x1161, 0x11bc, 0, -#undef V5238 -#define V5238 (V + 19884) - 0x1107, 0x1161, 0x11bd, 0, -#undef V5239 -#define V5239 (V + 19888) - 0x1107, 0x1161, 0x11be, 0, -#undef V5240 -#define V5240 (V + 19892) - 0x1107, 0x1161, 0x11bf, 0, -#undef V5241 -#define V5241 (V + 19896) - 0x1107, 0x1161, 0x11c0, 0, -#undef V5242 -#define V5242 (V + 19900) - 0x1107, 0x1161, 0x11c1, 0, -#undef V5243 -#define V5243 (V + 19904) - 0x1107, 0x1161, 0x11c2, 0, -#undef V5244 -#define V5244 (V + 19908) - 0x1107, 0x1162, 0, -#undef V5245 -#define V5245 (V + 19911) - 0x1107, 0x1162, 0x11a8, 0, -#undef V5246 -#define V5246 (V + 19915) - 0x1107, 0x1162, 0x11a9, 0, -#undef V5247 -#define V5247 (V + 19919) - 0x1107, 0x1162, 0x11aa, 0, -#undef V5248 -#define V5248 (V + 19923) - 0x1107, 0x1162, 0x11ab, 0, -#undef V5249 -#define V5249 (V + 19927) - 0x1107, 0x1162, 0x11ac, 0, -#undef V5250 -#define V5250 (V + 19931) - 0x1107, 0x1162, 0x11ad, 0, -#undef V5251 -#define V5251 (V + 19935) - 0x1107, 0x1162, 0x11ae, 0, -#undef V5252 -#define V5252 (V + 19939) - 0x1107, 0x1162, 0x11af, 0, -#undef V5253 -#define V5253 (V + 19943) - 0x1107, 0x1162, 0x11b0, 0, -#undef V5254 -#define V5254 (V + 19947) - 0x1107, 0x1162, 0x11b1, 0, -#undef V5255 -#define V5255 (V + 19951) - 0x1107, 0x1162, 0x11b2, 0, -#undef V5256 -#define V5256 (V + 19955) - 0x1107, 0x1162, 0x11b3, 0, -#undef V5257 -#define V5257 (V + 19959) - 0x1107, 0x1162, 0x11b4, 0, -#undef V5258 -#define V5258 (V + 19963) - 0x1107, 0x1162, 0x11b5, 0, -#undef V5259 -#define V5259 (V + 19967) - 0x1107, 0x1162, 0x11b6, 0, -#undef V5260 -#define V5260 (V + 19971) - 0x1107, 0x1162, 0x11b7, 0, -#undef V5261 -#define V5261 (V + 19975) - 0x1107, 0x1162, 0x11b8, 0, -#undef V5262 -#define V5262 (V + 19979) - 0x1107, 0x1162, 0x11b9, 0, -#undef V5263 -#define V5263 (V + 19983) - 0x1107, 0x1162, 0x11ba, 0, -#undef V5264 -#define V5264 (V + 19987) - 0x1107, 0x1162, 0x11bb, 0, -#undef V5265 -#define V5265 (V + 19991) - 0x1107, 0x1162, 0x11bc, 0, -#undef V5266 -#define V5266 (V + 19995) - 0x1107, 0x1162, 0x11bd, 0, -#undef V5267 -#define V5267 (V + 19999) - 0x1107, 0x1162, 0x11be, 0, -#undef V5268 -#define V5268 (V + 20003) - 0x1107, 0x1162, 0x11bf, 0, -#undef V5269 -#define V5269 (V + 20007) - 0x1107, 0x1162, 0x11c0, 0, -#undef V5270 -#define V5270 (V + 20011) - 0x1107, 0x1162, 0x11c1, 0, -#undef V5271 -#define V5271 (V + 20015) - 0x1107, 0x1162, 0x11c2, 0, -#undef V5272 -#define V5272 (V + 20019) - 0x1107, 0x1163, 0, -#undef V5273 -#define V5273 (V + 20022) - 0x1107, 0x1163, 0x11a8, 0, -#undef V5274 -#define V5274 (V + 20026) - 0x1107, 0x1163, 0x11a9, 0, -#undef V5275 -#define V5275 (V + 20030) - 0x1107, 0x1163, 0x11aa, 0, -#undef V5276 -#define V5276 (V + 20034) - 0x1107, 0x1163, 0x11ab, 0, -#undef V5277 -#define V5277 (V + 20038) - 0x1107, 0x1163, 0x11ac, 0, -#undef V5278 -#define V5278 (V + 20042) - 0x1107, 0x1163, 0x11ad, 0, -#undef V5279 -#define V5279 (V + 20046) - 0x1107, 0x1163, 0x11ae, 0, -#undef V5280 -#define V5280 (V + 20050) - 0x1107, 0x1163, 0x11af, 0, -#undef V5281 -#define V5281 (V + 20054) - 0x1107, 0x1163, 0x11b0, 0, -#undef V5282 -#define V5282 (V + 20058) - 0x1107, 0x1163, 0x11b1, 0, -#undef V5283 -#define V5283 (V + 20062) - 0x1107, 0x1163, 0x11b2, 0, -#undef V5284 -#define V5284 (V + 20066) - 0x1107, 0x1163, 0x11b3, 0, -#undef V5285 -#define V5285 (V + 20070) - 0x1107, 0x1163, 0x11b4, 0, -#undef V5286 -#define V5286 (V + 20074) - 0x1107, 0x1163, 0x11b5, 0, -#undef V5287 -#define V5287 (V + 20078) - 0x1107, 0x1163, 0x11b6, 0, -#undef V5288 -#define V5288 (V + 20082) - 0x1107, 0x1163, 0x11b7, 0, -#undef V5289 -#define V5289 (V + 20086) - 0x1107, 0x1163, 0x11b8, 0, -#undef V5290 -#define V5290 (V + 20090) - 0x1107, 0x1163, 0x11b9, 0, -#undef V5291 -#define V5291 (V + 20094) - 0x1107, 0x1163, 0x11ba, 0, -#undef V5292 -#define V5292 (V + 20098) - 0x1107, 0x1163, 0x11bb, 0, -#undef V5293 -#define V5293 (V + 20102) - 0x1107, 0x1163, 0x11bc, 0, -#undef V5294 -#define V5294 (V + 20106) - 0x1107, 0x1163, 0x11bd, 0, -#undef V5295 -#define V5295 (V + 20110) - 0x1107, 0x1163, 0x11be, 0, -#undef V5296 -#define V5296 (V + 20114) - 0x1107, 0x1163, 0x11bf, 0, -#undef V5297 -#define V5297 (V + 20118) - 0x1107, 0x1163, 0x11c0, 0, -#undef V5298 -#define V5298 (V + 20122) - 0x1107, 0x1163, 0x11c1, 0, -#undef V5299 -#define V5299 (V + 20126) - 0x1107, 0x1163, 0x11c2, 0, -#undef V5300 -#define V5300 (V + 20130) - 0x1107, 0x1164, 0, -#undef V5301 -#define V5301 (V + 20133) - 0x1107, 0x1164, 0x11a8, 0, -#undef V5302 -#define V5302 (V + 20137) - 0x1107, 0x1164, 0x11a9, 0, -#undef V5303 -#define V5303 (V + 20141) - 0x1107, 0x1164, 0x11aa, 0, -#undef V5304 -#define V5304 (V + 20145) - 0x1107, 0x1164, 0x11ab, 0, -#undef V5305 -#define V5305 (V + 20149) - 0x1107, 0x1164, 0x11ac, 0, -#undef V5306 -#define V5306 (V + 20153) - 0x1107, 0x1164, 0x11ad, 0, -#undef V5307 -#define V5307 (V + 20157) - 0x1107, 0x1164, 0x11ae, 0, -#undef V5308 -#define V5308 (V + 20161) - 0x1107, 0x1164, 0x11af, 0, -#undef V5309 -#define V5309 (V + 20165) - 0x1107, 0x1164, 0x11b0, 0, -#undef V5310 -#define V5310 (V + 20169) - 0x1107, 0x1164, 0x11b1, 0, -#undef V5311 -#define V5311 (V + 20173) - 0x1107, 0x1164, 0x11b2, 0, -#undef V5312 -#define V5312 (V + 20177) - 0x1107, 0x1164, 0x11b3, 0, -#undef V5313 -#define V5313 (V + 20181) - 0x1107, 0x1164, 0x11b4, 0, -#undef V5314 -#define V5314 (V + 20185) - 0x1107, 0x1164, 0x11b5, 0, -#undef V5315 -#define V5315 (V + 20189) - 0x1107, 0x1164, 0x11b6, 0, -#undef V5316 -#define V5316 (V + 20193) - 0x1107, 0x1164, 0x11b7, 0, -#undef V5317 -#define V5317 (V + 20197) - 0x1107, 0x1164, 0x11b8, 0, -#undef V5318 -#define V5318 (V + 20201) - 0x1107, 0x1164, 0x11b9, 0, -#undef V5319 -#define V5319 (V + 20205) - 0x1107, 0x1164, 0x11ba, 0, -#undef V5320 -#define V5320 (V + 20209) - 0x1107, 0x1164, 0x11bb, 0, -#undef V5321 -#define V5321 (V + 20213) - 0x1107, 0x1164, 0x11bc, 0, -#undef V5322 -#define V5322 (V + 20217) - 0x1107, 0x1164, 0x11bd, 0, -#undef V5323 -#define V5323 (V + 20221) - 0x1107, 0x1164, 0x11be, 0, -#undef V5324 -#define V5324 (V + 20225) - 0x1107, 0x1164, 0x11bf, 0, -#undef V5325 -#define V5325 (V + 20229) - 0x1107, 0x1164, 0x11c0, 0, -#undef V5326 -#define V5326 (V + 20233) - 0x1107, 0x1164, 0x11c1, 0, -#undef V5327 -#define V5327 (V + 20237) - 0x1107, 0x1164, 0x11c2, 0, -#undef V5328 -#define V5328 (V + 20241) - 0x1107, 0x1165, 0, -#undef V5329 -#define V5329 (V + 20244) - 0x1107, 0x1165, 0x11a8, 0, -#undef V5330 -#define V5330 (V + 20248) - 0x1107, 0x1165, 0x11a9, 0, -#undef V5331 -#define V5331 (V + 20252) - 0x1107, 0x1165, 0x11aa, 0, -#undef V5332 -#define V5332 (V + 20256) - 0x1107, 0x1165, 0x11ab, 0, -#undef V5333 -#define V5333 (V + 20260) - 0x1107, 0x1165, 0x11ac, 0, -#undef V5334 -#define V5334 (V + 20264) - 0x1107, 0x1165, 0x11ad, 0, -#undef V5335 -#define V5335 (V + 20268) - 0x1107, 0x1165, 0x11ae, 0, -#undef V5336 -#define V5336 (V + 20272) - 0x1107, 0x1165, 0x11af, 0, -#undef V5337 -#define V5337 (V + 20276) - 0x1107, 0x1165, 0x11b0, 0, -#undef V5338 -#define V5338 (V + 20280) - 0x1107, 0x1165, 0x11b1, 0, -#undef V5339 -#define V5339 (V + 20284) - 0x1107, 0x1165, 0x11b2, 0, -#undef V5340 -#define V5340 (V + 20288) - 0x1107, 0x1165, 0x11b3, 0, -#undef V5341 -#define V5341 (V + 20292) - 0x1107, 0x1165, 0x11b4, 0, -#undef V5342 -#define V5342 (V + 20296) - 0x1107, 0x1165, 0x11b5, 0, -#undef V5343 -#define V5343 (V + 20300) - 0x1107, 0x1165, 0x11b6, 0, -#undef V5344 -#define V5344 (V + 20304) - 0x1107, 0x1165, 0x11b7, 0, -#undef V5345 -#define V5345 (V + 20308) - 0x1107, 0x1165, 0x11b8, 0, -#undef V5346 -#define V5346 (V + 20312) - 0x1107, 0x1165, 0x11b9, 0, -#undef V5347 -#define V5347 (V + 20316) - 0x1107, 0x1165, 0x11ba, 0, -#undef V5348 -#define V5348 (V + 20320) - 0x1107, 0x1165, 0x11bb, 0, -#undef V5349 -#define V5349 (V + 20324) - 0x1107, 0x1165, 0x11bc, 0, -#undef V5350 -#define V5350 (V + 20328) - 0x1107, 0x1165, 0x11bd, 0, -#undef V5351 -#define V5351 (V + 20332) - 0x1107, 0x1165, 0x11be, 0, -#undef V5352 -#define V5352 (V + 20336) - 0x1107, 0x1165, 0x11bf, 0, -#undef V5353 -#define V5353 (V + 20340) - 0x1107, 0x1165, 0x11c0, 0, -#undef V5354 -#define V5354 (V + 20344) - 0x1107, 0x1165, 0x11c1, 0, -#undef V5355 -#define V5355 (V + 20348) - 0x1107, 0x1165, 0x11c2, 0, -#undef V5356 -#define V5356 (V + 20352) - 0x1107, 0x1166, 0, -#undef V5357 -#define V5357 (V + 20355) - 0x1107, 0x1166, 0x11a8, 0, -#undef V5358 -#define V5358 (V + 20359) - 0x1107, 0x1166, 0x11a9, 0, -#undef V5359 -#define V5359 (V + 20363) - 0x1107, 0x1166, 0x11aa, 0, -#undef V5360 -#define V5360 (V + 20367) - 0x1107, 0x1166, 0x11ab, 0, -#undef V5361 -#define V5361 (V + 20371) - 0x1107, 0x1166, 0x11ac, 0, -#undef V5362 -#define V5362 (V + 20375) - 0x1107, 0x1166, 0x11ad, 0, -#undef V5363 -#define V5363 (V + 20379) - 0x1107, 0x1166, 0x11ae, 0, -#undef V5364 -#define V5364 (V + 20383) - 0x1107, 0x1166, 0x11af, 0, -#undef V5365 -#define V5365 (V + 20387) - 0x1107, 0x1166, 0x11b0, 0, -#undef V5366 -#define V5366 (V + 20391) - 0x1107, 0x1166, 0x11b1, 0, -#undef V5367 -#define V5367 (V + 20395) - 0x1107, 0x1166, 0x11b2, 0, -#undef V5368 -#define V5368 (V + 20399) - 0x1107, 0x1166, 0x11b3, 0, -#undef V5369 -#define V5369 (V + 20403) - 0x1107, 0x1166, 0x11b4, 0, -#undef V5370 -#define V5370 (V + 20407) - 0x1107, 0x1166, 0x11b5, 0, -#undef V5371 -#define V5371 (V + 20411) - 0x1107, 0x1166, 0x11b6, 0, -#undef V5372 -#define V5372 (V + 20415) - 0x1107, 0x1166, 0x11b7, 0, -#undef V5373 -#define V5373 (V + 20419) - 0x1107, 0x1166, 0x11b8, 0, -#undef V5374 -#define V5374 (V + 20423) - 0x1107, 0x1166, 0x11b9, 0, -#undef V5375 -#define V5375 (V + 20427) - 0x1107, 0x1166, 0x11ba, 0, -#undef V5376 -#define V5376 (V + 20431) - 0x1107, 0x1166, 0x11bb, 0, -#undef V5377 -#define V5377 (V + 20435) - 0x1107, 0x1166, 0x11bc, 0, -#undef V5378 -#define V5378 (V + 20439) - 0x1107, 0x1166, 0x11bd, 0, -#undef V5379 -#define V5379 (V + 20443) - 0x1107, 0x1166, 0x11be, 0, -#undef V5380 -#define V5380 (V + 20447) - 0x1107, 0x1166, 0x11bf, 0, -#undef V5381 -#define V5381 (V + 20451) - 0x1107, 0x1166, 0x11c0, 0, -#undef V5382 -#define V5382 (V + 20455) - 0x1107, 0x1166, 0x11c1, 0, -#undef V5383 -#define V5383 (V + 20459) - 0x1107, 0x1166, 0x11c2, 0, -#undef V5384 -#define V5384 (V + 20463) - 0x1107, 0x1167, 0, -#undef V5385 -#define V5385 (V + 20466) - 0x1107, 0x1167, 0x11a8, 0, -#undef V5386 -#define V5386 (V + 20470) - 0x1107, 0x1167, 0x11a9, 0, -#undef V5387 -#define V5387 (V + 20474) - 0x1107, 0x1167, 0x11aa, 0, -#undef V5388 -#define V5388 (V + 20478) - 0x1107, 0x1167, 0x11ab, 0, -#undef V5389 -#define V5389 (V + 20482) - 0x1107, 0x1167, 0x11ac, 0, -#undef V5390 -#define V5390 (V + 20486) - 0x1107, 0x1167, 0x11ad, 0, -#undef V5391 -#define V5391 (V + 20490) - 0x1107, 0x1167, 0x11ae, 0, -#undef V5392 -#define V5392 (V + 20494) - 0x1107, 0x1167, 0x11af, 0, -#undef V5393 -#define V5393 (V + 20498) - 0x1107, 0x1167, 0x11b0, 0, -#undef V5394 -#define V5394 (V + 20502) - 0x1107, 0x1167, 0x11b1, 0, -#undef V5395 -#define V5395 (V + 20506) - 0x1107, 0x1167, 0x11b2, 0, -#undef V5396 -#define V5396 (V + 20510) - 0x1107, 0x1167, 0x11b3, 0, -#undef V5397 -#define V5397 (V + 20514) - 0x1107, 0x1167, 0x11b4, 0, -#undef V5398 -#define V5398 (V + 20518) - 0x1107, 0x1167, 0x11b5, 0, -#undef V5399 -#define V5399 (V + 20522) - 0x1107, 0x1167, 0x11b6, 0, -#undef V5400 -#define V5400 (V + 20526) - 0x1107, 0x1167, 0x11b7, 0, -#undef V5401 -#define V5401 (V + 20530) - 0x1107, 0x1167, 0x11b8, 0, -#undef V5402 -#define V5402 (V + 20534) - 0x1107, 0x1167, 0x11b9, 0, -#undef V5403 -#define V5403 (V + 20538) - 0x1107, 0x1167, 0x11ba, 0, -#undef V5404 -#define V5404 (V + 20542) - 0x1107, 0x1167, 0x11bb, 0, -#undef V5405 -#define V5405 (V + 20546) - 0x1107, 0x1167, 0x11bc, 0, -#undef V5406 -#define V5406 (V + 20550) - 0x1107, 0x1167, 0x11bd, 0, -#undef V5407 -#define V5407 (V + 20554) - 0x1107, 0x1167, 0x11be, 0, -#undef V5408 -#define V5408 (V + 20558) - 0x1107, 0x1167, 0x11bf, 0, -#undef V5409 -#define V5409 (V + 20562) - 0x1107, 0x1167, 0x11c0, 0, -#undef V5410 -#define V5410 (V + 20566) - 0x1107, 0x1167, 0x11c1, 0, -#undef V5411 -#define V5411 (V + 20570) - 0x1107, 0x1167, 0x11c2, 0, -#undef V5412 -#define V5412 (V + 20574) - 0x1107, 0x1168, 0, -#undef V5413 -#define V5413 (V + 20577) - 0x1107, 0x1168, 0x11a8, 0, -#undef V5414 -#define V5414 (V + 20581) - 0x1107, 0x1168, 0x11a9, 0, -#undef V5415 -#define V5415 (V + 20585) - 0x1107, 0x1168, 0x11aa, 0, -#undef V5416 -#define V5416 (V + 20589) - 0x1107, 0x1168, 0x11ab, 0, -#undef V5417 -#define V5417 (V + 20593) - 0x1107, 0x1168, 0x11ac, 0, -#undef V5418 -#define V5418 (V + 20597) - 0x1107, 0x1168, 0x11ad, 0, -#undef V5419 -#define V5419 (V + 20601) - 0x1107, 0x1168, 0x11ae, 0, -#undef V5420 -#define V5420 (V + 20605) - 0x1107, 0x1168, 0x11af, 0, -#undef V5421 -#define V5421 (V + 20609) - 0x1107, 0x1168, 0x11b0, 0, -#undef V5422 -#define V5422 (V + 20613) - 0x1107, 0x1168, 0x11b1, 0, -#undef V5423 -#define V5423 (V + 20617) - 0x1107, 0x1168, 0x11b2, 0, -#undef V5424 -#define V5424 (V + 20621) - 0x1107, 0x1168, 0x11b3, 0, -#undef V5425 -#define V5425 (V + 20625) - 0x1107, 0x1168, 0x11b4, 0, -#undef V5426 -#define V5426 (V + 20629) - 0x1107, 0x1168, 0x11b5, 0, -#undef V5427 -#define V5427 (V + 20633) - 0x1107, 0x1168, 0x11b6, 0, -#undef V5428 -#define V5428 (V + 20637) - 0x1107, 0x1168, 0x11b7, 0, -#undef V5429 -#define V5429 (V + 20641) - 0x1107, 0x1168, 0x11b8, 0, -#undef V5430 -#define V5430 (V + 20645) - 0x1107, 0x1168, 0x11b9, 0, -#undef V5431 -#define V5431 (V + 20649) - 0x1107, 0x1168, 0x11ba, 0, -#undef V5432 -#define V5432 (V + 20653) - 0x1107, 0x1168, 0x11bb, 0, -#undef V5433 -#define V5433 (V + 20657) - 0x1107, 0x1168, 0x11bc, 0, -#undef V5434 -#define V5434 (V + 20661) - 0x1107, 0x1168, 0x11bd, 0, -#undef V5435 -#define V5435 (V + 20665) - 0x1107, 0x1168, 0x11be, 0, -#undef V5436 -#define V5436 (V + 20669) - 0x1107, 0x1168, 0x11bf, 0, -#undef V5437 -#define V5437 (V + 20673) - 0x1107, 0x1168, 0x11c0, 0, -#undef V5438 -#define V5438 (V + 20677) - 0x1107, 0x1168, 0x11c1, 0, -#undef V5439 -#define V5439 (V + 20681) - 0x1107, 0x1168, 0x11c2, 0, -#undef V5440 -#define V5440 (V + 20685) - 0x1107, 0x1169, 0, -#undef V5441 -#define V5441 (V + 20688) - 0x1107, 0x1169, 0x11a8, 0, -#undef V5442 -#define V5442 (V + 20692) - 0x1107, 0x1169, 0x11a9, 0, -#undef V5443 -#define V5443 (V + 20696) - 0x1107, 0x1169, 0x11aa, 0, -#undef V5444 -#define V5444 (V + 20700) - 0x1107, 0x1169, 0x11ab, 0, -#undef V5445 -#define V5445 (V + 20704) - 0x1107, 0x1169, 0x11ac, 0, -#undef V5446 -#define V5446 (V + 20708) - 0x1107, 0x1169, 0x11ad, 0, -#undef V5447 -#define V5447 (V + 20712) - 0x1107, 0x1169, 0x11ae, 0, -#undef V5448 -#define V5448 (V + 20716) - 0x1107, 0x1169, 0x11af, 0, -#undef V5449 -#define V5449 (V + 20720) - 0x1107, 0x1169, 0x11b0, 0, -#undef V5450 -#define V5450 (V + 20724) - 0x1107, 0x1169, 0x11b1, 0, -#undef V5451 -#define V5451 (V + 20728) - 0x1107, 0x1169, 0x11b2, 0, -#undef V5452 -#define V5452 (V + 20732) - 0x1107, 0x1169, 0x11b3, 0, -#undef V5453 -#define V5453 (V + 20736) - 0x1107, 0x1169, 0x11b4, 0, -#undef V5454 -#define V5454 (V + 20740) - 0x1107, 0x1169, 0x11b5, 0, -#undef V5455 -#define V5455 (V + 20744) - 0x1107, 0x1169, 0x11b6, 0, -#undef V5456 -#define V5456 (V + 20748) - 0x1107, 0x1169, 0x11b7, 0, -#undef V5457 -#define V5457 (V + 20752) - 0x1107, 0x1169, 0x11b8, 0, -#undef V5458 -#define V5458 (V + 20756) - 0x1107, 0x1169, 0x11b9, 0, -#undef V5459 -#define V5459 (V + 20760) - 0x1107, 0x1169, 0x11ba, 0, -#undef V5460 -#define V5460 (V + 20764) - 0x1107, 0x1169, 0x11bb, 0, -#undef V5461 -#define V5461 (V + 20768) - 0x1107, 0x1169, 0x11bc, 0, -#undef V5462 -#define V5462 (V + 20772) - 0x1107, 0x1169, 0x11bd, 0, -#undef V5463 -#define V5463 (V + 20776) - 0x1107, 0x1169, 0x11be, 0, -#undef V5464 -#define V5464 (V + 20780) - 0x1107, 0x1169, 0x11bf, 0, -#undef V5465 -#define V5465 (V + 20784) - 0x1107, 0x1169, 0x11c0, 0, -#undef V5466 -#define V5466 (V + 20788) - 0x1107, 0x1169, 0x11c1, 0, -#undef V5467 -#define V5467 (V + 20792) - 0x1107, 0x1169, 0x11c2, 0, -#undef V5468 -#define V5468 (V + 20796) - 0x1107, 0x116a, 0, -#undef V5469 -#define V5469 (V + 20799) - 0x1107, 0x116a, 0x11a8, 0, -#undef V5470 -#define V5470 (V + 20803) - 0x1107, 0x116a, 0x11a9, 0, -#undef V5471 -#define V5471 (V + 20807) - 0x1107, 0x116a, 0x11aa, 0, -#undef V5472 -#define V5472 (V + 20811) - 0x1107, 0x116a, 0x11ab, 0, -#undef V5473 -#define V5473 (V + 20815) - 0x1107, 0x116a, 0x11ac, 0, -#undef V5474 -#define V5474 (V + 20819) - 0x1107, 0x116a, 0x11ad, 0, -#undef V5475 -#define V5475 (V + 20823) - 0x1107, 0x116a, 0x11ae, 0, -#undef V5476 -#define V5476 (V + 20827) - 0x1107, 0x116a, 0x11af, 0, -#undef V5477 -#define V5477 (V + 20831) - 0x1107, 0x116a, 0x11b0, 0, -#undef V5478 -#define V5478 (V + 20835) - 0x1107, 0x116a, 0x11b1, 0, -#undef V5479 -#define V5479 (V + 20839) - 0x1107, 0x116a, 0x11b2, 0, -#undef V5480 -#define V5480 (V + 20843) - 0x1107, 0x116a, 0x11b3, 0, -#undef V5481 -#define V5481 (V + 20847) - 0x1107, 0x116a, 0x11b4, 0, -#undef V5482 -#define V5482 (V + 20851) - 0x1107, 0x116a, 0x11b5, 0, -#undef V5483 -#define V5483 (V + 20855) - 0x1107, 0x116a, 0x11b6, 0, -#undef V5484 -#define V5484 (V + 20859) - 0x1107, 0x116a, 0x11b7, 0, -#undef V5485 -#define V5485 (V + 20863) - 0x1107, 0x116a, 0x11b8, 0, -#undef V5486 -#define V5486 (V + 20867) - 0x1107, 0x116a, 0x11b9, 0, -#undef V5487 -#define V5487 (V + 20871) - 0x1107, 0x116a, 0x11ba, 0, -#undef V5488 -#define V5488 (V + 20875) - 0x1107, 0x116a, 0x11bb, 0, -#undef V5489 -#define V5489 (V + 20879) - 0x1107, 0x116a, 0x11bc, 0, -#undef V5490 -#define V5490 (V + 20883) - 0x1107, 0x116a, 0x11bd, 0, -#undef V5491 -#define V5491 (V + 20887) - 0x1107, 0x116a, 0x11be, 0, -#undef V5492 -#define V5492 (V + 20891) - 0x1107, 0x116a, 0x11bf, 0, -#undef V5493 -#define V5493 (V + 20895) - 0x1107, 0x116a, 0x11c0, 0, -#undef V5494 -#define V5494 (V + 20899) - 0x1107, 0x116a, 0x11c1, 0, -#undef V5495 -#define V5495 (V + 20903) - 0x1107, 0x116a, 0x11c2, 0, -#undef V5496 -#define V5496 (V + 20907) - 0x1107, 0x116b, 0, -#undef V5497 -#define V5497 (V + 20910) - 0x1107, 0x116b, 0x11a8, 0, -#undef V5498 -#define V5498 (V + 20914) - 0x1107, 0x116b, 0x11a9, 0, -#undef V5499 -#define V5499 (V + 20918) - 0x1107, 0x116b, 0x11aa, 0, -#undef V5500 -#define V5500 (V + 20922) - 0x1107, 0x116b, 0x11ab, 0, -#undef V5501 -#define V5501 (V + 20926) - 0x1107, 0x116b, 0x11ac, 0, -#undef V5502 -#define V5502 (V + 20930) - 0x1107, 0x116b, 0x11ad, 0, -#undef V5503 -#define V5503 (V + 20934) - 0x1107, 0x116b, 0x11ae, 0, -#undef V5504 -#define V5504 (V + 20938) - 0x1107, 0x116b, 0x11af, 0, -#undef V5505 -#define V5505 (V + 20942) - 0x1107, 0x116b, 0x11b0, 0, -#undef V5506 -#define V5506 (V + 20946) - 0x1107, 0x116b, 0x11b1, 0, -#undef V5507 -#define V5507 (V + 20950) - 0x1107, 0x116b, 0x11b2, 0, -#undef V5508 -#define V5508 (V + 20954) - 0x1107, 0x116b, 0x11b3, 0, -#undef V5509 -#define V5509 (V + 20958) - 0x1107, 0x116b, 0x11b4, 0, -#undef V5510 -#define V5510 (V + 20962) - 0x1107, 0x116b, 0x11b5, 0, -#undef V5511 -#define V5511 (V + 20966) - 0x1107, 0x116b, 0x11b6, 0, -#undef V5512 -#define V5512 (V + 20970) - 0x1107, 0x116b, 0x11b7, 0, -#undef V5513 -#define V5513 (V + 20974) - 0x1107, 0x116b, 0x11b8, 0, -#undef V5514 -#define V5514 (V + 20978) - 0x1107, 0x116b, 0x11b9, 0, -#undef V5515 -#define V5515 (V + 20982) - 0x1107, 0x116b, 0x11ba, 0, -#undef V5516 -#define V5516 (V + 20986) - 0x1107, 0x116b, 0x11bb, 0, -#undef V5517 -#define V5517 (V + 20990) - 0x1107, 0x116b, 0x11bc, 0, -#undef V5518 -#define V5518 (V + 20994) - 0x1107, 0x116b, 0x11bd, 0, -#undef V5519 -#define V5519 (V + 20998) - 0x1107, 0x116b, 0x11be, 0, -#undef V5520 -#define V5520 (V + 21002) - 0x1107, 0x116b, 0x11bf, 0, -#undef V5521 -#define V5521 (V + 21006) - 0x1107, 0x116b, 0x11c0, 0, -#undef V5522 -#define V5522 (V + 21010) - 0x1107, 0x116b, 0x11c1, 0, -#undef V5523 -#define V5523 (V + 21014) - 0x1107, 0x116b, 0x11c2, 0, -#undef V5524 -#define V5524 (V + 21018) - 0x1107, 0x116c, 0, -#undef V5525 -#define V5525 (V + 21021) - 0x1107, 0x116c, 0x11a8, 0, -#undef V5526 -#define V5526 (V + 21025) - 0x1107, 0x116c, 0x11a9, 0, -#undef V5527 -#define V5527 (V + 21029) - 0x1107, 0x116c, 0x11aa, 0, -#undef V5528 -#define V5528 (V + 21033) - 0x1107, 0x116c, 0x11ab, 0, -#undef V5529 -#define V5529 (V + 21037) - 0x1107, 0x116c, 0x11ac, 0, -#undef V5530 -#define V5530 (V + 21041) - 0x1107, 0x116c, 0x11ad, 0, -#undef V5531 -#define V5531 (V + 21045) - 0x1107, 0x116c, 0x11ae, 0, -#undef V5532 -#define V5532 (V + 21049) - 0x1107, 0x116c, 0x11af, 0, -#undef V5533 -#define V5533 (V + 21053) - 0x1107, 0x116c, 0x11b0, 0, -#undef V5534 -#define V5534 (V + 21057) - 0x1107, 0x116c, 0x11b1, 0, -#undef V5535 -#define V5535 (V + 21061) - 0x1107, 0x116c, 0x11b2, 0, -#undef V5536 -#define V5536 (V + 21065) - 0x1107, 0x116c, 0x11b3, 0, -#undef V5537 -#define V5537 (V + 21069) - 0x1107, 0x116c, 0x11b4, 0, -#undef V5538 -#define V5538 (V + 21073) - 0x1107, 0x116c, 0x11b5, 0, -#undef V5539 -#define V5539 (V + 21077) - 0x1107, 0x116c, 0x11b6, 0, -#undef V5540 -#define V5540 (V + 21081) - 0x1107, 0x116c, 0x11b7, 0, -#undef V5541 -#define V5541 (V + 21085) - 0x1107, 0x116c, 0x11b8, 0, -#undef V5542 -#define V5542 (V + 21089) - 0x1107, 0x116c, 0x11b9, 0, -#undef V5543 -#define V5543 (V + 21093) - 0x1107, 0x116c, 0x11ba, 0, -#undef V5544 -#define V5544 (V + 21097) - 0x1107, 0x116c, 0x11bb, 0, -#undef V5545 -#define V5545 (V + 21101) - 0x1107, 0x116c, 0x11bc, 0, -#undef V5546 -#define V5546 (V + 21105) - 0x1107, 0x116c, 0x11bd, 0, -#undef V5547 -#define V5547 (V + 21109) - 0x1107, 0x116c, 0x11be, 0, -#undef V5548 -#define V5548 (V + 21113) - 0x1107, 0x116c, 0x11bf, 0, -#undef V5549 -#define V5549 (V + 21117) - 0x1107, 0x116c, 0x11c0, 0, -#undef V5550 -#define V5550 (V + 21121) - 0x1107, 0x116c, 0x11c1, 0, -#undef V5551 -#define V5551 (V + 21125) - 0x1107, 0x116c, 0x11c2, 0, -#undef V5552 -#define V5552 (V + 21129) - 0x1107, 0x116d, 0, -#undef V5553 -#define V5553 (V + 21132) - 0x1107, 0x116d, 0x11a8, 0, -#undef V5554 -#define V5554 (V + 21136) - 0x1107, 0x116d, 0x11a9, 0, -#undef V5555 -#define V5555 (V + 21140) - 0x1107, 0x116d, 0x11aa, 0, -#undef V5556 -#define V5556 (V + 21144) - 0x1107, 0x116d, 0x11ab, 0, -#undef V5557 -#define V5557 (V + 21148) - 0x1107, 0x116d, 0x11ac, 0, -#undef V5558 -#define V5558 (V + 21152) - 0x1107, 0x116d, 0x11ad, 0, -#undef V5559 -#define V5559 (V + 21156) - 0x1107, 0x116d, 0x11ae, 0, -#undef V5560 -#define V5560 (V + 21160) - 0x1107, 0x116d, 0x11af, 0, -#undef V5561 -#define V5561 (V + 21164) - 0x1107, 0x116d, 0x11b0, 0, -#undef V5562 -#define V5562 (V + 21168) - 0x1107, 0x116d, 0x11b1, 0, -#undef V5563 -#define V5563 (V + 21172) - 0x1107, 0x116d, 0x11b2, 0, -#undef V5564 -#define V5564 (V + 21176) - 0x1107, 0x116d, 0x11b3, 0, -#undef V5565 -#define V5565 (V + 21180) - 0x1107, 0x116d, 0x11b4, 0, -#undef V5566 -#define V5566 (V + 21184) - 0x1107, 0x116d, 0x11b5, 0, -#undef V5567 -#define V5567 (V + 21188) - 0x1107, 0x116d, 0x11b6, 0, -#undef V5568 -#define V5568 (V + 21192) - 0x1107, 0x116d, 0x11b7, 0, -#undef V5569 -#define V5569 (V + 21196) - 0x1107, 0x116d, 0x11b8, 0, -#undef V5570 -#define V5570 (V + 21200) - 0x1107, 0x116d, 0x11b9, 0, -#undef V5571 -#define V5571 (V + 21204) - 0x1107, 0x116d, 0x11ba, 0, -#undef V5572 -#define V5572 (V + 21208) - 0x1107, 0x116d, 0x11bb, 0, -#undef V5573 -#define V5573 (V + 21212) - 0x1107, 0x116d, 0x11bc, 0, -#undef V5574 -#define V5574 (V + 21216) - 0x1107, 0x116d, 0x11bd, 0, -#undef V5575 -#define V5575 (V + 21220) - 0x1107, 0x116d, 0x11be, 0, -#undef V5576 -#define V5576 (V + 21224) - 0x1107, 0x116d, 0x11bf, 0, -#undef V5577 -#define V5577 (V + 21228) - 0x1107, 0x116d, 0x11c0, 0, -#undef V5578 -#define V5578 (V + 21232) - 0x1107, 0x116d, 0x11c1, 0, -#undef V5579 -#define V5579 (V + 21236) - 0x1107, 0x116d, 0x11c2, 0, -#undef V5580 -#define V5580 (V + 21240) - 0x1107, 0x116e, 0, -#undef V5581 -#define V5581 (V + 21243) - 0x1107, 0x116e, 0x11a8, 0, -#undef V5582 -#define V5582 (V + 21247) - 0x1107, 0x116e, 0x11a9, 0, -#undef V5583 -#define V5583 (V + 21251) - 0x1107, 0x116e, 0x11aa, 0, -#undef V5584 -#define V5584 (V + 21255) - 0x1107, 0x116e, 0x11ab, 0, -#undef V5585 -#define V5585 (V + 21259) - 0x1107, 0x116e, 0x11ac, 0, -#undef V5586 -#define V5586 (V + 21263) - 0x1107, 0x116e, 0x11ad, 0, -#undef V5587 -#define V5587 (V + 21267) - 0x1107, 0x116e, 0x11ae, 0, -#undef V5588 -#define V5588 (V + 21271) - 0x1107, 0x116e, 0x11af, 0, -#undef V5589 -#define V5589 (V + 21275) - 0x1107, 0x116e, 0x11b0, 0, -#undef V5590 -#define V5590 (V + 21279) - 0x1107, 0x116e, 0x11b1, 0, -#undef V5591 -#define V5591 (V + 21283) - 0x1107, 0x116e, 0x11b2, 0, -#undef V5592 -#define V5592 (V + 21287) - 0x1107, 0x116e, 0x11b3, 0, -#undef V5593 -#define V5593 (V + 21291) - 0x1107, 0x116e, 0x11b4, 0, -#undef V5594 -#define V5594 (V + 21295) - 0x1107, 0x116e, 0x11b5, 0, -#undef V5595 -#define V5595 (V + 21299) - 0x1107, 0x116e, 0x11b6, 0, -#undef V5596 -#define V5596 (V + 21303) - 0x1107, 0x116e, 0x11b7, 0, -#undef V5597 -#define V5597 (V + 21307) - 0x1107, 0x116e, 0x11b8, 0, -#undef V5598 -#define V5598 (V + 21311) - 0x1107, 0x116e, 0x11b9, 0, -#undef V5599 -#define V5599 (V + 21315) - 0x1107, 0x116e, 0x11ba, 0, -#undef V5600 -#define V5600 (V + 21319) - 0x1107, 0x116e, 0x11bb, 0, -#undef V5601 -#define V5601 (V + 21323) - 0x1107, 0x116e, 0x11bc, 0, -#undef V5602 -#define V5602 (V + 21327) - 0x1107, 0x116e, 0x11bd, 0, -#undef V5603 -#define V5603 (V + 21331) - 0x1107, 0x116e, 0x11be, 0, -#undef V5604 -#define V5604 (V + 21335) - 0x1107, 0x116e, 0x11bf, 0, -#undef V5605 -#define V5605 (V + 21339) - 0x1107, 0x116e, 0x11c0, 0, -#undef V5606 -#define V5606 (V + 21343) - 0x1107, 0x116e, 0x11c1, 0, -#undef V5607 -#define V5607 (V + 21347) - 0x1107, 0x116e, 0x11c2, 0, -#undef V5608 -#define V5608 (V + 21351) - 0x1107, 0x116f, 0, -#undef V5609 -#define V5609 (V + 21354) - 0x1107, 0x116f, 0x11a8, 0, -#undef V5610 -#define V5610 (V + 21358) - 0x1107, 0x116f, 0x11a9, 0, -#undef V5611 -#define V5611 (V + 21362) - 0x1107, 0x116f, 0x11aa, 0, -#undef V5612 -#define V5612 (V + 21366) - 0x1107, 0x116f, 0x11ab, 0, -#undef V5613 -#define V5613 (V + 21370) - 0x1107, 0x116f, 0x11ac, 0, -#undef V5614 -#define V5614 (V + 21374) - 0x1107, 0x116f, 0x11ad, 0, -#undef V5615 -#define V5615 (V + 21378) - 0x1107, 0x116f, 0x11ae, 0, -#undef V5616 -#define V5616 (V + 21382) - 0x1107, 0x116f, 0x11af, 0, -#undef V5617 -#define V5617 (V + 21386) - 0x1107, 0x116f, 0x11b0, 0, -#undef V5618 -#define V5618 (V + 21390) - 0x1107, 0x116f, 0x11b1, 0, -#undef V5619 -#define V5619 (V + 21394) - 0x1107, 0x116f, 0x11b2, 0, -#undef V5620 -#define V5620 (V + 21398) - 0x1107, 0x116f, 0x11b3, 0, -#undef V5621 -#define V5621 (V + 21402) - 0x1107, 0x116f, 0x11b4, 0, -#undef V5622 -#define V5622 (V + 21406) - 0x1107, 0x116f, 0x11b5, 0, -#undef V5623 -#define V5623 (V + 21410) - 0x1107, 0x116f, 0x11b6, 0, -#undef V5624 -#define V5624 (V + 21414) - 0x1107, 0x116f, 0x11b7, 0, -#undef V5625 -#define V5625 (V + 21418) - 0x1107, 0x116f, 0x11b8, 0, -#undef V5626 -#define V5626 (V + 21422) - 0x1107, 0x116f, 0x11b9, 0, -#undef V5627 -#define V5627 (V + 21426) - 0x1107, 0x116f, 0x11ba, 0, -#undef V5628 -#define V5628 (V + 21430) - 0x1107, 0x116f, 0x11bb, 0, -#undef V5629 -#define V5629 (V + 21434) - 0x1107, 0x116f, 0x11bc, 0, -#undef V5630 -#define V5630 (V + 21438) - 0x1107, 0x116f, 0x11bd, 0, -#undef V5631 -#define V5631 (V + 21442) - 0x1107, 0x116f, 0x11be, 0, -#undef V5632 -#define V5632 (V + 21446) - 0x1107, 0x116f, 0x11bf, 0, -#undef V5633 -#define V5633 (V + 21450) - 0x1107, 0x116f, 0x11c0, 0, -#undef V5634 -#define V5634 (V + 21454) - 0x1107, 0x116f, 0x11c1, 0, -#undef V5635 -#define V5635 (V + 21458) - 0x1107, 0x116f, 0x11c2, 0, -#undef V5636 -#define V5636 (V + 21462) - 0x1107, 0x1170, 0, -#undef V5637 -#define V5637 (V + 21465) - 0x1107, 0x1170, 0x11a8, 0, -#undef V5638 -#define V5638 (V + 21469) - 0x1107, 0x1170, 0x11a9, 0, -#undef V5639 -#define V5639 (V + 21473) - 0x1107, 0x1170, 0x11aa, 0, -#undef V5640 -#define V5640 (V + 21477) - 0x1107, 0x1170, 0x11ab, 0, -#undef V5641 -#define V5641 (V + 21481) - 0x1107, 0x1170, 0x11ac, 0, -#undef V5642 -#define V5642 (V + 21485) - 0x1107, 0x1170, 0x11ad, 0, -#undef V5643 -#define V5643 (V + 21489) - 0x1107, 0x1170, 0x11ae, 0, -#undef V5644 -#define V5644 (V + 21493) - 0x1107, 0x1170, 0x11af, 0, -#undef V5645 -#define V5645 (V + 21497) - 0x1107, 0x1170, 0x11b0, 0, -#undef V5646 -#define V5646 (V + 21501) - 0x1107, 0x1170, 0x11b1, 0, -#undef V5647 -#define V5647 (V + 21505) - 0x1107, 0x1170, 0x11b2, 0, -#undef V5648 -#define V5648 (V + 21509) - 0x1107, 0x1170, 0x11b3, 0, -#undef V5649 -#define V5649 (V + 21513) - 0x1107, 0x1170, 0x11b4, 0, -#undef V5650 -#define V5650 (V + 21517) - 0x1107, 0x1170, 0x11b5, 0, -#undef V5651 -#define V5651 (V + 21521) - 0x1107, 0x1170, 0x11b6, 0, -#undef V5652 -#define V5652 (V + 21525) - 0x1107, 0x1170, 0x11b7, 0, -#undef V5653 -#define V5653 (V + 21529) - 0x1107, 0x1170, 0x11b8, 0, -#undef V5654 -#define V5654 (V + 21533) - 0x1107, 0x1170, 0x11b9, 0, -#undef V5655 -#define V5655 (V + 21537) - 0x1107, 0x1170, 0x11ba, 0, -#undef V5656 -#define V5656 (V + 21541) - 0x1107, 0x1170, 0x11bb, 0, -#undef V5657 -#define V5657 (V + 21545) - 0x1107, 0x1170, 0x11bc, 0, -#undef V5658 -#define V5658 (V + 21549) - 0x1107, 0x1170, 0x11bd, 0, -#undef V5659 -#define V5659 (V + 21553) - 0x1107, 0x1170, 0x11be, 0, -#undef V5660 -#define V5660 (V + 21557) - 0x1107, 0x1170, 0x11bf, 0, -#undef V5661 -#define V5661 (V + 21561) - 0x1107, 0x1170, 0x11c0, 0, -#undef V5662 -#define V5662 (V + 21565) - 0x1107, 0x1170, 0x11c1, 0, -#undef V5663 -#define V5663 (V + 21569) - 0x1107, 0x1170, 0x11c2, 0, -#undef V5664 -#define V5664 (V + 21573) - 0x1107, 0x1171, 0, -#undef V5665 -#define V5665 (V + 21576) - 0x1107, 0x1171, 0x11a8, 0, -#undef V5666 -#define V5666 (V + 21580) - 0x1107, 0x1171, 0x11a9, 0, -#undef V5667 -#define V5667 (V + 21584) - 0x1107, 0x1171, 0x11aa, 0, -#undef V5668 -#define V5668 (V + 21588) - 0x1107, 0x1171, 0x11ab, 0, -#undef V5669 -#define V5669 (V + 21592) - 0x1107, 0x1171, 0x11ac, 0, -#undef V5670 -#define V5670 (V + 21596) - 0x1107, 0x1171, 0x11ad, 0, -#undef V5671 -#define V5671 (V + 21600) - 0x1107, 0x1171, 0x11ae, 0, -#undef V5672 -#define V5672 (V + 21604) - 0x1107, 0x1171, 0x11af, 0, -#undef V5673 -#define V5673 (V + 21608) - 0x1107, 0x1171, 0x11b0, 0, -#undef V5674 -#define V5674 (V + 21612) - 0x1107, 0x1171, 0x11b1, 0, -#undef V5675 -#define V5675 (V + 21616) - 0x1107, 0x1171, 0x11b2, 0, -#undef V5676 -#define V5676 (V + 21620) - 0x1107, 0x1171, 0x11b3, 0, -#undef V5677 -#define V5677 (V + 21624) - 0x1107, 0x1171, 0x11b4, 0, -#undef V5678 -#define V5678 (V + 21628) - 0x1107, 0x1171, 0x11b5, 0, -#undef V5679 -#define V5679 (V + 21632) - 0x1107, 0x1171, 0x11b6, 0, -#undef V5680 -#define V5680 (V + 21636) - 0x1107, 0x1171, 0x11b7, 0, -#undef V5681 -#define V5681 (V + 21640) - 0x1107, 0x1171, 0x11b8, 0, -#undef V5682 -#define V5682 (V + 21644) - 0x1107, 0x1171, 0x11b9, 0, -#undef V5683 -#define V5683 (V + 21648) - 0x1107, 0x1171, 0x11ba, 0, -#undef V5684 -#define V5684 (V + 21652) - 0x1107, 0x1171, 0x11bb, 0, -#undef V5685 -#define V5685 (V + 21656) - 0x1107, 0x1171, 0x11bc, 0, -#undef V5686 -#define V5686 (V + 21660) - 0x1107, 0x1171, 0x11bd, 0, -#undef V5687 -#define V5687 (V + 21664) - 0x1107, 0x1171, 0x11be, 0, -#undef V5688 -#define V5688 (V + 21668) - 0x1107, 0x1171, 0x11bf, 0, -#undef V5689 -#define V5689 (V + 21672) - 0x1107, 0x1171, 0x11c0, 0, -#undef V5690 -#define V5690 (V + 21676) - 0x1107, 0x1171, 0x11c1, 0, -#undef V5691 -#define V5691 (V + 21680) - 0x1107, 0x1171, 0x11c2, 0, -#undef V5692 -#define V5692 (V + 21684) - 0x1107, 0x1172, 0, -#undef V5693 -#define V5693 (V + 21687) - 0x1107, 0x1172, 0x11a8, 0, -#undef V5694 -#define V5694 (V + 21691) - 0x1107, 0x1172, 0x11a9, 0, -#undef V5695 -#define V5695 (V + 21695) - 0x1107, 0x1172, 0x11aa, 0, -#undef V5696 -#define V5696 (V + 21699) - 0x1107, 0x1172, 0x11ab, 0, -#undef V5697 -#define V5697 (V + 21703) - 0x1107, 0x1172, 0x11ac, 0, -#undef V5698 -#define V5698 (V + 21707) - 0x1107, 0x1172, 0x11ad, 0, -#undef V5699 -#define V5699 (V + 21711) - 0x1107, 0x1172, 0x11ae, 0, -#undef V5700 -#define V5700 (V + 21715) - 0x1107, 0x1172, 0x11af, 0, -#undef V5701 -#define V5701 (V + 21719) - 0x1107, 0x1172, 0x11b0, 0, -#undef V5702 -#define V5702 (V + 21723) - 0x1107, 0x1172, 0x11b1, 0, -#undef V5703 -#define V5703 (V + 21727) - 0x1107, 0x1172, 0x11b2, 0, -#undef V5704 -#define V5704 (V + 21731) - 0x1107, 0x1172, 0x11b3, 0, -#undef V5705 -#define V5705 (V + 21735) - 0x1107, 0x1172, 0x11b4, 0, -#undef V5706 -#define V5706 (V + 21739) - 0x1107, 0x1172, 0x11b5, 0, -#undef V5707 -#define V5707 (V + 21743) - 0x1107, 0x1172, 0x11b6, 0, -#undef V5708 -#define V5708 (V + 21747) - 0x1107, 0x1172, 0x11b7, 0, -#undef V5709 -#define V5709 (V + 21751) - 0x1107, 0x1172, 0x11b8, 0, -#undef V5710 -#define V5710 (V + 21755) - 0x1107, 0x1172, 0x11b9, 0, -#undef V5711 -#define V5711 (V + 21759) - 0x1107, 0x1172, 0x11ba, 0, -#undef V5712 -#define V5712 (V + 21763) - 0x1107, 0x1172, 0x11bb, 0, -#undef V5713 -#define V5713 (V + 21767) - 0x1107, 0x1172, 0x11bc, 0, -#undef V5714 -#define V5714 (V + 21771) - 0x1107, 0x1172, 0x11bd, 0, -#undef V5715 -#define V5715 (V + 21775) - 0x1107, 0x1172, 0x11be, 0, -#undef V5716 -#define V5716 (V + 21779) - 0x1107, 0x1172, 0x11bf, 0, -#undef V5717 -#define V5717 (V + 21783) - 0x1107, 0x1172, 0x11c0, 0, -#undef V5718 -#define V5718 (V + 21787) - 0x1107, 0x1172, 0x11c1, 0, -#undef V5719 -#define V5719 (V + 21791) - 0x1107, 0x1172, 0x11c2, 0, -#undef V5720 -#define V5720 (V + 21795) - 0x1107, 0x1173, 0, -#undef V5721 -#define V5721 (V + 21798) - 0x1107, 0x1173, 0x11a8, 0, -#undef V5722 -#define V5722 (V + 21802) - 0x1107, 0x1173, 0x11a9, 0, -#undef V5723 -#define V5723 (V + 21806) - 0x1107, 0x1173, 0x11aa, 0, -#undef V5724 -#define V5724 (V + 21810) - 0x1107, 0x1173, 0x11ab, 0, -#undef V5725 -#define V5725 (V + 21814) - 0x1107, 0x1173, 0x11ac, 0, -#undef V5726 -#define V5726 (V + 21818) - 0x1107, 0x1173, 0x11ad, 0, -#undef V5727 -#define V5727 (V + 21822) - 0x1107, 0x1173, 0x11ae, 0, -#undef V5728 -#define V5728 (V + 21826) - 0x1107, 0x1173, 0x11af, 0, -#undef V5729 -#define V5729 (V + 21830) - 0x1107, 0x1173, 0x11b0, 0, -#undef V5730 -#define V5730 (V + 21834) - 0x1107, 0x1173, 0x11b1, 0, -#undef V5731 -#define V5731 (V + 21838) - 0x1107, 0x1173, 0x11b2, 0, -#undef V5732 -#define V5732 (V + 21842) - 0x1107, 0x1173, 0x11b3, 0, -#undef V5733 -#define V5733 (V + 21846) - 0x1107, 0x1173, 0x11b4, 0, -#undef V5734 -#define V5734 (V + 21850) - 0x1107, 0x1173, 0x11b5, 0, -#undef V5735 -#define V5735 (V + 21854) - 0x1107, 0x1173, 0x11b6, 0, -#undef V5736 -#define V5736 (V + 21858) - 0x1107, 0x1173, 0x11b7, 0, -#undef V5737 -#define V5737 (V + 21862) - 0x1107, 0x1173, 0x11b8, 0, -#undef V5738 -#define V5738 (V + 21866) - 0x1107, 0x1173, 0x11b9, 0, -#undef V5739 -#define V5739 (V + 21870) - 0x1107, 0x1173, 0x11ba, 0, -#undef V5740 -#define V5740 (V + 21874) - 0x1107, 0x1173, 0x11bb, 0, -#undef V5741 -#define V5741 (V + 21878) - 0x1107, 0x1173, 0x11bc, 0, -#undef V5742 -#define V5742 (V + 21882) - 0x1107, 0x1173, 0x11bd, 0, -#undef V5743 -#define V5743 (V + 21886) - 0x1107, 0x1173, 0x11be, 0, -#undef V5744 -#define V5744 (V + 21890) - 0x1107, 0x1173, 0x11bf, 0, -#undef V5745 -#define V5745 (V + 21894) - 0x1107, 0x1173, 0x11c0, 0, -#undef V5746 -#define V5746 (V + 21898) - 0x1107, 0x1173, 0x11c1, 0, -#undef V5747 -#define V5747 (V + 21902) - 0x1107, 0x1173, 0x11c2, 0, -#undef V5748 -#define V5748 (V + 21906) - 0x1107, 0x1174, 0, -#undef V5749 -#define V5749 (V + 21909) - 0x1107, 0x1174, 0x11a8, 0, -#undef V5750 -#define V5750 (V + 21913) - 0x1107, 0x1174, 0x11a9, 0, -#undef V5751 -#define V5751 (V + 21917) - 0x1107, 0x1174, 0x11aa, 0, -#undef V5752 -#define V5752 (V + 21921) - 0x1107, 0x1174, 0x11ab, 0, -#undef V5753 -#define V5753 (V + 21925) - 0x1107, 0x1174, 0x11ac, 0, -#undef V5754 -#define V5754 (V + 21929) - 0x1107, 0x1174, 0x11ad, 0, -#undef V5755 -#define V5755 (V + 21933) - 0x1107, 0x1174, 0x11ae, 0, -#undef V5756 -#define V5756 (V + 21937) - 0x1107, 0x1174, 0x11af, 0, -#undef V5757 -#define V5757 (V + 21941) - 0x1107, 0x1174, 0x11b0, 0, -#undef V5758 -#define V5758 (V + 21945) - 0x1107, 0x1174, 0x11b1, 0, -#undef V5759 -#define V5759 (V + 21949) - 0x1107, 0x1174, 0x11b2, 0, -#undef V5760 -#define V5760 (V + 21953) - 0x1107, 0x1174, 0x11b3, 0, -#undef V5761 -#define V5761 (V + 21957) - 0x1107, 0x1174, 0x11b4, 0, -#undef V5762 -#define V5762 (V + 21961) - 0x1107, 0x1174, 0x11b5, 0, -#undef V5763 -#define V5763 (V + 21965) - 0x1107, 0x1174, 0x11b6, 0, -#undef V5764 -#define V5764 (V + 21969) - 0x1107, 0x1174, 0x11b7, 0, -#undef V5765 -#define V5765 (V + 21973) - 0x1107, 0x1174, 0x11b8, 0, -#undef V5766 -#define V5766 (V + 21977) - 0x1107, 0x1174, 0x11b9, 0, -#undef V5767 -#define V5767 (V + 21981) - 0x1107, 0x1174, 0x11ba, 0, -#undef V5768 -#define V5768 (V + 21985) - 0x1107, 0x1174, 0x11bb, 0, -#undef V5769 -#define V5769 (V + 21989) - 0x1107, 0x1174, 0x11bc, 0, -#undef V5770 -#define V5770 (V + 21993) - 0x1107, 0x1174, 0x11bd, 0, -#undef V5771 -#define V5771 (V + 21997) - 0x1107, 0x1174, 0x11be, 0, -#undef V5772 -#define V5772 (V + 22001) - 0x1107, 0x1174, 0x11bf, 0, -#undef V5773 -#define V5773 (V + 22005) - 0x1107, 0x1174, 0x11c0, 0, -#undef V5774 -#define V5774 (V + 22009) - 0x1107, 0x1174, 0x11c1, 0, -#undef V5775 -#define V5775 (V + 22013) - 0x1107, 0x1174, 0x11c2, 0, -#undef V5776 -#define V5776 (V + 22017) - 0x1107, 0x1175, 0, -#undef V5777 -#define V5777 (V + 22020) - 0x1107, 0x1175, 0x11a8, 0, -#undef V5778 -#define V5778 (V + 22024) - 0x1107, 0x1175, 0x11a9, 0, -#undef V5779 -#define V5779 (V + 22028) - 0x1107, 0x1175, 0x11aa, 0, -#undef V5780 -#define V5780 (V + 22032) - 0x1107, 0x1175, 0x11ab, 0, -#undef V5781 -#define V5781 (V + 22036) - 0x1107, 0x1175, 0x11ac, 0, -#undef V5782 -#define V5782 (V + 22040) - 0x1107, 0x1175, 0x11ad, 0, -#undef V5783 -#define V5783 (V + 22044) - 0x1107, 0x1175, 0x11ae, 0, -#undef V5784 -#define V5784 (V + 22048) - 0x1107, 0x1175, 0x11af, 0, -#undef V5785 -#define V5785 (V + 22052) - 0x1107, 0x1175, 0x11b0, 0, -#undef V5786 -#define V5786 (V + 22056) - 0x1107, 0x1175, 0x11b1, 0, -#undef V5787 -#define V5787 (V + 22060) - 0x1107, 0x1175, 0x11b2, 0, -#undef V5788 -#define V5788 (V + 22064) - 0x1107, 0x1175, 0x11b3, 0, -#undef V5789 -#define V5789 (V + 22068) - 0x1107, 0x1175, 0x11b4, 0, -#undef V5790 -#define V5790 (V + 22072) - 0x1107, 0x1175, 0x11b5, 0, -#undef V5791 -#define V5791 (V + 22076) - 0x1107, 0x1175, 0x11b6, 0, -#undef V5792 -#define V5792 (V + 22080) - 0x1107, 0x1175, 0x11b7, 0, -#undef V5793 -#define V5793 (V + 22084) - 0x1107, 0x1175, 0x11b8, 0, -#undef V5794 -#define V5794 (V + 22088) - 0x1107, 0x1175, 0x11b9, 0, -#undef V5795 -#define V5795 (V + 22092) - 0x1107, 0x1175, 0x11ba, 0, -#undef V5796 -#define V5796 (V + 22096) - 0x1107, 0x1175, 0x11bb, 0, -#undef V5797 -#define V5797 (V + 22100) - 0x1107, 0x1175, 0x11bc, 0, -#undef V5798 -#define V5798 (V + 22104) - 0x1107, 0x1175, 0x11bd, 0, -#undef V5799 -#define V5799 (V + 22108) - 0x1107, 0x1175, 0x11be, 0, -#undef V5800 -#define V5800 (V + 22112) - 0x1107, 0x1175, 0x11bf, 0, -#undef V5801 -#define V5801 (V + 22116) - 0x1107, 0x1175, 0x11c0, 0, -#undef V5802 -#define V5802 (V + 22120) - 0x1107, 0x1175, 0x11c1, 0, -#undef V5803 -#define V5803 (V + 22124) - 0x1107, 0x1175, 0x11c2, 0, -#undef V5804 -#define V5804 (V + 22128) - 0x1108, 0x1161, 0, -#undef V5805 -#define V5805 (V + 22131) - 0x1108, 0x1161, 0x11a8, 0, -#undef V5806 -#define V5806 (V + 22135) - 0x1108, 0x1161, 0x11a9, 0, -#undef V5807 -#define V5807 (V + 22139) - 0x1108, 0x1161, 0x11aa, 0, -#undef V5808 -#define V5808 (V + 22143) - 0x1108, 0x1161, 0x11ab, 0, -#undef V5809 -#define V5809 (V + 22147) - 0x1108, 0x1161, 0x11ac, 0, -#undef V5810 -#define V5810 (V + 22151) - 0x1108, 0x1161, 0x11ad, 0, -#undef V5811 -#define V5811 (V + 22155) - 0x1108, 0x1161, 0x11ae, 0, -#undef V5812 -#define V5812 (V + 22159) - 0x1108, 0x1161, 0x11af, 0, -#undef V5813 -#define V5813 (V + 22163) - 0x1108, 0x1161, 0x11b0, 0, -#undef V5814 -#define V5814 (V + 22167) - 0x1108, 0x1161, 0x11b1, 0, -#undef V5815 -#define V5815 (V + 22171) - 0x1108, 0x1161, 0x11b2, 0, -#undef V5816 -#define V5816 (V + 22175) - 0x1108, 0x1161, 0x11b3, 0, -#undef V5817 -#define V5817 (V + 22179) - 0x1108, 0x1161, 0x11b4, 0, -#undef V5818 -#define V5818 (V + 22183) - 0x1108, 0x1161, 0x11b5, 0, -#undef V5819 -#define V5819 (V + 22187) - 0x1108, 0x1161, 0x11b6, 0, -#undef V5820 -#define V5820 (V + 22191) - 0x1108, 0x1161, 0x11b7, 0, -#undef V5821 -#define V5821 (V + 22195) - 0x1108, 0x1161, 0x11b8, 0, -#undef V5822 -#define V5822 (V + 22199) - 0x1108, 0x1161, 0x11b9, 0, -#undef V5823 -#define V5823 (V + 22203) - 0x1108, 0x1161, 0x11ba, 0, -#undef V5824 -#define V5824 (V + 22207) - 0x1108, 0x1161, 0x11bb, 0, -#undef V5825 -#define V5825 (V + 22211) - 0x1108, 0x1161, 0x11bc, 0, -#undef V5826 -#define V5826 (V + 22215) - 0x1108, 0x1161, 0x11bd, 0, -#undef V5827 -#define V5827 (V + 22219) - 0x1108, 0x1161, 0x11be, 0, -#undef V5828 -#define V5828 (V + 22223) - 0x1108, 0x1161, 0x11bf, 0, -#undef V5829 -#define V5829 (V + 22227) - 0x1108, 0x1161, 0x11c0, 0, -#undef V5830 -#define V5830 (V + 22231) - 0x1108, 0x1161, 0x11c1, 0, -#undef V5831 -#define V5831 (V + 22235) - 0x1108, 0x1161, 0x11c2, 0, -#undef V5832 -#define V5832 (V + 22239) - 0x1108, 0x1162, 0, -#undef V5833 -#define V5833 (V + 22242) - 0x1108, 0x1162, 0x11a8, 0, -#undef V5834 -#define V5834 (V + 22246) - 0x1108, 0x1162, 0x11a9, 0, -#undef V5835 -#define V5835 (V + 22250) - 0x1108, 0x1162, 0x11aa, 0, -#undef V5836 -#define V5836 (V + 22254) - 0x1108, 0x1162, 0x11ab, 0, -#undef V5837 -#define V5837 (V + 22258) - 0x1108, 0x1162, 0x11ac, 0, -#undef V5838 -#define V5838 (V + 22262) - 0x1108, 0x1162, 0x11ad, 0, -#undef V5839 -#define V5839 (V + 22266) - 0x1108, 0x1162, 0x11ae, 0, -#undef V5840 -#define V5840 (V + 22270) - 0x1108, 0x1162, 0x11af, 0, -#undef V5841 -#define V5841 (V + 22274) - 0x1108, 0x1162, 0x11b0, 0, -#undef V5842 -#define V5842 (V + 22278) - 0x1108, 0x1162, 0x11b1, 0, -#undef V5843 -#define V5843 (V + 22282) - 0x1108, 0x1162, 0x11b2, 0, -#undef V5844 -#define V5844 (V + 22286) - 0x1108, 0x1162, 0x11b3, 0, -#undef V5845 -#define V5845 (V + 22290) - 0x1108, 0x1162, 0x11b4, 0, -#undef V5846 -#define V5846 (V + 22294) - 0x1108, 0x1162, 0x11b5, 0, -#undef V5847 -#define V5847 (V + 22298) - 0x1108, 0x1162, 0x11b6, 0, -#undef V5848 -#define V5848 (V + 22302) - 0x1108, 0x1162, 0x11b7, 0, -#undef V5849 -#define V5849 (V + 22306) - 0x1108, 0x1162, 0x11b8, 0, -#undef V5850 -#define V5850 (V + 22310) - 0x1108, 0x1162, 0x11b9, 0, -#undef V5851 -#define V5851 (V + 22314) - 0x1108, 0x1162, 0x11ba, 0, -#undef V5852 -#define V5852 (V + 22318) - 0x1108, 0x1162, 0x11bb, 0, -#undef V5853 -#define V5853 (V + 22322) - 0x1108, 0x1162, 0x11bc, 0, -#undef V5854 -#define V5854 (V + 22326) - 0x1108, 0x1162, 0x11bd, 0, -#undef V5855 -#define V5855 (V + 22330) - 0x1108, 0x1162, 0x11be, 0, -#undef V5856 -#define V5856 (V + 22334) - 0x1108, 0x1162, 0x11bf, 0, -#undef V5857 -#define V5857 (V + 22338) - 0x1108, 0x1162, 0x11c0, 0, -#undef V5858 -#define V5858 (V + 22342) - 0x1108, 0x1162, 0x11c1, 0, -#undef V5859 -#define V5859 (V + 22346) - 0x1108, 0x1162, 0x11c2, 0, -#undef V5860 -#define V5860 (V + 22350) - 0x1108, 0x1163, 0, -#undef V5861 -#define V5861 (V + 22353) - 0x1108, 0x1163, 0x11a8, 0, -#undef V5862 -#define V5862 (V + 22357) - 0x1108, 0x1163, 0x11a9, 0, -#undef V5863 -#define V5863 (V + 22361) - 0x1108, 0x1163, 0x11aa, 0, -#undef V5864 -#define V5864 (V + 22365) - 0x1108, 0x1163, 0x11ab, 0, -#undef V5865 -#define V5865 (V + 22369) - 0x1108, 0x1163, 0x11ac, 0, -#undef V5866 -#define V5866 (V + 22373) - 0x1108, 0x1163, 0x11ad, 0, -#undef V5867 -#define V5867 (V + 22377) - 0x1108, 0x1163, 0x11ae, 0, -#undef V5868 -#define V5868 (V + 22381) - 0x1108, 0x1163, 0x11af, 0, -#undef V5869 -#define V5869 (V + 22385) - 0x1108, 0x1163, 0x11b0, 0, -#undef V5870 -#define V5870 (V + 22389) - 0x1108, 0x1163, 0x11b1, 0, -#undef V5871 -#define V5871 (V + 22393) - 0x1108, 0x1163, 0x11b2, 0, -#undef V5872 -#define V5872 (V + 22397) - 0x1108, 0x1163, 0x11b3, 0, -#undef V5873 -#define V5873 (V + 22401) - 0x1108, 0x1163, 0x11b4, 0, -#undef V5874 -#define V5874 (V + 22405) - 0x1108, 0x1163, 0x11b5, 0, -#undef V5875 -#define V5875 (V + 22409) - 0x1108, 0x1163, 0x11b6, 0, -#undef V5876 -#define V5876 (V + 22413) - 0x1108, 0x1163, 0x11b7, 0, -#undef V5877 -#define V5877 (V + 22417) - 0x1108, 0x1163, 0x11b8, 0, -#undef V5878 -#define V5878 (V + 22421) - 0x1108, 0x1163, 0x11b9, 0, -#undef V5879 -#define V5879 (V + 22425) - 0x1108, 0x1163, 0x11ba, 0, -#undef V5880 -#define V5880 (V + 22429) - 0x1108, 0x1163, 0x11bb, 0, -#undef V5881 -#define V5881 (V + 22433) - 0x1108, 0x1163, 0x11bc, 0, -#undef V5882 -#define V5882 (V + 22437) - 0x1108, 0x1163, 0x11bd, 0, -#undef V5883 -#define V5883 (V + 22441) - 0x1108, 0x1163, 0x11be, 0, -#undef V5884 -#define V5884 (V + 22445) - 0x1108, 0x1163, 0x11bf, 0, -#undef V5885 -#define V5885 (V + 22449) - 0x1108, 0x1163, 0x11c0, 0, -#undef V5886 -#define V5886 (V + 22453) - 0x1108, 0x1163, 0x11c1, 0, -#undef V5887 -#define V5887 (V + 22457) - 0x1108, 0x1163, 0x11c2, 0, -#undef V5888 -#define V5888 (V + 22461) - 0x1108, 0x1164, 0, -#undef V5889 -#define V5889 (V + 22464) - 0x1108, 0x1164, 0x11a8, 0, -#undef V5890 -#define V5890 (V + 22468) - 0x1108, 0x1164, 0x11a9, 0, -#undef V5891 -#define V5891 (V + 22472) - 0x1108, 0x1164, 0x11aa, 0, -#undef V5892 -#define V5892 (V + 22476) - 0x1108, 0x1164, 0x11ab, 0, -#undef V5893 -#define V5893 (V + 22480) - 0x1108, 0x1164, 0x11ac, 0, -#undef V5894 -#define V5894 (V + 22484) - 0x1108, 0x1164, 0x11ad, 0, -#undef V5895 -#define V5895 (V + 22488) - 0x1108, 0x1164, 0x11ae, 0, -#undef V5896 -#define V5896 (V + 22492) - 0x1108, 0x1164, 0x11af, 0, -#undef V5897 -#define V5897 (V + 22496) - 0x1108, 0x1164, 0x11b0, 0, -#undef V5898 -#define V5898 (V + 22500) - 0x1108, 0x1164, 0x11b1, 0, -#undef V5899 -#define V5899 (V + 22504) - 0x1108, 0x1164, 0x11b2, 0, -#undef V5900 -#define V5900 (V + 22508) - 0x1108, 0x1164, 0x11b3, 0, -#undef V5901 -#define V5901 (V + 22512) - 0x1108, 0x1164, 0x11b4, 0, -#undef V5902 -#define V5902 (V + 22516) - 0x1108, 0x1164, 0x11b5, 0, -#undef V5903 -#define V5903 (V + 22520) - 0x1108, 0x1164, 0x11b6, 0, -#undef V5904 -#define V5904 (V + 22524) - 0x1108, 0x1164, 0x11b7, 0, -#undef V5905 -#define V5905 (V + 22528) - 0x1108, 0x1164, 0x11b8, 0, -#undef V5906 -#define V5906 (V + 22532) - 0x1108, 0x1164, 0x11b9, 0, -#undef V5907 -#define V5907 (V + 22536) - 0x1108, 0x1164, 0x11ba, 0, -#undef V5908 -#define V5908 (V + 22540) - 0x1108, 0x1164, 0x11bb, 0, -#undef V5909 -#define V5909 (V + 22544) - 0x1108, 0x1164, 0x11bc, 0, -#undef V5910 -#define V5910 (V + 22548) - 0x1108, 0x1164, 0x11bd, 0, -#undef V5911 -#define V5911 (V + 22552) - 0x1108, 0x1164, 0x11be, 0, -#undef V5912 -#define V5912 (V + 22556) - 0x1108, 0x1164, 0x11bf, 0, -#undef V5913 -#define V5913 (V + 22560) - 0x1108, 0x1164, 0x11c0, 0, -#undef V5914 -#define V5914 (V + 22564) - 0x1108, 0x1164, 0x11c1, 0, -#undef V5915 -#define V5915 (V + 22568) - 0x1108, 0x1164, 0x11c2, 0, -#undef V5916 -#define V5916 (V + 22572) - 0x1108, 0x1165, 0, -#undef V5917 -#define V5917 (V + 22575) - 0x1108, 0x1165, 0x11a8, 0, -#undef V5918 -#define V5918 (V + 22579) - 0x1108, 0x1165, 0x11a9, 0, -#undef V5919 -#define V5919 (V + 22583) - 0x1108, 0x1165, 0x11aa, 0, -#undef V5920 -#define V5920 (V + 22587) - 0x1108, 0x1165, 0x11ab, 0, -#undef V5921 -#define V5921 (V + 22591) - 0x1108, 0x1165, 0x11ac, 0, -#undef V5922 -#define V5922 (V + 22595) - 0x1108, 0x1165, 0x11ad, 0, -#undef V5923 -#define V5923 (V + 22599) - 0x1108, 0x1165, 0x11ae, 0, -#undef V5924 -#define V5924 (V + 22603) - 0x1108, 0x1165, 0x11af, 0, -#undef V5925 -#define V5925 (V + 22607) - 0x1108, 0x1165, 0x11b0, 0, -#undef V5926 -#define V5926 (V + 22611) - 0x1108, 0x1165, 0x11b1, 0, -#undef V5927 -#define V5927 (V + 22615) - 0x1108, 0x1165, 0x11b2, 0, -#undef V5928 -#define V5928 (V + 22619) - 0x1108, 0x1165, 0x11b3, 0, -#undef V5929 -#define V5929 (V + 22623) - 0x1108, 0x1165, 0x11b4, 0, -#undef V5930 -#define V5930 (V + 22627) - 0x1108, 0x1165, 0x11b5, 0, -#undef V5931 -#define V5931 (V + 22631) - 0x1108, 0x1165, 0x11b6, 0, -#undef V5932 -#define V5932 (V + 22635) - 0x1108, 0x1165, 0x11b7, 0, -#undef V5933 -#define V5933 (V + 22639) - 0x1108, 0x1165, 0x11b8, 0, -#undef V5934 -#define V5934 (V + 22643) - 0x1108, 0x1165, 0x11b9, 0, -#undef V5935 -#define V5935 (V + 22647) - 0x1108, 0x1165, 0x11ba, 0, -#undef V5936 -#define V5936 (V + 22651) - 0x1108, 0x1165, 0x11bb, 0, -#undef V5937 -#define V5937 (V + 22655) - 0x1108, 0x1165, 0x11bc, 0, -#undef V5938 -#define V5938 (V + 22659) - 0x1108, 0x1165, 0x11bd, 0, -#undef V5939 -#define V5939 (V + 22663) - 0x1108, 0x1165, 0x11be, 0, -#undef V5940 -#define V5940 (V + 22667) - 0x1108, 0x1165, 0x11bf, 0, -#undef V5941 -#define V5941 (V + 22671) - 0x1108, 0x1165, 0x11c0, 0, -#undef V5942 -#define V5942 (V + 22675) - 0x1108, 0x1165, 0x11c1, 0, -#undef V5943 -#define V5943 (V + 22679) - 0x1108, 0x1165, 0x11c2, 0, -#undef V5944 -#define V5944 (V + 22683) - 0x1108, 0x1166, 0, -#undef V5945 -#define V5945 (V + 22686) - 0x1108, 0x1166, 0x11a8, 0, -#undef V5946 -#define V5946 (V + 22690) - 0x1108, 0x1166, 0x11a9, 0, -#undef V5947 -#define V5947 (V + 22694) - 0x1108, 0x1166, 0x11aa, 0, -#undef V5948 -#define V5948 (V + 22698) - 0x1108, 0x1166, 0x11ab, 0, -#undef V5949 -#define V5949 (V + 22702) - 0x1108, 0x1166, 0x11ac, 0, -#undef V5950 -#define V5950 (V + 22706) - 0x1108, 0x1166, 0x11ad, 0, -#undef V5951 -#define V5951 (V + 22710) - 0x1108, 0x1166, 0x11ae, 0, -#undef V5952 -#define V5952 (V + 22714) - 0x1108, 0x1166, 0x11af, 0, -#undef V5953 -#define V5953 (V + 22718) - 0x1108, 0x1166, 0x11b0, 0, -#undef V5954 -#define V5954 (V + 22722) - 0x1108, 0x1166, 0x11b1, 0, -#undef V5955 -#define V5955 (V + 22726) - 0x1108, 0x1166, 0x11b2, 0, -#undef V5956 -#define V5956 (V + 22730) - 0x1108, 0x1166, 0x11b3, 0, -#undef V5957 -#define V5957 (V + 22734) - 0x1108, 0x1166, 0x11b4, 0, -#undef V5958 -#define V5958 (V + 22738) - 0x1108, 0x1166, 0x11b5, 0, -#undef V5959 -#define V5959 (V + 22742) - 0x1108, 0x1166, 0x11b6, 0, -#undef V5960 -#define V5960 (V + 22746) - 0x1108, 0x1166, 0x11b7, 0, -#undef V5961 -#define V5961 (V + 22750) - 0x1108, 0x1166, 0x11b8, 0, -#undef V5962 -#define V5962 (V + 22754) - 0x1108, 0x1166, 0x11b9, 0, -#undef V5963 -#define V5963 (V + 22758) - 0x1108, 0x1166, 0x11ba, 0, -#undef V5964 -#define V5964 (V + 22762) - 0x1108, 0x1166, 0x11bb, 0, -#undef V5965 -#define V5965 (V + 22766) - 0x1108, 0x1166, 0x11bc, 0, -#undef V5966 -#define V5966 (V + 22770) - 0x1108, 0x1166, 0x11bd, 0, -#undef V5967 -#define V5967 (V + 22774) - 0x1108, 0x1166, 0x11be, 0, -#undef V5968 -#define V5968 (V + 22778) - 0x1108, 0x1166, 0x11bf, 0, -#undef V5969 -#define V5969 (V + 22782) - 0x1108, 0x1166, 0x11c0, 0, -#undef V5970 -#define V5970 (V + 22786) - 0x1108, 0x1166, 0x11c1, 0, -#undef V5971 -#define V5971 (V + 22790) - 0x1108, 0x1166, 0x11c2, 0, -#undef V5972 -#define V5972 (V + 22794) - 0x1108, 0x1167, 0, -#undef V5973 -#define V5973 (V + 22797) - 0x1108, 0x1167, 0x11a8, 0, -#undef V5974 -#define V5974 (V + 22801) - 0x1108, 0x1167, 0x11a9, 0, -#undef V5975 -#define V5975 (V + 22805) - 0x1108, 0x1167, 0x11aa, 0, -#undef V5976 -#define V5976 (V + 22809) - 0x1108, 0x1167, 0x11ab, 0, -#undef V5977 -#define V5977 (V + 22813) - 0x1108, 0x1167, 0x11ac, 0, -#undef V5978 -#define V5978 (V + 22817) - 0x1108, 0x1167, 0x11ad, 0, -#undef V5979 -#define V5979 (V + 22821) - 0x1108, 0x1167, 0x11ae, 0, -#undef V5980 -#define V5980 (V + 22825) - 0x1108, 0x1167, 0x11af, 0, -#undef V5981 -#define V5981 (V + 22829) - 0x1108, 0x1167, 0x11b0, 0, -#undef V5982 -#define V5982 (V + 22833) - 0x1108, 0x1167, 0x11b1, 0, -#undef V5983 -#define V5983 (V + 22837) - 0x1108, 0x1167, 0x11b2, 0, -#undef V5984 -#define V5984 (V + 22841) - 0x1108, 0x1167, 0x11b3, 0, -#undef V5985 -#define V5985 (V + 22845) - 0x1108, 0x1167, 0x11b4, 0, -#undef V5986 -#define V5986 (V + 22849) - 0x1108, 0x1167, 0x11b5, 0, -#undef V5987 -#define V5987 (V + 22853) - 0x1108, 0x1167, 0x11b6, 0, -#undef V5988 -#define V5988 (V + 22857) - 0x1108, 0x1167, 0x11b7, 0, -#undef V5989 -#define V5989 (V + 22861) - 0x1108, 0x1167, 0x11b8, 0, -#undef V5990 -#define V5990 (V + 22865) - 0x1108, 0x1167, 0x11b9, 0, -#undef V5991 -#define V5991 (V + 22869) - 0x1108, 0x1167, 0x11ba, 0, -#undef V5992 -#define V5992 (V + 22873) - 0x1108, 0x1167, 0x11bb, 0, -#undef V5993 -#define V5993 (V + 22877) - 0x1108, 0x1167, 0x11bc, 0, -#undef V5994 -#define V5994 (V + 22881) - 0x1108, 0x1167, 0x11bd, 0, -#undef V5995 -#define V5995 (V + 22885) - 0x1108, 0x1167, 0x11be, 0, -#undef V5996 -#define V5996 (V + 22889) - 0x1108, 0x1167, 0x11bf, 0, -#undef V5997 -#define V5997 (V + 22893) - 0x1108, 0x1167, 0x11c0, 0, -#undef V5998 -#define V5998 (V + 22897) - 0x1108, 0x1167, 0x11c1, 0, -#undef V5999 -#define V5999 (V + 22901) - 0x1108, 0x1167, 0x11c2, 0, -#undef V6000 -#define V6000 (V + 22905) - 0x1108, 0x1168, 0, -#undef V6001 -#define V6001 (V + 22908) - 0x1108, 0x1168, 0x11a8, 0, -#undef V6002 -#define V6002 (V + 22912) - 0x1108, 0x1168, 0x11a9, 0, -#undef V6003 -#define V6003 (V + 22916) - 0x1108, 0x1168, 0x11aa, 0, -#undef V6004 -#define V6004 (V + 22920) - 0x1108, 0x1168, 0x11ab, 0, -#undef V6005 -#define V6005 (V + 22924) - 0x1108, 0x1168, 0x11ac, 0, -#undef V6006 -#define V6006 (V + 22928) - 0x1108, 0x1168, 0x11ad, 0, -#undef V6007 -#define V6007 (V + 22932) - 0x1108, 0x1168, 0x11ae, 0, -#undef V6008 -#define V6008 (V + 22936) - 0x1108, 0x1168, 0x11af, 0, -#undef V6009 -#define V6009 (V + 22940) - 0x1108, 0x1168, 0x11b0, 0, -#undef V6010 -#define V6010 (V + 22944) - 0x1108, 0x1168, 0x11b1, 0, -#undef V6011 -#define V6011 (V + 22948) - 0x1108, 0x1168, 0x11b2, 0, -#undef V6012 -#define V6012 (V + 22952) - 0x1108, 0x1168, 0x11b3, 0, -#undef V6013 -#define V6013 (V + 22956) - 0x1108, 0x1168, 0x11b4, 0, -#undef V6014 -#define V6014 (V + 22960) - 0x1108, 0x1168, 0x11b5, 0, -#undef V6015 -#define V6015 (V + 22964) - 0x1108, 0x1168, 0x11b6, 0, -#undef V6016 -#define V6016 (V + 22968) - 0x1108, 0x1168, 0x11b7, 0, -#undef V6017 -#define V6017 (V + 22972) - 0x1108, 0x1168, 0x11b8, 0, -#undef V6018 -#define V6018 (V + 22976) - 0x1108, 0x1168, 0x11b9, 0, -#undef V6019 -#define V6019 (V + 22980) - 0x1108, 0x1168, 0x11ba, 0, -#undef V6020 -#define V6020 (V + 22984) - 0x1108, 0x1168, 0x11bb, 0, -#undef V6021 -#define V6021 (V + 22988) - 0x1108, 0x1168, 0x11bc, 0, -#undef V6022 -#define V6022 (V + 22992) - 0x1108, 0x1168, 0x11bd, 0, -#undef V6023 -#define V6023 (V + 22996) - 0x1108, 0x1168, 0x11be, 0, -#undef V6024 -#define V6024 (V + 23000) - 0x1108, 0x1168, 0x11bf, 0, -#undef V6025 -#define V6025 (V + 23004) - 0x1108, 0x1168, 0x11c0, 0, -#undef V6026 -#define V6026 (V + 23008) - 0x1108, 0x1168, 0x11c1, 0, -#undef V6027 -#define V6027 (V + 23012) - 0x1108, 0x1168, 0x11c2, 0, -#undef V6028 -#define V6028 (V + 23016) - 0x1108, 0x1169, 0, -#undef V6029 -#define V6029 (V + 23019) - 0x1108, 0x1169, 0x11a8, 0, -#undef V6030 -#define V6030 (V + 23023) - 0x1108, 0x1169, 0x11a9, 0, -#undef V6031 -#define V6031 (V + 23027) - 0x1108, 0x1169, 0x11aa, 0, -#undef V6032 -#define V6032 (V + 23031) - 0x1108, 0x1169, 0x11ab, 0, -#undef V6033 -#define V6033 (V + 23035) - 0x1108, 0x1169, 0x11ac, 0, -#undef V6034 -#define V6034 (V + 23039) - 0x1108, 0x1169, 0x11ad, 0, -#undef V6035 -#define V6035 (V + 23043) - 0x1108, 0x1169, 0x11ae, 0, -#undef V6036 -#define V6036 (V + 23047) - 0x1108, 0x1169, 0x11af, 0, -#undef V6037 -#define V6037 (V + 23051) - 0x1108, 0x1169, 0x11b0, 0, -#undef V6038 -#define V6038 (V + 23055) - 0x1108, 0x1169, 0x11b1, 0, -#undef V6039 -#define V6039 (V + 23059) - 0x1108, 0x1169, 0x11b2, 0, -#undef V6040 -#define V6040 (V + 23063) - 0x1108, 0x1169, 0x11b3, 0, -#undef V6041 -#define V6041 (V + 23067) - 0x1108, 0x1169, 0x11b4, 0, -#undef V6042 -#define V6042 (V + 23071) - 0x1108, 0x1169, 0x11b5, 0, -#undef V6043 -#define V6043 (V + 23075) - 0x1108, 0x1169, 0x11b6, 0, -#undef V6044 -#define V6044 (V + 23079) - 0x1108, 0x1169, 0x11b7, 0, -#undef V6045 -#define V6045 (V + 23083) - 0x1108, 0x1169, 0x11b8, 0, -#undef V6046 -#define V6046 (V + 23087) - 0x1108, 0x1169, 0x11b9, 0, -#undef V6047 -#define V6047 (V + 23091) - 0x1108, 0x1169, 0x11ba, 0, -#undef V6048 -#define V6048 (V + 23095) - 0x1108, 0x1169, 0x11bb, 0, -#undef V6049 -#define V6049 (V + 23099) - 0x1108, 0x1169, 0x11bc, 0, -#undef V6050 -#define V6050 (V + 23103) - 0x1108, 0x1169, 0x11bd, 0, -#undef V6051 -#define V6051 (V + 23107) - 0x1108, 0x1169, 0x11be, 0, -#undef V6052 -#define V6052 (V + 23111) - 0x1108, 0x1169, 0x11bf, 0, -#undef V6053 -#define V6053 (V + 23115) - 0x1108, 0x1169, 0x11c0, 0, -#undef V6054 -#define V6054 (V + 23119) - 0x1108, 0x1169, 0x11c1, 0, -#undef V6055 -#define V6055 (V + 23123) - 0x1108, 0x1169, 0x11c2, 0, -#undef V6056 -#define V6056 (V + 23127) - 0x1108, 0x116a, 0, -#undef V6057 -#define V6057 (V + 23130) - 0x1108, 0x116a, 0x11a8, 0, -#undef V6058 -#define V6058 (V + 23134) - 0x1108, 0x116a, 0x11a9, 0, -#undef V6059 -#define V6059 (V + 23138) - 0x1108, 0x116a, 0x11aa, 0, -#undef V6060 -#define V6060 (V + 23142) - 0x1108, 0x116a, 0x11ab, 0, -#undef V6061 -#define V6061 (V + 23146) - 0x1108, 0x116a, 0x11ac, 0, -#undef V6062 -#define V6062 (V + 23150) - 0x1108, 0x116a, 0x11ad, 0, -#undef V6063 -#define V6063 (V + 23154) - 0x1108, 0x116a, 0x11ae, 0, -#undef V6064 -#define V6064 (V + 23158) - 0x1108, 0x116a, 0x11af, 0, -#undef V6065 -#define V6065 (V + 23162) - 0x1108, 0x116a, 0x11b0, 0, -#undef V6066 -#define V6066 (V + 23166) - 0x1108, 0x116a, 0x11b1, 0, -#undef V6067 -#define V6067 (V + 23170) - 0x1108, 0x116a, 0x11b2, 0, -#undef V6068 -#define V6068 (V + 23174) - 0x1108, 0x116a, 0x11b3, 0, -#undef V6069 -#define V6069 (V + 23178) - 0x1108, 0x116a, 0x11b4, 0, -#undef V6070 -#define V6070 (V + 23182) - 0x1108, 0x116a, 0x11b5, 0, -#undef V6071 -#define V6071 (V + 23186) - 0x1108, 0x116a, 0x11b6, 0, -#undef V6072 -#define V6072 (V + 23190) - 0x1108, 0x116a, 0x11b7, 0, -#undef V6073 -#define V6073 (V + 23194) - 0x1108, 0x116a, 0x11b8, 0, -#undef V6074 -#define V6074 (V + 23198) - 0x1108, 0x116a, 0x11b9, 0, -#undef V6075 -#define V6075 (V + 23202) - 0x1108, 0x116a, 0x11ba, 0, -#undef V6076 -#define V6076 (V + 23206) - 0x1108, 0x116a, 0x11bb, 0, -#undef V6077 -#define V6077 (V + 23210) - 0x1108, 0x116a, 0x11bc, 0, -#undef V6078 -#define V6078 (V + 23214) - 0x1108, 0x116a, 0x11bd, 0, -#undef V6079 -#define V6079 (V + 23218) - 0x1108, 0x116a, 0x11be, 0, -#undef V6080 -#define V6080 (V + 23222) - 0x1108, 0x116a, 0x11bf, 0, -#undef V6081 -#define V6081 (V + 23226) - 0x1108, 0x116a, 0x11c0, 0, -#undef V6082 -#define V6082 (V + 23230) - 0x1108, 0x116a, 0x11c1, 0, -#undef V6083 -#define V6083 (V + 23234) - 0x1108, 0x116a, 0x11c2, 0, -#undef V6084 -#define V6084 (V + 23238) - 0x1108, 0x116b, 0, -#undef V6085 -#define V6085 (V + 23241) - 0x1108, 0x116b, 0x11a8, 0, -#undef V6086 -#define V6086 (V + 23245) - 0x1108, 0x116b, 0x11a9, 0, -#undef V6087 -#define V6087 (V + 23249) - 0x1108, 0x116b, 0x11aa, 0, -#undef V6088 -#define V6088 (V + 23253) - 0x1108, 0x116b, 0x11ab, 0, -#undef V6089 -#define V6089 (V + 23257) - 0x1108, 0x116b, 0x11ac, 0, -#undef V6090 -#define V6090 (V + 23261) - 0x1108, 0x116b, 0x11ad, 0, -#undef V6091 -#define V6091 (V + 23265) - 0x1108, 0x116b, 0x11ae, 0, -#undef V6092 -#define V6092 (V + 23269) - 0x1108, 0x116b, 0x11af, 0, -#undef V6093 -#define V6093 (V + 23273) - 0x1108, 0x116b, 0x11b0, 0, -#undef V6094 -#define V6094 (V + 23277) - 0x1108, 0x116b, 0x11b1, 0, -#undef V6095 -#define V6095 (V + 23281) - 0x1108, 0x116b, 0x11b2, 0, -#undef V6096 -#define V6096 (V + 23285) - 0x1108, 0x116b, 0x11b3, 0, -#undef V6097 -#define V6097 (V + 23289) - 0x1108, 0x116b, 0x11b4, 0, -#undef V6098 -#define V6098 (V + 23293) - 0x1108, 0x116b, 0x11b5, 0, -#undef V6099 -#define V6099 (V + 23297) - 0x1108, 0x116b, 0x11b6, 0, -#undef V6100 -#define V6100 (V + 23301) - 0x1108, 0x116b, 0x11b7, 0, -#undef V6101 -#define V6101 (V + 23305) - 0x1108, 0x116b, 0x11b8, 0, -#undef V6102 -#define V6102 (V + 23309) - 0x1108, 0x116b, 0x11b9, 0, -#undef V6103 -#define V6103 (V + 23313) - 0x1108, 0x116b, 0x11ba, 0, -#undef V6104 -#define V6104 (V + 23317) - 0x1108, 0x116b, 0x11bb, 0, -#undef V6105 -#define V6105 (V + 23321) - 0x1108, 0x116b, 0x11bc, 0, -#undef V6106 -#define V6106 (V + 23325) - 0x1108, 0x116b, 0x11bd, 0, -#undef V6107 -#define V6107 (V + 23329) - 0x1108, 0x116b, 0x11be, 0, -#undef V6108 -#define V6108 (V + 23333) - 0x1108, 0x116b, 0x11bf, 0, -#undef V6109 -#define V6109 (V + 23337) - 0x1108, 0x116b, 0x11c0, 0, -#undef V6110 -#define V6110 (V + 23341) - 0x1108, 0x116b, 0x11c1, 0, -#undef V6111 -#define V6111 (V + 23345) - 0x1108, 0x116b, 0x11c2, 0, -#undef V6112 -#define V6112 (V + 23349) - 0x1108, 0x116c, 0, -#undef V6113 -#define V6113 (V + 23352) - 0x1108, 0x116c, 0x11a8, 0, -#undef V6114 -#define V6114 (V + 23356) - 0x1108, 0x116c, 0x11a9, 0, -#undef V6115 -#define V6115 (V + 23360) - 0x1108, 0x116c, 0x11aa, 0, -#undef V6116 -#define V6116 (V + 23364) - 0x1108, 0x116c, 0x11ab, 0, -#undef V6117 -#define V6117 (V + 23368) - 0x1108, 0x116c, 0x11ac, 0, -#undef V6118 -#define V6118 (V + 23372) - 0x1108, 0x116c, 0x11ad, 0, -#undef V6119 -#define V6119 (V + 23376) - 0x1108, 0x116c, 0x11ae, 0, -#undef V6120 -#define V6120 (V + 23380) - 0x1108, 0x116c, 0x11af, 0, -#undef V6121 -#define V6121 (V + 23384) - 0x1108, 0x116c, 0x11b0, 0, -#undef V6122 -#define V6122 (V + 23388) - 0x1108, 0x116c, 0x11b1, 0, -#undef V6123 -#define V6123 (V + 23392) - 0x1108, 0x116c, 0x11b2, 0, -#undef V6124 -#define V6124 (V + 23396) - 0x1108, 0x116c, 0x11b3, 0, -#undef V6125 -#define V6125 (V + 23400) - 0x1108, 0x116c, 0x11b4, 0, -#undef V6126 -#define V6126 (V + 23404) - 0x1108, 0x116c, 0x11b5, 0, -#undef V6127 -#define V6127 (V + 23408) - 0x1108, 0x116c, 0x11b6, 0, -#undef V6128 -#define V6128 (V + 23412) - 0x1108, 0x116c, 0x11b7, 0, -#undef V6129 -#define V6129 (V + 23416) - 0x1108, 0x116c, 0x11b8, 0, -#undef V6130 -#define V6130 (V + 23420) - 0x1108, 0x116c, 0x11b9, 0, -#undef V6131 -#define V6131 (V + 23424) - 0x1108, 0x116c, 0x11ba, 0, -#undef V6132 -#define V6132 (V + 23428) - 0x1108, 0x116c, 0x11bb, 0, -#undef V6133 -#define V6133 (V + 23432) - 0x1108, 0x116c, 0x11bc, 0, -#undef V6134 -#define V6134 (V + 23436) - 0x1108, 0x116c, 0x11bd, 0, -#undef V6135 -#define V6135 (V + 23440) - 0x1108, 0x116c, 0x11be, 0, -#undef V6136 -#define V6136 (V + 23444) - 0x1108, 0x116c, 0x11bf, 0, -#undef V6137 -#define V6137 (V + 23448) - 0x1108, 0x116c, 0x11c0, 0, -#undef V6138 -#define V6138 (V + 23452) - 0x1108, 0x116c, 0x11c1, 0, -#undef V6139 -#define V6139 (V + 23456) - 0x1108, 0x116c, 0x11c2, 0, -#undef V6140 -#define V6140 (V + 23460) - 0x1108, 0x116d, 0, -#undef V6141 -#define V6141 (V + 23463) - 0x1108, 0x116d, 0x11a8, 0, -#undef V6142 -#define V6142 (V + 23467) - 0x1108, 0x116d, 0x11a9, 0, -#undef V6143 -#define V6143 (V + 23471) - 0x1108, 0x116d, 0x11aa, 0, -#undef V6144 -#define V6144 (V + 23475) - 0x1108, 0x116d, 0x11ab, 0, -#undef V6145 -#define V6145 (V + 23479) - 0x1108, 0x116d, 0x11ac, 0, -#undef V6146 -#define V6146 (V + 23483) - 0x1108, 0x116d, 0x11ad, 0, -#undef V6147 -#define V6147 (V + 23487) - 0x1108, 0x116d, 0x11ae, 0, -#undef V6148 -#define V6148 (V + 23491) - 0x1108, 0x116d, 0x11af, 0, -#undef V6149 -#define V6149 (V + 23495) - 0x1108, 0x116d, 0x11b0, 0, -#undef V6150 -#define V6150 (V + 23499) - 0x1108, 0x116d, 0x11b1, 0, -#undef V6151 -#define V6151 (V + 23503) - 0x1108, 0x116d, 0x11b2, 0, -#undef V6152 -#define V6152 (V + 23507) - 0x1108, 0x116d, 0x11b3, 0, -#undef V6153 -#define V6153 (V + 23511) - 0x1108, 0x116d, 0x11b4, 0, -#undef V6154 -#define V6154 (V + 23515) - 0x1108, 0x116d, 0x11b5, 0, -#undef V6155 -#define V6155 (V + 23519) - 0x1108, 0x116d, 0x11b6, 0, -#undef V6156 -#define V6156 (V + 23523) - 0x1108, 0x116d, 0x11b7, 0, -#undef V6157 -#define V6157 (V + 23527) - 0x1108, 0x116d, 0x11b8, 0, -#undef V6158 -#define V6158 (V + 23531) - 0x1108, 0x116d, 0x11b9, 0, -#undef V6159 -#define V6159 (V + 23535) - 0x1108, 0x116d, 0x11ba, 0, -#undef V6160 -#define V6160 (V + 23539) - 0x1108, 0x116d, 0x11bb, 0, -#undef V6161 -#define V6161 (V + 23543) - 0x1108, 0x116d, 0x11bc, 0, -#undef V6162 -#define V6162 (V + 23547) - 0x1108, 0x116d, 0x11bd, 0, -#undef V6163 -#define V6163 (V + 23551) - 0x1108, 0x116d, 0x11be, 0, -#undef V6164 -#define V6164 (V + 23555) - 0x1108, 0x116d, 0x11bf, 0, -#undef V6165 -#define V6165 (V + 23559) - 0x1108, 0x116d, 0x11c0, 0, -#undef V6166 -#define V6166 (V + 23563) - 0x1108, 0x116d, 0x11c1, 0, -#undef V6167 -#define V6167 (V + 23567) - 0x1108, 0x116d, 0x11c2, 0, -#undef V6168 -#define V6168 (V + 23571) - 0x1108, 0x116e, 0, -#undef V6169 -#define V6169 (V + 23574) - 0x1108, 0x116e, 0x11a8, 0, -#undef V6170 -#define V6170 (V + 23578) - 0x1108, 0x116e, 0x11a9, 0, -#undef V6171 -#define V6171 (V + 23582) - 0x1108, 0x116e, 0x11aa, 0, -#undef V6172 -#define V6172 (V + 23586) - 0x1108, 0x116e, 0x11ab, 0, -#undef V6173 -#define V6173 (V + 23590) - 0x1108, 0x116e, 0x11ac, 0, -#undef V6174 -#define V6174 (V + 23594) - 0x1108, 0x116e, 0x11ad, 0, -#undef V6175 -#define V6175 (V + 23598) - 0x1108, 0x116e, 0x11ae, 0, -#undef V6176 -#define V6176 (V + 23602) - 0x1108, 0x116e, 0x11af, 0, -#undef V6177 -#define V6177 (V + 23606) - 0x1108, 0x116e, 0x11b0, 0, -#undef V6178 -#define V6178 (V + 23610) - 0x1108, 0x116e, 0x11b1, 0, -#undef V6179 -#define V6179 (V + 23614) - 0x1108, 0x116e, 0x11b2, 0, -#undef V6180 -#define V6180 (V + 23618) - 0x1108, 0x116e, 0x11b3, 0, -#undef V6181 -#define V6181 (V + 23622) - 0x1108, 0x116e, 0x11b4, 0, -#undef V6182 -#define V6182 (V + 23626) - 0x1108, 0x116e, 0x11b5, 0, -#undef V6183 -#define V6183 (V + 23630) - 0x1108, 0x116e, 0x11b6, 0, -#undef V6184 -#define V6184 (V + 23634) - 0x1108, 0x116e, 0x11b7, 0, -#undef V6185 -#define V6185 (V + 23638) - 0x1108, 0x116e, 0x11b8, 0, -#undef V6186 -#define V6186 (V + 23642) - 0x1108, 0x116e, 0x11b9, 0, -#undef V6187 -#define V6187 (V + 23646) - 0x1108, 0x116e, 0x11ba, 0, -#undef V6188 -#define V6188 (V + 23650) - 0x1108, 0x116e, 0x11bb, 0, -#undef V6189 -#define V6189 (V + 23654) - 0x1108, 0x116e, 0x11bc, 0, -#undef V6190 -#define V6190 (V + 23658) - 0x1108, 0x116e, 0x11bd, 0, -#undef V6191 -#define V6191 (V + 23662) - 0x1108, 0x116e, 0x11be, 0, -#undef V6192 -#define V6192 (V + 23666) - 0x1108, 0x116e, 0x11bf, 0, -#undef V6193 -#define V6193 (V + 23670) - 0x1108, 0x116e, 0x11c0, 0, -#undef V6194 -#define V6194 (V + 23674) - 0x1108, 0x116e, 0x11c1, 0, -#undef V6195 -#define V6195 (V + 23678) - 0x1108, 0x116e, 0x11c2, 0, -#undef V6196 -#define V6196 (V + 23682) - 0x1108, 0x116f, 0, -#undef V6197 -#define V6197 (V + 23685) - 0x1108, 0x116f, 0x11a8, 0, -#undef V6198 -#define V6198 (V + 23689) - 0x1108, 0x116f, 0x11a9, 0, -#undef V6199 -#define V6199 (V + 23693) - 0x1108, 0x116f, 0x11aa, 0, -#undef V6200 -#define V6200 (V + 23697) - 0x1108, 0x116f, 0x11ab, 0, -#undef V6201 -#define V6201 (V + 23701) - 0x1108, 0x116f, 0x11ac, 0, -#undef V6202 -#define V6202 (V + 23705) - 0x1108, 0x116f, 0x11ad, 0, -#undef V6203 -#define V6203 (V + 23709) - 0x1108, 0x116f, 0x11ae, 0, -#undef V6204 -#define V6204 (V + 23713) - 0x1108, 0x116f, 0x11af, 0, -#undef V6205 -#define V6205 (V + 23717) - 0x1108, 0x116f, 0x11b0, 0, -#undef V6206 -#define V6206 (V + 23721) - 0x1108, 0x116f, 0x11b1, 0, -#undef V6207 -#define V6207 (V + 23725) - 0x1108, 0x116f, 0x11b2, 0, -#undef V6208 -#define V6208 (V + 23729) - 0x1108, 0x116f, 0x11b3, 0, -#undef V6209 -#define V6209 (V + 23733) - 0x1108, 0x116f, 0x11b4, 0, -#undef V6210 -#define V6210 (V + 23737) - 0x1108, 0x116f, 0x11b5, 0, -#undef V6211 -#define V6211 (V + 23741) - 0x1108, 0x116f, 0x11b6, 0, -#undef V6212 -#define V6212 (V + 23745) - 0x1108, 0x116f, 0x11b7, 0, -#undef V6213 -#define V6213 (V + 23749) - 0x1108, 0x116f, 0x11b8, 0, -#undef V6214 -#define V6214 (V + 23753) - 0x1108, 0x116f, 0x11b9, 0, -#undef V6215 -#define V6215 (V + 23757) - 0x1108, 0x116f, 0x11ba, 0, -#undef V6216 -#define V6216 (V + 23761) - 0x1108, 0x116f, 0x11bb, 0, -#undef V6217 -#define V6217 (V + 23765) - 0x1108, 0x116f, 0x11bc, 0, -#undef V6218 -#define V6218 (V + 23769) - 0x1108, 0x116f, 0x11bd, 0, -#undef V6219 -#define V6219 (V + 23773) - 0x1108, 0x116f, 0x11be, 0, -#undef V6220 -#define V6220 (V + 23777) - 0x1108, 0x116f, 0x11bf, 0, -#undef V6221 -#define V6221 (V + 23781) - 0x1108, 0x116f, 0x11c0, 0, -#undef V6222 -#define V6222 (V + 23785) - 0x1108, 0x116f, 0x11c1, 0, -#undef V6223 -#define V6223 (V + 23789) - 0x1108, 0x116f, 0x11c2, 0, -#undef V6224 -#define V6224 (V + 23793) - 0x1108, 0x1170, 0, -#undef V6225 -#define V6225 (V + 23796) - 0x1108, 0x1170, 0x11a8, 0, -#undef V6226 -#define V6226 (V + 23800) - 0x1108, 0x1170, 0x11a9, 0, -#undef V6227 -#define V6227 (V + 23804) - 0x1108, 0x1170, 0x11aa, 0, -#undef V6228 -#define V6228 (V + 23808) - 0x1108, 0x1170, 0x11ab, 0, -#undef V6229 -#define V6229 (V + 23812) - 0x1108, 0x1170, 0x11ac, 0, -#undef V6230 -#define V6230 (V + 23816) - 0x1108, 0x1170, 0x11ad, 0, -#undef V6231 -#define V6231 (V + 23820) - 0x1108, 0x1170, 0x11ae, 0, -#undef V6232 -#define V6232 (V + 23824) - 0x1108, 0x1170, 0x11af, 0, -#undef V6233 -#define V6233 (V + 23828) - 0x1108, 0x1170, 0x11b0, 0, -#undef V6234 -#define V6234 (V + 23832) - 0x1108, 0x1170, 0x11b1, 0, -#undef V6235 -#define V6235 (V + 23836) - 0x1108, 0x1170, 0x11b2, 0, -#undef V6236 -#define V6236 (V + 23840) - 0x1108, 0x1170, 0x11b3, 0, -#undef V6237 -#define V6237 (V + 23844) - 0x1108, 0x1170, 0x11b4, 0, -#undef V6238 -#define V6238 (V + 23848) - 0x1108, 0x1170, 0x11b5, 0, -#undef V6239 -#define V6239 (V + 23852) - 0x1108, 0x1170, 0x11b6, 0, -#undef V6240 -#define V6240 (V + 23856) - 0x1108, 0x1170, 0x11b7, 0, -#undef V6241 -#define V6241 (V + 23860) - 0x1108, 0x1170, 0x11b8, 0, -#undef V6242 -#define V6242 (V + 23864) - 0x1108, 0x1170, 0x11b9, 0, -#undef V6243 -#define V6243 (V + 23868) - 0x1108, 0x1170, 0x11ba, 0, -#undef V6244 -#define V6244 (V + 23872) - 0x1108, 0x1170, 0x11bb, 0, -#undef V6245 -#define V6245 (V + 23876) - 0x1108, 0x1170, 0x11bc, 0, -#undef V6246 -#define V6246 (V + 23880) - 0x1108, 0x1170, 0x11bd, 0, -#undef V6247 -#define V6247 (V + 23884) - 0x1108, 0x1170, 0x11be, 0, -#undef V6248 -#define V6248 (V + 23888) - 0x1108, 0x1170, 0x11bf, 0, -#undef V6249 -#define V6249 (V + 23892) - 0x1108, 0x1170, 0x11c0, 0, -#undef V6250 -#define V6250 (V + 23896) - 0x1108, 0x1170, 0x11c1, 0, -#undef V6251 -#define V6251 (V + 23900) - 0x1108, 0x1170, 0x11c2, 0, -#undef V6252 -#define V6252 (V + 23904) - 0x1108, 0x1171, 0, -#undef V6253 -#define V6253 (V + 23907) - 0x1108, 0x1171, 0x11a8, 0, -#undef V6254 -#define V6254 (V + 23911) - 0x1108, 0x1171, 0x11a9, 0, -#undef V6255 -#define V6255 (V + 23915) - 0x1108, 0x1171, 0x11aa, 0, -#undef V6256 -#define V6256 (V + 23919) - 0x1108, 0x1171, 0x11ab, 0, -#undef V6257 -#define V6257 (V + 23923) - 0x1108, 0x1171, 0x11ac, 0, -#undef V6258 -#define V6258 (V + 23927) - 0x1108, 0x1171, 0x11ad, 0, -#undef V6259 -#define V6259 (V + 23931) - 0x1108, 0x1171, 0x11ae, 0, -#undef V6260 -#define V6260 (V + 23935) - 0x1108, 0x1171, 0x11af, 0, -#undef V6261 -#define V6261 (V + 23939) - 0x1108, 0x1171, 0x11b0, 0, -#undef V6262 -#define V6262 (V + 23943) - 0x1108, 0x1171, 0x11b1, 0, -#undef V6263 -#define V6263 (V + 23947) - 0x1108, 0x1171, 0x11b2, 0, -#undef V6264 -#define V6264 (V + 23951) - 0x1108, 0x1171, 0x11b3, 0, -#undef V6265 -#define V6265 (V + 23955) - 0x1108, 0x1171, 0x11b4, 0, -#undef V6266 -#define V6266 (V + 23959) - 0x1108, 0x1171, 0x11b5, 0, -#undef V6267 -#define V6267 (V + 23963) - 0x1108, 0x1171, 0x11b6, 0, -#undef V6268 -#define V6268 (V + 23967) - 0x1108, 0x1171, 0x11b7, 0, -#undef V6269 -#define V6269 (V + 23971) - 0x1108, 0x1171, 0x11b8, 0, -#undef V6270 -#define V6270 (V + 23975) - 0x1108, 0x1171, 0x11b9, 0, -#undef V6271 -#define V6271 (V + 23979) - 0x1108, 0x1171, 0x11ba, 0, -#undef V6272 -#define V6272 (V + 23983) - 0x1108, 0x1171, 0x11bb, 0, -#undef V6273 -#define V6273 (V + 23987) - 0x1108, 0x1171, 0x11bc, 0, -#undef V6274 -#define V6274 (V + 23991) - 0x1108, 0x1171, 0x11bd, 0, -#undef V6275 -#define V6275 (V + 23995) - 0x1108, 0x1171, 0x11be, 0, -#undef V6276 -#define V6276 (V + 23999) - 0x1108, 0x1171, 0x11bf, 0, -#undef V6277 -#define V6277 (V + 24003) - 0x1108, 0x1171, 0x11c0, 0, -#undef V6278 -#define V6278 (V + 24007) - 0x1108, 0x1171, 0x11c1, 0, -#undef V6279 -#define V6279 (V + 24011) - 0x1108, 0x1171, 0x11c2, 0, -#undef V6280 -#define V6280 (V + 24015) - 0x1108, 0x1172, 0, -#undef V6281 -#define V6281 (V + 24018) - 0x1108, 0x1172, 0x11a8, 0, -#undef V6282 -#define V6282 (V + 24022) - 0x1108, 0x1172, 0x11a9, 0, -#undef V6283 -#define V6283 (V + 24026) - 0x1108, 0x1172, 0x11aa, 0, -#undef V6284 -#define V6284 (V + 24030) - 0x1108, 0x1172, 0x11ab, 0, -#undef V6285 -#define V6285 (V + 24034) - 0x1108, 0x1172, 0x11ac, 0, -#undef V6286 -#define V6286 (V + 24038) - 0x1108, 0x1172, 0x11ad, 0, -#undef V6287 -#define V6287 (V + 24042) - 0x1108, 0x1172, 0x11ae, 0, -#undef V6288 -#define V6288 (V + 24046) - 0x1108, 0x1172, 0x11af, 0, -#undef V6289 -#define V6289 (V + 24050) - 0x1108, 0x1172, 0x11b0, 0, -#undef V6290 -#define V6290 (V + 24054) - 0x1108, 0x1172, 0x11b1, 0, -#undef V6291 -#define V6291 (V + 24058) - 0x1108, 0x1172, 0x11b2, 0, -#undef V6292 -#define V6292 (V + 24062) - 0x1108, 0x1172, 0x11b3, 0, -#undef V6293 -#define V6293 (V + 24066) - 0x1108, 0x1172, 0x11b4, 0, -#undef V6294 -#define V6294 (V + 24070) - 0x1108, 0x1172, 0x11b5, 0, -#undef V6295 -#define V6295 (V + 24074) - 0x1108, 0x1172, 0x11b6, 0, -#undef V6296 -#define V6296 (V + 24078) - 0x1108, 0x1172, 0x11b7, 0, -#undef V6297 -#define V6297 (V + 24082) - 0x1108, 0x1172, 0x11b8, 0, -#undef V6298 -#define V6298 (V + 24086) - 0x1108, 0x1172, 0x11b9, 0, -#undef V6299 -#define V6299 (V + 24090) - 0x1108, 0x1172, 0x11ba, 0, -#undef V6300 -#define V6300 (V + 24094) - 0x1108, 0x1172, 0x11bb, 0, -#undef V6301 -#define V6301 (V + 24098) - 0x1108, 0x1172, 0x11bc, 0, -#undef V6302 -#define V6302 (V + 24102) - 0x1108, 0x1172, 0x11bd, 0, -#undef V6303 -#define V6303 (V + 24106) - 0x1108, 0x1172, 0x11be, 0, -#undef V6304 -#define V6304 (V + 24110) - 0x1108, 0x1172, 0x11bf, 0, -#undef V6305 -#define V6305 (V + 24114) - 0x1108, 0x1172, 0x11c0, 0, -#undef V6306 -#define V6306 (V + 24118) - 0x1108, 0x1172, 0x11c1, 0, -#undef V6307 -#define V6307 (V + 24122) - 0x1108, 0x1172, 0x11c2, 0, -#undef V6308 -#define V6308 (V + 24126) - 0x1108, 0x1173, 0, -#undef V6309 -#define V6309 (V + 24129) - 0x1108, 0x1173, 0x11a8, 0, -#undef V6310 -#define V6310 (V + 24133) - 0x1108, 0x1173, 0x11a9, 0, -#undef V6311 -#define V6311 (V + 24137) - 0x1108, 0x1173, 0x11aa, 0, -#undef V6312 -#define V6312 (V + 24141) - 0x1108, 0x1173, 0x11ab, 0, -#undef V6313 -#define V6313 (V + 24145) - 0x1108, 0x1173, 0x11ac, 0, -#undef V6314 -#define V6314 (V + 24149) - 0x1108, 0x1173, 0x11ad, 0, -#undef V6315 -#define V6315 (V + 24153) - 0x1108, 0x1173, 0x11ae, 0, -#undef V6316 -#define V6316 (V + 24157) - 0x1108, 0x1173, 0x11af, 0, -#undef V6317 -#define V6317 (V + 24161) - 0x1108, 0x1173, 0x11b0, 0, -#undef V6318 -#define V6318 (V + 24165) - 0x1108, 0x1173, 0x11b1, 0, -#undef V6319 -#define V6319 (V + 24169) - 0x1108, 0x1173, 0x11b2, 0, -#undef V6320 -#define V6320 (V + 24173) - 0x1108, 0x1173, 0x11b3, 0, -#undef V6321 -#define V6321 (V + 24177) - 0x1108, 0x1173, 0x11b4, 0, -#undef V6322 -#define V6322 (V + 24181) - 0x1108, 0x1173, 0x11b5, 0, -#undef V6323 -#define V6323 (V + 24185) - 0x1108, 0x1173, 0x11b6, 0, -#undef V6324 -#define V6324 (V + 24189) - 0x1108, 0x1173, 0x11b7, 0, -#undef V6325 -#define V6325 (V + 24193) - 0x1108, 0x1173, 0x11b8, 0, -#undef V6326 -#define V6326 (V + 24197) - 0x1108, 0x1173, 0x11b9, 0, -#undef V6327 -#define V6327 (V + 24201) - 0x1108, 0x1173, 0x11ba, 0, -#undef V6328 -#define V6328 (V + 24205) - 0x1108, 0x1173, 0x11bb, 0, -#undef V6329 -#define V6329 (V + 24209) - 0x1108, 0x1173, 0x11bc, 0, -#undef V6330 -#define V6330 (V + 24213) - 0x1108, 0x1173, 0x11bd, 0, -#undef V6331 -#define V6331 (V + 24217) - 0x1108, 0x1173, 0x11be, 0, -#undef V6332 -#define V6332 (V + 24221) - 0x1108, 0x1173, 0x11bf, 0, -#undef V6333 -#define V6333 (V + 24225) - 0x1108, 0x1173, 0x11c0, 0, -#undef V6334 -#define V6334 (V + 24229) - 0x1108, 0x1173, 0x11c1, 0, -#undef V6335 -#define V6335 (V + 24233) - 0x1108, 0x1173, 0x11c2, 0, -#undef V6336 -#define V6336 (V + 24237) - 0x1108, 0x1174, 0, -#undef V6337 -#define V6337 (V + 24240) - 0x1108, 0x1174, 0x11a8, 0, -#undef V6338 -#define V6338 (V + 24244) - 0x1108, 0x1174, 0x11a9, 0, -#undef V6339 -#define V6339 (V + 24248) - 0x1108, 0x1174, 0x11aa, 0, -#undef V6340 -#define V6340 (V + 24252) - 0x1108, 0x1174, 0x11ab, 0, -#undef V6341 -#define V6341 (V + 24256) - 0x1108, 0x1174, 0x11ac, 0, -#undef V6342 -#define V6342 (V + 24260) - 0x1108, 0x1174, 0x11ad, 0, -#undef V6343 -#define V6343 (V + 24264) - 0x1108, 0x1174, 0x11ae, 0, -#undef V6344 -#define V6344 (V + 24268) - 0x1108, 0x1174, 0x11af, 0, -#undef V6345 -#define V6345 (V + 24272) - 0x1108, 0x1174, 0x11b0, 0, -#undef V6346 -#define V6346 (V + 24276) - 0x1108, 0x1174, 0x11b1, 0, -#undef V6347 -#define V6347 (V + 24280) - 0x1108, 0x1174, 0x11b2, 0, -#undef V6348 -#define V6348 (V + 24284) - 0x1108, 0x1174, 0x11b3, 0, -#undef V6349 -#define V6349 (V + 24288) - 0x1108, 0x1174, 0x11b4, 0, -#undef V6350 -#define V6350 (V + 24292) - 0x1108, 0x1174, 0x11b5, 0, -#undef V6351 -#define V6351 (V + 24296) - 0x1108, 0x1174, 0x11b6, 0, -#undef V6352 -#define V6352 (V + 24300) - 0x1108, 0x1174, 0x11b7, 0, -#undef V6353 -#define V6353 (V + 24304) - 0x1108, 0x1174, 0x11b8, 0, -#undef V6354 -#define V6354 (V + 24308) - 0x1108, 0x1174, 0x11b9, 0, -#undef V6355 -#define V6355 (V + 24312) - 0x1108, 0x1174, 0x11ba, 0, -#undef V6356 -#define V6356 (V + 24316) - 0x1108, 0x1174, 0x11bb, 0, -#undef V6357 -#define V6357 (V + 24320) - 0x1108, 0x1174, 0x11bc, 0, -#undef V6358 -#define V6358 (V + 24324) - 0x1108, 0x1174, 0x11bd, 0, -#undef V6359 -#define V6359 (V + 24328) - 0x1108, 0x1174, 0x11be, 0, -#undef V6360 -#define V6360 (V + 24332) - 0x1108, 0x1174, 0x11bf, 0, -#undef V6361 -#define V6361 (V + 24336) - 0x1108, 0x1174, 0x11c0, 0, -#undef V6362 -#define V6362 (V + 24340) - 0x1108, 0x1174, 0x11c1, 0, -#undef V6363 -#define V6363 (V + 24344) - 0x1108, 0x1174, 0x11c2, 0, -#undef V6364 -#define V6364 (V + 24348) - 0x1108, 0x1175, 0, -#undef V6365 -#define V6365 (V + 24351) - 0x1108, 0x1175, 0x11a8, 0, -#undef V6366 -#define V6366 (V + 24355) - 0x1108, 0x1175, 0x11a9, 0, -#undef V6367 -#define V6367 (V + 24359) - 0x1108, 0x1175, 0x11aa, 0, -#undef V6368 -#define V6368 (V + 24363) - 0x1108, 0x1175, 0x11ab, 0, -#undef V6369 -#define V6369 (V + 24367) - 0x1108, 0x1175, 0x11ac, 0, -#undef V6370 -#define V6370 (V + 24371) - 0x1108, 0x1175, 0x11ad, 0, -#undef V6371 -#define V6371 (V + 24375) - 0x1108, 0x1175, 0x11ae, 0, -#undef V6372 -#define V6372 (V + 24379) - 0x1108, 0x1175, 0x11af, 0, -#undef V6373 -#define V6373 (V + 24383) - 0x1108, 0x1175, 0x11b0, 0, -#undef V6374 -#define V6374 (V + 24387) - 0x1108, 0x1175, 0x11b1, 0, -#undef V6375 -#define V6375 (V + 24391) - 0x1108, 0x1175, 0x11b2, 0, -#undef V6376 -#define V6376 (V + 24395) - 0x1108, 0x1175, 0x11b3, 0, -#undef V6377 -#define V6377 (V + 24399) - 0x1108, 0x1175, 0x11b4, 0, -#undef V6378 -#define V6378 (V + 24403) - 0x1108, 0x1175, 0x11b5, 0, -#undef V6379 -#define V6379 (V + 24407) - 0x1108, 0x1175, 0x11b6, 0, -#undef V6380 -#define V6380 (V + 24411) - 0x1108, 0x1175, 0x11b7, 0, -#undef V6381 -#define V6381 (V + 24415) - 0x1108, 0x1175, 0x11b8, 0, -#undef V6382 -#define V6382 (V + 24419) - 0x1108, 0x1175, 0x11b9, 0, -#undef V6383 -#define V6383 (V + 24423) - 0x1108, 0x1175, 0x11ba, 0, -#undef V6384 -#define V6384 (V + 24427) - 0x1108, 0x1175, 0x11bb, 0, -#undef V6385 -#define V6385 (V + 24431) - 0x1108, 0x1175, 0x11bc, 0, -#undef V6386 -#define V6386 (V + 24435) - 0x1108, 0x1175, 0x11bd, 0, -#undef V6387 -#define V6387 (V + 24439) - 0x1108, 0x1175, 0x11be, 0, -#undef V6388 -#define V6388 (V + 24443) - 0x1108, 0x1175, 0x11bf, 0, -#undef V6389 -#define V6389 (V + 24447) - 0x1108, 0x1175, 0x11c0, 0, -#undef V6390 -#define V6390 (V + 24451) - 0x1108, 0x1175, 0x11c1, 0, -#undef V6391 -#define V6391 (V + 24455) - 0x1108, 0x1175, 0x11c2, 0, -#undef V6392 -#define V6392 (V + 24459) - 0x1109, 0x1161, 0, -#undef V6393 -#define V6393 (V + 24462) - 0x1109, 0x1161, 0x11a8, 0, -#undef V6394 -#define V6394 (V + 24466) - 0x1109, 0x1161, 0x11a9, 0, -#undef V6395 -#define V6395 (V + 24470) - 0x1109, 0x1161, 0x11aa, 0, -#undef V6396 -#define V6396 (V + 24474) - 0x1109, 0x1161, 0x11ab, 0, -#undef V6397 -#define V6397 (V + 24478) - 0x1109, 0x1161, 0x11ac, 0, -#undef V6398 -#define V6398 (V + 24482) - 0x1109, 0x1161, 0x11ad, 0, -#undef V6399 -#define V6399 (V + 24486) - 0x1109, 0x1161, 0x11ae, 0, -#undef V6400 -#define V6400 (V + 24490) - 0x1109, 0x1161, 0x11af, 0, -#undef V6401 -#define V6401 (V + 24494) - 0x1109, 0x1161, 0x11b0, 0, -#undef V6402 -#define V6402 (V + 24498) - 0x1109, 0x1161, 0x11b1, 0, -#undef V6403 -#define V6403 (V + 24502) - 0x1109, 0x1161, 0x11b2, 0, -#undef V6404 -#define V6404 (V + 24506) - 0x1109, 0x1161, 0x11b3, 0, -#undef V6405 -#define V6405 (V + 24510) - 0x1109, 0x1161, 0x11b4, 0, -#undef V6406 -#define V6406 (V + 24514) - 0x1109, 0x1161, 0x11b5, 0, -#undef V6407 -#define V6407 (V + 24518) - 0x1109, 0x1161, 0x11b6, 0, -#undef V6408 -#define V6408 (V + 24522) - 0x1109, 0x1161, 0x11b7, 0, -#undef V6409 -#define V6409 (V + 24526) - 0x1109, 0x1161, 0x11b8, 0, -#undef V6410 -#define V6410 (V + 24530) - 0x1109, 0x1161, 0x11b9, 0, -#undef V6411 -#define V6411 (V + 24534) - 0x1109, 0x1161, 0x11ba, 0, -#undef V6412 -#define V6412 (V + 24538) - 0x1109, 0x1161, 0x11bb, 0, -#undef V6413 -#define V6413 (V + 24542) - 0x1109, 0x1161, 0x11bc, 0, -#undef V6414 -#define V6414 (V + 24546) - 0x1109, 0x1161, 0x11bd, 0, -#undef V6415 -#define V6415 (V + 24550) - 0x1109, 0x1161, 0x11be, 0, -#undef V6416 -#define V6416 (V + 24554) - 0x1109, 0x1161, 0x11bf, 0, -#undef V6417 -#define V6417 (V + 24558) - 0x1109, 0x1161, 0x11c0, 0, -#undef V6418 -#define V6418 (V + 24562) - 0x1109, 0x1161, 0x11c1, 0, -#undef V6419 -#define V6419 (V + 24566) - 0x1109, 0x1161, 0x11c2, 0, -#undef V6420 -#define V6420 (V + 24570) - 0x1109, 0x1162, 0, -#undef V6421 -#define V6421 (V + 24573) - 0x1109, 0x1162, 0x11a8, 0, -#undef V6422 -#define V6422 (V + 24577) - 0x1109, 0x1162, 0x11a9, 0, -#undef V6423 -#define V6423 (V + 24581) - 0x1109, 0x1162, 0x11aa, 0, -#undef V6424 -#define V6424 (V + 24585) - 0x1109, 0x1162, 0x11ab, 0, -#undef V6425 -#define V6425 (V + 24589) - 0x1109, 0x1162, 0x11ac, 0, -#undef V6426 -#define V6426 (V + 24593) - 0x1109, 0x1162, 0x11ad, 0, -#undef V6427 -#define V6427 (V + 24597) - 0x1109, 0x1162, 0x11ae, 0, -#undef V6428 -#define V6428 (V + 24601) - 0x1109, 0x1162, 0x11af, 0, -#undef V6429 -#define V6429 (V + 24605) - 0x1109, 0x1162, 0x11b0, 0, -#undef V6430 -#define V6430 (V + 24609) - 0x1109, 0x1162, 0x11b1, 0, -#undef V6431 -#define V6431 (V + 24613) - 0x1109, 0x1162, 0x11b2, 0, -#undef V6432 -#define V6432 (V + 24617) - 0x1109, 0x1162, 0x11b3, 0, -#undef V6433 -#define V6433 (V + 24621) - 0x1109, 0x1162, 0x11b4, 0, -#undef V6434 -#define V6434 (V + 24625) - 0x1109, 0x1162, 0x11b5, 0, -#undef V6435 -#define V6435 (V + 24629) - 0x1109, 0x1162, 0x11b6, 0, -#undef V6436 -#define V6436 (V + 24633) - 0x1109, 0x1162, 0x11b7, 0, -#undef V6437 -#define V6437 (V + 24637) - 0x1109, 0x1162, 0x11b8, 0, -#undef V6438 -#define V6438 (V + 24641) - 0x1109, 0x1162, 0x11b9, 0, -#undef V6439 -#define V6439 (V + 24645) - 0x1109, 0x1162, 0x11ba, 0, -#undef V6440 -#define V6440 (V + 24649) - 0x1109, 0x1162, 0x11bb, 0, -#undef V6441 -#define V6441 (V + 24653) - 0x1109, 0x1162, 0x11bc, 0, -#undef V6442 -#define V6442 (V + 24657) - 0x1109, 0x1162, 0x11bd, 0, -#undef V6443 -#define V6443 (V + 24661) - 0x1109, 0x1162, 0x11be, 0, -#undef V6444 -#define V6444 (V + 24665) - 0x1109, 0x1162, 0x11bf, 0, -#undef V6445 -#define V6445 (V + 24669) - 0x1109, 0x1162, 0x11c0, 0, -#undef V6446 -#define V6446 (V + 24673) - 0x1109, 0x1162, 0x11c1, 0, -#undef V6447 -#define V6447 (V + 24677) - 0x1109, 0x1162, 0x11c2, 0, -#undef V6448 -#define V6448 (V + 24681) - 0x1109, 0x1163, 0, -#undef V6449 -#define V6449 (V + 24684) - 0x1109, 0x1163, 0x11a8, 0, -#undef V6450 -#define V6450 (V + 24688) - 0x1109, 0x1163, 0x11a9, 0, -#undef V6451 -#define V6451 (V + 24692) - 0x1109, 0x1163, 0x11aa, 0, -#undef V6452 -#define V6452 (V + 24696) - 0x1109, 0x1163, 0x11ab, 0, -#undef V6453 -#define V6453 (V + 24700) - 0x1109, 0x1163, 0x11ac, 0, -#undef V6454 -#define V6454 (V + 24704) - 0x1109, 0x1163, 0x11ad, 0, -#undef V6455 -#define V6455 (V + 24708) - 0x1109, 0x1163, 0x11ae, 0, -#undef V6456 -#define V6456 (V + 24712) - 0x1109, 0x1163, 0x11af, 0, -#undef V6457 -#define V6457 (V + 24716) - 0x1109, 0x1163, 0x11b0, 0, -#undef V6458 -#define V6458 (V + 24720) - 0x1109, 0x1163, 0x11b1, 0, -#undef V6459 -#define V6459 (V + 24724) - 0x1109, 0x1163, 0x11b2, 0, -#undef V6460 -#define V6460 (V + 24728) - 0x1109, 0x1163, 0x11b3, 0, -#undef V6461 -#define V6461 (V + 24732) - 0x1109, 0x1163, 0x11b4, 0, -#undef V6462 -#define V6462 (V + 24736) - 0x1109, 0x1163, 0x11b5, 0, -#undef V6463 -#define V6463 (V + 24740) - 0x1109, 0x1163, 0x11b6, 0, -#undef V6464 -#define V6464 (V + 24744) - 0x1109, 0x1163, 0x11b7, 0, -#undef V6465 -#define V6465 (V + 24748) - 0x1109, 0x1163, 0x11b8, 0, -#undef V6466 -#define V6466 (V + 24752) - 0x1109, 0x1163, 0x11b9, 0, -#undef V6467 -#define V6467 (V + 24756) - 0x1109, 0x1163, 0x11ba, 0, -#undef V6468 -#define V6468 (V + 24760) - 0x1109, 0x1163, 0x11bb, 0, -#undef V6469 -#define V6469 (V + 24764) - 0x1109, 0x1163, 0x11bc, 0, -#undef V6470 -#define V6470 (V + 24768) - 0x1109, 0x1163, 0x11bd, 0, -#undef V6471 -#define V6471 (V + 24772) - 0x1109, 0x1163, 0x11be, 0, -#undef V6472 -#define V6472 (V + 24776) - 0x1109, 0x1163, 0x11bf, 0, -#undef V6473 -#define V6473 (V + 24780) - 0x1109, 0x1163, 0x11c0, 0, -#undef V6474 -#define V6474 (V + 24784) - 0x1109, 0x1163, 0x11c1, 0, -#undef V6475 -#define V6475 (V + 24788) - 0x1109, 0x1163, 0x11c2, 0, -#undef V6476 -#define V6476 (V + 24792) - 0x1109, 0x1164, 0, -#undef V6477 -#define V6477 (V + 24795) - 0x1109, 0x1164, 0x11a8, 0, -#undef V6478 -#define V6478 (V + 24799) - 0x1109, 0x1164, 0x11a9, 0, -#undef V6479 -#define V6479 (V + 24803) - 0x1109, 0x1164, 0x11aa, 0, -#undef V6480 -#define V6480 (V + 24807) - 0x1109, 0x1164, 0x11ab, 0, -#undef V6481 -#define V6481 (V + 24811) - 0x1109, 0x1164, 0x11ac, 0, -#undef V6482 -#define V6482 (V + 24815) - 0x1109, 0x1164, 0x11ad, 0, -#undef V6483 -#define V6483 (V + 24819) - 0x1109, 0x1164, 0x11ae, 0, -#undef V6484 -#define V6484 (V + 24823) - 0x1109, 0x1164, 0x11af, 0, -#undef V6485 -#define V6485 (V + 24827) - 0x1109, 0x1164, 0x11b0, 0, -#undef V6486 -#define V6486 (V + 24831) - 0x1109, 0x1164, 0x11b1, 0, -#undef V6487 -#define V6487 (V + 24835) - 0x1109, 0x1164, 0x11b2, 0, -#undef V6488 -#define V6488 (V + 24839) - 0x1109, 0x1164, 0x11b3, 0, -#undef V6489 -#define V6489 (V + 24843) - 0x1109, 0x1164, 0x11b4, 0, -#undef V6490 -#define V6490 (V + 24847) - 0x1109, 0x1164, 0x11b5, 0, -#undef V6491 -#define V6491 (V + 24851) - 0x1109, 0x1164, 0x11b6, 0, -#undef V6492 -#define V6492 (V + 24855) - 0x1109, 0x1164, 0x11b7, 0, -#undef V6493 -#define V6493 (V + 24859) - 0x1109, 0x1164, 0x11b8, 0, -#undef V6494 -#define V6494 (V + 24863) - 0x1109, 0x1164, 0x11b9, 0, -#undef V6495 -#define V6495 (V + 24867) - 0x1109, 0x1164, 0x11ba, 0, -#undef V6496 -#define V6496 (V + 24871) - 0x1109, 0x1164, 0x11bb, 0, -#undef V6497 -#define V6497 (V + 24875) - 0x1109, 0x1164, 0x11bc, 0, -#undef V6498 -#define V6498 (V + 24879) - 0x1109, 0x1164, 0x11bd, 0, -#undef V6499 -#define V6499 (V + 24883) - 0x1109, 0x1164, 0x11be, 0, -#undef V6500 -#define V6500 (V + 24887) - 0x1109, 0x1164, 0x11bf, 0, -#undef V6501 -#define V6501 (V + 24891) - 0x1109, 0x1164, 0x11c0, 0, -#undef V6502 -#define V6502 (V + 24895) - 0x1109, 0x1164, 0x11c1, 0, -#undef V6503 -#define V6503 (V + 24899) - 0x1109, 0x1164, 0x11c2, 0, -#undef V6504 -#define V6504 (V + 24903) - 0x1109, 0x1165, 0, -#undef V6505 -#define V6505 (V + 24906) - 0x1109, 0x1165, 0x11a8, 0, -#undef V6506 -#define V6506 (V + 24910) - 0x1109, 0x1165, 0x11a9, 0, -#undef V6507 -#define V6507 (V + 24914) - 0x1109, 0x1165, 0x11aa, 0, -#undef V6508 -#define V6508 (V + 24918) - 0x1109, 0x1165, 0x11ab, 0, -#undef V6509 -#define V6509 (V + 24922) - 0x1109, 0x1165, 0x11ac, 0, -#undef V6510 -#define V6510 (V + 24926) - 0x1109, 0x1165, 0x11ad, 0, -#undef V6511 -#define V6511 (V + 24930) - 0x1109, 0x1165, 0x11ae, 0, -#undef V6512 -#define V6512 (V + 24934) - 0x1109, 0x1165, 0x11af, 0, -#undef V6513 -#define V6513 (V + 24938) - 0x1109, 0x1165, 0x11b0, 0, -#undef V6514 -#define V6514 (V + 24942) - 0x1109, 0x1165, 0x11b1, 0, -#undef V6515 -#define V6515 (V + 24946) - 0x1109, 0x1165, 0x11b2, 0, -#undef V6516 -#define V6516 (V + 24950) - 0x1109, 0x1165, 0x11b3, 0, -#undef V6517 -#define V6517 (V + 24954) - 0x1109, 0x1165, 0x11b4, 0, -#undef V6518 -#define V6518 (V + 24958) - 0x1109, 0x1165, 0x11b5, 0, -#undef V6519 -#define V6519 (V + 24962) - 0x1109, 0x1165, 0x11b6, 0, -#undef V6520 -#define V6520 (V + 24966) - 0x1109, 0x1165, 0x11b7, 0, -#undef V6521 -#define V6521 (V + 24970) - 0x1109, 0x1165, 0x11b8, 0, -#undef V6522 -#define V6522 (V + 24974) - 0x1109, 0x1165, 0x11b9, 0, -#undef V6523 -#define V6523 (V + 24978) - 0x1109, 0x1165, 0x11ba, 0, -#undef V6524 -#define V6524 (V + 24982) - 0x1109, 0x1165, 0x11bb, 0, -#undef V6525 -#define V6525 (V + 24986) - 0x1109, 0x1165, 0x11bc, 0, -#undef V6526 -#define V6526 (V + 24990) - 0x1109, 0x1165, 0x11bd, 0, -#undef V6527 -#define V6527 (V + 24994) - 0x1109, 0x1165, 0x11be, 0, -#undef V6528 -#define V6528 (V + 24998) - 0x1109, 0x1165, 0x11bf, 0, -#undef V6529 -#define V6529 (V + 25002) - 0x1109, 0x1165, 0x11c0, 0, -#undef V6530 -#define V6530 (V + 25006) - 0x1109, 0x1165, 0x11c1, 0, -#undef V6531 -#define V6531 (V + 25010) - 0x1109, 0x1165, 0x11c2, 0, -#undef V6532 -#define V6532 (V + 25014) - 0x1109, 0x1166, 0, -#undef V6533 -#define V6533 (V + 25017) - 0x1109, 0x1166, 0x11a8, 0, -#undef V6534 -#define V6534 (V + 25021) - 0x1109, 0x1166, 0x11a9, 0, -#undef V6535 -#define V6535 (V + 25025) - 0x1109, 0x1166, 0x11aa, 0, -#undef V6536 -#define V6536 (V + 25029) - 0x1109, 0x1166, 0x11ab, 0, -#undef V6537 -#define V6537 (V + 25033) - 0x1109, 0x1166, 0x11ac, 0, -#undef V6538 -#define V6538 (V + 25037) - 0x1109, 0x1166, 0x11ad, 0, -#undef V6539 -#define V6539 (V + 25041) - 0x1109, 0x1166, 0x11ae, 0, -#undef V6540 -#define V6540 (V + 25045) - 0x1109, 0x1166, 0x11af, 0, -#undef V6541 -#define V6541 (V + 25049) - 0x1109, 0x1166, 0x11b0, 0, -#undef V6542 -#define V6542 (V + 25053) - 0x1109, 0x1166, 0x11b1, 0, -#undef V6543 -#define V6543 (V + 25057) - 0x1109, 0x1166, 0x11b2, 0, -#undef V6544 -#define V6544 (V + 25061) - 0x1109, 0x1166, 0x11b3, 0, -#undef V6545 -#define V6545 (V + 25065) - 0x1109, 0x1166, 0x11b4, 0, -#undef V6546 -#define V6546 (V + 25069) - 0x1109, 0x1166, 0x11b5, 0, -#undef V6547 -#define V6547 (V + 25073) - 0x1109, 0x1166, 0x11b6, 0, -#undef V6548 -#define V6548 (V + 25077) - 0x1109, 0x1166, 0x11b7, 0, -#undef V6549 -#define V6549 (V + 25081) - 0x1109, 0x1166, 0x11b8, 0, -#undef V6550 -#define V6550 (V + 25085) - 0x1109, 0x1166, 0x11b9, 0, -#undef V6551 -#define V6551 (V + 25089) - 0x1109, 0x1166, 0x11ba, 0, -#undef V6552 -#define V6552 (V + 25093) - 0x1109, 0x1166, 0x11bb, 0, -#undef V6553 -#define V6553 (V + 25097) - 0x1109, 0x1166, 0x11bc, 0, -#undef V6554 -#define V6554 (V + 25101) - 0x1109, 0x1166, 0x11bd, 0, -#undef V6555 -#define V6555 (V + 25105) - 0x1109, 0x1166, 0x11be, 0, -#undef V6556 -#define V6556 (V + 25109) - 0x1109, 0x1166, 0x11bf, 0, -#undef V6557 -#define V6557 (V + 25113) - 0x1109, 0x1166, 0x11c0, 0, -#undef V6558 -#define V6558 (V + 25117) - 0x1109, 0x1166, 0x11c1, 0, -#undef V6559 -#define V6559 (V + 25121) - 0x1109, 0x1166, 0x11c2, 0, -#undef V6560 -#define V6560 (V + 25125) - 0x1109, 0x1167, 0, -#undef V6561 -#define V6561 (V + 25128) - 0x1109, 0x1167, 0x11a8, 0, -#undef V6562 -#define V6562 (V + 25132) - 0x1109, 0x1167, 0x11a9, 0, -#undef V6563 -#define V6563 (V + 25136) - 0x1109, 0x1167, 0x11aa, 0, -#undef V6564 -#define V6564 (V + 25140) - 0x1109, 0x1167, 0x11ab, 0, -#undef V6565 -#define V6565 (V + 25144) - 0x1109, 0x1167, 0x11ac, 0, -#undef V6566 -#define V6566 (V + 25148) - 0x1109, 0x1167, 0x11ad, 0, -#undef V6567 -#define V6567 (V + 25152) - 0x1109, 0x1167, 0x11ae, 0, -#undef V6568 -#define V6568 (V + 25156) - 0x1109, 0x1167, 0x11af, 0, -#undef V6569 -#define V6569 (V + 25160) - 0x1109, 0x1167, 0x11b0, 0, -#undef V6570 -#define V6570 (V + 25164) - 0x1109, 0x1167, 0x11b1, 0, -#undef V6571 -#define V6571 (V + 25168) - 0x1109, 0x1167, 0x11b2, 0, -#undef V6572 -#define V6572 (V + 25172) - 0x1109, 0x1167, 0x11b3, 0, -#undef V6573 -#define V6573 (V + 25176) - 0x1109, 0x1167, 0x11b4, 0, -#undef V6574 -#define V6574 (V + 25180) - 0x1109, 0x1167, 0x11b5, 0, -#undef V6575 -#define V6575 (V + 25184) - 0x1109, 0x1167, 0x11b6, 0, -#undef V6576 -#define V6576 (V + 25188) - 0x1109, 0x1167, 0x11b7, 0, -#undef V6577 -#define V6577 (V + 25192) - 0x1109, 0x1167, 0x11b8, 0, -#undef V6578 -#define V6578 (V + 25196) - 0x1109, 0x1167, 0x11b9, 0, -#undef V6579 -#define V6579 (V + 25200) - 0x1109, 0x1167, 0x11ba, 0, -#undef V6580 -#define V6580 (V + 25204) - 0x1109, 0x1167, 0x11bb, 0, -#undef V6581 -#define V6581 (V + 25208) - 0x1109, 0x1167, 0x11bc, 0, -#undef V6582 -#define V6582 (V + 25212) - 0x1109, 0x1167, 0x11bd, 0, -#undef V6583 -#define V6583 (V + 25216) - 0x1109, 0x1167, 0x11be, 0, -#undef V6584 -#define V6584 (V + 25220) - 0x1109, 0x1167, 0x11bf, 0, -#undef V6585 -#define V6585 (V + 25224) - 0x1109, 0x1167, 0x11c0, 0, -#undef V6586 -#define V6586 (V + 25228) - 0x1109, 0x1167, 0x11c1, 0, -#undef V6587 -#define V6587 (V + 25232) - 0x1109, 0x1167, 0x11c2, 0, -#undef V6588 -#define V6588 (V + 25236) - 0x1109, 0x1168, 0, -#undef V6589 -#define V6589 (V + 25239) - 0x1109, 0x1168, 0x11a8, 0, -#undef V6590 -#define V6590 (V + 25243) - 0x1109, 0x1168, 0x11a9, 0, -#undef V6591 -#define V6591 (V + 25247) - 0x1109, 0x1168, 0x11aa, 0, -#undef V6592 -#define V6592 (V + 25251) - 0x1109, 0x1168, 0x11ab, 0, -#undef V6593 -#define V6593 (V + 25255) - 0x1109, 0x1168, 0x11ac, 0, -#undef V6594 -#define V6594 (V + 25259) - 0x1109, 0x1168, 0x11ad, 0, -#undef V6595 -#define V6595 (V + 25263) - 0x1109, 0x1168, 0x11ae, 0, -#undef V6596 -#define V6596 (V + 25267) - 0x1109, 0x1168, 0x11af, 0, -#undef V6597 -#define V6597 (V + 25271) - 0x1109, 0x1168, 0x11b0, 0, -#undef V6598 -#define V6598 (V + 25275) - 0x1109, 0x1168, 0x11b1, 0, -#undef V6599 -#define V6599 (V + 25279) - 0x1109, 0x1168, 0x11b2, 0, -#undef V6600 -#define V6600 (V + 25283) - 0x1109, 0x1168, 0x11b3, 0, -#undef V6601 -#define V6601 (V + 25287) - 0x1109, 0x1168, 0x11b4, 0, -#undef V6602 -#define V6602 (V + 25291) - 0x1109, 0x1168, 0x11b5, 0, -#undef V6603 -#define V6603 (V + 25295) - 0x1109, 0x1168, 0x11b6, 0, -#undef V6604 -#define V6604 (V + 25299) - 0x1109, 0x1168, 0x11b7, 0, -#undef V6605 -#define V6605 (V + 25303) - 0x1109, 0x1168, 0x11b8, 0, -#undef V6606 -#define V6606 (V + 25307) - 0x1109, 0x1168, 0x11b9, 0, -#undef V6607 -#define V6607 (V + 25311) - 0x1109, 0x1168, 0x11ba, 0, -#undef V6608 -#define V6608 (V + 25315) - 0x1109, 0x1168, 0x11bb, 0, -#undef V6609 -#define V6609 (V + 25319) - 0x1109, 0x1168, 0x11bc, 0, -#undef V6610 -#define V6610 (V + 25323) - 0x1109, 0x1168, 0x11bd, 0, -#undef V6611 -#define V6611 (V + 25327) - 0x1109, 0x1168, 0x11be, 0, -#undef V6612 -#define V6612 (V + 25331) - 0x1109, 0x1168, 0x11bf, 0, -#undef V6613 -#define V6613 (V + 25335) - 0x1109, 0x1168, 0x11c0, 0, -#undef V6614 -#define V6614 (V + 25339) - 0x1109, 0x1168, 0x11c1, 0, -#undef V6615 -#define V6615 (V + 25343) - 0x1109, 0x1168, 0x11c2, 0, -#undef V6616 -#define V6616 (V + 25347) - 0x1109, 0x1169, 0, -#undef V6617 -#define V6617 (V + 25350) - 0x1109, 0x1169, 0x11a8, 0, -#undef V6618 -#define V6618 (V + 25354) - 0x1109, 0x1169, 0x11a9, 0, -#undef V6619 -#define V6619 (V + 25358) - 0x1109, 0x1169, 0x11aa, 0, -#undef V6620 -#define V6620 (V + 25362) - 0x1109, 0x1169, 0x11ab, 0, -#undef V6621 -#define V6621 (V + 25366) - 0x1109, 0x1169, 0x11ac, 0, -#undef V6622 -#define V6622 (V + 25370) - 0x1109, 0x1169, 0x11ad, 0, -#undef V6623 -#define V6623 (V + 25374) - 0x1109, 0x1169, 0x11ae, 0, -#undef V6624 -#define V6624 (V + 25378) - 0x1109, 0x1169, 0x11af, 0, -#undef V6625 -#define V6625 (V + 25382) - 0x1109, 0x1169, 0x11b0, 0, -#undef V6626 -#define V6626 (V + 25386) - 0x1109, 0x1169, 0x11b1, 0, -#undef V6627 -#define V6627 (V + 25390) - 0x1109, 0x1169, 0x11b2, 0, -#undef V6628 -#define V6628 (V + 25394) - 0x1109, 0x1169, 0x11b3, 0, -#undef V6629 -#define V6629 (V + 25398) - 0x1109, 0x1169, 0x11b4, 0, -#undef V6630 -#define V6630 (V + 25402) - 0x1109, 0x1169, 0x11b5, 0, -#undef V6631 -#define V6631 (V + 25406) - 0x1109, 0x1169, 0x11b6, 0, -#undef V6632 -#define V6632 (V + 25410) - 0x1109, 0x1169, 0x11b7, 0, -#undef V6633 -#define V6633 (V + 25414) - 0x1109, 0x1169, 0x11b8, 0, -#undef V6634 -#define V6634 (V + 25418) - 0x1109, 0x1169, 0x11b9, 0, -#undef V6635 -#define V6635 (V + 25422) - 0x1109, 0x1169, 0x11ba, 0, -#undef V6636 -#define V6636 (V + 25426) - 0x1109, 0x1169, 0x11bb, 0, -#undef V6637 -#define V6637 (V + 25430) - 0x1109, 0x1169, 0x11bc, 0, -#undef V6638 -#define V6638 (V + 25434) - 0x1109, 0x1169, 0x11bd, 0, -#undef V6639 -#define V6639 (V + 25438) - 0x1109, 0x1169, 0x11be, 0, -#undef V6640 -#define V6640 (V + 25442) - 0x1109, 0x1169, 0x11bf, 0, -#undef V6641 -#define V6641 (V + 25446) - 0x1109, 0x1169, 0x11c0, 0, -#undef V6642 -#define V6642 (V + 25450) - 0x1109, 0x1169, 0x11c1, 0, -#undef V6643 -#define V6643 (V + 25454) - 0x1109, 0x1169, 0x11c2, 0, -#undef V6644 -#define V6644 (V + 25458) - 0x1109, 0x116a, 0, -#undef V6645 -#define V6645 (V + 25461) - 0x1109, 0x116a, 0x11a8, 0, -#undef V6646 -#define V6646 (V + 25465) - 0x1109, 0x116a, 0x11a9, 0, -#undef V6647 -#define V6647 (V + 25469) - 0x1109, 0x116a, 0x11aa, 0, -#undef V6648 -#define V6648 (V + 25473) - 0x1109, 0x116a, 0x11ab, 0, -#undef V6649 -#define V6649 (V + 25477) - 0x1109, 0x116a, 0x11ac, 0, -#undef V6650 -#define V6650 (V + 25481) - 0x1109, 0x116a, 0x11ad, 0, -#undef V6651 -#define V6651 (V + 25485) - 0x1109, 0x116a, 0x11ae, 0, -#undef V6652 -#define V6652 (V + 25489) - 0x1109, 0x116a, 0x11af, 0, -#undef V6653 -#define V6653 (V + 25493) - 0x1109, 0x116a, 0x11b0, 0, -#undef V6654 -#define V6654 (V + 25497) - 0x1109, 0x116a, 0x11b1, 0, -#undef V6655 -#define V6655 (V + 25501) - 0x1109, 0x116a, 0x11b2, 0, -#undef V6656 -#define V6656 (V + 25505) - 0x1109, 0x116a, 0x11b3, 0, -#undef V6657 -#define V6657 (V + 25509) - 0x1109, 0x116a, 0x11b4, 0, -#undef V6658 -#define V6658 (V + 25513) - 0x1109, 0x116a, 0x11b5, 0, -#undef V6659 -#define V6659 (V + 25517) - 0x1109, 0x116a, 0x11b6, 0, -#undef V6660 -#define V6660 (V + 25521) - 0x1109, 0x116a, 0x11b7, 0, -#undef V6661 -#define V6661 (V + 25525) - 0x1109, 0x116a, 0x11b8, 0, -#undef V6662 -#define V6662 (V + 25529) - 0x1109, 0x116a, 0x11b9, 0, -#undef V6663 -#define V6663 (V + 25533) - 0x1109, 0x116a, 0x11ba, 0, -#undef V6664 -#define V6664 (V + 25537) - 0x1109, 0x116a, 0x11bb, 0, -#undef V6665 -#define V6665 (V + 25541) - 0x1109, 0x116a, 0x11bc, 0, -#undef V6666 -#define V6666 (V + 25545) - 0x1109, 0x116a, 0x11bd, 0, -#undef V6667 -#define V6667 (V + 25549) - 0x1109, 0x116a, 0x11be, 0, -#undef V6668 -#define V6668 (V + 25553) - 0x1109, 0x116a, 0x11bf, 0, -#undef V6669 -#define V6669 (V + 25557) - 0x1109, 0x116a, 0x11c0, 0, -#undef V6670 -#define V6670 (V + 25561) - 0x1109, 0x116a, 0x11c1, 0, -#undef V6671 -#define V6671 (V + 25565) - 0x1109, 0x116a, 0x11c2, 0, -#undef V6672 -#define V6672 (V + 25569) - 0x1109, 0x116b, 0, -#undef V6673 -#define V6673 (V + 25572) - 0x1109, 0x116b, 0x11a8, 0, -#undef V6674 -#define V6674 (V + 25576) - 0x1109, 0x116b, 0x11a9, 0, -#undef V6675 -#define V6675 (V + 25580) - 0x1109, 0x116b, 0x11aa, 0, -#undef V6676 -#define V6676 (V + 25584) - 0x1109, 0x116b, 0x11ab, 0, -#undef V6677 -#define V6677 (V + 25588) - 0x1109, 0x116b, 0x11ac, 0, -#undef V6678 -#define V6678 (V + 25592) - 0x1109, 0x116b, 0x11ad, 0, -#undef V6679 -#define V6679 (V + 25596) - 0x1109, 0x116b, 0x11ae, 0, -#undef V6680 -#define V6680 (V + 25600) - 0x1109, 0x116b, 0x11af, 0, -#undef V6681 -#define V6681 (V + 25604) - 0x1109, 0x116b, 0x11b0, 0, -#undef V6682 -#define V6682 (V + 25608) - 0x1109, 0x116b, 0x11b1, 0, -#undef V6683 -#define V6683 (V + 25612) - 0x1109, 0x116b, 0x11b2, 0, -#undef V6684 -#define V6684 (V + 25616) - 0x1109, 0x116b, 0x11b3, 0, -#undef V6685 -#define V6685 (V + 25620) - 0x1109, 0x116b, 0x11b4, 0, -#undef V6686 -#define V6686 (V + 25624) - 0x1109, 0x116b, 0x11b5, 0, -#undef V6687 -#define V6687 (V + 25628) - 0x1109, 0x116b, 0x11b6, 0, -#undef V6688 -#define V6688 (V + 25632) - 0x1109, 0x116b, 0x11b7, 0, -#undef V6689 -#define V6689 (V + 25636) - 0x1109, 0x116b, 0x11b8, 0, -#undef V6690 -#define V6690 (V + 25640) - 0x1109, 0x116b, 0x11b9, 0, -#undef V6691 -#define V6691 (V + 25644) - 0x1109, 0x116b, 0x11ba, 0, -#undef V6692 -#define V6692 (V + 25648) - 0x1109, 0x116b, 0x11bb, 0, -#undef V6693 -#define V6693 (V + 25652) - 0x1109, 0x116b, 0x11bc, 0, -#undef V6694 -#define V6694 (V + 25656) - 0x1109, 0x116b, 0x11bd, 0, -#undef V6695 -#define V6695 (V + 25660) - 0x1109, 0x116b, 0x11be, 0, -#undef V6696 -#define V6696 (V + 25664) - 0x1109, 0x116b, 0x11bf, 0, -#undef V6697 -#define V6697 (V + 25668) - 0x1109, 0x116b, 0x11c0, 0, -#undef V6698 -#define V6698 (V + 25672) - 0x1109, 0x116b, 0x11c1, 0, -#undef V6699 -#define V6699 (V + 25676) - 0x1109, 0x116b, 0x11c2, 0, -#undef V6700 -#define V6700 (V + 25680) - 0x1109, 0x116c, 0, -#undef V6701 -#define V6701 (V + 25683) - 0x1109, 0x116c, 0x11a8, 0, -#undef V6702 -#define V6702 (V + 25687) - 0x1109, 0x116c, 0x11a9, 0, -#undef V6703 -#define V6703 (V + 25691) - 0x1109, 0x116c, 0x11aa, 0, -#undef V6704 -#define V6704 (V + 25695) - 0x1109, 0x116c, 0x11ab, 0, -#undef V6705 -#define V6705 (V + 25699) - 0x1109, 0x116c, 0x11ac, 0, -#undef V6706 -#define V6706 (V + 25703) - 0x1109, 0x116c, 0x11ad, 0, -#undef V6707 -#define V6707 (V + 25707) - 0x1109, 0x116c, 0x11ae, 0, -#undef V6708 -#define V6708 (V + 25711) - 0x1109, 0x116c, 0x11af, 0, -#undef V6709 -#define V6709 (V + 25715) - 0x1109, 0x116c, 0x11b0, 0, -#undef V6710 -#define V6710 (V + 25719) - 0x1109, 0x116c, 0x11b1, 0, -#undef V6711 -#define V6711 (V + 25723) - 0x1109, 0x116c, 0x11b2, 0, -#undef V6712 -#define V6712 (V + 25727) - 0x1109, 0x116c, 0x11b3, 0, -#undef V6713 -#define V6713 (V + 25731) - 0x1109, 0x116c, 0x11b4, 0, -#undef V6714 -#define V6714 (V + 25735) - 0x1109, 0x116c, 0x11b5, 0, -#undef V6715 -#define V6715 (V + 25739) - 0x1109, 0x116c, 0x11b6, 0, -#undef V6716 -#define V6716 (V + 25743) - 0x1109, 0x116c, 0x11b7, 0, -#undef V6717 -#define V6717 (V + 25747) - 0x1109, 0x116c, 0x11b8, 0, -#undef V6718 -#define V6718 (V + 25751) - 0x1109, 0x116c, 0x11b9, 0, -#undef V6719 -#define V6719 (V + 25755) - 0x1109, 0x116c, 0x11ba, 0, -#undef V6720 -#define V6720 (V + 25759) - 0x1109, 0x116c, 0x11bb, 0, -#undef V6721 -#define V6721 (V + 25763) - 0x1109, 0x116c, 0x11bc, 0, -#undef V6722 -#define V6722 (V + 25767) - 0x1109, 0x116c, 0x11bd, 0, -#undef V6723 -#define V6723 (V + 25771) - 0x1109, 0x116c, 0x11be, 0, -#undef V6724 -#define V6724 (V + 25775) - 0x1109, 0x116c, 0x11bf, 0, -#undef V6725 -#define V6725 (V + 25779) - 0x1109, 0x116c, 0x11c0, 0, -#undef V6726 -#define V6726 (V + 25783) - 0x1109, 0x116c, 0x11c1, 0, -#undef V6727 -#define V6727 (V + 25787) - 0x1109, 0x116c, 0x11c2, 0, -#undef V6728 -#define V6728 (V + 25791) - 0x1109, 0x116d, 0, -#undef V6729 -#define V6729 (V + 25794) - 0x1109, 0x116d, 0x11a8, 0, -#undef V6730 -#define V6730 (V + 25798) - 0x1109, 0x116d, 0x11a9, 0, -#undef V6731 -#define V6731 (V + 25802) - 0x1109, 0x116d, 0x11aa, 0, -#undef V6732 -#define V6732 (V + 25806) - 0x1109, 0x116d, 0x11ab, 0, -#undef V6733 -#define V6733 (V + 25810) - 0x1109, 0x116d, 0x11ac, 0, -#undef V6734 -#define V6734 (V + 25814) - 0x1109, 0x116d, 0x11ad, 0, -#undef V6735 -#define V6735 (V + 25818) - 0x1109, 0x116d, 0x11ae, 0, -#undef V6736 -#define V6736 (V + 25822) - 0x1109, 0x116d, 0x11af, 0, -#undef V6737 -#define V6737 (V + 25826) - 0x1109, 0x116d, 0x11b0, 0, -#undef V6738 -#define V6738 (V + 25830) - 0x1109, 0x116d, 0x11b1, 0, -#undef V6739 -#define V6739 (V + 25834) - 0x1109, 0x116d, 0x11b2, 0, -#undef V6740 -#define V6740 (V + 25838) - 0x1109, 0x116d, 0x11b3, 0, -#undef V6741 -#define V6741 (V + 25842) - 0x1109, 0x116d, 0x11b4, 0, -#undef V6742 -#define V6742 (V + 25846) - 0x1109, 0x116d, 0x11b5, 0, -#undef V6743 -#define V6743 (V + 25850) - 0x1109, 0x116d, 0x11b6, 0, -#undef V6744 -#define V6744 (V + 25854) - 0x1109, 0x116d, 0x11b7, 0, -#undef V6745 -#define V6745 (V + 25858) - 0x1109, 0x116d, 0x11b8, 0, -#undef V6746 -#define V6746 (V + 25862) - 0x1109, 0x116d, 0x11b9, 0, -#undef V6747 -#define V6747 (V + 25866) - 0x1109, 0x116d, 0x11ba, 0, -#undef V6748 -#define V6748 (V + 25870) - 0x1109, 0x116d, 0x11bb, 0, -#undef V6749 -#define V6749 (V + 25874) - 0x1109, 0x116d, 0x11bc, 0, -#undef V6750 -#define V6750 (V + 25878) - 0x1109, 0x116d, 0x11bd, 0, -#undef V6751 -#define V6751 (V + 25882) - 0x1109, 0x116d, 0x11be, 0, -#undef V6752 -#define V6752 (V + 25886) - 0x1109, 0x116d, 0x11bf, 0, -#undef V6753 -#define V6753 (V + 25890) - 0x1109, 0x116d, 0x11c0, 0, -#undef V6754 -#define V6754 (V + 25894) - 0x1109, 0x116d, 0x11c1, 0, -#undef V6755 -#define V6755 (V + 25898) - 0x1109, 0x116d, 0x11c2, 0, -#undef V6756 -#define V6756 (V + 25902) - 0x1109, 0x116e, 0, -#undef V6757 -#define V6757 (V + 25905) - 0x1109, 0x116e, 0x11a8, 0, -#undef V6758 -#define V6758 (V + 25909) - 0x1109, 0x116e, 0x11a9, 0, -#undef V6759 -#define V6759 (V + 25913) - 0x1109, 0x116e, 0x11aa, 0, -#undef V6760 -#define V6760 (V + 25917) - 0x1109, 0x116e, 0x11ab, 0, -#undef V6761 -#define V6761 (V + 25921) - 0x1109, 0x116e, 0x11ac, 0, -#undef V6762 -#define V6762 (V + 25925) - 0x1109, 0x116e, 0x11ad, 0, -#undef V6763 -#define V6763 (V + 25929) - 0x1109, 0x116e, 0x11ae, 0, -#undef V6764 -#define V6764 (V + 25933) - 0x1109, 0x116e, 0x11af, 0, -#undef V6765 -#define V6765 (V + 25937) - 0x1109, 0x116e, 0x11b0, 0, -#undef V6766 -#define V6766 (V + 25941) - 0x1109, 0x116e, 0x11b1, 0, -#undef V6767 -#define V6767 (V + 25945) - 0x1109, 0x116e, 0x11b2, 0, -#undef V6768 -#define V6768 (V + 25949) - 0x1109, 0x116e, 0x11b3, 0, -#undef V6769 -#define V6769 (V + 25953) - 0x1109, 0x116e, 0x11b4, 0, -#undef V6770 -#define V6770 (V + 25957) - 0x1109, 0x116e, 0x11b5, 0, -#undef V6771 -#define V6771 (V + 25961) - 0x1109, 0x116e, 0x11b6, 0, -#undef V6772 -#define V6772 (V + 25965) - 0x1109, 0x116e, 0x11b7, 0, -#undef V6773 -#define V6773 (V + 25969) - 0x1109, 0x116e, 0x11b8, 0, -#undef V6774 -#define V6774 (V + 25973) - 0x1109, 0x116e, 0x11b9, 0, -#undef V6775 -#define V6775 (V + 25977) - 0x1109, 0x116e, 0x11ba, 0, -#undef V6776 -#define V6776 (V + 25981) - 0x1109, 0x116e, 0x11bb, 0, -#undef V6777 -#define V6777 (V + 25985) - 0x1109, 0x116e, 0x11bc, 0, -#undef V6778 -#define V6778 (V + 25989) - 0x1109, 0x116e, 0x11bd, 0, -#undef V6779 -#define V6779 (V + 25993) - 0x1109, 0x116e, 0x11be, 0, -#undef V6780 -#define V6780 (V + 25997) - 0x1109, 0x116e, 0x11bf, 0, -#undef V6781 -#define V6781 (V + 26001) - 0x1109, 0x116e, 0x11c0, 0, -#undef V6782 -#define V6782 (V + 26005) - 0x1109, 0x116e, 0x11c1, 0, -#undef V6783 -#define V6783 (V + 26009) - 0x1109, 0x116e, 0x11c2, 0, -#undef V6784 -#define V6784 (V + 26013) - 0x1109, 0x116f, 0, -#undef V6785 -#define V6785 (V + 26016) - 0x1109, 0x116f, 0x11a8, 0, -#undef V6786 -#define V6786 (V + 26020) - 0x1109, 0x116f, 0x11a9, 0, -#undef V6787 -#define V6787 (V + 26024) - 0x1109, 0x116f, 0x11aa, 0, -#undef V6788 -#define V6788 (V + 26028) - 0x1109, 0x116f, 0x11ab, 0, -#undef V6789 -#define V6789 (V + 26032) - 0x1109, 0x116f, 0x11ac, 0, -#undef V6790 -#define V6790 (V + 26036) - 0x1109, 0x116f, 0x11ad, 0, -#undef V6791 -#define V6791 (V + 26040) - 0x1109, 0x116f, 0x11ae, 0, -#undef V6792 -#define V6792 (V + 26044) - 0x1109, 0x116f, 0x11af, 0, -#undef V6793 -#define V6793 (V + 26048) - 0x1109, 0x116f, 0x11b0, 0, -#undef V6794 -#define V6794 (V + 26052) - 0x1109, 0x116f, 0x11b1, 0, -#undef V6795 -#define V6795 (V + 26056) - 0x1109, 0x116f, 0x11b2, 0, -#undef V6796 -#define V6796 (V + 26060) - 0x1109, 0x116f, 0x11b3, 0, -#undef V6797 -#define V6797 (V + 26064) - 0x1109, 0x116f, 0x11b4, 0, -#undef V6798 -#define V6798 (V + 26068) - 0x1109, 0x116f, 0x11b5, 0, -#undef V6799 -#define V6799 (V + 26072) - 0x1109, 0x116f, 0x11b6, 0, -#undef V6800 -#define V6800 (V + 26076) - 0x1109, 0x116f, 0x11b7, 0, -#undef V6801 -#define V6801 (V + 26080) - 0x1109, 0x116f, 0x11b8, 0, -#undef V6802 -#define V6802 (V + 26084) - 0x1109, 0x116f, 0x11b9, 0, -#undef V6803 -#define V6803 (V + 26088) - 0x1109, 0x116f, 0x11ba, 0, -#undef V6804 -#define V6804 (V + 26092) - 0x1109, 0x116f, 0x11bb, 0, -#undef V6805 -#define V6805 (V + 26096) - 0x1109, 0x116f, 0x11bc, 0, -#undef V6806 -#define V6806 (V + 26100) - 0x1109, 0x116f, 0x11bd, 0, -#undef V6807 -#define V6807 (V + 26104) - 0x1109, 0x116f, 0x11be, 0, -#undef V6808 -#define V6808 (V + 26108) - 0x1109, 0x116f, 0x11bf, 0, -#undef V6809 -#define V6809 (V + 26112) - 0x1109, 0x116f, 0x11c0, 0, -#undef V6810 -#define V6810 (V + 26116) - 0x1109, 0x116f, 0x11c1, 0, -#undef V6811 -#define V6811 (V + 26120) - 0x1109, 0x116f, 0x11c2, 0, -#undef V6812 -#define V6812 (V + 26124) - 0x1109, 0x1170, 0, -#undef V6813 -#define V6813 (V + 26127) - 0x1109, 0x1170, 0x11a8, 0, -#undef V6814 -#define V6814 (V + 26131) - 0x1109, 0x1170, 0x11a9, 0, -#undef V6815 -#define V6815 (V + 26135) - 0x1109, 0x1170, 0x11aa, 0, -#undef V6816 -#define V6816 (V + 26139) - 0x1109, 0x1170, 0x11ab, 0, -#undef V6817 -#define V6817 (V + 26143) - 0x1109, 0x1170, 0x11ac, 0, -#undef V6818 -#define V6818 (V + 26147) - 0x1109, 0x1170, 0x11ad, 0, -#undef V6819 -#define V6819 (V + 26151) - 0x1109, 0x1170, 0x11ae, 0, -#undef V6820 -#define V6820 (V + 26155) - 0x1109, 0x1170, 0x11af, 0, -#undef V6821 -#define V6821 (V + 26159) - 0x1109, 0x1170, 0x11b0, 0, -#undef V6822 -#define V6822 (V + 26163) - 0x1109, 0x1170, 0x11b1, 0, -#undef V6823 -#define V6823 (V + 26167) - 0x1109, 0x1170, 0x11b2, 0, -#undef V6824 -#define V6824 (V + 26171) - 0x1109, 0x1170, 0x11b3, 0, -#undef V6825 -#define V6825 (V + 26175) - 0x1109, 0x1170, 0x11b4, 0, -#undef V6826 -#define V6826 (V + 26179) - 0x1109, 0x1170, 0x11b5, 0, -#undef V6827 -#define V6827 (V + 26183) - 0x1109, 0x1170, 0x11b6, 0, -#undef V6828 -#define V6828 (V + 26187) - 0x1109, 0x1170, 0x11b7, 0, -#undef V6829 -#define V6829 (V + 26191) - 0x1109, 0x1170, 0x11b8, 0, -#undef V6830 -#define V6830 (V + 26195) - 0x1109, 0x1170, 0x11b9, 0, -#undef V6831 -#define V6831 (V + 26199) - 0x1109, 0x1170, 0x11ba, 0, -#undef V6832 -#define V6832 (V + 26203) - 0x1109, 0x1170, 0x11bb, 0, -#undef V6833 -#define V6833 (V + 26207) - 0x1109, 0x1170, 0x11bc, 0, -#undef V6834 -#define V6834 (V + 26211) - 0x1109, 0x1170, 0x11bd, 0, -#undef V6835 -#define V6835 (V + 26215) - 0x1109, 0x1170, 0x11be, 0, -#undef V6836 -#define V6836 (V + 26219) - 0x1109, 0x1170, 0x11bf, 0, -#undef V6837 -#define V6837 (V + 26223) - 0x1109, 0x1170, 0x11c0, 0, -#undef V6838 -#define V6838 (V + 26227) - 0x1109, 0x1170, 0x11c1, 0, -#undef V6839 -#define V6839 (V + 26231) - 0x1109, 0x1170, 0x11c2, 0, -#undef V6840 -#define V6840 (V + 26235) - 0x1109, 0x1171, 0, -#undef V6841 -#define V6841 (V + 26238) - 0x1109, 0x1171, 0x11a8, 0, -#undef V6842 -#define V6842 (V + 26242) - 0x1109, 0x1171, 0x11a9, 0, -#undef V6843 -#define V6843 (V + 26246) - 0x1109, 0x1171, 0x11aa, 0, -#undef V6844 -#define V6844 (V + 26250) - 0x1109, 0x1171, 0x11ab, 0, -#undef V6845 -#define V6845 (V + 26254) - 0x1109, 0x1171, 0x11ac, 0, -#undef V6846 -#define V6846 (V + 26258) - 0x1109, 0x1171, 0x11ad, 0, -#undef V6847 -#define V6847 (V + 26262) - 0x1109, 0x1171, 0x11ae, 0, -#undef V6848 -#define V6848 (V + 26266) - 0x1109, 0x1171, 0x11af, 0, -#undef V6849 -#define V6849 (V + 26270) - 0x1109, 0x1171, 0x11b0, 0, -#undef V6850 -#define V6850 (V + 26274) - 0x1109, 0x1171, 0x11b1, 0, -#undef V6851 -#define V6851 (V + 26278) - 0x1109, 0x1171, 0x11b2, 0, -#undef V6852 -#define V6852 (V + 26282) - 0x1109, 0x1171, 0x11b3, 0, -#undef V6853 -#define V6853 (V + 26286) - 0x1109, 0x1171, 0x11b4, 0, -#undef V6854 -#define V6854 (V + 26290) - 0x1109, 0x1171, 0x11b5, 0, -#undef V6855 -#define V6855 (V + 26294) - 0x1109, 0x1171, 0x11b6, 0, -#undef V6856 -#define V6856 (V + 26298) - 0x1109, 0x1171, 0x11b7, 0, -#undef V6857 -#define V6857 (V + 26302) - 0x1109, 0x1171, 0x11b8, 0, -#undef V6858 -#define V6858 (V + 26306) - 0x1109, 0x1171, 0x11b9, 0, -#undef V6859 -#define V6859 (V + 26310) - 0x1109, 0x1171, 0x11ba, 0, -#undef V6860 -#define V6860 (V + 26314) - 0x1109, 0x1171, 0x11bb, 0, -#undef V6861 -#define V6861 (V + 26318) - 0x1109, 0x1171, 0x11bc, 0, -#undef V6862 -#define V6862 (V + 26322) - 0x1109, 0x1171, 0x11bd, 0, -#undef V6863 -#define V6863 (V + 26326) - 0x1109, 0x1171, 0x11be, 0, -#undef V6864 -#define V6864 (V + 26330) - 0x1109, 0x1171, 0x11bf, 0, -#undef V6865 -#define V6865 (V + 26334) - 0x1109, 0x1171, 0x11c0, 0, -#undef V6866 -#define V6866 (V + 26338) - 0x1109, 0x1171, 0x11c1, 0, -#undef V6867 -#define V6867 (V + 26342) - 0x1109, 0x1171, 0x11c2, 0, -#undef V6868 -#define V6868 (V + 26346) - 0x1109, 0x1172, 0, -#undef V6869 -#define V6869 (V + 26349) - 0x1109, 0x1172, 0x11a8, 0, -#undef V6870 -#define V6870 (V + 26353) - 0x1109, 0x1172, 0x11a9, 0, -#undef V6871 -#define V6871 (V + 26357) - 0x1109, 0x1172, 0x11aa, 0, -#undef V6872 -#define V6872 (V + 26361) - 0x1109, 0x1172, 0x11ab, 0, -#undef V6873 -#define V6873 (V + 26365) - 0x1109, 0x1172, 0x11ac, 0, -#undef V6874 -#define V6874 (V + 26369) - 0x1109, 0x1172, 0x11ad, 0, -#undef V6875 -#define V6875 (V + 26373) - 0x1109, 0x1172, 0x11ae, 0, -#undef V6876 -#define V6876 (V + 26377) - 0x1109, 0x1172, 0x11af, 0, -#undef V6877 -#define V6877 (V + 26381) - 0x1109, 0x1172, 0x11b0, 0, -#undef V6878 -#define V6878 (V + 26385) - 0x1109, 0x1172, 0x11b1, 0, -#undef V6879 -#define V6879 (V + 26389) - 0x1109, 0x1172, 0x11b2, 0, -#undef V6880 -#define V6880 (V + 26393) - 0x1109, 0x1172, 0x11b3, 0, -#undef V6881 -#define V6881 (V + 26397) - 0x1109, 0x1172, 0x11b4, 0, -#undef V6882 -#define V6882 (V + 26401) - 0x1109, 0x1172, 0x11b5, 0, -#undef V6883 -#define V6883 (V + 26405) - 0x1109, 0x1172, 0x11b6, 0, -#undef V6884 -#define V6884 (V + 26409) - 0x1109, 0x1172, 0x11b7, 0, -#undef V6885 -#define V6885 (V + 26413) - 0x1109, 0x1172, 0x11b8, 0, -#undef V6886 -#define V6886 (V + 26417) - 0x1109, 0x1172, 0x11b9, 0, -#undef V6887 -#define V6887 (V + 26421) - 0x1109, 0x1172, 0x11ba, 0, -#undef V6888 -#define V6888 (V + 26425) - 0x1109, 0x1172, 0x11bb, 0, -#undef V6889 -#define V6889 (V + 26429) - 0x1109, 0x1172, 0x11bc, 0, -#undef V6890 -#define V6890 (V + 26433) - 0x1109, 0x1172, 0x11bd, 0, -#undef V6891 -#define V6891 (V + 26437) - 0x1109, 0x1172, 0x11be, 0, -#undef V6892 -#define V6892 (V + 26441) - 0x1109, 0x1172, 0x11bf, 0, -#undef V6893 -#define V6893 (V + 26445) - 0x1109, 0x1172, 0x11c0, 0, -#undef V6894 -#define V6894 (V + 26449) - 0x1109, 0x1172, 0x11c1, 0, -#undef V6895 -#define V6895 (V + 26453) - 0x1109, 0x1172, 0x11c2, 0, -#undef V6896 -#define V6896 (V + 26457) - 0x1109, 0x1173, 0, -#undef V6897 -#define V6897 (V + 26460) - 0x1109, 0x1173, 0x11a8, 0, -#undef V6898 -#define V6898 (V + 26464) - 0x1109, 0x1173, 0x11a9, 0, -#undef V6899 -#define V6899 (V + 26468) - 0x1109, 0x1173, 0x11aa, 0, -#undef V6900 -#define V6900 (V + 26472) - 0x1109, 0x1173, 0x11ab, 0, -#undef V6901 -#define V6901 (V + 26476) - 0x1109, 0x1173, 0x11ac, 0, -#undef V6902 -#define V6902 (V + 26480) - 0x1109, 0x1173, 0x11ad, 0, -#undef V6903 -#define V6903 (V + 26484) - 0x1109, 0x1173, 0x11ae, 0, -#undef V6904 -#define V6904 (V + 26488) - 0x1109, 0x1173, 0x11af, 0, -#undef V6905 -#define V6905 (V + 26492) - 0x1109, 0x1173, 0x11b0, 0, -#undef V6906 -#define V6906 (V + 26496) - 0x1109, 0x1173, 0x11b1, 0, -#undef V6907 -#define V6907 (V + 26500) - 0x1109, 0x1173, 0x11b2, 0, -#undef V6908 -#define V6908 (V + 26504) - 0x1109, 0x1173, 0x11b3, 0, -#undef V6909 -#define V6909 (V + 26508) - 0x1109, 0x1173, 0x11b4, 0, -#undef V6910 -#define V6910 (V + 26512) - 0x1109, 0x1173, 0x11b5, 0, -#undef V6911 -#define V6911 (V + 26516) - 0x1109, 0x1173, 0x11b6, 0, -#undef V6912 -#define V6912 (V + 26520) - 0x1109, 0x1173, 0x11b7, 0, -#undef V6913 -#define V6913 (V + 26524) - 0x1109, 0x1173, 0x11b8, 0, -#undef V6914 -#define V6914 (V + 26528) - 0x1109, 0x1173, 0x11b9, 0, -#undef V6915 -#define V6915 (V + 26532) - 0x1109, 0x1173, 0x11ba, 0, -#undef V6916 -#define V6916 (V + 26536) - 0x1109, 0x1173, 0x11bb, 0, -#undef V6917 -#define V6917 (V + 26540) - 0x1109, 0x1173, 0x11bc, 0, -#undef V6918 -#define V6918 (V + 26544) - 0x1109, 0x1173, 0x11bd, 0, -#undef V6919 -#define V6919 (V + 26548) - 0x1109, 0x1173, 0x11be, 0, -#undef V6920 -#define V6920 (V + 26552) - 0x1109, 0x1173, 0x11bf, 0, -#undef V6921 -#define V6921 (V + 26556) - 0x1109, 0x1173, 0x11c0, 0, -#undef V6922 -#define V6922 (V + 26560) - 0x1109, 0x1173, 0x11c1, 0, -#undef V6923 -#define V6923 (V + 26564) - 0x1109, 0x1173, 0x11c2, 0, -#undef V6924 -#define V6924 (V + 26568) - 0x1109, 0x1174, 0, -#undef V6925 -#define V6925 (V + 26571) - 0x1109, 0x1174, 0x11a8, 0, -#undef V6926 -#define V6926 (V + 26575) - 0x1109, 0x1174, 0x11a9, 0, -#undef V6927 -#define V6927 (V + 26579) - 0x1109, 0x1174, 0x11aa, 0, -#undef V6928 -#define V6928 (V + 26583) - 0x1109, 0x1174, 0x11ab, 0, -#undef V6929 -#define V6929 (V + 26587) - 0x1109, 0x1174, 0x11ac, 0, -#undef V6930 -#define V6930 (V + 26591) - 0x1109, 0x1174, 0x11ad, 0, -#undef V6931 -#define V6931 (V + 26595) - 0x1109, 0x1174, 0x11ae, 0, -#undef V6932 -#define V6932 (V + 26599) - 0x1109, 0x1174, 0x11af, 0, -#undef V6933 -#define V6933 (V + 26603) - 0x1109, 0x1174, 0x11b0, 0, -#undef V6934 -#define V6934 (V + 26607) - 0x1109, 0x1174, 0x11b1, 0, -#undef V6935 -#define V6935 (V + 26611) - 0x1109, 0x1174, 0x11b2, 0, -#undef V6936 -#define V6936 (V + 26615) - 0x1109, 0x1174, 0x11b3, 0, -#undef V6937 -#define V6937 (V + 26619) - 0x1109, 0x1174, 0x11b4, 0, -#undef V6938 -#define V6938 (V + 26623) - 0x1109, 0x1174, 0x11b5, 0, -#undef V6939 -#define V6939 (V + 26627) - 0x1109, 0x1174, 0x11b6, 0, -#undef V6940 -#define V6940 (V + 26631) - 0x1109, 0x1174, 0x11b7, 0, -#undef V6941 -#define V6941 (V + 26635) - 0x1109, 0x1174, 0x11b8, 0, -#undef V6942 -#define V6942 (V + 26639) - 0x1109, 0x1174, 0x11b9, 0, -#undef V6943 -#define V6943 (V + 26643) - 0x1109, 0x1174, 0x11ba, 0, -#undef V6944 -#define V6944 (V + 26647) - 0x1109, 0x1174, 0x11bb, 0, -#undef V6945 -#define V6945 (V + 26651) - 0x1109, 0x1174, 0x11bc, 0, -#undef V6946 -#define V6946 (V + 26655) - 0x1109, 0x1174, 0x11bd, 0, -#undef V6947 -#define V6947 (V + 26659) - 0x1109, 0x1174, 0x11be, 0, -#undef V6948 -#define V6948 (V + 26663) - 0x1109, 0x1174, 0x11bf, 0, -#undef V6949 -#define V6949 (V + 26667) - 0x1109, 0x1174, 0x11c0, 0, -#undef V6950 -#define V6950 (V + 26671) - 0x1109, 0x1174, 0x11c1, 0, -#undef V6951 -#define V6951 (V + 26675) - 0x1109, 0x1174, 0x11c2, 0, -#undef V6952 -#define V6952 (V + 26679) - 0x1109, 0x1175, 0, -#undef V6953 -#define V6953 (V + 26682) - 0x1109, 0x1175, 0x11a8, 0, -#undef V6954 -#define V6954 (V + 26686) - 0x1109, 0x1175, 0x11a9, 0, -#undef V6955 -#define V6955 (V + 26690) - 0x1109, 0x1175, 0x11aa, 0, -#undef V6956 -#define V6956 (V + 26694) - 0x1109, 0x1175, 0x11ab, 0, -#undef V6957 -#define V6957 (V + 26698) - 0x1109, 0x1175, 0x11ac, 0, -#undef V6958 -#define V6958 (V + 26702) - 0x1109, 0x1175, 0x11ad, 0, -#undef V6959 -#define V6959 (V + 26706) - 0x1109, 0x1175, 0x11ae, 0, -#undef V6960 -#define V6960 (V + 26710) - 0x1109, 0x1175, 0x11af, 0, -#undef V6961 -#define V6961 (V + 26714) - 0x1109, 0x1175, 0x11b0, 0, -#undef V6962 -#define V6962 (V + 26718) - 0x1109, 0x1175, 0x11b1, 0, -#undef V6963 -#define V6963 (V + 26722) - 0x1109, 0x1175, 0x11b2, 0, -#undef V6964 -#define V6964 (V + 26726) - 0x1109, 0x1175, 0x11b3, 0, -#undef V6965 -#define V6965 (V + 26730) - 0x1109, 0x1175, 0x11b4, 0, -#undef V6966 -#define V6966 (V + 26734) - 0x1109, 0x1175, 0x11b5, 0, -#undef V6967 -#define V6967 (V + 26738) - 0x1109, 0x1175, 0x11b6, 0, -#undef V6968 -#define V6968 (V + 26742) - 0x1109, 0x1175, 0x11b7, 0, -#undef V6969 -#define V6969 (V + 26746) - 0x1109, 0x1175, 0x11b8, 0, -#undef V6970 -#define V6970 (V + 26750) - 0x1109, 0x1175, 0x11b9, 0, -#undef V6971 -#define V6971 (V + 26754) - 0x1109, 0x1175, 0x11ba, 0, -#undef V6972 -#define V6972 (V + 26758) - 0x1109, 0x1175, 0x11bb, 0, -#undef V6973 -#define V6973 (V + 26762) - 0x1109, 0x1175, 0x11bc, 0, -#undef V6974 -#define V6974 (V + 26766) - 0x1109, 0x1175, 0x11bd, 0, -#undef V6975 -#define V6975 (V + 26770) - 0x1109, 0x1175, 0x11be, 0, -#undef V6976 -#define V6976 (V + 26774) - 0x1109, 0x1175, 0x11bf, 0, -#undef V6977 -#define V6977 (V + 26778) - 0x1109, 0x1175, 0x11c0, 0, -#undef V6978 -#define V6978 (V + 26782) - 0x1109, 0x1175, 0x11c1, 0, -#undef V6979 -#define V6979 (V + 26786) - 0x1109, 0x1175, 0x11c2, 0, -#undef V6980 -#define V6980 (V + 26790) - 0x110a, 0x1161, 0, -#undef V6981 -#define V6981 (V + 26793) - 0x110a, 0x1161, 0x11a8, 0, -#undef V6982 -#define V6982 (V + 26797) - 0x110a, 0x1161, 0x11a9, 0, -#undef V6983 -#define V6983 (V + 26801) - 0x110a, 0x1161, 0x11aa, 0, -#undef V6984 -#define V6984 (V + 26805) - 0x110a, 0x1161, 0x11ab, 0, -#undef V6985 -#define V6985 (V + 26809) - 0x110a, 0x1161, 0x11ac, 0, -#undef V6986 -#define V6986 (V + 26813) - 0x110a, 0x1161, 0x11ad, 0, -#undef V6987 -#define V6987 (V + 26817) - 0x110a, 0x1161, 0x11ae, 0, -#undef V6988 -#define V6988 (V + 26821) - 0x110a, 0x1161, 0x11af, 0, -#undef V6989 -#define V6989 (V + 26825) - 0x110a, 0x1161, 0x11b0, 0, -#undef V6990 -#define V6990 (V + 26829) - 0x110a, 0x1161, 0x11b1, 0, -#undef V6991 -#define V6991 (V + 26833) - 0x110a, 0x1161, 0x11b2, 0, -#undef V6992 -#define V6992 (V + 26837) - 0x110a, 0x1161, 0x11b3, 0, -#undef V6993 -#define V6993 (V + 26841) - 0x110a, 0x1161, 0x11b4, 0, -#undef V6994 -#define V6994 (V + 26845) - 0x110a, 0x1161, 0x11b5, 0, -#undef V6995 -#define V6995 (V + 26849) - 0x110a, 0x1161, 0x11b6, 0, -#undef V6996 -#define V6996 (V + 26853) - 0x110a, 0x1161, 0x11b7, 0, -#undef V6997 -#define V6997 (V + 26857) - 0x110a, 0x1161, 0x11b8, 0, -#undef V6998 -#define V6998 (V + 26861) - 0x110a, 0x1161, 0x11b9, 0, -#undef V6999 -#define V6999 (V + 26865) - 0x110a, 0x1161, 0x11ba, 0, -#undef V7000 -#define V7000 (V + 26869) - 0x110a, 0x1161, 0x11bb, 0, -#undef V7001 -#define V7001 (V + 26873) - 0x110a, 0x1161, 0x11bc, 0, -#undef V7002 -#define V7002 (V + 26877) - 0x110a, 0x1161, 0x11bd, 0, -#undef V7003 -#define V7003 (V + 26881) - 0x110a, 0x1161, 0x11be, 0, -#undef V7004 -#define V7004 (V + 26885) - 0x110a, 0x1161, 0x11bf, 0, -#undef V7005 -#define V7005 (V + 26889) - 0x110a, 0x1161, 0x11c0, 0, -#undef V7006 -#define V7006 (V + 26893) - 0x110a, 0x1161, 0x11c1, 0, -#undef V7007 -#define V7007 (V + 26897) - 0x110a, 0x1161, 0x11c2, 0, -#undef V7008 -#define V7008 (V + 26901) - 0x110a, 0x1162, 0, -#undef V7009 -#define V7009 (V + 26904) - 0x110a, 0x1162, 0x11a8, 0, -#undef V7010 -#define V7010 (V + 26908) - 0x110a, 0x1162, 0x11a9, 0, -#undef V7011 -#define V7011 (V + 26912) - 0x110a, 0x1162, 0x11aa, 0, -#undef V7012 -#define V7012 (V + 26916) - 0x110a, 0x1162, 0x11ab, 0, -#undef V7013 -#define V7013 (V + 26920) - 0x110a, 0x1162, 0x11ac, 0, -#undef V7014 -#define V7014 (V + 26924) - 0x110a, 0x1162, 0x11ad, 0, -#undef V7015 -#define V7015 (V + 26928) - 0x110a, 0x1162, 0x11ae, 0, -#undef V7016 -#define V7016 (V + 26932) - 0x110a, 0x1162, 0x11af, 0, -#undef V7017 -#define V7017 (V + 26936) - 0x110a, 0x1162, 0x11b0, 0, -#undef V7018 -#define V7018 (V + 26940) - 0x110a, 0x1162, 0x11b1, 0, -#undef V7019 -#define V7019 (V + 26944) - 0x110a, 0x1162, 0x11b2, 0, -#undef V7020 -#define V7020 (V + 26948) - 0x110a, 0x1162, 0x11b3, 0, -#undef V7021 -#define V7021 (V + 26952) - 0x110a, 0x1162, 0x11b4, 0, -#undef V7022 -#define V7022 (V + 26956) - 0x110a, 0x1162, 0x11b5, 0, -#undef V7023 -#define V7023 (V + 26960) - 0x110a, 0x1162, 0x11b6, 0, -#undef V7024 -#define V7024 (V + 26964) - 0x110a, 0x1162, 0x11b7, 0, -#undef V7025 -#define V7025 (V + 26968) - 0x110a, 0x1162, 0x11b8, 0, -#undef V7026 -#define V7026 (V + 26972) - 0x110a, 0x1162, 0x11b9, 0, -#undef V7027 -#define V7027 (V + 26976) - 0x110a, 0x1162, 0x11ba, 0, -#undef V7028 -#define V7028 (V + 26980) - 0x110a, 0x1162, 0x11bb, 0, -#undef V7029 -#define V7029 (V + 26984) - 0x110a, 0x1162, 0x11bc, 0, -#undef V7030 -#define V7030 (V + 26988) - 0x110a, 0x1162, 0x11bd, 0, -#undef V7031 -#define V7031 (V + 26992) - 0x110a, 0x1162, 0x11be, 0, -#undef V7032 -#define V7032 (V + 26996) - 0x110a, 0x1162, 0x11bf, 0, -#undef V7033 -#define V7033 (V + 27000) - 0x110a, 0x1162, 0x11c0, 0, -#undef V7034 -#define V7034 (V + 27004) - 0x110a, 0x1162, 0x11c1, 0, -#undef V7035 -#define V7035 (V + 27008) - 0x110a, 0x1162, 0x11c2, 0, -#undef V7036 -#define V7036 (V + 27012) - 0x110a, 0x1163, 0, -#undef V7037 -#define V7037 (V + 27015) - 0x110a, 0x1163, 0x11a8, 0, -#undef V7038 -#define V7038 (V + 27019) - 0x110a, 0x1163, 0x11a9, 0, -#undef V7039 -#define V7039 (V + 27023) - 0x110a, 0x1163, 0x11aa, 0, -#undef V7040 -#define V7040 (V + 27027) - 0x110a, 0x1163, 0x11ab, 0, -#undef V7041 -#define V7041 (V + 27031) - 0x110a, 0x1163, 0x11ac, 0, -#undef V7042 -#define V7042 (V + 27035) - 0x110a, 0x1163, 0x11ad, 0, -#undef V7043 -#define V7043 (V + 27039) - 0x110a, 0x1163, 0x11ae, 0, -#undef V7044 -#define V7044 (V + 27043) - 0x110a, 0x1163, 0x11af, 0, -#undef V7045 -#define V7045 (V + 27047) - 0x110a, 0x1163, 0x11b0, 0, -#undef V7046 -#define V7046 (V + 27051) - 0x110a, 0x1163, 0x11b1, 0, -#undef V7047 -#define V7047 (V + 27055) - 0x110a, 0x1163, 0x11b2, 0, -#undef V7048 -#define V7048 (V + 27059) - 0x110a, 0x1163, 0x11b3, 0, -#undef V7049 -#define V7049 (V + 27063) - 0x110a, 0x1163, 0x11b4, 0, -#undef V7050 -#define V7050 (V + 27067) - 0x110a, 0x1163, 0x11b5, 0, -#undef V7051 -#define V7051 (V + 27071) - 0x110a, 0x1163, 0x11b6, 0, -#undef V7052 -#define V7052 (V + 27075) - 0x110a, 0x1163, 0x11b7, 0, -#undef V7053 -#define V7053 (V + 27079) - 0x110a, 0x1163, 0x11b8, 0, -#undef V7054 -#define V7054 (V + 27083) - 0x110a, 0x1163, 0x11b9, 0, -#undef V7055 -#define V7055 (V + 27087) - 0x110a, 0x1163, 0x11ba, 0, -#undef V7056 -#define V7056 (V + 27091) - 0x110a, 0x1163, 0x11bb, 0, -#undef V7057 -#define V7057 (V + 27095) - 0x110a, 0x1163, 0x11bc, 0, -#undef V7058 -#define V7058 (V + 27099) - 0x110a, 0x1163, 0x11bd, 0, -#undef V7059 -#define V7059 (V + 27103) - 0x110a, 0x1163, 0x11be, 0, -#undef V7060 -#define V7060 (V + 27107) - 0x110a, 0x1163, 0x11bf, 0, -#undef V7061 -#define V7061 (V + 27111) - 0x110a, 0x1163, 0x11c0, 0, -#undef V7062 -#define V7062 (V + 27115) - 0x110a, 0x1163, 0x11c1, 0, -#undef V7063 -#define V7063 (V + 27119) - 0x110a, 0x1163, 0x11c2, 0, -#undef V7064 -#define V7064 (V + 27123) - 0x110a, 0x1164, 0, -#undef V7065 -#define V7065 (V + 27126) - 0x110a, 0x1164, 0x11a8, 0, -#undef V7066 -#define V7066 (V + 27130) - 0x110a, 0x1164, 0x11a9, 0, -#undef V7067 -#define V7067 (V + 27134) - 0x110a, 0x1164, 0x11aa, 0, -#undef V7068 -#define V7068 (V + 27138) - 0x110a, 0x1164, 0x11ab, 0, -#undef V7069 -#define V7069 (V + 27142) - 0x110a, 0x1164, 0x11ac, 0, -#undef V7070 -#define V7070 (V + 27146) - 0x110a, 0x1164, 0x11ad, 0, -#undef V7071 -#define V7071 (V + 27150) - 0x110a, 0x1164, 0x11ae, 0, -#undef V7072 -#define V7072 (V + 27154) - 0x110a, 0x1164, 0x11af, 0, -#undef V7073 -#define V7073 (V + 27158) - 0x110a, 0x1164, 0x11b0, 0, -#undef V7074 -#define V7074 (V + 27162) - 0x110a, 0x1164, 0x11b1, 0, -#undef V7075 -#define V7075 (V + 27166) - 0x110a, 0x1164, 0x11b2, 0, -#undef V7076 -#define V7076 (V + 27170) - 0x110a, 0x1164, 0x11b3, 0, -#undef V7077 -#define V7077 (V + 27174) - 0x110a, 0x1164, 0x11b4, 0, -#undef V7078 -#define V7078 (V + 27178) - 0x110a, 0x1164, 0x11b5, 0, -#undef V7079 -#define V7079 (V + 27182) - 0x110a, 0x1164, 0x11b6, 0, -#undef V7080 -#define V7080 (V + 27186) - 0x110a, 0x1164, 0x11b7, 0, -#undef V7081 -#define V7081 (V + 27190) - 0x110a, 0x1164, 0x11b8, 0, -#undef V7082 -#define V7082 (V + 27194) - 0x110a, 0x1164, 0x11b9, 0, -#undef V7083 -#define V7083 (V + 27198) - 0x110a, 0x1164, 0x11ba, 0, -#undef V7084 -#define V7084 (V + 27202) - 0x110a, 0x1164, 0x11bb, 0, -#undef V7085 -#define V7085 (V + 27206) - 0x110a, 0x1164, 0x11bc, 0, -#undef V7086 -#define V7086 (V + 27210) - 0x110a, 0x1164, 0x11bd, 0, -#undef V7087 -#define V7087 (V + 27214) - 0x110a, 0x1164, 0x11be, 0, -#undef V7088 -#define V7088 (V + 27218) - 0x110a, 0x1164, 0x11bf, 0, -#undef V7089 -#define V7089 (V + 27222) - 0x110a, 0x1164, 0x11c0, 0, -#undef V7090 -#define V7090 (V + 27226) - 0x110a, 0x1164, 0x11c1, 0, -#undef V7091 -#define V7091 (V + 27230) - 0x110a, 0x1164, 0x11c2, 0, -#undef V7092 -#define V7092 (V + 27234) - 0x110a, 0x1165, 0, -#undef V7093 -#define V7093 (V + 27237) - 0x110a, 0x1165, 0x11a8, 0, -#undef V7094 -#define V7094 (V + 27241) - 0x110a, 0x1165, 0x11a9, 0, -#undef V7095 -#define V7095 (V + 27245) - 0x110a, 0x1165, 0x11aa, 0, -#undef V7096 -#define V7096 (V + 27249) - 0x110a, 0x1165, 0x11ab, 0, -#undef V7097 -#define V7097 (V + 27253) - 0x110a, 0x1165, 0x11ac, 0, -#undef V7098 -#define V7098 (V + 27257) - 0x110a, 0x1165, 0x11ad, 0, -#undef V7099 -#define V7099 (V + 27261) - 0x110a, 0x1165, 0x11ae, 0, -#undef V7100 -#define V7100 (V + 27265) - 0x110a, 0x1165, 0x11af, 0, -#undef V7101 -#define V7101 (V + 27269) - 0x110a, 0x1165, 0x11b0, 0, -#undef V7102 -#define V7102 (V + 27273) - 0x110a, 0x1165, 0x11b1, 0, -#undef V7103 -#define V7103 (V + 27277) - 0x110a, 0x1165, 0x11b2, 0, -#undef V7104 -#define V7104 (V + 27281) - 0x110a, 0x1165, 0x11b3, 0, -#undef V7105 -#define V7105 (V + 27285) - 0x110a, 0x1165, 0x11b4, 0, -#undef V7106 -#define V7106 (V + 27289) - 0x110a, 0x1165, 0x11b5, 0, -#undef V7107 -#define V7107 (V + 27293) - 0x110a, 0x1165, 0x11b6, 0, -#undef V7108 -#define V7108 (V + 27297) - 0x110a, 0x1165, 0x11b7, 0, -#undef V7109 -#define V7109 (V + 27301) - 0x110a, 0x1165, 0x11b8, 0, -#undef V7110 -#define V7110 (V + 27305) - 0x110a, 0x1165, 0x11b9, 0, -#undef V7111 -#define V7111 (V + 27309) - 0x110a, 0x1165, 0x11ba, 0, -#undef V7112 -#define V7112 (V + 27313) - 0x110a, 0x1165, 0x11bb, 0, -#undef V7113 -#define V7113 (V + 27317) - 0x110a, 0x1165, 0x11bc, 0, -#undef V7114 -#define V7114 (V + 27321) - 0x110a, 0x1165, 0x11bd, 0, -#undef V7115 -#define V7115 (V + 27325) - 0x110a, 0x1165, 0x11be, 0, -#undef V7116 -#define V7116 (V + 27329) - 0x110a, 0x1165, 0x11bf, 0, -#undef V7117 -#define V7117 (V + 27333) - 0x110a, 0x1165, 0x11c0, 0, -#undef V7118 -#define V7118 (V + 27337) - 0x110a, 0x1165, 0x11c1, 0, -#undef V7119 -#define V7119 (V + 27341) - 0x110a, 0x1165, 0x11c2, 0, -#undef V7120 -#define V7120 (V + 27345) - 0x110a, 0x1166, 0, -#undef V7121 -#define V7121 (V + 27348) - 0x110a, 0x1166, 0x11a8, 0, -#undef V7122 -#define V7122 (V + 27352) - 0x110a, 0x1166, 0x11a9, 0, -#undef V7123 -#define V7123 (V + 27356) - 0x110a, 0x1166, 0x11aa, 0, -#undef V7124 -#define V7124 (V + 27360) - 0x110a, 0x1166, 0x11ab, 0, -#undef V7125 -#define V7125 (V + 27364) - 0x110a, 0x1166, 0x11ac, 0, -#undef V7126 -#define V7126 (V + 27368) - 0x110a, 0x1166, 0x11ad, 0, -#undef V7127 -#define V7127 (V + 27372) - 0x110a, 0x1166, 0x11ae, 0, -#undef V7128 -#define V7128 (V + 27376) - 0x110a, 0x1166, 0x11af, 0, -#undef V7129 -#define V7129 (V + 27380) - 0x110a, 0x1166, 0x11b0, 0, -#undef V7130 -#define V7130 (V + 27384) - 0x110a, 0x1166, 0x11b1, 0, -#undef V7131 -#define V7131 (V + 27388) - 0x110a, 0x1166, 0x11b2, 0, -#undef V7132 -#define V7132 (V + 27392) - 0x110a, 0x1166, 0x11b3, 0, -#undef V7133 -#define V7133 (V + 27396) - 0x110a, 0x1166, 0x11b4, 0, -#undef V7134 -#define V7134 (V + 27400) - 0x110a, 0x1166, 0x11b5, 0, -#undef V7135 -#define V7135 (V + 27404) - 0x110a, 0x1166, 0x11b6, 0, -#undef V7136 -#define V7136 (V + 27408) - 0x110a, 0x1166, 0x11b7, 0, -#undef V7137 -#define V7137 (V + 27412) - 0x110a, 0x1166, 0x11b8, 0, -#undef V7138 -#define V7138 (V + 27416) - 0x110a, 0x1166, 0x11b9, 0, -#undef V7139 -#define V7139 (V + 27420) - 0x110a, 0x1166, 0x11ba, 0, -#undef V7140 -#define V7140 (V + 27424) - 0x110a, 0x1166, 0x11bb, 0, -#undef V7141 -#define V7141 (V + 27428) - 0x110a, 0x1166, 0x11bc, 0, -#undef V7142 -#define V7142 (V + 27432) - 0x110a, 0x1166, 0x11bd, 0, -#undef V7143 -#define V7143 (V + 27436) - 0x110a, 0x1166, 0x11be, 0, -#undef V7144 -#define V7144 (V + 27440) - 0x110a, 0x1166, 0x11bf, 0, -#undef V7145 -#define V7145 (V + 27444) - 0x110a, 0x1166, 0x11c0, 0, -#undef V7146 -#define V7146 (V + 27448) - 0x110a, 0x1166, 0x11c1, 0, -#undef V7147 -#define V7147 (V + 27452) - 0x110a, 0x1166, 0x11c2, 0, -#undef V7148 -#define V7148 (V + 27456) - 0x110a, 0x1167, 0, -#undef V7149 -#define V7149 (V + 27459) - 0x110a, 0x1167, 0x11a8, 0, -#undef V7150 -#define V7150 (V + 27463) - 0x110a, 0x1167, 0x11a9, 0, -#undef V7151 -#define V7151 (V + 27467) - 0x110a, 0x1167, 0x11aa, 0, -#undef V7152 -#define V7152 (V + 27471) - 0x110a, 0x1167, 0x11ab, 0, -#undef V7153 -#define V7153 (V + 27475) - 0x110a, 0x1167, 0x11ac, 0, -#undef V7154 -#define V7154 (V + 27479) - 0x110a, 0x1167, 0x11ad, 0, -#undef V7155 -#define V7155 (V + 27483) - 0x110a, 0x1167, 0x11ae, 0, -#undef V7156 -#define V7156 (V + 27487) - 0x110a, 0x1167, 0x11af, 0, -#undef V7157 -#define V7157 (V + 27491) - 0x110a, 0x1167, 0x11b0, 0, -#undef V7158 -#define V7158 (V + 27495) - 0x110a, 0x1167, 0x11b1, 0, -#undef V7159 -#define V7159 (V + 27499) - 0x110a, 0x1167, 0x11b2, 0, -#undef V7160 -#define V7160 (V + 27503) - 0x110a, 0x1167, 0x11b3, 0, -#undef V7161 -#define V7161 (V + 27507) - 0x110a, 0x1167, 0x11b4, 0, -#undef V7162 -#define V7162 (V + 27511) - 0x110a, 0x1167, 0x11b5, 0, -#undef V7163 -#define V7163 (V + 27515) - 0x110a, 0x1167, 0x11b6, 0, -#undef V7164 -#define V7164 (V + 27519) - 0x110a, 0x1167, 0x11b7, 0, -#undef V7165 -#define V7165 (V + 27523) - 0x110a, 0x1167, 0x11b8, 0, -#undef V7166 -#define V7166 (V + 27527) - 0x110a, 0x1167, 0x11b9, 0, -#undef V7167 -#define V7167 (V + 27531) - 0x110a, 0x1167, 0x11ba, 0, -#undef V7168 -#define V7168 (V + 27535) - 0x110a, 0x1167, 0x11bb, 0, -#undef V7169 -#define V7169 (V + 27539) - 0x110a, 0x1167, 0x11bc, 0, -#undef V7170 -#define V7170 (V + 27543) - 0x110a, 0x1167, 0x11bd, 0, -#undef V7171 -#define V7171 (V + 27547) - 0x110a, 0x1167, 0x11be, 0, -#undef V7172 -#define V7172 (V + 27551) - 0x110a, 0x1167, 0x11bf, 0, -#undef V7173 -#define V7173 (V + 27555) - 0x110a, 0x1167, 0x11c0, 0, -#undef V7174 -#define V7174 (V + 27559) - 0x110a, 0x1167, 0x11c1, 0, -#undef V7175 -#define V7175 (V + 27563) - 0x110a, 0x1167, 0x11c2, 0, -#undef V7176 -#define V7176 (V + 27567) - 0x110a, 0x1168, 0, -#undef V7177 -#define V7177 (V + 27570) - 0x110a, 0x1168, 0x11a8, 0, -#undef V7178 -#define V7178 (V + 27574) - 0x110a, 0x1168, 0x11a9, 0, -#undef V7179 -#define V7179 (V + 27578) - 0x110a, 0x1168, 0x11aa, 0, -#undef V7180 -#define V7180 (V + 27582) - 0x110a, 0x1168, 0x11ab, 0, -#undef V7181 -#define V7181 (V + 27586) - 0x110a, 0x1168, 0x11ac, 0, -#undef V7182 -#define V7182 (V + 27590) - 0x110a, 0x1168, 0x11ad, 0, -#undef V7183 -#define V7183 (V + 27594) - 0x110a, 0x1168, 0x11ae, 0, -#undef V7184 -#define V7184 (V + 27598) - 0x110a, 0x1168, 0x11af, 0, -#undef V7185 -#define V7185 (V + 27602) - 0x110a, 0x1168, 0x11b0, 0, -#undef V7186 -#define V7186 (V + 27606) - 0x110a, 0x1168, 0x11b1, 0, -#undef V7187 -#define V7187 (V + 27610) - 0x110a, 0x1168, 0x11b2, 0, -#undef V7188 -#define V7188 (V + 27614) - 0x110a, 0x1168, 0x11b3, 0, -#undef V7189 -#define V7189 (V + 27618) - 0x110a, 0x1168, 0x11b4, 0, -#undef V7190 -#define V7190 (V + 27622) - 0x110a, 0x1168, 0x11b5, 0, -#undef V7191 -#define V7191 (V + 27626) - 0x110a, 0x1168, 0x11b6, 0, -#undef V7192 -#define V7192 (V + 27630) - 0x110a, 0x1168, 0x11b7, 0, -#undef V7193 -#define V7193 (V + 27634) - 0x110a, 0x1168, 0x11b8, 0, -#undef V7194 -#define V7194 (V + 27638) - 0x110a, 0x1168, 0x11b9, 0, -#undef V7195 -#define V7195 (V + 27642) - 0x110a, 0x1168, 0x11ba, 0, -#undef V7196 -#define V7196 (V + 27646) - 0x110a, 0x1168, 0x11bb, 0, -#undef V7197 -#define V7197 (V + 27650) - 0x110a, 0x1168, 0x11bc, 0, -#undef V7198 -#define V7198 (V + 27654) - 0x110a, 0x1168, 0x11bd, 0, -#undef V7199 -#define V7199 (V + 27658) - 0x110a, 0x1168, 0x11be, 0, -#undef V7200 -#define V7200 (V + 27662) - 0x110a, 0x1168, 0x11bf, 0, -#undef V7201 -#define V7201 (V + 27666) - 0x110a, 0x1168, 0x11c0, 0, -#undef V7202 -#define V7202 (V + 27670) - 0x110a, 0x1168, 0x11c1, 0, -#undef V7203 -#define V7203 (V + 27674) - 0x110a, 0x1168, 0x11c2, 0, -#undef V7204 -#define V7204 (V + 27678) - 0x110a, 0x1169, 0, -#undef V7205 -#define V7205 (V + 27681) - 0x110a, 0x1169, 0x11a8, 0, -#undef V7206 -#define V7206 (V + 27685) - 0x110a, 0x1169, 0x11a9, 0, -#undef V7207 -#define V7207 (V + 27689) - 0x110a, 0x1169, 0x11aa, 0, -#undef V7208 -#define V7208 (V + 27693) - 0x110a, 0x1169, 0x11ab, 0, -#undef V7209 -#define V7209 (V + 27697) - 0x110a, 0x1169, 0x11ac, 0, -#undef V7210 -#define V7210 (V + 27701) - 0x110a, 0x1169, 0x11ad, 0, -#undef V7211 -#define V7211 (V + 27705) - 0x110a, 0x1169, 0x11ae, 0, -#undef V7212 -#define V7212 (V + 27709) - 0x110a, 0x1169, 0x11af, 0, -#undef V7213 -#define V7213 (V + 27713) - 0x110a, 0x1169, 0x11b0, 0, -#undef V7214 -#define V7214 (V + 27717) - 0x110a, 0x1169, 0x11b1, 0, -#undef V7215 -#define V7215 (V + 27721) - 0x110a, 0x1169, 0x11b2, 0, -#undef V7216 -#define V7216 (V + 27725) - 0x110a, 0x1169, 0x11b3, 0, -#undef V7217 -#define V7217 (V + 27729) - 0x110a, 0x1169, 0x11b4, 0, -#undef V7218 -#define V7218 (V + 27733) - 0x110a, 0x1169, 0x11b5, 0, -#undef V7219 -#define V7219 (V + 27737) - 0x110a, 0x1169, 0x11b6, 0, -#undef V7220 -#define V7220 (V + 27741) - 0x110a, 0x1169, 0x11b7, 0, -#undef V7221 -#define V7221 (V + 27745) - 0x110a, 0x1169, 0x11b8, 0, -#undef V7222 -#define V7222 (V + 27749) - 0x110a, 0x1169, 0x11b9, 0, -#undef V7223 -#define V7223 (V + 27753) - 0x110a, 0x1169, 0x11ba, 0, -#undef V7224 -#define V7224 (V + 27757) - 0x110a, 0x1169, 0x11bb, 0, -#undef V7225 -#define V7225 (V + 27761) - 0x110a, 0x1169, 0x11bc, 0, -#undef V7226 -#define V7226 (V + 27765) - 0x110a, 0x1169, 0x11bd, 0, -#undef V7227 -#define V7227 (V + 27769) - 0x110a, 0x1169, 0x11be, 0, -#undef V7228 -#define V7228 (V + 27773) - 0x110a, 0x1169, 0x11bf, 0, -#undef V7229 -#define V7229 (V + 27777) - 0x110a, 0x1169, 0x11c0, 0, -#undef V7230 -#define V7230 (V + 27781) - 0x110a, 0x1169, 0x11c1, 0, -#undef V7231 -#define V7231 (V + 27785) - 0x110a, 0x1169, 0x11c2, 0, -#undef V7232 -#define V7232 (V + 27789) - 0x110a, 0x116a, 0, -#undef V7233 -#define V7233 (V + 27792) - 0x110a, 0x116a, 0x11a8, 0, -#undef V7234 -#define V7234 (V + 27796) - 0x110a, 0x116a, 0x11a9, 0, -#undef V7235 -#define V7235 (V + 27800) - 0x110a, 0x116a, 0x11aa, 0, -#undef V7236 -#define V7236 (V + 27804) - 0x110a, 0x116a, 0x11ab, 0, -#undef V7237 -#define V7237 (V + 27808) - 0x110a, 0x116a, 0x11ac, 0, -#undef V7238 -#define V7238 (V + 27812) - 0x110a, 0x116a, 0x11ad, 0, -#undef V7239 -#define V7239 (V + 27816) - 0x110a, 0x116a, 0x11ae, 0, -#undef V7240 -#define V7240 (V + 27820) - 0x110a, 0x116a, 0x11af, 0, -#undef V7241 -#define V7241 (V + 27824) - 0x110a, 0x116a, 0x11b0, 0, -#undef V7242 -#define V7242 (V + 27828) - 0x110a, 0x116a, 0x11b1, 0, -#undef V7243 -#define V7243 (V + 27832) - 0x110a, 0x116a, 0x11b2, 0, -#undef V7244 -#define V7244 (V + 27836) - 0x110a, 0x116a, 0x11b3, 0, -#undef V7245 -#define V7245 (V + 27840) - 0x110a, 0x116a, 0x11b4, 0, -#undef V7246 -#define V7246 (V + 27844) - 0x110a, 0x116a, 0x11b5, 0, -#undef V7247 -#define V7247 (V + 27848) - 0x110a, 0x116a, 0x11b6, 0, -#undef V7248 -#define V7248 (V + 27852) - 0x110a, 0x116a, 0x11b7, 0, -#undef V7249 -#define V7249 (V + 27856) - 0x110a, 0x116a, 0x11b8, 0, -#undef V7250 -#define V7250 (V + 27860) - 0x110a, 0x116a, 0x11b9, 0, -#undef V7251 -#define V7251 (V + 27864) - 0x110a, 0x116a, 0x11ba, 0, -#undef V7252 -#define V7252 (V + 27868) - 0x110a, 0x116a, 0x11bb, 0, -#undef V7253 -#define V7253 (V + 27872) - 0x110a, 0x116a, 0x11bc, 0, -#undef V7254 -#define V7254 (V + 27876) - 0x110a, 0x116a, 0x11bd, 0, -#undef V7255 -#define V7255 (V + 27880) - 0x110a, 0x116a, 0x11be, 0, -#undef V7256 -#define V7256 (V + 27884) - 0x110a, 0x116a, 0x11bf, 0, -#undef V7257 -#define V7257 (V + 27888) - 0x110a, 0x116a, 0x11c0, 0, -#undef V7258 -#define V7258 (V + 27892) - 0x110a, 0x116a, 0x11c1, 0, -#undef V7259 -#define V7259 (V + 27896) - 0x110a, 0x116a, 0x11c2, 0, -#undef V7260 -#define V7260 (V + 27900) - 0x110a, 0x116b, 0, -#undef V7261 -#define V7261 (V + 27903) - 0x110a, 0x116b, 0x11a8, 0, -#undef V7262 -#define V7262 (V + 27907) - 0x110a, 0x116b, 0x11a9, 0, -#undef V7263 -#define V7263 (V + 27911) - 0x110a, 0x116b, 0x11aa, 0, -#undef V7264 -#define V7264 (V + 27915) - 0x110a, 0x116b, 0x11ab, 0, -#undef V7265 -#define V7265 (V + 27919) - 0x110a, 0x116b, 0x11ac, 0, -#undef V7266 -#define V7266 (V + 27923) - 0x110a, 0x116b, 0x11ad, 0, -#undef V7267 -#define V7267 (V + 27927) - 0x110a, 0x116b, 0x11ae, 0, -#undef V7268 -#define V7268 (V + 27931) - 0x110a, 0x116b, 0x11af, 0, -#undef V7269 -#define V7269 (V + 27935) - 0x110a, 0x116b, 0x11b0, 0, -#undef V7270 -#define V7270 (V + 27939) - 0x110a, 0x116b, 0x11b1, 0, -#undef V7271 -#define V7271 (V + 27943) - 0x110a, 0x116b, 0x11b2, 0, -#undef V7272 -#define V7272 (V + 27947) - 0x110a, 0x116b, 0x11b3, 0, -#undef V7273 -#define V7273 (V + 27951) - 0x110a, 0x116b, 0x11b4, 0, -#undef V7274 -#define V7274 (V + 27955) - 0x110a, 0x116b, 0x11b5, 0, -#undef V7275 -#define V7275 (V + 27959) - 0x110a, 0x116b, 0x11b6, 0, -#undef V7276 -#define V7276 (V + 27963) - 0x110a, 0x116b, 0x11b7, 0, -#undef V7277 -#define V7277 (V + 27967) - 0x110a, 0x116b, 0x11b8, 0, -#undef V7278 -#define V7278 (V + 27971) - 0x110a, 0x116b, 0x11b9, 0, -#undef V7279 -#define V7279 (V + 27975) - 0x110a, 0x116b, 0x11ba, 0, -#undef V7280 -#define V7280 (V + 27979) - 0x110a, 0x116b, 0x11bb, 0, -#undef V7281 -#define V7281 (V + 27983) - 0x110a, 0x116b, 0x11bc, 0, -#undef V7282 -#define V7282 (V + 27987) - 0x110a, 0x116b, 0x11bd, 0, -#undef V7283 -#define V7283 (V + 27991) - 0x110a, 0x116b, 0x11be, 0, -#undef V7284 -#define V7284 (V + 27995) - 0x110a, 0x116b, 0x11bf, 0, -#undef V7285 -#define V7285 (V + 27999) - 0x110a, 0x116b, 0x11c0, 0, -#undef V7286 -#define V7286 (V + 28003) - 0x110a, 0x116b, 0x11c1, 0, -#undef V7287 -#define V7287 (V + 28007) - 0x110a, 0x116b, 0x11c2, 0, -#undef V7288 -#define V7288 (V + 28011) - 0x110a, 0x116c, 0, -#undef V7289 -#define V7289 (V + 28014) - 0x110a, 0x116c, 0x11a8, 0, -#undef V7290 -#define V7290 (V + 28018) - 0x110a, 0x116c, 0x11a9, 0, -#undef V7291 -#define V7291 (V + 28022) - 0x110a, 0x116c, 0x11aa, 0, -#undef V7292 -#define V7292 (V + 28026) - 0x110a, 0x116c, 0x11ab, 0, -#undef V7293 -#define V7293 (V + 28030) - 0x110a, 0x116c, 0x11ac, 0, -#undef V7294 -#define V7294 (V + 28034) - 0x110a, 0x116c, 0x11ad, 0, -#undef V7295 -#define V7295 (V + 28038) - 0x110a, 0x116c, 0x11ae, 0, -#undef V7296 -#define V7296 (V + 28042) - 0x110a, 0x116c, 0x11af, 0, -#undef V7297 -#define V7297 (V + 28046) - 0x110a, 0x116c, 0x11b0, 0, -#undef V7298 -#define V7298 (V + 28050) - 0x110a, 0x116c, 0x11b1, 0, -#undef V7299 -#define V7299 (V + 28054) - 0x110a, 0x116c, 0x11b2, 0, -#undef V7300 -#define V7300 (V + 28058) - 0x110a, 0x116c, 0x11b3, 0, -#undef V7301 -#define V7301 (V + 28062) - 0x110a, 0x116c, 0x11b4, 0, -#undef V7302 -#define V7302 (V + 28066) - 0x110a, 0x116c, 0x11b5, 0, -#undef V7303 -#define V7303 (V + 28070) - 0x110a, 0x116c, 0x11b6, 0, -#undef V7304 -#define V7304 (V + 28074) - 0x110a, 0x116c, 0x11b7, 0, -#undef V7305 -#define V7305 (V + 28078) - 0x110a, 0x116c, 0x11b8, 0, -#undef V7306 -#define V7306 (V + 28082) - 0x110a, 0x116c, 0x11b9, 0, -#undef V7307 -#define V7307 (V + 28086) - 0x110a, 0x116c, 0x11ba, 0, -#undef V7308 -#define V7308 (V + 28090) - 0x110a, 0x116c, 0x11bb, 0, -#undef V7309 -#define V7309 (V + 28094) - 0x110a, 0x116c, 0x11bc, 0, -#undef V7310 -#define V7310 (V + 28098) - 0x110a, 0x116c, 0x11bd, 0, -#undef V7311 -#define V7311 (V + 28102) - 0x110a, 0x116c, 0x11be, 0, -#undef V7312 -#define V7312 (V + 28106) - 0x110a, 0x116c, 0x11bf, 0, -#undef V7313 -#define V7313 (V + 28110) - 0x110a, 0x116c, 0x11c0, 0, -#undef V7314 -#define V7314 (V + 28114) - 0x110a, 0x116c, 0x11c1, 0, -#undef V7315 -#define V7315 (V + 28118) - 0x110a, 0x116c, 0x11c2, 0, -#undef V7316 -#define V7316 (V + 28122) - 0x110a, 0x116d, 0, -#undef V7317 -#define V7317 (V + 28125) - 0x110a, 0x116d, 0x11a8, 0, -#undef V7318 -#define V7318 (V + 28129) - 0x110a, 0x116d, 0x11a9, 0, -#undef V7319 -#define V7319 (V + 28133) - 0x110a, 0x116d, 0x11aa, 0, -#undef V7320 -#define V7320 (V + 28137) - 0x110a, 0x116d, 0x11ab, 0, -#undef V7321 -#define V7321 (V + 28141) - 0x110a, 0x116d, 0x11ac, 0, -#undef V7322 -#define V7322 (V + 28145) - 0x110a, 0x116d, 0x11ad, 0, -#undef V7323 -#define V7323 (V + 28149) - 0x110a, 0x116d, 0x11ae, 0, -#undef V7324 -#define V7324 (V + 28153) - 0x110a, 0x116d, 0x11af, 0, -#undef V7325 -#define V7325 (V + 28157) - 0x110a, 0x116d, 0x11b0, 0, -#undef V7326 -#define V7326 (V + 28161) - 0x110a, 0x116d, 0x11b1, 0, -#undef V7327 -#define V7327 (V + 28165) - 0x110a, 0x116d, 0x11b2, 0, -#undef V7328 -#define V7328 (V + 28169) - 0x110a, 0x116d, 0x11b3, 0, -#undef V7329 -#define V7329 (V + 28173) - 0x110a, 0x116d, 0x11b4, 0, -#undef V7330 -#define V7330 (V + 28177) - 0x110a, 0x116d, 0x11b5, 0, -#undef V7331 -#define V7331 (V + 28181) - 0x110a, 0x116d, 0x11b6, 0, -#undef V7332 -#define V7332 (V + 28185) - 0x110a, 0x116d, 0x11b7, 0, -#undef V7333 -#define V7333 (V + 28189) - 0x110a, 0x116d, 0x11b8, 0, -#undef V7334 -#define V7334 (V + 28193) - 0x110a, 0x116d, 0x11b9, 0, -#undef V7335 -#define V7335 (V + 28197) - 0x110a, 0x116d, 0x11ba, 0, -#undef V7336 -#define V7336 (V + 28201) - 0x110a, 0x116d, 0x11bb, 0, -#undef V7337 -#define V7337 (V + 28205) - 0x110a, 0x116d, 0x11bc, 0, -#undef V7338 -#define V7338 (V + 28209) - 0x110a, 0x116d, 0x11bd, 0, -#undef V7339 -#define V7339 (V + 28213) - 0x110a, 0x116d, 0x11be, 0, -#undef V7340 -#define V7340 (V + 28217) - 0x110a, 0x116d, 0x11bf, 0, -#undef V7341 -#define V7341 (V + 28221) - 0x110a, 0x116d, 0x11c0, 0, -#undef V7342 -#define V7342 (V + 28225) - 0x110a, 0x116d, 0x11c1, 0, -#undef V7343 -#define V7343 (V + 28229) - 0x110a, 0x116d, 0x11c2, 0, -#undef V7344 -#define V7344 (V + 28233) - 0x110a, 0x116e, 0, -#undef V7345 -#define V7345 (V + 28236) - 0x110a, 0x116e, 0x11a8, 0, -#undef V7346 -#define V7346 (V + 28240) - 0x110a, 0x116e, 0x11a9, 0, -#undef V7347 -#define V7347 (V + 28244) - 0x110a, 0x116e, 0x11aa, 0, -#undef V7348 -#define V7348 (V + 28248) - 0x110a, 0x116e, 0x11ab, 0, -#undef V7349 -#define V7349 (V + 28252) - 0x110a, 0x116e, 0x11ac, 0, -#undef V7350 -#define V7350 (V + 28256) - 0x110a, 0x116e, 0x11ad, 0, -#undef V7351 -#define V7351 (V + 28260) - 0x110a, 0x116e, 0x11ae, 0, -#undef V7352 -#define V7352 (V + 28264) - 0x110a, 0x116e, 0x11af, 0, -#undef V7353 -#define V7353 (V + 28268) - 0x110a, 0x116e, 0x11b0, 0, -#undef V7354 -#define V7354 (V + 28272) - 0x110a, 0x116e, 0x11b1, 0, -#undef V7355 -#define V7355 (V + 28276) - 0x110a, 0x116e, 0x11b2, 0, -#undef V7356 -#define V7356 (V + 28280) - 0x110a, 0x116e, 0x11b3, 0, -#undef V7357 -#define V7357 (V + 28284) - 0x110a, 0x116e, 0x11b4, 0, -#undef V7358 -#define V7358 (V + 28288) - 0x110a, 0x116e, 0x11b5, 0, -#undef V7359 -#define V7359 (V + 28292) - 0x110a, 0x116e, 0x11b6, 0, -#undef V7360 -#define V7360 (V + 28296) - 0x110a, 0x116e, 0x11b7, 0, -#undef V7361 -#define V7361 (V + 28300) - 0x110a, 0x116e, 0x11b8, 0, -#undef V7362 -#define V7362 (V + 28304) - 0x110a, 0x116e, 0x11b9, 0, -#undef V7363 -#define V7363 (V + 28308) - 0x110a, 0x116e, 0x11ba, 0, -#undef V7364 -#define V7364 (V + 28312) - 0x110a, 0x116e, 0x11bb, 0, -#undef V7365 -#define V7365 (V + 28316) - 0x110a, 0x116e, 0x11bc, 0, -#undef V7366 -#define V7366 (V + 28320) - 0x110a, 0x116e, 0x11bd, 0, -#undef V7367 -#define V7367 (V + 28324) - 0x110a, 0x116e, 0x11be, 0, -#undef V7368 -#define V7368 (V + 28328) - 0x110a, 0x116e, 0x11bf, 0, -#undef V7369 -#define V7369 (V + 28332) - 0x110a, 0x116e, 0x11c0, 0, -#undef V7370 -#define V7370 (V + 28336) - 0x110a, 0x116e, 0x11c1, 0, -#undef V7371 -#define V7371 (V + 28340) - 0x110a, 0x116e, 0x11c2, 0, -#undef V7372 -#define V7372 (V + 28344) - 0x110a, 0x116f, 0, -#undef V7373 -#define V7373 (V + 28347) - 0x110a, 0x116f, 0x11a8, 0, -#undef V7374 -#define V7374 (V + 28351) - 0x110a, 0x116f, 0x11a9, 0, -#undef V7375 -#define V7375 (V + 28355) - 0x110a, 0x116f, 0x11aa, 0, -#undef V7376 -#define V7376 (V + 28359) - 0x110a, 0x116f, 0x11ab, 0, -#undef V7377 -#define V7377 (V + 28363) - 0x110a, 0x116f, 0x11ac, 0, -#undef V7378 -#define V7378 (V + 28367) - 0x110a, 0x116f, 0x11ad, 0, -#undef V7379 -#define V7379 (V + 28371) - 0x110a, 0x116f, 0x11ae, 0, -#undef V7380 -#define V7380 (V + 28375) - 0x110a, 0x116f, 0x11af, 0, -#undef V7381 -#define V7381 (V + 28379) - 0x110a, 0x116f, 0x11b0, 0, -#undef V7382 -#define V7382 (V + 28383) - 0x110a, 0x116f, 0x11b1, 0, -#undef V7383 -#define V7383 (V + 28387) - 0x110a, 0x116f, 0x11b2, 0, -#undef V7384 -#define V7384 (V + 28391) - 0x110a, 0x116f, 0x11b3, 0, -#undef V7385 -#define V7385 (V + 28395) - 0x110a, 0x116f, 0x11b4, 0, -#undef V7386 -#define V7386 (V + 28399) - 0x110a, 0x116f, 0x11b5, 0, -#undef V7387 -#define V7387 (V + 28403) - 0x110a, 0x116f, 0x11b6, 0, -#undef V7388 -#define V7388 (V + 28407) - 0x110a, 0x116f, 0x11b7, 0, -#undef V7389 -#define V7389 (V + 28411) - 0x110a, 0x116f, 0x11b8, 0, -#undef V7390 -#define V7390 (V + 28415) - 0x110a, 0x116f, 0x11b9, 0, -#undef V7391 -#define V7391 (V + 28419) - 0x110a, 0x116f, 0x11ba, 0, -#undef V7392 -#define V7392 (V + 28423) - 0x110a, 0x116f, 0x11bb, 0, -#undef V7393 -#define V7393 (V + 28427) - 0x110a, 0x116f, 0x11bc, 0, -#undef V7394 -#define V7394 (V + 28431) - 0x110a, 0x116f, 0x11bd, 0, -#undef V7395 -#define V7395 (V + 28435) - 0x110a, 0x116f, 0x11be, 0, -#undef V7396 -#define V7396 (V + 28439) - 0x110a, 0x116f, 0x11bf, 0, -#undef V7397 -#define V7397 (V + 28443) - 0x110a, 0x116f, 0x11c0, 0, -#undef V7398 -#define V7398 (V + 28447) - 0x110a, 0x116f, 0x11c1, 0, -#undef V7399 -#define V7399 (V + 28451) - 0x110a, 0x116f, 0x11c2, 0, -#undef V7400 -#define V7400 (V + 28455) - 0x110a, 0x1170, 0, -#undef V7401 -#define V7401 (V + 28458) - 0x110a, 0x1170, 0x11a8, 0, -#undef V7402 -#define V7402 (V + 28462) - 0x110a, 0x1170, 0x11a9, 0, -#undef V7403 -#define V7403 (V + 28466) - 0x110a, 0x1170, 0x11aa, 0, -#undef V7404 -#define V7404 (V + 28470) - 0x110a, 0x1170, 0x11ab, 0, -#undef V7405 -#define V7405 (V + 28474) - 0x110a, 0x1170, 0x11ac, 0, -#undef V7406 -#define V7406 (V + 28478) - 0x110a, 0x1170, 0x11ad, 0, -#undef V7407 -#define V7407 (V + 28482) - 0x110a, 0x1170, 0x11ae, 0, -#undef V7408 -#define V7408 (V + 28486) - 0x110a, 0x1170, 0x11af, 0, -#undef V7409 -#define V7409 (V + 28490) - 0x110a, 0x1170, 0x11b0, 0, -#undef V7410 -#define V7410 (V + 28494) - 0x110a, 0x1170, 0x11b1, 0, -#undef V7411 -#define V7411 (V + 28498) - 0x110a, 0x1170, 0x11b2, 0, -#undef V7412 -#define V7412 (V + 28502) - 0x110a, 0x1170, 0x11b3, 0, -#undef V7413 -#define V7413 (V + 28506) - 0x110a, 0x1170, 0x11b4, 0, -#undef V7414 -#define V7414 (V + 28510) - 0x110a, 0x1170, 0x11b5, 0, -#undef V7415 -#define V7415 (V + 28514) - 0x110a, 0x1170, 0x11b6, 0, -#undef V7416 -#define V7416 (V + 28518) - 0x110a, 0x1170, 0x11b7, 0, -#undef V7417 -#define V7417 (V + 28522) - 0x110a, 0x1170, 0x11b8, 0, -#undef V7418 -#define V7418 (V + 28526) - 0x110a, 0x1170, 0x11b9, 0, -#undef V7419 -#define V7419 (V + 28530) - 0x110a, 0x1170, 0x11ba, 0, -#undef V7420 -#define V7420 (V + 28534) - 0x110a, 0x1170, 0x11bb, 0, -#undef V7421 -#define V7421 (V + 28538) - 0x110a, 0x1170, 0x11bc, 0, -#undef V7422 -#define V7422 (V + 28542) - 0x110a, 0x1170, 0x11bd, 0, -#undef V7423 -#define V7423 (V + 28546) - 0x110a, 0x1170, 0x11be, 0, -#undef V7424 -#define V7424 (V + 28550) - 0x110a, 0x1170, 0x11bf, 0, -#undef V7425 -#define V7425 (V + 28554) - 0x110a, 0x1170, 0x11c0, 0, -#undef V7426 -#define V7426 (V + 28558) - 0x110a, 0x1170, 0x11c1, 0, -#undef V7427 -#define V7427 (V + 28562) - 0x110a, 0x1170, 0x11c2, 0, -#undef V7428 -#define V7428 (V + 28566) - 0x110a, 0x1171, 0, -#undef V7429 -#define V7429 (V + 28569) - 0x110a, 0x1171, 0x11a8, 0, -#undef V7430 -#define V7430 (V + 28573) - 0x110a, 0x1171, 0x11a9, 0, -#undef V7431 -#define V7431 (V + 28577) - 0x110a, 0x1171, 0x11aa, 0, -#undef V7432 -#define V7432 (V + 28581) - 0x110a, 0x1171, 0x11ab, 0, -#undef V7433 -#define V7433 (V + 28585) - 0x110a, 0x1171, 0x11ac, 0, -#undef V7434 -#define V7434 (V + 28589) - 0x110a, 0x1171, 0x11ad, 0, -#undef V7435 -#define V7435 (V + 28593) - 0x110a, 0x1171, 0x11ae, 0, -#undef V7436 -#define V7436 (V + 28597) - 0x110a, 0x1171, 0x11af, 0, -#undef V7437 -#define V7437 (V + 28601) - 0x110a, 0x1171, 0x11b0, 0, -#undef V7438 -#define V7438 (V + 28605) - 0x110a, 0x1171, 0x11b1, 0, -#undef V7439 -#define V7439 (V + 28609) - 0x110a, 0x1171, 0x11b2, 0, -#undef V7440 -#define V7440 (V + 28613) - 0x110a, 0x1171, 0x11b3, 0, -#undef V7441 -#define V7441 (V + 28617) - 0x110a, 0x1171, 0x11b4, 0, -#undef V7442 -#define V7442 (V + 28621) - 0x110a, 0x1171, 0x11b5, 0, -#undef V7443 -#define V7443 (V + 28625) - 0x110a, 0x1171, 0x11b6, 0, -#undef V7444 -#define V7444 (V + 28629) - 0x110a, 0x1171, 0x11b7, 0, -#undef V7445 -#define V7445 (V + 28633) - 0x110a, 0x1171, 0x11b8, 0, -#undef V7446 -#define V7446 (V + 28637) - 0x110a, 0x1171, 0x11b9, 0, -#undef V7447 -#define V7447 (V + 28641) - 0x110a, 0x1171, 0x11ba, 0, -#undef V7448 -#define V7448 (V + 28645) - 0x110a, 0x1171, 0x11bb, 0, -#undef V7449 -#define V7449 (V + 28649) - 0x110a, 0x1171, 0x11bc, 0, -#undef V7450 -#define V7450 (V + 28653) - 0x110a, 0x1171, 0x11bd, 0, -#undef V7451 -#define V7451 (V + 28657) - 0x110a, 0x1171, 0x11be, 0, -#undef V7452 -#define V7452 (V + 28661) - 0x110a, 0x1171, 0x11bf, 0, -#undef V7453 -#define V7453 (V + 28665) - 0x110a, 0x1171, 0x11c0, 0, -#undef V7454 -#define V7454 (V + 28669) - 0x110a, 0x1171, 0x11c1, 0, -#undef V7455 -#define V7455 (V + 28673) - 0x110a, 0x1171, 0x11c2, 0, -#undef V7456 -#define V7456 (V + 28677) - 0x110a, 0x1172, 0, -#undef V7457 -#define V7457 (V + 28680) - 0x110a, 0x1172, 0x11a8, 0, -#undef V7458 -#define V7458 (V + 28684) - 0x110a, 0x1172, 0x11a9, 0, -#undef V7459 -#define V7459 (V + 28688) - 0x110a, 0x1172, 0x11aa, 0, -#undef V7460 -#define V7460 (V + 28692) - 0x110a, 0x1172, 0x11ab, 0, -#undef V7461 -#define V7461 (V + 28696) - 0x110a, 0x1172, 0x11ac, 0, -#undef V7462 -#define V7462 (V + 28700) - 0x110a, 0x1172, 0x11ad, 0, -#undef V7463 -#define V7463 (V + 28704) - 0x110a, 0x1172, 0x11ae, 0, -#undef V7464 -#define V7464 (V + 28708) - 0x110a, 0x1172, 0x11af, 0, -#undef V7465 -#define V7465 (V + 28712) - 0x110a, 0x1172, 0x11b0, 0, -#undef V7466 -#define V7466 (V + 28716) - 0x110a, 0x1172, 0x11b1, 0, -#undef V7467 -#define V7467 (V + 28720) - 0x110a, 0x1172, 0x11b2, 0, -#undef V7468 -#define V7468 (V + 28724) - 0x110a, 0x1172, 0x11b3, 0, -#undef V7469 -#define V7469 (V + 28728) - 0x110a, 0x1172, 0x11b4, 0, -#undef V7470 -#define V7470 (V + 28732) - 0x110a, 0x1172, 0x11b5, 0, -#undef V7471 -#define V7471 (V + 28736) - 0x110a, 0x1172, 0x11b6, 0, -#undef V7472 -#define V7472 (V + 28740) - 0x110a, 0x1172, 0x11b7, 0, -#undef V7473 -#define V7473 (V + 28744) - 0x110a, 0x1172, 0x11b8, 0, -#undef V7474 -#define V7474 (V + 28748) - 0x110a, 0x1172, 0x11b9, 0, -#undef V7475 -#define V7475 (V + 28752) - 0x110a, 0x1172, 0x11ba, 0, -#undef V7476 -#define V7476 (V + 28756) - 0x110a, 0x1172, 0x11bb, 0, -#undef V7477 -#define V7477 (V + 28760) - 0x110a, 0x1172, 0x11bc, 0, -#undef V7478 -#define V7478 (V + 28764) - 0x110a, 0x1172, 0x11bd, 0, -#undef V7479 -#define V7479 (V + 28768) - 0x110a, 0x1172, 0x11be, 0, -#undef V7480 -#define V7480 (V + 28772) - 0x110a, 0x1172, 0x11bf, 0, -#undef V7481 -#define V7481 (V + 28776) - 0x110a, 0x1172, 0x11c0, 0, -#undef V7482 -#define V7482 (V + 28780) - 0x110a, 0x1172, 0x11c1, 0, -#undef V7483 -#define V7483 (V + 28784) - 0x110a, 0x1172, 0x11c2, 0, -#undef V7484 -#define V7484 (V + 28788) - 0x110a, 0x1173, 0, -#undef V7485 -#define V7485 (V + 28791) - 0x110a, 0x1173, 0x11a8, 0, -#undef V7486 -#define V7486 (V + 28795) - 0x110a, 0x1173, 0x11a9, 0, -#undef V7487 -#define V7487 (V + 28799) - 0x110a, 0x1173, 0x11aa, 0, -#undef V7488 -#define V7488 (V + 28803) - 0x110a, 0x1173, 0x11ab, 0, -#undef V7489 -#define V7489 (V + 28807) - 0x110a, 0x1173, 0x11ac, 0, -#undef V7490 -#define V7490 (V + 28811) - 0x110a, 0x1173, 0x11ad, 0, -#undef V7491 -#define V7491 (V + 28815) - 0x110a, 0x1173, 0x11ae, 0, -#undef V7492 -#define V7492 (V + 28819) - 0x110a, 0x1173, 0x11af, 0, -#undef V7493 -#define V7493 (V + 28823) - 0x110a, 0x1173, 0x11b0, 0, -#undef V7494 -#define V7494 (V + 28827) - 0x110a, 0x1173, 0x11b1, 0, -#undef V7495 -#define V7495 (V + 28831) - 0x110a, 0x1173, 0x11b2, 0, -#undef V7496 -#define V7496 (V + 28835) - 0x110a, 0x1173, 0x11b3, 0, -#undef V7497 -#define V7497 (V + 28839) - 0x110a, 0x1173, 0x11b4, 0, -#undef V7498 -#define V7498 (V + 28843) - 0x110a, 0x1173, 0x11b5, 0, -#undef V7499 -#define V7499 (V + 28847) - 0x110a, 0x1173, 0x11b6, 0, -#undef V7500 -#define V7500 (V + 28851) - 0x110a, 0x1173, 0x11b7, 0, -#undef V7501 -#define V7501 (V + 28855) - 0x110a, 0x1173, 0x11b8, 0, -#undef V7502 -#define V7502 (V + 28859) - 0x110a, 0x1173, 0x11b9, 0, -#undef V7503 -#define V7503 (V + 28863) - 0x110a, 0x1173, 0x11ba, 0, -#undef V7504 -#define V7504 (V + 28867) - 0x110a, 0x1173, 0x11bb, 0, -#undef V7505 -#define V7505 (V + 28871) - 0x110a, 0x1173, 0x11bc, 0, -#undef V7506 -#define V7506 (V + 28875) - 0x110a, 0x1173, 0x11bd, 0, -#undef V7507 -#define V7507 (V + 28879) - 0x110a, 0x1173, 0x11be, 0, -#undef V7508 -#define V7508 (V + 28883) - 0x110a, 0x1173, 0x11bf, 0, -#undef V7509 -#define V7509 (V + 28887) - 0x110a, 0x1173, 0x11c0, 0, -#undef V7510 -#define V7510 (V + 28891) - 0x110a, 0x1173, 0x11c1, 0, -#undef V7511 -#define V7511 (V + 28895) - 0x110a, 0x1173, 0x11c2, 0, -#undef V7512 -#define V7512 (V + 28899) - 0x110a, 0x1174, 0, -#undef V7513 -#define V7513 (V + 28902) - 0x110a, 0x1174, 0x11a8, 0, -#undef V7514 -#define V7514 (V + 28906) - 0x110a, 0x1174, 0x11a9, 0, -#undef V7515 -#define V7515 (V + 28910) - 0x110a, 0x1174, 0x11aa, 0, -#undef V7516 -#define V7516 (V + 28914) - 0x110a, 0x1174, 0x11ab, 0, -#undef V7517 -#define V7517 (V + 28918) - 0x110a, 0x1174, 0x11ac, 0, -#undef V7518 -#define V7518 (V + 28922) - 0x110a, 0x1174, 0x11ad, 0, -#undef V7519 -#define V7519 (V + 28926) - 0x110a, 0x1174, 0x11ae, 0, -#undef V7520 -#define V7520 (V + 28930) - 0x110a, 0x1174, 0x11af, 0, -#undef V7521 -#define V7521 (V + 28934) - 0x110a, 0x1174, 0x11b0, 0, -#undef V7522 -#define V7522 (V + 28938) - 0x110a, 0x1174, 0x11b1, 0, -#undef V7523 -#define V7523 (V + 28942) - 0x110a, 0x1174, 0x11b2, 0, -#undef V7524 -#define V7524 (V + 28946) - 0x110a, 0x1174, 0x11b3, 0, -#undef V7525 -#define V7525 (V + 28950) - 0x110a, 0x1174, 0x11b4, 0, -#undef V7526 -#define V7526 (V + 28954) - 0x110a, 0x1174, 0x11b5, 0, -#undef V7527 -#define V7527 (V + 28958) - 0x110a, 0x1174, 0x11b6, 0, -#undef V7528 -#define V7528 (V + 28962) - 0x110a, 0x1174, 0x11b7, 0, -#undef V7529 -#define V7529 (V + 28966) - 0x110a, 0x1174, 0x11b8, 0, -#undef V7530 -#define V7530 (V + 28970) - 0x110a, 0x1174, 0x11b9, 0, -#undef V7531 -#define V7531 (V + 28974) - 0x110a, 0x1174, 0x11ba, 0, -#undef V7532 -#define V7532 (V + 28978) - 0x110a, 0x1174, 0x11bb, 0, -#undef V7533 -#define V7533 (V + 28982) - 0x110a, 0x1174, 0x11bc, 0, -#undef V7534 -#define V7534 (V + 28986) - 0x110a, 0x1174, 0x11bd, 0, -#undef V7535 -#define V7535 (V + 28990) - 0x110a, 0x1174, 0x11be, 0, -#undef V7536 -#define V7536 (V + 28994) - 0x110a, 0x1174, 0x11bf, 0, -#undef V7537 -#define V7537 (V + 28998) - 0x110a, 0x1174, 0x11c0, 0, -#undef V7538 -#define V7538 (V + 29002) - 0x110a, 0x1174, 0x11c1, 0, -#undef V7539 -#define V7539 (V + 29006) - 0x110a, 0x1174, 0x11c2, 0, -#undef V7540 -#define V7540 (V + 29010) - 0x110a, 0x1175, 0, -#undef V7541 -#define V7541 (V + 29013) - 0x110a, 0x1175, 0x11a8, 0, -#undef V7542 -#define V7542 (V + 29017) - 0x110a, 0x1175, 0x11a9, 0, -#undef V7543 -#define V7543 (V + 29021) - 0x110a, 0x1175, 0x11aa, 0, -#undef V7544 -#define V7544 (V + 29025) - 0x110a, 0x1175, 0x11ab, 0, -#undef V7545 -#define V7545 (V + 29029) - 0x110a, 0x1175, 0x11ac, 0, -#undef V7546 -#define V7546 (V + 29033) - 0x110a, 0x1175, 0x11ad, 0, -#undef V7547 -#define V7547 (V + 29037) - 0x110a, 0x1175, 0x11ae, 0, -#undef V7548 -#define V7548 (V + 29041) - 0x110a, 0x1175, 0x11af, 0, -#undef V7549 -#define V7549 (V + 29045) - 0x110a, 0x1175, 0x11b0, 0, -#undef V7550 -#define V7550 (V + 29049) - 0x110a, 0x1175, 0x11b1, 0, -#undef V7551 -#define V7551 (V + 29053) - 0x110a, 0x1175, 0x11b2, 0, -#undef V7552 -#define V7552 (V + 29057) - 0x110a, 0x1175, 0x11b3, 0, -#undef V7553 -#define V7553 (V + 29061) - 0x110a, 0x1175, 0x11b4, 0, -#undef V7554 -#define V7554 (V + 29065) - 0x110a, 0x1175, 0x11b5, 0, -#undef V7555 -#define V7555 (V + 29069) - 0x110a, 0x1175, 0x11b6, 0, -#undef V7556 -#define V7556 (V + 29073) - 0x110a, 0x1175, 0x11b7, 0, -#undef V7557 -#define V7557 (V + 29077) - 0x110a, 0x1175, 0x11b8, 0, -#undef V7558 -#define V7558 (V + 29081) - 0x110a, 0x1175, 0x11b9, 0, -#undef V7559 -#define V7559 (V + 29085) - 0x110a, 0x1175, 0x11ba, 0, -#undef V7560 -#define V7560 (V + 29089) - 0x110a, 0x1175, 0x11bb, 0, -#undef V7561 -#define V7561 (V + 29093) - 0x110a, 0x1175, 0x11bc, 0, -#undef V7562 -#define V7562 (V + 29097) - 0x110a, 0x1175, 0x11bd, 0, -#undef V7563 -#define V7563 (V + 29101) - 0x110a, 0x1175, 0x11be, 0, -#undef V7564 -#define V7564 (V + 29105) - 0x110a, 0x1175, 0x11bf, 0, -#undef V7565 -#define V7565 (V + 29109) - 0x110a, 0x1175, 0x11c0, 0, -#undef V7566 -#define V7566 (V + 29113) - 0x110a, 0x1175, 0x11c1, 0, -#undef V7567 -#define V7567 (V + 29117) - 0x110a, 0x1175, 0x11c2, 0, -#undef V7568 -#define V7568 (V + 29121) - 0x110b, 0x1161, 0, -#undef V7569 -#define V7569 (V + 29124) - 0x110b, 0x1161, 0x11a8, 0, -#undef V7570 -#define V7570 (V + 29128) - 0x110b, 0x1161, 0x11a9, 0, -#undef V7571 -#define V7571 (V + 29132) - 0x110b, 0x1161, 0x11aa, 0, -#undef V7572 -#define V7572 (V + 29136) - 0x110b, 0x1161, 0x11ab, 0, -#undef V7573 -#define V7573 (V + 29140) - 0x110b, 0x1161, 0x11ac, 0, -#undef V7574 -#define V7574 (V + 29144) - 0x110b, 0x1161, 0x11ad, 0, -#undef V7575 -#define V7575 (V + 29148) - 0x110b, 0x1161, 0x11ae, 0, -#undef V7576 -#define V7576 (V + 29152) - 0x110b, 0x1161, 0x11af, 0, -#undef V7577 -#define V7577 (V + 29156) - 0x110b, 0x1161, 0x11b0, 0, -#undef V7578 -#define V7578 (V + 29160) - 0x110b, 0x1161, 0x11b1, 0, -#undef V7579 -#define V7579 (V + 29164) - 0x110b, 0x1161, 0x11b2, 0, -#undef V7580 -#define V7580 (V + 29168) - 0x110b, 0x1161, 0x11b3, 0, -#undef V7581 -#define V7581 (V + 29172) - 0x110b, 0x1161, 0x11b4, 0, -#undef V7582 -#define V7582 (V + 29176) - 0x110b, 0x1161, 0x11b5, 0, -#undef V7583 -#define V7583 (V + 29180) - 0x110b, 0x1161, 0x11b6, 0, -#undef V7584 -#define V7584 (V + 29184) - 0x110b, 0x1161, 0x11b7, 0, -#undef V7585 -#define V7585 (V + 29188) - 0x110b, 0x1161, 0x11b8, 0, -#undef V7586 -#define V7586 (V + 29192) - 0x110b, 0x1161, 0x11b9, 0, -#undef V7587 -#define V7587 (V + 29196) - 0x110b, 0x1161, 0x11ba, 0, -#undef V7588 -#define V7588 (V + 29200) - 0x110b, 0x1161, 0x11bb, 0, -#undef V7589 -#define V7589 (V + 29204) - 0x110b, 0x1161, 0x11bc, 0, -#undef V7590 -#define V7590 (V + 29208) - 0x110b, 0x1161, 0x11bd, 0, -#undef V7591 -#define V7591 (V + 29212) - 0x110b, 0x1161, 0x11be, 0, -#undef V7592 -#define V7592 (V + 29216) - 0x110b, 0x1161, 0x11bf, 0, -#undef V7593 -#define V7593 (V + 29220) - 0x110b, 0x1161, 0x11c0, 0, -#undef V7594 -#define V7594 (V + 29224) - 0x110b, 0x1161, 0x11c1, 0, -#undef V7595 -#define V7595 (V + 29228) - 0x110b, 0x1161, 0x11c2, 0, -#undef V7596 -#define V7596 (V + 29232) - 0x110b, 0x1162, 0, -#undef V7597 -#define V7597 (V + 29235) - 0x110b, 0x1162, 0x11a8, 0, -#undef V7598 -#define V7598 (V + 29239) - 0x110b, 0x1162, 0x11a9, 0, -#undef V7599 -#define V7599 (V + 29243) - 0x110b, 0x1162, 0x11aa, 0, -#undef V7600 -#define V7600 (V + 29247) - 0x110b, 0x1162, 0x11ab, 0, -#undef V7601 -#define V7601 (V + 29251) - 0x110b, 0x1162, 0x11ac, 0, -#undef V7602 -#define V7602 (V + 29255) - 0x110b, 0x1162, 0x11ad, 0, -#undef V7603 -#define V7603 (V + 29259) - 0x110b, 0x1162, 0x11ae, 0, -#undef V7604 -#define V7604 (V + 29263) - 0x110b, 0x1162, 0x11af, 0, -#undef V7605 -#define V7605 (V + 29267) - 0x110b, 0x1162, 0x11b0, 0, -#undef V7606 -#define V7606 (V + 29271) - 0x110b, 0x1162, 0x11b1, 0, -#undef V7607 -#define V7607 (V + 29275) - 0x110b, 0x1162, 0x11b2, 0, -#undef V7608 -#define V7608 (V + 29279) - 0x110b, 0x1162, 0x11b3, 0, -#undef V7609 -#define V7609 (V + 29283) - 0x110b, 0x1162, 0x11b4, 0, -#undef V7610 -#define V7610 (V + 29287) - 0x110b, 0x1162, 0x11b5, 0, -#undef V7611 -#define V7611 (V + 29291) - 0x110b, 0x1162, 0x11b6, 0, -#undef V7612 -#define V7612 (V + 29295) - 0x110b, 0x1162, 0x11b7, 0, -#undef V7613 -#define V7613 (V + 29299) - 0x110b, 0x1162, 0x11b8, 0, -#undef V7614 -#define V7614 (V + 29303) - 0x110b, 0x1162, 0x11b9, 0, -#undef V7615 -#define V7615 (V + 29307) - 0x110b, 0x1162, 0x11ba, 0, -#undef V7616 -#define V7616 (V + 29311) - 0x110b, 0x1162, 0x11bb, 0, -#undef V7617 -#define V7617 (V + 29315) - 0x110b, 0x1162, 0x11bc, 0, -#undef V7618 -#define V7618 (V + 29319) - 0x110b, 0x1162, 0x11bd, 0, -#undef V7619 -#define V7619 (V + 29323) - 0x110b, 0x1162, 0x11be, 0, -#undef V7620 -#define V7620 (V + 29327) - 0x110b, 0x1162, 0x11bf, 0, -#undef V7621 -#define V7621 (V + 29331) - 0x110b, 0x1162, 0x11c0, 0, -#undef V7622 -#define V7622 (V + 29335) - 0x110b, 0x1162, 0x11c1, 0, -#undef V7623 -#define V7623 (V + 29339) - 0x110b, 0x1162, 0x11c2, 0, -#undef V7624 -#define V7624 (V + 29343) - 0x110b, 0x1163, 0, -#undef V7625 -#define V7625 (V + 29346) - 0x110b, 0x1163, 0x11a8, 0, -#undef V7626 -#define V7626 (V + 29350) - 0x110b, 0x1163, 0x11a9, 0, -#undef V7627 -#define V7627 (V + 29354) - 0x110b, 0x1163, 0x11aa, 0, -#undef V7628 -#define V7628 (V + 29358) - 0x110b, 0x1163, 0x11ab, 0, -#undef V7629 -#define V7629 (V + 29362) - 0x110b, 0x1163, 0x11ac, 0, -#undef V7630 -#define V7630 (V + 29366) - 0x110b, 0x1163, 0x11ad, 0, -#undef V7631 -#define V7631 (V + 29370) - 0x110b, 0x1163, 0x11ae, 0, -#undef V7632 -#define V7632 (V + 29374) - 0x110b, 0x1163, 0x11af, 0, -#undef V7633 -#define V7633 (V + 29378) - 0x110b, 0x1163, 0x11b0, 0, -#undef V7634 -#define V7634 (V + 29382) - 0x110b, 0x1163, 0x11b1, 0, -#undef V7635 -#define V7635 (V + 29386) - 0x110b, 0x1163, 0x11b2, 0, -#undef V7636 -#define V7636 (V + 29390) - 0x110b, 0x1163, 0x11b3, 0, -#undef V7637 -#define V7637 (V + 29394) - 0x110b, 0x1163, 0x11b4, 0, -#undef V7638 -#define V7638 (V + 29398) - 0x110b, 0x1163, 0x11b5, 0, -#undef V7639 -#define V7639 (V + 29402) - 0x110b, 0x1163, 0x11b6, 0, -#undef V7640 -#define V7640 (V + 29406) - 0x110b, 0x1163, 0x11b7, 0, -#undef V7641 -#define V7641 (V + 29410) - 0x110b, 0x1163, 0x11b8, 0, -#undef V7642 -#define V7642 (V + 29414) - 0x110b, 0x1163, 0x11b9, 0, -#undef V7643 -#define V7643 (V + 29418) - 0x110b, 0x1163, 0x11ba, 0, -#undef V7644 -#define V7644 (V + 29422) - 0x110b, 0x1163, 0x11bb, 0, -#undef V7645 -#define V7645 (V + 29426) - 0x110b, 0x1163, 0x11bc, 0, -#undef V7646 -#define V7646 (V + 29430) - 0x110b, 0x1163, 0x11bd, 0, -#undef V7647 -#define V7647 (V + 29434) - 0x110b, 0x1163, 0x11be, 0, -#undef V7648 -#define V7648 (V + 29438) - 0x110b, 0x1163, 0x11bf, 0, -#undef V7649 -#define V7649 (V + 29442) - 0x110b, 0x1163, 0x11c0, 0, -#undef V7650 -#define V7650 (V + 29446) - 0x110b, 0x1163, 0x11c1, 0, -#undef V7651 -#define V7651 (V + 29450) - 0x110b, 0x1163, 0x11c2, 0, -#undef V7652 -#define V7652 (V + 29454) - 0x110b, 0x1164, 0, -#undef V7653 -#define V7653 (V + 29457) - 0x110b, 0x1164, 0x11a8, 0, -#undef V7654 -#define V7654 (V + 29461) - 0x110b, 0x1164, 0x11a9, 0, -#undef V7655 -#define V7655 (V + 29465) - 0x110b, 0x1164, 0x11aa, 0, -#undef V7656 -#define V7656 (V + 29469) - 0x110b, 0x1164, 0x11ab, 0, -#undef V7657 -#define V7657 (V + 29473) - 0x110b, 0x1164, 0x11ac, 0, -#undef V7658 -#define V7658 (V + 29477) - 0x110b, 0x1164, 0x11ad, 0, -#undef V7659 -#define V7659 (V + 29481) - 0x110b, 0x1164, 0x11ae, 0, -#undef V7660 -#define V7660 (V + 29485) - 0x110b, 0x1164, 0x11af, 0, -#undef V7661 -#define V7661 (V + 29489) - 0x110b, 0x1164, 0x11b0, 0, -#undef V7662 -#define V7662 (V + 29493) - 0x110b, 0x1164, 0x11b1, 0, -#undef V7663 -#define V7663 (V + 29497) - 0x110b, 0x1164, 0x11b2, 0, -#undef V7664 -#define V7664 (V + 29501) - 0x110b, 0x1164, 0x11b3, 0, -#undef V7665 -#define V7665 (V + 29505) - 0x110b, 0x1164, 0x11b4, 0, -#undef V7666 -#define V7666 (V + 29509) - 0x110b, 0x1164, 0x11b5, 0, -#undef V7667 -#define V7667 (V + 29513) - 0x110b, 0x1164, 0x11b6, 0, -#undef V7668 -#define V7668 (V + 29517) - 0x110b, 0x1164, 0x11b7, 0, -#undef V7669 -#define V7669 (V + 29521) - 0x110b, 0x1164, 0x11b8, 0, -#undef V7670 -#define V7670 (V + 29525) - 0x110b, 0x1164, 0x11b9, 0, -#undef V7671 -#define V7671 (V + 29529) - 0x110b, 0x1164, 0x11ba, 0, -#undef V7672 -#define V7672 (V + 29533) - 0x110b, 0x1164, 0x11bb, 0, -#undef V7673 -#define V7673 (V + 29537) - 0x110b, 0x1164, 0x11bc, 0, -#undef V7674 -#define V7674 (V + 29541) - 0x110b, 0x1164, 0x11bd, 0, -#undef V7675 -#define V7675 (V + 29545) - 0x110b, 0x1164, 0x11be, 0, -#undef V7676 -#define V7676 (V + 29549) - 0x110b, 0x1164, 0x11bf, 0, -#undef V7677 -#define V7677 (V + 29553) - 0x110b, 0x1164, 0x11c0, 0, -#undef V7678 -#define V7678 (V + 29557) - 0x110b, 0x1164, 0x11c1, 0, -#undef V7679 -#define V7679 (V + 29561) - 0x110b, 0x1164, 0x11c2, 0, -#undef V7680 -#define V7680 (V + 29565) - 0x110b, 0x1165, 0, -#undef V7681 -#define V7681 (V + 29568) - 0x110b, 0x1165, 0x11a8, 0, -#undef V7682 -#define V7682 (V + 29572) - 0x110b, 0x1165, 0x11a9, 0, -#undef V7683 -#define V7683 (V + 29576) - 0x110b, 0x1165, 0x11aa, 0, -#undef V7684 -#define V7684 (V + 29580) - 0x110b, 0x1165, 0x11ab, 0, -#undef V7685 -#define V7685 (V + 29584) - 0x110b, 0x1165, 0x11ac, 0, -#undef V7686 -#define V7686 (V + 29588) - 0x110b, 0x1165, 0x11ad, 0, -#undef V7687 -#define V7687 (V + 29592) - 0x110b, 0x1165, 0x11ae, 0, -#undef V7688 -#define V7688 (V + 29596) - 0x110b, 0x1165, 0x11af, 0, -#undef V7689 -#define V7689 (V + 29600) - 0x110b, 0x1165, 0x11b0, 0, -#undef V7690 -#define V7690 (V + 29604) - 0x110b, 0x1165, 0x11b1, 0, -#undef V7691 -#define V7691 (V + 29608) - 0x110b, 0x1165, 0x11b2, 0, -#undef V7692 -#define V7692 (V + 29612) - 0x110b, 0x1165, 0x11b3, 0, -#undef V7693 -#define V7693 (V + 29616) - 0x110b, 0x1165, 0x11b4, 0, -#undef V7694 -#define V7694 (V + 29620) - 0x110b, 0x1165, 0x11b5, 0, -#undef V7695 -#define V7695 (V + 29624) - 0x110b, 0x1165, 0x11b6, 0, -#undef V7696 -#define V7696 (V + 29628) - 0x110b, 0x1165, 0x11b7, 0, -#undef V7697 -#define V7697 (V + 29632) - 0x110b, 0x1165, 0x11b8, 0, -#undef V7698 -#define V7698 (V + 29636) - 0x110b, 0x1165, 0x11b9, 0, -#undef V7699 -#define V7699 (V + 29640) - 0x110b, 0x1165, 0x11ba, 0, -#undef V7700 -#define V7700 (V + 29644) - 0x110b, 0x1165, 0x11bb, 0, -#undef V7701 -#define V7701 (V + 29648) - 0x110b, 0x1165, 0x11bc, 0, -#undef V7702 -#define V7702 (V + 29652) - 0x110b, 0x1165, 0x11bd, 0, -#undef V7703 -#define V7703 (V + 29656) - 0x110b, 0x1165, 0x11be, 0, -#undef V7704 -#define V7704 (V + 29660) - 0x110b, 0x1165, 0x11bf, 0, -#undef V7705 -#define V7705 (V + 29664) - 0x110b, 0x1165, 0x11c0, 0, -#undef V7706 -#define V7706 (V + 29668) - 0x110b, 0x1165, 0x11c1, 0, -#undef V7707 -#define V7707 (V + 29672) - 0x110b, 0x1165, 0x11c2, 0, -#undef V7708 -#define V7708 (V + 29676) - 0x110b, 0x1166, 0, -#undef V7709 -#define V7709 (V + 29679) - 0x110b, 0x1166, 0x11a8, 0, -#undef V7710 -#define V7710 (V + 29683) - 0x110b, 0x1166, 0x11a9, 0, -#undef V7711 -#define V7711 (V + 29687) - 0x110b, 0x1166, 0x11aa, 0, -#undef V7712 -#define V7712 (V + 29691) - 0x110b, 0x1166, 0x11ab, 0, -#undef V7713 -#define V7713 (V + 29695) - 0x110b, 0x1166, 0x11ac, 0, -#undef V7714 -#define V7714 (V + 29699) - 0x110b, 0x1166, 0x11ad, 0, -#undef V7715 -#define V7715 (V + 29703) - 0x110b, 0x1166, 0x11ae, 0, -#undef V7716 -#define V7716 (V + 29707) - 0x110b, 0x1166, 0x11af, 0, -#undef V7717 -#define V7717 (V + 29711) - 0x110b, 0x1166, 0x11b0, 0, -#undef V7718 -#define V7718 (V + 29715) - 0x110b, 0x1166, 0x11b1, 0, -#undef V7719 -#define V7719 (V + 29719) - 0x110b, 0x1166, 0x11b2, 0, -#undef V7720 -#define V7720 (V + 29723) - 0x110b, 0x1166, 0x11b3, 0, -#undef V7721 -#define V7721 (V + 29727) - 0x110b, 0x1166, 0x11b4, 0, -#undef V7722 -#define V7722 (V + 29731) - 0x110b, 0x1166, 0x11b5, 0, -#undef V7723 -#define V7723 (V + 29735) - 0x110b, 0x1166, 0x11b6, 0, -#undef V7724 -#define V7724 (V + 29739) - 0x110b, 0x1166, 0x11b7, 0, -#undef V7725 -#define V7725 (V + 29743) - 0x110b, 0x1166, 0x11b8, 0, -#undef V7726 -#define V7726 (V + 29747) - 0x110b, 0x1166, 0x11b9, 0, -#undef V7727 -#define V7727 (V + 29751) - 0x110b, 0x1166, 0x11ba, 0, -#undef V7728 -#define V7728 (V + 29755) - 0x110b, 0x1166, 0x11bb, 0, -#undef V7729 -#define V7729 (V + 29759) - 0x110b, 0x1166, 0x11bc, 0, -#undef V7730 -#define V7730 (V + 29763) - 0x110b, 0x1166, 0x11bd, 0, -#undef V7731 -#define V7731 (V + 29767) - 0x110b, 0x1166, 0x11be, 0, -#undef V7732 -#define V7732 (V + 29771) - 0x110b, 0x1166, 0x11bf, 0, -#undef V7733 -#define V7733 (V + 29775) - 0x110b, 0x1166, 0x11c0, 0, -#undef V7734 -#define V7734 (V + 29779) - 0x110b, 0x1166, 0x11c1, 0, -#undef V7735 -#define V7735 (V + 29783) - 0x110b, 0x1166, 0x11c2, 0, -#undef V7736 -#define V7736 (V + 29787) - 0x110b, 0x1167, 0, -#undef V7737 -#define V7737 (V + 29790) - 0x110b, 0x1167, 0x11a8, 0, -#undef V7738 -#define V7738 (V + 29794) - 0x110b, 0x1167, 0x11a9, 0, -#undef V7739 -#define V7739 (V + 29798) - 0x110b, 0x1167, 0x11aa, 0, -#undef V7740 -#define V7740 (V + 29802) - 0x110b, 0x1167, 0x11ab, 0, -#undef V7741 -#define V7741 (V + 29806) - 0x110b, 0x1167, 0x11ac, 0, -#undef V7742 -#define V7742 (V + 29810) - 0x110b, 0x1167, 0x11ad, 0, -#undef V7743 -#define V7743 (V + 29814) - 0x110b, 0x1167, 0x11ae, 0, -#undef V7744 -#define V7744 (V + 29818) - 0x110b, 0x1167, 0x11af, 0, -#undef V7745 -#define V7745 (V + 29822) - 0x110b, 0x1167, 0x11b0, 0, -#undef V7746 -#define V7746 (V + 29826) - 0x110b, 0x1167, 0x11b1, 0, -#undef V7747 -#define V7747 (V + 29830) - 0x110b, 0x1167, 0x11b2, 0, -#undef V7748 -#define V7748 (V + 29834) - 0x110b, 0x1167, 0x11b3, 0, -#undef V7749 -#define V7749 (V + 29838) - 0x110b, 0x1167, 0x11b4, 0, -#undef V7750 -#define V7750 (V + 29842) - 0x110b, 0x1167, 0x11b5, 0, -#undef V7751 -#define V7751 (V + 29846) - 0x110b, 0x1167, 0x11b6, 0, -#undef V7752 -#define V7752 (V + 29850) - 0x110b, 0x1167, 0x11b7, 0, -#undef V7753 -#define V7753 (V + 29854) - 0x110b, 0x1167, 0x11b8, 0, -#undef V7754 -#define V7754 (V + 29858) - 0x110b, 0x1167, 0x11b9, 0, -#undef V7755 -#define V7755 (V + 29862) - 0x110b, 0x1167, 0x11ba, 0, -#undef V7756 -#define V7756 (V + 29866) - 0x110b, 0x1167, 0x11bb, 0, -#undef V7757 -#define V7757 (V + 29870) - 0x110b, 0x1167, 0x11bc, 0, -#undef V7758 -#define V7758 (V + 29874) - 0x110b, 0x1167, 0x11bd, 0, -#undef V7759 -#define V7759 (V + 29878) - 0x110b, 0x1167, 0x11be, 0, -#undef V7760 -#define V7760 (V + 29882) - 0x110b, 0x1167, 0x11bf, 0, -#undef V7761 -#define V7761 (V + 29886) - 0x110b, 0x1167, 0x11c0, 0, -#undef V7762 -#define V7762 (V + 29890) - 0x110b, 0x1167, 0x11c1, 0, -#undef V7763 -#define V7763 (V + 29894) - 0x110b, 0x1167, 0x11c2, 0, -#undef V7764 -#define V7764 (V + 29898) - 0x110b, 0x1168, 0, -#undef V7765 -#define V7765 (V + 29901) - 0x110b, 0x1168, 0x11a8, 0, -#undef V7766 -#define V7766 (V + 29905) - 0x110b, 0x1168, 0x11a9, 0, -#undef V7767 -#define V7767 (V + 29909) - 0x110b, 0x1168, 0x11aa, 0, -#undef V7768 -#define V7768 (V + 29913) - 0x110b, 0x1168, 0x11ab, 0, -#undef V7769 -#define V7769 (V + 29917) - 0x110b, 0x1168, 0x11ac, 0, -#undef V7770 -#define V7770 (V + 29921) - 0x110b, 0x1168, 0x11ad, 0, -#undef V7771 -#define V7771 (V + 29925) - 0x110b, 0x1168, 0x11ae, 0, -#undef V7772 -#define V7772 (V + 29929) - 0x110b, 0x1168, 0x11af, 0, -#undef V7773 -#define V7773 (V + 29933) - 0x110b, 0x1168, 0x11b0, 0, -#undef V7774 -#define V7774 (V + 29937) - 0x110b, 0x1168, 0x11b1, 0, -#undef V7775 -#define V7775 (V + 29941) - 0x110b, 0x1168, 0x11b2, 0, -#undef V7776 -#define V7776 (V + 29945) - 0x110b, 0x1168, 0x11b3, 0, -#undef V7777 -#define V7777 (V + 29949) - 0x110b, 0x1168, 0x11b4, 0, -#undef V7778 -#define V7778 (V + 29953) - 0x110b, 0x1168, 0x11b5, 0, -#undef V7779 -#define V7779 (V + 29957) - 0x110b, 0x1168, 0x11b6, 0, -#undef V7780 -#define V7780 (V + 29961) - 0x110b, 0x1168, 0x11b7, 0, -#undef V7781 -#define V7781 (V + 29965) - 0x110b, 0x1168, 0x11b8, 0, -#undef V7782 -#define V7782 (V + 29969) - 0x110b, 0x1168, 0x11b9, 0, -#undef V7783 -#define V7783 (V + 29973) - 0x110b, 0x1168, 0x11ba, 0, -#undef V7784 -#define V7784 (V + 29977) - 0x110b, 0x1168, 0x11bb, 0, -#undef V7785 -#define V7785 (V + 29981) - 0x110b, 0x1168, 0x11bc, 0, -#undef V7786 -#define V7786 (V + 29985) - 0x110b, 0x1168, 0x11bd, 0, -#undef V7787 -#define V7787 (V + 29989) - 0x110b, 0x1168, 0x11be, 0, -#undef V7788 -#define V7788 (V + 29993) - 0x110b, 0x1168, 0x11bf, 0, -#undef V7789 -#define V7789 (V + 29997) - 0x110b, 0x1168, 0x11c0, 0, -#undef V7790 -#define V7790 (V + 30001) - 0x110b, 0x1168, 0x11c1, 0, -#undef V7791 -#define V7791 (V + 30005) - 0x110b, 0x1168, 0x11c2, 0, -#undef V7792 -#define V7792 (V + 30009) - 0x110b, 0x1169, 0, -#undef V7793 -#define V7793 (V + 30012) - 0x110b, 0x1169, 0x11a8, 0, -#undef V7794 -#define V7794 (V + 30016) - 0x110b, 0x1169, 0x11a9, 0, -#undef V7795 -#define V7795 (V + 30020) - 0x110b, 0x1169, 0x11aa, 0, -#undef V7796 -#define V7796 (V + 30024) - 0x110b, 0x1169, 0x11ab, 0, -#undef V7797 -#define V7797 (V + 30028) - 0x110b, 0x1169, 0x11ac, 0, -#undef V7798 -#define V7798 (V + 30032) - 0x110b, 0x1169, 0x11ad, 0, -#undef V7799 -#define V7799 (V + 30036) - 0x110b, 0x1169, 0x11ae, 0, -#undef V7800 -#define V7800 (V + 30040) - 0x110b, 0x1169, 0x11af, 0, -#undef V7801 -#define V7801 (V + 30044) - 0x110b, 0x1169, 0x11b0, 0, -#undef V7802 -#define V7802 (V + 30048) - 0x110b, 0x1169, 0x11b1, 0, -#undef V7803 -#define V7803 (V + 30052) - 0x110b, 0x1169, 0x11b2, 0, -#undef V7804 -#define V7804 (V + 30056) - 0x110b, 0x1169, 0x11b3, 0, -#undef V7805 -#define V7805 (V + 30060) - 0x110b, 0x1169, 0x11b4, 0, -#undef V7806 -#define V7806 (V + 30064) - 0x110b, 0x1169, 0x11b5, 0, -#undef V7807 -#define V7807 (V + 30068) - 0x110b, 0x1169, 0x11b6, 0, -#undef V7808 -#define V7808 (V + 30072) - 0x110b, 0x1169, 0x11b7, 0, -#undef V7809 -#define V7809 (V + 30076) - 0x110b, 0x1169, 0x11b8, 0, -#undef V7810 -#define V7810 (V + 30080) - 0x110b, 0x1169, 0x11b9, 0, -#undef V7811 -#define V7811 (V + 30084) - 0x110b, 0x1169, 0x11ba, 0, -#undef V7812 -#define V7812 (V + 30088) - 0x110b, 0x1169, 0x11bb, 0, -#undef V7813 -#define V7813 (V + 30092) - 0x110b, 0x1169, 0x11bc, 0, -#undef V7814 -#define V7814 (V + 30096) - 0x110b, 0x1169, 0x11bd, 0, -#undef V7815 -#define V7815 (V + 30100) - 0x110b, 0x1169, 0x11be, 0, -#undef V7816 -#define V7816 (V + 30104) - 0x110b, 0x1169, 0x11bf, 0, -#undef V7817 -#define V7817 (V + 30108) - 0x110b, 0x1169, 0x11c0, 0, -#undef V7818 -#define V7818 (V + 30112) - 0x110b, 0x1169, 0x11c1, 0, -#undef V7819 -#define V7819 (V + 30116) - 0x110b, 0x1169, 0x11c2, 0, -#undef V7820 -#define V7820 (V + 30120) - 0x110b, 0x116a, 0, -#undef V7821 -#define V7821 (V + 30123) - 0x110b, 0x116a, 0x11a8, 0, -#undef V7822 -#define V7822 (V + 30127) - 0x110b, 0x116a, 0x11a9, 0, -#undef V7823 -#define V7823 (V + 30131) - 0x110b, 0x116a, 0x11aa, 0, -#undef V7824 -#define V7824 (V + 30135) - 0x110b, 0x116a, 0x11ab, 0, -#undef V7825 -#define V7825 (V + 30139) - 0x110b, 0x116a, 0x11ac, 0, -#undef V7826 -#define V7826 (V + 30143) - 0x110b, 0x116a, 0x11ad, 0, -#undef V7827 -#define V7827 (V + 30147) - 0x110b, 0x116a, 0x11ae, 0, -#undef V7828 -#define V7828 (V + 30151) - 0x110b, 0x116a, 0x11af, 0, -#undef V7829 -#define V7829 (V + 30155) - 0x110b, 0x116a, 0x11b0, 0, -#undef V7830 -#define V7830 (V + 30159) - 0x110b, 0x116a, 0x11b1, 0, -#undef V7831 -#define V7831 (V + 30163) - 0x110b, 0x116a, 0x11b2, 0, -#undef V7832 -#define V7832 (V + 30167) - 0x110b, 0x116a, 0x11b3, 0, -#undef V7833 -#define V7833 (V + 30171) - 0x110b, 0x116a, 0x11b4, 0, -#undef V7834 -#define V7834 (V + 30175) - 0x110b, 0x116a, 0x11b5, 0, -#undef V7835 -#define V7835 (V + 30179) - 0x110b, 0x116a, 0x11b6, 0, -#undef V7836 -#define V7836 (V + 30183) - 0x110b, 0x116a, 0x11b7, 0, -#undef V7837 -#define V7837 (V + 30187) - 0x110b, 0x116a, 0x11b8, 0, -#undef V7838 -#define V7838 (V + 30191) - 0x110b, 0x116a, 0x11b9, 0, -#undef V7839 -#define V7839 (V + 30195) - 0x110b, 0x116a, 0x11ba, 0, -#undef V7840 -#define V7840 (V + 30199) - 0x110b, 0x116a, 0x11bb, 0, -#undef V7841 -#define V7841 (V + 30203) - 0x110b, 0x116a, 0x11bc, 0, -#undef V7842 -#define V7842 (V + 30207) - 0x110b, 0x116a, 0x11bd, 0, -#undef V7843 -#define V7843 (V + 30211) - 0x110b, 0x116a, 0x11be, 0, -#undef V7844 -#define V7844 (V + 30215) - 0x110b, 0x116a, 0x11bf, 0, -#undef V7845 -#define V7845 (V + 30219) - 0x110b, 0x116a, 0x11c0, 0, -#undef V7846 -#define V7846 (V + 30223) - 0x110b, 0x116a, 0x11c1, 0, -#undef V7847 -#define V7847 (V + 30227) - 0x110b, 0x116a, 0x11c2, 0, -#undef V7848 -#define V7848 (V + 30231) - 0x110b, 0x116b, 0, -#undef V7849 -#define V7849 (V + 30234) - 0x110b, 0x116b, 0x11a8, 0, -#undef V7850 -#define V7850 (V + 30238) - 0x110b, 0x116b, 0x11a9, 0, -#undef V7851 -#define V7851 (V + 30242) - 0x110b, 0x116b, 0x11aa, 0, -#undef V7852 -#define V7852 (V + 30246) - 0x110b, 0x116b, 0x11ab, 0, -#undef V7853 -#define V7853 (V + 30250) - 0x110b, 0x116b, 0x11ac, 0, -#undef V7854 -#define V7854 (V + 30254) - 0x110b, 0x116b, 0x11ad, 0, -#undef V7855 -#define V7855 (V + 30258) - 0x110b, 0x116b, 0x11ae, 0, -#undef V7856 -#define V7856 (V + 30262) - 0x110b, 0x116b, 0x11af, 0, -#undef V7857 -#define V7857 (V + 30266) - 0x110b, 0x116b, 0x11b0, 0, -#undef V7858 -#define V7858 (V + 30270) - 0x110b, 0x116b, 0x11b1, 0, -#undef V7859 -#define V7859 (V + 30274) - 0x110b, 0x116b, 0x11b2, 0, -#undef V7860 -#define V7860 (V + 30278) - 0x110b, 0x116b, 0x11b3, 0, -#undef V7861 -#define V7861 (V + 30282) - 0x110b, 0x116b, 0x11b4, 0, -#undef V7862 -#define V7862 (V + 30286) - 0x110b, 0x116b, 0x11b5, 0, -#undef V7863 -#define V7863 (V + 30290) - 0x110b, 0x116b, 0x11b6, 0, -#undef V7864 -#define V7864 (V + 30294) - 0x110b, 0x116b, 0x11b7, 0, -#undef V7865 -#define V7865 (V + 30298) - 0x110b, 0x116b, 0x11b8, 0, -#undef V7866 -#define V7866 (V + 30302) - 0x110b, 0x116b, 0x11b9, 0, -#undef V7867 -#define V7867 (V + 30306) - 0x110b, 0x116b, 0x11ba, 0, -#undef V7868 -#define V7868 (V + 30310) - 0x110b, 0x116b, 0x11bb, 0, -#undef V7869 -#define V7869 (V + 30314) - 0x110b, 0x116b, 0x11bc, 0, -#undef V7870 -#define V7870 (V + 30318) - 0x110b, 0x116b, 0x11bd, 0, -#undef V7871 -#define V7871 (V + 30322) - 0x110b, 0x116b, 0x11be, 0, -#undef V7872 -#define V7872 (V + 30326) - 0x110b, 0x116b, 0x11bf, 0, -#undef V7873 -#define V7873 (V + 30330) - 0x110b, 0x116b, 0x11c0, 0, -#undef V7874 -#define V7874 (V + 30334) - 0x110b, 0x116b, 0x11c1, 0, -#undef V7875 -#define V7875 (V + 30338) - 0x110b, 0x116b, 0x11c2, 0, -#undef V7876 -#define V7876 (V + 30342) - 0x110b, 0x116c, 0, -#undef V7877 -#define V7877 (V + 30345) - 0x110b, 0x116c, 0x11a8, 0, -#undef V7878 -#define V7878 (V + 30349) - 0x110b, 0x116c, 0x11a9, 0, -#undef V7879 -#define V7879 (V + 30353) - 0x110b, 0x116c, 0x11aa, 0, -#undef V7880 -#define V7880 (V + 30357) - 0x110b, 0x116c, 0x11ab, 0, -#undef V7881 -#define V7881 (V + 30361) - 0x110b, 0x116c, 0x11ac, 0, -#undef V7882 -#define V7882 (V + 30365) - 0x110b, 0x116c, 0x11ad, 0, -#undef V7883 -#define V7883 (V + 30369) - 0x110b, 0x116c, 0x11ae, 0, -#undef V7884 -#define V7884 (V + 30373) - 0x110b, 0x116c, 0x11af, 0, -#undef V7885 -#define V7885 (V + 30377) - 0x110b, 0x116c, 0x11b0, 0, -#undef V7886 -#define V7886 (V + 30381) - 0x110b, 0x116c, 0x11b1, 0, -#undef V7887 -#define V7887 (V + 30385) - 0x110b, 0x116c, 0x11b2, 0, -#undef V7888 -#define V7888 (V + 30389) - 0x110b, 0x116c, 0x11b3, 0, -#undef V7889 -#define V7889 (V + 30393) - 0x110b, 0x116c, 0x11b4, 0, -#undef V7890 -#define V7890 (V + 30397) - 0x110b, 0x116c, 0x11b5, 0, -#undef V7891 -#define V7891 (V + 30401) - 0x110b, 0x116c, 0x11b6, 0, -#undef V7892 -#define V7892 (V + 30405) - 0x110b, 0x116c, 0x11b7, 0, -#undef V7893 -#define V7893 (V + 30409) - 0x110b, 0x116c, 0x11b8, 0, -#undef V7894 -#define V7894 (V + 30413) - 0x110b, 0x116c, 0x11b9, 0, -#undef V7895 -#define V7895 (V + 30417) - 0x110b, 0x116c, 0x11ba, 0, -#undef V7896 -#define V7896 (V + 30421) - 0x110b, 0x116c, 0x11bb, 0, -#undef V7897 -#define V7897 (V + 30425) - 0x110b, 0x116c, 0x11bc, 0, -#undef V7898 -#define V7898 (V + 30429) - 0x110b, 0x116c, 0x11bd, 0, -#undef V7899 -#define V7899 (V + 30433) - 0x110b, 0x116c, 0x11be, 0, -#undef V7900 -#define V7900 (V + 30437) - 0x110b, 0x116c, 0x11bf, 0, -#undef V7901 -#define V7901 (V + 30441) - 0x110b, 0x116c, 0x11c0, 0, -#undef V7902 -#define V7902 (V + 30445) - 0x110b, 0x116c, 0x11c1, 0, -#undef V7903 -#define V7903 (V + 30449) - 0x110b, 0x116c, 0x11c2, 0, -#undef V7904 -#define V7904 (V + 30453) - 0x110b, 0x116d, 0, -#undef V7905 -#define V7905 (V + 30456) - 0x110b, 0x116d, 0x11a8, 0, -#undef V7906 -#define V7906 (V + 30460) - 0x110b, 0x116d, 0x11a9, 0, -#undef V7907 -#define V7907 (V + 30464) - 0x110b, 0x116d, 0x11aa, 0, -#undef V7908 -#define V7908 (V + 30468) - 0x110b, 0x116d, 0x11ab, 0, -#undef V7909 -#define V7909 (V + 30472) - 0x110b, 0x116d, 0x11ac, 0, -#undef V7910 -#define V7910 (V + 30476) - 0x110b, 0x116d, 0x11ad, 0, -#undef V7911 -#define V7911 (V + 30480) - 0x110b, 0x116d, 0x11ae, 0, -#undef V7912 -#define V7912 (V + 30484) - 0x110b, 0x116d, 0x11af, 0, -#undef V7913 -#define V7913 (V + 30488) - 0x110b, 0x116d, 0x11b0, 0, -#undef V7914 -#define V7914 (V + 30492) - 0x110b, 0x116d, 0x11b1, 0, -#undef V7915 -#define V7915 (V + 30496) - 0x110b, 0x116d, 0x11b2, 0, -#undef V7916 -#define V7916 (V + 30500) - 0x110b, 0x116d, 0x11b3, 0, -#undef V7917 -#define V7917 (V + 30504) - 0x110b, 0x116d, 0x11b4, 0, -#undef V7918 -#define V7918 (V + 30508) - 0x110b, 0x116d, 0x11b5, 0, -#undef V7919 -#define V7919 (V + 30512) - 0x110b, 0x116d, 0x11b6, 0, -#undef V7920 -#define V7920 (V + 30516) - 0x110b, 0x116d, 0x11b7, 0, -#undef V7921 -#define V7921 (V + 30520) - 0x110b, 0x116d, 0x11b8, 0, -#undef V7922 -#define V7922 (V + 30524) - 0x110b, 0x116d, 0x11b9, 0, -#undef V7923 -#define V7923 (V + 30528) - 0x110b, 0x116d, 0x11ba, 0, -#undef V7924 -#define V7924 (V + 30532) - 0x110b, 0x116d, 0x11bb, 0, -#undef V7925 -#define V7925 (V + 30536) - 0x110b, 0x116d, 0x11bc, 0, -#undef V7926 -#define V7926 (V + 30540) - 0x110b, 0x116d, 0x11bd, 0, -#undef V7927 -#define V7927 (V + 30544) - 0x110b, 0x116d, 0x11be, 0, -#undef V7928 -#define V7928 (V + 30548) - 0x110b, 0x116d, 0x11bf, 0, -#undef V7929 -#define V7929 (V + 30552) - 0x110b, 0x116d, 0x11c0, 0, -#undef V7930 -#define V7930 (V + 30556) - 0x110b, 0x116d, 0x11c1, 0, -#undef V7931 -#define V7931 (V + 30560) - 0x110b, 0x116d, 0x11c2, 0, -#undef V7932 -#define V7932 (V + 30564) - 0x110b, 0x116e, 0, -#undef V7933 -#define V7933 (V + 30567) - 0x110b, 0x116e, 0x11a8, 0, -#undef V7934 -#define V7934 (V + 30571) - 0x110b, 0x116e, 0x11a9, 0, -#undef V7935 -#define V7935 (V + 30575) - 0x110b, 0x116e, 0x11aa, 0, -#undef V7936 -#define V7936 (V + 30579) - 0x110b, 0x116e, 0x11ab, 0, -#undef V7937 -#define V7937 (V + 30583) - 0x110b, 0x116e, 0x11ac, 0, -#undef V7938 -#define V7938 (V + 30587) - 0x110b, 0x116e, 0x11ad, 0, -#undef V7939 -#define V7939 (V + 30591) - 0x110b, 0x116e, 0x11ae, 0, -#undef V7940 -#define V7940 (V + 30595) - 0x110b, 0x116e, 0x11af, 0, -#undef V7941 -#define V7941 (V + 30599) - 0x110b, 0x116e, 0x11b0, 0, -#undef V7942 -#define V7942 (V + 30603) - 0x110b, 0x116e, 0x11b1, 0, -#undef V7943 -#define V7943 (V + 30607) - 0x110b, 0x116e, 0x11b2, 0, -#undef V7944 -#define V7944 (V + 30611) - 0x110b, 0x116e, 0x11b3, 0, -#undef V7945 -#define V7945 (V + 30615) - 0x110b, 0x116e, 0x11b4, 0, -#undef V7946 -#define V7946 (V + 30619) - 0x110b, 0x116e, 0x11b5, 0, -#undef V7947 -#define V7947 (V + 30623) - 0x110b, 0x116e, 0x11b6, 0, -#undef V7948 -#define V7948 (V + 30627) - 0x110b, 0x116e, 0x11b7, 0, -#undef V7949 -#define V7949 (V + 30631) - 0x110b, 0x116e, 0x11b8, 0, -#undef V7950 -#define V7950 (V + 30635) - 0x110b, 0x116e, 0x11b9, 0, -#undef V7951 -#define V7951 (V + 30639) - 0x110b, 0x116e, 0x11ba, 0, -#undef V7952 -#define V7952 (V + 30643) - 0x110b, 0x116e, 0x11bb, 0, -#undef V7953 -#define V7953 (V + 30647) - 0x110b, 0x116e, 0x11bc, 0, -#undef V7954 -#define V7954 (V + 30651) - 0x110b, 0x116e, 0x11bd, 0, -#undef V7955 -#define V7955 (V + 30655) - 0x110b, 0x116e, 0x11be, 0, -#undef V7956 -#define V7956 (V + 30659) - 0x110b, 0x116e, 0x11bf, 0, -#undef V7957 -#define V7957 (V + 30663) - 0x110b, 0x116e, 0x11c0, 0, -#undef V7958 -#define V7958 (V + 30667) - 0x110b, 0x116e, 0x11c1, 0, -#undef V7959 -#define V7959 (V + 30671) - 0x110b, 0x116e, 0x11c2, 0, -#undef V7960 -#define V7960 (V + 30675) - 0x110b, 0x116f, 0, -#undef V7961 -#define V7961 (V + 30678) - 0x110b, 0x116f, 0x11a8, 0, -#undef V7962 -#define V7962 (V + 30682) - 0x110b, 0x116f, 0x11a9, 0, -#undef V7963 -#define V7963 (V + 30686) - 0x110b, 0x116f, 0x11aa, 0, -#undef V7964 -#define V7964 (V + 30690) - 0x110b, 0x116f, 0x11ab, 0, -#undef V7965 -#define V7965 (V + 30694) - 0x110b, 0x116f, 0x11ac, 0, -#undef V7966 -#define V7966 (V + 30698) - 0x110b, 0x116f, 0x11ad, 0, -#undef V7967 -#define V7967 (V + 30702) - 0x110b, 0x116f, 0x11ae, 0, -#undef V7968 -#define V7968 (V + 30706) - 0x110b, 0x116f, 0x11af, 0, -#undef V7969 -#define V7969 (V + 30710) - 0x110b, 0x116f, 0x11b0, 0, -#undef V7970 -#define V7970 (V + 30714) - 0x110b, 0x116f, 0x11b1, 0, -#undef V7971 -#define V7971 (V + 30718) - 0x110b, 0x116f, 0x11b2, 0, -#undef V7972 -#define V7972 (V + 30722) - 0x110b, 0x116f, 0x11b3, 0, -#undef V7973 -#define V7973 (V + 30726) - 0x110b, 0x116f, 0x11b4, 0, -#undef V7974 -#define V7974 (V + 30730) - 0x110b, 0x116f, 0x11b5, 0, -#undef V7975 -#define V7975 (V + 30734) - 0x110b, 0x116f, 0x11b6, 0, -#undef V7976 -#define V7976 (V + 30738) - 0x110b, 0x116f, 0x11b7, 0, -#undef V7977 -#define V7977 (V + 30742) - 0x110b, 0x116f, 0x11b8, 0, -#undef V7978 -#define V7978 (V + 30746) - 0x110b, 0x116f, 0x11b9, 0, -#undef V7979 -#define V7979 (V + 30750) - 0x110b, 0x116f, 0x11ba, 0, -#undef V7980 -#define V7980 (V + 30754) - 0x110b, 0x116f, 0x11bb, 0, -#undef V7981 -#define V7981 (V + 30758) - 0x110b, 0x116f, 0x11bc, 0, -#undef V7982 -#define V7982 (V + 30762) - 0x110b, 0x116f, 0x11bd, 0, -#undef V7983 -#define V7983 (V + 30766) - 0x110b, 0x116f, 0x11be, 0, -#undef V7984 -#define V7984 (V + 30770) - 0x110b, 0x116f, 0x11bf, 0, -#undef V7985 -#define V7985 (V + 30774) - 0x110b, 0x116f, 0x11c0, 0, -#undef V7986 -#define V7986 (V + 30778) - 0x110b, 0x116f, 0x11c1, 0, -#undef V7987 -#define V7987 (V + 30782) - 0x110b, 0x116f, 0x11c2, 0, -#undef V7988 -#define V7988 (V + 30786) - 0x110b, 0x1170, 0, -#undef V7989 -#define V7989 (V + 30789) - 0x110b, 0x1170, 0x11a8, 0, -#undef V7990 -#define V7990 (V + 30793) - 0x110b, 0x1170, 0x11a9, 0, -#undef V7991 -#define V7991 (V + 30797) - 0x110b, 0x1170, 0x11aa, 0, -#undef V7992 -#define V7992 (V + 30801) - 0x110b, 0x1170, 0x11ab, 0, -#undef V7993 -#define V7993 (V + 30805) - 0x110b, 0x1170, 0x11ac, 0, -#undef V7994 -#define V7994 (V + 30809) - 0x110b, 0x1170, 0x11ad, 0, -#undef V7995 -#define V7995 (V + 30813) - 0x110b, 0x1170, 0x11ae, 0, -#undef V7996 -#define V7996 (V + 30817) - 0x110b, 0x1170, 0x11af, 0, -#undef V7997 -#define V7997 (V + 30821) - 0x110b, 0x1170, 0x11b0, 0, -#undef V7998 -#define V7998 (V + 30825) - 0x110b, 0x1170, 0x11b1, 0, -#undef V7999 -#define V7999 (V + 30829) - 0x110b, 0x1170, 0x11b2, 0, -#undef V8000 -#define V8000 (V + 30833) - 0x110b, 0x1170, 0x11b3, 0, -#undef V8001 -#define V8001 (V + 30837) - 0x110b, 0x1170, 0x11b4, 0, -#undef V8002 -#define V8002 (V + 30841) - 0x110b, 0x1170, 0x11b5, 0, -#undef V8003 -#define V8003 (V + 30845) - 0x110b, 0x1170, 0x11b6, 0, -#undef V8004 -#define V8004 (V + 30849) - 0x110b, 0x1170, 0x11b7, 0, -#undef V8005 -#define V8005 (V + 30853) - 0x110b, 0x1170, 0x11b8, 0, -#undef V8006 -#define V8006 (V + 30857) - 0x110b, 0x1170, 0x11b9, 0, -#undef V8007 -#define V8007 (V + 30861) - 0x110b, 0x1170, 0x11ba, 0, -#undef V8008 -#define V8008 (V + 30865) - 0x110b, 0x1170, 0x11bb, 0, -#undef V8009 -#define V8009 (V + 30869) - 0x110b, 0x1170, 0x11bc, 0, -#undef V8010 -#define V8010 (V + 30873) - 0x110b, 0x1170, 0x11bd, 0, -#undef V8011 -#define V8011 (V + 30877) - 0x110b, 0x1170, 0x11be, 0, -#undef V8012 -#define V8012 (V + 30881) - 0x110b, 0x1170, 0x11bf, 0, -#undef V8013 -#define V8013 (V + 30885) - 0x110b, 0x1170, 0x11c0, 0, -#undef V8014 -#define V8014 (V + 30889) - 0x110b, 0x1170, 0x11c1, 0, -#undef V8015 -#define V8015 (V + 30893) - 0x110b, 0x1170, 0x11c2, 0, -#undef V8016 -#define V8016 (V + 30897) - 0x110b, 0x1171, 0, -#undef V8017 -#define V8017 (V + 30900) - 0x110b, 0x1171, 0x11a8, 0, -#undef V8018 -#define V8018 (V + 30904) - 0x110b, 0x1171, 0x11a9, 0, -#undef V8019 -#define V8019 (V + 30908) - 0x110b, 0x1171, 0x11aa, 0, -#undef V8020 -#define V8020 (V + 30912) - 0x110b, 0x1171, 0x11ab, 0, -#undef V8021 -#define V8021 (V + 30916) - 0x110b, 0x1171, 0x11ac, 0, -#undef V8022 -#define V8022 (V + 30920) - 0x110b, 0x1171, 0x11ad, 0, -#undef V8023 -#define V8023 (V + 30924) - 0x110b, 0x1171, 0x11ae, 0, -#undef V8024 -#define V8024 (V + 30928) - 0x110b, 0x1171, 0x11af, 0, -#undef V8025 -#define V8025 (V + 30932) - 0x110b, 0x1171, 0x11b0, 0, -#undef V8026 -#define V8026 (V + 30936) - 0x110b, 0x1171, 0x11b1, 0, -#undef V8027 -#define V8027 (V + 30940) - 0x110b, 0x1171, 0x11b2, 0, -#undef V8028 -#define V8028 (V + 30944) - 0x110b, 0x1171, 0x11b3, 0, -#undef V8029 -#define V8029 (V + 30948) - 0x110b, 0x1171, 0x11b4, 0, -#undef V8030 -#define V8030 (V + 30952) - 0x110b, 0x1171, 0x11b5, 0, -#undef V8031 -#define V8031 (V + 30956) - 0x110b, 0x1171, 0x11b6, 0, -#undef V8032 -#define V8032 (V + 30960) - 0x110b, 0x1171, 0x11b7, 0, -#undef V8033 -#define V8033 (V + 30964) - 0x110b, 0x1171, 0x11b8, 0, -#undef V8034 -#define V8034 (V + 30968) - 0x110b, 0x1171, 0x11b9, 0, -#undef V8035 -#define V8035 (V + 30972) - 0x110b, 0x1171, 0x11ba, 0, -#undef V8036 -#define V8036 (V + 30976) - 0x110b, 0x1171, 0x11bb, 0, -#undef V8037 -#define V8037 (V + 30980) - 0x110b, 0x1171, 0x11bc, 0, -#undef V8038 -#define V8038 (V + 30984) - 0x110b, 0x1171, 0x11bd, 0, -#undef V8039 -#define V8039 (V + 30988) - 0x110b, 0x1171, 0x11be, 0, -#undef V8040 -#define V8040 (V + 30992) - 0x110b, 0x1171, 0x11bf, 0, -#undef V8041 -#define V8041 (V + 30996) - 0x110b, 0x1171, 0x11c0, 0, -#undef V8042 -#define V8042 (V + 31000) - 0x110b, 0x1171, 0x11c1, 0, -#undef V8043 -#define V8043 (V + 31004) - 0x110b, 0x1171, 0x11c2, 0, -#undef V8044 -#define V8044 (V + 31008) - 0x110b, 0x1172, 0, -#undef V8045 -#define V8045 (V + 31011) - 0x110b, 0x1172, 0x11a8, 0, -#undef V8046 -#define V8046 (V + 31015) - 0x110b, 0x1172, 0x11a9, 0, -#undef V8047 -#define V8047 (V + 31019) - 0x110b, 0x1172, 0x11aa, 0, -#undef V8048 -#define V8048 (V + 31023) - 0x110b, 0x1172, 0x11ab, 0, -#undef V8049 -#define V8049 (V + 31027) - 0x110b, 0x1172, 0x11ac, 0, -#undef V8050 -#define V8050 (V + 31031) - 0x110b, 0x1172, 0x11ad, 0, -#undef V8051 -#define V8051 (V + 31035) - 0x110b, 0x1172, 0x11ae, 0, -#undef V8052 -#define V8052 (V + 31039) - 0x110b, 0x1172, 0x11af, 0, -#undef V8053 -#define V8053 (V + 31043) - 0x110b, 0x1172, 0x11b0, 0, -#undef V8054 -#define V8054 (V + 31047) - 0x110b, 0x1172, 0x11b1, 0, -#undef V8055 -#define V8055 (V + 31051) - 0x110b, 0x1172, 0x11b2, 0, -#undef V8056 -#define V8056 (V + 31055) - 0x110b, 0x1172, 0x11b3, 0, -#undef V8057 -#define V8057 (V + 31059) - 0x110b, 0x1172, 0x11b4, 0, -#undef V8058 -#define V8058 (V + 31063) - 0x110b, 0x1172, 0x11b5, 0, -#undef V8059 -#define V8059 (V + 31067) - 0x110b, 0x1172, 0x11b6, 0, -#undef V8060 -#define V8060 (V + 31071) - 0x110b, 0x1172, 0x11b7, 0, -#undef V8061 -#define V8061 (V + 31075) - 0x110b, 0x1172, 0x11b8, 0, -#undef V8062 -#define V8062 (V + 31079) - 0x110b, 0x1172, 0x11b9, 0, -#undef V8063 -#define V8063 (V + 31083) - 0x110b, 0x1172, 0x11ba, 0, -#undef V8064 -#define V8064 (V + 31087) - 0x110b, 0x1172, 0x11bb, 0, -#undef V8065 -#define V8065 (V + 31091) - 0x110b, 0x1172, 0x11bc, 0, -#undef V8066 -#define V8066 (V + 31095) - 0x110b, 0x1172, 0x11bd, 0, -#undef V8067 -#define V8067 (V + 31099) - 0x110b, 0x1172, 0x11be, 0, -#undef V8068 -#define V8068 (V + 31103) - 0x110b, 0x1172, 0x11bf, 0, -#undef V8069 -#define V8069 (V + 31107) - 0x110b, 0x1172, 0x11c0, 0, -#undef V8070 -#define V8070 (V + 31111) - 0x110b, 0x1172, 0x11c1, 0, -#undef V8071 -#define V8071 (V + 31115) - 0x110b, 0x1172, 0x11c2, 0, -#undef V8072 -#define V8072 (V + 31119) - 0x110b, 0x1173, 0, -#undef V8073 -#define V8073 (V + 31122) - 0x110b, 0x1173, 0x11a8, 0, -#undef V8074 -#define V8074 (V + 31126) - 0x110b, 0x1173, 0x11a9, 0, -#undef V8075 -#define V8075 (V + 31130) - 0x110b, 0x1173, 0x11aa, 0, -#undef V8076 -#define V8076 (V + 31134) - 0x110b, 0x1173, 0x11ab, 0, -#undef V8077 -#define V8077 (V + 31138) - 0x110b, 0x1173, 0x11ac, 0, -#undef V8078 -#define V8078 (V + 31142) - 0x110b, 0x1173, 0x11ad, 0, -#undef V8079 -#define V8079 (V + 31146) - 0x110b, 0x1173, 0x11ae, 0, -#undef V8080 -#define V8080 (V + 31150) - 0x110b, 0x1173, 0x11af, 0, -#undef V8081 -#define V8081 (V + 31154) - 0x110b, 0x1173, 0x11b0, 0, -#undef V8082 -#define V8082 (V + 31158) - 0x110b, 0x1173, 0x11b1, 0, -#undef V8083 -#define V8083 (V + 31162) - 0x110b, 0x1173, 0x11b2, 0, -#undef V8084 -#define V8084 (V + 31166) - 0x110b, 0x1173, 0x11b3, 0, -#undef V8085 -#define V8085 (V + 31170) - 0x110b, 0x1173, 0x11b4, 0, -#undef V8086 -#define V8086 (V + 31174) - 0x110b, 0x1173, 0x11b5, 0, -#undef V8087 -#define V8087 (V + 31178) - 0x110b, 0x1173, 0x11b6, 0, -#undef V8088 -#define V8088 (V + 31182) - 0x110b, 0x1173, 0x11b7, 0, -#undef V8089 -#define V8089 (V + 31186) - 0x110b, 0x1173, 0x11b8, 0, -#undef V8090 -#define V8090 (V + 31190) - 0x110b, 0x1173, 0x11b9, 0, -#undef V8091 -#define V8091 (V + 31194) - 0x110b, 0x1173, 0x11ba, 0, -#undef V8092 -#define V8092 (V + 31198) - 0x110b, 0x1173, 0x11bb, 0, -#undef V8093 -#define V8093 (V + 31202) - 0x110b, 0x1173, 0x11bc, 0, -#undef V8094 -#define V8094 (V + 31206) - 0x110b, 0x1173, 0x11bd, 0, -#undef V8095 -#define V8095 (V + 31210) - 0x110b, 0x1173, 0x11be, 0, -#undef V8096 -#define V8096 (V + 31214) - 0x110b, 0x1173, 0x11bf, 0, -#undef V8097 -#define V8097 (V + 31218) - 0x110b, 0x1173, 0x11c0, 0, -#undef V8098 -#define V8098 (V + 31222) - 0x110b, 0x1173, 0x11c1, 0, -#undef V8099 -#define V8099 (V + 31226) - 0x110b, 0x1173, 0x11c2, 0, -#undef V8100 -#define V8100 (V + 31230) - 0x110b, 0x1174, 0, -#undef V8101 -#define V8101 (V + 31233) - 0x110b, 0x1174, 0x11a8, 0, -#undef V8102 -#define V8102 (V + 31237) - 0x110b, 0x1174, 0x11a9, 0, -#undef V8103 -#define V8103 (V + 31241) - 0x110b, 0x1174, 0x11aa, 0, -#undef V8104 -#define V8104 (V + 31245) - 0x110b, 0x1174, 0x11ab, 0, -#undef V8105 -#define V8105 (V + 31249) - 0x110b, 0x1174, 0x11ac, 0, -#undef V8106 -#define V8106 (V + 31253) - 0x110b, 0x1174, 0x11ad, 0, -#undef V8107 -#define V8107 (V + 31257) - 0x110b, 0x1174, 0x11ae, 0, -#undef V8108 -#define V8108 (V + 31261) - 0x110b, 0x1174, 0x11af, 0, -#undef V8109 -#define V8109 (V + 31265) - 0x110b, 0x1174, 0x11b0, 0, -#undef V8110 -#define V8110 (V + 31269) - 0x110b, 0x1174, 0x11b1, 0, -#undef V8111 -#define V8111 (V + 31273) - 0x110b, 0x1174, 0x11b2, 0, -#undef V8112 -#define V8112 (V + 31277) - 0x110b, 0x1174, 0x11b3, 0, -#undef V8113 -#define V8113 (V + 31281) - 0x110b, 0x1174, 0x11b4, 0, -#undef V8114 -#define V8114 (V + 31285) - 0x110b, 0x1174, 0x11b5, 0, -#undef V8115 -#define V8115 (V + 31289) - 0x110b, 0x1174, 0x11b6, 0, -#undef V8116 -#define V8116 (V + 31293) - 0x110b, 0x1174, 0x11b7, 0, -#undef V8117 -#define V8117 (V + 31297) - 0x110b, 0x1174, 0x11b8, 0, -#undef V8118 -#define V8118 (V + 31301) - 0x110b, 0x1174, 0x11b9, 0, -#undef V8119 -#define V8119 (V + 31305) - 0x110b, 0x1174, 0x11ba, 0, -#undef V8120 -#define V8120 (V + 31309) - 0x110b, 0x1174, 0x11bb, 0, -#undef V8121 -#define V8121 (V + 31313) - 0x110b, 0x1174, 0x11bc, 0, -#undef V8122 -#define V8122 (V + 31317) - 0x110b, 0x1174, 0x11bd, 0, -#undef V8123 -#define V8123 (V + 31321) - 0x110b, 0x1174, 0x11be, 0, -#undef V8124 -#define V8124 (V + 31325) - 0x110b, 0x1174, 0x11bf, 0, -#undef V8125 -#define V8125 (V + 31329) - 0x110b, 0x1174, 0x11c0, 0, -#undef V8126 -#define V8126 (V + 31333) - 0x110b, 0x1174, 0x11c1, 0, -#undef V8127 -#define V8127 (V + 31337) - 0x110b, 0x1174, 0x11c2, 0, -#undef V8128 -#define V8128 (V + 31341) - 0x110b, 0x1175, 0, -#undef V8129 -#define V8129 (V + 31344) - 0x110b, 0x1175, 0x11a8, 0, -#undef V8130 -#define V8130 (V + 31348) - 0x110b, 0x1175, 0x11a9, 0, -#undef V8131 -#define V8131 (V + 31352) - 0x110b, 0x1175, 0x11aa, 0, -#undef V8132 -#define V8132 (V + 31356) - 0x110b, 0x1175, 0x11ab, 0, -#undef V8133 -#define V8133 (V + 31360) - 0x110b, 0x1175, 0x11ac, 0, -#undef V8134 -#define V8134 (V + 31364) - 0x110b, 0x1175, 0x11ad, 0, -#undef V8135 -#define V8135 (V + 31368) - 0x110b, 0x1175, 0x11ae, 0, -#undef V8136 -#define V8136 (V + 31372) - 0x110b, 0x1175, 0x11af, 0, -#undef V8137 -#define V8137 (V + 31376) - 0x110b, 0x1175, 0x11b0, 0, -#undef V8138 -#define V8138 (V + 31380) - 0x110b, 0x1175, 0x11b1, 0, -#undef V8139 -#define V8139 (V + 31384) - 0x110b, 0x1175, 0x11b2, 0, -#undef V8140 -#define V8140 (V + 31388) - 0x110b, 0x1175, 0x11b3, 0, -#undef V8141 -#define V8141 (V + 31392) - 0x110b, 0x1175, 0x11b4, 0, -#undef V8142 -#define V8142 (V + 31396) - 0x110b, 0x1175, 0x11b5, 0, -#undef V8143 -#define V8143 (V + 31400) - 0x110b, 0x1175, 0x11b6, 0, -#undef V8144 -#define V8144 (V + 31404) - 0x110b, 0x1175, 0x11b7, 0, -#undef V8145 -#define V8145 (V + 31408) - 0x110b, 0x1175, 0x11b8, 0, -#undef V8146 -#define V8146 (V + 31412) - 0x110b, 0x1175, 0x11b9, 0, -#undef V8147 -#define V8147 (V + 31416) - 0x110b, 0x1175, 0x11ba, 0, -#undef V8148 -#define V8148 (V + 31420) - 0x110b, 0x1175, 0x11bb, 0, -#undef V8149 -#define V8149 (V + 31424) - 0x110b, 0x1175, 0x11bc, 0, -#undef V8150 -#define V8150 (V + 31428) - 0x110b, 0x1175, 0x11bd, 0, -#undef V8151 -#define V8151 (V + 31432) - 0x110b, 0x1175, 0x11be, 0, -#undef V8152 -#define V8152 (V + 31436) - 0x110b, 0x1175, 0x11bf, 0, -#undef V8153 -#define V8153 (V + 31440) - 0x110b, 0x1175, 0x11c0, 0, -#undef V8154 -#define V8154 (V + 31444) - 0x110b, 0x1175, 0x11c1, 0, -#undef V8155 -#define V8155 (V + 31448) - 0x110b, 0x1175, 0x11c2, 0, -#undef V8156 -#define V8156 (V + 31452) - 0x110c, 0x1161, 0, -#undef V8157 -#define V8157 (V + 31455) - 0x110c, 0x1161, 0x11a8, 0, -#undef V8158 -#define V8158 (V + 31459) - 0x110c, 0x1161, 0x11a9, 0, -#undef V8159 -#define V8159 (V + 31463) - 0x110c, 0x1161, 0x11aa, 0, -#undef V8160 -#define V8160 (V + 31467) - 0x110c, 0x1161, 0x11ab, 0, -#undef V8161 -#define V8161 (V + 31471) - 0x110c, 0x1161, 0x11ac, 0, -#undef V8162 -#define V8162 (V + 31475) - 0x110c, 0x1161, 0x11ad, 0, -#undef V8163 -#define V8163 (V + 31479) - 0x110c, 0x1161, 0x11ae, 0, -#undef V8164 -#define V8164 (V + 31483) - 0x110c, 0x1161, 0x11af, 0, -#undef V8165 -#define V8165 (V + 31487) - 0x110c, 0x1161, 0x11b0, 0, -#undef V8166 -#define V8166 (V + 31491) - 0x110c, 0x1161, 0x11b1, 0, -#undef V8167 -#define V8167 (V + 31495) - 0x110c, 0x1161, 0x11b2, 0, -#undef V8168 -#define V8168 (V + 31499) - 0x110c, 0x1161, 0x11b3, 0, -#undef V8169 -#define V8169 (V + 31503) - 0x110c, 0x1161, 0x11b4, 0, -#undef V8170 -#define V8170 (V + 31507) - 0x110c, 0x1161, 0x11b5, 0, -#undef V8171 -#define V8171 (V + 31511) - 0x110c, 0x1161, 0x11b6, 0, -#undef V8172 -#define V8172 (V + 31515) - 0x110c, 0x1161, 0x11b7, 0, -#undef V8173 -#define V8173 (V + 31519) - 0x110c, 0x1161, 0x11b8, 0, -#undef V8174 -#define V8174 (V + 31523) - 0x110c, 0x1161, 0x11b9, 0, -#undef V8175 -#define V8175 (V + 31527) - 0x110c, 0x1161, 0x11ba, 0, -#undef V8176 -#define V8176 (V + 31531) - 0x110c, 0x1161, 0x11bb, 0, -#undef V8177 -#define V8177 (V + 31535) - 0x110c, 0x1161, 0x11bc, 0, -#undef V8178 -#define V8178 (V + 31539) - 0x110c, 0x1161, 0x11bd, 0, -#undef V8179 -#define V8179 (V + 31543) - 0x110c, 0x1161, 0x11be, 0, -#undef V8180 -#define V8180 (V + 31547) - 0x110c, 0x1161, 0x11bf, 0, -#undef V8181 -#define V8181 (V + 31551) - 0x110c, 0x1161, 0x11c0, 0, -#undef V8182 -#define V8182 (V + 31555) - 0x110c, 0x1161, 0x11c1, 0, -#undef V8183 -#define V8183 (V + 31559) - 0x110c, 0x1161, 0x11c2, 0, -#undef V8184 -#define V8184 (V + 31563) - 0x110c, 0x1162, 0, -#undef V8185 -#define V8185 (V + 31566) - 0x110c, 0x1162, 0x11a8, 0, -#undef V8186 -#define V8186 (V + 31570) - 0x110c, 0x1162, 0x11a9, 0, -#undef V8187 -#define V8187 (V + 31574) - 0x110c, 0x1162, 0x11aa, 0, -#undef V8188 -#define V8188 (V + 31578) - 0x110c, 0x1162, 0x11ab, 0, -#undef V8189 -#define V8189 (V + 31582) - 0x110c, 0x1162, 0x11ac, 0, -#undef V8190 -#define V8190 (V + 31586) - 0x110c, 0x1162, 0x11ad, 0, -#undef V8191 -#define V8191 (V + 31590) - 0x110c, 0x1162, 0x11ae, 0, -#undef V8192 -#define V8192 (V + 31594) - 0x110c, 0x1162, 0x11af, 0, -#undef V8193 -#define V8193 (V + 31598) - 0x110c, 0x1162, 0x11b0, 0, -#undef V8194 -#define V8194 (V + 31602) - 0x110c, 0x1162, 0x11b1, 0, -#undef V8195 -#define V8195 (V + 31606) - 0x110c, 0x1162, 0x11b2, 0, -#undef V8196 -#define V8196 (V + 31610) - 0x110c, 0x1162, 0x11b3, 0, -#undef V8197 -#define V8197 (V + 31614) - 0x110c, 0x1162, 0x11b4, 0, -#undef V8198 -#define V8198 (V + 31618) - 0x110c, 0x1162, 0x11b5, 0, -#undef V8199 -#define V8199 (V + 31622) - 0x110c, 0x1162, 0x11b6, 0, -#undef V8200 -#define V8200 (V + 31626) - 0x110c, 0x1162, 0x11b7, 0, -#undef V8201 -#define V8201 (V + 31630) - 0x110c, 0x1162, 0x11b8, 0, -#undef V8202 -#define V8202 (V + 31634) - 0x110c, 0x1162, 0x11b9, 0, -#undef V8203 -#define V8203 (V + 31638) - 0x110c, 0x1162, 0x11ba, 0, -#undef V8204 -#define V8204 (V + 31642) - 0x110c, 0x1162, 0x11bb, 0, -#undef V8205 -#define V8205 (V + 31646) - 0x110c, 0x1162, 0x11bc, 0, -#undef V8206 -#define V8206 (V + 31650) - 0x110c, 0x1162, 0x11bd, 0, -#undef V8207 -#define V8207 (V + 31654) - 0x110c, 0x1162, 0x11be, 0, -#undef V8208 -#define V8208 (V + 31658) - 0x110c, 0x1162, 0x11bf, 0, -#undef V8209 -#define V8209 (V + 31662) - 0x110c, 0x1162, 0x11c0, 0, -#undef V8210 -#define V8210 (V + 31666) - 0x110c, 0x1162, 0x11c1, 0, -#undef V8211 -#define V8211 (V + 31670) - 0x110c, 0x1162, 0x11c2, 0, -#undef V8212 -#define V8212 (V + 31674) - 0x110c, 0x1163, 0, -#undef V8213 -#define V8213 (V + 31677) - 0x110c, 0x1163, 0x11a8, 0, -#undef V8214 -#define V8214 (V + 31681) - 0x110c, 0x1163, 0x11a9, 0, -#undef V8215 -#define V8215 (V + 31685) - 0x110c, 0x1163, 0x11aa, 0, -#undef V8216 -#define V8216 (V + 31689) - 0x110c, 0x1163, 0x11ab, 0, -#undef V8217 -#define V8217 (V + 31693) - 0x110c, 0x1163, 0x11ac, 0, -#undef V8218 -#define V8218 (V + 31697) - 0x110c, 0x1163, 0x11ad, 0, -#undef V8219 -#define V8219 (V + 31701) - 0x110c, 0x1163, 0x11ae, 0, -#undef V8220 -#define V8220 (V + 31705) - 0x110c, 0x1163, 0x11af, 0, -#undef V8221 -#define V8221 (V + 31709) - 0x110c, 0x1163, 0x11b0, 0, -#undef V8222 -#define V8222 (V + 31713) - 0x110c, 0x1163, 0x11b1, 0, -#undef V8223 -#define V8223 (V + 31717) - 0x110c, 0x1163, 0x11b2, 0, -#undef V8224 -#define V8224 (V + 31721) - 0x110c, 0x1163, 0x11b3, 0, -#undef V8225 -#define V8225 (V + 31725) - 0x110c, 0x1163, 0x11b4, 0, -#undef V8226 -#define V8226 (V + 31729) - 0x110c, 0x1163, 0x11b5, 0, -#undef V8227 -#define V8227 (V + 31733) - 0x110c, 0x1163, 0x11b6, 0, -#undef V8228 -#define V8228 (V + 31737) - 0x110c, 0x1163, 0x11b7, 0, -#undef V8229 -#define V8229 (V + 31741) - 0x110c, 0x1163, 0x11b8, 0, -#undef V8230 -#define V8230 (V + 31745) - 0x110c, 0x1163, 0x11b9, 0, -#undef V8231 -#define V8231 (V + 31749) - 0x110c, 0x1163, 0x11ba, 0, -#undef V8232 -#define V8232 (V + 31753) - 0x110c, 0x1163, 0x11bb, 0, -#undef V8233 -#define V8233 (V + 31757) - 0x110c, 0x1163, 0x11bc, 0, -#undef V8234 -#define V8234 (V + 31761) - 0x110c, 0x1163, 0x11bd, 0, -#undef V8235 -#define V8235 (V + 31765) - 0x110c, 0x1163, 0x11be, 0, -#undef V8236 -#define V8236 (V + 31769) - 0x110c, 0x1163, 0x11bf, 0, -#undef V8237 -#define V8237 (V + 31773) - 0x110c, 0x1163, 0x11c0, 0, -#undef V8238 -#define V8238 (V + 31777) - 0x110c, 0x1163, 0x11c1, 0, -#undef V8239 -#define V8239 (V + 31781) - 0x110c, 0x1163, 0x11c2, 0, -#undef V8240 -#define V8240 (V + 31785) - 0x110c, 0x1164, 0, -#undef V8241 -#define V8241 (V + 31788) - 0x110c, 0x1164, 0x11a8, 0, -#undef V8242 -#define V8242 (V + 31792) - 0x110c, 0x1164, 0x11a9, 0, -#undef V8243 -#define V8243 (V + 31796) - 0x110c, 0x1164, 0x11aa, 0, -#undef V8244 -#define V8244 (V + 31800) - 0x110c, 0x1164, 0x11ab, 0, -#undef V8245 -#define V8245 (V + 31804) - 0x110c, 0x1164, 0x11ac, 0, -#undef V8246 -#define V8246 (V + 31808) - 0x110c, 0x1164, 0x11ad, 0, -#undef V8247 -#define V8247 (V + 31812) - 0x110c, 0x1164, 0x11ae, 0, -#undef V8248 -#define V8248 (V + 31816) - 0x110c, 0x1164, 0x11af, 0, -#undef V8249 -#define V8249 (V + 31820) - 0x110c, 0x1164, 0x11b0, 0, -#undef V8250 -#define V8250 (V + 31824) - 0x110c, 0x1164, 0x11b1, 0, -#undef V8251 -#define V8251 (V + 31828) - 0x110c, 0x1164, 0x11b2, 0, -#undef V8252 -#define V8252 (V + 31832) - 0x110c, 0x1164, 0x11b3, 0, -#undef V8253 -#define V8253 (V + 31836) - 0x110c, 0x1164, 0x11b4, 0, -#undef V8254 -#define V8254 (V + 31840) - 0x110c, 0x1164, 0x11b5, 0, -#undef V8255 -#define V8255 (V + 31844) - 0x110c, 0x1164, 0x11b6, 0, -#undef V8256 -#define V8256 (V + 31848) - 0x110c, 0x1164, 0x11b7, 0, -#undef V8257 -#define V8257 (V + 31852) - 0x110c, 0x1164, 0x11b8, 0, -#undef V8258 -#define V8258 (V + 31856) - 0x110c, 0x1164, 0x11b9, 0, -#undef V8259 -#define V8259 (V + 31860) - 0x110c, 0x1164, 0x11ba, 0, -#undef V8260 -#define V8260 (V + 31864) - 0x110c, 0x1164, 0x11bb, 0, -#undef V8261 -#define V8261 (V + 31868) - 0x110c, 0x1164, 0x11bc, 0, -#undef V8262 -#define V8262 (V + 31872) - 0x110c, 0x1164, 0x11bd, 0, -#undef V8263 -#define V8263 (V + 31876) - 0x110c, 0x1164, 0x11be, 0, -#undef V8264 -#define V8264 (V + 31880) - 0x110c, 0x1164, 0x11bf, 0, -#undef V8265 -#define V8265 (V + 31884) - 0x110c, 0x1164, 0x11c0, 0, -#undef V8266 -#define V8266 (V + 31888) - 0x110c, 0x1164, 0x11c1, 0, -#undef V8267 -#define V8267 (V + 31892) - 0x110c, 0x1164, 0x11c2, 0, -#undef V8268 -#define V8268 (V + 31896) - 0x110c, 0x1165, 0, -#undef V8269 -#define V8269 (V + 31899) - 0x110c, 0x1165, 0x11a8, 0, -#undef V8270 -#define V8270 (V + 31903) - 0x110c, 0x1165, 0x11a9, 0, -#undef V8271 -#define V8271 (V + 31907) - 0x110c, 0x1165, 0x11aa, 0, -#undef V8272 -#define V8272 (V + 31911) - 0x110c, 0x1165, 0x11ab, 0, -#undef V8273 -#define V8273 (V + 31915) - 0x110c, 0x1165, 0x11ac, 0, -#undef V8274 -#define V8274 (V + 31919) - 0x110c, 0x1165, 0x11ad, 0, -#undef V8275 -#define V8275 (V + 31923) - 0x110c, 0x1165, 0x11ae, 0, -#undef V8276 -#define V8276 (V + 31927) - 0x110c, 0x1165, 0x11af, 0, -#undef V8277 -#define V8277 (V + 31931) - 0x110c, 0x1165, 0x11b0, 0, -#undef V8278 -#define V8278 (V + 31935) - 0x110c, 0x1165, 0x11b1, 0, -#undef V8279 -#define V8279 (V + 31939) - 0x110c, 0x1165, 0x11b2, 0, -#undef V8280 -#define V8280 (V + 31943) - 0x110c, 0x1165, 0x11b3, 0, -#undef V8281 -#define V8281 (V + 31947) - 0x110c, 0x1165, 0x11b4, 0, -#undef V8282 -#define V8282 (V + 31951) - 0x110c, 0x1165, 0x11b5, 0, -#undef V8283 -#define V8283 (V + 31955) - 0x110c, 0x1165, 0x11b6, 0, -#undef V8284 -#define V8284 (V + 31959) - 0x110c, 0x1165, 0x11b7, 0, -#undef V8285 -#define V8285 (V + 31963) - 0x110c, 0x1165, 0x11b8, 0, -#undef V8286 -#define V8286 (V + 31967) - 0x110c, 0x1165, 0x11b9, 0, -#undef V8287 -#define V8287 (V + 31971) - 0x110c, 0x1165, 0x11ba, 0, -#undef V8288 -#define V8288 (V + 31975) - 0x110c, 0x1165, 0x11bb, 0, -#undef V8289 -#define V8289 (V + 31979) - 0x110c, 0x1165, 0x11bc, 0, -#undef V8290 -#define V8290 (V + 31983) - 0x110c, 0x1165, 0x11bd, 0, -#undef V8291 -#define V8291 (V + 31987) - 0x110c, 0x1165, 0x11be, 0, -#undef V8292 -#define V8292 (V + 31991) - 0x110c, 0x1165, 0x11bf, 0, -#undef V8293 -#define V8293 (V + 31995) - 0x110c, 0x1165, 0x11c0, 0, -#undef V8294 -#define V8294 (V + 31999) - 0x110c, 0x1165, 0x11c1, 0, -#undef V8295 -#define V8295 (V + 32003) - 0x110c, 0x1165, 0x11c2, 0, -#undef V8296 -#define V8296 (V + 32007) - 0x110c, 0x1166, 0, -#undef V8297 -#define V8297 (V + 32010) - 0x110c, 0x1166, 0x11a8, 0, -#undef V8298 -#define V8298 (V + 32014) - 0x110c, 0x1166, 0x11a9, 0, -#undef V8299 -#define V8299 (V + 32018) - 0x110c, 0x1166, 0x11aa, 0, -#undef V8300 -#define V8300 (V + 32022) - 0x110c, 0x1166, 0x11ab, 0, -#undef V8301 -#define V8301 (V + 32026) - 0x110c, 0x1166, 0x11ac, 0, -#undef V8302 -#define V8302 (V + 32030) - 0x110c, 0x1166, 0x11ad, 0, -#undef V8303 -#define V8303 (V + 32034) - 0x110c, 0x1166, 0x11ae, 0, -#undef V8304 -#define V8304 (V + 32038) - 0x110c, 0x1166, 0x11af, 0, -#undef V8305 -#define V8305 (V + 32042) - 0x110c, 0x1166, 0x11b0, 0, -#undef V8306 -#define V8306 (V + 32046) - 0x110c, 0x1166, 0x11b1, 0, -#undef V8307 -#define V8307 (V + 32050) - 0x110c, 0x1166, 0x11b2, 0, -#undef V8308 -#define V8308 (V + 32054) - 0x110c, 0x1166, 0x11b3, 0, -#undef V8309 -#define V8309 (V + 32058) - 0x110c, 0x1166, 0x11b4, 0, -#undef V8310 -#define V8310 (V + 32062) - 0x110c, 0x1166, 0x11b5, 0, -#undef V8311 -#define V8311 (V + 32066) - 0x110c, 0x1166, 0x11b6, 0, -#undef V8312 -#define V8312 (V + 32070) - 0x110c, 0x1166, 0x11b7, 0, -#undef V8313 -#define V8313 (V + 32074) - 0x110c, 0x1166, 0x11b8, 0, -#undef V8314 -#define V8314 (V + 32078) - 0x110c, 0x1166, 0x11b9, 0, -#undef V8315 -#define V8315 (V + 32082) - 0x110c, 0x1166, 0x11ba, 0, -#undef V8316 -#define V8316 (V + 32086) - 0x110c, 0x1166, 0x11bb, 0, -#undef V8317 -#define V8317 (V + 32090) - 0x110c, 0x1166, 0x11bc, 0, -#undef V8318 -#define V8318 (V + 32094) - 0x110c, 0x1166, 0x11bd, 0, -#undef V8319 -#define V8319 (V + 32098) - 0x110c, 0x1166, 0x11be, 0, -#undef V8320 -#define V8320 (V + 32102) - 0x110c, 0x1166, 0x11bf, 0, -#undef V8321 -#define V8321 (V + 32106) - 0x110c, 0x1166, 0x11c0, 0, -#undef V8322 -#define V8322 (V + 32110) - 0x110c, 0x1166, 0x11c1, 0, -#undef V8323 -#define V8323 (V + 32114) - 0x110c, 0x1166, 0x11c2, 0, -#undef V8324 -#define V8324 (V + 32118) - 0x110c, 0x1167, 0, -#undef V8325 -#define V8325 (V + 32121) - 0x110c, 0x1167, 0x11a8, 0, -#undef V8326 -#define V8326 (V + 32125) - 0x110c, 0x1167, 0x11a9, 0, -#undef V8327 -#define V8327 (V + 32129) - 0x110c, 0x1167, 0x11aa, 0, -#undef V8328 -#define V8328 (V + 32133) - 0x110c, 0x1167, 0x11ab, 0, -#undef V8329 -#define V8329 (V + 32137) - 0x110c, 0x1167, 0x11ac, 0, -#undef V8330 -#define V8330 (V + 32141) - 0x110c, 0x1167, 0x11ad, 0, -#undef V8331 -#define V8331 (V + 32145) - 0x110c, 0x1167, 0x11ae, 0, -#undef V8332 -#define V8332 (V + 32149) - 0x110c, 0x1167, 0x11af, 0, -#undef V8333 -#define V8333 (V + 32153) - 0x110c, 0x1167, 0x11b0, 0, -#undef V8334 -#define V8334 (V + 32157) - 0x110c, 0x1167, 0x11b1, 0, -#undef V8335 -#define V8335 (V + 32161) - 0x110c, 0x1167, 0x11b2, 0, -#undef V8336 -#define V8336 (V + 32165) - 0x110c, 0x1167, 0x11b3, 0, -#undef V8337 -#define V8337 (V + 32169) - 0x110c, 0x1167, 0x11b4, 0, -#undef V8338 -#define V8338 (V + 32173) - 0x110c, 0x1167, 0x11b5, 0, -#undef V8339 -#define V8339 (V + 32177) - 0x110c, 0x1167, 0x11b6, 0, -#undef V8340 -#define V8340 (V + 32181) - 0x110c, 0x1167, 0x11b7, 0, -#undef V8341 -#define V8341 (V + 32185) - 0x110c, 0x1167, 0x11b8, 0, -#undef V8342 -#define V8342 (V + 32189) - 0x110c, 0x1167, 0x11b9, 0, -#undef V8343 -#define V8343 (V + 32193) - 0x110c, 0x1167, 0x11ba, 0, -#undef V8344 -#define V8344 (V + 32197) - 0x110c, 0x1167, 0x11bb, 0, -#undef V8345 -#define V8345 (V + 32201) - 0x110c, 0x1167, 0x11bc, 0, -#undef V8346 -#define V8346 (V + 32205) - 0x110c, 0x1167, 0x11bd, 0, -#undef V8347 -#define V8347 (V + 32209) - 0x110c, 0x1167, 0x11be, 0, -#undef V8348 -#define V8348 (V + 32213) - 0x110c, 0x1167, 0x11bf, 0, -#undef V8349 -#define V8349 (V + 32217) - 0x110c, 0x1167, 0x11c0, 0, -#undef V8350 -#define V8350 (V + 32221) - 0x110c, 0x1167, 0x11c1, 0, -#undef V8351 -#define V8351 (V + 32225) - 0x110c, 0x1167, 0x11c2, 0, -#undef V8352 -#define V8352 (V + 32229) - 0x110c, 0x1168, 0, -#undef V8353 -#define V8353 (V + 32232) - 0x110c, 0x1168, 0x11a8, 0, -#undef V8354 -#define V8354 (V + 32236) - 0x110c, 0x1168, 0x11a9, 0, -#undef V8355 -#define V8355 (V + 32240) - 0x110c, 0x1168, 0x11aa, 0, -#undef V8356 -#define V8356 (V + 32244) - 0x110c, 0x1168, 0x11ab, 0, -#undef V8357 -#define V8357 (V + 32248) - 0x110c, 0x1168, 0x11ac, 0, -#undef V8358 -#define V8358 (V + 32252) - 0x110c, 0x1168, 0x11ad, 0, -#undef V8359 -#define V8359 (V + 32256) - 0x110c, 0x1168, 0x11ae, 0, -#undef V8360 -#define V8360 (V + 32260) - 0x110c, 0x1168, 0x11af, 0, -#undef V8361 -#define V8361 (V + 32264) - 0x110c, 0x1168, 0x11b0, 0, -#undef V8362 -#define V8362 (V + 32268) - 0x110c, 0x1168, 0x11b1, 0, -#undef V8363 -#define V8363 (V + 32272) - 0x110c, 0x1168, 0x11b2, 0, -#undef V8364 -#define V8364 (V + 32276) - 0x110c, 0x1168, 0x11b3, 0, -#undef V8365 -#define V8365 (V + 32280) - 0x110c, 0x1168, 0x11b4, 0, -#undef V8366 -#define V8366 (V + 32284) - 0x110c, 0x1168, 0x11b5, 0, -#undef V8367 -#define V8367 (V + 32288) - 0x110c, 0x1168, 0x11b6, 0, -#undef V8368 -#define V8368 (V + 32292) - 0x110c, 0x1168, 0x11b7, 0, -#undef V8369 -#define V8369 (V + 32296) - 0x110c, 0x1168, 0x11b8, 0, -#undef V8370 -#define V8370 (V + 32300) - 0x110c, 0x1168, 0x11b9, 0, -#undef V8371 -#define V8371 (V + 32304) - 0x110c, 0x1168, 0x11ba, 0, -#undef V8372 -#define V8372 (V + 32308) - 0x110c, 0x1168, 0x11bb, 0, -#undef V8373 -#define V8373 (V + 32312) - 0x110c, 0x1168, 0x11bc, 0, -#undef V8374 -#define V8374 (V + 32316) - 0x110c, 0x1168, 0x11bd, 0, -#undef V8375 -#define V8375 (V + 32320) - 0x110c, 0x1168, 0x11be, 0, -#undef V8376 -#define V8376 (V + 32324) - 0x110c, 0x1168, 0x11bf, 0, -#undef V8377 -#define V8377 (V + 32328) - 0x110c, 0x1168, 0x11c0, 0, -#undef V8378 -#define V8378 (V + 32332) - 0x110c, 0x1168, 0x11c1, 0, -#undef V8379 -#define V8379 (V + 32336) - 0x110c, 0x1168, 0x11c2, 0, -#undef V8380 -#define V8380 (V + 32340) - 0x110c, 0x1169, 0, -#undef V8381 -#define V8381 (V + 32343) - 0x110c, 0x1169, 0x11a8, 0, -#undef V8382 -#define V8382 (V + 32347) - 0x110c, 0x1169, 0x11a9, 0, -#undef V8383 -#define V8383 (V + 32351) - 0x110c, 0x1169, 0x11aa, 0, -#undef V8384 -#define V8384 (V + 32355) - 0x110c, 0x1169, 0x11ab, 0, -#undef V8385 -#define V8385 (V + 32359) - 0x110c, 0x1169, 0x11ac, 0, -#undef V8386 -#define V8386 (V + 32363) - 0x110c, 0x1169, 0x11ad, 0, -#undef V8387 -#define V8387 (V + 32367) - 0x110c, 0x1169, 0x11ae, 0, -#undef V8388 -#define V8388 (V + 32371) - 0x110c, 0x1169, 0x11af, 0, -#undef V8389 -#define V8389 (V + 32375) - 0x110c, 0x1169, 0x11b0, 0, -#undef V8390 -#define V8390 (V + 32379) - 0x110c, 0x1169, 0x11b1, 0, -#undef V8391 -#define V8391 (V + 32383) - 0x110c, 0x1169, 0x11b2, 0, -#undef V8392 -#define V8392 (V + 32387) - 0x110c, 0x1169, 0x11b3, 0, -#undef V8393 -#define V8393 (V + 32391) - 0x110c, 0x1169, 0x11b4, 0, -#undef V8394 -#define V8394 (V + 32395) - 0x110c, 0x1169, 0x11b5, 0, -#undef V8395 -#define V8395 (V + 32399) - 0x110c, 0x1169, 0x11b6, 0, -#undef V8396 -#define V8396 (V + 32403) - 0x110c, 0x1169, 0x11b7, 0, -#undef V8397 -#define V8397 (V + 32407) - 0x110c, 0x1169, 0x11b8, 0, -#undef V8398 -#define V8398 (V + 32411) - 0x110c, 0x1169, 0x11b9, 0, -#undef V8399 -#define V8399 (V + 32415) - 0x110c, 0x1169, 0x11ba, 0, -#undef V8400 -#define V8400 (V + 32419) - 0x110c, 0x1169, 0x11bb, 0, -#undef V8401 -#define V8401 (V + 32423) - 0x110c, 0x1169, 0x11bc, 0, -#undef V8402 -#define V8402 (V + 32427) - 0x110c, 0x1169, 0x11bd, 0, -#undef V8403 -#define V8403 (V + 32431) - 0x110c, 0x1169, 0x11be, 0, -#undef V8404 -#define V8404 (V + 32435) - 0x110c, 0x1169, 0x11bf, 0, -#undef V8405 -#define V8405 (V + 32439) - 0x110c, 0x1169, 0x11c0, 0, -#undef V8406 -#define V8406 (V + 32443) - 0x110c, 0x1169, 0x11c1, 0, -#undef V8407 -#define V8407 (V + 32447) - 0x110c, 0x1169, 0x11c2, 0, -#undef V8408 -#define V8408 (V + 32451) - 0x110c, 0x116a, 0, -#undef V8409 -#define V8409 (V + 32454) - 0x110c, 0x116a, 0x11a8, 0, -#undef V8410 -#define V8410 (V + 32458) - 0x110c, 0x116a, 0x11a9, 0, -#undef V8411 -#define V8411 (V + 32462) - 0x110c, 0x116a, 0x11aa, 0, -#undef V8412 -#define V8412 (V + 32466) - 0x110c, 0x116a, 0x11ab, 0, -#undef V8413 -#define V8413 (V + 32470) - 0x110c, 0x116a, 0x11ac, 0, -#undef V8414 -#define V8414 (V + 32474) - 0x110c, 0x116a, 0x11ad, 0, -#undef V8415 -#define V8415 (V + 32478) - 0x110c, 0x116a, 0x11ae, 0, -#undef V8416 -#define V8416 (V + 32482) - 0x110c, 0x116a, 0x11af, 0, -#undef V8417 -#define V8417 (V + 32486) - 0x110c, 0x116a, 0x11b0, 0, -#undef V8418 -#define V8418 (V + 32490) - 0x110c, 0x116a, 0x11b1, 0, -#undef V8419 -#define V8419 (V + 32494) - 0x110c, 0x116a, 0x11b2, 0, -#undef V8420 -#define V8420 (V + 32498) - 0x110c, 0x116a, 0x11b3, 0, -#undef V8421 -#define V8421 (V + 32502) - 0x110c, 0x116a, 0x11b4, 0, -#undef V8422 -#define V8422 (V + 32506) - 0x110c, 0x116a, 0x11b5, 0, -#undef V8423 -#define V8423 (V + 32510) - 0x110c, 0x116a, 0x11b6, 0, -#undef V8424 -#define V8424 (V + 32514) - 0x110c, 0x116a, 0x11b7, 0, -#undef V8425 -#define V8425 (V + 32518) - 0x110c, 0x116a, 0x11b8, 0, -#undef V8426 -#define V8426 (V + 32522) - 0x110c, 0x116a, 0x11b9, 0, -#undef V8427 -#define V8427 (V + 32526) - 0x110c, 0x116a, 0x11ba, 0, -#undef V8428 -#define V8428 (V + 32530) - 0x110c, 0x116a, 0x11bb, 0, -#undef V8429 -#define V8429 (V + 32534) - 0x110c, 0x116a, 0x11bc, 0, -#undef V8430 -#define V8430 (V + 32538) - 0x110c, 0x116a, 0x11bd, 0, -#undef V8431 -#define V8431 (V + 32542) - 0x110c, 0x116a, 0x11be, 0, -#undef V8432 -#define V8432 (V + 32546) - 0x110c, 0x116a, 0x11bf, 0, -#undef V8433 -#define V8433 (V + 32550) - 0x110c, 0x116a, 0x11c0, 0, -#undef V8434 -#define V8434 (V + 32554) - 0x110c, 0x116a, 0x11c1, 0, -#undef V8435 -#define V8435 (V + 32558) - 0x110c, 0x116a, 0x11c2, 0, -#undef V8436 -#define V8436 (V + 32562) - 0x110c, 0x116b, 0, -#undef V8437 -#define V8437 (V + 32565) - 0x110c, 0x116b, 0x11a8, 0, -#undef V8438 -#define V8438 (V + 32569) - 0x110c, 0x116b, 0x11a9, 0, -#undef V8439 -#define V8439 (V + 32573) - 0x110c, 0x116b, 0x11aa, 0, -#undef V8440 -#define V8440 (V + 32577) - 0x110c, 0x116b, 0x11ab, 0, -#undef V8441 -#define V8441 (V + 32581) - 0x110c, 0x116b, 0x11ac, 0, -#undef V8442 -#define V8442 (V + 32585) - 0x110c, 0x116b, 0x11ad, 0, -#undef V8443 -#define V8443 (V + 32589) - 0x110c, 0x116b, 0x11ae, 0, -#undef V8444 -#define V8444 (V + 32593) - 0x110c, 0x116b, 0x11af, 0, -#undef V8445 -#define V8445 (V + 32597) - 0x110c, 0x116b, 0x11b0, 0, -#undef V8446 -#define V8446 (V + 32601) - 0x110c, 0x116b, 0x11b1, 0, -#undef V8447 -#define V8447 (V + 32605) - 0x110c, 0x116b, 0x11b2, 0, -#undef V8448 -#define V8448 (V + 32609) - 0x110c, 0x116b, 0x11b3, 0, -#undef V8449 -#define V8449 (V + 32613) - 0x110c, 0x116b, 0x11b4, 0, -#undef V8450 -#define V8450 (V + 32617) - 0x110c, 0x116b, 0x11b5, 0, -#undef V8451 -#define V8451 (V + 32621) - 0x110c, 0x116b, 0x11b6, 0, -#undef V8452 -#define V8452 (V + 32625) - 0x110c, 0x116b, 0x11b7, 0, -#undef V8453 -#define V8453 (V + 32629) - 0x110c, 0x116b, 0x11b8, 0, -#undef V8454 -#define V8454 (V + 32633) - 0x110c, 0x116b, 0x11b9, 0, -#undef V8455 -#define V8455 (V + 32637) - 0x110c, 0x116b, 0x11ba, 0, -#undef V8456 -#define V8456 (V + 32641) - 0x110c, 0x116b, 0x11bb, 0, -#undef V8457 -#define V8457 (V + 32645) - 0x110c, 0x116b, 0x11bc, 0, -#undef V8458 -#define V8458 (V + 32649) - 0x110c, 0x116b, 0x11bd, 0, -#undef V8459 -#define V8459 (V + 32653) - 0x110c, 0x116b, 0x11be, 0, -#undef V8460 -#define V8460 (V + 32657) - 0x110c, 0x116b, 0x11bf, 0, -#undef V8461 -#define V8461 (V + 32661) - 0x110c, 0x116b, 0x11c0, 0, -#undef V8462 -#define V8462 (V + 32665) - 0x110c, 0x116b, 0x11c1, 0, -#undef V8463 -#define V8463 (V + 32669) - 0x110c, 0x116b, 0x11c2, 0, -#undef V8464 -#define V8464 (V + 32673) - 0x110c, 0x116c, 0, -#undef V8465 -#define V8465 (V + 32676) - 0x110c, 0x116c, 0x11a8, 0, -#undef V8466 -#define V8466 (V + 32680) - 0x110c, 0x116c, 0x11a9, 0, -#undef V8467 -#define V8467 (V + 32684) - 0x110c, 0x116c, 0x11aa, 0, -#undef V8468 -#define V8468 (V + 32688) - 0x110c, 0x116c, 0x11ab, 0, -#undef V8469 -#define V8469 (V + 32692) - 0x110c, 0x116c, 0x11ac, 0, -#undef V8470 -#define V8470 (V + 32696) - 0x110c, 0x116c, 0x11ad, 0, -#undef V8471 -#define V8471 (V + 32700) - 0x110c, 0x116c, 0x11ae, 0, -#undef V8472 -#define V8472 (V + 32704) - 0x110c, 0x116c, 0x11af, 0, -#undef V8473 -#define V8473 (V + 32708) - 0x110c, 0x116c, 0x11b0, 0, -#undef V8474 -#define V8474 (V + 32712) - 0x110c, 0x116c, 0x11b1, 0, -#undef V8475 -#define V8475 (V + 32716) - 0x110c, 0x116c, 0x11b2, 0, -#undef V8476 -#define V8476 (V + 32720) - 0x110c, 0x116c, 0x11b3, 0, -#undef V8477 -#define V8477 (V + 32724) - 0x110c, 0x116c, 0x11b4, 0, -#undef V8478 -#define V8478 (V + 32728) - 0x110c, 0x116c, 0x11b5, 0, -#undef V8479 -#define V8479 (V + 32732) - 0x110c, 0x116c, 0x11b6, 0, -#undef V8480 -#define V8480 (V + 32736) - 0x110c, 0x116c, 0x11b7, 0, -#undef V8481 -#define V8481 (V + 32740) - 0x110c, 0x116c, 0x11b8, 0, -#undef V8482 -#define V8482 (V + 32744) - 0x110c, 0x116c, 0x11b9, 0, -#undef V8483 -#define V8483 (V + 32748) - 0x110c, 0x116c, 0x11ba, 0, -#undef V8484 -#define V8484 (V + 32752) - 0x110c, 0x116c, 0x11bb, 0, -#undef V8485 -#define V8485 (V + 32756) - 0x110c, 0x116c, 0x11bc, 0, -#undef V8486 -#define V8486 (V + 32760) - 0x110c, 0x116c, 0x11bd, 0, -#undef V8487 -#define V8487 (V + 32764) - 0x110c, 0x116c, 0x11be, 0, -#undef V8488 -#define V8488 (V + 32768) - 0x110c, 0x116c, 0x11bf, 0, -#undef V8489 -#define V8489 (V + 32772) - 0x110c, 0x116c, 0x11c0, 0, -#undef V8490 -#define V8490 (V + 32776) - 0x110c, 0x116c, 0x11c1, 0, -#undef V8491 -#define V8491 (V + 32780) - 0x110c, 0x116c, 0x11c2, 0, -#undef V8492 -#define V8492 (V + 32784) - 0x110c, 0x116d, 0, -#undef V8493 -#define V8493 (V + 32787) - 0x110c, 0x116d, 0x11a8, 0, -#undef V8494 -#define V8494 (V + 32791) - 0x110c, 0x116d, 0x11a9, 0, -#undef V8495 -#define V8495 (V + 32795) - 0x110c, 0x116d, 0x11aa, 0, -#undef V8496 -#define V8496 (V + 32799) - 0x110c, 0x116d, 0x11ab, 0, -#undef V8497 -#define V8497 (V + 32803) - 0x110c, 0x116d, 0x11ac, 0, -#undef V8498 -#define V8498 (V + 32807) - 0x110c, 0x116d, 0x11ad, 0, -#undef V8499 -#define V8499 (V + 32811) - 0x110c, 0x116d, 0x11ae, 0, -#undef V8500 -#define V8500 (V + 32815) - 0x110c, 0x116d, 0x11af, 0, -#undef V8501 -#define V8501 (V + 32819) - 0x110c, 0x116d, 0x11b0, 0, -#undef V8502 -#define V8502 (V + 32823) - 0x110c, 0x116d, 0x11b1, 0, -#undef V8503 -#define V8503 (V + 32827) - 0x110c, 0x116d, 0x11b2, 0, -#undef V8504 -#define V8504 (V + 32831) - 0x110c, 0x116d, 0x11b3, 0, -#undef V8505 -#define V8505 (V + 32835) - 0x110c, 0x116d, 0x11b4, 0, -#undef V8506 -#define V8506 (V + 32839) - 0x110c, 0x116d, 0x11b5, 0, -#undef V8507 -#define V8507 (V + 32843) - 0x110c, 0x116d, 0x11b6, 0, -#undef V8508 -#define V8508 (V + 32847) - 0x110c, 0x116d, 0x11b7, 0, -#undef V8509 -#define V8509 (V + 32851) - 0x110c, 0x116d, 0x11b8, 0, -#undef V8510 -#define V8510 (V + 32855) - 0x110c, 0x116d, 0x11b9, 0, -#undef V8511 -#define V8511 (V + 32859) - 0x110c, 0x116d, 0x11ba, 0, -#undef V8512 -#define V8512 (V + 32863) - 0x110c, 0x116d, 0x11bb, 0, -#undef V8513 -#define V8513 (V + 32867) - 0x110c, 0x116d, 0x11bc, 0, -#undef V8514 -#define V8514 (V + 32871) - 0x110c, 0x116d, 0x11bd, 0, -#undef V8515 -#define V8515 (V + 32875) - 0x110c, 0x116d, 0x11be, 0, -#undef V8516 -#define V8516 (V + 32879) - 0x110c, 0x116d, 0x11bf, 0, -#undef V8517 -#define V8517 (V + 32883) - 0x110c, 0x116d, 0x11c0, 0, -#undef V8518 -#define V8518 (V + 32887) - 0x110c, 0x116d, 0x11c1, 0, -#undef V8519 -#define V8519 (V + 32891) - 0x110c, 0x116d, 0x11c2, 0, -#undef V8520 -#define V8520 (V + 32895) - 0x110c, 0x116e, 0, -#undef V8521 -#define V8521 (V + 32898) - 0x110c, 0x116e, 0x11a8, 0, -#undef V8522 -#define V8522 (V + 32902) - 0x110c, 0x116e, 0x11a9, 0, -#undef V8523 -#define V8523 (V + 32906) - 0x110c, 0x116e, 0x11aa, 0, -#undef V8524 -#define V8524 (V + 32910) - 0x110c, 0x116e, 0x11ab, 0, -#undef V8525 -#define V8525 (V + 32914) - 0x110c, 0x116e, 0x11ac, 0, -#undef V8526 -#define V8526 (V + 32918) - 0x110c, 0x116e, 0x11ad, 0, -#undef V8527 -#define V8527 (V + 32922) - 0x110c, 0x116e, 0x11ae, 0, -#undef V8528 -#define V8528 (V + 32926) - 0x110c, 0x116e, 0x11af, 0, -#undef V8529 -#define V8529 (V + 32930) - 0x110c, 0x116e, 0x11b0, 0, -#undef V8530 -#define V8530 (V + 32934) - 0x110c, 0x116e, 0x11b1, 0, -#undef V8531 -#define V8531 (V + 32938) - 0x110c, 0x116e, 0x11b2, 0, -#undef V8532 -#define V8532 (V + 32942) - 0x110c, 0x116e, 0x11b3, 0, -#undef V8533 -#define V8533 (V + 32946) - 0x110c, 0x116e, 0x11b4, 0, -#undef V8534 -#define V8534 (V + 32950) - 0x110c, 0x116e, 0x11b5, 0, -#undef V8535 -#define V8535 (V + 32954) - 0x110c, 0x116e, 0x11b6, 0, -#undef V8536 -#define V8536 (V + 32958) - 0x110c, 0x116e, 0x11b7, 0, -#undef V8537 -#define V8537 (V + 32962) - 0x110c, 0x116e, 0x11b8, 0, -#undef V8538 -#define V8538 (V + 32966) - 0x110c, 0x116e, 0x11b9, 0, -#undef V8539 -#define V8539 (V + 32970) - 0x110c, 0x116e, 0x11ba, 0, -#undef V8540 -#define V8540 (V + 32974) - 0x110c, 0x116e, 0x11bb, 0, -#undef V8541 -#define V8541 (V + 32978) - 0x110c, 0x116e, 0x11bc, 0, -#undef V8542 -#define V8542 (V + 32982) - 0x110c, 0x116e, 0x11bd, 0, -#undef V8543 -#define V8543 (V + 32986) - 0x110c, 0x116e, 0x11be, 0, -#undef V8544 -#define V8544 (V + 32990) - 0x110c, 0x116e, 0x11bf, 0, -#undef V8545 -#define V8545 (V + 32994) - 0x110c, 0x116e, 0x11c0, 0, -#undef V8546 -#define V8546 (V + 32998) - 0x110c, 0x116e, 0x11c1, 0, -#undef V8547 -#define V8547 (V + 33002) - 0x110c, 0x116e, 0x11c2, 0, -#undef V8548 -#define V8548 (V + 33006) - 0x110c, 0x116f, 0, -#undef V8549 -#define V8549 (V + 33009) - 0x110c, 0x116f, 0x11a8, 0, -#undef V8550 -#define V8550 (V + 33013) - 0x110c, 0x116f, 0x11a9, 0, -#undef V8551 -#define V8551 (V + 33017) - 0x110c, 0x116f, 0x11aa, 0, -#undef V8552 -#define V8552 (V + 33021) - 0x110c, 0x116f, 0x11ab, 0, -#undef V8553 -#define V8553 (V + 33025) - 0x110c, 0x116f, 0x11ac, 0, -#undef V8554 -#define V8554 (V + 33029) - 0x110c, 0x116f, 0x11ad, 0, -#undef V8555 -#define V8555 (V + 33033) - 0x110c, 0x116f, 0x11ae, 0, -#undef V8556 -#define V8556 (V + 33037) - 0x110c, 0x116f, 0x11af, 0, -#undef V8557 -#define V8557 (V + 33041) - 0x110c, 0x116f, 0x11b0, 0, -#undef V8558 -#define V8558 (V + 33045) - 0x110c, 0x116f, 0x11b1, 0, -#undef V8559 -#define V8559 (V + 33049) - 0x110c, 0x116f, 0x11b2, 0, -#undef V8560 -#define V8560 (V + 33053) - 0x110c, 0x116f, 0x11b3, 0, -#undef V8561 -#define V8561 (V + 33057) - 0x110c, 0x116f, 0x11b4, 0, -#undef V8562 -#define V8562 (V + 33061) - 0x110c, 0x116f, 0x11b5, 0, -#undef V8563 -#define V8563 (V + 33065) - 0x110c, 0x116f, 0x11b6, 0, -#undef V8564 -#define V8564 (V + 33069) - 0x110c, 0x116f, 0x11b7, 0, -#undef V8565 -#define V8565 (V + 33073) - 0x110c, 0x116f, 0x11b8, 0, -#undef V8566 -#define V8566 (V + 33077) - 0x110c, 0x116f, 0x11b9, 0, -#undef V8567 -#define V8567 (V + 33081) - 0x110c, 0x116f, 0x11ba, 0, -#undef V8568 -#define V8568 (V + 33085) - 0x110c, 0x116f, 0x11bb, 0, -#undef V8569 -#define V8569 (V + 33089) - 0x110c, 0x116f, 0x11bc, 0, -#undef V8570 -#define V8570 (V + 33093) - 0x110c, 0x116f, 0x11bd, 0, -#undef V8571 -#define V8571 (V + 33097) - 0x110c, 0x116f, 0x11be, 0, -#undef V8572 -#define V8572 (V + 33101) - 0x110c, 0x116f, 0x11bf, 0, -#undef V8573 -#define V8573 (V + 33105) - 0x110c, 0x116f, 0x11c0, 0, -#undef V8574 -#define V8574 (V + 33109) - 0x110c, 0x116f, 0x11c1, 0, -#undef V8575 -#define V8575 (V + 33113) - 0x110c, 0x116f, 0x11c2, 0, -#undef V8576 -#define V8576 (V + 33117) - 0x110c, 0x1170, 0, -#undef V8577 -#define V8577 (V + 33120) - 0x110c, 0x1170, 0x11a8, 0, -#undef V8578 -#define V8578 (V + 33124) - 0x110c, 0x1170, 0x11a9, 0, -#undef V8579 -#define V8579 (V + 33128) - 0x110c, 0x1170, 0x11aa, 0, -#undef V8580 -#define V8580 (V + 33132) - 0x110c, 0x1170, 0x11ab, 0, -#undef V8581 -#define V8581 (V + 33136) - 0x110c, 0x1170, 0x11ac, 0, -#undef V8582 -#define V8582 (V + 33140) - 0x110c, 0x1170, 0x11ad, 0, -#undef V8583 -#define V8583 (V + 33144) - 0x110c, 0x1170, 0x11ae, 0, -#undef V8584 -#define V8584 (V + 33148) - 0x110c, 0x1170, 0x11af, 0, -#undef V8585 -#define V8585 (V + 33152) - 0x110c, 0x1170, 0x11b0, 0, -#undef V8586 -#define V8586 (V + 33156) - 0x110c, 0x1170, 0x11b1, 0, -#undef V8587 -#define V8587 (V + 33160) - 0x110c, 0x1170, 0x11b2, 0, -#undef V8588 -#define V8588 (V + 33164) - 0x110c, 0x1170, 0x11b3, 0, -#undef V8589 -#define V8589 (V + 33168) - 0x110c, 0x1170, 0x11b4, 0, -#undef V8590 -#define V8590 (V + 33172) - 0x110c, 0x1170, 0x11b5, 0, -#undef V8591 -#define V8591 (V + 33176) - 0x110c, 0x1170, 0x11b6, 0, -#undef V8592 -#define V8592 (V + 33180) - 0x110c, 0x1170, 0x11b7, 0, -#undef V8593 -#define V8593 (V + 33184) - 0x110c, 0x1170, 0x11b8, 0, -#undef V8594 -#define V8594 (V + 33188) - 0x110c, 0x1170, 0x11b9, 0, -#undef V8595 -#define V8595 (V + 33192) - 0x110c, 0x1170, 0x11ba, 0, -#undef V8596 -#define V8596 (V + 33196) - 0x110c, 0x1170, 0x11bb, 0, -#undef V8597 -#define V8597 (V + 33200) - 0x110c, 0x1170, 0x11bc, 0, -#undef V8598 -#define V8598 (V + 33204) - 0x110c, 0x1170, 0x11bd, 0, -#undef V8599 -#define V8599 (V + 33208) - 0x110c, 0x1170, 0x11be, 0, -#undef V8600 -#define V8600 (V + 33212) - 0x110c, 0x1170, 0x11bf, 0, -#undef V8601 -#define V8601 (V + 33216) - 0x110c, 0x1170, 0x11c0, 0, -#undef V8602 -#define V8602 (V + 33220) - 0x110c, 0x1170, 0x11c1, 0, -#undef V8603 -#define V8603 (V + 33224) - 0x110c, 0x1170, 0x11c2, 0, -#undef V8604 -#define V8604 (V + 33228) - 0x110c, 0x1171, 0, -#undef V8605 -#define V8605 (V + 33231) - 0x110c, 0x1171, 0x11a8, 0, -#undef V8606 -#define V8606 (V + 33235) - 0x110c, 0x1171, 0x11a9, 0, -#undef V8607 -#define V8607 (V + 33239) - 0x110c, 0x1171, 0x11aa, 0, -#undef V8608 -#define V8608 (V + 33243) - 0x110c, 0x1171, 0x11ab, 0, -#undef V8609 -#define V8609 (V + 33247) - 0x110c, 0x1171, 0x11ac, 0, -#undef V8610 -#define V8610 (V + 33251) - 0x110c, 0x1171, 0x11ad, 0, -#undef V8611 -#define V8611 (V + 33255) - 0x110c, 0x1171, 0x11ae, 0, -#undef V8612 -#define V8612 (V + 33259) - 0x110c, 0x1171, 0x11af, 0, -#undef V8613 -#define V8613 (V + 33263) - 0x110c, 0x1171, 0x11b0, 0, -#undef V8614 -#define V8614 (V + 33267) - 0x110c, 0x1171, 0x11b1, 0, -#undef V8615 -#define V8615 (V + 33271) - 0x110c, 0x1171, 0x11b2, 0, -#undef V8616 -#define V8616 (V + 33275) - 0x110c, 0x1171, 0x11b3, 0, -#undef V8617 -#define V8617 (V + 33279) - 0x110c, 0x1171, 0x11b4, 0, -#undef V8618 -#define V8618 (V + 33283) - 0x110c, 0x1171, 0x11b5, 0, -#undef V8619 -#define V8619 (V + 33287) - 0x110c, 0x1171, 0x11b6, 0, -#undef V8620 -#define V8620 (V + 33291) - 0x110c, 0x1171, 0x11b7, 0, -#undef V8621 -#define V8621 (V + 33295) - 0x110c, 0x1171, 0x11b8, 0, -#undef V8622 -#define V8622 (V + 33299) - 0x110c, 0x1171, 0x11b9, 0, -#undef V8623 -#define V8623 (V + 33303) - 0x110c, 0x1171, 0x11ba, 0, -#undef V8624 -#define V8624 (V + 33307) - 0x110c, 0x1171, 0x11bb, 0, -#undef V8625 -#define V8625 (V + 33311) - 0x110c, 0x1171, 0x11bc, 0, -#undef V8626 -#define V8626 (V + 33315) - 0x110c, 0x1171, 0x11bd, 0, -#undef V8627 -#define V8627 (V + 33319) - 0x110c, 0x1171, 0x11be, 0, -#undef V8628 -#define V8628 (V + 33323) - 0x110c, 0x1171, 0x11bf, 0, -#undef V8629 -#define V8629 (V + 33327) - 0x110c, 0x1171, 0x11c0, 0, -#undef V8630 -#define V8630 (V + 33331) - 0x110c, 0x1171, 0x11c1, 0, -#undef V8631 -#define V8631 (V + 33335) - 0x110c, 0x1171, 0x11c2, 0, -#undef V8632 -#define V8632 (V + 33339) - 0x110c, 0x1172, 0, -#undef V8633 -#define V8633 (V + 33342) - 0x110c, 0x1172, 0x11a8, 0, -#undef V8634 -#define V8634 (V + 33346) - 0x110c, 0x1172, 0x11a9, 0, -#undef V8635 -#define V8635 (V + 33350) - 0x110c, 0x1172, 0x11aa, 0, -#undef V8636 -#define V8636 (V + 33354) - 0x110c, 0x1172, 0x11ab, 0, -#undef V8637 -#define V8637 (V + 33358) - 0x110c, 0x1172, 0x11ac, 0, -#undef V8638 -#define V8638 (V + 33362) - 0x110c, 0x1172, 0x11ad, 0, -#undef V8639 -#define V8639 (V + 33366) - 0x110c, 0x1172, 0x11ae, 0, -#undef V8640 -#define V8640 (V + 33370) - 0x110c, 0x1172, 0x11af, 0, -#undef V8641 -#define V8641 (V + 33374) - 0x110c, 0x1172, 0x11b0, 0, -#undef V8642 -#define V8642 (V + 33378) - 0x110c, 0x1172, 0x11b1, 0, -#undef V8643 -#define V8643 (V + 33382) - 0x110c, 0x1172, 0x11b2, 0, -#undef V8644 -#define V8644 (V + 33386) - 0x110c, 0x1172, 0x11b3, 0, -#undef V8645 -#define V8645 (V + 33390) - 0x110c, 0x1172, 0x11b4, 0, -#undef V8646 -#define V8646 (V + 33394) - 0x110c, 0x1172, 0x11b5, 0, -#undef V8647 -#define V8647 (V + 33398) - 0x110c, 0x1172, 0x11b6, 0, -#undef V8648 -#define V8648 (V + 33402) - 0x110c, 0x1172, 0x11b7, 0, -#undef V8649 -#define V8649 (V + 33406) - 0x110c, 0x1172, 0x11b8, 0, -#undef V8650 -#define V8650 (V + 33410) - 0x110c, 0x1172, 0x11b9, 0, -#undef V8651 -#define V8651 (V + 33414) - 0x110c, 0x1172, 0x11ba, 0, -#undef V8652 -#define V8652 (V + 33418) - 0x110c, 0x1172, 0x11bb, 0, -#undef V8653 -#define V8653 (V + 33422) - 0x110c, 0x1172, 0x11bc, 0, -#undef V8654 -#define V8654 (V + 33426) - 0x110c, 0x1172, 0x11bd, 0, -#undef V8655 -#define V8655 (V + 33430) - 0x110c, 0x1172, 0x11be, 0, -#undef V8656 -#define V8656 (V + 33434) - 0x110c, 0x1172, 0x11bf, 0, -#undef V8657 -#define V8657 (V + 33438) - 0x110c, 0x1172, 0x11c0, 0, -#undef V8658 -#define V8658 (V + 33442) - 0x110c, 0x1172, 0x11c1, 0, -#undef V8659 -#define V8659 (V + 33446) - 0x110c, 0x1172, 0x11c2, 0, -#undef V8660 -#define V8660 (V + 33450) - 0x110c, 0x1173, 0, -#undef V8661 -#define V8661 (V + 33453) - 0x110c, 0x1173, 0x11a8, 0, -#undef V8662 -#define V8662 (V + 33457) - 0x110c, 0x1173, 0x11a9, 0, -#undef V8663 -#define V8663 (V + 33461) - 0x110c, 0x1173, 0x11aa, 0, -#undef V8664 -#define V8664 (V + 33465) - 0x110c, 0x1173, 0x11ab, 0, -#undef V8665 -#define V8665 (V + 33469) - 0x110c, 0x1173, 0x11ac, 0, -#undef V8666 -#define V8666 (V + 33473) - 0x110c, 0x1173, 0x11ad, 0, -#undef V8667 -#define V8667 (V + 33477) - 0x110c, 0x1173, 0x11ae, 0, -#undef V8668 -#define V8668 (V + 33481) - 0x110c, 0x1173, 0x11af, 0, -#undef V8669 -#define V8669 (V + 33485) - 0x110c, 0x1173, 0x11b0, 0, -#undef V8670 -#define V8670 (V + 33489) - 0x110c, 0x1173, 0x11b1, 0, -#undef V8671 -#define V8671 (V + 33493) - 0x110c, 0x1173, 0x11b2, 0, -#undef V8672 -#define V8672 (V + 33497) - 0x110c, 0x1173, 0x11b3, 0, -#undef V8673 -#define V8673 (V + 33501) - 0x110c, 0x1173, 0x11b4, 0, -#undef V8674 -#define V8674 (V + 33505) - 0x110c, 0x1173, 0x11b5, 0, -#undef V8675 -#define V8675 (V + 33509) - 0x110c, 0x1173, 0x11b6, 0, -#undef V8676 -#define V8676 (V + 33513) - 0x110c, 0x1173, 0x11b7, 0, -#undef V8677 -#define V8677 (V + 33517) - 0x110c, 0x1173, 0x11b8, 0, -#undef V8678 -#define V8678 (V + 33521) - 0x110c, 0x1173, 0x11b9, 0, -#undef V8679 -#define V8679 (V + 33525) - 0x110c, 0x1173, 0x11ba, 0, -#undef V8680 -#define V8680 (V + 33529) - 0x110c, 0x1173, 0x11bb, 0, -#undef V8681 -#define V8681 (V + 33533) - 0x110c, 0x1173, 0x11bc, 0, -#undef V8682 -#define V8682 (V + 33537) - 0x110c, 0x1173, 0x11bd, 0, -#undef V8683 -#define V8683 (V + 33541) - 0x110c, 0x1173, 0x11be, 0, -#undef V8684 -#define V8684 (V + 33545) - 0x110c, 0x1173, 0x11bf, 0, -#undef V8685 -#define V8685 (V + 33549) - 0x110c, 0x1173, 0x11c0, 0, -#undef V8686 -#define V8686 (V + 33553) - 0x110c, 0x1173, 0x11c1, 0, -#undef V8687 -#define V8687 (V + 33557) - 0x110c, 0x1173, 0x11c2, 0, -#undef V8688 -#define V8688 (V + 33561) - 0x110c, 0x1174, 0, -#undef V8689 -#define V8689 (V + 33564) - 0x110c, 0x1174, 0x11a8, 0, -#undef V8690 -#define V8690 (V + 33568) - 0x110c, 0x1174, 0x11a9, 0, -#undef V8691 -#define V8691 (V + 33572) - 0x110c, 0x1174, 0x11aa, 0, -#undef V8692 -#define V8692 (V + 33576) - 0x110c, 0x1174, 0x11ab, 0, -#undef V8693 -#define V8693 (V + 33580) - 0x110c, 0x1174, 0x11ac, 0, -#undef V8694 -#define V8694 (V + 33584) - 0x110c, 0x1174, 0x11ad, 0, -#undef V8695 -#define V8695 (V + 33588) - 0x110c, 0x1174, 0x11ae, 0, -#undef V8696 -#define V8696 (V + 33592) - 0x110c, 0x1174, 0x11af, 0, -#undef V8697 -#define V8697 (V + 33596) - 0x110c, 0x1174, 0x11b0, 0, -#undef V8698 -#define V8698 (V + 33600) - 0x110c, 0x1174, 0x11b1, 0, -#undef V8699 -#define V8699 (V + 33604) - 0x110c, 0x1174, 0x11b2, 0, -#undef V8700 -#define V8700 (V + 33608) - 0x110c, 0x1174, 0x11b3, 0, -#undef V8701 -#define V8701 (V + 33612) - 0x110c, 0x1174, 0x11b4, 0, -#undef V8702 -#define V8702 (V + 33616) - 0x110c, 0x1174, 0x11b5, 0, -#undef V8703 -#define V8703 (V + 33620) - 0x110c, 0x1174, 0x11b6, 0, -#undef V8704 -#define V8704 (V + 33624) - 0x110c, 0x1174, 0x11b7, 0, -#undef V8705 -#define V8705 (V + 33628) - 0x110c, 0x1174, 0x11b8, 0, -#undef V8706 -#define V8706 (V + 33632) - 0x110c, 0x1174, 0x11b9, 0, -#undef V8707 -#define V8707 (V + 33636) - 0x110c, 0x1174, 0x11ba, 0, -#undef V8708 -#define V8708 (V + 33640) - 0x110c, 0x1174, 0x11bb, 0, -#undef V8709 -#define V8709 (V + 33644) - 0x110c, 0x1174, 0x11bc, 0, -#undef V8710 -#define V8710 (V + 33648) - 0x110c, 0x1174, 0x11bd, 0, -#undef V8711 -#define V8711 (V + 33652) - 0x110c, 0x1174, 0x11be, 0, -#undef V8712 -#define V8712 (V + 33656) - 0x110c, 0x1174, 0x11bf, 0, -#undef V8713 -#define V8713 (V + 33660) - 0x110c, 0x1174, 0x11c0, 0, -#undef V8714 -#define V8714 (V + 33664) - 0x110c, 0x1174, 0x11c1, 0, -#undef V8715 -#define V8715 (V + 33668) - 0x110c, 0x1174, 0x11c2, 0, -#undef V8716 -#define V8716 (V + 33672) - 0x110c, 0x1175, 0, -#undef V8717 -#define V8717 (V + 33675) - 0x110c, 0x1175, 0x11a8, 0, -#undef V8718 -#define V8718 (V + 33679) - 0x110c, 0x1175, 0x11a9, 0, -#undef V8719 -#define V8719 (V + 33683) - 0x110c, 0x1175, 0x11aa, 0, -#undef V8720 -#define V8720 (V + 33687) - 0x110c, 0x1175, 0x11ab, 0, -#undef V8721 -#define V8721 (V + 33691) - 0x110c, 0x1175, 0x11ac, 0, -#undef V8722 -#define V8722 (V + 33695) - 0x110c, 0x1175, 0x11ad, 0, -#undef V8723 -#define V8723 (V + 33699) - 0x110c, 0x1175, 0x11ae, 0, -#undef V8724 -#define V8724 (V + 33703) - 0x110c, 0x1175, 0x11af, 0, -#undef V8725 -#define V8725 (V + 33707) - 0x110c, 0x1175, 0x11b0, 0, -#undef V8726 -#define V8726 (V + 33711) - 0x110c, 0x1175, 0x11b1, 0, -#undef V8727 -#define V8727 (V + 33715) - 0x110c, 0x1175, 0x11b2, 0, -#undef V8728 -#define V8728 (V + 33719) - 0x110c, 0x1175, 0x11b3, 0, -#undef V8729 -#define V8729 (V + 33723) - 0x110c, 0x1175, 0x11b4, 0, -#undef V8730 -#define V8730 (V + 33727) - 0x110c, 0x1175, 0x11b5, 0, -#undef V8731 -#define V8731 (V + 33731) - 0x110c, 0x1175, 0x11b6, 0, -#undef V8732 -#define V8732 (V + 33735) - 0x110c, 0x1175, 0x11b7, 0, -#undef V8733 -#define V8733 (V + 33739) - 0x110c, 0x1175, 0x11b8, 0, -#undef V8734 -#define V8734 (V + 33743) - 0x110c, 0x1175, 0x11b9, 0, -#undef V8735 -#define V8735 (V + 33747) - 0x110c, 0x1175, 0x11ba, 0, -#undef V8736 -#define V8736 (V + 33751) - 0x110c, 0x1175, 0x11bb, 0, -#undef V8737 -#define V8737 (V + 33755) - 0x110c, 0x1175, 0x11bc, 0, -#undef V8738 -#define V8738 (V + 33759) - 0x110c, 0x1175, 0x11bd, 0, -#undef V8739 -#define V8739 (V + 33763) - 0x110c, 0x1175, 0x11be, 0, -#undef V8740 -#define V8740 (V + 33767) - 0x110c, 0x1175, 0x11bf, 0, -#undef V8741 -#define V8741 (V + 33771) - 0x110c, 0x1175, 0x11c0, 0, -#undef V8742 -#define V8742 (V + 33775) - 0x110c, 0x1175, 0x11c1, 0, -#undef V8743 -#define V8743 (V + 33779) - 0x110c, 0x1175, 0x11c2, 0, -#undef V8744 -#define V8744 (V + 33783) - 0x110d, 0x1161, 0, -#undef V8745 -#define V8745 (V + 33786) - 0x110d, 0x1161, 0x11a8, 0, -#undef V8746 -#define V8746 (V + 33790) - 0x110d, 0x1161, 0x11a9, 0, -#undef V8747 -#define V8747 (V + 33794) - 0x110d, 0x1161, 0x11aa, 0, -#undef V8748 -#define V8748 (V + 33798) - 0x110d, 0x1161, 0x11ab, 0, -#undef V8749 -#define V8749 (V + 33802) - 0x110d, 0x1161, 0x11ac, 0, -#undef V8750 -#define V8750 (V + 33806) - 0x110d, 0x1161, 0x11ad, 0, -#undef V8751 -#define V8751 (V + 33810) - 0x110d, 0x1161, 0x11ae, 0, -#undef V8752 -#define V8752 (V + 33814) - 0x110d, 0x1161, 0x11af, 0, -#undef V8753 -#define V8753 (V + 33818) - 0x110d, 0x1161, 0x11b0, 0, -#undef V8754 -#define V8754 (V + 33822) - 0x110d, 0x1161, 0x11b1, 0, -#undef V8755 -#define V8755 (V + 33826) - 0x110d, 0x1161, 0x11b2, 0, -#undef V8756 -#define V8756 (V + 33830) - 0x110d, 0x1161, 0x11b3, 0, -#undef V8757 -#define V8757 (V + 33834) - 0x110d, 0x1161, 0x11b4, 0, -#undef V8758 -#define V8758 (V + 33838) - 0x110d, 0x1161, 0x11b5, 0, -#undef V8759 -#define V8759 (V + 33842) - 0x110d, 0x1161, 0x11b6, 0, -#undef V8760 -#define V8760 (V + 33846) - 0x110d, 0x1161, 0x11b7, 0, -#undef V8761 -#define V8761 (V + 33850) - 0x110d, 0x1161, 0x11b8, 0, -#undef V8762 -#define V8762 (V + 33854) - 0x110d, 0x1161, 0x11b9, 0, -#undef V8763 -#define V8763 (V + 33858) - 0x110d, 0x1161, 0x11ba, 0, -#undef V8764 -#define V8764 (V + 33862) - 0x110d, 0x1161, 0x11bb, 0, -#undef V8765 -#define V8765 (V + 33866) - 0x110d, 0x1161, 0x11bc, 0, -#undef V8766 -#define V8766 (V + 33870) - 0x110d, 0x1161, 0x11bd, 0, -#undef V8767 -#define V8767 (V + 33874) - 0x110d, 0x1161, 0x11be, 0, -#undef V8768 -#define V8768 (V + 33878) - 0x110d, 0x1161, 0x11bf, 0, -#undef V8769 -#define V8769 (V + 33882) - 0x110d, 0x1161, 0x11c0, 0, -#undef V8770 -#define V8770 (V + 33886) - 0x110d, 0x1161, 0x11c1, 0, -#undef V8771 -#define V8771 (V + 33890) - 0x110d, 0x1161, 0x11c2, 0, -#undef V8772 -#define V8772 (V + 33894) - 0x110d, 0x1162, 0, -#undef V8773 -#define V8773 (V + 33897) - 0x110d, 0x1162, 0x11a8, 0, -#undef V8774 -#define V8774 (V + 33901) - 0x110d, 0x1162, 0x11a9, 0, -#undef V8775 -#define V8775 (V + 33905) - 0x110d, 0x1162, 0x11aa, 0, -#undef V8776 -#define V8776 (V + 33909) - 0x110d, 0x1162, 0x11ab, 0, -#undef V8777 -#define V8777 (V + 33913) - 0x110d, 0x1162, 0x11ac, 0, -#undef V8778 -#define V8778 (V + 33917) - 0x110d, 0x1162, 0x11ad, 0, -#undef V8779 -#define V8779 (V + 33921) - 0x110d, 0x1162, 0x11ae, 0, -#undef V8780 -#define V8780 (V + 33925) - 0x110d, 0x1162, 0x11af, 0, -#undef V8781 -#define V8781 (V + 33929) - 0x110d, 0x1162, 0x11b0, 0, -#undef V8782 -#define V8782 (V + 33933) - 0x110d, 0x1162, 0x11b1, 0, -#undef V8783 -#define V8783 (V + 33937) - 0x110d, 0x1162, 0x11b2, 0, -#undef V8784 -#define V8784 (V + 33941) - 0x110d, 0x1162, 0x11b3, 0, -#undef V8785 -#define V8785 (V + 33945) - 0x110d, 0x1162, 0x11b4, 0, -#undef V8786 -#define V8786 (V + 33949) - 0x110d, 0x1162, 0x11b5, 0, -#undef V8787 -#define V8787 (V + 33953) - 0x110d, 0x1162, 0x11b6, 0, -#undef V8788 -#define V8788 (V + 33957) - 0x110d, 0x1162, 0x11b7, 0, -#undef V8789 -#define V8789 (V + 33961) - 0x110d, 0x1162, 0x11b8, 0, -#undef V8790 -#define V8790 (V + 33965) - 0x110d, 0x1162, 0x11b9, 0, -#undef V8791 -#define V8791 (V + 33969) - 0x110d, 0x1162, 0x11ba, 0, -#undef V8792 -#define V8792 (V + 33973) - 0x110d, 0x1162, 0x11bb, 0, -#undef V8793 -#define V8793 (V + 33977) - 0x110d, 0x1162, 0x11bc, 0, -#undef V8794 -#define V8794 (V + 33981) - 0x110d, 0x1162, 0x11bd, 0, -#undef V8795 -#define V8795 (V + 33985) - 0x110d, 0x1162, 0x11be, 0, -#undef V8796 -#define V8796 (V + 33989) - 0x110d, 0x1162, 0x11bf, 0, -#undef V8797 -#define V8797 (V + 33993) - 0x110d, 0x1162, 0x11c0, 0, -#undef V8798 -#define V8798 (V + 33997) - 0x110d, 0x1162, 0x11c1, 0, -#undef V8799 -#define V8799 (V + 34001) - 0x110d, 0x1162, 0x11c2, 0, -#undef V8800 -#define V8800 (V + 34005) - 0x110d, 0x1163, 0, -#undef V8801 -#define V8801 (V + 34008) - 0x110d, 0x1163, 0x11a8, 0, -#undef V8802 -#define V8802 (V + 34012) - 0x110d, 0x1163, 0x11a9, 0, -#undef V8803 -#define V8803 (V + 34016) - 0x110d, 0x1163, 0x11aa, 0, -#undef V8804 -#define V8804 (V + 34020) - 0x110d, 0x1163, 0x11ab, 0, -#undef V8805 -#define V8805 (V + 34024) - 0x110d, 0x1163, 0x11ac, 0, -#undef V8806 -#define V8806 (V + 34028) - 0x110d, 0x1163, 0x11ad, 0, -#undef V8807 -#define V8807 (V + 34032) - 0x110d, 0x1163, 0x11ae, 0, -#undef V8808 -#define V8808 (V + 34036) - 0x110d, 0x1163, 0x11af, 0, -#undef V8809 -#define V8809 (V + 34040) - 0x110d, 0x1163, 0x11b0, 0, -#undef V8810 -#define V8810 (V + 34044) - 0x110d, 0x1163, 0x11b1, 0, -#undef V8811 -#define V8811 (V + 34048) - 0x110d, 0x1163, 0x11b2, 0, -#undef V8812 -#define V8812 (V + 34052) - 0x110d, 0x1163, 0x11b3, 0, -#undef V8813 -#define V8813 (V + 34056) - 0x110d, 0x1163, 0x11b4, 0, -#undef V8814 -#define V8814 (V + 34060) - 0x110d, 0x1163, 0x11b5, 0, -#undef V8815 -#define V8815 (V + 34064) - 0x110d, 0x1163, 0x11b6, 0, -#undef V8816 -#define V8816 (V + 34068) - 0x110d, 0x1163, 0x11b7, 0, -#undef V8817 -#define V8817 (V + 34072) - 0x110d, 0x1163, 0x11b8, 0, -#undef V8818 -#define V8818 (V + 34076) - 0x110d, 0x1163, 0x11b9, 0, -#undef V8819 -#define V8819 (V + 34080) - 0x110d, 0x1163, 0x11ba, 0, -#undef V8820 -#define V8820 (V + 34084) - 0x110d, 0x1163, 0x11bb, 0, -#undef V8821 -#define V8821 (V + 34088) - 0x110d, 0x1163, 0x11bc, 0, -#undef V8822 -#define V8822 (V + 34092) - 0x110d, 0x1163, 0x11bd, 0, -#undef V8823 -#define V8823 (V + 34096) - 0x110d, 0x1163, 0x11be, 0, -#undef V8824 -#define V8824 (V + 34100) - 0x110d, 0x1163, 0x11bf, 0, -#undef V8825 -#define V8825 (V + 34104) - 0x110d, 0x1163, 0x11c0, 0, -#undef V8826 -#define V8826 (V + 34108) - 0x110d, 0x1163, 0x11c1, 0, -#undef V8827 -#define V8827 (V + 34112) - 0x110d, 0x1163, 0x11c2, 0, -#undef V8828 -#define V8828 (V + 34116) - 0x110d, 0x1164, 0, -#undef V8829 -#define V8829 (V + 34119) - 0x110d, 0x1164, 0x11a8, 0, -#undef V8830 -#define V8830 (V + 34123) - 0x110d, 0x1164, 0x11a9, 0, -#undef V8831 -#define V8831 (V + 34127) - 0x110d, 0x1164, 0x11aa, 0, -#undef V8832 -#define V8832 (V + 34131) - 0x110d, 0x1164, 0x11ab, 0, -#undef V8833 -#define V8833 (V + 34135) - 0x110d, 0x1164, 0x11ac, 0, -#undef V8834 -#define V8834 (V + 34139) - 0x110d, 0x1164, 0x11ad, 0, -#undef V8835 -#define V8835 (V + 34143) - 0x110d, 0x1164, 0x11ae, 0, -#undef V8836 -#define V8836 (V + 34147) - 0x110d, 0x1164, 0x11af, 0, -#undef V8837 -#define V8837 (V + 34151) - 0x110d, 0x1164, 0x11b0, 0, -#undef V8838 -#define V8838 (V + 34155) - 0x110d, 0x1164, 0x11b1, 0, -#undef V8839 -#define V8839 (V + 34159) - 0x110d, 0x1164, 0x11b2, 0, -#undef V8840 -#define V8840 (V + 34163) - 0x110d, 0x1164, 0x11b3, 0, -#undef V8841 -#define V8841 (V + 34167) - 0x110d, 0x1164, 0x11b4, 0, -#undef V8842 -#define V8842 (V + 34171) - 0x110d, 0x1164, 0x11b5, 0, -#undef V8843 -#define V8843 (V + 34175) - 0x110d, 0x1164, 0x11b6, 0, -#undef V8844 -#define V8844 (V + 34179) - 0x110d, 0x1164, 0x11b7, 0, -#undef V8845 -#define V8845 (V + 34183) - 0x110d, 0x1164, 0x11b8, 0, -#undef V8846 -#define V8846 (V + 34187) - 0x110d, 0x1164, 0x11b9, 0, -#undef V8847 -#define V8847 (V + 34191) - 0x110d, 0x1164, 0x11ba, 0, -#undef V8848 -#define V8848 (V + 34195) - 0x110d, 0x1164, 0x11bb, 0, -#undef V8849 -#define V8849 (V + 34199) - 0x110d, 0x1164, 0x11bc, 0, -#undef V8850 -#define V8850 (V + 34203) - 0x110d, 0x1164, 0x11bd, 0, -#undef V8851 -#define V8851 (V + 34207) - 0x110d, 0x1164, 0x11be, 0, -#undef V8852 -#define V8852 (V + 34211) - 0x110d, 0x1164, 0x11bf, 0, -#undef V8853 -#define V8853 (V + 34215) - 0x110d, 0x1164, 0x11c0, 0, -#undef V8854 -#define V8854 (V + 34219) - 0x110d, 0x1164, 0x11c1, 0, -#undef V8855 -#define V8855 (V + 34223) - 0x110d, 0x1164, 0x11c2, 0, -#undef V8856 -#define V8856 (V + 34227) - 0x110d, 0x1165, 0, -#undef V8857 -#define V8857 (V + 34230) - 0x110d, 0x1165, 0x11a8, 0, -#undef V8858 -#define V8858 (V + 34234) - 0x110d, 0x1165, 0x11a9, 0, -#undef V8859 -#define V8859 (V + 34238) - 0x110d, 0x1165, 0x11aa, 0, -#undef V8860 -#define V8860 (V + 34242) - 0x110d, 0x1165, 0x11ab, 0, -#undef V8861 -#define V8861 (V + 34246) - 0x110d, 0x1165, 0x11ac, 0, -#undef V8862 -#define V8862 (V + 34250) - 0x110d, 0x1165, 0x11ad, 0, -#undef V8863 -#define V8863 (V + 34254) - 0x110d, 0x1165, 0x11ae, 0, -#undef V8864 -#define V8864 (V + 34258) - 0x110d, 0x1165, 0x11af, 0, -#undef V8865 -#define V8865 (V + 34262) - 0x110d, 0x1165, 0x11b0, 0, -#undef V8866 -#define V8866 (V + 34266) - 0x110d, 0x1165, 0x11b1, 0, -#undef V8867 -#define V8867 (V + 34270) - 0x110d, 0x1165, 0x11b2, 0, -#undef V8868 -#define V8868 (V + 34274) - 0x110d, 0x1165, 0x11b3, 0, -#undef V8869 -#define V8869 (V + 34278) - 0x110d, 0x1165, 0x11b4, 0, -#undef V8870 -#define V8870 (V + 34282) - 0x110d, 0x1165, 0x11b5, 0, -#undef V8871 -#define V8871 (V + 34286) - 0x110d, 0x1165, 0x11b6, 0, -#undef V8872 -#define V8872 (V + 34290) - 0x110d, 0x1165, 0x11b7, 0, -#undef V8873 -#define V8873 (V + 34294) - 0x110d, 0x1165, 0x11b8, 0, -#undef V8874 -#define V8874 (V + 34298) - 0x110d, 0x1165, 0x11b9, 0, -#undef V8875 -#define V8875 (V + 34302) - 0x110d, 0x1165, 0x11ba, 0, -#undef V8876 -#define V8876 (V + 34306) - 0x110d, 0x1165, 0x11bb, 0, -#undef V8877 -#define V8877 (V + 34310) - 0x110d, 0x1165, 0x11bc, 0, -#undef V8878 -#define V8878 (V + 34314) - 0x110d, 0x1165, 0x11bd, 0, -#undef V8879 -#define V8879 (V + 34318) - 0x110d, 0x1165, 0x11be, 0, -#undef V8880 -#define V8880 (V + 34322) - 0x110d, 0x1165, 0x11bf, 0, -#undef V8881 -#define V8881 (V + 34326) - 0x110d, 0x1165, 0x11c0, 0, -#undef V8882 -#define V8882 (V + 34330) - 0x110d, 0x1165, 0x11c1, 0, -#undef V8883 -#define V8883 (V + 34334) - 0x110d, 0x1165, 0x11c2, 0, -#undef V8884 -#define V8884 (V + 34338) - 0x110d, 0x1166, 0, -#undef V8885 -#define V8885 (V + 34341) - 0x110d, 0x1166, 0x11a8, 0, -#undef V8886 -#define V8886 (V + 34345) - 0x110d, 0x1166, 0x11a9, 0, -#undef V8887 -#define V8887 (V + 34349) - 0x110d, 0x1166, 0x11aa, 0, -#undef V8888 -#define V8888 (V + 34353) - 0x110d, 0x1166, 0x11ab, 0, -#undef V8889 -#define V8889 (V + 34357) - 0x110d, 0x1166, 0x11ac, 0, -#undef V8890 -#define V8890 (V + 34361) - 0x110d, 0x1166, 0x11ad, 0, -#undef V8891 -#define V8891 (V + 34365) - 0x110d, 0x1166, 0x11ae, 0, -#undef V8892 -#define V8892 (V + 34369) - 0x110d, 0x1166, 0x11af, 0, -#undef V8893 -#define V8893 (V + 34373) - 0x110d, 0x1166, 0x11b0, 0, -#undef V8894 -#define V8894 (V + 34377) - 0x110d, 0x1166, 0x11b1, 0, -#undef V8895 -#define V8895 (V + 34381) - 0x110d, 0x1166, 0x11b2, 0, -#undef V8896 -#define V8896 (V + 34385) - 0x110d, 0x1166, 0x11b3, 0, -#undef V8897 -#define V8897 (V + 34389) - 0x110d, 0x1166, 0x11b4, 0, -#undef V8898 -#define V8898 (V + 34393) - 0x110d, 0x1166, 0x11b5, 0, -#undef V8899 -#define V8899 (V + 34397) - 0x110d, 0x1166, 0x11b6, 0, -#undef V8900 -#define V8900 (V + 34401) - 0x110d, 0x1166, 0x11b7, 0, -#undef V8901 -#define V8901 (V + 34405) - 0x110d, 0x1166, 0x11b8, 0, -#undef V8902 -#define V8902 (V + 34409) - 0x110d, 0x1166, 0x11b9, 0, -#undef V8903 -#define V8903 (V + 34413) - 0x110d, 0x1166, 0x11ba, 0, -#undef V8904 -#define V8904 (V + 34417) - 0x110d, 0x1166, 0x11bb, 0, -#undef V8905 -#define V8905 (V + 34421) - 0x110d, 0x1166, 0x11bc, 0, -#undef V8906 -#define V8906 (V + 34425) - 0x110d, 0x1166, 0x11bd, 0, -#undef V8907 -#define V8907 (V + 34429) - 0x110d, 0x1166, 0x11be, 0, -#undef V8908 -#define V8908 (V + 34433) - 0x110d, 0x1166, 0x11bf, 0, -#undef V8909 -#define V8909 (V + 34437) - 0x110d, 0x1166, 0x11c0, 0, -#undef V8910 -#define V8910 (V + 34441) - 0x110d, 0x1166, 0x11c1, 0, -#undef V8911 -#define V8911 (V + 34445) - 0x110d, 0x1166, 0x11c2, 0, -#undef V8912 -#define V8912 (V + 34449) - 0x110d, 0x1167, 0, -#undef V8913 -#define V8913 (V + 34452) - 0x110d, 0x1167, 0x11a8, 0, -#undef V8914 -#define V8914 (V + 34456) - 0x110d, 0x1167, 0x11a9, 0, -#undef V8915 -#define V8915 (V + 34460) - 0x110d, 0x1167, 0x11aa, 0, -#undef V8916 -#define V8916 (V + 34464) - 0x110d, 0x1167, 0x11ab, 0, -#undef V8917 -#define V8917 (V + 34468) - 0x110d, 0x1167, 0x11ac, 0, -#undef V8918 -#define V8918 (V + 34472) - 0x110d, 0x1167, 0x11ad, 0, -#undef V8919 -#define V8919 (V + 34476) - 0x110d, 0x1167, 0x11ae, 0, -#undef V8920 -#define V8920 (V + 34480) - 0x110d, 0x1167, 0x11af, 0, -#undef V8921 -#define V8921 (V + 34484) - 0x110d, 0x1167, 0x11b0, 0, -#undef V8922 -#define V8922 (V + 34488) - 0x110d, 0x1167, 0x11b1, 0, -#undef V8923 -#define V8923 (V + 34492) - 0x110d, 0x1167, 0x11b2, 0, -#undef V8924 -#define V8924 (V + 34496) - 0x110d, 0x1167, 0x11b3, 0, -#undef V8925 -#define V8925 (V + 34500) - 0x110d, 0x1167, 0x11b4, 0, -#undef V8926 -#define V8926 (V + 34504) - 0x110d, 0x1167, 0x11b5, 0, -#undef V8927 -#define V8927 (V + 34508) - 0x110d, 0x1167, 0x11b6, 0, -#undef V8928 -#define V8928 (V + 34512) - 0x110d, 0x1167, 0x11b7, 0, -#undef V8929 -#define V8929 (V + 34516) - 0x110d, 0x1167, 0x11b8, 0, -#undef V8930 -#define V8930 (V + 34520) - 0x110d, 0x1167, 0x11b9, 0, -#undef V8931 -#define V8931 (V + 34524) - 0x110d, 0x1167, 0x11ba, 0, -#undef V8932 -#define V8932 (V + 34528) - 0x110d, 0x1167, 0x11bb, 0, -#undef V8933 -#define V8933 (V + 34532) - 0x110d, 0x1167, 0x11bc, 0, -#undef V8934 -#define V8934 (V + 34536) - 0x110d, 0x1167, 0x11bd, 0, -#undef V8935 -#define V8935 (V + 34540) - 0x110d, 0x1167, 0x11be, 0, -#undef V8936 -#define V8936 (V + 34544) - 0x110d, 0x1167, 0x11bf, 0, -#undef V8937 -#define V8937 (V + 34548) - 0x110d, 0x1167, 0x11c0, 0, -#undef V8938 -#define V8938 (V + 34552) - 0x110d, 0x1167, 0x11c1, 0, -#undef V8939 -#define V8939 (V + 34556) - 0x110d, 0x1167, 0x11c2, 0, -#undef V8940 -#define V8940 (V + 34560) - 0x110d, 0x1168, 0, -#undef V8941 -#define V8941 (V + 34563) - 0x110d, 0x1168, 0x11a8, 0, -#undef V8942 -#define V8942 (V + 34567) - 0x110d, 0x1168, 0x11a9, 0, -#undef V8943 -#define V8943 (V + 34571) - 0x110d, 0x1168, 0x11aa, 0, -#undef V8944 -#define V8944 (V + 34575) - 0x110d, 0x1168, 0x11ab, 0, -#undef V8945 -#define V8945 (V + 34579) - 0x110d, 0x1168, 0x11ac, 0, -#undef V8946 -#define V8946 (V + 34583) - 0x110d, 0x1168, 0x11ad, 0, -#undef V8947 -#define V8947 (V + 34587) - 0x110d, 0x1168, 0x11ae, 0, -#undef V8948 -#define V8948 (V + 34591) - 0x110d, 0x1168, 0x11af, 0, -#undef V8949 -#define V8949 (V + 34595) - 0x110d, 0x1168, 0x11b0, 0, -#undef V8950 -#define V8950 (V + 34599) - 0x110d, 0x1168, 0x11b1, 0, -#undef V8951 -#define V8951 (V + 34603) - 0x110d, 0x1168, 0x11b2, 0, -#undef V8952 -#define V8952 (V + 34607) - 0x110d, 0x1168, 0x11b3, 0, -#undef V8953 -#define V8953 (V + 34611) - 0x110d, 0x1168, 0x11b4, 0, -#undef V8954 -#define V8954 (V + 34615) - 0x110d, 0x1168, 0x11b5, 0, -#undef V8955 -#define V8955 (V + 34619) - 0x110d, 0x1168, 0x11b6, 0, -#undef V8956 -#define V8956 (V + 34623) - 0x110d, 0x1168, 0x11b7, 0, -#undef V8957 -#define V8957 (V + 34627) - 0x110d, 0x1168, 0x11b8, 0, -#undef V8958 -#define V8958 (V + 34631) - 0x110d, 0x1168, 0x11b9, 0, -#undef V8959 -#define V8959 (V + 34635) - 0x110d, 0x1168, 0x11ba, 0, -#undef V8960 -#define V8960 (V + 34639) - 0x110d, 0x1168, 0x11bb, 0, -#undef V8961 -#define V8961 (V + 34643) - 0x110d, 0x1168, 0x11bc, 0, -#undef V8962 -#define V8962 (V + 34647) - 0x110d, 0x1168, 0x11bd, 0, -#undef V8963 -#define V8963 (V + 34651) - 0x110d, 0x1168, 0x11be, 0, -#undef V8964 -#define V8964 (V + 34655) - 0x110d, 0x1168, 0x11bf, 0, -#undef V8965 -#define V8965 (V + 34659) - 0x110d, 0x1168, 0x11c0, 0, -#undef V8966 -#define V8966 (V + 34663) - 0x110d, 0x1168, 0x11c1, 0, -#undef V8967 -#define V8967 (V + 34667) - 0x110d, 0x1168, 0x11c2, 0, -#undef V8968 -#define V8968 (V + 34671) - 0x110d, 0x1169, 0, -#undef V8969 -#define V8969 (V + 34674) - 0x110d, 0x1169, 0x11a8, 0, -#undef V8970 -#define V8970 (V + 34678) - 0x110d, 0x1169, 0x11a9, 0, -#undef V8971 -#define V8971 (V + 34682) - 0x110d, 0x1169, 0x11aa, 0, -#undef V8972 -#define V8972 (V + 34686) - 0x110d, 0x1169, 0x11ab, 0, -#undef V8973 -#define V8973 (V + 34690) - 0x110d, 0x1169, 0x11ac, 0, -#undef V8974 -#define V8974 (V + 34694) - 0x110d, 0x1169, 0x11ad, 0, -#undef V8975 -#define V8975 (V + 34698) - 0x110d, 0x1169, 0x11ae, 0, -#undef V8976 -#define V8976 (V + 34702) - 0x110d, 0x1169, 0x11af, 0, -#undef V8977 -#define V8977 (V + 34706) - 0x110d, 0x1169, 0x11b0, 0, -#undef V8978 -#define V8978 (V + 34710) - 0x110d, 0x1169, 0x11b1, 0, -#undef V8979 -#define V8979 (V + 34714) - 0x110d, 0x1169, 0x11b2, 0, -#undef V8980 -#define V8980 (V + 34718) - 0x110d, 0x1169, 0x11b3, 0, -#undef V8981 -#define V8981 (V + 34722) - 0x110d, 0x1169, 0x11b4, 0, -#undef V8982 -#define V8982 (V + 34726) - 0x110d, 0x1169, 0x11b5, 0, -#undef V8983 -#define V8983 (V + 34730) - 0x110d, 0x1169, 0x11b6, 0, -#undef V8984 -#define V8984 (V + 34734) - 0x110d, 0x1169, 0x11b7, 0, -#undef V8985 -#define V8985 (V + 34738) - 0x110d, 0x1169, 0x11b8, 0, -#undef V8986 -#define V8986 (V + 34742) - 0x110d, 0x1169, 0x11b9, 0, -#undef V8987 -#define V8987 (V + 34746) - 0x110d, 0x1169, 0x11ba, 0, -#undef V8988 -#define V8988 (V + 34750) - 0x110d, 0x1169, 0x11bb, 0, -#undef V8989 -#define V8989 (V + 34754) - 0x110d, 0x1169, 0x11bc, 0, -#undef V8990 -#define V8990 (V + 34758) - 0x110d, 0x1169, 0x11bd, 0, -#undef V8991 -#define V8991 (V + 34762) - 0x110d, 0x1169, 0x11be, 0, -#undef V8992 -#define V8992 (V + 34766) - 0x110d, 0x1169, 0x11bf, 0, -#undef V8993 -#define V8993 (V + 34770) - 0x110d, 0x1169, 0x11c0, 0, -#undef V8994 -#define V8994 (V + 34774) - 0x110d, 0x1169, 0x11c1, 0, -#undef V8995 -#define V8995 (V + 34778) - 0x110d, 0x1169, 0x11c2, 0, -#undef V8996 -#define V8996 (V + 34782) - 0x110d, 0x116a, 0, -#undef V8997 -#define V8997 (V + 34785) - 0x110d, 0x116a, 0x11a8, 0, -#undef V8998 -#define V8998 (V + 34789) - 0x110d, 0x116a, 0x11a9, 0, -#undef V8999 -#define V8999 (V + 34793) - 0x110d, 0x116a, 0x11aa, 0, -#undef V9000 -#define V9000 (V + 34797) - 0x110d, 0x116a, 0x11ab, 0, -#undef V9001 -#define V9001 (V + 34801) - 0x110d, 0x116a, 0x11ac, 0, -#undef V9002 -#define V9002 (V + 34805) - 0x110d, 0x116a, 0x11ad, 0, -#undef V9003 -#define V9003 (V + 34809) - 0x110d, 0x116a, 0x11ae, 0, -#undef V9004 -#define V9004 (V + 34813) - 0x110d, 0x116a, 0x11af, 0, -#undef V9005 -#define V9005 (V + 34817) - 0x110d, 0x116a, 0x11b0, 0, -#undef V9006 -#define V9006 (V + 34821) - 0x110d, 0x116a, 0x11b1, 0, -#undef V9007 -#define V9007 (V + 34825) - 0x110d, 0x116a, 0x11b2, 0, -#undef V9008 -#define V9008 (V + 34829) - 0x110d, 0x116a, 0x11b3, 0, -#undef V9009 -#define V9009 (V + 34833) - 0x110d, 0x116a, 0x11b4, 0, -#undef V9010 -#define V9010 (V + 34837) - 0x110d, 0x116a, 0x11b5, 0, -#undef V9011 -#define V9011 (V + 34841) - 0x110d, 0x116a, 0x11b6, 0, -#undef V9012 -#define V9012 (V + 34845) - 0x110d, 0x116a, 0x11b7, 0, -#undef V9013 -#define V9013 (V + 34849) - 0x110d, 0x116a, 0x11b8, 0, -#undef V9014 -#define V9014 (V + 34853) - 0x110d, 0x116a, 0x11b9, 0, -#undef V9015 -#define V9015 (V + 34857) - 0x110d, 0x116a, 0x11ba, 0, -#undef V9016 -#define V9016 (V + 34861) - 0x110d, 0x116a, 0x11bb, 0, -#undef V9017 -#define V9017 (V + 34865) - 0x110d, 0x116a, 0x11bc, 0, -#undef V9018 -#define V9018 (V + 34869) - 0x110d, 0x116a, 0x11bd, 0, -#undef V9019 -#define V9019 (V + 34873) - 0x110d, 0x116a, 0x11be, 0, -#undef V9020 -#define V9020 (V + 34877) - 0x110d, 0x116a, 0x11bf, 0, -#undef V9021 -#define V9021 (V + 34881) - 0x110d, 0x116a, 0x11c0, 0, -#undef V9022 -#define V9022 (V + 34885) - 0x110d, 0x116a, 0x11c1, 0, -#undef V9023 -#define V9023 (V + 34889) - 0x110d, 0x116a, 0x11c2, 0, -#undef V9024 -#define V9024 (V + 34893) - 0x110d, 0x116b, 0, -#undef V9025 -#define V9025 (V + 34896) - 0x110d, 0x116b, 0x11a8, 0, -#undef V9026 -#define V9026 (V + 34900) - 0x110d, 0x116b, 0x11a9, 0, -#undef V9027 -#define V9027 (V + 34904) - 0x110d, 0x116b, 0x11aa, 0, -#undef V9028 -#define V9028 (V + 34908) - 0x110d, 0x116b, 0x11ab, 0, -#undef V9029 -#define V9029 (V + 34912) - 0x110d, 0x116b, 0x11ac, 0, -#undef V9030 -#define V9030 (V + 34916) - 0x110d, 0x116b, 0x11ad, 0, -#undef V9031 -#define V9031 (V + 34920) - 0x110d, 0x116b, 0x11ae, 0, -#undef V9032 -#define V9032 (V + 34924) - 0x110d, 0x116b, 0x11af, 0, -#undef V9033 -#define V9033 (V + 34928) - 0x110d, 0x116b, 0x11b0, 0, -#undef V9034 -#define V9034 (V + 34932) - 0x110d, 0x116b, 0x11b1, 0, -#undef V9035 -#define V9035 (V + 34936) - 0x110d, 0x116b, 0x11b2, 0, -#undef V9036 -#define V9036 (V + 34940) - 0x110d, 0x116b, 0x11b3, 0, -#undef V9037 -#define V9037 (V + 34944) - 0x110d, 0x116b, 0x11b4, 0, -#undef V9038 -#define V9038 (V + 34948) - 0x110d, 0x116b, 0x11b5, 0, -#undef V9039 -#define V9039 (V + 34952) - 0x110d, 0x116b, 0x11b6, 0, -#undef V9040 -#define V9040 (V + 34956) - 0x110d, 0x116b, 0x11b7, 0, -#undef V9041 -#define V9041 (V + 34960) - 0x110d, 0x116b, 0x11b8, 0, -#undef V9042 -#define V9042 (V + 34964) - 0x110d, 0x116b, 0x11b9, 0, -#undef V9043 -#define V9043 (V + 34968) - 0x110d, 0x116b, 0x11ba, 0, -#undef V9044 -#define V9044 (V + 34972) - 0x110d, 0x116b, 0x11bb, 0, -#undef V9045 -#define V9045 (V + 34976) - 0x110d, 0x116b, 0x11bc, 0, -#undef V9046 -#define V9046 (V + 34980) - 0x110d, 0x116b, 0x11bd, 0, -#undef V9047 -#define V9047 (V + 34984) - 0x110d, 0x116b, 0x11be, 0, -#undef V9048 -#define V9048 (V + 34988) - 0x110d, 0x116b, 0x11bf, 0, -#undef V9049 -#define V9049 (V + 34992) - 0x110d, 0x116b, 0x11c0, 0, -#undef V9050 -#define V9050 (V + 34996) - 0x110d, 0x116b, 0x11c1, 0, -#undef V9051 -#define V9051 (V + 35000) - 0x110d, 0x116b, 0x11c2, 0, -#undef V9052 -#define V9052 (V + 35004) - 0x110d, 0x116c, 0, -#undef V9053 -#define V9053 (V + 35007) - 0x110d, 0x116c, 0x11a8, 0, -#undef V9054 -#define V9054 (V + 35011) - 0x110d, 0x116c, 0x11a9, 0, -#undef V9055 -#define V9055 (V + 35015) - 0x110d, 0x116c, 0x11aa, 0, -#undef V9056 -#define V9056 (V + 35019) - 0x110d, 0x116c, 0x11ab, 0, -#undef V9057 -#define V9057 (V + 35023) - 0x110d, 0x116c, 0x11ac, 0, -#undef V9058 -#define V9058 (V + 35027) - 0x110d, 0x116c, 0x11ad, 0, -#undef V9059 -#define V9059 (V + 35031) - 0x110d, 0x116c, 0x11ae, 0, -#undef V9060 -#define V9060 (V + 35035) - 0x110d, 0x116c, 0x11af, 0, -#undef V9061 -#define V9061 (V + 35039) - 0x110d, 0x116c, 0x11b0, 0, -#undef V9062 -#define V9062 (V + 35043) - 0x110d, 0x116c, 0x11b1, 0, -#undef V9063 -#define V9063 (V + 35047) - 0x110d, 0x116c, 0x11b2, 0, -#undef V9064 -#define V9064 (V + 35051) - 0x110d, 0x116c, 0x11b3, 0, -#undef V9065 -#define V9065 (V + 35055) - 0x110d, 0x116c, 0x11b4, 0, -#undef V9066 -#define V9066 (V + 35059) - 0x110d, 0x116c, 0x11b5, 0, -#undef V9067 -#define V9067 (V + 35063) - 0x110d, 0x116c, 0x11b6, 0, -#undef V9068 -#define V9068 (V + 35067) - 0x110d, 0x116c, 0x11b7, 0, -#undef V9069 -#define V9069 (V + 35071) - 0x110d, 0x116c, 0x11b8, 0, -#undef V9070 -#define V9070 (V + 35075) - 0x110d, 0x116c, 0x11b9, 0, -#undef V9071 -#define V9071 (V + 35079) - 0x110d, 0x116c, 0x11ba, 0, -#undef V9072 -#define V9072 (V + 35083) - 0x110d, 0x116c, 0x11bb, 0, -#undef V9073 -#define V9073 (V + 35087) - 0x110d, 0x116c, 0x11bc, 0, -#undef V9074 -#define V9074 (V + 35091) - 0x110d, 0x116c, 0x11bd, 0, -#undef V9075 -#define V9075 (V + 35095) - 0x110d, 0x116c, 0x11be, 0, -#undef V9076 -#define V9076 (V + 35099) - 0x110d, 0x116c, 0x11bf, 0, -#undef V9077 -#define V9077 (V + 35103) - 0x110d, 0x116c, 0x11c0, 0, -#undef V9078 -#define V9078 (V + 35107) - 0x110d, 0x116c, 0x11c1, 0, -#undef V9079 -#define V9079 (V + 35111) - 0x110d, 0x116c, 0x11c2, 0, -#undef V9080 -#define V9080 (V + 35115) - 0x110d, 0x116d, 0, -#undef V9081 -#define V9081 (V + 35118) - 0x110d, 0x116d, 0x11a8, 0, -#undef V9082 -#define V9082 (V + 35122) - 0x110d, 0x116d, 0x11a9, 0, -#undef V9083 -#define V9083 (V + 35126) - 0x110d, 0x116d, 0x11aa, 0, -#undef V9084 -#define V9084 (V + 35130) - 0x110d, 0x116d, 0x11ab, 0, -#undef V9085 -#define V9085 (V + 35134) - 0x110d, 0x116d, 0x11ac, 0, -#undef V9086 -#define V9086 (V + 35138) - 0x110d, 0x116d, 0x11ad, 0, -#undef V9087 -#define V9087 (V + 35142) - 0x110d, 0x116d, 0x11ae, 0, -#undef V9088 -#define V9088 (V + 35146) - 0x110d, 0x116d, 0x11af, 0, -#undef V9089 -#define V9089 (V + 35150) - 0x110d, 0x116d, 0x11b0, 0, -#undef V9090 -#define V9090 (V + 35154) - 0x110d, 0x116d, 0x11b1, 0, -#undef V9091 -#define V9091 (V + 35158) - 0x110d, 0x116d, 0x11b2, 0, -#undef V9092 -#define V9092 (V + 35162) - 0x110d, 0x116d, 0x11b3, 0, -#undef V9093 -#define V9093 (V + 35166) - 0x110d, 0x116d, 0x11b4, 0, -#undef V9094 -#define V9094 (V + 35170) - 0x110d, 0x116d, 0x11b5, 0, -#undef V9095 -#define V9095 (V + 35174) - 0x110d, 0x116d, 0x11b6, 0, -#undef V9096 -#define V9096 (V + 35178) - 0x110d, 0x116d, 0x11b7, 0, -#undef V9097 -#define V9097 (V + 35182) - 0x110d, 0x116d, 0x11b8, 0, -#undef V9098 -#define V9098 (V + 35186) - 0x110d, 0x116d, 0x11b9, 0, -#undef V9099 -#define V9099 (V + 35190) - 0x110d, 0x116d, 0x11ba, 0, -#undef V9100 -#define V9100 (V + 35194) - 0x110d, 0x116d, 0x11bb, 0, -#undef V9101 -#define V9101 (V + 35198) - 0x110d, 0x116d, 0x11bc, 0, -#undef V9102 -#define V9102 (V + 35202) - 0x110d, 0x116d, 0x11bd, 0, -#undef V9103 -#define V9103 (V + 35206) - 0x110d, 0x116d, 0x11be, 0, -#undef V9104 -#define V9104 (V + 35210) - 0x110d, 0x116d, 0x11bf, 0, -#undef V9105 -#define V9105 (V + 35214) - 0x110d, 0x116d, 0x11c0, 0, -#undef V9106 -#define V9106 (V + 35218) - 0x110d, 0x116d, 0x11c1, 0, -#undef V9107 -#define V9107 (V + 35222) - 0x110d, 0x116d, 0x11c2, 0, -#undef V9108 -#define V9108 (V + 35226) - 0x110d, 0x116e, 0, -#undef V9109 -#define V9109 (V + 35229) - 0x110d, 0x116e, 0x11a8, 0, -#undef V9110 -#define V9110 (V + 35233) - 0x110d, 0x116e, 0x11a9, 0, -#undef V9111 -#define V9111 (V + 35237) - 0x110d, 0x116e, 0x11aa, 0, -#undef V9112 -#define V9112 (V + 35241) - 0x110d, 0x116e, 0x11ab, 0, -#undef V9113 -#define V9113 (V + 35245) - 0x110d, 0x116e, 0x11ac, 0, -#undef V9114 -#define V9114 (V + 35249) - 0x110d, 0x116e, 0x11ad, 0, -#undef V9115 -#define V9115 (V + 35253) - 0x110d, 0x116e, 0x11ae, 0, -#undef V9116 -#define V9116 (V + 35257) - 0x110d, 0x116e, 0x11af, 0, -#undef V9117 -#define V9117 (V + 35261) - 0x110d, 0x116e, 0x11b0, 0, -#undef V9118 -#define V9118 (V + 35265) - 0x110d, 0x116e, 0x11b1, 0, -#undef V9119 -#define V9119 (V + 35269) - 0x110d, 0x116e, 0x11b2, 0, -#undef V9120 -#define V9120 (V + 35273) - 0x110d, 0x116e, 0x11b3, 0, -#undef V9121 -#define V9121 (V + 35277) - 0x110d, 0x116e, 0x11b4, 0, -#undef V9122 -#define V9122 (V + 35281) - 0x110d, 0x116e, 0x11b5, 0, -#undef V9123 -#define V9123 (V + 35285) - 0x110d, 0x116e, 0x11b6, 0, -#undef V9124 -#define V9124 (V + 35289) - 0x110d, 0x116e, 0x11b7, 0, -#undef V9125 -#define V9125 (V + 35293) - 0x110d, 0x116e, 0x11b8, 0, -#undef V9126 -#define V9126 (V + 35297) - 0x110d, 0x116e, 0x11b9, 0, -#undef V9127 -#define V9127 (V + 35301) - 0x110d, 0x116e, 0x11ba, 0, -#undef V9128 -#define V9128 (V + 35305) - 0x110d, 0x116e, 0x11bb, 0, -#undef V9129 -#define V9129 (V + 35309) - 0x110d, 0x116e, 0x11bc, 0, -#undef V9130 -#define V9130 (V + 35313) - 0x110d, 0x116e, 0x11bd, 0, -#undef V9131 -#define V9131 (V + 35317) - 0x110d, 0x116e, 0x11be, 0, -#undef V9132 -#define V9132 (V + 35321) - 0x110d, 0x116e, 0x11bf, 0, -#undef V9133 -#define V9133 (V + 35325) - 0x110d, 0x116e, 0x11c0, 0, -#undef V9134 -#define V9134 (V + 35329) - 0x110d, 0x116e, 0x11c1, 0, -#undef V9135 -#define V9135 (V + 35333) - 0x110d, 0x116e, 0x11c2, 0, -#undef V9136 -#define V9136 (V + 35337) - 0x110d, 0x116f, 0, -#undef V9137 -#define V9137 (V + 35340) - 0x110d, 0x116f, 0x11a8, 0, -#undef V9138 -#define V9138 (V + 35344) - 0x110d, 0x116f, 0x11a9, 0, -#undef V9139 -#define V9139 (V + 35348) - 0x110d, 0x116f, 0x11aa, 0, -#undef V9140 -#define V9140 (V + 35352) - 0x110d, 0x116f, 0x11ab, 0, -#undef V9141 -#define V9141 (V + 35356) - 0x110d, 0x116f, 0x11ac, 0, -#undef V9142 -#define V9142 (V + 35360) - 0x110d, 0x116f, 0x11ad, 0, -#undef V9143 -#define V9143 (V + 35364) - 0x110d, 0x116f, 0x11ae, 0, -#undef V9144 -#define V9144 (V + 35368) - 0x110d, 0x116f, 0x11af, 0, -#undef V9145 -#define V9145 (V + 35372) - 0x110d, 0x116f, 0x11b0, 0, -#undef V9146 -#define V9146 (V + 35376) - 0x110d, 0x116f, 0x11b1, 0, -#undef V9147 -#define V9147 (V + 35380) - 0x110d, 0x116f, 0x11b2, 0, -#undef V9148 -#define V9148 (V + 35384) - 0x110d, 0x116f, 0x11b3, 0, -#undef V9149 -#define V9149 (V + 35388) - 0x110d, 0x116f, 0x11b4, 0, -#undef V9150 -#define V9150 (V + 35392) - 0x110d, 0x116f, 0x11b5, 0, -#undef V9151 -#define V9151 (V + 35396) - 0x110d, 0x116f, 0x11b6, 0, -#undef V9152 -#define V9152 (V + 35400) - 0x110d, 0x116f, 0x11b7, 0, -#undef V9153 -#define V9153 (V + 35404) - 0x110d, 0x116f, 0x11b8, 0, -#undef V9154 -#define V9154 (V + 35408) - 0x110d, 0x116f, 0x11b9, 0, -#undef V9155 -#define V9155 (V + 35412) - 0x110d, 0x116f, 0x11ba, 0, -#undef V9156 -#define V9156 (V + 35416) - 0x110d, 0x116f, 0x11bb, 0, -#undef V9157 -#define V9157 (V + 35420) - 0x110d, 0x116f, 0x11bc, 0, -#undef V9158 -#define V9158 (V + 35424) - 0x110d, 0x116f, 0x11bd, 0, -#undef V9159 -#define V9159 (V + 35428) - 0x110d, 0x116f, 0x11be, 0, -#undef V9160 -#define V9160 (V + 35432) - 0x110d, 0x116f, 0x11bf, 0, -#undef V9161 -#define V9161 (V + 35436) - 0x110d, 0x116f, 0x11c0, 0, -#undef V9162 -#define V9162 (V + 35440) - 0x110d, 0x116f, 0x11c1, 0, -#undef V9163 -#define V9163 (V + 35444) - 0x110d, 0x116f, 0x11c2, 0, -#undef V9164 -#define V9164 (V + 35448) - 0x110d, 0x1170, 0, -#undef V9165 -#define V9165 (V + 35451) - 0x110d, 0x1170, 0x11a8, 0, -#undef V9166 -#define V9166 (V + 35455) - 0x110d, 0x1170, 0x11a9, 0, -#undef V9167 -#define V9167 (V + 35459) - 0x110d, 0x1170, 0x11aa, 0, -#undef V9168 -#define V9168 (V + 35463) - 0x110d, 0x1170, 0x11ab, 0, -#undef V9169 -#define V9169 (V + 35467) - 0x110d, 0x1170, 0x11ac, 0, -#undef V9170 -#define V9170 (V + 35471) - 0x110d, 0x1170, 0x11ad, 0, -#undef V9171 -#define V9171 (V + 35475) - 0x110d, 0x1170, 0x11ae, 0, -#undef V9172 -#define V9172 (V + 35479) - 0x110d, 0x1170, 0x11af, 0, -#undef V9173 -#define V9173 (V + 35483) - 0x110d, 0x1170, 0x11b0, 0, -#undef V9174 -#define V9174 (V + 35487) - 0x110d, 0x1170, 0x11b1, 0, -#undef V9175 -#define V9175 (V + 35491) - 0x110d, 0x1170, 0x11b2, 0, -#undef V9176 -#define V9176 (V + 35495) - 0x110d, 0x1170, 0x11b3, 0, -#undef V9177 -#define V9177 (V + 35499) - 0x110d, 0x1170, 0x11b4, 0, -#undef V9178 -#define V9178 (V + 35503) - 0x110d, 0x1170, 0x11b5, 0, -#undef V9179 -#define V9179 (V + 35507) - 0x110d, 0x1170, 0x11b6, 0, -#undef V9180 -#define V9180 (V + 35511) - 0x110d, 0x1170, 0x11b7, 0, -#undef V9181 -#define V9181 (V + 35515) - 0x110d, 0x1170, 0x11b8, 0, -#undef V9182 -#define V9182 (V + 35519) - 0x110d, 0x1170, 0x11b9, 0, -#undef V9183 -#define V9183 (V + 35523) - 0x110d, 0x1170, 0x11ba, 0, -#undef V9184 -#define V9184 (V + 35527) - 0x110d, 0x1170, 0x11bb, 0, -#undef V9185 -#define V9185 (V + 35531) - 0x110d, 0x1170, 0x11bc, 0, -#undef V9186 -#define V9186 (V + 35535) - 0x110d, 0x1170, 0x11bd, 0, -#undef V9187 -#define V9187 (V + 35539) - 0x110d, 0x1170, 0x11be, 0, -#undef V9188 -#define V9188 (V + 35543) - 0x110d, 0x1170, 0x11bf, 0, -#undef V9189 -#define V9189 (V + 35547) - 0x110d, 0x1170, 0x11c0, 0, -#undef V9190 -#define V9190 (V + 35551) - 0x110d, 0x1170, 0x11c1, 0, -#undef V9191 -#define V9191 (V + 35555) - 0x110d, 0x1170, 0x11c2, 0, -#undef V9192 -#define V9192 (V + 35559) - 0x110d, 0x1171, 0, -#undef V9193 -#define V9193 (V + 35562) - 0x110d, 0x1171, 0x11a8, 0, -#undef V9194 -#define V9194 (V + 35566) - 0x110d, 0x1171, 0x11a9, 0, -#undef V9195 -#define V9195 (V + 35570) - 0x110d, 0x1171, 0x11aa, 0, -#undef V9196 -#define V9196 (V + 35574) - 0x110d, 0x1171, 0x11ab, 0, -#undef V9197 -#define V9197 (V + 35578) - 0x110d, 0x1171, 0x11ac, 0, -#undef V9198 -#define V9198 (V + 35582) - 0x110d, 0x1171, 0x11ad, 0, -#undef V9199 -#define V9199 (V + 35586) - 0x110d, 0x1171, 0x11ae, 0, -#undef V9200 -#define V9200 (V + 35590) - 0x110d, 0x1171, 0x11af, 0, -#undef V9201 -#define V9201 (V + 35594) - 0x110d, 0x1171, 0x11b0, 0, -#undef V9202 -#define V9202 (V + 35598) - 0x110d, 0x1171, 0x11b1, 0, -#undef V9203 -#define V9203 (V + 35602) - 0x110d, 0x1171, 0x11b2, 0, -#undef V9204 -#define V9204 (V + 35606) - 0x110d, 0x1171, 0x11b3, 0, -#undef V9205 -#define V9205 (V + 35610) - 0x110d, 0x1171, 0x11b4, 0, -#undef V9206 -#define V9206 (V + 35614) - 0x110d, 0x1171, 0x11b5, 0, -#undef V9207 -#define V9207 (V + 35618) - 0x110d, 0x1171, 0x11b6, 0, -#undef V9208 -#define V9208 (V + 35622) - 0x110d, 0x1171, 0x11b7, 0, -#undef V9209 -#define V9209 (V + 35626) - 0x110d, 0x1171, 0x11b8, 0, -#undef V9210 -#define V9210 (V + 35630) - 0x110d, 0x1171, 0x11b9, 0, -#undef V9211 -#define V9211 (V + 35634) - 0x110d, 0x1171, 0x11ba, 0, -#undef V9212 -#define V9212 (V + 35638) - 0x110d, 0x1171, 0x11bb, 0, -#undef V9213 -#define V9213 (V + 35642) - 0x110d, 0x1171, 0x11bc, 0, -#undef V9214 -#define V9214 (V + 35646) - 0x110d, 0x1171, 0x11bd, 0, -#undef V9215 -#define V9215 (V + 35650) - 0x110d, 0x1171, 0x11be, 0, -#undef V9216 -#define V9216 (V + 35654) - 0x110d, 0x1171, 0x11bf, 0, -#undef V9217 -#define V9217 (V + 35658) - 0x110d, 0x1171, 0x11c0, 0, -#undef V9218 -#define V9218 (V + 35662) - 0x110d, 0x1171, 0x11c1, 0, -#undef V9219 -#define V9219 (V + 35666) - 0x110d, 0x1171, 0x11c2, 0, -#undef V9220 -#define V9220 (V + 35670) - 0x110d, 0x1172, 0, -#undef V9221 -#define V9221 (V + 35673) - 0x110d, 0x1172, 0x11a8, 0, -#undef V9222 -#define V9222 (V + 35677) - 0x110d, 0x1172, 0x11a9, 0, -#undef V9223 -#define V9223 (V + 35681) - 0x110d, 0x1172, 0x11aa, 0, -#undef V9224 -#define V9224 (V + 35685) - 0x110d, 0x1172, 0x11ab, 0, -#undef V9225 -#define V9225 (V + 35689) - 0x110d, 0x1172, 0x11ac, 0, -#undef V9226 -#define V9226 (V + 35693) - 0x110d, 0x1172, 0x11ad, 0, -#undef V9227 -#define V9227 (V + 35697) - 0x110d, 0x1172, 0x11ae, 0, -#undef V9228 -#define V9228 (V + 35701) - 0x110d, 0x1172, 0x11af, 0, -#undef V9229 -#define V9229 (V + 35705) - 0x110d, 0x1172, 0x11b0, 0, -#undef V9230 -#define V9230 (V + 35709) - 0x110d, 0x1172, 0x11b1, 0, -#undef V9231 -#define V9231 (V + 35713) - 0x110d, 0x1172, 0x11b2, 0, -#undef V9232 -#define V9232 (V + 35717) - 0x110d, 0x1172, 0x11b3, 0, -#undef V9233 -#define V9233 (V + 35721) - 0x110d, 0x1172, 0x11b4, 0, -#undef V9234 -#define V9234 (V + 35725) - 0x110d, 0x1172, 0x11b5, 0, -#undef V9235 -#define V9235 (V + 35729) - 0x110d, 0x1172, 0x11b6, 0, -#undef V9236 -#define V9236 (V + 35733) - 0x110d, 0x1172, 0x11b7, 0, -#undef V9237 -#define V9237 (V + 35737) - 0x110d, 0x1172, 0x11b8, 0, -#undef V9238 -#define V9238 (V + 35741) - 0x110d, 0x1172, 0x11b9, 0, -#undef V9239 -#define V9239 (V + 35745) - 0x110d, 0x1172, 0x11ba, 0, -#undef V9240 -#define V9240 (V + 35749) - 0x110d, 0x1172, 0x11bb, 0, -#undef V9241 -#define V9241 (V + 35753) - 0x110d, 0x1172, 0x11bc, 0, -#undef V9242 -#define V9242 (V + 35757) - 0x110d, 0x1172, 0x11bd, 0, -#undef V9243 -#define V9243 (V + 35761) - 0x110d, 0x1172, 0x11be, 0, -#undef V9244 -#define V9244 (V + 35765) - 0x110d, 0x1172, 0x11bf, 0, -#undef V9245 -#define V9245 (V + 35769) - 0x110d, 0x1172, 0x11c0, 0, -#undef V9246 -#define V9246 (V + 35773) - 0x110d, 0x1172, 0x11c1, 0, -#undef V9247 -#define V9247 (V + 35777) - 0x110d, 0x1172, 0x11c2, 0, -#undef V9248 -#define V9248 (V + 35781) - 0x110d, 0x1173, 0, -#undef V9249 -#define V9249 (V + 35784) - 0x110d, 0x1173, 0x11a8, 0, -#undef V9250 -#define V9250 (V + 35788) - 0x110d, 0x1173, 0x11a9, 0, -#undef V9251 -#define V9251 (V + 35792) - 0x110d, 0x1173, 0x11aa, 0, -#undef V9252 -#define V9252 (V + 35796) - 0x110d, 0x1173, 0x11ab, 0, -#undef V9253 -#define V9253 (V + 35800) - 0x110d, 0x1173, 0x11ac, 0, -#undef V9254 -#define V9254 (V + 35804) - 0x110d, 0x1173, 0x11ad, 0, -#undef V9255 -#define V9255 (V + 35808) - 0x110d, 0x1173, 0x11ae, 0, -#undef V9256 -#define V9256 (V + 35812) - 0x110d, 0x1173, 0x11af, 0, -#undef V9257 -#define V9257 (V + 35816) - 0x110d, 0x1173, 0x11b0, 0, -#undef V9258 -#define V9258 (V + 35820) - 0x110d, 0x1173, 0x11b1, 0, -#undef V9259 -#define V9259 (V + 35824) - 0x110d, 0x1173, 0x11b2, 0, -#undef V9260 -#define V9260 (V + 35828) - 0x110d, 0x1173, 0x11b3, 0, -#undef V9261 -#define V9261 (V + 35832) - 0x110d, 0x1173, 0x11b4, 0, -#undef V9262 -#define V9262 (V + 35836) - 0x110d, 0x1173, 0x11b5, 0, -#undef V9263 -#define V9263 (V + 35840) - 0x110d, 0x1173, 0x11b6, 0, -#undef V9264 -#define V9264 (V + 35844) - 0x110d, 0x1173, 0x11b7, 0, -#undef V9265 -#define V9265 (V + 35848) - 0x110d, 0x1173, 0x11b8, 0, -#undef V9266 -#define V9266 (V + 35852) - 0x110d, 0x1173, 0x11b9, 0, -#undef V9267 -#define V9267 (V + 35856) - 0x110d, 0x1173, 0x11ba, 0, -#undef V9268 -#define V9268 (V + 35860) - 0x110d, 0x1173, 0x11bb, 0, -#undef V9269 -#define V9269 (V + 35864) - 0x110d, 0x1173, 0x11bc, 0, -#undef V9270 -#define V9270 (V + 35868) - 0x110d, 0x1173, 0x11bd, 0, -#undef V9271 -#define V9271 (V + 35872) - 0x110d, 0x1173, 0x11be, 0, -#undef V9272 -#define V9272 (V + 35876) - 0x110d, 0x1173, 0x11bf, 0, -#undef V9273 -#define V9273 (V + 35880) - 0x110d, 0x1173, 0x11c0, 0, -#undef V9274 -#define V9274 (V + 35884) - 0x110d, 0x1173, 0x11c1, 0, -#undef V9275 -#define V9275 (V + 35888) - 0x110d, 0x1173, 0x11c2, 0, -#undef V9276 -#define V9276 (V + 35892) - 0x110d, 0x1174, 0, -#undef V9277 -#define V9277 (V + 35895) - 0x110d, 0x1174, 0x11a8, 0, -#undef V9278 -#define V9278 (V + 35899) - 0x110d, 0x1174, 0x11a9, 0, -#undef V9279 -#define V9279 (V + 35903) - 0x110d, 0x1174, 0x11aa, 0, -#undef V9280 -#define V9280 (V + 35907) - 0x110d, 0x1174, 0x11ab, 0, -#undef V9281 -#define V9281 (V + 35911) - 0x110d, 0x1174, 0x11ac, 0, -#undef V9282 -#define V9282 (V + 35915) - 0x110d, 0x1174, 0x11ad, 0, -#undef V9283 -#define V9283 (V + 35919) - 0x110d, 0x1174, 0x11ae, 0, -#undef V9284 -#define V9284 (V + 35923) - 0x110d, 0x1174, 0x11af, 0, -#undef V9285 -#define V9285 (V + 35927) - 0x110d, 0x1174, 0x11b0, 0, -#undef V9286 -#define V9286 (V + 35931) - 0x110d, 0x1174, 0x11b1, 0, -#undef V9287 -#define V9287 (V + 35935) - 0x110d, 0x1174, 0x11b2, 0, -#undef V9288 -#define V9288 (V + 35939) - 0x110d, 0x1174, 0x11b3, 0, -#undef V9289 -#define V9289 (V + 35943) - 0x110d, 0x1174, 0x11b4, 0, -#undef V9290 -#define V9290 (V + 35947) - 0x110d, 0x1174, 0x11b5, 0, -#undef V9291 -#define V9291 (V + 35951) - 0x110d, 0x1174, 0x11b6, 0, -#undef V9292 -#define V9292 (V + 35955) - 0x110d, 0x1174, 0x11b7, 0, -#undef V9293 -#define V9293 (V + 35959) - 0x110d, 0x1174, 0x11b8, 0, -#undef V9294 -#define V9294 (V + 35963) - 0x110d, 0x1174, 0x11b9, 0, -#undef V9295 -#define V9295 (V + 35967) - 0x110d, 0x1174, 0x11ba, 0, -#undef V9296 -#define V9296 (V + 35971) - 0x110d, 0x1174, 0x11bb, 0, -#undef V9297 -#define V9297 (V + 35975) - 0x110d, 0x1174, 0x11bc, 0, -#undef V9298 -#define V9298 (V + 35979) - 0x110d, 0x1174, 0x11bd, 0, -#undef V9299 -#define V9299 (V + 35983) - 0x110d, 0x1174, 0x11be, 0, -#undef V9300 -#define V9300 (V + 35987) - 0x110d, 0x1174, 0x11bf, 0, -#undef V9301 -#define V9301 (V + 35991) - 0x110d, 0x1174, 0x11c0, 0, -#undef V9302 -#define V9302 (V + 35995) - 0x110d, 0x1174, 0x11c1, 0, -#undef V9303 -#define V9303 (V + 35999) - 0x110d, 0x1174, 0x11c2, 0, -#undef V9304 -#define V9304 (V + 36003) - 0x110d, 0x1175, 0, -#undef V9305 -#define V9305 (V + 36006) - 0x110d, 0x1175, 0x11a8, 0, -#undef V9306 -#define V9306 (V + 36010) - 0x110d, 0x1175, 0x11a9, 0, -#undef V9307 -#define V9307 (V + 36014) - 0x110d, 0x1175, 0x11aa, 0, -#undef V9308 -#define V9308 (V + 36018) - 0x110d, 0x1175, 0x11ab, 0, -#undef V9309 -#define V9309 (V + 36022) - 0x110d, 0x1175, 0x11ac, 0, -#undef V9310 -#define V9310 (V + 36026) - 0x110d, 0x1175, 0x11ad, 0, -#undef V9311 -#define V9311 (V + 36030) - 0x110d, 0x1175, 0x11ae, 0, -#undef V9312 -#define V9312 (V + 36034) - 0x110d, 0x1175, 0x11af, 0, -#undef V9313 -#define V9313 (V + 36038) - 0x110d, 0x1175, 0x11b0, 0, -#undef V9314 -#define V9314 (V + 36042) - 0x110d, 0x1175, 0x11b1, 0, -#undef V9315 -#define V9315 (V + 36046) - 0x110d, 0x1175, 0x11b2, 0, -#undef V9316 -#define V9316 (V + 36050) - 0x110d, 0x1175, 0x11b3, 0, -#undef V9317 -#define V9317 (V + 36054) - 0x110d, 0x1175, 0x11b4, 0, -#undef V9318 -#define V9318 (V + 36058) - 0x110d, 0x1175, 0x11b5, 0, -#undef V9319 -#define V9319 (V + 36062) - 0x110d, 0x1175, 0x11b6, 0, -#undef V9320 -#define V9320 (V + 36066) - 0x110d, 0x1175, 0x11b7, 0, -#undef V9321 -#define V9321 (V + 36070) - 0x110d, 0x1175, 0x11b8, 0, -#undef V9322 -#define V9322 (V + 36074) - 0x110d, 0x1175, 0x11b9, 0, -#undef V9323 -#define V9323 (V + 36078) - 0x110d, 0x1175, 0x11ba, 0, -#undef V9324 -#define V9324 (V + 36082) - 0x110d, 0x1175, 0x11bb, 0, -#undef V9325 -#define V9325 (V + 36086) - 0x110d, 0x1175, 0x11bc, 0, -#undef V9326 -#define V9326 (V + 36090) - 0x110d, 0x1175, 0x11bd, 0, -#undef V9327 -#define V9327 (V + 36094) - 0x110d, 0x1175, 0x11be, 0, -#undef V9328 -#define V9328 (V + 36098) - 0x110d, 0x1175, 0x11bf, 0, -#undef V9329 -#define V9329 (V + 36102) - 0x110d, 0x1175, 0x11c0, 0, -#undef V9330 -#define V9330 (V + 36106) - 0x110d, 0x1175, 0x11c1, 0, -#undef V9331 -#define V9331 (V + 36110) - 0x110d, 0x1175, 0x11c2, 0, -#undef V9332 -#define V9332 (V + 36114) - 0x110e, 0x1161, 0, -#undef V9333 -#define V9333 (V + 36117) - 0x110e, 0x1161, 0x11a8, 0, -#undef V9334 -#define V9334 (V + 36121) - 0x110e, 0x1161, 0x11a9, 0, -#undef V9335 -#define V9335 (V + 36125) - 0x110e, 0x1161, 0x11aa, 0, -#undef V9336 -#define V9336 (V + 36129) - 0x110e, 0x1161, 0x11ab, 0, -#undef V9337 -#define V9337 (V + 36133) - 0x110e, 0x1161, 0x11ac, 0, -#undef V9338 -#define V9338 (V + 36137) - 0x110e, 0x1161, 0x11ad, 0, -#undef V9339 -#define V9339 (V + 36141) - 0x110e, 0x1161, 0x11ae, 0, -#undef V9340 -#define V9340 (V + 36145) - 0x110e, 0x1161, 0x11af, 0, -#undef V9341 -#define V9341 (V + 36149) - 0x110e, 0x1161, 0x11b0, 0, -#undef V9342 -#define V9342 (V + 36153) - 0x110e, 0x1161, 0x11b1, 0, -#undef V9343 -#define V9343 (V + 36157) - 0x110e, 0x1161, 0x11b2, 0, -#undef V9344 -#define V9344 (V + 36161) - 0x110e, 0x1161, 0x11b3, 0, -#undef V9345 -#define V9345 (V + 36165) - 0x110e, 0x1161, 0x11b4, 0, -#undef V9346 -#define V9346 (V + 36169) - 0x110e, 0x1161, 0x11b5, 0, -#undef V9347 -#define V9347 (V + 36173) - 0x110e, 0x1161, 0x11b6, 0, -#undef V9348 -#define V9348 (V + 36177) - 0x110e, 0x1161, 0x11b7, 0, -#undef V9349 -#define V9349 (V + 36181) - 0x110e, 0x1161, 0x11b8, 0, -#undef V9350 -#define V9350 (V + 36185) - 0x110e, 0x1161, 0x11b9, 0, -#undef V9351 -#define V9351 (V + 36189) - 0x110e, 0x1161, 0x11ba, 0, -#undef V9352 -#define V9352 (V + 36193) - 0x110e, 0x1161, 0x11bb, 0, -#undef V9353 -#define V9353 (V + 36197) - 0x110e, 0x1161, 0x11bc, 0, -#undef V9354 -#define V9354 (V + 36201) - 0x110e, 0x1161, 0x11bd, 0, -#undef V9355 -#define V9355 (V + 36205) - 0x110e, 0x1161, 0x11be, 0, -#undef V9356 -#define V9356 (V + 36209) - 0x110e, 0x1161, 0x11bf, 0, -#undef V9357 -#define V9357 (V + 36213) - 0x110e, 0x1161, 0x11c0, 0, -#undef V9358 -#define V9358 (V + 36217) - 0x110e, 0x1161, 0x11c1, 0, -#undef V9359 -#define V9359 (V + 36221) - 0x110e, 0x1161, 0x11c2, 0, -#undef V9360 -#define V9360 (V + 36225) - 0x110e, 0x1162, 0, -#undef V9361 -#define V9361 (V + 36228) - 0x110e, 0x1162, 0x11a8, 0, -#undef V9362 -#define V9362 (V + 36232) - 0x110e, 0x1162, 0x11a9, 0, -#undef V9363 -#define V9363 (V + 36236) - 0x110e, 0x1162, 0x11aa, 0, -#undef V9364 -#define V9364 (V + 36240) - 0x110e, 0x1162, 0x11ab, 0, -#undef V9365 -#define V9365 (V + 36244) - 0x110e, 0x1162, 0x11ac, 0, -#undef V9366 -#define V9366 (V + 36248) - 0x110e, 0x1162, 0x11ad, 0, -#undef V9367 -#define V9367 (V + 36252) - 0x110e, 0x1162, 0x11ae, 0, -#undef V9368 -#define V9368 (V + 36256) - 0x110e, 0x1162, 0x11af, 0, -#undef V9369 -#define V9369 (V + 36260) - 0x110e, 0x1162, 0x11b0, 0, -#undef V9370 -#define V9370 (V + 36264) - 0x110e, 0x1162, 0x11b1, 0, -#undef V9371 -#define V9371 (V + 36268) - 0x110e, 0x1162, 0x11b2, 0, -#undef V9372 -#define V9372 (V + 36272) - 0x110e, 0x1162, 0x11b3, 0, -#undef V9373 -#define V9373 (V + 36276) - 0x110e, 0x1162, 0x11b4, 0, -#undef V9374 -#define V9374 (V + 36280) - 0x110e, 0x1162, 0x11b5, 0, -#undef V9375 -#define V9375 (V + 36284) - 0x110e, 0x1162, 0x11b6, 0, -#undef V9376 -#define V9376 (V + 36288) - 0x110e, 0x1162, 0x11b7, 0, -#undef V9377 -#define V9377 (V + 36292) - 0x110e, 0x1162, 0x11b8, 0, -#undef V9378 -#define V9378 (V + 36296) - 0x110e, 0x1162, 0x11b9, 0, -#undef V9379 -#define V9379 (V + 36300) - 0x110e, 0x1162, 0x11ba, 0, -#undef V9380 -#define V9380 (V + 36304) - 0x110e, 0x1162, 0x11bb, 0, -#undef V9381 -#define V9381 (V + 36308) - 0x110e, 0x1162, 0x11bc, 0, -#undef V9382 -#define V9382 (V + 36312) - 0x110e, 0x1162, 0x11bd, 0, -#undef V9383 -#define V9383 (V + 36316) - 0x110e, 0x1162, 0x11be, 0, -#undef V9384 -#define V9384 (V + 36320) - 0x110e, 0x1162, 0x11bf, 0, -#undef V9385 -#define V9385 (V + 36324) - 0x110e, 0x1162, 0x11c0, 0, -#undef V9386 -#define V9386 (V + 36328) - 0x110e, 0x1162, 0x11c1, 0, -#undef V9387 -#define V9387 (V + 36332) - 0x110e, 0x1162, 0x11c2, 0, -#undef V9388 -#define V9388 (V + 36336) - 0x110e, 0x1163, 0, -#undef V9389 -#define V9389 (V + 36339) - 0x110e, 0x1163, 0x11a8, 0, -#undef V9390 -#define V9390 (V + 36343) - 0x110e, 0x1163, 0x11a9, 0, -#undef V9391 -#define V9391 (V + 36347) - 0x110e, 0x1163, 0x11aa, 0, -#undef V9392 -#define V9392 (V + 36351) - 0x110e, 0x1163, 0x11ab, 0, -#undef V9393 -#define V9393 (V + 36355) - 0x110e, 0x1163, 0x11ac, 0, -#undef V9394 -#define V9394 (V + 36359) - 0x110e, 0x1163, 0x11ad, 0, -#undef V9395 -#define V9395 (V + 36363) - 0x110e, 0x1163, 0x11ae, 0, -#undef V9396 -#define V9396 (V + 36367) - 0x110e, 0x1163, 0x11af, 0, -#undef V9397 -#define V9397 (V + 36371) - 0x110e, 0x1163, 0x11b0, 0, -#undef V9398 -#define V9398 (V + 36375) - 0x110e, 0x1163, 0x11b1, 0, -#undef V9399 -#define V9399 (V + 36379) - 0x110e, 0x1163, 0x11b2, 0, -#undef V9400 -#define V9400 (V + 36383) - 0x110e, 0x1163, 0x11b3, 0, -#undef V9401 -#define V9401 (V + 36387) - 0x110e, 0x1163, 0x11b4, 0, -#undef V9402 -#define V9402 (V + 36391) - 0x110e, 0x1163, 0x11b5, 0, -#undef V9403 -#define V9403 (V + 36395) - 0x110e, 0x1163, 0x11b6, 0, -#undef V9404 -#define V9404 (V + 36399) - 0x110e, 0x1163, 0x11b7, 0, -#undef V9405 -#define V9405 (V + 36403) - 0x110e, 0x1163, 0x11b8, 0, -#undef V9406 -#define V9406 (V + 36407) - 0x110e, 0x1163, 0x11b9, 0, -#undef V9407 -#define V9407 (V + 36411) - 0x110e, 0x1163, 0x11ba, 0, -#undef V9408 -#define V9408 (V + 36415) - 0x110e, 0x1163, 0x11bb, 0, -#undef V9409 -#define V9409 (V + 36419) - 0x110e, 0x1163, 0x11bc, 0, -#undef V9410 -#define V9410 (V + 36423) - 0x110e, 0x1163, 0x11bd, 0, -#undef V9411 -#define V9411 (V + 36427) - 0x110e, 0x1163, 0x11be, 0, -#undef V9412 -#define V9412 (V + 36431) - 0x110e, 0x1163, 0x11bf, 0, -#undef V9413 -#define V9413 (V + 36435) - 0x110e, 0x1163, 0x11c0, 0, -#undef V9414 -#define V9414 (V + 36439) - 0x110e, 0x1163, 0x11c1, 0, -#undef V9415 -#define V9415 (V + 36443) - 0x110e, 0x1163, 0x11c2, 0, -#undef V9416 -#define V9416 (V + 36447) - 0x110e, 0x1164, 0, -#undef V9417 -#define V9417 (V + 36450) - 0x110e, 0x1164, 0x11a8, 0, -#undef V9418 -#define V9418 (V + 36454) - 0x110e, 0x1164, 0x11a9, 0, -#undef V9419 -#define V9419 (V + 36458) - 0x110e, 0x1164, 0x11aa, 0, -#undef V9420 -#define V9420 (V + 36462) - 0x110e, 0x1164, 0x11ab, 0, -#undef V9421 -#define V9421 (V + 36466) - 0x110e, 0x1164, 0x11ac, 0, -#undef V9422 -#define V9422 (V + 36470) - 0x110e, 0x1164, 0x11ad, 0, -#undef V9423 -#define V9423 (V + 36474) - 0x110e, 0x1164, 0x11ae, 0, -#undef V9424 -#define V9424 (V + 36478) - 0x110e, 0x1164, 0x11af, 0, -#undef V9425 -#define V9425 (V + 36482) - 0x110e, 0x1164, 0x11b0, 0, -#undef V9426 -#define V9426 (V + 36486) - 0x110e, 0x1164, 0x11b1, 0, -#undef V9427 -#define V9427 (V + 36490) - 0x110e, 0x1164, 0x11b2, 0, -#undef V9428 -#define V9428 (V + 36494) - 0x110e, 0x1164, 0x11b3, 0, -#undef V9429 -#define V9429 (V + 36498) - 0x110e, 0x1164, 0x11b4, 0, -#undef V9430 -#define V9430 (V + 36502) - 0x110e, 0x1164, 0x11b5, 0, -#undef V9431 -#define V9431 (V + 36506) - 0x110e, 0x1164, 0x11b6, 0, -#undef V9432 -#define V9432 (V + 36510) - 0x110e, 0x1164, 0x11b7, 0, -#undef V9433 -#define V9433 (V + 36514) - 0x110e, 0x1164, 0x11b8, 0, -#undef V9434 -#define V9434 (V + 36518) - 0x110e, 0x1164, 0x11b9, 0, -#undef V9435 -#define V9435 (V + 36522) - 0x110e, 0x1164, 0x11ba, 0, -#undef V9436 -#define V9436 (V + 36526) - 0x110e, 0x1164, 0x11bb, 0, -#undef V9437 -#define V9437 (V + 36530) - 0x110e, 0x1164, 0x11bc, 0, -#undef V9438 -#define V9438 (V + 36534) - 0x110e, 0x1164, 0x11bd, 0, -#undef V9439 -#define V9439 (V + 36538) - 0x110e, 0x1164, 0x11be, 0, -#undef V9440 -#define V9440 (V + 36542) - 0x110e, 0x1164, 0x11bf, 0, -#undef V9441 -#define V9441 (V + 36546) - 0x110e, 0x1164, 0x11c0, 0, -#undef V9442 -#define V9442 (V + 36550) - 0x110e, 0x1164, 0x11c1, 0, -#undef V9443 -#define V9443 (V + 36554) - 0x110e, 0x1164, 0x11c2, 0, -#undef V9444 -#define V9444 (V + 36558) - 0x110e, 0x1165, 0, -#undef V9445 -#define V9445 (V + 36561) - 0x110e, 0x1165, 0x11a8, 0, -#undef V9446 -#define V9446 (V + 36565) - 0x110e, 0x1165, 0x11a9, 0, -#undef V9447 -#define V9447 (V + 36569) - 0x110e, 0x1165, 0x11aa, 0, -#undef V9448 -#define V9448 (V + 36573) - 0x110e, 0x1165, 0x11ab, 0, -#undef V9449 -#define V9449 (V + 36577) - 0x110e, 0x1165, 0x11ac, 0, -#undef V9450 -#define V9450 (V + 36581) - 0x110e, 0x1165, 0x11ad, 0, -#undef V9451 -#define V9451 (V + 36585) - 0x110e, 0x1165, 0x11ae, 0, -#undef V9452 -#define V9452 (V + 36589) - 0x110e, 0x1165, 0x11af, 0, -#undef V9453 -#define V9453 (V + 36593) - 0x110e, 0x1165, 0x11b0, 0, -#undef V9454 -#define V9454 (V + 36597) - 0x110e, 0x1165, 0x11b1, 0, -#undef V9455 -#define V9455 (V + 36601) - 0x110e, 0x1165, 0x11b2, 0, -#undef V9456 -#define V9456 (V + 36605) - 0x110e, 0x1165, 0x11b3, 0, -#undef V9457 -#define V9457 (V + 36609) - 0x110e, 0x1165, 0x11b4, 0, -#undef V9458 -#define V9458 (V + 36613) - 0x110e, 0x1165, 0x11b5, 0, -#undef V9459 -#define V9459 (V + 36617) - 0x110e, 0x1165, 0x11b6, 0, -#undef V9460 -#define V9460 (V + 36621) - 0x110e, 0x1165, 0x11b7, 0, -#undef V9461 -#define V9461 (V + 36625) - 0x110e, 0x1165, 0x11b8, 0, -#undef V9462 -#define V9462 (V + 36629) - 0x110e, 0x1165, 0x11b9, 0, -#undef V9463 -#define V9463 (V + 36633) - 0x110e, 0x1165, 0x11ba, 0, -#undef V9464 -#define V9464 (V + 36637) - 0x110e, 0x1165, 0x11bb, 0, -#undef V9465 -#define V9465 (V + 36641) - 0x110e, 0x1165, 0x11bc, 0, -#undef V9466 -#define V9466 (V + 36645) - 0x110e, 0x1165, 0x11bd, 0, -#undef V9467 -#define V9467 (V + 36649) - 0x110e, 0x1165, 0x11be, 0, -#undef V9468 -#define V9468 (V + 36653) - 0x110e, 0x1165, 0x11bf, 0, -#undef V9469 -#define V9469 (V + 36657) - 0x110e, 0x1165, 0x11c0, 0, -#undef V9470 -#define V9470 (V + 36661) - 0x110e, 0x1165, 0x11c1, 0, -#undef V9471 -#define V9471 (V + 36665) - 0x110e, 0x1165, 0x11c2, 0, -#undef V9472 -#define V9472 (V + 36669) - 0x110e, 0x1166, 0, -#undef V9473 -#define V9473 (V + 36672) - 0x110e, 0x1166, 0x11a8, 0, -#undef V9474 -#define V9474 (V + 36676) - 0x110e, 0x1166, 0x11a9, 0, -#undef V9475 -#define V9475 (V + 36680) - 0x110e, 0x1166, 0x11aa, 0, -#undef V9476 -#define V9476 (V + 36684) - 0x110e, 0x1166, 0x11ab, 0, -#undef V9477 -#define V9477 (V + 36688) - 0x110e, 0x1166, 0x11ac, 0, -#undef V9478 -#define V9478 (V + 36692) - 0x110e, 0x1166, 0x11ad, 0, -#undef V9479 -#define V9479 (V + 36696) - 0x110e, 0x1166, 0x11ae, 0, -#undef V9480 -#define V9480 (V + 36700) - 0x110e, 0x1166, 0x11af, 0, -#undef V9481 -#define V9481 (V + 36704) - 0x110e, 0x1166, 0x11b0, 0, -#undef V9482 -#define V9482 (V + 36708) - 0x110e, 0x1166, 0x11b1, 0, -#undef V9483 -#define V9483 (V + 36712) - 0x110e, 0x1166, 0x11b2, 0, -#undef V9484 -#define V9484 (V + 36716) - 0x110e, 0x1166, 0x11b3, 0, -#undef V9485 -#define V9485 (V + 36720) - 0x110e, 0x1166, 0x11b4, 0, -#undef V9486 -#define V9486 (V + 36724) - 0x110e, 0x1166, 0x11b5, 0, -#undef V9487 -#define V9487 (V + 36728) - 0x110e, 0x1166, 0x11b6, 0, -#undef V9488 -#define V9488 (V + 36732) - 0x110e, 0x1166, 0x11b7, 0, -#undef V9489 -#define V9489 (V + 36736) - 0x110e, 0x1166, 0x11b8, 0, -#undef V9490 -#define V9490 (V + 36740) - 0x110e, 0x1166, 0x11b9, 0, -#undef V9491 -#define V9491 (V + 36744) - 0x110e, 0x1166, 0x11ba, 0, -#undef V9492 -#define V9492 (V + 36748) - 0x110e, 0x1166, 0x11bb, 0, -#undef V9493 -#define V9493 (V + 36752) - 0x110e, 0x1166, 0x11bc, 0, -#undef V9494 -#define V9494 (V + 36756) - 0x110e, 0x1166, 0x11bd, 0, -#undef V9495 -#define V9495 (V + 36760) - 0x110e, 0x1166, 0x11be, 0, -#undef V9496 -#define V9496 (V + 36764) - 0x110e, 0x1166, 0x11bf, 0, -#undef V9497 -#define V9497 (V + 36768) - 0x110e, 0x1166, 0x11c0, 0, -#undef V9498 -#define V9498 (V + 36772) - 0x110e, 0x1166, 0x11c1, 0, -#undef V9499 -#define V9499 (V + 36776) - 0x110e, 0x1166, 0x11c2, 0, -#undef V9500 -#define V9500 (V + 36780) - 0x110e, 0x1167, 0, -#undef V9501 -#define V9501 (V + 36783) - 0x110e, 0x1167, 0x11a8, 0, -#undef V9502 -#define V9502 (V + 36787) - 0x110e, 0x1167, 0x11a9, 0, -#undef V9503 -#define V9503 (V + 36791) - 0x110e, 0x1167, 0x11aa, 0, -#undef V9504 -#define V9504 (V + 36795) - 0x110e, 0x1167, 0x11ab, 0, -#undef V9505 -#define V9505 (V + 36799) - 0x110e, 0x1167, 0x11ac, 0, -#undef V9506 -#define V9506 (V + 36803) - 0x110e, 0x1167, 0x11ad, 0, -#undef V9507 -#define V9507 (V + 36807) - 0x110e, 0x1167, 0x11ae, 0, -#undef V9508 -#define V9508 (V + 36811) - 0x110e, 0x1167, 0x11af, 0, -#undef V9509 -#define V9509 (V + 36815) - 0x110e, 0x1167, 0x11b0, 0, -#undef V9510 -#define V9510 (V + 36819) - 0x110e, 0x1167, 0x11b1, 0, -#undef V9511 -#define V9511 (V + 36823) - 0x110e, 0x1167, 0x11b2, 0, -#undef V9512 -#define V9512 (V + 36827) - 0x110e, 0x1167, 0x11b3, 0, -#undef V9513 -#define V9513 (V + 36831) - 0x110e, 0x1167, 0x11b4, 0, -#undef V9514 -#define V9514 (V + 36835) - 0x110e, 0x1167, 0x11b5, 0, -#undef V9515 -#define V9515 (V + 36839) - 0x110e, 0x1167, 0x11b6, 0, -#undef V9516 -#define V9516 (V + 36843) - 0x110e, 0x1167, 0x11b7, 0, -#undef V9517 -#define V9517 (V + 36847) - 0x110e, 0x1167, 0x11b8, 0, -#undef V9518 -#define V9518 (V + 36851) - 0x110e, 0x1167, 0x11b9, 0, -#undef V9519 -#define V9519 (V + 36855) - 0x110e, 0x1167, 0x11ba, 0, -#undef V9520 -#define V9520 (V + 36859) - 0x110e, 0x1167, 0x11bb, 0, -#undef V9521 -#define V9521 (V + 36863) - 0x110e, 0x1167, 0x11bc, 0, -#undef V9522 -#define V9522 (V + 36867) - 0x110e, 0x1167, 0x11bd, 0, -#undef V9523 -#define V9523 (V + 36871) - 0x110e, 0x1167, 0x11be, 0, -#undef V9524 -#define V9524 (V + 36875) - 0x110e, 0x1167, 0x11bf, 0, -#undef V9525 -#define V9525 (V + 36879) - 0x110e, 0x1167, 0x11c0, 0, -#undef V9526 -#define V9526 (V + 36883) - 0x110e, 0x1167, 0x11c1, 0, -#undef V9527 -#define V9527 (V + 36887) - 0x110e, 0x1167, 0x11c2, 0, -#undef V9528 -#define V9528 (V + 36891) - 0x110e, 0x1168, 0, -#undef V9529 -#define V9529 (V + 36894) - 0x110e, 0x1168, 0x11a8, 0, -#undef V9530 -#define V9530 (V + 36898) - 0x110e, 0x1168, 0x11a9, 0, -#undef V9531 -#define V9531 (V + 36902) - 0x110e, 0x1168, 0x11aa, 0, -#undef V9532 -#define V9532 (V + 36906) - 0x110e, 0x1168, 0x11ab, 0, -#undef V9533 -#define V9533 (V + 36910) - 0x110e, 0x1168, 0x11ac, 0, -#undef V9534 -#define V9534 (V + 36914) - 0x110e, 0x1168, 0x11ad, 0, -#undef V9535 -#define V9535 (V + 36918) - 0x110e, 0x1168, 0x11ae, 0, -#undef V9536 -#define V9536 (V + 36922) - 0x110e, 0x1168, 0x11af, 0, -#undef V9537 -#define V9537 (V + 36926) - 0x110e, 0x1168, 0x11b0, 0, -#undef V9538 -#define V9538 (V + 36930) - 0x110e, 0x1168, 0x11b1, 0, -#undef V9539 -#define V9539 (V + 36934) - 0x110e, 0x1168, 0x11b2, 0, -#undef V9540 -#define V9540 (V + 36938) - 0x110e, 0x1168, 0x11b3, 0, -#undef V9541 -#define V9541 (V + 36942) - 0x110e, 0x1168, 0x11b4, 0, -#undef V9542 -#define V9542 (V + 36946) - 0x110e, 0x1168, 0x11b5, 0, -#undef V9543 -#define V9543 (V + 36950) - 0x110e, 0x1168, 0x11b6, 0, -#undef V9544 -#define V9544 (V + 36954) - 0x110e, 0x1168, 0x11b7, 0, -#undef V9545 -#define V9545 (V + 36958) - 0x110e, 0x1168, 0x11b8, 0, -#undef V9546 -#define V9546 (V + 36962) - 0x110e, 0x1168, 0x11b9, 0, -#undef V9547 -#define V9547 (V + 36966) - 0x110e, 0x1168, 0x11ba, 0, -#undef V9548 -#define V9548 (V + 36970) - 0x110e, 0x1168, 0x11bb, 0, -#undef V9549 -#define V9549 (V + 36974) - 0x110e, 0x1168, 0x11bc, 0, -#undef V9550 -#define V9550 (V + 36978) - 0x110e, 0x1168, 0x11bd, 0, -#undef V9551 -#define V9551 (V + 36982) - 0x110e, 0x1168, 0x11be, 0, -#undef V9552 -#define V9552 (V + 36986) - 0x110e, 0x1168, 0x11bf, 0, -#undef V9553 -#define V9553 (V + 36990) - 0x110e, 0x1168, 0x11c0, 0, -#undef V9554 -#define V9554 (V + 36994) - 0x110e, 0x1168, 0x11c1, 0, -#undef V9555 -#define V9555 (V + 36998) - 0x110e, 0x1168, 0x11c2, 0, -#undef V9556 -#define V9556 (V + 37002) - 0x110e, 0x1169, 0, -#undef V9557 -#define V9557 (V + 37005) - 0x110e, 0x1169, 0x11a8, 0, -#undef V9558 -#define V9558 (V + 37009) - 0x110e, 0x1169, 0x11a9, 0, -#undef V9559 -#define V9559 (V + 37013) - 0x110e, 0x1169, 0x11aa, 0, -#undef V9560 -#define V9560 (V + 37017) - 0x110e, 0x1169, 0x11ab, 0, -#undef V9561 -#define V9561 (V + 37021) - 0x110e, 0x1169, 0x11ac, 0, -#undef V9562 -#define V9562 (V + 37025) - 0x110e, 0x1169, 0x11ad, 0, -#undef V9563 -#define V9563 (V + 37029) - 0x110e, 0x1169, 0x11ae, 0, -#undef V9564 -#define V9564 (V + 37033) - 0x110e, 0x1169, 0x11af, 0, -#undef V9565 -#define V9565 (V + 37037) - 0x110e, 0x1169, 0x11b0, 0, -#undef V9566 -#define V9566 (V + 37041) - 0x110e, 0x1169, 0x11b1, 0, -#undef V9567 -#define V9567 (V + 37045) - 0x110e, 0x1169, 0x11b2, 0, -#undef V9568 -#define V9568 (V + 37049) - 0x110e, 0x1169, 0x11b3, 0, -#undef V9569 -#define V9569 (V + 37053) - 0x110e, 0x1169, 0x11b4, 0, -#undef V9570 -#define V9570 (V + 37057) - 0x110e, 0x1169, 0x11b5, 0, -#undef V9571 -#define V9571 (V + 37061) - 0x110e, 0x1169, 0x11b6, 0, -#undef V9572 -#define V9572 (V + 37065) - 0x110e, 0x1169, 0x11b7, 0, -#undef V9573 -#define V9573 (V + 37069) - 0x110e, 0x1169, 0x11b8, 0, -#undef V9574 -#define V9574 (V + 37073) - 0x110e, 0x1169, 0x11b9, 0, -#undef V9575 -#define V9575 (V + 37077) - 0x110e, 0x1169, 0x11ba, 0, -#undef V9576 -#define V9576 (V + 37081) - 0x110e, 0x1169, 0x11bb, 0, -#undef V9577 -#define V9577 (V + 37085) - 0x110e, 0x1169, 0x11bc, 0, -#undef V9578 -#define V9578 (V + 37089) - 0x110e, 0x1169, 0x11bd, 0, -#undef V9579 -#define V9579 (V + 37093) - 0x110e, 0x1169, 0x11be, 0, -#undef V9580 -#define V9580 (V + 37097) - 0x110e, 0x1169, 0x11bf, 0, -#undef V9581 -#define V9581 (V + 37101) - 0x110e, 0x1169, 0x11c0, 0, -#undef V9582 -#define V9582 (V + 37105) - 0x110e, 0x1169, 0x11c1, 0, -#undef V9583 -#define V9583 (V + 37109) - 0x110e, 0x1169, 0x11c2, 0, -#undef V9584 -#define V9584 (V + 37113) - 0x110e, 0x116a, 0, -#undef V9585 -#define V9585 (V + 37116) - 0x110e, 0x116a, 0x11a8, 0, -#undef V9586 -#define V9586 (V + 37120) - 0x110e, 0x116a, 0x11a9, 0, -#undef V9587 -#define V9587 (V + 37124) - 0x110e, 0x116a, 0x11aa, 0, -#undef V9588 -#define V9588 (V + 37128) - 0x110e, 0x116a, 0x11ab, 0, -#undef V9589 -#define V9589 (V + 37132) - 0x110e, 0x116a, 0x11ac, 0, -#undef V9590 -#define V9590 (V + 37136) - 0x110e, 0x116a, 0x11ad, 0, -#undef V9591 -#define V9591 (V + 37140) - 0x110e, 0x116a, 0x11ae, 0, -#undef V9592 -#define V9592 (V + 37144) - 0x110e, 0x116a, 0x11af, 0, -#undef V9593 -#define V9593 (V + 37148) - 0x110e, 0x116a, 0x11b0, 0, -#undef V9594 -#define V9594 (V + 37152) - 0x110e, 0x116a, 0x11b1, 0, -#undef V9595 -#define V9595 (V + 37156) - 0x110e, 0x116a, 0x11b2, 0, -#undef V9596 -#define V9596 (V + 37160) - 0x110e, 0x116a, 0x11b3, 0, -#undef V9597 -#define V9597 (V + 37164) - 0x110e, 0x116a, 0x11b4, 0, -#undef V9598 -#define V9598 (V + 37168) - 0x110e, 0x116a, 0x11b5, 0, -#undef V9599 -#define V9599 (V + 37172) - 0x110e, 0x116a, 0x11b6, 0, -#undef V9600 -#define V9600 (V + 37176) - 0x110e, 0x116a, 0x11b7, 0, -#undef V9601 -#define V9601 (V + 37180) - 0x110e, 0x116a, 0x11b8, 0, -#undef V9602 -#define V9602 (V + 37184) - 0x110e, 0x116a, 0x11b9, 0, -#undef V9603 -#define V9603 (V + 37188) - 0x110e, 0x116a, 0x11ba, 0, -#undef V9604 -#define V9604 (V + 37192) - 0x110e, 0x116a, 0x11bb, 0, -#undef V9605 -#define V9605 (V + 37196) - 0x110e, 0x116a, 0x11bc, 0, -#undef V9606 -#define V9606 (V + 37200) - 0x110e, 0x116a, 0x11bd, 0, -#undef V9607 -#define V9607 (V + 37204) - 0x110e, 0x116a, 0x11be, 0, -#undef V9608 -#define V9608 (V + 37208) - 0x110e, 0x116a, 0x11bf, 0, -#undef V9609 -#define V9609 (V + 37212) - 0x110e, 0x116a, 0x11c0, 0, -#undef V9610 -#define V9610 (V + 37216) - 0x110e, 0x116a, 0x11c1, 0, -#undef V9611 -#define V9611 (V + 37220) - 0x110e, 0x116a, 0x11c2, 0, -#undef V9612 -#define V9612 (V + 37224) - 0x110e, 0x116b, 0, -#undef V9613 -#define V9613 (V + 37227) - 0x110e, 0x116b, 0x11a8, 0, -#undef V9614 -#define V9614 (V + 37231) - 0x110e, 0x116b, 0x11a9, 0, -#undef V9615 -#define V9615 (V + 37235) - 0x110e, 0x116b, 0x11aa, 0, -#undef V9616 -#define V9616 (V + 37239) - 0x110e, 0x116b, 0x11ab, 0, -#undef V9617 -#define V9617 (V + 37243) - 0x110e, 0x116b, 0x11ac, 0, -#undef V9618 -#define V9618 (V + 37247) - 0x110e, 0x116b, 0x11ad, 0, -#undef V9619 -#define V9619 (V + 37251) - 0x110e, 0x116b, 0x11ae, 0, -#undef V9620 -#define V9620 (V + 37255) - 0x110e, 0x116b, 0x11af, 0, -#undef V9621 -#define V9621 (V + 37259) - 0x110e, 0x116b, 0x11b0, 0, -#undef V9622 -#define V9622 (V + 37263) - 0x110e, 0x116b, 0x11b1, 0, -#undef V9623 -#define V9623 (V + 37267) - 0x110e, 0x116b, 0x11b2, 0, -#undef V9624 -#define V9624 (V + 37271) - 0x110e, 0x116b, 0x11b3, 0, -#undef V9625 -#define V9625 (V + 37275) - 0x110e, 0x116b, 0x11b4, 0, -#undef V9626 -#define V9626 (V + 37279) - 0x110e, 0x116b, 0x11b5, 0, -#undef V9627 -#define V9627 (V + 37283) - 0x110e, 0x116b, 0x11b6, 0, -#undef V9628 -#define V9628 (V + 37287) - 0x110e, 0x116b, 0x11b7, 0, -#undef V9629 -#define V9629 (V + 37291) - 0x110e, 0x116b, 0x11b8, 0, -#undef V9630 -#define V9630 (V + 37295) - 0x110e, 0x116b, 0x11b9, 0, -#undef V9631 -#define V9631 (V + 37299) - 0x110e, 0x116b, 0x11ba, 0, -#undef V9632 -#define V9632 (V + 37303) - 0x110e, 0x116b, 0x11bb, 0, -#undef V9633 -#define V9633 (V + 37307) - 0x110e, 0x116b, 0x11bc, 0, -#undef V9634 -#define V9634 (V + 37311) - 0x110e, 0x116b, 0x11bd, 0, -#undef V9635 -#define V9635 (V + 37315) - 0x110e, 0x116b, 0x11be, 0, -#undef V9636 -#define V9636 (V + 37319) - 0x110e, 0x116b, 0x11bf, 0, -#undef V9637 -#define V9637 (V + 37323) - 0x110e, 0x116b, 0x11c0, 0, -#undef V9638 -#define V9638 (V + 37327) - 0x110e, 0x116b, 0x11c1, 0, -#undef V9639 -#define V9639 (V + 37331) - 0x110e, 0x116b, 0x11c2, 0, -#undef V9640 -#define V9640 (V + 37335) - 0x110e, 0x116c, 0, -#undef V9641 -#define V9641 (V + 37338) - 0x110e, 0x116c, 0x11a8, 0, -#undef V9642 -#define V9642 (V + 37342) - 0x110e, 0x116c, 0x11a9, 0, -#undef V9643 -#define V9643 (V + 37346) - 0x110e, 0x116c, 0x11aa, 0, -#undef V9644 -#define V9644 (V + 37350) - 0x110e, 0x116c, 0x11ab, 0, -#undef V9645 -#define V9645 (V + 37354) - 0x110e, 0x116c, 0x11ac, 0, -#undef V9646 -#define V9646 (V + 37358) - 0x110e, 0x116c, 0x11ad, 0, -#undef V9647 -#define V9647 (V + 37362) - 0x110e, 0x116c, 0x11ae, 0, -#undef V9648 -#define V9648 (V + 37366) - 0x110e, 0x116c, 0x11af, 0, -#undef V9649 -#define V9649 (V + 37370) - 0x110e, 0x116c, 0x11b0, 0, -#undef V9650 -#define V9650 (V + 37374) - 0x110e, 0x116c, 0x11b1, 0, -#undef V9651 -#define V9651 (V + 37378) - 0x110e, 0x116c, 0x11b2, 0, -#undef V9652 -#define V9652 (V + 37382) - 0x110e, 0x116c, 0x11b3, 0, -#undef V9653 -#define V9653 (V + 37386) - 0x110e, 0x116c, 0x11b4, 0, -#undef V9654 -#define V9654 (V + 37390) - 0x110e, 0x116c, 0x11b5, 0, -#undef V9655 -#define V9655 (V + 37394) - 0x110e, 0x116c, 0x11b6, 0, -#undef V9656 -#define V9656 (V + 37398) - 0x110e, 0x116c, 0x11b7, 0, -#undef V9657 -#define V9657 (V + 37402) - 0x110e, 0x116c, 0x11b8, 0, -#undef V9658 -#define V9658 (V + 37406) - 0x110e, 0x116c, 0x11b9, 0, -#undef V9659 -#define V9659 (V + 37410) - 0x110e, 0x116c, 0x11ba, 0, -#undef V9660 -#define V9660 (V + 37414) - 0x110e, 0x116c, 0x11bb, 0, -#undef V9661 -#define V9661 (V + 37418) - 0x110e, 0x116c, 0x11bc, 0, -#undef V9662 -#define V9662 (V + 37422) - 0x110e, 0x116c, 0x11bd, 0, -#undef V9663 -#define V9663 (V + 37426) - 0x110e, 0x116c, 0x11be, 0, -#undef V9664 -#define V9664 (V + 37430) - 0x110e, 0x116c, 0x11bf, 0, -#undef V9665 -#define V9665 (V + 37434) - 0x110e, 0x116c, 0x11c0, 0, -#undef V9666 -#define V9666 (V + 37438) - 0x110e, 0x116c, 0x11c1, 0, -#undef V9667 -#define V9667 (V + 37442) - 0x110e, 0x116c, 0x11c2, 0, -#undef V9668 -#define V9668 (V + 37446) - 0x110e, 0x116d, 0, -#undef V9669 -#define V9669 (V + 37449) - 0x110e, 0x116d, 0x11a8, 0, -#undef V9670 -#define V9670 (V + 37453) - 0x110e, 0x116d, 0x11a9, 0, -#undef V9671 -#define V9671 (V + 37457) - 0x110e, 0x116d, 0x11aa, 0, -#undef V9672 -#define V9672 (V + 37461) - 0x110e, 0x116d, 0x11ab, 0, -#undef V9673 -#define V9673 (V + 37465) - 0x110e, 0x116d, 0x11ac, 0, -#undef V9674 -#define V9674 (V + 37469) - 0x110e, 0x116d, 0x11ad, 0, -#undef V9675 -#define V9675 (V + 37473) - 0x110e, 0x116d, 0x11ae, 0, -#undef V9676 -#define V9676 (V + 37477) - 0x110e, 0x116d, 0x11af, 0, -#undef V9677 -#define V9677 (V + 37481) - 0x110e, 0x116d, 0x11b0, 0, -#undef V9678 -#define V9678 (V + 37485) - 0x110e, 0x116d, 0x11b1, 0, -#undef V9679 -#define V9679 (V + 37489) - 0x110e, 0x116d, 0x11b2, 0, -#undef V9680 -#define V9680 (V + 37493) - 0x110e, 0x116d, 0x11b3, 0, -#undef V9681 -#define V9681 (V + 37497) - 0x110e, 0x116d, 0x11b4, 0, -#undef V9682 -#define V9682 (V + 37501) - 0x110e, 0x116d, 0x11b5, 0, -#undef V9683 -#define V9683 (V + 37505) - 0x110e, 0x116d, 0x11b6, 0, -#undef V9684 -#define V9684 (V + 37509) - 0x110e, 0x116d, 0x11b7, 0, -#undef V9685 -#define V9685 (V + 37513) - 0x110e, 0x116d, 0x11b8, 0, -#undef V9686 -#define V9686 (V + 37517) - 0x110e, 0x116d, 0x11b9, 0, -#undef V9687 -#define V9687 (V + 37521) - 0x110e, 0x116d, 0x11ba, 0, -#undef V9688 -#define V9688 (V + 37525) - 0x110e, 0x116d, 0x11bb, 0, -#undef V9689 -#define V9689 (V + 37529) - 0x110e, 0x116d, 0x11bc, 0, -#undef V9690 -#define V9690 (V + 37533) - 0x110e, 0x116d, 0x11bd, 0, -#undef V9691 -#define V9691 (V + 37537) - 0x110e, 0x116d, 0x11be, 0, -#undef V9692 -#define V9692 (V + 37541) - 0x110e, 0x116d, 0x11bf, 0, -#undef V9693 -#define V9693 (V + 37545) - 0x110e, 0x116d, 0x11c0, 0, -#undef V9694 -#define V9694 (V + 37549) - 0x110e, 0x116d, 0x11c1, 0, -#undef V9695 -#define V9695 (V + 37553) - 0x110e, 0x116d, 0x11c2, 0, -#undef V9696 -#define V9696 (V + 37557) - 0x110e, 0x116e, 0, -#undef V9697 -#define V9697 (V + 37560) - 0x110e, 0x116e, 0x11a8, 0, -#undef V9698 -#define V9698 (V + 37564) - 0x110e, 0x116e, 0x11a9, 0, -#undef V9699 -#define V9699 (V + 37568) - 0x110e, 0x116e, 0x11aa, 0, -#undef V9700 -#define V9700 (V + 37572) - 0x110e, 0x116e, 0x11ab, 0, -#undef V9701 -#define V9701 (V + 37576) - 0x110e, 0x116e, 0x11ac, 0, -#undef V9702 -#define V9702 (V + 37580) - 0x110e, 0x116e, 0x11ad, 0, -#undef V9703 -#define V9703 (V + 37584) - 0x110e, 0x116e, 0x11ae, 0, -#undef V9704 -#define V9704 (V + 37588) - 0x110e, 0x116e, 0x11af, 0, -#undef V9705 -#define V9705 (V + 37592) - 0x110e, 0x116e, 0x11b0, 0, -#undef V9706 -#define V9706 (V + 37596) - 0x110e, 0x116e, 0x11b1, 0, -#undef V9707 -#define V9707 (V + 37600) - 0x110e, 0x116e, 0x11b2, 0, -#undef V9708 -#define V9708 (V + 37604) - 0x110e, 0x116e, 0x11b3, 0, -#undef V9709 -#define V9709 (V + 37608) - 0x110e, 0x116e, 0x11b4, 0, -#undef V9710 -#define V9710 (V + 37612) - 0x110e, 0x116e, 0x11b5, 0, -#undef V9711 -#define V9711 (V + 37616) - 0x110e, 0x116e, 0x11b6, 0, -#undef V9712 -#define V9712 (V + 37620) - 0x110e, 0x116e, 0x11b7, 0, -#undef V9713 -#define V9713 (V + 37624) - 0x110e, 0x116e, 0x11b8, 0, -#undef V9714 -#define V9714 (V + 37628) - 0x110e, 0x116e, 0x11b9, 0, -#undef V9715 -#define V9715 (V + 37632) - 0x110e, 0x116e, 0x11ba, 0, -#undef V9716 -#define V9716 (V + 37636) - 0x110e, 0x116e, 0x11bb, 0, -#undef V9717 -#define V9717 (V + 37640) - 0x110e, 0x116e, 0x11bc, 0, -#undef V9718 -#define V9718 (V + 37644) - 0x110e, 0x116e, 0x11bd, 0, -#undef V9719 -#define V9719 (V + 37648) - 0x110e, 0x116e, 0x11be, 0, -#undef V9720 -#define V9720 (V + 37652) - 0x110e, 0x116e, 0x11bf, 0, -#undef V9721 -#define V9721 (V + 37656) - 0x110e, 0x116e, 0x11c0, 0, -#undef V9722 -#define V9722 (V + 37660) - 0x110e, 0x116e, 0x11c1, 0, -#undef V9723 -#define V9723 (V + 37664) - 0x110e, 0x116e, 0x11c2, 0, -#undef V9724 -#define V9724 (V + 37668) - 0x110e, 0x116f, 0, -#undef V9725 -#define V9725 (V + 37671) - 0x110e, 0x116f, 0x11a8, 0, -#undef V9726 -#define V9726 (V + 37675) - 0x110e, 0x116f, 0x11a9, 0, -#undef V9727 -#define V9727 (V + 37679) - 0x110e, 0x116f, 0x11aa, 0, -#undef V9728 -#define V9728 (V + 37683) - 0x110e, 0x116f, 0x11ab, 0, -#undef V9729 -#define V9729 (V + 37687) - 0x110e, 0x116f, 0x11ac, 0, -#undef V9730 -#define V9730 (V + 37691) - 0x110e, 0x116f, 0x11ad, 0, -#undef V9731 -#define V9731 (V + 37695) - 0x110e, 0x116f, 0x11ae, 0, -#undef V9732 -#define V9732 (V + 37699) - 0x110e, 0x116f, 0x11af, 0, -#undef V9733 -#define V9733 (V + 37703) - 0x110e, 0x116f, 0x11b0, 0, -#undef V9734 -#define V9734 (V + 37707) - 0x110e, 0x116f, 0x11b1, 0, -#undef V9735 -#define V9735 (V + 37711) - 0x110e, 0x116f, 0x11b2, 0, -#undef V9736 -#define V9736 (V + 37715) - 0x110e, 0x116f, 0x11b3, 0, -#undef V9737 -#define V9737 (V + 37719) - 0x110e, 0x116f, 0x11b4, 0, -#undef V9738 -#define V9738 (V + 37723) - 0x110e, 0x116f, 0x11b5, 0, -#undef V9739 -#define V9739 (V + 37727) - 0x110e, 0x116f, 0x11b6, 0, -#undef V9740 -#define V9740 (V + 37731) - 0x110e, 0x116f, 0x11b7, 0, -#undef V9741 -#define V9741 (V + 37735) - 0x110e, 0x116f, 0x11b8, 0, -#undef V9742 -#define V9742 (V + 37739) - 0x110e, 0x116f, 0x11b9, 0, -#undef V9743 -#define V9743 (V + 37743) - 0x110e, 0x116f, 0x11ba, 0, -#undef V9744 -#define V9744 (V + 37747) - 0x110e, 0x116f, 0x11bb, 0, -#undef V9745 -#define V9745 (V + 37751) - 0x110e, 0x116f, 0x11bc, 0, -#undef V9746 -#define V9746 (V + 37755) - 0x110e, 0x116f, 0x11bd, 0, -#undef V9747 -#define V9747 (V + 37759) - 0x110e, 0x116f, 0x11be, 0, -#undef V9748 -#define V9748 (V + 37763) - 0x110e, 0x116f, 0x11bf, 0, -#undef V9749 -#define V9749 (V + 37767) - 0x110e, 0x116f, 0x11c0, 0, -#undef V9750 -#define V9750 (V + 37771) - 0x110e, 0x116f, 0x11c1, 0, -#undef V9751 -#define V9751 (V + 37775) - 0x110e, 0x116f, 0x11c2, 0, -#undef V9752 -#define V9752 (V + 37779) - 0x110e, 0x1170, 0, -#undef V9753 -#define V9753 (V + 37782) - 0x110e, 0x1170, 0x11a8, 0, -#undef V9754 -#define V9754 (V + 37786) - 0x110e, 0x1170, 0x11a9, 0, -#undef V9755 -#define V9755 (V + 37790) - 0x110e, 0x1170, 0x11aa, 0, -#undef V9756 -#define V9756 (V + 37794) - 0x110e, 0x1170, 0x11ab, 0, -#undef V9757 -#define V9757 (V + 37798) - 0x110e, 0x1170, 0x11ac, 0, -#undef V9758 -#define V9758 (V + 37802) - 0x110e, 0x1170, 0x11ad, 0, -#undef V9759 -#define V9759 (V + 37806) - 0x110e, 0x1170, 0x11ae, 0, -#undef V9760 -#define V9760 (V + 37810) - 0x110e, 0x1170, 0x11af, 0, -#undef V9761 -#define V9761 (V + 37814) - 0x110e, 0x1170, 0x11b0, 0, -#undef V9762 -#define V9762 (V + 37818) - 0x110e, 0x1170, 0x11b1, 0, -#undef V9763 -#define V9763 (V + 37822) - 0x110e, 0x1170, 0x11b2, 0, -#undef V9764 -#define V9764 (V + 37826) - 0x110e, 0x1170, 0x11b3, 0, -#undef V9765 -#define V9765 (V + 37830) - 0x110e, 0x1170, 0x11b4, 0, -#undef V9766 -#define V9766 (V + 37834) - 0x110e, 0x1170, 0x11b5, 0, -#undef V9767 -#define V9767 (V + 37838) - 0x110e, 0x1170, 0x11b6, 0, -#undef V9768 -#define V9768 (V + 37842) - 0x110e, 0x1170, 0x11b7, 0, -#undef V9769 -#define V9769 (V + 37846) - 0x110e, 0x1170, 0x11b8, 0, -#undef V9770 -#define V9770 (V + 37850) - 0x110e, 0x1170, 0x11b9, 0, -#undef V9771 -#define V9771 (V + 37854) - 0x110e, 0x1170, 0x11ba, 0, -#undef V9772 -#define V9772 (V + 37858) - 0x110e, 0x1170, 0x11bb, 0, -#undef V9773 -#define V9773 (V + 37862) - 0x110e, 0x1170, 0x11bc, 0, -#undef V9774 -#define V9774 (V + 37866) - 0x110e, 0x1170, 0x11bd, 0, -#undef V9775 -#define V9775 (V + 37870) - 0x110e, 0x1170, 0x11be, 0, -#undef V9776 -#define V9776 (V + 37874) - 0x110e, 0x1170, 0x11bf, 0, -#undef V9777 -#define V9777 (V + 37878) - 0x110e, 0x1170, 0x11c0, 0, -#undef V9778 -#define V9778 (V + 37882) - 0x110e, 0x1170, 0x11c1, 0, -#undef V9779 -#define V9779 (V + 37886) - 0x110e, 0x1170, 0x11c2, 0, -#undef V9780 -#define V9780 (V + 37890) - 0x110e, 0x1171, 0, -#undef V9781 -#define V9781 (V + 37893) - 0x110e, 0x1171, 0x11a8, 0, -#undef V9782 -#define V9782 (V + 37897) - 0x110e, 0x1171, 0x11a9, 0, -#undef V9783 -#define V9783 (V + 37901) - 0x110e, 0x1171, 0x11aa, 0, -#undef V9784 -#define V9784 (V + 37905) - 0x110e, 0x1171, 0x11ab, 0, -#undef V9785 -#define V9785 (V + 37909) - 0x110e, 0x1171, 0x11ac, 0, -#undef V9786 -#define V9786 (V + 37913) - 0x110e, 0x1171, 0x11ad, 0, -#undef V9787 -#define V9787 (V + 37917) - 0x110e, 0x1171, 0x11ae, 0, -#undef V9788 -#define V9788 (V + 37921) - 0x110e, 0x1171, 0x11af, 0, -#undef V9789 -#define V9789 (V + 37925) - 0x110e, 0x1171, 0x11b0, 0, -#undef V9790 -#define V9790 (V + 37929) - 0x110e, 0x1171, 0x11b1, 0, -#undef V9791 -#define V9791 (V + 37933) - 0x110e, 0x1171, 0x11b2, 0, -#undef V9792 -#define V9792 (V + 37937) - 0x110e, 0x1171, 0x11b3, 0, -#undef V9793 -#define V9793 (V + 37941) - 0x110e, 0x1171, 0x11b4, 0, -#undef V9794 -#define V9794 (V + 37945) - 0x110e, 0x1171, 0x11b5, 0, -#undef V9795 -#define V9795 (V + 37949) - 0x110e, 0x1171, 0x11b6, 0, -#undef V9796 -#define V9796 (V + 37953) - 0x110e, 0x1171, 0x11b7, 0, -#undef V9797 -#define V9797 (V + 37957) - 0x110e, 0x1171, 0x11b8, 0, -#undef V9798 -#define V9798 (V + 37961) - 0x110e, 0x1171, 0x11b9, 0, -#undef V9799 -#define V9799 (V + 37965) - 0x110e, 0x1171, 0x11ba, 0, -#undef V9800 -#define V9800 (V + 37969) - 0x110e, 0x1171, 0x11bb, 0, -#undef V9801 -#define V9801 (V + 37973) - 0x110e, 0x1171, 0x11bc, 0, -#undef V9802 -#define V9802 (V + 37977) - 0x110e, 0x1171, 0x11bd, 0, -#undef V9803 -#define V9803 (V + 37981) - 0x110e, 0x1171, 0x11be, 0, -#undef V9804 -#define V9804 (V + 37985) - 0x110e, 0x1171, 0x11bf, 0, -#undef V9805 -#define V9805 (V + 37989) - 0x110e, 0x1171, 0x11c0, 0, -#undef V9806 -#define V9806 (V + 37993) - 0x110e, 0x1171, 0x11c1, 0, -#undef V9807 -#define V9807 (V + 37997) - 0x110e, 0x1171, 0x11c2, 0, -#undef V9808 -#define V9808 (V + 38001) - 0x110e, 0x1172, 0, -#undef V9809 -#define V9809 (V + 38004) - 0x110e, 0x1172, 0x11a8, 0, -#undef V9810 -#define V9810 (V + 38008) - 0x110e, 0x1172, 0x11a9, 0, -#undef V9811 -#define V9811 (V + 38012) - 0x110e, 0x1172, 0x11aa, 0, -#undef V9812 -#define V9812 (V + 38016) - 0x110e, 0x1172, 0x11ab, 0, -#undef V9813 -#define V9813 (V + 38020) - 0x110e, 0x1172, 0x11ac, 0, -#undef V9814 -#define V9814 (V + 38024) - 0x110e, 0x1172, 0x11ad, 0, -#undef V9815 -#define V9815 (V + 38028) - 0x110e, 0x1172, 0x11ae, 0, -#undef V9816 -#define V9816 (V + 38032) - 0x110e, 0x1172, 0x11af, 0, -#undef V9817 -#define V9817 (V + 38036) - 0x110e, 0x1172, 0x11b0, 0, -#undef V9818 -#define V9818 (V + 38040) - 0x110e, 0x1172, 0x11b1, 0, -#undef V9819 -#define V9819 (V + 38044) - 0x110e, 0x1172, 0x11b2, 0, -#undef V9820 -#define V9820 (V + 38048) - 0x110e, 0x1172, 0x11b3, 0, -#undef V9821 -#define V9821 (V + 38052) - 0x110e, 0x1172, 0x11b4, 0, -#undef V9822 -#define V9822 (V + 38056) - 0x110e, 0x1172, 0x11b5, 0, -#undef V9823 -#define V9823 (V + 38060) - 0x110e, 0x1172, 0x11b6, 0, -#undef V9824 -#define V9824 (V + 38064) - 0x110e, 0x1172, 0x11b7, 0, -#undef V9825 -#define V9825 (V + 38068) - 0x110e, 0x1172, 0x11b8, 0, -#undef V9826 -#define V9826 (V + 38072) - 0x110e, 0x1172, 0x11b9, 0, -#undef V9827 -#define V9827 (V + 38076) - 0x110e, 0x1172, 0x11ba, 0, -#undef V9828 -#define V9828 (V + 38080) - 0x110e, 0x1172, 0x11bb, 0, -#undef V9829 -#define V9829 (V + 38084) - 0x110e, 0x1172, 0x11bc, 0, -#undef V9830 -#define V9830 (V + 38088) - 0x110e, 0x1172, 0x11bd, 0, -#undef V9831 -#define V9831 (V + 38092) - 0x110e, 0x1172, 0x11be, 0, -#undef V9832 -#define V9832 (V + 38096) - 0x110e, 0x1172, 0x11bf, 0, -#undef V9833 -#define V9833 (V + 38100) - 0x110e, 0x1172, 0x11c0, 0, -#undef V9834 -#define V9834 (V + 38104) - 0x110e, 0x1172, 0x11c1, 0, -#undef V9835 -#define V9835 (V + 38108) - 0x110e, 0x1172, 0x11c2, 0, -#undef V9836 -#define V9836 (V + 38112) - 0x110e, 0x1173, 0, -#undef V9837 -#define V9837 (V + 38115) - 0x110e, 0x1173, 0x11a8, 0, -#undef V9838 -#define V9838 (V + 38119) - 0x110e, 0x1173, 0x11a9, 0, -#undef V9839 -#define V9839 (V + 38123) - 0x110e, 0x1173, 0x11aa, 0, -#undef V9840 -#define V9840 (V + 38127) - 0x110e, 0x1173, 0x11ab, 0, -#undef V9841 -#define V9841 (V + 38131) - 0x110e, 0x1173, 0x11ac, 0, -#undef V9842 -#define V9842 (V + 38135) - 0x110e, 0x1173, 0x11ad, 0, -#undef V9843 -#define V9843 (V + 38139) - 0x110e, 0x1173, 0x11ae, 0, -#undef V9844 -#define V9844 (V + 38143) - 0x110e, 0x1173, 0x11af, 0, -#undef V9845 -#define V9845 (V + 38147) - 0x110e, 0x1173, 0x11b0, 0, -#undef V9846 -#define V9846 (V + 38151) - 0x110e, 0x1173, 0x11b1, 0, -#undef V9847 -#define V9847 (V + 38155) - 0x110e, 0x1173, 0x11b2, 0, -#undef V9848 -#define V9848 (V + 38159) - 0x110e, 0x1173, 0x11b3, 0, -#undef V9849 -#define V9849 (V + 38163) - 0x110e, 0x1173, 0x11b4, 0, -#undef V9850 -#define V9850 (V + 38167) - 0x110e, 0x1173, 0x11b5, 0, -#undef V9851 -#define V9851 (V + 38171) - 0x110e, 0x1173, 0x11b6, 0, -#undef V9852 -#define V9852 (V + 38175) - 0x110e, 0x1173, 0x11b7, 0, -#undef V9853 -#define V9853 (V + 38179) - 0x110e, 0x1173, 0x11b8, 0, -#undef V9854 -#define V9854 (V + 38183) - 0x110e, 0x1173, 0x11b9, 0, -#undef V9855 -#define V9855 (V + 38187) - 0x110e, 0x1173, 0x11ba, 0, -#undef V9856 -#define V9856 (V + 38191) - 0x110e, 0x1173, 0x11bb, 0, -#undef V9857 -#define V9857 (V + 38195) - 0x110e, 0x1173, 0x11bc, 0, -#undef V9858 -#define V9858 (V + 38199) - 0x110e, 0x1173, 0x11bd, 0, -#undef V9859 -#define V9859 (V + 38203) - 0x110e, 0x1173, 0x11be, 0, -#undef V9860 -#define V9860 (V + 38207) - 0x110e, 0x1173, 0x11bf, 0, -#undef V9861 -#define V9861 (V + 38211) - 0x110e, 0x1173, 0x11c0, 0, -#undef V9862 -#define V9862 (V + 38215) - 0x110e, 0x1173, 0x11c1, 0, -#undef V9863 -#define V9863 (V + 38219) - 0x110e, 0x1173, 0x11c2, 0, -#undef V9864 -#define V9864 (V + 38223) - 0x110e, 0x1174, 0, -#undef V9865 -#define V9865 (V + 38226) - 0x110e, 0x1174, 0x11a8, 0, -#undef V9866 -#define V9866 (V + 38230) - 0x110e, 0x1174, 0x11a9, 0, -#undef V9867 -#define V9867 (V + 38234) - 0x110e, 0x1174, 0x11aa, 0, -#undef V9868 -#define V9868 (V + 38238) - 0x110e, 0x1174, 0x11ab, 0, -#undef V9869 -#define V9869 (V + 38242) - 0x110e, 0x1174, 0x11ac, 0, -#undef V9870 -#define V9870 (V + 38246) - 0x110e, 0x1174, 0x11ad, 0, -#undef V9871 -#define V9871 (V + 38250) - 0x110e, 0x1174, 0x11ae, 0, -#undef V9872 -#define V9872 (V + 38254) - 0x110e, 0x1174, 0x11af, 0, -#undef V9873 -#define V9873 (V + 38258) - 0x110e, 0x1174, 0x11b0, 0, -#undef V9874 -#define V9874 (V + 38262) - 0x110e, 0x1174, 0x11b1, 0, -#undef V9875 -#define V9875 (V + 38266) - 0x110e, 0x1174, 0x11b2, 0, -#undef V9876 -#define V9876 (V + 38270) - 0x110e, 0x1174, 0x11b3, 0, -#undef V9877 -#define V9877 (V + 38274) - 0x110e, 0x1174, 0x11b4, 0, -#undef V9878 -#define V9878 (V + 38278) - 0x110e, 0x1174, 0x11b5, 0, -#undef V9879 -#define V9879 (V + 38282) - 0x110e, 0x1174, 0x11b6, 0, -#undef V9880 -#define V9880 (V + 38286) - 0x110e, 0x1174, 0x11b7, 0, -#undef V9881 -#define V9881 (V + 38290) - 0x110e, 0x1174, 0x11b8, 0, -#undef V9882 -#define V9882 (V + 38294) - 0x110e, 0x1174, 0x11b9, 0, -#undef V9883 -#define V9883 (V + 38298) - 0x110e, 0x1174, 0x11ba, 0, -#undef V9884 -#define V9884 (V + 38302) - 0x110e, 0x1174, 0x11bb, 0, -#undef V9885 -#define V9885 (V + 38306) - 0x110e, 0x1174, 0x11bc, 0, -#undef V9886 -#define V9886 (V + 38310) - 0x110e, 0x1174, 0x11bd, 0, -#undef V9887 -#define V9887 (V + 38314) - 0x110e, 0x1174, 0x11be, 0, -#undef V9888 -#define V9888 (V + 38318) - 0x110e, 0x1174, 0x11bf, 0, -#undef V9889 -#define V9889 (V + 38322) - 0x110e, 0x1174, 0x11c0, 0, -#undef V9890 -#define V9890 (V + 38326) - 0x110e, 0x1174, 0x11c1, 0, -#undef V9891 -#define V9891 (V + 38330) - 0x110e, 0x1174, 0x11c2, 0, -#undef V9892 -#define V9892 (V + 38334) - 0x110e, 0x1175, 0, -#undef V9893 -#define V9893 (V + 38337) - 0x110e, 0x1175, 0x11a8, 0, -#undef V9894 -#define V9894 (V + 38341) - 0x110e, 0x1175, 0x11a9, 0, -#undef V9895 -#define V9895 (V + 38345) - 0x110e, 0x1175, 0x11aa, 0, -#undef V9896 -#define V9896 (V + 38349) - 0x110e, 0x1175, 0x11ab, 0, -#undef V9897 -#define V9897 (V + 38353) - 0x110e, 0x1175, 0x11ac, 0, -#undef V9898 -#define V9898 (V + 38357) - 0x110e, 0x1175, 0x11ad, 0, -#undef V9899 -#define V9899 (V + 38361) - 0x110e, 0x1175, 0x11ae, 0, -#undef V9900 -#define V9900 (V + 38365) - 0x110e, 0x1175, 0x11af, 0, -#undef V9901 -#define V9901 (V + 38369) - 0x110e, 0x1175, 0x11b0, 0, -#undef V9902 -#define V9902 (V + 38373) - 0x110e, 0x1175, 0x11b1, 0, -#undef V9903 -#define V9903 (V + 38377) - 0x110e, 0x1175, 0x11b2, 0, -#undef V9904 -#define V9904 (V + 38381) - 0x110e, 0x1175, 0x11b3, 0, -#undef V9905 -#define V9905 (V + 38385) - 0x110e, 0x1175, 0x11b4, 0, -#undef V9906 -#define V9906 (V + 38389) - 0x110e, 0x1175, 0x11b5, 0, -#undef V9907 -#define V9907 (V + 38393) - 0x110e, 0x1175, 0x11b6, 0, -#undef V9908 -#define V9908 (V + 38397) - 0x110e, 0x1175, 0x11b7, 0, -#undef V9909 -#define V9909 (V + 38401) - 0x110e, 0x1175, 0x11b8, 0, -#undef V9910 -#define V9910 (V + 38405) - 0x110e, 0x1175, 0x11b9, 0, -#undef V9911 -#define V9911 (V + 38409) - 0x110e, 0x1175, 0x11ba, 0, -#undef V9912 -#define V9912 (V + 38413) - 0x110e, 0x1175, 0x11bb, 0, -#undef V9913 -#define V9913 (V + 38417) - 0x110e, 0x1175, 0x11bc, 0, -#undef V9914 -#define V9914 (V + 38421) - 0x110e, 0x1175, 0x11bd, 0, -#undef V9915 -#define V9915 (V + 38425) - 0x110e, 0x1175, 0x11be, 0, -#undef V9916 -#define V9916 (V + 38429) - 0x110e, 0x1175, 0x11bf, 0, -#undef V9917 -#define V9917 (V + 38433) - 0x110e, 0x1175, 0x11c0, 0, -#undef V9918 -#define V9918 (V + 38437) - 0x110e, 0x1175, 0x11c1, 0, -#undef V9919 -#define V9919 (V + 38441) - 0x110e, 0x1175, 0x11c2, 0, -#undef V9920 -#define V9920 (V + 38445) - 0x110f, 0x1161, 0, -#undef V9921 -#define V9921 (V + 38448) - 0x110f, 0x1161, 0x11a8, 0, -#undef V9922 -#define V9922 (V + 38452) - 0x110f, 0x1161, 0x11a9, 0, -#undef V9923 -#define V9923 (V + 38456) - 0x110f, 0x1161, 0x11aa, 0, -#undef V9924 -#define V9924 (V + 38460) - 0x110f, 0x1161, 0x11ab, 0, -#undef V9925 -#define V9925 (V + 38464) - 0x110f, 0x1161, 0x11ac, 0, -#undef V9926 -#define V9926 (V + 38468) - 0x110f, 0x1161, 0x11ad, 0, -#undef V9927 -#define V9927 (V + 38472) - 0x110f, 0x1161, 0x11ae, 0, -#undef V9928 -#define V9928 (V + 38476) - 0x110f, 0x1161, 0x11af, 0, -#undef V9929 -#define V9929 (V + 38480) - 0x110f, 0x1161, 0x11b0, 0, -#undef V9930 -#define V9930 (V + 38484) - 0x110f, 0x1161, 0x11b1, 0, -#undef V9931 -#define V9931 (V + 38488) - 0x110f, 0x1161, 0x11b2, 0, -#undef V9932 -#define V9932 (V + 38492) - 0x110f, 0x1161, 0x11b3, 0, -#undef V9933 -#define V9933 (V + 38496) - 0x110f, 0x1161, 0x11b4, 0, -#undef V9934 -#define V9934 (V + 38500) - 0x110f, 0x1161, 0x11b5, 0, -#undef V9935 -#define V9935 (V + 38504) - 0x110f, 0x1161, 0x11b6, 0, -#undef V9936 -#define V9936 (V + 38508) - 0x110f, 0x1161, 0x11b7, 0, -#undef V9937 -#define V9937 (V + 38512) - 0x110f, 0x1161, 0x11b8, 0, -#undef V9938 -#define V9938 (V + 38516) - 0x110f, 0x1161, 0x11b9, 0, -#undef V9939 -#define V9939 (V + 38520) - 0x110f, 0x1161, 0x11ba, 0, -#undef V9940 -#define V9940 (V + 38524) - 0x110f, 0x1161, 0x11bb, 0, -#undef V9941 -#define V9941 (V + 38528) - 0x110f, 0x1161, 0x11bc, 0, -#undef V9942 -#define V9942 (V + 38532) - 0x110f, 0x1161, 0x11bd, 0, -#undef V9943 -#define V9943 (V + 38536) - 0x110f, 0x1161, 0x11be, 0, -#undef V9944 -#define V9944 (V + 38540) - 0x110f, 0x1161, 0x11bf, 0, -#undef V9945 -#define V9945 (V + 38544) - 0x110f, 0x1161, 0x11c0, 0, -#undef V9946 -#define V9946 (V + 38548) - 0x110f, 0x1161, 0x11c1, 0, -#undef V9947 -#define V9947 (V + 38552) - 0x110f, 0x1161, 0x11c2, 0, -#undef V9948 -#define V9948 (V + 38556) - 0x110f, 0x1162, 0, -#undef V9949 -#define V9949 (V + 38559) - 0x110f, 0x1162, 0x11a8, 0, -#undef V9950 -#define V9950 (V + 38563) - 0x110f, 0x1162, 0x11a9, 0, -#undef V9951 -#define V9951 (V + 38567) - 0x110f, 0x1162, 0x11aa, 0, -#undef V9952 -#define V9952 (V + 38571) - 0x110f, 0x1162, 0x11ab, 0, -#undef V9953 -#define V9953 (V + 38575) - 0x110f, 0x1162, 0x11ac, 0, -#undef V9954 -#define V9954 (V + 38579) - 0x110f, 0x1162, 0x11ad, 0, -#undef V9955 -#define V9955 (V + 38583) - 0x110f, 0x1162, 0x11ae, 0, -#undef V9956 -#define V9956 (V + 38587) - 0x110f, 0x1162, 0x11af, 0, -#undef V9957 -#define V9957 (V + 38591) - 0x110f, 0x1162, 0x11b0, 0, -#undef V9958 -#define V9958 (V + 38595) - 0x110f, 0x1162, 0x11b1, 0, -#undef V9959 -#define V9959 (V + 38599) - 0x110f, 0x1162, 0x11b2, 0, -#undef V9960 -#define V9960 (V + 38603) - 0x110f, 0x1162, 0x11b3, 0, -#undef V9961 -#define V9961 (V + 38607) - 0x110f, 0x1162, 0x11b4, 0, -#undef V9962 -#define V9962 (V + 38611) - 0x110f, 0x1162, 0x11b5, 0, -#undef V9963 -#define V9963 (V + 38615) - 0x110f, 0x1162, 0x11b6, 0, -#undef V9964 -#define V9964 (V + 38619) - 0x110f, 0x1162, 0x11b7, 0, -#undef V9965 -#define V9965 (V + 38623) - 0x110f, 0x1162, 0x11b8, 0, -#undef V9966 -#define V9966 (V + 38627) - 0x110f, 0x1162, 0x11b9, 0, -#undef V9967 -#define V9967 (V + 38631) - 0x110f, 0x1162, 0x11ba, 0, -#undef V9968 -#define V9968 (V + 38635) - 0x110f, 0x1162, 0x11bb, 0, -#undef V9969 -#define V9969 (V + 38639) - 0x110f, 0x1162, 0x11bc, 0, -#undef V9970 -#define V9970 (V + 38643) - 0x110f, 0x1162, 0x11bd, 0, -#undef V9971 -#define V9971 (V + 38647) - 0x110f, 0x1162, 0x11be, 0, -#undef V9972 -#define V9972 (V + 38651) - 0x110f, 0x1162, 0x11bf, 0, -#undef V9973 -#define V9973 (V + 38655) - 0x110f, 0x1162, 0x11c0, 0, -#undef V9974 -#define V9974 (V + 38659) - 0x110f, 0x1162, 0x11c1, 0, -#undef V9975 -#define V9975 (V + 38663) - 0x110f, 0x1162, 0x11c2, 0, -#undef V9976 -#define V9976 (V + 38667) - 0x110f, 0x1163, 0, -#undef V9977 -#define V9977 (V + 38670) - 0x110f, 0x1163, 0x11a8, 0, -#undef V9978 -#define V9978 (V + 38674) - 0x110f, 0x1163, 0x11a9, 0, -#undef V9979 -#define V9979 (V + 38678) - 0x110f, 0x1163, 0x11aa, 0, -#undef V9980 -#define V9980 (V + 38682) - 0x110f, 0x1163, 0x11ab, 0, -#undef V9981 -#define V9981 (V + 38686) - 0x110f, 0x1163, 0x11ac, 0, -#undef V9982 -#define V9982 (V + 38690) - 0x110f, 0x1163, 0x11ad, 0, -#undef V9983 -#define V9983 (V + 38694) - 0x110f, 0x1163, 0x11ae, 0, -#undef V9984 -#define V9984 (V + 38698) - 0x110f, 0x1163, 0x11af, 0, -#undef V9985 -#define V9985 (V + 38702) - 0x110f, 0x1163, 0x11b0, 0, -#undef V9986 -#define V9986 (V + 38706) - 0x110f, 0x1163, 0x11b1, 0, -#undef V9987 -#define V9987 (V + 38710) - 0x110f, 0x1163, 0x11b2, 0, -#undef V9988 -#define V9988 (V + 38714) - 0x110f, 0x1163, 0x11b3, 0, -#undef V9989 -#define V9989 (V + 38718) - 0x110f, 0x1163, 0x11b4, 0, -#undef V9990 -#define V9990 (V + 38722) - 0x110f, 0x1163, 0x11b5, 0, -#undef V9991 -#define V9991 (V + 38726) - 0x110f, 0x1163, 0x11b6, 0, -#undef V9992 -#define V9992 (V + 38730) - 0x110f, 0x1163, 0x11b7, 0, -#undef V9993 -#define V9993 (V + 38734) - 0x110f, 0x1163, 0x11b8, 0, -#undef V9994 -#define V9994 (V + 38738) - 0x110f, 0x1163, 0x11b9, 0, -#undef V9995 -#define V9995 (V + 38742) - 0x110f, 0x1163, 0x11ba, 0, -#undef V9996 -#define V9996 (V + 38746) - 0x110f, 0x1163, 0x11bb, 0, -#undef V9997 -#define V9997 (V + 38750) - 0x110f, 0x1163, 0x11bc, 0, -#undef V9998 -#define V9998 (V + 38754) - 0x110f, 0x1163, 0x11bd, 0, -#undef V9999 -#define V9999 (V + 38758) - 0x110f, 0x1163, 0x11be, 0, -#undef V10000 -#define V10000 (V + 38762) - 0x110f, 0x1163, 0x11bf, 0, -#undef V10001 -#define V10001 (V + 38766) - 0x110f, 0x1163, 0x11c0, 0, -#undef V10002 -#define V10002 (V + 38770) - 0x110f, 0x1163, 0x11c1, 0, -#undef V10003 -#define V10003 (V + 38774) - 0x110f, 0x1163, 0x11c2, 0, -#undef V10004 -#define V10004 (V + 38778) - 0x110f, 0x1164, 0, -#undef V10005 -#define V10005 (V + 38781) - 0x110f, 0x1164, 0x11a8, 0, -#undef V10006 -#define V10006 (V + 38785) - 0x110f, 0x1164, 0x11a9, 0, -#undef V10007 -#define V10007 (V + 38789) - 0x110f, 0x1164, 0x11aa, 0, -#undef V10008 -#define V10008 (V + 38793) - 0x110f, 0x1164, 0x11ab, 0, -#undef V10009 -#define V10009 (V + 38797) - 0x110f, 0x1164, 0x11ac, 0, -#undef V10010 -#define V10010 (V + 38801) - 0x110f, 0x1164, 0x11ad, 0, -#undef V10011 -#define V10011 (V + 38805) - 0x110f, 0x1164, 0x11ae, 0, -#undef V10012 -#define V10012 (V + 38809) - 0x110f, 0x1164, 0x11af, 0, -#undef V10013 -#define V10013 (V + 38813) - 0x110f, 0x1164, 0x11b0, 0, -#undef V10014 -#define V10014 (V + 38817) - 0x110f, 0x1164, 0x11b1, 0, -#undef V10015 -#define V10015 (V + 38821) - 0x110f, 0x1164, 0x11b2, 0, -#undef V10016 -#define V10016 (V + 38825) - 0x110f, 0x1164, 0x11b3, 0, -#undef V10017 -#define V10017 (V + 38829) - 0x110f, 0x1164, 0x11b4, 0, -#undef V10018 -#define V10018 (V + 38833) - 0x110f, 0x1164, 0x11b5, 0, -#undef V10019 -#define V10019 (V + 38837) - 0x110f, 0x1164, 0x11b6, 0, -#undef V10020 -#define V10020 (V + 38841) - 0x110f, 0x1164, 0x11b7, 0, -#undef V10021 -#define V10021 (V + 38845) - 0x110f, 0x1164, 0x11b8, 0, -#undef V10022 -#define V10022 (V + 38849) - 0x110f, 0x1164, 0x11b9, 0, -#undef V10023 -#define V10023 (V + 38853) - 0x110f, 0x1164, 0x11ba, 0, -#undef V10024 -#define V10024 (V + 38857) - 0x110f, 0x1164, 0x11bb, 0, -#undef V10025 -#define V10025 (V + 38861) - 0x110f, 0x1164, 0x11bc, 0, -#undef V10026 -#define V10026 (V + 38865) - 0x110f, 0x1164, 0x11bd, 0, -#undef V10027 -#define V10027 (V + 38869) - 0x110f, 0x1164, 0x11be, 0, -#undef V10028 -#define V10028 (V + 38873) - 0x110f, 0x1164, 0x11bf, 0, -#undef V10029 -#define V10029 (V + 38877) - 0x110f, 0x1164, 0x11c0, 0, -#undef V10030 -#define V10030 (V + 38881) - 0x110f, 0x1164, 0x11c1, 0, -#undef V10031 -#define V10031 (V + 38885) - 0x110f, 0x1164, 0x11c2, 0, -#undef V10032 -#define V10032 (V + 38889) - 0x110f, 0x1165, 0, -#undef V10033 -#define V10033 (V + 38892) - 0x110f, 0x1165, 0x11a8, 0, -#undef V10034 -#define V10034 (V + 38896) - 0x110f, 0x1165, 0x11a9, 0, -#undef V10035 -#define V10035 (V + 38900) - 0x110f, 0x1165, 0x11aa, 0, -#undef V10036 -#define V10036 (V + 38904) - 0x110f, 0x1165, 0x11ab, 0, -#undef V10037 -#define V10037 (V + 38908) - 0x110f, 0x1165, 0x11ac, 0, -#undef V10038 -#define V10038 (V + 38912) - 0x110f, 0x1165, 0x11ad, 0, -#undef V10039 -#define V10039 (V + 38916) - 0x110f, 0x1165, 0x11ae, 0, -#undef V10040 -#define V10040 (V + 38920) - 0x110f, 0x1165, 0x11af, 0, -#undef V10041 -#define V10041 (V + 38924) - 0x110f, 0x1165, 0x11b0, 0, -#undef V10042 -#define V10042 (V + 38928) - 0x110f, 0x1165, 0x11b1, 0, -#undef V10043 -#define V10043 (V + 38932) - 0x110f, 0x1165, 0x11b2, 0, -#undef V10044 -#define V10044 (V + 38936) - 0x110f, 0x1165, 0x11b3, 0, -#undef V10045 -#define V10045 (V + 38940) - 0x110f, 0x1165, 0x11b4, 0, -#undef V10046 -#define V10046 (V + 38944) - 0x110f, 0x1165, 0x11b5, 0, -#undef V10047 -#define V10047 (V + 38948) - 0x110f, 0x1165, 0x11b6, 0, -#undef V10048 -#define V10048 (V + 38952) - 0x110f, 0x1165, 0x11b7, 0, -#undef V10049 -#define V10049 (V + 38956) - 0x110f, 0x1165, 0x11b8, 0, -#undef V10050 -#define V10050 (V + 38960) - 0x110f, 0x1165, 0x11b9, 0, -#undef V10051 -#define V10051 (V + 38964) - 0x110f, 0x1165, 0x11ba, 0, -#undef V10052 -#define V10052 (V + 38968) - 0x110f, 0x1165, 0x11bb, 0, -#undef V10053 -#define V10053 (V + 38972) - 0x110f, 0x1165, 0x11bc, 0, -#undef V10054 -#define V10054 (V + 38976) - 0x110f, 0x1165, 0x11bd, 0, -#undef V10055 -#define V10055 (V + 38980) - 0x110f, 0x1165, 0x11be, 0, -#undef V10056 -#define V10056 (V + 38984) - 0x110f, 0x1165, 0x11bf, 0, -#undef V10057 -#define V10057 (V + 38988) - 0x110f, 0x1165, 0x11c0, 0, -#undef V10058 -#define V10058 (V + 38992) - 0x110f, 0x1165, 0x11c1, 0, -#undef V10059 -#define V10059 (V + 38996) - 0x110f, 0x1165, 0x11c2, 0, -#undef V10060 -#define V10060 (V + 39000) - 0x110f, 0x1166, 0, -#undef V10061 -#define V10061 (V + 39003) - 0x110f, 0x1166, 0x11a8, 0, -#undef V10062 -#define V10062 (V + 39007) - 0x110f, 0x1166, 0x11a9, 0, -#undef V10063 -#define V10063 (V + 39011) - 0x110f, 0x1166, 0x11aa, 0, -#undef V10064 -#define V10064 (V + 39015) - 0x110f, 0x1166, 0x11ab, 0, -#undef V10065 -#define V10065 (V + 39019) - 0x110f, 0x1166, 0x11ac, 0, -#undef V10066 -#define V10066 (V + 39023) - 0x110f, 0x1166, 0x11ad, 0, -#undef V10067 -#define V10067 (V + 39027) - 0x110f, 0x1166, 0x11ae, 0, -#undef V10068 -#define V10068 (V + 39031) - 0x110f, 0x1166, 0x11af, 0, -#undef V10069 -#define V10069 (V + 39035) - 0x110f, 0x1166, 0x11b0, 0, -#undef V10070 -#define V10070 (V + 39039) - 0x110f, 0x1166, 0x11b1, 0, -#undef V10071 -#define V10071 (V + 39043) - 0x110f, 0x1166, 0x11b2, 0, -#undef V10072 -#define V10072 (V + 39047) - 0x110f, 0x1166, 0x11b3, 0, -#undef V10073 -#define V10073 (V + 39051) - 0x110f, 0x1166, 0x11b4, 0, -#undef V10074 -#define V10074 (V + 39055) - 0x110f, 0x1166, 0x11b5, 0, -#undef V10075 -#define V10075 (V + 39059) - 0x110f, 0x1166, 0x11b6, 0, -#undef V10076 -#define V10076 (V + 39063) - 0x110f, 0x1166, 0x11b7, 0, -#undef V10077 -#define V10077 (V + 39067) - 0x110f, 0x1166, 0x11b8, 0, -#undef V10078 -#define V10078 (V + 39071) - 0x110f, 0x1166, 0x11b9, 0, -#undef V10079 -#define V10079 (V + 39075) - 0x110f, 0x1166, 0x11ba, 0, -#undef V10080 -#define V10080 (V + 39079) - 0x110f, 0x1166, 0x11bb, 0, -#undef V10081 -#define V10081 (V + 39083) - 0x110f, 0x1166, 0x11bc, 0, -#undef V10082 -#define V10082 (V + 39087) - 0x110f, 0x1166, 0x11bd, 0, -#undef V10083 -#define V10083 (V + 39091) - 0x110f, 0x1166, 0x11be, 0, -#undef V10084 -#define V10084 (V + 39095) - 0x110f, 0x1166, 0x11bf, 0, -#undef V10085 -#define V10085 (V + 39099) - 0x110f, 0x1166, 0x11c0, 0, -#undef V10086 -#define V10086 (V + 39103) - 0x110f, 0x1166, 0x11c1, 0, -#undef V10087 -#define V10087 (V + 39107) - 0x110f, 0x1166, 0x11c2, 0, -#undef V10088 -#define V10088 (V + 39111) - 0x110f, 0x1167, 0, -#undef V10089 -#define V10089 (V + 39114) - 0x110f, 0x1167, 0x11a8, 0, -#undef V10090 -#define V10090 (V + 39118) - 0x110f, 0x1167, 0x11a9, 0, -#undef V10091 -#define V10091 (V + 39122) - 0x110f, 0x1167, 0x11aa, 0, -#undef V10092 -#define V10092 (V + 39126) - 0x110f, 0x1167, 0x11ab, 0, -#undef V10093 -#define V10093 (V + 39130) - 0x110f, 0x1167, 0x11ac, 0, -#undef V10094 -#define V10094 (V + 39134) - 0x110f, 0x1167, 0x11ad, 0, -#undef V10095 -#define V10095 (V + 39138) - 0x110f, 0x1167, 0x11ae, 0, -#undef V10096 -#define V10096 (V + 39142) - 0x110f, 0x1167, 0x11af, 0, -#undef V10097 -#define V10097 (V + 39146) - 0x110f, 0x1167, 0x11b0, 0, -#undef V10098 -#define V10098 (V + 39150) - 0x110f, 0x1167, 0x11b1, 0, -#undef V10099 -#define V10099 (V + 39154) - 0x110f, 0x1167, 0x11b2, 0, -#undef V10100 -#define V10100 (V + 39158) - 0x110f, 0x1167, 0x11b3, 0, -#undef V10101 -#define V10101 (V + 39162) - 0x110f, 0x1167, 0x11b4, 0, -#undef V10102 -#define V10102 (V + 39166) - 0x110f, 0x1167, 0x11b5, 0, -#undef V10103 -#define V10103 (V + 39170) - 0x110f, 0x1167, 0x11b6, 0, -#undef V10104 -#define V10104 (V + 39174) - 0x110f, 0x1167, 0x11b7, 0, -#undef V10105 -#define V10105 (V + 39178) - 0x110f, 0x1167, 0x11b8, 0, -#undef V10106 -#define V10106 (V + 39182) - 0x110f, 0x1167, 0x11b9, 0, -#undef V10107 -#define V10107 (V + 39186) - 0x110f, 0x1167, 0x11ba, 0, -#undef V10108 -#define V10108 (V + 39190) - 0x110f, 0x1167, 0x11bb, 0, -#undef V10109 -#define V10109 (V + 39194) - 0x110f, 0x1167, 0x11bc, 0, -#undef V10110 -#define V10110 (V + 39198) - 0x110f, 0x1167, 0x11bd, 0, -#undef V10111 -#define V10111 (V + 39202) - 0x110f, 0x1167, 0x11be, 0, -#undef V10112 -#define V10112 (V + 39206) - 0x110f, 0x1167, 0x11bf, 0, -#undef V10113 -#define V10113 (V + 39210) - 0x110f, 0x1167, 0x11c0, 0, -#undef V10114 -#define V10114 (V + 39214) - 0x110f, 0x1167, 0x11c1, 0, -#undef V10115 -#define V10115 (V + 39218) - 0x110f, 0x1167, 0x11c2, 0, -#undef V10116 -#define V10116 (V + 39222) - 0x110f, 0x1168, 0, -#undef V10117 -#define V10117 (V + 39225) - 0x110f, 0x1168, 0x11a8, 0, -#undef V10118 -#define V10118 (V + 39229) - 0x110f, 0x1168, 0x11a9, 0, -#undef V10119 -#define V10119 (V + 39233) - 0x110f, 0x1168, 0x11aa, 0, -#undef V10120 -#define V10120 (V + 39237) - 0x110f, 0x1168, 0x11ab, 0, -#undef V10121 -#define V10121 (V + 39241) - 0x110f, 0x1168, 0x11ac, 0, -#undef V10122 -#define V10122 (V + 39245) - 0x110f, 0x1168, 0x11ad, 0, -#undef V10123 -#define V10123 (V + 39249) - 0x110f, 0x1168, 0x11ae, 0, -#undef V10124 -#define V10124 (V + 39253) - 0x110f, 0x1168, 0x11af, 0, -#undef V10125 -#define V10125 (V + 39257) - 0x110f, 0x1168, 0x11b0, 0, -#undef V10126 -#define V10126 (V + 39261) - 0x110f, 0x1168, 0x11b1, 0, -#undef V10127 -#define V10127 (V + 39265) - 0x110f, 0x1168, 0x11b2, 0, -#undef V10128 -#define V10128 (V + 39269) - 0x110f, 0x1168, 0x11b3, 0, -#undef V10129 -#define V10129 (V + 39273) - 0x110f, 0x1168, 0x11b4, 0, -#undef V10130 -#define V10130 (V + 39277) - 0x110f, 0x1168, 0x11b5, 0, -#undef V10131 -#define V10131 (V + 39281) - 0x110f, 0x1168, 0x11b6, 0, -#undef V10132 -#define V10132 (V + 39285) - 0x110f, 0x1168, 0x11b7, 0, -#undef V10133 -#define V10133 (V + 39289) - 0x110f, 0x1168, 0x11b8, 0, -#undef V10134 -#define V10134 (V + 39293) - 0x110f, 0x1168, 0x11b9, 0, -#undef V10135 -#define V10135 (V + 39297) - 0x110f, 0x1168, 0x11ba, 0, -#undef V10136 -#define V10136 (V + 39301) - 0x110f, 0x1168, 0x11bb, 0, -#undef V10137 -#define V10137 (V + 39305) - 0x110f, 0x1168, 0x11bc, 0, -#undef V10138 -#define V10138 (V + 39309) - 0x110f, 0x1168, 0x11bd, 0, -#undef V10139 -#define V10139 (V + 39313) - 0x110f, 0x1168, 0x11be, 0, -#undef V10140 -#define V10140 (V + 39317) - 0x110f, 0x1168, 0x11bf, 0, -#undef V10141 -#define V10141 (V + 39321) - 0x110f, 0x1168, 0x11c0, 0, -#undef V10142 -#define V10142 (V + 39325) - 0x110f, 0x1168, 0x11c1, 0, -#undef V10143 -#define V10143 (V + 39329) - 0x110f, 0x1168, 0x11c2, 0, -#undef V10144 -#define V10144 (V + 39333) - 0x110f, 0x1169, 0, -#undef V10145 -#define V10145 (V + 39336) - 0x110f, 0x1169, 0x11a8, 0, -#undef V10146 -#define V10146 (V + 39340) - 0x110f, 0x1169, 0x11a9, 0, -#undef V10147 -#define V10147 (V + 39344) - 0x110f, 0x1169, 0x11aa, 0, -#undef V10148 -#define V10148 (V + 39348) - 0x110f, 0x1169, 0x11ab, 0, -#undef V10149 -#define V10149 (V + 39352) - 0x110f, 0x1169, 0x11ac, 0, -#undef V10150 -#define V10150 (V + 39356) - 0x110f, 0x1169, 0x11ad, 0, -#undef V10151 -#define V10151 (V + 39360) - 0x110f, 0x1169, 0x11ae, 0, -#undef V10152 -#define V10152 (V + 39364) - 0x110f, 0x1169, 0x11af, 0, -#undef V10153 -#define V10153 (V + 39368) - 0x110f, 0x1169, 0x11b0, 0, -#undef V10154 -#define V10154 (V + 39372) - 0x110f, 0x1169, 0x11b1, 0, -#undef V10155 -#define V10155 (V + 39376) - 0x110f, 0x1169, 0x11b2, 0, -#undef V10156 -#define V10156 (V + 39380) - 0x110f, 0x1169, 0x11b3, 0, -#undef V10157 -#define V10157 (V + 39384) - 0x110f, 0x1169, 0x11b4, 0, -#undef V10158 -#define V10158 (V + 39388) - 0x110f, 0x1169, 0x11b5, 0, -#undef V10159 -#define V10159 (V + 39392) - 0x110f, 0x1169, 0x11b6, 0, -#undef V10160 -#define V10160 (V + 39396) - 0x110f, 0x1169, 0x11b7, 0, -#undef V10161 -#define V10161 (V + 39400) - 0x110f, 0x1169, 0x11b8, 0, -#undef V10162 -#define V10162 (V + 39404) - 0x110f, 0x1169, 0x11b9, 0, -#undef V10163 -#define V10163 (V + 39408) - 0x110f, 0x1169, 0x11ba, 0, -#undef V10164 -#define V10164 (V + 39412) - 0x110f, 0x1169, 0x11bb, 0, -#undef V10165 -#define V10165 (V + 39416) - 0x110f, 0x1169, 0x11bc, 0, -#undef V10166 -#define V10166 (V + 39420) - 0x110f, 0x1169, 0x11bd, 0, -#undef V10167 -#define V10167 (V + 39424) - 0x110f, 0x1169, 0x11be, 0, -#undef V10168 -#define V10168 (V + 39428) - 0x110f, 0x1169, 0x11bf, 0, -#undef V10169 -#define V10169 (V + 39432) - 0x110f, 0x1169, 0x11c0, 0, -#undef V10170 -#define V10170 (V + 39436) - 0x110f, 0x1169, 0x11c1, 0, -#undef V10171 -#define V10171 (V + 39440) - 0x110f, 0x1169, 0x11c2, 0, -#undef V10172 -#define V10172 (V + 39444) - 0x110f, 0x116a, 0, -#undef V10173 -#define V10173 (V + 39447) - 0x110f, 0x116a, 0x11a8, 0, -#undef V10174 -#define V10174 (V + 39451) - 0x110f, 0x116a, 0x11a9, 0, -#undef V10175 -#define V10175 (V + 39455) - 0x110f, 0x116a, 0x11aa, 0, -#undef V10176 -#define V10176 (V + 39459) - 0x110f, 0x116a, 0x11ab, 0, -#undef V10177 -#define V10177 (V + 39463) - 0x110f, 0x116a, 0x11ac, 0, -#undef V10178 -#define V10178 (V + 39467) - 0x110f, 0x116a, 0x11ad, 0, -#undef V10179 -#define V10179 (V + 39471) - 0x110f, 0x116a, 0x11ae, 0, -#undef V10180 -#define V10180 (V + 39475) - 0x110f, 0x116a, 0x11af, 0, -#undef V10181 -#define V10181 (V + 39479) - 0x110f, 0x116a, 0x11b0, 0, -#undef V10182 -#define V10182 (V + 39483) - 0x110f, 0x116a, 0x11b1, 0, -#undef V10183 -#define V10183 (V + 39487) - 0x110f, 0x116a, 0x11b2, 0, -#undef V10184 -#define V10184 (V + 39491) - 0x110f, 0x116a, 0x11b3, 0, -#undef V10185 -#define V10185 (V + 39495) - 0x110f, 0x116a, 0x11b4, 0, -#undef V10186 -#define V10186 (V + 39499) - 0x110f, 0x116a, 0x11b5, 0, -#undef V10187 -#define V10187 (V + 39503) - 0x110f, 0x116a, 0x11b6, 0, -#undef V10188 -#define V10188 (V + 39507) - 0x110f, 0x116a, 0x11b7, 0, -#undef V10189 -#define V10189 (V + 39511) - 0x110f, 0x116a, 0x11b8, 0, -#undef V10190 -#define V10190 (V + 39515) - 0x110f, 0x116a, 0x11b9, 0, -#undef V10191 -#define V10191 (V + 39519) - 0x110f, 0x116a, 0x11ba, 0, -#undef V10192 -#define V10192 (V + 39523) - 0x110f, 0x116a, 0x11bb, 0, -#undef V10193 -#define V10193 (V + 39527) - 0x110f, 0x116a, 0x11bc, 0, -#undef V10194 -#define V10194 (V + 39531) - 0x110f, 0x116a, 0x11bd, 0, -#undef V10195 -#define V10195 (V + 39535) - 0x110f, 0x116a, 0x11be, 0, -#undef V10196 -#define V10196 (V + 39539) - 0x110f, 0x116a, 0x11bf, 0, -#undef V10197 -#define V10197 (V + 39543) - 0x110f, 0x116a, 0x11c0, 0, -#undef V10198 -#define V10198 (V + 39547) - 0x110f, 0x116a, 0x11c1, 0, -#undef V10199 -#define V10199 (V + 39551) - 0x110f, 0x116a, 0x11c2, 0, -#undef V10200 -#define V10200 (V + 39555) - 0x110f, 0x116b, 0, -#undef V10201 -#define V10201 (V + 39558) - 0x110f, 0x116b, 0x11a8, 0, -#undef V10202 -#define V10202 (V + 39562) - 0x110f, 0x116b, 0x11a9, 0, -#undef V10203 -#define V10203 (V + 39566) - 0x110f, 0x116b, 0x11aa, 0, -#undef V10204 -#define V10204 (V + 39570) - 0x110f, 0x116b, 0x11ab, 0, -#undef V10205 -#define V10205 (V + 39574) - 0x110f, 0x116b, 0x11ac, 0, -#undef V10206 -#define V10206 (V + 39578) - 0x110f, 0x116b, 0x11ad, 0, -#undef V10207 -#define V10207 (V + 39582) - 0x110f, 0x116b, 0x11ae, 0, -#undef V10208 -#define V10208 (V + 39586) - 0x110f, 0x116b, 0x11af, 0, -#undef V10209 -#define V10209 (V + 39590) - 0x110f, 0x116b, 0x11b0, 0, -#undef V10210 -#define V10210 (V + 39594) - 0x110f, 0x116b, 0x11b1, 0, -#undef V10211 -#define V10211 (V + 39598) - 0x110f, 0x116b, 0x11b2, 0, -#undef V10212 -#define V10212 (V + 39602) - 0x110f, 0x116b, 0x11b3, 0, -#undef V10213 -#define V10213 (V + 39606) - 0x110f, 0x116b, 0x11b4, 0, -#undef V10214 -#define V10214 (V + 39610) - 0x110f, 0x116b, 0x11b5, 0, -#undef V10215 -#define V10215 (V + 39614) - 0x110f, 0x116b, 0x11b6, 0, -#undef V10216 -#define V10216 (V + 39618) - 0x110f, 0x116b, 0x11b7, 0, -#undef V10217 -#define V10217 (V + 39622) - 0x110f, 0x116b, 0x11b8, 0, -#undef V10218 -#define V10218 (V + 39626) - 0x110f, 0x116b, 0x11b9, 0, -#undef V10219 -#define V10219 (V + 39630) - 0x110f, 0x116b, 0x11ba, 0, -#undef V10220 -#define V10220 (V + 39634) - 0x110f, 0x116b, 0x11bb, 0, -#undef V10221 -#define V10221 (V + 39638) - 0x110f, 0x116b, 0x11bc, 0, -#undef V10222 -#define V10222 (V + 39642) - 0x110f, 0x116b, 0x11bd, 0, -#undef V10223 -#define V10223 (V + 39646) - 0x110f, 0x116b, 0x11be, 0, -#undef V10224 -#define V10224 (V + 39650) - 0x110f, 0x116b, 0x11bf, 0, -#undef V10225 -#define V10225 (V + 39654) - 0x110f, 0x116b, 0x11c0, 0, -#undef V10226 -#define V10226 (V + 39658) - 0x110f, 0x116b, 0x11c1, 0, -#undef V10227 -#define V10227 (V + 39662) - 0x110f, 0x116b, 0x11c2, 0, -#undef V10228 -#define V10228 (V + 39666) - 0x110f, 0x116c, 0, -#undef V10229 -#define V10229 (V + 39669) - 0x110f, 0x116c, 0x11a8, 0, -#undef V10230 -#define V10230 (V + 39673) - 0x110f, 0x116c, 0x11a9, 0, -#undef V10231 -#define V10231 (V + 39677) - 0x110f, 0x116c, 0x11aa, 0, -#undef V10232 -#define V10232 (V + 39681) - 0x110f, 0x116c, 0x11ab, 0, -#undef V10233 -#define V10233 (V + 39685) - 0x110f, 0x116c, 0x11ac, 0, -#undef V10234 -#define V10234 (V + 39689) - 0x110f, 0x116c, 0x11ad, 0, -#undef V10235 -#define V10235 (V + 39693) - 0x110f, 0x116c, 0x11ae, 0, -#undef V10236 -#define V10236 (V + 39697) - 0x110f, 0x116c, 0x11af, 0, -#undef V10237 -#define V10237 (V + 39701) - 0x110f, 0x116c, 0x11b0, 0, -#undef V10238 -#define V10238 (V + 39705) - 0x110f, 0x116c, 0x11b1, 0, -#undef V10239 -#define V10239 (V + 39709) - 0x110f, 0x116c, 0x11b2, 0, -#undef V10240 -#define V10240 (V + 39713) - 0x110f, 0x116c, 0x11b3, 0, -#undef V10241 -#define V10241 (V + 39717) - 0x110f, 0x116c, 0x11b4, 0, -#undef V10242 -#define V10242 (V + 39721) - 0x110f, 0x116c, 0x11b5, 0, -#undef V10243 -#define V10243 (V + 39725) - 0x110f, 0x116c, 0x11b6, 0, -#undef V10244 -#define V10244 (V + 39729) - 0x110f, 0x116c, 0x11b7, 0, -#undef V10245 -#define V10245 (V + 39733) - 0x110f, 0x116c, 0x11b8, 0, -#undef V10246 -#define V10246 (V + 39737) - 0x110f, 0x116c, 0x11b9, 0, -#undef V10247 -#define V10247 (V + 39741) - 0x110f, 0x116c, 0x11ba, 0, -#undef V10248 -#define V10248 (V + 39745) - 0x110f, 0x116c, 0x11bb, 0, -#undef V10249 -#define V10249 (V + 39749) - 0x110f, 0x116c, 0x11bc, 0, -#undef V10250 -#define V10250 (V + 39753) - 0x110f, 0x116c, 0x11bd, 0, -#undef V10251 -#define V10251 (V + 39757) - 0x110f, 0x116c, 0x11be, 0, -#undef V10252 -#define V10252 (V + 39761) - 0x110f, 0x116c, 0x11bf, 0, -#undef V10253 -#define V10253 (V + 39765) - 0x110f, 0x116c, 0x11c0, 0, -#undef V10254 -#define V10254 (V + 39769) - 0x110f, 0x116c, 0x11c1, 0, -#undef V10255 -#define V10255 (V + 39773) - 0x110f, 0x116c, 0x11c2, 0, -#undef V10256 -#define V10256 (V + 39777) - 0x110f, 0x116d, 0, -#undef V10257 -#define V10257 (V + 39780) - 0x110f, 0x116d, 0x11a8, 0, -#undef V10258 -#define V10258 (V + 39784) - 0x110f, 0x116d, 0x11a9, 0, -#undef V10259 -#define V10259 (V + 39788) - 0x110f, 0x116d, 0x11aa, 0, -#undef V10260 -#define V10260 (V + 39792) - 0x110f, 0x116d, 0x11ab, 0, -#undef V10261 -#define V10261 (V + 39796) - 0x110f, 0x116d, 0x11ac, 0, -#undef V10262 -#define V10262 (V + 39800) - 0x110f, 0x116d, 0x11ad, 0, -#undef V10263 -#define V10263 (V + 39804) - 0x110f, 0x116d, 0x11ae, 0, -#undef V10264 -#define V10264 (V + 39808) - 0x110f, 0x116d, 0x11af, 0, -#undef V10265 -#define V10265 (V + 39812) - 0x110f, 0x116d, 0x11b0, 0, -#undef V10266 -#define V10266 (V + 39816) - 0x110f, 0x116d, 0x11b1, 0, -#undef V10267 -#define V10267 (V + 39820) - 0x110f, 0x116d, 0x11b2, 0, -#undef V10268 -#define V10268 (V + 39824) - 0x110f, 0x116d, 0x11b3, 0, -#undef V10269 -#define V10269 (V + 39828) - 0x110f, 0x116d, 0x11b4, 0, -#undef V10270 -#define V10270 (V + 39832) - 0x110f, 0x116d, 0x11b5, 0, -#undef V10271 -#define V10271 (V + 39836) - 0x110f, 0x116d, 0x11b6, 0, -#undef V10272 -#define V10272 (V + 39840) - 0x110f, 0x116d, 0x11b7, 0, -#undef V10273 -#define V10273 (V + 39844) - 0x110f, 0x116d, 0x11b8, 0, -#undef V10274 -#define V10274 (V + 39848) - 0x110f, 0x116d, 0x11b9, 0, -#undef V10275 -#define V10275 (V + 39852) - 0x110f, 0x116d, 0x11ba, 0, -#undef V10276 -#define V10276 (V + 39856) - 0x110f, 0x116d, 0x11bb, 0, -#undef V10277 -#define V10277 (V + 39860) - 0x110f, 0x116d, 0x11bc, 0, -#undef V10278 -#define V10278 (V + 39864) - 0x110f, 0x116d, 0x11bd, 0, -#undef V10279 -#define V10279 (V + 39868) - 0x110f, 0x116d, 0x11be, 0, -#undef V10280 -#define V10280 (V + 39872) - 0x110f, 0x116d, 0x11bf, 0, -#undef V10281 -#define V10281 (V + 39876) - 0x110f, 0x116d, 0x11c0, 0, -#undef V10282 -#define V10282 (V + 39880) - 0x110f, 0x116d, 0x11c1, 0, -#undef V10283 -#define V10283 (V + 39884) - 0x110f, 0x116d, 0x11c2, 0, -#undef V10284 -#define V10284 (V + 39888) - 0x110f, 0x116e, 0, -#undef V10285 -#define V10285 (V + 39891) - 0x110f, 0x116e, 0x11a8, 0, -#undef V10286 -#define V10286 (V + 39895) - 0x110f, 0x116e, 0x11a9, 0, -#undef V10287 -#define V10287 (V + 39899) - 0x110f, 0x116e, 0x11aa, 0, -#undef V10288 -#define V10288 (V + 39903) - 0x110f, 0x116e, 0x11ab, 0, -#undef V10289 -#define V10289 (V + 39907) - 0x110f, 0x116e, 0x11ac, 0, -#undef V10290 -#define V10290 (V + 39911) - 0x110f, 0x116e, 0x11ad, 0, -#undef V10291 -#define V10291 (V + 39915) - 0x110f, 0x116e, 0x11ae, 0, -#undef V10292 -#define V10292 (V + 39919) - 0x110f, 0x116e, 0x11af, 0, -#undef V10293 -#define V10293 (V + 39923) - 0x110f, 0x116e, 0x11b0, 0, -#undef V10294 -#define V10294 (V + 39927) - 0x110f, 0x116e, 0x11b1, 0, -#undef V10295 -#define V10295 (V + 39931) - 0x110f, 0x116e, 0x11b2, 0, -#undef V10296 -#define V10296 (V + 39935) - 0x110f, 0x116e, 0x11b3, 0, -#undef V10297 -#define V10297 (V + 39939) - 0x110f, 0x116e, 0x11b4, 0, -#undef V10298 -#define V10298 (V + 39943) - 0x110f, 0x116e, 0x11b5, 0, -#undef V10299 -#define V10299 (V + 39947) - 0x110f, 0x116e, 0x11b6, 0, -#undef V10300 -#define V10300 (V + 39951) - 0x110f, 0x116e, 0x11b7, 0, -#undef V10301 -#define V10301 (V + 39955) - 0x110f, 0x116e, 0x11b8, 0, -#undef V10302 -#define V10302 (V + 39959) - 0x110f, 0x116e, 0x11b9, 0, -#undef V10303 -#define V10303 (V + 39963) - 0x110f, 0x116e, 0x11ba, 0, -#undef V10304 -#define V10304 (V + 39967) - 0x110f, 0x116e, 0x11bb, 0, -#undef V10305 -#define V10305 (V + 39971) - 0x110f, 0x116e, 0x11bc, 0, -#undef V10306 -#define V10306 (V + 39975) - 0x110f, 0x116e, 0x11bd, 0, -#undef V10307 -#define V10307 (V + 39979) - 0x110f, 0x116e, 0x11be, 0, -#undef V10308 -#define V10308 (V + 39983) - 0x110f, 0x116e, 0x11bf, 0, -#undef V10309 -#define V10309 (V + 39987) - 0x110f, 0x116e, 0x11c0, 0, -#undef V10310 -#define V10310 (V + 39991) - 0x110f, 0x116e, 0x11c1, 0, -#undef V10311 -#define V10311 (V + 39995) - 0x110f, 0x116e, 0x11c2, 0, -#undef V10312 -#define V10312 (V + 39999) - 0x110f, 0x116f, 0, -#undef V10313 -#define V10313 (V + 40002) - 0x110f, 0x116f, 0x11a8, 0, -#undef V10314 -#define V10314 (V + 40006) - 0x110f, 0x116f, 0x11a9, 0, -#undef V10315 -#define V10315 (V + 40010) - 0x110f, 0x116f, 0x11aa, 0, -#undef V10316 -#define V10316 (V + 40014) - 0x110f, 0x116f, 0x11ab, 0, -#undef V10317 -#define V10317 (V + 40018) - 0x110f, 0x116f, 0x11ac, 0, -#undef V10318 -#define V10318 (V + 40022) - 0x110f, 0x116f, 0x11ad, 0, -#undef V10319 -#define V10319 (V + 40026) - 0x110f, 0x116f, 0x11ae, 0, -#undef V10320 -#define V10320 (V + 40030) - 0x110f, 0x116f, 0x11af, 0, -#undef V10321 -#define V10321 (V + 40034) - 0x110f, 0x116f, 0x11b0, 0, -#undef V10322 -#define V10322 (V + 40038) - 0x110f, 0x116f, 0x11b1, 0, -#undef V10323 -#define V10323 (V + 40042) - 0x110f, 0x116f, 0x11b2, 0, -#undef V10324 -#define V10324 (V + 40046) - 0x110f, 0x116f, 0x11b3, 0, -#undef V10325 -#define V10325 (V + 40050) - 0x110f, 0x116f, 0x11b4, 0, -#undef V10326 -#define V10326 (V + 40054) - 0x110f, 0x116f, 0x11b5, 0, -#undef V10327 -#define V10327 (V + 40058) - 0x110f, 0x116f, 0x11b6, 0, -#undef V10328 -#define V10328 (V + 40062) - 0x110f, 0x116f, 0x11b7, 0, -#undef V10329 -#define V10329 (V + 40066) - 0x110f, 0x116f, 0x11b8, 0, -#undef V10330 -#define V10330 (V + 40070) - 0x110f, 0x116f, 0x11b9, 0, -#undef V10331 -#define V10331 (V + 40074) - 0x110f, 0x116f, 0x11ba, 0, -#undef V10332 -#define V10332 (V + 40078) - 0x110f, 0x116f, 0x11bb, 0, -#undef V10333 -#define V10333 (V + 40082) - 0x110f, 0x116f, 0x11bc, 0, -#undef V10334 -#define V10334 (V + 40086) - 0x110f, 0x116f, 0x11bd, 0, -#undef V10335 -#define V10335 (V + 40090) - 0x110f, 0x116f, 0x11be, 0, -#undef V10336 -#define V10336 (V + 40094) - 0x110f, 0x116f, 0x11bf, 0, -#undef V10337 -#define V10337 (V + 40098) - 0x110f, 0x116f, 0x11c0, 0, -#undef V10338 -#define V10338 (V + 40102) - 0x110f, 0x116f, 0x11c1, 0, -#undef V10339 -#define V10339 (V + 40106) - 0x110f, 0x116f, 0x11c2, 0, -#undef V10340 -#define V10340 (V + 40110) - 0x110f, 0x1170, 0, -#undef V10341 -#define V10341 (V + 40113) - 0x110f, 0x1170, 0x11a8, 0, -#undef V10342 -#define V10342 (V + 40117) - 0x110f, 0x1170, 0x11a9, 0, -#undef V10343 -#define V10343 (V + 40121) - 0x110f, 0x1170, 0x11aa, 0, -#undef V10344 -#define V10344 (V + 40125) - 0x110f, 0x1170, 0x11ab, 0, -#undef V10345 -#define V10345 (V + 40129) - 0x110f, 0x1170, 0x11ac, 0, -#undef V10346 -#define V10346 (V + 40133) - 0x110f, 0x1170, 0x11ad, 0, -#undef V10347 -#define V10347 (V + 40137) - 0x110f, 0x1170, 0x11ae, 0, -#undef V10348 -#define V10348 (V + 40141) - 0x110f, 0x1170, 0x11af, 0, -#undef V10349 -#define V10349 (V + 40145) - 0x110f, 0x1170, 0x11b0, 0, -#undef V10350 -#define V10350 (V + 40149) - 0x110f, 0x1170, 0x11b1, 0, -#undef V10351 -#define V10351 (V + 40153) - 0x110f, 0x1170, 0x11b2, 0, -#undef V10352 -#define V10352 (V + 40157) - 0x110f, 0x1170, 0x11b3, 0, -#undef V10353 -#define V10353 (V + 40161) - 0x110f, 0x1170, 0x11b4, 0, -#undef V10354 -#define V10354 (V + 40165) - 0x110f, 0x1170, 0x11b5, 0, -#undef V10355 -#define V10355 (V + 40169) - 0x110f, 0x1170, 0x11b6, 0, -#undef V10356 -#define V10356 (V + 40173) - 0x110f, 0x1170, 0x11b7, 0, -#undef V10357 -#define V10357 (V + 40177) - 0x110f, 0x1170, 0x11b8, 0, -#undef V10358 -#define V10358 (V + 40181) - 0x110f, 0x1170, 0x11b9, 0, -#undef V10359 -#define V10359 (V + 40185) - 0x110f, 0x1170, 0x11ba, 0, -#undef V10360 -#define V10360 (V + 40189) - 0x110f, 0x1170, 0x11bb, 0, -#undef V10361 -#define V10361 (V + 40193) - 0x110f, 0x1170, 0x11bc, 0, -#undef V10362 -#define V10362 (V + 40197) - 0x110f, 0x1170, 0x11bd, 0, -#undef V10363 -#define V10363 (V + 40201) - 0x110f, 0x1170, 0x11be, 0, -#undef V10364 -#define V10364 (V + 40205) - 0x110f, 0x1170, 0x11bf, 0, -#undef V10365 -#define V10365 (V + 40209) - 0x110f, 0x1170, 0x11c0, 0, -#undef V10366 -#define V10366 (V + 40213) - 0x110f, 0x1170, 0x11c1, 0, -#undef V10367 -#define V10367 (V + 40217) - 0x110f, 0x1170, 0x11c2, 0, -#undef V10368 -#define V10368 (V + 40221) - 0x110f, 0x1171, 0, -#undef V10369 -#define V10369 (V + 40224) - 0x110f, 0x1171, 0x11a8, 0, -#undef V10370 -#define V10370 (V + 40228) - 0x110f, 0x1171, 0x11a9, 0, -#undef V10371 -#define V10371 (V + 40232) - 0x110f, 0x1171, 0x11aa, 0, -#undef V10372 -#define V10372 (V + 40236) - 0x110f, 0x1171, 0x11ab, 0, -#undef V10373 -#define V10373 (V + 40240) - 0x110f, 0x1171, 0x11ac, 0, -#undef V10374 -#define V10374 (V + 40244) - 0x110f, 0x1171, 0x11ad, 0, -#undef V10375 -#define V10375 (V + 40248) - 0x110f, 0x1171, 0x11ae, 0, -#undef V10376 -#define V10376 (V + 40252) - 0x110f, 0x1171, 0x11af, 0, -#undef V10377 -#define V10377 (V + 40256) - 0x110f, 0x1171, 0x11b0, 0, -#undef V10378 -#define V10378 (V + 40260) - 0x110f, 0x1171, 0x11b1, 0, -#undef V10379 -#define V10379 (V + 40264) - 0x110f, 0x1171, 0x11b2, 0, -#undef V10380 -#define V10380 (V + 40268) - 0x110f, 0x1171, 0x11b3, 0, -#undef V10381 -#define V10381 (V + 40272) - 0x110f, 0x1171, 0x11b4, 0, -#undef V10382 -#define V10382 (V + 40276) - 0x110f, 0x1171, 0x11b5, 0, -#undef V10383 -#define V10383 (V + 40280) - 0x110f, 0x1171, 0x11b6, 0, -#undef V10384 -#define V10384 (V + 40284) - 0x110f, 0x1171, 0x11b7, 0, -#undef V10385 -#define V10385 (V + 40288) - 0x110f, 0x1171, 0x11b8, 0, -#undef V10386 -#define V10386 (V + 40292) - 0x110f, 0x1171, 0x11b9, 0, -#undef V10387 -#define V10387 (V + 40296) - 0x110f, 0x1171, 0x11ba, 0, -#undef V10388 -#define V10388 (V + 40300) - 0x110f, 0x1171, 0x11bb, 0, -#undef V10389 -#define V10389 (V + 40304) - 0x110f, 0x1171, 0x11bc, 0, -#undef V10390 -#define V10390 (V + 40308) - 0x110f, 0x1171, 0x11bd, 0, -#undef V10391 -#define V10391 (V + 40312) - 0x110f, 0x1171, 0x11be, 0, -#undef V10392 -#define V10392 (V + 40316) - 0x110f, 0x1171, 0x11bf, 0, -#undef V10393 -#define V10393 (V + 40320) - 0x110f, 0x1171, 0x11c0, 0, -#undef V10394 -#define V10394 (V + 40324) - 0x110f, 0x1171, 0x11c1, 0, -#undef V10395 -#define V10395 (V + 40328) - 0x110f, 0x1171, 0x11c2, 0, -#undef V10396 -#define V10396 (V + 40332) - 0x110f, 0x1172, 0, -#undef V10397 -#define V10397 (V + 40335) - 0x110f, 0x1172, 0x11a8, 0, -#undef V10398 -#define V10398 (V + 40339) - 0x110f, 0x1172, 0x11a9, 0, -#undef V10399 -#define V10399 (V + 40343) - 0x110f, 0x1172, 0x11aa, 0, -#undef V10400 -#define V10400 (V + 40347) - 0x110f, 0x1172, 0x11ab, 0, -#undef V10401 -#define V10401 (V + 40351) - 0x110f, 0x1172, 0x11ac, 0, -#undef V10402 -#define V10402 (V + 40355) - 0x110f, 0x1172, 0x11ad, 0, -#undef V10403 -#define V10403 (V + 40359) - 0x110f, 0x1172, 0x11ae, 0, -#undef V10404 -#define V10404 (V + 40363) - 0x110f, 0x1172, 0x11af, 0, -#undef V10405 -#define V10405 (V + 40367) - 0x110f, 0x1172, 0x11b0, 0, -#undef V10406 -#define V10406 (V + 40371) - 0x110f, 0x1172, 0x11b1, 0, -#undef V10407 -#define V10407 (V + 40375) - 0x110f, 0x1172, 0x11b2, 0, -#undef V10408 -#define V10408 (V + 40379) - 0x110f, 0x1172, 0x11b3, 0, -#undef V10409 -#define V10409 (V + 40383) - 0x110f, 0x1172, 0x11b4, 0, -#undef V10410 -#define V10410 (V + 40387) - 0x110f, 0x1172, 0x11b5, 0, -#undef V10411 -#define V10411 (V + 40391) - 0x110f, 0x1172, 0x11b6, 0, -#undef V10412 -#define V10412 (V + 40395) - 0x110f, 0x1172, 0x11b7, 0, -#undef V10413 -#define V10413 (V + 40399) - 0x110f, 0x1172, 0x11b8, 0, -#undef V10414 -#define V10414 (V + 40403) - 0x110f, 0x1172, 0x11b9, 0, -#undef V10415 -#define V10415 (V + 40407) - 0x110f, 0x1172, 0x11ba, 0, -#undef V10416 -#define V10416 (V + 40411) - 0x110f, 0x1172, 0x11bb, 0, -#undef V10417 -#define V10417 (V + 40415) - 0x110f, 0x1172, 0x11bc, 0, -#undef V10418 -#define V10418 (V + 40419) - 0x110f, 0x1172, 0x11bd, 0, -#undef V10419 -#define V10419 (V + 40423) - 0x110f, 0x1172, 0x11be, 0, -#undef V10420 -#define V10420 (V + 40427) - 0x110f, 0x1172, 0x11bf, 0, -#undef V10421 -#define V10421 (V + 40431) - 0x110f, 0x1172, 0x11c0, 0, -#undef V10422 -#define V10422 (V + 40435) - 0x110f, 0x1172, 0x11c1, 0, -#undef V10423 -#define V10423 (V + 40439) - 0x110f, 0x1172, 0x11c2, 0, -#undef V10424 -#define V10424 (V + 40443) - 0x110f, 0x1173, 0, -#undef V10425 -#define V10425 (V + 40446) - 0x110f, 0x1173, 0x11a8, 0, -#undef V10426 -#define V10426 (V + 40450) - 0x110f, 0x1173, 0x11a9, 0, -#undef V10427 -#define V10427 (V + 40454) - 0x110f, 0x1173, 0x11aa, 0, -#undef V10428 -#define V10428 (V + 40458) - 0x110f, 0x1173, 0x11ab, 0, -#undef V10429 -#define V10429 (V + 40462) - 0x110f, 0x1173, 0x11ac, 0, -#undef V10430 -#define V10430 (V + 40466) - 0x110f, 0x1173, 0x11ad, 0, -#undef V10431 -#define V10431 (V + 40470) - 0x110f, 0x1173, 0x11ae, 0, -#undef V10432 -#define V10432 (V + 40474) - 0x110f, 0x1173, 0x11af, 0, -#undef V10433 -#define V10433 (V + 40478) - 0x110f, 0x1173, 0x11b0, 0, -#undef V10434 -#define V10434 (V + 40482) - 0x110f, 0x1173, 0x11b1, 0, -#undef V10435 -#define V10435 (V + 40486) - 0x110f, 0x1173, 0x11b2, 0, -#undef V10436 -#define V10436 (V + 40490) - 0x110f, 0x1173, 0x11b3, 0, -#undef V10437 -#define V10437 (V + 40494) - 0x110f, 0x1173, 0x11b4, 0, -#undef V10438 -#define V10438 (V + 40498) - 0x110f, 0x1173, 0x11b5, 0, -#undef V10439 -#define V10439 (V + 40502) - 0x110f, 0x1173, 0x11b6, 0, -#undef V10440 -#define V10440 (V + 40506) - 0x110f, 0x1173, 0x11b7, 0, -#undef V10441 -#define V10441 (V + 40510) - 0x110f, 0x1173, 0x11b8, 0, -#undef V10442 -#define V10442 (V + 40514) - 0x110f, 0x1173, 0x11b9, 0, -#undef V10443 -#define V10443 (V + 40518) - 0x110f, 0x1173, 0x11ba, 0, -#undef V10444 -#define V10444 (V + 40522) - 0x110f, 0x1173, 0x11bb, 0, -#undef V10445 -#define V10445 (V + 40526) - 0x110f, 0x1173, 0x11bc, 0, -#undef V10446 -#define V10446 (V + 40530) - 0x110f, 0x1173, 0x11bd, 0, -#undef V10447 -#define V10447 (V + 40534) - 0x110f, 0x1173, 0x11be, 0, -#undef V10448 -#define V10448 (V + 40538) - 0x110f, 0x1173, 0x11bf, 0, -#undef V10449 -#define V10449 (V + 40542) - 0x110f, 0x1173, 0x11c0, 0, -#undef V10450 -#define V10450 (V + 40546) - 0x110f, 0x1173, 0x11c1, 0, -#undef V10451 -#define V10451 (V + 40550) - 0x110f, 0x1173, 0x11c2, 0, -#undef V10452 -#define V10452 (V + 40554) - 0x110f, 0x1174, 0, -#undef V10453 -#define V10453 (V + 40557) - 0x110f, 0x1174, 0x11a8, 0, -#undef V10454 -#define V10454 (V + 40561) - 0x110f, 0x1174, 0x11a9, 0, -#undef V10455 -#define V10455 (V + 40565) - 0x110f, 0x1174, 0x11aa, 0, -#undef V10456 -#define V10456 (V + 40569) - 0x110f, 0x1174, 0x11ab, 0, -#undef V10457 -#define V10457 (V + 40573) - 0x110f, 0x1174, 0x11ac, 0, -#undef V10458 -#define V10458 (V + 40577) - 0x110f, 0x1174, 0x11ad, 0, -#undef V10459 -#define V10459 (V + 40581) - 0x110f, 0x1174, 0x11ae, 0, -#undef V10460 -#define V10460 (V + 40585) - 0x110f, 0x1174, 0x11af, 0, -#undef V10461 -#define V10461 (V + 40589) - 0x110f, 0x1174, 0x11b0, 0, -#undef V10462 -#define V10462 (V + 40593) - 0x110f, 0x1174, 0x11b1, 0, -#undef V10463 -#define V10463 (V + 40597) - 0x110f, 0x1174, 0x11b2, 0, -#undef V10464 -#define V10464 (V + 40601) - 0x110f, 0x1174, 0x11b3, 0, -#undef V10465 -#define V10465 (V + 40605) - 0x110f, 0x1174, 0x11b4, 0, -#undef V10466 -#define V10466 (V + 40609) - 0x110f, 0x1174, 0x11b5, 0, -#undef V10467 -#define V10467 (V + 40613) - 0x110f, 0x1174, 0x11b6, 0, -#undef V10468 -#define V10468 (V + 40617) - 0x110f, 0x1174, 0x11b7, 0, -#undef V10469 -#define V10469 (V + 40621) - 0x110f, 0x1174, 0x11b8, 0, -#undef V10470 -#define V10470 (V + 40625) - 0x110f, 0x1174, 0x11b9, 0, -#undef V10471 -#define V10471 (V + 40629) - 0x110f, 0x1174, 0x11ba, 0, -#undef V10472 -#define V10472 (V + 40633) - 0x110f, 0x1174, 0x11bb, 0, -#undef V10473 -#define V10473 (V + 40637) - 0x110f, 0x1174, 0x11bc, 0, -#undef V10474 -#define V10474 (V + 40641) - 0x110f, 0x1174, 0x11bd, 0, -#undef V10475 -#define V10475 (V + 40645) - 0x110f, 0x1174, 0x11be, 0, -#undef V10476 -#define V10476 (V + 40649) - 0x110f, 0x1174, 0x11bf, 0, -#undef V10477 -#define V10477 (V + 40653) - 0x110f, 0x1174, 0x11c0, 0, -#undef V10478 -#define V10478 (V + 40657) - 0x110f, 0x1174, 0x11c1, 0, -#undef V10479 -#define V10479 (V + 40661) - 0x110f, 0x1174, 0x11c2, 0, -#undef V10480 -#define V10480 (V + 40665) - 0x110f, 0x1175, 0, -#undef V10481 -#define V10481 (V + 40668) - 0x110f, 0x1175, 0x11a8, 0, -#undef V10482 -#define V10482 (V + 40672) - 0x110f, 0x1175, 0x11a9, 0, -#undef V10483 -#define V10483 (V + 40676) - 0x110f, 0x1175, 0x11aa, 0, -#undef V10484 -#define V10484 (V + 40680) - 0x110f, 0x1175, 0x11ab, 0, -#undef V10485 -#define V10485 (V + 40684) - 0x110f, 0x1175, 0x11ac, 0, -#undef V10486 -#define V10486 (V + 40688) - 0x110f, 0x1175, 0x11ad, 0, -#undef V10487 -#define V10487 (V + 40692) - 0x110f, 0x1175, 0x11ae, 0, -#undef V10488 -#define V10488 (V + 40696) - 0x110f, 0x1175, 0x11af, 0, -#undef V10489 -#define V10489 (V + 40700) - 0x110f, 0x1175, 0x11b0, 0, -#undef V10490 -#define V10490 (V + 40704) - 0x110f, 0x1175, 0x11b1, 0, -#undef V10491 -#define V10491 (V + 40708) - 0x110f, 0x1175, 0x11b2, 0, -#undef V10492 -#define V10492 (V + 40712) - 0x110f, 0x1175, 0x11b3, 0, -#undef V10493 -#define V10493 (V + 40716) - 0x110f, 0x1175, 0x11b4, 0, -#undef V10494 -#define V10494 (V + 40720) - 0x110f, 0x1175, 0x11b5, 0, -#undef V10495 -#define V10495 (V + 40724) - 0x110f, 0x1175, 0x11b6, 0, -#undef V10496 -#define V10496 (V + 40728) - 0x110f, 0x1175, 0x11b7, 0, -#undef V10497 -#define V10497 (V + 40732) - 0x110f, 0x1175, 0x11b8, 0, -#undef V10498 -#define V10498 (V + 40736) - 0x110f, 0x1175, 0x11b9, 0, -#undef V10499 -#define V10499 (V + 40740) - 0x110f, 0x1175, 0x11ba, 0, -#undef V10500 -#define V10500 (V + 40744) - 0x110f, 0x1175, 0x11bb, 0, -#undef V10501 -#define V10501 (V + 40748) - 0x110f, 0x1175, 0x11bc, 0, -#undef V10502 -#define V10502 (V + 40752) - 0x110f, 0x1175, 0x11bd, 0, -#undef V10503 -#define V10503 (V + 40756) - 0x110f, 0x1175, 0x11be, 0, -#undef V10504 -#define V10504 (V + 40760) - 0x110f, 0x1175, 0x11bf, 0, -#undef V10505 -#define V10505 (V + 40764) - 0x110f, 0x1175, 0x11c0, 0, -#undef V10506 -#define V10506 (V + 40768) - 0x110f, 0x1175, 0x11c1, 0, -#undef V10507 -#define V10507 (V + 40772) - 0x110f, 0x1175, 0x11c2, 0, -#undef V10508 -#define V10508 (V + 40776) - 0x1110, 0x1161, 0, -#undef V10509 -#define V10509 (V + 40779) - 0x1110, 0x1161, 0x11a8, 0, -#undef V10510 -#define V10510 (V + 40783) - 0x1110, 0x1161, 0x11a9, 0, -#undef V10511 -#define V10511 (V + 40787) - 0x1110, 0x1161, 0x11aa, 0, -#undef V10512 -#define V10512 (V + 40791) - 0x1110, 0x1161, 0x11ab, 0, -#undef V10513 -#define V10513 (V + 40795) - 0x1110, 0x1161, 0x11ac, 0, -#undef V10514 -#define V10514 (V + 40799) - 0x1110, 0x1161, 0x11ad, 0, -#undef V10515 -#define V10515 (V + 40803) - 0x1110, 0x1161, 0x11ae, 0, -#undef V10516 -#define V10516 (V + 40807) - 0x1110, 0x1161, 0x11af, 0, -#undef V10517 -#define V10517 (V + 40811) - 0x1110, 0x1161, 0x11b0, 0, -#undef V10518 -#define V10518 (V + 40815) - 0x1110, 0x1161, 0x11b1, 0, -#undef V10519 -#define V10519 (V + 40819) - 0x1110, 0x1161, 0x11b2, 0, -#undef V10520 -#define V10520 (V + 40823) - 0x1110, 0x1161, 0x11b3, 0, -#undef V10521 -#define V10521 (V + 40827) - 0x1110, 0x1161, 0x11b4, 0, -#undef V10522 -#define V10522 (V + 40831) - 0x1110, 0x1161, 0x11b5, 0, -#undef V10523 -#define V10523 (V + 40835) - 0x1110, 0x1161, 0x11b6, 0, -#undef V10524 -#define V10524 (V + 40839) - 0x1110, 0x1161, 0x11b7, 0, -#undef V10525 -#define V10525 (V + 40843) - 0x1110, 0x1161, 0x11b8, 0, -#undef V10526 -#define V10526 (V + 40847) - 0x1110, 0x1161, 0x11b9, 0, -#undef V10527 -#define V10527 (V + 40851) - 0x1110, 0x1161, 0x11ba, 0, -#undef V10528 -#define V10528 (V + 40855) - 0x1110, 0x1161, 0x11bb, 0, -#undef V10529 -#define V10529 (V + 40859) - 0x1110, 0x1161, 0x11bc, 0, -#undef V10530 -#define V10530 (V + 40863) - 0x1110, 0x1161, 0x11bd, 0, -#undef V10531 -#define V10531 (V + 40867) - 0x1110, 0x1161, 0x11be, 0, -#undef V10532 -#define V10532 (V + 40871) - 0x1110, 0x1161, 0x11bf, 0, -#undef V10533 -#define V10533 (V + 40875) - 0x1110, 0x1161, 0x11c0, 0, -#undef V10534 -#define V10534 (V + 40879) - 0x1110, 0x1161, 0x11c1, 0, -#undef V10535 -#define V10535 (V + 40883) - 0x1110, 0x1161, 0x11c2, 0, -#undef V10536 -#define V10536 (V + 40887) - 0x1110, 0x1162, 0, -#undef V10537 -#define V10537 (V + 40890) - 0x1110, 0x1162, 0x11a8, 0, -#undef V10538 -#define V10538 (V + 40894) - 0x1110, 0x1162, 0x11a9, 0, -#undef V10539 -#define V10539 (V + 40898) - 0x1110, 0x1162, 0x11aa, 0, -#undef V10540 -#define V10540 (V + 40902) - 0x1110, 0x1162, 0x11ab, 0, -#undef V10541 -#define V10541 (V + 40906) - 0x1110, 0x1162, 0x11ac, 0, -#undef V10542 -#define V10542 (V + 40910) - 0x1110, 0x1162, 0x11ad, 0, -#undef V10543 -#define V10543 (V + 40914) - 0x1110, 0x1162, 0x11ae, 0, -#undef V10544 -#define V10544 (V + 40918) - 0x1110, 0x1162, 0x11af, 0, -#undef V10545 -#define V10545 (V + 40922) - 0x1110, 0x1162, 0x11b0, 0, -#undef V10546 -#define V10546 (V + 40926) - 0x1110, 0x1162, 0x11b1, 0, -#undef V10547 -#define V10547 (V + 40930) - 0x1110, 0x1162, 0x11b2, 0, -#undef V10548 -#define V10548 (V + 40934) - 0x1110, 0x1162, 0x11b3, 0, -#undef V10549 -#define V10549 (V + 40938) - 0x1110, 0x1162, 0x11b4, 0, -#undef V10550 -#define V10550 (V + 40942) - 0x1110, 0x1162, 0x11b5, 0, -#undef V10551 -#define V10551 (V + 40946) - 0x1110, 0x1162, 0x11b6, 0, -#undef V10552 -#define V10552 (V + 40950) - 0x1110, 0x1162, 0x11b7, 0, -#undef V10553 -#define V10553 (V + 40954) - 0x1110, 0x1162, 0x11b8, 0, -#undef V10554 -#define V10554 (V + 40958) - 0x1110, 0x1162, 0x11b9, 0, -#undef V10555 -#define V10555 (V + 40962) - 0x1110, 0x1162, 0x11ba, 0, -#undef V10556 -#define V10556 (V + 40966) - 0x1110, 0x1162, 0x11bb, 0, -#undef V10557 -#define V10557 (V + 40970) - 0x1110, 0x1162, 0x11bc, 0, -#undef V10558 -#define V10558 (V + 40974) - 0x1110, 0x1162, 0x11bd, 0, -#undef V10559 -#define V10559 (V + 40978) - 0x1110, 0x1162, 0x11be, 0, -#undef V10560 -#define V10560 (V + 40982) - 0x1110, 0x1162, 0x11bf, 0, -#undef V10561 -#define V10561 (V + 40986) - 0x1110, 0x1162, 0x11c0, 0, -#undef V10562 -#define V10562 (V + 40990) - 0x1110, 0x1162, 0x11c1, 0, -#undef V10563 -#define V10563 (V + 40994) - 0x1110, 0x1162, 0x11c2, 0, -#undef V10564 -#define V10564 (V + 40998) - 0x1110, 0x1163, 0, -#undef V10565 -#define V10565 (V + 41001) - 0x1110, 0x1163, 0x11a8, 0, -#undef V10566 -#define V10566 (V + 41005) - 0x1110, 0x1163, 0x11a9, 0, -#undef V10567 -#define V10567 (V + 41009) - 0x1110, 0x1163, 0x11aa, 0, -#undef V10568 -#define V10568 (V + 41013) - 0x1110, 0x1163, 0x11ab, 0, -#undef V10569 -#define V10569 (V + 41017) - 0x1110, 0x1163, 0x11ac, 0, -#undef V10570 -#define V10570 (V + 41021) - 0x1110, 0x1163, 0x11ad, 0, -#undef V10571 -#define V10571 (V + 41025) - 0x1110, 0x1163, 0x11ae, 0, -#undef V10572 -#define V10572 (V + 41029) - 0x1110, 0x1163, 0x11af, 0, -#undef V10573 -#define V10573 (V + 41033) - 0x1110, 0x1163, 0x11b0, 0, -#undef V10574 -#define V10574 (V + 41037) - 0x1110, 0x1163, 0x11b1, 0, -#undef V10575 -#define V10575 (V + 41041) - 0x1110, 0x1163, 0x11b2, 0, -#undef V10576 -#define V10576 (V + 41045) - 0x1110, 0x1163, 0x11b3, 0, -#undef V10577 -#define V10577 (V + 41049) - 0x1110, 0x1163, 0x11b4, 0, -#undef V10578 -#define V10578 (V + 41053) - 0x1110, 0x1163, 0x11b5, 0, -#undef V10579 -#define V10579 (V + 41057) - 0x1110, 0x1163, 0x11b6, 0, -#undef V10580 -#define V10580 (V + 41061) - 0x1110, 0x1163, 0x11b7, 0, -#undef V10581 -#define V10581 (V + 41065) - 0x1110, 0x1163, 0x11b8, 0, -#undef V10582 -#define V10582 (V + 41069) - 0x1110, 0x1163, 0x11b9, 0, -#undef V10583 -#define V10583 (V + 41073) - 0x1110, 0x1163, 0x11ba, 0, -#undef V10584 -#define V10584 (V + 41077) - 0x1110, 0x1163, 0x11bb, 0, -#undef V10585 -#define V10585 (V + 41081) - 0x1110, 0x1163, 0x11bc, 0, -#undef V10586 -#define V10586 (V + 41085) - 0x1110, 0x1163, 0x11bd, 0, -#undef V10587 -#define V10587 (V + 41089) - 0x1110, 0x1163, 0x11be, 0, -#undef V10588 -#define V10588 (V + 41093) - 0x1110, 0x1163, 0x11bf, 0, -#undef V10589 -#define V10589 (V + 41097) - 0x1110, 0x1163, 0x11c0, 0, -#undef V10590 -#define V10590 (V + 41101) - 0x1110, 0x1163, 0x11c1, 0, -#undef V10591 -#define V10591 (V + 41105) - 0x1110, 0x1163, 0x11c2, 0, -#undef V10592 -#define V10592 (V + 41109) - 0x1110, 0x1164, 0, -#undef V10593 -#define V10593 (V + 41112) - 0x1110, 0x1164, 0x11a8, 0, -#undef V10594 -#define V10594 (V + 41116) - 0x1110, 0x1164, 0x11a9, 0, -#undef V10595 -#define V10595 (V + 41120) - 0x1110, 0x1164, 0x11aa, 0, -#undef V10596 -#define V10596 (V + 41124) - 0x1110, 0x1164, 0x11ab, 0, -#undef V10597 -#define V10597 (V + 41128) - 0x1110, 0x1164, 0x11ac, 0, -#undef V10598 -#define V10598 (V + 41132) - 0x1110, 0x1164, 0x11ad, 0, -#undef V10599 -#define V10599 (V + 41136) - 0x1110, 0x1164, 0x11ae, 0, -#undef V10600 -#define V10600 (V + 41140) - 0x1110, 0x1164, 0x11af, 0, -#undef V10601 -#define V10601 (V + 41144) - 0x1110, 0x1164, 0x11b0, 0, -#undef V10602 -#define V10602 (V + 41148) - 0x1110, 0x1164, 0x11b1, 0, -#undef V10603 -#define V10603 (V + 41152) - 0x1110, 0x1164, 0x11b2, 0, -#undef V10604 -#define V10604 (V + 41156) - 0x1110, 0x1164, 0x11b3, 0, -#undef V10605 -#define V10605 (V + 41160) - 0x1110, 0x1164, 0x11b4, 0, -#undef V10606 -#define V10606 (V + 41164) - 0x1110, 0x1164, 0x11b5, 0, -#undef V10607 -#define V10607 (V + 41168) - 0x1110, 0x1164, 0x11b6, 0, -#undef V10608 -#define V10608 (V + 41172) - 0x1110, 0x1164, 0x11b7, 0, -#undef V10609 -#define V10609 (V + 41176) - 0x1110, 0x1164, 0x11b8, 0, -#undef V10610 -#define V10610 (V + 41180) - 0x1110, 0x1164, 0x11b9, 0, -#undef V10611 -#define V10611 (V + 41184) - 0x1110, 0x1164, 0x11ba, 0, -#undef V10612 -#define V10612 (V + 41188) - 0x1110, 0x1164, 0x11bb, 0, -#undef V10613 -#define V10613 (V + 41192) - 0x1110, 0x1164, 0x11bc, 0, -#undef V10614 -#define V10614 (V + 41196) - 0x1110, 0x1164, 0x11bd, 0, -#undef V10615 -#define V10615 (V + 41200) - 0x1110, 0x1164, 0x11be, 0, -#undef V10616 -#define V10616 (V + 41204) - 0x1110, 0x1164, 0x11bf, 0, -#undef V10617 -#define V10617 (V + 41208) - 0x1110, 0x1164, 0x11c0, 0, -#undef V10618 -#define V10618 (V + 41212) - 0x1110, 0x1164, 0x11c1, 0, -#undef V10619 -#define V10619 (V + 41216) - 0x1110, 0x1164, 0x11c2, 0, -#undef V10620 -#define V10620 (V + 41220) - 0x1110, 0x1165, 0, -#undef V10621 -#define V10621 (V + 41223) - 0x1110, 0x1165, 0x11a8, 0, -#undef V10622 -#define V10622 (V + 41227) - 0x1110, 0x1165, 0x11a9, 0, -#undef V10623 -#define V10623 (V + 41231) - 0x1110, 0x1165, 0x11aa, 0, -#undef V10624 -#define V10624 (V + 41235) - 0x1110, 0x1165, 0x11ab, 0, -#undef V10625 -#define V10625 (V + 41239) - 0x1110, 0x1165, 0x11ac, 0, -#undef V10626 -#define V10626 (V + 41243) - 0x1110, 0x1165, 0x11ad, 0, -#undef V10627 -#define V10627 (V + 41247) - 0x1110, 0x1165, 0x11ae, 0, -#undef V10628 -#define V10628 (V + 41251) - 0x1110, 0x1165, 0x11af, 0, -#undef V10629 -#define V10629 (V + 41255) - 0x1110, 0x1165, 0x11b0, 0, -#undef V10630 -#define V10630 (V + 41259) - 0x1110, 0x1165, 0x11b1, 0, -#undef V10631 -#define V10631 (V + 41263) - 0x1110, 0x1165, 0x11b2, 0, -#undef V10632 -#define V10632 (V + 41267) - 0x1110, 0x1165, 0x11b3, 0, -#undef V10633 -#define V10633 (V + 41271) - 0x1110, 0x1165, 0x11b4, 0, -#undef V10634 -#define V10634 (V + 41275) - 0x1110, 0x1165, 0x11b5, 0, -#undef V10635 -#define V10635 (V + 41279) - 0x1110, 0x1165, 0x11b6, 0, -#undef V10636 -#define V10636 (V + 41283) - 0x1110, 0x1165, 0x11b7, 0, -#undef V10637 -#define V10637 (V + 41287) - 0x1110, 0x1165, 0x11b8, 0, -#undef V10638 -#define V10638 (V + 41291) - 0x1110, 0x1165, 0x11b9, 0, -#undef V10639 -#define V10639 (V + 41295) - 0x1110, 0x1165, 0x11ba, 0, -#undef V10640 -#define V10640 (V + 41299) - 0x1110, 0x1165, 0x11bb, 0, -#undef V10641 -#define V10641 (V + 41303) - 0x1110, 0x1165, 0x11bc, 0, -#undef V10642 -#define V10642 (V + 41307) - 0x1110, 0x1165, 0x11bd, 0, -#undef V10643 -#define V10643 (V + 41311) - 0x1110, 0x1165, 0x11be, 0, -#undef V10644 -#define V10644 (V + 41315) - 0x1110, 0x1165, 0x11bf, 0, -#undef V10645 -#define V10645 (V + 41319) - 0x1110, 0x1165, 0x11c0, 0, -#undef V10646 -#define V10646 (V + 41323) - 0x1110, 0x1165, 0x11c1, 0, -#undef V10647 -#define V10647 (V + 41327) - 0x1110, 0x1165, 0x11c2, 0, -#undef V10648 -#define V10648 (V + 41331) - 0x1110, 0x1166, 0, -#undef V10649 -#define V10649 (V + 41334) - 0x1110, 0x1166, 0x11a8, 0, -#undef V10650 -#define V10650 (V + 41338) - 0x1110, 0x1166, 0x11a9, 0, -#undef V10651 -#define V10651 (V + 41342) - 0x1110, 0x1166, 0x11aa, 0, -#undef V10652 -#define V10652 (V + 41346) - 0x1110, 0x1166, 0x11ab, 0, -#undef V10653 -#define V10653 (V + 41350) - 0x1110, 0x1166, 0x11ac, 0, -#undef V10654 -#define V10654 (V + 41354) - 0x1110, 0x1166, 0x11ad, 0, -#undef V10655 -#define V10655 (V + 41358) - 0x1110, 0x1166, 0x11ae, 0, -#undef V10656 -#define V10656 (V + 41362) - 0x1110, 0x1166, 0x11af, 0, -#undef V10657 -#define V10657 (V + 41366) - 0x1110, 0x1166, 0x11b0, 0, -#undef V10658 -#define V10658 (V + 41370) - 0x1110, 0x1166, 0x11b1, 0, -#undef V10659 -#define V10659 (V + 41374) - 0x1110, 0x1166, 0x11b2, 0, -#undef V10660 -#define V10660 (V + 41378) - 0x1110, 0x1166, 0x11b3, 0, -#undef V10661 -#define V10661 (V + 41382) - 0x1110, 0x1166, 0x11b4, 0, -#undef V10662 -#define V10662 (V + 41386) - 0x1110, 0x1166, 0x11b5, 0, -#undef V10663 -#define V10663 (V + 41390) - 0x1110, 0x1166, 0x11b6, 0, -#undef V10664 -#define V10664 (V + 41394) - 0x1110, 0x1166, 0x11b7, 0, -#undef V10665 -#define V10665 (V + 41398) - 0x1110, 0x1166, 0x11b8, 0, -#undef V10666 -#define V10666 (V + 41402) - 0x1110, 0x1166, 0x11b9, 0, -#undef V10667 -#define V10667 (V + 41406) - 0x1110, 0x1166, 0x11ba, 0, -#undef V10668 -#define V10668 (V + 41410) - 0x1110, 0x1166, 0x11bb, 0, -#undef V10669 -#define V10669 (V + 41414) - 0x1110, 0x1166, 0x11bc, 0, -#undef V10670 -#define V10670 (V + 41418) - 0x1110, 0x1166, 0x11bd, 0, -#undef V10671 -#define V10671 (V + 41422) - 0x1110, 0x1166, 0x11be, 0, -#undef V10672 -#define V10672 (V + 41426) - 0x1110, 0x1166, 0x11bf, 0, -#undef V10673 -#define V10673 (V + 41430) - 0x1110, 0x1166, 0x11c0, 0, -#undef V10674 -#define V10674 (V + 41434) - 0x1110, 0x1166, 0x11c1, 0, -#undef V10675 -#define V10675 (V + 41438) - 0x1110, 0x1166, 0x11c2, 0, -#undef V10676 -#define V10676 (V + 41442) - 0x1110, 0x1167, 0, -#undef V10677 -#define V10677 (V + 41445) - 0x1110, 0x1167, 0x11a8, 0, -#undef V10678 -#define V10678 (V + 41449) - 0x1110, 0x1167, 0x11a9, 0, -#undef V10679 -#define V10679 (V + 41453) - 0x1110, 0x1167, 0x11aa, 0, -#undef V10680 -#define V10680 (V + 41457) - 0x1110, 0x1167, 0x11ab, 0, -#undef V10681 -#define V10681 (V + 41461) - 0x1110, 0x1167, 0x11ac, 0, -#undef V10682 -#define V10682 (V + 41465) - 0x1110, 0x1167, 0x11ad, 0, -#undef V10683 -#define V10683 (V + 41469) - 0x1110, 0x1167, 0x11ae, 0, -#undef V10684 -#define V10684 (V + 41473) - 0x1110, 0x1167, 0x11af, 0, -#undef V10685 -#define V10685 (V + 41477) - 0x1110, 0x1167, 0x11b0, 0, -#undef V10686 -#define V10686 (V + 41481) - 0x1110, 0x1167, 0x11b1, 0, -#undef V10687 -#define V10687 (V + 41485) - 0x1110, 0x1167, 0x11b2, 0, -#undef V10688 -#define V10688 (V + 41489) - 0x1110, 0x1167, 0x11b3, 0, -#undef V10689 -#define V10689 (V + 41493) - 0x1110, 0x1167, 0x11b4, 0, -#undef V10690 -#define V10690 (V + 41497) - 0x1110, 0x1167, 0x11b5, 0, -#undef V10691 -#define V10691 (V + 41501) - 0x1110, 0x1167, 0x11b6, 0, -#undef V10692 -#define V10692 (V + 41505) - 0x1110, 0x1167, 0x11b7, 0, -#undef V10693 -#define V10693 (V + 41509) - 0x1110, 0x1167, 0x11b8, 0, -#undef V10694 -#define V10694 (V + 41513) - 0x1110, 0x1167, 0x11b9, 0, -#undef V10695 -#define V10695 (V + 41517) - 0x1110, 0x1167, 0x11ba, 0, -#undef V10696 -#define V10696 (V + 41521) - 0x1110, 0x1167, 0x11bb, 0, -#undef V10697 -#define V10697 (V + 41525) - 0x1110, 0x1167, 0x11bc, 0, -#undef V10698 -#define V10698 (V + 41529) - 0x1110, 0x1167, 0x11bd, 0, -#undef V10699 -#define V10699 (V + 41533) - 0x1110, 0x1167, 0x11be, 0, -#undef V10700 -#define V10700 (V + 41537) - 0x1110, 0x1167, 0x11bf, 0, -#undef V10701 -#define V10701 (V + 41541) - 0x1110, 0x1167, 0x11c0, 0, -#undef V10702 -#define V10702 (V + 41545) - 0x1110, 0x1167, 0x11c1, 0, -#undef V10703 -#define V10703 (V + 41549) - 0x1110, 0x1167, 0x11c2, 0, -#undef V10704 -#define V10704 (V + 41553) - 0x1110, 0x1168, 0, -#undef V10705 -#define V10705 (V + 41556) - 0x1110, 0x1168, 0x11a8, 0, -#undef V10706 -#define V10706 (V + 41560) - 0x1110, 0x1168, 0x11a9, 0, -#undef V10707 -#define V10707 (V + 41564) - 0x1110, 0x1168, 0x11aa, 0, -#undef V10708 -#define V10708 (V + 41568) - 0x1110, 0x1168, 0x11ab, 0, -#undef V10709 -#define V10709 (V + 41572) - 0x1110, 0x1168, 0x11ac, 0, -#undef V10710 -#define V10710 (V + 41576) - 0x1110, 0x1168, 0x11ad, 0, -#undef V10711 -#define V10711 (V + 41580) - 0x1110, 0x1168, 0x11ae, 0, -#undef V10712 -#define V10712 (V + 41584) - 0x1110, 0x1168, 0x11af, 0, -#undef V10713 -#define V10713 (V + 41588) - 0x1110, 0x1168, 0x11b0, 0, -#undef V10714 -#define V10714 (V + 41592) - 0x1110, 0x1168, 0x11b1, 0, -#undef V10715 -#define V10715 (V + 41596) - 0x1110, 0x1168, 0x11b2, 0, -#undef V10716 -#define V10716 (V + 41600) - 0x1110, 0x1168, 0x11b3, 0, -#undef V10717 -#define V10717 (V + 41604) - 0x1110, 0x1168, 0x11b4, 0, -#undef V10718 -#define V10718 (V + 41608) - 0x1110, 0x1168, 0x11b5, 0, -#undef V10719 -#define V10719 (V + 41612) - 0x1110, 0x1168, 0x11b6, 0, -#undef V10720 -#define V10720 (V + 41616) - 0x1110, 0x1168, 0x11b7, 0, -#undef V10721 -#define V10721 (V + 41620) - 0x1110, 0x1168, 0x11b8, 0, -#undef V10722 -#define V10722 (V + 41624) - 0x1110, 0x1168, 0x11b9, 0, -#undef V10723 -#define V10723 (V + 41628) - 0x1110, 0x1168, 0x11ba, 0, -#undef V10724 -#define V10724 (V + 41632) - 0x1110, 0x1168, 0x11bb, 0, -#undef V10725 -#define V10725 (V + 41636) - 0x1110, 0x1168, 0x11bc, 0, -#undef V10726 -#define V10726 (V + 41640) - 0x1110, 0x1168, 0x11bd, 0, -#undef V10727 -#define V10727 (V + 41644) - 0x1110, 0x1168, 0x11be, 0, -#undef V10728 -#define V10728 (V + 41648) - 0x1110, 0x1168, 0x11bf, 0, -#undef V10729 -#define V10729 (V + 41652) - 0x1110, 0x1168, 0x11c0, 0, -#undef V10730 -#define V10730 (V + 41656) - 0x1110, 0x1168, 0x11c1, 0, -#undef V10731 -#define V10731 (V + 41660) - 0x1110, 0x1168, 0x11c2, 0, -#undef V10732 -#define V10732 (V + 41664) - 0x1110, 0x1169, 0, -#undef V10733 -#define V10733 (V + 41667) - 0x1110, 0x1169, 0x11a8, 0, -#undef V10734 -#define V10734 (V + 41671) - 0x1110, 0x1169, 0x11a9, 0, -#undef V10735 -#define V10735 (V + 41675) - 0x1110, 0x1169, 0x11aa, 0, -#undef V10736 -#define V10736 (V + 41679) - 0x1110, 0x1169, 0x11ab, 0, -#undef V10737 -#define V10737 (V + 41683) - 0x1110, 0x1169, 0x11ac, 0, -#undef V10738 -#define V10738 (V + 41687) - 0x1110, 0x1169, 0x11ad, 0, -#undef V10739 -#define V10739 (V + 41691) - 0x1110, 0x1169, 0x11ae, 0, -#undef V10740 -#define V10740 (V + 41695) - 0x1110, 0x1169, 0x11af, 0, -#undef V10741 -#define V10741 (V + 41699) - 0x1110, 0x1169, 0x11b0, 0, -#undef V10742 -#define V10742 (V + 41703) - 0x1110, 0x1169, 0x11b1, 0, -#undef V10743 -#define V10743 (V + 41707) - 0x1110, 0x1169, 0x11b2, 0, -#undef V10744 -#define V10744 (V + 41711) - 0x1110, 0x1169, 0x11b3, 0, -#undef V10745 -#define V10745 (V + 41715) - 0x1110, 0x1169, 0x11b4, 0, -#undef V10746 -#define V10746 (V + 41719) - 0x1110, 0x1169, 0x11b5, 0, -#undef V10747 -#define V10747 (V + 41723) - 0x1110, 0x1169, 0x11b6, 0, -#undef V10748 -#define V10748 (V + 41727) - 0x1110, 0x1169, 0x11b7, 0, -#undef V10749 -#define V10749 (V + 41731) - 0x1110, 0x1169, 0x11b8, 0, -#undef V10750 -#define V10750 (V + 41735) - 0x1110, 0x1169, 0x11b9, 0, -#undef V10751 -#define V10751 (V + 41739) - 0x1110, 0x1169, 0x11ba, 0, -#undef V10752 -#define V10752 (V + 41743) - 0x1110, 0x1169, 0x11bb, 0, -#undef V10753 -#define V10753 (V + 41747) - 0x1110, 0x1169, 0x11bc, 0, -#undef V10754 -#define V10754 (V + 41751) - 0x1110, 0x1169, 0x11bd, 0, -#undef V10755 -#define V10755 (V + 41755) - 0x1110, 0x1169, 0x11be, 0, -#undef V10756 -#define V10756 (V + 41759) - 0x1110, 0x1169, 0x11bf, 0, -#undef V10757 -#define V10757 (V + 41763) - 0x1110, 0x1169, 0x11c0, 0, -#undef V10758 -#define V10758 (V + 41767) - 0x1110, 0x1169, 0x11c1, 0, -#undef V10759 -#define V10759 (V + 41771) - 0x1110, 0x1169, 0x11c2, 0, -#undef V10760 -#define V10760 (V + 41775) - 0x1110, 0x116a, 0, -#undef V10761 -#define V10761 (V + 41778) - 0x1110, 0x116a, 0x11a8, 0, -#undef V10762 -#define V10762 (V + 41782) - 0x1110, 0x116a, 0x11a9, 0, -#undef V10763 -#define V10763 (V + 41786) - 0x1110, 0x116a, 0x11aa, 0, -#undef V10764 -#define V10764 (V + 41790) - 0x1110, 0x116a, 0x11ab, 0, -#undef V10765 -#define V10765 (V + 41794) - 0x1110, 0x116a, 0x11ac, 0, -#undef V10766 -#define V10766 (V + 41798) - 0x1110, 0x116a, 0x11ad, 0, -#undef V10767 -#define V10767 (V + 41802) - 0x1110, 0x116a, 0x11ae, 0, -#undef V10768 -#define V10768 (V + 41806) - 0x1110, 0x116a, 0x11af, 0, -#undef V10769 -#define V10769 (V + 41810) - 0x1110, 0x116a, 0x11b0, 0, -#undef V10770 -#define V10770 (V + 41814) - 0x1110, 0x116a, 0x11b1, 0, -#undef V10771 -#define V10771 (V + 41818) - 0x1110, 0x116a, 0x11b2, 0, -#undef V10772 -#define V10772 (V + 41822) - 0x1110, 0x116a, 0x11b3, 0, -#undef V10773 -#define V10773 (V + 41826) - 0x1110, 0x116a, 0x11b4, 0, -#undef V10774 -#define V10774 (V + 41830) - 0x1110, 0x116a, 0x11b5, 0, -#undef V10775 -#define V10775 (V + 41834) - 0x1110, 0x116a, 0x11b6, 0, -#undef V10776 -#define V10776 (V + 41838) - 0x1110, 0x116a, 0x11b7, 0, -#undef V10777 -#define V10777 (V + 41842) - 0x1110, 0x116a, 0x11b8, 0, -#undef V10778 -#define V10778 (V + 41846) - 0x1110, 0x116a, 0x11b9, 0, -#undef V10779 -#define V10779 (V + 41850) - 0x1110, 0x116a, 0x11ba, 0, -#undef V10780 -#define V10780 (V + 41854) - 0x1110, 0x116a, 0x11bb, 0, -#undef V10781 -#define V10781 (V + 41858) - 0x1110, 0x116a, 0x11bc, 0, -#undef V10782 -#define V10782 (V + 41862) - 0x1110, 0x116a, 0x11bd, 0, -#undef V10783 -#define V10783 (V + 41866) - 0x1110, 0x116a, 0x11be, 0, -#undef V10784 -#define V10784 (V + 41870) - 0x1110, 0x116a, 0x11bf, 0, -#undef V10785 -#define V10785 (V + 41874) - 0x1110, 0x116a, 0x11c0, 0, -#undef V10786 -#define V10786 (V + 41878) - 0x1110, 0x116a, 0x11c1, 0, -#undef V10787 -#define V10787 (V + 41882) - 0x1110, 0x116a, 0x11c2, 0, -#undef V10788 -#define V10788 (V + 41886) - 0x1110, 0x116b, 0, -#undef V10789 -#define V10789 (V + 41889) - 0x1110, 0x116b, 0x11a8, 0, -#undef V10790 -#define V10790 (V + 41893) - 0x1110, 0x116b, 0x11a9, 0, -#undef V10791 -#define V10791 (V + 41897) - 0x1110, 0x116b, 0x11aa, 0, -#undef V10792 -#define V10792 (V + 41901) - 0x1110, 0x116b, 0x11ab, 0, -#undef V10793 -#define V10793 (V + 41905) - 0x1110, 0x116b, 0x11ac, 0, -#undef V10794 -#define V10794 (V + 41909) - 0x1110, 0x116b, 0x11ad, 0, -#undef V10795 -#define V10795 (V + 41913) - 0x1110, 0x116b, 0x11ae, 0, -#undef V10796 -#define V10796 (V + 41917) - 0x1110, 0x116b, 0x11af, 0, -#undef V10797 -#define V10797 (V + 41921) - 0x1110, 0x116b, 0x11b0, 0, -#undef V10798 -#define V10798 (V + 41925) - 0x1110, 0x116b, 0x11b1, 0, -#undef V10799 -#define V10799 (V + 41929) - 0x1110, 0x116b, 0x11b2, 0, -#undef V10800 -#define V10800 (V + 41933) - 0x1110, 0x116b, 0x11b3, 0, -#undef V10801 -#define V10801 (V + 41937) - 0x1110, 0x116b, 0x11b4, 0, -#undef V10802 -#define V10802 (V + 41941) - 0x1110, 0x116b, 0x11b5, 0, -#undef V10803 -#define V10803 (V + 41945) - 0x1110, 0x116b, 0x11b6, 0, -#undef V10804 -#define V10804 (V + 41949) - 0x1110, 0x116b, 0x11b7, 0, -#undef V10805 -#define V10805 (V + 41953) - 0x1110, 0x116b, 0x11b8, 0, -#undef V10806 -#define V10806 (V + 41957) - 0x1110, 0x116b, 0x11b9, 0, -#undef V10807 -#define V10807 (V + 41961) - 0x1110, 0x116b, 0x11ba, 0, -#undef V10808 -#define V10808 (V + 41965) - 0x1110, 0x116b, 0x11bb, 0, -#undef V10809 -#define V10809 (V + 41969) - 0x1110, 0x116b, 0x11bc, 0, -#undef V10810 -#define V10810 (V + 41973) - 0x1110, 0x116b, 0x11bd, 0, -#undef V10811 -#define V10811 (V + 41977) - 0x1110, 0x116b, 0x11be, 0, -#undef V10812 -#define V10812 (V + 41981) - 0x1110, 0x116b, 0x11bf, 0, -#undef V10813 -#define V10813 (V + 41985) - 0x1110, 0x116b, 0x11c0, 0, -#undef V10814 -#define V10814 (V + 41989) - 0x1110, 0x116b, 0x11c1, 0, -#undef V10815 -#define V10815 (V + 41993) - 0x1110, 0x116b, 0x11c2, 0, -#undef V10816 -#define V10816 (V + 41997) - 0x1110, 0x116c, 0, -#undef V10817 -#define V10817 (V + 42000) - 0x1110, 0x116c, 0x11a8, 0, -#undef V10818 -#define V10818 (V + 42004) - 0x1110, 0x116c, 0x11a9, 0, -#undef V10819 -#define V10819 (V + 42008) - 0x1110, 0x116c, 0x11aa, 0, -#undef V10820 -#define V10820 (V + 42012) - 0x1110, 0x116c, 0x11ab, 0, -#undef V10821 -#define V10821 (V + 42016) - 0x1110, 0x116c, 0x11ac, 0, -#undef V10822 -#define V10822 (V + 42020) - 0x1110, 0x116c, 0x11ad, 0, -#undef V10823 -#define V10823 (V + 42024) - 0x1110, 0x116c, 0x11ae, 0, -#undef V10824 -#define V10824 (V + 42028) - 0x1110, 0x116c, 0x11af, 0, -#undef V10825 -#define V10825 (V + 42032) - 0x1110, 0x116c, 0x11b0, 0, -#undef V10826 -#define V10826 (V + 42036) - 0x1110, 0x116c, 0x11b1, 0, -#undef V10827 -#define V10827 (V + 42040) - 0x1110, 0x116c, 0x11b2, 0, -#undef V10828 -#define V10828 (V + 42044) - 0x1110, 0x116c, 0x11b3, 0, -#undef V10829 -#define V10829 (V + 42048) - 0x1110, 0x116c, 0x11b4, 0, -#undef V10830 -#define V10830 (V + 42052) - 0x1110, 0x116c, 0x11b5, 0, -#undef V10831 -#define V10831 (V + 42056) - 0x1110, 0x116c, 0x11b6, 0, -#undef V10832 -#define V10832 (V + 42060) - 0x1110, 0x116c, 0x11b7, 0, -#undef V10833 -#define V10833 (V + 42064) - 0x1110, 0x116c, 0x11b8, 0, -#undef V10834 -#define V10834 (V + 42068) - 0x1110, 0x116c, 0x11b9, 0, -#undef V10835 -#define V10835 (V + 42072) - 0x1110, 0x116c, 0x11ba, 0, -#undef V10836 -#define V10836 (V + 42076) - 0x1110, 0x116c, 0x11bb, 0, -#undef V10837 -#define V10837 (V + 42080) - 0x1110, 0x116c, 0x11bc, 0, -#undef V10838 -#define V10838 (V + 42084) - 0x1110, 0x116c, 0x11bd, 0, -#undef V10839 -#define V10839 (V + 42088) - 0x1110, 0x116c, 0x11be, 0, -#undef V10840 -#define V10840 (V + 42092) - 0x1110, 0x116c, 0x11bf, 0, -#undef V10841 -#define V10841 (V + 42096) - 0x1110, 0x116c, 0x11c0, 0, -#undef V10842 -#define V10842 (V + 42100) - 0x1110, 0x116c, 0x11c1, 0, -#undef V10843 -#define V10843 (V + 42104) - 0x1110, 0x116c, 0x11c2, 0, -#undef V10844 -#define V10844 (V + 42108) - 0x1110, 0x116d, 0, -#undef V10845 -#define V10845 (V + 42111) - 0x1110, 0x116d, 0x11a8, 0, -#undef V10846 -#define V10846 (V + 42115) - 0x1110, 0x116d, 0x11a9, 0, -#undef V10847 -#define V10847 (V + 42119) - 0x1110, 0x116d, 0x11aa, 0, -#undef V10848 -#define V10848 (V + 42123) - 0x1110, 0x116d, 0x11ab, 0, -#undef V10849 -#define V10849 (V + 42127) - 0x1110, 0x116d, 0x11ac, 0, -#undef V10850 -#define V10850 (V + 42131) - 0x1110, 0x116d, 0x11ad, 0, -#undef V10851 -#define V10851 (V + 42135) - 0x1110, 0x116d, 0x11ae, 0, -#undef V10852 -#define V10852 (V + 42139) - 0x1110, 0x116d, 0x11af, 0, -#undef V10853 -#define V10853 (V + 42143) - 0x1110, 0x116d, 0x11b0, 0, -#undef V10854 -#define V10854 (V + 42147) - 0x1110, 0x116d, 0x11b1, 0, -#undef V10855 -#define V10855 (V + 42151) - 0x1110, 0x116d, 0x11b2, 0, -#undef V10856 -#define V10856 (V + 42155) - 0x1110, 0x116d, 0x11b3, 0, -#undef V10857 -#define V10857 (V + 42159) - 0x1110, 0x116d, 0x11b4, 0, -#undef V10858 -#define V10858 (V + 42163) - 0x1110, 0x116d, 0x11b5, 0, -#undef V10859 -#define V10859 (V + 42167) - 0x1110, 0x116d, 0x11b6, 0, -#undef V10860 -#define V10860 (V + 42171) - 0x1110, 0x116d, 0x11b7, 0, -#undef V10861 -#define V10861 (V + 42175) - 0x1110, 0x116d, 0x11b8, 0, -#undef V10862 -#define V10862 (V + 42179) - 0x1110, 0x116d, 0x11b9, 0, -#undef V10863 -#define V10863 (V + 42183) - 0x1110, 0x116d, 0x11ba, 0, -#undef V10864 -#define V10864 (V + 42187) - 0x1110, 0x116d, 0x11bb, 0, -#undef V10865 -#define V10865 (V + 42191) - 0x1110, 0x116d, 0x11bc, 0, -#undef V10866 -#define V10866 (V + 42195) - 0x1110, 0x116d, 0x11bd, 0, -#undef V10867 -#define V10867 (V + 42199) - 0x1110, 0x116d, 0x11be, 0, -#undef V10868 -#define V10868 (V + 42203) - 0x1110, 0x116d, 0x11bf, 0, -#undef V10869 -#define V10869 (V + 42207) - 0x1110, 0x116d, 0x11c0, 0, -#undef V10870 -#define V10870 (V + 42211) - 0x1110, 0x116d, 0x11c1, 0, -#undef V10871 -#define V10871 (V + 42215) - 0x1110, 0x116d, 0x11c2, 0, -#undef V10872 -#define V10872 (V + 42219) - 0x1110, 0x116e, 0, -#undef V10873 -#define V10873 (V + 42222) - 0x1110, 0x116e, 0x11a8, 0, -#undef V10874 -#define V10874 (V + 42226) - 0x1110, 0x116e, 0x11a9, 0, -#undef V10875 -#define V10875 (V + 42230) - 0x1110, 0x116e, 0x11aa, 0, -#undef V10876 -#define V10876 (V + 42234) - 0x1110, 0x116e, 0x11ab, 0, -#undef V10877 -#define V10877 (V + 42238) - 0x1110, 0x116e, 0x11ac, 0, -#undef V10878 -#define V10878 (V + 42242) - 0x1110, 0x116e, 0x11ad, 0, -#undef V10879 -#define V10879 (V + 42246) - 0x1110, 0x116e, 0x11ae, 0, -#undef V10880 -#define V10880 (V + 42250) - 0x1110, 0x116e, 0x11af, 0, -#undef V10881 -#define V10881 (V + 42254) - 0x1110, 0x116e, 0x11b0, 0, -#undef V10882 -#define V10882 (V + 42258) - 0x1110, 0x116e, 0x11b1, 0, -#undef V10883 -#define V10883 (V + 42262) - 0x1110, 0x116e, 0x11b2, 0, -#undef V10884 -#define V10884 (V + 42266) - 0x1110, 0x116e, 0x11b3, 0, -#undef V10885 -#define V10885 (V + 42270) - 0x1110, 0x116e, 0x11b4, 0, -#undef V10886 -#define V10886 (V + 42274) - 0x1110, 0x116e, 0x11b5, 0, -#undef V10887 -#define V10887 (V + 42278) - 0x1110, 0x116e, 0x11b6, 0, -#undef V10888 -#define V10888 (V + 42282) - 0x1110, 0x116e, 0x11b7, 0, -#undef V10889 -#define V10889 (V + 42286) - 0x1110, 0x116e, 0x11b8, 0, -#undef V10890 -#define V10890 (V + 42290) - 0x1110, 0x116e, 0x11b9, 0, -#undef V10891 -#define V10891 (V + 42294) - 0x1110, 0x116e, 0x11ba, 0, -#undef V10892 -#define V10892 (V + 42298) - 0x1110, 0x116e, 0x11bb, 0, -#undef V10893 -#define V10893 (V + 42302) - 0x1110, 0x116e, 0x11bc, 0, -#undef V10894 -#define V10894 (V + 42306) - 0x1110, 0x116e, 0x11bd, 0, -#undef V10895 -#define V10895 (V + 42310) - 0x1110, 0x116e, 0x11be, 0, -#undef V10896 -#define V10896 (V + 42314) - 0x1110, 0x116e, 0x11bf, 0, -#undef V10897 -#define V10897 (V + 42318) - 0x1110, 0x116e, 0x11c0, 0, -#undef V10898 -#define V10898 (V + 42322) - 0x1110, 0x116e, 0x11c1, 0, -#undef V10899 -#define V10899 (V + 42326) - 0x1110, 0x116e, 0x11c2, 0, -#undef V10900 -#define V10900 (V + 42330) - 0x1110, 0x116f, 0, -#undef V10901 -#define V10901 (V + 42333) - 0x1110, 0x116f, 0x11a8, 0, -#undef V10902 -#define V10902 (V + 42337) - 0x1110, 0x116f, 0x11a9, 0, -#undef V10903 -#define V10903 (V + 42341) - 0x1110, 0x116f, 0x11aa, 0, -#undef V10904 -#define V10904 (V + 42345) - 0x1110, 0x116f, 0x11ab, 0, -#undef V10905 -#define V10905 (V + 42349) - 0x1110, 0x116f, 0x11ac, 0, -#undef V10906 -#define V10906 (V + 42353) - 0x1110, 0x116f, 0x11ad, 0, -#undef V10907 -#define V10907 (V + 42357) - 0x1110, 0x116f, 0x11ae, 0, -#undef V10908 -#define V10908 (V + 42361) - 0x1110, 0x116f, 0x11af, 0, -#undef V10909 -#define V10909 (V + 42365) - 0x1110, 0x116f, 0x11b0, 0, -#undef V10910 -#define V10910 (V + 42369) - 0x1110, 0x116f, 0x11b1, 0, -#undef V10911 -#define V10911 (V + 42373) - 0x1110, 0x116f, 0x11b2, 0, -#undef V10912 -#define V10912 (V + 42377) - 0x1110, 0x116f, 0x11b3, 0, -#undef V10913 -#define V10913 (V + 42381) - 0x1110, 0x116f, 0x11b4, 0, -#undef V10914 -#define V10914 (V + 42385) - 0x1110, 0x116f, 0x11b5, 0, -#undef V10915 -#define V10915 (V + 42389) - 0x1110, 0x116f, 0x11b6, 0, -#undef V10916 -#define V10916 (V + 42393) - 0x1110, 0x116f, 0x11b7, 0, -#undef V10917 -#define V10917 (V + 42397) - 0x1110, 0x116f, 0x11b8, 0, -#undef V10918 -#define V10918 (V + 42401) - 0x1110, 0x116f, 0x11b9, 0, -#undef V10919 -#define V10919 (V + 42405) - 0x1110, 0x116f, 0x11ba, 0, -#undef V10920 -#define V10920 (V + 42409) - 0x1110, 0x116f, 0x11bb, 0, -#undef V10921 -#define V10921 (V + 42413) - 0x1110, 0x116f, 0x11bc, 0, -#undef V10922 -#define V10922 (V + 42417) - 0x1110, 0x116f, 0x11bd, 0, -#undef V10923 -#define V10923 (V + 42421) - 0x1110, 0x116f, 0x11be, 0, -#undef V10924 -#define V10924 (V + 42425) - 0x1110, 0x116f, 0x11bf, 0, -#undef V10925 -#define V10925 (V + 42429) - 0x1110, 0x116f, 0x11c0, 0, -#undef V10926 -#define V10926 (V + 42433) - 0x1110, 0x116f, 0x11c1, 0, -#undef V10927 -#define V10927 (V + 42437) - 0x1110, 0x116f, 0x11c2, 0, -#undef V10928 -#define V10928 (V + 42441) - 0x1110, 0x1170, 0, -#undef V10929 -#define V10929 (V + 42444) - 0x1110, 0x1170, 0x11a8, 0, -#undef V10930 -#define V10930 (V + 42448) - 0x1110, 0x1170, 0x11a9, 0, -#undef V10931 -#define V10931 (V + 42452) - 0x1110, 0x1170, 0x11aa, 0, -#undef V10932 -#define V10932 (V + 42456) - 0x1110, 0x1170, 0x11ab, 0, -#undef V10933 -#define V10933 (V + 42460) - 0x1110, 0x1170, 0x11ac, 0, -#undef V10934 -#define V10934 (V + 42464) - 0x1110, 0x1170, 0x11ad, 0, -#undef V10935 -#define V10935 (V + 42468) - 0x1110, 0x1170, 0x11ae, 0, -#undef V10936 -#define V10936 (V + 42472) - 0x1110, 0x1170, 0x11af, 0, -#undef V10937 -#define V10937 (V + 42476) - 0x1110, 0x1170, 0x11b0, 0, -#undef V10938 -#define V10938 (V + 42480) - 0x1110, 0x1170, 0x11b1, 0, -#undef V10939 -#define V10939 (V + 42484) - 0x1110, 0x1170, 0x11b2, 0, -#undef V10940 -#define V10940 (V + 42488) - 0x1110, 0x1170, 0x11b3, 0, -#undef V10941 -#define V10941 (V + 42492) - 0x1110, 0x1170, 0x11b4, 0, -#undef V10942 -#define V10942 (V + 42496) - 0x1110, 0x1170, 0x11b5, 0, -#undef V10943 -#define V10943 (V + 42500) - 0x1110, 0x1170, 0x11b6, 0, -#undef V10944 -#define V10944 (V + 42504) - 0x1110, 0x1170, 0x11b7, 0, -#undef V10945 -#define V10945 (V + 42508) - 0x1110, 0x1170, 0x11b8, 0, -#undef V10946 -#define V10946 (V + 42512) - 0x1110, 0x1170, 0x11b9, 0, -#undef V10947 -#define V10947 (V + 42516) - 0x1110, 0x1170, 0x11ba, 0, -#undef V10948 -#define V10948 (V + 42520) - 0x1110, 0x1170, 0x11bb, 0, -#undef V10949 -#define V10949 (V + 42524) - 0x1110, 0x1170, 0x11bc, 0, -#undef V10950 -#define V10950 (V + 42528) - 0x1110, 0x1170, 0x11bd, 0, -#undef V10951 -#define V10951 (V + 42532) - 0x1110, 0x1170, 0x11be, 0, -#undef V10952 -#define V10952 (V + 42536) - 0x1110, 0x1170, 0x11bf, 0, -#undef V10953 -#define V10953 (V + 42540) - 0x1110, 0x1170, 0x11c0, 0, -#undef V10954 -#define V10954 (V + 42544) - 0x1110, 0x1170, 0x11c1, 0, -#undef V10955 -#define V10955 (V + 42548) - 0x1110, 0x1170, 0x11c2, 0, -#undef V10956 -#define V10956 (V + 42552) - 0x1110, 0x1171, 0, -#undef V10957 -#define V10957 (V + 42555) - 0x1110, 0x1171, 0x11a8, 0, -#undef V10958 -#define V10958 (V + 42559) - 0x1110, 0x1171, 0x11a9, 0, -#undef V10959 -#define V10959 (V + 42563) - 0x1110, 0x1171, 0x11aa, 0, -#undef V10960 -#define V10960 (V + 42567) - 0x1110, 0x1171, 0x11ab, 0, -#undef V10961 -#define V10961 (V + 42571) - 0x1110, 0x1171, 0x11ac, 0, -#undef V10962 -#define V10962 (V + 42575) - 0x1110, 0x1171, 0x11ad, 0, -#undef V10963 -#define V10963 (V + 42579) - 0x1110, 0x1171, 0x11ae, 0, -#undef V10964 -#define V10964 (V + 42583) - 0x1110, 0x1171, 0x11af, 0, -#undef V10965 -#define V10965 (V + 42587) - 0x1110, 0x1171, 0x11b0, 0, -#undef V10966 -#define V10966 (V + 42591) - 0x1110, 0x1171, 0x11b1, 0, -#undef V10967 -#define V10967 (V + 42595) - 0x1110, 0x1171, 0x11b2, 0, -#undef V10968 -#define V10968 (V + 42599) - 0x1110, 0x1171, 0x11b3, 0, -#undef V10969 -#define V10969 (V + 42603) - 0x1110, 0x1171, 0x11b4, 0, -#undef V10970 -#define V10970 (V + 42607) - 0x1110, 0x1171, 0x11b5, 0, -#undef V10971 -#define V10971 (V + 42611) - 0x1110, 0x1171, 0x11b6, 0, -#undef V10972 -#define V10972 (V + 42615) - 0x1110, 0x1171, 0x11b7, 0, -#undef V10973 -#define V10973 (V + 42619) - 0x1110, 0x1171, 0x11b8, 0, -#undef V10974 -#define V10974 (V + 42623) - 0x1110, 0x1171, 0x11b9, 0, -#undef V10975 -#define V10975 (V + 42627) - 0x1110, 0x1171, 0x11ba, 0, -#undef V10976 -#define V10976 (V + 42631) - 0x1110, 0x1171, 0x11bb, 0, -#undef V10977 -#define V10977 (V + 42635) - 0x1110, 0x1171, 0x11bc, 0, -#undef V10978 -#define V10978 (V + 42639) - 0x1110, 0x1171, 0x11bd, 0, -#undef V10979 -#define V10979 (V + 42643) - 0x1110, 0x1171, 0x11be, 0, -#undef V10980 -#define V10980 (V + 42647) - 0x1110, 0x1171, 0x11bf, 0, -#undef V10981 -#define V10981 (V + 42651) - 0x1110, 0x1171, 0x11c0, 0, -#undef V10982 -#define V10982 (V + 42655) - 0x1110, 0x1171, 0x11c1, 0, -#undef V10983 -#define V10983 (V + 42659) - 0x1110, 0x1171, 0x11c2, 0, -#undef V10984 -#define V10984 (V + 42663) - 0x1110, 0x1172, 0, -#undef V10985 -#define V10985 (V + 42666) - 0x1110, 0x1172, 0x11a8, 0, -#undef V10986 -#define V10986 (V + 42670) - 0x1110, 0x1172, 0x11a9, 0, -#undef V10987 -#define V10987 (V + 42674) - 0x1110, 0x1172, 0x11aa, 0, -#undef V10988 -#define V10988 (V + 42678) - 0x1110, 0x1172, 0x11ab, 0, -#undef V10989 -#define V10989 (V + 42682) - 0x1110, 0x1172, 0x11ac, 0, -#undef V10990 -#define V10990 (V + 42686) - 0x1110, 0x1172, 0x11ad, 0, -#undef V10991 -#define V10991 (V + 42690) - 0x1110, 0x1172, 0x11ae, 0, -#undef V10992 -#define V10992 (V + 42694) - 0x1110, 0x1172, 0x11af, 0, -#undef V10993 -#define V10993 (V + 42698) - 0x1110, 0x1172, 0x11b0, 0, -#undef V10994 -#define V10994 (V + 42702) - 0x1110, 0x1172, 0x11b1, 0, -#undef V10995 -#define V10995 (V + 42706) - 0x1110, 0x1172, 0x11b2, 0, -#undef V10996 -#define V10996 (V + 42710) - 0x1110, 0x1172, 0x11b3, 0, -#undef V10997 -#define V10997 (V + 42714) - 0x1110, 0x1172, 0x11b4, 0, -#undef V10998 -#define V10998 (V + 42718) - 0x1110, 0x1172, 0x11b5, 0, -#undef V10999 -#define V10999 (V + 42722) - 0x1110, 0x1172, 0x11b6, 0, -#undef V11000 -#define V11000 (V + 42726) - 0x1110, 0x1172, 0x11b7, 0, -#undef V11001 -#define V11001 (V + 42730) - 0x1110, 0x1172, 0x11b8, 0, -#undef V11002 -#define V11002 (V + 42734) - 0x1110, 0x1172, 0x11b9, 0, -#undef V11003 -#define V11003 (V + 42738) - 0x1110, 0x1172, 0x11ba, 0, -#undef V11004 -#define V11004 (V + 42742) - 0x1110, 0x1172, 0x11bb, 0, -#undef V11005 -#define V11005 (V + 42746) - 0x1110, 0x1172, 0x11bc, 0, -#undef V11006 -#define V11006 (V + 42750) - 0x1110, 0x1172, 0x11bd, 0, -#undef V11007 -#define V11007 (V + 42754) - 0x1110, 0x1172, 0x11be, 0, -#undef V11008 -#define V11008 (V + 42758) - 0x1110, 0x1172, 0x11bf, 0, -#undef V11009 -#define V11009 (V + 42762) - 0x1110, 0x1172, 0x11c0, 0, -#undef V11010 -#define V11010 (V + 42766) - 0x1110, 0x1172, 0x11c1, 0, -#undef V11011 -#define V11011 (V + 42770) - 0x1110, 0x1172, 0x11c2, 0, -#undef V11012 -#define V11012 (V + 42774) - 0x1110, 0x1173, 0, -#undef V11013 -#define V11013 (V + 42777) - 0x1110, 0x1173, 0x11a8, 0, -#undef V11014 -#define V11014 (V + 42781) - 0x1110, 0x1173, 0x11a9, 0, -#undef V11015 -#define V11015 (V + 42785) - 0x1110, 0x1173, 0x11aa, 0, -#undef V11016 -#define V11016 (V + 42789) - 0x1110, 0x1173, 0x11ab, 0, -#undef V11017 -#define V11017 (V + 42793) - 0x1110, 0x1173, 0x11ac, 0, -#undef V11018 -#define V11018 (V + 42797) - 0x1110, 0x1173, 0x11ad, 0, -#undef V11019 -#define V11019 (V + 42801) - 0x1110, 0x1173, 0x11ae, 0, -#undef V11020 -#define V11020 (V + 42805) - 0x1110, 0x1173, 0x11af, 0, -#undef V11021 -#define V11021 (V + 42809) - 0x1110, 0x1173, 0x11b0, 0, -#undef V11022 -#define V11022 (V + 42813) - 0x1110, 0x1173, 0x11b1, 0, -#undef V11023 -#define V11023 (V + 42817) - 0x1110, 0x1173, 0x11b2, 0, -#undef V11024 -#define V11024 (V + 42821) - 0x1110, 0x1173, 0x11b3, 0, -#undef V11025 -#define V11025 (V + 42825) - 0x1110, 0x1173, 0x11b4, 0, -#undef V11026 -#define V11026 (V + 42829) - 0x1110, 0x1173, 0x11b5, 0, -#undef V11027 -#define V11027 (V + 42833) - 0x1110, 0x1173, 0x11b6, 0, -#undef V11028 -#define V11028 (V + 42837) - 0x1110, 0x1173, 0x11b7, 0, -#undef V11029 -#define V11029 (V + 42841) - 0x1110, 0x1173, 0x11b8, 0, -#undef V11030 -#define V11030 (V + 42845) - 0x1110, 0x1173, 0x11b9, 0, -#undef V11031 -#define V11031 (V + 42849) - 0x1110, 0x1173, 0x11ba, 0, -#undef V11032 -#define V11032 (V + 42853) - 0x1110, 0x1173, 0x11bb, 0, -#undef V11033 -#define V11033 (V + 42857) - 0x1110, 0x1173, 0x11bc, 0, -#undef V11034 -#define V11034 (V + 42861) - 0x1110, 0x1173, 0x11bd, 0, -#undef V11035 -#define V11035 (V + 42865) - 0x1110, 0x1173, 0x11be, 0, -#undef V11036 -#define V11036 (V + 42869) - 0x1110, 0x1173, 0x11bf, 0, -#undef V11037 -#define V11037 (V + 42873) - 0x1110, 0x1173, 0x11c0, 0, -#undef V11038 -#define V11038 (V + 42877) - 0x1110, 0x1173, 0x11c1, 0, -#undef V11039 -#define V11039 (V + 42881) - 0x1110, 0x1173, 0x11c2, 0, -#undef V11040 -#define V11040 (V + 42885) - 0x1110, 0x1174, 0, -#undef V11041 -#define V11041 (V + 42888) - 0x1110, 0x1174, 0x11a8, 0, -#undef V11042 -#define V11042 (V + 42892) - 0x1110, 0x1174, 0x11a9, 0, -#undef V11043 -#define V11043 (V + 42896) - 0x1110, 0x1174, 0x11aa, 0, -#undef V11044 -#define V11044 (V + 42900) - 0x1110, 0x1174, 0x11ab, 0, -#undef V11045 -#define V11045 (V + 42904) - 0x1110, 0x1174, 0x11ac, 0, -#undef V11046 -#define V11046 (V + 42908) - 0x1110, 0x1174, 0x11ad, 0, -#undef V11047 -#define V11047 (V + 42912) - 0x1110, 0x1174, 0x11ae, 0, -#undef V11048 -#define V11048 (V + 42916) - 0x1110, 0x1174, 0x11af, 0, -#undef V11049 -#define V11049 (V + 42920) - 0x1110, 0x1174, 0x11b0, 0, -#undef V11050 -#define V11050 (V + 42924) - 0x1110, 0x1174, 0x11b1, 0, -#undef V11051 -#define V11051 (V + 42928) - 0x1110, 0x1174, 0x11b2, 0, -#undef V11052 -#define V11052 (V + 42932) - 0x1110, 0x1174, 0x11b3, 0, -#undef V11053 -#define V11053 (V + 42936) - 0x1110, 0x1174, 0x11b4, 0, -#undef V11054 -#define V11054 (V + 42940) - 0x1110, 0x1174, 0x11b5, 0, -#undef V11055 -#define V11055 (V + 42944) - 0x1110, 0x1174, 0x11b6, 0, -#undef V11056 -#define V11056 (V + 42948) - 0x1110, 0x1174, 0x11b7, 0, -#undef V11057 -#define V11057 (V + 42952) - 0x1110, 0x1174, 0x11b8, 0, -#undef V11058 -#define V11058 (V + 42956) - 0x1110, 0x1174, 0x11b9, 0, -#undef V11059 -#define V11059 (V + 42960) - 0x1110, 0x1174, 0x11ba, 0, -#undef V11060 -#define V11060 (V + 42964) - 0x1110, 0x1174, 0x11bb, 0, -#undef V11061 -#define V11061 (V + 42968) - 0x1110, 0x1174, 0x11bc, 0, -#undef V11062 -#define V11062 (V + 42972) - 0x1110, 0x1174, 0x11bd, 0, -#undef V11063 -#define V11063 (V + 42976) - 0x1110, 0x1174, 0x11be, 0, -#undef V11064 -#define V11064 (V + 42980) - 0x1110, 0x1174, 0x11bf, 0, -#undef V11065 -#define V11065 (V + 42984) - 0x1110, 0x1174, 0x11c0, 0, -#undef V11066 -#define V11066 (V + 42988) - 0x1110, 0x1174, 0x11c1, 0, -#undef V11067 -#define V11067 (V + 42992) - 0x1110, 0x1174, 0x11c2, 0, -#undef V11068 -#define V11068 (V + 42996) - 0x1110, 0x1175, 0, -#undef V11069 -#define V11069 (V + 42999) - 0x1110, 0x1175, 0x11a8, 0, -#undef V11070 -#define V11070 (V + 43003) - 0x1110, 0x1175, 0x11a9, 0, -#undef V11071 -#define V11071 (V + 43007) - 0x1110, 0x1175, 0x11aa, 0, -#undef V11072 -#define V11072 (V + 43011) - 0x1110, 0x1175, 0x11ab, 0, -#undef V11073 -#define V11073 (V + 43015) - 0x1110, 0x1175, 0x11ac, 0, -#undef V11074 -#define V11074 (V + 43019) - 0x1110, 0x1175, 0x11ad, 0, -#undef V11075 -#define V11075 (V + 43023) - 0x1110, 0x1175, 0x11ae, 0, -#undef V11076 -#define V11076 (V + 43027) - 0x1110, 0x1175, 0x11af, 0, -#undef V11077 -#define V11077 (V + 43031) - 0x1110, 0x1175, 0x11b0, 0, -#undef V11078 -#define V11078 (V + 43035) - 0x1110, 0x1175, 0x11b1, 0, -#undef V11079 -#define V11079 (V + 43039) - 0x1110, 0x1175, 0x11b2, 0, -#undef V11080 -#define V11080 (V + 43043) - 0x1110, 0x1175, 0x11b3, 0, -#undef V11081 -#define V11081 (V + 43047) - 0x1110, 0x1175, 0x11b4, 0, -#undef V11082 -#define V11082 (V + 43051) - 0x1110, 0x1175, 0x11b5, 0, -#undef V11083 -#define V11083 (V + 43055) - 0x1110, 0x1175, 0x11b6, 0, -#undef V11084 -#define V11084 (V + 43059) - 0x1110, 0x1175, 0x11b7, 0, -#undef V11085 -#define V11085 (V + 43063) - 0x1110, 0x1175, 0x11b8, 0, -#undef V11086 -#define V11086 (V + 43067) - 0x1110, 0x1175, 0x11b9, 0, -#undef V11087 -#define V11087 (V + 43071) - 0x1110, 0x1175, 0x11ba, 0, -#undef V11088 -#define V11088 (V + 43075) - 0x1110, 0x1175, 0x11bb, 0, -#undef V11089 -#define V11089 (V + 43079) - 0x1110, 0x1175, 0x11bc, 0, -#undef V11090 -#define V11090 (V + 43083) - 0x1110, 0x1175, 0x11bd, 0, -#undef V11091 -#define V11091 (V + 43087) - 0x1110, 0x1175, 0x11be, 0, -#undef V11092 -#define V11092 (V + 43091) - 0x1110, 0x1175, 0x11bf, 0, -#undef V11093 -#define V11093 (V + 43095) - 0x1110, 0x1175, 0x11c0, 0, -#undef V11094 -#define V11094 (V + 43099) - 0x1110, 0x1175, 0x11c1, 0, -#undef V11095 -#define V11095 (V + 43103) - 0x1110, 0x1175, 0x11c2, 0, -#undef V11096 -#define V11096 (V + 43107) - 0x1111, 0x1161, 0, -#undef V11097 -#define V11097 (V + 43110) - 0x1111, 0x1161, 0x11a8, 0, -#undef V11098 -#define V11098 (V + 43114) - 0x1111, 0x1161, 0x11a9, 0, -#undef V11099 -#define V11099 (V + 43118) - 0x1111, 0x1161, 0x11aa, 0, -#undef V11100 -#define V11100 (V + 43122) - 0x1111, 0x1161, 0x11ab, 0, -#undef V11101 -#define V11101 (V + 43126) - 0x1111, 0x1161, 0x11ac, 0, -#undef V11102 -#define V11102 (V + 43130) - 0x1111, 0x1161, 0x11ad, 0, -#undef V11103 -#define V11103 (V + 43134) - 0x1111, 0x1161, 0x11ae, 0, -#undef V11104 -#define V11104 (V + 43138) - 0x1111, 0x1161, 0x11af, 0, -#undef V11105 -#define V11105 (V + 43142) - 0x1111, 0x1161, 0x11b0, 0, -#undef V11106 -#define V11106 (V + 43146) - 0x1111, 0x1161, 0x11b1, 0, -#undef V11107 -#define V11107 (V + 43150) - 0x1111, 0x1161, 0x11b2, 0, -#undef V11108 -#define V11108 (V + 43154) - 0x1111, 0x1161, 0x11b3, 0, -#undef V11109 -#define V11109 (V + 43158) - 0x1111, 0x1161, 0x11b4, 0, -#undef V11110 -#define V11110 (V + 43162) - 0x1111, 0x1161, 0x11b5, 0, -#undef V11111 -#define V11111 (V + 43166) - 0x1111, 0x1161, 0x11b6, 0, -#undef V11112 -#define V11112 (V + 43170) - 0x1111, 0x1161, 0x11b7, 0, -#undef V11113 -#define V11113 (V + 43174) - 0x1111, 0x1161, 0x11b8, 0, -#undef V11114 -#define V11114 (V + 43178) - 0x1111, 0x1161, 0x11b9, 0, -#undef V11115 -#define V11115 (V + 43182) - 0x1111, 0x1161, 0x11ba, 0, -#undef V11116 -#define V11116 (V + 43186) - 0x1111, 0x1161, 0x11bb, 0, -#undef V11117 -#define V11117 (V + 43190) - 0x1111, 0x1161, 0x11bc, 0, -#undef V11118 -#define V11118 (V + 43194) - 0x1111, 0x1161, 0x11bd, 0, -#undef V11119 -#define V11119 (V + 43198) - 0x1111, 0x1161, 0x11be, 0, -#undef V11120 -#define V11120 (V + 43202) - 0x1111, 0x1161, 0x11bf, 0, -#undef V11121 -#define V11121 (V + 43206) - 0x1111, 0x1161, 0x11c0, 0, -#undef V11122 -#define V11122 (V + 43210) - 0x1111, 0x1161, 0x11c1, 0, -#undef V11123 -#define V11123 (V + 43214) - 0x1111, 0x1161, 0x11c2, 0, -#undef V11124 -#define V11124 (V + 43218) - 0x1111, 0x1162, 0, -#undef V11125 -#define V11125 (V + 43221) - 0x1111, 0x1162, 0x11a8, 0, -#undef V11126 -#define V11126 (V + 43225) - 0x1111, 0x1162, 0x11a9, 0, -#undef V11127 -#define V11127 (V + 43229) - 0x1111, 0x1162, 0x11aa, 0, -#undef V11128 -#define V11128 (V + 43233) - 0x1111, 0x1162, 0x11ab, 0, -#undef V11129 -#define V11129 (V + 43237) - 0x1111, 0x1162, 0x11ac, 0, -#undef V11130 -#define V11130 (V + 43241) - 0x1111, 0x1162, 0x11ad, 0, -#undef V11131 -#define V11131 (V + 43245) - 0x1111, 0x1162, 0x11ae, 0, -#undef V11132 -#define V11132 (V + 43249) - 0x1111, 0x1162, 0x11af, 0, -#undef V11133 -#define V11133 (V + 43253) - 0x1111, 0x1162, 0x11b0, 0, -#undef V11134 -#define V11134 (V + 43257) - 0x1111, 0x1162, 0x11b1, 0, -#undef V11135 -#define V11135 (V + 43261) - 0x1111, 0x1162, 0x11b2, 0, -#undef V11136 -#define V11136 (V + 43265) - 0x1111, 0x1162, 0x11b3, 0, -#undef V11137 -#define V11137 (V + 43269) - 0x1111, 0x1162, 0x11b4, 0, -#undef V11138 -#define V11138 (V + 43273) - 0x1111, 0x1162, 0x11b5, 0, -#undef V11139 -#define V11139 (V + 43277) - 0x1111, 0x1162, 0x11b6, 0, -#undef V11140 -#define V11140 (V + 43281) - 0x1111, 0x1162, 0x11b7, 0, -#undef V11141 -#define V11141 (V + 43285) - 0x1111, 0x1162, 0x11b8, 0, -#undef V11142 -#define V11142 (V + 43289) - 0x1111, 0x1162, 0x11b9, 0, -#undef V11143 -#define V11143 (V + 43293) - 0x1111, 0x1162, 0x11ba, 0, -#undef V11144 -#define V11144 (V + 43297) - 0x1111, 0x1162, 0x11bb, 0, -#undef V11145 -#define V11145 (V + 43301) - 0x1111, 0x1162, 0x11bc, 0, -#undef V11146 -#define V11146 (V + 43305) - 0x1111, 0x1162, 0x11bd, 0, -#undef V11147 -#define V11147 (V + 43309) - 0x1111, 0x1162, 0x11be, 0, -#undef V11148 -#define V11148 (V + 43313) - 0x1111, 0x1162, 0x11bf, 0, -#undef V11149 -#define V11149 (V + 43317) - 0x1111, 0x1162, 0x11c0, 0, -#undef V11150 -#define V11150 (V + 43321) - 0x1111, 0x1162, 0x11c1, 0, -#undef V11151 -#define V11151 (V + 43325) - 0x1111, 0x1162, 0x11c2, 0, -#undef V11152 -#define V11152 (V + 43329) - 0x1111, 0x1163, 0, -#undef V11153 -#define V11153 (V + 43332) - 0x1111, 0x1163, 0x11a8, 0, -#undef V11154 -#define V11154 (V + 43336) - 0x1111, 0x1163, 0x11a9, 0, -#undef V11155 -#define V11155 (V + 43340) - 0x1111, 0x1163, 0x11aa, 0, -#undef V11156 -#define V11156 (V + 43344) - 0x1111, 0x1163, 0x11ab, 0, -#undef V11157 -#define V11157 (V + 43348) - 0x1111, 0x1163, 0x11ac, 0, -#undef V11158 -#define V11158 (V + 43352) - 0x1111, 0x1163, 0x11ad, 0, -#undef V11159 -#define V11159 (V + 43356) - 0x1111, 0x1163, 0x11ae, 0, -#undef V11160 -#define V11160 (V + 43360) - 0x1111, 0x1163, 0x11af, 0, -#undef V11161 -#define V11161 (V + 43364) - 0x1111, 0x1163, 0x11b0, 0, -#undef V11162 -#define V11162 (V + 43368) - 0x1111, 0x1163, 0x11b1, 0, -#undef V11163 -#define V11163 (V + 43372) - 0x1111, 0x1163, 0x11b2, 0, -#undef V11164 -#define V11164 (V + 43376) - 0x1111, 0x1163, 0x11b3, 0, -#undef V11165 -#define V11165 (V + 43380) - 0x1111, 0x1163, 0x11b4, 0, -#undef V11166 -#define V11166 (V + 43384) - 0x1111, 0x1163, 0x11b5, 0, -#undef V11167 -#define V11167 (V + 43388) - 0x1111, 0x1163, 0x11b6, 0, -#undef V11168 -#define V11168 (V + 43392) - 0x1111, 0x1163, 0x11b7, 0, -#undef V11169 -#define V11169 (V + 43396) - 0x1111, 0x1163, 0x11b8, 0, -#undef V11170 -#define V11170 (V + 43400) - 0x1111, 0x1163, 0x11b9, 0, -#undef V11171 -#define V11171 (V + 43404) - 0x1111, 0x1163, 0x11ba, 0, -#undef V11172 -#define V11172 (V + 43408) - 0x1111, 0x1163, 0x11bb, 0, -#undef V11173 -#define V11173 (V + 43412) - 0x1111, 0x1163, 0x11bc, 0, -#undef V11174 -#define V11174 (V + 43416) - 0x1111, 0x1163, 0x11bd, 0, -#undef V11175 -#define V11175 (V + 43420) - 0x1111, 0x1163, 0x11be, 0, -#undef V11176 -#define V11176 (V + 43424) - 0x1111, 0x1163, 0x11bf, 0, -#undef V11177 -#define V11177 (V + 43428) - 0x1111, 0x1163, 0x11c0, 0, -#undef V11178 -#define V11178 (V + 43432) - 0x1111, 0x1163, 0x11c1, 0, -#undef V11179 -#define V11179 (V + 43436) - 0x1111, 0x1163, 0x11c2, 0, -#undef V11180 -#define V11180 (V + 43440) - 0x1111, 0x1164, 0, -#undef V11181 -#define V11181 (V + 43443) - 0x1111, 0x1164, 0x11a8, 0, -#undef V11182 -#define V11182 (V + 43447) - 0x1111, 0x1164, 0x11a9, 0, -#undef V11183 -#define V11183 (V + 43451) - 0x1111, 0x1164, 0x11aa, 0, -#undef V11184 -#define V11184 (V + 43455) - 0x1111, 0x1164, 0x11ab, 0, -#undef V11185 -#define V11185 (V + 43459) - 0x1111, 0x1164, 0x11ac, 0, -#undef V11186 -#define V11186 (V + 43463) - 0x1111, 0x1164, 0x11ad, 0, -#undef V11187 -#define V11187 (V + 43467) - 0x1111, 0x1164, 0x11ae, 0, -#undef V11188 -#define V11188 (V + 43471) - 0x1111, 0x1164, 0x11af, 0, -#undef V11189 -#define V11189 (V + 43475) - 0x1111, 0x1164, 0x11b0, 0, -#undef V11190 -#define V11190 (V + 43479) - 0x1111, 0x1164, 0x11b1, 0, -#undef V11191 -#define V11191 (V + 43483) - 0x1111, 0x1164, 0x11b2, 0, -#undef V11192 -#define V11192 (V + 43487) - 0x1111, 0x1164, 0x11b3, 0, -#undef V11193 -#define V11193 (V + 43491) - 0x1111, 0x1164, 0x11b4, 0, -#undef V11194 -#define V11194 (V + 43495) - 0x1111, 0x1164, 0x11b5, 0, -#undef V11195 -#define V11195 (V + 43499) - 0x1111, 0x1164, 0x11b6, 0, -#undef V11196 -#define V11196 (V + 43503) - 0x1111, 0x1164, 0x11b7, 0, -#undef V11197 -#define V11197 (V + 43507) - 0x1111, 0x1164, 0x11b8, 0, -#undef V11198 -#define V11198 (V + 43511) - 0x1111, 0x1164, 0x11b9, 0, -#undef V11199 -#define V11199 (V + 43515) - 0x1111, 0x1164, 0x11ba, 0, -#undef V11200 -#define V11200 (V + 43519) - 0x1111, 0x1164, 0x11bb, 0, -#undef V11201 -#define V11201 (V + 43523) - 0x1111, 0x1164, 0x11bc, 0, -#undef V11202 -#define V11202 (V + 43527) - 0x1111, 0x1164, 0x11bd, 0, -#undef V11203 -#define V11203 (V + 43531) - 0x1111, 0x1164, 0x11be, 0, -#undef V11204 -#define V11204 (V + 43535) - 0x1111, 0x1164, 0x11bf, 0, -#undef V11205 -#define V11205 (V + 43539) - 0x1111, 0x1164, 0x11c0, 0, -#undef V11206 -#define V11206 (V + 43543) - 0x1111, 0x1164, 0x11c1, 0, -#undef V11207 -#define V11207 (V + 43547) - 0x1111, 0x1164, 0x11c2, 0, -#undef V11208 -#define V11208 (V + 43551) - 0x1111, 0x1165, 0, -#undef V11209 -#define V11209 (V + 43554) - 0x1111, 0x1165, 0x11a8, 0, -#undef V11210 -#define V11210 (V + 43558) - 0x1111, 0x1165, 0x11a9, 0, -#undef V11211 -#define V11211 (V + 43562) - 0x1111, 0x1165, 0x11aa, 0, -#undef V11212 -#define V11212 (V + 43566) - 0x1111, 0x1165, 0x11ab, 0, -#undef V11213 -#define V11213 (V + 43570) - 0x1111, 0x1165, 0x11ac, 0, -#undef V11214 -#define V11214 (V + 43574) - 0x1111, 0x1165, 0x11ad, 0, -#undef V11215 -#define V11215 (V + 43578) - 0x1111, 0x1165, 0x11ae, 0, -#undef V11216 -#define V11216 (V + 43582) - 0x1111, 0x1165, 0x11af, 0, -#undef V11217 -#define V11217 (V + 43586) - 0x1111, 0x1165, 0x11b0, 0, -#undef V11218 -#define V11218 (V + 43590) - 0x1111, 0x1165, 0x11b1, 0, -#undef V11219 -#define V11219 (V + 43594) - 0x1111, 0x1165, 0x11b2, 0, -#undef V11220 -#define V11220 (V + 43598) - 0x1111, 0x1165, 0x11b3, 0, -#undef V11221 -#define V11221 (V + 43602) - 0x1111, 0x1165, 0x11b4, 0, -#undef V11222 -#define V11222 (V + 43606) - 0x1111, 0x1165, 0x11b5, 0, -#undef V11223 -#define V11223 (V + 43610) - 0x1111, 0x1165, 0x11b6, 0, -#undef V11224 -#define V11224 (V + 43614) - 0x1111, 0x1165, 0x11b7, 0, -#undef V11225 -#define V11225 (V + 43618) - 0x1111, 0x1165, 0x11b8, 0, -#undef V11226 -#define V11226 (V + 43622) - 0x1111, 0x1165, 0x11b9, 0, -#undef V11227 -#define V11227 (V + 43626) - 0x1111, 0x1165, 0x11ba, 0, -#undef V11228 -#define V11228 (V + 43630) - 0x1111, 0x1165, 0x11bb, 0, -#undef V11229 -#define V11229 (V + 43634) - 0x1111, 0x1165, 0x11bc, 0, -#undef V11230 -#define V11230 (V + 43638) - 0x1111, 0x1165, 0x11bd, 0, -#undef V11231 -#define V11231 (V + 43642) - 0x1111, 0x1165, 0x11be, 0, -#undef V11232 -#define V11232 (V + 43646) - 0x1111, 0x1165, 0x11bf, 0, -#undef V11233 -#define V11233 (V + 43650) - 0x1111, 0x1165, 0x11c0, 0, -#undef V11234 -#define V11234 (V + 43654) - 0x1111, 0x1165, 0x11c1, 0, -#undef V11235 -#define V11235 (V + 43658) - 0x1111, 0x1165, 0x11c2, 0, -#undef V11236 -#define V11236 (V + 43662) - 0x1111, 0x1166, 0, -#undef V11237 -#define V11237 (V + 43665) - 0x1111, 0x1166, 0x11a8, 0, -#undef V11238 -#define V11238 (V + 43669) - 0x1111, 0x1166, 0x11a9, 0, -#undef V11239 -#define V11239 (V + 43673) - 0x1111, 0x1166, 0x11aa, 0, -#undef V11240 -#define V11240 (V + 43677) - 0x1111, 0x1166, 0x11ab, 0, -#undef V11241 -#define V11241 (V + 43681) - 0x1111, 0x1166, 0x11ac, 0, -#undef V11242 -#define V11242 (V + 43685) - 0x1111, 0x1166, 0x11ad, 0, -#undef V11243 -#define V11243 (V + 43689) - 0x1111, 0x1166, 0x11ae, 0, -#undef V11244 -#define V11244 (V + 43693) - 0x1111, 0x1166, 0x11af, 0, -#undef V11245 -#define V11245 (V + 43697) - 0x1111, 0x1166, 0x11b0, 0, -#undef V11246 -#define V11246 (V + 43701) - 0x1111, 0x1166, 0x11b1, 0, -#undef V11247 -#define V11247 (V + 43705) - 0x1111, 0x1166, 0x11b2, 0, -#undef V11248 -#define V11248 (V + 43709) - 0x1111, 0x1166, 0x11b3, 0, -#undef V11249 -#define V11249 (V + 43713) - 0x1111, 0x1166, 0x11b4, 0, -#undef V11250 -#define V11250 (V + 43717) - 0x1111, 0x1166, 0x11b5, 0, -#undef V11251 -#define V11251 (V + 43721) - 0x1111, 0x1166, 0x11b6, 0, -#undef V11252 -#define V11252 (V + 43725) - 0x1111, 0x1166, 0x11b7, 0, -#undef V11253 -#define V11253 (V + 43729) - 0x1111, 0x1166, 0x11b8, 0, -#undef V11254 -#define V11254 (V + 43733) - 0x1111, 0x1166, 0x11b9, 0, -#undef V11255 -#define V11255 (V + 43737) - 0x1111, 0x1166, 0x11ba, 0, -#undef V11256 -#define V11256 (V + 43741) - 0x1111, 0x1166, 0x11bb, 0, -#undef V11257 -#define V11257 (V + 43745) - 0x1111, 0x1166, 0x11bc, 0, -#undef V11258 -#define V11258 (V + 43749) - 0x1111, 0x1166, 0x11bd, 0, -#undef V11259 -#define V11259 (V + 43753) - 0x1111, 0x1166, 0x11be, 0, -#undef V11260 -#define V11260 (V + 43757) - 0x1111, 0x1166, 0x11bf, 0, -#undef V11261 -#define V11261 (V + 43761) - 0x1111, 0x1166, 0x11c0, 0, -#undef V11262 -#define V11262 (V + 43765) - 0x1111, 0x1166, 0x11c1, 0, -#undef V11263 -#define V11263 (V + 43769) - 0x1111, 0x1166, 0x11c2, 0, -#undef V11264 -#define V11264 (V + 43773) - 0x1111, 0x1167, 0, -#undef V11265 -#define V11265 (V + 43776) - 0x1111, 0x1167, 0x11a8, 0, -#undef V11266 -#define V11266 (V + 43780) - 0x1111, 0x1167, 0x11a9, 0, -#undef V11267 -#define V11267 (V + 43784) - 0x1111, 0x1167, 0x11aa, 0, -#undef V11268 -#define V11268 (V + 43788) - 0x1111, 0x1167, 0x11ab, 0, -#undef V11269 -#define V11269 (V + 43792) - 0x1111, 0x1167, 0x11ac, 0, -#undef V11270 -#define V11270 (V + 43796) - 0x1111, 0x1167, 0x11ad, 0, -#undef V11271 -#define V11271 (V + 43800) - 0x1111, 0x1167, 0x11ae, 0, -#undef V11272 -#define V11272 (V + 43804) - 0x1111, 0x1167, 0x11af, 0, -#undef V11273 -#define V11273 (V + 43808) - 0x1111, 0x1167, 0x11b0, 0, -#undef V11274 -#define V11274 (V + 43812) - 0x1111, 0x1167, 0x11b1, 0, -#undef V11275 -#define V11275 (V + 43816) - 0x1111, 0x1167, 0x11b2, 0, -#undef V11276 -#define V11276 (V + 43820) - 0x1111, 0x1167, 0x11b3, 0, -#undef V11277 -#define V11277 (V + 43824) - 0x1111, 0x1167, 0x11b4, 0, -#undef V11278 -#define V11278 (V + 43828) - 0x1111, 0x1167, 0x11b5, 0, -#undef V11279 -#define V11279 (V + 43832) - 0x1111, 0x1167, 0x11b6, 0, -#undef V11280 -#define V11280 (V + 43836) - 0x1111, 0x1167, 0x11b7, 0, -#undef V11281 -#define V11281 (V + 43840) - 0x1111, 0x1167, 0x11b8, 0, -#undef V11282 -#define V11282 (V + 43844) - 0x1111, 0x1167, 0x11b9, 0, -#undef V11283 -#define V11283 (V + 43848) - 0x1111, 0x1167, 0x11ba, 0, -#undef V11284 -#define V11284 (V + 43852) - 0x1111, 0x1167, 0x11bb, 0, -#undef V11285 -#define V11285 (V + 43856) - 0x1111, 0x1167, 0x11bc, 0, -#undef V11286 -#define V11286 (V + 43860) - 0x1111, 0x1167, 0x11bd, 0, -#undef V11287 -#define V11287 (V + 43864) - 0x1111, 0x1167, 0x11be, 0, -#undef V11288 -#define V11288 (V + 43868) - 0x1111, 0x1167, 0x11bf, 0, -#undef V11289 -#define V11289 (V + 43872) - 0x1111, 0x1167, 0x11c0, 0, -#undef V11290 -#define V11290 (V + 43876) - 0x1111, 0x1167, 0x11c1, 0, -#undef V11291 -#define V11291 (V + 43880) - 0x1111, 0x1167, 0x11c2, 0, -#undef V11292 -#define V11292 (V + 43884) - 0x1111, 0x1168, 0, -#undef V11293 -#define V11293 (V + 43887) - 0x1111, 0x1168, 0x11a8, 0, -#undef V11294 -#define V11294 (V + 43891) - 0x1111, 0x1168, 0x11a9, 0, -#undef V11295 -#define V11295 (V + 43895) - 0x1111, 0x1168, 0x11aa, 0, -#undef V11296 -#define V11296 (V + 43899) - 0x1111, 0x1168, 0x11ab, 0, -#undef V11297 -#define V11297 (V + 43903) - 0x1111, 0x1168, 0x11ac, 0, -#undef V11298 -#define V11298 (V + 43907) - 0x1111, 0x1168, 0x11ad, 0, -#undef V11299 -#define V11299 (V + 43911) - 0x1111, 0x1168, 0x11ae, 0, -#undef V11300 -#define V11300 (V + 43915) - 0x1111, 0x1168, 0x11af, 0, -#undef V11301 -#define V11301 (V + 43919) - 0x1111, 0x1168, 0x11b0, 0, -#undef V11302 -#define V11302 (V + 43923) - 0x1111, 0x1168, 0x11b1, 0, -#undef V11303 -#define V11303 (V + 43927) - 0x1111, 0x1168, 0x11b2, 0, -#undef V11304 -#define V11304 (V + 43931) - 0x1111, 0x1168, 0x11b3, 0, -#undef V11305 -#define V11305 (V + 43935) - 0x1111, 0x1168, 0x11b4, 0, -#undef V11306 -#define V11306 (V + 43939) - 0x1111, 0x1168, 0x11b5, 0, -#undef V11307 -#define V11307 (V + 43943) - 0x1111, 0x1168, 0x11b6, 0, -#undef V11308 -#define V11308 (V + 43947) - 0x1111, 0x1168, 0x11b7, 0, -#undef V11309 -#define V11309 (V + 43951) - 0x1111, 0x1168, 0x11b8, 0, -#undef V11310 -#define V11310 (V + 43955) - 0x1111, 0x1168, 0x11b9, 0, -#undef V11311 -#define V11311 (V + 43959) - 0x1111, 0x1168, 0x11ba, 0, -#undef V11312 -#define V11312 (V + 43963) - 0x1111, 0x1168, 0x11bb, 0, -#undef V11313 -#define V11313 (V + 43967) - 0x1111, 0x1168, 0x11bc, 0, -#undef V11314 -#define V11314 (V + 43971) - 0x1111, 0x1168, 0x11bd, 0, -#undef V11315 -#define V11315 (V + 43975) - 0x1111, 0x1168, 0x11be, 0, -#undef V11316 -#define V11316 (V + 43979) - 0x1111, 0x1168, 0x11bf, 0, -#undef V11317 -#define V11317 (V + 43983) - 0x1111, 0x1168, 0x11c0, 0, -#undef V11318 -#define V11318 (V + 43987) - 0x1111, 0x1168, 0x11c1, 0, -#undef V11319 -#define V11319 (V + 43991) - 0x1111, 0x1168, 0x11c2, 0, -#undef V11320 -#define V11320 (V + 43995) - 0x1111, 0x1169, 0, -#undef V11321 -#define V11321 (V + 43998) - 0x1111, 0x1169, 0x11a8, 0, -#undef V11322 -#define V11322 (V + 44002) - 0x1111, 0x1169, 0x11a9, 0, -#undef V11323 -#define V11323 (V + 44006) - 0x1111, 0x1169, 0x11aa, 0, -#undef V11324 -#define V11324 (V + 44010) - 0x1111, 0x1169, 0x11ab, 0, -#undef V11325 -#define V11325 (V + 44014) - 0x1111, 0x1169, 0x11ac, 0, -#undef V11326 -#define V11326 (V + 44018) - 0x1111, 0x1169, 0x11ad, 0, -#undef V11327 -#define V11327 (V + 44022) - 0x1111, 0x1169, 0x11ae, 0, -#undef V11328 -#define V11328 (V + 44026) - 0x1111, 0x1169, 0x11af, 0, -#undef V11329 -#define V11329 (V + 44030) - 0x1111, 0x1169, 0x11b0, 0, -#undef V11330 -#define V11330 (V + 44034) - 0x1111, 0x1169, 0x11b1, 0, -#undef V11331 -#define V11331 (V + 44038) - 0x1111, 0x1169, 0x11b2, 0, -#undef V11332 -#define V11332 (V + 44042) - 0x1111, 0x1169, 0x11b3, 0, -#undef V11333 -#define V11333 (V + 44046) - 0x1111, 0x1169, 0x11b4, 0, -#undef V11334 -#define V11334 (V + 44050) - 0x1111, 0x1169, 0x11b5, 0, -#undef V11335 -#define V11335 (V + 44054) - 0x1111, 0x1169, 0x11b6, 0, -#undef V11336 -#define V11336 (V + 44058) - 0x1111, 0x1169, 0x11b7, 0, -#undef V11337 -#define V11337 (V + 44062) - 0x1111, 0x1169, 0x11b8, 0, -#undef V11338 -#define V11338 (V + 44066) - 0x1111, 0x1169, 0x11b9, 0, -#undef V11339 -#define V11339 (V + 44070) - 0x1111, 0x1169, 0x11ba, 0, -#undef V11340 -#define V11340 (V + 44074) - 0x1111, 0x1169, 0x11bb, 0, -#undef V11341 -#define V11341 (V + 44078) - 0x1111, 0x1169, 0x11bc, 0, -#undef V11342 -#define V11342 (V + 44082) - 0x1111, 0x1169, 0x11bd, 0, -#undef V11343 -#define V11343 (V + 44086) - 0x1111, 0x1169, 0x11be, 0, -#undef V11344 -#define V11344 (V + 44090) - 0x1111, 0x1169, 0x11bf, 0, -#undef V11345 -#define V11345 (V + 44094) - 0x1111, 0x1169, 0x11c0, 0, -#undef V11346 -#define V11346 (V + 44098) - 0x1111, 0x1169, 0x11c1, 0, -#undef V11347 -#define V11347 (V + 44102) - 0x1111, 0x1169, 0x11c2, 0, -#undef V11348 -#define V11348 (V + 44106) - 0x1111, 0x116a, 0, -#undef V11349 -#define V11349 (V + 44109) - 0x1111, 0x116a, 0x11a8, 0, -#undef V11350 -#define V11350 (V + 44113) - 0x1111, 0x116a, 0x11a9, 0, -#undef V11351 -#define V11351 (V + 44117) - 0x1111, 0x116a, 0x11aa, 0, -#undef V11352 -#define V11352 (V + 44121) - 0x1111, 0x116a, 0x11ab, 0, -#undef V11353 -#define V11353 (V + 44125) - 0x1111, 0x116a, 0x11ac, 0, -#undef V11354 -#define V11354 (V + 44129) - 0x1111, 0x116a, 0x11ad, 0, -#undef V11355 -#define V11355 (V + 44133) - 0x1111, 0x116a, 0x11ae, 0, -#undef V11356 -#define V11356 (V + 44137) - 0x1111, 0x116a, 0x11af, 0, -#undef V11357 -#define V11357 (V + 44141) - 0x1111, 0x116a, 0x11b0, 0, -#undef V11358 -#define V11358 (V + 44145) - 0x1111, 0x116a, 0x11b1, 0, -#undef V11359 -#define V11359 (V + 44149) - 0x1111, 0x116a, 0x11b2, 0, -#undef V11360 -#define V11360 (V + 44153) - 0x1111, 0x116a, 0x11b3, 0, -#undef V11361 -#define V11361 (V + 44157) - 0x1111, 0x116a, 0x11b4, 0, -#undef V11362 -#define V11362 (V + 44161) - 0x1111, 0x116a, 0x11b5, 0, -#undef V11363 -#define V11363 (V + 44165) - 0x1111, 0x116a, 0x11b6, 0, -#undef V11364 -#define V11364 (V + 44169) - 0x1111, 0x116a, 0x11b7, 0, -#undef V11365 -#define V11365 (V + 44173) - 0x1111, 0x116a, 0x11b8, 0, -#undef V11366 -#define V11366 (V + 44177) - 0x1111, 0x116a, 0x11b9, 0, -#undef V11367 -#define V11367 (V + 44181) - 0x1111, 0x116a, 0x11ba, 0, -#undef V11368 -#define V11368 (V + 44185) - 0x1111, 0x116a, 0x11bb, 0, -#undef V11369 -#define V11369 (V + 44189) - 0x1111, 0x116a, 0x11bc, 0, -#undef V11370 -#define V11370 (V + 44193) - 0x1111, 0x116a, 0x11bd, 0, -#undef V11371 -#define V11371 (V + 44197) - 0x1111, 0x116a, 0x11be, 0, -#undef V11372 -#define V11372 (V + 44201) - 0x1111, 0x116a, 0x11bf, 0, -#undef V11373 -#define V11373 (V + 44205) - 0x1111, 0x116a, 0x11c0, 0, -#undef V11374 -#define V11374 (V + 44209) - 0x1111, 0x116a, 0x11c1, 0, -#undef V11375 -#define V11375 (V + 44213) - 0x1111, 0x116a, 0x11c2, 0, -#undef V11376 -#define V11376 (V + 44217) - 0x1111, 0x116b, 0, -#undef V11377 -#define V11377 (V + 44220) - 0x1111, 0x116b, 0x11a8, 0, -#undef V11378 -#define V11378 (V + 44224) - 0x1111, 0x116b, 0x11a9, 0, -#undef V11379 -#define V11379 (V + 44228) - 0x1111, 0x116b, 0x11aa, 0, -#undef V11380 -#define V11380 (V + 44232) - 0x1111, 0x116b, 0x11ab, 0, -#undef V11381 -#define V11381 (V + 44236) - 0x1111, 0x116b, 0x11ac, 0, -#undef V11382 -#define V11382 (V + 44240) - 0x1111, 0x116b, 0x11ad, 0, -#undef V11383 -#define V11383 (V + 44244) - 0x1111, 0x116b, 0x11ae, 0, -#undef V11384 -#define V11384 (V + 44248) - 0x1111, 0x116b, 0x11af, 0, -#undef V11385 -#define V11385 (V + 44252) - 0x1111, 0x116b, 0x11b0, 0, -#undef V11386 -#define V11386 (V + 44256) - 0x1111, 0x116b, 0x11b1, 0, -#undef V11387 -#define V11387 (V + 44260) - 0x1111, 0x116b, 0x11b2, 0, -#undef V11388 -#define V11388 (V + 44264) - 0x1111, 0x116b, 0x11b3, 0, -#undef V11389 -#define V11389 (V + 44268) - 0x1111, 0x116b, 0x11b4, 0, -#undef V11390 -#define V11390 (V + 44272) - 0x1111, 0x116b, 0x11b5, 0, -#undef V11391 -#define V11391 (V + 44276) - 0x1111, 0x116b, 0x11b6, 0, -#undef V11392 -#define V11392 (V + 44280) - 0x1111, 0x116b, 0x11b7, 0, -#undef V11393 -#define V11393 (V + 44284) - 0x1111, 0x116b, 0x11b8, 0, -#undef V11394 -#define V11394 (V + 44288) - 0x1111, 0x116b, 0x11b9, 0, -#undef V11395 -#define V11395 (V + 44292) - 0x1111, 0x116b, 0x11ba, 0, -#undef V11396 -#define V11396 (V + 44296) - 0x1111, 0x116b, 0x11bb, 0, -#undef V11397 -#define V11397 (V + 44300) - 0x1111, 0x116b, 0x11bc, 0, -#undef V11398 -#define V11398 (V + 44304) - 0x1111, 0x116b, 0x11bd, 0, -#undef V11399 -#define V11399 (V + 44308) - 0x1111, 0x116b, 0x11be, 0, -#undef V11400 -#define V11400 (V + 44312) - 0x1111, 0x116b, 0x11bf, 0, -#undef V11401 -#define V11401 (V + 44316) - 0x1111, 0x116b, 0x11c0, 0, -#undef V11402 -#define V11402 (V + 44320) - 0x1111, 0x116b, 0x11c1, 0, -#undef V11403 -#define V11403 (V + 44324) - 0x1111, 0x116b, 0x11c2, 0, -#undef V11404 -#define V11404 (V + 44328) - 0x1111, 0x116c, 0, -#undef V11405 -#define V11405 (V + 44331) - 0x1111, 0x116c, 0x11a8, 0, -#undef V11406 -#define V11406 (V + 44335) - 0x1111, 0x116c, 0x11a9, 0, -#undef V11407 -#define V11407 (V + 44339) - 0x1111, 0x116c, 0x11aa, 0, -#undef V11408 -#define V11408 (V + 44343) - 0x1111, 0x116c, 0x11ab, 0, -#undef V11409 -#define V11409 (V + 44347) - 0x1111, 0x116c, 0x11ac, 0, -#undef V11410 -#define V11410 (V + 44351) - 0x1111, 0x116c, 0x11ad, 0, -#undef V11411 -#define V11411 (V + 44355) - 0x1111, 0x116c, 0x11ae, 0, -#undef V11412 -#define V11412 (V + 44359) - 0x1111, 0x116c, 0x11af, 0, -#undef V11413 -#define V11413 (V + 44363) - 0x1111, 0x116c, 0x11b0, 0, -#undef V11414 -#define V11414 (V + 44367) - 0x1111, 0x116c, 0x11b1, 0, -#undef V11415 -#define V11415 (V + 44371) - 0x1111, 0x116c, 0x11b2, 0, -#undef V11416 -#define V11416 (V + 44375) - 0x1111, 0x116c, 0x11b3, 0, -#undef V11417 -#define V11417 (V + 44379) - 0x1111, 0x116c, 0x11b4, 0, -#undef V11418 -#define V11418 (V + 44383) - 0x1111, 0x116c, 0x11b5, 0, -#undef V11419 -#define V11419 (V + 44387) - 0x1111, 0x116c, 0x11b6, 0, -#undef V11420 -#define V11420 (V + 44391) - 0x1111, 0x116c, 0x11b7, 0, -#undef V11421 -#define V11421 (V + 44395) - 0x1111, 0x116c, 0x11b8, 0, -#undef V11422 -#define V11422 (V + 44399) - 0x1111, 0x116c, 0x11b9, 0, -#undef V11423 -#define V11423 (V + 44403) - 0x1111, 0x116c, 0x11ba, 0, -#undef V11424 -#define V11424 (V + 44407) - 0x1111, 0x116c, 0x11bb, 0, -#undef V11425 -#define V11425 (V + 44411) - 0x1111, 0x116c, 0x11bc, 0, -#undef V11426 -#define V11426 (V + 44415) - 0x1111, 0x116c, 0x11bd, 0, -#undef V11427 -#define V11427 (V + 44419) - 0x1111, 0x116c, 0x11be, 0, -#undef V11428 -#define V11428 (V + 44423) - 0x1111, 0x116c, 0x11bf, 0, -#undef V11429 -#define V11429 (V + 44427) - 0x1111, 0x116c, 0x11c0, 0, -#undef V11430 -#define V11430 (V + 44431) - 0x1111, 0x116c, 0x11c1, 0, -#undef V11431 -#define V11431 (V + 44435) - 0x1111, 0x116c, 0x11c2, 0, -#undef V11432 -#define V11432 (V + 44439) - 0x1111, 0x116d, 0, -#undef V11433 -#define V11433 (V + 44442) - 0x1111, 0x116d, 0x11a8, 0, -#undef V11434 -#define V11434 (V + 44446) - 0x1111, 0x116d, 0x11a9, 0, -#undef V11435 -#define V11435 (V + 44450) - 0x1111, 0x116d, 0x11aa, 0, -#undef V11436 -#define V11436 (V + 44454) - 0x1111, 0x116d, 0x11ab, 0, -#undef V11437 -#define V11437 (V + 44458) - 0x1111, 0x116d, 0x11ac, 0, -#undef V11438 -#define V11438 (V + 44462) - 0x1111, 0x116d, 0x11ad, 0, -#undef V11439 -#define V11439 (V + 44466) - 0x1111, 0x116d, 0x11ae, 0, -#undef V11440 -#define V11440 (V + 44470) - 0x1111, 0x116d, 0x11af, 0, -#undef V11441 -#define V11441 (V + 44474) - 0x1111, 0x116d, 0x11b0, 0, -#undef V11442 -#define V11442 (V + 44478) - 0x1111, 0x116d, 0x11b1, 0, -#undef V11443 -#define V11443 (V + 44482) - 0x1111, 0x116d, 0x11b2, 0, -#undef V11444 -#define V11444 (V + 44486) - 0x1111, 0x116d, 0x11b3, 0, -#undef V11445 -#define V11445 (V + 44490) - 0x1111, 0x116d, 0x11b4, 0, -#undef V11446 -#define V11446 (V + 44494) - 0x1111, 0x116d, 0x11b5, 0, -#undef V11447 -#define V11447 (V + 44498) - 0x1111, 0x116d, 0x11b6, 0, -#undef V11448 -#define V11448 (V + 44502) - 0x1111, 0x116d, 0x11b7, 0, -#undef V11449 -#define V11449 (V + 44506) - 0x1111, 0x116d, 0x11b8, 0, -#undef V11450 -#define V11450 (V + 44510) - 0x1111, 0x116d, 0x11b9, 0, -#undef V11451 -#define V11451 (V + 44514) - 0x1111, 0x116d, 0x11ba, 0, -#undef V11452 -#define V11452 (V + 44518) - 0x1111, 0x116d, 0x11bb, 0, -#undef V11453 -#define V11453 (V + 44522) - 0x1111, 0x116d, 0x11bc, 0, -#undef V11454 -#define V11454 (V + 44526) - 0x1111, 0x116d, 0x11bd, 0, -#undef V11455 -#define V11455 (V + 44530) - 0x1111, 0x116d, 0x11be, 0, -#undef V11456 -#define V11456 (V + 44534) - 0x1111, 0x116d, 0x11bf, 0, -#undef V11457 -#define V11457 (V + 44538) - 0x1111, 0x116d, 0x11c0, 0, -#undef V11458 -#define V11458 (V + 44542) - 0x1111, 0x116d, 0x11c1, 0, -#undef V11459 -#define V11459 (V + 44546) - 0x1111, 0x116d, 0x11c2, 0, -#undef V11460 -#define V11460 (V + 44550) - 0x1111, 0x116e, 0, -#undef V11461 -#define V11461 (V + 44553) - 0x1111, 0x116e, 0x11a8, 0, -#undef V11462 -#define V11462 (V + 44557) - 0x1111, 0x116e, 0x11a9, 0, -#undef V11463 -#define V11463 (V + 44561) - 0x1111, 0x116e, 0x11aa, 0, -#undef V11464 -#define V11464 (V + 44565) - 0x1111, 0x116e, 0x11ab, 0, -#undef V11465 -#define V11465 (V + 44569) - 0x1111, 0x116e, 0x11ac, 0, -#undef V11466 -#define V11466 (V + 44573) - 0x1111, 0x116e, 0x11ad, 0, -#undef V11467 -#define V11467 (V + 44577) - 0x1111, 0x116e, 0x11ae, 0, -#undef V11468 -#define V11468 (V + 44581) - 0x1111, 0x116e, 0x11af, 0, -#undef V11469 -#define V11469 (V + 44585) - 0x1111, 0x116e, 0x11b0, 0, -#undef V11470 -#define V11470 (V + 44589) - 0x1111, 0x116e, 0x11b1, 0, -#undef V11471 -#define V11471 (V + 44593) - 0x1111, 0x116e, 0x11b2, 0, -#undef V11472 -#define V11472 (V + 44597) - 0x1111, 0x116e, 0x11b3, 0, -#undef V11473 -#define V11473 (V + 44601) - 0x1111, 0x116e, 0x11b4, 0, -#undef V11474 -#define V11474 (V + 44605) - 0x1111, 0x116e, 0x11b5, 0, -#undef V11475 -#define V11475 (V + 44609) - 0x1111, 0x116e, 0x11b6, 0, -#undef V11476 -#define V11476 (V + 44613) - 0x1111, 0x116e, 0x11b7, 0, -#undef V11477 -#define V11477 (V + 44617) - 0x1111, 0x116e, 0x11b8, 0, -#undef V11478 -#define V11478 (V + 44621) - 0x1111, 0x116e, 0x11b9, 0, -#undef V11479 -#define V11479 (V + 44625) - 0x1111, 0x116e, 0x11ba, 0, -#undef V11480 -#define V11480 (V + 44629) - 0x1111, 0x116e, 0x11bb, 0, -#undef V11481 -#define V11481 (V + 44633) - 0x1111, 0x116e, 0x11bc, 0, -#undef V11482 -#define V11482 (V + 44637) - 0x1111, 0x116e, 0x11bd, 0, -#undef V11483 -#define V11483 (V + 44641) - 0x1111, 0x116e, 0x11be, 0, -#undef V11484 -#define V11484 (V + 44645) - 0x1111, 0x116e, 0x11bf, 0, -#undef V11485 -#define V11485 (V + 44649) - 0x1111, 0x116e, 0x11c0, 0, -#undef V11486 -#define V11486 (V + 44653) - 0x1111, 0x116e, 0x11c1, 0, -#undef V11487 -#define V11487 (V + 44657) - 0x1111, 0x116e, 0x11c2, 0, -#undef V11488 -#define V11488 (V + 44661) - 0x1111, 0x116f, 0, -#undef V11489 -#define V11489 (V + 44664) - 0x1111, 0x116f, 0x11a8, 0, -#undef V11490 -#define V11490 (V + 44668) - 0x1111, 0x116f, 0x11a9, 0, -#undef V11491 -#define V11491 (V + 44672) - 0x1111, 0x116f, 0x11aa, 0, -#undef V11492 -#define V11492 (V + 44676) - 0x1111, 0x116f, 0x11ab, 0, -#undef V11493 -#define V11493 (V + 44680) - 0x1111, 0x116f, 0x11ac, 0, -#undef V11494 -#define V11494 (V + 44684) - 0x1111, 0x116f, 0x11ad, 0, -#undef V11495 -#define V11495 (V + 44688) - 0x1111, 0x116f, 0x11ae, 0, -#undef V11496 -#define V11496 (V + 44692) - 0x1111, 0x116f, 0x11af, 0, -#undef V11497 -#define V11497 (V + 44696) - 0x1111, 0x116f, 0x11b0, 0, -#undef V11498 -#define V11498 (V + 44700) - 0x1111, 0x116f, 0x11b1, 0, -#undef V11499 -#define V11499 (V + 44704) - 0x1111, 0x116f, 0x11b2, 0, -#undef V11500 -#define V11500 (V + 44708) - 0x1111, 0x116f, 0x11b3, 0, -#undef V11501 -#define V11501 (V + 44712) - 0x1111, 0x116f, 0x11b4, 0, -#undef V11502 -#define V11502 (V + 44716) - 0x1111, 0x116f, 0x11b5, 0, -#undef V11503 -#define V11503 (V + 44720) - 0x1111, 0x116f, 0x11b6, 0, -#undef V11504 -#define V11504 (V + 44724) - 0x1111, 0x116f, 0x11b7, 0, -#undef V11505 -#define V11505 (V + 44728) - 0x1111, 0x116f, 0x11b8, 0, -#undef V11506 -#define V11506 (V + 44732) - 0x1111, 0x116f, 0x11b9, 0, -#undef V11507 -#define V11507 (V + 44736) - 0x1111, 0x116f, 0x11ba, 0, -#undef V11508 -#define V11508 (V + 44740) - 0x1111, 0x116f, 0x11bb, 0, -#undef V11509 -#define V11509 (V + 44744) - 0x1111, 0x116f, 0x11bc, 0, -#undef V11510 -#define V11510 (V + 44748) - 0x1111, 0x116f, 0x11bd, 0, -#undef V11511 -#define V11511 (V + 44752) - 0x1111, 0x116f, 0x11be, 0, -#undef V11512 -#define V11512 (V + 44756) - 0x1111, 0x116f, 0x11bf, 0, -#undef V11513 -#define V11513 (V + 44760) - 0x1111, 0x116f, 0x11c0, 0, -#undef V11514 -#define V11514 (V + 44764) - 0x1111, 0x116f, 0x11c1, 0, -#undef V11515 -#define V11515 (V + 44768) - 0x1111, 0x116f, 0x11c2, 0, -#undef V11516 -#define V11516 (V + 44772) - 0x1111, 0x1170, 0, -#undef V11517 -#define V11517 (V + 44775) - 0x1111, 0x1170, 0x11a8, 0, -#undef V11518 -#define V11518 (V + 44779) - 0x1111, 0x1170, 0x11a9, 0, -#undef V11519 -#define V11519 (V + 44783) - 0x1111, 0x1170, 0x11aa, 0, -#undef V11520 -#define V11520 (V + 44787) - 0x1111, 0x1170, 0x11ab, 0, -#undef V11521 -#define V11521 (V + 44791) - 0x1111, 0x1170, 0x11ac, 0, -#undef V11522 -#define V11522 (V + 44795) - 0x1111, 0x1170, 0x11ad, 0, -#undef V11523 -#define V11523 (V + 44799) - 0x1111, 0x1170, 0x11ae, 0, -#undef V11524 -#define V11524 (V + 44803) - 0x1111, 0x1170, 0x11af, 0, -#undef V11525 -#define V11525 (V + 44807) - 0x1111, 0x1170, 0x11b0, 0, -#undef V11526 -#define V11526 (V + 44811) - 0x1111, 0x1170, 0x11b1, 0, -#undef V11527 -#define V11527 (V + 44815) - 0x1111, 0x1170, 0x11b2, 0, -#undef V11528 -#define V11528 (V + 44819) - 0x1111, 0x1170, 0x11b3, 0, -#undef V11529 -#define V11529 (V + 44823) - 0x1111, 0x1170, 0x11b4, 0, -#undef V11530 -#define V11530 (V + 44827) - 0x1111, 0x1170, 0x11b5, 0, -#undef V11531 -#define V11531 (V + 44831) - 0x1111, 0x1170, 0x11b6, 0, -#undef V11532 -#define V11532 (V + 44835) - 0x1111, 0x1170, 0x11b7, 0, -#undef V11533 -#define V11533 (V + 44839) - 0x1111, 0x1170, 0x11b8, 0, -#undef V11534 -#define V11534 (V + 44843) - 0x1111, 0x1170, 0x11b9, 0, -#undef V11535 -#define V11535 (V + 44847) - 0x1111, 0x1170, 0x11ba, 0, -#undef V11536 -#define V11536 (V + 44851) - 0x1111, 0x1170, 0x11bb, 0, -#undef V11537 -#define V11537 (V + 44855) - 0x1111, 0x1170, 0x11bc, 0, -#undef V11538 -#define V11538 (V + 44859) - 0x1111, 0x1170, 0x11bd, 0, -#undef V11539 -#define V11539 (V + 44863) - 0x1111, 0x1170, 0x11be, 0, -#undef V11540 -#define V11540 (V + 44867) - 0x1111, 0x1170, 0x11bf, 0, -#undef V11541 -#define V11541 (V + 44871) - 0x1111, 0x1170, 0x11c0, 0, -#undef V11542 -#define V11542 (V + 44875) - 0x1111, 0x1170, 0x11c1, 0, -#undef V11543 -#define V11543 (V + 44879) - 0x1111, 0x1170, 0x11c2, 0, -#undef V11544 -#define V11544 (V + 44883) - 0x1111, 0x1171, 0, -#undef V11545 -#define V11545 (V + 44886) - 0x1111, 0x1171, 0x11a8, 0, -#undef V11546 -#define V11546 (V + 44890) - 0x1111, 0x1171, 0x11a9, 0, -#undef V11547 -#define V11547 (V + 44894) - 0x1111, 0x1171, 0x11aa, 0, -#undef V11548 -#define V11548 (V + 44898) - 0x1111, 0x1171, 0x11ab, 0, -#undef V11549 -#define V11549 (V + 44902) - 0x1111, 0x1171, 0x11ac, 0, -#undef V11550 -#define V11550 (V + 44906) - 0x1111, 0x1171, 0x11ad, 0, -#undef V11551 -#define V11551 (V + 44910) - 0x1111, 0x1171, 0x11ae, 0, -#undef V11552 -#define V11552 (V + 44914) - 0x1111, 0x1171, 0x11af, 0, -#undef V11553 -#define V11553 (V + 44918) - 0x1111, 0x1171, 0x11b0, 0, -#undef V11554 -#define V11554 (V + 44922) - 0x1111, 0x1171, 0x11b1, 0, -#undef V11555 -#define V11555 (V + 44926) - 0x1111, 0x1171, 0x11b2, 0, -#undef V11556 -#define V11556 (V + 44930) - 0x1111, 0x1171, 0x11b3, 0, -#undef V11557 -#define V11557 (V + 44934) - 0x1111, 0x1171, 0x11b4, 0, -#undef V11558 -#define V11558 (V + 44938) - 0x1111, 0x1171, 0x11b5, 0, -#undef V11559 -#define V11559 (V + 44942) - 0x1111, 0x1171, 0x11b6, 0, -#undef V11560 -#define V11560 (V + 44946) - 0x1111, 0x1171, 0x11b7, 0, -#undef V11561 -#define V11561 (V + 44950) - 0x1111, 0x1171, 0x11b8, 0, -#undef V11562 -#define V11562 (V + 44954) - 0x1111, 0x1171, 0x11b9, 0, -#undef V11563 -#define V11563 (V + 44958) - 0x1111, 0x1171, 0x11ba, 0, -#undef V11564 -#define V11564 (V + 44962) - 0x1111, 0x1171, 0x11bb, 0, -#undef V11565 -#define V11565 (V + 44966) - 0x1111, 0x1171, 0x11bc, 0, -#undef V11566 -#define V11566 (V + 44970) - 0x1111, 0x1171, 0x11bd, 0, -#undef V11567 -#define V11567 (V + 44974) - 0x1111, 0x1171, 0x11be, 0, -#undef V11568 -#define V11568 (V + 44978) - 0x1111, 0x1171, 0x11bf, 0, -#undef V11569 -#define V11569 (V + 44982) - 0x1111, 0x1171, 0x11c0, 0, -#undef V11570 -#define V11570 (V + 44986) - 0x1111, 0x1171, 0x11c1, 0, -#undef V11571 -#define V11571 (V + 44990) - 0x1111, 0x1171, 0x11c2, 0, -#undef V11572 -#define V11572 (V + 44994) - 0x1111, 0x1172, 0, -#undef V11573 -#define V11573 (V + 44997) - 0x1111, 0x1172, 0x11a8, 0, -#undef V11574 -#define V11574 (V + 45001) - 0x1111, 0x1172, 0x11a9, 0, -#undef V11575 -#define V11575 (V + 45005) - 0x1111, 0x1172, 0x11aa, 0, -#undef V11576 -#define V11576 (V + 45009) - 0x1111, 0x1172, 0x11ab, 0, -#undef V11577 -#define V11577 (V + 45013) - 0x1111, 0x1172, 0x11ac, 0, -#undef V11578 -#define V11578 (V + 45017) - 0x1111, 0x1172, 0x11ad, 0, -#undef V11579 -#define V11579 (V + 45021) - 0x1111, 0x1172, 0x11ae, 0, -#undef V11580 -#define V11580 (V + 45025) - 0x1111, 0x1172, 0x11af, 0, -#undef V11581 -#define V11581 (V + 45029) - 0x1111, 0x1172, 0x11b0, 0, -#undef V11582 -#define V11582 (V + 45033) - 0x1111, 0x1172, 0x11b1, 0, -#undef V11583 -#define V11583 (V + 45037) - 0x1111, 0x1172, 0x11b2, 0, -#undef V11584 -#define V11584 (V + 45041) - 0x1111, 0x1172, 0x11b3, 0, -#undef V11585 -#define V11585 (V + 45045) - 0x1111, 0x1172, 0x11b4, 0, -#undef V11586 -#define V11586 (V + 45049) - 0x1111, 0x1172, 0x11b5, 0, -#undef V11587 -#define V11587 (V + 45053) - 0x1111, 0x1172, 0x11b6, 0, -#undef V11588 -#define V11588 (V + 45057) - 0x1111, 0x1172, 0x11b7, 0, -#undef V11589 -#define V11589 (V + 45061) - 0x1111, 0x1172, 0x11b8, 0, -#undef V11590 -#define V11590 (V + 45065) - 0x1111, 0x1172, 0x11b9, 0, -#undef V11591 -#define V11591 (V + 45069) - 0x1111, 0x1172, 0x11ba, 0, -#undef V11592 -#define V11592 (V + 45073) - 0x1111, 0x1172, 0x11bb, 0, -#undef V11593 -#define V11593 (V + 45077) - 0x1111, 0x1172, 0x11bc, 0, -#undef V11594 -#define V11594 (V + 45081) - 0x1111, 0x1172, 0x11bd, 0, -#undef V11595 -#define V11595 (V + 45085) - 0x1111, 0x1172, 0x11be, 0, -#undef V11596 -#define V11596 (V + 45089) - 0x1111, 0x1172, 0x11bf, 0, -#undef V11597 -#define V11597 (V + 45093) - 0x1111, 0x1172, 0x11c0, 0, -#undef V11598 -#define V11598 (V + 45097) - 0x1111, 0x1172, 0x11c1, 0, -#undef V11599 -#define V11599 (V + 45101) - 0x1111, 0x1172, 0x11c2, 0, -#undef V11600 -#define V11600 (V + 45105) - 0x1111, 0x1173, 0, -#undef V11601 -#define V11601 (V + 45108) - 0x1111, 0x1173, 0x11a8, 0, -#undef V11602 -#define V11602 (V + 45112) - 0x1111, 0x1173, 0x11a9, 0, -#undef V11603 -#define V11603 (V + 45116) - 0x1111, 0x1173, 0x11aa, 0, -#undef V11604 -#define V11604 (V + 45120) - 0x1111, 0x1173, 0x11ab, 0, -#undef V11605 -#define V11605 (V + 45124) - 0x1111, 0x1173, 0x11ac, 0, -#undef V11606 -#define V11606 (V + 45128) - 0x1111, 0x1173, 0x11ad, 0, -#undef V11607 -#define V11607 (V + 45132) - 0x1111, 0x1173, 0x11ae, 0, -#undef V11608 -#define V11608 (V + 45136) - 0x1111, 0x1173, 0x11af, 0, -#undef V11609 -#define V11609 (V + 45140) - 0x1111, 0x1173, 0x11b0, 0, -#undef V11610 -#define V11610 (V + 45144) - 0x1111, 0x1173, 0x11b1, 0, -#undef V11611 -#define V11611 (V + 45148) - 0x1111, 0x1173, 0x11b2, 0, -#undef V11612 -#define V11612 (V + 45152) - 0x1111, 0x1173, 0x11b3, 0, -#undef V11613 -#define V11613 (V + 45156) - 0x1111, 0x1173, 0x11b4, 0, -#undef V11614 -#define V11614 (V + 45160) - 0x1111, 0x1173, 0x11b5, 0, -#undef V11615 -#define V11615 (V + 45164) - 0x1111, 0x1173, 0x11b6, 0, -#undef V11616 -#define V11616 (V + 45168) - 0x1111, 0x1173, 0x11b7, 0, -#undef V11617 -#define V11617 (V + 45172) - 0x1111, 0x1173, 0x11b8, 0, -#undef V11618 -#define V11618 (V + 45176) - 0x1111, 0x1173, 0x11b9, 0, -#undef V11619 -#define V11619 (V + 45180) - 0x1111, 0x1173, 0x11ba, 0, -#undef V11620 -#define V11620 (V + 45184) - 0x1111, 0x1173, 0x11bb, 0, -#undef V11621 -#define V11621 (V + 45188) - 0x1111, 0x1173, 0x11bc, 0, -#undef V11622 -#define V11622 (V + 45192) - 0x1111, 0x1173, 0x11bd, 0, -#undef V11623 -#define V11623 (V + 45196) - 0x1111, 0x1173, 0x11be, 0, -#undef V11624 -#define V11624 (V + 45200) - 0x1111, 0x1173, 0x11bf, 0, -#undef V11625 -#define V11625 (V + 45204) - 0x1111, 0x1173, 0x11c0, 0, -#undef V11626 -#define V11626 (V + 45208) - 0x1111, 0x1173, 0x11c1, 0, -#undef V11627 -#define V11627 (V + 45212) - 0x1111, 0x1173, 0x11c2, 0, -#undef V11628 -#define V11628 (V + 45216) - 0x1111, 0x1174, 0, -#undef V11629 -#define V11629 (V + 45219) - 0x1111, 0x1174, 0x11a8, 0, -#undef V11630 -#define V11630 (V + 45223) - 0x1111, 0x1174, 0x11a9, 0, -#undef V11631 -#define V11631 (V + 45227) - 0x1111, 0x1174, 0x11aa, 0, -#undef V11632 -#define V11632 (V + 45231) - 0x1111, 0x1174, 0x11ab, 0, -#undef V11633 -#define V11633 (V + 45235) - 0x1111, 0x1174, 0x11ac, 0, -#undef V11634 -#define V11634 (V + 45239) - 0x1111, 0x1174, 0x11ad, 0, -#undef V11635 -#define V11635 (V + 45243) - 0x1111, 0x1174, 0x11ae, 0, -#undef V11636 -#define V11636 (V + 45247) - 0x1111, 0x1174, 0x11af, 0, -#undef V11637 -#define V11637 (V + 45251) - 0x1111, 0x1174, 0x11b0, 0, -#undef V11638 -#define V11638 (V + 45255) - 0x1111, 0x1174, 0x11b1, 0, -#undef V11639 -#define V11639 (V + 45259) - 0x1111, 0x1174, 0x11b2, 0, -#undef V11640 -#define V11640 (V + 45263) - 0x1111, 0x1174, 0x11b3, 0, -#undef V11641 -#define V11641 (V + 45267) - 0x1111, 0x1174, 0x11b4, 0, -#undef V11642 -#define V11642 (V + 45271) - 0x1111, 0x1174, 0x11b5, 0, -#undef V11643 -#define V11643 (V + 45275) - 0x1111, 0x1174, 0x11b6, 0, -#undef V11644 -#define V11644 (V + 45279) - 0x1111, 0x1174, 0x11b7, 0, -#undef V11645 -#define V11645 (V + 45283) - 0x1111, 0x1174, 0x11b8, 0, -#undef V11646 -#define V11646 (V + 45287) - 0x1111, 0x1174, 0x11b9, 0, -#undef V11647 -#define V11647 (V + 45291) - 0x1111, 0x1174, 0x11ba, 0, -#undef V11648 -#define V11648 (V + 45295) - 0x1111, 0x1174, 0x11bb, 0, -#undef V11649 -#define V11649 (V + 45299) - 0x1111, 0x1174, 0x11bc, 0, -#undef V11650 -#define V11650 (V + 45303) - 0x1111, 0x1174, 0x11bd, 0, -#undef V11651 -#define V11651 (V + 45307) - 0x1111, 0x1174, 0x11be, 0, -#undef V11652 -#define V11652 (V + 45311) - 0x1111, 0x1174, 0x11bf, 0, -#undef V11653 -#define V11653 (V + 45315) - 0x1111, 0x1174, 0x11c0, 0, -#undef V11654 -#define V11654 (V + 45319) - 0x1111, 0x1174, 0x11c1, 0, -#undef V11655 -#define V11655 (V + 45323) - 0x1111, 0x1174, 0x11c2, 0, -#undef V11656 -#define V11656 (V + 45327) - 0x1111, 0x1175, 0, -#undef V11657 -#define V11657 (V + 45330) - 0x1111, 0x1175, 0x11a8, 0, -#undef V11658 -#define V11658 (V + 45334) - 0x1111, 0x1175, 0x11a9, 0, -#undef V11659 -#define V11659 (V + 45338) - 0x1111, 0x1175, 0x11aa, 0, -#undef V11660 -#define V11660 (V + 45342) - 0x1111, 0x1175, 0x11ab, 0, -#undef V11661 -#define V11661 (V + 45346) - 0x1111, 0x1175, 0x11ac, 0, -#undef V11662 -#define V11662 (V + 45350) - 0x1111, 0x1175, 0x11ad, 0, -#undef V11663 -#define V11663 (V + 45354) - 0x1111, 0x1175, 0x11ae, 0, -#undef V11664 -#define V11664 (V + 45358) - 0x1111, 0x1175, 0x11af, 0, -#undef V11665 -#define V11665 (V + 45362) - 0x1111, 0x1175, 0x11b0, 0, -#undef V11666 -#define V11666 (V + 45366) - 0x1111, 0x1175, 0x11b1, 0, -#undef V11667 -#define V11667 (V + 45370) - 0x1111, 0x1175, 0x11b2, 0, -#undef V11668 -#define V11668 (V + 45374) - 0x1111, 0x1175, 0x11b3, 0, -#undef V11669 -#define V11669 (V + 45378) - 0x1111, 0x1175, 0x11b4, 0, -#undef V11670 -#define V11670 (V + 45382) - 0x1111, 0x1175, 0x11b5, 0, -#undef V11671 -#define V11671 (V + 45386) - 0x1111, 0x1175, 0x11b6, 0, -#undef V11672 -#define V11672 (V + 45390) - 0x1111, 0x1175, 0x11b7, 0, -#undef V11673 -#define V11673 (V + 45394) - 0x1111, 0x1175, 0x11b8, 0, -#undef V11674 -#define V11674 (V + 45398) - 0x1111, 0x1175, 0x11b9, 0, -#undef V11675 -#define V11675 (V + 45402) - 0x1111, 0x1175, 0x11ba, 0, -#undef V11676 -#define V11676 (V + 45406) - 0x1111, 0x1175, 0x11bb, 0, -#undef V11677 -#define V11677 (V + 45410) - 0x1111, 0x1175, 0x11bc, 0, -#undef V11678 -#define V11678 (V + 45414) - 0x1111, 0x1175, 0x11bd, 0, -#undef V11679 -#define V11679 (V + 45418) - 0x1111, 0x1175, 0x11be, 0, -#undef V11680 -#define V11680 (V + 45422) - 0x1111, 0x1175, 0x11bf, 0, -#undef V11681 -#define V11681 (V + 45426) - 0x1111, 0x1175, 0x11c0, 0, -#undef V11682 -#define V11682 (V + 45430) - 0x1111, 0x1175, 0x11c1, 0, -#undef V11683 -#define V11683 (V + 45434) - 0x1111, 0x1175, 0x11c2, 0, -#undef V11684 -#define V11684 (V + 45438) - 0x1112, 0x1161, 0, -#undef V11685 -#define V11685 (V + 45441) - 0x1112, 0x1161, 0x11a8, 0, -#undef V11686 -#define V11686 (V + 45445) - 0x1112, 0x1161, 0x11a9, 0, -#undef V11687 -#define V11687 (V + 45449) - 0x1112, 0x1161, 0x11aa, 0, -#undef V11688 -#define V11688 (V + 45453) - 0x1112, 0x1161, 0x11ab, 0, -#undef V11689 -#define V11689 (V + 45457) - 0x1112, 0x1161, 0x11ac, 0, -#undef V11690 -#define V11690 (V + 45461) - 0x1112, 0x1161, 0x11ad, 0, -#undef V11691 -#define V11691 (V + 45465) - 0x1112, 0x1161, 0x11ae, 0, -#undef V11692 -#define V11692 (V + 45469) - 0x1112, 0x1161, 0x11af, 0, -#undef V11693 -#define V11693 (V + 45473) - 0x1112, 0x1161, 0x11b0, 0, -#undef V11694 -#define V11694 (V + 45477) - 0x1112, 0x1161, 0x11b1, 0, -#undef V11695 -#define V11695 (V + 45481) - 0x1112, 0x1161, 0x11b2, 0, -#undef V11696 -#define V11696 (V + 45485) - 0x1112, 0x1161, 0x11b3, 0, -#undef V11697 -#define V11697 (V + 45489) - 0x1112, 0x1161, 0x11b4, 0, -#undef V11698 -#define V11698 (V + 45493) - 0x1112, 0x1161, 0x11b5, 0, -#undef V11699 -#define V11699 (V + 45497) - 0x1112, 0x1161, 0x11b6, 0, -#undef V11700 -#define V11700 (V + 45501) - 0x1112, 0x1161, 0x11b7, 0, -#undef V11701 -#define V11701 (V + 45505) - 0x1112, 0x1161, 0x11b8, 0, -#undef V11702 -#define V11702 (V + 45509) - 0x1112, 0x1161, 0x11b9, 0, -#undef V11703 -#define V11703 (V + 45513) - 0x1112, 0x1161, 0x11ba, 0, -#undef V11704 -#define V11704 (V + 45517) - 0x1112, 0x1161, 0x11bb, 0, -#undef V11705 -#define V11705 (V + 45521) - 0x1112, 0x1161, 0x11bc, 0, -#undef V11706 -#define V11706 (V + 45525) - 0x1112, 0x1161, 0x11bd, 0, -#undef V11707 -#define V11707 (V + 45529) - 0x1112, 0x1161, 0x11be, 0, -#undef V11708 -#define V11708 (V + 45533) - 0x1112, 0x1161, 0x11bf, 0, -#undef V11709 -#define V11709 (V + 45537) - 0x1112, 0x1161, 0x11c0, 0, -#undef V11710 -#define V11710 (V + 45541) - 0x1112, 0x1161, 0x11c1, 0, -#undef V11711 -#define V11711 (V + 45545) - 0x1112, 0x1161, 0x11c2, 0, -#undef V11712 -#define V11712 (V + 45549) - 0x1112, 0x1162, 0, -#undef V11713 -#define V11713 (V + 45552) - 0x1112, 0x1162, 0x11a8, 0, -#undef V11714 -#define V11714 (V + 45556) - 0x1112, 0x1162, 0x11a9, 0, -#undef V11715 -#define V11715 (V + 45560) - 0x1112, 0x1162, 0x11aa, 0, -#undef V11716 -#define V11716 (V + 45564) - 0x1112, 0x1162, 0x11ab, 0, -#undef V11717 -#define V11717 (V + 45568) - 0x1112, 0x1162, 0x11ac, 0, -#undef V11718 -#define V11718 (V + 45572) - 0x1112, 0x1162, 0x11ad, 0, -#undef V11719 -#define V11719 (V + 45576) - 0x1112, 0x1162, 0x11ae, 0, -#undef V11720 -#define V11720 (V + 45580) - 0x1112, 0x1162, 0x11af, 0, -#undef V11721 -#define V11721 (V + 45584) - 0x1112, 0x1162, 0x11b0, 0, -#undef V11722 -#define V11722 (V + 45588) - 0x1112, 0x1162, 0x11b1, 0, -#undef V11723 -#define V11723 (V + 45592) - 0x1112, 0x1162, 0x11b2, 0, -#undef V11724 -#define V11724 (V + 45596) - 0x1112, 0x1162, 0x11b3, 0, -#undef V11725 -#define V11725 (V + 45600) - 0x1112, 0x1162, 0x11b4, 0, -#undef V11726 -#define V11726 (V + 45604) - 0x1112, 0x1162, 0x11b5, 0, -#undef V11727 -#define V11727 (V + 45608) - 0x1112, 0x1162, 0x11b6, 0, -#undef V11728 -#define V11728 (V + 45612) - 0x1112, 0x1162, 0x11b7, 0, -#undef V11729 -#define V11729 (V + 45616) - 0x1112, 0x1162, 0x11b8, 0, -#undef V11730 -#define V11730 (V + 45620) - 0x1112, 0x1162, 0x11b9, 0, -#undef V11731 -#define V11731 (V + 45624) - 0x1112, 0x1162, 0x11ba, 0, -#undef V11732 -#define V11732 (V + 45628) - 0x1112, 0x1162, 0x11bb, 0, -#undef V11733 -#define V11733 (V + 45632) - 0x1112, 0x1162, 0x11bc, 0, -#undef V11734 -#define V11734 (V + 45636) - 0x1112, 0x1162, 0x11bd, 0, -#undef V11735 -#define V11735 (V + 45640) - 0x1112, 0x1162, 0x11be, 0, -#undef V11736 -#define V11736 (V + 45644) - 0x1112, 0x1162, 0x11bf, 0, -#undef V11737 -#define V11737 (V + 45648) - 0x1112, 0x1162, 0x11c0, 0, -#undef V11738 -#define V11738 (V + 45652) - 0x1112, 0x1162, 0x11c1, 0, -#undef V11739 -#define V11739 (V + 45656) - 0x1112, 0x1162, 0x11c2, 0, -#undef V11740 -#define V11740 (V + 45660) - 0x1112, 0x1163, 0, -#undef V11741 -#define V11741 (V + 45663) - 0x1112, 0x1163, 0x11a8, 0, -#undef V11742 -#define V11742 (V + 45667) - 0x1112, 0x1163, 0x11a9, 0, -#undef V11743 -#define V11743 (V + 45671) - 0x1112, 0x1163, 0x11aa, 0, -#undef V11744 -#define V11744 (V + 45675) - 0x1112, 0x1163, 0x11ab, 0, -#undef V11745 -#define V11745 (V + 45679) - 0x1112, 0x1163, 0x11ac, 0, -#undef V11746 -#define V11746 (V + 45683) - 0x1112, 0x1163, 0x11ad, 0, -#undef V11747 -#define V11747 (V + 45687) - 0x1112, 0x1163, 0x11ae, 0, -#undef V11748 -#define V11748 (V + 45691) - 0x1112, 0x1163, 0x11af, 0, -#undef V11749 -#define V11749 (V + 45695) - 0x1112, 0x1163, 0x11b0, 0, -#undef V11750 -#define V11750 (V + 45699) - 0x1112, 0x1163, 0x11b1, 0, -#undef V11751 -#define V11751 (V + 45703) - 0x1112, 0x1163, 0x11b2, 0, -#undef V11752 -#define V11752 (V + 45707) - 0x1112, 0x1163, 0x11b3, 0, -#undef V11753 -#define V11753 (V + 45711) - 0x1112, 0x1163, 0x11b4, 0, -#undef V11754 -#define V11754 (V + 45715) - 0x1112, 0x1163, 0x11b5, 0, -#undef V11755 -#define V11755 (V + 45719) - 0x1112, 0x1163, 0x11b6, 0, -#undef V11756 -#define V11756 (V + 45723) - 0x1112, 0x1163, 0x11b7, 0, -#undef V11757 -#define V11757 (V + 45727) - 0x1112, 0x1163, 0x11b8, 0, -#undef V11758 -#define V11758 (V + 45731) - 0x1112, 0x1163, 0x11b9, 0, -#undef V11759 -#define V11759 (V + 45735) - 0x1112, 0x1163, 0x11ba, 0, -#undef V11760 -#define V11760 (V + 45739) - 0x1112, 0x1163, 0x11bb, 0, -#undef V11761 -#define V11761 (V + 45743) - 0x1112, 0x1163, 0x11bc, 0, -#undef V11762 -#define V11762 (V + 45747) - 0x1112, 0x1163, 0x11bd, 0, -#undef V11763 -#define V11763 (V + 45751) - 0x1112, 0x1163, 0x11be, 0, -#undef V11764 -#define V11764 (V + 45755) - 0x1112, 0x1163, 0x11bf, 0, -#undef V11765 -#define V11765 (V + 45759) - 0x1112, 0x1163, 0x11c0, 0, -#undef V11766 -#define V11766 (V + 45763) - 0x1112, 0x1163, 0x11c1, 0, -#undef V11767 -#define V11767 (V + 45767) - 0x1112, 0x1163, 0x11c2, 0, -#undef V11768 -#define V11768 (V + 45771) - 0x1112, 0x1164, 0, -#undef V11769 -#define V11769 (V + 45774) - 0x1112, 0x1164, 0x11a8, 0, -#undef V11770 -#define V11770 (V + 45778) - 0x1112, 0x1164, 0x11a9, 0, -#undef V11771 -#define V11771 (V + 45782) - 0x1112, 0x1164, 0x11aa, 0, -#undef V11772 -#define V11772 (V + 45786) - 0x1112, 0x1164, 0x11ab, 0, -#undef V11773 -#define V11773 (V + 45790) - 0x1112, 0x1164, 0x11ac, 0, -#undef V11774 -#define V11774 (V + 45794) - 0x1112, 0x1164, 0x11ad, 0, -#undef V11775 -#define V11775 (V + 45798) - 0x1112, 0x1164, 0x11ae, 0, -#undef V11776 -#define V11776 (V + 45802) - 0x1112, 0x1164, 0x11af, 0, -#undef V11777 -#define V11777 (V + 45806) - 0x1112, 0x1164, 0x11b0, 0, -#undef V11778 -#define V11778 (V + 45810) - 0x1112, 0x1164, 0x11b1, 0, -#undef V11779 -#define V11779 (V + 45814) - 0x1112, 0x1164, 0x11b2, 0, -#undef V11780 -#define V11780 (V + 45818) - 0x1112, 0x1164, 0x11b3, 0, -#undef V11781 -#define V11781 (V + 45822) - 0x1112, 0x1164, 0x11b4, 0, -#undef V11782 -#define V11782 (V + 45826) - 0x1112, 0x1164, 0x11b5, 0, -#undef V11783 -#define V11783 (V + 45830) - 0x1112, 0x1164, 0x11b6, 0, -#undef V11784 -#define V11784 (V + 45834) - 0x1112, 0x1164, 0x11b7, 0, -#undef V11785 -#define V11785 (V + 45838) - 0x1112, 0x1164, 0x11b8, 0, -#undef V11786 -#define V11786 (V + 45842) - 0x1112, 0x1164, 0x11b9, 0, -#undef V11787 -#define V11787 (V + 45846) - 0x1112, 0x1164, 0x11ba, 0, -#undef V11788 -#define V11788 (V + 45850) - 0x1112, 0x1164, 0x11bb, 0, -#undef V11789 -#define V11789 (V + 45854) - 0x1112, 0x1164, 0x11bc, 0, -#undef V11790 -#define V11790 (V + 45858) - 0x1112, 0x1164, 0x11bd, 0, -#undef V11791 -#define V11791 (V + 45862) - 0x1112, 0x1164, 0x11be, 0, -#undef V11792 -#define V11792 (V + 45866) - 0x1112, 0x1164, 0x11bf, 0, -#undef V11793 -#define V11793 (V + 45870) - 0x1112, 0x1164, 0x11c0, 0, -#undef V11794 -#define V11794 (V + 45874) - 0x1112, 0x1164, 0x11c1, 0, -#undef V11795 -#define V11795 (V + 45878) - 0x1112, 0x1164, 0x11c2, 0, -#undef V11796 -#define V11796 (V + 45882) - 0x1112, 0x1165, 0, -#undef V11797 -#define V11797 (V + 45885) - 0x1112, 0x1165, 0x11a8, 0, -#undef V11798 -#define V11798 (V + 45889) - 0x1112, 0x1165, 0x11a9, 0, -#undef V11799 -#define V11799 (V + 45893) - 0x1112, 0x1165, 0x11aa, 0, -#undef V11800 -#define V11800 (V + 45897) - 0x1112, 0x1165, 0x11ab, 0, -#undef V11801 -#define V11801 (V + 45901) - 0x1112, 0x1165, 0x11ac, 0, -#undef V11802 -#define V11802 (V + 45905) - 0x1112, 0x1165, 0x11ad, 0, -#undef V11803 -#define V11803 (V + 45909) - 0x1112, 0x1165, 0x11ae, 0, -#undef V11804 -#define V11804 (V + 45913) - 0x1112, 0x1165, 0x11af, 0, -#undef V11805 -#define V11805 (V + 45917) - 0x1112, 0x1165, 0x11b0, 0, -#undef V11806 -#define V11806 (V + 45921) - 0x1112, 0x1165, 0x11b1, 0, -#undef V11807 -#define V11807 (V + 45925) - 0x1112, 0x1165, 0x11b2, 0, -#undef V11808 -#define V11808 (V + 45929) - 0x1112, 0x1165, 0x11b3, 0, -#undef V11809 -#define V11809 (V + 45933) - 0x1112, 0x1165, 0x11b4, 0, -#undef V11810 -#define V11810 (V + 45937) - 0x1112, 0x1165, 0x11b5, 0, -#undef V11811 -#define V11811 (V + 45941) - 0x1112, 0x1165, 0x11b6, 0, -#undef V11812 -#define V11812 (V + 45945) - 0x1112, 0x1165, 0x11b7, 0, -#undef V11813 -#define V11813 (V + 45949) - 0x1112, 0x1165, 0x11b8, 0, -#undef V11814 -#define V11814 (V + 45953) - 0x1112, 0x1165, 0x11b9, 0, -#undef V11815 -#define V11815 (V + 45957) - 0x1112, 0x1165, 0x11ba, 0, -#undef V11816 -#define V11816 (V + 45961) - 0x1112, 0x1165, 0x11bb, 0, -#undef V11817 -#define V11817 (V + 45965) - 0x1112, 0x1165, 0x11bc, 0, -#undef V11818 -#define V11818 (V + 45969) - 0x1112, 0x1165, 0x11bd, 0, -#undef V11819 -#define V11819 (V + 45973) - 0x1112, 0x1165, 0x11be, 0, -#undef V11820 -#define V11820 (V + 45977) - 0x1112, 0x1165, 0x11bf, 0, -#undef V11821 -#define V11821 (V + 45981) - 0x1112, 0x1165, 0x11c0, 0, -#undef V11822 -#define V11822 (V + 45985) - 0x1112, 0x1165, 0x11c1, 0, -#undef V11823 -#define V11823 (V + 45989) - 0x1112, 0x1165, 0x11c2, 0, -#undef V11824 -#define V11824 (V + 45993) - 0x1112, 0x1166, 0, -#undef V11825 -#define V11825 (V + 45996) - 0x1112, 0x1166, 0x11a8, 0, -#undef V11826 -#define V11826 (V + 46000) - 0x1112, 0x1166, 0x11a9, 0, -#undef V11827 -#define V11827 (V + 46004) - 0x1112, 0x1166, 0x11aa, 0, -#undef V11828 -#define V11828 (V + 46008) - 0x1112, 0x1166, 0x11ab, 0, -#undef V11829 -#define V11829 (V + 46012) - 0x1112, 0x1166, 0x11ac, 0, -#undef V11830 -#define V11830 (V + 46016) - 0x1112, 0x1166, 0x11ad, 0, -#undef V11831 -#define V11831 (V + 46020) - 0x1112, 0x1166, 0x11ae, 0, -#undef V11832 -#define V11832 (V + 46024) - 0x1112, 0x1166, 0x11af, 0, -#undef V11833 -#define V11833 (V + 46028) - 0x1112, 0x1166, 0x11b0, 0, -#undef V11834 -#define V11834 (V + 46032) - 0x1112, 0x1166, 0x11b1, 0, -#undef V11835 -#define V11835 (V + 46036) - 0x1112, 0x1166, 0x11b2, 0, -#undef V11836 -#define V11836 (V + 46040) - 0x1112, 0x1166, 0x11b3, 0, -#undef V11837 -#define V11837 (V + 46044) - 0x1112, 0x1166, 0x11b4, 0, -#undef V11838 -#define V11838 (V + 46048) - 0x1112, 0x1166, 0x11b5, 0, -#undef V11839 -#define V11839 (V + 46052) - 0x1112, 0x1166, 0x11b6, 0, -#undef V11840 -#define V11840 (V + 46056) - 0x1112, 0x1166, 0x11b7, 0, -#undef V11841 -#define V11841 (V + 46060) - 0x1112, 0x1166, 0x11b8, 0, -#undef V11842 -#define V11842 (V + 46064) - 0x1112, 0x1166, 0x11b9, 0, -#undef V11843 -#define V11843 (V + 46068) - 0x1112, 0x1166, 0x11ba, 0, -#undef V11844 -#define V11844 (V + 46072) - 0x1112, 0x1166, 0x11bb, 0, -#undef V11845 -#define V11845 (V + 46076) - 0x1112, 0x1166, 0x11bc, 0, -#undef V11846 -#define V11846 (V + 46080) - 0x1112, 0x1166, 0x11bd, 0, -#undef V11847 -#define V11847 (V + 46084) - 0x1112, 0x1166, 0x11be, 0, -#undef V11848 -#define V11848 (V + 46088) - 0x1112, 0x1166, 0x11bf, 0, -#undef V11849 -#define V11849 (V + 46092) - 0x1112, 0x1166, 0x11c0, 0, -#undef V11850 -#define V11850 (V + 46096) - 0x1112, 0x1166, 0x11c1, 0, -#undef V11851 -#define V11851 (V + 46100) - 0x1112, 0x1166, 0x11c2, 0, -#undef V11852 -#define V11852 (V + 46104) - 0x1112, 0x1167, 0, -#undef V11853 -#define V11853 (V + 46107) - 0x1112, 0x1167, 0x11a8, 0, -#undef V11854 -#define V11854 (V + 46111) - 0x1112, 0x1167, 0x11a9, 0, -#undef V11855 -#define V11855 (V + 46115) - 0x1112, 0x1167, 0x11aa, 0, -#undef V11856 -#define V11856 (V + 46119) - 0x1112, 0x1167, 0x11ab, 0, -#undef V11857 -#define V11857 (V + 46123) - 0x1112, 0x1167, 0x11ac, 0, -#undef V11858 -#define V11858 (V + 46127) - 0x1112, 0x1167, 0x11ad, 0, -#undef V11859 -#define V11859 (V + 46131) - 0x1112, 0x1167, 0x11ae, 0, -#undef V11860 -#define V11860 (V + 46135) - 0x1112, 0x1167, 0x11af, 0, -#undef V11861 -#define V11861 (V + 46139) - 0x1112, 0x1167, 0x11b0, 0, -#undef V11862 -#define V11862 (V + 46143) - 0x1112, 0x1167, 0x11b1, 0, -#undef V11863 -#define V11863 (V + 46147) - 0x1112, 0x1167, 0x11b2, 0, -#undef V11864 -#define V11864 (V + 46151) - 0x1112, 0x1167, 0x11b3, 0, -#undef V11865 -#define V11865 (V + 46155) - 0x1112, 0x1167, 0x11b4, 0, -#undef V11866 -#define V11866 (V + 46159) - 0x1112, 0x1167, 0x11b5, 0, -#undef V11867 -#define V11867 (V + 46163) - 0x1112, 0x1167, 0x11b6, 0, -#undef V11868 -#define V11868 (V + 46167) - 0x1112, 0x1167, 0x11b7, 0, -#undef V11869 -#define V11869 (V + 46171) - 0x1112, 0x1167, 0x11b8, 0, -#undef V11870 -#define V11870 (V + 46175) - 0x1112, 0x1167, 0x11b9, 0, -#undef V11871 -#define V11871 (V + 46179) - 0x1112, 0x1167, 0x11ba, 0, -#undef V11872 -#define V11872 (V + 46183) - 0x1112, 0x1167, 0x11bb, 0, -#undef V11873 -#define V11873 (V + 46187) - 0x1112, 0x1167, 0x11bc, 0, -#undef V11874 -#define V11874 (V + 46191) - 0x1112, 0x1167, 0x11bd, 0, -#undef V11875 -#define V11875 (V + 46195) - 0x1112, 0x1167, 0x11be, 0, -#undef V11876 -#define V11876 (V + 46199) - 0x1112, 0x1167, 0x11bf, 0, -#undef V11877 -#define V11877 (V + 46203) - 0x1112, 0x1167, 0x11c0, 0, -#undef V11878 -#define V11878 (V + 46207) - 0x1112, 0x1167, 0x11c1, 0, -#undef V11879 -#define V11879 (V + 46211) - 0x1112, 0x1167, 0x11c2, 0, -#undef V11880 -#define V11880 (V + 46215) - 0x1112, 0x1168, 0, -#undef V11881 -#define V11881 (V + 46218) - 0x1112, 0x1168, 0x11a8, 0, -#undef V11882 -#define V11882 (V + 46222) - 0x1112, 0x1168, 0x11a9, 0, -#undef V11883 -#define V11883 (V + 46226) - 0x1112, 0x1168, 0x11aa, 0, -#undef V11884 -#define V11884 (V + 46230) - 0x1112, 0x1168, 0x11ab, 0, -#undef V11885 -#define V11885 (V + 46234) - 0x1112, 0x1168, 0x11ac, 0, -#undef V11886 -#define V11886 (V + 46238) - 0x1112, 0x1168, 0x11ad, 0, -#undef V11887 -#define V11887 (V + 46242) - 0x1112, 0x1168, 0x11ae, 0, -#undef V11888 -#define V11888 (V + 46246) - 0x1112, 0x1168, 0x11af, 0, -#undef V11889 -#define V11889 (V + 46250) - 0x1112, 0x1168, 0x11b0, 0, -#undef V11890 -#define V11890 (V + 46254) - 0x1112, 0x1168, 0x11b1, 0, -#undef V11891 -#define V11891 (V + 46258) - 0x1112, 0x1168, 0x11b2, 0, -#undef V11892 -#define V11892 (V + 46262) - 0x1112, 0x1168, 0x11b3, 0, -#undef V11893 -#define V11893 (V + 46266) - 0x1112, 0x1168, 0x11b4, 0, -#undef V11894 -#define V11894 (V + 46270) - 0x1112, 0x1168, 0x11b5, 0, -#undef V11895 -#define V11895 (V + 46274) - 0x1112, 0x1168, 0x11b6, 0, -#undef V11896 -#define V11896 (V + 46278) - 0x1112, 0x1168, 0x11b7, 0, -#undef V11897 -#define V11897 (V + 46282) - 0x1112, 0x1168, 0x11b8, 0, -#undef V11898 -#define V11898 (V + 46286) - 0x1112, 0x1168, 0x11b9, 0, -#undef V11899 -#define V11899 (V + 46290) - 0x1112, 0x1168, 0x11ba, 0, -#undef V11900 -#define V11900 (V + 46294) - 0x1112, 0x1168, 0x11bb, 0, -#undef V11901 -#define V11901 (V + 46298) - 0x1112, 0x1168, 0x11bc, 0, -#undef V11902 -#define V11902 (V + 46302) - 0x1112, 0x1168, 0x11bd, 0, -#undef V11903 -#define V11903 (V + 46306) - 0x1112, 0x1168, 0x11be, 0, -#undef V11904 -#define V11904 (V + 46310) - 0x1112, 0x1168, 0x11bf, 0, -#undef V11905 -#define V11905 (V + 46314) - 0x1112, 0x1168, 0x11c0, 0, -#undef V11906 -#define V11906 (V + 46318) - 0x1112, 0x1168, 0x11c1, 0, -#undef V11907 -#define V11907 (V + 46322) - 0x1112, 0x1168, 0x11c2, 0, -#undef V11908 -#define V11908 (V + 46326) - 0x1112, 0x1169, 0, -#undef V11909 -#define V11909 (V + 46329) - 0x1112, 0x1169, 0x11a8, 0, -#undef V11910 -#define V11910 (V + 46333) - 0x1112, 0x1169, 0x11a9, 0, -#undef V11911 -#define V11911 (V + 46337) - 0x1112, 0x1169, 0x11aa, 0, -#undef V11912 -#define V11912 (V + 46341) - 0x1112, 0x1169, 0x11ab, 0, -#undef V11913 -#define V11913 (V + 46345) - 0x1112, 0x1169, 0x11ac, 0, -#undef V11914 -#define V11914 (V + 46349) - 0x1112, 0x1169, 0x11ad, 0, -#undef V11915 -#define V11915 (V + 46353) - 0x1112, 0x1169, 0x11ae, 0, -#undef V11916 -#define V11916 (V + 46357) - 0x1112, 0x1169, 0x11af, 0, -#undef V11917 -#define V11917 (V + 46361) - 0x1112, 0x1169, 0x11b0, 0, -#undef V11918 -#define V11918 (V + 46365) - 0x1112, 0x1169, 0x11b1, 0, -#undef V11919 -#define V11919 (V + 46369) - 0x1112, 0x1169, 0x11b2, 0, -#undef V11920 -#define V11920 (V + 46373) - 0x1112, 0x1169, 0x11b3, 0, -#undef V11921 -#define V11921 (V + 46377) - 0x1112, 0x1169, 0x11b4, 0, -#undef V11922 -#define V11922 (V + 46381) - 0x1112, 0x1169, 0x11b5, 0, -#undef V11923 -#define V11923 (V + 46385) - 0x1112, 0x1169, 0x11b6, 0, -#undef V11924 -#define V11924 (V + 46389) - 0x1112, 0x1169, 0x11b7, 0, -#undef V11925 -#define V11925 (V + 46393) - 0x1112, 0x1169, 0x11b8, 0, -#undef V11926 -#define V11926 (V + 46397) - 0x1112, 0x1169, 0x11b9, 0, -#undef V11927 -#define V11927 (V + 46401) - 0x1112, 0x1169, 0x11ba, 0, -#undef V11928 -#define V11928 (V + 46405) - 0x1112, 0x1169, 0x11bb, 0, -#undef V11929 -#define V11929 (V + 46409) - 0x1112, 0x1169, 0x11bc, 0, -#undef V11930 -#define V11930 (V + 46413) - 0x1112, 0x1169, 0x11bd, 0, -#undef V11931 -#define V11931 (V + 46417) - 0x1112, 0x1169, 0x11be, 0, -#undef V11932 -#define V11932 (V + 46421) - 0x1112, 0x1169, 0x11bf, 0, -#undef V11933 -#define V11933 (V + 46425) - 0x1112, 0x1169, 0x11c0, 0, -#undef V11934 -#define V11934 (V + 46429) - 0x1112, 0x1169, 0x11c1, 0, -#undef V11935 -#define V11935 (V + 46433) - 0x1112, 0x1169, 0x11c2, 0, -#undef V11936 -#define V11936 (V + 46437) - 0x1112, 0x116a, 0, -#undef V11937 -#define V11937 (V + 46440) - 0x1112, 0x116a, 0x11a8, 0, -#undef V11938 -#define V11938 (V + 46444) - 0x1112, 0x116a, 0x11a9, 0, -#undef V11939 -#define V11939 (V + 46448) - 0x1112, 0x116a, 0x11aa, 0, -#undef V11940 -#define V11940 (V + 46452) - 0x1112, 0x116a, 0x11ab, 0, -#undef V11941 -#define V11941 (V + 46456) - 0x1112, 0x116a, 0x11ac, 0, -#undef V11942 -#define V11942 (V + 46460) - 0x1112, 0x116a, 0x11ad, 0, -#undef V11943 -#define V11943 (V + 46464) - 0x1112, 0x116a, 0x11ae, 0, -#undef V11944 -#define V11944 (V + 46468) - 0x1112, 0x116a, 0x11af, 0, -#undef V11945 -#define V11945 (V + 46472) - 0x1112, 0x116a, 0x11b0, 0, -#undef V11946 -#define V11946 (V + 46476) - 0x1112, 0x116a, 0x11b1, 0, -#undef V11947 -#define V11947 (V + 46480) - 0x1112, 0x116a, 0x11b2, 0, -#undef V11948 -#define V11948 (V + 46484) - 0x1112, 0x116a, 0x11b3, 0, -#undef V11949 -#define V11949 (V + 46488) - 0x1112, 0x116a, 0x11b4, 0, -#undef V11950 -#define V11950 (V + 46492) - 0x1112, 0x116a, 0x11b5, 0, -#undef V11951 -#define V11951 (V + 46496) - 0x1112, 0x116a, 0x11b6, 0, -#undef V11952 -#define V11952 (V + 46500) - 0x1112, 0x116a, 0x11b7, 0, -#undef V11953 -#define V11953 (V + 46504) - 0x1112, 0x116a, 0x11b8, 0, -#undef V11954 -#define V11954 (V + 46508) - 0x1112, 0x116a, 0x11b9, 0, -#undef V11955 -#define V11955 (V + 46512) - 0x1112, 0x116a, 0x11ba, 0, -#undef V11956 -#define V11956 (V + 46516) - 0x1112, 0x116a, 0x11bb, 0, -#undef V11957 -#define V11957 (V + 46520) - 0x1112, 0x116a, 0x11bc, 0, -#undef V11958 -#define V11958 (V + 46524) - 0x1112, 0x116a, 0x11bd, 0, -#undef V11959 -#define V11959 (V + 46528) - 0x1112, 0x116a, 0x11be, 0, -#undef V11960 -#define V11960 (V + 46532) - 0x1112, 0x116a, 0x11bf, 0, -#undef V11961 -#define V11961 (V + 46536) - 0x1112, 0x116a, 0x11c0, 0, -#undef V11962 -#define V11962 (V + 46540) - 0x1112, 0x116a, 0x11c1, 0, -#undef V11963 -#define V11963 (V + 46544) - 0x1112, 0x116a, 0x11c2, 0, -#undef V11964 -#define V11964 (V + 46548) - 0x1112, 0x116b, 0, -#undef V11965 -#define V11965 (V + 46551) - 0x1112, 0x116b, 0x11a8, 0, -#undef V11966 -#define V11966 (V + 46555) - 0x1112, 0x116b, 0x11a9, 0, -#undef V11967 -#define V11967 (V + 46559) - 0x1112, 0x116b, 0x11aa, 0, -#undef V11968 -#define V11968 (V + 46563) - 0x1112, 0x116b, 0x11ab, 0, -#undef V11969 -#define V11969 (V + 46567) - 0x1112, 0x116b, 0x11ac, 0, -#undef V11970 -#define V11970 (V + 46571) - 0x1112, 0x116b, 0x11ad, 0, -#undef V11971 -#define V11971 (V + 46575) - 0x1112, 0x116b, 0x11ae, 0, -#undef V11972 -#define V11972 (V + 46579) - 0x1112, 0x116b, 0x11af, 0, -#undef V11973 -#define V11973 (V + 46583) - 0x1112, 0x116b, 0x11b0, 0, -#undef V11974 -#define V11974 (V + 46587) - 0x1112, 0x116b, 0x11b1, 0, -#undef V11975 -#define V11975 (V + 46591) - 0x1112, 0x116b, 0x11b2, 0, -#undef V11976 -#define V11976 (V + 46595) - 0x1112, 0x116b, 0x11b3, 0, -#undef V11977 -#define V11977 (V + 46599) - 0x1112, 0x116b, 0x11b4, 0, -#undef V11978 -#define V11978 (V + 46603) - 0x1112, 0x116b, 0x11b5, 0, -#undef V11979 -#define V11979 (V + 46607) - 0x1112, 0x116b, 0x11b6, 0, -#undef V11980 -#define V11980 (V + 46611) - 0x1112, 0x116b, 0x11b7, 0, -#undef V11981 -#define V11981 (V + 46615) - 0x1112, 0x116b, 0x11b8, 0, -#undef V11982 -#define V11982 (V + 46619) - 0x1112, 0x116b, 0x11b9, 0, -#undef V11983 -#define V11983 (V + 46623) - 0x1112, 0x116b, 0x11ba, 0, -#undef V11984 -#define V11984 (V + 46627) - 0x1112, 0x116b, 0x11bb, 0, -#undef V11985 -#define V11985 (V + 46631) - 0x1112, 0x116b, 0x11bc, 0, -#undef V11986 -#define V11986 (V + 46635) - 0x1112, 0x116b, 0x11bd, 0, -#undef V11987 -#define V11987 (V + 46639) - 0x1112, 0x116b, 0x11be, 0, -#undef V11988 -#define V11988 (V + 46643) - 0x1112, 0x116b, 0x11bf, 0, -#undef V11989 -#define V11989 (V + 46647) - 0x1112, 0x116b, 0x11c0, 0, -#undef V11990 -#define V11990 (V + 46651) - 0x1112, 0x116b, 0x11c1, 0, -#undef V11991 -#define V11991 (V + 46655) - 0x1112, 0x116b, 0x11c2, 0, -#undef V11992 -#define V11992 (V + 46659) - 0x1112, 0x116c, 0, -#undef V11993 -#define V11993 (V + 46662) - 0x1112, 0x116c, 0x11a8, 0, -#undef V11994 -#define V11994 (V + 46666) - 0x1112, 0x116c, 0x11a9, 0, -#undef V11995 -#define V11995 (V + 46670) - 0x1112, 0x116c, 0x11aa, 0, -#undef V11996 -#define V11996 (V + 46674) - 0x1112, 0x116c, 0x11ab, 0, -#undef V11997 -#define V11997 (V + 46678) - 0x1112, 0x116c, 0x11ac, 0, -#undef V11998 -#define V11998 (V + 46682) - 0x1112, 0x116c, 0x11ad, 0, -#undef V11999 -#define V11999 (V + 46686) - 0x1112, 0x116c, 0x11ae, 0, -#undef V12000 -#define V12000 (V + 46690) - 0x1112, 0x116c, 0x11af, 0, -#undef V12001 -#define V12001 (V + 46694) - 0x1112, 0x116c, 0x11b0, 0, -#undef V12002 -#define V12002 (V + 46698) - 0x1112, 0x116c, 0x11b1, 0, -#undef V12003 -#define V12003 (V + 46702) - 0x1112, 0x116c, 0x11b2, 0, -#undef V12004 -#define V12004 (V + 46706) - 0x1112, 0x116c, 0x11b3, 0, -#undef V12005 -#define V12005 (V + 46710) - 0x1112, 0x116c, 0x11b4, 0, -#undef V12006 -#define V12006 (V + 46714) - 0x1112, 0x116c, 0x11b5, 0, -#undef V12007 -#define V12007 (V + 46718) - 0x1112, 0x116c, 0x11b6, 0, -#undef V12008 -#define V12008 (V + 46722) - 0x1112, 0x116c, 0x11b7, 0, -#undef V12009 -#define V12009 (V + 46726) - 0x1112, 0x116c, 0x11b8, 0, -#undef V12010 -#define V12010 (V + 46730) - 0x1112, 0x116c, 0x11b9, 0, -#undef V12011 -#define V12011 (V + 46734) - 0x1112, 0x116c, 0x11ba, 0, -#undef V12012 -#define V12012 (V + 46738) - 0x1112, 0x116c, 0x11bb, 0, -#undef V12013 -#define V12013 (V + 46742) - 0x1112, 0x116c, 0x11bc, 0, -#undef V12014 -#define V12014 (V + 46746) - 0x1112, 0x116c, 0x11bd, 0, -#undef V12015 -#define V12015 (V + 46750) - 0x1112, 0x116c, 0x11be, 0, -#undef V12016 -#define V12016 (V + 46754) - 0x1112, 0x116c, 0x11bf, 0, -#undef V12017 -#define V12017 (V + 46758) - 0x1112, 0x116c, 0x11c0, 0, -#undef V12018 -#define V12018 (V + 46762) - 0x1112, 0x116c, 0x11c1, 0, -#undef V12019 -#define V12019 (V + 46766) - 0x1112, 0x116c, 0x11c2, 0, -#undef V12020 -#define V12020 (V + 46770) - 0x1112, 0x116d, 0, -#undef V12021 -#define V12021 (V + 46773) - 0x1112, 0x116d, 0x11a8, 0, -#undef V12022 -#define V12022 (V + 46777) - 0x1112, 0x116d, 0x11a9, 0, -#undef V12023 -#define V12023 (V + 46781) - 0x1112, 0x116d, 0x11aa, 0, -#undef V12024 -#define V12024 (V + 46785) - 0x1112, 0x116d, 0x11ab, 0, -#undef V12025 -#define V12025 (V + 46789) - 0x1112, 0x116d, 0x11ac, 0, -#undef V12026 -#define V12026 (V + 46793) - 0x1112, 0x116d, 0x11ad, 0, -#undef V12027 -#define V12027 (V + 46797) - 0x1112, 0x116d, 0x11ae, 0, -#undef V12028 -#define V12028 (V + 46801) - 0x1112, 0x116d, 0x11af, 0, -#undef V12029 -#define V12029 (V + 46805) - 0x1112, 0x116d, 0x11b0, 0, -#undef V12030 -#define V12030 (V + 46809) - 0x1112, 0x116d, 0x11b1, 0, -#undef V12031 -#define V12031 (V + 46813) - 0x1112, 0x116d, 0x11b2, 0, -#undef V12032 -#define V12032 (V + 46817) - 0x1112, 0x116d, 0x11b3, 0, -#undef V12033 -#define V12033 (V + 46821) - 0x1112, 0x116d, 0x11b4, 0, -#undef V12034 -#define V12034 (V + 46825) - 0x1112, 0x116d, 0x11b5, 0, -#undef V12035 -#define V12035 (V + 46829) - 0x1112, 0x116d, 0x11b6, 0, -#undef V12036 -#define V12036 (V + 46833) - 0x1112, 0x116d, 0x11b7, 0, -#undef V12037 -#define V12037 (V + 46837) - 0x1112, 0x116d, 0x11b8, 0, -#undef V12038 -#define V12038 (V + 46841) - 0x1112, 0x116d, 0x11b9, 0, -#undef V12039 -#define V12039 (V + 46845) - 0x1112, 0x116d, 0x11ba, 0, -#undef V12040 -#define V12040 (V + 46849) - 0x1112, 0x116d, 0x11bb, 0, -#undef V12041 -#define V12041 (V + 46853) - 0x1112, 0x116d, 0x11bc, 0, -#undef V12042 -#define V12042 (V + 46857) - 0x1112, 0x116d, 0x11bd, 0, -#undef V12043 -#define V12043 (V + 46861) - 0x1112, 0x116d, 0x11be, 0, -#undef V12044 -#define V12044 (V + 46865) - 0x1112, 0x116d, 0x11bf, 0, -#undef V12045 -#define V12045 (V + 46869) - 0x1112, 0x116d, 0x11c0, 0, -#undef V12046 -#define V12046 (V + 46873) - 0x1112, 0x116d, 0x11c1, 0, -#undef V12047 -#define V12047 (V + 46877) - 0x1112, 0x116d, 0x11c2, 0, -#undef V12048 -#define V12048 (V + 46881) - 0x1112, 0x116e, 0, -#undef V12049 -#define V12049 (V + 46884) - 0x1112, 0x116e, 0x11a8, 0, -#undef V12050 -#define V12050 (V + 46888) - 0x1112, 0x116e, 0x11a9, 0, -#undef V12051 -#define V12051 (V + 46892) - 0x1112, 0x116e, 0x11aa, 0, -#undef V12052 -#define V12052 (V + 46896) - 0x1112, 0x116e, 0x11ab, 0, -#undef V12053 -#define V12053 (V + 46900) - 0x1112, 0x116e, 0x11ac, 0, -#undef V12054 -#define V12054 (V + 46904) - 0x1112, 0x116e, 0x11ad, 0, -#undef V12055 -#define V12055 (V + 46908) - 0x1112, 0x116e, 0x11ae, 0, -#undef V12056 -#define V12056 (V + 46912) - 0x1112, 0x116e, 0x11af, 0, -#undef V12057 -#define V12057 (V + 46916) - 0x1112, 0x116e, 0x11b0, 0, -#undef V12058 -#define V12058 (V + 46920) - 0x1112, 0x116e, 0x11b1, 0, -#undef V12059 -#define V12059 (V + 46924) - 0x1112, 0x116e, 0x11b2, 0, -#undef V12060 -#define V12060 (V + 46928) - 0x1112, 0x116e, 0x11b3, 0, -#undef V12061 -#define V12061 (V + 46932) - 0x1112, 0x116e, 0x11b4, 0, -#undef V12062 -#define V12062 (V + 46936) - 0x1112, 0x116e, 0x11b5, 0, -#undef V12063 -#define V12063 (V + 46940) - 0x1112, 0x116e, 0x11b6, 0, -#undef V12064 -#define V12064 (V + 46944) - 0x1112, 0x116e, 0x11b7, 0, -#undef V12065 -#define V12065 (V + 46948) - 0x1112, 0x116e, 0x11b8, 0, -#undef V12066 -#define V12066 (V + 46952) - 0x1112, 0x116e, 0x11b9, 0, -#undef V12067 -#define V12067 (V + 46956) - 0x1112, 0x116e, 0x11ba, 0, -#undef V12068 -#define V12068 (V + 46960) - 0x1112, 0x116e, 0x11bb, 0, -#undef V12069 -#define V12069 (V + 46964) - 0x1112, 0x116e, 0x11bc, 0, -#undef V12070 -#define V12070 (V + 46968) - 0x1112, 0x116e, 0x11bd, 0, -#undef V12071 -#define V12071 (V + 46972) - 0x1112, 0x116e, 0x11be, 0, -#undef V12072 -#define V12072 (V + 46976) - 0x1112, 0x116e, 0x11bf, 0, -#undef V12073 -#define V12073 (V + 46980) - 0x1112, 0x116e, 0x11c0, 0, -#undef V12074 -#define V12074 (V + 46984) - 0x1112, 0x116e, 0x11c1, 0, -#undef V12075 -#define V12075 (V + 46988) - 0x1112, 0x116e, 0x11c2, 0, -#undef V12076 -#define V12076 (V + 46992) - 0x1112, 0x116f, 0, -#undef V12077 -#define V12077 (V + 46995) - 0x1112, 0x116f, 0x11a8, 0, -#undef V12078 -#define V12078 (V + 46999) - 0x1112, 0x116f, 0x11a9, 0, -#undef V12079 -#define V12079 (V + 47003) - 0x1112, 0x116f, 0x11aa, 0, -#undef V12080 -#define V12080 (V + 47007) - 0x1112, 0x116f, 0x11ab, 0, -#undef V12081 -#define V12081 (V + 47011) - 0x1112, 0x116f, 0x11ac, 0, -#undef V12082 -#define V12082 (V + 47015) - 0x1112, 0x116f, 0x11ad, 0, -#undef V12083 -#define V12083 (V + 47019) - 0x1112, 0x116f, 0x11ae, 0, -#undef V12084 -#define V12084 (V + 47023) - 0x1112, 0x116f, 0x11af, 0, -#undef V12085 -#define V12085 (V + 47027) - 0x1112, 0x116f, 0x11b0, 0, -#undef V12086 -#define V12086 (V + 47031) - 0x1112, 0x116f, 0x11b1, 0, -#undef V12087 -#define V12087 (V + 47035) - 0x1112, 0x116f, 0x11b2, 0, -#undef V12088 -#define V12088 (V + 47039) - 0x1112, 0x116f, 0x11b3, 0, -#undef V12089 -#define V12089 (V + 47043) - 0x1112, 0x116f, 0x11b4, 0, -#undef V12090 -#define V12090 (V + 47047) - 0x1112, 0x116f, 0x11b5, 0, -#undef V12091 -#define V12091 (V + 47051) - 0x1112, 0x116f, 0x11b6, 0, -#undef V12092 -#define V12092 (V + 47055) - 0x1112, 0x116f, 0x11b7, 0, -#undef V12093 -#define V12093 (V + 47059) - 0x1112, 0x116f, 0x11b8, 0, -#undef V12094 -#define V12094 (V + 47063) - 0x1112, 0x116f, 0x11b9, 0, -#undef V12095 -#define V12095 (V + 47067) - 0x1112, 0x116f, 0x11ba, 0, -#undef V12096 -#define V12096 (V + 47071) - 0x1112, 0x116f, 0x11bb, 0, -#undef V12097 -#define V12097 (V + 47075) - 0x1112, 0x116f, 0x11bc, 0, -#undef V12098 -#define V12098 (V + 47079) - 0x1112, 0x116f, 0x11bd, 0, -#undef V12099 -#define V12099 (V + 47083) - 0x1112, 0x116f, 0x11be, 0, -#undef V12100 -#define V12100 (V + 47087) - 0x1112, 0x116f, 0x11bf, 0, -#undef V12101 -#define V12101 (V + 47091) - 0x1112, 0x116f, 0x11c0, 0, -#undef V12102 -#define V12102 (V + 47095) - 0x1112, 0x116f, 0x11c1, 0, -#undef V12103 -#define V12103 (V + 47099) - 0x1112, 0x116f, 0x11c2, 0, -#undef V12104 -#define V12104 (V + 47103) - 0x1112, 0x1170, 0, -#undef V12105 -#define V12105 (V + 47106) - 0x1112, 0x1170, 0x11a8, 0, -#undef V12106 -#define V12106 (V + 47110) - 0x1112, 0x1170, 0x11a9, 0, -#undef V12107 -#define V12107 (V + 47114) - 0x1112, 0x1170, 0x11aa, 0, -#undef V12108 -#define V12108 (V + 47118) - 0x1112, 0x1170, 0x11ab, 0, -#undef V12109 -#define V12109 (V + 47122) - 0x1112, 0x1170, 0x11ac, 0, -#undef V12110 -#define V12110 (V + 47126) - 0x1112, 0x1170, 0x11ad, 0, -#undef V12111 -#define V12111 (V + 47130) - 0x1112, 0x1170, 0x11ae, 0, -#undef V12112 -#define V12112 (V + 47134) - 0x1112, 0x1170, 0x11af, 0, -#undef V12113 -#define V12113 (V + 47138) - 0x1112, 0x1170, 0x11b0, 0, -#undef V12114 -#define V12114 (V + 47142) - 0x1112, 0x1170, 0x11b1, 0, -#undef V12115 -#define V12115 (V + 47146) - 0x1112, 0x1170, 0x11b2, 0, -#undef V12116 -#define V12116 (V + 47150) - 0x1112, 0x1170, 0x11b3, 0, -#undef V12117 -#define V12117 (V + 47154) - 0x1112, 0x1170, 0x11b4, 0, -#undef V12118 -#define V12118 (V + 47158) - 0x1112, 0x1170, 0x11b5, 0, -#undef V12119 -#define V12119 (V + 47162) - 0x1112, 0x1170, 0x11b6, 0, -#undef V12120 -#define V12120 (V + 47166) - 0x1112, 0x1170, 0x11b7, 0, -#undef V12121 -#define V12121 (V + 47170) - 0x1112, 0x1170, 0x11b8, 0, -#undef V12122 -#define V12122 (V + 47174) - 0x1112, 0x1170, 0x11b9, 0, -#undef V12123 -#define V12123 (V + 47178) - 0x1112, 0x1170, 0x11ba, 0, -#undef V12124 -#define V12124 (V + 47182) - 0x1112, 0x1170, 0x11bb, 0, -#undef V12125 -#define V12125 (V + 47186) - 0x1112, 0x1170, 0x11bc, 0, -#undef V12126 -#define V12126 (V + 47190) - 0x1112, 0x1170, 0x11bd, 0, -#undef V12127 -#define V12127 (V + 47194) - 0x1112, 0x1170, 0x11be, 0, -#undef V12128 -#define V12128 (V + 47198) - 0x1112, 0x1170, 0x11bf, 0, -#undef V12129 -#define V12129 (V + 47202) - 0x1112, 0x1170, 0x11c0, 0, -#undef V12130 -#define V12130 (V + 47206) - 0x1112, 0x1170, 0x11c1, 0, -#undef V12131 -#define V12131 (V + 47210) - 0x1112, 0x1170, 0x11c2, 0, -#undef V12132 -#define V12132 (V + 47214) - 0x1112, 0x1171, 0, -#undef V12133 -#define V12133 (V + 47217) - 0x1112, 0x1171, 0x11a8, 0, -#undef V12134 -#define V12134 (V + 47221) - 0x1112, 0x1171, 0x11a9, 0, -#undef V12135 -#define V12135 (V + 47225) - 0x1112, 0x1171, 0x11aa, 0, -#undef V12136 -#define V12136 (V + 47229) - 0x1112, 0x1171, 0x11ab, 0, -#undef V12137 -#define V12137 (V + 47233) - 0x1112, 0x1171, 0x11ac, 0, -#undef V12138 -#define V12138 (V + 47237) - 0x1112, 0x1171, 0x11ad, 0, -#undef V12139 -#define V12139 (V + 47241) - 0x1112, 0x1171, 0x11ae, 0, -#undef V12140 -#define V12140 (V + 47245) - 0x1112, 0x1171, 0x11af, 0, -#undef V12141 -#define V12141 (V + 47249) - 0x1112, 0x1171, 0x11b0, 0, -#undef V12142 -#define V12142 (V + 47253) - 0x1112, 0x1171, 0x11b1, 0, -#undef V12143 -#define V12143 (V + 47257) - 0x1112, 0x1171, 0x11b2, 0, -#undef V12144 -#define V12144 (V + 47261) - 0x1112, 0x1171, 0x11b3, 0, -#undef V12145 -#define V12145 (V + 47265) - 0x1112, 0x1171, 0x11b4, 0, -#undef V12146 -#define V12146 (V + 47269) - 0x1112, 0x1171, 0x11b5, 0, -#undef V12147 -#define V12147 (V + 47273) - 0x1112, 0x1171, 0x11b6, 0, -#undef V12148 -#define V12148 (V + 47277) - 0x1112, 0x1171, 0x11b7, 0, -#undef V12149 -#define V12149 (V + 47281) - 0x1112, 0x1171, 0x11b8, 0, -#undef V12150 -#define V12150 (V + 47285) - 0x1112, 0x1171, 0x11b9, 0, -#undef V12151 -#define V12151 (V + 47289) - 0x1112, 0x1171, 0x11ba, 0, -#undef V12152 -#define V12152 (V + 47293) - 0x1112, 0x1171, 0x11bb, 0, -#undef V12153 -#define V12153 (V + 47297) - 0x1112, 0x1171, 0x11bc, 0, -#undef V12154 -#define V12154 (V + 47301) - 0x1112, 0x1171, 0x11bd, 0, -#undef V12155 -#define V12155 (V + 47305) - 0x1112, 0x1171, 0x11be, 0, -#undef V12156 -#define V12156 (V + 47309) - 0x1112, 0x1171, 0x11bf, 0, -#undef V12157 -#define V12157 (V + 47313) - 0x1112, 0x1171, 0x11c0, 0, -#undef V12158 -#define V12158 (V + 47317) - 0x1112, 0x1171, 0x11c1, 0, -#undef V12159 -#define V12159 (V + 47321) - 0x1112, 0x1171, 0x11c2, 0, -#undef V12160 -#define V12160 (V + 47325) - 0x1112, 0x1172, 0, -#undef V12161 -#define V12161 (V + 47328) - 0x1112, 0x1172, 0x11a8, 0, -#undef V12162 -#define V12162 (V + 47332) - 0x1112, 0x1172, 0x11a9, 0, -#undef V12163 -#define V12163 (V + 47336) - 0x1112, 0x1172, 0x11aa, 0, -#undef V12164 -#define V12164 (V + 47340) - 0x1112, 0x1172, 0x11ab, 0, -#undef V12165 -#define V12165 (V + 47344) - 0x1112, 0x1172, 0x11ac, 0, -#undef V12166 -#define V12166 (V + 47348) - 0x1112, 0x1172, 0x11ad, 0, -#undef V12167 -#define V12167 (V + 47352) - 0x1112, 0x1172, 0x11ae, 0, -#undef V12168 -#define V12168 (V + 47356) - 0x1112, 0x1172, 0x11af, 0, -#undef V12169 -#define V12169 (V + 47360) - 0x1112, 0x1172, 0x11b0, 0, -#undef V12170 -#define V12170 (V + 47364) - 0x1112, 0x1172, 0x11b1, 0, -#undef V12171 -#define V12171 (V + 47368) - 0x1112, 0x1172, 0x11b2, 0, -#undef V12172 -#define V12172 (V + 47372) - 0x1112, 0x1172, 0x11b3, 0, -#undef V12173 -#define V12173 (V + 47376) - 0x1112, 0x1172, 0x11b4, 0, -#undef V12174 -#define V12174 (V + 47380) - 0x1112, 0x1172, 0x11b5, 0, -#undef V12175 -#define V12175 (V + 47384) - 0x1112, 0x1172, 0x11b6, 0, -#undef V12176 -#define V12176 (V + 47388) - 0x1112, 0x1172, 0x11b7, 0, -#undef V12177 -#define V12177 (V + 47392) - 0x1112, 0x1172, 0x11b8, 0, -#undef V12178 -#define V12178 (V + 47396) - 0x1112, 0x1172, 0x11b9, 0, -#undef V12179 -#define V12179 (V + 47400) - 0x1112, 0x1172, 0x11ba, 0, -#undef V12180 -#define V12180 (V + 47404) - 0x1112, 0x1172, 0x11bb, 0, -#undef V12181 -#define V12181 (V + 47408) - 0x1112, 0x1172, 0x11bc, 0, -#undef V12182 -#define V12182 (V + 47412) - 0x1112, 0x1172, 0x11bd, 0, -#undef V12183 -#define V12183 (V + 47416) - 0x1112, 0x1172, 0x11be, 0, -#undef V12184 -#define V12184 (V + 47420) - 0x1112, 0x1172, 0x11bf, 0, -#undef V12185 -#define V12185 (V + 47424) - 0x1112, 0x1172, 0x11c0, 0, -#undef V12186 -#define V12186 (V + 47428) - 0x1112, 0x1172, 0x11c1, 0, -#undef V12187 -#define V12187 (V + 47432) - 0x1112, 0x1172, 0x11c2, 0, -#undef V12188 -#define V12188 (V + 47436) - 0x1112, 0x1173, 0, -#undef V12189 -#define V12189 (V + 47439) - 0x1112, 0x1173, 0x11a8, 0, -#undef V12190 -#define V12190 (V + 47443) - 0x1112, 0x1173, 0x11a9, 0, -#undef V12191 -#define V12191 (V + 47447) - 0x1112, 0x1173, 0x11aa, 0, -#undef V12192 -#define V12192 (V + 47451) - 0x1112, 0x1173, 0x11ab, 0, -#undef V12193 -#define V12193 (V + 47455) - 0x1112, 0x1173, 0x11ac, 0, -#undef V12194 -#define V12194 (V + 47459) - 0x1112, 0x1173, 0x11ad, 0, -#undef V12195 -#define V12195 (V + 47463) - 0x1112, 0x1173, 0x11ae, 0, -#undef V12196 -#define V12196 (V + 47467) - 0x1112, 0x1173, 0x11af, 0, -#undef V12197 -#define V12197 (V + 47471) - 0x1112, 0x1173, 0x11b0, 0, -#undef V12198 -#define V12198 (V + 47475) - 0x1112, 0x1173, 0x11b1, 0, -#undef V12199 -#define V12199 (V + 47479) - 0x1112, 0x1173, 0x11b2, 0, -#undef V12200 -#define V12200 (V + 47483) - 0x1112, 0x1173, 0x11b3, 0, -#undef V12201 -#define V12201 (V + 47487) - 0x1112, 0x1173, 0x11b4, 0, -#undef V12202 -#define V12202 (V + 47491) - 0x1112, 0x1173, 0x11b5, 0, -#undef V12203 -#define V12203 (V + 47495) - 0x1112, 0x1173, 0x11b6, 0, -#undef V12204 -#define V12204 (V + 47499) - 0x1112, 0x1173, 0x11b7, 0, -#undef V12205 -#define V12205 (V + 47503) - 0x1112, 0x1173, 0x11b8, 0, -#undef V12206 -#define V12206 (V + 47507) - 0x1112, 0x1173, 0x11b9, 0, -#undef V12207 -#define V12207 (V + 47511) - 0x1112, 0x1173, 0x11ba, 0, -#undef V12208 -#define V12208 (V + 47515) - 0x1112, 0x1173, 0x11bb, 0, -#undef V12209 -#define V12209 (V + 47519) - 0x1112, 0x1173, 0x11bc, 0, -#undef V12210 -#define V12210 (V + 47523) - 0x1112, 0x1173, 0x11bd, 0, -#undef V12211 -#define V12211 (V + 47527) - 0x1112, 0x1173, 0x11be, 0, -#undef V12212 -#define V12212 (V + 47531) - 0x1112, 0x1173, 0x11bf, 0, -#undef V12213 -#define V12213 (V + 47535) - 0x1112, 0x1173, 0x11c0, 0, -#undef V12214 -#define V12214 (V + 47539) - 0x1112, 0x1173, 0x11c1, 0, -#undef V12215 -#define V12215 (V + 47543) - 0x1112, 0x1173, 0x11c2, 0, -#undef V12216 -#define V12216 (V + 47547) - 0x1112, 0x1174, 0, -#undef V12217 -#define V12217 (V + 47550) - 0x1112, 0x1174, 0x11a8, 0, -#undef V12218 -#define V12218 (V + 47554) - 0x1112, 0x1174, 0x11a9, 0, -#undef V12219 -#define V12219 (V + 47558) - 0x1112, 0x1174, 0x11aa, 0, -#undef V12220 -#define V12220 (V + 47562) - 0x1112, 0x1174, 0x11ab, 0, -#undef V12221 -#define V12221 (V + 47566) - 0x1112, 0x1174, 0x11ac, 0, -#undef V12222 -#define V12222 (V + 47570) - 0x1112, 0x1174, 0x11ad, 0, -#undef V12223 -#define V12223 (V + 47574) - 0x1112, 0x1174, 0x11ae, 0, -#undef V12224 -#define V12224 (V + 47578) - 0x1112, 0x1174, 0x11af, 0, -#undef V12225 -#define V12225 (V + 47582) - 0x1112, 0x1174, 0x11b0, 0, -#undef V12226 -#define V12226 (V + 47586) - 0x1112, 0x1174, 0x11b1, 0, -#undef V12227 -#define V12227 (V + 47590) - 0x1112, 0x1174, 0x11b2, 0, -#undef V12228 -#define V12228 (V + 47594) - 0x1112, 0x1174, 0x11b3, 0, -#undef V12229 -#define V12229 (V + 47598) - 0x1112, 0x1174, 0x11b4, 0, -#undef V12230 -#define V12230 (V + 47602) - 0x1112, 0x1174, 0x11b5, 0, -#undef V12231 -#define V12231 (V + 47606) - 0x1112, 0x1174, 0x11b6, 0, -#undef V12232 -#define V12232 (V + 47610) - 0x1112, 0x1174, 0x11b7, 0, -#undef V12233 -#define V12233 (V + 47614) - 0x1112, 0x1174, 0x11b8, 0, -#undef V12234 -#define V12234 (V + 47618) - 0x1112, 0x1174, 0x11b9, 0, -#undef V12235 -#define V12235 (V + 47622) - 0x1112, 0x1174, 0x11ba, 0, -#undef V12236 -#define V12236 (V + 47626) - 0x1112, 0x1174, 0x11bb, 0, -#undef V12237 -#define V12237 (V + 47630) - 0x1112, 0x1174, 0x11bc, 0, -#undef V12238 -#define V12238 (V + 47634) - 0x1112, 0x1174, 0x11bd, 0, -#undef V12239 -#define V12239 (V + 47638) - 0x1112, 0x1174, 0x11be, 0, -#undef V12240 -#define V12240 (V + 47642) - 0x1112, 0x1174, 0x11bf, 0, -#undef V12241 -#define V12241 (V + 47646) - 0x1112, 0x1174, 0x11c0, 0, -#undef V12242 -#define V12242 (V + 47650) - 0x1112, 0x1174, 0x11c1, 0, -#undef V12243 -#define V12243 (V + 47654) - 0x1112, 0x1174, 0x11c2, 0, -#undef V12244 -#define V12244 (V + 47658) - 0x1112, 0x1175, 0, -#undef V12245 -#define V12245 (V + 47661) - 0x1112, 0x1175, 0x11a8, 0, -#undef V12246 -#define V12246 (V + 47665) - 0x1112, 0x1175, 0x11a9, 0, -#undef V12247 -#define V12247 (V + 47669) - 0x1112, 0x1175, 0x11aa, 0, -#undef V12248 -#define V12248 (V + 47673) - 0x1112, 0x1175, 0x11ab, 0, -#undef V12249 -#define V12249 (V + 47677) - 0x1112, 0x1175, 0x11ac, 0, -#undef V12250 -#define V12250 (V + 47681) - 0x1112, 0x1175, 0x11ad, 0, -#undef V12251 -#define V12251 (V + 47685) - 0x1112, 0x1175, 0x11ae, 0, -#undef V12252 -#define V12252 (V + 47689) - 0x1112, 0x1175, 0x11af, 0, -#undef V12253 -#define V12253 (V + 47693) - 0x1112, 0x1175, 0x11b0, 0, -#undef V12254 -#define V12254 (V + 47697) - 0x1112, 0x1175, 0x11b1, 0, -#undef V12255 -#define V12255 (V + 47701) - 0x1112, 0x1175, 0x11b2, 0, -#undef V12256 -#define V12256 (V + 47705) - 0x1112, 0x1175, 0x11b3, 0, -#undef V12257 -#define V12257 (V + 47709) - 0x1112, 0x1175, 0x11b4, 0, -#undef V12258 -#define V12258 (V + 47713) - 0x1112, 0x1175, 0x11b5, 0, -#undef V12259 -#define V12259 (V + 47717) - 0x1112, 0x1175, 0x11b6, 0, -#undef V12260 -#define V12260 (V + 47721) - 0x1112, 0x1175, 0x11b7, 0, -#undef V12261 -#define V12261 (V + 47725) - 0x1112, 0x1175, 0x11b8, 0, -#undef V12262 -#define V12262 (V + 47729) - 0x1112, 0x1175, 0x11b9, 0, -#undef V12263 -#define V12263 (V + 47733) - 0x1112, 0x1175, 0x11ba, 0, -#undef V12264 -#define V12264 (V + 47737) - 0x1112, 0x1175, 0x11bb, 0, -#undef V12265 -#define V12265 (V + 47741) - 0x1112, 0x1175, 0x11bc, 0, -#undef V12266 -#define V12266 (V + 47745) - 0x1112, 0x1175, 0x11bd, 0, -#undef V12267 -#define V12267 (V + 47749) - 0x1112, 0x1175, 0x11be, 0, -#undef V12268 -#define V12268 (V + 47753) - 0x1112, 0x1175, 0x11bf, 0, -#undef V12269 -#define V12269 (V + 47757) - 0x1112, 0x1175, 0x11c0, 0, -#undef V12270 -#define V12270 (V + 47761) - 0x1112, 0x1175, 0x11c1, 0, -#undef V12271 -#define V12271 (V + 47765) - 0x1112, 0x1175, 0x11c2, 0, -#undef V12272 -#define V12272 (V + 47769) - 0x8c48, 0, -#undef V12273 -#define V12273 (V + 47771) - 0x66f4, 0, -#undef V12274 -#define V12274 (V + 47773) - 0x8eca, 0, -#undef V12275 -#define V12275 (V + 47775) - 0x8cc8, 0, -#undef V12276 -#define V12276 (V + 47777) - 0x6ed1, 0, -#undef V12277 -#define V12277 (V + 47779) - 0x4e32, 0, -#undef V12278 -#define V12278 (V + 47781) - 0x53e5, 0, -#undef V12279 -#define V12279 (V + 47783) - 0x9f9c, 0, -#undef V12280 -#define V12280 (V + 47785) - 0x5951, 0, -#undef V12281 -#define V12281 (V + 47787) - 0x91d1, 0, -#undef V12282 -#define V12282 (V + 47789) - 0x5587, 0, -#undef V12283 -#define V12283 (V + 47791) - 0x5948, 0, -#undef V12284 -#define V12284 (V + 47793) - 0x61f6, 0, -#undef V12285 -#define V12285 (V + 47795) - 0x7669, 0, -#undef V12286 -#define V12286 (V + 47797) - 0x7f85, 0, -#undef V12287 -#define V12287 (V + 47799) - 0x863f, 0, -#undef V12288 -#define V12288 (V + 47801) - 0x87ba, 0, -#undef V12289 -#define V12289 (V + 47803) - 0x88f8, 0, -#undef V12290 -#define V12290 (V + 47805) - 0x908f, 0, -#undef V12291 -#define V12291 (V + 47807) - 0x6a02, 0, -#undef V12292 -#define V12292 (V + 47809) - 0x6d1b, 0, -#undef V12293 -#define V12293 (V + 47811) - 0x70d9, 0, -#undef V12294 -#define V12294 (V + 47813) - 0x73de, 0, -#undef V12295 -#define V12295 (V + 47815) - 0x843d, 0, -#undef V12296 -#define V12296 (V + 47817) - 0x916a, 0, -#undef V12297 -#define V12297 (V + 47819) - 0x99f1, 0, -#undef V12298 -#define V12298 (V + 47821) - 0x4e82, 0, -#undef V12299 -#define V12299 (V + 47823) - 0x5375, 0, -#undef V12300 -#define V12300 (V + 47825) - 0x6b04, 0, -#undef V12301 -#define V12301 (V + 47827) - 0x721b, 0, -#undef V12302 -#define V12302 (V + 47829) - 0x862d, 0, -#undef V12303 -#define V12303 (V + 47831) - 0x9e1e, 0, -#undef V12304 -#define V12304 (V + 47833) - 0x5d50, 0, -#undef V12305 -#define V12305 (V + 47835) - 0x6feb, 0, -#undef V12306 -#define V12306 (V + 47837) - 0x85cd, 0, -#undef V12307 -#define V12307 (V + 47839) - 0x8964, 0, -#undef V12308 -#define V12308 (V + 47841) - 0x62c9, 0, -#undef V12309 -#define V12309 (V + 47843) - 0x81d8, 0, -#undef V12310 -#define V12310 (V + 47845) - 0x881f, 0, -#undef V12311 -#define V12311 (V + 47847) - 0x5eca, 0, -#undef V12312 -#define V12312 (V + 47849) - 0x6717, 0, -#undef V12313 -#define V12313 (V + 47851) - 0x6d6a, 0, -#undef V12314 -#define V12314 (V + 47853) - 0x72fc, 0, -#undef V12315 -#define V12315 (V + 47855) - 0x90ce, 0, -#undef V12316 -#define V12316 (V + 47857) - 0x4f86, 0, -#undef V12317 -#define V12317 (V + 47859) - 0x51b7, 0, -#undef V12318 -#define V12318 (V + 47861) - 0x52de, 0, -#undef V12319 -#define V12319 (V + 47863) - 0x64c4, 0, -#undef V12320 -#define V12320 (V + 47865) - 0x6ad3, 0, -#undef V12321 -#define V12321 (V + 47867) - 0x7210, 0, -#undef V12322 -#define V12322 (V + 47869) - 0x76e7, 0, -#undef V12323 -#define V12323 (V + 47871) - 0x8001, 0, -#undef V12324 -#define V12324 (V + 47873) - 0x8606, 0, -#undef V12325 -#define V12325 (V + 47875) - 0x865c, 0, -#undef V12326 -#define V12326 (V + 47877) - 0x8def, 0, -#undef V12327 -#define V12327 (V + 47879) - 0x9732, 0, -#undef V12328 -#define V12328 (V + 47881) - 0x9b6f, 0, -#undef V12329 -#define V12329 (V + 47883) - 0x9dfa, 0, -#undef V12330 -#define V12330 (V + 47885) - 0x788c, 0, -#undef V12331 -#define V12331 (V + 47887) - 0x797f, 0, -#undef V12332 -#define V12332 (V + 47889) - 0x7da0, 0, -#undef V12333 -#define V12333 (V + 47891) - 0x83c9, 0, -#undef V12334 -#define V12334 (V + 47893) - 0x9304, 0, -#undef V12335 -#define V12335 (V + 47895) - 0x9e7f, 0, -#undef V12336 -#define V12336 (V + 47897) - 0x8ad6, 0, -#undef V12337 -#define V12337 (V + 47899) - 0x58df, 0, -#undef V12338 -#define V12338 (V + 47901) - 0x5f04, 0, -#undef V12339 -#define V12339 (V + 47903) - 0x7c60, 0, -#undef V12340 -#define V12340 (V + 47905) - 0x807e, 0, -#undef V12341 -#define V12341 (V + 47907) - 0x7262, 0, -#undef V12342 -#define V12342 (V + 47909) - 0x78ca, 0, -#undef V12343 -#define V12343 (V + 47911) - 0x8cc2, 0, -#undef V12344 -#define V12344 (V + 47913) - 0x96f7, 0, -#undef V12345 -#define V12345 (V + 47915) - 0x58d8, 0, -#undef V12346 -#define V12346 (V + 47917) - 0x5c62, 0, -#undef V12347 -#define V12347 (V + 47919) - 0x6a13, 0, -#undef V12348 -#define V12348 (V + 47921) - 0x6dda, 0, -#undef V12349 -#define V12349 (V + 47923) - 0x6f0f, 0, -#undef V12350 -#define V12350 (V + 47925) - 0x7d2f, 0, -#undef V12351 -#define V12351 (V + 47927) - 0x7e37, 0, -#undef V12352 -#define V12352 (V + 47929) - 0x964b, 0, -#undef V12353 -#define V12353 (V + 47931) - 0x52d2, 0, -#undef V12354 -#define V12354 (V + 47933) - 0x808b, 0, -#undef V12355 -#define V12355 (V + 47935) - 0x51dc, 0, -#undef V12356 -#define V12356 (V + 47937) - 0x51cc, 0, -#undef V12357 -#define V12357 (V + 47939) - 0x7a1c, 0, -#undef V12358 -#define V12358 (V + 47941) - 0x7dbe, 0, -#undef V12359 -#define V12359 (V + 47943) - 0x83f1, 0, -#undef V12360 -#define V12360 (V + 47945) - 0x9675, 0, -#undef V12361 -#define V12361 (V + 47947) - 0x8b80, 0, -#undef V12362 -#define V12362 (V + 47949) - 0x62cf, 0, -#undef V12363 -#define V12363 (V + 47951) - 0x8afe, 0, -#undef V12364 -#define V12364 (V + 47953) - 0x4e39, 0, -#undef V12365 -#define V12365 (V + 47955) - 0x5be7, 0, -#undef V12366 -#define V12366 (V + 47957) - 0x6012, 0, -#undef V12367 -#define V12367 (V + 47959) - 0x7387, 0, -#undef V12368 -#define V12368 (V + 47961) - 0x7570, 0, -#undef V12369 -#define V12369 (V + 47963) - 0x5317, 0, -#undef V12370 -#define V12370 (V + 47965) - 0x78fb, 0, -#undef V12371 -#define V12371 (V + 47967) - 0x4fbf, 0, -#undef V12372 -#define V12372 (V + 47969) - 0x5fa9, 0, -#undef V12373 -#define V12373 (V + 47971) - 0x4e0d, 0, -#undef V12374 -#define V12374 (V + 47973) - 0x6ccc, 0, -#undef V12375 -#define V12375 (V + 47975) - 0x6578, 0, -#undef V12376 -#define V12376 (V + 47977) - 0x7d22, 0, -#undef V12377 -#define V12377 (V + 47979) - 0x53c3, 0, -#undef V12378 -#define V12378 (V + 47981) - 0x585e, 0, -#undef V12379 -#define V12379 (V + 47983) - 0x7701, 0, -#undef V12380 -#define V12380 (V + 47985) - 0x8449, 0, -#undef V12381 -#define V12381 (V + 47987) - 0x8aaa, 0, -#undef V12382 -#define V12382 (V + 47989) - 0x6bba, 0, -#undef V12383 -#define V12383 (V + 47991) - 0x8fb0, 0, -#undef V12384 -#define V12384 (V + 47993) - 0x6c88, 0, -#undef V12385 -#define V12385 (V + 47995) - 0x62fe, 0, -#undef V12386 -#define V12386 (V + 47997) - 0x82e5, 0, -#undef V12387 -#define V12387 (V + 47999) - 0x63a0, 0, -#undef V12388 -#define V12388 (V + 48001) - 0x7565, 0, -#undef V12389 -#define V12389 (V + 48003) - 0x4eae, 0, -#undef V12390 -#define V12390 (V + 48005) - 0x5169, 0, -#undef V12391 -#define V12391 (V + 48007) - 0x51c9, 0, -#undef V12392 -#define V12392 (V + 48009) - 0x6881, 0, -#undef V12393 -#define V12393 (V + 48011) - 0x7ce7, 0, -#undef V12394 -#define V12394 (V + 48013) - 0x826f, 0, -#undef V12395 -#define V12395 (V + 48015) - 0x8ad2, 0, -#undef V12396 -#define V12396 (V + 48017) - 0x91cf, 0, -#undef V12397 -#define V12397 (V + 48019) - 0x52f5, 0, -#undef V12398 -#define V12398 (V + 48021) - 0x5442, 0, -#undef V12399 -#define V12399 (V + 48023) - 0x5973, 0, -#undef V12400 -#define V12400 (V + 48025) - 0x5eec, 0, -#undef V12401 -#define V12401 (V + 48027) - 0x65c5, 0, -#undef V12402 -#define V12402 (V + 48029) - 0x6ffe, 0, -#undef V12403 -#define V12403 (V + 48031) - 0x792a, 0, -#undef V12404 -#define V12404 (V + 48033) - 0x95ad, 0, -#undef V12405 -#define V12405 (V + 48035) - 0x9a6a, 0, -#undef V12406 -#define V12406 (V + 48037) - 0x9e97, 0, -#undef V12407 -#define V12407 (V + 48039) - 0x9ece, 0, -#undef V12408 -#define V12408 (V + 48041) - 0x529b, 0, -#undef V12409 -#define V12409 (V + 48043) - 0x66c6, 0, -#undef V12410 -#define V12410 (V + 48045) - 0x6b77, 0, -#undef V12411 -#define V12411 (V + 48047) - 0x8f62, 0, -#undef V12412 -#define V12412 (V + 48049) - 0x5e74, 0, -#undef V12413 -#define V12413 (V + 48051) - 0x6190, 0, -#undef V12414 -#define V12414 (V + 48053) - 0x6200, 0, -#undef V12415 -#define V12415 (V + 48055) - 0x649a, 0, -#undef V12416 -#define V12416 (V + 48057) - 0x6f23, 0, -#undef V12417 -#define V12417 (V + 48059) - 0x7149, 0, -#undef V12418 -#define V12418 (V + 48061) - 0x7489, 0, -#undef V12419 -#define V12419 (V + 48063) - 0x79ca, 0, -#undef V12420 -#define V12420 (V + 48065) - 0x7df4, 0, -#undef V12421 -#define V12421 (V + 48067) - 0x806f, 0, -#undef V12422 -#define V12422 (V + 48069) - 0x8f26, 0, -#undef V12423 -#define V12423 (V + 48071) - 0x84ee, 0, -#undef V12424 -#define V12424 (V + 48073) - 0x9023, 0, -#undef V12425 -#define V12425 (V + 48075) - 0x934a, 0, -#undef V12426 -#define V12426 (V + 48077) - 0x5217, 0, -#undef V12427 -#define V12427 (V + 48079) - 0x52a3, 0, -#undef V12428 -#define V12428 (V + 48081) - 0x54bd, 0, -#undef V12429 -#define V12429 (V + 48083) - 0x70c8, 0, -#undef V12430 -#define V12430 (V + 48085) - 0x88c2, 0, -#undef V12431 -#define V12431 (V + 48087) - 0x5ec9, 0, -#undef V12432 -#define V12432 (V + 48089) - 0x5ff5, 0, -#undef V12433 -#define V12433 (V + 48091) - 0x637b, 0, -#undef V12434 -#define V12434 (V + 48093) - 0x6bae, 0, -#undef V12435 -#define V12435 (V + 48095) - 0x7c3e, 0, -#undef V12436 -#define V12436 (V + 48097) - 0x7375, 0, -#undef V12437 -#define V12437 (V + 48099) - 0x4ee4, 0, -#undef V12438 -#define V12438 (V + 48101) - 0x56f9, 0, -#undef V12439 -#define V12439 (V + 48103) - 0x5dba, 0, -#undef V12440 -#define V12440 (V + 48105) - 0x601c, 0, -#undef V12441 -#define V12441 (V + 48107) - 0x73b2, 0, -#undef V12442 -#define V12442 (V + 48109) - 0x7469, 0, -#undef V12443 -#define V12443 (V + 48111) - 0x7f9a, 0, -#undef V12444 -#define V12444 (V + 48113) - 0x8046, 0, -#undef V12445 -#define V12445 (V + 48115) - 0x9234, 0, -#undef V12446 -#define V12446 (V + 48117) - 0x96f6, 0, -#undef V12447 -#define V12447 (V + 48119) - 0x9748, 0, -#undef V12448 -#define V12448 (V + 48121) - 0x9818, 0, -#undef V12449 -#define V12449 (V + 48123) - 0x4f8b, 0, -#undef V12450 -#define V12450 (V + 48125) - 0x79ae, 0, -#undef V12451 -#define V12451 (V + 48127) - 0x91b4, 0, -#undef V12452 -#define V12452 (V + 48129) - 0x96b8, 0, -#undef V12453 -#define V12453 (V + 48131) - 0x60e1, 0, -#undef V12454 -#define V12454 (V + 48133) - 0x4e86, 0, -#undef V12455 -#define V12455 (V + 48135) - 0x50da, 0, -#undef V12456 -#define V12456 (V + 48137) - 0x5bee, 0, -#undef V12457 -#define V12457 (V + 48139) - 0x5c3f, 0, -#undef V12458 -#define V12458 (V + 48141) - 0x6599, 0, -#undef V12459 -#define V12459 (V + 48143) - 0x71ce, 0, -#undef V12460 -#define V12460 (V + 48145) - 0x7642, 0, -#undef V12461 -#define V12461 (V + 48147) - 0x84fc, 0, -#undef V12462 -#define V12462 (V + 48149) - 0x907c, 0, -#undef V12463 -#define V12463 (V + 48151) - 0x9f8d, 0, -#undef V12464 -#define V12464 (V + 48153) - 0x6688, 0, -#undef V12465 -#define V12465 (V + 48155) - 0x962e, 0, -#undef V12466 -#define V12466 (V + 48157) - 0x5289, 0, -#undef V12467 -#define V12467 (V + 48159) - 0x677b, 0, -#undef V12468 -#define V12468 (V + 48161) - 0x67f3, 0, -#undef V12469 -#define V12469 (V + 48163) - 0x6d41, 0, -#undef V12470 -#define V12470 (V + 48165) - 0x6e9c, 0, -#undef V12471 -#define V12471 (V + 48167) - 0x7409, 0, -#undef V12472 -#define V12472 (V + 48169) - 0x7559, 0, -#undef V12473 -#define V12473 (V + 48171) - 0x786b, 0, -#undef V12474 -#define V12474 (V + 48173) - 0x7d10, 0, -#undef V12475 -#define V12475 (V + 48175) - 0x985e, 0, -#undef V12476 -#define V12476 (V + 48177) - 0x516d, 0, -#undef V12477 -#define V12477 (V + 48179) - 0x622e, 0, -#undef V12478 -#define V12478 (V + 48181) - 0x9678, 0, -#undef V12479 -#define V12479 (V + 48183) - 0x502b, 0, -#undef V12480 -#define V12480 (V + 48185) - 0x5d19, 0, -#undef V12481 -#define V12481 (V + 48187) - 0x6dea, 0, -#undef V12482 -#define V12482 (V + 48189) - 0x8f2a, 0, -#undef V12483 -#define V12483 (V + 48191) - 0x5f8b, 0, -#undef V12484 -#define V12484 (V + 48193) - 0x6144, 0, -#undef V12485 -#define V12485 (V + 48195) - 0x6817, 0, -#undef V12486 -#define V12486 (V + 48197) - 0x9686, 0, -#undef V12487 -#define V12487 (V + 48199) - 0x5229, 0, -#undef V12488 -#define V12488 (V + 48201) - 0x540f, 0, -#undef V12489 -#define V12489 (V + 48203) - 0x5c65, 0, -#undef V12490 -#define V12490 (V + 48205) - 0x6613, 0, -#undef V12491 -#define V12491 (V + 48207) - 0x674e, 0, -#undef V12492 -#define V12492 (V + 48209) - 0x68a8, 0, -#undef V12493 -#define V12493 (V + 48211) - 0x6ce5, 0, -#undef V12494 -#define V12494 (V + 48213) - 0x7406, 0, -#undef V12495 -#define V12495 (V + 48215) - 0x75e2, 0, -#undef V12496 -#define V12496 (V + 48217) - 0x7f79, 0, -#undef V12497 -#define V12497 (V + 48219) - 0x88cf, 0, -#undef V12498 -#define V12498 (V + 48221) - 0x88e1, 0, -#undef V12499 -#define V12499 (V + 48223) - 0x91cc, 0, -#undef V12500 -#define V12500 (V + 48225) - 0x96e2, 0, -#undef V12501 -#define V12501 (V + 48227) - 0x533f, 0, -#undef V12502 -#define V12502 (V + 48229) - 0x6eba, 0, -#undef V12503 -#define V12503 (V + 48231) - 0x541d, 0, -#undef V12504 -#define V12504 (V + 48233) - 0x71d0, 0, -#undef V12505 -#define V12505 (V + 48235) - 0x7498, 0, -#undef V12506 -#define V12506 (V + 48237) - 0x85fa, 0, -#undef V12507 -#define V12507 (V + 48239) - 0x96a3, 0, -#undef V12508 -#define V12508 (V + 48241) - 0x9c57, 0, -#undef V12509 -#define V12509 (V + 48243) - 0x9e9f, 0, -#undef V12510 -#define V12510 (V + 48245) - 0x6797, 0, -#undef V12511 -#define V12511 (V + 48247) - 0x6dcb, 0, -#undef V12512 -#define V12512 (V + 48249) - 0x81e8, 0, -#undef V12513 -#define V12513 (V + 48251) - 0x7acb, 0, -#undef V12514 -#define V12514 (V + 48253) - 0x7b20, 0, -#undef V12515 -#define V12515 (V + 48255) - 0x7c92, 0, -#undef V12516 -#define V12516 (V + 48257) - 0x72c0, 0, -#undef V12517 -#define V12517 (V + 48259) - 0x7099, 0, -#undef V12518 -#define V12518 (V + 48261) - 0x8b58, 0, -#undef V12519 -#define V12519 (V + 48263) - 0x4ec0, 0, -#undef V12520 -#define V12520 (V + 48265) - 0x8336, 0, -#undef V12521 -#define V12521 (V + 48267) - 0x523a, 0, -#undef V12522 -#define V12522 (V + 48269) - 0x5207, 0, -#undef V12523 -#define V12523 (V + 48271) - 0x5ea6, 0, -#undef V12524 -#define V12524 (V + 48273) - 0x62d3, 0, -#undef V12525 -#define V12525 (V + 48275) - 0x7cd6, 0, -#undef V12526 -#define V12526 (V + 48277) - 0x5b85, 0, -#undef V12527 -#define V12527 (V + 48279) - 0x6d1e, 0, -#undef V12528 -#define V12528 (V + 48281) - 0x66b4, 0, -#undef V12529 -#define V12529 (V + 48283) - 0x8f3b, 0, -#undef V12530 -#define V12530 (V + 48285) - 0x884c, 0, -#undef V12531 -#define V12531 (V + 48287) - 0x964d, 0, -#undef V12532 -#define V12532 (V + 48289) - 0x898b, 0, -#undef V12533 -#define V12533 (V + 48291) - 0x5ed3, 0, -#undef V12534 -#define V12534 (V + 48293) - 0x5140, 0, -#undef V12535 -#define V12535 (V + 48295) - 0x55c0, 0, -#undef V12536 -#define V12536 (V + 48297) - 0x585a, 0, -#undef V12537 -#define V12537 (V + 48299) - 0x6674, 0, -#undef V12538 -#define V12538 (V + 48301) - 0x51de, 0, -#undef V12539 -#define V12539 (V + 48303) - 0x732a, 0, -#undef V12540 -#define V12540 (V + 48305) - 0x76ca, 0, -#undef V12541 -#define V12541 (V + 48307) - 0x793c, 0, -#undef V12542 -#define V12542 (V + 48309) - 0x795e, 0, -#undef V12543 -#define V12543 (V + 48311) - 0x7965, 0, -#undef V12544 -#define V12544 (V + 48313) - 0x798f, 0, -#undef V12545 -#define V12545 (V + 48315) - 0x9756, 0, -#undef V12546 -#define V12546 (V + 48317) - 0x7cbe, 0, -#undef V12547 -#define V12547 (V + 48319) - 0x7fbd, 0, -#undef V12548 -#define V12548 (V + 48321) - 0x8612, 0, -#undef V12549 -#define V12549 (V + 48323) - 0x8af8, 0, -#undef V12550 -#define V12550 (V + 48325) - 0x9038, 0, -#undef V12551 -#define V12551 (V + 48327) - 0x90fd, 0, -#undef V12552 -#define V12552 (V + 48329) - 0x98ef, 0, -#undef V12553 -#define V12553 (V + 48331) - 0x98fc, 0, -#undef V12554 -#define V12554 (V + 48333) - 0x9928, 0, -#undef V12555 -#define V12555 (V + 48335) - 0x9db4, 0, -#undef V12556 -#define V12556 (V + 48337) - 0x90de, 0, -#undef V12557 -#define V12557 (V + 48339) - 0x96b7, 0, -#undef V12558 -#define V12558 (V + 48341) - 0x4fae, 0, -#undef V12559 -#define V12559 (V + 48343) - 0x50e7, 0, -#undef V12560 -#define V12560 (V + 48345) - 0x514d, 0, -#undef V12561 -#define V12561 (V + 48347) - 0x52c9, 0, -#undef V12562 -#define V12562 (V + 48349) - 0x52e4, 0, -#undef V12563 -#define V12563 (V + 48351) - 0x5351, 0, -#undef V12564 -#define V12564 (V + 48353) - 0x559d, 0, -#undef V12565 -#define V12565 (V + 48355) - 0x5606, 0, -#undef V12566 -#define V12566 (V + 48357) - 0x5668, 0, -#undef V12567 -#define V12567 (V + 48359) - 0x5840, 0, -#undef V12568 -#define V12568 (V + 48361) - 0x58a8, 0, -#undef V12569 -#define V12569 (V + 48363) - 0x5c64, 0, -#undef V12570 -#define V12570 (V + 48365) - 0x5c6e, 0, -#undef V12571 -#define V12571 (V + 48367) - 0x6094, 0, -#undef V12572 -#define V12572 (V + 48369) - 0x6168, 0, -#undef V12573 -#define V12573 (V + 48371) - 0x618e, 0, -#undef V12574 -#define V12574 (V + 48373) - 0x61f2, 0, -#undef V12575 -#define V12575 (V + 48375) - 0x654f, 0, -#undef V12576 -#define V12576 (V + 48377) - 0x65e2, 0, -#undef V12577 -#define V12577 (V + 48379) - 0x6691, 0, -#undef V12578 -#define V12578 (V + 48381) - 0x6885, 0, -#undef V12579 -#define V12579 (V + 48383) - 0x6d77, 0, -#undef V12580 -#define V12580 (V + 48385) - 0x6e1a, 0, -#undef V12581 -#define V12581 (V + 48387) - 0x6f22, 0, -#undef V12582 -#define V12582 (V + 48389) - 0x716e, 0, -#undef V12583 -#define V12583 (V + 48391) - 0x722b, 0, -#undef V12584 -#define V12584 (V + 48393) - 0x7422, 0, -#undef V12585 -#define V12585 (V + 48395) - 0x7891, 0, -#undef V12586 -#define V12586 (V + 48397) - 0x793e, 0, -#undef V12587 -#define V12587 (V + 48399) - 0x7949, 0, -#undef V12588 -#define V12588 (V + 48401) - 0x7948, 0, -#undef V12589 -#define V12589 (V + 48403) - 0x7950, 0, -#undef V12590 -#define V12590 (V + 48405) - 0x7956, 0, -#undef V12591 -#define V12591 (V + 48407) - 0x795d, 0, -#undef V12592 -#define V12592 (V + 48409) - 0x798d, 0, -#undef V12593 -#define V12593 (V + 48411) - 0x798e, 0, -#undef V12594 -#define V12594 (V + 48413) - 0x7a40, 0, -#undef V12595 -#define V12595 (V + 48415) - 0x7a81, 0, -#undef V12596 -#define V12596 (V + 48417) - 0x7bc0, 0, -#undef V12597 -#define V12597 (V + 48419) - 0x7e09, 0, -#undef V12598 -#define V12598 (V + 48421) - 0x7e41, 0, -#undef V12599 -#define V12599 (V + 48423) - 0x7f72, 0, -#undef V12600 -#define V12600 (V + 48425) - 0x8005, 0, -#undef V12601 -#define V12601 (V + 48427) - 0x81ed, 0, -#undef V12602 -#define V12602 (V + 48429) - 0x8279, 0, -#undef V12603 -#define V12603 (V + 48431) - 0x8457, 0, -#undef V12604 -#define V12604 (V + 48433) - 0x8910, 0, -#undef V12605 -#define V12605 (V + 48435) - 0x8996, 0, -#undef V12606 -#define V12606 (V + 48437) - 0x8b01, 0, -#undef V12607 -#define V12607 (V + 48439) - 0x8b39, 0, -#undef V12608 -#define V12608 (V + 48441) - 0x8cd3, 0, -#undef V12609 -#define V12609 (V + 48443) - 0x8d08, 0, -#undef V12610 -#define V12610 (V + 48445) - 0x8fb6, 0, -#undef V12611 -#define V12611 (V + 48447) - 0x96e3, 0, -#undef V12612 -#define V12612 (V + 48449) - 0x97ff, 0, -#undef V12613 -#define V12613 (V + 48451) - 0x983b, 0, -#undef V12614 -#define V12614 (V + 48453) - 0x6075, 0, -#undef V12615 -#define V12615 (V + 48455) - 0x242ee, 0, -#undef V12616 -#define V12616 (V + 48457) - 0x8218, 0, -#undef V12617 -#define V12617 (V + 48459) - 0x4e26, 0, -#undef V12618 -#define V12618 (V + 48461) - 0x51b5, 0, -#undef V12619 -#define V12619 (V + 48463) - 0x5168, 0, -#undef V12620 -#define V12620 (V + 48465) - 0x4f80, 0, -#undef V12621 -#define V12621 (V + 48467) - 0x5145, 0, -#undef V12622 -#define V12622 (V + 48469) - 0x5180, 0, -#undef V12623 -#define V12623 (V + 48471) - 0x52c7, 0, -#undef V12624 -#define V12624 (V + 48473) - 0x52fa, 0, -#undef V12625 -#define V12625 (V + 48475) - 0x5555, 0, -#undef V12626 -#define V12626 (V + 48477) - 0x5599, 0, -#undef V12627 -#define V12627 (V + 48479) - 0x55e2, 0, -#undef V12628 -#define V12628 (V + 48481) - 0x58b3, 0, -#undef V12629 -#define V12629 (V + 48483) - 0x5944, 0, -#undef V12630 -#define V12630 (V + 48485) - 0x5954, 0, -#undef V12631 -#define V12631 (V + 48487) - 0x5a62, 0, -#undef V12632 -#define V12632 (V + 48489) - 0x5b28, 0, -#undef V12633 -#define V12633 (V + 48491) - 0x5ed2, 0, -#undef V12634 -#define V12634 (V + 48493) - 0x5ed9, 0, -#undef V12635 -#define V12635 (V + 48495) - 0x5f69, 0, -#undef V12636 -#define V12636 (V + 48497) - 0x5fad, 0, -#undef V12637 -#define V12637 (V + 48499) - 0x60d8, 0, -#undef V12638 -#define V12638 (V + 48501) - 0x614e, 0, -#undef V12639 -#define V12639 (V + 48503) - 0x6108, 0, -#undef V12640 -#define V12640 (V + 48505) - 0x6160, 0, -#undef V12641 -#define V12641 (V + 48507) - 0x6234, 0, -#undef V12642 -#define V12642 (V + 48509) - 0x63c4, 0, -#undef V12643 -#define V12643 (V + 48511) - 0x641c, 0, -#undef V12644 -#define V12644 (V + 48513) - 0x6452, 0, -#undef V12645 -#define V12645 (V + 48515) - 0x6556, 0, -#undef V12646 -#define V12646 (V + 48517) - 0x671b, 0, -#undef V12647 -#define V12647 (V + 48519) - 0x6756, 0, -#undef V12648 -#define V12648 (V + 48521) - 0x6b79, 0, -#undef V12649 -#define V12649 (V + 48523) - 0x6edb, 0, -#undef V12650 -#define V12650 (V + 48525) - 0x6ecb, 0, -#undef V12651 -#define V12651 (V + 48527) - 0x701e, 0, -#undef V12652 -#define V12652 (V + 48529) - 0x77a7, 0, -#undef V12653 -#define V12653 (V + 48531) - 0x7235, 0, -#undef V12654 -#define V12654 (V + 48533) - 0x72af, 0, -#undef V12655 -#define V12655 (V + 48535) - 0x7471, 0, -#undef V12656 -#define V12656 (V + 48537) - 0x7506, 0, -#undef V12657 -#define V12657 (V + 48539) - 0x753b, 0, -#undef V12658 -#define V12658 (V + 48541) - 0x761d, 0, -#undef V12659 -#define V12659 (V + 48543) - 0x761f, 0, -#undef V12660 -#define V12660 (V + 48545) - 0x76db, 0, -#undef V12661 -#define V12661 (V + 48547) - 0x76f4, 0, -#undef V12662 -#define V12662 (V + 48549) - 0x774a, 0, -#undef V12663 -#define V12663 (V + 48551) - 0x7740, 0, -#undef V12664 -#define V12664 (V + 48553) - 0x78cc, 0, -#undef V12665 -#define V12665 (V + 48555) - 0x7ab1, 0, -#undef V12666 -#define V12666 (V + 48557) - 0x7c7b, 0, -#undef V12667 -#define V12667 (V + 48559) - 0x7d5b, 0, -#undef V12668 -#define V12668 (V + 48561) - 0x7f3e, 0, -#undef V12669 -#define V12669 (V + 48563) - 0x8352, 0, -#undef V12670 -#define V12670 (V + 48565) - 0x83ef, 0, -#undef V12671 -#define V12671 (V + 48567) - 0x8779, 0, -#undef V12672 -#define V12672 (V + 48569) - 0x8941, 0, -#undef V12673 -#define V12673 (V + 48571) - 0x8986, 0, -#undef V12674 -#define V12674 (V + 48573) - 0x8abf, 0, -#undef V12675 -#define V12675 (V + 48575) - 0x8acb, 0, -#undef V12676 -#define V12676 (V + 48577) - 0x8aed, 0, -#undef V12677 -#define V12677 (V + 48579) - 0x8b8a, 0, -#undef V12678 -#define V12678 (V + 48581) - 0x8f38, 0, -#undef V12679 -#define V12679 (V + 48583) - 0x9072, 0, -#undef V12680 -#define V12680 (V + 48585) - 0x9199, 0, -#undef V12681 -#define V12681 (V + 48587) - 0x9276, 0, -#undef V12682 -#define V12682 (V + 48589) - 0x967c, 0, -#undef V12683 -#define V12683 (V + 48591) - 0x97db, 0, -#undef V12684 -#define V12684 (V + 48593) - 0x980b, 0, -#undef V12685 -#define V12685 (V + 48595) - 0x9b12, 0, -#undef V12686 -#define V12686 (V + 48597) - 0x2284a, 0, -#undef V12687 -#define V12687 (V + 48599) - 0x22844, 0, -#undef V12688 -#define V12688 (V + 48601) - 0x233d5, 0, -#undef V12689 -#define V12689 (V + 48603) - 0x3b9d, 0, -#undef V12690 -#define V12690 (V + 48605) - 0x4018, 0, -#undef V12691 -#define V12691 (V + 48607) - 0x4039, 0, -#undef V12692 -#define V12692 (V + 48609) - 0x25249, 0, -#undef V12693 -#define V12693 (V + 48611) - 0x25cd0, 0, -#undef V12694 -#define V12694 (V + 48613) - 0x27ed3, 0, -#undef V12695 -#define V12695 (V + 48615) - 0x9f43, 0, -#undef V12696 -#define V12696 (V + 48617) - 0x9f8e, 0, -#undef V12697 -#define V12697 (V + 48619) - 0x5d9, 0x5b4, 0, -#undef V12698 -#define V12698 (V + 48622) - 0x5f2, 0x5b7, 0, -#undef V12699 -#define V12699 (V + 48625) - 0x5e9, 0x5c1, 0, -#undef V12700 -#define V12700 (V + 48628) - 0x5e9, 0x5c2, 0, -#undef V12701 -#define V12701 (V + 48631) - 0x5e9, 0x5bc, 0x5c1, 0, -#undef V12702 -#define V12702 (V + 48635) - 0x5e9, 0x5bc, 0x5c2, 0, -#undef V12703 -#define V12703 (V + 48639) - 0x5d0, 0x5b7, 0, -#undef V12704 -#define V12704 (V + 48642) - 0x5d0, 0x5b8, 0, -#undef V12705 -#define V12705 (V + 48645) - 0x5d0, 0x5bc, 0, -#undef V12706 -#define V12706 (V + 48648) - 0x5d1, 0x5bc, 0, -#undef V12707 -#define V12707 (V + 48651) - 0x5d2, 0x5bc, 0, -#undef V12708 -#define V12708 (V + 48654) - 0x5d3, 0x5bc, 0, -#undef V12709 -#define V12709 (V + 48657) - 0x5d4, 0x5bc, 0, -#undef V12710 -#define V12710 (V + 48660) - 0x5d5, 0x5bc, 0, -#undef V12711 -#define V12711 (V + 48663) - 0x5d6, 0x5bc, 0, -#undef V12712 -#define V12712 (V + 48666) - 0x5d8, 0x5bc, 0, -#undef V12713 -#define V12713 (V + 48669) - 0x5d9, 0x5bc, 0, -#undef V12714 -#define V12714 (V + 48672) - 0x5da, 0x5bc, 0, -#undef V12715 -#define V12715 (V + 48675) - 0x5db, 0x5bc, 0, -#undef V12716 -#define V12716 (V + 48678) - 0x5dc, 0x5bc, 0, -#undef V12717 -#define V12717 (V + 48681) - 0x5de, 0x5bc, 0, -#undef V12718 -#define V12718 (V + 48684) - 0x5e0, 0x5bc, 0, -#undef V12719 -#define V12719 (V + 48687) - 0x5e1, 0x5bc, 0, -#undef V12720 -#define V12720 (V + 48690) - 0x5e3, 0x5bc, 0, -#undef V12721 -#define V12721 (V + 48693) - 0x5e4, 0x5bc, 0, -#undef V12722 -#define V12722 (V + 48696) - 0x5e6, 0x5bc, 0, -#undef V12723 -#define V12723 (V + 48699) - 0x5e7, 0x5bc, 0, -#undef V12724 -#define V12724 (V + 48702) - 0x5e8, 0x5bc, 0, -#undef V12725 -#define V12725 (V + 48705) - 0x5e9, 0x5bc, 0, -#undef V12726 -#define V12726 (V + 48708) - 0x5ea, 0x5bc, 0, -#undef V12727 -#define V12727 (V + 48711) - 0x5d5, 0x5b9, 0, -#undef V12728 -#define V12728 (V + 48714) - 0x5d1, 0x5bf, 0, -#undef V12729 -#define V12729 (V + 48717) - 0x5db, 0x5bf, 0, -#undef V12730 -#define V12730 (V + 48720) - 0x5e4, 0x5bf, 0, -#undef V12731 -#define V12731 (V + 48723) - 0x11099, 0x110ba, 0, -#undef V12732 -#define V12732 (V + 48726) - 0x1109b, 0x110ba, 0, -#undef V12733 -#define V12733 (V + 48729) - 0x110a5, 0x110ba, 0, -#undef V12734 -#define V12734 (V + 48732) - 0x11131, 0x11127, 0, -#undef V12735 -#define V12735 (V + 48735) - 0x11132, 0x11127, 0, -#undef V12736 -#define V12736 (V + 48738) - 0x11347, 0x1133e, 0, -#undef V12737 -#define V12737 (V + 48741) - 0x11347, 0x11357, 0, -#undef V12738 -#define V12738 (V + 48744) - 0x114b9, 0x114ba, 0, -#undef V12739 -#define V12739 (V + 48747) - 0x114b9, 0x114b0, 0, -#undef V12740 -#define V12740 (V + 48750) - 0x114b9, 0x114bd, 0, -#undef V12741 -#define V12741 (V + 48753) - 0x115b8, 0x115af, 0, -#undef V12742 -#define V12742 (V + 48756) - 0x115b9, 0x115af, 0, -#undef V12743 -#define V12743 (V + 48759) - 0x1d157, 0x1d165, 0, -#undef V12744 -#define V12744 (V + 48762) - 0x1d158, 0x1d165, 0, -#undef V12745 -#define V12745 (V + 48765) - 0x1d158, 0x1d165, 0x1d16e, 0, -#undef V12746 -#define V12746 (V + 48769) - 0x1d158, 0x1d165, 0x1d16f, 0, -#undef V12747 -#define V12747 (V + 48773) - 0x1d158, 0x1d165, 0x1d170, 0, -#undef V12748 -#define V12748 (V + 48777) - 0x1d158, 0x1d165, 0x1d171, 0, -#undef V12749 -#define V12749 (V + 48781) - 0x1d158, 0x1d165, 0x1d172, 0, -#undef V12750 -#define V12750 (V + 48785) - 0x1d1b9, 0x1d165, 0, -#undef V12751 -#define V12751 (V + 48788) - 0x1d1ba, 0x1d165, 0, -#undef V12752 -#define V12752 (V + 48791) - 0x1d1b9, 0x1d165, 0x1d16e, 0, -#undef V12753 -#define V12753 (V + 48795) - 0x1d1ba, 0x1d165, 0x1d16e, 0, -#undef V12754 -#define V12754 (V + 48799) - 0x1d1b9, 0x1d165, 0x1d16f, 0, -#undef V12755 -#define V12755 (V + 48803) - 0x1d1ba, 0x1d165, 0x1d16f, 0, -#undef V12756 -#define V12756 (V + 48807) - 0x4e3d, 0, -#undef V12757 -#define V12757 (V + 48809) - 0x4e38, 0, -#undef V12758 -#define V12758 (V + 48811) - 0x4e41, 0, -#undef V12759 -#define V12759 (V + 48813) - 0x20122, 0, -#undef V12760 -#define V12760 (V + 48815) - 0x4f60, 0, -#undef V12761 -#define V12761 (V + 48817) - 0x4fbb, 0, -#undef V12762 -#define V12762 (V + 48819) - 0x5002, 0, -#undef V12763 -#define V12763 (V + 48821) - 0x507a, 0, -#undef V12764 -#define V12764 (V + 48823) - 0x5099, 0, -#undef V12765 -#define V12765 (V + 48825) - 0x50cf, 0, -#undef V12766 -#define V12766 (V + 48827) - 0x349e, 0, -#undef V12767 -#define V12767 (V + 48829) - 0x2063a, 0, -#undef V12768 -#define V12768 (V + 48831) - 0x5154, 0, -#undef V12769 -#define V12769 (V + 48833) - 0x5164, 0, -#undef V12770 -#define V12770 (V + 48835) - 0x5177, 0, -#undef V12771 -#define V12771 (V + 48837) - 0x2051c, 0, -#undef V12772 -#define V12772 (V + 48839) - 0x34b9, 0, -#undef V12773 -#define V12773 (V + 48841) - 0x5167, 0, -#undef V12774 -#define V12774 (V + 48843) - 0x518d, 0, -#undef V12775 -#define V12775 (V + 48845) - 0x2054b, 0, -#undef V12776 -#define V12776 (V + 48847) - 0x5197, 0, -#undef V12777 -#define V12777 (V + 48849) - 0x51a4, 0, -#undef V12778 -#define V12778 (V + 48851) - 0x4ecc, 0, -#undef V12779 -#define V12779 (V + 48853) - 0x51ac, 0, -#undef V12780 -#define V12780 (V + 48855) - 0x291df, 0, -#undef V12781 -#define V12781 (V + 48857) - 0x51f5, 0, -#undef V12782 -#define V12782 (V + 48859) - 0x5203, 0, -#undef V12783 -#define V12783 (V + 48861) - 0x34df, 0, -#undef V12784 -#define V12784 (V + 48863) - 0x523b, 0, -#undef V12785 -#define V12785 (V + 48865) - 0x5246, 0, -#undef V12786 -#define V12786 (V + 48867) - 0x5272, 0, -#undef V12787 -#define V12787 (V + 48869) - 0x5277, 0, -#undef V12788 -#define V12788 (V + 48871) - 0x3515, 0, -#undef V12789 -#define V12789 (V + 48873) - 0x5305, 0, -#undef V12790 -#define V12790 (V + 48875) - 0x5306, 0, -#undef V12791 -#define V12791 (V + 48877) - 0x5349, 0, -#undef V12792 -#define V12792 (V + 48879) - 0x535a, 0, -#undef V12793 -#define V12793 (V + 48881) - 0x5373, 0, -#undef V12794 -#define V12794 (V + 48883) - 0x537d, 0, -#undef V12795 -#define V12795 (V + 48885) - 0x537f, 0, -#undef V12796 -#define V12796 (V + 48887) - 0x20a2c, 0, -#undef V12797 -#define V12797 (V + 48889) - 0x7070, 0, -#undef V12798 -#define V12798 (V + 48891) - 0x53ca, 0, -#undef V12799 -#define V12799 (V + 48893) - 0x53df, 0, -#undef V12800 -#define V12800 (V + 48895) - 0x20b63, 0, -#undef V12801 -#define V12801 (V + 48897) - 0x53eb, 0, -#undef V12802 -#define V12802 (V + 48899) - 0x53f1, 0, -#undef V12803 -#define V12803 (V + 48901) - 0x5406, 0, -#undef V12804 -#define V12804 (V + 48903) - 0x549e, 0, -#undef V12805 -#define V12805 (V + 48905) - 0x5438, 0, -#undef V12806 -#define V12806 (V + 48907) - 0x5448, 0, -#undef V12807 -#define V12807 (V + 48909) - 0x5468, 0, -#undef V12808 -#define V12808 (V + 48911) - 0x54a2, 0, -#undef V12809 -#define V12809 (V + 48913) - 0x54f6, 0, -#undef V12810 -#define V12810 (V + 48915) - 0x5510, 0, -#undef V12811 -#define V12811 (V + 48917) - 0x5553, 0, -#undef V12812 -#define V12812 (V + 48919) - 0x5563, 0, -#undef V12813 -#define V12813 (V + 48921) - 0x5584, 0, -#undef V12814 -#define V12814 (V + 48923) - 0x55ab, 0, -#undef V12815 -#define V12815 (V + 48925) - 0x55b3, 0, -#undef V12816 -#define V12816 (V + 48927) - 0x55c2, 0, -#undef V12817 -#define V12817 (V + 48929) - 0x5716, 0, -#undef V12818 -#define V12818 (V + 48931) - 0x5717, 0, -#undef V12819 -#define V12819 (V + 48933) - 0x5651, 0, -#undef V12820 -#define V12820 (V + 48935) - 0x5674, 0, -#undef V12821 -#define V12821 (V + 48937) - 0x58ee, 0, -#undef V12822 -#define V12822 (V + 48939) - 0x57ce, 0, -#undef V12823 -#define V12823 (V + 48941) - 0x57f4, 0, -#undef V12824 -#define V12824 (V + 48943) - 0x580d, 0, -#undef V12825 -#define V12825 (V + 48945) - 0x578b, 0, -#undef V12826 -#define V12826 (V + 48947) - 0x5832, 0, -#undef V12827 -#define V12827 (V + 48949) - 0x5831, 0, -#undef V12828 -#define V12828 (V + 48951) - 0x58ac, 0, -#undef V12829 -#define V12829 (V + 48953) - 0x214e4, 0, -#undef V12830 -#define V12830 (V + 48955) - 0x58f2, 0, -#undef V12831 -#define V12831 (V + 48957) - 0x58f7, 0, -#undef V12832 -#define V12832 (V + 48959) - 0x5906, 0, -#undef V12833 -#define V12833 (V + 48961) - 0x591a, 0, -#undef V12834 -#define V12834 (V + 48963) - 0x5922, 0, -#undef V12835 -#define V12835 (V + 48965) - 0x5962, 0, -#undef V12836 -#define V12836 (V + 48967) - 0x216a8, 0, -#undef V12837 -#define V12837 (V + 48969) - 0x216ea, 0, -#undef V12838 -#define V12838 (V + 48971) - 0x59ec, 0, -#undef V12839 -#define V12839 (V + 48973) - 0x5a1b, 0, -#undef V12840 -#define V12840 (V + 48975) - 0x5a27, 0, -#undef V12841 -#define V12841 (V + 48977) - 0x59d8, 0, -#undef V12842 -#define V12842 (V + 48979) - 0x5a66, 0, -#undef V12843 -#define V12843 (V + 48981) - 0x36ee, 0, -#undef V12844 -#define V12844 (V + 48983) - 0x36fc, 0, -#undef V12845 -#define V12845 (V + 48985) - 0x5b08, 0, -#undef V12846 -#define V12846 (V + 48987) - 0x5b3e, 0, -#undef V12847 -#define V12847 (V + 48989) - 0x219c8, 0, -#undef V12848 -#define V12848 (V + 48991) - 0x5bc3, 0, -#undef V12849 -#define V12849 (V + 48993) - 0x5bd8, 0, -#undef V12850 -#define V12850 (V + 48995) - 0x5bf3, 0, -#undef V12851 -#define V12851 (V + 48997) - 0x21b18, 0, -#undef V12852 -#define V12852 (V + 48999) - 0x5bff, 0, -#undef V12853 -#define V12853 (V + 49001) - 0x5c06, 0, -#undef V12854 -#define V12854 (V + 49003) - 0x5f53, 0, -#undef V12855 -#define V12855 (V + 49005) - 0x5c22, 0, -#undef V12856 -#define V12856 (V + 49007) - 0x3781, 0, -#undef V12857 -#define V12857 (V + 49009) - 0x5c60, 0, -#undef V12858 -#define V12858 (V + 49011) - 0x5cc0, 0, -#undef V12859 -#define V12859 (V + 49013) - 0x5c8d, 0, -#undef V12860 -#define V12860 (V + 49015) - 0x21de4, 0, -#undef V12861 -#define V12861 (V + 49017) - 0x5d43, 0, -#undef V12862 -#define V12862 (V + 49019) - 0x21de6, 0, -#undef V12863 -#define V12863 (V + 49021) - 0x5d6e, 0, -#undef V12864 -#define V12864 (V + 49023) - 0x5d6b, 0, -#undef V12865 -#define V12865 (V + 49025) - 0x5d7c, 0, -#undef V12866 -#define V12866 (V + 49027) - 0x5de1, 0, -#undef V12867 -#define V12867 (V + 49029) - 0x5de2, 0, -#undef V12868 -#define V12868 (V + 49031) - 0x382f, 0, -#undef V12869 -#define V12869 (V + 49033) - 0x5dfd, 0, -#undef V12870 -#define V12870 (V + 49035) - 0x5e28, 0, -#undef V12871 -#define V12871 (V + 49037) - 0x5e3d, 0, -#undef V12872 -#define V12872 (V + 49039) - 0x5e69, 0, -#undef V12873 -#define V12873 (V + 49041) - 0x3862, 0, -#undef V12874 -#define V12874 (V + 49043) - 0x22183, 0, -#undef V12875 -#define V12875 (V + 49045) - 0x387c, 0, -#undef V12876 -#define V12876 (V + 49047) - 0x5eb0, 0, -#undef V12877 -#define V12877 (V + 49049) - 0x5eb3, 0, -#undef V12878 -#define V12878 (V + 49051) - 0x5eb6, 0, -#undef V12879 -#define V12879 (V + 49053) - 0x2a392, 0, -#undef V12880 -#define V12880 (V + 49055) - 0x5efe, 0, -#undef V12881 -#define V12881 (V + 49057) - 0x22331, 0, -#undef V12882 -#define V12882 (V + 49059) - 0x8201, 0, -#undef V12883 -#define V12883 (V + 49061) - 0x5f22, 0, -#undef V12884 -#define V12884 (V + 49063) - 0x38c7, 0, -#undef V12885 -#define V12885 (V + 49065) - 0x232b8, 0, -#undef V12886 -#define V12886 (V + 49067) - 0x261da, 0, -#undef V12887 -#define V12887 (V + 49069) - 0x5f62, 0, -#undef V12888 -#define V12888 (V + 49071) - 0x5f6b, 0, -#undef V12889 -#define V12889 (V + 49073) - 0x38e3, 0, -#undef V12890 -#define V12890 (V + 49075) - 0x5f9a, 0, -#undef V12891 -#define V12891 (V + 49077) - 0x5fcd, 0, -#undef V12892 -#define V12892 (V + 49079) - 0x5fd7, 0, -#undef V12893 -#define V12893 (V + 49081) - 0x5ff9, 0, -#undef V12894 -#define V12894 (V + 49083) - 0x6081, 0, -#undef V12895 -#define V12895 (V + 49085) - 0x393a, 0, -#undef V12896 -#define V12896 (V + 49087) - 0x391c, 0, -#undef V12897 -#define V12897 (V + 49089) - 0x226d4, 0, -#undef V12898 -#define V12898 (V + 49091) - 0x60c7, 0, -#undef V12899 -#define V12899 (V + 49093) - 0x6148, 0, -#undef V12900 -#define V12900 (V + 49095) - 0x614c, 0, -#undef V12901 -#define V12901 (V + 49097) - 0x617a, 0, -#undef V12902 -#define V12902 (V + 49099) - 0x61b2, 0, -#undef V12903 -#define V12903 (V + 49101) - 0x61a4, 0, -#undef V12904 -#define V12904 (V + 49103) - 0x61af, 0, -#undef V12905 -#define V12905 (V + 49105) - 0x61de, 0, -#undef V12906 -#define V12906 (V + 49107) - 0x6210, 0, -#undef V12907 -#define V12907 (V + 49109) - 0x621b, 0, -#undef V12908 -#define V12908 (V + 49111) - 0x625d, 0, -#undef V12909 -#define V12909 (V + 49113) - 0x62b1, 0, -#undef V12910 -#define V12910 (V + 49115) - 0x62d4, 0, -#undef V12911 -#define V12911 (V + 49117) - 0x6350, 0, -#undef V12912 -#define V12912 (V + 49119) - 0x22b0c, 0, -#undef V12913 -#define V12913 (V + 49121) - 0x633d, 0, -#undef V12914 -#define V12914 (V + 49123) - 0x62fc, 0, -#undef V12915 -#define V12915 (V + 49125) - 0x6368, 0, -#undef V12916 -#define V12916 (V + 49127) - 0x6383, 0, -#undef V12917 -#define V12917 (V + 49129) - 0x63e4, 0, -#undef V12918 -#define V12918 (V + 49131) - 0x22bf1, 0, -#undef V12919 -#define V12919 (V + 49133) - 0x6422, 0, -#undef V12920 -#define V12920 (V + 49135) - 0x63c5, 0, -#undef V12921 -#define V12921 (V + 49137) - 0x63a9, 0, -#undef V12922 -#define V12922 (V + 49139) - 0x3a2e, 0, -#undef V12923 -#define V12923 (V + 49141) - 0x6469, 0, -#undef V12924 -#define V12924 (V + 49143) - 0x647e, 0, -#undef V12925 -#define V12925 (V + 49145) - 0x649d, 0, -#undef V12926 -#define V12926 (V + 49147) - 0x6477, 0, -#undef V12927 -#define V12927 (V + 49149) - 0x3a6c, 0, -#undef V12928 -#define V12928 (V + 49151) - 0x656c, 0, -#undef V12929 -#define V12929 (V + 49153) - 0x2300a, 0, -#undef V12930 -#define V12930 (V + 49155) - 0x65e3, 0, -#undef V12931 -#define V12931 (V + 49157) - 0x66f8, 0, -#undef V12932 -#define V12932 (V + 49159) - 0x6649, 0, -#undef V12933 -#define V12933 (V + 49161) - 0x3b19, 0, -#undef V12934 -#define V12934 (V + 49163) - 0x3b08, 0, -#undef V12935 -#define V12935 (V + 49165) - 0x3ae4, 0, -#undef V12936 -#define V12936 (V + 49167) - 0x5192, 0, -#undef V12937 -#define V12937 (V + 49169) - 0x5195, 0, -#undef V12938 -#define V12938 (V + 49171) - 0x6700, 0, -#undef V12939 -#define V12939 (V + 49173) - 0x669c, 0, -#undef V12940 -#define V12940 (V + 49175) - 0x80ad, 0, -#undef V12941 -#define V12941 (V + 49177) - 0x43d9, 0, -#undef V12942 -#define V12942 (V + 49179) - 0x6721, 0, -#undef V12943 -#define V12943 (V + 49181) - 0x675e, 0, -#undef V12944 -#define V12944 (V + 49183) - 0x6753, 0, -#undef V12945 -#define V12945 (V + 49185) - 0x233c3, 0, -#undef V12946 -#define V12946 (V + 49187) - 0x3b49, 0, -#undef V12947 -#define V12947 (V + 49189) - 0x67fa, 0, -#undef V12948 -#define V12948 (V + 49191) - 0x6785, 0, -#undef V12949 -#define V12949 (V + 49193) - 0x6852, 0, -#undef V12950 -#define V12950 (V + 49195) - 0x2346d, 0, -#undef V12951 -#define V12951 (V + 49197) - 0x688e, 0, -#undef V12952 -#define V12952 (V + 49199) - 0x681f, 0, -#undef V12953 -#define V12953 (V + 49201) - 0x6914, 0, -#undef V12954 -#define V12954 (V + 49203) - 0x6942, 0, -#undef V12955 -#define V12955 (V + 49205) - 0x69a3, 0, -#undef V12956 -#define V12956 (V + 49207) - 0x69ea, 0, -#undef V12957 -#define V12957 (V + 49209) - 0x6aa8, 0, -#undef V12958 -#define V12958 (V + 49211) - 0x236a3, 0, -#undef V12959 -#define V12959 (V + 49213) - 0x6adb, 0, -#undef V12960 -#define V12960 (V + 49215) - 0x3c18, 0, -#undef V12961 -#define V12961 (V + 49217) - 0x6b21, 0, -#undef V12962 -#define V12962 (V + 49219) - 0x238a7, 0, -#undef V12963 -#define V12963 (V + 49221) - 0x6b54, 0, -#undef V12964 -#define V12964 (V + 49223) - 0x3c4e, 0, -#undef V12965 -#define V12965 (V + 49225) - 0x6b72, 0, -#undef V12966 -#define V12966 (V + 49227) - 0x6b9f, 0, -#undef V12967 -#define V12967 (V + 49229) - 0x6bbb, 0, -#undef V12968 -#define V12968 (V + 49231) - 0x23a8d, 0, -#undef V12969 -#define V12969 (V + 49233) - 0x21d0b, 0, -#undef V12970 -#define V12970 (V + 49235) - 0x23afa, 0, -#undef V12971 -#define V12971 (V + 49237) - 0x6c4e, 0, -#undef V12972 -#define V12972 (V + 49239) - 0x23cbc, 0, -#undef V12973 -#define V12973 (V + 49241) - 0x6cbf, 0, -#undef V12974 -#define V12974 (V + 49243) - 0x6ccd, 0, -#undef V12975 -#define V12975 (V + 49245) - 0x6c67, 0, -#undef V12976 -#define V12976 (V + 49247) - 0x6d16, 0, -#undef V12977 -#define V12977 (V + 49249) - 0x6d3e, 0, -#undef V12978 -#define V12978 (V + 49251) - 0x6d69, 0, -#undef V12979 -#define V12979 (V + 49253) - 0x6d78, 0, -#undef V12980 -#define V12980 (V + 49255) - 0x6d85, 0, -#undef V12981 -#define V12981 (V + 49257) - 0x23d1e, 0, -#undef V12982 -#define V12982 (V + 49259) - 0x6d34, 0, -#undef V12983 -#define V12983 (V + 49261) - 0x6e2f, 0, -#undef V12984 -#define V12984 (V + 49263) - 0x6e6e, 0, -#undef V12985 -#define V12985 (V + 49265) - 0x3d33, 0, -#undef V12986 -#define V12986 (V + 49267) - 0x6ec7, 0, -#undef V12987 -#define V12987 (V + 49269) - 0x23ed1, 0, -#undef V12988 -#define V12988 (V + 49271) - 0x6df9, 0, -#undef V12989 -#define V12989 (V + 49273) - 0x6f6e, 0, -#undef V12990 -#define V12990 (V + 49275) - 0x23f5e, 0, -#undef V12991 -#define V12991 (V + 49277) - 0x23f8e, 0, -#undef V12992 -#define V12992 (V + 49279) - 0x6fc6, 0, -#undef V12993 -#define V12993 (V + 49281) - 0x7039, 0, -#undef V12994 -#define V12994 (V + 49283) - 0x701b, 0, -#undef V12995 -#define V12995 (V + 49285) - 0x3d96, 0, -#undef V12996 -#define V12996 (V + 49287) - 0x704a, 0, -#undef V12997 -#define V12997 (V + 49289) - 0x707d, 0, -#undef V12998 -#define V12998 (V + 49291) - 0x7077, 0, -#undef V12999 -#define V12999 (V + 49293) - 0x70ad, 0, -#undef V13000 -#define V13000 (V + 49295) - 0x20525, 0, -#undef V13001 -#define V13001 (V + 49297) - 0x7145, 0, -#undef V13002 -#define V13002 (V + 49299) - 0x24263, 0, -#undef V13003 -#define V13003 (V + 49301) - 0x719c, 0, -#undef V13004 -#define V13004 (V + 49303) - 0x243ab, 0, -#undef V13005 -#define V13005 (V + 49305) - 0x7228, 0, -#undef V13006 -#define V13006 (V + 49307) - 0x7250, 0, -#undef V13007 -#define V13007 (V + 49309) - 0x24608, 0, -#undef V13008 -#define V13008 (V + 49311) - 0x7280, 0, -#undef V13009 -#define V13009 (V + 49313) - 0x7295, 0, -#undef V13010 -#define V13010 (V + 49315) - 0x24735, 0, -#undef V13011 -#define V13011 (V + 49317) - 0x24814, 0, -#undef V13012 -#define V13012 (V + 49319) - 0x737a, 0, -#undef V13013 -#define V13013 (V + 49321) - 0x738b, 0, -#undef V13014 -#define V13014 (V + 49323) - 0x3eac, 0, -#undef V13015 -#define V13015 (V + 49325) - 0x73a5, 0, -#undef V13016 -#define V13016 (V + 49327) - 0x3eb8, 0, -#undef V13017 -#define V13017 (V + 49329) - 0x7447, 0, -#undef V13018 -#define V13018 (V + 49331) - 0x745c, 0, -#undef V13019 -#define V13019 (V + 49333) - 0x7485, 0, -#undef V13020 -#define V13020 (V + 49335) - 0x74ca, 0, -#undef V13021 -#define V13021 (V + 49337) - 0x3f1b, 0, -#undef V13022 -#define V13022 (V + 49339) - 0x7524, 0, -#undef V13023 -#define V13023 (V + 49341) - 0x24c36, 0, -#undef V13024 -#define V13024 (V + 49343) - 0x753e, 0, -#undef V13025 -#define V13025 (V + 49345) - 0x24c92, 0, -#undef V13026 -#define V13026 (V + 49347) - 0x2219f, 0, -#undef V13027 -#define V13027 (V + 49349) - 0x7610, 0, -#undef V13028 -#define V13028 (V + 49351) - 0x24fa1, 0, -#undef V13029 -#define V13029 (V + 49353) - 0x24fb8, 0, -#undef V13030 -#define V13030 (V + 49355) - 0x25044, 0, -#undef V13031 -#define V13031 (V + 49357) - 0x3ffc, 0, -#undef V13032 -#define V13032 (V + 49359) - 0x4008, 0, -#undef V13033 -#define V13033 (V + 49361) - 0x250f3, 0, -#undef V13034 -#define V13034 (V + 49363) - 0x250f2, 0, -#undef V13035 -#define V13035 (V + 49365) - 0x25119, 0, -#undef V13036 -#define V13036 (V + 49367) - 0x25133, 0, -#undef V13037 -#define V13037 (V + 49369) - 0x771e, 0, -#undef V13038 -#define V13038 (V + 49371) - 0x771f, 0, -#undef V13039 -#define V13039 (V + 49373) - 0x778b, 0, -#undef V13040 -#define V13040 (V + 49375) - 0x4046, 0, -#undef V13041 -#define V13041 (V + 49377) - 0x4096, 0, -#undef V13042 -#define V13042 (V + 49379) - 0x2541d, 0, -#undef V13043 -#define V13043 (V + 49381) - 0x784e, 0, -#undef V13044 -#define V13044 (V + 49383) - 0x40e3, 0, -#undef V13045 -#define V13045 (V + 49385) - 0x25626, 0, -#undef V13046 -#define V13046 (V + 49387) - 0x2569a, 0, -#undef V13047 -#define V13047 (V + 49389) - 0x256c5, 0, -#undef V13048 -#define V13048 (V + 49391) - 0x79eb, 0, -#undef V13049 -#define V13049 (V + 49393) - 0x412f, 0, -#undef V13050 -#define V13050 (V + 49395) - 0x7a4a, 0, -#undef V13051 -#define V13051 (V + 49397) - 0x7a4f, 0, -#undef V13052 -#define V13052 (V + 49399) - 0x2597c, 0, -#undef V13053 -#define V13053 (V + 49401) - 0x25aa7, 0, -#undef V13054 -#define V13054 (V + 49403) - 0x7aee, 0, -#undef V13055 -#define V13055 (V + 49405) - 0x4202, 0, -#undef V13056 -#define V13056 (V + 49407) - 0x25bab, 0, -#undef V13057 -#define V13057 (V + 49409) - 0x7bc6, 0, -#undef V13058 -#define V13058 (V + 49411) - 0x7bc9, 0, -#undef V13059 -#define V13059 (V + 49413) - 0x4227, 0, -#undef V13060 -#define V13060 (V + 49415) - 0x25c80, 0, -#undef V13061 -#define V13061 (V + 49417) - 0x7cd2, 0, -#undef V13062 -#define V13062 (V + 49419) - 0x42a0, 0, -#undef V13063 -#define V13063 (V + 49421) - 0x7ce8, 0, -#undef V13064 -#define V13064 (V + 49423) - 0x7ce3, 0, -#undef V13065 -#define V13065 (V + 49425) - 0x7d00, 0, -#undef V13066 -#define V13066 (V + 49427) - 0x25f86, 0, -#undef V13067 -#define V13067 (V + 49429) - 0x7d63, 0, -#undef V13068 -#define V13068 (V + 49431) - 0x4301, 0, -#undef V13069 -#define V13069 (V + 49433) - 0x7dc7, 0, -#undef V13070 -#define V13070 (V + 49435) - 0x7e02, 0, -#undef V13071 -#define V13071 (V + 49437) - 0x7e45, 0, -#undef V13072 -#define V13072 (V + 49439) - 0x4334, 0, -#undef V13073 -#define V13073 (V + 49441) - 0x26228, 0, -#undef V13074 -#define V13074 (V + 49443) - 0x26247, 0, -#undef V13075 -#define V13075 (V + 49445) - 0x4359, 0, -#undef V13076 -#define V13076 (V + 49447) - 0x262d9, 0, -#undef V13077 -#define V13077 (V + 49449) - 0x7f7a, 0, -#undef V13078 -#define V13078 (V + 49451) - 0x2633e, 0, -#undef V13079 -#define V13079 (V + 49453) - 0x7f95, 0, -#undef V13080 -#define V13080 (V + 49455) - 0x7ffa, 0, -#undef V13081 -#define V13081 (V + 49457) - 0x264da, 0, -#undef V13082 -#define V13082 (V + 49459) - 0x26523, 0, -#undef V13083 -#define V13083 (V + 49461) - 0x8060, 0, -#undef V13084 -#define V13084 (V + 49463) - 0x265a8, 0, -#undef V13085 -#define V13085 (V + 49465) - 0x8070, 0, -#undef V13086 -#define V13086 (V + 49467) - 0x2335f, 0, -#undef V13087 -#define V13087 (V + 49469) - 0x43d5, 0, -#undef V13088 -#define V13088 (V + 49471) - 0x80b2, 0, -#undef V13089 -#define V13089 (V + 49473) - 0x8103, 0, -#undef V13090 -#define V13090 (V + 49475) - 0x440b, 0, -#undef V13091 -#define V13091 (V + 49477) - 0x813e, 0, -#undef V13092 -#define V13092 (V + 49479) - 0x5ab5, 0, -#undef V13093 -#define V13093 (V + 49481) - 0x267a7, 0, -#undef V13094 -#define V13094 (V + 49483) - 0x267b5, 0, -#undef V13095 -#define V13095 (V + 49485) - 0x23393, 0, -#undef V13096 -#define V13096 (V + 49487) - 0x2339c, 0, -#undef V13097 -#define V13097 (V + 49489) - 0x8204, 0, -#undef V13098 -#define V13098 (V + 49491) - 0x8f9e, 0, -#undef V13099 -#define V13099 (V + 49493) - 0x446b, 0, -#undef V13100 -#define V13100 (V + 49495) - 0x8291, 0, -#undef V13101 -#define V13101 (V + 49497) - 0x828b, 0, -#undef V13102 -#define V13102 (V + 49499) - 0x829d, 0, -#undef V13103 -#define V13103 (V + 49501) - 0x52b3, 0, -#undef V13104 -#define V13104 (V + 49503) - 0x82b1, 0, -#undef V13105 -#define V13105 (V + 49505) - 0x82b3, 0, -#undef V13106 -#define V13106 (V + 49507) - 0x82bd, 0, -#undef V13107 -#define V13107 (V + 49509) - 0x82e6, 0, -#undef V13108 -#define V13108 (V + 49511) - 0x26b3c, 0, -#undef V13109 -#define V13109 (V + 49513) - 0x831d, 0, -#undef V13110 -#define V13110 (V + 49515) - 0x8363, 0, -#undef V13111 -#define V13111 (V + 49517) - 0x83ad, 0, -#undef V13112 -#define V13112 (V + 49519) - 0x8323, 0, -#undef V13113 -#define V13113 (V + 49521) - 0x83bd, 0, -#undef V13114 -#define V13114 (V + 49523) - 0x83e7, 0, -#undef V13115 -#define V13115 (V + 49525) - 0x8353, 0, -#undef V13116 -#define V13116 (V + 49527) - 0x83ca, 0, -#undef V13117 -#define V13117 (V + 49529) - 0x83cc, 0, -#undef V13118 -#define V13118 (V + 49531) - 0x83dc, 0, -#undef V13119 -#define V13119 (V + 49533) - 0x26c36, 0, -#undef V13120 -#define V13120 (V + 49535) - 0x26d6b, 0, -#undef V13121 -#define V13121 (V + 49537) - 0x26cd5, 0, -#undef V13122 -#define V13122 (V + 49539) - 0x452b, 0, -#undef V13123 -#define V13123 (V + 49541) - 0x84f1, 0, -#undef V13124 -#define V13124 (V + 49543) - 0x84f3, 0, -#undef V13125 -#define V13125 (V + 49545) - 0x8516, 0, -#undef V13126 -#define V13126 (V + 49547) - 0x273ca, 0, -#undef V13127 -#define V13127 (V + 49549) - 0x8564, 0, -#undef V13128 -#define V13128 (V + 49551) - 0x26f2c, 0, -#undef V13129 -#define V13129 (V + 49553) - 0x455d, 0, -#undef V13130 -#define V13130 (V + 49555) - 0x4561, 0, -#undef V13131 -#define V13131 (V + 49557) - 0x26fb1, 0, -#undef V13132 -#define V13132 (V + 49559) - 0x270d2, 0, -#undef V13133 -#define V13133 (V + 49561) - 0x456b, 0, -#undef V13134 -#define V13134 (V + 49563) - 0x8650, 0, -#undef V13135 -#define V13135 (V + 49565) - 0x8667, 0, -#undef V13136 -#define V13136 (V + 49567) - 0x8669, 0, -#undef V13137 -#define V13137 (V + 49569) - 0x86a9, 0, -#undef V13138 -#define V13138 (V + 49571) - 0x8688, 0, -#undef V13139 -#define V13139 (V + 49573) - 0x870e, 0, -#undef V13140 -#define V13140 (V + 49575) - 0x86e2, 0, -#undef V13141 -#define V13141 (V + 49577) - 0x8728, 0, -#undef V13142 -#define V13142 (V + 49579) - 0x876b, 0, -#undef V13143 -#define V13143 (V + 49581) - 0x8786, 0, -#undef V13144 -#define V13144 (V + 49583) - 0x45d7, 0, -#undef V13145 -#define V13145 (V + 49585) - 0x87e1, 0, -#undef V13146 -#define V13146 (V + 49587) - 0x8801, 0, -#undef V13147 -#define V13147 (V + 49589) - 0x45f9, 0, -#undef V13148 -#define V13148 (V + 49591) - 0x8860, 0, -#undef V13149 -#define V13149 (V + 49593) - 0x8863, 0, -#undef V13150 -#define V13150 (V + 49595) - 0x27667, 0, -#undef V13151 -#define V13151 (V + 49597) - 0x88d7, 0, -#undef V13152 -#define V13152 (V + 49599) - 0x88de, 0, -#undef V13153 -#define V13153 (V + 49601) - 0x4635, 0, -#undef V13154 -#define V13154 (V + 49603) - 0x88fa, 0, -#undef V13155 -#define V13155 (V + 49605) - 0x34bb, 0, -#undef V13156 -#define V13156 (V + 49607) - 0x278ae, 0, -#undef V13157 -#define V13157 (V + 49609) - 0x27966, 0, -#undef V13158 -#define V13158 (V + 49611) - 0x46be, 0, -#undef V13159 -#define V13159 (V + 49613) - 0x46c7, 0, -#undef V13160 -#define V13160 (V + 49615) - 0x8aa0, 0, -#undef V13161 -#define V13161 (V + 49617) - 0x8c55, 0, -#undef V13162 -#define V13162 (V + 49619) - 0x27ca8, 0, -#undef V13163 -#define V13163 (V + 49621) - 0x8cab, 0, -#undef V13164 -#define V13164 (V + 49623) - 0x8cc1, 0, -#undef V13165 -#define V13165 (V + 49625) - 0x8d1b, 0, -#undef V13166 -#define V13166 (V + 49627) - 0x8d77, 0, -#undef V13167 -#define V13167 (V + 49629) - 0x27f2f, 0, -#undef V13168 -#define V13168 (V + 49631) - 0x20804, 0, -#undef V13169 -#define V13169 (V + 49633) - 0x8dcb, 0, -#undef V13170 -#define V13170 (V + 49635) - 0x8dbc, 0, -#undef V13171 -#define V13171 (V + 49637) - 0x8df0, 0, -#undef V13172 -#define V13172 (V + 49639) - 0x208de, 0, -#undef V13173 -#define V13173 (V + 49641) - 0x8ed4, 0, -#undef V13174 -#define V13174 (V + 49643) - 0x285d2, 0, -#undef V13175 -#define V13175 (V + 49645) - 0x285ed, 0, -#undef V13176 -#define V13176 (V + 49647) - 0x9094, 0, -#undef V13177 -#define V13177 (V + 49649) - 0x90f1, 0, -#undef V13178 -#define V13178 (V + 49651) - 0x9111, 0, -#undef V13179 -#define V13179 (V + 49653) - 0x2872e, 0, -#undef V13180 -#define V13180 (V + 49655) - 0x911b, 0, -#undef V13181 -#define V13181 (V + 49657) - 0x9238, 0, -#undef V13182 -#define V13182 (V + 49659) - 0x92d7, 0, -#undef V13183 -#define V13183 (V + 49661) - 0x92d8, 0, -#undef V13184 -#define V13184 (V + 49663) - 0x927c, 0, -#undef V13185 -#define V13185 (V + 49665) - 0x93f9, 0, -#undef V13186 -#define V13186 (V + 49667) - 0x9415, 0, -#undef V13187 -#define V13187 (V + 49669) - 0x28bfa, 0, -#undef V13188 -#define V13188 (V + 49671) - 0x958b, 0, -#undef V13189 -#define V13189 (V + 49673) - 0x4995, 0, -#undef V13190 -#define V13190 (V + 49675) - 0x95b7, 0, -#undef V13191 -#define V13191 (V + 49677) - 0x28d77, 0, -#undef V13192 -#define V13192 (V + 49679) - 0x49e6, 0, -#undef V13193 -#define V13193 (V + 49681) - 0x96c3, 0, -#undef V13194 -#define V13194 (V + 49683) - 0x5db2, 0, -#undef V13195 -#define V13195 (V + 49685) - 0x9723, 0, -#undef V13196 -#define V13196 (V + 49687) - 0x29145, 0, -#undef V13197 -#define V13197 (V + 49689) - 0x2921a, 0, -#undef V13198 -#define V13198 (V + 49691) - 0x4a6e, 0, -#undef V13199 -#define V13199 (V + 49693) - 0x4a76, 0, -#undef V13200 -#define V13200 (V + 49695) - 0x97e0, 0, -#undef V13201 -#define V13201 (V + 49697) - 0x2940a, 0, -#undef V13202 -#define V13202 (V + 49699) - 0x4ab2, 0, -#undef V13203 -#define V13203 (V + 49701) - 0x29496, 0, -#undef V13204 -#define V13204 (V + 49703) - 0x9829, 0, -#undef V13205 -#define V13205 (V + 49705) - 0x295b6, 0, -#undef V13206 -#define V13206 (V + 49707) - 0x98e2, 0, -#undef V13207 -#define V13207 (V + 49709) - 0x4b33, 0, -#undef V13208 -#define V13208 (V + 49711) - 0x9929, 0, -#undef V13209 -#define V13209 (V + 49713) - 0x99a7, 0, -#undef V13210 -#define V13210 (V + 49715) - 0x99c2, 0, -#undef V13211 -#define V13211 (V + 49717) - 0x99fe, 0, -#undef V13212 -#define V13212 (V + 49719) - 0x4bce, 0, -#undef V13213 -#define V13213 (V + 49721) - 0x29b30, 0, -#undef V13214 -#define V13214 (V + 49723) - 0x9c40, 0, -#undef V13215 -#define V13215 (V + 49725) - 0x9cfd, 0, -#undef V13216 -#define V13216 (V + 49727) - 0x4cce, 0, -#undef V13217 -#define V13217 (V + 49729) - 0x4ced, 0, -#undef V13218 -#define V13218 (V + 49731) - 0x9d67, 0, -#undef V13219 -#define V13219 (V + 49733) - 0x2a0ce, 0, -#undef V13220 -#define V13220 (V + 49735) - 0x4cf8, 0, -#undef V13221 -#define V13221 (V + 49737) - 0x2a105, 0, -#undef V13222 -#define V13222 (V + 49739) - 0x2a20e, 0, -#undef V13223 -#define V13223 (V + 49741) - 0x2a291, 0, -#undef V13224 -#define V13224 (V + 49743) - 0x9ebb, 0, -#undef V13225 -#define V13225 (V + 49745) - 0x4d56, 0, -#undef V13226 -#define V13226 (V + 49747) - 0x9ef9, 0, -#undef V13227 -#define V13227 (V + 49749) - 0x9efe, 0, -#undef V13228 -#define V13228 (V + 49751) - 0x9f05, 0, -#undef V13229 -#define V13229 (V + 49753) - 0x9f0f, 0, -#undef V13230 -#define V13230 (V + 49755) - 0x9f16, 0, -#undef V13231 -#define V13231 (V + 49757) - 0x9f3b, 0, -#undef V13232 -#define V13232 (V + 49759) - 0x2a600, 0, - }; - - static const NUnicode::NPrivate::TDecompositionTable::TValuePtr P[][32] = { - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[0] - { - V0, V1, V2, V3, V4, V5, V6, V7, - V8, V9, V10, V11, V12, V13, V14, V15, - V16, V17, V18, V19, V20, V21, V22, 0, - V23, V24, V25, V26, V27, V28, 0, V29, - }, // P[1] - { - V30, V31, V32, V33, V34, V35, V36, V37, - V38, V39, V40, V41, V42, V43, V44, V45, - V46, V47, V48, V49, V50, V51, V52, 0, - V53, V54, V55, V56, V57, V58, 0, V59, - }, // P[2] - { - V60, V61, V62, V63, V64, V65, V66, V67, - V68, V69, V70, V71, V72, V73, V74, V75, - V16, V46, V76, V77, V78, V79, V80, V81, - V82, V83, V84, V85, V86, V87, V88, V89, - }, // P[3] - { - V90, V91, V92, V93, V94, V95, V96, V97, - V98, V99, V100, V101, V102, V103, V104, V105, - V106, V107, 0, 0, V108, V109, V110, V111, - 0, V112, V113, V114, V115, V116, V117, 0, - }, // P[4] - { - 0, V118, V119, V120, V121, V122, V123, V124, - V125, 0, 0, 0, V126, V127, V128, V129, - V130, V131, V132, V133, V134, V135, V136, V137, - V138, V139, V140, V141, V142, V143, V144, V145, - }, // P[5] - { - V146, V147, V148, V149, V150, V151, V152, V153, - V154, V155, V156, V157, V158, V159, V160, V161, - V162, V163, V164, V165, V166, V167, V168, V169, - V170, V171, V172, V173, V174, V175, V176, 0, - }, // P[6] - { - V177, V178, V178, V177, 0, 0, 0, V179, - V180, V181, V16, V16, V46, 0, 0, 0, - V182, V183, V184, V185, 0, V186, 0, V187, - V188, V189, V119, 0, 0, V190, V191, V23, - }, // P[7] - { - V192, V193, V194, V195, V196, V197, 0, 0, - 0, 0, 0, V153, V152, V153, V152, V198, - V199, 0, V200, V201, V202, V203, V204, 0, - 0, 0, V205, 0, 0, 0, 0, 0, - }, // P[8] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, V206, V207, V208, - V209, V210, V211, V212, V213, V214, V215, V216, - V217, V218, V219, V220, V221, 0, V222, V223, - }, // P[9] - { - V224, V225, V226, V227, V185, V228, V229, V230, - V231, V232, V233, V234, V235, V236, V237, V238, - V239, 0, 0, 0, V240, V241, 0, 0, - V242, V243, V244, V245, V246, V247, V248, V249, - }, // P[10] - { - V250, V251, V252, V253, V254, V255, V256, V257, - V258, V259, V260, V261, V262, V263, V264, V265, - V266, V267, V268, V269, V270, V271, V272, V273, - V274, V275, V276, V277, 0, 0, V278, V279, - }, // P[11] - { - V190, V46, 0, 0, V203, V204, V280, V281, - V282, V283, V284, V285, V286, V287, V288, V289, - V290, V291, V292, V293, V119, V191, V153, V294, - V295, V296, V297, V179, V180, V118, V152, V298, - }, // P[12] - { - V204, 0, 0, V178, V299, 0, V182, V300, - V301, V294, 0, V302, V303, V304, V201, V202, - 0, V305, 0, V177, 0, V180, V46, V46, - 0, 0, V306, V300, 0, 0, 0, V307, - }, // P[13] - { - V228, V228, 0, 0, 0, 0, V97, V308, - V107, 0, 0, V119, V119, V119, V309, 0, - 0, V310, V191, V191, 0, V53, 0, 0, - 0, 0, 0, 0, V304, V304, V304, 0, - }, // P[14] - { - 0, 0, V298, 0, V307, 0, V311, 0, - V153, V312, 0, V313, 0, 0, 0, 0, - V204, V204, 0, V205, 0, 0, 0, 0, - 0, 0, 0, 0, 0, V294, 0, 0, - }, // P[15] - { - V302, 0, 0, V314, V315, V316, V317, V318, - 0, V319, V320, V321, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[16] - { - V322, V323, 0, V324, V325, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[17] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, V326, 0, 0, 0, - 0, 0, 0, 0, 0, 0, V327, 0, - }, // P[18] - { - 0, 0, 0, 0, 0, V328, V329, V330, - V331, V332, V333, 0, V334, 0, V335, V336, - V337, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[19] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V338, V339, V340, V341, V342, V343, - V344, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[20] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V345, V346, V347, V348, V349, 0, - 0, 0, 0, V350, V351, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[21] - { - V352, V353, 0, V354, 0, 0, 0, V355, - 0, V356, V357, 0, V358, V359, V360, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, V361, 0, 0, 0, 0, 0, 0, - }, // P[22] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, V362, 0, 0, 0, 0, 0, 0, - }, // P[23] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - V363, V364, 0, V365, 0, 0, 0, V366, - 0, V367, V368, 0, V369, V370, V371, 0, - }, // P[24] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, V372, V373, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[25] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V361, V362, V374, V375, V376, V377, - V378, V379, V378, V379, V378, V379, V380, V381, - V382, V383, V384, V385, V384, V385, V384, V385, - }, // P[26] - { - V384, V385, V386, V387, V388, V389, V390, V391, - 0, 0, V392, V393, V394, V395, V396, V397, - V398, V399, V400, V401, V402, V403, V404, V405, - V404, V405, 0, 0, 0, 0, V406, V407, - }, // P[27] - { - 0, V408, V409, V384, V385, V410, V411, V386, - V387, V386, V387, V404, V405, V412, V413, 0, - V414, V415, V416, V417, V418, V419, V420, V421, - 0, 0, V422, V423, V424, V425, V426, V427, - }, // P[28] - { - 0, 0, V361, V362, V361, V362, V428, V429, - V430, V431, V432, V433, V434, V435, V436, V437, - V438, V439, V440, V441, V442, V443, V378, V379, - V444, V445, V378, V379, V400, V401, V400, V401, - }, // P[29] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V410, V411, V446, V447, V448, V449, - V450, V451, 0, 0, 0, 0, V384, V385, - }, // P[30] - { - V410, V411, V386, V387, V390, V391, V452, V453, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[31] - { - 0, 0, V454, V455, V456, V457, V458, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[32] - { - V459, 0, V460, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, V461, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[33] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, V462, 0, 0, 0, 0, 0, 0, - 0, V463, 0, 0, V464, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[34] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - V465, V466, V467, V468, V469, V470, V471, V472, - }, // P[35] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, V473, V474, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, V475, V476, 0, V477, - }, // P[36] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, V478, 0, 0, V479, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[37] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, V480, V481, V482, 0, 0, V483, 0, - }, // P[38] - { - 0, 0, 0, 0, 0, 0, 0, 0, - V484, 0, 0, V485, V486, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, V487, V488, 0, 0, - }, // P[39] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, V489, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[40] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V490, V491, V492, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[41] - { - 0, 0, 0, 0, 0, 0, 0, 0, - V493, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[42] - { - V494, 0, 0, 0, 0, 0, 0, V495, - V496, 0, V497, V498, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[43] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V499, V500, V501, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[44] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V502, 0, V503, V504, V505, 0, - }, // P[45] - { - 0, 0, 0, V506, 0, 0, 0, 0, - 0, 0, 0, 0, 0, V507, 0, 0, - 0, 0, V508, 0, 0, 0, 0, V509, - 0, 0, 0, 0, V510, 0, 0, 0, - }, // P[46] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, V511, 0, 0, 0, 0, 0, 0, - 0, 0, 0, V512, 0, V513, V514, 0, - V515, 0, 0, 0, 0, 0, 0, 0, - }, // P[47] - { - 0, V516, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, V517, 0, 0, 0, 0, - 0, 0, 0, 0, 0, V518, 0, 0, - }, // P[48] - { - 0, 0, V519, 0, 0, 0, 0, V520, - 0, 0, 0, 0, V521, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, V522, 0, 0, 0, 0, 0, 0, - }, // P[49] - { - 0, 0, 0, 0, 0, 0, V523, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[50] - { - 0, 0, 0, 0, 0, 0, V524, 0, - V525, 0, V526, 0, V527, 0, V528, 0, - 0, 0, V529, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[51] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, V530, 0, V531, 0, 0, - }, // P[52] - { - V532, V533, 0, V534, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[53] - { - V535, V536, V537, V538, V539, V540, V541, V542, - V543, V544, V545, V546, V547, V548, V549, V550, - V551, V552, V553, V554, V555, V556, V557, V558, - V559, V560, V561, V562, V563, V564, V565, V566, - }, // P[54] - { - V567, V568, V569, V570, V571, V572, V573, V574, - V575, V576, V577, V578, V579, V580, V581, V582, - V583, V584, V585, V586, V587, V588, V589, V590, - V591, V592, V593, V594, V595, V596, V597, V598, - }, // P[55] - { - V599, V600, V601, V602, V603, V604, V605, V606, - V607, V608, V609, V610, V611, V612, V613, V614, - V615, V616, V617, V618, V619, V620, V621, V622, - V623, V624, V625, V626, V627, V628, V629, V630, - }, // P[56] - { - V631, V632, V633, V634, V635, V636, V637, V638, - V639, V640, V641, V642, V643, V644, V645, V646, - V647, V648, V649, V650, V651, V652, V653, V654, - V655, V656, V657, V658, V659, V660, V661, V662, - }, // P[57] - { - V663, V664, V665, V666, V667, V668, V669, V670, - V671, V672, V673, V674, V675, V676, V677, V678, - V679, V680, V681, V682, V683, V684, V685, V686, - V687, V688, 0, V689, 0, 0, 0, 0, - }, // P[58] - { - V690, V691, V692, V693, V694, V695, V696, V697, - V698, V699, V700, V701, V702, V703, V704, V705, - V706, V707, V708, V709, V710, V711, V712, V713, - V714, V715, V716, V717, V718, V719, V720, V721, - }, // P[59] - { - V722, V723, V724, V725, V726, V727, V728, V729, - V730, V731, V732, V733, V734, V735, V736, V737, - V738, V739, V740, V741, V742, V743, V744, V745, - V746, V747, V748, V749, V750, V751, V752, V753, - }, // P[60] - { - V754, V755, V756, V757, V758, V759, V760, V761, - V762, V763, V764, V765, V766, V767, V768, V769, - V770, V771, V772, V773, V774, V775, V776, V777, - V778, V779, 0, 0, 0, 0, 0, 0, - }, // P[61] - { - V780, V781, V782, V783, V784, V785, V786, V787, - V788, V789, V790, V791, V792, V793, V794, V795, - V796, V797, V798, V799, V800, V801, 0, 0, - V802, V803, V804, V805, V806, V807, 0, 0, - }, // P[62] - { - V808, V809, V810, V811, V812, V813, V814, V815, - V816, V817, V818, V819, V820, V821, V822, V823, - V824, V825, V826, V827, V828, V829, V830, V831, - V832, V833, V834, V835, V836, V837, V838, V839, - }, // P[63] - { - V840, V841, V842, V843, V844, V845, 0, 0, - V846, V847, V848, V849, V850, V851, 0, 0, - V852, V853, V854, V855, V856, V857, V858, V859, - 0, V860, 0, V861, 0, V862, 0, V863, - }, // P[64] - { - V864, V865, V866, V867, V868, V869, V870, V871, - V872, V873, V874, V875, V876, V877, V878, V879, - V880, V340, V881, V341, V882, V342, V883, V343, - V884, V347, V885, V348, V886, V349, 0, 0, - }, // P[65] - { - V887, V888, V889, V890, V891, V892, V893, V894, - V895, V896, V897, V898, V899, V900, V901, V902, - V903, V904, V905, V906, V907, V908, V909, V910, - V911, V912, V913, V914, V915, V916, V917, V918, - }, // P[66] - { - V919, V920, V921, V922, V923, V924, V925, V926, - V927, V928, V929, V930, V931, V932, V933, V934, - V935, V936, V937, V938, V939, 0, V940, V941, - V942, V943, V944, V329, V945, 0, V946, 0, - }, // P[67] - { - 0, V947, V948, V949, V950, 0, V951, V952, - V953, V331, V954, V332, V955, V956, V957, V958, - V959, V960, V961, V337, 0, 0, V962, V963, - V964, V965, V966, V333, 0, V967, V968, V969, - }, // P[68] - { - V970, V971, V972, V344, V973, V974, V975, V976, - V977, V978, V979, V335, V980, V981, V328, V982, - 0, 0, V983, V984, V985, 0, V986, V987, - V988, V334, V989, V336, V990, V991, 0, 0, - }, // P[69] - { - V992, V993, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[70] - { - 0, 0, 0, 0, 0, 0, V994, 0, - 0, 0, V188, V5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[71] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V995, V996, 0, 0, 0, 0, - }, // P[72] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, V997, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[73] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, V998, V999, V1000, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[74] - { - 0, 0, 0, 0, V1001, 0, 0, 0, - 0, V1002, 0, 0, V1003, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[75] - { - 0, 0, 0, 0, V1004, 0, V1005, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[76] - { - 0, V1006, 0, 0, V1007, 0, 0, V1008, - 0, V1009, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[77] - { - V1010, 0, V1011, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, V1012, V1013, V1014, - V1015, V1016, 0, 0, V1017, V1018, 0, 0, - V1019, V1020, 0, 0, 0, 0, 0, 0, - }, // P[78] - { - V1021, V1022, 0, 0, V1023, V1024, 0, 0, - V1025, V1026, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[79] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, V1027, V1028, V1029, V1030, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[80] - { - V1031, V1032, V1033, V1034, 0, 0, 0, 0, - 0, 0, V1035, V1036, V1037, V1038, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[81] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, V1039, V1040, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[82] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, V1041, 0, 0, 0, - }, // P[83] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, V1042, 0, V1043, 0, - V1044, 0, V1045, 0, V1046, 0, V1047, 0, - V1048, 0, V1049, 0, V1050, 0, V1051, 0, - }, // P[84] - { - V1052, 0, V1053, 0, 0, V1054, 0, V1055, - 0, V1056, 0, 0, 0, 0, 0, 0, - V1057, V1058, 0, V1059, V1060, 0, V1061, V1062, - 0, V1063, V1064, 0, V1065, V1066, 0, 0, - }, // P[85] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, V1067, 0, 0, 0, - 0, 0, 0, 0, 0, 0, V1068, 0, - }, // P[86] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, V1069, 0, V1070, 0, - V1071, 0, V1072, 0, V1073, 0, V1074, 0, - V1075, 0, V1076, 0, V1077, 0, V1078, 0, - }, // P[87] - { - V1079, 0, V1080, 0, 0, V1081, 0, V1082, - 0, V1083, 0, 0, 0, 0, 0, 0, - V1084, V1085, 0, V1086, V1087, 0, V1088, V1089, - 0, V1090, V1091, 0, V1092, V1093, 0, 0, - }, // P[88] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, V1094, 0, 0, V1095, - V1096, V1097, V1098, 0, 0, 0, V1099, 0, - }, // P[89] - { - V1100, V1101, V1102, V1103, V1104, V1105, V1106, V1107, - V1108, V1109, V1110, V1111, V1112, V1113, V1114, V1115, - V1116, V1117, V1118, V1119, V1120, V1121, V1122, V1123, - V1124, V1125, V1126, V1127, V1128, V1129, V1130, V1131, - }, // P[90] - { - V1132, V1133, V1134, V1135, V1136, V1137, V1138, V1139, - V1140, V1141, V1142, V1143, V1144, V1145, V1146, V1147, - V1148, V1149, V1150, V1151, V1152, V1153, V1154, V1155, - V1156, V1157, V1158, V1159, V1160, V1161, V1162, V1163, - }, // P[91] - { - V1164, V1165, V1166, V1167, V1168, V1169, V1170, V1171, - V1172, V1173, V1174, V1175, V1176, V1177, V1178, V1179, - V1180, V1181, V1182, V1183, V1184, V1185, V1186, V1187, - V1188, V1189, V1190, V1191, V1192, V1193, V1194, V1195, - }, // P[92] - { - V1196, V1197, V1198, V1199, V1200, V1201, V1202, V1203, - V1204, V1205, V1206, V1207, V1208, V1209, V1210, V1211, - V1212, V1213, V1214, V1215, V1216, V1217, V1218, V1219, - V1220, V1221, V1222, V1223, V1224, V1225, V1226, V1227, - }, // P[93] - { - V1228, V1229, V1230, V1231, V1232, V1233, V1234, V1235, - V1236, V1237, V1238, V1239, V1240, V1241, V1242, V1243, - V1244, V1245, V1246, V1247, V1248, V1249, V1250, V1251, - V1252, V1253, V1254, V1255, V1256, V1257, V1258, V1259, - }, // P[94] - { - V1260, V1261, V1262, V1263, V1264, V1265, V1266, V1267, - V1268, V1269, V1270, V1271, V1272, V1273, V1274, V1275, - V1276, V1277, V1278, V1279, V1280, V1281, V1282, V1283, - V1284, V1285, V1286, V1287, V1288, V1289, V1290, V1291, - }, // P[95] - { - V1292, V1293, V1294, V1295, V1296, V1297, V1298, V1299, - V1300, V1301, V1302, V1303, V1304, V1305, V1306, V1307, - V1308, V1309, V1310, V1311, V1312, V1313, V1314, V1315, - V1316, V1317, V1318, V1319, V1320, V1321, V1322, V1323, - }, // P[96] - { - V1324, V1325, V1326, V1327, V1328, V1329, V1330, V1331, - V1332, V1333, V1334, V1335, V1336, V1337, V1338, V1339, - V1340, V1341, V1342, V1343, V1344, V1345, V1346, V1347, - V1348, V1349, V1350, V1351, V1352, V1353, V1354, V1355, - }, // P[97] - { - V1356, V1357, V1358, V1359, V1360, V1361, V1362, V1363, - V1364, V1365, V1366, V1367, V1368, V1369, V1370, V1371, - V1372, V1373, V1374, V1375, V1376, V1377, V1378, V1379, - V1380, V1381, V1382, V1383, V1384, V1385, V1386, V1387, - }, // P[98] - { - V1388, V1389, V1390, V1391, V1392, V1393, V1394, V1395, - V1396, V1397, V1398, V1399, V1400, V1401, V1402, V1403, - V1404, V1405, V1406, V1407, V1408, V1409, V1410, V1411, - V1412, V1413, V1414, V1415, V1416, V1417, V1418, V1419, - }, // P[99] - { - V1420, V1421, V1422, V1423, V1424, V1425, V1426, V1427, - V1428, V1429, V1430, V1431, V1432, V1433, V1434, V1435, - V1436, V1437, V1438, V1439, V1440, V1441, V1442, V1443, - V1444, V1445, V1446, V1447, V1448, V1449, V1450, V1451, - }, // P[100] - { - V1452, V1453, V1454, V1455, V1456, V1457, V1458, V1459, - V1460, V1461, V1462, V1463, V1464, V1465, V1466, V1467, - V1468, V1469, V1470, V1471, V1472, V1473, V1474, V1475, - V1476, V1477, V1478, V1479, V1480, V1481, V1482, V1483, - }, // P[101] - { - V1484, V1485, V1486, V1487, V1488, V1489, V1490, V1491, - V1492, V1493, V1494, V1495, V1496, V1497, V1498, V1499, - V1500, V1501, V1502, V1503, V1504, V1505, V1506, V1507, - V1508, V1509, V1510, V1511, V1512, V1513, V1514, V1515, - }, // P[102] - { - V1516, V1517, V1518, V1519, V1520, V1521, V1522, V1523, - V1524, V1525, V1526, V1527, V1528, V1529, V1530, V1531, - V1532, V1533, V1534, V1535, V1536, V1537, V1538, V1539, - V1540, V1541, V1542, V1543, V1544, V1545, V1546, V1547, - }, // P[103] - { - V1548, V1549, V1550, V1551, V1552, V1553, V1554, V1555, - V1556, V1557, V1558, V1559, V1560, V1561, V1562, V1563, - V1564, V1565, V1566, V1567, V1568, V1569, V1570, V1571, - V1572, V1573, V1574, V1575, V1576, V1577, V1578, V1579, - }, // P[104] - { - V1580, V1581, V1582, V1583, V1584, V1585, V1586, V1587, - V1588, V1589, V1590, V1591, V1592, V1593, V1594, V1595, - V1596, V1597, V1598, V1599, V1600, V1601, V1602, V1603, - V1604, V1605, V1606, V1607, V1608, V1609, V1610, V1611, - }, // P[105] - { - V1612, V1613, V1614, V1615, V1616, V1617, V1618, V1619, - V1620, V1621, V1622, V1623, V1624, V1625, V1626, V1627, - V1628, V1629, V1630, V1631, V1632, V1633, V1634, V1635, - V1636, V1637, V1638, V1639, V1640, V1641, V1642, V1643, - }, // P[106] - { - V1644, V1645, V1646, V1647, V1648, V1649, V1650, V1651, - V1652, V1653, V1654, V1655, V1656, V1657, V1658, V1659, - V1660, V1661, V1662, V1663, V1664, V1665, V1666, V1667, - V1668, V1669, V1670, V1671, V1672, V1673, V1674, V1675, - }, // P[107] - { - V1676, V1677, V1678, V1679, V1680, V1681, V1682, V1683, - V1684, V1685, V1686, V1687, V1688, V1689, V1690, V1691, - V1692, V1693, V1694, V1695, V1696, V1697, V1698, V1699, - V1700, V1701, V1702, V1703, V1704, V1705, V1706, V1707, - }, // P[108] - { - V1708, V1709, V1710, V1711, V1712, V1713, V1714, V1715, - V1716, V1717, V1718, V1719, V1720, V1721, V1722, V1723, - V1724, V1725, V1726, V1727, V1728, V1729, V1730, V1731, - V1732, V1733, V1734, V1735, V1736, V1737, V1738, V1739, - }, // P[109] - { - V1740, V1741, V1742, V1743, V1744, V1745, V1746, V1747, - V1748, V1749, V1750, V1751, V1752, V1753, V1754, V1755, - V1756, V1757, V1758, V1759, V1760, V1761, V1762, V1763, - V1764, V1765, V1766, V1767, V1768, V1769, V1770, V1771, - }, // P[110] - { - V1772, V1773, V1774, V1775, V1776, V1777, V1778, V1779, - V1780, V1781, V1782, V1783, V1784, V1785, V1786, V1787, - V1788, V1789, V1790, V1791, V1792, V1793, V1794, V1795, - V1796, V1797, V1798, V1799, V1800, V1801, V1802, V1803, - }, // P[111] - { - V1804, V1805, V1806, V1807, V1808, V1809, V1810, V1811, - V1812, V1813, V1814, V1815, V1816, V1817, V1818, V1819, - V1820, V1821, V1822, V1823, V1824, V1825, V1826, V1827, - V1828, V1829, V1830, V1831, V1832, V1833, V1834, V1835, - }, // P[112] - { - V1836, V1837, V1838, V1839, V1840, V1841, V1842, V1843, - V1844, V1845, V1846, V1847, V1848, V1849, V1850, V1851, - V1852, V1853, V1854, V1855, V1856, V1857, V1858, V1859, - V1860, V1861, V1862, V1863, V1864, V1865, V1866, V1867, - }, // P[113] - { - V1868, V1869, V1870, V1871, V1872, V1873, V1874, V1875, - V1876, V1877, V1878, V1879, V1880, V1881, V1882, V1883, - V1884, V1885, V1886, V1887, V1888, V1889, V1890, V1891, - V1892, V1893, V1894, V1895, V1896, V1897, V1898, V1899, - }, // P[114] - { - V1900, V1901, V1902, V1903, V1904, V1905, V1906, V1907, - V1908, V1909, V1910, V1911, V1912, V1913, V1914, V1915, - V1916, V1917, V1918, V1919, V1920, V1921, V1922, V1923, - V1924, V1925, V1926, V1927, V1928, V1929, V1930, V1931, - }, // P[115] - { - V1932, V1933, V1934, V1935, V1936, V1937, V1938, V1939, - V1940, V1941, V1942, V1943, V1944, V1945, V1946, V1947, - V1948, V1949, V1950, V1951, V1952, V1953, V1954, V1955, - V1956, V1957, V1958, V1959, V1960, V1961, V1962, V1963, - }, // P[116] - { - V1964, V1965, V1966, V1967, V1968, V1969, V1970, V1971, - V1972, V1973, V1974, V1975, V1976, V1977, V1978, V1979, - V1980, V1981, V1982, V1983, V1984, V1985, V1986, V1987, - V1988, V1989, V1990, V1991, V1992, V1993, V1994, V1995, - }, // P[117] - { - V1996, V1997, V1998, V1999, V2000, V2001, V2002, V2003, - V2004, V2005, V2006, V2007, V2008, V2009, V2010, V2011, - V2012, V2013, V2014, V2015, V2016, V2017, V2018, V2019, - V2020, V2021, V2022, V2023, V2024, V2025, V2026, V2027, - }, // P[118] - { - V2028, V2029, V2030, V2031, V2032, V2033, V2034, V2035, - V2036, V2037, V2038, V2039, V2040, V2041, V2042, V2043, - V2044, V2045, V2046, V2047, V2048, V2049, V2050, V2051, - V2052, V2053, V2054, V2055, V2056, V2057, V2058, V2059, - }, // P[119] - { - V2060, V2061, V2062, V2063, V2064, V2065, V2066, V2067, - V2068, V2069, V2070, V2071, V2072, V2073, V2074, V2075, - V2076, V2077, V2078, V2079, V2080, V2081, V2082, V2083, - V2084, V2085, V2086, V2087, V2088, V2089, V2090, V2091, - }, // P[120] - { - V2092, V2093, V2094, V2095, V2096, V2097, V2098, V2099, - V2100, V2101, V2102, V2103, V2104, V2105, V2106, V2107, - V2108, V2109, V2110, V2111, V2112, V2113, V2114, V2115, - V2116, V2117, V2118, V2119, V2120, V2121, V2122, V2123, - }, // P[121] - { - V2124, V2125, V2126, V2127, V2128, V2129, V2130, V2131, - V2132, V2133, V2134, V2135, V2136, V2137, V2138, V2139, - V2140, V2141, V2142, V2143, V2144, V2145, V2146, V2147, - V2148, V2149, V2150, V2151, V2152, V2153, V2154, V2155, - }, // P[122] - { - V2156, V2157, V2158, V2159, V2160, V2161, V2162, V2163, - V2164, V2165, V2166, V2167, V2168, V2169, V2170, V2171, - V2172, V2173, V2174, V2175, V2176, V2177, V2178, V2179, - V2180, V2181, V2182, V2183, V2184, V2185, V2186, V2187, - }, // P[123] - { - V2188, V2189, V2190, V2191, V2192, V2193, V2194, V2195, - V2196, V2197, V2198, V2199, V2200, V2201, V2202, V2203, - V2204, V2205, V2206, V2207, V2208, V2209, V2210, V2211, - V2212, V2213, V2214, V2215, V2216, V2217, V2218, V2219, - }, // P[124] - { - V2220, V2221, V2222, V2223, V2224, V2225, V2226, V2227, - V2228, V2229, V2230, V2231, V2232, V2233, V2234, V2235, - V2236, V2237, V2238, V2239, V2240, V2241, V2242, V2243, - V2244, V2245, V2246, V2247, V2248, V2249, V2250, V2251, - }, // P[125] - { - V2252, V2253, V2254, V2255, V2256, V2257, V2258, V2259, - V2260, V2261, V2262, V2263, V2264, V2265, V2266, V2267, - V2268, V2269, V2270, V2271, V2272, V2273, V2274, V2275, - V2276, V2277, V2278, V2279, V2280, V2281, V2282, V2283, - }, // P[126] - { - V2284, V2285, V2286, V2287, V2288, V2289, V2290, V2291, - V2292, V2293, V2294, V2295, V2296, V2297, V2298, V2299, - V2300, V2301, V2302, V2303, V2304, V2305, V2306, V2307, - V2308, V2309, V2310, V2311, V2312, V2313, V2314, V2315, - }, // P[127] - { - V2316, V2317, V2318, V2319, V2320, V2321, V2322, V2323, - V2324, V2325, V2326, V2327, V2328, V2329, V2330, V2331, - V2332, V2333, V2334, V2335, V2336, V2337, V2338, V2339, - V2340, V2341, V2342, V2343, V2344, V2345, V2346, V2347, - }, // P[128] - { - V2348, V2349, V2350, V2351, V2352, V2353, V2354, V2355, - V2356, V2357, V2358, V2359, V2360, V2361, V2362, V2363, - V2364, V2365, V2366, V2367, V2368, V2369, V2370, V2371, - V2372, V2373, V2374, V2375, V2376, V2377, V2378, V2379, - }, // P[129] - { - V2380, V2381, V2382, V2383, V2384, V2385, V2386, V2387, - V2388, V2389, V2390, V2391, V2392, V2393, V2394, V2395, - V2396, V2397, V2398, V2399, V2400, V2401, V2402, V2403, - V2404, V2405, V2406, V2407, V2408, V2409, V2410, V2411, - }, // P[130] - { - V2412, V2413, V2414, V2415, V2416, V2417, V2418, V2419, - V2420, V2421, V2422, V2423, V2424, V2425, V2426, V2427, - V2428, V2429, V2430, V2431, V2432, V2433, V2434, V2435, - V2436, V2437, V2438, V2439, V2440, V2441, V2442, V2443, - }, // P[131] - { - V2444, V2445, V2446, V2447, V2448, V2449, V2450, V2451, - V2452, V2453, V2454, V2455, V2456, V2457, V2458, V2459, - V2460, V2461, V2462, V2463, V2464, V2465, V2466, V2467, - V2468, V2469, V2470, V2471, V2472, V2473, V2474, V2475, - }, // P[132] - { - V2476, V2477, V2478, V2479, V2480, V2481, V2482, V2483, - V2484, V2485, V2486, V2487, V2488, V2489, V2490, V2491, - V2492, V2493, V2494, V2495, V2496, V2497, V2498, V2499, - V2500, V2501, V2502, V2503, V2504, V2505, V2506, V2507, - }, // P[133] - { - V2508, V2509, V2510, V2511, V2512, V2513, V2514, V2515, - V2516, V2517, V2518, V2519, V2520, V2521, V2522, V2523, - V2524, V2525, V2526, V2527, V2528, V2529, V2530, V2531, - V2532, V2533, V2534, V2535, V2536, V2537, V2538, V2539, - }, // P[134] - { - V2540, V2541, V2542, V2543, V2544, V2545, V2546, V2547, - V2548, V2549, V2550, V2551, V2552, V2553, V2554, V2555, - V2556, V2557, V2558, V2559, V2560, V2561, V2562, V2563, - V2564, V2565, V2566, V2567, V2568, V2569, V2570, V2571, - }, // P[135] - { - V2572, V2573, V2574, V2575, V2576, V2577, V2578, V2579, - V2580, V2581, V2582, V2583, V2584, V2585, V2586, V2587, - V2588, V2589, V2590, V2591, V2592, V2593, V2594, V2595, - V2596, V2597, V2598, V2599, V2600, V2601, V2602, V2603, - }, // P[136] - { - V2604, V2605, V2606, V2607, V2608, V2609, V2610, V2611, - V2612, V2613, V2614, V2615, V2616, V2617, V2618, V2619, - V2620, V2621, V2622, V2623, V2624, V2625, V2626, V2627, - V2628, V2629, V2630, V2631, V2632, V2633, V2634, V2635, - }, // P[137] - { - V2636, V2637, V2638, V2639, V2640, V2641, V2642, V2643, - V2644, V2645, V2646, V2647, V2648, V2649, V2650, V2651, - V2652, V2653, V2654, V2655, V2656, V2657, V2658, V2659, - V2660, V2661, V2662, V2663, V2664, V2665, V2666, V2667, - }, // P[138] - { - V2668, V2669, V2670, V2671, V2672, V2673, V2674, V2675, - V2676, V2677, V2678, V2679, V2680, V2681, V2682, V2683, - V2684, V2685, V2686, V2687, V2688, V2689, V2690, V2691, - V2692, V2693, V2694, V2695, V2696, V2697, V2698, V2699, - }, // P[139] - { - V2700, V2701, V2702, V2703, V2704, V2705, V2706, V2707, - V2708, V2709, V2710, V2711, V2712, V2713, V2714, V2715, - V2716, V2717, V2718, V2719, V2720, V2721, V2722, V2723, - V2724, V2725, V2726, V2727, V2728, V2729, V2730, V2731, - }, // P[140] - { - V2732, V2733, V2734, V2735, V2736, V2737, V2738, V2739, - V2740, V2741, V2742, V2743, V2744, V2745, V2746, V2747, - V2748, V2749, V2750, V2751, V2752, V2753, V2754, V2755, - V2756, V2757, V2758, V2759, V2760, V2761, V2762, V2763, - }, // P[141] - { - V2764, V2765, V2766, V2767, V2768, V2769, V2770, V2771, - V2772, V2773, V2774, V2775, V2776, V2777, V2778, V2779, - V2780, V2781, V2782, V2783, V2784, V2785, V2786, V2787, - V2788, V2789, V2790, V2791, V2792, V2793, V2794, V2795, - }, // P[142] - { - V2796, V2797, V2798, V2799, V2800, V2801, V2802, V2803, - V2804, V2805, V2806, V2807, V2808, V2809, V2810, V2811, - V2812, V2813, V2814, V2815, V2816, V2817, V2818, V2819, - V2820, V2821, V2822, V2823, V2824, V2825, V2826, V2827, - }, // P[143] - { - V2828, V2829, V2830, V2831, V2832, V2833, V2834, V2835, - V2836, V2837, V2838, V2839, V2840, V2841, V2842, V2843, - V2844, V2845, V2846, V2847, V2848, V2849, V2850, V2851, - V2852, V2853, V2854, V2855, V2856, V2857, V2858, V2859, - }, // P[144] - { - V2860, V2861, V2862, V2863, V2864, V2865, V2866, V2867, - V2868, V2869, V2870, V2871, V2872, V2873, V2874, V2875, - V2876, V2877, V2878, V2879, V2880, V2881, V2882, V2883, - V2884, V2885, V2886, V2887, V2888, V2889, V2890, V2891, - }, // P[145] - { - V2892, V2893, V2894, V2895, V2896, V2897, V2898, V2899, - V2900, V2901, V2902, V2903, V2904, V2905, V2906, V2907, - V2908, V2909, V2910, V2911, V2912, V2913, V2914, V2915, - V2916, V2917, V2918, V2919, V2920, V2921, V2922, V2923, - }, // P[146] - { - V2924, V2925, V2926, V2927, V2928, V2929, V2930, V2931, - V2932, V2933, V2934, V2935, V2936, V2937, V2938, V2939, - V2940, V2941, V2942, V2943, V2944, V2945, V2946, V2947, - V2948, V2949, V2950, V2951, V2952, V2953, V2954, V2955, - }, // P[147] - { - V2956, V2957, V2958, V2959, V2960, V2961, V2962, V2963, - V2964, V2965, V2966, V2967, V2968, V2969, V2970, V2971, - V2972, V2973, V2974, V2975, V2976, V2977, V2978, V2979, - V2980, V2981, V2982, V2983, V2984, V2985, V2986, V2987, - }, // P[148] - { - V2988, V2989, V2990, V2991, V2992, V2993, V2994, V2995, - V2996, V2997, V2998, V2999, V3000, V3001, V3002, V3003, - V3004, V3005, V3006, V3007, V3008, V3009, V3010, V3011, - V3012, V3013, V3014, V3015, V3016, V3017, V3018, V3019, - }, // P[149] - { - V3020, V3021, V3022, V3023, V3024, V3025, V3026, V3027, - V3028, V3029, V3030, V3031, V3032, V3033, V3034, V3035, - V3036, V3037, V3038, V3039, V3040, V3041, V3042, V3043, - V3044, V3045, V3046, V3047, V3048, V3049, V3050, V3051, - }, // P[150] - { - V3052, V3053, V3054, V3055, V3056, V3057, V3058, V3059, - V3060, V3061, V3062, V3063, V3064, V3065, V3066, V3067, - V3068, V3069, V3070, V3071, V3072, V3073, V3074, V3075, - V3076, V3077, V3078, V3079, V3080, V3081, V3082, V3083, - }, // P[151] - { - V3084, V3085, V3086, V3087, V3088, V3089, V3090, V3091, - V3092, V3093, V3094, V3095, V3096, V3097, V3098, V3099, - V3100, V3101, V3102, V3103, V3104, V3105, V3106, V3107, - V3108, V3109, V3110, V3111, V3112, V3113, V3114, V3115, - }, // P[152] - { - V3116, V3117, V3118, V3119, V3120, V3121, V3122, V3123, - V3124, V3125, V3126, V3127, V3128, V3129, V3130, V3131, - V3132, V3133, V3134, V3135, V3136, V3137, V3138, V3139, - V3140, V3141, V3142, V3143, V3144, V3145, V3146, V3147, - }, // P[153] - { - V3148, V3149, V3150, V3151, V3152, V3153, V3154, V3155, - V3156, V3157, V3158, V3159, V3160, V3161, V3162, V3163, - V3164, V3165, V3166, V3167, V3168, V3169, V3170, V3171, - V3172, V3173, V3174, V3175, V3176, V3177, V3178, V3179, - }, // P[154] - { - V3180, V3181, V3182, V3183, V3184, V3185, V3186, V3187, - V3188, V3189, V3190, V3191, V3192, V3193, V3194, V3195, - V3196, V3197, V3198, V3199, V3200, V3201, V3202, V3203, - V3204, V3205, V3206, V3207, V3208, V3209, V3210, V3211, - }, // P[155] - { - V3212, V3213, V3214, V3215, V3216, V3217, V3218, V3219, - V3220, V3221, V3222, V3223, V3224, V3225, V3226, V3227, - V3228, V3229, V3230, V3231, V3232, V3233, V3234, V3235, - V3236, V3237, V3238, V3239, V3240, V3241, V3242, V3243, - }, // P[156] - { - V3244, V3245, V3246, V3247, V3248, V3249, V3250, V3251, - V3252, V3253, V3254, V3255, V3256, V3257, V3258, V3259, - V3260, V3261, V3262, V3263, V3264, V3265, V3266, V3267, - V3268, V3269, V3270, V3271, V3272, V3273, V3274, V3275, - }, // P[157] - { - V3276, V3277, V3278, V3279, V3280, V3281, V3282, V3283, - V3284, V3285, V3286, V3287, V3288, V3289, V3290, V3291, - V3292, V3293, V3294, V3295, V3296, V3297, V3298, V3299, - V3300, V3301, V3302, V3303, V3304, V3305, V3306, V3307, - }, // P[158] - { - V3308, V3309, V3310, V3311, V3312, V3313, V3314, V3315, - V3316, V3317, V3318, V3319, V3320, V3321, V3322, V3323, - V3324, V3325, V3326, V3327, V3328, V3329, V3330, V3331, - V3332, V3333, V3334, V3335, V3336, V3337, V3338, V3339, - }, // P[159] - { - V3340, V3341, V3342, V3343, V3344, V3345, V3346, V3347, - V3348, V3349, V3350, V3351, V3352, V3353, V3354, V3355, - V3356, V3357, V3358, V3359, V3360, V3361, V3362, V3363, - V3364, V3365, V3366, V3367, V3368, V3369, V3370, V3371, - }, // P[160] - { - V3372, V3373, V3374, V3375, V3376, V3377, V3378, V3379, - V3380, V3381, V3382, V3383, V3384, V3385, V3386, V3387, - V3388, V3389, V3390, V3391, V3392, V3393, V3394, V3395, - V3396, V3397, V3398, V3399, V3400, V3401, V3402, V3403, - }, // P[161] - { - V3404, V3405, V3406, V3407, V3408, V3409, V3410, V3411, - V3412, V3413, V3414, V3415, V3416, V3417, V3418, V3419, - V3420, V3421, V3422, V3423, V3424, V3425, V3426, V3427, - V3428, V3429, V3430, V3431, V3432, V3433, V3434, V3435, - }, // P[162] - { - V3436, V3437, V3438, V3439, V3440, V3441, V3442, V3443, - V3444, V3445, V3446, V3447, V3448, V3449, V3450, V3451, - V3452, V3453, V3454, V3455, V3456, V3457, V3458, V3459, - V3460, V3461, V3462, V3463, V3464, V3465, V3466, V3467, - }, // P[163] - { - V3468, V3469, V3470, V3471, V3472, V3473, V3474, V3475, - V3476, V3477, V3478, V3479, V3480, V3481, V3482, V3483, - V3484, V3485, V3486, V3487, V3488, V3489, V3490, V3491, - V3492, V3493, V3494, V3495, V3496, V3497, V3498, V3499, - }, // P[164] - { - V3500, V3501, V3502, V3503, V3504, V3505, V3506, V3507, - V3508, V3509, V3510, V3511, V3512, V3513, V3514, V3515, - V3516, V3517, V3518, V3519, V3520, V3521, V3522, V3523, - V3524, V3525, V3526, V3527, V3528, V3529, V3530, V3531, - }, // P[165] - { - V3532, V3533, V3534, V3535, V3536, V3537, V3538, V3539, - V3540, V3541, V3542, V3543, V3544, V3545, V3546, V3547, - V3548, V3549, V3550, V3551, V3552, V3553, V3554, V3555, - V3556, V3557, V3558, V3559, V3560, V3561, V3562, V3563, - }, // P[166] - { - V3564, V3565, V3566, V3567, V3568, V3569, V3570, V3571, - V3572, V3573, V3574, V3575, V3576, V3577, V3578, V3579, - V3580, V3581, V3582, V3583, V3584, V3585, V3586, V3587, - V3588, V3589, V3590, V3591, V3592, V3593, V3594, V3595, - }, // P[167] - { - V3596, V3597, V3598, V3599, V3600, V3601, V3602, V3603, - V3604, V3605, V3606, V3607, V3608, V3609, V3610, V3611, - V3612, V3613, V3614, V3615, V3616, V3617, V3618, V3619, - V3620, V3621, V3622, V3623, V3624, V3625, V3626, V3627, - }, // P[168] - { - V3628, V3629, V3630, V3631, V3632, V3633, V3634, V3635, - V3636, V3637, V3638, V3639, V3640, V3641, V3642, V3643, - V3644, V3645, V3646, V3647, V3648, V3649, V3650, V3651, - V3652, V3653, V3654, V3655, V3656, V3657, V3658, V3659, - }, // P[169] - { - V3660, V3661, V3662, V3663, V3664, V3665, V3666, V3667, - V3668, V3669, V3670, V3671, V3672, V3673, V3674, V3675, - V3676, V3677, V3678, V3679, V3680, V3681, V3682, V3683, - V3684, V3685, V3686, V3687, V3688, V3689, V3690, V3691, - }, // P[170] - { - V3692, V3693, V3694, V3695, V3696, V3697, V3698, V3699, - V3700, V3701, V3702, V3703, V3704, V3705, V3706, V3707, - V3708, V3709, V3710, V3711, V3712, V3713, V3714, V3715, - V3716, V3717, V3718, V3719, V3720, V3721, V3722, V3723, - }, // P[171] - { - V3724, V3725, V3726, V3727, V3728, V3729, V3730, V3731, - V3732, V3733, V3734, V3735, V3736, V3737, V3738, V3739, - V3740, V3741, V3742, V3743, V3744, V3745, V3746, V3747, - V3748, V3749, V3750, V3751, V3752, V3753, V3754, V3755, - }, // P[172] - { - V3756, V3757, V3758, V3759, V3760, V3761, V3762, V3763, - V3764, V3765, V3766, V3767, V3768, V3769, V3770, V3771, - V3772, V3773, V3774, V3775, V3776, V3777, V3778, V3779, - V3780, V3781, V3782, V3783, V3784, V3785, V3786, V3787, - }, // P[173] - { - V3788, V3789, V3790, V3791, V3792, V3793, V3794, V3795, - V3796, V3797, V3798, V3799, V3800, V3801, V3802, V3803, - V3804, V3805, V3806, V3807, V3808, V3809, V3810, V3811, - V3812, V3813, V3814, V3815, V3816, V3817, V3818, V3819, - }, // P[174] - { - V3820, V3821, V3822, V3823, V3824, V3825, V3826, V3827, - V3828, V3829, V3830, V3831, V3832, V3833, V3834, V3835, - V3836, V3837, V3838, V3839, V3840, V3841, V3842, V3843, - V3844, V3845, V3846, V3847, V3848, V3849, V3850, V3851, - }, // P[175] - { - V3852, V3853, V3854, V3855, V3856, V3857, V3858, V3859, - V3860, V3861, V3862, V3863, V3864, V3865, V3866, V3867, - V3868, V3869, V3870, V3871, V3872, V3873, V3874, V3875, - V3876, V3877, V3878, V3879, V3880, V3881, V3882, V3883, - }, // P[176] - { - V3884, V3885, V3886, V3887, V3888, V3889, V3890, V3891, - V3892, V3893, V3894, V3895, V3896, V3897, V3898, V3899, - V3900, V3901, V3902, V3903, V3904, V3905, V3906, V3907, - V3908, V3909, V3910, V3911, V3912, V3913, V3914, V3915, - }, // P[177] - { - V3916, V3917, V3918, V3919, V3920, V3921, V3922, V3923, - V3924, V3925, V3926, V3927, V3928, V3929, V3930, V3931, - V3932, V3933, V3934, V3935, V3936, V3937, V3938, V3939, - V3940, V3941, V3942, V3943, V3944, V3945, V3946, V3947, - }, // P[178] - { - V3948, V3949, V3950, V3951, V3952, V3953, V3954, V3955, - V3956, V3957, V3958, V3959, V3960, V3961, V3962, V3963, - V3964, V3965, V3966, V3967, V3968, V3969, V3970, V3971, - V3972, V3973, V3974, V3975, V3976, V3977, V3978, V3979, - }, // P[179] - { - V3980, V3981, V3982, V3983, V3984, V3985, V3986, V3987, - V3988, V3989, V3990, V3991, V3992, V3993, V3994, V3995, - V3996, V3997, V3998, V3999, V4000, V4001, V4002, V4003, - V4004, V4005, V4006, V4007, V4008, V4009, V4010, V4011, - }, // P[180] - { - V4012, V4013, V4014, V4015, V4016, V4017, V4018, V4019, - V4020, V4021, V4022, V4023, V4024, V4025, V4026, V4027, - V4028, V4029, V4030, V4031, V4032, V4033, V4034, V4035, - V4036, V4037, V4038, V4039, V4040, V4041, V4042, V4043, - }, // P[181] - { - V4044, V4045, V4046, V4047, V4048, V4049, V4050, V4051, - V4052, V4053, V4054, V4055, V4056, V4057, V4058, V4059, - V4060, V4061, V4062, V4063, V4064, V4065, V4066, V4067, - V4068, V4069, V4070, V4071, V4072, V4073, V4074, V4075, - }, // P[182] - { - V4076, V4077, V4078, V4079, V4080, V4081, V4082, V4083, - V4084, V4085, V4086, V4087, V4088, V4089, V4090, V4091, - V4092, V4093, V4094, V4095, V4096, V4097, V4098, V4099, - V4100, V4101, V4102, V4103, V4104, V4105, V4106, V4107, - }, // P[183] - { - V4108, V4109, V4110, V4111, V4112, V4113, V4114, V4115, - V4116, V4117, V4118, V4119, V4120, V4121, V4122, V4123, - V4124, V4125, V4126, V4127, V4128, V4129, V4130, V4131, - V4132, V4133, V4134, V4135, V4136, V4137, V4138, V4139, - }, // P[184] - { - V4140, V4141, V4142, V4143, V4144, V4145, V4146, V4147, - V4148, V4149, V4150, V4151, V4152, V4153, V4154, V4155, - V4156, V4157, V4158, V4159, V4160, V4161, V4162, V4163, - V4164, V4165, V4166, V4167, V4168, V4169, V4170, V4171, - }, // P[185] - { - V4172, V4173, V4174, V4175, V4176, V4177, V4178, V4179, - V4180, V4181, V4182, V4183, V4184, V4185, V4186, V4187, - V4188, V4189, V4190, V4191, V4192, V4193, V4194, V4195, - V4196, V4197, V4198, V4199, V4200, V4201, V4202, V4203, - }, // P[186] - { - V4204, V4205, V4206, V4207, V4208, V4209, V4210, V4211, - V4212, V4213, V4214, V4215, V4216, V4217, V4218, V4219, - V4220, V4221, V4222, V4223, V4224, V4225, V4226, V4227, - V4228, V4229, V4230, V4231, V4232, V4233, V4234, V4235, - }, // P[187] - { - V4236, V4237, V4238, V4239, V4240, V4241, V4242, V4243, - V4244, V4245, V4246, V4247, V4248, V4249, V4250, V4251, - V4252, V4253, V4254, V4255, V4256, V4257, V4258, V4259, - V4260, V4261, V4262, V4263, V4264, V4265, V4266, V4267, - }, // P[188] - { - V4268, V4269, V4270, V4271, V4272, V4273, V4274, V4275, - V4276, V4277, V4278, V4279, V4280, V4281, V4282, V4283, - V4284, V4285, V4286, V4287, V4288, V4289, V4290, V4291, - V4292, V4293, V4294, V4295, V4296, V4297, V4298, V4299, - }, // P[189] - { - V4300, V4301, V4302, V4303, V4304, V4305, V4306, V4307, - V4308, V4309, V4310, V4311, V4312, V4313, V4314, V4315, - V4316, V4317, V4318, V4319, V4320, V4321, V4322, V4323, - V4324, V4325, V4326, V4327, V4328, V4329, V4330, V4331, - }, // P[190] - { - V4332, V4333, V4334, V4335, V4336, V4337, V4338, V4339, - V4340, V4341, V4342, V4343, V4344, V4345, V4346, V4347, - V4348, V4349, V4350, V4351, V4352, V4353, V4354, V4355, - V4356, V4357, V4358, V4359, V4360, V4361, V4362, V4363, - }, // P[191] - { - V4364, V4365, V4366, V4367, V4368, V4369, V4370, V4371, - V4372, V4373, V4374, V4375, V4376, V4377, V4378, V4379, - V4380, V4381, V4382, V4383, V4384, V4385, V4386, V4387, - V4388, V4389, V4390, V4391, V4392, V4393, V4394, V4395, - }, // P[192] - { - V4396, V4397, V4398, V4399, V4400, V4401, V4402, V4403, - V4404, V4405, V4406, V4407, V4408, V4409, V4410, V4411, - V4412, V4413, V4414, V4415, V4416, V4417, V4418, V4419, - V4420, V4421, V4422, V4423, V4424, V4425, V4426, V4427, - }, // P[193] - { - V4428, V4429, V4430, V4431, V4432, V4433, V4434, V4435, - V4436, V4437, V4438, V4439, V4440, V4441, V4442, V4443, - V4444, V4445, V4446, V4447, V4448, V4449, V4450, V4451, - V4452, V4453, V4454, V4455, V4456, V4457, V4458, V4459, - }, // P[194] - { - V4460, V4461, V4462, V4463, V4464, V4465, V4466, V4467, - V4468, V4469, V4470, V4471, V4472, V4473, V4474, V4475, - V4476, V4477, V4478, V4479, V4480, V4481, V4482, V4483, - V4484, V4485, V4486, V4487, V4488, V4489, V4490, V4491, - }, // P[195] - { - V4492, V4493, V4494, V4495, V4496, V4497, V4498, V4499, - V4500, V4501, V4502, V4503, V4504, V4505, V4506, V4507, - V4508, V4509, V4510, V4511, V4512, V4513, V4514, V4515, - V4516, V4517, V4518, V4519, V4520, V4521, V4522, V4523, - }, // P[196] - { - V4524, V4525, V4526, V4527, V4528, V4529, V4530, V4531, - V4532, V4533, V4534, V4535, V4536, V4537, V4538, V4539, - V4540, V4541, V4542, V4543, V4544, V4545, V4546, V4547, - V4548, V4549, V4550, V4551, V4552, V4553, V4554, V4555, - }, // P[197] - { - V4556, V4557, V4558, V4559, V4560, V4561, V4562, V4563, - V4564, V4565, V4566, V4567, V4568, V4569, V4570, V4571, - V4572, V4573, V4574, V4575, V4576, V4577, V4578, V4579, - V4580, V4581, V4582, V4583, V4584, V4585, V4586, V4587, - }, // P[198] - { - V4588, V4589, V4590, V4591, V4592, V4593, V4594, V4595, - V4596, V4597, V4598, V4599, V4600, V4601, V4602, V4603, - V4604, V4605, V4606, V4607, V4608, V4609, V4610, V4611, - V4612, V4613, V4614, V4615, V4616, V4617, V4618, V4619, - }, // P[199] - { - V4620, V4621, V4622, V4623, V4624, V4625, V4626, V4627, - V4628, V4629, V4630, V4631, V4632, V4633, V4634, V4635, - V4636, V4637, V4638, V4639, V4640, V4641, V4642, V4643, - V4644, V4645, V4646, V4647, V4648, V4649, V4650, V4651, - }, // P[200] - { - V4652, V4653, V4654, V4655, V4656, V4657, V4658, V4659, - V4660, V4661, V4662, V4663, V4664, V4665, V4666, V4667, - V4668, V4669, V4670, V4671, V4672, V4673, V4674, V4675, - V4676, V4677, V4678, V4679, V4680, V4681, V4682, V4683, - }, // P[201] - { - V4684, V4685, V4686, V4687, V4688, V4689, V4690, V4691, - V4692, V4693, V4694, V4695, V4696, V4697, V4698, V4699, - V4700, V4701, V4702, V4703, V4704, V4705, V4706, V4707, - V4708, V4709, V4710, V4711, V4712, V4713, V4714, V4715, - }, // P[202] - { - V4716, V4717, V4718, V4719, V4720, V4721, V4722, V4723, - V4724, V4725, V4726, V4727, V4728, V4729, V4730, V4731, - V4732, V4733, V4734, V4735, V4736, V4737, V4738, V4739, - V4740, V4741, V4742, V4743, V4744, V4745, V4746, V4747, - }, // P[203] - { - V4748, V4749, V4750, V4751, V4752, V4753, V4754, V4755, - V4756, V4757, V4758, V4759, V4760, V4761, V4762, V4763, - V4764, V4765, V4766, V4767, V4768, V4769, V4770, V4771, - V4772, V4773, V4774, V4775, V4776, V4777, V4778, V4779, - }, // P[204] - { - V4780, V4781, V4782, V4783, V4784, V4785, V4786, V4787, - V4788, V4789, V4790, V4791, V4792, V4793, V4794, V4795, - V4796, V4797, V4798, V4799, V4800, V4801, V4802, V4803, - V4804, V4805, V4806, V4807, V4808, V4809, V4810, V4811, - }, // P[205] - { - V4812, V4813, V4814, V4815, V4816, V4817, V4818, V4819, - V4820, V4821, V4822, V4823, V4824, V4825, V4826, V4827, - V4828, V4829, V4830, V4831, V4832, V4833, V4834, V4835, - V4836, V4837, V4838, V4839, V4840, V4841, V4842, V4843, - }, // P[206] - { - V4844, V4845, V4846, V4847, V4848, V4849, V4850, V4851, - V4852, V4853, V4854, V4855, V4856, V4857, V4858, V4859, - V4860, V4861, V4862, V4863, V4864, V4865, V4866, V4867, - V4868, V4869, V4870, V4871, V4872, V4873, V4874, V4875, - }, // P[207] - { - V4876, V4877, V4878, V4879, V4880, V4881, V4882, V4883, - V4884, V4885, V4886, V4887, V4888, V4889, V4890, V4891, - V4892, V4893, V4894, V4895, V4896, V4897, V4898, V4899, - V4900, V4901, V4902, V4903, V4904, V4905, V4906, V4907, - }, // P[208] - { - V4908, V4909, V4910, V4911, V4912, V4913, V4914, V4915, - V4916, V4917, V4918, V4919, V4920, V4921, V4922, V4923, - V4924, V4925, V4926, V4927, V4928, V4929, V4930, V4931, - V4932, V4933, V4934, V4935, V4936, V4937, V4938, V4939, - }, // P[209] - { - V4940, V4941, V4942, V4943, V4944, V4945, V4946, V4947, - V4948, V4949, V4950, V4951, V4952, V4953, V4954, V4955, - V4956, V4957, V4958, V4959, V4960, V4961, V4962, V4963, - V4964, V4965, V4966, V4967, V4968, V4969, V4970, V4971, - }, // P[210] - { - V4972, V4973, V4974, V4975, V4976, V4977, V4978, V4979, - V4980, V4981, V4982, V4983, V4984, V4985, V4986, V4987, - V4988, V4989, V4990, V4991, V4992, V4993, V4994, V4995, - V4996, V4997, V4998, V4999, V5000, V5001, V5002, V5003, - }, // P[211] - { - V5004, V5005, V5006, V5007, V5008, V5009, V5010, V5011, - V5012, V5013, V5014, V5015, V5016, V5017, V5018, V5019, - V5020, V5021, V5022, V5023, V5024, V5025, V5026, V5027, - V5028, V5029, V5030, V5031, V5032, V5033, V5034, V5035, - }, // P[212] - { - V5036, V5037, V5038, V5039, V5040, V5041, V5042, V5043, - V5044, V5045, V5046, V5047, V5048, V5049, V5050, V5051, - V5052, V5053, V5054, V5055, V5056, V5057, V5058, V5059, - V5060, V5061, V5062, V5063, V5064, V5065, V5066, V5067, - }, // P[213] - { - V5068, V5069, V5070, V5071, V5072, V5073, V5074, V5075, - V5076, V5077, V5078, V5079, V5080, V5081, V5082, V5083, - V5084, V5085, V5086, V5087, V5088, V5089, V5090, V5091, - V5092, V5093, V5094, V5095, V5096, V5097, V5098, V5099, - }, // P[214] - { - V5100, V5101, V5102, V5103, V5104, V5105, V5106, V5107, - V5108, V5109, V5110, V5111, V5112, V5113, V5114, V5115, - V5116, V5117, V5118, V5119, V5120, V5121, V5122, V5123, - V5124, V5125, V5126, V5127, V5128, V5129, V5130, V5131, - }, // P[215] - { - V5132, V5133, V5134, V5135, V5136, V5137, V5138, V5139, - V5140, V5141, V5142, V5143, V5144, V5145, V5146, V5147, - V5148, V5149, V5150, V5151, V5152, V5153, V5154, V5155, - V5156, V5157, V5158, V5159, V5160, V5161, V5162, V5163, - }, // P[216] - { - V5164, V5165, V5166, V5167, V5168, V5169, V5170, V5171, - V5172, V5173, V5174, V5175, V5176, V5177, V5178, V5179, - V5180, V5181, V5182, V5183, V5184, V5185, V5186, V5187, - V5188, V5189, V5190, V5191, V5192, V5193, V5194, V5195, - }, // P[217] - { - V5196, V5197, V5198, V5199, V5200, V5201, V5202, V5203, - V5204, V5205, V5206, V5207, V5208, V5209, V5210, V5211, - V5212, V5213, V5214, V5215, V5216, V5217, V5218, V5219, - V5220, V5221, V5222, V5223, V5224, V5225, V5226, V5227, - }, // P[218] - { - V5228, V5229, V5230, V5231, V5232, V5233, V5234, V5235, - V5236, V5237, V5238, V5239, V5240, V5241, V5242, V5243, - V5244, V5245, V5246, V5247, V5248, V5249, V5250, V5251, - V5252, V5253, V5254, V5255, V5256, V5257, V5258, V5259, - }, // P[219] - { - V5260, V5261, V5262, V5263, V5264, V5265, V5266, V5267, - V5268, V5269, V5270, V5271, V5272, V5273, V5274, V5275, - V5276, V5277, V5278, V5279, V5280, V5281, V5282, V5283, - V5284, V5285, V5286, V5287, V5288, V5289, V5290, V5291, - }, // P[220] - { - V5292, V5293, V5294, V5295, V5296, V5297, V5298, V5299, - V5300, V5301, V5302, V5303, V5304, V5305, V5306, V5307, - V5308, V5309, V5310, V5311, V5312, V5313, V5314, V5315, - V5316, V5317, V5318, V5319, V5320, V5321, V5322, V5323, - }, // P[221] - { - V5324, V5325, V5326, V5327, V5328, V5329, V5330, V5331, - V5332, V5333, V5334, V5335, V5336, V5337, V5338, V5339, - V5340, V5341, V5342, V5343, V5344, V5345, V5346, V5347, - V5348, V5349, V5350, V5351, V5352, V5353, V5354, V5355, - }, // P[222] - { - V5356, V5357, V5358, V5359, V5360, V5361, V5362, V5363, - V5364, V5365, V5366, V5367, V5368, V5369, V5370, V5371, - V5372, V5373, V5374, V5375, V5376, V5377, V5378, V5379, - V5380, V5381, V5382, V5383, V5384, V5385, V5386, V5387, - }, // P[223] - { - V5388, V5389, V5390, V5391, V5392, V5393, V5394, V5395, - V5396, V5397, V5398, V5399, V5400, V5401, V5402, V5403, - V5404, V5405, V5406, V5407, V5408, V5409, V5410, V5411, - V5412, V5413, V5414, V5415, V5416, V5417, V5418, V5419, - }, // P[224] - { - V5420, V5421, V5422, V5423, V5424, V5425, V5426, V5427, - V5428, V5429, V5430, V5431, V5432, V5433, V5434, V5435, - V5436, V5437, V5438, V5439, V5440, V5441, V5442, V5443, - V5444, V5445, V5446, V5447, V5448, V5449, V5450, V5451, - }, // P[225] - { - V5452, V5453, V5454, V5455, V5456, V5457, V5458, V5459, - V5460, V5461, V5462, V5463, V5464, V5465, V5466, V5467, - V5468, V5469, V5470, V5471, V5472, V5473, V5474, V5475, - V5476, V5477, V5478, V5479, V5480, V5481, V5482, V5483, - }, // P[226] - { - V5484, V5485, V5486, V5487, V5488, V5489, V5490, V5491, - V5492, V5493, V5494, V5495, V5496, V5497, V5498, V5499, - V5500, V5501, V5502, V5503, V5504, V5505, V5506, V5507, - V5508, V5509, V5510, V5511, V5512, V5513, V5514, V5515, - }, // P[227] - { - V5516, V5517, V5518, V5519, V5520, V5521, V5522, V5523, - V5524, V5525, V5526, V5527, V5528, V5529, V5530, V5531, - V5532, V5533, V5534, V5535, V5536, V5537, V5538, V5539, - V5540, V5541, V5542, V5543, V5544, V5545, V5546, V5547, - }, // P[228] - { - V5548, V5549, V5550, V5551, V5552, V5553, V5554, V5555, - V5556, V5557, V5558, V5559, V5560, V5561, V5562, V5563, - V5564, V5565, V5566, V5567, V5568, V5569, V5570, V5571, - V5572, V5573, V5574, V5575, V5576, V5577, V5578, V5579, - }, // P[229] - { - V5580, V5581, V5582, V5583, V5584, V5585, V5586, V5587, - V5588, V5589, V5590, V5591, V5592, V5593, V5594, V5595, - V5596, V5597, V5598, V5599, V5600, V5601, V5602, V5603, - V5604, V5605, V5606, V5607, V5608, V5609, V5610, V5611, - }, // P[230] - { - V5612, V5613, V5614, V5615, V5616, V5617, V5618, V5619, - V5620, V5621, V5622, V5623, V5624, V5625, V5626, V5627, - V5628, V5629, V5630, V5631, V5632, V5633, V5634, V5635, - V5636, V5637, V5638, V5639, V5640, V5641, V5642, V5643, - }, // P[231] - { - V5644, V5645, V5646, V5647, V5648, V5649, V5650, V5651, - V5652, V5653, V5654, V5655, V5656, V5657, V5658, V5659, - V5660, V5661, V5662, V5663, V5664, V5665, V5666, V5667, - V5668, V5669, V5670, V5671, V5672, V5673, V5674, V5675, - }, // P[232] - { - V5676, V5677, V5678, V5679, V5680, V5681, V5682, V5683, - V5684, V5685, V5686, V5687, V5688, V5689, V5690, V5691, - V5692, V5693, V5694, V5695, V5696, V5697, V5698, V5699, - V5700, V5701, V5702, V5703, V5704, V5705, V5706, V5707, - }, // P[233] - { - V5708, V5709, V5710, V5711, V5712, V5713, V5714, V5715, - V5716, V5717, V5718, V5719, V5720, V5721, V5722, V5723, - V5724, V5725, V5726, V5727, V5728, V5729, V5730, V5731, - V5732, V5733, V5734, V5735, V5736, V5737, V5738, V5739, - }, // P[234] - { - V5740, V5741, V5742, V5743, V5744, V5745, V5746, V5747, - V5748, V5749, V5750, V5751, V5752, V5753, V5754, V5755, - V5756, V5757, V5758, V5759, V5760, V5761, V5762, V5763, - V5764, V5765, V5766, V5767, V5768, V5769, V5770, V5771, - }, // P[235] - { - V5772, V5773, V5774, V5775, V5776, V5777, V5778, V5779, - V5780, V5781, V5782, V5783, V5784, V5785, V5786, V5787, - V5788, V5789, V5790, V5791, V5792, V5793, V5794, V5795, - V5796, V5797, V5798, V5799, V5800, V5801, V5802, V5803, - }, // P[236] - { - V5804, V5805, V5806, V5807, V5808, V5809, V5810, V5811, - V5812, V5813, V5814, V5815, V5816, V5817, V5818, V5819, - V5820, V5821, V5822, V5823, V5824, V5825, V5826, V5827, - V5828, V5829, V5830, V5831, V5832, V5833, V5834, V5835, - }, // P[237] - { - V5836, V5837, V5838, V5839, V5840, V5841, V5842, V5843, - V5844, V5845, V5846, V5847, V5848, V5849, V5850, V5851, - V5852, V5853, V5854, V5855, V5856, V5857, V5858, V5859, - V5860, V5861, V5862, V5863, V5864, V5865, V5866, V5867, - }, // P[238] - { - V5868, V5869, V5870, V5871, V5872, V5873, V5874, V5875, - V5876, V5877, V5878, V5879, V5880, V5881, V5882, V5883, - V5884, V5885, V5886, V5887, V5888, V5889, V5890, V5891, - V5892, V5893, V5894, V5895, V5896, V5897, V5898, V5899, - }, // P[239] - { - V5900, V5901, V5902, V5903, V5904, V5905, V5906, V5907, - V5908, V5909, V5910, V5911, V5912, V5913, V5914, V5915, - V5916, V5917, V5918, V5919, V5920, V5921, V5922, V5923, - V5924, V5925, V5926, V5927, V5928, V5929, V5930, V5931, - }, // P[240] - { - V5932, V5933, V5934, V5935, V5936, V5937, V5938, V5939, - V5940, V5941, V5942, V5943, V5944, V5945, V5946, V5947, - V5948, V5949, V5950, V5951, V5952, V5953, V5954, V5955, - V5956, V5957, V5958, V5959, V5960, V5961, V5962, V5963, - }, // P[241] - { - V5964, V5965, V5966, V5967, V5968, V5969, V5970, V5971, - V5972, V5973, V5974, V5975, V5976, V5977, V5978, V5979, - V5980, V5981, V5982, V5983, V5984, V5985, V5986, V5987, - V5988, V5989, V5990, V5991, V5992, V5993, V5994, V5995, - }, // P[242] - { - V5996, V5997, V5998, V5999, V6000, V6001, V6002, V6003, - V6004, V6005, V6006, V6007, V6008, V6009, V6010, V6011, - V6012, V6013, V6014, V6015, V6016, V6017, V6018, V6019, - V6020, V6021, V6022, V6023, V6024, V6025, V6026, V6027, - }, // P[243] - { - V6028, V6029, V6030, V6031, V6032, V6033, V6034, V6035, - V6036, V6037, V6038, V6039, V6040, V6041, V6042, V6043, - V6044, V6045, V6046, V6047, V6048, V6049, V6050, V6051, - V6052, V6053, V6054, V6055, V6056, V6057, V6058, V6059, - }, // P[244] - { - V6060, V6061, V6062, V6063, V6064, V6065, V6066, V6067, - V6068, V6069, V6070, V6071, V6072, V6073, V6074, V6075, - V6076, V6077, V6078, V6079, V6080, V6081, V6082, V6083, - V6084, V6085, V6086, V6087, V6088, V6089, V6090, V6091, - }, // P[245] - { - V6092, V6093, V6094, V6095, V6096, V6097, V6098, V6099, - V6100, V6101, V6102, V6103, V6104, V6105, V6106, V6107, - V6108, V6109, V6110, V6111, V6112, V6113, V6114, V6115, - V6116, V6117, V6118, V6119, V6120, V6121, V6122, V6123, - }, // P[246] - { - V6124, V6125, V6126, V6127, V6128, V6129, V6130, V6131, - V6132, V6133, V6134, V6135, V6136, V6137, V6138, V6139, - V6140, V6141, V6142, V6143, V6144, V6145, V6146, V6147, - V6148, V6149, V6150, V6151, V6152, V6153, V6154, V6155, - }, // P[247] - { - V6156, V6157, V6158, V6159, V6160, V6161, V6162, V6163, - V6164, V6165, V6166, V6167, V6168, V6169, V6170, V6171, - V6172, V6173, V6174, V6175, V6176, V6177, V6178, V6179, - V6180, V6181, V6182, V6183, V6184, V6185, V6186, V6187, - }, // P[248] - { - V6188, V6189, V6190, V6191, V6192, V6193, V6194, V6195, - V6196, V6197, V6198, V6199, V6200, V6201, V6202, V6203, - V6204, V6205, V6206, V6207, V6208, V6209, V6210, V6211, - V6212, V6213, V6214, V6215, V6216, V6217, V6218, V6219, - }, // P[249] - { - V6220, V6221, V6222, V6223, V6224, V6225, V6226, V6227, - V6228, V6229, V6230, V6231, V6232, V6233, V6234, V6235, - V6236, V6237, V6238, V6239, V6240, V6241, V6242, V6243, - V6244, V6245, V6246, V6247, V6248, V6249, V6250, V6251, - }, // P[250] - { - V6252, V6253, V6254, V6255, V6256, V6257, V6258, V6259, - V6260, V6261, V6262, V6263, V6264, V6265, V6266, V6267, - V6268, V6269, V6270, V6271, V6272, V6273, V6274, V6275, - V6276, V6277, V6278, V6279, V6280, V6281, V6282, V6283, - }, // P[251] - { - V6284, V6285, V6286, V6287, V6288, V6289, V6290, V6291, - V6292, V6293, V6294, V6295, V6296, V6297, V6298, V6299, - V6300, V6301, V6302, V6303, V6304, V6305, V6306, V6307, - V6308, V6309, V6310, V6311, V6312, V6313, V6314, V6315, - }, // P[252] - { - V6316, V6317, V6318, V6319, V6320, V6321, V6322, V6323, - V6324, V6325, V6326, V6327, V6328, V6329, V6330, V6331, - V6332, V6333, V6334, V6335, V6336, V6337, V6338, V6339, - V6340, V6341, V6342, V6343, V6344, V6345, V6346, V6347, - }, // P[253] - { - V6348, V6349, V6350, V6351, V6352, V6353, V6354, V6355, - V6356, V6357, V6358, V6359, V6360, V6361, V6362, V6363, - V6364, V6365, V6366, V6367, V6368, V6369, V6370, V6371, - V6372, V6373, V6374, V6375, V6376, V6377, V6378, V6379, - }, // P[254] - { - V6380, V6381, V6382, V6383, V6384, V6385, V6386, V6387, - V6388, V6389, V6390, V6391, V6392, V6393, V6394, V6395, - V6396, V6397, V6398, V6399, V6400, V6401, V6402, V6403, - V6404, V6405, V6406, V6407, V6408, V6409, V6410, V6411, - }, // P[255] - { - V6412, V6413, V6414, V6415, V6416, V6417, V6418, V6419, - V6420, V6421, V6422, V6423, V6424, V6425, V6426, V6427, - V6428, V6429, V6430, V6431, V6432, V6433, V6434, V6435, - V6436, V6437, V6438, V6439, V6440, V6441, V6442, V6443, - }, // P[256] - { - V6444, V6445, V6446, V6447, V6448, V6449, V6450, V6451, - V6452, V6453, V6454, V6455, V6456, V6457, V6458, V6459, - V6460, V6461, V6462, V6463, V6464, V6465, V6466, V6467, - V6468, V6469, V6470, V6471, V6472, V6473, V6474, V6475, - }, // P[257] - { - V6476, V6477, V6478, V6479, V6480, V6481, V6482, V6483, - V6484, V6485, V6486, V6487, V6488, V6489, V6490, V6491, - V6492, V6493, V6494, V6495, V6496, V6497, V6498, V6499, - V6500, V6501, V6502, V6503, V6504, V6505, V6506, V6507, - }, // P[258] - { - V6508, V6509, V6510, V6511, V6512, V6513, V6514, V6515, - V6516, V6517, V6518, V6519, V6520, V6521, V6522, V6523, - V6524, V6525, V6526, V6527, V6528, V6529, V6530, V6531, - V6532, V6533, V6534, V6535, V6536, V6537, V6538, V6539, - }, // P[259] - { - V6540, V6541, V6542, V6543, V6544, V6545, V6546, V6547, - V6548, V6549, V6550, V6551, V6552, V6553, V6554, V6555, - V6556, V6557, V6558, V6559, V6560, V6561, V6562, V6563, - V6564, V6565, V6566, V6567, V6568, V6569, V6570, V6571, - }, // P[260] - { - V6572, V6573, V6574, V6575, V6576, V6577, V6578, V6579, - V6580, V6581, V6582, V6583, V6584, V6585, V6586, V6587, - V6588, V6589, V6590, V6591, V6592, V6593, V6594, V6595, - V6596, V6597, V6598, V6599, V6600, V6601, V6602, V6603, - }, // P[261] - { - V6604, V6605, V6606, V6607, V6608, V6609, V6610, V6611, - V6612, V6613, V6614, V6615, V6616, V6617, V6618, V6619, - V6620, V6621, V6622, V6623, V6624, V6625, V6626, V6627, - V6628, V6629, V6630, V6631, V6632, V6633, V6634, V6635, - }, // P[262] - { - V6636, V6637, V6638, V6639, V6640, V6641, V6642, V6643, - V6644, V6645, V6646, V6647, V6648, V6649, V6650, V6651, - V6652, V6653, V6654, V6655, V6656, V6657, V6658, V6659, - V6660, V6661, V6662, V6663, V6664, V6665, V6666, V6667, - }, // P[263] - { - V6668, V6669, V6670, V6671, V6672, V6673, V6674, V6675, - V6676, V6677, V6678, V6679, V6680, V6681, V6682, V6683, - V6684, V6685, V6686, V6687, V6688, V6689, V6690, V6691, - V6692, V6693, V6694, V6695, V6696, V6697, V6698, V6699, - }, // P[264] - { - V6700, V6701, V6702, V6703, V6704, V6705, V6706, V6707, - V6708, V6709, V6710, V6711, V6712, V6713, V6714, V6715, - V6716, V6717, V6718, V6719, V6720, V6721, V6722, V6723, - V6724, V6725, V6726, V6727, V6728, V6729, V6730, V6731, - }, // P[265] - { - V6732, V6733, V6734, V6735, V6736, V6737, V6738, V6739, - V6740, V6741, V6742, V6743, V6744, V6745, V6746, V6747, - V6748, V6749, V6750, V6751, V6752, V6753, V6754, V6755, - V6756, V6757, V6758, V6759, V6760, V6761, V6762, V6763, - }, // P[266] - { - V6764, V6765, V6766, V6767, V6768, V6769, V6770, V6771, - V6772, V6773, V6774, V6775, V6776, V6777, V6778, V6779, - V6780, V6781, V6782, V6783, V6784, V6785, V6786, V6787, - V6788, V6789, V6790, V6791, V6792, V6793, V6794, V6795, - }, // P[267] - { - V6796, V6797, V6798, V6799, V6800, V6801, V6802, V6803, - V6804, V6805, V6806, V6807, V6808, V6809, V6810, V6811, - V6812, V6813, V6814, V6815, V6816, V6817, V6818, V6819, - V6820, V6821, V6822, V6823, V6824, V6825, V6826, V6827, - }, // P[268] - { - V6828, V6829, V6830, V6831, V6832, V6833, V6834, V6835, - V6836, V6837, V6838, V6839, V6840, V6841, V6842, V6843, - V6844, V6845, V6846, V6847, V6848, V6849, V6850, V6851, - V6852, V6853, V6854, V6855, V6856, V6857, V6858, V6859, - }, // P[269] - { - V6860, V6861, V6862, V6863, V6864, V6865, V6866, V6867, - V6868, V6869, V6870, V6871, V6872, V6873, V6874, V6875, - V6876, V6877, V6878, V6879, V6880, V6881, V6882, V6883, - V6884, V6885, V6886, V6887, V6888, V6889, V6890, V6891, - }, // P[270] - { - V6892, V6893, V6894, V6895, V6896, V6897, V6898, V6899, - V6900, V6901, V6902, V6903, V6904, V6905, V6906, V6907, - V6908, V6909, V6910, V6911, V6912, V6913, V6914, V6915, - V6916, V6917, V6918, V6919, V6920, V6921, V6922, V6923, - }, // P[271] - { - V6924, V6925, V6926, V6927, V6928, V6929, V6930, V6931, - V6932, V6933, V6934, V6935, V6936, V6937, V6938, V6939, - V6940, V6941, V6942, V6943, V6944, V6945, V6946, V6947, - V6948, V6949, V6950, V6951, V6952, V6953, V6954, V6955, - }, // P[272] - { - V6956, V6957, V6958, V6959, V6960, V6961, V6962, V6963, - V6964, V6965, V6966, V6967, V6968, V6969, V6970, V6971, - V6972, V6973, V6974, V6975, V6976, V6977, V6978, V6979, - V6980, V6981, V6982, V6983, V6984, V6985, V6986, V6987, - }, // P[273] - { - V6988, V6989, V6990, V6991, V6992, V6993, V6994, V6995, - V6996, V6997, V6998, V6999, V7000, V7001, V7002, V7003, - V7004, V7005, V7006, V7007, V7008, V7009, V7010, V7011, - V7012, V7013, V7014, V7015, V7016, V7017, V7018, V7019, - }, // P[274] - { - V7020, V7021, V7022, V7023, V7024, V7025, V7026, V7027, - V7028, V7029, V7030, V7031, V7032, V7033, V7034, V7035, - V7036, V7037, V7038, V7039, V7040, V7041, V7042, V7043, - V7044, V7045, V7046, V7047, V7048, V7049, V7050, V7051, - }, // P[275] - { - V7052, V7053, V7054, V7055, V7056, V7057, V7058, V7059, - V7060, V7061, V7062, V7063, V7064, V7065, V7066, V7067, - V7068, V7069, V7070, V7071, V7072, V7073, V7074, V7075, - V7076, V7077, V7078, V7079, V7080, V7081, V7082, V7083, - }, // P[276] - { - V7084, V7085, V7086, V7087, V7088, V7089, V7090, V7091, - V7092, V7093, V7094, V7095, V7096, V7097, V7098, V7099, - V7100, V7101, V7102, V7103, V7104, V7105, V7106, V7107, - V7108, V7109, V7110, V7111, V7112, V7113, V7114, V7115, - }, // P[277] - { - V7116, V7117, V7118, V7119, V7120, V7121, V7122, V7123, - V7124, V7125, V7126, V7127, V7128, V7129, V7130, V7131, - V7132, V7133, V7134, V7135, V7136, V7137, V7138, V7139, - V7140, V7141, V7142, V7143, V7144, V7145, V7146, V7147, - }, // P[278] - { - V7148, V7149, V7150, V7151, V7152, V7153, V7154, V7155, - V7156, V7157, V7158, V7159, V7160, V7161, V7162, V7163, - V7164, V7165, V7166, V7167, V7168, V7169, V7170, V7171, - V7172, V7173, V7174, V7175, V7176, V7177, V7178, V7179, - }, // P[279] - { - V7180, V7181, V7182, V7183, V7184, V7185, V7186, V7187, - V7188, V7189, V7190, V7191, V7192, V7193, V7194, V7195, - V7196, V7197, V7198, V7199, V7200, V7201, V7202, V7203, - V7204, V7205, V7206, V7207, V7208, V7209, V7210, V7211, - }, // P[280] - { - V7212, V7213, V7214, V7215, V7216, V7217, V7218, V7219, - V7220, V7221, V7222, V7223, V7224, V7225, V7226, V7227, - V7228, V7229, V7230, V7231, V7232, V7233, V7234, V7235, - V7236, V7237, V7238, V7239, V7240, V7241, V7242, V7243, - }, // P[281] - { - V7244, V7245, V7246, V7247, V7248, V7249, V7250, V7251, - V7252, V7253, V7254, V7255, V7256, V7257, V7258, V7259, - V7260, V7261, V7262, V7263, V7264, V7265, V7266, V7267, - V7268, V7269, V7270, V7271, V7272, V7273, V7274, V7275, - }, // P[282] - { - V7276, V7277, V7278, V7279, V7280, V7281, V7282, V7283, - V7284, V7285, V7286, V7287, V7288, V7289, V7290, V7291, - V7292, V7293, V7294, V7295, V7296, V7297, V7298, V7299, - V7300, V7301, V7302, V7303, V7304, V7305, V7306, V7307, - }, // P[283] - { - V7308, V7309, V7310, V7311, V7312, V7313, V7314, V7315, - V7316, V7317, V7318, V7319, V7320, V7321, V7322, V7323, - V7324, V7325, V7326, V7327, V7328, V7329, V7330, V7331, - V7332, V7333, V7334, V7335, V7336, V7337, V7338, V7339, - }, // P[284] - { - V7340, V7341, V7342, V7343, V7344, V7345, V7346, V7347, - V7348, V7349, V7350, V7351, V7352, V7353, V7354, V7355, - V7356, V7357, V7358, V7359, V7360, V7361, V7362, V7363, - V7364, V7365, V7366, V7367, V7368, V7369, V7370, V7371, - }, // P[285] - { - V7372, V7373, V7374, V7375, V7376, V7377, V7378, V7379, - V7380, V7381, V7382, V7383, V7384, V7385, V7386, V7387, - V7388, V7389, V7390, V7391, V7392, V7393, V7394, V7395, - V7396, V7397, V7398, V7399, V7400, V7401, V7402, V7403, - }, // P[286] - { - V7404, V7405, V7406, V7407, V7408, V7409, V7410, V7411, - V7412, V7413, V7414, V7415, V7416, V7417, V7418, V7419, - V7420, V7421, V7422, V7423, V7424, V7425, V7426, V7427, - V7428, V7429, V7430, V7431, V7432, V7433, V7434, V7435, - }, // P[287] - { - V7436, V7437, V7438, V7439, V7440, V7441, V7442, V7443, - V7444, V7445, V7446, V7447, V7448, V7449, V7450, V7451, - V7452, V7453, V7454, V7455, V7456, V7457, V7458, V7459, - V7460, V7461, V7462, V7463, V7464, V7465, V7466, V7467, - }, // P[288] - { - V7468, V7469, V7470, V7471, V7472, V7473, V7474, V7475, - V7476, V7477, V7478, V7479, V7480, V7481, V7482, V7483, - V7484, V7485, V7486, V7487, V7488, V7489, V7490, V7491, - V7492, V7493, V7494, V7495, V7496, V7497, V7498, V7499, - }, // P[289] - { - V7500, V7501, V7502, V7503, V7504, V7505, V7506, V7507, - V7508, V7509, V7510, V7511, V7512, V7513, V7514, V7515, - V7516, V7517, V7518, V7519, V7520, V7521, V7522, V7523, - V7524, V7525, V7526, V7527, V7528, V7529, V7530, V7531, - }, // P[290] - { - V7532, V7533, V7534, V7535, V7536, V7537, V7538, V7539, - V7540, V7541, V7542, V7543, V7544, V7545, V7546, V7547, - V7548, V7549, V7550, V7551, V7552, V7553, V7554, V7555, - V7556, V7557, V7558, V7559, V7560, V7561, V7562, V7563, - }, // P[291] - { - V7564, V7565, V7566, V7567, V7568, V7569, V7570, V7571, - V7572, V7573, V7574, V7575, V7576, V7577, V7578, V7579, - V7580, V7581, V7582, V7583, V7584, V7585, V7586, V7587, - V7588, V7589, V7590, V7591, V7592, V7593, V7594, V7595, - }, // P[292] - { - V7596, V7597, V7598, V7599, V7600, V7601, V7602, V7603, - V7604, V7605, V7606, V7607, V7608, V7609, V7610, V7611, - V7612, V7613, V7614, V7615, V7616, V7617, V7618, V7619, - V7620, V7621, V7622, V7623, V7624, V7625, V7626, V7627, - }, // P[293] - { - V7628, V7629, V7630, V7631, V7632, V7633, V7634, V7635, - V7636, V7637, V7638, V7639, V7640, V7641, V7642, V7643, - V7644, V7645, V7646, V7647, V7648, V7649, V7650, V7651, - V7652, V7653, V7654, V7655, V7656, V7657, V7658, V7659, - }, // P[294] - { - V7660, V7661, V7662, V7663, V7664, V7665, V7666, V7667, - V7668, V7669, V7670, V7671, V7672, V7673, V7674, V7675, - V7676, V7677, V7678, V7679, V7680, V7681, V7682, V7683, - V7684, V7685, V7686, V7687, V7688, V7689, V7690, V7691, - }, // P[295] - { - V7692, V7693, V7694, V7695, V7696, V7697, V7698, V7699, - V7700, V7701, V7702, V7703, V7704, V7705, V7706, V7707, - V7708, V7709, V7710, V7711, V7712, V7713, V7714, V7715, - V7716, V7717, V7718, V7719, V7720, V7721, V7722, V7723, - }, // P[296] - { - V7724, V7725, V7726, V7727, V7728, V7729, V7730, V7731, - V7732, V7733, V7734, V7735, V7736, V7737, V7738, V7739, - V7740, V7741, V7742, V7743, V7744, V7745, V7746, V7747, - V7748, V7749, V7750, V7751, V7752, V7753, V7754, V7755, - }, // P[297] - { - V7756, V7757, V7758, V7759, V7760, V7761, V7762, V7763, - V7764, V7765, V7766, V7767, V7768, V7769, V7770, V7771, - V7772, V7773, V7774, V7775, V7776, V7777, V7778, V7779, - V7780, V7781, V7782, V7783, V7784, V7785, V7786, V7787, - }, // P[298] - { - V7788, V7789, V7790, V7791, V7792, V7793, V7794, V7795, - V7796, V7797, V7798, V7799, V7800, V7801, V7802, V7803, - V7804, V7805, V7806, V7807, V7808, V7809, V7810, V7811, - V7812, V7813, V7814, V7815, V7816, V7817, V7818, V7819, - }, // P[299] - { - V7820, V7821, V7822, V7823, V7824, V7825, V7826, V7827, - V7828, V7829, V7830, V7831, V7832, V7833, V7834, V7835, - V7836, V7837, V7838, V7839, V7840, V7841, V7842, V7843, - V7844, V7845, V7846, V7847, V7848, V7849, V7850, V7851, - }, // P[300] - { - V7852, V7853, V7854, V7855, V7856, V7857, V7858, V7859, - V7860, V7861, V7862, V7863, V7864, V7865, V7866, V7867, - V7868, V7869, V7870, V7871, V7872, V7873, V7874, V7875, - V7876, V7877, V7878, V7879, V7880, V7881, V7882, V7883, - }, // P[301] - { - V7884, V7885, V7886, V7887, V7888, V7889, V7890, V7891, - V7892, V7893, V7894, V7895, V7896, V7897, V7898, V7899, - V7900, V7901, V7902, V7903, V7904, V7905, V7906, V7907, - V7908, V7909, V7910, V7911, V7912, V7913, V7914, V7915, - }, // P[302] - { - V7916, V7917, V7918, V7919, V7920, V7921, V7922, V7923, - V7924, V7925, V7926, V7927, V7928, V7929, V7930, V7931, - V7932, V7933, V7934, V7935, V7936, V7937, V7938, V7939, - V7940, V7941, V7942, V7943, V7944, V7945, V7946, V7947, - }, // P[303] - { - V7948, V7949, V7950, V7951, V7952, V7953, V7954, V7955, - V7956, V7957, V7958, V7959, V7960, V7961, V7962, V7963, - V7964, V7965, V7966, V7967, V7968, V7969, V7970, V7971, - V7972, V7973, V7974, V7975, V7976, V7977, V7978, V7979, - }, // P[304] - { - V7980, V7981, V7982, V7983, V7984, V7985, V7986, V7987, - V7988, V7989, V7990, V7991, V7992, V7993, V7994, V7995, - V7996, V7997, V7998, V7999, V8000, V8001, V8002, V8003, - V8004, V8005, V8006, V8007, V8008, V8009, V8010, V8011, - }, // P[305] - { - V8012, V8013, V8014, V8015, V8016, V8017, V8018, V8019, - V8020, V8021, V8022, V8023, V8024, V8025, V8026, V8027, - V8028, V8029, V8030, V8031, V8032, V8033, V8034, V8035, - V8036, V8037, V8038, V8039, V8040, V8041, V8042, V8043, - }, // P[306] - { - V8044, V8045, V8046, V8047, V8048, V8049, V8050, V8051, - V8052, V8053, V8054, V8055, V8056, V8057, V8058, V8059, - V8060, V8061, V8062, V8063, V8064, V8065, V8066, V8067, - V8068, V8069, V8070, V8071, V8072, V8073, V8074, V8075, - }, // P[307] - { - V8076, V8077, V8078, V8079, V8080, V8081, V8082, V8083, - V8084, V8085, V8086, V8087, V8088, V8089, V8090, V8091, - V8092, V8093, V8094, V8095, V8096, V8097, V8098, V8099, - V8100, V8101, V8102, V8103, V8104, V8105, V8106, V8107, - }, // P[308] - { - V8108, V8109, V8110, V8111, V8112, V8113, V8114, V8115, - V8116, V8117, V8118, V8119, V8120, V8121, V8122, V8123, - V8124, V8125, V8126, V8127, V8128, V8129, V8130, V8131, - V8132, V8133, V8134, V8135, V8136, V8137, V8138, V8139, - }, // P[309] - { - V8140, V8141, V8142, V8143, V8144, V8145, V8146, V8147, - V8148, V8149, V8150, V8151, V8152, V8153, V8154, V8155, - V8156, V8157, V8158, V8159, V8160, V8161, V8162, V8163, - V8164, V8165, V8166, V8167, V8168, V8169, V8170, V8171, - }, // P[310] - { - V8172, V8173, V8174, V8175, V8176, V8177, V8178, V8179, - V8180, V8181, V8182, V8183, V8184, V8185, V8186, V8187, - V8188, V8189, V8190, V8191, V8192, V8193, V8194, V8195, - V8196, V8197, V8198, V8199, V8200, V8201, V8202, V8203, - }, // P[311] - { - V8204, V8205, V8206, V8207, V8208, V8209, V8210, V8211, - V8212, V8213, V8214, V8215, V8216, V8217, V8218, V8219, - V8220, V8221, V8222, V8223, V8224, V8225, V8226, V8227, - V8228, V8229, V8230, V8231, V8232, V8233, V8234, V8235, - }, // P[312] - { - V8236, V8237, V8238, V8239, V8240, V8241, V8242, V8243, - V8244, V8245, V8246, V8247, V8248, V8249, V8250, V8251, - V8252, V8253, V8254, V8255, V8256, V8257, V8258, V8259, - V8260, V8261, V8262, V8263, V8264, V8265, V8266, V8267, - }, // P[313] - { - V8268, V8269, V8270, V8271, V8272, V8273, V8274, V8275, - V8276, V8277, V8278, V8279, V8280, V8281, V8282, V8283, - V8284, V8285, V8286, V8287, V8288, V8289, V8290, V8291, - V8292, V8293, V8294, V8295, V8296, V8297, V8298, V8299, - }, // P[314] - { - V8300, V8301, V8302, V8303, V8304, V8305, V8306, V8307, - V8308, V8309, V8310, V8311, V8312, V8313, V8314, V8315, - V8316, V8317, V8318, V8319, V8320, V8321, V8322, V8323, - V8324, V8325, V8326, V8327, V8328, V8329, V8330, V8331, - }, // P[315] - { - V8332, V8333, V8334, V8335, V8336, V8337, V8338, V8339, - V8340, V8341, V8342, V8343, V8344, V8345, V8346, V8347, - V8348, V8349, V8350, V8351, V8352, V8353, V8354, V8355, - V8356, V8357, V8358, V8359, V8360, V8361, V8362, V8363, - }, // P[316] - { - V8364, V8365, V8366, V8367, V8368, V8369, V8370, V8371, - V8372, V8373, V8374, V8375, V8376, V8377, V8378, V8379, - V8380, V8381, V8382, V8383, V8384, V8385, V8386, V8387, - V8388, V8389, V8390, V8391, V8392, V8393, V8394, V8395, - }, // P[317] - { - V8396, V8397, V8398, V8399, V8400, V8401, V8402, V8403, - V8404, V8405, V8406, V8407, V8408, V8409, V8410, V8411, - V8412, V8413, V8414, V8415, V8416, V8417, V8418, V8419, - V8420, V8421, V8422, V8423, V8424, V8425, V8426, V8427, - }, // P[318] - { - V8428, V8429, V8430, V8431, V8432, V8433, V8434, V8435, - V8436, V8437, V8438, V8439, V8440, V8441, V8442, V8443, - V8444, V8445, V8446, V8447, V8448, V8449, V8450, V8451, - V8452, V8453, V8454, V8455, V8456, V8457, V8458, V8459, - }, // P[319] - { - V8460, V8461, V8462, V8463, V8464, V8465, V8466, V8467, - V8468, V8469, V8470, V8471, V8472, V8473, V8474, V8475, - V8476, V8477, V8478, V8479, V8480, V8481, V8482, V8483, - V8484, V8485, V8486, V8487, V8488, V8489, V8490, V8491, - }, // P[320] - { - V8492, V8493, V8494, V8495, V8496, V8497, V8498, V8499, - V8500, V8501, V8502, V8503, V8504, V8505, V8506, V8507, - V8508, V8509, V8510, V8511, V8512, V8513, V8514, V8515, - V8516, V8517, V8518, V8519, V8520, V8521, V8522, V8523, - }, // P[321] - { - V8524, V8525, V8526, V8527, V8528, V8529, V8530, V8531, - V8532, V8533, V8534, V8535, V8536, V8537, V8538, V8539, - V8540, V8541, V8542, V8543, V8544, V8545, V8546, V8547, - V8548, V8549, V8550, V8551, V8552, V8553, V8554, V8555, - }, // P[322] - { - V8556, V8557, V8558, V8559, V8560, V8561, V8562, V8563, - V8564, V8565, V8566, V8567, V8568, V8569, V8570, V8571, - V8572, V8573, V8574, V8575, V8576, V8577, V8578, V8579, - V8580, V8581, V8582, V8583, V8584, V8585, V8586, V8587, - }, // P[323] - { - V8588, V8589, V8590, V8591, V8592, V8593, V8594, V8595, - V8596, V8597, V8598, V8599, V8600, V8601, V8602, V8603, - V8604, V8605, V8606, V8607, V8608, V8609, V8610, V8611, - V8612, V8613, V8614, V8615, V8616, V8617, V8618, V8619, - }, // P[324] - { - V8620, V8621, V8622, V8623, V8624, V8625, V8626, V8627, - V8628, V8629, V8630, V8631, V8632, V8633, V8634, V8635, - V8636, V8637, V8638, V8639, V8640, V8641, V8642, V8643, - V8644, V8645, V8646, V8647, V8648, V8649, V8650, V8651, - }, // P[325] - { - V8652, V8653, V8654, V8655, V8656, V8657, V8658, V8659, - V8660, V8661, V8662, V8663, V8664, V8665, V8666, V8667, - V8668, V8669, V8670, V8671, V8672, V8673, V8674, V8675, - V8676, V8677, V8678, V8679, V8680, V8681, V8682, V8683, - }, // P[326] - { - V8684, V8685, V8686, V8687, V8688, V8689, V8690, V8691, - V8692, V8693, V8694, V8695, V8696, V8697, V8698, V8699, - V8700, V8701, V8702, V8703, V8704, V8705, V8706, V8707, - V8708, V8709, V8710, V8711, V8712, V8713, V8714, V8715, - }, // P[327] - { - V8716, V8717, V8718, V8719, V8720, V8721, V8722, V8723, - V8724, V8725, V8726, V8727, V8728, V8729, V8730, V8731, - V8732, V8733, V8734, V8735, V8736, V8737, V8738, V8739, - V8740, V8741, V8742, V8743, V8744, V8745, V8746, V8747, - }, // P[328] - { - V8748, V8749, V8750, V8751, V8752, V8753, V8754, V8755, - V8756, V8757, V8758, V8759, V8760, V8761, V8762, V8763, - V8764, V8765, V8766, V8767, V8768, V8769, V8770, V8771, - V8772, V8773, V8774, V8775, V8776, V8777, V8778, V8779, - }, // P[329] - { - V8780, V8781, V8782, V8783, V8784, V8785, V8786, V8787, - V8788, V8789, V8790, V8791, V8792, V8793, V8794, V8795, - V8796, V8797, V8798, V8799, V8800, V8801, V8802, V8803, - V8804, V8805, V8806, V8807, V8808, V8809, V8810, V8811, - }, // P[330] - { - V8812, V8813, V8814, V8815, V8816, V8817, V8818, V8819, - V8820, V8821, V8822, V8823, V8824, V8825, V8826, V8827, - V8828, V8829, V8830, V8831, V8832, V8833, V8834, V8835, - V8836, V8837, V8838, V8839, V8840, V8841, V8842, V8843, - }, // P[331] - { - V8844, V8845, V8846, V8847, V8848, V8849, V8850, V8851, - V8852, V8853, V8854, V8855, V8856, V8857, V8858, V8859, - V8860, V8861, V8862, V8863, V8864, V8865, V8866, V8867, - V8868, V8869, V8870, V8871, V8872, V8873, V8874, V8875, - }, // P[332] - { - V8876, V8877, V8878, V8879, V8880, V8881, V8882, V8883, - V8884, V8885, V8886, V8887, V8888, V8889, V8890, V8891, - V8892, V8893, V8894, V8895, V8896, V8897, V8898, V8899, - V8900, V8901, V8902, V8903, V8904, V8905, V8906, V8907, - }, // P[333] - { - V8908, V8909, V8910, V8911, V8912, V8913, V8914, V8915, - V8916, V8917, V8918, V8919, V8920, V8921, V8922, V8923, - V8924, V8925, V8926, V8927, V8928, V8929, V8930, V8931, - V8932, V8933, V8934, V8935, V8936, V8937, V8938, V8939, - }, // P[334] - { - V8940, V8941, V8942, V8943, V8944, V8945, V8946, V8947, - V8948, V8949, V8950, V8951, V8952, V8953, V8954, V8955, - V8956, V8957, V8958, V8959, V8960, V8961, V8962, V8963, - V8964, V8965, V8966, V8967, V8968, V8969, V8970, V8971, - }, // P[335] - { - V8972, V8973, V8974, V8975, V8976, V8977, V8978, V8979, - V8980, V8981, V8982, V8983, V8984, V8985, V8986, V8987, - V8988, V8989, V8990, V8991, V8992, V8993, V8994, V8995, - V8996, V8997, V8998, V8999, V9000, V9001, V9002, V9003, - }, // P[336] - { - V9004, V9005, V9006, V9007, V9008, V9009, V9010, V9011, - V9012, V9013, V9014, V9015, V9016, V9017, V9018, V9019, - V9020, V9021, V9022, V9023, V9024, V9025, V9026, V9027, - V9028, V9029, V9030, V9031, V9032, V9033, V9034, V9035, - }, // P[337] - { - V9036, V9037, V9038, V9039, V9040, V9041, V9042, V9043, - V9044, V9045, V9046, V9047, V9048, V9049, V9050, V9051, - V9052, V9053, V9054, V9055, V9056, V9057, V9058, V9059, - V9060, V9061, V9062, V9063, V9064, V9065, V9066, V9067, - }, // P[338] - { - V9068, V9069, V9070, V9071, V9072, V9073, V9074, V9075, - V9076, V9077, V9078, V9079, V9080, V9081, V9082, V9083, - V9084, V9085, V9086, V9087, V9088, V9089, V9090, V9091, - V9092, V9093, V9094, V9095, V9096, V9097, V9098, V9099, - }, // P[339] - { - V9100, V9101, V9102, V9103, V9104, V9105, V9106, V9107, - V9108, V9109, V9110, V9111, V9112, V9113, V9114, V9115, - V9116, V9117, V9118, V9119, V9120, V9121, V9122, V9123, - V9124, V9125, V9126, V9127, V9128, V9129, V9130, V9131, - }, // P[340] - { - V9132, V9133, V9134, V9135, V9136, V9137, V9138, V9139, - V9140, V9141, V9142, V9143, V9144, V9145, V9146, V9147, - V9148, V9149, V9150, V9151, V9152, V9153, V9154, V9155, - V9156, V9157, V9158, V9159, V9160, V9161, V9162, V9163, - }, // P[341] - { - V9164, V9165, V9166, V9167, V9168, V9169, V9170, V9171, - V9172, V9173, V9174, V9175, V9176, V9177, V9178, V9179, - V9180, V9181, V9182, V9183, V9184, V9185, V9186, V9187, - V9188, V9189, V9190, V9191, V9192, V9193, V9194, V9195, - }, // P[342] - { - V9196, V9197, V9198, V9199, V9200, V9201, V9202, V9203, - V9204, V9205, V9206, V9207, V9208, V9209, V9210, V9211, - V9212, V9213, V9214, V9215, V9216, V9217, V9218, V9219, - V9220, V9221, V9222, V9223, V9224, V9225, V9226, V9227, - }, // P[343] - { - V9228, V9229, V9230, V9231, V9232, V9233, V9234, V9235, - V9236, V9237, V9238, V9239, V9240, V9241, V9242, V9243, - V9244, V9245, V9246, V9247, V9248, V9249, V9250, V9251, - V9252, V9253, V9254, V9255, V9256, V9257, V9258, V9259, - }, // P[344] - { - V9260, V9261, V9262, V9263, V9264, V9265, V9266, V9267, - V9268, V9269, V9270, V9271, V9272, V9273, V9274, V9275, - V9276, V9277, V9278, V9279, V9280, V9281, V9282, V9283, - V9284, V9285, V9286, V9287, V9288, V9289, V9290, V9291, - }, // P[345] - { - V9292, V9293, V9294, V9295, V9296, V9297, V9298, V9299, - V9300, V9301, V9302, V9303, V9304, V9305, V9306, V9307, - V9308, V9309, V9310, V9311, V9312, V9313, V9314, V9315, - V9316, V9317, V9318, V9319, V9320, V9321, V9322, V9323, - }, // P[346] - { - V9324, V9325, V9326, V9327, V9328, V9329, V9330, V9331, - V9332, V9333, V9334, V9335, V9336, V9337, V9338, V9339, - V9340, V9341, V9342, V9343, V9344, V9345, V9346, V9347, - V9348, V9349, V9350, V9351, V9352, V9353, V9354, V9355, - }, // P[347] - { - V9356, V9357, V9358, V9359, V9360, V9361, V9362, V9363, - V9364, V9365, V9366, V9367, V9368, V9369, V9370, V9371, - V9372, V9373, V9374, V9375, V9376, V9377, V9378, V9379, - V9380, V9381, V9382, V9383, V9384, V9385, V9386, V9387, - }, // P[348] - { - V9388, V9389, V9390, V9391, V9392, V9393, V9394, V9395, - V9396, V9397, V9398, V9399, V9400, V9401, V9402, V9403, - V9404, V9405, V9406, V9407, V9408, V9409, V9410, V9411, - V9412, V9413, V9414, V9415, V9416, V9417, V9418, V9419, - }, // P[349] - { - V9420, V9421, V9422, V9423, V9424, V9425, V9426, V9427, - V9428, V9429, V9430, V9431, V9432, V9433, V9434, V9435, - V9436, V9437, V9438, V9439, V9440, V9441, V9442, V9443, - V9444, V9445, V9446, V9447, V9448, V9449, V9450, V9451, - }, // P[350] - { - V9452, V9453, V9454, V9455, V9456, V9457, V9458, V9459, - V9460, V9461, V9462, V9463, V9464, V9465, V9466, V9467, - V9468, V9469, V9470, V9471, V9472, V9473, V9474, V9475, - V9476, V9477, V9478, V9479, V9480, V9481, V9482, V9483, - }, // P[351] - { - V9484, V9485, V9486, V9487, V9488, V9489, V9490, V9491, - V9492, V9493, V9494, V9495, V9496, V9497, V9498, V9499, - V9500, V9501, V9502, V9503, V9504, V9505, V9506, V9507, - V9508, V9509, V9510, V9511, V9512, V9513, V9514, V9515, - }, // P[352] - { - V9516, V9517, V9518, V9519, V9520, V9521, V9522, V9523, - V9524, V9525, V9526, V9527, V9528, V9529, V9530, V9531, - V9532, V9533, V9534, V9535, V9536, V9537, V9538, V9539, - V9540, V9541, V9542, V9543, V9544, V9545, V9546, V9547, - }, // P[353] - { - V9548, V9549, V9550, V9551, V9552, V9553, V9554, V9555, - V9556, V9557, V9558, V9559, V9560, V9561, V9562, V9563, - V9564, V9565, V9566, V9567, V9568, V9569, V9570, V9571, - V9572, V9573, V9574, V9575, V9576, V9577, V9578, V9579, - }, // P[354] - { - V9580, V9581, V9582, V9583, V9584, V9585, V9586, V9587, - V9588, V9589, V9590, V9591, V9592, V9593, V9594, V9595, - V9596, V9597, V9598, V9599, V9600, V9601, V9602, V9603, - V9604, V9605, V9606, V9607, V9608, V9609, V9610, V9611, - }, // P[355] - { - V9612, V9613, V9614, V9615, V9616, V9617, V9618, V9619, - V9620, V9621, V9622, V9623, V9624, V9625, V9626, V9627, - V9628, V9629, V9630, V9631, V9632, V9633, V9634, V9635, - V9636, V9637, V9638, V9639, V9640, V9641, V9642, V9643, - }, // P[356] - { - V9644, V9645, V9646, V9647, V9648, V9649, V9650, V9651, - V9652, V9653, V9654, V9655, V9656, V9657, V9658, V9659, - V9660, V9661, V9662, V9663, V9664, V9665, V9666, V9667, - V9668, V9669, V9670, V9671, V9672, V9673, V9674, V9675, - }, // P[357] - { - V9676, V9677, V9678, V9679, V9680, V9681, V9682, V9683, - V9684, V9685, V9686, V9687, V9688, V9689, V9690, V9691, - V9692, V9693, V9694, V9695, V9696, V9697, V9698, V9699, - V9700, V9701, V9702, V9703, V9704, V9705, V9706, V9707, - }, // P[358] - { - V9708, V9709, V9710, V9711, V9712, V9713, V9714, V9715, - V9716, V9717, V9718, V9719, V9720, V9721, V9722, V9723, - V9724, V9725, V9726, V9727, V9728, V9729, V9730, V9731, - V9732, V9733, V9734, V9735, V9736, V9737, V9738, V9739, - }, // P[359] - { - V9740, V9741, V9742, V9743, V9744, V9745, V9746, V9747, - V9748, V9749, V9750, V9751, V9752, V9753, V9754, V9755, - V9756, V9757, V9758, V9759, V9760, V9761, V9762, V9763, - V9764, V9765, V9766, V9767, V9768, V9769, V9770, V9771, - }, // P[360] - { - V9772, V9773, V9774, V9775, V9776, V9777, V9778, V9779, - V9780, V9781, V9782, V9783, V9784, V9785, V9786, V9787, - V9788, V9789, V9790, V9791, V9792, V9793, V9794, V9795, - V9796, V9797, V9798, V9799, V9800, V9801, V9802, V9803, - }, // P[361] - { - V9804, V9805, V9806, V9807, V9808, V9809, V9810, V9811, - V9812, V9813, V9814, V9815, V9816, V9817, V9818, V9819, - V9820, V9821, V9822, V9823, V9824, V9825, V9826, V9827, - V9828, V9829, V9830, V9831, V9832, V9833, V9834, V9835, - }, // P[362] - { - V9836, V9837, V9838, V9839, V9840, V9841, V9842, V9843, - V9844, V9845, V9846, V9847, V9848, V9849, V9850, V9851, - V9852, V9853, V9854, V9855, V9856, V9857, V9858, V9859, - V9860, V9861, V9862, V9863, V9864, V9865, V9866, V9867, - }, // P[363] - { - V9868, V9869, V9870, V9871, V9872, V9873, V9874, V9875, - V9876, V9877, V9878, V9879, V9880, V9881, V9882, V9883, - V9884, V9885, V9886, V9887, V9888, V9889, V9890, V9891, - V9892, V9893, V9894, V9895, V9896, V9897, V9898, V9899, - }, // P[364] - { - V9900, V9901, V9902, V9903, V9904, V9905, V9906, V9907, - V9908, V9909, V9910, V9911, V9912, V9913, V9914, V9915, - V9916, V9917, V9918, V9919, V9920, V9921, V9922, V9923, - V9924, V9925, V9926, V9927, V9928, V9929, V9930, V9931, - }, // P[365] - { - V9932, V9933, V9934, V9935, V9936, V9937, V9938, V9939, - V9940, V9941, V9942, V9943, V9944, V9945, V9946, V9947, - V9948, V9949, V9950, V9951, V9952, V9953, V9954, V9955, - V9956, V9957, V9958, V9959, V9960, V9961, V9962, V9963, - }, // P[366] - { - V9964, V9965, V9966, V9967, V9968, V9969, V9970, V9971, - V9972, V9973, V9974, V9975, V9976, V9977, V9978, V9979, - V9980, V9981, V9982, V9983, V9984, V9985, V9986, V9987, - V9988, V9989, V9990, V9991, V9992, V9993, V9994, V9995, - }, // P[367] - { - V9996, V9997, V9998, V9999, V10000, V10001, V10002, V10003, - V10004, V10005, V10006, V10007, V10008, V10009, V10010, V10011, - V10012, V10013, V10014, V10015, V10016, V10017, V10018, V10019, - V10020, V10021, V10022, V10023, V10024, V10025, V10026, V10027, - }, // P[368] - { - V10028, V10029, V10030, V10031, V10032, V10033, V10034, V10035, - V10036, V10037, V10038, V10039, V10040, V10041, V10042, V10043, - V10044, V10045, V10046, V10047, V10048, V10049, V10050, V10051, - V10052, V10053, V10054, V10055, V10056, V10057, V10058, V10059, - }, // P[369] - { - V10060, V10061, V10062, V10063, V10064, V10065, V10066, V10067, - V10068, V10069, V10070, V10071, V10072, V10073, V10074, V10075, - V10076, V10077, V10078, V10079, V10080, V10081, V10082, V10083, - V10084, V10085, V10086, V10087, V10088, V10089, V10090, V10091, - }, // P[370] - { - V10092, V10093, V10094, V10095, V10096, V10097, V10098, V10099, - V10100, V10101, V10102, V10103, V10104, V10105, V10106, V10107, - V10108, V10109, V10110, V10111, V10112, V10113, V10114, V10115, - V10116, V10117, V10118, V10119, V10120, V10121, V10122, V10123, - }, // P[371] - { - V10124, V10125, V10126, V10127, V10128, V10129, V10130, V10131, - V10132, V10133, V10134, V10135, V10136, V10137, V10138, V10139, - V10140, V10141, V10142, V10143, V10144, V10145, V10146, V10147, - V10148, V10149, V10150, V10151, V10152, V10153, V10154, V10155, - }, // P[372] - { - V10156, V10157, V10158, V10159, V10160, V10161, V10162, V10163, - V10164, V10165, V10166, V10167, V10168, V10169, V10170, V10171, - V10172, V10173, V10174, V10175, V10176, V10177, V10178, V10179, - V10180, V10181, V10182, V10183, V10184, V10185, V10186, V10187, - }, // P[373] - { - V10188, V10189, V10190, V10191, V10192, V10193, V10194, V10195, - V10196, V10197, V10198, V10199, V10200, V10201, V10202, V10203, - V10204, V10205, V10206, V10207, V10208, V10209, V10210, V10211, - V10212, V10213, V10214, V10215, V10216, V10217, V10218, V10219, - }, // P[374] - { - V10220, V10221, V10222, V10223, V10224, V10225, V10226, V10227, - V10228, V10229, V10230, V10231, V10232, V10233, V10234, V10235, - V10236, V10237, V10238, V10239, V10240, V10241, V10242, V10243, - V10244, V10245, V10246, V10247, V10248, V10249, V10250, V10251, - }, // P[375] - { - V10252, V10253, V10254, V10255, V10256, V10257, V10258, V10259, - V10260, V10261, V10262, V10263, V10264, V10265, V10266, V10267, - V10268, V10269, V10270, V10271, V10272, V10273, V10274, V10275, - V10276, V10277, V10278, V10279, V10280, V10281, V10282, V10283, - }, // P[376] - { - V10284, V10285, V10286, V10287, V10288, V10289, V10290, V10291, - V10292, V10293, V10294, V10295, V10296, V10297, V10298, V10299, - V10300, V10301, V10302, V10303, V10304, V10305, V10306, V10307, - V10308, V10309, V10310, V10311, V10312, V10313, V10314, V10315, - }, // P[377] - { - V10316, V10317, V10318, V10319, V10320, V10321, V10322, V10323, - V10324, V10325, V10326, V10327, V10328, V10329, V10330, V10331, - V10332, V10333, V10334, V10335, V10336, V10337, V10338, V10339, - V10340, V10341, V10342, V10343, V10344, V10345, V10346, V10347, - }, // P[378] - { - V10348, V10349, V10350, V10351, V10352, V10353, V10354, V10355, - V10356, V10357, V10358, V10359, V10360, V10361, V10362, V10363, - V10364, V10365, V10366, V10367, V10368, V10369, V10370, V10371, - V10372, V10373, V10374, V10375, V10376, V10377, V10378, V10379, - }, // P[379] - { - V10380, V10381, V10382, V10383, V10384, V10385, V10386, V10387, - V10388, V10389, V10390, V10391, V10392, V10393, V10394, V10395, - V10396, V10397, V10398, V10399, V10400, V10401, V10402, V10403, - V10404, V10405, V10406, V10407, V10408, V10409, V10410, V10411, - }, // P[380] - { - V10412, V10413, V10414, V10415, V10416, V10417, V10418, V10419, - V10420, V10421, V10422, V10423, V10424, V10425, V10426, V10427, - V10428, V10429, V10430, V10431, V10432, V10433, V10434, V10435, - V10436, V10437, V10438, V10439, V10440, V10441, V10442, V10443, - }, // P[381] - { - V10444, V10445, V10446, V10447, V10448, V10449, V10450, V10451, - V10452, V10453, V10454, V10455, V10456, V10457, V10458, V10459, - V10460, V10461, V10462, V10463, V10464, V10465, V10466, V10467, - V10468, V10469, V10470, V10471, V10472, V10473, V10474, V10475, - }, // P[382] - { - V10476, V10477, V10478, V10479, V10480, V10481, V10482, V10483, - V10484, V10485, V10486, V10487, V10488, V10489, V10490, V10491, - V10492, V10493, V10494, V10495, V10496, V10497, V10498, V10499, - V10500, V10501, V10502, V10503, V10504, V10505, V10506, V10507, - }, // P[383] - { - V10508, V10509, V10510, V10511, V10512, V10513, V10514, V10515, - V10516, V10517, V10518, V10519, V10520, V10521, V10522, V10523, - V10524, V10525, V10526, V10527, V10528, V10529, V10530, V10531, - V10532, V10533, V10534, V10535, V10536, V10537, V10538, V10539, - }, // P[384] - { - V10540, V10541, V10542, V10543, V10544, V10545, V10546, V10547, - V10548, V10549, V10550, V10551, V10552, V10553, V10554, V10555, - V10556, V10557, V10558, V10559, V10560, V10561, V10562, V10563, - V10564, V10565, V10566, V10567, V10568, V10569, V10570, V10571, - }, // P[385] - { - V10572, V10573, V10574, V10575, V10576, V10577, V10578, V10579, - V10580, V10581, V10582, V10583, V10584, V10585, V10586, V10587, - V10588, V10589, V10590, V10591, V10592, V10593, V10594, V10595, - V10596, V10597, V10598, V10599, V10600, V10601, V10602, V10603, - }, // P[386] - { - V10604, V10605, V10606, V10607, V10608, V10609, V10610, V10611, - V10612, V10613, V10614, V10615, V10616, V10617, V10618, V10619, - V10620, V10621, V10622, V10623, V10624, V10625, V10626, V10627, - V10628, V10629, V10630, V10631, V10632, V10633, V10634, V10635, - }, // P[387] - { - V10636, V10637, V10638, V10639, V10640, V10641, V10642, V10643, - V10644, V10645, V10646, V10647, V10648, V10649, V10650, V10651, - V10652, V10653, V10654, V10655, V10656, V10657, V10658, V10659, - V10660, V10661, V10662, V10663, V10664, V10665, V10666, V10667, - }, // P[388] - { - V10668, V10669, V10670, V10671, V10672, V10673, V10674, V10675, - V10676, V10677, V10678, V10679, V10680, V10681, V10682, V10683, - V10684, V10685, V10686, V10687, V10688, V10689, V10690, V10691, - V10692, V10693, V10694, V10695, V10696, V10697, V10698, V10699, - }, // P[389] - { - V10700, V10701, V10702, V10703, V10704, V10705, V10706, V10707, - V10708, V10709, V10710, V10711, V10712, V10713, V10714, V10715, - V10716, V10717, V10718, V10719, V10720, V10721, V10722, V10723, - V10724, V10725, V10726, V10727, V10728, V10729, V10730, V10731, - }, // P[390] - { - V10732, V10733, V10734, V10735, V10736, V10737, V10738, V10739, - V10740, V10741, V10742, V10743, V10744, V10745, V10746, V10747, - V10748, V10749, V10750, V10751, V10752, V10753, V10754, V10755, - V10756, V10757, V10758, V10759, V10760, V10761, V10762, V10763, - }, // P[391] - { - V10764, V10765, V10766, V10767, V10768, V10769, V10770, V10771, - V10772, V10773, V10774, V10775, V10776, V10777, V10778, V10779, - V10780, V10781, V10782, V10783, V10784, V10785, V10786, V10787, - V10788, V10789, V10790, V10791, V10792, V10793, V10794, V10795, - }, // P[392] - { - V10796, V10797, V10798, V10799, V10800, V10801, V10802, V10803, - V10804, V10805, V10806, V10807, V10808, V10809, V10810, V10811, - V10812, V10813, V10814, V10815, V10816, V10817, V10818, V10819, - V10820, V10821, V10822, V10823, V10824, V10825, V10826, V10827, - }, // P[393] - { - V10828, V10829, V10830, V10831, V10832, V10833, V10834, V10835, - V10836, V10837, V10838, V10839, V10840, V10841, V10842, V10843, - V10844, V10845, V10846, V10847, V10848, V10849, V10850, V10851, - V10852, V10853, V10854, V10855, V10856, V10857, V10858, V10859, - }, // P[394] - { - V10860, V10861, V10862, V10863, V10864, V10865, V10866, V10867, - V10868, V10869, V10870, V10871, V10872, V10873, V10874, V10875, - V10876, V10877, V10878, V10879, V10880, V10881, V10882, V10883, - V10884, V10885, V10886, V10887, V10888, V10889, V10890, V10891, - }, // P[395] - { - V10892, V10893, V10894, V10895, V10896, V10897, V10898, V10899, - V10900, V10901, V10902, V10903, V10904, V10905, V10906, V10907, - V10908, V10909, V10910, V10911, V10912, V10913, V10914, V10915, - V10916, V10917, V10918, V10919, V10920, V10921, V10922, V10923, - }, // P[396] - { - V10924, V10925, V10926, V10927, V10928, V10929, V10930, V10931, - V10932, V10933, V10934, V10935, V10936, V10937, V10938, V10939, - V10940, V10941, V10942, V10943, V10944, V10945, V10946, V10947, - V10948, V10949, V10950, V10951, V10952, V10953, V10954, V10955, - }, // P[397] - { - V10956, V10957, V10958, V10959, V10960, V10961, V10962, V10963, - V10964, V10965, V10966, V10967, V10968, V10969, V10970, V10971, - V10972, V10973, V10974, V10975, V10976, V10977, V10978, V10979, - V10980, V10981, V10982, V10983, V10984, V10985, V10986, V10987, - }, // P[398] - { - V10988, V10989, V10990, V10991, V10992, V10993, V10994, V10995, - V10996, V10997, V10998, V10999, V11000, V11001, V11002, V11003, - V11004, V11005, V11006, V11007, V11008, V11009, V11010, V11011, - V11012, V11013, V11014, V11015, V11016, V11017, V11018, V11019, - }, // P[399] - { - V11020, V11021, V11022, V11023, V11024, V11025, V11026, V11027, - V11028, V11029, V11030, V11031, V11032, V11033, V11034, V11035, - V11036, V11037, V11038, V11039, V11040, V11041, V11042, V11043, - V11044, V11045, V11046, V11047, V11048, V11049, V11050, V11051, - }, // P[400] - { - V11052, V11053, V11054, V11055, V11056, V11057, V11058, V11059, - V11060, V11061, V11062, V11063, V11064, V11065, V11066, V11067, - V11068, V11069, V11070, V11071, V11072, V11073, V11074, V11075, - V11076, V11077, V11078, V11079, V11080, V11081, V11082, V11083, - }, // P[401] - { - V11084, V11085, V11086, V11087, V11088, V11089, V11090, V11091, - V11092, V11093, V11094, V11095, V11096, V11097, V11098, V11099, - V11100, V11101, V11102, V11103, V11104, V11105, V11106, V11107, - V11108, V11109, V11110, V11111, V11112, V11113, V11114, V11115, - }, // P[402] - { - V11116, V11117, V11118, V11119, V11120, V11121, V11122, V11123, - V11124, V11125, V11126, V11127, V11128, V11129, V11130, V11131, - V11132, V11133, V11134, V11135, V11136, V11137, V11138, V11139, - V11140, V11141, V11142, V11143, V11144, V11145, V11146, V11147, - }, // P[403] - { - V11148, V11149, V11150, V11151, V11152, V11153, V11154, V11155, - V11156, V11157, V11158, V11159, V11160, V11161, V11162, V11163, - V11164, V11165, V11166, V11167, V11168, V11169, V11170, V11171, - V11172, V11173, V11174, V11175, V11176, V11177, V11178, V11179, - }, // P[404] - { - V11180, V11181, V11182, V11183, V11184, V11185, V11186, V11187, - V11188, V11189, V11190, V11191, V11192, V11193, V11194, V11195, - V11196, V11197, V11198, V11199, V11200, V11201, V11202, V11203, - V11204, V11205, V11206, V11207, V11208, V11209, V11210, V11211, - }, // P[405] - { - V11212, V11213, V11214, V11215, V11216, V11217, V11218, V11219, - V11220, V11221, V11222, V11223, V11224, V11225, V11226, V11227, - V11228, V11229, V11230, V11231, V11232, V11233, V11234, V11235, - V11236, V11237, V11238, V11239, V11240, V11241, V11242, V11243, - }, // P[406] - { - V11244, V11245, V11246, V11247, V11248, V11249, V11250, V11251, - V11252, V11253, V11254, V11255, V11256, V11257, V11258, V11259, - V11260, V11261, V11262, V11263, V11264, V11265, V11266, V11267, - V11268, V11269, V11270, V11271, V11272, V11273, V11274, V11275, - }, // P[407] - { - V11276, V11277, V11278, V11279, V11280, V11281, V11282, V11283, - V11284, V11285, V11286, V11287, V11288, V11289, V11290, V11291, - V11292, V11293, V11294, V11295, V11296, V11297, V11298, V11299, - V11300, V11301, V11302, V11303, V11304, V11305, V11306, V11307, - }, // P[408] - { - V11308, V11309, V11310, V11311, V11312, V11313, V11314, V11315, - V11316, V11317, V11318, V11319, V11320, V11321, V11322, V11323, - V11324, V11325, V11326, V11327, V11328, V11329, V11330, V11331, - V11332, V11333, V11334, V11335, V11336, V11337, V11338, V11339, - }, // P[409] - { - V11340, V11341, V11342, V11343, V11344, V11345, V11346, V11347, - V11348, V11349, V11350, V11351, V11352, V11353, V11354, V11355, - V11356, V11357, V11358, V11359, V11360, V11361, V11362, V11363, - V11364, V11365, V11366, V11367, V11368, V11369, V11370, V11371, - }, // P[410] - { - V11372, V11373, V11374, V11375, V11376, V11377, V11378, V11379, - V11380, V11381, V11382, V11383, V11384, V11385, V11386, V11387, - V11388, V11389, V11390, V11391, V11392, V11393, V11394, V11395, - V11396, V11397, V11398, V11399, V11400, V11401, V11402, V11403, - }, // P[411] - { - V11404, V11405, V11406, V11407, V11408, V11409, V11410, V11411, - V11412, V11413, V11414, V11415, V11416, V11417, V11418, V11419, - V11420, V11421, V11422, V11423, V11424, V11425, V11426, V11427, - V11428, V11429, V11430, V11431, V11432, V11433, V11434, V11435, - }, // P[412] - { - V11436, V11437, V11438, V11439, V11440, V11441, V11442, V11443, - V11444, V11445, V11446, V11447, V11448, V11449, V11450, V11451, - V11452, V11453, V11454, V11455, V11456, V11457, V11458, V11459, - V11460, V11461, V11462, V11463, V11464, V11465, V11466, V11467, - }, // P[413] - { - V11468, V11469, V11470, V11471, V11472, V11473, V11474, V11475, - V11476, V11477, V11478, V11479, V11480, V11481, V11482, V11483, - V11484, V11485, V11486, V11487, V11488, V11489, V11490, V11491, - V11492, V11493, V11494, V11495, V11496, V11497, V11498, V11499, - }, // P[414] - { - V11500, V11501, V11502, V11503, V11504, V11505, V11506, V11507, - V11508, V11509, V11510, V11511, V11512, V11513, V11514, V11515, - V11516, V11517, V11518, V11519, V11520, V11521, V11522, V11523, - V11524, V11525, V11526, V11527, V11528, V11529, V11530, V11531, - }, // P[415] - { - V11532, V11533, V11534, V11535, V11536, V11537, V11538, V11539, - V11540, V11541, V11542, V11543, V11544, V11545, V11546, V11547, - V11548, V11549, V11550, V11551, V11552, V11553, V11554, V11555, - V11556, V11557, V11558, V11559, V11560, V11561, V11562, V11563, - }, // P[416] - { - V11564, V11565, V11566, V11567, V11568, V11569, V11570, V11571, - V11572, V11573, V11574, V11575, V11576, V11577, V11578, V11579, - V11580, V11581, V11582, V11583, V11584, V11585, V11586, V11587, - V11588, V11589, V11590, V11591, V11592, V11593, V11594, V11595, - }, // P[417] - { - V11596, V11597, V11598, V11599, V11600, V11601, V11602, V11603, - V11604, V11605, V11606, V11607, V11608, V11609, V11610, V11611, - V11612, V11613, V11614, V11615, V11616, V11617, V11618, V11619, - V11620, V11621, V11622, V11623, V11624, V11625, V11626, V11627, - }, // P[418] - { - V11628, V11629, V11630, V11631, V11632, V11633, V11634, V11635, - V11636, V11637, V11638, V11639, V11640, V11641, V11642, V11643, - V11644, V11645, V11646, V11647, V11648, V11649, V11650, V11651, - V11652, V11653, V11654, V11655, V11656, V11657, V11658, V11659, - }, // P[419] - { - V11660, V11661, V11662, V11663, V11664, V11665, V11666, V11667, - V11668, V11669, V11670, V11671, V11672, V11673, V11674, V11675, - V11676, V11677, V11678, V11679, V11680, V11681, V11682, V11683, - V11684, V11685, V11686, V11687, V11688, V11689, V11690, V11691, - }, // P[420] - { - V11692, V11693, V11694, V11695, V11696, V11697, V11698, V11699, - V11700, V11701, V11702, V11703, V11704, V11705, V11706, V11707, - V11708, V11709, V11710, V11711, V11712, V11713, V11714, V11715, - V11716, V11717, V11718, V11719, V11720, V11721, V11722, V11723, - }, // P[421] - { - V11724, V11725, V11726, V11727, V11728, V11729, V11730, V11731, - V11732, V11733, V11734, V11735, V11736, V11737, V11738, V11739, - V11740, V11741, V11742, V11743, V11744, V11745, V11746, V11747, - V11748, V11749, V11750, V11751, V11752, V11753, V11754, V11755, - }, // P[422] - { - V11756, V11757, V11758, V11759, V11760, V11761, V11762, V11763, - V11764, V11765, V11766, V11767, V11768, V11769, V11770, V11771, - V11772, V11773, V11774, V11775, V11776, V11777, V11778, V11779, - V11780, V11781, V11782, V11783, V11784, V11785, V11786, V11787, - }, // P[423] - { - V11788, V11789, V11790, V11791, V11792, V11793, V11794, V11795, - V11796, V11797, V11798, V11799, V11800, V11801, V11802, V11803, - V11804, V11805, V11806, V11807, V11808, V11809, V11810, V11811, - V11812, V11813, V11814, V11815, V11816, V11817, V11818, V11819, - }, // P[424] - { - V11820, V11821, V11822, V11823, V11824, V11825, V11826, V11827, - V11828, V11829, V11830, V11831, V11832, V11833, V11834, V11835, - V11836, V11837, V11838, V11839, V11840, V11841, V11842, V11843, - V11844, V11845, V11846, V11847, V11848, V11849, V11850, V11851, - }, // P[425] - { - V11852, V11853, V11854, V11855, V11856, V11857, V11858, V11859, - V11860, V11861, V11862, V11863, V11864, V11865, V11866, V11867, - V11868, V11869, V11870, V11871, V11872, V11873, V11874, V11875, - V11876, V11877, V11878, V11879, V11880, V11881, V11882, V11883, - }, // P[426] - { - V11884, V11885, V11886, V11887, V11888, V11889, V11890, V11891, - V11892, V11893, V11894, V11895, V11896, V11897, V11898, V11899, - V11900, V11901, V11902, V11903, V11904, V11905, V11906, V11907, - V11908, V11909, V11910, V11911, V11912, V11913, V11914, V11915, - }, // P[427] - { - V11916, V11917, V11918, V11919, V11920, V11921, V11922, V11923, - V11924, V11925, V11926, V11927, V11928, V11929, V11930, V11931, - V11932, V11933, V11934, V11935, V11936, V11937, V11938, V11939, - V11940, V11941, V11942, V11943, V11944, V11945, V11946, V11947, - }, // P[428] - { - V11948, V11949, V11950, V11951, V11952, V11953, V11954, V11955, - V11956, V11957, V11958, V11959, V11960, V11961, V11962, V11963, - V11964, V11965, V11966, V11967, V11968, V11969, V11970, V11971, - V11972, V11973, V11974, V11975, V11976, V11977, V11978, V11979, - }, // P[429] - { - V11980, V11981, V11982, V11983, V11984, V11985, V11986, V11987, - V11988, V11989, V11990, V11991, V11992, V11993, V11994, V11995, - V11996, V11997, V11998, V11999, V12000, V12001, V12002, V12003, - V12004, V12005, V12006, V12007, V12008, V12009, V12010, V12011, - }, // P[430] - { - V12012, V12013, V12014, V12015, V12016, V12017, V12018, V12019, - V12020, V12021, V12022, V12023, V12024, V12025, V12026, V12027, - V12028, V12029, V12030, V12031, V12032, V12033, V12034, V12035, - V12036, V12037, V12038, V12039, V12040, V12041, V12042, V12043, - }, // P[431] - { - V12044, V12045, V12046, V12047, V12048, V12049, V12050, V12051, - V12052, V12053, V12054, V12055, V12056, V12057, V12058, V12059, - V12060, V12061, V12062, V12063, V12064, V12065, V12066, V12067, - V12068, V12069, V12070, V12071, V12072, V12073, V12074, V12075, - }, // P[432] - { - V12076, V12077, V12078, V12079, V12080, V12081, V12082, V12083, - V12084, V12085, V12086, V12087, V12088, V12089, V12090, V12091, - V12092, V12093, V12094, V12095, V12096, V12097, V12098, V12099, - V12100, V12101, V12102, V12103, V12104, V12105, V12106, V12107, - }, // P[433] - { - V12108, V12109, V12110, V12111, V12112, V12113, V12114, V12115, - V12116, V12117, V12118, V12119, V12120, V12121, V12122, V12123, - V12124, V12125, V12126, V12127, V12128, V12129, V12130, V12131, - V12132, V12133, V12134, V12135, V12136, V12137, V12138, V12139, - }, // P[434] - { - V12140, V12141, V12142, V12143, V12144, V12145, V12146, V12147, - V12148, V12149, V12150, V12151, V12152, V12153, V12154, V12155, - V12156, V12157, V12158, V12159, V12160, V12161, V12162, V12163, - V12164, V12165, V12166, V12167, V12168, V12169, V12170, V12171, - }, // P[435] - { - V12172, V12173, V12174, V12175, V12176, V12177, V12178, V12179, - V12180, V12181, V12182, V12183, V12184, V12185, V12186, V12187, - V12188, V12189, V12190, V12191, V12192, V12193, V12194, V12195, - V12196, V12197, V12198, V12199, V12200, V12201, V12202, V12203, - }, // P[436] - { - V12204, V12205, V12206, V12207, V12208, V12209, V12210, V12211, - V12212, V12213, V12214, V12215, V12216, V12217, V12218, V12219, - V12220, V12221, V12222, V12223, V12224, V12225, V12226, V12227, - V12228, V12229, V12230, V12231, V12232, V12233, V12234, V12235, - }, // P[437] - { - V12236, V12237, V12238, V12239, V12240, V12241, V12242, V12243, - V12244, V12245, V12246, V12247, V12248, V12249, V12250, V12251, - V12252, V12253, V12254, V12255, V12256, V12257, V12258, V12259, - V12260, V12261, V12262, V12263, V12264, V12265, V12266, V12267, - }, // P[438] - { - V12268, V12269, V12270, V12271, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[439] - { - V12272, V12273, V12274, V12275, V12276, V12277, V12278, V12279, - V12279, V12280, V12281, V12282, V12283, V12284, V12285, V12286, - V12287, V12288, V12289, V12290, V12291, V12292, V12293, V12294, - V12295, V12296, V12297, V12298, V12299, V12300, V12301, V12302, - }, // P[440] - { - V12303, V12304, V12305, V12306, V12307, V12308, V12309, V12310, - V12311, V12312, V12313, V12314, V12315, V12316, V12317, V12318, - V12319, V12320, V12321, V12322, V12323, V12324, V12325, V12326, - V12327, V12328, V12329, V12330, V12331, V12332, V12333, V12334, - }, // P[441] - { - V12335, V12336, V12337, V12338, V12339, V12340, V12341, V12342, - V12343, V12344, V12345, V12346, V12347, V12348, V12349, V12350, - V12351, V12352, V12353, V12354, V12355, V12356, V12357, V12358, - V12359, V12360, V12361, V12362, V12291, V12363, V12364, V12365, - }, // P[442] - { - V12366, V12367, V12368, V12369, V12370, V12371, V12372, V12373, - V12374, V12375, V12376, V12377, V12378, V12379, V12380, V12381, - V12382, V12383, V12384, V12385, V12386, V12387, V12388, V12389, - V12390, V12391, V12392, V12393, V12394, V12395, V12396, V12397, - }, // P[443] - { - V12398, V12399, V12400, V12401, V12402, V12403, V12404, V12405, - V12406, V12407, V12408, V12409, V12410, V12411, V12412, V12413, - V12414, V12415, V12416, V12417, V12418, V12419, V12420, V12421, - V12422, V12423, V12424, V12425, V12426, V12427, V12428, V12429, - }, // P[444] - { - V12430, V12381, V12431, V12432, V12433, V12434, V12435, V12436, - V12437, V12438, V12365, V12439, V12440, V12441, V12442, V12443, - V12444, V12445, V12446, V12447, V12448, V12449, V12450, V12451, - V12452, V12453, V12454, V12455, V12456, V12457, V12458, V12291, - }, // P[445] - { - V12459, V12460, V12461, V12462, V12463, V12464, V12465, V12466, - V12467, V12468, V12469, V12470, V12471, V12472, V12473, V12474, - V12475, V12476, V12477, V12478, V12479, V12480, V12481, V12482, - V12483, V12484, V12485, V12367, V12486, V12487, V12488, V12489, - }, // P[446] - { - V12490, V12491, V12492, V12493, V12494, V12495, V12496, V12497, - V12498, V12499, V12500, V12501, V12502, V12503, V12504, V12505, - V12506, V12507, V12508, V12509, V12510, V12511, V12512, V12513, - V12514, V12515, V12516, V12517, V12518, V12519, V12520, V12521, - }, // P[447] - { - V12522, V12523, V12524, V12525, V12526, V12527, V12528, V12529, - V12530, V12531, V12532, V12533, V12534, V12535, 0, 0, - V12536, 0, V12537, 0, 0, V12538, V12539, V12540, - V12541, V12542, V12543, V12544, V12545, V12546, V12547, 0, - }, // P[448] - { - V12548, 0, V12549, 0, 0, V12550, V12551, 0, - 0, 0, V12552, V12553, V12554, V12555, V12556, V12557, - V12558, V12559, V12560, V12561, V12562, V12563, V12564, V12565, - V12566, V12567, V12568, V12569, V12570, V12571, V12572, V12573, - }, // P[449] - { - V12574, V12575, V12576, V12577, V12578, V12579, V12580, V12581, - V12582, V12583, V12584, V12585, V12586, V12587, V12588, V12589, - V12590, V12591, V12592, V12593, V12594, V12595, V12596, V12420, - V12597, V12598, V12599, V12600, V12601, V12602, V12602, V12603, - }, // P[450] - { - V12604, V12605, V12606, V12607, V12608, V12609, V12610, V12550, - V12611, V12612, V12613, V12614, V12615, V12616, 0, 0, - V12617, V12618, V12619, V12620, V12621, V12622, V12623, V12624, - V12564, V12625, V12626, V12627, V12536, V12628, V12629, V12630, - }, // P[451] - { - V12631, V12632, V12633, V12634, V12635, V12636, V12637, V12638, - V12639, V12573, V12640, V12574, V12641, V12642, V12643, V12644, - V12645, V12537, V12312, V12646, V12647, V12648, V12382, V12469, - V12649, V12650, V12581, V12651, V12582, V12652, V12653, V12654, - }, // P[452] - { - V12539, V12655, V12656, V12657, V12658, V12659, V12540, V12660, - V12661, V12662, V12663, V12664, V12665, V12596, V12666, V12667, - V12420, V12668, V12600, V12669, V12670, V12671, V12672, V12673, - V12605, V12674, V12549, V12675, V12606, V12363, V12676, V12607, - }, // P[453] - { - V12677, V12609, V12678, V12679, V12680, V12681, V12682, V12611, - V12545, V12683, V12612, V12684, V12613, V12685, V12279, V12686, - V12687, V12688, V12689, V12690, V12691, V12692, V12693, V12694, - V12695, V12696, 0, 0, 0, 0, 0, 0, - }, // P[454] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, V12697, 0, V12698, - }, // P[455] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V12699, V12700, V12701, V12702, V12703, V12704, - V12705, V12706, V12707, V12708, V12709, V12710, V12711, 0, - V12712, V12713, V12714, V12715, V12716, 0, V12717, 0, - }, // P[456] - { - V12718, V12719, 0, V12720, V12721, 0, V12722, V12723, - V12724, V12725, V12726, V12727, V12728, V12729, V12730, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[457] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V12731, 0, V12732, 0, 0, 0, - }, // P[458] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, V12733, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[459] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, V12734, V12735, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[460] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, V12736, V12737, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[461] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, V12738, V12739, 0, V12740, 0, - }, // P[462] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, V12741, V12742, 0, 0, 0, 0, - }, // P[463] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, V12743, V12744, - }, // P[464] - { - V12745, V12746, V12747, V12748, V12749, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[465] - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, V12750, V12751, V12752, V12753, V12754, - }, // P[466] - { - V12755, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, // P[467] - { - V12756, V12757, V12758, V12759, V12760, V12558, V12761, V12762, - V12763, V12764, V12559, V12765, V12766, V12767, V12560, V12768, - V12769, V12770, V12771, V12772, V12773, V12774, V12775, V12776, - V12777, V12778, V12779, V12618, V12780, V12781, V12782, V12783, - }, // P[468] - { - V12784, V12785, V12786, V12787, V12788, V12623, V12561, V12562, - V12624, V12789, V12790, V12369, V12791, V12563, V12792, V12793, - V12794, V12795, V12795, V12795, V12796, V12797, V12798, V12799, - V12800, V12801, V12802, V12803, V12804, V12805, V12806, V12807, - }, // P[469] - { - V12808, V12809, V12810, V12811, V12812, V12813, V12813, V12626, - V12814, V12815, V12816, V12817, V12565, V12818, V12819, V12820, - V12522, V12821, V12822, V12823, V12824, V12825, V12826, V12827, - V12828, V12829, V12830, V12831, V12832, V12833, V12834, V12835, - }, // P[470] - { - V12836, V12837, V12838, V12839, V12840, V12841, V12842, V12843, - V12844, V12845, V12846, V12846, V12847, V12848, V12849, V12365, - V12850, V12851, V12852, V12853, V12854, V12855, V12856, V12857, - V12570, V12858, V12859, V12860, V12861, V12862, V12863, V12864, - }, // P[471] - { - V12865, V12866, V12867, V12868, V12869, V12870, V12871, V12872, - V12873, V12874, V12875, V12876, V12877, V12878, V12311, V12879, - V12880, V12881, V12881, V12882, V12883, V12883, V12884, V12885, - V12886, V12887, V12888, V12889, V12890, V12891, V12892, V12893, - }, // P[472] - { - V12894, V12895, V12896, V12571, V12897, V12898, V12899, V12900, - V12638, V12900, V12901, V12573, V12902, V12903, V12904, V12905, - V12574, V12284, V12906, V12907, V12908, V12909, V12910, V12911, - V12912, V12913, V12914, V12915, V12916, V12917, V12918, V12919, - }, // P[473] - { - V12920, V12921, V12922, V12923, V12924, V12925, V12926, V12927, - V12575, V12928, V12929, V12930, V12931, V12932, V12933, V12577, - V12934, V12935, V12936, V12937, V12938, V12939, V12940, V12941, - V12312, V12646, V12942, V12943, V12944, V12945, V12946, V12947, - }, // P[474] - { - V12948, V12949, V12578, V12950, V12951, V12952, V12953, V12689, - V12954, V12955, V12956, V12957, V12958, V12959, V12960, V12961, - V12962, V12963, V12964, V12965, V12966, V12382, V12967, V12968, - V12969, V12970, V12971, V12972, V12973, V12974, V12975, V12976, - }, // P[475] - { - V12977, V12579, V12469, V12978, V12979, V12980, V12981, V12982, - V12983, V12984, V12985, V12650, V12986, V12987, V12988, V12989, - V12990, V12991, V12992, V12993, V12651, V12994, V12995, V12996, - V12997, V12998, V12999, V13000, V13001, V13002, V13003, V13004, - }, // P[476] - { - V13005, V12653, V13006, V13007, V13008, V13009, V13010, V13011, - V13012, V13013, V13014, V13015, V13016, V13016, V13017, V13018, - V12655, V13019, V13020, V13021, V13022, V13023, V13024, V13025, - V12368, V13026, V13027, V13028, V13029, V13030, V13031, V13032, - }, // P[477] - { - V12661, V13033, V13034, V13035, V13036, V13037, V13038, V13038, - V12662, V12691, V13039, V13040, V13041, V13042, V13043, V12330, - V12664, V13044, V13045, V12590, V13046, V13047, V12544, V13048, - V13049, V12594, V13050, V13051, V13052, V13053, V13053, V13054, - }, // P[478] - { - V13055, V13056, V13057, V13058, V13059, V13060, V13061, V13062, - V13063, V13064, V13065, V13066, V13067, V13068, V13069, V13070, - V13071, V13072, V13073, V13074, V13075, V13076, V13077, V13078, - V13079, V13080, V12600, V13081, V13082, V13083, V13084, V13085, - }, // P[479] - { - V13086, V13087, V13088, V13089, V13090, V13091, V13092, V13093, - V13094, V13095, V13096, V12882, V13097, V13098, V13099, V13100, - V13101, V13102, V13103, V13104, V13105, V13106, V13107, V13108, - V12386, V13109, V13110, V13111, V13112, V13113, V13114, V12603, - }, // P[480] - { - V13115, V13116, V13117, V13118, V13119, V13120, V13121, V13122, - V13123, V13124, V13125, V13126, V13127, V13128, V13129, V13130, - V13131, V13132, V13133, V13134, V12325, V13135, V13136, V13137, - V13138, V13139, V13140, V12671, V13141, V13142, V13143, V13144, - }, // P[481] - { - V13145, V13146, V13147, V13148, V13149, V13150, V13151, V13152, - V13153, V13154, V13155, V13156, V13157, V13158, V13159, V13160, - V12676, V12677, V13161, V13162, V13163, V13164, V13165, V13166, - V13167, V13168, V13169, V13170, V13171, V13172, V13173, V12678, - }, // P[482] - { - V13174, V13175, V13176, V13177, V13178, V13179, V13180, V13181, - V13182, V13183, V13184, V13185, V13186, V13187, V13188, V13189, - V13190, V13191, V13192, V13193, V13194, V13195, V13196, V13197, - V13198, V13199, V13200, V13201, V13202, V13203, V12684, V12684, - }, // P[483] - { - V13204, V13205, V13206, V13207, V13208, V13209, V13210, V13211, - V13212, V13213, V12685, V13214, V13215, V13216, V13217, V13218, - V13219, V13220, V13221, V13222, V13223, V13224, V13225, V13226, - V13227, V13228, V13229, V13230, V13231, V13232, - }, // P[484] - }; // static const NUnicode::NPrivate::TDecompositionTable::TValuePtr P[][32] - - static const NUnicode::NPrivate::TDecompositionTable::TValuePtr* const Indexes[] = { - P[0], P[0], P[0], P[0], P[0], P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7], P[8], P[9], P[10], - P[11], P[12], P[13], P[14], P[15], P[16], P[0], P[0], P[0], P[0], P[17], P[18], P[19], P[20], P[21], P[0], - P[22], P[23], P[24], P[25], P[26], P[27], P[28], P[29], P[30], P[31], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[32], P[0], P[0], P[0], P[0], P[33], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[34], P[35], P[0], P[0], P[0], P[36], P[0], - P[0], P[37], P[38], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[39], P[0], P[40], P[0], P[41], P[0], - P[0], P[0], P[42], P[0], P[0], P[0], P[43], P[0], P[0], P[0], P[44], P[0], P[0], P[0], P[45], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[46], P[47], P[48], P[49], P[0], P[0], - P[0], P[50], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[51], P[52], P[53], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[54], P[55], P[56], P[57], P[58], P[59], P[60], P[61], P[62], P[63], P[64], P[65], P[66], P[67], P[68], P[69], - P[70], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[71], P[0], P[0], P[72], P[73], P[74], P[0], - P[75], P[76], P[77], P[78], P[79], P[80], P[0], P[81], P[0], P[82], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[83], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[84], P[85], P[86], P[87], P[88], P[89], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[90], P[91], P[92], P[93], P[94], P[95], P[96], P[97], P[98], P[99], P[100], P[101], P[102], P[103], P[104], P[105], - P[106], P[107], P[108], P[109], P[110], P[111], P[112], P[113], P[114], P[115], P[116], P[117], P[118], P[119], P[120], P[121], - P[122], P[123], P[124], P[125], P[126], P[127], P[128], P[129], P[130], P[131], P[132], P[133], P[134], P[135], P[136], P[137], - P[138], P[139], P[140], P[141], P[142], P[143], P[144], P[145], P[146], P[147], P[148], P[149], P[150], P[151], P[152], P[153], - P[154], P[155], P[156], P[157], P[158], P[159], P[160], P[161], P[162], P[163], P[164], P[165], P[166], P[167], P[168], P[169], - P[170], P[171], P[172], P[173], P[174], P[175], P[176], P[177], P[178], P[179], P[180], P[181], P[182], P[183], P[184], P[185], - P[186], P[187], P[188], P[189], P[190], P[191], P[192], P[193], P[194], P[195], P[196], P[197], P[198], P[199], P[200], P[201], - P[202], P[203], P[204], P[205], P[206], P[207], P[208], P[209], P[210], P[211], P[212], P[213], P[214], P[215], P[216], P[217], - P[218], P[219], P[220], P[221], P[222], P[223], P[224], P[225], P[226], P[227], P[228], P[229], P[230], P[231], P[232], P[233], - P[234], P[235], P[236], P[237], P[238], P[239], P[240], P[241], P[242], P[243], P[244], P[245], P[246], P[247], P[248], P[249], - P[250], P[251], P[252], P[253], P[254], P[255], P[256], P[257], P[258], P[259], P[260], P[261], P[262], P[263], P[264], P[265], - P[266], P[267], P[268], P[269], P[270], P[271], P[272], P[273], P[274], P[275], P[276], P[277], P[278], P[279], P[280], P[281], - P[282], P[283], P[284], P[285], P[286], P[287], P[288], P[289], P[290], P[291], P[292], P[293], P[294], P[295], P[296], P[297], - P[298], P[299], P[300], P[301], P[302], P[303], P[304], P[305], P[306], P[307], P[308], P[309], P[310], P[311], P[312], P[313], - P[314], P[315], P[316], P[317], P[318], P[319], P[320], P[321], P[322], P[323], P[324], P[325], P[326], P[327], P[328], P[329], - P[330], P[331], P[332], P[333], P[334], P[335], P[336], P[337], P[338], P[339], P[340], P[341], P[342], P[343], P[344], P[345], - P[346], P[347], P[348], P[349], P[350], P[351], P[352], P[353], P[354], P[355], P[356], P[357], P[358], P[359], P[360], P[361], - P[362], P[363], P[364], P[365], P[366], P[367], P[368], P[369], P[370], P[371], P[372], P[373], P[374], P[375], P[376], P[377], - P[378], P[379], P[380], P[381], P[382], P[383], P[384], P[385], P[386], P[387], P[388], P[389], P[390], P[391], P[392], P[393], - P[394], P[395], P[396], P[397], P[398], P[399], P[400], P[401], P[402], P[403], P[404], P[405], P[406], P[407], P[408], P[409], - P[410], P[411], P[412], P[413], P[414], P[415], P[416], P[417], P[418], P[419], P[420], P[421], P[422], P[423], P[424], P[425], - P[426], P[427], P[428], P[429], P[430], P[431], P[432], P[433], P[434], P[435], P[436], P[437], P[438], P[439], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[440], P[441], P[442], P[443], P[444], P[445], P[446], P[447], - P[448], P[449], P[450], P[451], P[452], P[453], P[454], P[0], P[455], P[456], P[457], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[458], P[459], P[0], P[0], P[0], P[460], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[461], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[462], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[463], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[464], P[465], P[0], P[466], P[467], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], P[0], - P[468], P[469], P[470], P[471], P[472], P[473], P[474], P[475], P[476], P[477], P[478], P[479], P[480], P[481], P[482], P[483], - P[484], - }; // static const NUnicode::NPrivate::TDecompositionTable::TValuePtr* const Indexes[] - - static const size_t Size = 195102; -}} // namespace NLemmerDecompositionGenerated - -namespace NUnicode { - namespace NPrivate { - const NUnicode::NPrivate::TDecompositionTable& LemmerDecomposition() { - static const NUnicode::NPrivate::TDecompositionTable data(NLemmerDecompositionGenerated::Indexes, NLemmerDecompositionGenerated::Size); - return data; - } - } // namespace NPrivate -} // namespace NUnicode - diff --git a/library/cpp/token/nlptypes.cpp b/library/cpp/token/nlptypes.cpp deleted file mode 100644 index f6dba2cdf73..00000000000 --- a/library/cpp/token/nlptypes.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "nlptypes.h" -#include "token_structure.h" - -template <typename TChr> -static NLP_TYPE GuessTypeByWordT(const TChr* w, size_t len) { - // NLP_WORD - // NLP_INTEGER - // NLP_FLOAT - // NLP_MARK - - //integer {digit}+ - //fixed {digit}+"."{digit}+ - enum EState { - G_START, - G_INT, - G_DOT, - G_FRAC, - }; - EState state = G_START; - - static const TChr DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 0}; - static const TBasicStringBuf<TChr> DIGITS_BUF{DIGITS}; - - for (unsigned i = 0; i < len; ++i) { - TChr c = w[i]; - bool bIsDigit = DIGITS_BUF.Contains(c); - switch (state) { - case G_START: - if (bIsDigit) - state = G_INT; - else { - if (TBasicStringBuf<TChr>(w, len).find_first_of(DIGITS_BUF) >= len) - return NLP_WORD; - else - return NLP_MARK; - } - break; - case G_INT: - if (bIsDigit) - break; - else if (c == '.') - state = G_DOT; - else - return NLP_MARK; - break; - case G_DOT: - if (bIsDigit) - state = G_FRAC; - else - return NLP_MARK; - break; - case G_FRAC: - if (bIsDigit) - break; - else - return NLP_MARK; - break; - } - } - switch (state) { - case G_START: - return NLP_MARK; - case G_INT: - return NLP_INTEGER; - case G_DOT: - return NLP_FLOAT; // NLP_MARK? - case G_FRAC: - return NLP_FLOAT; - } - Y_ASSERT(0); - return NLP_MARK; -} - -NLP_TYPE GuessTypeByWord(const char* w, unsigned len) { - return GuessTypeByWordT(w, len); -} - -NLP_TYPE GuessTypeByWord(const wchar16* w, unsigned len) { - return GuessTypeByWordT(w, len); -} - -NLP_TYPE DetectNLPType(const TTokenStructure& subtokens) { - Y_ASSERT(subtokens.size() >= 1); - for (size_t i = 1; i < subtokens.size(); ++i) { - Y_ASSERT(subtokens[i].Type == TOKEN_WORD || subtokens[i].Type == TOKEN_NUMBER); - if (subtokens[i].Type != subtokens[0].Type) - return NLP_MARK; - } - if (subtokens[0].Type == TOKEN_WORD) - return NLP_WORD; - else if (subtokens[0].Type == TOKEN_MARK) - return NLP_MARK; - else if (subtokens[0].Type == TOKEN_FLOAT) - return NLP_FLOAT; - else if (subtokens[0].Type == TOKEN_NUMBER) - return NLP_INTEGER; - return NLP_MARK; -} diff --git a/library/cpp/token/nlptypes.h b/library/cpp/token/nlptypes.h deleted file mode 100644 index 7d30829baa2..00000000000 --- a/library/cpp/token/nlptypes.h +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -#include <util/generic/fwd.h> -#include <util/system/defaults.h> - -enum NLP_TYPE { - NLP_END, - NLP_WORD, - NLP_INTEGER, - NLP_FLOAT, - NLP_MARK, - NLP_SENTBREAK, - NLP_PARABREAK, - NLP_MISCTEXT, // miscellaneous text: spaces, punctuation etc. -}; - -const TString& ToString(NLP_TYPE); -bool FromString(const TString& name, NLP_TYPE& ret); - -NLP_TYPE GuessTypeByWord(const char* w, unsigned len); -NLP_TYPE GuessTypeByWord(const wchar16* w, unsigned len); - -enum ESpaceType { - ST_NOBRK = 0, - ST_SENTBRK = 1, - ST_PARABRK = 3, // parabrk is a sentbrk too - ST_ZONEOPN = 4, - ST_ZONECLS = 8 -}; - -const TString& ToString(ESpaceType); -bool FromString(const TString& name, ESpaceType& ret); - -inline ESpaceType GetSpaceType(NLP_TYPE type) { - if (type == NLP_PARABREAK) - return ST_PARABRK; - if (type == NLP_SENTBREAK) - return ST_SENTBRK; - return ST_NOBRK; -} - -using TBreakType = ui32; - -inline bool IsSentBrk(TBreakType brk) { - return brk & ST_SENTBRK; -} - -inline bool IsParaBrk(TBreakType brk) { - return brk & 2; -} - -inline bool IsZoneOpn(TBreakType brk) { - return brk & ST_ZONEOPN; -} - -inline bool IsZoneCls(TBreakType brk) { - return brk & ST_ZONECLS; -} - -class TTokenStructure; -NLP_TYPE DetectNLPType(const TTokenStructure& subtokens); diff --git a/library/cpp/token/token_iterator.h b/library/cpp/token/token_iterator.h deleted file mode 100644 index 3f3d08561b8..00000000000 --- a/library/cpp/token/token_iterator.h +++ /dev/null @@ -1,210 +0,0 @@ -#pragma once - -#include "nlptypes.h" -#include "token_structure.h" - -//! merges subtokens of a multitoken to floats and marks to provide backward compatibility for new tokenization of marks -//! @note there are exclusions that not compatible with the old tokenization: -//! [v1.0] -> [v 1.0] instead of old [v1 0] -//! [a+b] -> [a + b] instead of old [a+ b] -class TTokenIterator { - const TWideToken& Tok; - const TTokenStructure& Subtokens; - TTokenStructure Tokens; - NLP_TYPE NlpType; - size_t First; - const size_t Last; - -private: - static bool BreakMultitoken(const TTokenStructure& subtokens, size_t first, size_t last, size_t i, size_t n) { - Y_ASSERT(i >= first && i <= last); - if (i == last) - return true; - - const TCharSpan& s = subtokens[i]; - - if (s.SuffixLen != 0 || subtokens[i + 1].PrefixLen != 0) - return true; // no prefix/suffix in the middle - - if (s.TokenDelim == TOKDELIM_NULL) { - if (i < (last - 1) && subtokens[i + 1].Type == TOKEN_NUMBER && subtokens[i + 1].TokenDelim == TOKDELIM_DOT && subtokens[i + 2].Type == TOKEN_NUMBER) - return true; // v1.0 -> v /+1 1.0 - - if (i == first || s.Type != TOKEN_NUMBER || subtokens[i - 1].TokenDelim != TOKDELIM_DOT || subtokens[i - 1].Type != TOKEN_NUMBER) - return false; // if the current token '2': 1-2a then the current token is a part of a mark - - return true; // 1.2a -> 1.2 a - } - - if (s.Type == TOKEN_NUMBER) { - if (n == 2) { - Y_ASSERT(i > first && (i + 1) == (first + n)); - if (subtokens[i - 1].TokenDelim == TOKDELIM_DOT) // && subtokens[i + 1].Type == TOKEN_NUMBER) - return true; // it is FLOAT - } - - if (s.TokenDelim == TOKDELIM_DOT && subtokens[i + 1].Type == TOKEN_NUMBER) - return false; // the current token is a part of a float - - return true; // the current token is number - } - - // the current token is word - - if (s.TokenDelim != TOKDELIM_APOSTROPHE && s.TokenDelim != TOKDELIM_MINUS) - return true; // baden-baden, caffrey's - - // delimiter is '-' or '\'' - - if (s.Type != subtokens[i + 1].Type) - return true; // types of tokens are different - - if (i > first && subtokens[i - 1].TokenDelim == TOKDELIM_NULL) - return true; // the current token 'a' and the previous token '1' has no delimiter: 1a-b - - return (i < (last - 1) && subtokens[i + 1].TokenDelim == TOKDELIM_NULL); // mark follows the current token 'a': a-b2 - } - -public: - explicit TTokenIterator(const TWideToken& tok) - : Tok(tok) - , Subtokens(tok.SubTokens) - , NlpType(NLP_END) - , First(0) - , Last(tok.SubTokens.size() - 1) - { - Y_ASSERT(tok.SubTokens.size()); - } - //! returns true if one more multitoken is found - bool Next() { - if (Finished()) - return false; - - Tokens.clear(); - size_t i = First; - do { - const TCharSpan& s = Subtokens[i]; - if (!Tokens.empty() && Tokens.back().TokenDelim == TOKDELIM_NULL) { - TCharSpan& mark = Tokens.back(); - mark.Len += s.Len; - mark.SuffixLen = s.SuffixLen; - mark.Type = TOKEN_MARK; // change type - NlpType = NLP_MARK; - } else { - Y_ASSERT(Tokens.empty() || Tokens.back().Type == s.Type); - Tokens.push_back(s); - NlpType = (s.Type == TOKEN_WORD ? NLP_WORD : NLP_INTEGER); - } - } while (!BreakMultitoken(Subtokens, First, Last, i++, Tokens.size())); - Y_ASSERT(!Tokens.empty()); - - if (NlpType == NLP_INTEGER && Tokens.size() == 2) { - Y_ASSERT(Tokens[0].SuffixLen == 0 && Tokens[0].TokenDelim == TOKDELIM_DOT); // && Tokens[1].SuffixLen == 0); - NlpType = NLP_FLOAT; - TCharSpan& first = Tokens[0]; - const TCharSpan& second = Tokens[1]; - first.Len = second.EndPos() - first.Pos; - first.SuffixLen = second.SuffixLen; - first.Type = TOKEN_FLOAT; - first.TokenDelim = TOKDELIM_NULL; - Tokens.resize(1); - } - - Tokens.back().TokenDelim = TOKDELIM_NULL; // reset the last delimiter - First = i; - return true; - } - //! @note positions of subtokens of the original multitoken are not changed; - //! all tokens can have suffixes - const TTokenStructure& Get() const { - return Tokens; - } - bool Finished() const { - return First > Last; - } - //! the first subtoken of multitoken has position equal to 0 - //! @note only word tokens can have suffixes - void GetMultitoken(TWideToken& tok) const { - Y_ASSERT(!Tokens.empty()); - tok.SubTokens = Tokens; - TTokenStructure& subtokens = tok.SubTokens; - const TCharSpan& first = subtokens[0]; - TCharSpan& last = subtokens.back(); - tok.Token = Tok.Token + first.Pos; - if (last.Type == TOKEN_WORD) { - tok.Leng = last.EndPos() + last.SuffixLen - first.Pos; - if (!Finished() && Subtokens[First].PrefixLen) { - const ui16 suffixLen = GetAdditionalSuffixLen(); - tok.Leng += suffixLen; - last.SuffixLen += suffixLen; - } - } else { - tok.Leng = last.EndPos() - first.Pos; - last.SuffixLen = 0; - if (NlpType == NLP_INTEGER && !Finished() && Subtokens[First].PrefixLen) { - const ui16 suffixLen = GetIntegerSuffixLen(); - tok.Leng += suffixLen; - last.SuffixLen = suffixLen; - } - } - subtokens[0].PrefixLen = 0; - const size_t diff = first.Pos; - for (auto& subtoken : subtokens) - subtoken.Pos -= diff; - } - ui16 GetAdditionalSuffixLen() const { - const TCharSpan& origtok = Subtokens[First - 1]; - Y_ASSERT(origtok.Type == TOKEN_WORD && !Finished() && Subtokens[First].PrefixLen); - ui16 suffixLen = 0; - if (origtok.TokenDelim == TOKDELIM_PLUS) - suffixLen = 1; - return suffixLen; - } - ui16 GetIntegerSuffixLen() const { - Y_ASSERT(NlpType == NLP_INTEGER && !Finished() && Subtokens[First].PrefixLen && Tokens.size() == 1); - const TCharSpan& origtok = Subtokens[First - 1]; - ui16 suffixLen = 0; - if (origtok.TokenDelim == TOKDELIM_PLUS) { - suffixLen = origtok.SuffixLen; - if (origtok.SuffixLen < 2) - suffixLen += 1; - } - return suffixLen; - } - //! returns NLP type of multitoken returned by GetMultitoken(tok) - NLP_TYPE GetNlpType() const { - return NlpType; - } - //! called for the first prefix, other prefixes returned as delimiters by GetDelimiter() - void GetPrefix(TWideToken& tok) const { - Y_ASSERT(Tokens.empty()); // Next() must NOT be called - if (Subtokens.empty() || Subtokens[0].PrefixLen == 0) { - tok.Leng = 0; - tok.SubTokens.clear(); - } else { - tok.Token = Tok.Token; - tok.Leng = Subtokens[0].PrefixLen; - tok.SubTokens.clear(); - } - } - //! @note NLP type of token is NLP_MISCTEXT; - //! prefixes always considered as "misctext"; - //! suffixes of non-words considered as "misctext"; - //! this function can be called after the last token as well, - //! especially when the last non-word token has the suffix - void GetDelimiter(TWideToken& tok) const { - Y_ASSERT(!Tokens.empty()); // Next() must be called - //Y_ASSERT(!Finished()); - const TCharSpan& prev = Tokens.back(); - size_t endpos = prev.EndPos(); - if (prev.Type == TOKEN_WORD) { - endpos += prev.SuffixLen; - if (!Finished() && Subtokens[First].PrefixLen) - endpos += GetAdditionalSuffixLen(); - } else if (NlpType == NLP_INTEGER && !Finished() && Subtokens[First].PrefixLen) - endpos += GetIntegerSuffixLen(); - tok.Token = Tok.Token + endpos; - tok.Leng = (Finished() ? Tok.Leng : Tok.SubTokens[First].Pos) - endpos; // length can be equal to 0 in case v1.0 -> v 1.0 - tok.SubTokens.clear(); - } -}; diff --git a/library/cpp/token/token_structure.h b/library/cpp/token/token_structure.h deleted file mode 100644 index f78c536460f..00000000000 --- a/library/cpp/token/token_structure.h +++ /dev/null @@ -1,306 +0,0 @@ -#pragma once - -#include <util/str_stl.h> -#include <util/system/defaults.h> -#include <util/generic/string.h> -#include <util/generic/vector.h> -#include <util/charset/wide.h> - -const size_t MAX_SUBTOKENS = 63; // 128; it must not be greater than number of words in a sentence - -//! @note tokenizer produces multitokens containins TOKEN_WORD and TOKEN_NUMBER subtokens -enum ETokenType { - TOKEN_WORD, - TOKEN_NUMBER, - TOKEN_MARK, //!< token contains letters and digits: a1b2 - TOKEN_FLOAT, //!< '1.23' - single token with no delimiter, length is equal to 4; introduced for backward compatibility - TOKEN_MIXED //!< actually the very last token can have this type, it must be tokenized again; it can contain delimiters, suffixes, different token types -}; - -enum EHyphenType { - HYPHEN_NONE, //!< means that there is no hyphenation - HYPHEN_ORDINARY, //!< an ordinary hyphenation, "-\n" - HYPHEN_SOFT, //!< U+00AD soft hyphen, "­" - HYPHEN_HARD //!< U+2011 non-breaking hyphen, it isn't processed yet, in case of "black-\nwhite" it will be "blackwhite" but it should be "black-white" -}; - -enum ETokenDelim { - TOKDELIM_NULL, //!< means that there is no token delimiter - TOKDELIM_APOSTROPHE, //!< ' 0x27 - TOKDELIM_MINUS, //!< - 0x2D - TOKDELIM_PLUS, //!< + 0x2B - TOKDELIM_UNDERSCORE, //!< _ 0x5F - TOKDELIM_SLASH, //!< / 0x2F - TOKDELIM_AT_SIGN, //!< @ 0x40 - TOKDELIM_DOT, //!< . 0x2E - TOKDELIM_UNKNOWN, //!< used between concatenated multitokens (such delimiters can have length greater than 1 or equal to 0) -}; - -// Position of a single token in the word -struct TCharSpan { - TCharSpan() - : Pos(0) - , Len(0) - , PrefixLen(0) - , SuffixLen(0) - , Type(TOKEN_WORD) - , Hyphen(HYPHEN_NONE) - , TokenDelim(TOKDELIM_NULL) - { - } - - TCharSpan(size_t offset, size_t len, ETokenType type = TOKEN_WORD, ETokenDelim tokenDelim = TOKDELIM_NULL, EHyphenType hyphen = HYPHEN_NONE, - ui16 suffixLen = 0, ui16 prefixLen = 0) - : Pos(offset) - , Len(len) - , PrefixLen(prefixLen) - , SuffixLen(suffixLen) - , Type(type) - , Hyphen(hyphen) - , TokenDelim(tokenDelim) - { - } - - size_t Pos; //!< offset from the beginning of the word to the start of the token - size_t Len; //!< token length, it does not include suffix length - ui16 PrefixLen; //!< Len doesn't include PrefixLen - ui16 SuffixLen; //!< suffix length - ETokenType Type; //!< type of this token - EHyphenType Hyphen; //!< hyphenation after the token, it should be verified by the lemmer and concatenated if the word is correct - ETokenDelim TokenDelim; //!< if true then apostrophe or minus follows this token - - //! @note end position does not include suffix length - inline size_t EndPos() const { - return Pos + Len; - } - - bool operator==(const TCharSpan& span) const { - return ((span.Pos == Pos) && (span.Len == Len) && - (span.PrefixLen == PrefixLen) && (span.SuffixLen == SuffixLen) && - (span.Type == Type) && (span.Hyphen == Hyphen) && (span.TokenDelim == TokenDelim)); - } - - size_t Hash() const { - size_t result = Pos; - result = CombineHashes(result, Len); - result = CombineHashes(result, size_t(PrefixLen)); - result = CombineHashes(result, size_t(SuffixLen)); - result = CombineHashes(result, size_t(Type)); - result = CombineHashes(result, size_t(Hyphen)); - result = CombineHashes(result, THash<size_t>()(TokenDelim)); - return result; - } -}; - -template <class T> -struct THash; - -template <> -struct THash<TCharSpan> { - size_t operator()(const TCharSpan& s) const { - return s.Hash(); - } -}; -// Vector of immutable TCharSpan elements, with upper limit on size: MAX_SUBTOKENS -// Mimics std::vector<TCharSpan> as closely as possible - -class TTokenStructure { -public: - TTokenStructure() { - // Tokens.reserve(MAX_SUBTOKENS); don't reserve memory - } - void push_back(const TCharSpan& s) { - push_back(s.Pos, s.Len, s.Type, s.TokenDelim, s.Hyphen, s.SuffixLen, s.PrefixLen); - } - void push_back(size_t offset, size_t len, ETokenType type = TOKEN_WORD, ETokenDelim tokenDelim = TOKDELIM_NULL, EHyphenType hyphen = HYPHEN_NONE, - ui16 suffixLen = 0, ui16 prefixLen = 0) { - Y_ASSERT(type == TOKEN_WORD || type == TOKEN_NUMBER || type == TOKEN_MARK || type == TOKEN_FLOAT || type == TOKEN_MIXED); - if (Tokens.size() == MAX_SUBTOKENS) { - // no more room - append to the last subtoken - TCharSpan& span = Tokens.back(); - span.Len = len + offset - span.Pos; - // PrefixLen not changed - span.SuffixLen = suffixLen; - span.Type = TOKEN_MIXED; // token gets invalid: it can contain delimiters, suffixes and different token types - span.Hyphen = HYPHEN_NONE; - span.TokenDelim = TOKDELIM_NULL; - } else { - // insert a new one - Tokens.push_back( - TCharSpan(offset, len, type, tokenDelim, hyphen, suffixLen, prefixLen)); - } - } - void pop_back() { - Tokens.pop_back(); - } - const TCharSpan* begin() const { - return Tokens.begin(); - } - const TCharSpan* end() const { - return Tokens.end(); - } - TCharSpan* begin() { - return Tokens.begin(); - } - TCharSpan* end() { - return Tokens.end(); - } - const TCharSpan* cbegin() const { - return Tokens.cbegin(); - } - const TCharSpan* cend() const { - return Tokens.cend(); - } - const TCharSpan& operator[](size_t idx) const { - return Tokens[idx]; - } - TCharSpan& operator[](size_t idx) { - return Tokens[idx]; - } - const TCharSpan& back() const { - return Tokens.back(); - } - TCharSpan& back() { - return Tokens.back(); - } - size_t size() const { - return Tokens.size(); - } - void resize(size_t newsize) { - Tokens.resize(Min(newsize, MAX_SUBTOKENS)); - } - size_t capacity() const { - return MAX_SUBTOKENS; - } - bool empty() const { - return Tokens.empty(); - } - void clear() { - Tokens.clear(); - } - void swap(TTokenStructure& other) { - Tokens.swap(other.Tokens); - } - -private: - TVector<TCharSpan> Tokens; -}; - -//! @note actually it is multi-token containing several tokens -struct TWideToken { - const wchar16* Token; - size_t Leng; - TTokenStructure SubTokens; - - TWideToken() - : Token(nullptr) - , Leng(0) - { - } - - TWideToken(const wchar16* s, size_t len) - : Token(s) - , Leng(len) - { - SubTokens.push_back(0, len); - } - - TWideToken(const wchar16* token, size_t len, const TTokenStructure& subTokens) - : Token(token) - , Leng(len) - , SubTokens(subTokens) - { - } - - void Concat(const TWideToken& tok) { - Y_ASSERT(Token && Leng && !SubTokens.empty() && Token + Leng <= tok.Token); - const size_t offset = tok.Token - Token; - Leng = offset + tok.Leng; - SubTokens.back().TokenDelim = TOKDELIM_UNKNOWN; - for (const auto& s : tok.SubTokens) { - SubTokens.push_back(s.Pos + offset, s.Len, s.Type, s.TokenDelim, s.Hyphen, s.SuffixLen, s.PrefixLen); - } - } - - const TWtringBuf Text() const { - return TWtringBuf(Token, Leng); - } - - TWideToken Extract(size_t begin, size_t end) const { - TWideToken ret; - if (end > SubTokens.size()) - end = SubTokens.size(); - if (begin >= end) - return ret; - - const size_t shift = SubTokens[begin].Pos - SubTokens[begin].PrefixLen; - ret.Token = Token + shift; - for (size_t i = begin; i < end; ++i) { - ret.SubTokens.push_back(SubTokens[i]); - ret.SubTokens.back().Pos -= shift; - } - ret.SubTokens.back().Hyphen = HYPHEN_NONE; - ret.SubTokens.back().TokenDelim = TOKDELIM_NULL; - ret.Leng = ret.SubTokens.back().EndPos() + ret.SubTokens.back().SuffixLen; - Y_ASSERT(ret.Leng + shift <= Leng); - return ret; - } -}; - -inline bool operator==(const TWideToken& a, const TWideToken& b) { - if ((a.Leng != b.Leng) || memcmp(a.Token, b.Token, a.Leng * sizeof(wchar16))) - return false; - if (a.SubTokens.size() != b.SubTokens.size()) - return false; - for (size_t i = 0; i < a.SubTokens.size(); ++i) { - if (!(a.SubTokens[i] == b.SubTokens[i])) - return false; - } - return true; -} - -inline bool GetLeftTokenDelim(const TWideToken& tok, size_t index) { - const TTokenStructure& subtokens = tok.SubTokens; - Y_ASSERT(index < subtokens.size()); - if (index == 0) - return false; - const TCharSpan& subtok = subtokens[index]; - const TCharSpan& prev = subtokens[index - 1]; - return (prev.EndPos() + prev.SuffixLen < subtok.Pos - subtok.PrefixLen); -} - -inline wchar16 GetRightTokenDelim(const TWideToken& tok, size_t index) { - const TTokenStructure& subtokens = tok.SubTokens; - Y_ASSERT(index < subtokens.size()); - if (index + 1 >= subtokens.size()) - return 0; - const TCharSpan& subtok = subtokens[index]; - const size_t delimPos = subtok.EndPos() + subtok.SuffixLen; - const TCharSpan& next = subtokens[index + 1]; - return (delimPos == next.Pos - next.PrefixLen ? 0 : tok.Token[delimPos]); -} - -//! @note yc_minus (0x2D) can be 0xB7 that is an ASCII character as well -inline char GetTokenDelimChar(ETokenDelim delim) { - switch (delim) { - case TOKDELIM_APOSTROPHE: - return '\''; - case TOKDELIM_MINUS: - return '-'; - case TOKDELIM_PLUS: - return '+'; - case TOKDELIM_UNDERSCORE: - return '_'; - case TOKDELIM_SLASH: - return '/'; - case TOKDELIM_AT_SIGN: - return '@'; - case TOKDELIM_DOT: - return '.'; - case TOKDELIM_NULL: - case TOKDELIM_UNKNOWN: - default: - Y_ASSERT(!"invalid delimiter"); - return 0; - } -} diff --git a/library/cpp/token/token_util.cpp b/library/cpp/token/token_util.cpp deleted file mode 100644 index c857df0a045..00000000000 --- a/library/cpp/token/token_util.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#include "token_util.h" - -#include <util/charset/unidata.h> - -TUtf16String RemoveWideTokenPrefix(TWideToken& token) { - const size_t prefixLen = token.SubTokens[0].PrefixLen; - TUtf16String res(token.Token, prefixLen); - token.Token += prefixLen; - token.Leng -= prefixLen; - token.SubTokens[0].PrefixLen = 0; - for (auto& subToken : token.SubTokens) { - subToken.Pos -= prefixLen; - } - return res; -} - -TUtf16String RemoveWideTokenSuffix(TWideToken& token) { - const size_t suffixLen = token.SubTokens.back().SuffixLen; - TUtf16String res(token.Token + token.SubTokens.back().EndPos(), suffixLen); - token.Leng -= suffixLen; - token.SubTokens.back().SuffixLen = 0; - return res; -} - -bool CheckWideTokenSplit(const TWideToken& token, size_t pos) { - Y_ASSERT(pos < token.SubTokens.size() - 1); - - const TCharSpan& subtoken = token.SubTokens[pos]; - const TCharSpan& subtokenNext = token.SubTokens[pos + 1]; - - return (subtoken.Type != subtokenNext.Type) || (subtoken.Type != TOKEN_WORD) || ((subtoken.TokenDelim != TOKDELIM_APOSTROPHE) && (subtoken.TokenDelim != TOKDELIM_MINUS)); -} - -bool CheckWideTokenDotSplit(const TWideToken& token, size_t pos) { - Y_ASSERT(pos < token.SubTokens.size() - 1); - - const TCharSpan& token1 = token.SubTokens[pos]; - const TCharSpan& token2 = token.SubTokens[pos + 1]; - - if (token1.TokenDelim != TOKDELIM_DOT) { - return false; - } - - if ((token1.Type == TOKEN_WORD || (token1.Type == TOKEN_NUMBER && pos == 0)) && token2.Type == TOKEN_WORD && (::IsUpper(token.Token[token2.Pos]) || ::IsTitle(token.Token[token2.Pos]))) { - return true; - } - - return token1.Type == TOKEN_WORD && token2.Type == TOKEN_NUMBER; -} - -// Check if we can split wide-token after specified sub-token. -// The function uses rich-tree specific heuristics -bool CheckWideTokenReqSplit(const TTokenStructure& subtokens, size_t pos) { - const size_t last = subtokens.size() - 1; - Y_ASSERT(pos < last); - const TCharSpan& s = subtokens[pos]; - - if (s.TokenDelim == TOKDELIM_NULL) { - if (pos < (last - 1) && subtokens[pos + 1].Type == TOKEN_NUMBER && subtokens[pos + 1].TokenDelim == TOKDELIM_DOT && subtokens[pos + 2].Type == TOKEN_NUMBER) - return true; // v2.0 -> v /+1 2.0 - - if (pos == 0 || s.Type != TOKEN_NUMBER || subtokens[pos - 1].TokenDelim != TOKDELIM_DOT || subtokens[pos - 1].Type != TOKEN_NUMBER) - return false; // the current token is a part of a mark, the current token '2': 1-2a - } - - if (s.Type == TOKEN_NUMBER && s.TokenDelim == TOKDELIM_DOT && subtokens[pos + 1].Type == TOKEN_NUMBER) - return false; // the current token is a part of a number sequence - - if (s.TokenDelim != TOKDELIM_APOSTROPHE && s.TokenDelim != TOKDELIM_MINUS) - return true; // baden-baden, caffrey's - - if (s.Type == TOKEN_NUMBER) - return true; // the current token is number - - if (s.Type != subtokens[pos + 1].Type) - return true; // types of tokens are different - - if (pos > 0 && subtokens[pos - 1].TokenDelim == TOKDELIM_NULL) - return true; // the current token 'a' and the previous token '2' has no delimiter: 2a-b - - return (pos < (last - 1) && subtokens[pos + 1].TokenDelim == TOKDELIM_NULL); // mark follows the current token 'a': a-b2 -} - -TWideToken ExtractWideTokenRange(const TWideToken& tok, size_t start, size_t end) { - Y_ASSERT(start < tok.SubTokens.size()); - Y_ASSERT(end < tok.SubTokens.size()); - - TWideToken newToken; - const size_t offset = GetSubTokenOffset(tok, start); - newToken.Token = tok.Token + offset; - newToken.Leng = tok.SubTokens[end].EndPos() + tok.SubTokens[end].SuffixLen - offset; - for (size_t j = start; j <= end; ++j) { - newToken.SubTokens.push_back(tok.SubTokens[j]); - newToken.SubTokens.back().Pos -= offset; - } - return newToken; -} diff --git a/library/cpp/token/token_util.h b/library/cpp/token/token_util.h deleted file mode 100644 index 7383bdc840e..00000000000 --- a/library/cpp/token/token_util.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "token_structure.h" - -#include <util/system/yassert.h> -#include <util/generic/string.h> - -TUtf16String RemoveWideTokenPrefix(TWideToken& token); -TUtf16String RemoveWideTokenSuffix(TWideToken& token); - -// Check if we can split wide-token after specified sub-token. -// The function does't allow to split on dash and apostrophe betwenn normal words -bool CheckWideTokenSplit(const TWideToken& token, size_t pos); -// Check if we can split wide-token after specified sub-token by dot delimiter. -// The function verifies the following condition: -// <word> <dot> <word with uppercased first character or number> -// <number> <dot> <word with uppercased first character> -bool CheckWideTokenDotSplit(const TWideToken& token, size_t pos); - -// Check if we can split wide-token after specified sub-token. -// The function uses rich-tree specific heuristics -bool CheckWideTokenReqSplit(const TTokenStructure& subtokens, size_t pos); - -inline size_t GetSubTokenOffset(const TWideToken& tok, size_t subToken) { - Y_ASSERT(subToken < tok.SubTokens.size()); - return tok.SubTokens[subToken].Pos - tok.SubTokens[subToken].PrefixLen; -} - -// Create a new wide-token with the specified inclusive [start, end] sub-token range -TWideToken ExtractWideTokenRange(const TWideToken& tok, size_t start, size_t end); diff --git a/library/cpp/tokenizer/abbreviations.cpp b/library/cpp/tokenizer/abbreviations.cpp deleted file mode 100644 index 60108d908d5..00000000000 --- a/library/cpp/tokenizer/abbreviations.cpp +++ /dev/null @@ -1,207 +0,0 @@ -#include "sentbreakfilter.h" - -static const char* COMMON_ABBREVIATIONS_NEVER_BREAK[] = { - "агр", - "акад", - "ал", - "алл", - "арх", - "асс", - "б-р", - "бол", - "бул", - "бульв", - "вл", - "верхн", - "вып", - "гг", - "ген", - "гр", - "деп", - "дер", - "дир", - "дор", - "доц", - "зав", - "зам", - "им", - "канд", - "каб", - "кв", - "кв-л", - "км", - "кн", - "корп", - "корр", - "кр", - "лит", - "маг", - "м-н", - "мех", - "мин", - "мкр", - "наб", - "напр", - "нов", - "нс", - "пав", - "пер", - "пер-к", - "пл", - "пос", - "пп", - "пр", - "пр-д", - "пр-зд", - "пр-т", - "пр-кт", - "просп", - "проф", - "ред", - "св", - "см", - "сов", - "спец", - "ср", - "ст", - "твц", - "тоц", - "трк", - "тц", - "тeх", - "техн", - "тов", - "тт", - "туп", - "укр", - "ул", - "чл", - "эт", - "co", - "corp", - "dr", - "inc", - "ltd", - "mr", - "mrs", - "ms", - "st", - "vs"}; - -static const char* DOUBLE_SUBTOKEN_COMMON_ABBREVIATIONS_NEVER_BREAK[] = { - "б-р", - "кв-л", - "м-н", - "пер-к", - "пр-д", - "пр-зд", - "пр-т", - "пр-кт", - "т.е", -}; - -static const char* COMMON_ABBREVIATIONS_DONT_BREAK_IF_BEFORE_DIGIT[] = { - "авг", - "апр", - "влад", - "гл", - "дек", - "доб", - "ил", - "июл", - "июн", - "кг", - "кл", - "ком", - "кор", - "мар", - "мб", - "млн", - "млрд", - "моб", - "нояб", - "окт", - "оф", - "рис", - "род", - "руб", - "сен", - "сент", - "сот", - "стр", - "табл", - "тел", - "тыс", - "фев", - "шк", - "янв", - "no", - "pp", - "vol"}; - -static const char* DOUBLE_SUBTOKEN_COMMON_ABBREVIATIONS_DONT_BREAK_IF_BEFORE_DIGIT[] = { - "т/ф", - "тел/ф", -}; - -static const char* UKR_ABBREVIATIONS_NEVER_BREAK[] = { - "вул", - "ім", - "торг", - "тур"}; - -static const char* TUR_ABBREVIATIONS_NEVER_BREAK[] = { - "bld", - "blv", - "blvd", - "bul", - "cad", - "dk", - "doç", - "hz", - "inc", - "jr", - "kg", - "mah", - "mh", - "prof", - "sok", - "tel", - "tic", - "vb", - "yard", - "yrd"}; - -void TAbbreviationsDictionary::AddElements(THashSet<TUtf16String>& hashSet, - const char* elements[], - size_t size) { - size_t length = size / sizeof(char*); - for (size_t i = 0; i != length; ++i) { - TUtf16String str(UTF8ToWide(elements[i])); - Y_ASSERT(hashSet.find(str) == hashSet.end()); - hashSet.insert(str); - } -} - -TAbbreviationsDictionary::TAbbreviationsDictionary() { - AddElements(NeverBreakSets[LANG_UNK], - COMMON_ABBREVIATIONS_NEVER_BREAK, - sizeof(COMMON_ABBREVIATIONS_NEVER_BREAK)); - AddElements(DoubleSubtokenNeverBreakSets[LANG_UNK], - DOUBLE_SUBTOKEN_COMMON_ABBREVIATIONS_NEVER_BREAK, - sizeof(DOUBLE_SUBTOKEN_COMMON_ABBREVIATIONS_NEVER_BREAK)); - AddElements(DontBreakIfBeforeDigitSets[LANG_UNK], - COMMON_ABBREVIATIONS_DONT_BREAK_IF_BEFORE_DIGIT, - sizeof(COMMON_ABBREVIATIONS_DONT_BREAK_IF_BEFORE_DIGIT)); - AddElements(DoubleSubtokenDontBreakIfBeforeDigitSets[LANG_UNK], - DOUBLE_SUBTOKEN_COMMON_ABBREVIATIONS_DONT_BREAK_IF_BEFORE_DIGIT, - sizeof(DOUBLE_SUBTOKEN_COMMON_ABBREVIATIONS_DONT_BREAK_IF_BEFORE_DIGIT)); - - AddElements(NeverBreakSets[LANG_UKR], - UKR_ABBREVIATIONS_NEVER_BREAK, - sizeof(UKR_ABBREVIATIONS_NEVER_BREAK)); - - AddElements(NeverBreakSets[LANG_TUR], - TUR_ABBREVIATIONS_NEVER_BREAK, - sizeof(TUR_ABBREVIATIONS_NEVER_BREAK)); -} diff --git a/library/cpp/tokenizer/charclasses.cpp b/library/cpp/tokenizer/charclasses.cpp deleted file mode 100644 index 93c20c0eea3..00000000000 --- a/library/cpp/tokenizer/charclasses.cpp +++ /dev/null @@ -1,4357 +0,0 @@ -// DO NOT EDIT: generated by dict/tools/charclasses - -#include "nlpparser.h" - -const unsigned char TNlpParser::CharClasses[65536] = { - // 0x0000 - 0x00, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0x09, 0x0A, 0xB6, 0xB6, 0x0D, 0xBD, 0xBD, - 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, - 0x20, 0xBB, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0xB2, 0xB3, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xBE, 0xBE, 0xC0, 0xC0, 0xC0, 0xBB, - 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xB2, 0xBE, 0xB3, 0xBE, 0x5F, - 0xBE, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xB2, 0xC0, 0xB3, 0xC0, 0xBD, - 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, - 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, - 0xA0, 0xB2, 0xD1, 0xD1, 0xD1, 0xD1, 0xD2, 0xA7, 0xBE, 0xA9, 0x61, 0x22, 0xD0, 0x8F, 0xD2, 0xBE, - 0xD2, 0xD0, 0x31, 0x31, 0xBE, 0x61, 0xB0, 0x2D, 0xBE, 0x31, 0x61, 0x22, 0x31, 0x31, 0x31, 0xB2, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xD0, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xD0, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - // 0x0100 - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, - 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x61, - 0x61, 0x41, 0x41, 0x61, 0x41, 0x61, 0x41, 0x41, 0x61, 0x41, 0x41, 0x41, 0x61, 0x61, 0x41, 0x41, - 0x41, 0x41, 0x61, 0x41, 0x41, 0x61, 0x41, 0x41, 0x41, 0x61, 0x61, 0x61, 0x41, 0x41, 0x61, 0x41, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x41, 0x61, 0x41, 0x61, 0x61, 0x41, 0x61, 0x41, 0x41, - 0x61, 0x41, 0x41, 0x41, 0x61, 0x41, 0x61, 0x41, 0x41, 0x61, 0x61, 0x9F, 0x41, 0x61, 0x61, 0x61, - 0x9F, 0x9F, 0x9F, 0x9F, 0x41, 0x41, 0x61, 0x41, 0x41, 0x61, 0x41, 0x41, 0x61, 0x41, 0x61, 0x41, - 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x61, 0x41, 0x41, 0x61, 0x41, 0x61, 0x41, 0x41, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - // 0x0200 - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x41, 0x61, 0x41, 0x41, 0x61, - 0x61, 0x41, 0x61, 0x41, 0x41, 0x41, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0xBE, 0xBE, 0xBE, 0xBE, 0x61, 0x2D, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x2D, 0x2D, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, - 0x61, 0x61, 0x61, 0x61, 0x61, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0x61, 0xBE, - 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, - // 0x0300 - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x41, 0x61, 0x41, 0x61, 0xBE, 0xBE, 0x41, 0x61, 0xFF, 0xFF, 0x2D, 0x61, 0x61, 0x61, 0x2E, 0x41, - 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xBE, 0x41, 0x2E, 0x41, 0x41, 0x41, 0xFF, 0x41, 0xFF, 0x41, 0x41, - 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0xFF, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, - 0x61, 0x61, 0x41, 0x41, 0x41, 0x61, 0x61, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x41, 0x61, 0xD0, 0x41, 0x61, 0x41, 0x41, 0x61, 0x61, 0x41, 0x41, 0x41, - // 0x0400 - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0xD2, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - // 0x0500 - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0xFF, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xFF, 0xFF, 0x61, 0xBE, 0x80, 0x80, 0xBE, 0x80, 0xBE, - 0xFF, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0x2E, 0x2D, 0xFF, 0xFF, 0xD2, 0xD2, 0xD1, - 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBE, 0x80, - 0xBE, 0x80, 0x80, 0xBE, 0x80, 0x80, 0xBE, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0xBE, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x0600 - 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xD0, 0xD0, 0xD0, 0xBE, 0xBE, 0xD1, 0x2C, 0xBE, 0xD2, 0xD2, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBE, 0xBD, 0xFF, 0xBE, 0x2E, - 0x9F, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x2D, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xBE, 0xBE, 0xBE, 0xBE, 0x81, 0x81, - 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x2E, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBD, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0xD2, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x81, 0x81, 0x81, 0xD2, 0xD2, 0x81, - // 0x0700 - 0xBB, 0x2E, 0x2E, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xFF, 0xBD, - 0x9F, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x61, 0x61, 0xD2, 0xBE, 0xBE, 0xBB, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x0800 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x61, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x61, 0x80, 0x80, 0x80, 0x61, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, - 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xBE, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0xBD, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - // 0x0900 - 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x80, 0x80, 0x2E, 0x2E, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0xBE, 0x61, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x80, 0x80, 0x80, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x81, - 0x81, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x80, 0x81, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x81, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x81, 0xFF, 0x81, - 0x81, 0x81, 0x80, 0x80, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x81, 0x81, 0xD1, 0xD1, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xD2, 0xD1, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x0A00 - 0xFF, 0x80, 0x80, 0x80, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, - 0x81, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0xFF, 0x81, 0x81, 0xFF, 0x81, 0x81, 0xFF, 0x81, 0x81, 0xFF, 0xFF, 0x80, 0xFF, 0x80, 0x80, - 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0xFF, 0xFF, - 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x80, 0x80, 0x81, 0x81, 0x81, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x80, 0x80, 0x80, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, - 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0xFF, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x80, 0x81, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x80, 0xFF, 0xFF, - 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x81, 0x81, 0x80, 0x80, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0xBE, 0xD1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x0B00 - 0xFF, 0x80, 0x80, 0x80, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0x9F, - 0x9F, 0xFF, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0xFF, 0x9F, 0x9F, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0x80, 0x9F, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x9F, 0xFF, 0x9F, - 0x9F, 0x9F, 0x80, 0x80, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0xD2, 0x9F, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x80, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0x81, 0x81, - 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0x81, 0x81, 0xFF, 0x81, 0xFF, 0x81, 0x81, - 0xFF, 0xFF, 0xFF, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, - 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, - 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD1, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x0C00 - 0x80, 0x80, 0x80, 0x80, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, - 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0x81, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x81, 0x81, 0x80, 0x80, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xD2, - 0x81, 0x80, 0x80, 0x80, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, - 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x80, 0x81, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, - 0x81, 0x81, 0x80, 0x80, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0xFF, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x0D00 - 0xFF, 0x80, 0x80, 0x80, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0x9F, 0x9F, - 0x9F, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0x9F, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x9F, 0xD2, - 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x9F, 0x9F, 0x80, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x9F, - 0x9F, 0x9F, 0x80, 0x80, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xD2, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0xFF, 0xFF, 0x80, 0x80, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x0E00 - 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x80, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x2D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBE, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xBE, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x81, 0x81, 0xFF, 0x81, 0xFF, 0xFF, 0x81, 0x81, 0xFF, 0x81, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0xFF, 0x81, 0x81, 0x81, 0xFF, 0x81, 0xFF, 0x81, 0xFF, 0xFF, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, - 0x81, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x81, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x2D, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x0F00 - 0x9F, 0xD2, 0xD2, 0xD2, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, - 0xBE, 0xBE, 0xBE, 0xD2, 0xB0, 0xD2, 0xD2, 0xD2, 0x80, 0x80, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, 0xB2, 0xB3, 0xB2, 0xB3, 0x80, 0x80, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, - 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0xBE, 0x80, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0x80, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xD2, 0xD2, - 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xD2, 0xD2, 0xD2, 0xD2, 0xBE, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x1000 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xBE, 0xBB, 0xBE, 0xBE, 0xBE, 0xBE, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, - 0x80, 0x81, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, - 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x80, 0x80, 0x80, 0x80, 0xD2, 0xD2, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xFF, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x9F, 0x9F, 0xBE, 0x61, 0x9F, 0x9F, 0x9F, - // 0x1100 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0x1200 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, - 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0x1300 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x80, 0x80, 0x80, - 0xBE, 0xBE, 0x2E, 0x2C, 0xBE, 0xBE, 0xBE, 0x2E, 0xBB, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xFF, 0xFF, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0xFF, - // 0x1400 - 0x2D, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x1500 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x1600 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xBE, 0x2E, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x20, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xB2, 0xB3, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xBE, 0xBE, 0xBE, 0x41, 0x41, - 0x41, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x1700 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0x9F, 0x9F, - 0x9F, 0x9F, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x80, 0x80, 0x80, 0xBB, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0x9F, 0x9F, - 0x9F, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0xBD, 0xBD, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x2E, 0x2E, 0xBE, 0x2D, 0xBE, 0xBE, 0xBE, 0xD1, 0x81, 0x80, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x1800 - 0xBE, 0x2E, 0x2C, 0x2E, 0xBE, 0xBE, 0x2D, 0xBE, 0x2C, 0x2E, 0xBE, 0x80, 0x80, 0x80, 0x20, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x61, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x1900 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, - 0xD2, 0xFF, 0xFF, 0xFF, 0x2E, 0x2E, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - // 0x1A00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xBE, 0xBE, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0x80, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0x61, 0xBB, 0xBB, 0xBB, 0xBB, 0xBE, 0xBE, 0xFF, 0xFF, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x1B00 - 0x80, 0x80, 0x80, 0x80, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xBB, 0xBB, 0xBE, 0xBE, 0xBB, 0xBB, - 0xBE, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, - 0x80, 0x80, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x9F, 0x9F, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xBE, 0xBE, 0xBE, - // 0x1C00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xBB, 0xBB, 0xBE, 0xBE, 0xBE, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0x9F, 0x9F, 0x9F, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xBB, 0xBB, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0x80, 0x80, 0xBE, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x9F, 0x9F, - 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x9F, 0x9F, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x1D00 - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x41, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x61, 0x41, 0x61, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, - // 0x1E00 - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - // 0x1F00 - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0xFF, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xFF, 0xFF, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0xFF, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xFF, 0xFF, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0x41, 0xFF, 0x41, 0xFF, 0x41, 0xFF, 0x41, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0xFF, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0xBE, 0x61, 0xBE, - 0xBE, 0xBE, 0x61, 0x61, 0x61, 0xFF, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0xBE, 0xBE, 0xBE, - 0x61, 0x61, 0x61, 0x61, 0xFF, 0xFF, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0xFF, 0xBE, 0xBE, 0xBE, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0xBE, 0xBE, 0xBE, - 0xFF, 0xFF, 0x61, 0x61, 0x61, 0xFF, 0x61, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0xBE, 0xBE, 0xFF, - // 0x2000 - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xBD, 0xBD, 0xBD, 0xBD, - 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0xBE, 0xBE, 0x27, 0x27, 0x27, 0x27, 0x22, 0x22, 0x22, 0x22, - 0xBE, 0xBE, 0xBE, 0xBE, 0xBB, 0xBE, 0x2E, 0xBE, 0x0A, 0x0A, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0x20, - 0xBE, 0xBE, 0x27, 0x22, 0x22, 0x27, 0x22, 0x22, 0xBE, 0x22, 0x22, 0xBE, 0x2E, 0x2E, 0xBE, 0x5F, - 0x5F, 0xBE, 0xBE, 0xBE, 0xD0, 0xB2, 0xB3, 0x2E, 0x2E, 0x2E, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, - 0xBE, 0xBE, 0xD0, 0xBE, 0x5F, 0xBE, 0xBE, 0x22, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0x20, - 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, - 0x31, 0x61, 0xFF, 0xFF, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xD0, 0x2D, 0xD0, 0xB2, 0xB3, 0x61, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xD0, 0x2D, 0xD0, 0xB2, 0xB3, 0xFF, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0xFF, 0xFF, - 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, - 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x2100 - 0xD2, 0xD2, 0x41, 0xD2, 0xD2, 0xD2, 0xD2, 0x41, 0xD2, 0xD2, 0x61, 0x41, 0x41, 0x41, 0x61, 0x61, - 0x41, 0x41, 0x41, 0x61, 0xD2, 0x41, 0xB7, 0xD2, 0xB0, 0x41, 0x41, 0x41, 0x41, 0x41, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0x41, 0xD2, 0x41, 0xD2, 0x41, 0xD2, 0x41, 0x41, 0x41, 0x41, 0xD2, 0x61, - 0x41, 0x41, 0xB0, 0x41, 0x61, 0x9F, 0x9F, 0x9F, 0x9F, 0x61, 0xD2, 0xD2, 0x61, 0x61, 0x41, 0x41, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0x41, 0x61, 0x61, 0x61, 0x61, 0xD2, 0xD0, 0xD2, 0xD2, 0x61, 0xD2, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x61, 0x31, 0x31, 0x31, 0x31, 0x31, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD0, 0xD0, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD0, 0xD2, 0xD2, 0xD0, 0xD2, 0xD2, 0xD0, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD0, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD0, 0xD0, - 0xD2, 0xD2, 0xD0, 0xD2, 0xD0, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - // 0x2200 - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0x2D, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - // 0x2300 - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xBE, 0xBE, 0xBE, 0xBE, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD0, 0xD0, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xB2, 0xB3, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD0, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xB2, 0xB3, 0xBE, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, - // 0x2400 - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - // 0x2500 - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD0, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD0, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - // 0x2600 - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD0, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - // 0x2700 - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0x22, 0x22, - 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xB2, 0xB3, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - // 0x2800 - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - // 0x2900 - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, - 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xB2, 0xB3, 0xB2, 0xB3, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xB2, 0xB3, 0xD0, 0xD0, - // 0x2A00 - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - // 0x2B00 - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, - 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD2, 0xD2, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0xD2, 0xD2, 0xD2, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x2C00 - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xFF, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, - 0x41, 0x61, 0x41, 0x41, 0x41, 0x61, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x41, 0x41, - 0x41, 0x61, 0x41, 0x61, 0x61, 0x41, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x41, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x61, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0x41, 0x61, 0x41, 0x61, 0x80, - 0x80, 0x80, 0x41, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xBE, 0xBE, 0xBE, 0x31, 0xBE, 0xBE, - // 0x2D00 - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, - 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - // 0x2E00 - 0xBE, 0xBE, 0x22, 0x22, 0x22, 0x22, 0xBE, 0xBE, 0xBE, 0x22, 0x22, 0xBE, 0x22, 0x22, 0xBE, 0xBE, - 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0x2D, 0xBE, 0xBE, 0x2D, 0xBE, 0x22, 0x22, 0xBE, 0xBE, - 0x22, 0x22, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xBE, 0xBE, 0xBE, 0xBE, 0xBB, 0x61, - 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0x2D, 0x2D, 0xBB, 0xBE, 0xBE, 0xBE, - 0x2D, 0xBE, 0xB2, 0xBE, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x2F00 - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, - // 0x3000 - 0x20, 0x2C, 0xBA, 0xBE, 0xD2, 0x2D, 0x9F, 0x31, 0xB2, 0xB3, 0xB2, 0xB3, 0x22, 0x22, 0x22, 0x22, - 0xB2, 0xB3, 0xD2, 0xD2, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0x2D, 0x22, 0x22, 0x22, - 0xD2, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0xD2, 0xD2, 0x31, 0x31, 0x31, 0x2D, 0x9F, 0xBE, 0xD2, 0xD2, - 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0x80, 0x80, 0xBE, 0xBE, 0x2D, 0x2D, 0x9F, - 0x2D, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x5F, 0x2D, 0x2D, 0x2D, 0x9F, - // 0x3100 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, - 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, - 0xD2, 0xD2, 0x31, 0x31, 0x31, 0x31, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3200 - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0xD2, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, - // 0x3300 - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - // 0x3400 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3500 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3600 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3700 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3800 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3900 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3A00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3B00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3C00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3D00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3E00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x3F00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4000 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4100 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4200 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4300 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4400 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4500 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4600 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4700 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4800 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4900 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4A00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4B00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4C00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4D00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - // 0x4E00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x4F00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5000 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5100 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5200 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5300 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5400 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5500 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5600 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5700 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5800 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5900 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5A00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5B00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5C00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5D00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5E00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x5F00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6000 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6100 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6200 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6300 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6400 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6500 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6600 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6700 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6800 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6900 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6A00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6B00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6C00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6D00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6E00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x6F00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7000 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7100 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7200 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7300 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7400 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7500 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7600 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7700 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7800 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7900 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7A00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7B00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7C00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7D00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7E00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x7F00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8000 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8100 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8200 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8300 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8400 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8500 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8600 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8700 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8800 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8900 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8A00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8B00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8C00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8D00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8E00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x8F00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9000 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9100 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9200 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9300 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9400 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9500 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9600 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9700 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9800 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9900 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9A00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9B00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9C00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9D00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9E00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0x9F00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xA000 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0xA100 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0xA200 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0xA300 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0xA400 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, - 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xBE, 0xBB, - // 0xA500 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0xA600 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x61, 0xBE, 0xBB, 0xBB, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x9F, 0x80, - 0x80, 0x80, 0x80, 0xBE, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBE, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x61, 0x61, 0x80, 0x80, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x80, 0x80, 0xBE, 0xBB, 0xBE, 0xBE, 0xBE, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xA700 - 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, - 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0xBE, 0xBE, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x61, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x61, 0xBE, 0xBE, 0x41, 0x61, 0x41, 0x61, 0x9F, - 0x41, 0x61, 0x41, 0x61, 0x61, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, - 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x61, 0x41, 0x41, 0x41, 0x41, 0x41, 0xFF, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x61, 0x41, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x61, 0x61, 0x61, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0xA800 - 0x9F, 0x9F, 0x80, 0x9F, 0x9F, 0x9F, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0xD2, 0xD2, 0xD2, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xD2, 0xD2, 0xD1, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0xBE, 0xBE, 0xBB, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBB, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xBE, 0xBE, 0xBE, 0x81, 0xBE, 0x81, 0xFF, 0xFF, - // 0xA900 - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBE, 0xBB, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, - 0x80, 0x80, 0x80, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBB, 0xBB, 0xBE, 0xBE, 0xBE, 0xBE, 0xFF, 0x61, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xBE, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x61, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, - // 0xAA00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xBE, 0xBB, 0xBE, 0xBB, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x61, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xD2, 0xD2, 0xD2, 0x81, 0x80, 0x80, 0x80, 0x81, 0x81, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x80, 0x9F, 0x80, 0x80, 0x80, 0x9F, 0x9F, 0x80, 0x80, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, - 0x9F, 0x80, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x9F, 0x61, 0xBE, 0xBE, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, - 0xBB, 0xBB, 0x9F, 0x61, 0x61, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xAB00 - 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, - 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xBE, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xBB, 0x80, 0x80, 0xFF, 0xFF, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xAC00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xAD00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xAE00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xAF00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xB000 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xB100 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xB200 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xB300 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xB400 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xB500 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xB600 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xB700 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xB800 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xB900 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xBA00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xBB00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xBC00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xBD00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xBE00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xBF00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xC000 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xC100 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xC200 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xC300 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xC400 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xC500 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xC600 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xC700 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xC800 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xC900 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xCA00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xCB00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xCC00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xCD00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xCE00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xCF00 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xD000 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xD100 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xD200 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xD300 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xD400 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xD500 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xD600 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - // 0xD700 - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xD800 - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - // 0xD900 - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - // 0xDA00 - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - // 0xDB00 - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, - // 0xDC00 - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - // 0xDD00 - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - // 0xDE00 - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - // 0xDF00 - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, - // 0xE000 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xE100 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xE200 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xE300 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xE400 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xE500 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xE600 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xE700 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xE800 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xE900 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xEA00 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xEB00 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xEC00 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xED00 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xEE00 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xEF00 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xF000 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xF100 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xF200 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xF300 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xF400 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xF500 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xF600 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xF700 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xF800 - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xF900 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0xFA00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - // 0xFB00 - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x80, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xD0, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0x61, 0x61, 0x61, 0x61, 0x61, 0xFF, 0x61, 0xFF, - 0x61, 0x61, 0xFF, 0x61, 0x61, 0xFF, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, - 0xBE, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0xFC00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - // 0xFD00 - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xB2, 0xB3, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0xFF, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xD1, 0xD2, 0xFF, 0xFF, - // 0xFE00 - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xB2, 0xB3, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0xBE, 0x2D, 0x2D, 0x5F, 0x5F, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, - 0xB3, 0x22, 0x22, 0x22, 0x22, 0xBE, 0xBE, 0xB2, 0xB3, 0xBE, 0xBE, 0xBE, 0xBE, 0x5F, 0x5F, 0x5F, - 0x2C, 0x2C, 0x2E, 0xFF, 0xBE, 0xBE, 0x2E, 0x2E, 0x2D, 0xB2, 0xB3, 0xB2, 0xB3, 0xB2, 0xB3, 0xBE, - 0xBE, 0xBE, 0xD0, 0x2D, 0xD0, 0xD0, 0xD0, 0xFF, 0xBE, 0xD1, 0xBE, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0xFF, 0xFF, 0xBD, - // 0xFF00 - 0xFF, 0xBA, 0x22, 0xBE, 0xD1, 0xBE, 0xBE, 0x27, 0xB2, 0xB3, 0xBE, 0xD0, 0x2C, 0x2D, 0xBA, 0xBE, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0xBE, 0xBE, 0xD0, 0xD0, 0xD0, 0xBA, - 0xBE, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xB2, 0xBE, 0xB3, 0xBE, 0x5F, - 0xBE, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0xB2, 0xD0, 0xB3, 0xD0, 0xB2, - 0xB3, 0xBA, 0x22, 0x22, 0x2C, 0x5F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x2D, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, - 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x2D, 0x2D, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, - 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0xFF, 0xFF, 0xFF, - 0xD1, 0xD1, 0xD0, 0xBE, 0xD2, 0xD1, 0xD1, 0xFF, 0xD2, 0xD0, 0xD0, 0xD0, 0xD0, 0xD2, 0xD2, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xBD, 0xBD, 0xD2, 0xD2, 0xFF, 0xFF}; diff --git a/library/cpp/tokenizer/charclasses_8.rl b/library/cpp/tokenizer/charclasses_8.rl deleted file mode 100644 index 9c2c24c31a8..00000000000 --- a/library/cpp/tokenizer/charclasses_8.rl +++ /dev/null @@ -1,72 +0,0 @@ -%%{ - -machine CharacterClasses; -alphtype unsigned char; - -############################################# -# Named Characters - -cc_zero = 0x00; # (EOF) [\0] -cc_tab = 0x09; # [\t] -cc_linefeed = 0x0A; # [\n] -cc_carriagereturn = 0x0D; # [\r] -cc_space = 0x20; # [ ] -cc_quotationmark = 0x22; # ["] -cc_numbersign = 0x23; # [#] -cc_dollarsign = 0x24; # [$] -cc_percent = 0x25; # [%] -cc_ampersand = 0x26; # [&] -cc_apostrophe = 0x27; # ['] -cc_asterisk = 0x2A; # [*] -cc_plus = 0x2B; # [+] -cc_comma = 0x2C; # [,] -cc_minus = 0x2D; # [-] -cc_dot = 0x2E; # [.] -cc_slash = 0x2F; # [/] -cc_digit = 0x31; # [1] -cc_atsign = 0x40; # [@] -cc_capitalalpha = 0x41; # [A] -cc_underscore = 0x5F; # [_] -cc_smallalpha = 0x61; # [a] -cc_accent = 0x80; -cc_unicasealpha = 0x81; # georgian, hebrew, arabic alphabets -cc_softhyphen = 0x8F; -cc_ideograph = 0x9F; -cc_nbsp = 0xA0; -cc_sectionsign = 0xA7; -cc_copyrightsign = 0xA9; -cc_special = 0xB0; - -cc_math = 0xC0; -cc_math_non_ascii = 0xD0; -cc_currency_non_ascii = 0xD1; -cc_special_non_ascii = 0xD2; - -############################################# -# Classes - -# = 0xB1; -cc_openpunct = 0xB2 | # [(\[{] - cc_apostrophe | cc_quotationmark; # opening punctuation -cc_clospunct = 0xB3 | # [)\]}] - cc_apostrophe | cc_quotationmark; # closing punctuation -cc_surrogatelead = 0xB4; -cc_surrogatetail = 0xB5; -cc_whitespace = 0xB6 | cc_tab | cc_linefeed | cc_carriagereturn | cc_space; # [\t\n\v\f\r ] -cc_numerosign = 0xB7; # unicode 0x2116 -# = 0xB8; -# = 0xB9; -cc_cjk_termpunct = 0xBA; # fullwidth cjk terminating punctuation -cc_termpunct = 0xBB | cc_dot; # terminating punctuation [!.?] | [!.;?] -cc_currency = cc_dollarsign | cc_currency_non_ascii; -cc_control = 0xBD | # 0x01 - 0x1F, 0x7F excluding - cc_tab | cc_linefeed | cc_carriagereturn; -cc_misctext = 0xBE | cc_math | cc_math_non_ascii | # [:;<=>\^`|~] - cc_control | cc_whitespace | cc_comma | cc_asterisk | cc_ampersand | - cc_termpunct | cc_openpunct | cc_clospunct | cc_numbersign | cc_currency | cc_percent | - cc_plus | cc_minus | cc_dot | cc_slash | cc_atsign | cc_underscore; - -cc_unknown = 0xFF; - -}%% - diff --git a/library/cpp/tokenizer/multitoken_v2.rl b/library/cpp/tokenizer/multitoken_v2.rl deleted file mode 100644 index 7c66273e976..00000000000 --- a/library/cpp/tokenizer/multitoken_v2.rl +++ /dev/null @@ -1,77 +0,0 @@ -%%{ - machine MultitokenDef; - - # AddLastToken(ts, tokend) should be implemented except member functions called here - - action begin_token { - BeginToken(ts, p); - } - - action begin_word { - BeginToken(ts, p, TOKEN_WORD); - } - - action begin_number { - BeginToken(ts, p, TOKEN_NUMBER); - } - - action update_token { - UpdateToken(); - } - - action add_token { - AddToken(); - } - - action update_prefix { - UpdatePrefix(*p); - } - - action update_suffix { - UpdateSuffix(*p); - } - - # @ATTENTION if '%' is added to subtokdelim it breaks the code in MakeMultitokenEntry(): utf8 = Find(.., PERCENT_CHAR, ..); - # in this case two chars that follow '%' must be checked for one of '0123456789ABCDEF' - # @note when '%' action fired 'p' points to the next character so to take the previous character use 'p[-1]' - - tokendelim = ( cc_apostrophe %{ SetTokenDelim(TOKDELIM_APOSTROPHE, p[-1]); } ) - | ( cc_minus %{ SetTokenDelim(TOKDELIM_MINUS, p[-1]); } ); # ['-] = tokdelim - - multitokendelim = ( cc_plus %{ SetTokenDelim(TOKDELIM_PLUS, p[-1]); } ) - | ( cc_underscore %{ SetTokenDelim(TOKDELIM_UNDERSCORE, p[-1]); } ) - | ( cc_slash %{ SetTokenDelim(TOKDELIM_SLASH, p[-1]); } ) - | ( cc_atsign %{ SetTokenDelim(TOKDELIM_AT_SIGN, p[-1]); } ) - | ( cc_dot %{ SetTokenDelim(TOKDELIM_DOT, p[-1]); } ); # [+_/@.] = identdelim + [.] - - tokpart = ( tokchar ( tokchar | accent )* ); # | ( yspecialkey ); - numpart = ( ydigit ( ydigit | accent )* ); - - tokfirst = ( ( ( accent* >begin_token ) ( tokpart >begin_word ) ) $update_token %add_token ); - tokfirst_special = ( ( ( accent* >begin_token ) ( yspecialkey >begin_word ) ) $update_token %add_token ); - toknext = ( tokpart >begin_word $update_token %add_token ); - - numfirst = ( ( ( accent* >begin_token ) ( numpart >begin_number ) ) $update_token %add_token ); - numnext = ( numpart >begin_number $update_token %add_token ); - - #wordpart = tokfirst; - - toksuffix = (cc_numbersign | cc_plus | cc_plus.cc_plus) $update_suffix; # ([#] | [+] | [+][+]) - - # - in case of " abc&x301;123 " accent is attached to "abc" - # - 'accent*' cannot be removed from the front 'token' and 'number' because in this case text "abc-&x301;123" or - # "123-&x301;abc" it will be processed incorrectly - # - begin_token can be called twice in case "exa­́mple" so BeginToken() has 'if (CurCharSpan.Len == 0)' - # and it processes only the first call - - solidtoken = ( tokfirst ( numnext toknext )* ) - | ( numfirst toknext ( numnext toknext )* ) - | ( numfirst ( toknext numnext )* ) - | ( tokfirst numnext ( toknext numnext )* ) - | (tokfirst_special); - - multitoken = ( solidtoken ( tokendelim solidtoken ){,4} ); - multitokenwithsuffix = ( ( tokprefix $update_prefix )? multitoken toksuffix? ); - compositemultitoken = ( multitokenwithsuffix ( multitokendelim multitokenwithsuffix )* ); - -}%% diff --git a/library/cpp/tokenizer/multitoken_v3.rl b/library/cpp/tokenizer/multitoken_v3.rl deleted file mode 100644 index 53fce9be875..00000000000 --- a/library/cpp/tokenizer/multitoken_v3.rl +++ /dev/null @@ -1,77 +0,0 @@ -%%{ - machine MultitokenDef; - - # AddLastToken(ts, tokend) should be implemented except member functions called here - - action begin_token { - BeginToken(ts, p); - } - - action begin_word { - BeginToken(ts, p, TOKEN_WORD); - } - - action begin_number { - BeginToken(ts, p, TOKEN_NUMBER); - } - - action update_token { - UpdateToken(); - } - - action add_token { - AddToken(); - } - - action update_prefix { - UpdatePrefix(*p); - } - - action update_suffix { - UpdateSuffix(*p); - } - - # @ATTENTION if '%' is added to subtokdelim it breaks the code in MakeMultitokenEntry(): utf8 = Find(.., PERCENT_CHAR, ..); - # in this case two chars that follow '%' must be checked for one of '0123456789ABCDEF' - # @note when '%' action fired 'p' points to the next character so to take the previous character use 'p[-1]' - - tokendelim = ( cc_apostrophe %{ SetTokenDelim(TOKDELIM_APOSTROPHE, p[-1]); } ) - | ( cc_minus %{ SetTokenDelim(TOKDELIM_MINUS, p[-1]); } ); # ['-] = tokdelim - - multitokendelim = ( cc_plus %{ SetTokenDelim(TOKDELIM_PLUS, p[-1]); } ) - | ( cc_underscore %{ SetTokenDelim(TOKDELIM_UNDERSCORE, p[-1]); } ) - | ( cc_slash %{ SetTokenDelim(TOKDELIM_SLASH, p[-1]); } ) - | ( cc_atsign %{ SetTokenDelim(TOKDELIM_AT_SIGN, p[-1]); } ) - | ( cc_dot %{ SetTokenDelim(TOKDELIM_DOT, p[-1]); } ); # [+_/@.] = identdelim + [.] - - tokpart = ( tokchar ( tokchar | accent )* ); # | ( yspecialkey ); - numpart = ( ydigit ( ydigit | accent )* ); - - tokfirst = ( ( ( accent* >begin_token ) ( tokpart >begin_word ) ) $update_token %add_token ); - tokfirst_special = ( ( ( accent* >begin_token ) ( yspecialkey >begin_word ) ) $update_token %add_token ); - toknext = ( tokpart >begin_word $update_token %add_token ); - - numfirst = ( ( ( accent* >begin_token ) ( numpart >begin_number ) ) $update_token %add_token ); - numnext = ( numpart >begin_number $update_token %add_token ); - - #wordpart = tokfirst; - - toksuffix = (cc_numbersign | cc_plus | cc_plus . cc_plus) $update_suffix; # ([#] | [+] | [++]) - - # - in case of " abc&x301;123 " accent is attached to "abc" - # - 'accent*' cannot be removed from the front 'token' and 'number' because in this case text "abc-&x301;123" or - # "123-&x301;abc" it will be processed incorrectly - # - begin_token can be called twice in case "exa­́mple" so BeginToken() has 'if (CurCharSpan.Len == 0)' - # and it processes only the first call - - solidtoken = ( tokfirst ( numnext toknext )* ) - | ( numfirst toknext ( numnext toknext )* ) - | ( numfirst ( toknext numnext )* ) - | ( tokfirst numnext ( toknext numnext )* ) - | (tokfirst_special); - - multitoken = ( solidtoken ( tokendelim solidtoken ){,4} ); - multitokenwithsuffix = ( ( tokprefix $update_prefix )? multitoken toksuffix? ); - compositemultitoken = ( multitokenwithsuffix ( multitokendelim multitokenwithsuffix )* ); - -}%% diff --git a/library/cpp/tokenizer/multitokenparser.cpp b/library/cpp/tokenizer/multitokenparser.cpp deleted file mode 100644 index 2c28b4f9109..00000000000 --- a/library/cpp/tokenizer/multitokenparser.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "multitokenparser.h" diff --git a/library/cpp/tokenizer/multitokenparser.h b/library/cpp/tokenizer/multitokenparser.h deleted file mode 100644 index 0c5da685372..00000000000 --- a/library/cpp/tokenizer/multitokenparser.h +++ /dev/null @@ -1,203 +0,0 @@ -#pragma once - -#include <library/cpp/token/nlptypes.h> -#include <library/cpp/token/token_structure.h> -#include "multitokenutil.h" - -// NOTE: this class inherited by request tokenizers only -class TMultitokenParser { - TWideToken Multitoken; //!< length of the whole token can include suffixes, if difference between pos and endpos of two tokens is greater than 1 then there is suffix - TCharSpan CurCharSpan; - wchar16 PrefixChar; - wchar16 SuffixChar; - -protected: - TMultitokenParser() - : PrefixChar(0) - , SuffixChar(0) - { - } - - //! used for deferring tokens in TReqTokenizer - void SetMultitoken(const TWideToken& tok) { - Multitoken = tok; - } - - const TWideToken& GetMultitoken() const { - return Multitoken; - } - - //! @param token start of the multitoken - //! @param len length includes suffix: 'ab-c+' length is equal to 5, in case of prefix operator: '-!abc' length is equal to 3 - //! and prefix: '#hashtag', '@user_name' - void SetMultitoken(const wchar16* token, size_t len) { - TTokenStructure& subtokens = Multitoken.SubTokens; - if (!subtokens.empty()) { - // positions of the first subtoken can be non-zero in the request parser - // but 'token' in this case must point to the first character of the first subtoken - const size_t pos = subtokens[0].Pos - subtokens[0].PrefixLen; - Y_ASSERT((subtokens.back().EndPos() - pos + subtokens.back().SuffixLen) == len); - if (pos) { - const size_t n = subtokens.size(); - for (size_t i = 0; i < n; ++i) - subtokens[i].Pos -= pos; - } - } - Multitoken.Token = token; - Multitoken.Leng = len; - - Y_ASSERT(CheckMultitoken(Multitoken)); - } - - const TTokenStructure& GetSubtokens() const { - return Multitoken.SubTokens; - } - - void BeginToken(const wchar16* tokstart, const wchar16* p) { - // it can be called twice in case "exa­́mple", see nlptok.rl, mixedtoken, tokfirst/toknext, numfirst/numnext - if (CurCharSpan.Len == 0) - CurCharSpan.Pos = p - tokstart; - } - - void BeginToken(const wchar16* tokstart, const wchar16* p, ETokenType type) { - BeginToken(tokstart, p); - CurCharSpan.Type = type; - } - - void UpdateToken() { - CurCharSpan.Len += 1; - } - - void AddToken() { - Y_ASSERT(CurCharSpan.Len); - Y_ASSERT(CurCharSpan.Type == TOKEN_WORD || CurCharSpan.Type == TOKEN_NUMBER); - - TTokenStructure& tokens = Multitoken.SubTokens; - - // @todo if number of tokens is greater than 64 then the last token can consist of numbers, letters and delimiters... - tokens.push_back(CurCharSpan); - - const size_t n = tokens.size(); - if (n > 1) - CorrectDelimiters(tokens[n - 2], SuffixChar, tokens[n - 1], PrefixChar); - - CurCharSpan.Pos = 0; - CurCharSpan.Len = 0; // it is checked in AddLastToken() - CurCharSpan.PrefixLen = 0; - PrefixChar = 0; - SuffixChar = 0; - } - - void AddIdeograph(size_t len) { - Y_ASSERT(!CurCharSpan.Len && (len == 1 || len == 2)); - TTokenStructure& tokens = Multitoken.SubTokens; - Y_ASSERT(tokens.empty()); - tokens.push_back(0, len, TOKEN_WORD); - } - - void AddLastToken(const wchar16* tokstart, const wchar16* tokend) { - // - CurCharSpan.Len assigned to 0 in AddToken() because in case of multitoken with '.' at the end, for - // example: " well-formed. " parser already called to %add_token because '.' can be delimiter of the next token - if (CurCharSpan.Len) { - const wchar16* const actualStart = tokstart + CurCharSpan.Pos; - // for ex. "5% " can have (actualStart == tokend) because '%' could be part of the next token with utf8 characters - if (actualStart < tokend) { - const size_t actualLen = tokend - actualStart; - if (CurCharSpan.Len != actualLen) // for example "WORD% NEXTWORD" - '%' could be part of UTF8 encoded character and already counted... - CurCharSpan.Len = actualLen; - AddToken(); - } else - CancelToken(); - } else - CancelToken(); - - TTokenStructure& tokens = Multitoken.SubTokens; - if (!tokens.empty()) - tokens.back().TokenDelim = TOKDELIM_NULL; // reset delimiter if any - } - - //! correct the last token if it contains words and numbers and changes length of multitoken - //! @param len length of multitoken (including all subtokens), for ex. (te - ts) - //! @return true if the last token is valid, false - last token is cut off and length is changed - //! @note in case of '+!abc-...-xyz' length includes '+!', this function doesn't take into account offset of the first subtoken - //! if number of subtokens equal to 63 all superfluous subtokens are put into the last subtoken TOKEN_MIXED - //! which is cut off in this function - bool CheckLastToken(size_t& len) { - TTokenStructure& tokens = Multitoken.SubTokens; - if (tokens.size() == MAX_SUBTOKENS && tokens.back().Type == TOKEN_MIXED) { - tokens.pop_back(); - // change delimiter (+) to suffix - TCharSpan& lasttok = tokens.back(); - len = lasttok.EndPos() + lasttok.SuffixLen; - // actually '+' should be added if subtoken has suffix '+' because '++' is valid suffix as well - if (lasttok.TokenDelim == TOKDELIM_PLUS && lasttok.SuffixLen == 0) { - lasttok.SuffixLen = 1; - len += 1; - } - lasttok.TokenDelim = TOKDELIM_NULL; - return false; - } - Y_ASSERT(tokens.empty() || tokens.back().TokenDelim == TOKDELIM_NULL); - return true; - } - - //! @return result of CheckLastToken() - //! @note positions of the first subtoken can be non-zero in case: +abc, -!xyz, - //! tokstart in this cases can point to + and - respectively, - //! SetMultitoken() resets position of the first subtoken to 0 - //! @param pos old position value of the first subtoken before resetting it to 0 - //! @param len new len of multitoken after cutting off the last subtoken if it is invalid - //! @note in case of '+!abc-efg' returned 'len' includes the prefix operators '+!' and is equal to 9 - bool SetRequestMultitoken(const wchar16* tokstart, const wchar16* tokend, size_t& len) { - AddLastToken(tokstart, tokend); - const TTokenStructure& subtokens = GetSubtokens(); - Y_ASSERT(!subtokens.empty()); - const TCharSpan& firsttok = subtokens[0]; - const TCharSpan& lasttok = subtokens.back(); - len = lasttok.EndPos() + lasttok.SuffixLen; // can't use (te - ts) because postfix can be there - const bool res = CheckLastToken(len); - const size_t firsttokStart = firsttok.Pos - firsttok.PrefixLen; - SetMultitoken(tokstart + firsttokStart, len - firsttokStart); - return res; - } - - void UpdatePrefix(wchar16 c) { - Y_ASSERT(c == '#' || c == '@' || c == '$'); - CurCharSpan.PrefixLen = 1; // length of prefix can't be more than 1 - PrefixChar = c; - } - - void UpdateSuffix(wchar16 c) { - Y_ASSERT(c == '#' || c == '+'); - TTokenStructure& tokens = Multitoken.SubTokens; - if (!tokens.empty()) { - tokens.back().SuffixLen += 1; - SuffixChar = c; - } else - Y_ASSERT(!"can't update suffix: no subtokens"); - } - - void CancelToken() { - // example: "abc 5% def", '%' can be the first symbol of utf8 encoded character so token is started by call to BeginToken() - // and then UpdateToken() is called as well but there is no call to AddToken() because '%' is interpreted as a misc character so - // CurCharSpan.Len must be reset - CurCharSpan.Len = 0; - CurCharSpan.PrefixLen = 0; - PrefixChar = 0; - SuffixChar = 0; - } - - void ClearSubtokens() { - Multitoken.SubTokens.clear(); - } - - //! @param delim type of delimiter - //! @param c delimiter unicode character - void SetTokenDelim(ETokenDelim delim, wchar16 /*c*/) { - Y_ASSERT(!Multitoken.SubTokens.empty()); - Multitoken.SubTokens.back().TokenDelim = delim; - // @todo remove this condition because unicode delimiters are removed before lemmatization - // if (c >= 0x7F) // if it is non-ASCII character - // SimpleMultitoken = false; - } -}; diff --git a/library/cpp/tokenizer/multitokenutil.cpp b/library/cpp/tokenizer/multitokenutil.cpp deleted file mode 100644 index 6d3a537bdde..00000000000 --- a/library/cpp/tokenizer/multitokenutil.cpp +++ /dev/null @@ -1,278 +0,0 @@ -#include <util/system/maxlen.h> -#include "multitokenutil.h" - -namespace { - inline void GlueTokens(TCharSpan* desttok, const TCharSpan* srctok) { - Y_ASSERT(srctok->PrefixLen == 0); - desttok->Len += srctok->Len; - desttok->SuffixLen = srctok->SuffixLen; - desttok->Hyphen = srctok->Hyphen; // the next token can have hyphenation - desttok->TokenDelim = srctok->TokenDelim; - } - - inline void CopyToken(TCharSpan* desttok, const TCharSpan* srctok, size_t destpos) { - Y_ASSERT(srctok->PrefixLen == 0); - desttok->Pos = destpos; - desttok->Len = srctok->Len; - desttok->SuffixLen = srctok->SuffixLen; - desttok->Type = srctok->Type; - desttok->Hyphen = srctok->Hyphen; // the next token can have hyphenation - desttok->TokenDelim = srctok->TokenDelim; - } - - //! processes hyphenation between subtokens if any - inline void ProcessHyphenation(wchar16* buffer, const wchar16* entry, TCharSpan*& desttok, const TCharSpan* srctok, size_t& destpos, size_t& srcpos) { - // Check if the space contains hyphenation, and copy the separator - if (desttok->Hyphen == HYPHEN_ORDINARY) { - if (desttok->Type == TOKEN_WORD && srctok->Type == TOKEN_WORD) { - // glue two adjacent tokens if both are TOKEN_WORD - srcpos = srctok->Pos; - GlueTokens(desttok, srctok); - } else { - // copy delimiter only - remove all following whitespace characters, for example: "sepa- \n rator" (see nlptok.rl, hyphenation/nlfasblank) - wchar16* const dest = buffer + destpos; - const wchar16* const src = entry + srcpos; // srcpos - the beginning of source delimiter - *dest = *src; - desttok->TokenDelim = TOKDELIM_MINUS; - ++destpos; - srcpos = srctok->Pos; // keep it before CopyToken() - CopyToken(++desttok, srctok, destpos); - } - } else if (desttok->Hyphen == HYPHEN_SOFT) { - if (desttok->Type == srctok->Type) { - // glue two adjacent tokens if both have the same type - srcpos = srctok->Pos; - GlueTokens(desttok, srctok); - } else { - // delimiter isn't copied - srcpos = srctok->Pos; // keep it before CopyToken() - CopyToken(++desttok, srctok, destpos); - } - } else { - Y_ASSERT(desttok->Hyphen == HYPHEN_NONE); // HYPHEN_HARD isn't processed yet - Y_ASSERT(srctok->Pos >= srcpos); - if (srctok->Pos > srcpos) { - // copy the delimiter and create the next token - const size_t seplen = srctok->Pos - srcpos; // srcpos - the beginning of source delimiter - - // copy suffix with delimiter - std::char_traits<wchar16>::copy(buffer + destpos, entry + srcpos, seplen); - destpos += seplen; - - srcpos = srctok->Pos; // keep it before CopyToken() - } - CopyToken(++desttok, srctok, destpos); - } - } - - //! @param len length of text to be copied (it can include suffix length) - inline void CopyTokenText(wchar16* buffer, const wchar16* entry, size_t len, size_t& destpos, size_t& srcpos) { - std::char_traits<wchar16>::copy(buffer + destpos, entry + srcpos, len); // srcpos - the beginning of source token - srcpos += len; - destpos += len; - } - - inline bool CutSubtoken(TCharSpan& s, size_t maxLen) { - if (s.EndPos() > maxLen) { - s.Len = maxLen - s.Pos; - s.SuffixLen = 0; - return true; - } else if (s.EndPos() + s.SuffixLen > maxLen) { - s.SuffixLen = maxLen - s.EndPos(); - return true; - } - return false; - } -} - -void CorrectDelimiters(TCharSpan& prevtok, wchar16 suffixChar, TCharSpan& lasttok, wchar16 prefixChar) { - // correct suffix length of the previous token - switch (lasttok.Pos - prevtok.EndPos()) { - case 0: - Y_ASSERT(prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0); - break; - case 1: // only delimiter allowed - if (prevtok.SuffixLen == 1 && prevtok.TokenDelim == TOKDELIM_PLUS) // 'a+b' - prevtok.SuffixLen = 0; - Y_ASSERT( - (prevtok.SuffixLen == 0 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 0) || - (prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0 && prevtok.Hyphen == HYPHEN_SOFT)); - break; - case 2: // only suffix + delimiter OR delimiter + prefix - if (prevtok.SuffixLen == 1 && lasttok.PrefixLen == 1) { // 'a+@b' - delim/prefix, 'a#@b' - suffix/delim - if (suffixChar == '+') { - prevtok.SuffixLen = 0; - prevtok.TokenDelim = TOKDELIM_PLUS; - } else if (suffixChar == '#') { - Y_ASSERT(prefixChar == '@'); // only '@' can be delimiter and prefix - prevtok.TokenDelim = TOKDELIM_AT_SIGN; - lasttok.PrefixLen = 0; - } - } else if (prevtok.SuffixLen == 2) { - prevtok.SuffixLen = 1; - prevtok.TokenDelim = TOKDELIM_PLUS; // since SuffixLen == 2 can be '++' only - } - Y_ASSERT( - (prevtok.SuffixLen == 1 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 0) || - (prevtok.SuffixLen == 0 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 1) || - (prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0 && - (prevtok.Hyphen == HYPHEN_ORDINARY || prevtok.Hyphen == HYPHEN_SOFT))); - break; - case 3: - if (prevtok.SuffixLen == 2 && lasttok.PrefixLen == 1) { // a++/b - if (prevtok.TokenDelim == TOKDELIM_PLUS) // a++/b - prevtok.SuffixLen = 1; - else if (prevtok.TokenDelim == TOKDELIM_AT_SIGN) { // 'a++@b' - prevtok.SuffixLen = 1; - prevtok.TokenDelim = TOKDELIM_PLUS; - } - } - Y_ASSERT( - (prevtok.SuffixLen == 1 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 1) || - (prevtok.SuffixLen == 2 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 0) || - (prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0 && - (prevtok.Hyphen == HYPHEN_ORDINARY || prevtok.Hyphen == HYPHEN_SOFT))); - break; - case 4: - Y_ASSERT( - (prevtok.SuffixLen == 2 && prevtok.TokenDelim != TOKDELIM_NULL && lasttok.PrefixLen == 1) || - (prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0 && - (prevtok.Hyphen == HYPHEN_ORDINARY || prevtok.Hyphen == HYPHEN_SOFT))); - break; - default: - Y_ASSERT( - prevtok.SuffixLen == 0 && prevtok.TokenDelim == TOKDELIM_NULL && lasttok.PrefixLen == 0 && - (prevtok.Hyphen == HYPHEN_ORDINARY || prevtok.Hyphen == HYPHEN_SOFT)); - break; - } -} - -NLP_TYPE PrepareMultitoken(TTokenStructure& subtokens, wchar16* buffer, size_t buflen, const wchar16* entry, size_t& len) { - size_t srcpos = subtokens[0].EndPos(); // the beginning of source delimiters and tokens - if (srcpos > buflen - 1) { - srcpos = buflen - 1; - subtokens[0].Len = srcpos - subtokens[0].Pos; - } - size_t destpos = srcpos; - std::char_traits<wchar16>::copy(buffer, entry, srcpos); - - TCharSpan* const firsttok = &subtokens[0]; - TCharSpan* const lasttok = firsttok + subtokens.size(); - TCharSpan* desttok = firsttok; - - // lengths of tokens are not changed, tokens can be moved only to remove delimiters - - for (const TCharSpan* srctok = firsttok + 1; srctok != lasttok; ++srctok) { - // Check available space; truncate input if not sufficient - if (srctok->EndPos() >= buflen) { - break; - } - - if (srctok->EndPos() + srctok->SuffixLen >= buflen) { - ProcessHyphenation(buffer, entry, desttok, srctok, destpos, srcpos); - - if (desttok->EndPos() + desttok->SuffixLen >= buflen) { - Y_ASSERT(desttok->EndPos() < buflen); - desttok->SuffixLen = 0; // cut off the suffix - - CopyTokenText(buffer, entry, srctok->Len, destpos, srcpos); // copy with no suffix - } else - CopyTokenText(buffer, entry, (srctok->Len + srctok->SuffixLen), destpos, srcpos); // copy the token with suffix - - break; - } - - ProcessHyphenation(buffer, entry, desttok, srctok, destpos, srcpos); - CopyTokenText(buffer, entry, (srctok->Len + srctok->SuffixLen), destpos, srcpos); // copy the token with suffix - } - - Y_ASSERT(srcpos >= destpos); - - // Multitoken->Leng - len = destpos; - subtokens.resize(desttok - firsttok + 1); - subtokens.back().TokenDelim = TOKDELIM_NULL; - return DetectNLPType(subtokens); // after PrepareMultitoken nlpType can be chagned -} - -size_t AdjustSubtokens(TTokenStructure& subtokens, size_t maxLen) { - Y_ASSERT(!subtokens.empty()); - - TCharSpan* const first = &subtokens[0]; - TCharSpan* p = first + subtokens.size() - 1; - while (p != first && p->Pos >= maxLen) { - --p; - } - - CutSubtoken(*p, maxLen); - subtokens.resize(p - first + 1); - p->TokenDelim = TOKDELIM_NULL; - return p->EndPos() + p->SuffixLen; -} - -size_t AdjustSubtokens(TTokenStructure& subtokens, size_t n, size_t maxLen) { - Y_ASSERT(n > 0); - Y_ASSERT(!subtokens.empty()); - - // ````````````````ab``-cd```-ef``` - // ---------0---------- --1-- --2-- - // ^n - - TCharSpan& first = subtokens[0]; - Y_ASSERT(first.Len > n); - first.Pos = 0; - first.Len -= n; - if (CutSubtoken(first, maxLen)) { - subtokens.resize(1); - } else { - for (size_t i = 1; i < subtokens.size(); ++i) { - TCharSpan& span = subtokens[i]; - - Y_ASSERT(span.Pos > n); - const size_t newPos = span.Pos - n; - - if (newPos >= maxLen) { // if no symbols left for current token - finish - subtokens.resize(i); - break; - } - - span.Pos = newPos; - - if (CutSubtoken(span, maxLen)) { - subtokens.resize(i + 1); - break; - } - } - } - - TCharSpan& last = subtokens.back(); - last.TokenDelim = TOKDELIM_NULL; - return last.EndPos() + last.SuffixLen; -} - -bool CheckMultitoken(const TWideToken& tok) { - const TTokenStructure& subtokens = tok.SubTokens; - for (size_t i = 0; i < subtokens.size(); ++i) { - const TCharSpan& s = subtokens[i]; - if (!s.Len) - Y_ASSERT(false); - if (i > 0) { - const TCharSpan& prev = subtokens[i - 1]; - if (prev.EndPos() + prev.SuffixLen > s.Pos - s.PrefixLen) - Y_ASSERT(false); - else if (prev.EndPos() + prev.SuffixLen == s.Pos - s.PrefixLen && prev.TokenDelim != TOKDELIM_NULL) - Y_ASSERT(false); - } - if (i + 1 < subtokens.size()) { - const TCharSpan& next = subtokens[i + 1]; - if (s.EndPos() + s.SuffixLen > next.Pos - next.PrefixLen) - Y_ASSERT(false); - else if (s.EndPos() + s.SuffixLen == next.Pos - next.PrefixLen && s.TokenDelim != TOKDELIM_NULL) - Y_ASSERT(false); - } else { - if (s.EndPos() + s.SuffixLen != tok.Leng || s.TokenDelim != TOKDELIM_NULL) - Y_ASSERT(false); - } - } - return (subtokens.empty() || tok.Leng == (subtokens.back().EndPos() + subtokens.back().SuffixLen)); -} diff --git a/library/cpp/tokenizer/multitokenutil.h b/library/cpp/tokenizer/multitokenutil.h deleted file mode 100644 index 19781f67858..00000000000 --- a/library/cpp/tokenizer/multitokenutil.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include <library/cpp/token/nlptypes.h> -#include <library/cpp/token/token_structure.h> - -void CorrectDelimiters(TCharSpan& prevtok, wchar16 suffixChar, TCharSpan& lasttok, wchar16 prefixChar); - -//! removes hyphenations and replaces unicode delimiters -//! @return new length of multitoken -NLP_TYPE PrepareMultitoken(TTokenStructure& subtokens, wchar16* buffer, size_t buflen, const wchar16* entry, size_t& len); - -//! cuts off the subtokens according to the specified maximum length -//! @return new length of the subtokens -size_t AdjustSubtokens(TTokenStructure& subtokens, size_t maxLen); - -//! corrects positions of subtokens and cuts off their length according to the specified maximum -//! @note the first @c n characters are accents -//! @return new length of the subtokens -size_t AdjustSubtokens(TTokenStructure& subtokens, size_t n, size_t maxLen); - -//! for debugging purposes only -bool CheckMultitoken(const TWideToken& tok); diff --git a/library/cpp/tokenizer/nlpparser.cpp b/library/cpp/tokenizer/nlpparser.cpp deleted file mode 100644 index dca8530c0cf..00000000000 --- a/library/cpp/tokenizer/nlpparser.cpp +++ /dev/null @@ -1,553 +0,0 @@ -#include "nlpparser.h" -#include "sentbreakfilter.h" -#include "special_tokens.h" - -#include <library/cpp/token/charfilter.h> -#include <library/cpp/token/token_iterator.h> - -#include <util/charset/utf8.h> -#include <util/charset/wide.h> -#include <util/generic/utility.h> - -namespace { - const char PERCENT_CHAR = '%'; - - //! returns pointer to the first non-accent symbol, if it is not found - returns NULL - const wchar16* FindNonAccent(const wchar16* p, size_t n) { - const TAccents accents; - const wchar16* const e = p + n; - for (; p != e; ++p) { - if (!accents.Check(*p)) - break; - } - return p; - } - - inline char HexToChar(char h) { - Y_ASSERT(isxdigit(h)); - return ( - h >= 'a' ? h - 'a' + 10 : h >= 'A' ? h - 'A' + 10 : h >= '0' ? h - '0' : 0); - } -} - -#ifdef ROBOT_OLDTOK -//compilation error -TNlpParser::TNlpParser(ITokenHandler& handler, TSentBreakFilter& sentBreakFilter, bool spacePreserve, bool, bool) -#else -TNlpParser::TNlpParser(ITokenHandler& handler, TSentBreakFilter& sentBreakFilter, TTempArray<wchar16>& buffer, - bool spacePreserve, bool backwardCompatible, bool semicolonBreaksSentence, - bool urlDecode) -#endif - : TokenHandler(handler) - , SentenceBreak(nullptr) - , SentBreakFilter(sentBreakFilter) - , OrigText(nullptr) - , Text(nullptr) - , EndOfText(nullptr) - , ExtraLenIndex(0) - , SpacePreserve(spacePreserve) -#ifdef ROBOT_OLDTOK - , BackwardCompatible(true) - , SemicolonBreaksSentence(false) -#else - , BackwardCompatible(backwardCompatible) - , SemicolonBreaksSentence(semicolonBreaksSentence) -#endif - , UrlDecode(urlDecode) - , Buffer(buffer) -{ -} - -void TNlpParser::ProcessMultitoken(const wchar16* ts, const wchar16* te) { - Base.AddLastToken(ts, te); - const wchar16* p = ts; - size_t prevEnd = 0; - size_t tokenCount = Base.GetTokenCount(); - for (size_t i = 0; i < tokenCount; ++i) { - TParserToken& tok = Base.GetToken(i); - if (i) { - size_t n = tok.GetStart() - prevEnd; - if (n) { - MakeEntry(p, n, NLP_MISCTEXT); - p += n; - } - } - prevEnd = tok.GetEnd(); - MakeMultitokenEntry(tok, p); - p = ts + prevEnd; - } - Base.ResetTokens(); -} - -template<> void TVersionedNlpParser<2>::MakeMultitokenEntry(TParserToken& token, const wchar16* entry) { - size_t entryLen = token.GetLength(); - - TTokenStructure subtokens; - token.CorrectPositions(); - Y_ASSERT(token.GetLength() == entryLen); // check after the correction - token.SwapSubtokens(subtokens); - - const wchar16* tokenText = entry; - size_t tokenLen = entryLen; - NLP_TYPE type = token.GetNlpType(); - wchar16 buffer[TOKEN_MAX_BUF]; - if (token.HasHyphen()) { - type = PrepareMultitoken(subtokens, buffer, TOKEN_MAX_BUF, entry, tokenLen); - Y_ASSERT(tokenLen <= TOKEN_MAX_LEN); // multitoken isn't longer than TOKEN_MAX_LEN - tokenText = buffer; - } else { - // NLP_WORD, NLP_INTEGER, NLP_FLOAT, NLP_MARK are needed to be cut off - Y_ASSERT(type == NLP_WORD || type == NLP_INTEGER || type == NLP_FLOAT || type == NLP_MARK); - if (tokenLen > TOKEN_MAX_LEN) { - // entry here always points to the original text - CutTooLongMultitoken(subtokens, entry, tokenLen, entryLen, type); - tokenText = entry; // in case if leading accents were removed... - } - } - - TWideToken multitoken; // don't call to constructor TWideToken(entry, leng)! - multitoken.Token = tokenText; - multitoken.Leng = tokenLen; - multitoken.SubTokens.swap(subtokens); - Y_ASSERT(CheckMultitoken(multitoken)); - - const size_t totalLen = entryLen + GetExtraLen(entry, entryLen); - - Y_ASSERT(multitoken.SubTokens.size()); - if (BackwardCompatible) { - PassBackwardCompatibleToken(multitoken, type, totalLen); - } else { - SentBreakFilter.OnToken(multitoken, type); - TokenHandler.OnToken(multitoken, totalLen, type); - } -} - -void TVersionedNlpParser<3>::MakeMultitokenEntry(TParserToken& token, const wchar16* entry) { - size_t entryLen = token.GetLength(); - - TTokenStructure subtokens; - token.CorrectPositions(); - Y_ASSERT(token.GetLength() == entryLen); // check after the correction - token.SwapSubtokens(subtokens); - - KeepedPotentialPrefix = nullptr; - if (!subtokens.empty() && subtokens[0].PrefixLen > 0) { - Y_ASSERT(subtokens[0].PrefixLen == 1); - // in case x#y we have already tokenized # as suffix - if (!KeepAffixes && LastTokenSuffixLength == 0) { - MakeEntry(entry, 1, NLP_WORD); - } - if (!KeepAffixes || LastTokenSuffixLength != 0) { - subtokens[0].PrefixLen = 0; - --entryLen; - ++entry; - for (auto& subtoken : subtokens) { - --subtoken.Pos; - } - } - LastTokenSuffixLength = 0; - } - - const wchar16* tokenText = entry; - size_t tokenLen = entryLen; - NLP_TYPE type = token.GetNlpType(); - wchar16 buffer[TOKEN_MAX_BUF]; - if (token.HasHyphen()) { - type = PrepareMultitoken(subtokens, buffer, TOKEN_MAX_BUF, entry, tokenLen); - Y_ASSERT(tokenLen <= TOKEN_MAX_LEN); // multitoken isn't longer than TOKEN_MAX_LEN - tokenText = buffer; - } else { - // NLP_WORD, NLP_INTEGER, NLP_FLOAT, NLP_MARK are needed to be cut off - Y_ASSERT(type == NLP_WORD || type == NLP_INTEGER || type == NLP_FLOAT || type == NLP_MARK); - if (tokenLen > TOKEN_MAX_LEN) { - // entry here always points to the original text - CutTooLongMultitoken(subtokens, entry, tokenLen, entryLen, type); - tokenText = entry; // in case if leading accents were removed... - } - } - - TWideToken multitoken; // don't call to constructor TWideToken(entry, leng)! - multitoken.Token = tokenText; - multitoken.Leng = tokenLen; - multitoken.SubTokens.swap(subtokens); - Y_ASSERT(CheckMultitoken(multitoken)); - - const size_t totalLen = entryLen + GetExtraLen(entry, entryLen); - - Y_ASSERT(multitoken.SubTokens.size()); - if (BackwardCompatible) { - PassBackwardCompatibleToken(multitoken, type, totalLen); - } else { - SentBreakFilter.OnToken(multitoken, type); - TokenHandler.OnToken(multitoken, totalLen, type); - } - -} - -size_t TNlpParser::GetExtraLen(const wchar16* entry, size_t entryLen) { - const size_t offset = entry - OrigText; - const size_t endOffset = offset + entryLen; - ui32 extraLen = 0; - while (ExtraLenIndex < ExtraLen.size() && - ExtraLen[ExtraLenIndex].first > offset && ExtraLen[ExtraLenIndex].first <= endOffset) { - extraLen += ExtraLen[ExtraLenIndex].second; - ++ExtraLenIndex; - } - return extraLen; -} - -void TNlpParser::CutTooLongMultitoken(TTokenStructure& subtokens, const wchar16*& entry, size_t& leng, size_t& origleng, NLP_TYPE& type) { - Y_ASSERT(leng > TOKEN_MAX_LEN); - if (type == NLP_WORD || type == NLP_INTEGER || type == NLP_MARK) { - // if too many accent symbols are in the beginning of the token (the number is greater than TOKEN_MAX_LEN) - // TODO: remove accents before tokenization - const ptrdiff_t n = FindNonAccent(entry, leng) - entry; - Y_ASSERT(n >= 0); - - // NLP_WORD contains words only, NLP_INTEGER - integers only, NLP_MARK - words and integers - Y_ASSERT(!subtokens.empty()); - - if (n > 0) { - const TWideToken miscText(entry, n); // the first part containing accents only - TokenHandler.OnToken(miscText, n, NLP_MISCTEXT); - origleng -= n; - entry += n; - leng = AdjustSubtokens(subtokens, n, TOKEN_MAX_LEN); - } else - leng = AdjustSubtokens(subtokens, TOKEN_MAX_LEN); - - // correct NLP type - if (type == NLP_MARK) { - Y_ASSERT(!subtokens.empty()); - ETokenType tokType = subtokens[0].Type; - Y_ASSERT(tokType == TOKEN_WORD || tokType == TOKEN_NUMBER); - for (size_t i = 1; i < subtokens.size(); ++i) { - if (subtokens[i].Type != tokType) { - tokType = TOKEN_MARK; - break; - } - } - if (tokType != TOKEN_MARK) - type = (tokType == TOKEN_WORD ? NLP_WORD : NLP_INTEGER); - } - } else { - // no processing of the case when point of a NLP_FLOAT token is cut off (position of the - // point character is greater than TOKEN_MAX_LEN) and token actually will be integer - Y_ASSERT(subtokens.empty()); - leng = TOKEN_MAX_LEN; - } -} - -void TNlpParser::PassBackwardCompatibleToken(const TWideToken& multitoken, NLP_TYPE type, size_t totalLen) { - if (multitoken.SubTokens.size() == 1) { - const TCharSpan& subtok = multitoken.SubTokens[0]; - TWideToken tok; - if (subtok.PrefixLen) { - tok.Token = multitoken.Token; - tok.Leng = subtok.PrefixLen; - SentBreakFilter.OnToken(tok, NLP_MISCTEXT); - TokenHandler.OnToken(tok, tok.Leng, NLP_MISCTEXT); - } - - const ui16 prefixLen = subtok.PrefixLen; - tok.Token = multitoken.Token + prefixLen; - tok.Leng = multitoken.Leng - prefixLen; - tok.SubTokens.push_back(subtok); - tok.SubTokens[0].PrefixLen = 0; - tok.SubTokens[0].Pos -= prefixLen; - - SentBreakFilter.OnToken(tok, type); - TokenHandler.OnToken(tok, tok.Leng + (totalLen - multitoken.Leng), type); - // suffix after alone number is kept, for example: 18+ -> [18+] - // if number with suffix is part of multitoken then suffix will be removed: 16+/18+ -> [16]+/[18]+ - // see also tokenizer_ut.cpp - } else { - TWideToken tok; - TTokenIterator it(multitoken); - it.GetPrefix(tok); // prefix of the first token - if (tok.Leng) { - SentBreakFilter.OnToken(tok, NLP_MISCTEXT); - TokenHandler.OnToken(tok, tok.Leng, NLP_MISCTEXT); - } - while (it.Next()) { - it.GetMultitoken(tok); - SentBreakFilter.OnToken(tok, it.GetNlpType()); - if (!it.Finished()) - TokenHandler.OnToken(tok, tok.Leng, it.GetNlpType()); - else - TokenHandler.OnToken(tok, tok.Leng + (totalLen - multitoken.Leng), it.GetNlpType()); - it.GetDelimiter(tok); - if (tok.Leng) { - SentBreakFilter.OnToken(tok, NLP_MISCTEXT); - TokenHandler.OnToken(tok, tok.Leng, NLP_MISCTEXT); - } - } - } -} - -void TNlpParser::MakeEntry(const wchar16* entry, size_t entryLen, NLP_TYPE type) { - TWideToken token; // don't call to constructor TWideToken(entry, leng)! - token.Token = entry; - token.Leng = entryLen; - - const size_t totalLen = entryLen + GetExtraLen(entry, entryLen); - - SentBreakFilter.OnToken(token, type); - TokenHandler.OnToken(token, totalLen, type); -} - -void TVersionedNlpParser<3>::MakeEntry(const wchar16* entry, size_t entryLen, NLP_TYPE type) { - if (KeepedPotentialPrefix) { - TWideToken token(KeepedPotentialPrefix, 1); - SentBreakFilter.OnToken(token, type); - TokenHandler.OnToken(token, entryLen, type); - KeepedPotentialPrefix = nullptr; - entryLen -= 1; - entry += 1; - if (entryLen == 0) { - return; - } - } - if (type == NLP_WORD) { - TWideToken token(entry, entryLen); - SentBreakFilter.OnToken(token, type); - TokenHandler.OnToken(token, entryLen, type); - return; - } - return TNlpParser::MakeEntry(entry, entryLen, type); -} - -namespace { - bool IsWhitespaceClass(const unsigned char c) { - return c == TNlpParser::CC_LINE_FEED - || c == TNlpParser::CC_TAB - || c == TNlpParser::CC_CARRIAGE_RETURN - || c == TNlpParser::CC_WHITESPACE; - } - - bool IsNotSpace(wchar16 c) { - return !IsWhitespaceClass(TNlpParser::GetCharClass(c)); - } -} - -int TVersionedNlpParser<3>::MakeMisctextEntry(const unsigned char* entry, size_t len, size_t availableAfter) { - const wchar16* entry16 = GetOrigText(entry); - size_t skipFirst = LastTokenSuffixLength; - LastTokenSuffixLength = 0; - //if last symbol is #, @ or $ (tokprefix), we may want to create token from it if it is prefix - bool leftLast = (len > 1) && (entry16[len - 1] == '#' || entry16[len - 1] == '@' || entry16[len - 1] == '$'); - while (len > 0) { - const wchar16* misctextEnd = std::find_if(entry16, entry16 + len, IsNotSpace); - size_t interestingLength = 0; - while (misctextEnd < entry16 + len) { - interestingLength = GetSpecialTokenLength(misctextEnd, len - (misctextEnd - entry16) + availableAfter); - if (interestingLength != 0) { - break; - } - misctextEnd = std::find_if(misctextEnd + 1, entry16 + len, IsNotSpace); - } - if (misctextEnd > entry16) { - while (skipFirst && misctextEnd > entry16) { - ++entry16; - --len; - --skipFirst; - } - if (leftLast && misctextEnd == len + entry16) { - if (misctextEnd - entry16 > 1) { - MakeEntry(entry16, misctextEnd - entry16 - 1, NLP_MISCTEXT); - } - return -1; - } - if (misctextEnd > entry16) { - MakeEntry(entry16, misctextEnd - entry16, NLP_MISCTEXT); - } - len -= misctextEnd - entry16; - entry16 = misctextEnd; - } - Y_ASSERT(misctextEnd == entry16); - if (interestingLength > 0) { - while (skipFirst && interestingLength && len) { - ++entry16; - --interestingLength; - --len; - --skipFirst; - } - if (KeepAffixes && leftLast && len == interestingLength) { - for (size_t i = 0; i + 1 < interestingLength; ++i) { - MakeEntry(entry16 + i, 1, NLP_WORD); - } - KeepedPotentialPrefix = entry16 + interestingLength - 1; - return -1; - } - for (size_t i = 0; i < interestingLength; ++i) { - MakeEntry(entry16 + i, 1, NLP_WORD); - } - if (interestingLength > len) { - return interestingLength - len; - } - len -= interestingLength; - entry16 += interestingLength; - } - } - return 0; -} - -size_t TNlpParser::MakeSentenceBreak(const wchar16* entry, size_t leng) { - if (!SentenceBreak) - SentenceBreak = entry + leng - 1; // last symbol is ytitle - const size_t end = SentenceBreak - entry; - assert(0 < end && end <= leng); - - MakeEntry(entry, end, SentBreakFilter.OnSentBreak(entry, leng)); - SentenceBreak = nullptr; - return end; // adjust the current position, excluding the start of the sentence -} - -void TNlpParser::ProcessSurrogatePairs(const wchar16* ts, const wchar16* te) { - const wchar16 brokenRune = BROKEN_RUNE; - const wchar16* lead = nullptr; - for (const wchar16* p = ts; p != te; ++p) { - if (IsW16SurrogateLead(*p)) { - if (lead) - MakeEntry(&brokenRune, 1, NLP_MISCTEXT); - lead = p; - } else if (IsW16SurrogateTail(*p)) { - if (lead) { - Base.AddIdeograph(2); - Y_ASSERT(Base.GetTokenCount() == 1); - MakeMultitokenEntry(Base.GetToken(0), lead); - Base.ResetTokens(); - } else - MakeEntry(&brokenRune, 1, NLP_MISCTEXT); - lead = nullptr; - } else - Y_ASSERT(!"invalid character"); - } - if (lead) - MakeEntry(&brokenRune, 1, NLP_MISCTEXT); -} - -void TNlpParser::ProcessIdeographs(const wchar16* ts, const wchar16* te) { - for (const wchar16* p = ts; p != te; ++p) { - Base.AddIdeograph(1); - Y_ASSERT(Base.GetTokenCount() == 1); - MakeMultitokenEntry(Base.GetToken(0), p); - Base.ResetTokens(); - } -} - -void TNlpParser::Execute(const wchar16* text, size_t len, const wchar16** textStart) { - if (!len) - return; - const wchar16* p = text; - const wchar16* e = p + len; - wchar16* data = nullptr; - wchar16* dest = nullptr; - ExtraLen.clear(); - ExtraLenIndex = 0; - - while (p != e) { - if (UrlDecode && *p == PERCENT_CHAR && (p + 3) <= e && IsHexdigit(p[1]) && IsHexdigit(p[2])) { - if (!dest) { - Buffer = TTempArray<wchar16>(len + 1); - data = Buffer.Data(); - dest = data; - const size_t n = p - text; - std::char_traits<wchar16>::copy(dest, text, n); - dest += n; - } - - const wchar16* start = p; // in case if UTF8 is bad - TTempBuf buf(e - p); // for UTF8 - char* const utf8 = buf.Data(); - size_t i = 0; - while (p != e && *p == PERCENT_CHAR && (p + 3) <= e && IsHexdigit(p[1]) && IsHexdigit(p[2])) { - const char c = (HexToChar(char(p[1])) << 4) | HexToChar(char(p[2])); - utf8[i++] = ((unsigned char)c < 0x20 ? ' ' : c); // replace all controlling characters with ' ' - p += 3; - } - - bool decoded = false; - // convert at least 2 UTF8 bytes - if (i > 1) { - decoded = true; - Y_VERIFY(size_t(p - start) == 3 * i); - size_t written = 0; - const size_t extraLenRollback = ExtraLen.size(); - for (size_t j = 0; j < i;) { - size_t stepRead = 0; - if (RECODE_OK != GetUTF8CharLen(stepRead, reinterpret_cast<const unsigned char*>(utf8) + j, reinterpret_cast<const unsigned char*>(utf8) + i)) { - decoded = false; - break; - } - Y_VERIFY(stepRead && j + stepRead <= i); - size_t stepWritten = 0; - if (!UTF8ToWide(utf8 + j, stepRead, dest + written, stepWritten)) { - decoded = false; - break; - } - written += stepWritten; - ExtraLen.push_back(std::make_pair<ui32>(dest + written - data, 3 * stepRead - stepWritten)); - j += stepRead; - } - if (decoded) { - dest += written; - } else { - ExtraLen.resize(extraLenRollback); - } - } - if (!decoded) { - // UTF8 is bad or too short (for example: %action-%61%62%63) - // copy text as is: - size_t n = p - start; - std::char_traits<wchar16>::copy(dest, start, n); - dest += n; - } - } else if (dest) - *dest++ = *p++; - else - ++p; - } - - if (dest) { - if (textStart) { - *textStart = data; - } - *dest = 0; // just in case - const size_t newLen = dest - data; - TTempBuf convbuf(newLen + 1); - unsigned char* conv = (unsigned char*)convbuf.Data(); - ConvertTextToCharClasses(data, newLen, conv); - OrigText = data; - ExecuteImpl(conv, newLen); - } else { - if (textStart) { - *textStart = text; - } - TTempBuf convbuf(len + 1); - unsigned char* conv = (unsigned char*)convbuf.Data(); - ConvertTextToCharClasses(text, len, conv); - OrigText = text; - ExecuteImpl(conv, len); - } -} - -void TNlpParser::ConvertTextToCharClasses(const wchar16* text, size_t len, unsigned char* buffer) { - const wchar16* end = text + len; - while (text != end) { - // TODO: it would be better to copy the char classes table into the new one in the constructor - // and to change required char classes in it instead of checking conditions here (semicolon and whitespaces) - const unsigned char c = (*text == ';' ? (unsigned char)(SemicolonBreaksSentence ? CC_TERM_PUNCT : CC_MISC_TEXT) : CharClasses[*text]); - ++text; - if (SpacePreserve) - *buffer++ = c; - else { - // in case of !SpacePreserve all whitespaces are replaced with space because - // browsers normalize whitespaces: "a \t\n\r b" -> "a b" if tag <pre></pre> isn't used - // this change fixes incorrect hyphenations without tag <pre>: "HTML-\nfile" is not "HTMLfile" - // browser show this text as: "HTML- file" - *buffer++ = (IsWhitespaceClass(c) ? (unsigned char)CC_SPACE : c); - } - } - *buffer = 0; -} diff --git a/library/cpp/tokenizer/nlpparser.h b/library/cpp/tokenizer/nlpparser.h deleted file mode 100644 index 1d6b04bda99..00000000000 --- a/library/cpp/tokenizer/nlpparser.h +++ /dev/null @@ -1,236 +0,0 @@ -#pragma once - -#include <util/generic/noncopyable.h> -#include <util/generic/vector.h> -#include <util/system/maxlen.h> -#include <library/cpp/token/token_structure.h> -#include <library/cpp/token/nlptypes.h> -#include "nlpparserbase.h" - -class ITokenHandler; -class TSentBreakFilter; - -//! this class is implemented to be used by @c TNlpTokenizer only -class TNlpParser: private TNonCopyable { -protected: - TNlpParserBase Base; - ITokenHandler& TokenHandler; - const wchar16* SentenceBreak; - TSentBreakFilter& SentBreakFilter; - const wchar16* OrigText; - const unsigned char* Text; - const unsigned char* EndOfText; //!< points to null-terminator, it must be assigned if ExtraLen != 0 - TVector<std::pair<ui32, ui32>> ExtraLen; - size_t ExtraLenIndex; - const bool SpacePreserve; - const bool BackwardCompatible; - const bool SemicolonBreaksSentence; - const bool UrlDecode; - TTempArray<wchar16>& Buffer; - - static const unsigned char CharClasses[65536]; - -public: - // see also charclasses_8.rl - enum ECharClass { - CC_ZERO = 0x00, // (EOF) [\0] - CC_TAB = 0x09, // [\t] - CC_LINE_FEED = 0x0A, // [\n] - CC_CARRIAGE_RETURN = 0x0D, // [\r] - CC_SPACE = 0x20, // [ ] - CC_QUOTATION_MARK = 0x22, // ["] - CC_NUMBER_SIGN = 0x23, // [#] - CC_DOLLAR_SIGN = 0x24, // [$] - CC_PERCENT = 0x25, // [%] - CC_AMPERSAND = 0x26, // [&] - CC_APOSTROPHE = 0x27, // ['] - CC_ASTERISK = 0x2A, // [*] - CC_PLUS = 0x2B, // [+] - CC_COMMA = 0x2C, // [,] - CC_MINUS = 0x2D, // [-] - CC_FULL_STOP = 0x2E, // [.] - CC_SLASH = 0x2F, // [/] - CC_DIGIT = 0x31, // [1] - CC_AT_SIGN = 0x40, // [@] - CC_CAPITAL_LETTER = 0x41, // [A] - CC_UNDERSCORE = 0x5F, // [_] - CC_SMALL_LETTER = 0x61, // [a] - CC_COMBINING_MARK = 0x80, - CC_UNICASE_ALPHA = 0x81, - CC_SOFT_HYPHEN = 0x8F, - CC_IDEOGRAPH = 0x9F, - CC_NON_BREAKING_SPACE = 0xA0, - CC_SECTION_SIGN = 0xA7, - CC_COPYRIGHT_SIGN = 0xA9, - CC_SPECIAL = 0xB0, - - CC_OPENING_PUNCT = 0xB2, // [(\[{'"] - CC_CLOSING_PUNCT = 0xB3, // [)\]}'"] - CC_SURROGATE_LEAD = 0xB4, - CC_SURROGATE_TAIL = 0xB5, - CC_WHITESPACE = 0xB6, // [\t\n\v\f\r ] - CC_NUMERO_SIGN = 0xB7, - CC_CJK_TERM_PUNCT = 0xBA, // 0x3002 and other CJK full stops - CC_TERM_PUNCT = 0xBB, // terminating punctuation [!.:?] - CC_CURRENCY = 0xBC, - CC_CONTROL = 0xBD, // 0x01 - 0x1F, 0x7F excluding \t \n \r - CC_MISC_TEXT = 0xBE, - - CC_UNASSIGNED = 0xFF - }; - - TNlpParser(ITokenHandler& handler, TSentBreakFilter& sentBreakFilter, TTempArray<wchar16>& buffer, - bool spacePreserve, bool backwardCompatible, bool semicolonBreaksSentence = false, - bool urlDecode = true); - virtual ~TNlpParser() = default; - - //depending on content, tokens can point to data text or Buffer - //textStart points to string passed to ragel - void Execute(const wchar16* text, size_t len, const wchar16** textStart=nullptr); - - static int GetCharClass(wchar16 ch) { - return CharClasses[ch]; - } - -protected: - virtual void ExecuteImpl(const unsigned char* text, size_t len) = 0; - - // the size of the buffer must not be less than (len + 1) - // text can contain zeros - void ConvertTextToCharClasses(const wchar16* text, size_t len, unsigned char* buffer); - - //! @todo now the following phrases processed incorrectly: - //! HTML-\nand VRML-documents -> HTMLand VRML-documents - //! son-\nin-law -> sonin-law - //! to fix this problem such phrases could be analyzed by the lemmer - virtual void MakeMultitokenEntry(TParserToken& token, const wchar16* entry) = 0; - - void CutTooLongMultitoken(TTokenStructure& subtokens, const wchar16*& entry, size_t& leng, size_t& origleng, NLP_TYPE& type); - - void PassBackwardCompatibleToken(const TWideToken& multitoken, NLP_TYPE type, size_t totalLen); - - virtual void MakeEntry(const wchar16* entry, size_t entryLen, NLP_TYPE type); - - size_t GetExtraLen(const wchar16* entry, size_t entryLen); - - //! @note @c leng must include the first letter (or digit) of the next sentence - size_t MakeSentenceBreak(const wchar16* entry, size_t leng); - - //! marks the end of sentence before any punctuation at the beginning of the next sentence - void MarkSentenceBreak(const wchar16* p) { - SentenceBreak = p; - } - - //! marks the end of sentence if there is no punctuation at the beginning of the next sentence - void EnsureSentenceBreak(const wchar16* p) { - if (!SentenceBreak) - SentenceBreak = p; - } - - //! resets members describing sentence break - void ResetSentenceBreak() { - SentenceBreak = nullptr; - } - - void ProcessMultitoken(const wchar16* ts, const wchar16* te); - - void ProcessSurrogatePairs(const wchar16* ts, const wchar16* te); - - void ProcessIdeographs(const wchar16* ts, const wchar16* te); - - const wchar16* GetOrigText(const unsigned char* p) { - return OrigText + (p - Text); - } - - ////////////////////////////////////////////////////////////////////////////////////////// - // functions wrappers {{ - void ProcessMultitoken(const unsigned char* ts, const unsigned char* te) { - ProcessMultitoken(GetOrigText(ts), GetOrigText(te)); - } - void ProcessSurrogatePairs(const unsigned char* ts, const unsigned char* te) { - ProcessSurrogatePairs(GetOrigText(ts), GetOrigText(te)); - } - void ProcessIdeographs(const unsigned char* ts, const unsigned char* te) { - ProcessIdeographs(GetOrigText(ts), GetOrigText(te)); - } - size_t MakeSentenceBreak(const unsigned char* entry, size_t leng) { - return MakeSentenceBreak(GetOrigText(entry), leng); - } - void MarkSentenceBreak(const unsigned char* p) { - MarkSentenceBreak(GetOrigText(p)); - } - void EnsureSentenceBreak(const unsigned char* p) { - EnsureSentenceBreak(GetOrigText(p)); - } - void MakeEntry(const unsigned char* entry, size_t len, NLP_TYPE type) { - MakeEntry(GetOrigText(entry), len, type); - } - void BeginToken(const unsigned char* tokstart, const unsigned char* p) { - Base.BeginToken(GetOrigText(tokstart), GetOrigText(p)); - } - void BeginToken(const unsigned char* tokstart, const unsigned char* p, ETokenType type) { - Base.BeginToken(GetOrigText(tokstart), GetOrigText(p), type); - } - void UpdateToken() { - Base.UpdateToken(); - } - void AddToken() { - Base.AddToken(); - } - void CancelToken() { - Base.CancelToken(); - } - void UpdatePrefix(wchar16 c) { - Y_ASSERT(c == '#' || c == '@' || c == '$'); - Base.UpdatePrefix(c); - } - void UpdateSuffix(wchar16 c) { - Y_ASSERT(c == '#' || c == '+'); - Base.UpdateSuffix(c); - } - void SetSoftHyphen() { - Base.SetSoftHyphen(); - } - void SetHyphenation() { - Base.SetHyphenation(); - } - void SetTokenDelim(ETokenDelim delim, unsigned char c) { - Base.SetTokenDelim(delim, c); - } - // }} - ////////////////////////////////////////////////////////////////////////////////////////// -}; - -template<size_t VERSION> class TVersionedNlpParser: public TNlpParser { -public: - using TNlpParser::TNlpParser; -protected: - void ExecuteImpl(const unsigned char* text, size_t len) override; - void MakeMultitokenEntry(TParserToken& token, const wchar16* entry) override; -}; -template<> class TVersionedNlpParser<3>: public TNlpParser { -private: - size_t LastTokenSuffixLength = 0; - const bool KeepAffixes = true; - //we have no look-ahead, so if symbol can be part of prefix we can generate token from it only when we understand that it is not included in prefix - const wchar16* KeepedPotentialPrefix = nullptr; -public: - using TNlpParser::TNlpParser; - TVersionedNlpParser(ITokenHandler& handler, TSentBreakFilter& sentBreakFilter, TTempArray<wchar16>& buffer, - bool spacePreserve, bool backwardCompatible, bool semicolonBreaksSentence = false, - bool urlDecode = true, bool keepAffixes = false) - : TNlpParser(handler, sentBreakFilter, buffer, spacePreserve, backwardCompatible, semicolonBreaksSentence, urlDecode) - , KeepAffixes(keepAffixes) - { - } -protected: - void ExecuteImpl(const unsigned char* text, size_t len) override; - //returns number of chars to shift after: -1 if we need to re-process last symbol, 0 normally - int MakeMisctextEntry(const unsigned char* entry, size_t len, size_t availableAfter); - void MakeMultitokenEntry(TParserToken& token, const wchar16* entry) override; - void FlushKeepedPotentialPrefix(); - - using TNlpParser::MakeEntry; - void MakeEntry(const wchar16* entry, size_t entryLen, NLP_TYPE type) override; -}; -using TDefaultNlpParser = TVersionedNlpParser<2>; diff --git a/library/cpp/tokenizer/nlpparserbase.h b/library/cpp/tokenizer/nlpparserbase.h deleted file mode 100644 index 2e294af7c9c..00000000000 --- a/library/cpp/tokenizer/nlpparserbase.h +++ /dev/null @@ -1,245 +0,0 @@ -#pragma once - -#include <library/cpp/token/nlptypes.h> -#include <library/cpp/token/token_structure.h> -#include "multitokenutil.h" - -// replresents single multitoken in the collection of TNlpParserBase -class TParserToken { - TTokenStructure Subtokens; - NLP_TYPE NlpType; // type of multitoken - bool Hyphen; - -public: - TParserToken() - : NlpType(NLP_WORD) - , Hyphen(false) - { - } - - explicit TParserToken(const TCharSpan& subtok) - : NlpType(NLP_WORD) - , Hyphen(false) - { - Subtokens.push_back(subtok); - } - bool HasHyphen() const { - return Hyphen; - } - void SetHyphen(EHyphenType type) { - Y_ASSERT(!Subtokens.empty()); - Subtokens.back().Hyphen = type; - Hyphen = true; - } - void SetTokenDelim(ETokenDelim delim) { - Y_ASSERT(!Subtokens.empty()); - Subtokens.back().TokenDelim = delim; - } - NLP_TYPE GetNlpType() const { - return NlpType; - } - size_t GetSubtokenCount() const { - return Subtokens.size(); - } - size_t GetStart() const { - Y_ASSERT(!Subtokens.empty()); - return Subtokens[0].Pos - Subtokens[0].PrefixLen; - } - size_t GetEnd() const { - Y_ASSERT(!Subtokens.empty()); - return Subtokens.back().EndPos() + Subtokens.back().SuffixLen; - } - size_t GetLength() const { - return GetEnd() - GetStart(); - } - // allowed suffixes: "+", "++" and "#" - void AddSubtoken(const TCharSpan& span, size_t prefixLen, wchar16 prefixChar, wchar16 suffixChar) { - Y_ASSERT(Subtokens.size() < MAX_SUBTOKENS); - - if (Subtokens.empty()) { - NlpType = (span.Type == TOKEN_WORD ? NLP_WORD : NLP_INTEGER); - } else { - if (NlpType != NLP_MARK && span.Type != Subtokens.back().Type) - NlpType = NLP_MARK; - } - - Subtokens.push_back(span); - Subtokens.back().PrefixLen = prefixLen; - - const size_t n = Subtokens.size(); - if (n > 1) - CorrectDelimiters(Subtokens[n - 2], suffixChar, Subtokens[n - 1], prefixChar); - - Y_ASSERT(NlpType == NLP_WORD || NlpType == NLP_MARK || NlpType == NLP_INTEGER); - } - void AddIdeograph(size_t len) { - Y_ASSERT(Subtokens.empty()); - Subtokens.push_back(0, len, TOKEN_WORD); - NlpType = NLP_WORD; - } - void SwapSubtokens(TTokenStructure& other) { - Subtokens.swap(other); - } - // returns length of all subtokens including prefix of the first subtoken and suffix of the last subtoken - size_t CorrectPositions() { - Y_ASSERT(!Subtokens.empty()); - // position of the first subtoken can be non-zero in case of non-first subtoken - // but TWideToken::Token must point to the first character of the first subtoken (prefix included if any) - const size_t pos = Subtokens[0].Pos - Subtokens[0].PrefixLen; - if (pos) { - const size_t n = Subtokens.size(); - for (size_t i = 0; i < n; ++i) - Subtokens[i].Pos -= pos; - } - Y_ASSERT(Subtokens[0].Pos == Subtokens[0].PrefixLen); // PrefixLen can be equal to 0 - return Subtokens.back().EndPos() + Subtokens.back().SuffixLen; - } - void UpdateSuffix() { - if (Subtokens.empty()) - Y_ASSERT(!"can't update suffix: no subtokens"); - else - Subtokens.back().SuffixLen += 1; - } - size_t GetSuffixLength() const { - return Subtokens.empty() ? 0 : Subtokens.back().SuffixLen; - } - void ResetSuffix() { - if (!Subtokens.empty()) { - Subtokens.back().SuffixLen = 0; - } - } - void CorrectLastToken(TCharSpan& last) { - Y_ASSERT(Subtokens.size() == MAX_SUBTOKENS); - last = Subtokens.back(); - Subtokens.pop_back(); - // change delimiter (+) to suffix - TCharSpan& lasttok = Subtokens.back(); - // actually '+' should be added if subtoken has suffix '+' because '++' is valid suffix as well - if (lasttok.TokenDelim == TOKDELIM_PLUS && lasttok.SuffixLen == 0) - lasttok.SuffixLen = 1; - else if (lasttok.TokenDelim == TOKDELIM_AT_SIGN && last.PrefixLen == 0) - last.PrefixLen = 1; - lasttok.TokenDelim = TOKDELIM_NULL; - } - void Reset() { - Subtokens.clear(); - NlpType = NLP_WORD; - Hyphen = false; - } -}; - -// represents collection of multitokens in TNlpParser -class TNlpParserBase { - TVector<TParserToken> Tokens; // it has at least 1 multitoken - TParserToken* Current; - TCharSpan CurCharSpan; - size_t PrefixLen; - wchar16 PrefixChar; - wchar16 SuffixChar; - -public: - TNlpParserBase() - : Tokens(1) - , Current(&Tokens[0]) - , PrefixLen(0) - , PrefixChar(0) - , SuffixChar(0) - { - } - TParserToken& GetToken(size_t i) { - return Tokens[i]; - } - size_t GetTokenCount() const { - return Tokens.size(); - } - void BeginToken(const wchar16* tokstart, const wchar16* p) { - // it can be called twice in case "exa­́mple", see nlptok.rl, mixedtoken, tokfirst/toknext, numfirst/numnext - if (CurCharSpan.Len == 0) - CurCharSpan.Pos = p - tokstart; - } - void BeginToken(const wchar16* tokstart, const wchar16* p, ETokenType type) { - BeginToken(tokstart, p); - CurCharSpan.Type = type; - } - void UpdateToken() { - CurCharSpan.Len += 1; - } - void AddToken() { - Y_ASSERT(CurCharSpan.Len); - Y_ASSERT(CurCharSpan.Type == TOKEN_WORD || CurCharSpan.Type == TOKEN_NUMBER); - - if (Current->GetSubtokenCount() == MAX_SUBTOKENS) { - TCharSpan last; // for backward compatibility the last subtoken of the previous multitoken is popped and ... - Current->CorrectLastToken(last); - Tokens.push_back(TParserToken(last)); // ... added to the front of the new multitoken - Current = &Tokens.back(); // new parser token, Current reassigned immediately after push_back() - } - - Current->AddSubtoken(CurCharSpan, PrefixLen, PrefixChar, SuffixChar); - - CurCharSpan.Pos = 0; - CurCharSpan.Len = 0; // it is checked in AddLastToken() - PrefixLen = 0; - PrefixChar = 0; - SuffixChar = 0; - } - void AddIdeograph(size_t len) { - Y_ASSERT(!CurCharSpan.Len && (len == 1 || len == 2)); - Current->AddIdeograph(len); - } - void AddLastToken(const wchar16* tokstart, const wchar16* tokend) { - // - CurCharSpan.Len assigned to 0 in AddToken() because in case of multitoken with '.' at the end, for - // example: " well-formed. " parser already called to %add_token because '.' can be delimiter of the next token - if (CurCharSpan.Len) { - const wchar16* const actualStart = tokstart + CurCharSpan.Pos; - // for ex. "5% " can have (actualStart == tokend) because '%' could be part of the next token with utf8 characters - if (actualStart < tokend) { - const size_t actualLen = tokend - actualStart; - if (CurCharSpan.Len != actualLen) // for example "WORD% NEXTWORD" - '%' could be part of UTF8 encoded character and already counted... - CurCharSpan.Len = actualLen; - AddToken(); - } else - CancelToken(); - } else - CancelToken(); - - if (Current->GetSubtokenCount()) - Current->SetTokenDelim(TOKDELIM_NULL); // reset delimiter if any - } - void UpdatePrefix(wchar16 c) { - Y_ASSERT(c == '#' || c == '@' || c == '$'); - PrefixLen = 1; // length of prefix can't be more than 1 - PrefixChar = c; - } - void UpdateSuffix(wchar16 c) { - Y_ASSERT(c == '#' || c == '+'); - Current->UpdateSuffix(); - SuffixChar = c; - } - TParserToken* GetCurrentToken() { - return Current; - } - void CancelToken() { - // example: "abc 5% def", '%' can be the first symbol of utf8 encoded character so token is started by call to BeginToken() - // and then UpdateToken() is called as well but there is no call to AddToken() because '%' is interpreted as a misc character so - // CurCharSpan.Len must be reset - CurCharSpan.Len = 0; - PrefixLen = 0; - PrefixChar = 0; - SuffixChar = 0; - } - void ResetTokens() { - Tokens.resize(1); - Current = &Tokens[0]; - Current->Reset(); - } - void SetSoftHyphen() { - Current->SetHyphen(HYPHEN_SOFT); - } - void SetHyphenation() { - Current->SetHyphen(HYPHEN_ORDINARY); - } - void SetTokenDelim(ETokenDelim delim, wchar16 /*c*/) { - Current->SetTokenDelim(delim); - } -}; diff --git a/library/cpp/tokenizer/nlptok_v2.rl6 b/library/cpp/tokenizer/nlptok_v2.rl6 deleted file mode 100644 index b8c525cbc18..00000000000 --- a/library/cpp/tokenizer/nlptok_v2.rl6 +++ /dev/null @@ -1,177 +0,0 @@ -#include <algorithm> -#include <cstring> - -#ifdef NLP_DEBUG -# include <util/string/printf.h> -#endif - -#include <util/generic/yexception.h> -#include <library/cpp/tokenizer/nlpparser.h> - -#ifdef __clang__ - #pragma clang diagnostic ignored "-Wunused-variable" -#endif - -%%{ - machine NlpLexerDefinitions; - include Symbols "symbols.rl"; - - sp = cc_space | cc_nbsp; - nlf = (yc_cr ? yc_cr ? yc_lf @1) | (yc_cr @0); # '\r'?'\r'?'\n'|'\r', with priorities; - nlfasblank = sp{,4} nlf sp{,4}; - blankornlf = sp{1,4} | nlfasblank; - hyphenation = cc_minus.nlfasblank; - dashopen = cc_minus.blankornlf; - dashclose = blankornlf.cc_minus; - open = cc_openpunct | dashopen; - close = cc_clospunct | dashclose; - wordbreak = cc_zero; - - sep = cc_tab | cc_space; # [ \t]; - nobrmisc = miscnlp - yc_lf - yc_cr - termpunct; - blank1 = sep | cc_nbsp; - parap2 = nlf.nobrmisc*.nlf - nlf; - abzs5 = nlf.blank1.blank1.blank1.blank1.blank1; - abzparabreak = (parap2 | abzs5).(nobrmisc | yc_lf | yc_cr)*; - - action mark_sentence_break { - MarkSentenceBreak(p); - } - - action ensure_sentence_break { - EnsureSentenceBreak(p); - } - - action reset_sentence_break { - ResetSentenceBreak(); - } - - sentprefixchar = cc_openpunct | cc_minus | cc_plus | tokprefix | cc_copyrightsign | cc_asterisk; - sentprefix = ( ( sentprefixchar+ >mark_sentence_break sp* ) )? ( ytitle >ensure_sentence_break ); - sentprefix_cjk = ( ( sentprefixchar+ >mark_sentence_break sp* ) )? ( cjk_title >ensure_sentence_break ); - - betweensent = miscnlp - cc_comma - cc_numerosign - yc_lf - yc_cr - cc_ampersand; - # TODO: it could be introduced "conditional" and "unconditional" sentence breaks, i.e. - # "conditional" sentence break: "." spaces "capital alpha" - # "unconditional" sentence break: ('?'+ | '!'+ | '.'{2,}) spaces "capital alpha" - miscsent_general = ( termpunct+ >reset_sentence_break ) betweensent* ( yc_sp | cc_nbsp | wordbreak )+ betweensent* sentprefix; - # The spaces between sentences are not obligatory - miscsent_cjk = ( cjk_termpunct+ >reset_sentence_break ) betweensent* ( yc_sp | cc_nbsp | wordbreak )* betweensent* sentprefix_cjk; - miscsent = miscsent_general | miscsent_cjk; - - action set_softhyphen { - SetSoftHyphen(); - } - - action set_hyphenation { - SetHyphenation(); - } - - nowordbreak = ( ( cc_softhyphen+ %set_softhyphen ) | ( hyphenation %set_hyphenation ) ); -}%% - -%%{ - machine NlpLexer; - include NlpLexerDefinitions; - - # - token can't consist of accents only - # - accent should follow accented symbol but if accent is in the front of token it is interpreted as a part of token - # - accent can follow nowordbreak symbol (for ex. " exa­́mple ", it can be checked in a browser, actually it is the same - # as " exá­mple ") and in this case it will be the first symbol of the next token, so 'accent*' is added to the front - # of the 'nexttoken' parser - # - accent can follow token delimiter and is the first symbol of the next token in this case - # - accent can follow not a misc. character but for ex. termpunct [!.;?], in this case it will be considered as - # the start symbol of token: 'text!́token' - # - do not convert less than 2 utf8 bytes because all national symbols encoded minimum in 2 utf8 bytes - # quite often single encoded bytes are in docs but they cause to many misoperations: 1000%3000, %action, etc. - - tokchar = ( yalpha ); - - include MultitokenDef "multitoken_v2.rl"; - - main := |* - - # multitoken/integer - ( compositemultitoken | ( ( tokprefix $update_prefix )? multitoken ( nowordbreak multitoken )* toksuffix? ) ) { - ProcessMultitoken(ts, te); - }; - - ( cc_surrogatelead | cc_surrogatetail )+ { - ProcessSurrogatePairs(ts, te); - }; - - ( cc_ideograph+ ) { - ProcessIdeographs(ts, te); - }; - - #sentbreak - ( miscsent ) { - p = ts + MakeSentenceBreak(ts, te - ts) - 1; - }; - - abzparabreak { - MakeEntry(ts, te - ts, SpacePreserve ? NLP_PARABREAK : NLP_MISCTEXT); - }; - - # misc - # tokprefix subtracted because this parser eats the prefix symbol (#@$) of token - # ( .. )+ this plus causes to consider accent in the front of word as miscnlp in case: [a 'cd] -> [a][ '][cd] - # at the same time if accent is in the beginning of the string it is a part of word: ['cd] - # if this plus is removed then in both cases accents will be parts of the words - # BUT the plus should not be removed from the parser because of performance - # since accent should follow accented symbol this behavior is OK - ( nobrmisc - tokprefix )+ { - CancelToken(); - MakeEntry(ts, te - ts, NLP_MISCTEXT); - }; - - # fallback - ( othermisc+ ) { -#ifdef NLP_DEBUG - Cdbg << Sprintf("met othermisc at %p\n", (void *)ts); - Cdbg.write(ts, te - ts); - Cdbg << Endl; -#endif - CancelToken(); - MakeEntry(ts, te - ts, NLP_MISCTEXT); - }; - - ( yc_lf+ | yc_cr+ | termpunct+ ) { - CancelToken(); - MakeEntry(ts, te - ts, NLP_MISCTEXT); - }; - - # single char scanner because prefixes must be a part of token - ( tokprefix ) { - CancelToken(); - MakeEntry(ts, te - ts, NLP_MISCTEXT); - }; - - EOF { - Y_ASSERT(*ts == 0); - MakeEntry(ts, 1, NLP_MISCTEXT); - }; - - *|; - - write data; -}%% - -template<> void TVersionedNlpParser<2>::ExecuteImpl(const unsigned char* text, size_t len) { - Y_ASSERT(text); - Text = text; - const unsigned char *p = text, *pe = p + len; // 'pe' must never be dereferenced - const unsigned char *ts, *te, *eof = pe; - int act, cs; - - %% write init; - %% write exec; - - if (cs == NlpLexer_error) - throw yexception() << "execute error at position " << static_cast<int>(p - text); - else if (cs < NlpLexer_first_final) - throw yexception() << "execute finished in non-final state"; - - Y_UNUSED(act); -} - diff --git a/library/cpp/tokenizer/nlptok_v3.rl6 b/library/cpp/tokenizer/nlptok_v3.rl6 deleted file mode 100644 index 453a41bec8f..00000000000 --- a/library/cpp/tokenizer/nlptok_v3.rl6 +++ /dev/null @@ -1,204 +0,0 @@ -#include <algorithm> -#include <cstring> - -#ifdef NLP_DEBUG -# include <util/string/printf.h> -#endif - -#include <util/generic/yexception.h> -#include <library/cpp/tokenizer/nlpparser.h> - -#ifdef __clang__ - #pragma clang diagnostic ignored "-Wunused-variable" -#endif - -%%{ - machine NlpLexerDefinitions; - include Symbols "symbols.rl"; - - sp = cc_space | cc_nbsp; - nlf = (yc_cr ? yc_cr ? yc_lf @1) | (yc_cr @0); # '\r'?'\r'?'\n'|'\r', with priorities; - nlfasblank = sp{,4} nlf sp{,4}; - blankornlf = sp{1,4} | nlfasblank; - hyphenation = cc_minus.nlfasblank; - dashopen = cc_minus.blankornlf; - dashclose = blankornlf.cc_minus; - open = cc_openpunct | dashopen; - close = cc_clospunct | dashclose; - wordbreak = cc_zero; - - sep = cc_tab | cc_space; # [ \t]; - nobrmisc = miscnlp - yc_lf - yc_cr - termpunct; - blank1 = sep | cc_nbsp; - parap2 = nlf.nobrmisc*.nlf - nlf; - abzs5 = nlf.blank1.blank1.blank1.blank1.blank1; - abzparabreak = (parap2 | abzs5).(nobrmisc | yc_lf | yc_cr)*; - - action mark_sentence_break { - MarkSentenceBreak(p); - } - - action ensure_sentence_break { - EnsureSentenceBreak(p); - } - - action reset_sentence_break { - ResetSentenceBreak(); - } - - sentprefixchar = cc_openpunct | cc_minus | cc_plus | tokprefix | cc_copyrightsign | cc_asterisk; - sentprefix = ( ( sentprefixchar+ >mark_sentence_break sp* ) )? ( ytitle >ensure_sentence_break ); - sentprefix_cjk = ( ( sentprefixchar+ >mark_sentence_break sp* ) )? ( cjk_title >ensure_sentence_break ); - - betweensent = miscnlp - cc_comma - cc_numerosign - yc_lf - yc_cr - cc_ampersand; - # TODO: it could be introduced "conditional" and "unconditional" sentence breaks, i.e. - # "conditional" sentence break: "." spaces "capital alpha" - # "unconditional" sentence break: ('?'+ | '!'+ | '.'{2,}) spaces "capital alpha" - miscsent_general = ( termpunct+ >reset_sentence_break ) betweensent* ( yc_sp | cc_nbsp | wordbreak )+ betweensent* sentprefix; - # The spaces between sentences are not obligatory - miscsent_cjk = ( cjk_termpunct+ >reset_sentence_break ) betweensent* ( yc_sp | cc_nbsp | wordbreak )* betweensent* sentprefix_cjk; - miscsent = miscsent_general | miscsent_cjk; - - action set_softhyphen { - SetSoftHyphen(); - } - - action set_hyphenation { - SetHyphenation(); - } - - nowordbreak = ( ( cc_softhyphen+ %set_softhyphen ) | ( hyphenation %set_hyphenation ) ); -}%% - -%%{ - machine NlpLexer; - include NlpLexerDefinitions; - - # - token can't consist of accents only - # - accent should follow accented symbol but if accent is in the front of token it is interpreted as a part of token - # - accent can follow nowordbreak symbol (for ex. " exa­́mple ", it can be checked in a browser, actually it is the same - # as " exá­mple ") and in this case it will be the first symbol of the next token, so 'accent*' is added to the front - # of the 'nexttoken' parser - # - accent can follow token delimiter and is the first symbol of the next token in this case - # - accent can follow not a misc. character but for ex. termpunct [!.;?], in this case it will be considered as - # the start symbol of token: 'text!́token' - # - do not convert less than 2 utf8 bytes because all national symbols encoded minimum in 2 utf8 bytes - # quite often single encoded bytes are in docs but they cause to many misoperations: 1000%3000, %action, etc. - - tokchar = ( yalpha ); - - include MultitokenDef "multitoken_v3.rl"; - - main := |* - - # multitoken/integer - ( compositemultitoken | ( ( tokprefix $update_prefix )? multitoken ( nowordbreak multitoken )* toksuffix? ) ) { - Y_ASSERT(Base.GetCurrentToken()); - if (Y_UNLIKELY(!Base.GetCurrentToken())) { - ProcessMultitoken(ts, te); - LastTokenSuffixLength = 0; - } else { - size_t suffixLength = Base.GetCurrentToken()->GetSuffixLength(); - bool createSuffixToken = Base.GetTokenCount() > 0 && (Base.GetToken(0).GetNlpType() == NLP_WORD || Base.GetToken(0).GetNlpType() == NLP_INTEGER || Base.GetToken(0).GetNlpType() == NLP_MARK); - if (!KeepAffixes) { - Base.GetCurrentToken()->ResetSuffix(); - } - ProcessMultitoken(ts, te); - if (createSuffixToken) { - if (!KeepAffixes) { - for (size_t i = suffixLength; i > 0; --i) { - MakeEntry(te - i, 1, NLP_WORD); - } - } - LastTokenSuffixLength = suffixLength; - } - p -= suffixLength; - } - }; - - ( cc_surrogatelead | cc_surrogatetail )+ { - LastTokenSuffixLength = 0; - ProcessSurrogatePairs(ts, te); - }; - - ( cc_ideograph+ ) { - LastTokenSuffixLength = 0; - ProcessIdeographs(ts, te); - }; - - #sentbreak - ( miscsent ) { - LastTokenSuffixLength = 0; - p = ts + MakeSentenceBreak(ts, te - ts) - 1; - }; - - abzparabreak { - LastTokenSuffixLength = 0; - MakeEntry(ts, te - ts, SpacePreserve ? NLP_PARABREAK : NLP_MISCTEXT); - }; - - # misc - # tokprefix subtracted because this parser eats the prefix symbol (#@$) of token - # ( .. )+ this plus causes to consider accent in the front of word as miscnlp in case: [a 'cd] -> [a][ '][cd] - # at the same time if accent is in the beginning of the string it is a part of word: ['cd] - # if this plus is removed then in both cases accents will be parts of the words - # BUT the plus should not be removed from the parser because of performance - # since accent should follow accented symbol this behavior is OK - ( nobrmisc+ ) { - CancelToken(); - p += MakeMisctextEntry(ts, te - ts, pe - te); - }; - - # fallback - ( othermisc+ ) { - LastTokenSuffixLength = 0; -#ifdef NLP_DEBUG - Cdbg << Sprintf("met othermisc at %p\n", (void *)ts); - Cdbg.write(ts, te - ts); - Cdbg << Endl; -#endif - CancelToken(); - MakeEntry(ts, te - ts, NLP_MISCTEXT); - }; - - ( yc_lf+ | yc_cr+ | termpunct+ ) { - LastTokenSuffixLength = 0; - CancelToken(); - p += MakeMisctextEntry(ts, te - ts, pe - te); - }; - - # single char scanner because prefixes must be a part of token - ( tokprefix ) { - LastTokenSuffixLength = 0; - CancelToken(); - MakeEntry(ts, te - ts, NLP_MISCTEXT); - }; - - EOF { - Y_ASSERT(*ts == 0); - MakeEntry(ts, 1, NLP_MISCTEXT); - }; - - *|; - - write data; -}%% - -void TVersionedNlpParser<3>::ExecuteImpl(const unsigned char* text, size_t len) { - Y_ASSERT(text); - Text = text; - const unsigned char *p = text, *pe = p + len; // 'pe' must never be dereferenced - const unsigned char *ts, *te, *eof = pe; - int act, cs; - - %% write init; - %% write exec; - - if (cs == NlpLexer_error) - throw yexception() << "execute error at position " << static_cast<int>(p - text); - else if (cs < NlpLexer_first_final) - throw yexception() << "execute finished in non-final state"; - - Y_UNUSED(act); -} - diff --git a/library/cpp/tokenizer/sentbreakfilter.cpp b/library/cpp/tokenizer/sentbreakfilter.cpp deleted file mode 100644 index aa75dc47cea..00000000000 --- a/library/cpp/tokenizer/sentbreakfilter.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include "sentbreakfilter.h" - -#include <util/generic/singleton.h> -#include <util/memory/pool.h> - -namespace { - inline bool IsEnglishCapitalLetter(wchar16 c) { - return (c >= 'A' && c <= 'Z'); - } - - inline bool AreAllDelims(const TWideToken& tok, ETokenDelim delim) { - const TTokenStructure& subtokens = tok.SubTokens; - - if (subtokens.size() == 1) - return false; // it isn't multitoken - - const size_t last = subtokens.size() - 1; - for (size_t i = 0; i < last; ++i) { - const TCharSpan& s = subtokens[i]; - if (s.TokenDelim != delim) - return false; - } - - return true; - } - -} - -TSentBreakFilter::TSentBreakFilter(TLangMask langMask) - : LastType(NLP_END) - , SentLen(0) - , Abbreviations(Singleton<TAbbreviationsDictionary>()) - , LangMask(langMask) -{ - LastToken.Token = Buffer; -} - -bool TSentBreakFilter::IsAbbrevation(const TWtringBuf& text) { - const TTokenStructure& subtokens = LastToken.SubTokens; - Y_ASSERT(Abbreviations); - - wchar16* lastStart = Buffer + subtokens.back().Pos; - size_t lastLen = subtokens.back().Len; - ToLower(lastStart, lastLen); - TWtringBuf lastSubtoken(lastStart, lastLen); - - // it can never be a sentence break - // @todo sentence break should be in the following cases: - // ... dB/km. Next sentence. - // ... Gbyte/min. Next sentence. - // ... etc.). Next sentence. - if (Abbreviations->NeverBreak(lastSubtoken, LangMask)) { - return true; - } - - // if it is followed by a digit - not a sentence break - if (IsDigit(text.back()) && Abbreviations->DontBreakIfBeforeDigit(lastSubtoken, LangMask)) { - return true; - } - - // test for abbreviations that consist of two subtokens - if (subtokens.size() > 1) { - wchar16* lastTwoStart = Buffer + subtokens[subtokens.size() - 2].Pos; - size_t lastTwoLen = subtokens.back().Pos + - subtokens.back().Len - - subtokens[subtokens.size() - 2].Pos; - ToLower(lastTwoStart, lastTwoLen); - TWtringBuf lastTwoSubtokens(lastTwoStart, lastTwoLen); - - if (Abbreviations->DoubleSubtokenNeverBreak(lastTwoSubtokens, LangMask)) { - return true; - } - - if (IsDigit(text.back()) && Abbreviations->DoubleSubtokenDontBreakIfBeforeDigit(lastTwoSubtokens, LangMask)) { - return true; - } - } - - return false; -} - -NLP_TYPE TSentBreakFilter::OnSentBreak(const wchar16* text, size_t len) { - Y_ASSERT(text && len); - - // @todo such cases could be processed correctly: - // ... NEC Corp.). Next sentence. - // The sentence should be broken because 'Corp.' followed by ').' - - // although '.' in termpunct [!.:?] has a lot of values (yc_2E = 0x002E | 0x037E | 0x0387 | 0x0589 | ..., see charclasses_16.rl) - // only '.' is used to abbreviate words in russian, english and other european languages - if (*text == '.') { - if (LastType == NLP_INTEGER && SentLen == 1) { - // don't break sent. in case of numbered lists (html tag <OL> - ordered list), for ex. 1. 02. 10. [17]. 22). 125. etc. - // actually numbers less than 10 would be processed by the next rule - (LastToken.Leng == 1) - return NLP_MISCTEXT; - // multilevel numbered lists are not processed, for ex. 1.2. 2.1 10.1.2. etc. - // @todo probably sent. should not be broken if it contains integer numbers only: "10. 11. 12. 13." - // now it is broken after "11.": "10. 11.\n12. 13." - } else if (LastToken.Leng == 1) { // John F. Kennedy, A. Pushkin; @todo (LastType != NLP_INTEGER && LastToken.Leng == 1) ? - // ascii emoji parts "hello :)." are processed as 1-character words but should not stop sentence breaks - //if (!IsDigit(*LastToken.Token)) // what about processing numbered lists? - return (*LastToken.Token >= 0x80 || IsAlnum(*LastToken.Token)) ? NLP_MISCTEXT : NLP_SENTBREAK; - // @todo sentence break should be in the following cases: - // ... km/s. Next sentence. - // ... pict. 1. Next sentence. - // ... under OS/2. Next sentence. (at the same time numbered lists should not be a sentence: 1. It is the first item.) - } - - const TTokenStructure& subtokens = LastToken.SubTokens; - if (!subtokens.empty()) { - Y_ASSERT(LastToken.Token == Buffer); - const TCharSpan& lastSubtokenSpan = subtokens.back(); - if (lastSubtokenSpan.Len == 1) { - if (LastType != NLP_INTEGER && - lastSubtokenSpan.Type == TOKEN_NUMBER && - AreAllDelims(LastToken, TOKDELIM_DOT)) - { - return NLP_MISCTEXT; // Pict.1. Diagram. - } - - if (LastType == NLP_WORD && AreAllDelims(LastToken, TOKDELIM_DOT)) // && all tokens len == 1) - { - return NLP_MISCTEXT; // P.S. - } - - if (LastType == NLP_WORD && subtokens.size() == 2) { - const TCharSpan& s0 = subtokens[0]; - const TCharSpan& s1 = subtokens[1]; - // if (s0.Len == 1 && s1.Len == 1 && s0.TokenDelim == TOKDELIM_DOT) - // return NLP_MISCTEXT; - - // the following initials can be in English: H-P. Kriegel, J-C. Freytag - //const TCharSpan& s0 = subtokens[0]; - //const TCharSpan& s1 = subtokens[1]; - if (s0.Len == 1 && s1.Len == 1 && - IsEnglishCapitalLetter(LastToken.Token[s0.Pos]) && - IsEnglishCapitalLetter(LastToken.Token[s1.Pos]) && - IsEnglishCapitalLetter(text[len - 1])) - { - return NLP_MISCTEXT; - } - } - } - - if (IsAbbrevation(TWtringBuf(text, len))) { - return NLP_MISCTEXT; - } - } - } - - return NLP_SENTBREAK; -} diff --git a/library/cpp/tokenizer/sentbreakfilter.h b/library/cpp/tokenizer/sentbreakfilter.h deleted file mode 100644 index 2ded9c61c5e..00000000000 --- a/library/cpp/tokenizer/sentbreakfilter.h +++ /dev/null @@ -1,130 +0,0 @@ -#pragma once - -#include "tokenizer.h" - -#include <library/cpp/token/nlptypes.h> -#include <library/cpp/langmask/langmask.h> -#include <library/cpp/token/token_structure.h> - -#include <util/generic/hash_set.h> -#include <util/generic/noncopyable.h> -#include <util/system/maxlen.h> -#include <util/system/yassert.h> - -constexpr int TOKEN_MAX_LEN = 255; -constexpr int TOKEN_MAX_BUF = 256; - -/// Dictionary with abbreviations that can prevent sentence from breaking. -/** For each language there are two hash sets, first with abbreviations - * that can never appear at the end of sentence ant second with - * abbreviations that doesn't break sentence if there is a digit afterwards. - * The dictionaries are initialized from static arrays in the constructor (see - * abbreviations.cpp). - * @note The LANG_UNK language code is used for common abbreviations; they are - * checked for any input language mask. - */ -class TAbbreviationsDictionary: private TNonCopyable { -private: - THashSet<TUtf16String> NeverBreakSets[LANG_MAX]; - THashSet<TUtf16String> DontBreakIfBeforeDigitSets[LANG_MAX]; - THashSet<TUtf16String> DoubleSubtokenNeverBreakSets[LANG_MAX]; - THashSet<TUtf16String> DoubleSubtokenDontBreakIfBeforeDigitSets[LANG_MAX]; - - void AddElements(THashSet<TUtf16String>& hashSet, - const char* elements[], - size_t size); - - bool FindInHashSets(const THashSet<TUtf16String>* hashSets, - const TWtringBuf& string, - TLangMask langMask) const { - if (hashSets[LANG_UNK].find(string) != hashSets[LANG_UNK].end()) { - return true; - } - - for (ELanguage lang : langMask) { - if (hashSets[lang].find(string) != hashSets[lang].end()) { - return true; - } - } - - return false; - } - -public: - TAbbreviationsDictionary(); - - /// Functions for testing if the string is an abbreviation - /** @note The functions return true if the string is an abbreviation in - * any language from the langMask. - * @note The common abbreviations are checked on any call, even if the - * langMask is empty. - */ - - /// Test if the string cannot appear at the end of the sentence - bool NeverBreak(const TWtringBuf& string, TLangMask langMask) const { - return FindInHashSets(NeverBreakSets, string, langMask); - } - - /// Test if the string cannot break sentence before digit - bool DontBreakIfBeforeDigit(const TWtringBuf& string, - TLangMask langMask) const { - return FindInHashSets(DontBreakIfBeforeDigitSets, string, langMask); - } - - /// Test if the double-subtoken string cannot appear at the end of the sentence - bool DoubleSubtokenNeverBreak(const TWtringBuf& string, - TLangMask langMask) const { - return FindInHashSets(DoubleSubtokenNeverBreakSets, string, langMask); - } - - /// Test if the double-subtoken string cannot break sentence before digit - bool DoubleSubtokenDontBreakIfBeforeDigit(const TWtringBuf& string, - TLangMask langMask) const { - return FindInHashSets(DoubleSubtokenDontBreakIfBeforeDigitSets, - string, - langMask); - } -}; - -//! @todo implement a functionality never generating sentence breaks (for document titles for ex.); -//! probably controlling of sentence length (<=WORD_LEVEL_Max) should implement in this class. -class TSentBreakFilter: private TNonCopyable { -private: - TWideToken LastToken; - NLP_TYPE LastType; - wchar16 Buffer[TOKEN_MAX_BUF]; //!< text in this buffer is not null-terminated - size_t SentLen; //!< counts only whole tokens (not subtokens): 1.1 and S.F - single tokens - - const TAbbreviationsDictionary* const Abbreviations; - - TLangMask LangMask; - -private: - bool IsAbbrevation(const TWtringBuf& text); - -public: - TSentBreakFilter(TLangMask langMask); - - //! @attention if token is WORD, MARK, etc. then its length must not be greater than TOKEN_MAX_LEN, see TNlpParser::MakeEntry() - void OnToken(const TWideToken& token, NLP_TYPE type) { - if (type == NLP_WORD || type == NLP_INTEGER || type == NLP_FLOAT || type == NLP_MARK) { - Y_ASSERT(token.Leng <= TOKEN_MAX_LEN); - LastType = type; - std::char_traits<wchar16>::copy(Buffer, token.Token, token.Leng); - //LastToken.Token = Buffer; assigned in the constructor - LastToken.Leng = token.Leng; - LastToken.SubTokens = token.SubTokens; - ++SentLen; // += token.SubTokens.size(); ? - } else if (type == NLP_SENTBREAK || type == NLP_PARABREAK) { - SentLen = 0; - } else - Y_ASSERT(type == NLP_MISCTEXT || type == NLP_END); - } - - //! @note @c len includes the first letter (or digit) of the next sentence - //! @attention in case of ambiguity it is preferable not to break sentence because - //! it will look like a compound sentence, - //! at the same time sentence can have maximum 64 words so sentence must not - //! be too long or it is broken after arbitrary word - NLP_TYPE OnSentBreak(const wchar16* text, size_t len); -}; diff --git a/library/cpp/tokenizer/special_tokens.cpp b/library/cpp/tokenizer/special_tokens.cpp deleted file mode 100644 index 141ea9ac065..00000000000 --- a/library/cpp/tokenizer/special_tokens.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "special_tokens.h" - -#include <library/cpp/containers/comptrie/set.h> - -#include <util/generic/singleton.h> - -namespace { - extern "C" { - extern const unsigned char SpecialTokens[]; - extern const ui32 SpecialTokensSize; - } - - class TSpecialTokensSet: public TCompactTrieSet<wchar16> { - public: - TSpecialTokensSet(): TCompactTrieSet<wchar16>(reinterpret_cast<const char*>(SpecialTokens), SpecialTokensSize) - { - } - }; - - auto SpecialTokensSet = Singleton<TSpecialTokensSet>(); -} - -size_t GetSpecialTokenLength(const wchar16* text, size_t maxLen) { - size_t resultLen = 0; - SpecialTokensSet->FindLongestPrefix(text, maxLen, &resultLen); - return resultLen; -} diff --git a/library/cpp/tokenizer/special_tokens.h b/library/cpp/tokenizer/special_tokens.h deleted file mode 100644 index 1a6dc686c7b..00000000000 --- a/library/cpp/tokenizer/special_tokens.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include <util/charset/wide.h> - -size_t GetSpecialTokenLength(const wchar16* text, size_t maxLen); diff --git a/library/cpp/tokenizer/special_tokens.txt b/library/cpp/tokenizer/special_tokens.txt deleted file mode 100644 index 00302fa8f83..00000000000 --- a/library/cpp/tokenizer/special_tokens.txt +++ /dev/null @@ -1,1286 +0,0 @@ -`` -`_' -`-_-' -`,`,`,`,`:| -`:-| -`:-) -`' -`'~,.,~'`'~,.,~'`'~,.,~'`'~,.,~' -`@_____ -`@;;;;;;;;;;; -^^ -^^^ -^^; -^^;;; -^~^ -^= -^=^ -^_^ -^_^;;; -^_~ -^_- -^_+ -^;^ -^?-) -^.~ -^..^__)~ -^( -^(^ -^)^ -^*_*^ -^+^ -~^~^~'====>`~^~^~^~^~ -~~ -~~~ -~~~~> -~~~~:> -~~~<*,^^,-- -~~:-( -~~(*:= -~= -~=~ -~===[] -~_^ -~_~ -~: -~:-( -~:@ -~!~ -~.~ -~(:-| -~(:-) -~(:) -~{+.+}~ -~\\ -<^_^> -<^: -<~_~> -<< -<<< -<<<< -<<<<(:-) -<<<|->[ -<<= -<<>><<>><<>><<>><<>> -<<:= -<= -<=> -<> -<>< -<>:-) -<>:{(} -<|<|= -<|-| -<|-( -<|-(= -<|-) -<|-)= -<|:-) -<|) -<|*} -<|## -<- -<-| -<-_-> -<-- -<--- -<-.~> -<-.-> -<-) -<,-? -<;-{( -<:~__)- -<:~_)-- -<:<)} -<:>== -<:>:<:>:<:>:<:>:<:>:<:>: -<:|-|)< -<:-( -<:-) -<:-)<<| -<:-} -<:-@ -<:) -<!-- -</ -</> -<.(@) -<'>< -<'___)~ -<')))))>< -<",_,}-._ -<"}}}><\ -<(: -<) -<[=][ -<{:-)} -<@_@> -<$_$> -<*_*> -<*-) -<*,^^,-- -<*:-) -<*(:-? -<\\\\>(-: -<& -<&&> -<% -<%= -<%-) -<+|:') -<+|:'@=== -<+_+> -<+-< -=^~^= -=^-^= -=^.^= -=^..^= -=^) -== -=== -==== -===========:::? -=====> -=====:} -====|:-)= -====[] -====**:. -===> -===...=== -==> -==|:-) -==----------- -==:< -==:%(== -==...* -==)---------- -==#== -=> -=|:=) -=|:-) -=|:-)= -=_ -=- -=-<> -=-) -=-)) -=-)*** -=-} -=; -=;= -=: -=:~) -=:=| -=:-( -=:-() -=:-) -=:-)= -=:-#( -=:-#} -=:) -=/ -=' -=" -="/ -="// -="'+ -="" -=""> -="{ -="+ -=( -=(:-) -=) -=)||) -=)--- -=):-) -=)(= -=)) -=[<={[ -=]:-)= -={:-)] -=\\\\\\\(============================- -=& -=&- -=&* -=&+ -=# -=% ->^ ->^..^< ->< -><`> -><; -><:>== -></ ->= ->> ->>= ->>> ->>>> ->>>>>:============ ->>----> ->>-----> ->>:= ->>) ->| ->|-> ->|( ->- ->-^);> ->-< ->-> ->----(^_^)----< ->-) ->, ->; ->;< ->;<*>-|--< ->;-> ->;-(' ->;-) ->: ->:^( ->:> ->:-< ->:-> ->:-| ->:-( ->:-) ->:-@ ->:-* ->::< ->:) ->:} ->:*) ->')|||||||||||<< ->" ->(((((*. ->) ->[:^) ->[]< ->]} ->{|> ->& ->%) -|^) -|~( -|< -|<:-) -|= -|><| -|| -||| -||||||[::]||||||||||||| -||{}, -||*( -||*) -|- -|-<> -|-| -|-- -|---- -|-/ -|-( -|-(= -|-(:-| -|-) -|-[#] -|-{ -|:-| -|:-) -|:/ -|:[' -|:] -|/ -|/|\|/|\|/|\|/|\| -|.| -|( -|) -|[*] -|# -|#|[:](|) -__~~~~~~__ -_________@@__________ -___,,,,,,,,,,,,,,,,,,___ -___/<^>\___ -__/~`-'~\_/ -__@/ -_-~-_-~-* -_-_ -_--_ -_:^) -_:-) -_/ -_/^\/^\_ -_/\_ -_/\, -_._ -_./// -_."._."._."._."._."._."._ -_( -_(:-| -_) -_[ -_\|/_ -_\\// --<=+ --= --==|)- --=:\:=- --=*:-) --=#:-) --> -->- -->" --|=====- --|====- --|===- --|--- --|---- --|------- --_ --_- --- ---^ ---=<> ---=\=---=\=--- ---> ---| ---|-- ---- ----<---@ ----> ----|=== -----> ------ -------> --------|- ---------- ---------{} -------(:-) -----,-<-'--<@ -----)==== -----][ -----{,_,"> -----* -----## ----... ----...--- ----( ----[ ---//-->< ---. ---(_~:> ---[[ --,- --; --: --:= --:-( --:-) --:) --/ --/- --.- --' --" --( --(:-) --) --): --[ --] --**-** --**-**: --% --+ --+# --+#:|-|-< --+#:)->-< -,---'---'---'---=@=== -,-) -,-} -,,,^._.^,,, -,,,^..^,,, -,: -,:-| -,:-) -,':-) -,[]= -,*' -;^? -;^) -;> -;>) -;_; -;- -;-| -;-? -;-'] -;-( -;-) -;-)}<////> -;-} -;-\ -;, -;; -;:-) -;" -;">< -;( -;) -;} -;@ -;& -:^" -:^( -:^) -:^{ -:^{)> -:^$ -:~-( -:~-) -:~/ -:~( -:~(~~ -:~(~~~ -:~) -:< -:<= -:<| -:</ -:<() -:<) -:<)= -:= -:=| -:=: -:=( -:=) -:> -:>) -:| -:_ -:_) -:- -:-` -:-~) -:-< -:-<> -:-<) -:-=| -:-=( -:-=) -:-> -:->-< -:-| -:-|| -:-|, -:-|:-| -:------------) -:----} -:--) -:--] -:-, -:-: -:-! -:-? -:-/ -:-. -:-... -:-.) -:-' -:-'| -:-" -:-( -:-(= -:-(=) -:-(>~ -:-(( -:-() -:-(*) -:-) -:-)` -:-)~ -:-)~~~ -:-)<////> -:-)= -:-)== -:-)=== -:-)>- -:-)| -:-)-- -:-):-):-) -:-)!!! -:-)/ -:-)/\/\/\/\/\/\/ -:-)/\(-: -:-)... -:-).... -:-)' -:-)(-: -:-)) -:-))) -:-)} -:-)* -:-)\ -:-)## -:-[ -:-[] -:-[#] -:-] -:-{ -:-{~ -:-{) -:-{)} -:-{} -:-{#} -:-} -:-@ -:-@%$# -:-$ -:-* -:-*| -:-*) -:-\ -:-& -:-# -:-#| -:-% -:-+ -:,-( -:,( -:: -::=)) -::--(( -::--)) -::-) -::-{} -::: -:::-) -::::::========------= -:::) -::(:-) -:? -:?) -:/=: -:/) -:/\) -:' -:'-( -:'-) -:'( -:') -:'} -:( -:(=) -:) -:)~ -:)~~(: -:)= -:)> -:)->()<]: -:)) -:))) -:)))) -:)% -:[ -:] -:{ -:{) -:{} -:} -:@ -:@| -:@) -:$) -:* -:*(@) -:*) -:\\ -:\\/\\/ -:& -:# -:#) -:##) -:###) -:%) -:%)% -:+ -:+( -:+) -!~ -!= -!== -!|:-( -!-| -!-( -!:-| -!! -?-( -?: -?:-) -?:) -/~ -/~~;.;~~\ -/= -/> -/>< -/></ -/| -/|**|`= -/_ -/- -/, -/; -/;-) -/:= -/:> -/:-=( -/:-| -/:-) -//--> -///:-) -/.#( -/'\ -/">< -/( -/) -/), -/)/)/)/)/)/) -/[^ -/* -/*^_^*\ -/*-_-*\ -/** -/\ -/\^.^/\ -/\_/\ -/\!/\ -/\/:/\ -/\*/\ -/\\ -/+ -.^, -.= -._/ -._) -.- -.-~-.-~-.-~ -.-=-. -.--^--. -.---^---. -.---... -.-( -.-) -.-] -.,*~`~*,..,*~`~*,..@ -.; -.: -.! -.? -./\. -..< -..|._ -..|.. -..-) -..-] -...---... -.....+ -...( -." -.) -.): -.)? -.). -.] -.* -.\/ -'> -'></ -'_ -'_` -'- -'-- -'-) -', -',:@ -',' -'; -';/ -': -':-) -':/ -'! -'/ -'' -''- -'', -''' -'') -'" -'( -') -'), -'); -')){ -')}">< -'] -']( -'}} -'\ -'+ -"< -">< -"></ -":[" -":[{" -":{" -"/ -"/> -"/></ -"._." -") -"); -")) -")[ -"[ -"] -"} -"},{" -"}]} -"}} -"@ -"* -"\\ -"+ -(`.') -(^=^) -(^>&) -(^|^) -(^_^) -(^-^) -(^.`') -(^.^) -(^.^)/ -(^)_(^) -(^*^) -(^#^) -(~ -(~~ -(< -(<>..<>) -(= -(==) -(=_=)~ -(=(:->* -(> -(><) -(>_<) -(>'.'<) -(>@ -(|-| -(|-( -(|:-) -(|:-# -(|) -(_^^_) -(_^_) -(_^?_) -(_~_) -(_<>_) -(_|_) -(______(_____________()~~~~~~~~~ -(_____((____________()~~~~~~~~ -(__!__) -(_!__) -(_!_) -(_?_) -(_/_) -(_._) -(_@_) -(_$_) -(_*_) -(_#_) -(_##_) -(_+_) -(-|---( -(-|-) -(-_-) -(----> -(-: -(-:|:-) -(-::-) -(-) -(-@-) -(, -(,'%/) -(;.;)/~ -(: -(:^( -(:<> -(:<) -(:= -(:=< -(:=) -(:> -(:>-< -(:>)$$$$$$$$$$$ -(:>} -(:- -(:->) -(:-| -(:-... -(:-( -(:-) -(:-)>+ -(:-)" -(:-))-|-< -(:-)} -(:-[ -(:-{~ -(:-$ -(:-* -(:-\ -(:-& -(:-# -(:/] -(:)-) -(:[ -(:\/ -(:+) -(!) -(?:?) -(/ -(./\.) -(.)_(.) -(.)(.) -(' -('.`) -(" -("_") -((: -((:- -() -())=( -([ -([( -(]====[) -(]:-) -({ -({{ -(@ -(@_@) -(@.@) -(@)(@) -(@@) -($_$) -($) -($)($) -(* -(*^_^*) -(*_*) -(*_*} -(*,*) -(*)--(*) -(*): -(*)(*) -(** -(\):-) -(& -(#-[ -(#.#) -(#)---== -(##] -(% -(%_%) -(%) -(+ -(+) -)</ -)= -)|-[ -)-: -)-:|<* -)-::-( -)-)-)-)-)-)-)(:-) -), -); -);"> -): -):-( -):-) -)/ -)' -)" -)", -)( -)(*)(*)(*)(*)(*)(*)(*)( -)){ -)* -)*( -)\\ -[`.`.`.`] -[^_^] -[<(=)>] -[= -[=====] -[===] -[> -[>====] -[>==] -[>|<] -[>----] -[>--] -[| -[|*|] -[->|<-] -[-----] -[---] -[--+--] -[-: -[-:-) -[-] -[-+---] -[-+-] -[:~~~~>)##### -[:>) -[:|] -[:-| -[:-|] -[:-) -[:-] -[::( -[:) -[:] -[/ -[//>< -[' -['-'] -['.'] -[" -[(:-)](:-( -[[ -[] -[{-_-}] -[* -[*>-] -[*] -[#] -[#]| -[+--] -[+] -]^>^[ -]= -]_ -]- -], -]; -];[ -]: -]:> -]:-> -]:-) -]:-)} -]:-] -]:-} -]:( -]:) -]:)|--< -]/ -]" -]( -]) -]); -][ -][/ -]]> -]}} -]# -{= -{=:{) -{=*} -{>:| -{|:-) -{_!_} -{-| -{-) -{-% -{:^=( -{:^>) -{:<> -{:-| -{:-( -{:-) -{:-{)} -{:-} -{:) -{:)>~~ -{:\/ -{/ -{" -{(:-) -{[ -{{ -{{-}}} -{{:-) -{{:: -{{/ -{{' -{{( -{{(>_<)}} -{{{ -{} -{* -{*} -{% -}~; -}</ -}-) -}, -}; -};{ -}:^#) -}:^#}) -}:~#}) -}:> -}:| -}:-< -}:-> -}:-( -}:-) -}:-{| -}::-? -}:( -}" -}"> -}"{ -}(:-( -}) -}); -}{ -}} -}}:-( -}}:-) -}}) -}}{{ -}}% -@<) -@= -@=) -@>-->-- -@>--->---- -@>+-+-- -@|@ -@_@ -@--^--^--^--^------ -@-( -@-) -@;^[) -@:^) -@:= -@:-() -@:-) -@:-)## -@:-[--- -@:-} -@:-\ -@:) -@:] -@:*& -@/ -@.-(@) -@...@ -@(^_^)@ -@(_)~~~ -@(---`--`------ -@)--`---,----- -@}`,---------- -@}-^---,------ -@}->-- -@}--`----,---- -@}--<---<----- -@}-->---->---- -@}----`----^-- -@}----->------ -@}--,--`------- -@}--;---`---- -@}--)----)---- -@}-,-'-- -@}-;--`--- -@},`----------- -@}:-) -@@@:) -@@@@@@:-) -@@@@@@@= -@@@@@@@@:) -@@@@@@@@@@:) -@*~ -@*&$!% -@%<}) -@%&$%& -@%&$%&$\&*@%$#@ -@+ -$-> -$-) -$:-) -$:-} -$:-$ -$! -$(:>( -$(:-| -$$ -$$$ -$$$$ -*^_^* -*~'`^`'~*-,._.,-*~'`^`'~*-,._.,-*~'`^`'~* -*<|<|<|= -*<|:-) -*<|:-)> -*<|:-)) -*<:-) -*<:-)> -*<:{ -*<( -*<(;') -*<(:-) -*= -*| -*|:^)(.)(...) -*- -*-( -*-) -*, -*;* -*: -*:= -*:|) -*:-)) -*:-} -*:* -*:** -*!#^!*,-{\ -*!#^!*:-) -*!#^!*:@) -*!#^!*:@[ -*!#*!^*&~ -*!#*!^*&:-) -*/ -*/:-) -*/* -*.| -*.|... -*.-) -*( -*(^-^)* -*(:-| -*) -*):|| -*):-) -*} -** -**= -**-( -**:-) -*** -****:-) -******:-) -*\:-) -*#*!^*&:-) -*%) -\== -\|:// -\_/ -\,/ -\:^) -\:-) -\/ -\. -\.^./ -\@ -\\/ -\\' -\\" -\\\\ -\\+ -\%*} -&= -&- -&-| -&; -&:= -&:-? -&:-) -&:-)> -&:-] -&:; -&.(.. -&* -&& -&+ -#= -#| -#-| -#-) -#:-) -#:) -#!^~/ -#? -#/\/:) -#(,'%/) -#(: -#[ -### -%^) -%= -%> -%- -%-^ -%-~ -%-| -%-( -%-(|) -%-) -%-{ -%-} -%-\ -%, -%; -%: -%:= -%') -%" -%( -%) -%] -%} -%* -%*:= -%*} -%*@:-( -%*%== -%% -%+{ -%+\ -+<||-) -+<:-| -+<:-) -+<(:-) -+= -+=: -+_^ -+_+ -+- -+-:-/ -+-:-) -+-::(@) -+-( -+-(:-) -+;+ -+:= -+:-) -+/- -+(:-| -+* -++ diff --git a/library/cpp/tokenizer/split.cpp b/library/cpp/tokenizer/split.cpp deleted file mode 100644 index d6f1345aad1..00000000000 --- a/library/cpp/tokenizer/split.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include "split.h" - -#include "tokenizer.h" - -namespace { - class TSimpleTokenHandler: public ITokenHandler { - public: - TSimpleTokenHandler(TVector<TUtf16String>* outTokens, const TTokenizerSplitParams& params) - : Tokens(outTokens) - , Params(params) - { - } - - void OnToken(const TWideToken& token, size_t, NLP_TYPE type) override { - if (!Params.HandledMask.SafeTest(type)) { - return; - } - - Tokens->push_back(TUtf16String(token.Token, token.Leng)); - } - - private: - TVector<TUtf16String>* Tokens; - TTokenizerSplitParams Params; - }; - - class TSimpleSentenceHandler: public ITokenHandler { - public: - TSimpleSentenceHandler(TVector<TUtf16String>* sentences) - : Sentences(sentences) - { - } - - void OnToken(const TWideToken& token, size_t, NLP_TYPE type) override { - CurToken += token.Text(); - - if (type == NLP_SENTBREAK || type == NLP_PARABREAK) { - Flush(); - } - } - - void Flush() { - if (!CurToken.empty()) { - Sentences->push_back(CurToken); - - CurToken = TUtf16String(); - } - } - - private: - TUtf16String CurToken; - TVector<TUtf16String>* Sentences; - }; -} - -const TTokenizerSplitParams::THandledMask TTokenizerSplitParams::WORDS(NLP_WORD); -const TTokenizerSplitParams::THandledMask TTokenizerSplitParams::NOT_PUNCT(NLP_WORD, NLP_INTEGER, NLP_FLOAT, NLP_MARK); - -TVector<TUtf16String> SplitIntoTokens(const TUtf16String& text, const TTokenizerSplitParams& params) { - TVector<TUtf16String> words; - - TSimpleTokenHandler handler(&words, params); - TNlpTokenizer tokenizer(handler, params.BackwardCompatibility); - TTokenizerOptions opts { params.SpacePreserve, params.TokenizerLangMask, params.UrlDecode }; - tokenizer.Tokenize(text.data(), text.size(), opts); - - return words; -} - -TVector<TUtf16String> SplitIntoSentences(const TUtf16String& text, const TTokenizerSplitParams& params) { - TVector<TUtf16String> sentences; - - TSimpleSentenceHandler handler(&sentences); - TNlpTokenizer tokenizer(handler, params.BackwardCompatibility); - TTokenizerOptions opts { params.SpacePreserve, params.TokenizerLangMask, params.UrlDecode }; - tokenizer.Tokenize(text.data(), text.size(), opts); - handler.Flush(); - - return sentences; -} diff --git a/library/cpp/tokenizer/split.h b/library/cpp/tokenizer/split.h deleted file mode 100644 index 11f57f7f0ee..00000000000 --- a/library/cpp/tokenizer/split.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include <library/cpp/enumbitset/enumbitset.h> -#include <library/cpp/langmask/langmask.h> -#include <library/cpp/token/nlptypes.h> - -#include <util/generic/bitmap.h> -#include <util/generic/string.h> -#include <util/generic/vector.h> - -struct TTokenizerSplitParams { -public: - typedef TEnumBitSet<NLP_TYPE, NLP_END, NLP_MISCTEXT + 1> THandledMask; - static const THandledMask WORDS; - static const THandledMask NOT_PUNCT; - -public: - TTokenizerSplitParams(){}; - - TTokenizerSplitParams(const THandledMask& mask) - : HandledMask(mask){}; - -public: - /// Token types to handle, not used in SplitIntoSentences - THandledMask HandledMask = WORDS; - - /// Tokenizer params, see tokenizer.h for detailed explanation - bool BackwardCompatibility = true; - bool SpacePreserve = false; - TLangMask TokenizerLangMask; - bool UrlDecode = true; -}; - -TVector<TUtf16String> SplitIntoTokens(const TUtf16String& text, const TTokenizerSplitParams& params = TTokenizerSplitParams()); -TVector<TUtf16String> SplitIntoSentences(const TUtf16String& text, const TTokenizerSplitParams& params = TTokenizerSplitParams()); diff --git a/library/cpp/tokenizer/symbols.rl b/library/cpp/tokenizer/symbols.rl deleted file mode 100644 index 3a77bd2cad2..00000000000 --- a/library/cpp/tokenizer/symbols.rl +++ /dev/null @@ -1,48 +0,0 @@ -%%{ - machine Symbols; - - include CharacterClasses "charclasses_8.rl"; - - # - # CODES_YANDEX symbols - # - - EOF = cc_zero; - accent = cc_accent; # required for multitoken.rl - - yc_lf = cc_linefeed; # [\n] - yc_cr = cc_carriagereturn; # [\r] - yc_sp = cc_whitespace; # [\t\n\v\f\r ] - - yspecialkey = cc_math_non_ascii | cc_currency_non_ascii | cc_special_non_ascii | cc_numerosign | cc_copyrightsign; - yspecial = accent | cc_softhyphen | cc_nbsp | cc_sectionsign | cc_special | cc_special_non_ascii | cc_numerosign | cc_copyrightsign; - - ydigit = cc_digit; - ycapital = cc_capitalalpha; - ysmall = cc_smallalpha; - - yalpha = ycapital | ysmall | cc_unicasealpha; - yalnum = ydigit | yalpha; - - ytitle = ydigit | ycapital | cc_unicasealpha; # may be at the beginning of sentence - cjk_title = ytitle | cc_ideograph; - ylower = ysmall; # the same as (yalnum - ytitle) - - termpunct = cc_termpunct; - cjk_termpunct = cc_cjk_termpunct; - - # Multitoken composition: delimiters and suffixes - tokdelim = cc_apostrophe | cc_minus; # [\'\-] TODO: add yc_underscore [_] - tokprefix = cc_numbersign | cc_atsign | cc_dollarsign; # [#@$] - - # 1..31 | termpunct | [ \"#\$%&\'()*+,\-/;<=>@\[\\\]\^_\`{|}~] | 0x7F | yspecial - # yc_07 and yc_1B do not exist - miscnlp = - (cc_nbsp | - cc_misctext | - yspecial) - yspecialkey; - - # fallback - othermisc = any - yalnum - cc_zero - miscnlp - cc_ideograph - cc_surrogatelead - cc_surrogatetail - yspecialkey; -}%% - diff --git a/library/cpp/tokenizer/tokenizer.cpp b/library/cpp/tokenizer/tokenizer.cpp deleted file mode 100644 index 948271a2857..00000000000 --- a/library/cpp/tokenizer/tokenizer.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef CATBOOST_OPENSOURCE -#include <library/cpp/charset/wide.h> -#endif - -#include <util/charset/wide.h> -#include <util/memory/tempbuf.h> - -#include "sentbreakfilter.h" -#include "nlpparser.h" -#include "tokenizer.h" - -#include <util/stream/file.h> - -void TNlpTokenizer::Tokenize(const wchar16* str, - size_t size, - const TTokenizerOptions& opts) { - bool semicolonBreaksSentence = opts.LangMask == TLangMask(LANG_GRE); - TSentBreakFilter sentBreakFilter(opts.LangMask); - THolder<TNlpParser> parser; - switch (opts.Version) { - case 2: - parser = MakeHolder<TVersionedNlpParser<2>>(TokenHandler, sentBreakFilter, Buffer, opts.SpacePreserve, - BackwardCompatible, semicolonBreaksSentence, opts.UrlDecode); - break; - case 3: - parser = MakeHolder<TVersionedNlpParser<3>>(TokenHandler, sentBreakFilter, Buffer, opts.SpacePreserve, - BackwardCompatible, semicolonBreaksSentence, opts.UrlDecode, opts.KeepAffixes); - break; - default: - parser = MakeHolder<TDefaultNlpParser>(TokenHandler, sentBreakFilter, Buffer, opts.SpacePreserve, - BackwardCompatible, semicolonBreaksSentence, opts.UrlDecode); - break; - } - try { - parser->Execute(str, size, &TextStart); - } catch (const ITokenHandler::TAllDoneException&) { - // do nothing - } -} - -#ifndef CATBOOST_OPENSOURCE -void TNlpTokenizer::Tokenize(const char* text, - size_t len, - bool spacePreserve, - TLangMask langMask) { - TCharTemp buf(len); - wchar16* const data = buf.Data(); - CharToWide(text, len, data, csYandex); - TTokenizerOptions opts {spacePreserve, langMask, /*decodeUrl=*/true}; - Tokenize(data, len, opts); -} -#endif - -void TNlpTokenizer::Tokenize(const wchar16* str, - size_t size, - bool spacePreserve, - TLangMask langMask) { - TTokenizerOptions opts {spacePreserve, langMask, /*decodeUrl=*/true}; - Tokenize(str, size, opts); -} - -bool IsSpecialTokenizerSymbol(const TWtringBuf s) { - if (s.size() != 1) { - return false; - } - // Only base-plane codepoints can be special tokenizer symbols, - // and they can be just casted to wchar32. - // Unicode conversion will be needed to process surrogate pairs. - return IsSpecialTokenizerSymbol(static_cast<wchar32>(s[0])); -} - -bool IsAsciiEmojiPart(const TWtringBuf s) { - // no worries for surrogates here because of Ascii - for (auto c : s) - if (!IsAsciiEmojiPart(c)) - return false; - return true; -} diff --git a/library/cpp/tokenizer/tokenizer.h b/library/cpp/tokenizer/tokenizer.h deleted file mode 100644 index ade09751f55..00000000000 --- a/library/cpp/tokenizer/tokenizer.h +++ /dev/null @@ -1,133 +0,0 @@ -#pragma once - -#include <library/cpp/token/nlptypes.h> -#include <library/cpp/langmask/langmask.h> -#include <library/cpp/token/token_structure.h> - -#include <util/system/defaults.h> -#include <util/generic/yexception.h> -#include <util/generic/noncopyable.h> - -#include <cassert> -#include <cstdlib> - -class ITokenHandler { -public: - // Исключение, которое может кидаться обработчиком из OnToken. - // Токенайзер проглатывает такое исключение и прекращает токенизацию - class TAllDoneException: public yexception { - public: - TAllDoneException() { - *this << "Token handler: all done"; - } - }; - - virtual void OnToken(const TWideToken& token, size_t origleng, NLP_TYPE type) = 0; - virtual ~ITokenHandler() { - } -}; - -struct TTokenizerOptions { - bool SpacePreserve = false; - TLangMask LangMask = TLangMask(); - bool UrlDecode = true; - size_t Version = 2; - bool KeepAffixes = false; // keep prefix/suffix as part of token -}; - -//! breaks up a text into tokens and calls to @c ITokenHandler::OnToken() -//! @note the tokenizer produces tokens of the following types only: -//! NLP_WORD, NLP_INTEGER, NLP_FLOAT, NLP_MARK, NLP_SENTBREAK, NLP_PARABREAK, NLP_MISCTEXT. -class TNlpTokenizer: private TNonCopyable { -private: - ITokenHandler& TokenHandler; - const bool BackwardCompatible; //!< tokenizer reproduce old tokenization of marks - TTempArray<wchar16> Buffer; - const wchar16* TextStart = nullptr; - -public: - explicit TNlpTokenizer(ITokenHandler& handler, bool backwardCompatible = true) - : TokenHandler(handler) - , BackwardCompatible(backwardCompatible) - , Buffer() - { - } - - //! the main tokenizing function - //! @attention zero-character ('\0') considered as word break, so tokenizer does not stop processing - //! of text if it meets such character - //! @attention function isn't thread-safe - // in case of spacePreserve==false all whitespaces are replaced with space because - // browsers normalize whitespaces: "a \t\n\r b" -> "a b" if tag <pre></pre> isn't used - // this change fixes incorrect hyphenations without tag <pre>: "HTML-\nfile" is not "HTMLfile" - // browser show this text as: "HTML- file" - // in case of urlDecode==true firstly tokenizer tries to decode percent encoded text: - // "%D1%82%D0%B5%D0%BA%D1%81%D1%82" -> "текст" and then start tokenization. - // By default it's true. - void Tokenize(const wchar16* text, - size_t len, - const TTokenizerOptions& opts); - - //! all other Tokenize() functions are for backward compatibility - void Tokenize(const wchar16* text, - size_t len, - bool spacePreserve = false, - TLangMask langMask = TLangMask()); - -#ifndef CATBOOST_OPENSOURCE - //! converts the text from yandex encoding to unicode and calls to the main tokenizing function - void Tokenize(const char* text, - size_t len, - bool spacePreserve = false, - TLangMask langMask = TLangMask()); -#endif - - //! just calls to the main tokenizing function - void Tokenize(TWtringBuf text, - bool spacePreserve = false, - TLangMask langMask = TLangMask()) { - Tokenize(text.begin(), - text.size(), - spacePreserve, - langMask); - } - - //can point to text, Buffer or whatever - //set by NlpParser - //lifetime of data is min(lifetime(text), lifetime(tokenizer)) - const wchar16* GetTextStart() const { - return TextStart; - } -}; - -inline bool IsSpecialTokenizerSymbol(wchar32 ch) { - return ch >= 128 && NUnicode::CharHasType(ch, (1ULL << Sm_MATH) | (1ULL << Sc_CURRENCY) | (1ULL << So_OTHER)); -} - -bool IsSpecialTokenizerSymbol(const TWtringBuf s); - -inline bool IsAsciiEmojiPart(wchar32 ch) { - return ch < 128 && !IsAlnum(ch); -} - -bool IsAsciiEmojiPart(const TWtringBuf s); - -template <class TCallback> -class TCallbackTokenHandler: public ITokenHandler { - public: - TCallbackTokenHandler(TCallback callback) - : Callback(callback) - { - } - - virtual void OnToken(const TWideToken& token, size_t origleng, NLP_TYPE type) override { - Callback(token, origleng, type); - } - private: - TCallback Callback; -}; - -template <class TCallback> -TCallbackTokenHandler<TCallback> MakeCallbackTokenHandler(const TCallback& callback) { - return TCallbackTokenHandler<TCallback>(callback); -} diff --git a/library/cpp/tvmauth/README.md b/library/cpp/tvmauth/README.md deleted file mode 100644 index ec64bbbcdb2..00000000000 --- a/library/cpp/tvmauth/README.md +++ /dev/null @@ -1,2 +0,0 @@ -This part of library contains primitives for TVM operation. -Please use high-level [TTvmClient](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/README.md). diff --git a/library/cpp/tvmauth/checked_service_ticket.h b/library/cpp/tvmauth/checked_service_ticket.h deleted file mode 100644 index 71dc48b7cba..00000000000 --- a/library/cpp/tvmauth/checked_service_ticket.h +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -#include "ticket_status.h" -#include "type.h" -#include "utils.h" - -#include <util/generic/ptr.h> - -namespace NTvmAuth::NInternal { - class TCanningKnife; -} - -namespace NTvmAuth { - class TCheckedServiceTicket { - public: - class TImpl; - - TCheckedServiceTicket(THolder<TImpl> impl); - TCheckedServiceTicket(TCheckedServiceTicket&& o); - ~TCheckedServiceTicket(); - - TCheckedServiceTicket& operator=(TCheckedServiceTicket&&); - - /*! - * @return True value if ticket parsed and checked successfully - */ - explicit operator bool() const; - - /*! - * @return TTvmId of request destination - */ - TTvmId GetDst() const; - - /*! - * You should check src with your ACL - * @return TvmId of request source - */ - TTvmId GetSrc() const; - - /*! - * @return Ticket check status - */ - ETicketStatus GetStatus() const; - - /*! - * DebugInfo is human readable data for debug purposes - * @return Serialized ticket - */ - TString DebugInfo() const; - - /*! - * IssuerUID is UID of developer who is debuging something, - * so he(she) issued ServiceTicket with his(her) ssh-sign: - * it is grant_type=sshkey in tvm-api. - * https://wiki.yandex-team.ru/passport/tvm2/debug/#sxoditvapizakrytoeserviceticketami - * @return uid - */ - TMaybe<TUid> GetIssuerUid() const; - - public: // for python binding - TCheckedServiceTicket() = default; - - private: - THolder<TImpl> Impl_; - friend class NInternal::TCanningKnife; - }; - - namespace NBlackboxTvmId { - const TStringBuf Prod = "222"; - const TStringBuf Test = "224"; - const TStringBuf ProdYateam = "223"; - const TStringBuf TestYateam = "225"; - const TStringBuf Stress = "226"; - const TStringBuf Mimino = "239"; - } -} diff --git a/library/cpp/tvmauth/checked_user_ticket.h b/library/cpp/tvmauth/checked_user_ticket.h deleted file mode 100644 index 16a2a6dc308..00000000000 --- a/library/cpp/tvmauth/checked_user_ticket.h +++ /dev/null @@ -1,91 +0,0 @@ -#pragma once - -#include "ticket_status.h" -#include "type.h" -#include "utils.h" - -#include <util/generic/ptr.h> - -namespace NTvmAuth::NInternal { - class TCanningKnife; -} - -namespace NTvmAuth { - /*! - * BlackboxEnv describes environment of Passport: - * https://wiki.yandex-team.ru/passport/tvm2/user-ticket/#0-opredeljaemsjasokruzhenijami - */ - enum class EBlackboxEnv: ui8 { - Prod, - Test, - ProdYateam, - TestYateam, - Stress - }; - - /*! - * UserTicket contains only valid users. - * Details: https://wiki.yandex-team.ru/passport/tvm2/user-ticket/#chtoestvusertickete - */ - class TCheckedUserTicket { - public: - class TImpl; - - TCheckedUserTicket(THolder<TImpl> impl); - TCheckedUserTicket(TCheckedUserTicket&&); - ~TCheckedUserTicket(); - - TCheckedUserTicket& operator=(TCheckedUserTicket&&); - - /*! - * @return True value if ticket parsed and checked successfully - */ - explicit operator bool() const; - - /*! - * Never empty - * @return UIDs of users listed in ticket - */ - const TUids& GetUids() const; - - /*! - * Maybe 0 - * @return Default user in ticket - */ - TUid GetDefaultUid() const; - - /*! - * Scopes inherited from credential - never empty - * @return Newly constructed vector of scopes - */ - const TScopes& GetScopes() const; - - /*! - * Check if scope presented in ticket - */ - bool HasScope(TStringBuf scopeName) const; - - /*! - * @return Ticket check status - */ - ETicketStatus GetStatus() const; - - /*! - * DebugInfo is human readable data for debug purposes - * @return Serialized ticket - */ - TString DebugInfo() const; - - /*! - * Env of user - */ - EBlackboxEnv GetEnv() const; - - public: // for python binding - TCheckedUserTicket() = default; - - private: - THolder<TImpl> Impl_; - friend class NInternal::TCanningKnife; - }; -} diff --git a/library/cpp/tvmauth/client/README.md b/library/cpp/tvmauth/client/README.md deleted file mode 100644 index cda6a22d3cd..00000000000 --- a/library/cpp/tvmauth/client/README.md +++ /dev/null @@ -1,84 +0,0 @@ -Overview -=== -This library provides ability to operate with TVM. Library is fast enough to get or check tickets for every request without burning CPU. - -[Home page of project](https://wiki.yandex-team.ru/passport/tvm2/) -You can find some examples in [here](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/examples). - -You can ask questions: [PASSPORTDUTY](https://st.yandex-team.ru/createTicket?queue=PASSPORTDUTY&_form=77618) - -TvmClient -=== -Don't forget to collect logs from client. -___ -`TvmClient` allowes: -1. `GetServiceTicketFor()` - to fetch ServiceTicket for outgoing request -2. `CheckServiceTicket()` - to check ServiceTicket from incoming request -3. `CheckUserTicket()` - to check UserTicket from incoming request -4. `GetRoles()` - to get roles from IDM - -All methods are thread-safe. - -You should check status of `CheckedServiceTicket` or `CheckedUserTicket` for equality 'Ok'. You can get ticket fields (src/uids/scopes) only for correct ticket. Otherwise exception will be thrown. -___ -You should check status of client with `GetStatus()`: -* `OK` - nothing to do here -* `Warning` - **you should trigger your monitoring alert** - - Normal operation of TvmClient is still possible but there are problems with refreshing cache, so it is expiring. - Is tvm-api.yandex.net accessible? - Have you changed your TVM-secret or your backend (dst) deleted its TVM-client? - -* `Error` - **you should trigger your monitoring alert and close this instance for user-traffic** - - TvmClient's cache is already invalid (expired) or soon will be: you can't check valid ServiceTicket or be authenticated by your backends (dsts) - -___ -Constructor creates system thread for refreshing cache - so do not fork your proccess after creating `TTvmClient` instance. Constructor leads to network I/O. Other methods always use memory. - -Exceptions maybe thrown from constructor: -* `TRetriableException` - maybe some network trouble: you can try to create client one more time. -* `TNonRetriableException` - settings are bad: fix them. -___ -You can choose way for fetching data for your service operation: -* http://localhost:{port}/tvm - recomended way -* https://tvm-api.yandex.net - -TvmTool ------------- -`TTvmClient` uses local http-interface to get state. This interface can be provided with tvmtool (local daemon) or Qloud/YP (local http api in container). -See more: https://wiki.yandex-team.ru/passport/tvm2/tvm-daemon/. - -`TTvmClient` fetches configuration from tvmtool, so you need only to tell client how to connect to it and tell which alias of tvm id should be used for this `TvmClient` instance. - -TvmApi ------------- -First of all: please use `DiskCacheDir` - it provides reliability for your service and for tvm-api. -Please check restrictions of this field. - -Roles -=== -[Example](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/examples/create_with_tvmapi/create.cpp?rev=r8888584#L84) - -You need to configure roles fetching ------------- -1. Enable disk cache: [DiskCacheDir](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/misc/api/settings.h?rev=r9001419#L54) - -2. Enable ServiceTicket fetching: - [SelfTvmId](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/misc/api/settings.h?rev=r9001419#L57) + [Secret](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/misc/api/settings.h?rev=r9001419#L60) -3. Enable roles fetching from tirole: - [FetchRolesForIdmSystemSlug](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/misc/api/settings.h?rev=r9001419#L78) - -You need to use roles for request check ------------- -1. Check ServiceTicket and/or UserTicket - as usual: - [CheckServiceTicket()](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/facade.h?rev=r7890770#L91)/[CheckUserTicket()](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/facade.h?rev=r7890770#L99) - -2. Get actual roles from `TvmClient`: [GetRoles()](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/facade.h?rev=r7890770#L105) - -3. Use roles - - case#1: [get](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/misc/roles/roles.h?rev=r7890770#L37-46) role list for service or user and check for the exact role you need. - - case#2: use [shortcuts](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/misc/roles/roles.h?rev=r7890770#L50) - they are wrappers for case#1 - -4. If consumer (service or user) has required role, you can perform request. - If consumer doesn't have required role, you should show error message with useful message. diff --git a/library/cpp/tvmauth/client/client_status.cpp b/library/cpp/tvmauth/client/client_status.cpp deleted file mode 100644 index eca35ba22b0..00000000000 --- a/library/cpp/tvmauth/client/client_status.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "client_status.h" - -template <> -void Out<NTvmAuth::TClientStatus>(IOutputStream& out, const NTvmAuth::TClientStatus& s) { - out << s.GetCode() << ": " << s.GetLastError(); -} diff --git a/library/cpp/tvmauth/client/client_status.h b/library/cpp/tvmauth/client/client_status.h deleted file mode 100644 index bbaf29d289f..00000000000 --- a/library/cpp/tvmauth/client/client_status.h +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once - -#include <util/generic/string.h> -#include <util/string/builder.h> - -namespace NTvmAuth { - class TClientStatus { - public: - enum ECode { - Ok, - Warning, - Error, - IncompleteTicketsSet, - }; - - TClientStatus(ECode state, TString&& lastError) - : Code_(state) - , LastError_(std::move(lastError)) - { - } - - TClientStatus() = default; - TClientStatus(const TClientStatus&) = default; - TClientStatus(TClientStatus&&) = default; - - TClientStatus& operator=(const TClientStatus&) = default; - TClientStatus& operator=(TClientStatus&&) = default; - - ECode GetCode() const { - return Code_; - } - - const TString& GetLastError() const { - return LastError_; - } - - TString CreateJugglerMessage() const { - return TStringBuilder() << GetJugglerCode() << ";TvmClient: " << LastError_ << "\n"; - } - - private: - int32_t GetJugglerCode() const { - switch (Code_) { - case ECode::Ok: - return 0; // OK juggler check state - case ECode::Warning: - case ECode::IncompleteTicketsSet: - return 1; // WARN juggler check state - case ECode::Error: - return 2; // CRIT juggler check state - } - return 2; // This should not happen, so set check state as CRIT. - } - - ECode Code_ = Ok; - TString LastError_; - }; - - static inline bool operator==(const TClientStatus& l, const TClientStatus& r) noexcept { - return l.GetCode() == r.GetCode() && l.GetLastError() == r.GetLastError(); - } - - static inline bool operator==(const TClientStatus& l, const TClientStatus::ECode r) noexcept { - return l.GetCode() == r; - } - - static inline bool operator==(const TClientStatus::ECode l, const TClientStatus& r) noexcept { - return r.GetCode() == l; - } - - static inline bool operator!=(const TClientStatus& l, const TClientStatus& r) noexcept { - return !(l == r); - } - - static inline bool operator!=(const TClientStatus& l, const TClientStatus::ECode r) noexcept { - return !(l == r); - } - - static inline bool operator!=(const TClientStatus::ECode l, const TClientStatus& r) noexcept { - return !(l == r); - } -} diff --git a/library/cpp/tvmauth/client/examples/create_with_tvmapi/create.cpp b/library/cpp/tvmauth/client/examples/create_with_tvmapi/create.cpp deleted file mode 100644 index c03a7a032fa..00000000000 --- a/library/cpp/tvmauth/client/examples/create_with_tvmapi/create.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include <library/cpp/tvmauth/client/facade.h> - -namespace NExample { - NTvmAuth::TTvmClient CreateClientForCheckingAllTicketsAndFetchingServiceTickets() { - NTvmAuth::NTvmApi::TClientSettings setts{ - .DiskCacheDir = "/var/cache/my_service/tvm/", - .SelfTvmId = 11, - .Secret = (TStringBuf) "AAAAAAAAAAAAAAAAAAAAAA", - .FetchServiceTicketsForDstsWithAliases = { - {"bb", 224}, - {"datasync", 2000060}, - }, - .CheckServiceTickets = true, - .CheckUserTicketsWithBbEnv = NTvmAuth::EBlackboxEnv::Test, - }; - - NTvmAuth::TLoggerPtr log = MakeIntrusive<NTvmAuth::TCerrLogger>(7); - - NTvmAuth::TTvmClient c(setts, log); - - // c.CheckServiceTicket("some service ticket") - // c.CheckUserTicket("some user ticket") - // c.GetServiceTicketFor("bb") - // c.GetServiceTicketFor(224) - - return c; - } - - NTvmAuth::TTvmClient CreateClientForCheckingAllTickets() { - NTvmAuth::NTvmApi::TClientSettings setts{ - .DiskCacheDir = "/var/cache/my_service/tvm/", - .SelfTvmId = 11, - .CheckServiceTickets = true, - .CheckUserTicketsWithBbEnv = NTvmAuth::EBlackboxEnv::Test, - }; - - NTvmAuth::TLoggerPtr log = MakeIntrusive<NTvmAuth::TCerrLogger>(7); - - NTvmAuth::TTvmClient c(setts, log); - - // c.CheckServiceTicket("some service ticket") - // c.CheckUserTicket("some user ticket") - - return c; - } - - NTvmAuth::TTvmClient CreateClientForFetchingServiceTickets() { - NTvmAuth::NTvmApi::TClientSettings setts{ - .DiskCacheDir = "/var/cache/my_service/tvm/", - .SelfTvmId = 11, - .Secret = (TStringBuf) "AAAAAAAAAAAAAAAAAAAAAA", - .FetchServiceTicketsForDstsWithAliases = { - {"bb", 224}, - {"datasync", 2000060}, - }, - }; - - NTvmAuth::TLoggerPtr log = MakeIntrusive<NTvmAuth::TCerrLogger>(7); - - NTvmAuth::TTvmClient c(setts, log); - - // c.GetServiceTicketFor("bb") - // c.GetServiceTicketFor(224) - - return c; - } - - NTvmAuth::TTvmClient CreateClientForCheckingServiceTickets() { - NTvmAuth::NTvmApi::TClientSettings setts{ - .DiskCacheDir = "/var/cache/my_service/tvm/", - .SelfTvmId = 11, - .CheckServiceTickets = true, - }; - - NTvmAuth::TLoggerPtr log = MakeIntrusive<NTvmAuth::TCerrLogger>(7); - - NTvmAuth::TTvmClient c(setts, log); - - // c.CheckServiceTicket("some service ticket") - - return c; - } - - NTvmAuth::TTvmClient CreateClientForCheckingServiceTicketsWithRoles() { - NTvmAuth::NTvmApi::TClientSettings setts{ - .DiskCacheDir = "/var/cache/my_service/tvm/", - .SelfTvmId = 11, - .Secret = (TStringBuf) "AAAAAAAAAAAAAAAAAAAAAA", - .CheckServiceTickets = true, - .FetchRolesForIdmSystemSlug = "passporttestservice", - }; - - NTvmAuth::TLoggerPtr log = MakeIntrusive<NTvmAuth::TCerrLogger>(7); - - NTvmAuth::TTvmClient c(setts, log); - - // auto t = c.CheckServiceTicket("some service ticket") - // c.GetRoles()->CheckServiceRole(t, "some role"); - - return c; - } -} diff --git a/library/cpp/tvmauth/client/examples/create_with_tvmtool/create.cpp b/library/cpp/tvmauth/client/examples/create_with_tvmtool/create.cpp deleted file mode 100644 index a87d3e705d9..00000000000 --- a/library/cpp/tvmauth/client/examples/create_with_tvmtool/create.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include <library/cpp/tvmauth/client/facade.h> - -namespace NExample { - // Possibility of using functions depends on config of tvmtool - // CheckServiceTicket - // CheckUserTicket - // GetServiceTicketFor - - NTvmAuth::TTvmClient CreateClientInQloudOrYandexDeploy() { - NTvmAuth::NTvmTool::TClientSettings setts( - "my_service" // specified in Qloud/YP/tvmtool interface - ); - - NTvmAuth::TLoggerPtr log = MakeIntrusive<NTvmAuth::TCerrLogger>(7); - - NTvmAuth::TTvmClient c(setts, log); - - return c; - } - - NTvmAuth::TTvmClient CreateClientForDevOrTests() { - NTvmAuth::NTvmTool::TClientSettings setts( - "my_service" // specified in Qloud/YP/tvmtool interface - ); - setts.SetPort(18080); - setts.SetAuthToken("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); - - NTvmAuth::TLoggerPtr log = MakeIntrusive<NTvmAuth::TCerrLogger>(7); - - NTvmAuth::TTvmClient c(setts, log); - - return c; - } -} diff --git a/library/cpp/tvmauth/client/examples/service_using_tvmtool_client/service.cpp b/library/cpp/tvmauth/client/examples/service_using_tvmtool_client/service.cpp deleted file mode 100644 index 075bf0bded3..00000000000 --- a/library/cpp/tvmauth/client/examples/service_using_tvmtool_client/service.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "service.h" - -#include <library/cpp/tvmauth/client/facade.h> - -#include <library/cpp/cgiparam/cgiparam.h> -#include <library/cpp/http/server/response.h> -#include <library/cpp/http/simple/http_client.h> -#include <library/cpp/json/json_reader.h> - -namespace NExample { - static const TString BACK_C = "BACK_C"; - - TSomeService::TSomeService(const TConfig& cfg) - : Config_(cfg) - { - NTvmAuth::TLoggerPtr log = MakeIntrusive<NTvmAuth::TCerrLogger>(7); - - Tvm_ = MakeHolder<NTvmAuth::TTvmClient>( - NTvmAuth::NTvmTool::TClientSettings( - "my_service" // specified in Qloud/YP/tvmtool interface - ), - log); - } - - TSomeService::~TSomeService() { - } - - void TSomeService::HandleRequest(THttpInput& in, THttpOutput& out) { - auto servIt = std::find_if(in.Headers().Begin(), - in.Headers().End(), - [](const auto& h) { return h.Name() == "X-Ya-Service-Ticket"; }); - auto userIt = std::find_if(in.Headers().Begin(), - in.Headers().End(), - [](const auto& h) { return h.Name() == "X-Ya-User-Ticket"; }); - try { - if (servIt == in.Headers().End() || userIt == in.Headers().End()) { - ythrow yexception() << "Need tickets"; - } - - // WARNING: См. Здесь - NTvmAuth::TCheckedServiceTicket st = Tvm_->CheckServiceTicket(servIt->Value()); - NTvmAuth::TCheckedUserTicket ut = Tvm_->CheckUserTicket(userIt->Value()); - if (!st || !ut) { - ythrow yexception() << "Invalid tickets"; - } - - // WARNING: См. Здесь - // Ждём ABC - после их релиза эти три строки можно будет удалить - if (Config_.AllowedTvmIds.find(st.GetSrc()) == Config_.AllowedTvmIds.end()) { - ythrow yexception() << "Consumer is not allowed"; - } - - // WARNING: См. Здесь - if (!ut.HasScope("some_service:allow_secret_data")) { - ythrow yexception() << "UserTicket does not have scopes for secret data"; - } - - // Access-log - Cout << "Data fetched for: " << ut.GetDefaultUid() << Endl; - - THttpResponse resp(HTTP_OK); - resp.SetContent(GetDataFromBackendC(userIt->Value()), "text/plain"); - resp.OutTo(out); - } catch (...) { - THttpResponse resp(HTTP_BAD_REQUEST); - resp.SetContent("Request can not be performed", "text/plain"); - resp.OutTo(out); - } - - out.Finish(); - } - - TString TSomeService::GetDataFromBackendC(const TString& userTicket) { - TSimpleHttpClient cl("my_backend", // specified in Qloud/YP/tvmtool interface - 80); - TStringStream s; - cl.DoGet("/api?", - &s, - // WARNING: См. Здесь - {{"X-Ya-Service-Ticket", Tvm_->GetServiceTicketFor(BACK_C)}, - {"X-Ya-User-Ticket", userTicket}}); - return s.Str(); - } -} diff --git a/library/cpp/tvmauth/client/examples/service_using_tvmtool_client/service.h b/library/cpp/tvmauth/client/examples/service_using_tvmtool_client/service.h deleted file mode 100644 index 8ff948334e0..00000000000 --- a/library/cpp/tvmauth/client/examples/service_using_tvmtool_client/service.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include <library/cpp/http/io/stream.h> - -#include <util/generic/ptr.h> - -#include <unordered_set> - -namespace NTvmAuth { - class TTvmClient; -} - -namespace NExample { - struct TConfig { - using TAllowedTvmIds = std::unordered_set<ui32>; - - TAllowedTvmIds AllowedTvmIds; - }; - - class TSomeService { - public: - TSomeService(const TConfig& cfg); - ~TSomeService(); - - void HandleRequest(THttpInput& in, THttpOutput& out); - - private: - TString GetDataFromBackendC(const TString& userTicket); - - private: - // WARNING: См. Здесь - TConfig Config_; - THolder<NTvmAuth::TTvmClient> Tvm_; - }; -} diff --git a/library/cpp/tvmauth/client/exception.h b/library/cpp/tvmauth/client/exception.h deleted file mode 100644 index c5faa006ad5..00000000000 --- a/library/cpp/tvmauth/client/exception.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/exception.h> - -namespace NTvmAuth { - class TClientException: public TTvmException { - }; - - class TInternalException: public TTvmException { - }; - - class TRetriableException: public TClientException { - }; - class TNonRetriableException: public TClientException { - }; - - class TIllegalUsage: public TNonRetriableException { - }; - - class TBrokenTvmClientSettings: public TIllegalUsage { - }; - class TMissingServiceTicket: public TNonRetriableException { - }; - class TPermissionDenied: public TNonRetriableException { - }; -} diff --git a/library/cpp/tvmauth/client/facade.cpp b/library/cpp/tvmauth/client/facade.cpp deleted file mode 100644 index 59a682678f0..00000000000 --- a/library/cpp/tvmauth/client/facade.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "facade.h" - -#include "misc/checker.h" -#include "misc/default_uid_checker.h" -#include "misc/getter.h" -#include "misc/src_checker.h" -#include "misc/api/threaded_updater.h" -#include "misc/tool/threaded_updater.h" - -namespace NTvmAuth { - TTvmClient::TTvmClient(const NTvmTool::TClientSettings& settings, TLoggerPtr logger) - : Updater_(NTvmTool::TThreadedUpdater::Create(settings, std::move(logger))) - , NeedService_(true) - , NeedUser_(true) - { - Y_ENSURE_EX(Updater_->GetCachedServiceContext(), TInternalException() << "Unable to get cached service context"); - Y_ENSURE_EX(Updater_->GetCachedUserContext(), TInternalException() << "Unable to get cached user context"); - - if (Updater_->GetCachedServiceTickets()) { - NeedTickets_ = true; - } - - try { - if (settings.ShouldCheckSrc && Updater_->GetRoles()) { - NeedSrcChecker_ = true; - } - - if (settings.ShouldCheckDefaultUid && Updater_->GetRoles()) { - NeedDefaultUidChecker_ = true; - } - } catch (const TBrokenTvmClientSettings&) { - // Roles are not configured - } - } - - TTvmClient::TTvmClient(const NTvmApi::TClientSettings& settings, TLoggerPtr logger) - : Updater_(NTvmApi::TThreadedUpdater::Create(settings, std::move(logger))) - , NeedService_(settings.CheckServiceTickets) - , NeedUser_(settings.CheckUserTicketsWithBbEnv) - , NeedTickets_(settings.IsServiceTicketFetchingRequired()) - , NeedSrcChecker_(settings.FetchRolesForIdmSystemSlug && settings.ShouldCheckSrc) - , NeedDefaultUidChecker_(settings.FetchRolesForIdmSystemSlug && settings.ShouldCheckDefaultUid) - { - ServiceTicketCheckFlags_.NeedDstCheck = settings.ShouldCheckDst; - if (NeedService_) { - Y_ENSURE_EX(Updater_->GetCachedServiceContext(), TInternalException() << "Unable to get cached service context"); - } - if (NeedUser_) { - Y_ENSURE_EX(Updater_->GetCachedUserContext(), TInternalException() << "Unable to get cached user context"); - } - if (NeedTickets_) { - Y_ENSURE_EX(Updater_->GetCachedServiceTickets(), TInternalException() << "Unable to get cached service tickets"); - } - if (NeedSrcChecker_) { - GetRoles(); - } - if (NeedDefaultUidChecker_) { - GetRoles(); - } - } - - TTvmClient::TTvmClient( - TAsyncUpdaterPtr updater, - const TServiceContext::TCheckFlags& serviceTicketCheckFlags) - : Updater_(std::move(updater)) - , ServiceTicketCheckFlags_(serviceTicketCheckFlags) - , NeedService_(Updater_->GetCachedServiceContext()) - , NeedUser_(Updater_->GetCachedUserContext()) - , NeedTickets_(Updater_->GetCachedServiceTickets()) - { - try { - if (Updater_->GetRoles()) { - NeedSrcChecker_ = true; - NeedDefaultUidChecker_ = true; - } - } catch (const TIllegalUsage&) { - // it is a test probably - } - } - - TTvmClient::TTvmClient(TTvmClient&& o) = default; - TTvmClient::~TTvmClient() = default; - TTvmClient& TTvmClient::operator=(TTvmClient&& o) = default; - - TClientStatus TTvmClient::GetStatus() const { - Y_ENSURE(Updater_); - return Updater_->GetStatus(); - } - - TInstant TTvmClient::GetUpdateTimeOfPublicKeys() const { - Y_ENSURE(Updater_); - return Updater_->GetUpdateTimeOfPublicKeys(); - } - - TInstant TTvmClient::GetUpdateTimeOfServiceTickets() const { - Y_ENSURE(Updater_); - return Updater_->GetUpdateTimeOfServiceTickets(); - } - - TInstant TTvmClient::GetInvalidationTimeOfPublicKeys() const { - Y_ENSURE(Updater_); - return Updater_->GetInvalidationTimeOfPublicKeys(); - } - - TInstant TTvmClient::GetInvalidationTimeOfServiceTickets() const { - Y_ENSURE(Updater_); - return Updater_->GetInvalidationTimeOfServiceTickets(); - } - - TString TTvmClient::GetServiceTicketFor(const TClientSettings::TAlias& dst) const { - Y_ENSURE_EX(NeedTickets_, TBrokenTvmClientSettings() - << "Need to enable ServiceTickets fetching"); - - TServiceTicketsPtr c = Updater_->GetCachedServiceTickets(); - return TServiceTicketGetter::GetTicket(dst, c); - } - - TString TTvmClient::GetServiceTicketFor(const TTvmId dst) const { - Y_ENSURE_EX(NeedTickets_, TBrokenTvmClientSettings() - << "Need to enable ServiceTickets fetching"); - TServiceTicketsPtr c = Updater_->GetCachedServiceTickets(); - return TServiceTicketGetter::GetTicket(dst, c); - } - - TCheckedServiceTicket TTvmClient::CheckServiceTicket(TStringBuf ticket) const { - Y_ENSURE_EX(NeedService_, TBrokenTvmClientSettings() - << "Need to use TClientSettings::EnableServiceTicketChecking()"); - - TServiceContextPtr c = Updater_->GetCachedServiceContext(); - TCheckedServiceTicket res = TServiceTicketChecker::Check(ticket, c, ServiceTicketCheckFlags_); - if (NeedSrcChecker_ && res) { - NRoles::TRolesPtr roles = Updater_->GetRoles(); - return TSrcChecker::Check(std::move(res), roles); - } - return res; - } - - TCheckedUserTicket TTvmClient::CheckUserTicket(TStringBuf ticket, TMaybe<EBlackboxEnv> overridenEnv) const { - Y_ENSURE_EX(NeedUser_, TBrokenTvmClientSettings() - << "Need to use TClientSettings::EnableUserTicketChecking()"); - - auto c = Updater_->GetCachedUserContext(overridenEnv); - TCheckedUserTicket res = TUserTicketChecker::Check(ticket, c); - if (NeedDefaultUidChecker_ && res) { - NRoles::TRolesPtr roles = Updater_->GetRoles(); - return TDefaultUidChecker::Check(std::move(res), roles); - } - return res; - } - - NRoles::TRolesPtr TTvmClient::GetRoles() const { - Y_ENSURE(Updater_); - return Updater_->GetRoles(); - } -} diff --git a/library/cpp/tvmauth/client/facade.h b/library/cpp/tvmauth/client/facade.h deleted file mode 100644 index fa459a0b55d..00000000000 --- a/library/cpp/tvmauth/client/facade.h +++ /dev/null @@ -1,124 +0,0 @@ -#pragma once - -#include "misc/async_updater.h" -#include "misc/api/settings.h" -#include "misc/tool/settings.h" - -#include <library/cpp/tvmauth/checked_service_ticket.h> -#include <library/cpp/tvmauth/checked_user_ticket.h> - -namespace NTvmAuth::NInternal { - class TClientCaningKnife; -} - -namespace NTvmAuth { - class TDefaultUidChecker; - class TServiceTicketGetter; - class TServiceTicketChecker; - class TSrcChecker; - class TUserTicketChecker; - - /*! - * Long lived thread-safe object for interacting with TVM. - * In 99% cases TvmClient shoud be created at service startup and live for the whole process lifetime. - */ - class TTvmClient { - public: - /*! - * Uses local http-interface to get state: http://localhost/tvm/. - * This interface can be provided with tvmtool (local daemon) or Qloud/YP (local http api in container). - * See more: https://wiki.yandex-team.ru/passport/tvm2/tvm-daemon/. - * - * Starts thread for updating of in-memory cache in background - * @param settings - * @param logger is usefull for monitoring and debuging - */ - TTvmClient(const NTvmTool::TClientSettings& settings, TLoggerPtr logger); - - /*! - * Uses general way to get state: https://tvm-api.yandex.net. - * It is not recomended for Qloud/YP. - * - * Starts thread for updating of in-memory cache in background - * Reads cache from disk if specified - * @param settings - * @param logger is usefull for monitoring and debuging - */ - TTvmClient(const NTvmApi::TClientSettings& settings, TLoggerPtr logger); - - /*! - * Feel free to use custom updating logic in tests - */ - TTvmClient( - TAsyncUpdaterPtr updater, - const TServiceContext::TCheckFlags& serviceTicketCheckFlags = {}); - - TTvmClient(TTvmClient&&); - ~TTvmClient(); - TTvmClient& operator=(TTvmClient&&); - - /*! - * You should trigger your monitoring if status is not Ok. - * It will be unable to operate if status is Error. - * Description: https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/tvmauth/client/README.md#high-level-interface - * @return Current status of client. - */ - TClientStatus GetStatus() const; - - /*! - * Some tools for monitoring - */ - - TInstant GetUpdateTimeOfPublicKeys() const; - TInstant GetUpdateTimeOfServiceTickets() const; - TInstant GetInvalidationTimeOfPublicKeys() const; - TInstant GetInvalidationTimeOfServiceTickets() const; - - /*! - * Requires fetchinig options (from TClientSettings or Qloud/YP/tvmtool settings) - * Can throw exception if cache is invalid or wrong config - * - * Alias is local label for TvmID - * which can be used to avoid this number in every checking case in code. - * @param dst - */ - TString GetServiceTicketFor(const TClientSettings::TAlias& dst) const; - TString GetServiceTicketFor(const TTvmId dst) const; - - /*! - * For TTvmApi::TClientSettings: checking must be enabled in TClientSettings - * Can throw exception if checking was not enabled in settings - * - * ServiceTicket contains src: you should check it by yourself with ACL - * @param ticket - */ - TCheckedServiceTicket CheckServiceTicket(TStringBuf ticket) const; - - /*! - * Requires blackbox enviroment (from TClientSettings or Qloud/YP/tvmtool settings) - * Can throw exception if checking was not enabled in settings - * @param ticket - * @param overrideEnv allowes you to override env from settings - */ - TCheckedUserTicket CheckUserTicket(TStringBuf ticket, TMaybe<EBlackboxEnv> overrideEnv = {}) const; - - /*! - * Under construction now. It is unusable. - * PASSP-30283 - */ - NRoles::TRolesPtr GetRoles() const; - - private: - TAsyncUpdaterPtr Updater_; - - TServiceContext::TCheckFlags ServiceTicketCheckFlags_; - - bool NeedService_ = false; - bool NeedUser_ = false; - bool NeedTickets_ = false; - bool NeedSrcChecker_ = false; - bool NeedDefaultUidChecker_ = false; - - friend class NInternal::TClientCaningKnife; - }; -} diff --git a/library/cpp/tvmauth/client/logger.cpp b/library/cpp/tvmauth/client/logger.cpp deleted file mode 100644 index bd63773cdfe..00000000000 --- a/library/cpp/tvmauth/client/logger.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "logger.h" - -#include <util/datetime/base.h> -#include <util/generic/string.h> - -namespace NTvmAuth { - void TCerrLogger::Log(int lvl, const TString& msg) { - if (lvl > Level_) - return; - Cerr << TInstant::Now().ToStringLocal() << " lvl=" << lvl << " msg: " << msg << "\n"; - } -} diff --git a/library/cpp/tvmauth/client/logger.h b/library/cpp/tvmauth/client/logger.h deleted file mode 100644 index 6f3718a2aa3..00000000000 --- a/library/cpp/tvmauth/client/logger.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include <util/generic/ptr.h> - -namespace NTvmAuth { - class ILogger: public TAtomicRefCount<ILogger> { - public: - virtual ~ILogger() = default; - - void Debug(const TString& msg) { - Log(7, msg); - } - - void Info(const TString& msg) { - Log(6, msg); - } - - void Warning(const TString& msg) { - Log(4, msg); - } - - void Error(const TString& msg) { - Log(3, msg); - } - - protected: - /*! - * Log event - * @param lvl is syslog level: 0(Emergency) ... 7(Debug) - * @param msg - */ - virtual void Log(int lvl, const TString& msg) = 0; - }; - - class TCerrLogger: public ILogger { - public: - TCerrLogger(int level) - : Level_(level) - { - } - - void Log(int lvl, const TString& msg) override; - - private: - const int Level_; - }; - - using TLoggerPtr = TIntrusivePtr<ILogger>; - - class TDevNullLogger: public ILogger { - public: - static TLoggerPtr IAmBrave() { - return MakeIntrusive<TDevNullLogger>(); - } - - void Log(int, const TString&) override { - } - }; -} diff --git a/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.cpp b/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.cpp deleted file mode 100644 index cd6ec45406b..00000000000 --- a/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#include "tvm_client.h" - -#include <util/string/builder.h> - -namespace NTvmAuth::NDynamicClient { - TIntrusivePtr<TTvmClient> TTvmClient::Create(const NTvmApi::TClientSettings& settings, TLoggerPtr logger) { - Y_ENSURE_EX(logger, TNonRetriableException() << "Logger is required"); - THolder<TTvmClient> p(new TTvmClient(settings, std::move(logger))); - p->Init(); - p->StartWorker(); - return p.Release(); - } - - NThreading::TFuture<TAddResponse> TTvmClient::Add(TDsts&& dsts) { - if (dsts.empty()) { - LogDebug("Adding dst: got empty task"); - return NThreading::MakeFuture<TAddResponse>(TAddResponse{}); - } - - NThreading::TPromise<TAddResponse> promise = NThreading::NewPromise<TAddResponse>(); - - TServiceTickets::TMapIdStr requestedTicketsFromStartUpCache = GetRequestedTicketsFromStartUpCache(dsts); - - if (requestedTicketsFromStartUpCache.size() == dsts.size() && - !IsInvalid(TServiceTickets::GetInvalidationTime(requestedTicketsFromStartUpCache), TInstant::Now())) { - std::unique_lock lock(*ServiceTicketBatchUpdateMutex_); - - TPairTicketsErrors newCache; - TServiceTicketsPtr cache = GetCachedServiceTickets(); - - NTvmApi::TDstSetPtr oldDsts = GetDsts(); - std::shared_ptr<TDsts> newDsts = std::make_shared<TDsts>(oldDsts->begin(), oldDsts->end()); - - for (const auto& ticket : cache->TicketsById) { - newCache.Tickets.insert(ticket); - } - for (const auto& error : cache->ErrorsById) { - newCache.Errors.insert(error); - } - for (const auto& ticket : requestedTicketsFromStartUpCache) { - newCache.Tickets.insert(ticket); - newDsts->insert(ticket.first); - } - - UpdateServiceTicketsCache(std::move(newCache), GetStartUpCacheBornDate()); - SetDsts(std::move(newDsts)); - - lock.unlock(); - - TAddResponse response; - - for (const auto& dst : dsts) { - response.emplace(dst, TDstResponse{EDstStatus::Success, TString()}); - LogDebug(TStringBuilder() << "Got ticket from disk cache" - << ": dst=" << dst.Id << " got ticket"); - } - - promise.SetValue(std::move(response)); - return promise.GetFuture(); - } - - const size_t size = dsts.size(); - const ui64 id = ++TaskIds_; - - TaskQueue_.Enqueue(TTask{id, promise, std::move(dsts)}); - - LogDebug(TStringBuilder() << "Adding dst: got task #" << id << " with " << size << " dsts"); - return promise.GetFuture(); - } - - std::optional<TString> TTvmClient::GetOptionalServiceTicketFor(const TTvmId dst) { - TServiceTicketsPtr tickets = GetCachedServiceTickets(); - - Y_ENSURE_EX(tickets, - TBrokenTvmClientSettings() - << "Need to enable fetching of service tickets in settings"); - - auto it = tickets->TicketsById.find(dst); - if (it != tickets->TicketsById.end()) { - return it->second; - } - - it = tickets->ErrorsById.find(dst); - if (it != tickets->ErrorsById.end()) { - ythrow TMissingServiceTicket() - << "Failed to get ticket for '" << dst << "': " - << it->second; - } - - return {}; - } - - TTvmClient::TTvmClient(const NTvmApi::TClientSettings& settings, TLoggerPtr logger) - : TBase(settings, logger) - { - } - - TTvmClient::~TTvmClient() { - TBase::StopWorker(); - } - - void TTvmClient::Worker() { - TBase::Worker(); - ProcessTasks(); - } - - void TTvmClient::ProcessTasks() { - TaskQueue_.DequeueAll(&Tasks_); - if (Tasks_.empty()) { - return; - } - - TDsts required; - for (const TTask& task : Tasks_) { - for (const auto& dst : task.Dsts) { - required.insert(dst); - } - } - - TServiceTicketsPtr cache = UpdateMissingServiceTickets(required); - for (TTask& task : Tasks_) { - try { - SetResponseForTask(task, *cache); - } catch (const std::exception& e) { - LogError(TStringBuilder() - << "Adding dst: task #" << task.Id << ": exception: " << e.what()); - } catch (...) { - LogError(TStringBuilder() - << "Adding dst: task #" << task.Id << ": exception: " << CurrentExceptionMessage()); - } - } - - Tasks_.clear(); - } - - static const TString UNKNOWN = "Unknown reason"; - void TTvmClient::SetResponseForTask(TTvmClient::TTask& task, const TServiceTickets& cache) { - if (task.Promise.HasValue()) { - LogWarning(TStringBuilder() << "Adding dst: task #" << task.Id << " already has value"); - return; - } - - TAddResponse response; - - for (const auto& dst : task.Dsts) { - if (cache.TicketsById.contains(dst.Id)) { - response.emplace(dst, TDstResponse{EDstStatus::Success, TString()}); - - LogDebug(TStringBuilder() << "Adding dst: task #" << task.Id - << ": dst=" << dst.Id << " got ticket"); - continue; - } - - auto it = cache.ErrorsById.find(dst.Id); - const TString& error = it == cache.ErrorsById.end() ? UNKNOWN : it->second; - response.emplace(dst, TDstResponse{EDstStatus::Fail, error}); - - LogWarning(TStringBuilder() << "Adding dst: task #" << task.Id - << ": dst=" << dst.Id - << " failed to get ticket: " << error); - } - - LogDebug(TStringBuilder() << "Adding dst: task #" << task.Id << ": set value"); - task.Promise.SetValue(std::move(response)); - } -} diff --git a/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.h b/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.h deleted file mode 100644 index 67eeb2618a3..00000000000 --- a/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.h +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/client/misc/api/threaded_updater.h> - -#include <library/cpp/threading/future/future.h> - -#include <util/generic/map.h> -#include <util/thread/lfqueue.h> - -#include <optional> - -namespace NTvmAuth::NDynamicClient { - enum class EDstStatus { - Success, - Fail, - }; - - struct TDstResponse { - EDstStatus Status = EDstStatus::Fail; - TString Error; - - bool operator==(const TDstResponse& o) const { - return Status == o.Status && Error == o.Error; - } - }; - - using TDsts = NTvmApi::TDstSet; - using TAddResponse = TMap<NTvmApi::TClientSettings::TDst, TDstResponse>; - - class TTvmClient: public NTvmApi::TThreadedUpdater { - public: - static TIntrusivePtr<TTvmClient> Create(const NTvmApi::TClientSettings& settings, TLoggerPtr logger); - virtual ~TTvmClient(); - - NThreading::TFuture<TAddResponse> Add(TDsts&& dsts); - std::optional<TString> GetOptionalServiceTicketFor(const TTvmId dst); - - protected: // for tests - struct TTask { - ui64 Id = 0; - NThreading::TPromise<TAddResponse> Promise; - TDsts Dsts; - }; - - using TBase = NTvmApi::TThreadedUpdater; - - protected: // for tests - TTvmClient(const NTvmApi::TClientSettings& settings, TLoggerPtr logger); - - void Worker() override; - void ProcessTasks(); - - void SetResponseForTask(TTask& task, const TServiceTickets& cache); - - private: - std::atomic<ui64> TaskIds_ = {0}; - TLockFreeQueue<TTask> TaskQueue_; - TVector<TTask> Tasks_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/tvm_client_ut.cpp b/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/tvm_client_ut.cpp deleted file mode 100644 index c633b2457a2..00000000000 --- a/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/tvm_client_ut.cpp +++ /dev/null @@ -1,760 +0,0 @@ -#include <library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.h> - -#include <library/cpp/tvmauth/client/misc/disk_cache.h> - -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/testing/unittest/registar.h> - -#include <util/stream/file.h> -#include <util/system/fs.h> - -#include <regex> - -using namespace NTvmAuth; -using namespace NTvmAuth::NDynamicClient; - -Y_UNIT_TEST_SUITE(DynamicClient) { - static const std::regex TIME_REGEX(R"(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d.\d{6}Z)"); - static const TString CACHE_DIR = "./tmp/"; - - static void WriteFile(TString name, TStringBuf body, TInstant time) { - NFs::Remove(CACHE_DIR + name); - TFileOutput f(CACHE_DIR + name); - f << TDiskWriter::PrepareData(time, body); - } - - static void CleanCache() { - NFs::RemoveRecursive(CACHE_DIR); - NFs::MakeDirectoryRecursive(CACHE_DIR); - } - - class TLogger: public NTvmAuth::ILogger { - public: - void Log(int lvl, const TString& msg) override { - Cout << TInstant::Now() << " lvl=" << lvl << " msg: " << msg << "\n"; - Stream << lvl << ": " << msg << Endl; - } - - TStringStream Stream; - }; - - class TOfflineUpdater: public NDynamicClient::TTvmClient { - public: - TOfflineUpdater(const NTvmApi::TClientSettings& settings, - TIntrusivePtr<TLogger> l, - bool fail = true, - std::vector<TString> tickets = {}) - : TTvmClient(settings, l) - , Fail(fail) - , Tickets(std::move(tickets)) - { - Init(); - ExpBackoff_.SetEnabled(false); - } - - NUtils::TFetchResult FetchServiceTicketsFromHttp(const TString& req) const override { - if (Fail) { - throw yexception() << "tickets: alarm"; - } - - TString response; - if (!Tickets.empty()) { - response = Tickets.front(); - Tickets.erase(Tickets.begin()); - } - - Cout << "*** FetchServiceTicketsFromHttp. request: " << req << ". response: " << response << Endl; - return {200, {}, "/2/ticket", response, ""}; - } - - NUtils::TFetchResult FetchPublicKeysFromHttp() const override { - if (Fail) { - throw yexception() << "keysalarm"; - } - Cout << "*** FetchPublicKeysFromHttp" << Endl; - return {200, {}, "/2/keys", PublicKeys, ""}; - } - - using TTvmClient::GetDsts; - using TTvmClient::ProcessTasks; - using TTvmClient::SetResponseForTask; - using TTvmClient::Worker; - - bool Fail = true; - TString PublicKeys = NUnittest::TVMKNIFE_PUBLIC_KEYS; - mutable std::vector<TString> Tickets; - }; - - Y_UNIT_TEST(StartWithIncompleteTicketsSet) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"kolmo", 213}}, - .IsIncompleteTicketsSetAnError = false, - }; - - auto l = MakeIntrusive<TLogger>(); - - { - TOfflineUpdater client(s, - l, - false, - { - R"({"213" : { "error" : "some error"}})", - R"({"123" : { "ticket" : "service_ticket_3"}})", - }); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); - - NThreading::TFuture<TAddResponse> fut = client.Add({123}); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - - UNIT_ASSERT(fut.HasValue()); - TAddResponse resp{ - {123, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, *client.GetDsts()); - - UNIT_ASSERT_EXCEPTION_CONTAINS(client.GetOptionalServiceTicketFor(213), TMissingServiceTicket, "some error"); - } - } - - Y_UNIT_TEST(StartWithEmptyTicketsSet) { - CleanCache(); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"kolmo", 213}}, - .IsIncompleteTicketsSetAnError = false, - }; - - auto l = MakeIntrusive<TLogger>(); - - { - TOfflineUpdater client(s, - l, - false, - { - R"({"213" : { "error" : "some error"}})", - R"({"123" : { "ticket" : "3:serv:CBAQ__________9_IgYIlJEGEHs:CcafYQH-FF5XaXMuJrgLZj98bIC54cs1ZkcFS9VV_9YM9iOM_0PXCtMkdg85rFjxE_BMpg7bE8ZuoqNfdw0FPt0BAKNeISwlydj4o0IjY82--LZBpP8CRn-EpAnkRaDShdlfrcF2pk1SSmEX8xdyZVQEnkUPY0cHGlFnu231vnE"}})", - }); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT_EXCEPTION_CONTAINS(client.GetOptionalServiceTicketFor(213), TMissingServiceTicket, "some error"); - - NThreading::TFuture<TAddResponse> fut = client.Add({123}); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); - - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - - UNIT_ASSERT(fut.HasValue()); - TAddResponse resp{ - {123, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, *client.GetDsts()); - - UNIT_ASSERT_EXCEPTION_CONTAINS(client.GetOptionalServiceTicketFor(213), TMissingServiceTicket, "some error"); - } - }; - Y_UNIT_TEST(StartWithIncompleteCacheAndAdd) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"kolmo", 213}}, - }; - - auto l = MakeIntrusive<TLogger>(); - - UNIT_ASSERT_EXCEPTION_CONTAINS(TOfflineUpdater(s, l), - TRetriableException, - "Failed to start TvmClient. You can retry: ServiceTickets: tickets: alarm"); - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): XXXXXXXXXXX\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "4: Failed to get ServiceTickets: tickets: alarm\n" - << "4: Failed to get ServiceTickets: tickets: alarm\n" - << "4: Failed to get ServiceTickets: tickets: alarm\n" - << "4: Failed to update service tickets: tickets: alarm\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - l->Stream.Str().clear(); - - { - TOfflineUpdater client(s, - l, - false, - { - R"({"213" : { "ticket" : "service_ticket_2"}})", - R"({"123" : { "ticket" : "service_ticket_3"}})", - }); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - - NThreading::TFuture<TAddResponse> fut = client.Add({123}); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - - UNIT_ASSERT(fut.HasValue()); - TAddResponse resp{ - {123, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, *client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Response with service tickets for 1 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 1 destination(s)\n" - << "6: Cache was partly updated with 1 service ticket(s). total: 2\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: got task #1 with 1 dsts\n" - << "7: Response with service tickets for 1 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 1 destination(s)\n" - << "6: Cache was partly updated with 1 service ticket(s). total: 3\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: set value\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(StartWithCacheAndAdd) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - .IsIncompleteTicketsSetAnError = false, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater client(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - - client.Fail = false; - client.Tickets = { - R"({"123" : { "ticket" : "service_ticket_3"}, "213" : { "ticket" : "service_ticket_2"}})", - }; - NThreading::TFuture<TAddResponse> fut = client.Add({123, 213}); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - - UNIT_ASSERT(fut.HasValue()); - TAddResponse resp{ - {123, {EDstStatus::Success, ""}}, - {213, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, *client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Adding dst: got task #1 with 2 dsts\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" - << "6: Cache was partly updated with 2 service ticket(s). total: 3\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: dst=213 got ticket\n" - << "7: Adding dst: task #1: set value\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(StartWithCacheAndAddSeveral) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater client(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - - client.Fail = false; - client.Tickets = { - R"({"123" : { "ticket" : "service_ticket_3"}, "213" : { "ticket" : "service_ticket_2"}})", - }; - NThreading::TFuture<TAddResponse> fut1 = client.Add({123}); - NThreading::TFuture<TAddResponse> fut2 = client.Add({213}); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - - UNIT_ASSERT(fut1.HasValue()); - TAddResponse resp1{ - {123, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp1, fut1.GetValue()); - - UNIT_ASSERT(fut2.HasValue()); - TAddResponse resp2{ - {213, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp2, fut2.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, *client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Adding dst: got task #1 with 1 dsts\n" - << "7: Adding dst: got task #2 with 1 dsts\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" - << "6: Cache was partly updated with 2 service ticket(s). total: 3\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: set value\n" - << "7: Adding dst: task #2: dst=213 got ticket\n" - << "7: Adding dst: task #2: set value\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(StartWithCacheAndAddSeveralWithErrors) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater client(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - - UNIT_ASSERT(client.GetOptionalServiceTicketFor(19)); - UNIT_ASSERT_VALUES_EQUAL("3:serv:CBAQ__________9_IgYIKhCUkQY:CX", - *client.GetOptionalServiceTicketFor(19)); - UNIT_ASSERT(!client.GetOptionalServiceTicketFor(456)); - - client.Fail = false; - client.Tickets = { - R"({ - "123" : { "ticket" : "service_ticket_3"}, - "213" : { "ticket" : "service_ticket_2"}, - "456" : { "error" : "error_3"} - })", - }; - NThreading::TFuture<TAddResponse> fut1 = client.Add({123, 213}); - NThreading::TFuture<TAddResponse> fut2 = client.Add({213, 456}); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(456)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(456)); - - UNIT_ASSERT(client.GetOptionalServiceTicketFor(19)); - UNIT_ASSERT_VALUES_EQUAL("3:serv:CBAQ__________9_IgYIKhCUkQY:CX", - *client.GetOptionalServiceTicketFor(19)); - UNIT_ASSERT_EXCEPTION_CONTAINS(client.GetOptionalServiceTicketFor(456), - TMissingServiceTicket, - "Failed to get ticket for '456': error_3"); - - UNIT_ASSERT(fut1.HasValue()); - TAddResponse resp1{ - {123, {EDstStatus::Success, ""}}, - {213, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp1, fut1.GetValue()); - - UNIT_ASSERT(fut2.HasValue()); - TAddResponse resp2{ - {213, {EDstStatus::Success, ""}}, - {456, {EDstStatus::Fail, "error_3"}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp2, fut2.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, *client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Adding dst: got task #1 with 2 dsts\n" - << "7: Adding dst: got task #2 with 2 dsts\n" - << "7: Response with service tickets for 3 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 3 destination(s)\n" - << "3: Failed to get service ticket for dst=456: error_3\n" - << "6: Cache was partly updated with 2 service ticket(s). total: 3\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: dst=213 got ticket\n" - << "7: Adding dst: task #1: set value\n" - << "7: Adding dst: task #2: dst=213 got ticket\n" - << "4: Adding dst: task #2: dst=456 failed to get ticket: error_3\n" - << "7: Adding dst: task #2: set value\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(WithException) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater client(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - - client.Fail = false; - client.Tickets = { - R"({ - "123" : { "ticket" : "service_ticket_3"}, - "213" : { "ticket" : "service_ticket_2"}, - "456" : { "error" : "error_3"}, - "789" : { "ticket" : "service_ticket_4"} - })", - }; - NThreading::TFuture<TAddResponse> fut1 = client.Add({123, 213}); - NThreading::TFuture<TAddResponse> fut2 = client.Add({213, 456}); - NThreading::TFuture<TAddResponse> fut3 = client.Add({789}); - - fut2.Subscribe([](const auto&) { - throw yexception() << "planed exc"; - }); - fut3.Subscribe([](const auto&) { - throw 5; - }); - - UNIT_ASSERT_NO_EXCEPTION(client.Worker()); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(456)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(456)); - - UNIT_ASSERT(fut1.HasValue()); - TAddResponse resp1{ - {123, {EDstStatus::Success, ""}}, - {213, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp1, fut1.GetValue()); - - UNIT_ASSERT(fut2.HasValue()); - TAddResponse resp2{ - {213, {EDstStatus::Success, ""}}, - {456, {EDstStatus::Fail, "error_3"}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp2, fut2.GetValue()); - - UNIT_ASSERT(fut3.HasValue()); - TAddResponse resp3{ - {789, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp3, fut3.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213, 789}; - UNIT_ASSERT_VALUES_EQUAL(dsts, *client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Adding dst: got task #1 with 2 dsts\n" - << "7: Adding dst: got task #2 with 2 dsts\n" - << "7: Adding dst: got task #3 with 1 dsts\n" - << "7: Response with service tickets for 4 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 4 destination(s)\n" - << "3: Failed to get service ticket for dst=456: error_3\n" - << "6: Cache was partly updated with 3 service ticket(s). total: 4\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: dst=213 got ticket\n" - << "7: Adding dst: task #1: set value\n" - << "7: Adding dst: task #2: dst=213 got ticket\n" - << "4: Adding dst: task #2: dst=456 failed to get ticket: error_3\n" - << "7: Adding dst: task #2: set value\n" - << "3: Adding dst: task #2: exception: planed exc\n" - << "7: Adding dst: task #3: dst=789 got ticket\n" - << "7: Adding dst: task #3: set value\n" - << "3: Adding dst: task #3: exception: unknown error\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(UseCacheOnAddAfterRestart) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - .IsIncompleteTicketsSetAnError = false, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater client(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - - client.Fail = false; - client.Tickets = { - R"({"123" : { "ticket" : "3:serv:CBAQ__________9_IgQIExB7:V9zPxvEi-VYK2FffYkkT0lF_Ol2XXGzZDH-dVpx0Vo962KDh6n3AtPiCGpYZsLFZkJ5BcujVOUVfONprbm9WqZaPk6qDRuBd-OfYjGRDNUGAP_v5a1bZEBZhaRV8pvceh28E5QsgpOz1SEN5viKgPt1Tz9EmN8abQZiCPj2mqY8"}, - "213" : { "ticket" : "3:serv:CBAQ__________9_IgUIExDVAQ:Ten8XGEC1rupV9GsKvEG9IbN5DazwS3rmpEuFbgk34RaNeLO9g1mAvxKhL76hQnrgi_KjXv_xEtyQ4awBTXeQuhSlC0wkgargsc96AShWBFfHuTM-ftDtn5VdF9d8k1TEsTdJfZsW3_E_wy_3FQhs_rnoIowys6_SAh8YLpqaQk"}})", - }; - NThreading::TFuture<TAddResponse> fut = client.Add({123, 213}); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - - UNIT_ASSERT(fut.HasValue()); - TAddResponse resp{ - {123, {EDstStatus::Success, ""}}, - {213, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, *client.GetDsts()); - } - { - TOfflineUpdater client(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); - - NThreading::TFuture<TAddResponse> fut = client.Add({123, 213}); - fut.Wait(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - - UNIT_ASSERT(fut.HasValue()); - TAddResponse resp{ - {123, {EDstStatus::Success, ""}}, - {213, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, *client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Adding dst: got task #1 with 2 dsts\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" - << "6: Cache was partly updated with 2 service ticket(s). total: 3\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: dst=213 got ticket\n" - << "7: Adding dst: task #1: set value\n" - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 3 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "6: Cache was updated with 3 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: Got ticket from disk cache: dst=123 got ticket\n" - << "7: Got ticket from disk cache: dst=213 got ticket\n", - l->Stream.Str()); - } -} - -template <> -void Out<NTvmAuth::NDynamicClient::TDstResponse>(IOutputStream& out, const NTvmAuth::NDynamicClient::TDstResponse& m) { - out << m.Status << " (" << m.Error << ")"; -} - -template <> -void Out<NTvmAuth::NTvmApi::TClientSettings::TDst>(IOutputStream& out, const NTvmAuth::NTvmApi::TClientSettings::TDst& m) { - out << m.Id; -} diff --git a/library/cpp/tvmauth/client/misc/api/retry_settings.h b/library/cpp/tvmauth/client/misc/api/retry_settings.h deleted file mode 100644 index 607b2308112..00000000000 --- a/library/cpp/tvmauth/client/misc/api/retry_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/client/misc/exponential_backoff.h> - -namespace NTvmAuth::NTvmApi { - struct TRetrySettings { - TExponentialBackoff::TSettings BackoffSettings = { - TDuration::Seconds(0), - TDuration::Minutes(1), - 2, - 0.5, - }; - TDuration MaxRandomSleepDefault = TDuration::Seconds(5); - TDuration MaxRandomSleepWhenOk = TDuration::Minutes(1); - ui32 RetriesOnStart = 3; - ui32 RetriesInBackground = 2; - TDuration WorkerAwakingPeriod = TDuration::Seconds(10); - ui32 DstsLimit = 300; - TDuration RolesUpdatePeriod = TDuration::Minutes(10); - TDuration RolesWarnPeriod = TDuration::Minutes(20); - - bool operator==(const TRetrySettings& o) const { - return BackoffSettings == o.BackoffSettings && - MaxRandomSleepDefault == o.MaxRandomSleepDefault && - MaxRandomSleepWhenOk == o.MaxRandomSleepWhenOk && - RetriesOnStart == o.RetriesOnStart && - WorkerAwakingPeriod == o.WorkerAwakingPeriod && - DstsLimit == o.DstsLimit && - RolesUpdatePeriod == o.RolesUpdatePeriod && - RolesWarnPeriod == o.RolesWarnPeriod; - } - }; -} diff --git a/library/cpp/tvmauth/client/misc/api/roles_fetcher.cpp b/library/cpp/tvmauth/client/misc/api/roles_fetcher.cpp deleted file mode 100644 index 8f4b359e8cf..00000000000 --- a/library/cpp/tvmauth/client/misc/api/roles_fetcher.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include "roles_fetcher.h" - -#include <library/cpp/tvmauth/client/misc/disk_cache.h> -#include <library/cpp/tvmauth/client/misc/roles/decoder.h> -#include <library/cpp/tvmauth/client/misc/roles/parser.h> - -#include <library/cpp/http/misc/httpcodes.h> -#include <library/cpp/string_utils/quote/quote.h> - -#include <util/string/builder.h> -#include <util/string/join.h> - -namespace NTvmAuth::NTvmApi { - static TString CreatePath(const TString& dir, const TString& file) { - return dir.EndsWith("/") - ? dir + file - : dir + "/" + file; - } - - TRolesFetcher::TRolesFetcher(const TRolesFetcherSettings& settings, TLoggerPtr logger) - : Settings_(settings) - , Logger_(logger) - , CacheFilePath_(CreatePath(Settings_.CacheDir, "roles")) - { - Client_ = std::make_unique<TKeepAliveHttpClient>( - Settings_.TiroleHost, - Settings_.TirolePort, - Settings_.Timeout, - Settings_.Timeout); - } - - TInstant TRolesFetcher::ReadFromDisk() { - TDiskReader dr(CacheFilePath_, Logger_.Get()); - if (!dr.Read()) { - return {}; - } - - std::pair<TString, TString> data = ParseDiskFormat(dr.Data()); - if (data.second != Settings_.IdmSystemSlug) { - Logger_->Warning( - TStringBuilder() << "Roles in disk cache are for another slug (" << data.second - << "). Self=" << Settings_.IdmSystemSlug); - return {}; - } - - CurrentRoles_.Set(NRoles::TParser::Parse(std::make_shared<TString>(std::move(data.first)))); - Logger_->Debug( - TStringBuilder() << "Succeed to read roles with revision " - << CurrentRoles_.Get()->GetMeta().Revision - << " from " << CacheFilePath_); - - return dr.Time(); - } - - bool TRolesFetcher::AreRolesOk() const { - return bool(GetCurrentRoles()); - } - - bool TRolesFetcher::IsTimeToUpdate(const TRetrySettings& settings, TDuration sinceUpdate) { - return settings.RolesUpdatePeriod < sinceUpdate; - } - - bool TRolesFetcher::ShouldWarn(const TRetrySettings& settings, TDuration sinceUpdate) { - return settings.RolesWarnPeriod < sinceUpdate; - } - - NUtils::TFetchResult TRolesFetcher::FetchActualRoles(const TString& serviceTicket) { - TStringStream out; - THttpHeaders outHeaders; - - TRequest req = CreateTiroleRequest(serviceTicket); - TKeepAliveHttpClient::THttpCode code = Client_->DoGet( - req.Url, - &out, - req.Headers, - &outHeaders); - - const THttpInputHeader* reqId = outHeaders.FindHeader("X-Request-Id"); - - Logger_->Debug( - TStringBuilder() << "Succeed to perform request for roles to " << Settings_.TiroleHost - << " (request_id=" << (reqId ? reqId->Value() : "") - << "). code=" << code); - - return {code, std::move(outHeaders), "/v1/get_actual_roles", out.Str(), {}}; - } - - void TRolesFetcher::Update(NUtils::TFetchResult&& fetchResult, TInstant now) { - if (fetchResult.Code == HTTP_NOT_MODIFIED) { - Y_ENSURE(CurrentRoles_.Get(), - "tirole did not return any roles because current roles are actual," - " but there are no roles in memory - this should never happen"); - return; - } - - Y_ENSURE(fetchResult.Code == HTTP_OK, - "Unexpected code from tirole: " << fetchResult.Code << ". " << fetchResult.Response); - - const THttpInputHeader* codec = fetchResult.Headers.FindHeader("X-Tirole-Compression"); - const TStringBuf codecBuf = codec ? codec->Value() : ""; - - NRoles::TRawPtr blob; - try { - blob = std::make_shared<TString>(NRoles::TDecoder::Decode( - codecBuf, - std::move(fetchResult.Response))); - } catch (const std::exception& e) { - throw yexception() << "Failed to decode blob with codec '" << codecBuf - << "': " << e.what(); - } - - CurrentRoles_.Set(NRoles::TParser::Parse(blob)); - - Logger_->Debug( - TStringBuilder() << "Succeed to update roles with revision " - << CurrentRoles_.Get()->GetMeta().Revision); - - TDiskWriter dw(CacheFilePath_, Logger_.Get()); - dw.Write(PrepareDiskFormat(*blob, Settings_.IdmSystemSlug), now); - } - - NTvmAuth::NRoles::TRolesPtr TRolesFetcher::GetCurrentRoles() const { - return CurrentRoles_.Get(); - } - - void TRolesFetcher::ResetConnection() { - Client_->ResetConnection(); - } - - static const char DELIMETER = '\t'; - - std::pair<TString, TString> TRolesFetcher::ParseDiskFormat(TStringBuf filebody) { - TStringBuf slug = filebody.RNextTok(DELIMETER); - return {TString(filebody), CGIUnescapeRet(slug)}; - } - - TString TRolesFetcher::PrepareDiskFormat(TStringBuf roles, TStringBuf slug) { - TStringStream res; - res.Reserve(roles.size() + 1 + slug.size()); - res << roles << DELIMETER << CGIEscapeRet(slug); - return res.Str(); - } - - TRolesFetcher::TRequest TRolesFetcher::CreateTiroleRequest(const TString& serviceTicket) const { - TRolesFetcher::TRequest res; - - TStringStream url; - url.Reserve(512); - url << "/v1/get_actual_roles?"; - url << "system_slug=" << CGIEscapeRet(Settings_.IdmSystemSlug) << "&"; - Settings_.ProcInfo.AddToRequest(url); - res.Url = std::move(url.Str()); - - res.Headers.reserve(2); - res.Headers.emplace(XYaServiceTicket_, serviceTicket); - - NRoles::TRolesPtr roles = CurrentRoles_.Get(); - if (roles) { - res.Headers.emplace(IfNoneMatch_, Join("", "\"", roles->GetMeta().Revision, "\"")); - } - - return res; - } -} diff --git a/library/cpp/tvmauth/client/misc/api/roles_fetcher.h b/library/cpp/tvmauth/client/misc/api/roles_fetcher.h deleted file mode 100644 index 63691223b50..00000000000 --- a/library/cpp/tvmauth/client/misc/api/roles_fetcher.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include "retry_settings.h" - -#include <library/cpp/tvmauth/client/misc/fetch_result.h> -#include <library/cpp/tvmauth/client/misc/proc_info.h> -#include <library/cpp/tvmauth/client/misc/utils.h> -#include <library/cpp/tvmauth/client/misc/roles/roles.h> - -#include <library/cpp/tvmauth/client/logger.h> - -#include <library/cpp/http/simple/http_client.h> - -namespace NTvmAuth::NTvmApi { - struct TRolesFetcherSettings { - TString TiroleHost; - ui16 TirolePort = 0; - TString CacheDir; - NUtils::TProcInfo ProcInfo; - TTvmId SelfTvmId = 0; - TString IdmSystemSlug; - TDuration Timeout = TDuration::Seconds(30); - }; - - class TRolesFetcher { - public: - TRolesFetcher(const TRolesFetcherSettings& settings, TLoggerPtr logger); - - TInstant ReadFromDisk(); - - bool AreRolesOk() const; - static bool IsTimeToUpdate(const TRetrySettings& settings, TDuration sinceUpdate); - static bool ShouldWarn(const TRetrySettings& settings, TDuration sinceUpdate); - - NUtils::TFetchResult FetchActualRoles(const TString& serviceTicket); - void Update(NUtils::TFetchResult&& fetchResult, TInstant now = TInstant::Now()); - - NTvmAuth::NRoles::TRolesPtr GetCurrentRoles() const; - - void ResetConnection(); - - public: - static std::pair<TString, TString> ParseDiskFormat(TStringBuf filebody); - static TString PrepareDiskFormat(TStringBuf roles, TStringBuf slug); - - struct TRequest { - TString Url; - TKeepAliveHttpClient::THeaders Headers; - }; - TRequest CreateTiroleRequest(const TString& serviceTicket) const; - - private: - const TRolesFetcherSettings Settings_; - const TLoggerPtr Logger_; - const TString CacheFilePath_; - const TString XYaServiceTicket_ = "X-Ya-Service-Ticket"; - const TString IfNoneMatch_ = "If-None-Match"; - - NUtils::TProtectedValue<NTvmAuth::NRoles::TRolesPtr> CurrentRoles_; - - std::unique_ptr<TKeepAliveHttpClient> Client_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/api/settings.cpp b/library/cpp/tvmauth/client/misc/api/settings.cpp deleted file mode 100644 index eddad21869e..00000000000 --- a/library/cpp/tvmauth/client/misc/api/settings.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include "settings.h" - -#include <util/datetime/base.h> -#include <util/stream/file.h> -#include <util/system/fs.h> - -#include <set> - -namespace NTvmAuth::NTvmApi { - void TClientSettings::CheckPermissions(const TString& dir) { - const TString name = dir + "/check.tmp"; - - try { - NFs::EnsureExists(dir); - - TFile file(name, CreateAlways | RdWr); - - NFs::Remove(name); - } catch (const std::exception& e) { - NFs::Remove(name); - ythrow TPermissionDenied() << "Permission denied to disk cache directory: " << e.what(); - } - } - - void TClientSettings::CheckValid() const { - if (DiskCacheDir) { - CheckPermissions(DiskCacheDir); - } - - if (TStringBuf(Secret)) { - Y_ENSURE_EX(NeedServiceTicketsFetching(), - TBrokenTvmClientSettings() << "Secret is present but destinations list is empty. It makes no sense"); - } - if (NeedServiceTicketsFetching()) { - Y_ENSURE_EX(SelfTvmId != 0, - TBrokenTvmClientSettings() << "SelfTvmId cannot be 0 if fetching of Service Tickets required"); - Y_ENSURE_EX((TStringBuf)Secret, - TBrokenTvmClientSettings() << "Secret is required for fetching of Service Tickets"); - } - - if (CheckServiceTickets) { - Y_ENSURE_EX(SelfTvmId != 0, - TBrokenTvmClientSettings() << "SelfTvmId cannot be 0 if checking of Service Tickets required"); - } - - if (FetchRolesForIdmSystemSlug) { - Y_ENSURE_EX(DiskCacheDir, - TBrokenTvmClientSettings() << "Disk cache must be enabled to use roles: " - "they can be heavy"); - } - - bool needSmth = NeedServiceTicketsFetching() || - CheckServiceTickets || - CheckUserTicketsWithBbEnv; - Y_ENSURE_EX(needSmth, TBrokenTvmClientSettings() << "Invalid settings: nothing to do"); - - // Useless now: keep it here to avoid forgetting check from TDst. TODO: PASSP-35377 - for (const auto& dst : FetchServiceTicketsForDsts) { - Y_ENSURE_EX(dst.Id != 0, TBrokenTvmClientSettings() << "TvmId cannot be 0"); - } - // TODO: check only FetchServiceTicketsForDsts_ - // Python binding checks settings before normalization - for (const auto& [alias, dst] : FetchServiceTicketsForDstsWithAliases) { - Y_ENSURE_EX(dst.Id != 0, TBrokenTvmClientSettings() << "TvmId cannot be 0"); - } - Y_ENSURE_EX(TiroleTvmId != 0, TBrokenTvmClientSettings() << "TiroleTvmId cannot be 0"); - } - - TClientSettings TClientSettings::CloneNormalized() const { - TClientSettings res = *this; - - std::set<TTvmId> allDsts; - for (const auto& tvmid : res.FetchServiceTicketsForDsts) { - allDsts.insert(tvmid.Id); - } - for (const auto& [alias, tvmid] : res.FetchServiceTicketsForDstsWithAliases) { - allDsts.insert(tvmid.Id); - } - if (FetchRolesForIdmSystemSlug) { - allDsts.insert(res.TiroleTvmId); - } - - res.FetchServiceTicketsForDsts = {allDsts.begin(), allDsts.end()}; - - res.CheckValid(); - - return res; - } -} diff --git a/library/cpp/tvmauth/client/misc/api/settings.h b/library/cpp/tvmauth/client/misc/api/settings.h deleted file mode 100644 index 4f901dda578..00000000000 --- a/library/cpp/tvmauth/client/misc/api/settings.h +++ /dev/null @@ -1,236 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/client/misc/settings.h> - -#include <library/cpp/tvmauth/client/exception.h> - -#include <library/cpp/tvmauth/checked_user_ticket.h> -#include <library/cpp/tvmauth/type.h> - -#include <library/cpp/string_utils/secret_string/secret_string.h> - -#include <util/datetime/base.h> -#include <util/generic/hash.h> -#include <util/generic/maybe.h> - -namespace NTvmAuth::NTvmApi { - /** - * Settings for TVM client. Uses https://tvm-api.yandex.net to get state. - * At least one of them is required: - * FetchServiceTicketsForDsts_/FetchServiceTicketsForDstsWithAliases_ - * CheckServiceTickets_ - * CheckUserTicketsWithBbEnv_ - */ - class TClientSettings: public NTvmAuth::TClientSettings { - public: - class TDst; - - /** - * Alias is an internal name for destinations within your code. - * You can associate a name with an tvm_id once in your code and use the name as an alias for - * tvm_id to each calling point. Useful for several environments: prod/test/etc. - * @example: - * // init - * static const TString MY_BACKEND = "my backend"; - * TDstMap map = {{MY_BACKEND, TDst(config.get("my_back_tvm_id"))}}; - * ... - * // per request - * TString t = tvmClient.GetServiceTicket(MY_BACKEND); - */ - using TDstMap = THashMap<TAlias, TDst>; - using TDstVector = TVector<TDst>; - - public: - /*! - * NOTE: Please use this option: it provides the best reliability - * NOTE: Client requires read/write permissions - * WARNING: The same directory can be used only: - * - for TVM clients with the same settings - * OR - * - for new client replacing previous - with another config. - * System user must be the same for processes with these clients inside. - * Implementation doesn't provide other scenarios. - */ - TString DiskCacheDir; - - // Required for Service Ticket fetching or checking - TTvmId SelfTvmId = 0; - - // Options for Service Tickets fetching - NSecretString::TSecretString Secret; - /*! - * Client will process both attrs: - * FetchServiceTicketsForDsts_, FetchServiceTicketsForDstsWithAliases_ - * WARNING: It is not way to provide authorization for incoming ServiceTickets! - * It is way only to send your ServiceTickets to your backend! - */ - TDstVector FetchServiceTicketsForDsts; - TDstMap FetchServiceTicketsForDstsWithAliases; - bool IsIncompleteTicketsSetAnError = true; - - // Options for Service Tickets checking - bool CheckServiceTickets = false; - - // Options for User Tickets checking - TMaybe<EBlackboxEnv> CheckUserTicketsWithBbEnv; - - // Options for roles fetching - TString FetchRolesForIdmSystemSlug; - /*! - * By default client checks src from ServiceTicket or default uid from UserTicket - - * to prevent you from forgetting to check it yourself. - * It does binary checks only: - * ticket gets status NoRoles, if there is no role for src or default uid. - * You need to check roles on your own if you have a non-binary role system or - * you have disabled ShouldCheckSrc/ShouldCheckDefaultUid - * - * You may need to disable this check in the following cases: - * - You use GetRoles() to provide verbose message (with revision). - * Double check may be inconsistent: - * binary check inside client uses revision of roles X - i.e. src 100500 has no role, - * exact check in your code uses revision of roles Y - i.e. src 100500 has some roles. - */ - bool ShouldCheckSrc = true; - bool ShouldCheckDefaultUid = true; - /*! - * By default client checks dst from ServiceTicket. If this check is switched off - * incorrect dst does not result in error of checked ticket status - * DANGEROUS: This case you must check dst manualy using @link TCheckedServiceTicket::GetDst() - */ - bool ShouldCheckDst = true; - - // Options for tests - TString TvmHost = "https://tvm-api.yandex.net"; - ui16 TvmPort = 443; - TString TiroleHost = "https://tirole-api.yandex.net"; - TDuration TvmSocketTimeout = TDuration::Seconds(5); - TDuration TvmConnectTimeout = TDuration::Seconds(30); - ui16 TirolePort = 443; - TTvmId TiroleTvmId = TIROLE_TVMID; - - // for debug purposes - TString LibVersionPrefix; - - void CheckValid() const; - TClientSettings CloneNormalized() const; - - static inline const TTvmId TIROLE_TVMID = 2028120; - static inline const TTvmId TIROLE_TVMID_TEST = 2026536; - - // DEPRECATED API - // TODO: get rid of it: PASSP-35377 - public: - // Deprecated: set attributes directly - void SetSelfTvmId(TTvmId selfTvmId) { - SelfTvmId = selfTvmId; - } - - // Deprecated: set attributes directly - void EnableServiceTicketChecking() { - CheckServiceTickets = true; - } - - // Deprecated: set attributes directly - void EnableUserTicketChecking(EBlackboxEnv env) { - CheckUserTicketsWithBbEnv = env; - } - - // Deprecated: set attributes directly - void SetTvmHostPort(const TString& host, ui16 port) { - TvmHost = host; - TvmPort = port; - } - - // Deprecated: set attributes directly - void SetTiroleHostPort(const TString& host, ui16 port) { - TiroleHost = host; - TirolePort = port; - } - - // Deprecated: set attributes directly - void EnableRolesFetching(const TString& systemSlug, TTvmId tiroleTvmId = TIROLE_TVMID) { - TiroleTvmId = tiroleTvmId; - FetchRolesForIdmSystemSlug = systemSlug; - } - - // Deprecated: set attributes directly - void DoNotCheckSrcByDefault() { - ShouldCheckSrc = false; - } - - // Deprecated: set attributes directly - void DoNotCheckDefaultUidByDefault() { - ShouldCheckDefaultUid = false; - } - - // Deprecated: set attributes directly - void SetDiskCacheDir(const TString& dir) { - DiskCacheDir = dir; - } - - // Deprecated: set attributes directly - void EnableServiceTicketsFetchOptions(const TStringBuf selfSecret, - TDstMap&& dsts, - const bool considerIncompleteTicketsSetAsError = true) { - IsIncompleteTicketsSetAnError = considerIncompleteTicketsSetAsError; - Secret = selfSecret; - - FetchServiceTicketsForDsts = TDstVector{}; - FetchServiceTicketsForDsts.reserve(dsts.size()); - for (const auto& pair : dsts) { - FetchServiceTicketsForDsts.push_back(pair.second); - } - - FetchServiceTicketsForDstsWithAliases = std::move(dsts); - } - - // Deprecated: set attributes directly - void EnableServiceTicketsFetchOptions(const TStringBuf selfSecret, - TDstVector&& dsts, - const bool considerIncompleteTicketsSetAsError = true) { - IsIncompleteTicketsSetAnError = considerIncompleteTicketsSetAsError; - Secret = selfSecret; - FetchServiceTicketsForDsts = std::move(dsts); - } - - public: - bool IsServiceTicketFetchingRequired() const { - return bool(Secret.Value()); - } - - bool NeedServiceTicketsFetching() const { - return !FetchServiceTicketsForDsts.empty() || - !FetchServiceTicketsForDstsWithAliases.empty() || - FetchRolesForIdmSystemSlug; - } - - // TODO: get rid of TDst: PASSP-35377 - class TDst { - public: - TDst(TTvmId id) - : Id(id) - { - Y_ENSURE_EX(id != 0, TBrokenTvmClientSettings() << "TvmId cannot be 0"); - } - - TTvmId Id; - - bool operator==(const TDst& o) const { - return Id == o.Id; - } - - bool operator<(const TDst& o) const { - return Id < o.Id; - } - - public: // for python binding - TDst() - : Id(0) - { - } - }; - - public: - static void CheckPermissions(const TString& dir); - }; -} diff --git a/library/cpp/tvmauth/client/misc/api/threaded_updater.cpp b/library/cpp/tvmauth/client/misc/api/threaded_updater.cpp deleted file mode 100644 index c4a6415be8a..00000000000 --- a/library/cpp/tvmauth/client/misc/api/threaded_updater.cpp +++ /dev/null @@ -1,1049 +0,0 @@ -#include "threaded_updater.h" - -#include <library/cpp/tvmauth/client/misc/disk_cache.h> -#include <library/cpp/tvmauth/client/misc/utils.h> -#include <library/cpp/tvmauth/client/misc/retry_settings/v1/settings.pb.h> - -#include <library/cpp/tvmauth/client/logger.h> - -#include <library/cpp/json/json_reader.h> - -#include <util/stream/str.h> -#include <util/string/builder.h> -#include <util/string/cast.h> -#include <util/system/thread.h> - -namespace NTvmAuth::NTvmApi { - static TString CreatePublicKeysUrl(const TClientSettings& settings, - const NUtils::TProcInfo& procInfo) { - TStringStream s; - s << "/2/keys"; - s << "?"; - procInfo.AddToRequest(s); - - s << "&get_retry_settings=yes"; - - if (settings.SelfTvmId != 0) { - s << "&src=" << settings.SelfTvmId; - } - - if (settings.CheckUserTicketsWithBbEnv) { - s << "&env=" << static_cast<int>(*settings.CheckUserTicketsWithBbEnv); - } - - return s.Str(); - } - - TAsyncUpdaterPtr TThreadedUpdater::Create(const TClientSettings& settings, TLoggerPtr logger) { - Y_ENSURE_EX(logger, TNonRetriableException() << "Logger is required"); - THolder<TThreadedUpdater> p(new TThreadedUpdater(settings, std::move(logger))); - p->Init(); - p->StartWorker(); - return p.Release(); - } - - TThreadedUpdater::~TThreadedUpdater() { - ExpBackoff_.SetEnabled(false); - ExpBackoff_.Interrupt(); - StopWorker(); // Required here to avoid using of deleted members - } - - TClientStatus TThreadedUpdater::GetStatus() const { - const TClientStatus::ECode state = GetState(); - return TClientStatus(state, GetLastError(state == TClientStatus::Ok || state == TClientStatus::IncompleteTicketsSet)); - } - - NRoles::TRolesPtr TThreadedUpdater::GetRoles() const { - Y_ENSURE_EX(RolesFetcher_, - TBrokenTvmClientSettings() << "Roles were not configured in settings"); - return RolesFetcher_->GetCurrentRoles(); - } - - TClientStatus::ECode TThreadedUpdater::GetState() const { - const TInstant now = TInstant::Now(); - - if (Settings_.IsServiceTicketFetchingRequired()) { - if (AreServiceTicketsInvalid(now)) { - return TClientStatus::Error; - } - auto tickets = GetCachedServiceTickets(); - if (!tickets) { - return TClientStatus::Error; - } - if (tickets->TicketsById.size() < GetDsts()->size()) { - if (Settings_.IsIncompleteTicketsSetAnError) { - return TClientStatus::Error; - } else { - return TClientStatus::IncompleteTicketsSet; - } - } - } - if ((Settings_.CheckServiceTickets || Settings_.CheckUserTicketsWithBbEnv) && ArePublicKeysInvalid(now)) { - return TClientStatus::Error; - } - - const TDuration sincePublicKeysUpdate = now - GetUpdateTimeOfPublicKeys(); - const TDuration sinceServiceTicketsUpdate = now - GetUpdateTimeOfServiceTickets(); - const TDuration sinceRolesUpdate = now - GetUpdateTimeOfRoles(); - - if (Settings_.IsServiceTicketFetchingRequired() && sinceServiceTicketsUpdate > ServiceTicketsDurations_.Expiring) { - return TClientStatus::Warning; - } - if ((Settings_.CheckServiceTickets || Settings_.CheckUserTicketsWithBbEnv) && - sincePublicKeysUpdate > PublicKeysDurations_.Expiring) - { - return TClientStatus::Warning; - } - if (RolesFetcher_ && TRolesFetcher::ShouldWarn(RetrySettings_, sinceRolesUpdate)) { - return TClientStatus::Warning; - } - - return TClientStatus::Ok; - } - - TThreadedUpdater::TThreadedUpdater(const TClientSettings& settings, TLoggerPtr logger) - : TThreadedUpdaterBase( - TRetrySettings{}.WorkerAwakingPeriod, - std::move(logger), - settings.TvmHost, - settings.TvmPort, - settings.TvmSocketTimeout, - settings.TvmConnectTimeout) - , ExpBackoff_(RetrySettings_.BackoffSettings) - , ServiceTicketBatchUpdateMutex_(std::make_unique<std::mutex>()) - , Settings_(settings.CloneNormalized()) - , ProcInfo_(NUtils::TProcInfo::Create(Settings_.LibVersionPrefix)) - , PublicKeysUrl_(CreatePublicKeysUrl(Settings_, ProcInfo_)) - , DstAliases_(MakeAliasMap(Settings_)) - , Headers_({{"Content-Type", "application/x-www-form-urlencoded"}}) - , Random_(TInstant::Now().MicroSeconds()) - { - if (Settings_.IsServiceTicketFetchingRequired()) { - SigningContext_ = TServiceContext::SigningFactory(Settings_.Secret); - } - - if (Settings_.IsServiceTicketFetchingRequired()) { - Destinations_ = std::make_shared<const TDstSet>(Settings_.FetchServiceTicketsForDsts.begin(), Settings_.FetchServiceTicketsForDsts.end()); - } - - PublicKeysDurations_.RefreshPeriod = TDuration::Days(1); - ServiceTicketsDurations_.RefreshPeriod = TDuration::Hours(1); - - if (Settings_.CheckUserTicketsWithBbEnv) { - SetBbEnv(*Settings_.CheckUserTicketsWithBbEnv); - } - - if (Settings_.FetchRolesForIdmSystemSlug) { - RolesFetcher_ = std::make_unique<TRolesFetcher>( - TRolesFetcherSettings{ - Settings_.TiroleHost, - Settings_.TirolePort, - Settings_.DiskCacheDir, - ProcInfo_, - Settings_.SelfTvmId, - Settings_.FetchRolesForIdmSystemSlug, - }, - Logger_); - } - - if (Settings_.DiskCacheDir) { - TString path = Settings_.DiskCacheDir; - if (path.back() != '/') { - path.push_back('/'); - } - - if (Settings_.IsServiceTicketFetchingRequired()) { - ServiceTicketsFilepath_ = path; - ServiceTicketsFilepath_.append("service_tickets"); - } - - if (Settings_.CheckServiceTickets || Settings_.CheckUserTicketsWithBbEnv) { - PublicKeysFilepath_ = path; - PublicKeysFilepath_.append("public_keys"); - } - - RetrySettingsFilepath_ = path + "retry_settings"; - } else { - LogInfo("Disk cache disabled. Please set disk cache directory in settings for best reliability"); - } - } - - void TThreadedUpdater::Init() { - ReadStateFromDisk(); - ClearErrors(); - ExpBackoff_.SetEnabled(false); - - // First of all try to get tickets: there are a lot of reasons to fail this request. - // As far as disk cache usually disabled, client will not fetch keys before fail on every ctor call. - UpdateServiceTickets(); - if (!AreServicesTicketsOk()) { - ThrowLastError(); - } - - UpdatePublicKeys(); - if (!IsServiceContextOk() || !IsUserContextOk()) { - ThrowLastError(); - } - - UpdateRoles(); - if (RolesFetcher_ && !RolesFetcher_->AreRolesOk()) { - ThrowLastError(); - } - - Inited_ = true; - ExpBackoff_.SetEnabled(true); - } - - void TThreadedUpdater::UpdateServiceTickets() { - if (!Settings_.IsServiceTicketFetchingRequired()) { - return; - } - - TInstant stut = GetUpdateTimeOfServiceTickets(); - try { - if (IsTimeToUpdateServiceTickets(stut)) { - UpdateAllServiceTickets(); - NeedFetchMissingServiceTickets_ = false; - } else if (NeedFetchMissingServiceTickets_) { - TDstSetPtr dsts = GetDsts(); - if (GetCachedServiceTickets()->TicketsById.size() < dsts->size()) { - UpdateMissingServiceTickets(*dsts); - NeedFetchMissingServiceTickets_ = false; - } - } - if (AreServicesTicketsOk()) { - ClearError(EScope::ServiceTickets); - } - } catch (const std::exception& e) { - ProcessError(EType::Retriable, EScope::ServiceTickets, e.what()); - LogWarning(TStringBuilder() << "Failed to update service tickets: " << e.what()); - if (TInstant::Now() - stut > ServiceTicketsDurations_.Expiring) { - LogError("Service tickets have not been refreshed for too long period"); - } - } - } - - void TThreadedUpdater::UpdateAllServiceTickets() { - TDstSetPtr dsts = GetDsts(); - THttpResult st = GetServiceTicketsFromHttp(*dsts, RetrySettings_.DstsLimit); - - std::unique_lock lock(*ServiceTicketBatchUpdateMutex_); - - auto oldCache = GetCachedServiceTickets(); - if (oldCache) { - if (dsts->size() < GetDsts()->size()) { - for (const auto& pair : oldCache->TicketsById) { - st.TicketsWithErrors.Tickets.insert(pair); - } - } - - for (const auto& pair : oldCache->ErrorsById) { - st.TicketsWithErrors.Errors.insert(pair); - } - } - - UpdateServiceTicketsCache(std::move(st.TicketsWithErrors), TInstant::Now()); - - lock.unlock(); - - if (ServiceTicketsFilepath_) { - DiskCacheServiceTickets_ = CreateJsonArray(st.Responses); - TDiskWriter w(ServiceTicketsFilepath_, Logger_.Get()); - w.Write(PrepareTicketsForDisk(DiskCacheServiceTickets_, Settings_.SelfTvmId)); - } - } - - TServiceTicketsPtr TThreadedUpdater::UpdateMissingServiceTickets(const TDstSet& required) { - TServiceTicketsPtr cache = GetCachedServiceTickets(); - TClientSettings::TDstVector missingDsts = FindMissingDsts(cache, required); - - if (missingDsts.empty()) { - return cache; - } - - THttpResult st = GetServiceTicketsFromHttp(missingDsts, RetrySettings_.DstsLimit); - - std::unique_lock lock(*ServiceTicketBatchUpdateMutex_); - - cache = GetCachedServiceTickets(); - size_t gotTickets = st.TicketsWithErrors.Tickets.size(); - - TDstSetPtr oldDsts = GetDsts(); - std::shared_ptr<TDstSet> newDsts = std::make_shared<TDstSet>(oldDsts->begin(), oldDsts->end()); - - for (const auto& pair : cache->TicketsById) { - st.TicketsWithErrors.Tickets.insert(pair); - } - for (const auto& pair : cache->ErrorsById) { - st.TicketsWithErrors.Errors.insert(pair); - } - for (const auto& pair : st.TicketsWithErrors.Tickets) { - st.TicketsWithErrors.Errors.erase(pair.first); - newDsts->insert(pair.first); - } - - TServiceTicketsPtr c = UpdateServiceTicketsCachePartly( - std::move(st.TicketsWithErrors), - gotTickets); - - SetDsts(std::move(newDsts)); - - lock.unlock(); - - if (!c) { - LogWarning("UpdateMissingServiceTickets: new cache is NULL. BUG?"); - c = cache; - } - - if (!ServiceTicketsFilepath_) { - return c; - } - - DiskCacheServiceTickets_ = AppendToJsonArray(DiskCacheServiceTickets_, st.Responses); - - TDiskWriter w(ServiceTicketsFilepath_, Logger_.Get()); - w.Write(PrepareTicketsForDisk(DiskCacheServiceTickets_, Settings_.SelfTvmId)); - - return c; - } - - void TThreadedUpdater::UpdatePublicKeys() { - if (!Settings_.CheckServiceTickets && !Settings_.CheckUserTicketsWithBbEnv) { - return; - } - - TInstant pkut = GetUpdateTimeOfPublicKeys(); - if (!IsTimeToUpdatePublicKeys(pkut)) { - return; - } - - try { - TString publicKeys = GetPublicKeysFromHttp(); - - UpdatePublicKeysCache(publicKeys, TInstant::Now()); - if (PublicKeysFilepath_) { - TDiskWriter w(PublicKeysFilepath_, Logger_.Get()); - w.Write(publicKeys); - } - if (IsServiceContextOk() && IsUserContextOk()) { - ClearError(EScope::PublicKeys); - } - } catch (const std::exception& e) { - ProcessError(EType::Retriable, EScope::PublicKeys, e.what()); - LogWarning(TStringBuilder() << "Failed to update public keys: " << e.what()); - if (TInstant::Now() - pkut > PublicKeysDurations_.Expiring) { - LogError("Public keys have not been refreshed for too long period"); - } - } - } - - void TThreadedUpdater::UpdateRoles() { - if (!RolesFetcher_) { - return; - } - - TInstant rut = GetUpdateTimeOfRoles(); - if (!TRolesFetcher::IsTimeToUpdate(RetrySettings_, TInstant::Now() - rut)) { - return; - } - - struct TCloser { - TRolesFetcher* Fetcher; - ~TCloser() { - Fetcher->ResetConnection(); - } - } closer{RolesFetcher_.get()}; - - try { - TServiceTicketsPtr st = GetCachedServiceTickets(); - Y_ENSURE(st, "No one service ticket in memory: how it possible?"); - auto it = st->TicketsById.find(Settings_.TiroleTvmId); - Y_ENSURE(it != st->TicketsById.end(), - "Missing tvmid for tirole in cache: " << Settings_.TiroleTvmId); - - RolesFetcher_->Update( - FetchWithRetries( - [&]() { return RolesFetcher_->FetchActualRoles(it->second); }, - EScope::Roles)); - SetUpdateTimeOfRoles(TInstant::Now()); - - if (RolesFetcher_->AreRolesOk()) { - ClearError(EScope::Roles); - } - } catch (const std::exception& e) { - ProcessError(EType::Retriable, EScope::Roles, e.what()); - LogWarning(TStringBuilder() << "Failed to update roles: " << e.what()); - if (TRolesFetcher::ShouldWarn(RetrySettings_, TInstant::Now() - rut)) { - LogError("Roles have not been refreshed for too long period"); - } - } - } - - TServiceTicketsPtr TThreadedUpdater::UpdateServiceTicketsCachePartly( - TAsyncUpdaterBase::TPairTicketsErrors&& tickets, - size_t got) { - size_t count = tickets.Tickets.size(); - TServiceTicketsPtr c = MakeIntrusiveConst<TServiceTickets>(std::move(tickets.Tickets), - std::move(tickets.Errors), - DstAliases_); - SetServiceTickets(c); - LogInfo(TStringBuilder() - << "Cache was partly updated with " << got - << " service ticket(s). total: " << count); - - return c; - } - - void TThreadedUpdater::UpdateServiceTicketsCache(TPairTicketsErrors&& tickets, TInstant time) { - size_t count = tickets.Tickets.size(); - SetServiceTickets(MakeIntrusiveConst<TServiceTickets>(std::move(tickets.Tickets), - std::move(tickets.Errors), - DstAliases_)); - - SetUpdateTimeOfServiceTickets(time); - - if (count > 0) { - LogInfo(TStringBuilder() << "Cache was updated with " << count << " service ticket(s): " << time); - } - } - - void TThreadedUpdater::UpdatePublicKeysCache(const TString& publicKeys, TInstant time) { - if (publicKeys.empty()) { - return; - } - - if (Settings_.CheckServiceTickets) { - SetServiceContext(MakeIntrusiveConst<TServiceContext>( - TServiceContext::CheckingFactory(Settings_.SelfTvmId, - publicKeys))); - } - - if (Settings_.CheckUserTicketsWithBbEnv) { - SetUserContext(publicKeys); - } - - SetUpdateTimeOfPublicKeys(time); - - LogInfo(TStringBuilder() << "Cache was updated with public keys: " << time); - } - - void TThreadedUpdater::ReadStateFromDisk() { - try { - TServiceTicketsFromDisk st; - std::tie(st, StartUpCache_) = ReadServiceTicketsFromDisk(); - UpdateServiceTicketsCache(std::move(st.TicketsWithErrors), st.BornDate); - DiskCacheServiceTickets_ = st.FileBody; - } catch (const std::exception& e) { - LogWarning(TStringBuilder() << "Failed to read service tickets from disk: " << e.what()); - } - - try { - std::pair<TString, TInstant> pk = ReadPublicKeysFromDisk(); - UpdatePublicKeysCache(pk.first, pk.second); - } catch (const std::exception& e) { - LogWarning(TStringBuilder() << "Failed to read public keys from disk: " << e.what()); - } - - try { - TString rs = ReadRetrySettingsFromDisk(); - UpdateRetrySettings(rs); - } catch (const std::exception& e) { - LogWarning(TStringBuilder() << "Failed to read retry settings from disk: " << e.what()); - } - - try { - if (RolesFetcher_) { - SetUpdateTimeOfRoles(RolesFetcher_->ReadFromDisk()); - } - } catch (const std::exception& e) { - LogWarning(TStringBuilder() << "Failed to read roles from disk: " << e.what()); - } - } - - std::pair<TThreadedUpdater::TServiceTicketsFromDisk, TThreadedUpdater::TServiceTicketsFromDisk> TThreadedUpdater::ReadServiceTicketsFromDisk() const { - if (!ServiceTicketsFilepath_) { - return {}; - } - - TDiskReader r(ServiceTicketsFilepath_, Logger_.Get()); - if (!r.Read()) { - return {}; - } - - std::pair<TStringBuf, TTvmId> data = ParseTicketsFromDisk(r.Data()); - if (data.second != Settings_.SelfTvmId) { - TStringStream s; - s << "Disk cache is for another tvmId (" << data.second << "). "; - s << "Self=" << Settings_.SelfTvmId; - LogWarning(s.Str()); - return {}; - } - - TThreadedUpdater::TServiceTicketsFromDisk resDst{ - .BornDate = r.Time(), - .FileBody = TString(data.first), - }; - - TThreadedUpdater::TServiceTicketsFromDisk resAll{ - .BornDate = r.Time(), - .FileBody = TString(data.first), - }; - - TDstSetPtr dsts = GetDsts(); - ParseTicketsFromResponse(data.first, *dsts, resDst.TicketsWithErrors); - - if (IsInvalid(TServiceTickets::GetInvalidationTime(resDst.TicketsWithErrors.Tickets), TInstant::Now())) { - LogWarning("Disk cache (service tickets) is too old"); - return {}; - } - - try { - ParseTicketsFromDiskCache(data.first, resAll.TicketsWithErrors); - } catch (std::exception& e) { - LogWarning(TStringBuilder() << "Failed to parse all service tickets from disk cache: " << e.what()); - LogInfo(TStringBuilder() << "Got " << resDst.TicketsWithErrors.Tickets.size() << " service ticket(s) from disk"); - return {std::move(resDst), {}}; - } - - if (resAll.TicketsWithErrors.Tickets.empty()) { - LogInfo(TStringBuilder() << "Got " << resDst.TicketsWithErrors.Tickets.size() << " service ticket(s) from disk"); - return {std::move(resDst), std::move(resAll)}; - } - - if (IsInvalid(TServiceTickets::GetInvalidationTime(resAll.TicketsWithErrors.Tickets), TInstant::Now())) { - LogWarning("Disk cache (service tickets) is too old"); - LogInfo(TStringBuilder() << "Got " << resDst.TicketsWithErrors.Tickets.size() << " service ticket(s) from disk"); - return {std::move(resDst), {}}; - } - - LogInfo(TStringBuilder() << "Got " << resAll.TicketsWithErrors.Tickets.size() << " service ticket(s) from disk"); - return {std::move(resDst), std::move(resAll)}; - } - - std::pair<TString, TInstant> TThreadedUpdater::ReadPublicKeysFromDisk() const { - if (!PublicKeysFilepath_) { - return {}; - } - - TDiskReader r(PublicKeysFilepath_, Logger_.Get()); - if (!r.Read()) { - return {}; - } - - if (TInstant::Now() - r.Time() > PublicKeysDurations_.Invalid) { - LogWarning("Disk cache (public keys) is too old"); - return {}; - } - - return {r.Data(), r.Time()}; - } - - TString TThreadedUpdater::ReadRetrySettingsFromDisk() const { - if (!RetrySettingsFilepath_) { - return {}; - } - - TDiskReader r(RetrySettingsFilepath_, Logger_.Get()); - if (!r.Read()) { - return {}; - } - - return r.Data(); - } - - template <class Dsts> - TThreadedUpdater::THttpResult TThreadedUpdater::GetServiceTicketsFromHttp(const Dsts& dsts, const size_t dstLimit) const { - Y_ENSURE(SigningContext_, "Internal error"); - - TClientSettings::TDstVector part; - part.reserve(dstLimit); - THttpResult res; - res.TicketsWithErrors.Tickets.reserve(dsts.size()); - res.Responses.reserve(dsts.size() / dstLimit + 1); - - for (auto it = dsts.begin(); it != dsts.end();) { - part.clear(); - for (size_t count = 0; it != dsts.end() && count < dstLimit; ++count, ++it) { - part.push_back(*it); - } - - TString response = - FetchWithRetries( - [this, &part]() { - // create request here to keep 'ts' actual - return FetchServiceTicketsFromHttp(PrepareRequestForServiceTickets( - Settings_.SelfTvmId, - *SigningContext_, - part, - ProcInfo_)); - }, - EScope::ServiceTickets) - .Response; - ParseTicketsFromResponse(response, part, res.TicketsWithErrors); - LogDebug(TStringBuilder() - << "Response with service tickets for " << part.size() - << " destination(s) was successfully fetched from " << TvmUrl_); - - res.Responses.push_back(response); - } - - LogDebug(TStringBuilder() - << "Got responses with service tickets with " << res.Responses.size() << " pages for " - << dsts.size() << " destination(s)"); - for (const auto& p : res.TicketsWithErrors.Errors) { - LogError(TStringBuilder() - << "Failed to get service ticket for dst=" << p.first << ": " << p.second); - } - - return res; - } - - TString TThreadedUpdater::GetPublicKeysFromHttp() const { - TString publicKeys = - FetchWithRetries( - [this]() { return FetchPublicKeysFromHttp(); }, - EScope::PublicKeys) - .Response; - - LogDebug("Public keys were successfully fetched from " + TvmUrl_); - - return publicKeys; - } - - TServiceTickets::TMapIdStr TThreadedUpdater::GetRequestedTicketsFromStartUpCache(const TDstSet& dsts) const { - TServiceTickets::TMapIdStr res; - for (const TClientSettings::TDst& dst : dsts) { - auto it = StartUpCache_.TicketsWithErrors.Tickets.find(dst.Id); - if (it != StartUpCache_.TicketsWithErrors.Tickets.end()) { - res[dst.Id] = it->second; - } - } - return res; - } - - TInstant TThreadedUpdater::GetStartUpCacheBornDate() const { - return StartUpCache_.BornDate; - } - - NUtils::TFetchResult TThreadedUpdater::FetchServiceTicketsFromHttp(const TString& body) const { - TStringStream s; - - THttpHeaders outHeaders; - TKeepAliveHttpClient::THttpCode code = GetClient().DoPost("/2/ticket", body, &s, Headers_, &outHeaders); - - const THttpInputHeader* settings = outHeaders.FindHeader("X-Ya-Retry-Settings"); - - return {code, {}, "/2/ticket", s.Str(), settings ? settings->Value() : ""}; - } - - NUtils::TFetchResult TThreadedUpdater::FetchPublicKeysFromHttp() const { - TStringStream s; - - THttpHeaders outHeaders; - TKeepAliveHttpClient::THttpCode code = GetClient().DoGet(PublicKeysUrl_, &s, {}, &outHeaders); - - const THttpInputHeader* settings = outHeaders.FindHeader("X-Ya-Retry-Settings"); - - return {code, {}, "/2/keys", s.Str(), settings ? settings->Value() : ""}; - } - - bool TThreadedUpdater::UpdateRetrySettings(const TString& header) const { - if (header.empty()) { - // Probably it is some kind of test? - return false; - } - - try { - TString raw = NUtils::Base64url2bin(header); - Y_ENSURE(raw, "Invalid base64url in settings"); - - retry_settings::v1::Settings proto; - Y_ENSURE(proto.ParseFromString(raw), "Invalid proto"); - - // This ugly hack helps to process these settings in any case - TThreadedUpdater& this_ = *const_cast<TThreadedUpdater*>(this); - TRetrySettings& res = this_.RetrySettings_; - - TStringStream diff; - auto update = [&diff](auto& l, const auto& r, TStringBuf desc) { - if (l != r) { - diff << desc << ":" << l << "->" << r << ";"; - l = r; - } - }; - - if (proto.has_exponential_backoff_min_sec()) { - update(res.BackoffSettings.Min, - TDuration::Seconds(proto.exponential_backoff_min_sec()), - "exponential_backoff_min"); - } - if (proto.has_exponential_backoff_max_sec()) { - update(res.BackoffSettings.Max, - TDuration::Seconds(proto.exponential_backoff_max_sec()), - "exponential_backoff_max"); - } - if (proto.has_exponential_backoff_factor()) { - update(res.BackoffSettings.Factor, - proto.exponential_backoff_factor(), - "exponential_backoff_factor"); - } - if (proto.has_exponential_backoff_jitter()) { - update(res.BackoffSettings.Jitter, - proto.exponential_backoff_jitter(), - "exponential_backoff_jitter"); - } - this_.ExpBackoff_.UpdateSettings(res.BackoffSettings); - - if (proto.has_max_random_sleep_default()) { - update(res.MaxRandomSleepDefault, - TDuration::MilliSeconds(proto.max_random_sleep_default()), - "max_random_sleep_default"); - } - if (proto.has_max_random_sleep_when_ok()) { - update(res.MaxRandomSleepWhenOk, - TDuration::MilliSeconds(proto.max_random_sleep_when_ok()), - "max_random_sleep_when_ok"); - } - if (proto.has_retries_on_start()) { - Y_ENSURE(proto.retries_on_start(), "retries_on_start==0"); - update(res.RetriesOnStart, - proto.retries_on_start(), - "retries_on_start"); - } - if (proto.has_retries_in_background()) { - Y_ENSURE(proto.retries_in_background(), "retries_in_background==0"); - update(res.RetriesInBackground, - proto.retries_in_background(), - "retries_in_background"); - } - if (proto.has_worker_awaking_period_sec()) { - update(res.WorkerAwakingPeriod, - TDuration::Seconds(proto.worker_awaking_period_sec()), - "worker_awaking_period"); - this_.WorkerAwakingPeriod_ = res.WorkerAwakingPeriod; - } - if (proto.has_dsts_limit()) { - Y_ENSURE(proto.dsts_limit(), "dsts_limit==0"); - update(res.DstsLimit, - proto.dsts_limit(), - "dsts_limit"); - } - - if (proto.has_roles_update_period_sec()) { - Y_ENSURE(proto.roles_update_period_sec(), "roles_update_period==0"); - update(res.RolesUpdatePeriod, - TDuration::Seconds(proto.roles_update_period_sec()), - "roles_update_period_sec"); - } - if (proto.has_roles_warn_period_sec()) { - Y_ENSURE(proto.roles_warn_period_sec(), "roles_warn_period_sec==0"); - update(res.RolesWarnPeriod, - TDuration::Seconds(proto.roles_warn_period_sec()), - "roles_warn_period_sec"); - } - - if (diff.empty()) { - return false; - } - - LogDebug("Retry settings were updated: " + diff.Str()); - return true; - } catch (const std::exception& e) { - LogWarning(TStringBuilder() - << "Failed to update retry settings from server, header '" - << header << "': " - << e.what()); - } - - return false; - } - - template <typename Func> - NUtils::TFetchResult TThreadedUpdater::FetchWithRetries(Func func, EScope scope) const { - const ui32 tries = Inited_ ? RetrySettings_.RetriesInBackground - : RetrySettings_.RetriesOnStart; - - for (size_t idx = 1;; ++idx) { - RandomSleep(); - - try { - NUtils::TFetchResult result = func(); - - if (UpdateRetrySettings(result.RetrySettings) && RetrySettingsFilepath_) { - TDiskWriter w(RetrySettingsFilepath_, Logger_.Get()); - w.Write(result.RetrySettings); - } - - if (400 <= result.Code && result.Code <= 499) { - throw TNonRetriableException() << ProcessHttpError(scope, result.Path, result.Code, result.Response); - } - if (result.Code < 200 || result.Code >= 399) { - throw yexception() << ProcessHttpError(scope, result.Path, result.Code, result.Response); - } - - ExpBackoff_.Decrease(); - return result; - } catch (const TNonRetriableException& e) { - LogWarning(TStringBuilder() << "Failed to get " << scope << ": " << e.what()); - ExpBackoff_.Increase(); - throw; - } catch (const std::exception& e) { - LogWarning(TStringBuilder() << "Failed to get " << scope << ": " << e.what()); - ExpBackoff_.Increase(); - if (idx >= tries) { - throw; - } - } - } - - throw yexception() << "unreachable"; - } - - void TThreadedUpdater::RandomSleep() const { - const TDuration maxSleep = TClientStatus::ECode::Ok == GetState() - ? RetrySettings_.MaxRandomSleepWhenOk - : RetrySettings_.MaxRandomSleepDefault; - - if (maxSleep) { - ui32 toSleep = Random_.GenRand() % maxSleep.MilliSeconds(); - ExpBackoff_.Sleep(TDuration::MilliSeconds(toSleep)); - } - } - - TString TThreadedUpdater::PrepareRequestForServiceTickets(TTvmId src, - const TServiceContext& ctx, - const TClientSettings::TDstVector& dsts, - const NUtils::TProcInfo& procInfo, - time_t now) { - TStringStream s; - - const TString ts = IntToString<10>(now); - TStringStream dst; - dst.Reserve(10 * dsts.size()); - for (const TClientSettings::TDst& d : dsts) { - if (dst.Str()) { - dst << ','; - } - dst << d.Id; - } - - s << "grant_type=client_credentials"; - s << "&src=" << src; - s << "&dst=" << dst.Str(); - s << "&ts=" << ts; - s << "&sign=" << ctx.SignCgiParamsForTvm(ts, dst.Str()); - s << "&get_retry_settings=yes"; - - s << "&"; - procInfo.AddToRequest(s); - - return s.Str(); - } - - template <class Dsts> - void TThreadedUpdater::ParseTicketsFromResponse(TStringBuf resp, - const Dsts& dsts, - TPairTicketsErrors& out) const { - NJson::TJsonValue doc; - Y_ENSURE(NJson::ReadJsonTree(resp, &doc), "Invalid json from tvm-api: " << resp); - const NJson::TJsonValue* currentResp = doc.IsMap() ? &doc : nullptr; - auto find = [¤tResp, &doc](TTvmId id, NJson::TJsonValue& obj) -> bool { - const TString idStr = IntToString<10>(id); - if (currentResp && currentResp->GetValue(idStr, &obj)) { - return true; - } - - for (const NJson::TJsonValue& val : doc.GetArray()) { - currentResp = &val; - if (currentResp->GetValue(idStr, &obj)) { - return true; - } - } - - return false; - }; - - for (const TClientSettings::TDst& d : dsts) { - NJson::TJsonValue obj; - NJson::TJsonValue val; - - if (!find(d.Id, obj) || !obj.GetValue("ticket", &val)) { - TString err; - if (obj.GetValue("error", &val)) { - err = val.GetString(); - } else { - err = "Missing tvm_id in response, should never happend: " + IntToString<10>(d.Id); - } - - TStringStream s; - s << "Failed to get ServiceTicket for " << d.Id << ": " << err; - ProcessError(EType::NonRetriable, EScope::ServiceTickets, s.Str()); - - out.Errors.insert({d.Id, std::move(err)}); - continue; - } - - out.Tickets.insert({d.Id, val.GetString()}); - } - } - - void TThreadedUpdater::ParseTicketsFromDiskCache(TStringBuf cache, - TPairTicketsErrors& out) const { - NJson::TJsonValue doc; - Y_ENSURE(NJson::ReadJsonTree(cache, &doc), "Invalid json from disk: " << cache); - - for (const NJson::TJsonValue& cacheItem : doc.GetArray()) { - for (const auto& [idStr, resp] : cacheItem.GetMap()) { - NJson::TJsonValue val; - TTvmId id; - if (!TryIntFromString<10, TTvmId, TString>(idStr, id)) { - LogWarning(TStringBuilder() << "tvm_id in cache is not integer: " << idStr); - continue; - } - - if (resp.GetValue("ticket", &val)) { - out.Tickets[id] = val.GetString(); - } else if (resp.GetValue("error", &val)) { - out.Errors[id] = val.GetString(); - } else { - out.Errors[id] = "tvm_id found, but response has no error or ticket, should never happend: " + idStr; - } - } - } - } - - static const char DELIMETER = '\t'; - TString TThreadedUpdater::PrepareTicketsForDisk(TStringBuf tvmResponse, TTvmId selfId) { - TStringStream s; - s << tvmResponse << DELIMETER << selfId; - return s.Str(); - } - - std::pair<TStringBuf, TTvmId> TThreadedUpdater::ParseTicketsFromDisk(TStringBuf data) { - TStringBuf tvmId = data.RNextTok(DELIMETER); - return {data, IntFromString<TTvmId, 10>(tvmId)}; - } - - TDstSetPtr TThreadedUpdater::GetDsts() const { - return Destinations_.Get(); - } - - void TThreadedUpdater::SetDsts(TDstSetPtr dsts) { - Destinations_.Set(std::move(dsts)); - } - - bool TThreadedUpdater::IsTimeToUpdateServiceTickets(TInstant lastUpdate) const { - return TInstant::Now() - lastUpdate > ServiceTicketsDurations_.RefreshPeriod; - } - - bool TThreadedUpdater::IsTimeToUpdatePublicKeys(TInstant lastUpdate) const { - return TInstant::Now() - lastUpdate > PublicKeysDurations_.RefreshPeriod; - } - - bool TThreadedUpdater::AreServicesTicketsOk() const { - if (!Settings_.IsServiceTicketFetchingRequired()) { - return true; - } - auto c = GetCachedServiceTickets(); - return c && (!Settings_.IsIncompleteTicketsSetAnError || c->TicketsById.size() == GetDsts()->size()); - } - - bool TThreadedUpdater::IsServiceContextOk() const { - if (!Settings_.CheckServiceTickets) { - return true; - } - - return bool(GetCachedServiceContext()); - } - - bool TThreadedUpdater::IsUserContextOk() const { - if (!Settings_.CheckUserTicketsWithBbEnv) { - return true; - } - return bool(GetCachedUserContext()); - } - - void TThreadedUpdater::Worker() { - UpdateServiceTickets(); - UpdatePublicKeys(); - UpdateRoles(); - } - - TServiceTickets::TMapAliasId TThreadedUpdater::MakeAliasMap(const TClientSettings& settings) { - TServiceTickets::TMapAliasId res; - - for (const auto& pair : settings.FetchServiceTicketsForDstsWithAliases) { - res.insert({pair.first, pair.second.Id}); - } - - return res; - } - - TClientSettings::TDstVector TThreadedUpdater::FindMissingDsts(TServiceTicketsPtr available, const TDstSet& required) { - Y_ENSURE(available); - TDstSet set; - // available->TicketsById is not sorted - for (const auto& pair : available->TicketsById) { - set.insert(pair.first); - } - return FindMissingDsts(set, required); - } - - TClientSettings::TDstVector TThreadedUpdater::FindMissingDsts(const TDstSet& available, const TDstSet& required) { - TClientSettings::TDstVector res; - std::set_difference(required.begin(), required.end(), - available.begin(), available.end(), - std::inserter(res, res.begin())); - return res; - } - - TString TThreadedUpdater::CreateJsonArray(const TSmallVec<TString>& responses) { - if (responses.empty()) { - return "[]"; - } - - size_t size = 0; - for (const TString& r : responses) { - size += r.size() + 1; - } - - TString res; - res.reserve(size + 2); - - res.push_back('['); - for (const TString& r : responses) { - res.append(r).push_back(','); - } - res.back() = ']'; - - return res; - } - - TString TThreadedUpdater::AppendToJsonArray(const TString& json, const TSmallVec<TString>& responses) { - Y_ENSURE(json, "previous body required"); - - size_t size = 0; - for (const TString& r : responses) { - size += r.size() + 1; - } - - TString res; - res.reserve(size + 2 + json.size()); - - res.push_back('['); - if (json.StartsWith('[')) { - Y_ENSURE(json.EndsWith(']'), "array is broken:" << json); - res.append(TStringBuf(json).Chop(1).Skip(1)); - } else { - res.append(json); - } - - res.push_back(','); - for (const TString& r : responses) { - res.append(r).push_back(','); - } - res.back() = ']'; - - return res; - } -} diff --git a/library/cpp/tvmauth/client/misc/api/threaded_updater.h b/library/cpp/tvmauth/client/misc/api/threaded_updater.h deleted file mode 100644 index cabfcf8fb54..00000000000 --- a/library/cpp/tvmauth/client/misc/api/threaded_updater.h +++ /dev/null @@ -1,153 +0,0 @@ -#pragma once - -#include "retry_settings.h" -#include "roles_fetcher.h" -#include "settings.h" - -#include <library/cpp/tvmauth/client/misc/async_updater.h> -#include <library/cpp/tvmauth/client/misc/threaded_updater.h> - -#include <util/generic/set.h> -#include <util/random/fast.h> - -#include <mutex> - -namespace NTvmAuth::NTvmApi { - using TDstSet = TSet<TClientSettings::TDst>; - using TDstSetPtr = std::shared_ptr<const TDstSet>; - - class TThreadedUpdater: public TThreadedUpdaterBase { - public: - /*! - * Starts thread for updating of in-memory cache in background - * Reads cache from disk if specified - * @param settings - * @param logger is usefull for monitoring and debuging - */ - static TAsyncUpdaterPtr Create(const TClientSettings& settings, TLoggerPtr logger); - ~TThreadedUpdater(); - - TClientStatus GetStatus() const override; - NRoles::TRolesPtr GetRoles() const override; - - protected: // for tests - TClientStatus::ECode GetState() const; - - TThreadedUpdater(const TClientSettings& settings, TLoggerPtr logger); - void Init(); - - void UpdateServiceTickets(); - void UpdateAllServiceTickets(); - TServiceTicketsPtr UpdateMissingServiceTickets(const TDstSet& required); - void UpdatePublicKeys(); - void UpdateRoles(); - - TServiceTicketsPtr UpdateServiceTicketsCachePartly(TPairTicketsErrors&& tickets, size_t got); - void UpdateServiceTicketsCache(TPairTicketsErrors&& tickets, TInstant time); - void UpdatePublicKeysCache(const TString& publicKeys, TInstant time); - - void ReadStateFromDisk(); - - struct TServiceTicketsFromDisk { - TPairTicketsErrors TicketsWithErrors; - TInstant BornDate; - TString FileBody; - }; - - std::pair<TServiceTicketsFromDisk, TServiceTicketsFromDisk> ReadServiceTicketsFromDisk() const; - - std::pair<TString, TInstant> ReadPublicKeysFromDisk() const; - TString ReadRetrySettingsFromDisk() const; - - struct THttpResult { - TPairTicketsErrors TicketsWithErrors; - TSmallVec<TString> Responses; - }; - - template <class Dsts> - THttpResult GetServiceTicketsFromHttp(const Dsts& dsts, const size_t dstLimit) const; - TString GetPublicKeysFromHttp() const; - TServiceTickets::TMapIdStr GetRequestedTicketsFromStartUpCache(const TDstSet& dsts) const; - - virtual NUtils::TFetchResult FetchServiceTicketsFromHttp(const TString& body) const; - virtual NUtils::TFetchResult FetchPublicKeysFromHttp() const; - - bool UpdateRetrySettings(const TString& header) const; - - template <typename Func> - NUtils::TFetchResult FetchWithRetries(Func func, EScope scope) const; - void RandomSleep() const; - - static TString PrepareRequestForServiceTickets(TTvmId src, - const TServiceContext& ctx, - const TClientSettings::TDstVector& dsts, - const NUtils::TProcInfo& procInfo, - time_t now = time(nullptr)); - template <class Dsts> - void ParseTicketsFromResponse(TStringBuf resp, - const Dsts& dsts, - TPairTicketsErrors& out) const; - - void ParseTicketsFromDiskCache(TStringBuf cache, - TPairTicketsErrors& out) const; - - static TString PrepareTicketsForDisk(TStringBuf tvmResponse, TTvmId selfId); - static std::pair<TStringBuf, TTvmId> ParseTicketsFromDisk(TStringBuf data); - - TDstSetPtr GetDsts() const; - void SetDsts(TDstSetPtr dsts); - - TInstant GetStartUpCacheBornDate() const; - - bool IsTimeToUpdateServiceTickets(TInstant lastUpdate) const; - bool IsTimeToUpdatePublicKeys(TInstant lastUpdate) const; - - bool AreServicesTicketsOk() const; - bool IsServiceContextOk() const; - bool IsUserContextOk() const; - - void Worker() override; - - static TServiceTickets::TMapAliasId MakeAliasMap(const TClientSettings& settings); - static TClientSettings::TDstVector FindMissingDsts(TServiceTicketsPtr available, const TDstSet& required); - static TClientSettings::TDstVector FindMissingDsts(const TDstSet& available, const TDstSet& required); - - static TString CreateJsonArray(const TSmallVec<TString>& responses); - static TString AppendToJsonArray(const TString& json, const TSmallVec<TString>& responses); - - private: - TRetrySettings RetrySettings_; - - protected: - mutable TExponentialBackoff ExpBackoff_; - std::unique_ptr<std::mutex> ServiceTicketBatchUpdateMutex_; - - private: - const TClientSettings Settings_; - - const NUtils::TProcInfo ProcInfo_; - - const TString PublicKeysUrl_; - - const TServiceTickets::TMapAliasId DstAliases_; - - const TKeepAliveHttpClient::THeaders Headers_; - TMaybe<TServiceContext> SigningContext_; - - NUtils::TProtectedValue<TDstSetPtr> Destinations_; - - TString DiskCacheServiceTickets_; - TServiceTicketsFromDisk StartUpCache_; - bool NeedFetchMissingServiceTickets_ = true; - - TString PublicKeysFilepath_; - TString ServiceTicketsFilepath_; - TString RetrySettingsFilepath_; - - std::unique_ptr<TRolesFetcher> RolesFetcher_; - - mutable TReallyFastRng32 Random_; - - bool Inited_ = false; - }; -} diff --git a/library/cpp/tvmauth/client/misc/async_updater.cpp b/library/cpp/tvmauth/client/misc/async_updater.cpp deleted file mode 100644 index 9cb0332ed40..00000000000 --- a/library/cpp/tvmauth/client/misc/async_updater.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include "async_updater.h" - -#include "utils.h" - -#include <library/cpp/tvmauth/client/exception.h> - -#include <util/string/builder.h> -#include <util/system/spin_wait.h> - -namespace NTvmAuth { - TAsyncUpdaterBase::TAsyncUpdaterBase() { - ServiceTicketsDurations_.RefreshPeriod = TDuration::Hours(1); - ServiceTicketsDurations_.Expiring = TDuration::Hours(2); - ServiceTicketsDurations_.Invalid = TDuration::Hours(11); - - PublicKeysDurations_.RefreshPeriod = TDuration::Days(1); - PublicKeysDurations_.Expiring = TDuration::Days(2); - PublicKeysDurations_.Invalid = TDuration::Days(6); - } - - NRoles::TRolesPtr TAsyncUpdaterBase::GetRoles() const { - ythrow TIllegalUsage() << "not implemented"; - } - - TInstant TAsyncUpdaterBase::GetUpdateTimeOfPublicKeys() const { - return PublicKeysTime_.Get(); - } - - TInstant TAsyncUpdaterBase::GetUpdateTimeOfServiceTickets() const { - return ServiceTicketsTime_.Get(); - } - - TInstant TAsyncUpdaterBase::GetUpdateTimeOfRoles() const { - return RolesTime_.Get(); - } - - TInstant TAsyncUpdaterBase::GetInvalidationTimeOfPublicKeys() const { - TInstant ins = GetUpdateTimeOfPublicKeys(); - return ins == TInstant() ? TInstant() : ins + PublicKeysDurations_.Invalid; - } - - TInstant TAsyncUpdaterBase::GetInvalidationTimeOfServiceTickets() const { - TServiceTicketsPtr c = GetCachedServiceTickets(); - return c ? c->InvalidationTime : TInstant(); - } - - bool TAsyncUpdaterBase::ArePublicKeysInvalid(TInstant now) const { - return IsInvalid(GetInvalidationTimeOfPublicKeys(), now); - } - - bool TAsyncUpdaterBase::AreServiceTicketsInvalid(TInstant now) const { - TServiceTicketsPtr c = GetCachedServiceTickets(); - // Empty set of tickets is allways valid. - return c && !c->TicketsById.empty() && IsInvalid(GetInvalidationTimeOfServiceTickets(), now); - } - - bool TAsyncUpdaterBase::IsInvalid(TInstant invTime, TInstant now) { - return invTime - - TDuration::Minutes(1) // lag for closing from balancer - < now; - } - - void TAsyncUpdaterBase::SetBbEnv(EBlackboxEnv original, TMaybe<EBlackboxEnv> overrided) { - if (overrided) { - Y_ENSURE_EX(NUtils::CheckBbEnvOverriding(original, *overrided), - TBrokenTvmClientSettings() << "Overriding of BlackboxEnv is illegal: " - << original << " -> " << *overrided); - } - - Envs_.store({original, overrided}, std::memory_order_relaxed); - } - - TServiceTicketsPtr TAsyncUpdaterBase::GetCachedServiceTickets() const { - return ServiceTickets_.Get(); - } - - TServiceContextPtr TAsyncUpdaterBase::GetCachedServiceContext() const { - return ServiceContext_.Get(); - } - - TUserContextPtr TAsyncUpdaterBase::GetCachedUserContext(TMaybe<EBlackboxEnv> overridenEnv) const { - TAllUserContextsPtr ctx = AllUserContexts_.Get(); - if (!ctx) { - return nullptr; - } - - const TEnvs envs = Envs_.load(std::memory_order_relaxed); - if (!envs.Original) { - return nullptr; - } - - EBlackboxEnv env = *envs.Original; - - if (overridenEnv) { - Y_ENSURE_EX(NUtils::CheckBbEnvOverriding(*envs.Original, *overridenEnv), - TBrokenTvmClientSettings() << "Overriding of BlackboxEnv is illegal: " - << *envs.Original << " -> " << *overridenEnv); - env = *overridenEnv; - } else if (envs.Overrided) { - env = *envs.Overrided; - } - - return ctx->Get(env); - } - - void TAsyncUpdaterBase::SetServiceTickets(TServiceTicketsPtr c) { - ServiceTickets_.Set(std::move(c)); - } - - void TAsyncUpdaterBase::SetServiceContext(TServiceContextPtr c) { - ServiceContext_.Set(std::move(c)); - } - - void TAsyncUpdaterBase::SetUserContext(TStringBuf publicKeys) { - AllUserContexts_.Set(MakeIntrusiveConst<TAllUserContexts>(publicKeys)); - } - - void TAsyncUpdaterBase::SetUpdateTimeOfPublicKeys(TInstant ins) { - PublicKeysTime_.Set(ins); - } - - void TAsyncUpdaterBase::SetUpdateTimeOfServiceTickets(TInstant ins) { - ServiceTicketsTime_.Set(ins); - } - - void TAsyncUpdaterBase::SetUpdateTimeOfRoles(TInstant ins) { - RolesTime_.Set(ins); - } - - bool TAsyncUpdaterBase::IsServiceTicketMapOk(TServiceTicketsPtr c, size_t expectedTicketCount, bool strict) { - return c && - (strict - ? c->TicketsById.size() == expectedTicketCount - : !c->TicketsById.empty()); - } - - TAllUserContexts::TAllUserContexts(TStringBuf publicKeys) { - auto add = [&, this](EBlackboxEnv env) { - Ctx_[(size_t)env] = MakeIntrusiveConst<TUserContext>(env, publicKeys); - }; - - add(EBlackboxEnv::Prod); - add(EBlackboxEnv::Test); - add(EBlackboxEnv::ProdYateam); - add(EBlackboxEnv::TestYateam); - add(EBlackboxEnv::Stress); - } - - TUserContextPtr TAllUserContexts::Get(EBlackboxEnv env) const { - return Ctx_[(size_t)env]; - } -} diff --git a/library/cpp/tvmauth/client/misc/async_updater.h b/library/cpp/tvmauth/client/misc/async_updater.h deleted file mode 100644 index 68c0c11cf04..00000000000 --- a/library/cpp/tvmauth/client/misc/async_updater.h +++ /dev/null @@ -1,114 +0,0 @@ -#pragma once - -#include "last_error.h" -#include "service_tickets.h" -#include "settings.h" -#include "roles/roles.h" - -#include <library/cpp/tvmauth/client/client_status.h> -#include <library/cpp/tvmauth/client/logger.h> - -#include <library/cpp/tvmauth/deprecated/service_context.h> -#include <library/cpp/tvmauth/deprecated/user_context.h> -#include <library/cpp/tvmauth/src/utils.h> - -#include <util/datetime/base.h> -#include <util/generic/hash.h> -#include <util/generic/maybe.h> -#include <util/generic/noncopyable.h> -#include <util/generic/ptr.h> - -#include <array> -#include <atomic> - -namespace NTvmAuth { - - class TAllUserContexts: public TAtomicRefCount<TAllUserContexts> { - public: - TAllUserContexts(TStringBuf publicKeys); - - TUserContextPtr Get(EBlackboxEnv env) const; - - private: - std::array<TUserContextPtr, 5> Ctx_; - }; - using TAllUserContextsPtr = TIntrusiveConstPtr<TAllUserContexts>; - - class TAsyncUpdaterBase: public TAtomicRefCount<TAsyncUpdaterBase>, protected TLastError, TNonCopyable { - public: - TAsyncUpdaterBase(); - virtual ~TAsyncUpdaterBase() = default; - - virtual TClientStatus GetStatus() const = 0; - virtual NRoles::TRolesPtr GetRoles() const; - - TServiceTicketsPtr GetCachedServiceTickets() const; - TServiceContextPtr GetCachedServiceContext() const; - TUserContextPtr GetCachedUserContext(TMaybe<EBlackboxEnv> overridenEnv = {}) const; - - TInstant GetUpdateTimeOfPublicKeys() const; - TInstant GetUpdateTimeOfServiceTickets() const; - TInstant GetUpdateTimeOfRoles() const; - TInstant GetInvalidationTimeOfPublicKeys() const; - TInstant GetInvalidationTimeOfServiceTickets() const; - - bool ArePublicKeysInvalid(TInstant now) const; - bool AreServiceTicketsInvalid(TInstant now) const; - static bool IsInvalid(TInstant invTime, TInstant now); - - protected: - void SetBbEnv(EBlackboxEnv original, TMaybe<EBlackboxEnv> overrided = {}); - - void SetServiceTickets(TServiceTicketsPtr c); - void SetServiceContext(TServiceContextPtr c); - void SetUserContext(TStringBuf publicKeys); - void SetUpdateTimeOfPublicKeys(TInstant ins); - void SetUpdateTimeOfServiceTickets(TInstant ins); - void SetUpdateTimeOfRoles(TInstant ins); - - static bool IsServiceTicketMapOk(TServiceTicketsPtr c, size_t expectedTicketCount, bool strict); - - protected: - struct TPairTicketsErrors { - TServiceTickets::TMapIdStr Tickets; - TServiceTickets::TMapIdStr Errors; - - bool operator==(const TPairTicketsErrors& o) const { - return Tickets == o.Tickets && Errors == o.Errors; - } - }; - - struct TStateDurations { - TDuration RefreshPeriod; - TDuration Expiring; - TDuration Invalid; - }; - - TStateDurations ServiceTicketsDurations_; - TStateDurations PublicKeysDurations_; - - protected: - virtual void StartTvmClientStopping() const { - } - virtual bool IsTvmClientStopped() const { - return true; - } - friend class NTvmAuth::NInternal::TClientCaningKnife; - - private: - struct TEnvs { - TMaybe<EBlackboxEnv> Original; - TMaybe<EBlackboxEnv> Overrided; - }; - static_assert(sizeof(TEnvs) <= 8, "Small struct is easy to store as atomic"); - std::atomic<TEnvs> Envs_ = {{}}; - - NUtils::TProtectedValue<TServiceTicketsPtr> ServiceTickets_; - NUtils::TProtectedValue<TServiceContextPtr> ServiceContext_; - NUtils::TProtectedValue<TAllUserContextsPtr> AllUserContexts_; - NUtils::TProtectedValue<TInstant> PublicKeysTime_; - NUtils::TProtectedValue<TInstant> ServiceTicketsTime_; - NUtils::TProtectedValue<TInstant> RolesTime_; - }; - using TAsyncUpdaterPtr = TIntrusiveConstPtr<TAsyncUpdaterBase>; -} diff --git a/library/cpp/tvmauth/client/misc/checker.h b/library/cpp/tvmauth/client/misc/checker.h deleted file mode 100644 index 16f1a952009..00000000000 --- a/library/cpp/tvmauth/client/misc/checker.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/client/exception.h> - -#include <library/cpp/tvmauth/checked_service_ticket.h> -#include <library/cpp/tvmauth/checked_user_ticket.h> -#include <library/cpp/tvmauth/deprecated/service_context.h> -#include <library/cpp/tvmauth/deprecated/user_context.h> - -namespace NTvmAuth { - class TServiceTicketChecker { - public: - /*! - * Checking must be enabled in TClientSettings - * Can throw exception if cache is out of date or wrong config - * @param ticket - */ - static TCheckedServiceTicket Check( - TStringBuf ticket, - TServiceContextPtr c, - const TServiceContext::TCheckFlags& flags = {}) { - Y_ENSURE_EX(c, TBrokenTvmClientSettings() << "Need to use TClientSettings::EnableServiceTicketChecking()"); - return c->Check(ticket, flags); - } - }; - - class TUserTicketChecker { - public: - /*! - * Blackbox enviroment must be cofingured in TClientSettings - * Can throw exception if cache is out of date or wrong config - */ - static TCheckedUserTicket Check(TStringBuf ticket, TUserContextPtr c) { - Y_ENSURE_EX(c, TBrokenTvmClientSettings() << "Need to use TClientSettings::EnableUserTicketChecking()"); - return c->Check(ticket); - } - }; -} diff --git a/library/cpp/tvmauth/client/misc/default_uid_checker.h b/library/cpp/tvmauth/client/misc/default_uid_checker.h deleted file mode 100644 index b723d6e9182..00000000000 --- a/library/cpp/tvmauth/client/misc/default_uid_checker.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "roles/roles.h" - -#include <library/cpp/tvmauth/client/exception.h> - -#include <library/cpp/tvmauth/checked_user_ticket.h> -#include <library/cpp/tvmauth/src/user_impl.h> -#include <library/cpp/tvmauth/src/utils.h> - -namespace NTvmAuth { - class TDefaultUidChecker { - public: - /*! - * Checking must be enabled in TClientSettings - * Can throw exception if cache is out of date or wrong config - * @param ticket - */ - static TCheckedUserTicket Check(TCheckedUserTicket ticket, NRoles::TRolesPtr r) { - Y_ENSURE_EX(r, TBrokenTvmClientSettings() << "Need to use TClientSettings::EnableRolesFetching()"); - NRoles::TConsumerRolesPtr roles = r->GetRolesForUser(ticket); - if (roles) { - return ticket; - } - - TUserTicketImplPtr impl = THolder(NInternal::TCanningKnife::GetU(ticket)); - impl->SetStatus(ETicketStatus::NoRoles); - return TCheckedUserTicket(std::move(impl)); - } - }; -} diff --git a/library/cpp/tvmauth/client/misc/disk_cache.cpp b/library/cpp/tvmauth/client/misc/disk_cache.cpp deleted file mode 100644 index 8f3ab7770f5..00000000000 --- a/library/cpp/tvmauth/client/misc/disk_cache.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include "disk_cache.h" - -#include <library/cpp/tvmauth/client/logger.h> - -#include <openssl/evp.h> -#include <openssl/hmac.h> - -#include <util/stream/file.h> -#include <util/stream/str.h> -#include <util/system/fs.h> -#include <util/system/sysstat.h> - -#include <exception> - -namespace NTvmAuth { - static const size_t HASH_SIZE = 32; - static const size_t TIMESTAMP_SIZE = sizeof(time_t); - - TDiskReader::TDiskReader(const TString& filename, ILogger* logger) - : Filename_(filename) - , Logger_(logger) - { - } - - bool TDiskReader::Read() { - TStringStream s; - - try { - if (!NFs::Exists(Filename_)) { - if (Logger_) { - s << "File '" << Filename_ << "' does not exist"; - Logger_->Debug(s.Str()); - } - return false; - } - - TFile file(Filename_, OpenExisting | RdOnly | Seq); - file.Flock(LOCK_SH | LOCK_NB); - - TFileInput input(file); - return ParseData(input.ReadAll()); - } catch (const std::exception& e) { - if (Logger_) { - s << "Failed to read '" << Filename_ << "': " << e.what(); - Logger_->Error(s.Str()); - } - } - - return false; - } - - bool TDiskReader::ParseData(TStringBuf buf) { - TStringStream s; - - if (buf.size() <= HASH_SIZE + TIMESTAMP_SIZE) { - if (Logger_) { - s << "File '" << Filename_ << "' is too small"; - Logger_->Warning(s.Str()); - } - return false; - } - - TStringBuf hash = buf.SubStr(0, HASH_SIZE); - if (hash != GetHash(buf.Skip(HASH_SIZE))) { - if (Logger_) { - s << "Content of '" << Filename_ << "' was incorrectly changed"; - Logger_->Warning(s.Str()); - } - return false; - } - - Time_ = TInstant::Seconds(GetTimestamp(buf.substr(0, TIMESTAMP_SIZE))); - Data_ = buf.Skip(TIMESTAMP_SIZE); - - if (Logger_) { - s << "File '" << Filename_ << "' was successfully read"; - Logger_->Info(s.Str()); - } - return true; - } - - TString TDiskReader::GetHash(TStringBuf data) { - TString value(EVP_MAX_MD_SIZE, 0); - unsigned macLen = 0; - if (!::HMAC(EVP_sha256(), - "", - 0, - (unsigned char*)data.data(), - data.size(), - (unsigned char*)value.data(), - &macLen)) { - return {}; - } - - if (macLen != EVP_MAX_MD_SIZE) { - value.resize(macLen); - } - - return value; - } - - time_t TDiskReader::GetTimestamp(TStringBuf data) { - time_t time = 0; - for (int idx = TIMESTAMP_SIZE - 1; idx >= 0; --idx) { - time <<= 8; - time |= static_cast<unsigned char>(data.at(idx)); - } - return time; - } - - TDiskWriter::TDiskWriter(const TString& filename, ILogger* logger) - : Filename_(filename) - , Logger_(logger) - { - } - - bool TDiskWriter::Write(TStringBuf data, TInstant now) { - TStringStream s; - - try { - { - if (NFs::Exists(Filename_)) { - Chmod(Filename_.c_str(), - S_IRUSR | S_IWUSR); // 600 - } - - TFile file(Filename_, CreateAlways | WrOnly | Seq | AWUser | ARUser); - file.Flock(LOCK_EX | LOCK_NB); - - TFileOutput output(file); - output << PrepareData(now, data); - } - - if (Logger_) { - s << "File '" << Filename_ << "' was successfully written"; - Logger_->Info(s.Str()); - } - return true; - } catch (const std::exception& e) { - if (Logger_) { - s << "Failed to write '" << Filename_ << "': " << e.what(); - Logger_->Error(s.Str()); - } - } - - return false; - } - - TString TDiskWriter::PrepareData(TInstant time, TStringBuf data) { - TString toHash = WriteTimestamp(time.TimeT()) + data; - return TDiskReader::GetHash(toHash) + toHash; - } - - TString TDiskWriter::WriteTimestamp(time_t time) { - TString res(TIMESTAMP_SIZE, 0); - for (size_t idx = 0; idx < TIMESTAMP_SIZE; ++idx) { - res[idx] = time & 0xFF; - time >>= 8; - } - return res; - } -} diff --git a/library/cpp/tvmauth/client/misc/disk_cache.h b/library/cpp/tvmauth/client/misc/disk_cache.h deleted file mode 100644 index 9e77556f86e..00000000000 --- a/library/cpp/tvmauth/client/misc/disk_cache.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include <util/datetime/base.h> -#include <util/generic/string.h> - -namespace NTvmAuth { - class ILogger; - - class TDiskReader { - public: - TDiskReader(const TString& filename, ILogger* logger = nullptr); - - bool Read(); - - const TString& Data() const { - return Data_; - } - - TInstant Time() const { - return Time_; - } - - public: // for tests - bool ParseData(TStringBuf buf); - - static TString GetHash(TStringBuf data); - static time_t GetTimestamp(TStringBuf data); - - private: - TString Filename_; - ILogger* Logger_; - TInstant Time_; - TString Data_; - }; - - class TDiskWriter { - public: - TDiskWriter(const TString& filename, ILogger* logger = nullptr); - - bool Write(TStringBuf data, TInstant now = TInstant::Now()); - - public: // for tests - static TString PrepareData(TInstant time, TStringBuf data); - static TString WriteTimestamp(time_t time); - - private: - TString Filename_; - ILogger* Logger_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/exponential_backoff.h b/library/cpp/tvmauth/client/misc/exponential_backoff.h deleted file mode 100644 index 89a7a3c8ad6..00000000000 --- a/library/cpp/tvmauth/client/misc/exponential_backoff.h +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once - -#include <util/datetime/base.h> -#include <util/random/normal.h> -#include <util/system/event.h> - -#include <atomic> - -namespace NTvmAuth { - // https://habr.com/ru/post/227225/ - class TExponentialBackoff { - public: - struct TSettings { - TDuration Min; - TDuration Max; - double Factor = 1.001; - double Jitter = 0; - - bool operator==(const TSettings& o) const { - return Min == o.Min && - Max == o.Max && - Factor == o.Factor && - Jitter == o.Jitter; - } - }; - - TExponentialBackoff(const TSettings& settings, bool isEnabled = true) - : CurrentValue_(settings.Min) - , IsEnabled_(isEnabled) - { - UpdateSettings(settings); - } - - void UpdateSettings(const TSettings& settings) { - Y_ENSURE(settings.Factor > 1, "factor=" << settings.Factor << ". Should be > 1"); - Y_ENSURE(settings.Jitter >= 0 && settings.Jitter < 1, "jitter should be in range [0, 1)"); - - Min_ = settings.Min; - Max_ = settings.Max; - Factor_ = settings.Factor; - Jitter_ = settings.Jitter; - } - - TDuration Increase() { - CurrentValue_ = std::min(CurrentValue_ * Factor_, Max_); - - double rnd = StdNormalRandom<double>(); - const bool isNegative = rnd < 0; - rnd = std::abs(rnd); - - const TDuration diff = rnd * Jitter_ * CurrentValue_; - if (isNegative) { - CurrentValue_ -= diff; - } else { - CurrentValue_ += diff; - } - - return CurrentValue_; - } - - TDuration Decrease() { - CurrentValue_ = std::max(CurrentValue_ / Factor_, Min_); - return CurrentValue_; - } - - void Sleep(TDuration add = TDuration()) { - if (IsEnabled_.load(std::memory_order_relaxed)) { - Ev_.WaitT(CurrentValue_ + add); - } - } - - void Interrupt() { - Ev_.Signal(); - } - - TDuration GetCurrentValue() const { - return CurrentValue_; - } - - void SetEnabled(bool val) { - IsEnabled_.store(val); - } - - private: - TDuration Min_; - TDuration Max_; - double Factor_; - double Jitter_; - TDuration CurrentValue_; - std::atomic_bool IsEnabled_; - - TAutoEvent Ev_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/fetch_result.h b/library/cpp/tvmauth/client/misc/fetch_result.h deleted file mode 100644 index 4b0774e92f5..00000000000 --- a/library/cpp/tvmauth/client/misc/fetch_result.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include <library/cpp/http/simple/http_client.h> - -namespace NTvmAuth::NUtils { - struct TFetchResult { - TKeepAliveHttpClient::THttpCode Code; - THttpHeaders Headers; - TStringBuf Path; - TString Response; - TString RetrySettings; - }; -} diff --git a/library/cpp/tvmauth/client/misc/getter.h b/library/cpp/tvmauth/client/misc/getter.h deleted file mode 100644 index 6c7617b418f..00000000000 --- a/library/cpp/tvmauth/client/misc/getter.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "checker.h" -#include "service_tickets.h" - -namespace NTvmAuth { - class TServiceTicketGetter { - public: - /*! - * Fetching must enabled in TClientSettings - * Can throw exception if cache is invalid or wrong config - * @param dst - */ - static TString GetTicket(const TClientSettings::TAlias& dst, TServiceTicketsPtr c) { - Y_ENSURE_EX(c, TBrokenTvmClientSettings() << "Need to use TClientSettings::EnableServiceTicketsFetchOptions()"); - return GetTicketImpl(dst, c->TicketsByAlias, c->ErrorsByAlias, c->UnfetchedAliases); - } - - static TString GetTicket(const TTvmId dst, TServiceTicketsPtr c) { - Y_ENSURE_EX(c, TBrokenTvmClientSettings() << "Need to use TClientSettings::EnableServiceTicketsFetchOptions()"); - return GetTicketImpl(dst, c->TicketsById, c->ErrorsById, c->UnfetchedIds); - } - - private: - template <class Key, class Cont, class UnfetchedCont> - static TString GetTicketImpl(const Key& dst, const Cont& tickets, const Cont& errors, const UnfetchedCont& unfetched) { - auto it = tickets.find(dst); - if (it != tickets.end()) { - return it->second; - } - - it = errors.find(dst); - if (it != errors.end()) { - ythrow TMissingServiceTicket() - << "Failed to get ticket for '" << dst << "': " - << it->second; - } - - if (unfetched.contains(dst)) { - ythrow TMissingServiceTicket() - << "Failed to get ticket for '" << dst << "': this dst was not fetched yet."; - } - - ythrow TBrokenTvmClientSettings() - << "Destination '" << dst << "' was not specified in settings. " - << "Check your settings (if you use Qloud/YP/tvmtool - check it's settings)"; - } - }; -} diff --git a/library/cpp/tvmauth/client/misc/last_error.cpp b/library/cpp/tvmauth/client/misc/last_error.cpp deleted file mode 100644 index a6279bb1efe..00000000000 --- a/library/cpp/tvmauth/client/misc/last_error.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include "last_error.h" - -#include <util/string/builder.h> - -namespace NTvmAuth { - TLastError::TLastError() - : LastErrors_(MakeIntrusiveConst<TLastErrors>()) - { - } - - TString TLastError::GetLastError(bool isOk, EType* type) const { - if (isOk) { - return OK_; - } - - const TLastErrorsPtr ptr = LastErrors_.Get(); - - for (const TLastErr& err : ptr->Errors) { - if (err && err->first == EType::NonRetriable) { - if (type) { - *type = EType::NonRetriable; - } - return err->second; - } - } - - for (const TLastErr& err : ptr->Errors) { - if (err) { - if (type) { - *type = EType::Retriable; - } - return err->second; - } - } - - if (type) { - *type = EType::NonRetriable; - } - return "Internal client error: failed to collect last useful error message, please report this message to tvm-dev@yandex-team.ru"; - } - - TString TLastError::ProcessHttpError(TLastError::EScope scope, - TStringBuf path, - int code, - const TString& msg) const { - TString err = TStringBuilder() << "Path:" << path << ".Code=" << code << ": " << msg; - - ProcessError(code >= 400 && code < 500 ? EType::NonRetriable - : EType::Retriable, - scope, - err); - - return err; - } - - void TLastError::ProcessError(TLastError::EType type, TLastError::EScope scope, const TStringBuf msg) const { - Update(scope, [&](TLastErr& lastError) { - if (lastError && lastError->first == EType::NonRetriable && type == EType::Retriable) { - return false; - } - - TString err = TStringBuilder() << scope << ": " << msg; - err.erase(std::remove(err.begin(), err.vend(), '\r'), err.vend()); - std::replace(err.begin(), err.vend(), '\n', ' '); - - lastError = {type, std::move(err)}; - return true; - }); - } - - void TLastError::ClearError(TLastError::EScope scope) { - Update(scope, [&](TLastErr& lastError) { - if (!lastError) { - return false; - } - - lastError.Clear(); - return true; - }); - } - - void TLastError::ClearErrors() { - for (size_t idx = 0; idx < (size_t)EScope::COUNT; ++idx) { - ClearError((EScope)idx); - } - } - - void TLastError::ThrowLastError() { - EType type; - TString err = GetLastError(false, &type); - - switch (type) { - case EType::NonRetriable: - ythrow TNonRetriableException() - << "Failed to start TvmClient. Do not retry: " - << err; - case EType::Retriable: - ythrow TRetriableException() - << "Failed to start TvmClient. You can retry: " - << err; - } - } - - template <typename Func> - void TLastError::Update(TLastError::EScope scope, Func func) const { - Y_VERIFY(scope != EScope::COUNT); - - TLastErrors errs = *LastErrors_.Get(); - TLastErr& lastError = errs.Errors[(size_t)scope]; - - if (func(lastError)) { - LastErrors_.Set(MakeIntrusiveConst<TLastErrors>(std::move(errs))); - } - } -} diff --git a/library/cpp/tvmauth/client/misc/last_error.h b/library/cpp/tvmauth/client/misc/last_error.h deleted file mode 100644 index b0ad33611fe..00000000000 --- a/library/cpp/tvmauth/client/misc/last_error.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include "utils.h" - -#include <array> - -namespace NTvmAuth { - class TLastError { - public: - enum class EType { - NonRetriable, - Retriable, - }; - - enum class EScope { - ServiceTickets, - PublicKeys, - Roles, - TvmtoolConfig, - - COUNT, - }; - - using TLastErr = TMaybe<std::pair<EType, TString>>; - - struct TLastErrors: public TAtomicRefCount<TLastErrors> { - std::array<TLastErr, (int)EScope::COUNT> Errors; - }; - using TLastErrorsPtr = TIntrusiveConstPtr<TLastErrors>; - - public: - TLastError(); - - TString GetLastError(bool isOk, EType* type = nullptr) const; - - TString ProcessHttpError(EScope scope, TStringBuf path, int code, const TString& msg) const; - void ProcessError(EType type, EScope scope, const TStringBuf msg) const; - void ClearError(EScope scope); - void ClearErrors(); - void ThrowLastError(); - - private: - template <typename Func> - void Update(EScope scope, Func func) const; - - private: - const TString OK_ = "OK"; - - mutable NUtils::TProtectedValue<TLastErrorsPtr> LastErrors_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/proc_info.cpp b/library/cpp/tvmauth/client/misc/proc_info.cpp deleted file mode 100644 index e2e5ec15b9e..00000000000 --- a/library/cpp/tvmauth/client/misc/proc_info.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "proc_info.h" - -#include <library/cpp/tvmauth/version.h> - -#include <library/cpp/string_utils/quote/quote.h> - -#include <util/stream/file.h> -#include <util/string/cast.h> -#include <util/system/getpid.h> - -namespace NTvmAuth::NUtils { - void TProcInfo::AddToRequest(IOutputStream& out) const { - out << "_pid=" << Pid; - if (ProcessName) { - out << "&_procces_name=" << *ProcessName; - } - out << "&lib_version=client_" << VersionPrefix << LibVersion(); - } - - TProcInfo TProcInfo::Create(const TString& versionPrefix) { - TProcInfo res; - res.Pid = IntToString<10>(GetPID()); - res.ProcessName = GetProcessName(); - res.VersionPrefix = versionPrefix; - return res; - } - - std::optional<TString> TProcInfo::GetProcessName() { - try { - // works only for linux - TFileInput proc("/proc/self/status"); - - TString line; - while (proc.ReadLine(line)) { - TStringBuf buf(line); - if (!buf.SkipPrefix("Name:")) { - continue; - } - - while (buf && isspace(buf.front())) { - buf.Skip(1); - } - - TString res(buf); - CGIEscape(res); - return res; - } - } catch (...) { - } - - return {}; - } -} diff --git a/library/cpp/tvmauth/client/misc/proc_info.h b/library/cpp/tvmauth/client/misc/proc_info.h deleted file mode 100644 index b1526e5c470..00000000000 --- a/library/cpp/tvmauth/client/misc/proc_info.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include <util/generic/string.h> - -#include <optional> - -namespace NTvmAuth::NUtils { - struct TProcInfo { - TString Pid; - std::optional<TString> ProcessName; - TString VersionPrefix; - - void AddToRequest(IOutputStream& out) const; - - static TProcInfo Create(const TString& versionPrefix); - static std::optional<TString> GetProcessName(); - }; -} diff --git a/library/cpp/tvmauth/client/misc/retry_settings/v1/settings.proto b/library/cpp/tvmauth/client/misc/retry_settings/v1/settings.proto deleted file mode 100644 index 72817847a64..00000000000 --- a/library/cpp/tvmauth/client/misc/retry_settings/v1/settings.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto2"; - -package retry_settings.v1; - -option cc_enable_arenas = true; -option go_package = "a.yandex-team.ru/library/cpp/tvmauth/client/misc/retry_settings/v1"; - -message Settings { - optional uint32 exponential_backoff_min_sec = 1; - optional uint32 exponential_backoff_max_sec = 2; - optional double exponential_backoff_factor = 3; - optional double exponential_backoff_jitter = 4; - optional uint32 max_random_sleep_default = 5; - optional uint32 max_random_sleep_when_ok = 12; - optional uint32 retries_on_start = 6; - optional uint32 worker_awaking_period_sec = 7; - optional uint32 dsts_limit = 8; - optional uint32 retries_in_background = 9; - optional uint32 roles_update_period_sec = 10; - optional uint32 roles_warn_period_sec = 11; -} diff --git a/library/cpp/tvmauth/client/misc/roles/decoder.cpp b/library/cpp/tvmauth/client/misc/roles/decoder.cpp deleted file mode 100644 index 6337fb91c20..00000000000 --- a/library/cpp/tvmauth/client/misc/roles/decoder.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "decoder.h" - -#include <library/cpp/tvmauth/client/misc/utils.h> - -#include <library/cpp/openssl/crypto/sha.h> -#include <library/cpp/streams/brotli/brotli.h> -#include <library/cpp/streams/zstd/zstd.h> - -#include <util/generic/yexception.h> -#include <util/stream/zlib.h> -#include <util/string/ascii.h> - -namespace NTvmAuth::NRoles { - TString TDecoder::Decode(const TStringBuf codec, TString&& blob) { - if (codec.empty()) { - return std::move(blob); - } - - const TCodecInfo info = ParseCodec(codec); - TString decoded = DecodeImpl(info.Type, blob); - - VerifySize(decoded, info.Size); - VerifyChecksum(decoded, info.Sha256); - - return decoded; - } - - TDecoder::TCodecInfo TDecoder::ParseCodec(TStringBuf codec) { - const char delim = ':'; - - const TStringBuf version = codec.NextTok(delim); - Y_ENSURE(version == "1", - "unknown codec format version; known: 1; got: " << version); - - TCodecInfo res; - res.Type = codec.NextTok(delim); - Y_ENSURE(res.Type, "codec type is empty"); - - const TStringBuf size = codec.NextTok(delim); - Y_ENSURE(TryIntFromString<10>(size, res.Size), - "decoded blob size is not number"); - - res.Sha256 = codec; - const size_t expectedSha256Size = 2 * NOpenSsl::NSha256::DIGEST_LENGTH; - Y_ENSURE(res.Sha256.size() == expectedSha256Size, - "sha256 of decoded blob has invalid length: expected " - << expectedSha256Size << ", got " << res.Sha256.size()); - - return res; - } - - TString TDecoder::DecodeImpl(TStringBuf codec, const TString& blob) { - if (AsciiEqualsIgnoreCase(codec, "brotli")) { - return DecodeBrolti(blob); - } else if (AsciiEqualsIgnoreCase(codec, "gzip")) { - return DecodeGzip(blob); - } else if (AsciiEqualsIgnoreCase(codec, "zstd")) { - return DecodeZstd(blob); - } - - ythrow yexception() << "unknown codec: '" << codec << "'"; - } - - TString TDecoder::DecodeBrolti(const TString& blob) { - TStringInput in(blob); - return TBrotliDecompress(&in).ReadAll(); - } - - TString TDecoder::DecodeGzip(const TString& blob) { - TStringInput in(blob); - return TZLibDecompress(&in).ReadAll(); - } - - TString TDecoder::DecodeZstd(const TString& blob) { - TStringInput in(blob); - return TZstdDecompress(&in).ReadAll(); - } - - void TDecoder::VerifySize(const TStringBuf decoded, size_t expected) { - Y_ENSURE(expected == decoded.size(), - "Decoded blob has bad size: expected " << expected << ", actual " << decoded.size()); - } - - void TDecoder::VerifyChecksum(const TStringBuf decoded, const TStringBuf expected) { - using namespace NOpenSsl::NSha256; - - const TDigest dig = Calc(decoded); - const TString actual = NUtils::ToHex(TStringBuf((char*)dig.data(), dig.size())); - - Y_ENSURE(AsciiEqualsIgnoreCase(actual, expected), - "Decoded blob has bad sha256: expected=" << expected << ", actual=" << actual); - } -} diff --git a/library/cpp/tvmauth/client/misc/roles/decoder.h b/library/cpp/tvmauth/client/misc/roles/decoder.h deleted file mode 100644 index de5cdb37e0e..00000000000 --- a/library/cpp/tvmauth/client/misc/roles/decoder.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include <util/generic/string.h> - -namespace NTvmAuth::NRoles { - class TDecoder { - public: - static TString Decode(const TStringBuf codec, TString&& blob); - - public: - struct TCodecInfo { - TStringBuf Type; - size_t Size = 0; - TStringBuf Sha256; - - bool operator==(const TCodecInfo& o) const { - return Type == o.Type && - Size == o.Size && - Sha256 == o.Sha256; - } - }; - - static TCodecInfo ParseCodec(TStringBuf codec); - static TString DecodeImpl(TStringBuf codec, const TString& blob); - static TString DecodeBrolti(const TString& blob); - static TString DecodeGzip(const TString& blob); - static TString DecodeZstd(const TString& blob); - - static void VerifySize(const TStringBuf decoded, size_t expected); - static void VerifyChecksum(const TStringBuf decoded, const TStringBuf expected); - }; -} diff --git a/library/cpp/tvmauth/client/misc/roles/entities_index.cpp b/library/cpp/tvmauth/client/misc/roles/entities_index.cpp deleted file mode 100644 index c9b72c3a17f..00000000000 --- a/library/cpp/tvmauth/client/misc/roles/entities_index.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include "entities_index.h" - -#include <util/stream/str.h> - -#include <set> - -namespace NTvmAuth::NRoles { - TEntitiesIndex::TStage::TStage(const std::set<TString>& k) - : Keys_(k.begin(), k.end()) - { - } - - // TODO TStringBuf - bool TEntitiesIndex::TStage::GetNextKeySet(std::vector<TString>& out) { - out.clear(); - out.reserve(Keys_.size()); - - ++Id_; - for (size_t idx = 0; idx < Keys_.size(); ++idx) { - bool need = (Id_ >> idx) & 0x01; - - if (need) { - out.push_back(Keys_[idx]); - } - } - - return !out.empty(); - } - - TEntitiesIndex::TEntitiesIndex(const std::vector<TEntityPtr>& entities) { - const std::set<TString> uniqueKeys = GetUniqueSortedKeys(entities); - Idx_.Entities = entities; - Idx_.SubTree.reserve(uniqueKeys.size() * entities.size()); - - TStage stage(uniqueKeys); - std::vector<TString> keyset; - while (stage.GetNextKeySet(keyset)) { - for (const TEntityPtr& e : entities) { - TSubTree* currentBranch = &Idx_; - - for (const TString& key : keyset) { - auto it = e->find(key); - if (it == e->end()) { - continue; - } - - auto [i, ok] = currentBranch->SubTree.emplace( - TKeyValue{it->first, it->second}, - TSubTree()); - - currentBranch = &i->second; - currentBranch->Entities.push_back(e); - } - } - } - - MakeUnique(Idx_); - } - - std::set<TString> TEntitiesIndex::GetUniqueSortedKeys(const std::vector<TEntityPtr>& entities) { - std::set<TString> res; - - for (const TEntityPtr& e : entities) { - for (const auto& [key, value] : *e) { - res.insert(key); - } - } - - return res; - } - - void TEntitiesIndex::MakeUnique(TSubTree& branch) { - auto& vec = branch.Entities; - std::sort(vec.begin(), vec.end()); - vec.erase(std::unique(vec.begin(), vec.end()), vec.end()); - - for (auto& [_, restPart] : branch.SubTree) { - MakeUnique(restPart); - } - } - - static void Print(const TEntitiesIndex::TSubTree& part, IOutputStream& out, size_t offset = 0) { - std::vector<std::pair<TKeyValue, const TEntitiesIndex::TSubTree*>> vec; - vec.reserve(part.SubTree.size()); - - for (const auto& [key, value] : part.SubTree) { - vec.push_back({key, &value}); - } - - std::sort(vec.begin(), vec.end(), [](const auto& l, const auto& r) { - if (l.first.Key < r.first.Key) { - return true; - } - if (l.first.Value < r.first.Value) { - return true; - } - return false; - }); - - for (const auto& [key, value] : vec) { - out << TString(offset, ' ') << "\"" << key.Key << "/" << key.Value << "\"" << Endl; - Print(*value, out, offset + 4); - } - } - - TString TEntitiesIndex::PrintDebugString() const { - TStringStream res; - res << Endl; - - Print(Idx_, res); - - return res.Str(); - } -} diff --git a/library/cpp/tvmauth/client/misc/roles/entities_index.h b/library/cpp/tvmauth/client/misc/roles/entities_index.h deleted file mode 100644 index bf42750d52d..00000000000 --- a/library/cpp/tvmauth/client/misc/roles/entities_index.h +++ /dev/null @@ -1,107 +0,0 @@ -#pragma once - -#include "types.h" - -#include <library/cpp/tvmauth/client/exception.h> - -#include <set> -#include <vector> - -namespace NTvmAuth::NRoles { - class TEntitiesIndex: TMoveOnly { - public: - struct TSubTree; - using TIdxByAttrs = THashMap<TKeyValue, TSubTree>; - - struct TSubTree { - std::vector<TEntityPtr> Entities; - TIdxByAttrs SubTree; - }; - - class TStage { - public: - TStage(const std::set<TString>& k); - - bool GetNextKeySet(std::vector<TString>& out); - - private: - std::vector<TString> Keys_; - size_t Id_ = 0; - }; - - public: - TEntitiesIndex(const std::vector<TEntityPtr>& entities); - - /** - * Iterators must be to sorted unique key/value - */ - template <typename Iterator> - bool ContainsExactEntity(Iterator begin, Iterator end) const; - - /** - * Iterators must be to sorted unique key/value - */ - template <typename Iterator> - const std::vector<TEntityPtr>& GetEntitiesWithAttrs(Iterator begin, Iterator end) const; - - public: // for tests - static std::set<TString> GetUniqueSortedKeys(const std::vector<TEntityPtr>& entities); - static void MakeUnique(TEntitiesIndex::TSubTree& branch); - - TString PrintDebugString() const; - - private: - template <typename Iterator> - const TSubTree* FindSubtree(Iterator begin, Iterator end, size_t& size) const; - - private: - TSubTree Idx_; - std::vector<TEntityPtr> EmptyResult_; - }; - - template <typename Iterator> - bool TEntitiesIndex::ContainsExactEntity(Iterator begin, Iterator end) const { - size_t size = 0; - const TSubTree* subtree = FindSubtree(begin, end, size); - if (!subtree) { - return false; - } - - auto res = std::find_if( - subtree->Entities.begin(), - subtree->Entities.end(), - [size](const auto& e) { return size == e->size(); }); - return res != subtree->Entities.end(); - } - - template <typename Iterator> - const std::vector<TEntityPtr>& TEntitiesIndex::GetEntitiesWithAttrs(Iterator begin, Iterator end) const { - size_t size = 0; - const TSubTree* subtree = FindSubtree(begin, end, size); - if (!subtree) { - return EmptyResult_; - } - - return subtree->Entities; - } - - template <typename Iterator> - const TEntitiesIndex::TSubTree* TEntitiesIndex::FindSubtree(Iterator begin, - Iterator end, - size_t& size) const { - const TSubTree* subtree = &Idx_; - size = 0; - - for (auto attr = begin; attr != end; ++attr) { - auto it = subtree->SubTree.find(TKeyValueView{attr->first, attr->second}); - if (it == subtree->SubTree.end()) { - return nullptr; - } - - ++size; - subtree = &it->second; - } - - return subtree; - } -} diff --git a/library/cpp/tvmauth/client/misc/roles/parser.cpp b/library/cpp/tvmauth/client/misc/roles/parser.cpp deleted file mode 100644 index 28faf4c0570..00000000000 --- a/library/cpp/tvmauth/client/misc/roles/parser.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include "parser.h" - -#include <library/cpp/json/json_reader.h> - -#include <util/string/cast.h> - -namespace NTvmAuth::NRoles { - static void GetRequiredValue(const NJson::TJsonValue& doc, - TStringBuf key, - NJson::TJsonValue& obj) { - Y_ENSURE(doc.GetValue(key, &obj), "Missing '" << key << "'"); - } - - static ui64 GetRequiredUInt(const NJson::TJsonValue& doc, - TStringBuf key) { - NJson::TJsonValue obj; - GetRequiredValue(doc, key, obj); - Y_ENSURE(obj.IsUInteger(), "key '" << key << "' must be uint"); - return obj.GetUInteger(); - } - - static bool GetOptionalMap(const NJson::TJsonValue& doc, - TStringBuf key, - NJson::TJsonValue& obj) { - if (!doc.GetValue(key, &obj)) { - return false; - } - - Y_ENSURE(obj.IsMap(), "'" << key << "' must be object"); - return true; - } - - TRolesPtr TParser::Parse(TRawPtr decodedBlob) { - try { - return ParseImpl(decodedBlob); - } catch (const std::exception& e) { - throw yexception() << "Failed to parse roles from tirole: " << e.what() - << ". '" << *decodedBlob << "'"; - } - } - - TRolesPtr TParser::ParseImpl(TRawPtr decodedBlob) { - NJson::TJsonValue doc; - Y_ENSURE(NJson::ReadJsonTree(*decodedBlob, &doc), "Invalid json"); - Y_ENSURE(doc.IsMap(), "Json must be object"); - - TRoles::TTvmConsumers tvm = GetConsumers<TTvmId>(doc, "tvm"); - TRoles::TUserConsumers user = GetConsumers<TUid>(doc, "user"); - - // fetch it last to provide more correct apply instant - TRoles::TMeta meta = GetMeta(doc); - - return std::make_shared<TRoles>( - std::move(meta), - std::move(tvm), - std::move(user), - std::move(decodedBlob)); - } - - TRoles::TMeta TParser::GetMeta(const NJson::TJsonValue& doc) { - TRoles::TMeta res; - - NJson::TJsonValue obj; - GetRequiredValue(doc, "revision", obj); - if (obj.IsString()) { - res.Revision = obj.GetString(); - } else if (obj.IsUInteger()) { - res.Revision = ToString(obj.GetUInteger()); - } else { - ythrow yexception() << "'revision' has unexpected type: " << obj.GetType(); - } - - res.BornTime = TInstant::Seconds(GetRequiredUInt(doc, "born_date")); - - return res; - } - - template <typename Id> - THashMap<Id, TConsumerRolesPtr> TParser::GetConsumers(const NJson::TJsonValue& doc, - TStringBuf type) { - THashMap<Id, TConsumerRolesPtr> res; - - NJson::TJsonValue obj; - if (!GetOptionalMap(doc, type, obj)) { - return res; - } - - for (const auto& [key, value] : obj.GetMap()) { - Y_ENSURE(value.IsMap(), - "roles for consumer must be map: '" << key << "' is " << value.GetType()); - - Id id = 0; - Y_ENSURE(TryIntFromString<10>(key, id), - "id must be valid positive number of proper size for " - << type << ". got '" - << key << "'"); - - Y_ENSURE(res.emplace(id, GetConsumer(value, key)).second, - "consumer duplicate detected: '" << key << "' for " << type); - } - - return res; - } - - TConsumerRolesPtr TParser::GetConsumer(const NJson::TJsonValue& obj, TStringBuf consumer) { - TEntitiesByRoles entities; - - for (const auto& [key, value] : obj.GetMap()) { - Y_ENSURE(value.IsArray(), - "entities for roles must be array: '" << key << "' is " << value.GetType()); - - entities.emplace(key, GetEntities(value, consumer, key)); - } - - return std::make_shared<TConsumerRoles>(std::move(entities)); - } - - TEntitiesPtr TParser::GetEntities(const NJson::TJsonValue& obj, - TStringBuf consumer, - TStringBuf role) { - std::vector<TEntityPtr> entities; - entities.reserve(obj.GetArray().size()); - - for (const NJson::TJsonValue& e : obj.GetArray()) { - Y_ENSURE(e.IsMap(), - "role entity for role must be map: consumer '" - << consumer << "' with role '" << role << "' has " << e.GetType()); - - entities.push_back(GetEntity(e, consumer, role)); - } - - return std::make_shared<TEntities>(TEntities(entities)); - } - - TEntityPtr TParser::GetEntity(const NJson::TJsonValue& obj, TStringBuf consumer, TStringBuf role) { - TEntityPtr res = std::make_shared<TEntity>(); - - for (const auto& [key, value] : obj.GetMap()) { - Y_ENSURE(value.IsString(), - "entity is map (str->str), got value " - << value.GetType() << ". consumer '" - << consumer << "' with role '" << role << "'"); - - res->emplace(key, value.GetString()); - } - - return res; - } -} diff --git a/library/cpp/tvmauth/client/misc/roles/parser.h b/library/cpp/tvmauth/client/misc/roles/parser.h deleted file mode 100644 index 0982ba78c65..00000000000 --- a/library/cpp/tvmauth/client/misc/roles/parser.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "roles.h" -#include "types.h" - -namespace NJson { - class TJsonValue; -} - -namespace NTvmAuth::NRoles { - class TParser { - public: - static TRolesPtr Parse(TRawPtr decodedBlob); - - public: - static TRolesPtr ParseImpl(TRawPtr decodedBlob); - static TRoles::TMeta GetMeta(const NJson::TJsonValue& doc); - - template <typename Id> - static THashMap<Id, TConsumerRolesPtr> GetConsumers( - const NJson::TJsonValue& doc, - TStringBuf key); - - static TConsumerRolesPtr GetConsumer( - const NJson::TJsonValue& obj, - TStringBuf consumer); - static TEntitiesPtr GetEntities( - const NJson::TJsonValue& obj, - TStringBuf consumer, - TStringBuf role); - static TEntityPtr GetEntity( - const NJson::TJsonValue& obj, - TStringBuf consumer, - TStringBuf role); - }; -} diff --git a/library/cpp/tvmauth/client/misc/roles/roles.cpp b/library/cpp/tvmauth/client/misc/roles/roles.cpp deleted file mode 100644 index 0761033104d..00000000000 --- a/library/cpp/tvmauth/client/misc/roles/roles.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include "roles.h" - -#include <library/cpp/tvmauth/checked_service_ticket.h> -#include <library/cpp/tvmauth/checked_user_ticket.h> - -namespace NTvmAuth::NRoles { - TRoles::TRoles(TMeta&& meta, - TTvmConsumers tvm, - TUserConsumers user, - TRawPtr raw) - : Meta_(std::move(meta)) - , TvmIds_(std::move(tvm)) - , Users_(std::move(user)) - , Raw_(std::move(raw)) - { - Y_ENSURE(Raw_); - } - - TConsumerRolesPtr TRoles::GetRolesForService(const TCheckedServiceTicket& t) const { - Y_ENSURE_EX(t, - TIllegalUsage() << "Service ticket must be valid, got: " << t.GetStatus()); - auto it = TvmIds_.find(t.GetSrc()); - return it == TvmIds_.end() ? TConsumerRolesPtr() : it->second; - } - - TConsumerRolesPtr TRoles::GetRolesForUser(const TCheckedUserTicket& t, - std::optional<TUid> selectedUid) const { - Y_ENSURE_EX(t, - TIllegalUsage() << "User ticket must be valid, got: " << t.GetStatus()); - Y_ENSURE_EX(t.GetEnv() == EBlackboxEnv::ProdYateam, - TIllegalUsage() << "User ticket must be from ProdYateam, got from " << t.GetEnv()); - - TUid uid = t.GetDefaultUid(); - if (selectedUid) { - auto it = std::find(t.GetUids().begin(), t.GetUids().end(), *selectedUid); - Y_ENSURE_EX(it != t.GetUids().end(), - TIllegalUsage() << "selectedUid must be in user ticket but it's not: " - << *selectedUid); - uid = *selectedUid; - } - - auto it = Users_.find(uid); - return it == Users_.end() ? TConsumerRolesPtr() : it->second; - } - - const TRoles::TMeta& TRoles::GetMeta() const { - return Meta_; - } - - const TString& TRoles::GetRaw() const { - return *Raw_; - } - - bool TRoles::CheckServiceRole(const TCheckedServiceTicket& t, - const TStringBuf roleName) const { - TConsumerRolesPtr c = GetRolesForService(t); - return c ? c->HasRole(roleName) : false; - } - - bool TRoles::CheckUserRole(const TCheckedUserTicket& t, - const TStringBuf roleName, - std::optional<TUid> selectedUid) const { - TConsumerRolesPtr c = GetRolesForUser(t, selectedUid); - return c ? c->HasRole(roleName) : false; - } - - bool TRoles::CheckServiceRoleForExactEntity(const TCheckedServiceTicket& t, - const TStringBuf roleName, - const TEntity& exactEntity) const { - TConsumerRolesPtr c = GetRolesForService(t); - return c ? c->CheckRoleForExactEntity(roleName, exactEntity) : false; - } - - bool TRoles::CheckUserRoleForExactEntity(const TCheckedUserTicket& t, - const TStringBuf roleName, - const TEntity& exactEntity, - std::optional<TUid> selectedUid) const { - TConsumerRolesPtr c = GetRolesForUser(t, selectedUid); - return c ? c->CheckRoleForExactEntity(roleName, exactEntity) : false; - } - - TConsumerRoles::TConsumerRoles(TEntitiesByRoles roles) - : Roles_(std::move(roles)) - { - } - - bool TConsumerRoles::CheckRoleForExactEntity(const TStringBuf roleName, - const TEntity& exactEntity) const { - auto it = Roles_.find(roleName); - if (it == Roles_.end()) { - return false; - } - - return it->second->Contains(exactEntity); - } - - TEntities::TEntities(TEntitiesIndex idx) - : Idx_(std::move(idx)) - { - } -} diff --git a/library/cpp/tvmauth/client/misc/roles/roles.h b/library/cpp/tvmauth/client/misc/roles/roles.h deleted file mode 100644 index 6d510ee8a14..00000000000 --- a/library/cpp/tvmauth/client/misc/roles/roles.h +++ /dev/null @@ -1,186 +0,0 @@ -#pragma once - -#include "entities_index.h" -#include "types.h" - -#include <library/cpp/tvmauth/client/exception.h> - -#include <library/cpp/tvmauth/type.h> - -#include <util/datetime/base.h> -#include <util/generic/array_ref.h> -#include <util/generic/hash.h> - -#include <vector> - -namespace NTvmAuth { - class TCheckedServiceTicket; - class TCheckedUserTicket; -} - -namespace NTvmAuth::NRoles { - class TRoles { - public: - struct TMeta { - TString Revision; - TInstant BornTime; - TInstant Applied = TInstant::Now(); - }; - - using TTvmConsumers = THashMap<TTvmId, TConsumerRolesPtr>; - using TUserConsumers = THashMap<TUid, TConsumerRolesPtr>; - - TRoles(TMeta&& meta, - TTvmConsumers tvm, - TUserConsumers user, - TRawPtr raw); - - /** - * @return ptr to roles. It will be nullptr if there are no roles - */ - TConsumerRolesPtr GetRolesForService(const TCheckedServiceTicket& t) const; - - /** - * @return ptr to roles. It will be nullptr if there are no roles - */ - TConsumerRolesPtr GetRolesForUser(const TCheckedUserTicket& t, - std::optional<TUid> selectedUid = {}) const; - - const TMeta& GetMeta() const; - const TString& GetRaw() const; - - public: // shortcuts - /** - * @brief CheckServiceRole() is shortcut for simple role checking - for any possible entity - */ - bool CheckServiceRole( - const TCheckedServiceTicket& t, - const TStringBuf roleName) const; - - /** - * @brief CheckUserRole() is shortcut for simple role checking - for any possible entity - */ - bool CheckUserRole( - const TCheckedUserTicket& t, - const TStringBuf roleName, - std::optional<TUid> selectedUid = {}) const; - - /** - * @brief CheckServiceRoleForExactEntity() is shortcut for simple role checking for exact entity - */ - bool CheckServiceRoleForExactEntity( - const TCheckedServiceTicket& t, - const TStringBuf roleName, - const TEntity& exactEntity) const; - - /** - * @brief CheckUserRoleForExactEntity() is shortcut for simple role checking for exact entity - */ - bool CheckUserRoleForExactEntity( - const TCheckedUserTicket& t, - const TStringBuf roleName, - const TEntity& exactEntity, - std::optional<TUid> selectedUid = {}) const; - - private: - TMeta Meta_; - TTvmConsumers TvmIds_; - TUserConsumers Users_; - TRawPtr Raw_; - }; - - class TConsumerRoles { - public: - TConsumerRoles(TEntitiesByRoles roles); - - bool HasRole(const TStringBuf roleName) const { - return Roles_.contains(roleName); - } - - const TEntitiesByRoles& GetRoles() const { - return Roles_; - } - - /** - * @return ptr to entries. It will be nullptr if there is no role - */ - TEntitiesPtr GetEntitiesForRole(const TStringBuf roleName) const { - auto it = Roles_.find(roleName); - return it == Roles_.end() ? TEntitiesPtr() : it->second; - } - - /** - * @brief CheckRoleForExactEntity() is shortcut for simple role checking for exact entity - */ - bool CheckRoleForExactEntity(const TStringBuf roleName, - const TEntity& exactEntity) const; - - private: - TEntitiesByRoles Roles_; - }; - - class TEntities { - public: - TEntities(TEntitiesIndex idx); - - /** - * @brief Contains() provides info about entity presence - */ - bool Contains(const TEntity& exactEntity) const { - return Idx_.ContainsExactEntity(exactEntity.begin(), exactEntity.end()); - } - - /** - * @brief The same as Contains() - * It checks span for sorted and unique properties. - */ - template <class StrKey = TString, class StrValue = TString> - bool ContainsSortedUnique( - const TArrayRef<const std::pair<StrKey, StrValue>>& exactEntity) const { - CheckSpan(exactEntity); - return Idx_.ContainsExactEntity(exactEntity.begin(), exactEntity.end()); - } - - /** - * @brief GetEntitiesWithAttrs() collects entities with ALL attributes from `attrs` - */ - template <class StrKey = TString, class StrValue = TString> - const std::vector<TEntityPtr>& GetEntitiesWithAttrs( - const std::map<StrKey, StrValue>& attrs) const { - return Idx_.GetEntitiesWithAttrs(attrs.begin(), attrs.end()); - } - - /** - * @brief The same as GetEntitiesWithAttrs() - * It checks span for sorted and unique properties. - */ - template <class StrKey = TString, class StrValue = TString> - const std::vector<TEntityPtr>& GetEntitiesWithSortedUniqueAttrs( - const TArrayRef<const std::pair<StrKey, StrValue>>& attrs) const { - CheckSpan(attrs); - return Idx_.GetEntitiesWithAttrs(attrs.begin(), attrs.end()); - } - - private: - template <class StrKey, class StrValue> - static void CheckSpan(const TArrayRef<const std::pair<StrKey, StrValue>>& attrs) { - if (attrs.empty()) { - return; - } - - auto prev = attrs.begin(); - for (auto it = prev + 1; it != attrs.end(); ++it) { - Y_ENSURE_EX(prev->first != it->first, - TIllegalUsage() << "attrs are not unique: '" << it->first << "'"); - Y_ENSURE_EX(prev->first < it->first, - TIllegalUsage() << "attrs are not sorted: '" << prev->first - << "' before '" << it->first << "'"); - - prev = it; - } - } - - private: - TEntitiesIndex Idx_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/roles/types.h b/library/cpp/tvmauth/client/misc/roles/types.h deleted file mode 100644 index de0745e72e0..00000000000 --- a/library/cpp/tvmauth/client/misc/roles/types.h +++ /dev/null @@ -1,70 +0,0 @@ -#pragma once - -#include <util/generic/hash_set.h> - -#include <map> -#include <memory> - -namespace NTvmAuth::NRoles { - using TEntity = std::map<TString, TString>; - using TEntityPtr = std::shared_ptr<TEntity>; - - class TEntities; - using TEntitiesPtr = std::shared_ptr<TEntities>; - - using TEntitiesByRoles = THashMap<TString, TEntitiesPtr>; - - class TConsumerRoles; - using TConsumerRolesPtr = std::shared_ptr<TConsumerRoles>; - - class TRoles; - using TRolesPtr = std::shared_ptr<TRoles>; - - using TRawPtr = std::shared_ptr<TString>; - - template <class T> - struct TKeyValueBase { - T Key; - T Value; - - template <typename U> - bool operator==(const TKeyValueBase<U>& o) const { - return Key == o.Key && Value == o.Value; - } - }; - - using TKeyValue = TKeyValueBase<TString>; - using TKeyValueView = TKeyValueBase<TStringBuf>; -} - -// Traits - -template <> -struct THash<NTvmAuth::NRoles::TKeyValue> { - std::size_t operator()(const NTvmAuth::NRoles::TKeyValue& e) const { - return std::hash<std::string_view>()(e.Key) + std::hash<std::string_view>()(e.Value); - } - - std::size_t operator()(const NTvmAuth::NRoles::TKeyValueView& e) const { - return std::hash<std::string_view>()(e.Key) + std::hash<std::string_view>()(e.Value); - } -}; - -template <> -struct TEqualTo<NTvmAuth::NRoles::TKeyValue> { - using is_transparent = std::true_type; - - template <typename T, typename U> - bool operator()(const NTvmAuth::NRoles::TKeyValueBase<T>& l, - const NTvmAuth::NRoles::TKeyValueBase<U>& r) { - return l == r; - } -}; - -inline bool operator<(const NTvmAuth::NRoles::TEntityPtr& l, const NTvmAuth::NRoles::TEntityPtr& r) { - return *l < *r; -} - -inline bool operator==(const NTvmAuth::NRoles::TEntityPtr& l, const NTvmAuth::NRoles::TEntityPtr& r) { - return *l == *r; -} diff --git a/library/cpp/tvmauth/client/misc/service_tickets.h b/library/cpp/tvmauth/client/misc/service_tickets.h deleted file mode 100644 index 6a24bd56895..00000000000 --- a/library/cpp/tvmauth/client/misc/service_tickets.h +++ /dev/null @@ -1,86 +0,0 @@ -#pragma once - -#include "settings.h" -#include "roles/roles.h" - -#include <library/cpp/tvmauth/src/utils.h> - -#include <util/datetime/base.h> -#include <util/generic/hash.h> -#include <util/generic/maybe.h> -#include <util/generic/noncopyable.h> -#include <util/generic/ptr.h> - -namespace NTvmAuth::NInternal { - class TClientCaningKnife; -} - -namespace NTvmAuth { - class TServiceTickets: public TAtomicRefCount<TServiceTickets> { - public: - using TMapAliasStr = THashMap<TClientSettings::TAlias, TString>; - using TMapIdStr = THashMap<TTvmId, TString>; - using TIdSet = THashSet<TTvmId>; - using TAliasSet = THashSet<TClientSettings::TAlias>; - using TMapAliasId = THashMap<TClientSettings::TAlias, TTvmId>; - - TServiceTickets(TMapIdStr&& tickets, TMapIdStr&& errors, const TMapAliasId& dstMap) - : TicketsById(std::move(tickets)) - , ErrorsById(std::move(errors)) - { - InitAliasesAndUnfetchedIds(dstMap); - InitInvalidationTime(); - } - - static TInstant GetInvalidationTime(const TMapIdStr& ticketsById) { - TInstant res; - - for (const auto& pair : ticketsById) { - TMaybe<TInstant> t = NTvmAuth::NInternal::TCanningKnife::GetExpirationTime(pair.second); - if (!t) { - continue; - } - - res = res == TInstant() ? *t : std::min(res, *t); - } - - return res; - } - - public: - TMapIdStr TicketsById; - TMapIdStr ErrorsById; - TMapAliasStr TicketsByAlias; - TMapAliasStr ErrorsByAlias; - TInstant InvalidationTime; - TIdSet UnfetchedIds; - TAliasSet UnfetchedAliases; - - private: - void InitAliasesAndUnfetchedIds(const TMapAliasId& dstMap) { - for (const auto& pair : dstMap) { - auto it = TicketsById.find(pair.second); - auto errIt = ErrorsById.find(pair.second); - - if (it == TicketsById.end()) { - if (errIt != ErrorsById.end()) { - Y_ENSURE(ErrorsByAlias.insert({pair.first, errIt->second}).second, - "failed to add: " << pair.first); - } else { - UnfetchedAliases.insert(pair.first); - UnfetchedIds.insert(pair.second); - } - } else { - Y_ENSURE(TicketsByAlias.insert({pair.first, it->second}).second, - "failed to add: " << pair.first); - } - } - } - - void InitInvalidationTime() { - InvalidationTime = GetInvalidationTime(TicketsById); - } - }; - - using TServiceTicketsPtr = TIntrusiveConstPtr<TServiceTickets>; -} diff --git a/library/cpp/tvmauth/client/misc/settings.h b/library/cpp/tvmauth/client/misc/settings.h deleted file mode 100644 index 8fae6c34d36..00000000000 --- a/library/cpp/tvmauth/client/misc/settings.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include <util/generic/fwd.h> - -namespace NTvmAuth { - class TClientSettings { - public: - /*! - * Look at description in relevant settings: NTvmApi::TClientSettings or NTvmTool::TClientSettings - */ - using TAlias = TString; - }; -} diff --git a/library/cpp/tvmauth/client/misc/src_checker.h b/library/cpp/tvmauth/client/misc/src_checker.h deleted file mode 100644 index bb99fe8884a..00000000000 --- a/library/cpp/tvmauth/client/misc/src_checker.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "roles/roles.h" - -#include <library/cpp/tvmauth/client/exception.h> - -#include <library/cpp/tvmauth/checked_service_ticket.h> -#include <library/cpp/tvmauth/src/service_impl.h> -#include <library/cpp/tvmauth/src/utils.h> - -namespace NTvmAuth { - class TSrcChecker { - public: - /*! - * Checking must be enabled in TClientSettings - * Can throw exception if cache is out of date or wrong config - * @param ticket - */ - static TCheckedServiceTicket Check(TCheckedServiceTicket ticket, NRoles::TRolesPtr r) { - Y_ENSURE_EX(r, TBrokenTvmClientSettings() << "Need to use TClientSettings::EnableRolesFetching()"); - NRoles::TConsumerRolesPtr roles = r->GetRolesForService(ticket); - if (roles) { - return ticket; - } - - TServiceTicketImplPtr impl = THolder(NInternal::TCanningKnife::GetS(ticket)); - impl->SetStatus(ETicketStatus::NoRoles); - return TCheckedServiceTicket(std::move(impl)); - } - }; -} diff --git a/library/cpp/tvmauth/client/misc/threaded_updater.cpp b/library/cpp/tvmauth/client/misc/threaded_updater.cpp deleted file mode 100644 index 5d21ce67a75..00000000000 --- a/library/cpp/tvmauth/client/misc/threaded_updater.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "threaded_updater.h" - -#include <library/cpp/tvmauth/client/exception.h> - -#include <util/string/builder.h> -#include <util/system/spin_wait.h> -#include <util/system/thread.h> - -namespace NTvmAuth { - TThreadedUpdaterBase::TThreadedUpdaterBase(TDuration workerAwakingPeriod, - TLoggerPtr logger, - const TString& url, - ui16 port, - TDuration socketTimeout, - TDuration connectTimeout) - : WorkerAwakingPeriod_(workerAwakingPeriod) - , Logger_(std::move(logger)) - , TvmUrl_(url) - , TvmPort_(port) - , TvmSocketTimeout_(socketTimeout) - , TvmConnectTimeout_(connectTimeout) - , IsStopped_(true) - { - Y_ENSURE_EX(Logger_, TNonRetriableException() << "Logger is required"); - - ServiceTicketsDurations_.RefreshPeriod = TDuration::Hours(1); - ServiceTicketsDurations_.Expiring = TDuration::Hours(2); - ServiceTicketsDurations_.Invalid = TDuration::Hours(11); - - PublicKeysDurations_.RefreshPeriod = TDuration::Days(1); - PublicKeysDurations_.Expiring = TDuration::Days(2); - PublicKeysDurations_.Invalid = TDuration::Days(6); - } - - TThreadedUpdaterBase::~TThreadedUpdaterBase() { - StopWorker(); - } - - void TThreadedUpdaterBase::StartWorker() { - if (HttpClient_) { - HttpClient_->ResetConnection(); - } - Thread_ = MakeHolder<TThread>(WorkerWrap, this); - Thread_->Start(); - Started_.Wait(); - IsStopped_ = false; - } - - void TThreadedUpdaterBase::StopWorker() { - Event_.Signal(); - if (Thread_) { - Thread_.Reset(); - } - } - - TKeepAliveHttpClient& TThreadedUpdaterBase::GetClient() const { - if (!HttpClient_) { - HttpClient_ = MakeHolder<TKeepAliveHttpClient>(TvmUrl_, TvmPort_, TvmSocketTimeout_, TvmConnectTimeout_); - } - - return *HttpClient_; - } - - void TThreadedUpdaterBase::LogDebug(const TString& msg) const { - if (Logger_) { - Logger_->Debug(msg); - } - } - - void TThreadedUpdaterBase::LogInfo(const TString& msg) const { - if (Logger_) { - Logger_->Info(msg); - } - } - - void TThreadedUpdaterBase::LogWarning(const TString& msg) const { - if (Logger_) { - Logger_->Warning(msg); - } - } - - void TThreadedUpdaterBase::LogError(const TString& msg) const { - if (Logger_) { - Logger_->Error(msg); - } - } - - void* TThreadedUpdaterBase::WorkerWrap(void* arg) { - TThread::SetCurrentThreadName("TicketParserUpd"); - TThreadedUpdaterBase& this_ = *reinterpret_cast<TThreadedUpdaterBase*>(arg); - this_.Started_.Signal(); - this_.LogDebug("Thread-worker started"); - - while (true) { - if (this_.Event_.WaitT(this_.WorkerAwakingPeriod_)) { - break; - } - - try { - this_.Worker(); - this_.GetClient().ResetConnection(); - } catch (const std::exception& e) { // impossible now - this_.LogError(TStringBuilder() << "Failed to generate new cache: " << e.what()); - } - } - - this_.LogDebug("Thread-worker stopped"); - this_.IsStopped_ = true; - return nullptr; - } -} diff --git a/library/cpp/tvmauth/client/misc/threaded_updater.h b/library/cpp/tvmauth/client/misc/threaded_updater.h deleted file mode 100644 index 783684ba3be..00000000000 --- a/library/cpp/tvmauth/client/misc/threaded_updater.h +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -#include "async_updater.h" -#include "settings.h" - -#include <library/cpp/tvmauth/client/logger.h> - -#include <library/cpp/http/simple/http_client.h> - -#include <util/datetime/base.h> -#include <util/generic/ptr.h> -#include <util/system/event.h> -#include <util/system/thread.h> - -class TKeepAliveHttpClient; - -namespace NTvmAuth::NInternal { - class TClientCaningKnife; -} -namespace NTvmAuth { - class TThreadedUpdaterBase: public TAsyncUpdaterBase { - public: - TThreadedUpdaterBase(TDuration workerAwakingPeriod, - TLoggerPtr logger, - const TString& url, - ui16 port, - TDuration socketTimeout, - TDuration connectTimeout); - virtual ~TThreadedUpdaterBase(); - - protected: - void StartWorker(); - void StopWorker(); - - virtual void Worker() { - } - - TKeepAliveHttpClient& GetClient() const; - - void LogDebug(const TString& msg) const; - void LogInfo(const TString& msg) const; - void LogWarning(const TString& msg) const; - void LogError(const TString& msg) const; - - protected: - TDuration WorkerAwakingPeriod_; - - const TLoggerPtr Logger_; - - protected: - const TString TvmUrl_; - - private: - static void* WorkerWrap(void* arg); - - void StartTvmClientStopping() const override { - Event_.Signal(); - } - - bool IsTvmClientStopped() const override { - return IsStopped_; - } - - private: - mutable THolder<TKeepAliveHttpClient> HttpClient_; - - const ui32 TvmPort_; - const TDuration TvmSocketTimeout_; - const TDuration TvmConnectTimeout_; - - mutable TAutoEvent Event_; - mutable TAutoEvent Started_; - std::atomic_bool IsStopped_; - THolder<TThread> Thread_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/tool/meta_info.cpp b/library/cpp/tvmauth/client/misc/tool/meta_info.cpp deleted file mode 100644 index 9a0ae228fed..00000000000 --- a/library/cpp/tvmauth/client/misc/tool/meta_info.cpp +++ /dev/null @@ -1,208 +0,0 @@ -#include "meta_info.h" - -#include <library/cpp/json/json_reader.h> - -#include <util/string/builder.h> - -namespace NTvmAuth::NTvmTool { - TString TMetaInfo::TConfig::ToString() const { - TStringStream s; - s << "self_tvm_id=" << SelfTvmId << ", " - << "bb_env=" << BbEnv << ", " - << "idm_slug=" << (IdmSlug ? IdmSlug : "<NULL>") << ", " - << "dsts=["; - - for (const auto& pair : DstAliases) { - s << "(" << pair.first << ":" << pair.second << ")"; - } - - s << "]"; - - return std::move(s.Str()); - } - - TMetaInfo::TMetaInfo(TLoggerPtr logger) - : Logger_(std::move(logger)) - { - } - - TMetaInfo::TConfigPtr TMetaInfo::Init(TKeepAliveHttpClient& client, - const TClientSettings& settings) { - ApplySettings(settings); - - TryPing(client); - const TString metaString = Fetch(client); - if (Logger_) { - TStringStream s; - s << "Meta info fetched from " << settings.GetHostname() << ":" << settings.GetPort(); - Logger_->Debug(s.Str()); - } - - try { - Config_.Set(ParseMetaString(metaString, SelfAlias_)); - } catch (const yexception& e) { - ythrow TNonRetriableException() << "Malformed json from tvmtool: " << e.what(); - } - TConfigPtr cfg = Config_.Get(); - Y_ENSURE_EX(cfg, TNonRetriableException() << "Alias '" << SelfAlias_ << "' not found in meta info"); - - if (Logger_) { - Logger_->Info("Meta: " + cfg->ToString()); - } - - return cfg; - } - - TString TMetaInfo::GetRequestForTickets(const TConfig& config) { - Y_ENSURE(!config.DstAliases.empty()); - - TStringStream s; - s << "/tvm/tickets" - << "?src=" << config.SelfTvmId - << "&dsts="; - - for (const auto& pair : config.DstAliases) { - s << pair.second << ","; // avoid aliases - url-encoding required - } - s.Str().pop_back(); - - return s.Str(); - } - - bool TMetaInfo::TryUpdateConfig(TKeepAliveHttpClient& client) { - const TString metaString = Fetch(client); - - TConfigPtr config; - try { - config = ParseMetaString(metaString, SelfAlias_); - } catch (const yexception& e) { - ythrow TNonRetriableException() << "Malformed json from tvmtool: " << e.what(); - } - Y_ENSURE_EX(config, TNonRetriableException() << "Alias '" << SelfAlias_ << "' not found in meta info"); - - TConfigPtr oldConfig = Config_.Get(); - if (*config == *oldConfig) { - return false; - } - - if (Logger_) { - Logger_->Info(TStringBuilder() - << "Meta was updated. Old: (" << oldConfig->ToString() - << "). New: (" << config->ToString() << ")"); - } - - Config_ = config; - return true; - } - - void TMetaInfo::TryPing(TKeepAliveHttpClient& client) { - try { - TStringStream s; - TKeepAliveHttpClient::THttpCode code = client.DoGet("/tvm/ping", &s); - if (code < 200 || 300 <= code) { - throw yexception() << "(" << code << ") " << s.Str(); - } - } catch (const std::exception& e) { - ythrow TNonRetriableException() << "Failed to connect to tvmtool: " << e.what(); - } - } - - TString TMetaInfo::Fetch(TKeepAliveHttpClient& client) const { - TStringStream res; - TKeepAliveHttpClient::THttpCode code; - try { - code = client.DoGet("/tvm/private_api/__meta__", &res, AuthHeader_); - } catch (const std::exception& e) { - ythrow TRetriableException() << "Failed to fetch meta data from tvmtool: " << e.what(); - } - - if (code != 200) { - Y_ENSURE_EX(code != 404, - TNonRetriableException() << "Library does not support so old tvmtool. You need tvmtool>=1.1.0"); - - TStringStream err; - err << "Failed to fetch meta from tvmtool: " << client.GetHost() << ":" << client.GetPort() - << " (" << code << "): " << res.Str(); - Y_ENSURE_EX(!(500 <= code && code < 600), TRetriableException() << err.Str()); - ythrow TNonRetriableException() << err.Str(); - } - - return res.Str(); - } - - static TMetaInfo::TDstAliases::value_type ParsePair(const NJson::TJsonValue& val, const TString& meta) { - NJson::TJsonValue jAlias; - Y_ENSURE(val.GetValue("alias", &jAlias), meta); - Y_ENSURE(jAlias.IsString(), meta); - - NJson::TJsonValue jClientId; - Y_ENSURE(val.GetValue("client_id", &jClientId), meta); - Y_ENSURE(jClientId.IsInteger(), meta); - - return {jAlias.GetString(), jClientId.GetInteger()}; - } - - TMetaInfo::TConfigPtr TMetaInfo::ParseMetaString(const TString& meta, const TString& self) { - NJson::TJsonValue jDoc; - Y_ENSURE(NJson::ReadJsonTree(meta, &jDoc), meta); - - NJson::TJsonValue jEnv; - Y_ENSURE(jDoc.GetValue("bb_env", &jEnv), meta); - - NJson::TJsonValue jTenants; - Y_ENSURE(jDoc.GetValue("tenants", &jTenants), meta); - Y_ENSURE(jTenants.IsArray(), meta); - - for (const NJson::TJsonValue& jTen : jTenants.GetArray()) { - NJson::TJsonValue jSelf; - Y_ENSURE(jTen.GetValue("self", &jSelf), meta); - auto selfPair = ParsePair(jSelf, meta); - if (selfPair.first != self) { - continue; - } - - TConfigPtr config = std::make_shared<TConfig>(); - config->SelfTvmId = selfPair.second; - config->BbEnv = BbEnvFromString(jEnv.GetString(), meta); - - { - NJson::TJsonValue jSlug; - if (jTen.GetValue("idm_slug", &jSlug)) { - config->IdmSlug = jSlug.GetString(); - } - } - - NJson::TJsonValue jDsts; - Y_ENSURE(jTen.GetValue("dsts", &jDsts), meta); - Y_ENSURE(jDsts.IsArray(), meta); - for (const NJson::TJsonValue& jDst : jDsts.GetArray()) { - config->DstAliases.insert(ParsePair(jDst, meta)); - } - - return config; - } - - return {}; - } - - void TMetaInfo::ApplySettings(const TClientSettings& settings) { - AuthHeader_ = {{"Authorization", settings.GetAuthToken()}}; - SelfAlias_ = settings.GetSelfAlias(); - } - - EBlackboxEnv TMetaInfo::BbEnvFromString(const TString& env, const TString& meta) { - if (env == "Prod") { - return EBlackboxEnv::Prod; - } else if (env == "Test") { - return EBlackboxEnv::Test; - } else if (env == "ProdYaTeam") { - return EBlackboxEnv::ProdYateam; - } else if (env == "TestYaTeam") { - return EBlackboxEnv::TestYateam; - } else if (env == "Stress") { - return EBlackboxEnv::Stress; - } - - ythrow yexception() << "'bb_env'=='" << env << "'. " << meta; - } -} diff --git a/library/cpp/tvmauth/client/misc/tool/meta_info.h b/library/cpp/tvmauth/client/misc/tool/meta_info.h deleted file mode 100644 index 9dd4f0dbf85..00000000000 --- a/library/cpp/tvmauth/client/misc/tool/meta_info.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once - -#include "settings.h" - -#include <library/cpp/tvmauth/client/misc/utils.h> - -#include <library/cpp/tvmauth/client/logger.h> - -#include <library/cpp/http/simple/http_client.h> - -namespace NTvmAuth::NTvmTool { - class TMetaInfo { - public: - using TDstAliases = THashMap<TClientSettings::TAlias, TTvmId>; - - struct TConfig { - TTvmId SelfTvmId = 0; - EBlackboxEnv BbEnv = EBlackboxEnv::Prod; - TString IdmSlug; - TDstAliases DstAliases; - - bool AreTicketsRequired() const { - return !DstAliases.empty(); - } - - TString ToString() const; - - bool operator==(const TConfig& c) const { - return SelfTvmId == c.SelfTvmId && - BbEnv == c.BbEnv && - IdmSlug == c.IdmSlug && - DstAliases == c.DstAliases; - } - }; - using TConfigPtr = std::shared_ptr<TConfig>; - - public: - TMetaInfo(TLoggerPtr logger); - - TConfigPtr Init(TKeepAliveHttpClient& client, - const TClientSettings& settings); - - static TString GetRequestForTickets(const TMetaInfo::TConfig& config); - - const TKeepAliveHttpClient::THeaders& GetAuthHeader() const { - return AuthHeader_; - } - - TConfigPtr GetConfig() const { - return Config_.Get(); - } - - bool TryUpdateConfig(TKeepAliveHttpClient& client); - - protected: - void TryPing(TKeepAliveHttpClient& client); - TString Fetch(TKeepAliveHttpClient& client) const; - static TConfigPtr ParseMetaString(const TString& meta, const TString& self); - void ApplySettings(const TClientSettings& settings); - static EBlackboxEnv BbEnvFromString(const TString& env, const TString& meta); - - protected: - NUtils::TProtectedValue<TConfigPtr> Config_; - TKeepAliveHttpClient::THeaders AuthHeader_; - - TLoggerPtr Logger_; - TString SelfAlias_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/tool/roles_fetcher.cpp b/library/cpp/tvmauth/client/misc/tool/roles_fetcher.cpp deleted file mode 100644 index 05b0856edcf..00000000000 --- a/library/cpp/tvmauth/client/misc/tool/roles_fetcher.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "roles_fetcher.h" - -#include <library/cpp/tvmauth/client/misc/roles/parser.h> - -#include <library/cpp/http/misc/httpcodes.h> -#include <library/cpp/string_utils/quote/quote.h> - -#include <util/string/builder.h> -#include <util/string/join.h> - -namespace NTvmAuth::NTvmTool { - TRolesFetcher::TRolesFetcher(const TRolesFetcherSettings& settings, TLoggerPtr logger) - : Settings_(settings) - , Logger_(std::move(logger)) - { - } - - bool TRolesFetcher::IsTimeToUpdate(TDuration sinceUpdate) const { - return Settings_.UpdatePeriod < sinceUpdate; - } - - bool TRolesFetcher::ShouldWarn(TDuration sinceUpdate) const { - return Settings_.WarnPeriod < sinceUpdate; - } - - bool TRolesFetcher::AreRolesOk() const { - return bool(GetCurrentRoles()); - } - - NUtils::TFetchResult TRolesFetcher::FetchActualRoles(const TKeepAliveHttpClient::THeaders& authHeader, - TKeepAliveHttpClient& client) const { - const TRequest req = CreateRequest(authHeader); - - TStringStream out; - THttpHeaders outHeaders; - - TKeepAliveHttpClient::THttpCode code = client.DoGet( - req.Url, - &out, - req.Headers, - &outHeaders); - - return {code, std::move(outHeaders), "/v2/roles", out.Str(), {}}; - } - - void TRolesFetcher::Update(NUtils::TFetchResult&& fetchResult) { - if (fetchResult.Code == HTTP_NOT_MODIFIED) { - Y_ENSURE(CurrentRoles_.Get(), - "tvmtool did not return any roles because current roles are actual," - " but there are no roles in memory - this should never happen"); - return; - } - - Y_ENSURE(fetchResult.Code == HTTP_OK, - "Unexpected code from tvmtool: " << fetchResult.Code << ". " << fetchResult.Response); - - CurrentRoles_.Set(NRoles::TParser::Parse(std::make_shared<TString>(std::move(fetchResult.Response)))); - - Logger_->Debug( - TStringBuilder() << "Succeed to update roles with revision " - << CurrentRoles_.Get()->GetMeta().Revision); - } - - NTvmAuth::NRoles::TRolesPtr TRolesFetcher::GetCurrentRoles() const { - return CurrentRoles_.Get(); - } - - TRolesFetcher::TRequest TRolesFetcher::CreateRequest(const TKeepAliveHttpClient::THeaders& authHeader) const { - TRequest request{ - .Url = "/v2/roles?self=" + CGIEscapeRet(Settings_.SelfAlias), - .Headers = authHeader, - }; - - NRoles::TRolesPtr roles = CurrentRoles_.Get(); - if (roles) { - request.Headers.emplace(IfNoneMatch_, Join("", "\"", roles->GetMeta().Revision, "\"")); - } - - return request; - } -} diff --git a/library/cpp/tvmauth/client/misc/tool/roles_fetcher.h b/library/cpp/tvmauth/client/misc/tool/roles_fetcher.h deleted file mode 100644 index 8c60b59610d..00000000000 --- a/library/cpp/tvmauth/client/misc/tool/roles_fetcher.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/client/misc/fetch_result.h> -#include <library/cpp/tvmauth/client/misc/utils.h> -#include <library/cpp/tvmauth/client/misc/roles/roles.h> - -#include <library/cpp/tvmauth/client/logger.h> - -#include <util/datetime/base.h> -#include <util/generic/string.h> - -namespace NTvmAuth::NTvmTool { - struct TRolesFetcherSettings { - TString SelfAlias; - TDuration UpdatePeriod = TDuration::Minutes(1); - TDuration WarnPeriod = TDuration::Minutes(20); - }; - - class TRolesFetcher { - public: - TRolesFetcher(const TRolesFetcherSettings& settings, TLoggerPtr logger); - - bool IsTimeToUpdate(TDuration sinceUpdate) const; - bool ShouldWarn(TDuration sinceUpdate) const; - bool AreRolesOk() const; - - NUtils::TFetchResult FetchActualRoles(const TKeepAliveHttpClient::THeaders& authHeader, - TKeepAliveHttpClient& client) const; - void Update(NUtils::TFetchResult&& fetchResult); - - NTvmAuth::NRoles::TRolesPtr GetCurrentRoles() const; - - protected: - struct TRequest { - TString Url; - TKeepAliveHttpClient::THeaders Headers; - }; - - protected: - TRequest CreateRequest(const TKeepAliveHttpClient::THeaders& authHeader) const; - - private: - const TRolesFetcherSettings Settings_; - const TLoggerPtr Logger_; - const TString IfNoneMatch_ = "If-None-Match"; - - NUtils::TProtectedValue<NTvmAuth::NRoles::TRolesPtr> CurrentRoles_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/tool/settings.cpp b/library/cpp/tvmauth/client/misc/tool/settings.cpp deleted file mode 100644 index 894501f19d2..00000000000 --- a/library/cpp/tvmauth/client/misc/tool/settings.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "settings.h" - -#include <library/cpp/string_utils/url/url.h> - -#include <util/system/env.h> - -namespace NTvmAuth::NTvmTool { - TClientSettings::TClientSettings(const TAlias& selfAias) - : SelfAias_(selfAias) - , Hostname_("localhost") - , Port_(1) - , SocketTimeout_(TDuration::Seconds(5)) - , ConnectTimeout_(TDuration::Seconds(30)) - { - AuthToken_ = GetEnv("TVMTOOL_LOCAL_AUTHTOKEN"); - if (!AuthToken_) { - AuthToken_ = GetEnv("QLOUD_TVM_TOKEN"); - } - TStringBuf auth(AuthToken_); - FixSpaces(auth); - AuthToken_ = auth; - - const TString url = GetEnv("DEPLOY_TVM_TOOL_URL"); - if (url) { - TStringBuf scheme, host; - TryGetSchemeHostAndPort(url, scheme, host, Port_); - } - - Y_ENSURE_EX(SelfAias_, TBrokenTvmClientSettings() << "Alias for your TVM client cannot be empty"); - } - - void TClientSettings::FixSpaces(TStringBuf& str) { - while (str && isspace(str.back())) { - str.Chop(1); - } - } -} diff --git a/library/cpp/tvmauth/client/misc/tool/settings.h b/library/cpp/tvmauth/client/misc/tool/settings.h deleted file mode 100644 index 67c3959263f..00000000000 --- a/library/cpp/tvmauth/client/misc/tool/settings.h +++ /dev/null @@ -1,169 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/client/misc/settings.h> - -#include <library/cpp/tvmauth/client/exception.h> - -#include <library/cpp/tvmauth/checked_user_ticket.h> - -#include <util/datetime/base.h> -#include <util/generic/maybe.h> - -namespace NTvmAuth::NTvmTool { - /** - * Uses local http-interface to get state: http://localhost/tvm/. - * This interface can be provided with tvmtool (local daemon) or Qloud/YP (local http api in container). - * See more: https://wiki.yandex-team.ru/passport/tvm2/qloud/. - * - * Most part of settings will be fetched from tvmtool on start of client. - * You need to use aliases for TVM-clients (src and dst) which you specified in tvmtool or Qloud/YP interface - */ - class TClientSettings: public NTvmAuth::TClientSettings { - public: - /*! - * Sets default values: - * - hostname == "localhost" - * - port detected with env["DEPLOY_TVM_TOOL_URL"] (provided with Yandex.Deploy), - * otherwise port == 1 (it is ok for Qloud) - * - authToken: env["TVMTOOL_LOCAL_AUTHTOKEN"] (provided with Yandex.Deploy), - * otherwise env["QLOUD_TVM_TOKEN"] (provided with Qloud) - * - * AuthToken is protection from SSRF. - * - * @param selfAias - alias for your TVM client, which you specified in tvmtool or YD interface - */ - TClientSettings(const TAlias& selfAias); - - /*! - * Look at comment for ctor - * @param port - */ - TClientSettings& SetPort(ui16 port) { - Port_ = port; - return *this; - } - - /*! - * Default value: hostname == "localhost" - * @param hostname - */ - TClientSettings& SetHostname(const TString& hostname) { - Y_ENSURE_EX(hostname, TBrokenTvmClientSettings() << "Hostname cannot be empty"); - Hostname_ = hostname; - return *this; - } - - TClientSettings& SetSocketTimeout(TDuration socketTimeout) { - SocketTimeout_ = socketTimeout; - return *this; - } - - TClientSettings& SetConnectTimeout(TDuration connectTimeout) { - ConnectTimeout_ = connectTimeout; - return *this; - } - - /*! - * Look at comment for ctor - * @param token - */ - TClientSettings& SetAuthToken(TStringBuf token) { - FixSpaces(token); - Y_ENSURE_EX(token, TBrokenTvmClientSettings() << "Auth token cannot be empty"); - AuthToken_ = token; - return *this; - } - - /*! - * Blackbox environmet is provided by tvmtool for client. - * You can override it for your purpose with limitations: - * (env from tvmtool) -> (override) - * - Prod/ProdYateam -> Prod/ProdYateam - * - Test/TestYateam -> Test/TestYateam - * - Stress -> Stress - * - * You can contact tvm-dev@yandex-team.ru if limitations are too strict - * @param env - */ - TClientSettings& OverrideBlackboxEnv(EBlackboxEnv env) { - BbEnv_ = env; - return *this; - } - - /*! - * By default client checks src from ServiceTicket or default uid from UserTicket - - * to prevent you from forgetting to check it yourself. - * It does binary checks only: - * ticket gets status NoRoles, if there is no role for src or default uid. - * You need to check roles on your own if you have a non-binary role system or - * you have disabled ShouldCheckSrc/ShouldCheckDefaultUid - * - * You may need to disable this check in the following cases: - * - You use GetRoles() to provide verbose message (with revision). - * Double check may be inconsistent: - * binary check inside client uses revision of roles X - i.e. src 100500 has no role, - * exact check in your code uses revision of roles Y - i.e. src 100500 has some roles. - */ - bool ShouldCheckSrc = true; - bool ShouldCheckDefaultUid = true; - - // DEPRECATED API - // TODO: get rid of it: PASSP-35377 - public: - // Deprecated: set attributes directly - TClientSettings& SetShouldCheckSrc(bool val = true) { - ShouldCheckSrc = val; - return *this; - } - - // Deprecated: set attributes directly - TClientSettings& SetSShouldCheckDefaultUid(bool val = true) { - ShouldCheckDefaultUid = val; - return *this; - } - - public: // for TAsyncUpdaterBase - const TAlias& GetSelfAlias() const { - return SelfAias_; - } - - const TString& GetHostname() const { - return Hostname_; - } - - ui16 GetPort() const { - return Port_; - } - - TDuration GetSocketTimeout() const { - return SocketTimeout_; - } - - TDuration GetConnectTimeout() const { - return ConnectTimeout_; - } - - const TString& GetAuthToken() const { - Y_ENSURE_EX(AuthToken_, TBrokenTvmClientSettings() - << "Auth token cannot be empty. " - << "Env 'TVMTOOL_LOCAL_AUTHTOKEN' and 'QLOUD_TVM_TOKEN' are empty."); - return AuthToken_; - } - - TMaybe<EBlackboxEnv> GetOverridedBlackboxEnv() const { - return BbEnv_; - } - - private: - void FixSpaces(TStringBuf& str); - - private: - TAlias SelfAias_; - TString Hostname_; - ui16 Port_; - TDuration SocketTimeout_; - TDuration ConnectTimeout_; - TString AuthToken_; - TMaybe<EBlackboxEnv> BbEnv_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/tool/threaded_updater.cpp b/library/cpp/tvmauth/client/misc/tool/threaded_updater.cpp deleted file mode 100644 index 35bbe4f6179..00000000000 --- a/library/cpp/tvmauth/client/misc/tool/threaded_updater.cpp +++ /dev/null @@ -1,370 +0,0 @@ -#include "threaded_updater.h" - -#include <library/cpp/tvmauth/client/misc/utils.h> - -#include <library/cpp/json/json_reader.h> - -#include <util/generic/hash_set.h> -#include <util/stream/str.h> -#include <util/string/ascii.h> -#include <util/string/builder.h> -#include <util/string/cast.h> - -namespace NTvmAuth::NTvmTool { - TAsyncUpdaterPtr TThreadedUpdater::Create(const TClientSettings& settings, TLoggerPtr logger) { - Y_ENSURE_EX(logger, TNonRetriableException() << "Logger is required"); - THolder<TThreadedUpdater> p(new TThreadedUpdater( - settings.GetHostname(), - settings.GetPort(), - settings.GetSocketTimeout(), - settings.GetConnectTimeout(), - std::move(logger))); - p->Init(settings); - p->StartWorker(); - return p.Release(); - } - - TThreadedUpdater::~TThreadedUpdater() { - StopWorker(); // Required here to avoid using of deleted members - } - - TClientStatus TThreadedUpdater::GetStatus() const { - const TClientStatus::ECode state = GetState(); - return TClientStatus(state, GetLastError(state == TClientStatus::Ok)); - } - - NRoles::TRolesPtr TThreadedUpdater::GetRoles() const { - Y_ENSURE_EX(RolesFetcher_, - TBrokenTvmClientSettings() << "Roles were not configured in settings"); - return RolesFetcher_->GetCurrentRoles(); - } - - TClientStatus::ECode TThreadedUpdater::GetState() const { - const TInstant now = TInstant::Now(); - const TMetaInfo::TConfigPtr config = MetaInfo_.GetConfig(); - - if ((config->AreTicketsRequired() && AreServiceTicketsInvalid(now)) || ArePublicKeysInvalid(now)) { - return TClientStatus::Error; - } - - if (config->AreTicketsRequired()) { - if (!GetCachedServiceTickets() || config->DstAliases.size() > GetCachedServiceTickets()->TicketsByAlias.size()) { - return TClientStatus::Error; - } - } - - const TDuration st = now - GetUpdateTimeOfServiceTickets(); - const TDuration pk = now - GetUpdateTimeOfPublicKeys(); - - if ((config->AreTicketsRequired() && st > ServiceTicketsDurations_.Expiring) || pk > PublicKeysDurations_.Expiring) { - return TClientStatus::Warning; - } - - if (RolesFetcher_ && RolesFetcher_->ShouldWarn(now - GetUpdateTimeOfRoles())) { - return TClientStatus::Warning; - } - - if (IsConfigWarnTime()) { - return TClientStatus::Warning; - } - - return TClientStatus::Ok; - } - - TThreadedUpdater::TThreadedUpdater(const TString& host, ui16 port, TDuration socketTimeout, TDuration connectTimeout, TLoggerPtr logger) - : TThreadedUpdaterBase(TDuration::Seconds(5), logger, host, port, socketTimeout, connectTimeout) - , MetaInfo_(logger) - , ConfigWarnDelay_(TDuration::Seconds(30)) - { - ServiceTicketsDurations_.RefreshPeriod = TDuration::Minutes(10); - PublicKeysDurations_.RefreshPeriod = TDuration::Minutes(10); - } - - void TThreadedUpdater::Init(const TClientSettings& settings) { - const TMetaInfo::TConfigPtr config = MetaInfo_.Init(GetClient(), settings); - LastVisitForConfig_ = TInstant::Now(); - - SetBbEnv(config->BbEnv, settings.GetOverridedBlackboxEnv()); - if (settings.GetOverridedBlackboxEnv()) { - LogInfo(TStringBuilder() - << "Meta: override blackbox env: " << config->BbEnv - << "->" << *settings.GetOverridedBlackboxEnv()); - } - - if (config->IdmSlug) { - RolesFetcher_ = std::make_unique<TRolesFetcher>( - TRolesFetcherSettings{ - .SelfAlias = settings.GetSelfAlias(), - }, - Logger_); - } - - ui8 tries = 3; - do { - UpdateState(); - } while (!IsEverythingOk(*config) && --tries > 0); - - if (!IsEverythingOk(*config)) { - ThrowLastError(); - } - } - - void TThreadedUpdater::UpdateState() { - bool wasUpdated = false; - try { - wasUpdated = MetaInfo_.TryUpdateConfig(GetClient()); - LastVisitForConfig_ = TInstant::Now(); - ClearError(EScope::TvmtoolConfig); - } catch (const std::exception& e) { - ProcessError(EType::Retriable, EScope::TvmtoolConfig, e.what()); - LogWarning(TStringBuilder() << "Error while fetching of tvmtool config: " << e.what()); - } - if (IsConfigWarnTime()) { - LogError(TStringBuilder() << "Tvmtool config have not been refreshed for too long period"); - } - - TMetaInfo::TConfigPtr config = MetaInfo_.GetConfig(); - - if (wasUpdated || IsTimeToUpdateServiceTickets(*config, LastVisitForServiceTickets_)) { - try { - const TInstant updateTime = UpdateServiceTickets(*config); - SetUpdateTimeOfServiceTickets(updateTime); - LastVisitForServiceTickets_ = TInstant::Now(); - - if (AreServiceTicketsOk(*config)) { - ClearError(EScope::ServiceTickets); - } - LogDebug(TStringBuilder() << "Tickets fetched from tvmtool: " << updateTime); - } catch (const std::exception& e) { - ProcessError(EType::Retriable, EScope::ServiceTickets, e.what()); - LogWarning(TStringBuilder() << "Error while fetching of tickets: " << e.what()); - } - - if (TInstant::Now() - GetUpdateTimeOfServiceTickets() > ServiceTicketsDurations_.Expiring) { - LogError("Service tickets have not been refreshed for too long period"); - } - } - - if (wasUpdated || IsTimeToUpdatePublicKeys(LastVisitForPublicKeys_)) { - try { - const TInstant updateTime = UpdateKeys(*config); - SetUpdateTimeOfPublicKeys(updateTime); - LastVisitForPublicKeys_ = TInstant::Now(); - - if (ArePublicKeysOk()) { - ClearError(EScope::PublicKeys); - } - LogDebug(TStringBuilder() << "Public keys fetched from tvmtool: " << updateTime); - } catch (const std::exception& e) { - ProcessError(EType::Retriable, EScope::PublicKeys, e.what()); - LogWarning(TStringBuilder() << "Error while fetching of public keys: " << e.what()); - } - - if (TInstant::Now() - GetUpdateTimeOfPublicKeys() > PublicKeysDurations_.Expiring) { - LogError("Public keys have not been refreshed for too long period"); - } - } - - if (RolesFetcher_ && (wasUpdated || RolesFetcher_->IsTimeToUpdate(TInstant::Now() - GetUpdateTimeOfRoles()))) { - try { - RolesFetcher_->Update(RolesFetcher_->FetchActualRoles(MetaInfo_.GetAuthHeader(), GetClient())); - SetUpdateTimeOfRoles(TInstant::Now()); - - if (RolesFetcher_->AreRolesOk()) { - ClearError(EScope::Roles); - } - } catch (const std::exception& e) { - ProcessError(EType::Retriable, EScope::Roles, e.what()); - LogWarning(TStringBuilder() << "Failed to update roles: " << e.what()); - } - - if (RolesFetcher_->ShouldWarn(TInstant::Now() - GetUpdateTimeOfRoles())) { - LogError("Roles have not been refreshed for too long period"); - } - } - } - - TInstant TThreadedUpdater::UpdateServiceTickets(const TMetaInfo::TConfig& config) { - const std::pair<TString, TInstant> tickets = FetchServiceTickets(config); - - if (TInstant::Now() - tickets.second >= ServiceTicketsDurations_.Invalid) { - throw yexception() << "Service tickets are too old: " << tickets.second; - } - - TPairTicketsErrors p = ParseFetchTicketsResponse(tickets.first, config.DstAliases); - SetServiceTickets(MakeIntrusiveConst<TServiceTickets>(std::move(p.Tickets), - std::move(p.Errors), - config.DstAliases)); - return tickets.second; - } - - std::pair<TString, TInstant> TThreadedUpdater::FetchServiceTickets(const TMetaInfo::TConfig& config) const { - TStringStream s; - THttpHeaders headers; - - const TString request = TMetaInfo::GetRequestForTickets(config); - auto code = GetClient().DoGet(request, &s, MetaInfo_.GetAuthHeader(), &headers); - Y_ENSURE(code == 200, ProcessHttpError(EScope::ServiceTickets, request, code, s.Str())); - - return {s.Str(), GetBirthTimeFromResponse(headers, "tickets")}; - } - - static THashSet<TTvmId> GetAllTvmIds(const TMetaInfo::TDstAliases& dsts) { - THashSet<TTvmId> res; - res.reserve(dsts.size()); - - for (const auto& pair : dsts) { - res.insert(pair.second); - } - - return res; - } - - TAsyncUpdaterBase::TPairTicketsErrors TThreadedUpdater::ParseFetchTicketsResponse(const TString& resp, - const TMetaInfo::TDstAliases& dsts) const { - const THashSet<TTvmId> allTvmIds = GetAllTvmIds(dsts); - - TServiceTickets::TMapIdStr tickets; - TServiceTickets::TMapIdStr errors; - - auto procErr = [this](const TString& msg) { - ProcessError(EType::NonRetriable, EScope::ServiceTickets, msg); - LogError(msg); - }; - - NJson::TJsonValue doc; - Y_ENSURE(NJson::ReadJsonTree(resp, &doc), "Invalid json from tvmtool: " << resp); - - for (const auto& pair : doc.GetMap()) { - NJson::TJsonValue tvmId; - unsigned long long tvmIdNum = 0; - - if (!pair.second.GetValue("tvm_id", &tvmId) || - !tvmId.GetUInteger(&tvmIdNum)) { - procErr(TStringBuilder() - << "Failed to get 'tvm_id' from key, should never happend '" - << pair.first << "': " << resp); - continue; - } - - if (!allTvmIds.contains(tvmIdNum)) { - continue; - } - - NJson::TJsonValue val; - if (!pair.second.GetValue("ticket", &val)) { - TString err; - if (pair.second.GetValue("error", &val)) { - err = val.GetString(); - } else { - err = "Failed to get 'ticket' and 'error', should never happend: " + pair.first; - } - - procErr(TStringBuilder() - << "Failed to get ServiceTicket for " << pair.first - << " (" << tvmIdNum << "): " << err); - - errors.insert({tvmIdNum, std::move(err)}); - continue; - } - - tickets.insert({tvmIdNum, val.GetString()}); - } - - // This work-around is required because of bug in old verions of tvmtool: PASSP-24829 - for (const auto& pair : dsts) { - if (!tickets.contains(pair.second) && !errors.contains(pair.second)) { - TString err = "Missing tvm_id in response, should never happend: " + pair.first; - - procErr(TStringBuilder() - << "Failed to get ServiceTicket for " << pair.first - << " (" << pair.second << "): " << err); - - errors.emplace(pair.second, std::move(err)); - } - } - - return {std::move(tickets), std::move(errors)}; - } - - TInstant TThreadedUpdater::UpdateKeys(const TMetaInfo::TConfig& config) { - const std::pair<TString, TInstant> keys = FetchPublicKeys(); - - if (TInstant::Now() - keys.second >= PublicKeysDurations_.Invalid) { - throw yexception() << "Public keys are too old: " << keys.second; - } - - SetServiceContext(MakeIntrusiveConst<TServiceContext>( - TServiceContext::CheckingFactory(config.SelfTvmId, keys.first))); - SetUserContext(keys.first); - - return keys.second; - } - - std::pair<TString, TInstant> TThreadedUpdater::FetchPublicKeys() const { - TStringStream s; - THttpHeaders headers; - - auto code = GetClient().DoGet("/tvm/keys", &s, MetaInfo_.GetAuthHeader(), &headers); - Y_ENSURE(code == 200, ProcessHttpError(EScope::PublicKeys, "/tvm/keys", code, s.Str())); - - return {s.Str(), GetBirthTimeFromResponse(headers, "public keys")}; - } - - TInstant TThreadedUpdater::GetBirthTimeFromResponse(const THttpHeaders& headers, TStringBuf errMsg) { - auto it = std::find_if(headers.begin(), - headers.end(), - [](const THttpInputHeader& h) { - return AsciiEqualsIgnoreCase(h.Name(), "X-Ya-Tvmtool-Data-Birthtime"); - }); - Y_ENSURE(it != headers.end(), "Failed to fetch bithtime of " << errMsg << " from tvmtool"); - - ui64 time = 0; - Y_ENSURE(TryIntFromString<10>(it->Value(), time), - "Bithtime of " << errMsg << " from tvmtool must be unixtime. Got: " << it->Value()); - - return TInstant::Seconds(time); - } - - bool TThreadedUpdater::IsTimeToUpdateServiceTickets(const TMetaInfo::TConfig& config, - TInstant lastUpdate) const { - return config.AreTicketsRequired() && - TInstant::Now() - lastUpdate > ServiceTicketsDurations_.RefreshPeriod; - } - - bool TThreadedUpdater::IsTimeToUpdatePublicKeys(TInstant lastUpdate) const { - return TInstant::Now() - lastUpdate > PublicKeysDurations_.RefreshPeriod; - } - - bool TThreadedUpdater::IsEverythingOk(const TMetaInfo::TConfig& config) const { - if (RolesFetcher_ && !RolesFetcher_->AreRolesOk()) { - return false; - } - return AreServiceTicketsOk(config) && ArePublicKeysOk(); - } - - bool TThreadedUpdater::AreServiceTicketsOk(const TMetaInfo::TConfig& config) const { - return AreServiceTicketsOk(config.DstAliases.size()); - } - - bool TThreadedUpdater::AreServiceTicketsOk(size_t requiredCount) const { - if (requiredCount == 0) { - return true; - } - - auto c = GetCachedServiceTickets(); - return c && c->TicketsByAlias.size() == requiredCount; - } - - bool TThreadedUpdater::ArePublicKeysOk() const { - return GetCachedServiceContext() && GetCachedUserContext(); - } - - bool TThreadedUpdater::IsConfigWarnTime() const { - return LastVisitForConfig_ + ConfigWarnDelay_ < TInstant::Now(); - } - - void TThreadedUpdater::Worker() { - UpdateState(); - } -} diff --git a/library/cpp/tvmauth/client/misc/tool/threaded_updater.h b/library/cpp/tvmauth/client/misc/tool/threaded_updater.h deleted file mode 100644 index 57f97f54422..00000000000 --- a/library/cpp/tvmauth/client/misc/tool/threaded_updater.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -#include "meta_info.h" -#include "roles_fetcher.h" - -#include <library/cpp/tvmauth/client/misc/async_updater.h> -#include <library/cpp/tvmauth/client/misc/threaded_updater.h> - -#include <atomic> - -namespace NTvmAuth::NTvmTool { - class TThreadedUpdater: public TThreadedUpdaterBase { - public: - static TAsyncUpdaterPtr Create(const TClientSettings& settings, TLoggerPtr logger); - ~TThreadedUpdater(); - - TClientStatus GetStatus() const override; - NRoles::TRolesPtr GetRoles() const override; - - protected: // for tests - TClientStatus::ECode GetState() const; - - TThreadedUpdater(const TString& host, ui16 port, TDuration socketTimeout, TDuration connectTimeout, TLoggerPtr logger); - - void Init(const TClientSettings& settings); - void UpdateState(); - - TInstant UpdateServiceTickets(const TMetaInfo::TConfig& config); - std::pair<TString, TInstant> FetchServiceTickets(const TMetaInfo::TConfig& config) const; - TPairTicketsErrors ParseFetchTicketsResponse(const TString& resp, - const TMetaInfo::TDstAliases& dsts) const; - - TInstant UpdateKeys(const TMetaInfo::TConfig& config); - std::pair<TString, TInstant> FetchPublicKeys() const; - - static TInstant GetBirthTimeFromResponse(const THttpHeaders& headers, TStringBuf errMsg); - - bool IsTimeToUpdateServiceTickets(const TMetaInfo::TConfig& config, TInstant lastUpdate) const; - bool IsTimeToUpdatePublicKeys(TInstant lastUpdate) const; - - bool IsEverythingOk(const TMetaInfo::TConfig& config) const; - bool AreServiceTicketsOk(const TMetaInfo::TConfig& config) const; - bool AreServiceTicketsOk(size_t requiredCount) const; - bool ArePublicKeysOk() const; - bool IsConfigWarnTime() const; - - private: - void Worker() override; - - protected: - TMetaInfo MetaInfo_; - TInstant LastVisitForServiceTickets_; - TInstant LastVisitForPublicKeys_; - TInstant LastVisitForConfig_; - TDuration ConfigWarnDelay_; - std::unique_ptr<TRolesFetcher> RolesFetcher_; - }; -} diff --git a/library/cpp/tvmauth/client/misc/utils.cpp b/library/cpp/tvmauth/client/misc/utils.cpp deleted file mode 100644 index a124c7b11cd..00000000000 --- a/library/cpp/tvmauth/client/misc/utils.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "utils.h" - -#include <library/cpp/tvmauth/client/facade.h> - -#include <util/stream/format.h> - -namespace NTvmAuth::NInternal { - void TClientCaningKnife::StartTvmClientStopping(TTvmClient* c) { - if (c && c->Updater_) { - c->Updater_->StartTvmClientStopping(); - } - } - - bool TClientCaningKnife::IsTvmClientStopped(TTvmClient* c) { - return c && c->Updater_ ? c->Updater_->IsTvmClientStopped() : true; - } -} - -namespace NTvmAuth::NUtils { - TString ToHex(const TStringBuf s) { - TStringStream res; - res.Reserve(2 * s.size()); - - for (char c : s) { - res << Hex(c, HF_FULL); - } - - return std::move(res.Str()); - } - - bool CheckBbEnvOverriding(EBlackboxEnv original, EBlackboxEnv override) noexcept { - switch (original) { - case EBlackboxEnv::Prod: - case EBlackboxEnv::ProdYateam: - return override == EBlackboxEnv::Prod || override == EBlackboxEnv::ProdYateam; - case EBlackboxEnv::Test: - return true; - case EBlackboxEnv::TestYateam: - return override == EBlackboxEnv::Test || override == EBlackboxEnv::TestYateam; - case EBlackboxEnv::Stress: - return override == EBlackboxEnv::Stress; - } - - return false; - } -} diff --git a/library/cpp/tvmauth/client/misc/utils.h b/library/cpp/tvmauth/client/misc/utils.h deleted file mode 100644 index 1aa5e61bf1a..00000000000 --- a/library/cpp/tvmauth/client/misc/utils.h +++ /dev/null @@ -1,95 +0,0 @@ -#pragma once - -#include "api/settings.h" -#include "tool/settings.h" - -#include <util/string/cast.h> -#include <util/system/spinlock.h> - -#include <optional> - -namespace NTvmAuth { - class TTvmClient; -} - -namespace NTvmAuth::NInternal { - class TClientCaningKnife { - public: - static void StartTvmClientStopping(TTvmClient* c); - static bool IsTvmClientStopped(TTvmClient* c); - }; -} - -namespace NTvmAuth::NUtils { - TString ToHex(const TStringBuf s); - - inline NTvmAuth::NTvmApi::TClientSettings::TDstMap ParseDstMap(TStringBuf dsts) { - NTvmAuth::NTvmApi::TClientSettings::TDstMap res; - - while (dsts) { - TStringBuf pair = dsts.NextTok(';'); - TStringBuf alias = pair.NextTok(':'); - res.insert(decltype(res)::value_type( - alias, - IntFromString<TTvmId, 10>(pair))); - } - - return res; - } - - inline NTvmAuth::NTvmApi::TClientSettings::TDstVector ParseDstVector(TStringBuf dsts) { - NTvmAuth::NTvmApi::TClientSettings::TDstVector res; - - while (dsts) { - res.push_back(IntFromString<TTvmId, 10>(dsts.NextTok(';'))); - } - - return res; - } - - bool CheckBbEnvOverriding(EBlackboxEnv original, EBlackboxEnv override) noexcept; - - template <class T> - class TProtectedValue { - class TAssignOp { - public: - static void Assign(T& l, const T& r) { - l = r; - } - - template <typename U> - static void Assign(std::shared_ptr<U>& l, std::shared_ptr<U>& r) { - l.swap(r); - } - - template <typename U> - static void Assign(TIntrusiveConstPtr<U>& l, TIntrusiveConstPtr<U>& r) { - l.Swap(r); - } - }; - - public: - TProtectedValue() = default; - - TProtectedValue(T value) - : Value_(value) - { - } - - T Get() const { - with_lock (Lock_) { - return Value_; - } - } - - void Set(T o) { - with_lock (Lock_) { - TAssignOp::Assign(Value_, o); - } - } - - private: - T Value_; - mutable TAdaptiveLock Lock_; - }; -} diff --git a/library/cpp/tvmauth/client/mocked_updater.cpp b/library/cpp/tvmauth/client/mocked_updater.cpp deleted file mode 100644 index 54f94bc92a2..00000000000 --- a/library/cpp/tvmauth/client/mocked_updater.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "mocked_updater.h" - -#include <library/cpp/tvmauth/unittest.h> - -namespace NTvmAuth { - TMockedUpdater::TSettings TMockedUpdater::TSettings::CreateDeafult() { - TMockedUpdater::TSettings res; - - res.SelfTvmId = 100500; - - res.Backends = { - { - /*.Alias_ = */ "my_dest", - /*.Id_ = */ 42, - /*.Value_ = */ "3:serv:CBAQ__________9_IgYIlJEGECo:O9-vbod_8czkKrpwJAZCI8UgOIhNr2xKPcS-LWALrVC224jga2nIT6vLiw6q3d6pAT60g9K7NB39LEmh7vMuePtUMjzuZuL-uJg17BsH2iTLCZSxDjWxbU9piA2T6u607jiSyiy-FI74pEPqkz7KKJ28aPsefuC1VUweGkYFzNY", - }, - }; - - res.BadBackends = { - { - /*.Alias_ = */ "my_bad_dest", - /*.Id_ = */ 43, - /*.Value_ = */ "Dst is not found", - }, - }; - - return res; - } - - TMockedUpdater::TMockedUpdater(const TSettings& settings) - : Roles_(settings.Roles) - { - SetServiceContext(MakeIntrusiveConst<TServiceContext>(TServiceContext::CheckingFactory( - settings.SelfTvmId, - NUnittest::TVMKNIFE_PUBLIC_KEYS))); - - SetBbEnv(settings.UserTicketEnv); - SetUserContext(NUnittest::TVMKNIFE_PUBLIC_KEYS); - - TServiceTickets::TMapIdStr tickets, errors; - TServiceTickets::TMapAliasId aliases; - - for (const TSettings::TTuple& t : settings.Backends) { - tickets[t.Id] = t.Value; - aliases[t.Alias] = t.Id; - } - for (const TSettings::TTuple& t : settings.BadBackends) { - errors[t.Id] = t.Value; - aliases[t.Alias] = t.Id; - } - - SetServiceTickets(MakeIntrusiveConst<TServiceTickets>( - std::move(tickets), - std::move(errors), - std::move(aliases))); - - SetUpdateTimeOfPublicKeys(TInstant::Now()); - SetUpdateTimeOfServiceTickets(TInstant::Now()); - } -} diff --git a/library/cpp/tvmauth/client/mocked_updater.h b/library/cpp/tvmauth/client/mocked_updater.h deleted file mode 100644 index c9a5daf3cbd..00000000000 --- a/library/cpp/tvmauth/client/mocked_updater.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include "misc/async_updater.h" - -namespace NTvmAuth { - class TMockedUpdater: public TAsyncUpdaterBase { - public: - struct TSettings { - struct TTuple { - TClientSettings::TAlias Alias; - TTvmId Id = 0; - TString Value; // ticket or error - }; - - TTvmId SelfTvmId = 0; - TVector<TTuple> Backends; - TVector<TTuple> BadBackends; - EBlackboxEnv UserTicketEnv = EBlackboxEnv::Test; - NRoles::TRolesPtr Roles; - - static TSettings CreateDeafult(); - }; - - TMockedUpdater(const TSettings& settings = TSettings::CreateDeafult()); - - TClientStatus GetStatus() const override { - return TClientStatus(); - } - - NRoles::TRolesPtr GetRoles() const override { - Y_ENSURE_EX(Roles_, TIllegalUsage() << "Roles are not provided"); - return Roles_; - } - - using TAsyncUpdaterBase::SetServiceContext; - using TAsyncUpdaterBase::SetServiceTickets; - using TAsyncUpdaterBase::SetUpdateTimeOfPublicKeys; - using TAsyncUpdaterBase::SetUpdateTimeOfServiceTickets; - using TAsyncUpdaterBase::SetUserContext; - - protected: - NRoles::TRolesPtr Roles_; - }; -} diff --git a/library/cpp/tvmauth/client/ut/async_updater_ut.cpp b/library/cpp/tvmauth/client/ut/async_updater_ut.cpp deleted file mode 100644 index 1c1e8cbaae5..00000000000 --- a/library/cpp/tvmauth/client/ut/async_updater_ut.cpp +++ /dev/null @@ -1,165 +0,0 @@ -#include "common.h" - -#include <library/cpp/tvmauth/client/misc/async_updater.h> - -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(AsyncUpdater) { - static const TString SRV_TICKET = "3:serv:CBAQ__________9_IgYIexCUkQY:GioCM49Ob6_f80y6FY0XBVN4hLXuMlFeyMvIMiDuQnZkbkLpRpQOuQo5YjWoBjM0Vf-XqOm8B7xtrvxSYHDD7Q4OatN2l-Iwg7i71lE3scUeD36x47st3nd0OThvtjrFx_D8mw_c0GT5KcniZlqq1SjhLyAk1b_zJsx8viRAhCU"; - static const TString PROD_TICKET = "3:user:CAsQ__________9_Gg4KAgh7EHsg0oXYzAQoAA:N8PvrDNLh-5JywinxJntLeQGDEHBUxfzjuvB8-_BEUv1x9CALU7do8irDlDYVeVVDr4AIpR087YPZVzWPAqmnBuRJS0tJXekmDDvrivLnbRrzY4IUXZ_fImB0fJhTyVetKv6RD11bGqnAJeDpIukBwPTbJc_EMvKDt8V490CJFw"; - static const TString TEST_TICKET = "3:user:CA0Q__________9_Gg4KAgh7EHsg0oXYzAQoAQ:FSADps3wNGm92Vyb1E9IVq5M6ZygdGdt1vafWWEhfDDeCLoVA-sJesxMl2pGW4OxJ8J1r_MfpG3ZoBk8rLVMHUFrPa6HheTbeXFAWl8quEniauXvKQe4VyrpA1SPgtRoFqi5upSDIJzEAe1YRJjq1EClQ_slMt8R0kA_JjKUX54"; - static const TString PROD_YATEAM_TICKET = "3:user:CAwQ__________9_Gg4KAgh7EHsg0oXYzAQoAg:M9dEFEWHLHXiL7brCsyfYlm254PE6VeshUjI62u2qMDRzt6-0jAoJTIdDiogerItht1YFYSn8fSqmMf23_rueGj-wkmvyNzbcBSk3jtK2U5sai_W0bK6OwukR9tzWzi1Gcgg9DrNEeIKFvs1EBqYCF4mPHWo5bgk0CR580Cgit4"; - static const TString TEST_YATEAM_TICKET = "3:user:CA4Q__________9_Gg4KAgh7EHsg0oXYzAQoAw:IlaV3htk3jYrviIOz3k3Dfwz7p-bYYpbrgdn53GiUrMGdrT9eobHeuzNvPLrWB0yuYZAD46C3MGxok4GGmHhT73mki4XOCX8yWT4jW_hzcHBik1442tjWwh8IWqV_7q5j5496suVuLWjnZORWbb7I-2iwdIlU1BUiDfhoAolCq8"; - static const TString STRESS_TICKET = "3:user:CA8Q__________9_Gg4KAgh7EHsg0oXYzAQoBA:GBuG_TLo6SL2OYFxp7Zly04HPNzmAF7Fu2E8E9SnwQDoxq9rf7VThSPtTmnBSAl5UVRRPkMsRtzzHZ87qtj6l-PvF0K7PrDu7-yS_xiFTgAl9sEfXAIHJVzZLoksGRgpoBtpBUg9vVaJsPns0kWFKJgq8M-Mk9agrSk7sb2VUeQ"; - - class TTestUpdater: public TAsyncUpdaterBase { - public: - using TAsyncUpdaterBase::SetBbEnv; - using TAsyncUpdaterBase::SetUserContext; - - TClientStatus GetStatus() const override { - return TClientStatus(); - } - }; - - Y_UNIT_TEST(User) { - TTestUpdater u; - - UNIT_ASSERT(!u.GetCachedUserContext()); - - u.SetUserContext(NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT(!u.GetCachedUserContext()); - - UNIT_ASSERT_NO_EXCEPTION(u.SetBbEnv(EBlackboxEnv::Prod)); - UNIT_ASSERT(u.GetCachedUserContext()); - UNIT_ASSERT(u.GetCachedUserContext()->Check(PROD_TICKET)); - UNIT_ASSERT_NO_EXCEPTION(u.GetCachedUserContext(EBlackboxEnv::ProdYateam)); - UNIT_ASSERT(u.GetCachedUserContext(EBlackboxEnv::ProdYateam)->Check(PROD_YATEAM_TICKET)); - - UNIT_ASSERT_EXCEPTION_CONTAINS(u.SetBbEnv(EBlackboxEnv::Prod, EBlackboxEnv::Test), - TBrokenTvmClientSettings, - "Overriding of BlackboxEnv is illegal: Prod -> Test"); - UNIT_ASSERT_EXCEPTION_CONTAINS(u.GetCachedUserContext(EBlackboxEnv::Test), - TBrokenTvmClientSettings, - "Overriding of BlackboxEnv is illegal: Prod -> Test"); - - UNIT_ASSERT(u.GetCachedUserContext()); - UNIT_ASSERT(u.GetCachedUserContext()->Check(PROD_TICKET)); - } - - class DummyUpdater: public TAsyncUpdaterBase { - public: - TClientStatus GetStatus() const override { - return TClientStatus(); - } - - using TAsyncUpdaterBase::SetServiceContext; - using TAsyncUpdaterBase::SetServiceTickets; - using TAsyncUpdaterBase::SetUserContext; - }; - - Y_UNIT_TEST(Cache) { - DummyUpdater d; - - UNIT_ASSERT(!d.GetCachedServiceTickets()); - TServiceTicketsPtr st = MakeIntrusiveConst<TServiceTickets>(TServiceTickets::TMapIdStr(), - TServiceTickets::TMapIdStr(), - TServiceTickets::TMapAliasId()); - d.SetServiceTickets(st); - UNIT_ASSERT_EQUAL(st.Get(), d.GetCachedServiceTickets().Get()); - - UNIT_ASSERT(!d.GetCachedServiceContext()); - TServiceContextPtr sc = MakeIntrusiveConst<TServiceContext>(TServiceContext::SigningFactory("kjndfadfndsfafdasd")); - d.SetServiceContext(sc); - UNIT_ASSERT_EQUAL(sc.Get(), d.GetCachedServiceContext().Get()); - - UNIT_ASSERT(!d.GetCachedUserContext()); - d.SetUserContext(NUnittest::TVMKNIFE_PUBLIC_KEYS); - } - - Y_UNIT_TEST(ServiceTickets_Aliases) { - using TId = TServiceTickets::TMapIdStr; - using TUnfetchedId = TServiceTickets::TIdSet; - using TStr = TServiceTickets::TMapAliasStr; - using TUnfetchedAlias = TServiceTickets::TAliasSet; - using TAls = TServiceTickets::TMapAliasId; - TServiceTickets t(TId{}, TId{}, TAls{}); - - UNIT_ASSERT_NO_EXCEPTION(t = TServiceTickets(TId({{1, "t1"}, {2, "t2"}}), - TId({{3, "e1"}}), - TAls())); - UNIT_ASSERT_EQUAL(TId({{1, "t1"}, {2, "t2"}}), t.TicketsById); - UNIT_ASSERT_EQUAL(TId({{3, "e1"}}), t.ErrorsById); - UNIT_ASSERT_EQUAL(TStr(), t.TicketsByAlias); - UNIT_ASSERT_EQUAL(TStr(), t.ErrorsByAlias); - - UNIT_ASSERT_NO_EXCEPTION(t = TServiceTickets(TId({{1, "t1"}, {2, "t2"}}), - TId({{3, "e1"}}), - TAls({{"1", 1}, {"2", 2}, {"3", 3}}))); - UNIT_ASSERT_EQUAL(TId({{1, "t1"}, {2, "t2"}}), t.TicketsById); - UNIT_ASSERT_EQUAL(TId({{3, "e1"}}), t.ErrorsById); - UNIT_ASSERT_EQUAL(TUnfetchedId(), t.UnfetchedIds); - UNIT_ASSERT_EQUAL(TStr({{"1", "t1"}, {"2", "t2"}}), t.TicketsByAlias); - UNIT_ASSERT_EQUAL(TStr({{"3", "e1"}}), t.ErrorsByAlias); - UNIT_ASSERT_EQUAL(TUnfetchedAlias({}), t.UnfetchedAliases); - } - - Y_UNIT_TEST(ServiceTickets_UnfetchedIds) { - using TId = TServiceTickets::TMapIdStr; - using TUnfetchedId = TServiceTickets::TIdSet; - using TStr = TServiceTickets::TMapAliasStr; - using TUnfetchedAlias = TServiceTickets::TAliasSet; - using TAls = TServiceTickets::TMapAliasId; - TServiceTickets t(TId({{1, "t1"}, {2, "t2"}}), - TId(), - TAls({{"1", 1}, {"2", 2}, {"3", 3}})); - - UNIT_ASSERT_EQUAL(TId({{1, "t1"}, {2, "t2"}}), t.TicketsById); - UNIT_ASSERT_EQUAL(TId({}), t.ErrorsById); - UNIT_ASSERT_EQUAL(TUnfetchedId({3}), t.UnfetchedIds); - UNIT_ASSERT_EQUAL(TUnfetchedAlias({{"3"}}), t.UnfetchedAliases); - UNIT_ASSERT_EQUAL(TStr({{"1", "t1"}, {"2", "t2"}}), t.TicketsByAlias); - UNIT_ASSERT_EQUAL(TStr(), t.ErrorsByAlias); - } - - Y_UNIT_TEST(ServiceTickets_InvalidationTime) { - using TId = TServiceTickets::TMapIdStr; - using TAls = TServiceTickets::TMapAliasId; - - TServiceTickets t(TId{}, TId{}, TAls{}); - UNIT_ASSERT_VALUES_EQUAL(TInstant(), t.InvalidationTime); - - UNIT_ASSERT_NO_EXCEPTION(t = TServiceTickets(TId({{1, SRV_TICKET}}), - TId(), - TAls())); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(std::numeric_limits<time_t>::max()), t.InvalidationTime); - - UNIT_ASSERT_NO_EXCEPTION(t = TServiceTickets(TId({ - {1, SRV_TICKET}, - {2, "serv"}, - }), - TId(), - TAls())); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(std::numeric_limits<time_t>::max()), t.InvalidationTime); - - UNIT_ASSERT_NO_EXCEPTION(t = TServiceTickets(TId({ - {2, "serv"}, - }), - TId(), - TAls())); - UNIT_ASSERT_VALUES_EQUAL(TInstant(), t.InvalidationTime); - - UNIT_ASSERT_NO_EXCEPTION(t = TServiceTickets(TId({ - {1, SRV_TICKET}, - {2, "serv"}, - {3, "3:serv:CBAQeyIECAMQAw:TiZjG2Ut9j-9n0zcqxGW8xiYmnFa-i10-dbA0FKIInKzeDuueovWVEBcgbQHndblzRCxoIBMgbotOf7ALk2xoSBnRbOKomAIEtiTBL77GByL5O8K_HUGNYb-ygqnmZlIuLalgeRQAdsKstgUwQzufnOQyekipmamwo7EVQhr8Ug"}, - }), - TId(), - TAls())); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(123), t.InvalidationTime); - } -} diff --git a/library/cpp/tvmauth/client/ut/checker_ut.cpp b/library/cpp/tvmauth/client/ut/checker_ut.cpp deleted file mode 100644 index 73f2b0dfdae..00000000000 --- a/library/cpp/tvmauth/client/ut/checker_ut.cpp +++ /dev/null @@ -1,189 +0,0 @@ -#include "common.h" - -#include <library/cpp/tvmauth/client/mocked_updater.h> -#include <library/cpp/tvmauth/client/misc/checker.h> -#include <library/cpp/tvmauth/client/misc/getter.h> -#include <library/cpp/tvmauth/client/misc/api/threaded_updater.h> - -#include <library/cpp/tvmauth/type.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(ClientChecker) { - static const TTvmId OK_CLIENT = 100500; - static const TString PROD_TICKET = "3:user:CAsQ__________9_Gg4KAgh7EHsg0oXYzAQoAA:N8PvrDNLh-5JywinxJntLeQGDEHBUxfzjuvB8-_BEUv1x9CALU7do8irDlDYVeVVDr4AIpR087YPZVzWPAqmnBuRJS0tJXekmDDvrivLnbRrzY4IUXZ_fImB0fJhTyVetKv6RD11bGqnAJeDpIukBwPTbJc_EMvKDt8V490CJFw"; - static const TString TEST_TICKET = "3:user:CA0Q__________9_Gg4KAgh7EHsg0oXYzAQoAQ:FSADps3wNGm92Vyb1E9IVq5M6ZygdGdt1vafWWEhfDDeCLoVA-sJesxMl2pGW4OxJ8J1r_MfpG3ZoBk8rLVMHUFrPa6HheTbeXFAWl8quEniauXvKQe4VyrpA1SPgtRoFqi5upSDIJzEAe1YRJjq1EClQ_slMt8R0kA_JjKUX54"; - static const TString PROD_YATEAM_TICKET = "3:user:CAwQ__________9_Gg4KAgh7EHsg0oXYzAQoAg:M9dEFEWHLHXiL7brCsyfYlm254PE6VeshUjI62u2qMDRzt6-0jAoJTIdDiogerItht1YFYSn8fSqmMf23_rueGj-wkmvyNzbcBSk3jtK2U5sai_W0bK6OwukR9tzWzi1Gcgg9DrNEeIKFvs1EBqYCF4mPHWo5bgk0CR580Cgit4"; - static const TString TEST_YATEAM_TICKET = "3:user:CA4Q__________9_Gg4KAgh7EHsg0oXYzAQoAw:IlaV3htk3jYrviIOz3k3Dfwz7p-bYYpbrgdn53GiUrMGdrT9eobHeuzNvPLrWB0yuYZAD46C3MGxok4GGmHhT73mki4XOCX8yWT4jW_hzcHBik1442tjWwh8IWqV_7q5j5496suVuLWjnZORWbb7I-2iwdIlU1BUiDfhoAolCq8"; - static const TString STRESS_TICKET = "3:user:CA8Q__________9_Gg4KAgh7EHsg0oXYzAQoBA:GBuG_TLo6SL2OYFxp7Zly04HPNzmAF7Fu2E8E9SnwQDoxq9rf7VThSPtTmnBSAl5UVRRPkMsRtzzHZ87qtj6l-PvF0K7PrDu7-yS_xiFTgAl9sEfXAIHJVzZLoksGRgpoBtpBUg9vVaJsPns0kWFKJgq8M-Mk9agrSk7sb2VUeQ"; - static const TString SRV_TICKET = "3:serv:CBAQ__________9_IgYIexCUkQY:GioCM49Ob6_f80y6FY0XBVN4hLXuMlFeyMvIMiDuQnZkbkLpRpQOuQo5YjWoBjM0Vf-XqOm8B7xtrvxSYHDD7Q4OatN2l-Iwg7i71lE3scUeD36x47st3nd0OThvtjrFx_D8mw_c0GT5KcniZlqq1SjhLyAk1b_zJsx8viRAhCU"; - - Y_UNIT_TEST(User) { - NTvmApi::TClientSettings s{ - .DiskCacheDir = GetCachePath(), - .SelfTvmId = OK_CLIENT, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus().GetCode()); - UNIT_ASSERT_EXCEPTION(TUserTicketChecker::Check("kek", u->GetCachedUserContext()), TBrokenTvmClientSettings); - } - UNIT_ASSERT_C(l->Stream.Str().find("was successfully fetched") == TString::npos, l->Stream.Str()); - - s.CheckUserTicketsWithBbEnv = EBlackboxEnv::Prod; - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus().GetCode()); - auto c = u->GetCachedUserContext({}); - UNIT_ASSERT(TUserTicketChecker::Check(PROD_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(TEST_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(PROD_YATEAM_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(TEST_YATEAM_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(STRESS_TICKET, c)); - - c = u->GetCachedUserContext(EBlackboxEnv::ProdYateam); - UNIT_ASSERT(!TUserTicketChecker::Check(PROD_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(TEST_TICKET, c)); - UNIT_ASSERT(TUserTicketChecker::Check(PROD_YATEAM_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(TEST_YATEAM_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(STRESS_TICKET, c)); - - UNIT_ASSERT_EXCEPTION(TUserTicketChecker::Check(PROD_TICKET, u->GetCachedUserContext(EBlackboxEnv::Stress)), TBrokenTvmClientSettings); - } - - s.CheckUserTicketsWithBbEnv = EBlackboxEnv::Test; - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus().GetCode()); - auto c = u->GetCachedUserContext(); - - UNIT_ASSERT(!TUserTicketChecker::Check(PROD_TICKET, c)); - UNIT_ASSERT(TUserTicketChecker::Check(TEST_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(PROD_YATEAM_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(TEST_YATEAM_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(STRESS_TICKET, c)); - } - - s.CheckUserTicketsWithBbEnv = EBlackboxEnv::ProdYateam; - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus().GetCode()); - auto c = u->GetCachedUserContext(); - - UNIT_ASSERT(!TUserTicketChecker::Check(PROD_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(TEST_TICKET, c)); - UNIT_ASSERT(TUserTicketChecker::Check(PROD_YATEAM_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(TEST_YATEAM_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(STRESS_TICKET, c)); - } - - s.CheckUserTicketsWithBbEnv = EBlackboxEnv::TestYateam; - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus().GetCode()); - auto c = u->GetCachedUserContext(); - - UNIT_ASSERT(!TUserTicketChecker::Check(PROD_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(TEST_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(PROD_YATEAM_TICKET, c)); - UNIT_ASSERT(TUserTicketChecker::Check(TEST_YATEAM_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(STRESS_TICKET, c)); - } - - s.CheckUserTicketsWithBbEnv = EBlackboxEnv::Stress; - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus().GetCode()); - auto c = u->GetCachedUserContext(); - - UNIT_ASSERT(TUserTicketChecker::Check(PROD_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(TEST_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(PROD_YATEAM_TICKET, c)); - UNIT_ASSERT(!TUserTicketChecker::Check(TEST_YATEAM_TICKET, c)); - UNIT_ASSERT(TUserTicketChecker::Check(STRESS_TICKET, c)); - } - } - - Y_UNIT_TEST(Service) { - NTvmApi::TClientSettings s{ - .DiskCacheDir = GetCachePath(), - .SelfTvmId = OK_CLIENT, - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Stress, - }; - - auto l = MakeIntrusive<TLogger>(); - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus().GetCode()); - UNIT_ASSERT_EXCEPTION(TServiceTicketChecker::Check(SRV_TICKET, u->GetCachedServiceContext()), TBrokenTvmClientSettings); - } - UNIT_ASSERT_C(l->Stream.Str().find("was successfully fetched") == TString::npos, l->Stream.Str()); - - s.CheckServiceTickets = true; - l = MakeIntrusive<TLogger>(); - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus().GetCode()); - auto c = u->GetCachedServiceContext(); - - UNIT_ASSERT(TServiceTicketChecker::Check(SRV_TICKET, c)); - UNIT_ASSERT(!TServiceTicketChecker::Check(PROD_TICKET, c)); - } - UNIT_ASSERT_C(l->Stream.Str().find("was successfully fetched") == TString::npos, l->Stream.Str()); - - s.SelfTvmId = 17; - l = MakeIntrusive<TLogger>(); - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus().GetCode()); - - auto c = u->GetCachedServiceContext(); - - UNIT_ASSERT(!TServiceTicketChecker::Check(SRV_TICKET, c)); - UNIT_ASSERT(!TServiceTicketChecker::Check(PROD_TICKET, c)); - } - UNIT_ASSERT_C(l->Stream.Str().find("was successfully fetched") == TString::npos, l->Stream.Str()); - } - - Y_UNIT_TEST(Tickets) { - NTvmApi::TClientSettings s{ - .DiskCacheDir = GetCachePath(), - .SelfTvmId = OK_CLIENT, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - }; - - auto l = MakeIntrusive<TLogger>(); - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus().GetCode()); - auto c = u->GetCachedServiceTickets(); - UNIT_ASSERT_VALUES_EQUAL("3:serv:CBAQ__________9_IgYIKhCUkQY:CX", TServiceTicketGetter::GetTicket("blackbox", c)); - UNIT_ASSERT_EXCEPTION_CONTAINS(TServiceTicketGetter::GetTicket("blackbox2", c), - TBrokenTvmClientSettings, - "Destination 'blackbox2' was not specified in settings. Check your settings (if you use Qloud/YP/tvmtool - check it's settings)"); - } - UNIT_ASSERT_C(l->Stream.Str().find("was successfully fetched") == TString::npos, l->Stream.Str()); - } - - Y_UNIT_TEST(ErrorForDst) { - TAsyncUpdaterPtr u = new TMockedUpdater(); - auto c = u->GetCachedServiceTickets(); - - UNIT_ASSERT_VALUES_EQUAL(TMockedUpdater::TSettings::CreateDeafult().Backends.at(0).Value, - TServiceTicketGetter::GetTicket("my_dest", c)); - UNIT_ASSERT_VALUES_EQUAL(TMockedUpdater::TSettings::CreateDeafult().Backends.at(0).Value, - TServiceTicketGetter::GetTicket(42, c)); - UNIT_ASSERT_EXCEPTION_CONTAINS(TServiceTicketGetter::GetTicket("my_bad_dest", c), - TMissingServiceTicket, - "Failed to get ticket for 'my_bad_dest': Dst is not found"); - UNIT_ASSERT_EXCEPTION_CONTAINS(TServiceTicketGetter::GetTicket(43, c), - TMissingServiceTicket, - "Failed to get ticket for '43': Dst is not found"); - } -} diff --git a/library/cpp/tvmauth/client/ut/client_status_ut.cpp b/library/cpp/tvmauth/client/ut/client_status_ut.cpp deleted file mode 100644 index a1c3ae74cea..00000000000 --- a/library/cpp/tvmauth/client/ut/client_status_ut.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include <library/cpp/tvmauth/client/client_status.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(ClientStatus) { - Y_UNIT_TEST(Common) { - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, TClientStatus().GetCode()); - UNIT_ASSERT_VALUES_EQUAL("", TClientStatus().GetLastError()); - - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Warning, TClientStatus(TClientStatus::Warning, "kek")); - UNIT_ASSERT_VALUES_EQUAL("kek", - TClientStatus(TClientStatus::Warning, "kek").GetLastError()); - UNIT_ASSERT_VALUES_EQUAL("2;TvmClient: kek\n", - TClientStatus(TClientStatus::Error, "kek").CreateJugglerMessage()); - } -} diff --git a/library/cpp/tvmauth/client/ut/common.h b/library/cpp/tvmauth/client/ut/common.h deleted file mode 100644 index 0aee09aefc6..00000000000 --- a/library/cpp/tvmauth/client/ut/common.h +++ /dev/null @@ -1,240 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/client/logger.h> -#include <library/cpp/tvmauth/client/misc/disk_cache.h> -#include <library/cpp/tvmauth/client/misc/roles/entities_index.h> - -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/cgiparam/cgiparam.h> -#include <library/cpp/testing/mock_server/server.h> -#include <library/cpp/testing/unittest/env.h> -#include <library/cpp/testing/unittest/tests_data.h> - -#include <util/stream/str.h> -#include <util/system/fs.h> - -class TLogger: public NTvmAuth::ILogger { -public: - void Log(int lvl, const TString& msg) override { - Cout << TInstant::Now() << " lvl=" << lvl << " msg: " << msg << "\n"; - Stream << lvl << ": " << msg << Endl; - } - - TStringStream Stream; -}; - -static inline TString GetFilePath(const char* name) { - return ArcadiaSourceRoot() + "/library/cpp/tvmauth/client/ut/files/" + name; -} - -static inline TString GetCachePath(const TString& dir = {}) { - if (dir) { - Y_ENSURE(NFs::MakeDirectoryRecursive("./" + dir)); - } - - auto wr = [](const TString& p, const TStringBuf body) { - NTvmAuth::TDiskWriter w(p); - Y_ENSURE(w.Write(body, TInstant::ParseIso8601("2050-01-01T00:00:00.000000Z"))); - }; - wr("./" + dir + "/public_keys", NTvmAuth::NUnittest::TVMKNIFE_PUBLIC_KEYS); - wr("./" + dir + "/service_tickets", - R"({ - "19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}, - "213" : { "ticket" : "service_ticket_2"}, - "234" : { "error" : "Dst is not found" }, - "185" : { "ticket" : "service_ticket_3"} -} 100500)"); - - return "./" + dir; -} - -static const TString AUTH_TOKEN = "strong_token"; -static const TString META = R"( -{ -"bb_env" : "ProdYaTeam", -"tenants" : [ - { - "self": { - "alias" : "me", - "client_id": 100500 - }, - "dsts" : [ - { - "alias" : "bbox", - "client_id": 242 - }, - { - "alias" : "pass_likers", - "client_id": 11 - } - ] - }, - { - "self": { - "alias" : "tenant_with_roles", - "client_id": 100500 - }, - "idm_slug": "some_slug", - "dsts" : [] - }, - { - "self": { - "alias" : "push-client", - "client_id": 100501 - }, - "dsts" : [ - { - "alias" : "pass_likers", - "client_id": 100502 - } - ] - }, - { - "self": { - "alias" : "multi_names_for_dst", - "client_id": 100599 - }, - "dsts" : [ - { - "alias" : "pass_likers", - "client_id": 100502 - }, - { - "alias" : "pass_haters", - "client_id": 100502 - } - ] - }, - { - "self": { - "alias" : "something_else", - "client_id": 100503 - }, - "dsts" : [ - ] - } -] -})"; - -static const TString TICKETS_ME = - R"({ - "pass_likers": { - "ticket": "3:serv:CBAQ__________9_IgYIlJEGEAs:T-apeMNWFc_vHPQ3iLaZv9NjG-hf5-i23O4AhRu1M68ryN3FU5qvyqTSSiPbtJdFP6EE41QQBzEs59dHn9DRkqQNwwKf1is00Oewwj2XKO0uHukuzd9XxZnro7MfjPswsjWufxX28rmJtlfSXwAtyKt8TI5yKJnMeBPQ0m5R3k8", - "tvm_id": 11 - }, - "bbox": { - "ticket": "3:serv:CBAQ__________9_IgcIlJEGEPIB:N7luw0_rVmBosTTI130jwDbQd0-cMmqJeEl0ma4ZlIo_mHXjBzpOuMQ3A9YagbmOBOt8TZ_gzGvVSegWZkEeB24gM22acw0w-RcHaQKrzSOA5Zq8WLNIC8QUa4_WGTlAsb7R7eC4KTAGgouIquNAgMBdTuGOuZHnMLvZyLnOMKc", - "tvm_id": 242 - } - })"; - -static const TString SERVICE_TICKET_PC = "3:serv:CBAQ__________9_IggIlpEGEJaRBg:BAxaQJCdK4eFuJ6i_egqPwvJgWtlh0enDQRPr84Nx2phZ_8QtxKAUCwEa7KOU_jVvIBQIC5-ETTl2vjBt7UyygF8frdK4ab6zJoWj4n07np6vbmWd385l8KvzztLt4QkBrPiE7U46dK3pL0U8tfBkSXE8rvUIsl3RvvgSNH2J3c"; -static const TString TICKETS_PC = - R"({ - "pass_likers": { - "ticket": "3:serv:CBAQ__________9_IggIlpEGEJaRBg:BAxaQJCdK4eFuJ6i_egqPwvJgWtlh0enDQRPr84Nx2phZ_8QtxKAUCwEa7KOU_jVvIBQIC5-ETTl2vjBt7UyygF8frdK4ab6zJoWj4n07np6vbmWd385l8KvzztLt4QkBrPiE7U46dK3pL0U8tfBkSXE8rvUIsl3RvvgSNH2J3c", - "tvm_id": 100502 - } - })"; - -static const TString TICKETS_MANY_DSTS = - R"({ - "pass_likers": { - "ticket": "3:serv:CBAQ__________9_IggI95EGEJaRBg:D0MOLDhKQyI-OhC0ON9gYukz2hOctUipu1yXsvkw6NRuLhcBfvGayyUqF4ILrqepjz9GtPWIR_wO6oLSW35Z0YaFn60QWp5tG6IcAnr80lm_OnLHJt4kmEoLtGg1V0aWBT0YyouzGB2-QFNOVO86G7sYzU8FC6-V3Iyc4X7XTNc", - "tvm_id": 100502 - }, - "who_are_you??": { - "ticket": "kek", - "tvm_id": 100503 - }, - "pass_haters": { - "ticket": "3:serv:CBAQ__________9_IggI95EGEJaRBg:D0MOLDhKQyI-OhC0ON9gYukz2hOctUipu1yXsvkw6NRuLhcBfvGayyUqF4ILrqepjz9GtPWIR_wO6oLSW35Z0YaFn60QWp5tG6IcAnr80lm_OnLHJt4kmEoLtGg1V0aWBT0YyouzGB2-QFNOVO86G7sYzU8FC6-V3Iyc4X7XTNc", - "tvm_id": 100502 - } - })"; - -static const TString TICKETS_SE = R"({})"; - -static const TInstant BIRTHTIME = TInstant::Seconds(14380887840); -class TTvmTool: public TRequestReplier { -public: - TString Meta; - HttpCodes Code; - TInstant Birthtime; - - TTvmTool() - : Meta(META) - , Code(HTTP_OK) - , Birthtime(BIRTHTIME) - { - } - - bool DoReply(const TReplyParams& params) override { - const TParsedHttpFull http(params.Input.FirstLine()); - if (http.Path == "/tvm/ping") { - THttpResponse resp(HTTP_OK); - resp.SetContent("OK"); - resp.OutTo(params.Output); - return true; - } - - auto it = std::find_if(params.Input.Headers().begin(), - params.Input.Headers().end(), - [](const THttpInputHeader& h) { return h.Name() == "Authorization"; }); - if (it == params.Input.Headers().end() || it->Value() != AUTH_TOKEN) { - THttpResponse resp(HTTP_UNAUTHORIZED); - resp.SetContent("pong"); - resp.OutTo(params.Output); - return true; - } - - THttpResponse resp(Code); - if (http.Path == "/tvm/keys") { - resp.SetContent(NTvmAuth::NUnittest::TVMKNIFE_PUBLIC_KEYS); - } else if (http.Path == "/tvm/tickets") { - TCgiParameters cg; - cg.ScanAddAll(http.Cgi); - if (cg.Get("src") == "100500") { - resp.SetContent(TICKETS_ME); - } else if (cg.Get("src") == "100501") { - resp.SetContent(TICKETS_PC); - } else if (cg.Get("src") == "100599") { - resp.SetContent(TICKETS_MANY_DSTS); - } - } else if (http.Path == "/tvm/private_api/__meta__") { - resp.SetContent(Meta); - } - resp.AddHeader("X-Ya-Tvmtool-Data-Birthtime", IntToString<10>(Birthtime.Seconds())); - resp.OutTo(params.Output); - - return true; - } -}; - -static inline NTvmAuth::NRoles::TEntitiesIndex CreateEntitiesIndex() { - using namespace NTvmAuth::NRoles; - - TEntitiesIndex index( - { - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#11"}, - }), - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#22"}, - {"key#3", "value#33"}, - }), - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#23"}, - {"key#3", "value#33"}, - }), - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#13"}, - {"key#3", "value#33"}, - }), - }); - - return index; -} diff --git a/library/cpp/tvmauth/client/ut/default_uid_checker_ut.cpp b/library/cpp/tvmauth/client/ut/default_uid_checker_ut.cpp deleted file mode 100644 index 8c48c495c4b..00000000000 --- a/library/cpp/tvmauth/client/ut/default_uid_checker_ut.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "common.h" - -#include <library/cpp/tvmauth/client/mocked_updater.h> -#include <library/cpp/tvmauth/client/misc/default_uid_checker.h> -#include <library/cpp/tvmauth/client/misc/api/threaded_updater.h> - -#include <library/cpp/tvmauth/type.h> -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(DefaultUidChecker) { - Y_UNIT_TEST(Check) { - NRoles::TRolesPtr roles = std::make_shared<NRoles::TRoles>( - NRoles::TRoles::TMeta{}, - NRoles::TRoles::TTvmConsumers{}, - NRoles::TRoles::TUserConsumers{ - {12345, std::make_shared<NRoles::TConsumerRoles>( - THashMap<TString, NRoles::TEntitiesPtr>())}, - }, - std::make_shared<TString>()); - - TAsyncUpdaterPtr u = new TMockedUpdater({.Roles = roles}); - auto r = u->GetRoles(); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDefaultUidChecker::Check(NUnittest::CreateUserTicket(ETicketStatus::Expired, 12345, {}), r), - TIllegalUsage, - "User ticket must be valid"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDefaultUidChecker::Check(NUnittest::CreateUserTicket(ETicketStatus::Ok, 12345, {}, {}, EBlackboxEnv::Test), r), - TIllegalUsage, - "User ticket must be from ProdYateam, got from Test"); - - TCheckedUserTicket ticket; - UNIT_ASSERT_NO_EXCEPTION( - ticket = TDefaultUidChecker::Check(NUnittest::CreateUserTicket(ETicketStatus::Ok, 12345, {}, {}, EBlackboxEnv::ProdYateam), r)); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, ticket.GetStatus()); - - UNIT_ASSERT_NO_EXCEPTION( - ticket = TDefaultUidChecker::Check(NUnittest::CreateUserTicket(ETicketStatus::Ok, 9999, {}, {}, EBlackboxEnv::ProdYateam), r)); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::NoRoles, ticket.GetStatus()); - } -} diff --git a/library/cpp/tvmauth/client/ut/disk_cache_ut.cpp b/library/cpp/tvmauth/client/ut/disk_cache_ut.cpp deleted file mode 100644 index 7dd851c9b30..00000000000 --- a/library/cpp/tvmauth/client/ut/disk_cache_ut.cpp +++ /dev/null @@ -1,204 +0,0 @@ -#include "common.h" - -#include <library/cpp/tvmauth/client/logger.h> -#include <library/cpp/tvmauth/client/misc/disk_cache.h> - -#include <library/cpp/tvmauth/src/utils.h> - -#include <library/cpp/testing/unittest/registar.h> -#include <library/cpp/testing/unittest/tests_data.h> - -#include <util/stream/file.h> -#include <util/system/fs.h> -#include <util/system/sysstat.h> - -#include <thread> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(ClientDisk) { - Y_UNIT_TEST(Hash) { - TString hash = TDiskReader::GetHash("asd"); - UNIT_ASSERT(hash); - UNIT_ASSERT_VALUES_EQUAL(32, hash.size()); - UNIT_ASSERT_VALUES_EQUAL("Zj5_qYg31bPlqjBW76z8IV0rCsHmv-iN-McV6ybS1-g", NUtils::Bin2base64url(hash)); - } - - Y_UNIT_TEST(Timestamp) { - time_t t = 100500; - - TString s = TDiskWriter::WriteTimestamp(t); - UNIT_ASSERT_VALUES_EQUAL("lIgBAAAAAAA", NUtils::Bin2base64url(s)); - UNIT_ASSERT_VALUES_EQUAL(t, TDiskReader::GetTimestamp(s)); - - t = 123123123213089; - s = TDiskWriter::WriteTimestamp(t); - UNIT_ASSERT_VALUES_EQUAL("IdMF1vpvAAA", NUtils::Bin2base64url(s)); - UNIT_ASSERT_VALUES_EQUAL(t, TDiskReader::GetTimestamp(s)); - - t = time(nullptr); - s = TDiskWriter::WriteTimestamp(t); - UNIT_ASSERT_VALUES_EQUAL(t, TDiskReader::GetTimestamp(s)); - } - - const TInstant TIME = TInstant::Seconds(100500); - const TString DATA = "oiweuhn \n vw3ut hweoi uhgewproritjhwequtherwoiughfdsv 8ty34q01u 34 1=3"; - - Y_UNIT_TEST(ParseData_Ok) { - TLogger l; - - const TInstant time = TInstant::Seconds(1523446554789); - - TString toFile = TDiskWriter::PrepareData(time, DATA); - UNIT_ASSERT_VALUES_EQUAL(113, toFile.size()); - UNIT_ASSERT_VALUES_EQUAL("T8BnRIMoC6mlMXexPg9cV5jYxeFtgDWk97JTajHDunCloH20YgEAAG9pd2V1aG4gCiB2dzN1dCBod2VvaSB1aGdld3Byb3JpdGpod2VxdXRoZXJ3b2l1Z2hmZHN2IDh0eTM0cTAxdSAgIDM0ICAxPTM", - NUtils::Bin2base64url(toFile)); - - TDiskReader r("qwerty", &l); - UNIT_ASSERT(r.ParseData(toFile)); - UNIT_ASSERT_VALUES_EQUAL(DATA, r.Data()); - UNIT_ASSERT_VALUES_EQUAL(time, r.Time()); - UNIT_ASSERT_VALUES_EQUAL("6: File 'qwerty' was successfully read\n", - l.Stream.Str()); - } - - Y_UNIT_TEST(ParseData_SmallFile) { - TLogger l; - - TString toFile = TDiskWriter::PrepareData(TIME, DATA); - TDiskReader r("qwerty", &l); - UNIT_ASSERT(!r.ParseData(toFile.substr(0, 17))); - UNIT_ASSERT_VALUES_EQUAL("4: File 'qwerty' is too small\n", - l.Stream.Str()); - } - - Y_UNIT_TEST(ParseData_Changed) { - TLogger l; - - TString toFile = TDiskWriter::PrepareData(TIME, DATA); - toFile[17] = toFile[17] + 1; - TDiskReader r("qwerty", &l); - UNIT_ASSERT(!r.ParseData(toFile)); - UNIT_ASSERT_VALUES_EQUAL("4: Content of 'qwerty' was incorrectly changed\n", - l.Stream.Str()); - } - - Y_UNIT_TEST(Read_Ok) { - TLogger l; - - TDiskReader r(GetFilePath("ok.cache"), &l); - UNIT_ASSERT(r.Read()); - UNIT_ASSERT_VALUES_EQUAL(DATA, r.Data()); - UNIT_ASSERT_VALUES_EQUAL(TIME, r.Time()); - UNIT_ASSERT_C(l.Stream.Str().find("was successfully read") != TString::npos, l.Stream.Str()); - } - - Y_UNIT_TEST(Read_NoFile) { - TLogger l; - - TDiskReader r("missing", &l); - UNIT_ASSERT(!r.Read()); - UNIT_ASSERT_VALUES_EQUAL("7: File 'missing' does not exist\n", - l.Stream.Str()); - } - -#ifdef _unix_ - Y_UNIT_TEST(Read_NoPermitions) { - TLogger l; - - const TString path = GetWorkPath() + "/123"; - { - TFileOutput output(path); - } - Chmod(path.data(), S_IWUSR); - - TDiskReader r(path, &l); - UNIT_ASSERT(!r.Read()); - UNIT_ASSERT_C(l.Stream.Str().find("Permission denied") != TString::npos, l.Stream.Str()); - - Chmod(path.data(), S_IRWXU); - NFs::Remove(path); - } -#endif - - Y_UNIT_TEST(Write_Ok) { - TLogger l; - - const TString path = "./tmp_file"; - TDiskWriter w(path, &l); - UNIT_ASSERT_C(w.Write(DATA), l.Stream.Str()); - UNIT_ASSERT_C(l.Stream.Str().find("was successfully written") != TString::npos, l.Stream.Str()); - l.Stream.Clear(); - - TDiskReader r(path, &l); - UNIT_ASSERT_C(r.Read(), l.Stream.Str()); - UNIT_ASSERT_VALUES_EQUAL(DATA, r.Data()); - UNIT_ASSERT(TInstant::Now() - r.Time() < TDuration::Minutes(5)); - UNIT_ASSERT_C(l.Stream.Str().find("was successfully read") != TString::npos, l.Stream.Str()); - - NFs::Remove(path); - } - - Y_UNIT_TEST(Write_NoPermitions) { - TLogger l; - - TDiskWriter w("/some_file", &l); - UNIT_ASSERT(!w.Write(DATA)); - UNIT_ASSERT_C(l.Stream.Str().Contains("3: Failed to write '/some_file': ("), l.Stream.Str()); - UNIT_ASSERT_C(l.Stream.Str().Contains("denied"), l.Stream.Str()); - } - - Y_UNIT_TEST(race) { - const TString path = "./tmp_file"; - const TString data = "ejufhsadkjfvbhsaoicnaofssdahfasdfhasdofdsaf"; - NFs::Remove(path); - - std::atomic<bool> fail = false; - std::vector<std::thread> thrs; - for (size_t idx = 0; idx < 16; ++idx) { - thrs.push_back(std::thread([&fail, data, path]() { - TDiskWriter w(path); - for (size_t k = 0; k < 1000; ++k) { - if (!w.Write(data)) { - fail = true; - } - } - })); - } - for (std::thread& t : thrs) { - t.join(); - } - thrs.clear(); - UNIT_ASSERT(fail); - { - TDiskWriter w(path); - UNIT_ASSERT(w.Write(data)); // checks unlocked flock - } - - fail = false; - - for (size_t idx = 0; idx < 4; ++idx) { - thrs.push_back(std::thread([&fail, data, path]() { - TLogger l; - TDiskReader r(path, &l); - for (size_t k = 0; k < 100; ++k) { - if (!r.Read()) { - Cerr << l.Stream.Str() << Flush; - fail = true; - return; - } - if (r.Data() != data) { - Cerr << (TStringBuilder() << "'" << data << "' vs '" << r.Data() << "'" << Endl) << Flush; - fail = true; - return; - } - } - })); - } - for (std::thread& t : thrs) { - t.join(); - } - thrs.clear(); - UNIT_ASSERT(!fail); - } -} diff --git a/library/cpp/tvmauth/client/ut/exponential_backoff_ut.cpp b/library/cpp/tvmauth/client/ut/exponential_backoff_ut.cpp deleted file mode 100644 index 3dcbe6ad495..00000000000 --- a/library/cpp/tvmauth/client/ut/exponential_backoff_ut.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include <library/cpp/tvmauth/client/misc/exponential_backoff.h> - -#include <library/cpp/testing/unittest/registar.h> - -#include <thread> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(PasspUtilsExpBackoff) { - Y_UNIT_TEST(common) { - TExponentialBackoff b({TDuration::Seconds(1), TDuration::Seconds(60), 2, 0.01}); - - UNIT_ASSERT_VALUES_EQUAL(TDuration::Seconds(1), b.GetCurrentValue()); - - TDuration dur = b.GetCurrentValue(); - for (size_t idx = 0; idx < 6; ++idx) { - TDuration newValue = b.Increase(); - UNIT_ASSERT_LT(dur, newValue); - dur = newValue; - } - - UNIT_ASSERT_LT(TDuration::Seconds(60) - TDuration::Seconds(3), dur); - UNIT_ASSERT_LT(dur, TDuration::Seconds(60) + TDuration::Seconds(3)); - } - - Y_UNIT_TEST(sleep) { - TExponentialBackoff b({TDuration::Seconds(60), TDuration::Seconds(600), 2, 0.01}); - - const TInstant start = TInstant::Now(); - - TAutoEvent started; - std::thread t([&b, &started]() { - started.Signal(); - b.Sleep(); - }); - - started.WaitT(TDuration::Seconds(30)); - b.Interrupt(); - t.join(); - TDuration dur = TInstant::Now() - start; - - UNIT_ASSERT_LT(dur, TDuration::Seconds(60)); - } -} diff --git a/library/cpp/tvmauth/client/ut/facade_ut.cpp b/library/cpp/tvmauth/client/ut/facade_ut.cpp deleted file mode 100644 index 0a3013eceaa..00000000000 --- a/library/cpp/tvmauth/client/ut/facade_ut.cpp +++ /dev/null @@ -1,205 +0,0 @@ -#include "common.h" - -#include <library/cpp/tvmauth/client/facade.h> -#include <library/cpp/tvmauth/client/mocked_updater.h> - -#include <library/cpp/testing/unittest/registar.h> - -#include <util/generic/vector.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(ClientFacade) { - static const TTvmId OK_CLIENT = 100500; - static const TString SRV_TICKET_123 = "3:serv:CBAQ__________9_IgYIexCUkQY:GioCM49Ob6_f80y6FY0XBVN4hLXuMlFeyMvIMiDuQnZkbkLpRpQOuQo5YjWoBjM0Vf-XqOm8B7xtrvxSYHDD7Q4OatN2l-Iwg7i71lE3scUeD36x47st3nd0OThvtjrFx_D8mw_c0GT5KcniZlqq1SjhLyAk1b_zJsx8viRAhCU"; - static const TString SRV_TICKET_456 = "3:serv:CBAQ__________9_IgcIyAMQlJEG:VrnqRhpoiDnJeAQbySJluJ1moQ5Kemic99iWzOrHLGfuh7iTw_xMT7KewRAmZMUwDKzE6otj7V86Xsnxbv5xZl8746wbvNcyUXu-nGWmbByZjO7xpSIcY07sISqEhP9n9C_yMSvqDP7ho_PRIfpGCDMXxKlFZ_BhBLLp0kHEvw4"; - static const TString PROD_TICKET = "3:user:CAsQ__________9_Gg4KAgh7EHsg0oXYzAQoAA:N8PvrDNLh-5JywinxJntLeQGDEHBUxfzjuvB8-_BEUv1x9CALU7do8irDlDYVeVVDr4AIpR087YPZVzWPAqmnBuRJS0tJXekmDDvrivLnbRrzY4IUXZ_fImB0fJhTyVetKv6RD11bGqnAJeDpIukBwPTbJc_EMvKDt8V490CJFw"; - static const TString TEST_TICKET = "3:user:CA0Q__________9_Gg4KAgh7EHsg0oXYzAQoAQ:FSADps3wNGm92Vyb1E9IVq5M6ZygdGdt1vafWWEhfDDeCLoVA-sJesxMl2pGW4OxJ8J1r_MfpG3ZoBk8rLVMHUFrPa6HheTbeXFAWl8quEniauXvKQe4VyrpA1SPgtRoFqi5upSDIJzEAe1YRJjq1EClQ_slMt8R0kA_JjKUX54"; - - TTvmClient GetClient(const NTvmApi::TClientSettings& s) { - auto l = MakeIntrusive<TLogger>(); - TTvmClient f(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, f.GetStatus()); - Sleep(TDuration::MilliSeconds(300)); - TString logs = l->Stream.Str(); - UNIT_ASSERT_C(logs.find("was successfully read") != TString::npos, logs); - UNIT_ASSERT_C(logs.find("was successfully fetched") == TString::npos, logs); - return f; - } - - Y_UNIT_TEST(Service) { - NTvmApi::TClientSettings s{ - .DiskCacheDir = GetCachePath(), - .SelfTvmId = OK_CLIENT, - .CheckServiceTickets = true, - }; - TTvmClient f = GetClient(s); - - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(2524608000), f.GetUpdateTimeOfPublicKeys()); - UNIT_ASSERT_VALUES_EQUAL(TInstant(), f.GetUpdateTimeOfServiceTickets()); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(2525126400), f.GetInvalidationTimeOfPublicKeys()); - UNIT_ASSERT_VALUES_EQUAL(TInstant(), f.GetInvalidationTimeOfServiceTickets()); - - UNIT_ASSERT(f.CheckServiceTicket(SRV_TICKET_123)); - UNIT_ASSERT_EXCEPTION(f.CheckUserTicket(PROD_TICKET), yexception); - UNIT_ASSERT_EXCEPTION(f.CheckUserTicket(TEST_TICKET), yexception); - } - - Y_UNIT_TEST(User) { - NTvmApi::TClientSettings s{ - .DiskCacheDir = GetCachePath(), - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Prod, - }; - - TTvmClient f = GetClient(s); - UNIT_ASSERT_EXCEPTION(f.CheckServiceTicket(SRV_TICKET_123), yexception); - UNIT_ASSERT(f.CheckUserTicket(PROD_TICKET)); - UNIT_ASSERT(!f.CheckUserTicket(TEST_TICKET)); - } - - Y_UNIT_TEST(Ctors) { - NTvmApi::TClientSettings s{ - .DiskCacheDir = GetCachePath(), - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Prod, - }; - - TTvmClient f = GetClient(s); - f = GetClient(s); - - TVector<TTvmClient> v; - v.push_back(std::move(f)); - v.front() = std::move(*v.begin()); - } - - Y_UNIT_TEST(Tickets) { - NTvmApi::TClientSettings s{ - .DiskCacheDir = GetCachePath(), - .SelfTvmId = OK_CLIENT, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - }; - TTvmClient f = GetClient(s); - - UNIT_ASSERT_VALUES_EQUAL(TInstant(), f.GetUpdateTimeOfPublicKeys()); - UNIT_ASSERT_VALUES_EQUAL(TInstant::ParseIso8601("2050-01-01T00:00:00.000000Z"), f.GetUpdateTimeOfServiceTickets()); - UNIT_ASSERT_VALUES_EQUAL(TInstant(), f.GetInvalidationTimeOfPublicKeys()); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(std::numeric_limits<size_t>::max()), f.GetInvalidationTimeOfServiceTickets()); - - UNIT_ASSERT_VALUES_EQUAL("3:serv:CBAQ__________9_IgYIKhCUkQY:CX", f.GetServiceTicketFor("blackbox")); - UNIT_ASSERT_VALUES_EQUAL("3:serv:CBAQ__________9_IgYIKhCUkQY:CX", f.GetServiceTicketFor(19)); - UNIT_ASSERT_EXCEPTION_CONTAINS(f.GetServiceTicketFor("blackbox2"), - TBrokenTvmClientSettings, - "Destination 'blackbox2' was not specified in settings. Check your settings (if you use Qloud/YP/tvmtool - check it's settings)"); - UNIT_ASSERT_EXCEPTION_CONTAINS(f.GetServiceTicketFor(20), - TBrokenTvmClientSettings, - "Destination '20' was not specified in settings. Check your settings (if you use Qloud/YP/tvmtool - check it's settings)"); - } - - Y_UNIT_TEST(Tool) { - TPortManager pm; - ui16 port = pm.GetPort(80); - NMock::TMockServer server(port, []() { return new TTvmTool; }); - - NTvmTool::TClientSettings s("push-client"); - s.SetPort(port); - s.SetAuthToken(AUTH_TOKEN); - auto l = MakeIntrusive<TLogger>(); - { - TTvmClient f(s, l); - - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(14380887840), f.GetUpdateTimeOfPublicKeys()); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(14380887840), f.GetUpdateTimeOfServiceTickets()); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(14381406240), f.GetInvalidationTimeOfPublicKeys()); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(std::numeric_limits<time_t>::max()), f.GetInvalidationTimeOfServiceTickets()); - - UNIT_ASSERT_VALUES_EQUAL(SERVICE_TICKET_PC, f.GetServiceTicketFor("pass_likers")); - UNIT_ASSERT_VALUES_EQUAL(SERVICE_TICKET_PC, f.GetServiceTicketFor(100502)); - UNIT_ASSERT_EXCEPTION_CONTAINS(f.GetServiceTicketFor("blackbox"), - TBrokenTvmClientSettings, - "Destination 'blackbox' was not specified in settings. Check your settings (if you use Qloud/YP/tvmtool - check it's settings)"); - UNIT_ASSERT_EXCEPTION_CONTAINS(f.GetServiceTicketFor(242), - TBrokenTvmClientSettings, - "Destination '242' was not specified in settings. Check your settings (if you use Qloud/YP/tvmtool - check it's settings)"); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n" - << "6: Meta: self_tvm_id=100501, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[(pass_likers:100502)]\n" - << "7: Tickets fetched from tvmtool: 2425-09-17T11:04:00.000000Z\n" - << "7: Public keys fetched from tvmtool: 2425-09-17T11:04:00.000000Z\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(CheckRoles) { - { // roles not configured - TTvmClient f(new TMockedUpdater(TMockedUpdater::TSettings{ - .SelfTvmId = OK_CLIENT, - })); - - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, - f.CheckServiceTicket(SRV_TICKET_123).GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, - f.CheckServiceTicket(SRV_TICKET_456).GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Malformed, - f.CheckServiceTicket("asdfg").GetStatus()); - } - - { // roles configured - NRoles::TRolesPtr roles = std::make_shared<NRoles::TRoles>( - NRoles::TRoles::TMeta{}, - NRoles::TRoles::TTvmConsumers{ - {123, std::make_shared<NRoles::TConsumerRoles>( - THashMap<TString, NRoles::TEntitiesPtr>())}, - }, - NRoles::TRoles::TUserConsumers{}, - std::make_shared<TString>()); - TTvmClient f(new TMockedUpdater(TMockedUpdater::TSettings{ - .SelfTvmId = OK_CLIENT, - .Roles = roles, - })); - - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, - f.CheckServiceTicket(SRV_TICKET_123).GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::NoRoles, - f.CheckServiceTicket(SRV_TICKET_456).GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Malformed, - f.CheckServiceTicket("asdfg").GetStatus()); - } - } - - Y_UNIT_TEST(CheckDst) { - { - TTvmClient f(new TMockedUpdater(TMockedUpdater::TSettings{ - .SelfTvmId = OK_CLIENT, - })); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, f.CheckServiceTicket(SRV_TICKET_123).GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, f.CheckServiceTicket(SRV_TICKET_456).GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Malformed, f.CheckServiceTicket("asdfg").GetStatus()); - } - TTvmId NOT_OK_CLIENT = 3333; - { - TTvmClient f(new TMockedUpdater(TMockedUpdater::TSettings{ - .SelfTvmId = NOT_OK_CLIENT, - })); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::InvalidDst, f.CheckServiceTicket(SRV_TICKET_123).GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::InvalidDst, f.CheckServiceTicket(SRV_TICKET_456).GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Malformed, f.CheckServiceTicket("asdfg").GetStatus()); - } - { - TServiceContext::TCheckFlags checkFlags; - checkFlags.NeedDstCheck = false; - TTvmClient f( - new TMockedUpdater( - TMockedUpdater::TSettings{ - .SelfTvmId = NOT_OK_CLIENT}), - checkFlags); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, f.CheckServiceTicket(SRV_TICKET_123).GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, f.CheckServiceTicket(SRV_TICKET_456).GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Malformed, f.CheckServiceTicket("asdfg").GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(f.CheckServiceTicket(SRV_TICKET_123).GetDst(), OK_CLIENT); - } - } -} diff --git a/library/cpp/tvmauth/client/ut/files/ok.cache b/library/cpp/tvmauth/client/ut/files/ok.cache Binary files differdeleted file mode 100644 index 768d4953d15..00000000000 --- a/library/cpp/tvmauth/client/ut/files/ok.cache +++ /dev/null diff --git a/library/cpp/tvmauth/client/ut/files/public_keys b/library/cpp/tvmauth/client/ut/files/public_keys Binary files differdeleted file mode 100644 index fa683d18f3b..00000000000 --- a/library/cpp/tvmauth/client/ut/files/public_keys +++ /dev/null diff --git a/library/cpp/tvmauth/client/ut/files/roles b/library/cpp/tvmauth/client/ut/files/roles Binary files differdeleted file mode 100644 index 36864ae50a5..00000000000 --- a/library/cpp/tvmauth/client/ut/files/roles +++ /dev/null diff --git a/library/cpp/tvmauth/client/ut/files/service_tickets b/library/cpp/tvmauth/client/ut/files/service_tickets Binary files differdeleted file mode 100644 index 7a6985a34d8..00000000000 --- a/library/cpp/tvmauth/client/ut/files/service_tickets +++ /dev/null diff --git a/library/cpp/tvmauth/client/ut/last_error_ut.cpp b/library/cpp/tvmauth/client/ut/last_error_ut.cpp deleted file mode 100644 index 6751e78be7a..00000000000 --- a/library/cpp/tvmauth/client/ut/last_error_ut.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include <library/cpp/tvmauth/client/misc/last_error.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(LastError) { - Y_UNIT_TEST(common) { - TLastError le; - - UNIT_ASSERT_VALUES_EQUAL("OK", - le.GetLastError(true)); - UNIT_ASSERT_VALUES_EQUAL("Internal client error: failed to collect last useful error message, please report this message to tvm-dev@yandex-team.ru", - le.GetLastError(false)); - - UNIT_ASSERT_EXCEPTION_CONTAINS(le.ThrowLastError(), - TNonRetriableException, - "Internal client error: failed to collect last useful error message"); - - le.ProcessError(TLastError::EType::Retriable, TLastError::EScope::PublicKeys, "err_re#1"); - UNIT_ASSERT_VALUES_EQUAL("PublicKeys: err_re#1", - le.GetLastError(false)); - le.ProcessError(TLastError::EType::Retriable, TLastError::EScope::PublicKeys, "err_re#2"); - UNIT_ASSERT_VALUES_EQUAL("PublicKeys: err_re#2", - le.GetLastError(false)); - le.ProcessError(TLastError::EType::NonRetriable, TLastError::EScope::PublicKeys, "err_nonre#3"); - UNIT_ASSERT_VALUES_EQUAL("PublicKeys: err_nonre#3", - le.GetLastError(false)); - le.ProcessError(TLastError::EType::NonRetriable, TLastError::EScope::PublicKeys, "err_nonre#4"); - UNIT_ASSERT_VALUES_EQUAL("PublicKeys: err_nonre#4", - le.GetLastError(false)); - le.ProcessError(TLastError::EType::Retriable, TLastError::EScope::PublicKeys, "err_re#5"); - UNIT_ASSERT_VALUES_EQUAL("PublicKeys: err_nonre#4", - le.GetLastError(false)); - UNIT_ASSERT_EXCEPTION_CONTAINS(le.ThrowLastError(), - TNonRetriableException, - "Failed to start TvmClient. Do not retry: PublicKeys: err_nonre#4"); - - le.ProcessError(TLastError::EType::Retriable, TLastError::EScope::ServiceTickets, "err_re#6"); - UNIT_ASSERT_VALUES_EQUAL("PublicKeys: err_nonre#4", - le.GetLastError(false)); - le.ProcessError(TLastError::EType::Retriable, TLastError::EScope::ServiceTickets, "err_re#7"); - UNIT_ASSERT_VALUES_EQUAL("PublicKeys: err_nonre#4", - le.GetLastError(false)); - le.ProcessError(TLastError::EType::NonRetriable, TLastError::EScope::ServiceTickets, "err_nonre#8"); - UNIT_ASSERT_VALUES_EQUAL("ServiceTickets: err_nonre#8", - le.GetLastError(false)); - - le.ClearError(TLastError::EScope::ServiceTickets); - UNIT_ASSERT_VALUES_EQUAL("PublicKeys: err_nonre#4", - le.GetLastError(false)); - le.ClearError(TLastError::EScope::PublicKeys); - UNIT_ASSERT_VALUES_EQUAL("Internal client error: failed to collect last useful error message, please report this message to tvm-dev@yandex-team.ru", - le.GetLastError(false)); - } -} diff --git a/library/cpp/tvmauth/client/ut/logger_ut.cpp b/library/cpp/tvmauth/client/ut/logger_ut.cpp deleted file mode 100644 index 76236e8913b..00000000000 --- a/library/cpp/tvmauth/client/ut/logger_ut.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "common.h" - -#include <library/cpp/tvmauth/client/logger.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(ClientLogger) { - int i = 0; - - Y_UNIT_TEST(Debug) { - TLogger l; - l.Debug("qwerty"); - UNIT_ASSERT_VALUES_EQUAL("7: qwerty\n", l.Stream.Str()); - } - - Y_UNIT_TEST(Info) { - TLogger l; - l.Info("qwerty"); - UNIT_ASSERT_VALUES_EQUAL("6: qwerty\n", l.Stream.Str()); - } - - Y_UNIT_TEST(Warning) { - TLogger l; - l.Warning("qwerty"); - UNIT_ASSERT_VALUES_EQUAL("4: qwerty\n", l.Stream.Str()); - } - - Y_UNIT_TEST(Error) { - TLogger l; - l.Error("qwerty"); - UNIT_ASSERT_VALUES_EQUAL("3: qwerty\n", l.Stream.Str()); - } - -#ifdef _unix_ - Y_UNIT_TEST(Cerr_) { - TCerrLogger l(5); - l.Error("hit"); - l.Debug("miss"); - } -#endif -} diff --git a/library/cpp/tvmauth/client/ut/roles/decoder_ut.cpp b/library/cpp/tvmauth/client/ut/roles/decoder_ut.cpp deleted file mode 100644 index 0ee5fc7cb7c..00000000000 --- a/library/cpp/tvmauth/client/ut/roles/decoder_ut.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include <library/cpp/tvmauth/client/exception.h> -#include <library/cpp/tvmauth/client/misc/roles/decoder.h> - -#include <library/cpp/tvmauth/unittest.h> -#include <library/cpp/tvmauth/src/utils.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; -using namespace NTvmAuth::NRoles; - -Y_UNIT_TEST_SUITE(Decoder) { - const TString BROTLI = NUtils::Base64url2bin("GyMAAAR0Y6ku58ObclAQzDweUSUwbdqc5yOOKgI"); - const TString GZIP = NUtils::Base64url2bin("H4sIAAAAAAAA_yrOz01VKEstqkTGCpm5BflFJYl5JQpJOflJgAAAAP__MbeeiSQAAAA"); - const TString ZSTD = NUtils::Base64url2bin("KLUv_QBY9AAAwHNvbWUgdmVyeSBpbXBvcnRhbnQgYmxvYgEAc-4IAQAA"); - - Y_UNIT_TEST(Decode) { - // Errs - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDecoder::Decode( - "1:brotli:10000:88839244E8C7C426B20729AF1A13AD792C5FA83C7F2FB6ADCFC60DA1B5EF9603", - TString(BROTLI)), - yexception, - "Decoded blob has bad size: expected 10000, actual 36"); - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDecoder::Decode( - "1:brotli:36:88839244E8C7C426B20729AF1A13AD792C5FA83C7F2FB6ADCFC60DA1B5EF0000", - TString(BROTLI)), - yexception, - "Decoded blob has bad sha256"); - - // OK - TString decoded; - UNIT_ASSERT_NO_EXCEPTION( - decoded = TDecoder::Decode("", "some veryveryveryvery important blob")); - UNIT_ASSERT_VALUES_EQUAL(decoded, "some veryveryveryvery important blob"); - - UNIT_ASSERT_NO_EXCEPTION( - decoded = TDecoder::Decode( - "1:brotli:36:88839244E8C7C426B20729AF1A13AD792C5FA83C7F2FB6ADCFC60DA1B5EF9603", - TString(BROTLI))); - UNIT_ASSERT_VALUES_EQUAL(decoded, "some veryveryveryvery important blob"); - - UNIT_ASSERT_NO_EXCEPTION( - decoded = TDecoder::Decode( - "1:gzip:36:88839244E8C7C426B20729AF1A13AD792C5FA83C7F2FB6ADCFC60DA1B5EF9603", - TString(GZIP))); - UNIT_ASSERT_VALUES_EQUAL(decoded, "some veryveryveryvery important blob"); - - UNIT_ASSERT_NO_EXCEPTION( - decoded = TDecoder::Decode( - "1:zstd:36:88839244E8C7C426B20729AF1A13AD792C5FA83C7F2FB6ADCFC60DA1B5EF9603", - TString(ZSTD))); - UNIT_ASSERT_VALUES_EQUAL(decoded, "some veryveryveryvery important blob"); - } - - Y_UNIT_TEST(UnknownCodecs) { - for (const TStringBuf codec : {"lz", "lzma", "kek"}) { - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDecoder::DecodeImpl(codec, ""), - yexception, - TStringBuilder() << "unknown codec: '" << codec << "'"); - } - } - - Y_UNIT_TEST(ParseCodec) { - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDecoder::ParseCodec("2:kek"), - yexception, - "unknown codec format version; known: 1; got: 2"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDecoder::ParseCodec("1:::"), - yexception, - "codec type is empty"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDecoder::ParseCodec("1:some_codec:asd:"), - yexception, - "decoded blob size is not number"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDecoder::ParseCodec("1:some_codec:789:qwe"), - yexception, - "sha256 of decoded blob has invalid length: expected 64, got 3"); - - TDecoder::TCodecInfo info; - UNIT_ASSERT_NO_EXCEPTION( - info = TDecoder::ParseCodec("1:some_codec:789:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); - - UNIT_ASSERT_VALUES_EQUAL("some_codec", info.Type); - UNIT_ASSERT_VALUES_EQUAL(789, info.Size); - UNIT_ASSERT_VALUES_EQUAL("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - info.Sha256); - } - - Y_UNIT_TEST(DecodeBrolti) { - UNIT_ASSERT_EXCEPTION( - TDecoder::DecodeBrolti(""), - yexception); - - TString blob; - UNIT_ASSERT_NO_EXCEPTION( - blob = TDecoder::DecodeBrolti( - TString(BROTLI))); - - UNIT_ASSERT_VALUES_EQUAL( - "some veryveryveryvery important blob", - blob); - } - - Y_UNIT_TEST(DecodeGzip) { - TString blob; - UNIT_ASSERT_NO_EXCEPTION(blob = TDecoder::DecodeGzip("")); - UNIT_ASSERT_VALUES_EQUAL("", blob); - - UNIT_ASSERT_NO_EXCEPTION( - blob = TDecoder::DecodeGzip( - TString(GZIP))); - - UNIT_ASSERT_VALUES_EQUAL( - "some veryveryveryvery important blob", - blob); - } - - Y_UNIT_TEST(DecodeZstd) { - TString blob; - UNIT_ASSERT_NO_EXCEPTION(blob = TDecoder::DecodeZstd("")); - UNIT_ASSERT_VALUES_EQUAL("", blob); - - UNIT_ASSERT_NO_EXCEPTION( - blob = TDecoder::DecodeZstd( - TString(ZSTD))); - - UNIT_ASSERT_VALUES_EQUAL( - "some veryveryveryvery important blob", - blob); - } - - Y_UNIT_TEST(VerifySize) { - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDecoder::VerifySize("qwerty", 100), - yexception, - TStringBuilder() << "Decoded blob has bad size: expected 100, actual 6"); - - UNIT_ASSERT_NO_EXCEPTION(TDecoder::VerifySize("qwert", 5)); - } - - Y_UNIT_TEST(VerifyChecksum) { - UNIT_ASSERT_EXCEPTION_CONTAINS( - TDecoder::VerifyChecksum("qwerty", "zzzz"), - yexception, - "Decoded blob has bad sha256: expected=zzzz," - " actual=65E84BE33532FB784C48129675F9EFF3A682B27168C0EA744B2CF58EE02337C5"); - - UNIT_ASSERT_NO_EXCEPTION( - TDecoder::VerifyChecksum("qwerty", - "65E84BE33532FB784C48129675F9EFF3A682B27168C0EA744B2CF58EE02337C5")); - UNIT_ASSERT_NO_EXCEPTION( - TDecoder::VerifyChecksum("qwerty", - "65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5")); - } -} diff --git a/library/cpp/tvmauth/client/ut/roles/entities_index_ut.cpp b/library/cpp/tvmauth/client/ut/roles/entities_index_ut.cpp deleted file mode 100644 index 7e62a87b64f..00000000000 --- a/library/cpp/tvmauth/client/ut/roles/entities_index_ut.cpp +++ /dev/null @@ -1,358 +0,0 @@ -#include <library/cpp/tvmauth/client/ut/common.h> - -#include <library/cpp/tvmauth/client/misc/roles/entities_index.h> - -#include <library/cpp/testing/unittest/registar.h> - -#include <array> - -using namespace NTvmAuth::NRoles; - -Y_UNIT_TEST_SUITE(RolesEntitiesIndex) { - Y_UNIT_TEST(Stage) { - TEntitiesIndex::TStage stage({ - "key#1", - "key#2", - "key#3", - "key#4", - }); - - const std::vector<std::vector<TString>> results = { - {"key#1"}, - {"key#2"}, - {"key#1", "key#2"}, - {"key#3"}, - {"key#1", "key#3"}, - {"key#2", "key#3"}, - {"key#1", "key#2", "key#3"}, - {"key#4"}, - {"key#1", "key#4"}, - {"key#2", "key#4"}, - {"key#1", "key#2", "key#4"}, - {"key#3", "key#4"}, - {"key#1", "key#3", "key#4"}, - {"key#2", "key#3", "key#4"}, - {"key#1", "key#2", "key#3", "key#4"}, - }; - - std::vector<TString> keys; - for (const std::vector<TString>& res : results) { - UNIT_ASSERT(stage.GetNextKeySet(keys)); - UNIT_ASSERT_VALUES_EQUAL(keys, res); - } - - UNIT_ASSERT_C(!stage.GetNextKeySet(keys), keys); - } - - Y_UNIT_TEST(GetUniqueSortedKeys) { - std::vector<TEntityPtr> entities; - - UNIT_ASSERT_VALUES_EQUAL(std::set<TString>(), - TEntitiesIndex::GetUniqueSortedKeys(entities)); - - entities = { - std::make_shared<TEntity>(), - }; - UNIT_ASSERT_VALUES_EQUAL(std::set<TString>(), - TEntitiesIndex::GetUniqueSortedKeys(entities)); - - entities = { - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#1"}, - }), - }; - UNIT_ASSERT_VALUES_EQUAL(std::set<TString>({ - "key#1", - }), - TEntitiesIndex::GetUniqueSortedKeys(entities)); - - entities = { - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#1"}, - }), - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#22"}, - }), - }; - UNIT_ASSERT_VALUES_EQUAL(std::set<TString>({ - "key#1", - "key#2", - }), - TEntitiesIndex::GetUniqueSortedKeys(entities)); - } - - Y_UNIT_TEST(MakeUnique) { - const TEntityPtr entityA = std::make_shared<TEntity>(TEntity{{"key#1", "aaaa"}}); - const TEntityPtr entityA2 = std::make_shared<TEntity>(TEntity{{"key#1", "aaaa"}}); - const TEntityPtr entityB = std::make_shared<TEntity>(TEntity{{"key#1", "bbbb"}}); - - TEntitiesIndex::TSubTree idx = { - std::vector<TEntityPtr>{ - entityA, - entityA, - }, - TEntitiesIndex::TIdxByAttrs{ - { - TKeyValue{"key#1", "value#11"}, - TEntitiesIndex::TSubTree{ - std::vector<TEntityPtr>{ - entityA, - entityB, - entityA, - }, - TEntitiesIndex::TIdxByAttrs{ - { - TKeyValue{"key#2", "value#21"}, - TEntitiesIndex::TSubTree{ - std::vector<TEntityPtr>{ - entityA, - entityB, - entityA, - }, - TEntitiesIndex::TIdxByAttrs{}, - }, - }, - }, - }, - }, - { - TKeyValue{"key#1", "value#12"}, - TEntitiesIndex::TSubTree{ - std::vector<TEntityPtr>{ - entityA, - entityB, - entityA2, - }, - TEntitiesIndex::TIdxByAttrs{}, - }, - }, - }, - }; - - TEntitiesIndex::MakeUnique(idx); - - UNIT_ASSERT_VALUES_EQUAL(idx.Entities.size(), 1); - - auto it = idx.SubTree.find(TKeyValue{"key#1", "value#12"}); - UNIT_ASSERT(it != idx.SubTree.end()); - UNIT_ASSERT_VALUES_EQUAL(it->second.Entities.size(), 2); - - it = idx.SubTree.find(TKeyValue{"key#1", "value#11"}); - UNIT_ASSERT(it != idx.SubTree.end()); - UNIT_ASSERT_VALUES_EQUAL(it->second.Entities.size(), 2); - - it = it->second.SubTree.find(TKeyValue{"key#2", "value#21"}); - UNIT_ASSERT(it != it->second.SubTree.end()); - UNIT_ASSERT_VALUES_EQUAL(it->second.Entities.size(), 2); - } - - Y_UNIT_TEST(GetByAttrs) { - const TEntitiesIndex index = CreateEntitiesIndex(); - - UNIT_ASSERT_STRINGS_EQUAL( - index.PrintDebugString(), - R"( -"key#1/value#11" - "key#2/value#22" - "key#3/value#33" - "key#2/value#23" - "key#3/value#33" - "key#3/value#33" -"key#1/value#13" - "key#3/value#33" -"key#2/value#22" - "key#3/value#33" -"key#2/value#23" - "key#3/value#33" -"key#3/value#33" -)"); - - struct TCase { - TEntity AttrsToFind; - std::vector<TEntity> Result; - }; - - std::vector<TCase> cases = { - { - TEntity{}, - std::vector<TEntity>{ - TEntity{ - {"key#1", "value#11"}, - }, - TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#22"}, - {"key#3", "value#33"}, - }, - TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#23"}, - {"key#3", "value#33"}, - }, - TEntity{ - {"key#1", "value#13"}, - {"key#3", "value#33"}, - }, - }, - }, - { - TEntity{ - {"key#1", "value#11"}, - }, - std::vector<TEntity>{ - TEntity{ - {"key#1", "value#11"}, - }, - TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#22"}, - {"key#3", "value#33"}, - }, - TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#23"}, - {"key#3", "value#33"}, - }, - }, - }, - { - TEntity{ - {"key#1", "value#13"}, - }, - std::vector<TEntity>{ - TEntity{ - {"key#1", "value#13"}, - {"key#3", "value#33"}, - }, - }, - }, - { - TEntity{ - {"key#1", "value#14"}, - }, - std::vector<TEntity>{}, - }, - { - TEntity{ - {"key#2", "value#22"}, - }, - std::vector<TEntity>{ - TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#22"}, - {"key#3", "value#33"}, - }, - }, - }, - { - TEntity{ - {"key#3", "value#33"}, - }, - std::vector<TEntity>{ - TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#22"}, - {"key#3", "value#33"}, - }, - TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#23"}, - {"key#3", "value#33"}, - }, - TEntity{ - {"key#1", "value#13"}, - {"key#3", "value#33"}, - }, - }, - }, - }; - - for (const TCase& c : cases) { - std::vector<TEntityPtr> expected; - for (const TEntity& e : c.Result) { - expected.push_back(std::make_shared<TEntity>(e)); - } - - UNIT_ASSERT_VALUES_EQUAL_C( - index.GetEntitiesWithAttrs(c.AttrsToFind.begin(), c.AttrsToFind.end()), - expected, - "'" << c.AttrsToFind << "'"); - } - } - - Y_UNIT_TEST(Contains) { - const TEntitiesIndex index = CreateEntitiesIndex(); - - struct TCase { - TEntity Exact; - bool Result = false; - }; - - std::vector<TCase> cases = { - { - TEntity{}, - false, - }, - { - TEntity{ - {"key#1", "value#11"}, - }, - true, - }, - { - TEntity{ - {"key#1", "value#13"}, - }, - false, - }, - { - TEntity{ - {"key#1", "value#13"}, - {"key#3", "value#33"}, - }, - true, - }, - }; - - for (const TCase& c : cases) { - UNIT_ASSERT_VALUES_EQUAL_C( - index.ContainsExactEntity(c.Exact.begin(), c.Exact.end()), - c.Result, - "'" << c.Exact << "'"); - } - } -} - -template <> -void Out<std::vector<TString>>(IOutputStream& o, const std::vector<TString>& s) { - for (const auto& key : s) { - o << key << ","; - } -} - -template <> -void Out<std::set<TString>>(IOutputStream& o, const std::set<TString>& s) { - for (const auto& key : s) { - o << key << ","; - } -} - -template <> -void Out<std::vector<TEntityPtr>>(IOutputStream& o, const std::vector<TEntityPtr>& v) { - for (const TEntityPtr& p : v) { - o << *p << Endl; - } -} - -template <> -void Out<TEntityPtr>(IOutputStream& o, const TEntityPtr& v) { - o << *v; -} - -template <> -void Out<TEntity>(IOutputStream& o, const TEntity& v) { - for (const auto& [key, value] : v) { - o << key << "->" << value << Endl; - } -} diff --git a/library/cpp/tvmauth/client/ut/roles/parser_ut.cpp b/library/cpp/tvmauth/client/ut/roles/parser_ut.cpp deleted file mode 100644 index 4a2afac4837..00000000000 --- a/library/cpp/tvmauth/client/ut/roles/parser_ut.cpp +++ /dev/null @@ -1,161 +0,0 @@ -#include <library/cpp/tvmauth/client/misc/roles/parser.h> - -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/json/json_reader.h> -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; -using namespace NTvmAuth::NRoles; - -Y_UNIT_TEST_SUITE(Parser) { - static NJson::TJsonValue ToJsonValue(TStringBuf body) { - NJson::TJsonValue doc; - UNIT_ASSERT(NJson::ReadJsonTree(body, &doc)); - return doc; - } - - Y_UNIT_TEST(GetEntity) { - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetEntity(ToJsonValue(R"({"scope": false})"), - "cons", - "read"), - yexception, - "entity is map (str->str), got value Boolean. consumer 'cons' with role 'read'"); - - TEntityPtr en; - UNIT_ASSERT_NO_EXCEPTION( - en = TParser::GetEntity(ToJsonValue(R"({})"), - "cons", - "read")); - UNIT_ASSERT_VALUES_EQUAL(en->size(), 0); - - UNIT_ASSERT_NO_EXCEPTION( - en = TParser::GetEntity(ToJsonValue(R"({"key1": "val1", "key2": "val2"})"), - "cons", - "read")); - UNIT_ASSERT_VALUES_EQUAL(en->size(), 2); - } - - Y_UNIT_TEST(GetEntities) { - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetEntities(ToJsonValue(R"([{},[]])"), - "cons", - "read"), - yexception, - "role entity for role must be map: consumer 'cons' with role 'read' has Array"); - - TEntitiesPtr en; - UNIT_ASSERT_NO_EXCEPTION( - en = TParser::GetEntities(ToJsonValue(R"([])"), - "cons", - "read")); - UNIT_ASSERT(!en->Contains({})); - - UNIT_ASSERT_NO_EXCEPTION( - en = TParser::GetEntities(ToJsonValue(R"([{}])"), - "cons", - "read")); - UNIT_ASSERT(en->Contains({})); - } - - Y_UNIT_TEST(GetConsumer) { - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetConsumer(ToJsonValue(R"({"role1": [],"role2": {}})"), - "cons"), - yexception, - "entities for roles must be array: 'role2' is Map"); - - TConsumerRolesPtr c; - UNIT_ASSERT_NO_EXCEPTION( - c = TParser::GetConsumer(ToJsonValue(R"({"role1": [],"role2": []})"), - "cons")); - UNIT_ASSERT_EQUAL(c->GetRoles().size(), 2); - UNIT_ASSERT(c->HasRole("role1")); - UNIT_ASSERT(c->HasRole("role2")); - UNIT_ASSERT(!c->HasRole("role3")); - } - - Y_UNIT_TEST(GetConsumers) { - TRoles::TTvmConsumers cons; - UNIT_ASSERT_NO_EXCEPTION( - cons = TParser::GetConsumers<TTvmId>(ToJsonValue(R"({})"), - "tvm")); - UNIT_ASSERT_VALUES_EQUAL(0, cons.size()); - - UNIT_ASSERT_NO_EXCEPTION( - cons = TParser::GetConsumers<TTvmId>(ToJsonValue(R"({"tvm": {}})"), - "tvm")); - UNIT_ASSERT_VALUES_EQUAL(0, cons.size()); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetConsumers<TTvmId>(ToJsonValue(R"({"tvm": []})"), - "tvm"), - yexception, - "'tvm' must be object"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetConsumers<TTvmId>(ToJsonValue(R"({"tvm": {"asd": []}})"), - "tvm"), - yexception, - "roles for consumer must be map: 'asd' is Array"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetConsumers<TTvmId>(ToJsonValue(R"({"tvm": {"asd": {}}})"), - "tvm"), - yexception, - "id must be valid positive number of proper size for tvm. got 'asd'"); - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetConsumers<TTvmId>(ToJsonValue(R"({"tvm": {"1120000000001062": {}}})"), - "tvm"), - yexception, - "id must be valid positive number of proper size for tvm. got '1120000000001062'"); - UNIT_ASSERT_NO_EXCEPTION( - TParser::GetConsumers<TUid>(ToJsonValue(R"({"user": {"1120000000001062": {}}})"), - "user")); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetConsumers<TTvmId>(ToJsonValue(R"({"tvm": {"42": {}, "042": {}}})"), - "tvm"), - yexception, - "consumer duplicate detected: '42' for tvm"); - - UNIT_ASSERT_NO_EXCEPTION( - cons = TParser::GetConsumers<TTvmId>(ToJsonValue(R"({"tvm": {"42": {}}})"), - "tvm")); - UNIT_ASSERT_VALUES_EQUAL(1, cons.size()); - } - - Y_UNIT_TEST(GetMeta) { - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetMeta(ToJsonValue(R"({})")), - yexception, - "Missing 'revision'"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetMeta(ToJsonValue(R"({"revision": null})")), - yexception, - "'revision' has unexpected type: Null"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetMeta(ToJsonValue(R"({"revision": 100500})")), - yexception, - "Missing 'born_date'"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - TParser::GetMeta(ToJsonValue(R"({"revision": 100500, "born_date": false})")), - yexception, - "key 'born_date' must be uint"); - - TRoles::TMeta meta; - UNIT_ASSERT_NO_EXCEPTION( - meta = TParser::GetMeta(ToJsonValue(R"({"revision": 100500, "born_date": 42})"))); - UNIT_ASSERT_VALUES_EQUAL("100500", meta.Revision); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(42), meta.BornTime); - - UNIT_ASSERT_NO_EXCEPTION( - meta = TParser::GetMeta(ToJsonValue(R"({"revision": "100501", "born_date": 42})"))); - UNIT_ASSERT_VALUES_EQUAL("100501", meta.Revision); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(42), meta.BornTime); - } -} diff --git a/library/cpp/tvmauth/client/ut/roles/roles_ut.cpp b/library/cpp/tvmauth/client/ut/roles/roles_ut.cpp deleted file mode 100644 index d485dd857a7..00000000000 --- a/library/cpp/tvmauth/client/ut/roles/roles_ut.cpp +++ /dev/null @@ -1,419 +0,0 @@ -#include <library/cpp/tvmauth/client/ut/common.h> - -#include <library/cpp/tvmauth/client/exception.h> -#include <library/cpp/tvmauth/client/misc/roles/roles.h> - -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/testing/unittest/registar.h> - -#include <array> - -using namespace NTvmAuth; -using namespace NTvmAuth::NRoles; - -Y_UNIT_TEST_SUITE(Roles) { - Y_UNIT_TEST(EntContains) { - TEntities ent(CreateEntitiesIndex()); - - UNIT_ASSERT(ent.Contains({{"key#1", "value#11"}})); - UNIT_ASSERT(ent.Contains({ - {"key#1", "value#13"}, - {"key#3", "value#33"}, - })); - UNIT_ASSERT(!ent.Contains({{"key#111", "value#11"}})); - UNIT_ASSERT(!ent.Contains({ - {"key#111", "value#13"}, - {"key#3", "value#33"}, - })); - - // valid calls - { - std::array<const std::pair<TStringBuf, TString>, 1> arr = {{{"key#1", "value#11"}}}; - UNIT_ASSERT(ent.ContainsSortedUnique<TStringBuf>({arr.begin(), arr.end()})); - } - { - std::array<const std::pair<TString, TStringBuf>, 2> arr = {{ - {"key#1", "value#13"}, - {"key#3", "value#33"}, - }}; - bool res = ent.ContainsSortedUnique<TString, TStringBuf>({arr.begin(), arr.end()}); - UNIT_ASSERT(res); - } - { - std::array<const std::pair<TStringBuf, TStringBuf>, 1> arr = {{{"key#111", "value#11"}}}; - bool res = ent.ContainsSortedUnique<TStringBuf, TStringBuf>({arr.begin(), arr.end()}); - UNIT_ASSERT(!res); - } - { - std::array<const std::pair<TString, TString>, 2> arr = {{ - {"key#111", "value#13"}, - {"key#3", "value#33"}, - }}; - UNIT_ASSERT(!ent.ContainsSortedUnique({arr.begin(), arr.end()})); - } - - // invalid calls - { - std::array<const std::pair<TString, TString>, 2> arr = {{ - {"key#3", "value#33"}, - {"key#1", "value#13"}, - }}; - UNIT_ASSERT_EXCEPTION_CONTAINS( - ent.ContainsSortedUnique({arr.begin(), arr.end()}), - TIllegalUsage, - "attrs are not sorted: 'key#3' before 'key#1'"); - } - { - std::array<const std::pair<TString, TString>, 2> arr = {{ - {"key#1", "value#13"}, - {"key#1", "value#13"}, - }}; - UNIT_ASSERT_EXCEPTION_CONTAINS( - ent.ContainsSortedUnique({arr.begin(), arr.end()}), - TIllegalUsage, - "attrs are not unique: 'key#1'"); - } - } - - Y_UNIT_TEST(EntWithAttrs) { - TEntities ent(CreateEntitiesIndex()); - - UNIT_ASSERT_VALUES_EQUAL( - ent.GetEntitiesWithAttrs({{"key#1", "value#11"}}), - std::vector<TEntityPtr>({ - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#11"}, - }), - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#22"}, - {"key#3", "value#33"}, - }), - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#23"}, - {"key#3", "value#33"}, - }), - })); - UNIT_ASSERT_VALUES_EQUAL( - ent.GetEntitiesWithAttrs({{"key#111", "value#11"}}), - std::vector<TEntityPtr>()); - - // valid calls - { - std::array<const std::pair<TStringBuf, TString>, 2> arr = {{ - {"key#1", "value#11"}, - {"key#3", "value#33"}, - }}; - auto vec = ent.GetEntitiesWithSortedUniqueAttrs<TStringBuf>({arr.begin(), arr.end()}); - UNIT_ASSERT_VALUES_EQUAL( - vec, - std::vector<TEntityPtr>({ - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#22"}, - {"key#3", "value#33"}, - }), - std::make_shared<TEntity>(TEntity{ - {"key#1", "value#11"}, - {"key#2", "value#23"}, - {"key#3", "value#33"}, - }), - })); - } - { - std::array<const std::pair<TString, TString>, 2> arr = {{ - {"key#111", "value#13"}, - {"key#3", "value#33"}, - }}; - UNIT_ASSERT_VALUES_EQUAL( - ent.GetEntitiesWithSortedUniqueAttrs({arr.begin(), arr.end()}), - std::vector<TEntityPtr>()); - } - - // invalid calls - { - std::array<const std::pair<TString, TString>, 2> arr = {{ - {"key#3", "value#33"}, - {"key#1", "value#13"}, - }}; - UNIT_ASSERT_EXCEPTION_CONTAINS( - ent.GetEntitiesWithSortedUniqueAttrs({arr.begin(), arr.end()}), - TIllegalUsage, - "attrs are not sorted: 'key#3' before 'key#1'"); - } - { - std::array<const std::pair<TString, TString>, 2> arr = {{ - {"key#1", "value#13"}, - {"key#1", "value#13"}, - }}; - UNIT_ASSERT_EXCEPTION_CONTAINS( - ent.GetEntitiesWithSortedUniqueAttrs({arr.begin(), arr.end()}), - TIllegalUsage, - "attrs are not unique: 'key#1'"); - } - } - - Y_UNIT_TEST(Consumer) { - TConsumerRoles c({ - {"read", std::make_shared<TEntities>(CreateEntitiesIndex())}, - {"write", std::make_shared<TEntities>(CreateEntitiesIndex())}, - }); - - UNIT_ASSERT_EQUAL(c.GetRoles().size(), 2); - UNIT_ASSERT(c.HasRole("read")); - UNIT_ASSERT(c.HasRole("write")); - UNIT_ASSERT(!c.HasRole("access")); - - UNIT_ASSERT_EQUAL(nullptr, c.GetEntitiesForRole("access")); - - TEntitiesPtr ent = c.GetEntitiesForRole("read"); - UNIT_ASSERT_UNEQUAL(nullptr, ent); - UNIT_ASSERT(ent->Contains({{"key#1", "value#11"}})); - UNIT_ASSERT(!ent->Contains({{"key#111", "value#11"}})); - - UNIT_ASSERT(c.CheckRoleForExactEntity("read", {{"key#1", "value#11"}})); - UNIT_ASSERT(!c.CheckRoleForExactEntity("access", {{"key#1", "value#11"}})); - UNIT_ASSERT(!c.CheckRoleForExactEntity("read", {{"key#111", "value#11"}})); - UNIT_ASSERT(!c.CheckRoleForExactEntity("read", {})); - } - - Y_UNIT_TEST(RolesService) { - TRoles r( - {}, - { - {100500, std::make_shared<TConsumerRoles>(TEntitiesByRoles{ - {"write", std::make_shared<TEntities>(CreateEntitiesIndex())}, - })}, - }, - {}, - std::make_shared<TString>()); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - r.GetRolesForService(NUnittest::CreateServiceTicket( - ETicketStatus::InvalidDst, - 100500)), - TIllegalUsage, - "Service ticket must be valid, got: InvalidDst"); - - TConsumerRolesPtr cons; - UNIT_ASSERT_NO_EXCEPTION( - cons = r.GetRolesForService(NUnittest::CreateServiceTicket( - ETicketStatus::Ok, - 100501))); - UNIT_ASSERT_EQUAL(nullptr, cons); - - cons = r.GetRolesForService(NUnittest::CreateServiceTicket( - ETicketStatus::Ok, - 100500)); - UNIT_ASSERT_UNEQUAL(nullptr, cons); - UNIT_ASSERT_EQUAL(cons->GetRoles().size(), 1); - UNIT_ASSERT(!cons->HasRole("read")); - UNIT_ASSERT(cons->HasRole("write")); - - ////shortcuts - // no tvmid - UNIT_ASSERT(!r.CheckServiceRole( - NUnittest::CreateServiceTicket( - ETicketStatus::Ok, - 100501), - "write")); - - // no role - UNIT_ASSERT(!r.CheckServiceRole( - NUnittest::CreateServiceTicket( - ETicketStatus::Ok, - 100500), - "read")); - - // success - UNIT_ASSERT(r.CheckServiceRole( - NUnittest::CreateServiceTicket( - ETicketStatus::Ok, - 100500), - "write")); - - // no tvmid - UNIT_ASSERT(!r.CheckServiceRoleForExactEntity( - NUnittest::CreateServiceTicket( - ETicketStatus::Ok, - 100501), - "write", - {{"key#1", "value#11"}})); - - // no role - UNIT_ASSERT(!r.CheckServiceRoleForExactEntity( - NUnittest::CreateServiceTicket( - ETicketStatus::Ok, - 100500), - "read", - {{"key#1", "value#11"}})); - - // no entity - UNIT_ASSERT(!r.CheckServiceRoleForExactEntity( - NUnittest::CreateServiceTicket( - ETicketStatus::Ok, - 100500), - "write", - {{"key#111", "value#11"}})); - - // success - UNIT_ASSERT(r.CheckServiceRoleForExactEntity( - NUnittest::CreateServiceTicket( - ETicketStatus::Ok, - 100500), - "write", - {{"key#1", "value#11"}})); - } - - Y_UNIT_TEST(RolesUser) { - TRoles r( - {}, - {}, - { - {789654, std::make_shared<TConsumerRoles>(TEntitiesByRoles{ - {"read", std::make_shared<TEntities>(CreateEntitiesIndex())}, - })}, - }, - std::make_shared<TString>("some roles")); - - UNIT_ASSERT_VALUES_EQUAL("some roles", r.GetRaw()); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - r.GetRolesForUser(NUnittest::CreateUserTicket( - ETicketStatus::Malformed, - 789654, - {})), - TIllegalUsage, - "User ticket must be valid, got: Malformed"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - r.GetRolesForUser(NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789654, - {}), - 789123), - TIllegalUsage, - "User ticket must be from ProdYateam, got from Test"); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - r.GetRolesForUser(NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789654, - {}, - {}, - EBlackboxEnv::ProdYateam), - 789123), - TIllegalUsage, - "selectedUid must be in user ticket but it's not: 789123"); - - TConsumerRolesPtr cons; - UNIT_ASSERT_NO_EXCEPTION( - cons = r.GetRolesForUser(NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789123, - {}, - {}, - EBlackboxEnv::ProdYateam))); - UNIT_ASSERT_EQUAL(nullptr, cons); - - cons = r.GetRolesForUser(NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789654, - {}, - {}, - EBlackboxEnv::ProdYateam)); - UNIT_ASSERT_UNEQUAL(nullptr, cons); - UNIT_ASSERT_EQUAL(cons->GetRoles().size(), 1); - UNIT_ASSERT(cons->HasRole("read")); - UNIT_ASSERT(!cons->HasRole("write")); - - cons = r.GetRolesForUser(NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789123, - {}, - {789654, 789741}, - EBlackboxEnv::ProdYateam), - 789654); - UNIT_ASSERT_UNEQUAL(nullptr, cons); - UNIT_ASSERT_EQUAL(cons->GetRoles().size(), 1); - UNIT_ASSERT(cons->HasRole("read")); - UNIT_ASSERT(!cons->HasRole("write")); - - ////shortcuts - // no uid - UNIT_ASSERT(!r.CheckUserRole( - NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789123, - {}, - {}, - EBlackboxEnv::ProdYateam), - "read")); - - // no role - UNIT_ASSERT(!r.CheckUserRole( - NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789654, - {}, - {}, - EBlackboxEnv::ProdYateam), - "wrire")); - - // success - UNIT_ASSERT(r.CheckUserRole( - NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789654, - {}, - {}, - EBlackboxEnv::ProdYateam), - "read")); - - // no uid - UNIT_ASSERT(!r.CheckUserRoleForExactEntity( - NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789123, - {}, - {}, - EBlackboxEnv::ProdYateam), - "read", - {{"key#1", "value#11"}})); - - // no role - UNIT_ASSERT(!r.CheckUserRoleForExactEntity( - NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789654, - {}, - {}, - EBlackboxEnv::ProdYateam), - "wrire", - {{"key#1", "value#11"}})); - - // no entity - UNIT_ASSERT(!r.CheckUserRoleForExactEntity( - NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789654, - {}, - {}, - EBlackboxEnv::ProdYateam), - "read", - {{"key#111", "value#11"}})); - - // success - UNIT_ASSERT(r.CheckUserRoleForExactEntity( - NUnittest::CreateUserTicket( - ETicketStatus::Ok, - 789654, - {}, - {}, - EBlackboxEnv::ProdYateam), - "read", - {{"key#1", "value#11"}})); - } -} diff --git a/library/cpp/tvmauth/client/ut/roles/tvmapi_roles_fetcher_ut.cpp b/library/cpp/tvmauth/client/ut/roles/tvmapi_roles_fetcher_ut.cpp deleted file mode 100644 index 7eaf611e82a..00000000000 --- a/library/cpp/tvmauth/client/ut/roles/tvmapi_roles_fetcher_ut.cpp +++ /dev/null @@ -1,197 +0,0 @@ -#include <library/cpp/tvmauth/client/ut/common.h> - -#include <library/cpp/tvmauth/client/misc/disk_cache.h> -#include <library/cpp/tvmauth/client/misc/api/roles_fetcher.h> - -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/testing/unittest/registar.h> - -#include <util/stream/file.h> -#include <util/system/fs.h> - -using namespace NTvmAuth; -using namespace NTvmAuth::NTvmApi; - -Y_UNIT_TEST_SUITE(TvmApiRolesFetcher) { - static const TString ROLES = R"({"revision": "100501", "born_date": 42})"; - - static const TString CACHE_DIR = "./tmp/"; - - static void CleanCache() { - NFs::RemoveRecursive(CACHE_DIR); - NFs::MakeDirectoryRecursive(CACHE_DIR); - } - - Y_UNIT_TEST(ReadFromDisk) { - CleanCache(); - auto logger = MakeIntrusive<TLogger>(); - - TRolesFetcherSettings s; - s.CacheDir = CACHE_DIR; - s.SelfTvmId = 111111; - s.IdmSystemSlug = "fem\tida"; - TRolesFetcher fetcher(s, logger); - - UNIT_ASSERT(!fetcher.AreRolesOk()); - - UNIT_ASSERT_VALUES_EQUAL(TInstant(), fetcher.ReadFromDisk()); - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: File './tmp/roles' does not exist\n", - logger->Stream.Str()); - logger->Stream.clear(); - - const TInstant now = TInstant::Seconds(TInstant::Now().Seconds()); - - TDiskWriter wr(CACHE_DIR + "roles"); - UNIT_ASSERT(wr.Write("kek", now)); - UNIT_ASSERT_NO_EXCEPTION(fetcher.ReadFromDisk()); - UNIT_ASSERT(!fetcher.AreRolesOk()); - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/roles' was successfully read\n" - << "4: Roles in disk cache are for another slug (kek). Self=fem\tida\n", - logger->Stream.Str()); - logger->Stream.clear(); - - UNIT_ASSERT(wr.Write(TRolesFetcher::PrepareDiskFormat(ROLES, "femida_test"), now)); - UNIT_ASSERT_VALUES_EQUAL(TInstant(), fetcher.ReadFromDisk()); - UNIT_ASSERT(!fetcher.AreRolesOk()); - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/roles' was successfully read\n" - "4: Roles in disk cache are for another slug (femida_test). Self=fem\tida\n", - logger->Stream.Str()); - logger->Stream.clear(); - - UNIT_ASSERT(wr.Write(TRolesFetcher::PrepareDiskFormat(ROLES, "fem\tida"), now)); - UNIT_ASSERT_VALUES_EQUAL(now, fetcher.ReadFromDisk()); - UNIT_ASSERT(fetcher.AreRolesOk()); - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/roles' was successfully read\n" - "7: Succeed to read roles with revision 100501 from ./tmp/roles\n", - logger->Stream.Str()); - logger->Stream.clear(); - } - - Y_UNIT_TEST(IsTimeToUpdate) { - TRetrySettings settings; - settings.RolesUpdatePeriod = TDuration::Minutes(123); - - UNIT_ASSERT(!TRolesFetcher::IsTimeToUpdate(settings, TDuration::Seconds(5))); - UNIT_ASSERT(TRolesFetcher::IsTimeToUpdate(settings, TDuration::Hours(5))); - } - - Y_UNIT_TEST(ShouldWarn) { - TRetrySettings settings; - settings.RolesWarnPeriod = TDuration::Minutes(123); - - UNIT_ASSERT(!TRolesFetcher::ShouldWarn(settings, TDuration::Seconds(5))); - UNIT_ASSERT(TRolesFetcher::ShouldWarn(settings, TDuration::Hours(5))); - } - - Y_UNIT_TEST(Update) { - CleanCache(); - auto logger = MakeIntrusive<TLogger>(); - - TRolesFetcherSettings s; - s.CacheDir = CACHE_DIR; - s.SelfTvmId = 111111; - TRolesFetcher fetcher(s, logger); - - UNIT_ASSERT(!fetcher.AreRolesOk()); - - NUtils::TFetchResult fetchResult; - fetchResult.Code = 304; - - UNIT_ASSERT_EXCEPTION_CONTAINS( - fetcher.Update(NUtils::TFetchResult(fetchResult)), - yexception, - "tirole did not return any roles because current roles are actual, but there are no roles in memory"); - UNIT_ASSERT(!fetcher.AreRolesOk()); - UNIT_ASSERT(!NFs::Exists(CACHE_DIR + "roles")); - - fetchResult.Code = 206; - UNIT_ASSERT_EXCEPTION_CONTAINS( - fetcher.Update(NUtils::TFetchResult(fetchResult)), - yexception, - "Unexpected code from tirole: 206."); - UNIT_ASSERT(!fetcher.AreRolesOk()); - UNIT_ASSERT(!NFs::Exists(CACHE_DIR + "roles")); - - fetchResult.Code = 200; - fetchResult.Response = "kek"; - UNIT_ASSERT_EXCEPTION_CONTAINS( - fetcher.Update(NUtils::TFetchResult(fetchResult)), - yexception, - "Invalid json. 'kek'"); - UNIT_ASSERT(!fetcher.AreRolesOk()); - UNIT_ASSERT(!NFs::Exists(CACHE_DIR + "roles")); - - fetchResult.Response = ROLES; - UNIT_ASSERT_NO_EXCEPTION(fetcher.Update(NUtils::TFetchResult(fetchResult))); - UNIT_ASSERT(fetcher.AreRolesOk()); - UNIT_ASSERT(NFs::Exists(CACHE_DIR + "roles")); - { - TFileInput f(CACHE_DIR + "roles"); - TString body = f.ReadAll(); - UNIT_ASSERT_C(body.Contains(ROLES), "got body: '" << body << "'"); - } - - fetchResult.Code = 304; - fetchResult.Response.clear(); - UNIT_ASSERT_NO_EXCEPTION(fetcher.Update(NUtils::TFetchResult(fetchResult))); - UNIT_ASSERT(fetcher.AreRolesOk()); - UNIT_ASSERT(NFs::Exists(CACHE_DIR + "roles")); - - fetchResult.Code = 200; - fetchResult.Headers.AddHeader("X-Tirole-Compression", "kek"); - UNIT_ASSERT_EXCEPTION_CONTAINS( - fetcher.Update(NUtils::TFetchResult(fetchResult)), - yexception, - "unknown codec format version; known: 1; got: kek"); - } - - Y_UNIT_TEST(CreateTiroleRequest) { - CleanCache(); - auto logger = MakeIntrusive<TLogger>(); - - TRolesFetcherSettings s; - s.CacheDir = CACHE_DIR; - s.SelfTvmId = 111111; - s.IdmSystemSlug = "some sys"; - TRolesFetcher fetcher(s, logger); - - TRolesFetcher::TRequest req = fetcher.CreateTiroleRequest("some_ticket"); - UNIT_ASSERT_VALUES_EQUAL( - "/v1/get_actual_roles?system_slug=some+sys&_pid=&lib_version=client_", - TStringBuf(req.Url).Chop(5)); - UNIT_ASSERT_VALUES_EQUAL( - TKeepAliveHttpClient::THeaders({ - {"X-Ya-Service-Ticket", "some_ticket"}, - }), - req.Headers); - - TDiskWriter wr(CACHE_DIR + "roles"); - UNIT_ASSERT(wr.Write(TRolesFetcher::PrepareDiskFormat( - R"({"revision": "asd&qwe", "born_date": 42})", - "some sys"))); - UNIT_ASSERT_NO_EXCEPTION(fetcher.ReadFromDisk()); - - req = fetcher.CreateTiroleRequest("some_ticket"); - UNIT_ASSERT_VALUES_EQUAL( - "/v1/get_actual_roles?system_slug=some+sys&_pid=&lib_version=client_", - TStringBuf(req.Url).Chop(5)); - UNIT_ASSERT_VALUES_EQUAL( - TKeepAliveHttpClient::THeaders({ - {"If-None-Match", R"("asd&qwe")"}, - {"X-Ya-Service-Ticket", "some_ticket"}, - }), - req.Headers); - } -} diff --git a/library/cpp/tvmauth/client/ut/roles/tvmtool_roles_fetcher_ut.cpp b/library/cpp/tvmauth/client/ut/roles/tvmtool_roles_fetcher_ut.cpp deleted file mode 100644 index 55db4950cea..00000000000 --- a/library/cpp/tvmauth/client/ut/roles/tvmtool_roles_fetcher_ut.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include <library/cpp/tvmauth/client/ut/common.h> - -#include <library/cpp/tvmauth/client/misc/tool/roles_fetcher.h> - -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; -using namespace NTvmAuth::NTvmTool; - -Y_UNIT_TEST_SUITE(TvmToolRolesFetcher) { - static const TString ROLES = R"({"revision": "100501", "born_date": 42})"; - - Y_UNIT_TEST(IsTimeToUpdate) { - TRolesFetcher rf( - TRolesFetcherSettings{.UpdatePeriod = TDuration::Minutes(1)}, - new TLogger); - - UNIT_ASSERT(!rf.IsTimeToUpdate(TDuration::Seconds(3))); - UNIT_ASSERT(!rf.IsTimeToUpdate(TDuration::Seconds(60))); - UNIT_ASSERT(rf.IsTimeToUpdate(TDuration::Seconds(61))); - UNIT_ASSERT(rf.IsTimeToUpdate(TDuration::Seconds(600))); - } - - Y_UNIT_TEST(ShouldWarn) { - TRolesFetcher rf( - TRolesFetcherSettings{.WarnPeriod = TDuration::Minutes(20)}, - new TLogger); - - UNIT_ASSERT(!rf.ShouldWarn(TDuration::Minutes(3))); - UNIT_ASSERT(!rf.ShouldWarn(TDuration::Minutes(20))); - UNIT_ASSERT(rf.ShouldWarn(TDuration::Minutes(21))); - UNIT_ASSERT(rf.ShouldWarn(TDuration::Minutes(600))); - } - - Y_UNIT_TEST(Common) { - auto logger = MakeIntrusive<TLogger>(); - TRolesFetcher rf( - TRolesFetcherSettings{.SelfAlias = "some_alias"}, - logger); - UNIT_ASSERT(!rf.AreRolesOk()); - UNIT_ASSERT(!rf.GetCurrentRoles()); - - UNIT_ASSERT_EXCEPTION_CONTAINS( - rf.Update(NUtils::TFetchResult{.Code = HTTP_NOT_MODIFIED}), - yexception, - "tvmtool did not return any roles because current roles are actual, but there are no roles in memory - this should never happen"); - UNIT_ASSERT_EXCEPTION_CONTAINS( - rf.Update(NUtils::TFetchResult{.Code = HTTP_BAD_REQUEST, .Response = "kek"}), - yexception, - "Unexpected code from tvmtool: 400. kek"); - UNIT_ASSERT_EXCEPTION_CONTAINS( - rf.Update(NUtils::TFetchResult{.Code = HTTP_OK, .Response = "kek"}), - yexception, - "Invalid json. 'kek'"); - - UNIT_ASSERT_NO_EXCEPTION(rf.Update(NUtils::TFetchResult{.Code = HTTP_OK, .Response = ROLES})); - UNIT_ASSERT(rf.AreRolesOk()); - UNIT_ASSERT(rf.GetCurrentRoles()); - UNIT_ASSERT_VALUES_EQUAL("100501", rf.GetCurrentRoles()->GetMeta().Revision); - - UNIT_ASSERT_NO_EXCEPTION(rf.Update(NUtils::TFetchResult{.Code = HTTP_NOT_MODIFIED})); - UNIT_ASSERT_VALUES_EQUAL("100501", rf.GetCurrentRoles()->GetMeta().Revision); - - UNIT_ASSERT_VALUES_EQUAL( - "7: Succeed to update roles with revision 100501\n", - logger->Stream.Str()); - } - - Y_UNIT_TEST(CreateRequest) { - struct TTestFetcher: TRolesFetcher { - using TRolesFetcher::CreateRequest; - using TRolesFetcher::TRequest; - using TRolesFetcher::TRolesFetcher; - }; - - TTestFetcher rf( - TRolesFetcherSettings{.SelfAlias = "some_&alias"}, - new TLogger); - - TTestFetcher::TRequest request = rf.CreateRequest({{"some_header", "some_value"}}); - UNIT_ASSERT_VALUES_EQUAL( - "/v2/roles?self=some_%26alias", - request.Url); - UNIT_ASSERT_VALUES_EQUAL( - TKeepAliveHttpClient::THeaders({{"some_header", "some_value"}}), - request.Headers); - - UNIT_ASSERT_NO_EXCEPTION(rf.Update(NUtils::TFetchResult{.Code = HTTP_OK, .Response = ROLES})); - - request = rf.CreateRequest({{"some_header", "some_value"}}); - UNIT_ASSERT_VALUES_EQUAL( - "/v2/roles?self=some_%26alias", - request.Url); - UNIT_ASSERT_VALUES_EQUAL( - TKeepAliveHttpClient::THeaders({ - {"some_header", "some_value"}, - {"If-None-Match", R"("100501")"}, - }), - request.Headers); - } -} diff --git a/library/cpp/tvmauth/client/ut/settings_ut.cpp b/library/cpp/tvmauth/client/ut/settings_ut.cpp deleted file mode 100644 index 726beaf9284..00000000000 --- a/library/cpp/tvmauth/client/ut/settings_ut.cpp +++ /dev/null @@ -1,158 +0,0 @@ -#include "common.h" - -#include <library/cpp/tvmauth/client/misc/api/settings.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(ClientSettings) { -#if !defined(_win_) - Y_UNIT_TEST(CheckValid) { - struct TTestCase { - TString Name; - NTvmApi::TClientSettings Settings; - TString Err; - }; - std::vector<TTestCase> cases = { - TTestCase{ - .Name = "default", - .Settings = {}, - .Err = "Invalid settings: nothing to do", - }, - TTestCase{ - .Name = "only secret", - .Settings = { - .Secret = TStringBuf("foobar"), - }, - .Err = "Secret is present but destinations list is empty. It makes no sense", - }, - TTestCase{ - .Name = "only dsts", - .Settings = { - .FetchServiceTicketsForDsts = {42}, - }, - .Err = "SelfTvmId cannot be 0 if fetching of Service Tickets required", - }, - TTestCase{ - .Name = "dsts with selfTvmId", - .Settings = { - .SelfTvmId = 43, - .FetchServiceTicketsForDsts = {42}, - }, - .Err = "Secret is required for fetching of Service Tickets", - }, - TTestCase{ - .Name = "correct service tickets fetching", - .Settings = { - .SelfTvmId = 43, - .Secret = TStringBuf("foobar"), - .FetchServiceTicketsForDsts = {42}, - }, - .Err = "", - }, - TTestCase{ - .Name = "only check srv flag", - .Settings = { - .CheckServiceTickets = true, - }, - .Err = "SelfTvmId cannot be 0 if checking of Service Tickets required", - }, - TTestCase{ - .Name = "tirole without disk cache", - .Settings = { - .SelfTvmId = 43, - .Secret = TStringBuf("foobar"), - .FetchRolesForIdmSystemSlug = "kek", - }, - .Err = "Disk cache must be enabled to use roles: they can be heavy", - }, - }; - - for (const TTestCase& c : cases) { - if (c.Err) { - UNIT_ASSERT_EXCEPTION_CONTAINS_C( - c.Settings.CheckValid(), - TBrokenTvmClientSettings, - c.Err, - c.Name); - } else { - UNIT_ASSERT_NO_EXCEPTION_C(c.Settings.CheckValid(), c.Name); - } - } - - NTvmApi::TClientSettings s{.DiskCacheDir = "/impossible/dir"}; - UNIT_ASSERT_EXCEPTION(s.CheckValid(), TPermissionDenied); - } - - Y_UNIT_TEST(CloneNormalized) { - NTvmApi::TClientSettings original; - original.FetchServiceTicketsForDsts = {43}; - - UNIT_ASSERT_EXCEPTION_CONTAINS(original.CloneNormalized(), - TBrokenTvmClientSettings, - "SelfTvmId cannot be 0 if fetching of Service Tickets required"); - original.SelfTvmId = 15; - original.Secret = "bar"; - original.DiskCacheDir = "./"; - - NTvmApi::TClientSettings::TDstVector expected = {43}; - UNIT_ASSERT_VALUES_EQUAL(expected, original.CloneNormalized().FetchServiceTicketsForDsts); - - original.FetchServiceTicketsForDstsWithAliases = {{"foo", 42}}; - expected = {42, 43}; - UNIT_ASSERT_VALUES_EQUAL(expected, original.CloneNormalized().FetchServiceTicketsForDsts); - - original.FetchRolesForIdmSystemSlug = "kek"; - expected = {42, 43, 2028120}; - UNIT_ASSERT_VALUES_EQUAL(expected, original.CloneNormalized().FetchServiceTicketsForDsts); - - original.FetchServiceTicketsForDsts.push_back(2028120); - expected = {42, 43, 2028120}; - UNIT_ASSERT_VALUES_EQUAL(expected, original.CloneNormalized().FetchServiceTicketsForDsts); - } - - Y_UNIT_TEST(NeedServiceTicketsFetching) { - NTvmApi::TClientSettings s; - - UNIT_ASSERT(!s.NeedServiceTicketsFetching()); - - s.FetchServiceTicketsForDsts = {42}; - UNIT_ASSERT(s.NeedServiceTicketsFetching()); - s.FetchServiceTicketsForDsts.clear(); - - s.FetchServiceTicketsForDstsWithAliases = {{"foo", 42}}; - UNIT_ASSERT(s.NeedServiceTicketsFetching()); - s.FetchServiceTicketsForDstsWithAliases.clear(); - - s.FetchRolesForIdmSystemSlug = "bar"; - UNIT_ASSERT(s.NeedServiceTicketsFetching()); - s.FetchRolesForIdmSystemSlug.clear(); - } - - Y_UNIT_TEST(permitions) { - UNIT_ASSERT_EXCEPTION(NTvmApi::TClientSettings::CheckPermissions("/qwerty"), TPermissionDenied); - - const TString tmpDir = "./cache_dir"; - - NFs::RemoveRecursive(tmpDir); - NFs::MakeDirectory(tmpDir, NFs::FP_OWNER_WRITE | NFs::FP_GROUP_WRITE | NFs::FP_ALL_WRITE); - UNIT_ASSERT_EXCEPTION(NTvmApi::TClientSettings::CheckPermissions(tmpDir), TPermissionDenied); - - NFs::RemoveRecursive(tmpDir); - NFs::MakeDirectory(tmpDir, NFs::FP_OWNER_READ | NFs::FP_GROUP_READ | NFs::FP_ALL_READ); - UNIT_ASSERT_EXCEPTION(NTvmApi::TClientSettings::CheckPermissions(tmpDir), TPermissionDenied); - - NFs::RemoveRecursive(tmpDir); - NFs::MakeDirectory(tmpDir, NFs::FP_COMMON_FILE); - UNIT_ASSERT_NO_EXCEPTION(NTvmApi::TClientSettings::CheckPermissions(tmpDir)); - } -#endif - - Y_UNIT_TEST(Dst) { - UNIT_ASSERT_EXCEPTION_CONTAINS(NTvmApi::TClientSettings::TDst(0), yexception, "TvmId cannot be 0"); - UNIT_ASSERT_EXCEPTION_CONTAINS(NTvmApi::TClientSettings::TDstMap({{"blackbox", 0}}), - TBrokenTvmClientSettings, - "TvmId cannot be 0"); - } -} diff --git a/library/cpp/tvmauth/client/ut/src_checker_ut.cpp b/library/cpp/tvmauth/client/ut/src_checker_ut.cpp deleted file mode 100644 index e3a4e3888ae..00000000000 --- a/library/cpp/tvmauth/client/ut/src_checker_ut.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "common.h" - -#include <library/cpp/tvmauth/client/mocked_updater.h> -#include <library/cpp/tvmauth/client/misc/src_checker.h> -#include <library/cpp/tvmauth/client/misc/api/threaded_updater.h> - -#include <library/cpp/tvmauth/type.h> -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(SrcChecker) { - Y_UNIT_TEST(Check) { - NRoles::TRolesPtr roles = std::make_shared<NRoles::TRoles>( - NRoles::TRoles::TMeta{}, - NRoles::TRoles::TTvmConsumers{ - {12345, std::make_shared<NRoles::TConsumerRoles>( - THashMap<TString, NRoles::TEntitiesPtr>())}, - }, - NRoles::TRoles::TUserConsumers{}, - std::make_shared<TString>()); - - TAsyncUpdaterPtr u = new TMockedUpdater({.Roles = roles}); - auto r = u->GetRoles(); - UNIT_ASSERT_EXCEPTION_CONTAINS( - TSrcChecker::Check(NUnittest::CreateServiceTicket(ETicketStatus::Expired, 12345), r), - TIllegalUsage, - "Service ticket must be valid"); - - TCheckedServiceTicket ticket; - UNIT_ASSERT_NO_EXCEPTION( - ticket = TSrcChecker::Check(NUnittest::CreateServiceTicket(ETicketStatus::Ok, 12345), r)); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, ticket.GetStatus()); - - UNIT_ASSERT_NO_EXCEPTION( - ticket = TSrcChecker::Check(NUnittest::CreateServiceTicket(ETicketStatus::Ok, 9999), r)); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::NoRoles, ticket.GetStatus()); - } -} diff --git a/library/cpp/tvmauth/client/ut/tvmapi_updater_ut.cpp b/library/cpp/tvmauth/client/ut/tvmapi_updater_ut.cpp deleted file mode 100644 index ef1ebc8453f..00000000000 --- a/library/cpp/tvmauth/client/ut/tvmapi_updater_ut.cpp +++ /dev/null @@ -1,1326 +0,0 @@ -#include "common.h" - -#include <library/cpp/tvmauth/client/mocked_updater.h> -#include <library/cpp/tvmauth/client/misc/disk_cache.h> -#include <library/cpp/tvmauth/client/misc/api/threaded_updater.h> - -#include <library/cpp/testing/unittest/registar.h> -#include <library/cpp/testing/unittest/tests_data.h> - -#include <util/stream/file.h> -#include <util/string/subst.h> -#include <util/system/fs.h> - -#include <regex> - -using namespace NTvmAuth; -static const std::regex TIME_REGEX(R"(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d.\d{6}Z)"); - -Y_UNIT_TEST_SUITE(ApiUpdater) { - static const TString SRV_TICKET = "3:serv:CBAQ__________9_IgYIexCUkQY:GioCM49Ob6_f80y6FY0XBVN4hLXuMlFeyMvIMiDuQnZkbkLpRpQOuQo5YjWoBjM0Vf-XqOm8B7xtrvxSYHDD7Q4OatN2l-Iwg7i71lE3scUeD36x47st3nd0OThvtjrFx_D8mw_c0GT5KcniZlqq1SjhLyAk1b_zJsx8viRAhCU"; - static const TString TEST_TICKET = "3:user:CA0Q__________9_Gg4KAgh7EHsg0oXYzAQoAQ:FSADps3wNGm92Vyb1E9IVq5M6ZygdGdt1vafWWEhfDDeCLoVA-sJesxMl2pGW4OxJ8J1r_MfpG3ZoBk8rLVMHUFrPa6HheTbeXFAWl8quEniauXvKQe4VyrpA1SPgtRoFqi5upSDIJzEAe1YRJjq1EClQ_slMt8R0kA_JjKUX54"; - static const TString TVM_RESPONSE = - R"({ - "19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}, - "213" : { "ticket" : "service_ticket_2"}, - "234" : { "error" : "Dst is not found" }, - "185" : { "ticket" : "service_ticket_3"}, - "deprecated" : { "ticket" : "deprecated_ticket" } - })"; - - static const TString CACHE_DIR = "./tmp/"; - - static void CleanCache() { - NFs::RemoveRecursive(CACHE_DIR); - NFs::MakeDirectoryRecursive(CACHE_DIR); - } - - Y_UNIT_TEST(MockedUpdater) { - TMockedUpdater m; - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, m.GetStatus()); - UNIT_ASSERT(m.GetCachedServiceContext()->Check(SRV_TICKET)); - UNIT_ASSERT(m.GetCachedUserContext()->Check(TEST_TICKET)); - } - - Y_UNIT_TEST(Updater) { - NTvmApi::TClientSettings s{ - .DiskCacheDir = GetCachePath(), - .SelfTvmId = 100500, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - { - auto u = NTvmApi::TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus()); - } - - UNIT_ASSERT_C(l->Stream.Str().find("was successfully read") != TString::npos, l->Stream.Str()); - UNIT_ASSERT_C(l->Stream.Str().find("were successfully fetched") == TString::npos, l->Stream.Str()); - } - - Y_UNIT_TEST(Updater_badConfig) { - NTvmApi::TClientSettings s; - UNIT_ASSERT_EXCEPTION(NTvmApi::TThreadedUpdater::Create(s, TDevNullLogger::IAmBrave()), yexception); - s.SelfTvmId = 100500; - UNIT_ASSERT_EXCEPTION(NTvmApi::TThreadedUpdater::Create(s, TDevNullLogger::IAmBrave()), yexception); - s.DiskCacheDir = GetCachePath(); - UNIT_ASSERT_EXCEPTION(NTvmApi::TThreadedUpdater::Create(s, TDevNullLogger::IAmBrave()), yexception); - } - - class TOfflineUpdater: public NTvmApi::TThreadedUpdater { - bool Enabled_; - TString PublicKeys_; - - public: - TOfflineUpdater(const NTvmApi::TClientSettings& settings, - TIntrusivePtr<TLogger> l, - bool enabled = false, - TString keys = NUnittest::TVMKNIFE_PUBLIC_KEYS) - : NTvmApi::TThreadedUpdater(settings, l) - , Enabled_(enabled) - , PublicKeys_(keys) - { - Init(); - StartWorker(); - } - - NUtils::TFetchResult FetchServiceTicketsFromHttp(const TString&) const override { - if (!Enabled_) { - throw yexception() << "alarm"; - } - return {200, {}, "/2/ticket", TVM_RESPONSE, ""}; - } - - NUtils::TFetchResult FetchPublicKeysFromHttp() const override { - if (!Enabled_) { - throw yexception() << "alarm"; - } - return {200, {}, "/2/keys", PublicKeys_, ""}; - } - }; - - Y_UNIT_TEST(StartWithoutCache) { - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"kolmo", 213}}, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - UNIT_ASSERT_EXCEPTION_CONTAINS(TOfflineUpdater(s, l), - TRetriableException, - "Failed to start TvmClient. You can retry:"); - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: Disk cache disabled. Please set disk cache directory in settings for best reliability\n" - << "4: Failed to get ServiceTickets: alarm\n" - << "4: Failed to get ServiceTickets: alarm\n" - << "4: Failed to get ServiceTickets: alarm\n" - << "4: Failed to update service tickets: alarm\n" - << "3: Service tickets have not been refreshed for too long period\n", - l->Stream.Str()); - } - - static void WriteFile(TString name, TStringBuf body, TInstant time) { - NFs::Remove(CACHE_DIR + name); - TFileOutput f(CACHE_DIR + name); - f << TDiskWriter::PrepareData(time, body); - } - - Y_UNIT_TEST(StartWithOldCache) { - CleanCache(); - WriteFile("./public_keys", - NUnittest::TVMKNIFE_PUBLIC_KEYS, - TInstant::Now() - TDuration::Days(30)); // too old - WriteFile("./service_tickets", - R"({"19":{"ticket":"3:serv:CBAQACIGCJSRBhAL:Fi"}})" - "\t100500", - TInstant::Now()); // too old - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"kolmo", 213}}, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater u(s, l, true); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - - UNIT_ASSERT_C(l->Stream.Str().find("Disk cache (public keys) is too old") != TString::npos, l->Stream.Str()); - UNIT_ASSERT_C(l->Stream.Str().find("Disk cache (service tickets) is too old") != TString::npos, l->Stream.Str()); - UNIT_ASSERT_C(l->Stream.Str().find("were successfully fetched") != TString::npos, l->Stream.Str()); - } - - Y_UNIT_TEST(StartWithMissingCache) { - NTvmApi::TClientSettings s{ - .DiskCacheDir = "../", - .SelfTvmId = 100500, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - UNIT_ASSERT_EXCEPTION_CONTAINS(TOfflineUpdater(s, l), - TRetriableException, - "Failed to start TvmClient. You can retry: "); - - UNIT_ASSERT_C(l->Stream.Str().find("does not exist") != TString::npos, l->Stream.Str()); - UNIT_ASSERT_C(l->Stream.Str().find("were successfully fetched") == TString::npos, l->Stream.Str()); - } - - Y_UNIT_TEST(StartWithBadCache_Tickets) { - CleanCache(); - WriteFile("./service_tickets", - TVM_RESPONSE, - TInstant::Now()); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"kolmo", 213}}, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater u(s, l, true); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "4: Failed to read service tickets from disk: YYYYYYYYYYYYYYY\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" - << "6: Cache was updated with 2 service ticket(s): XXXXXXXXXXX\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - std::regex_replace(std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX"), - std::regex(R"(Failed to read service tickets from disk: [^\n]+)"), - "Failed to read service tickets from disk: YYYYYYYYYYYYYYY")); - } - - Y_UNIT_TEST(StartWithBadCache_PublicKeys) { - CleanCache(); - WriteFile("./public_keys", - "ksjdafnlskdjzfgbhdl", - TInstant::Now()); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - UNIT_ASSERT_EXCEPTION_CONTAINS(TOfflineUpdater(s, l), - TRetriableException, - "Failed to start TvmClient. You can retry:"); - - UNIT_ASSERT_C(l->Stream.Str().find("4: Failed to read public keys from disk: Malformed TVM keys") != TString::npos, l->Stream.Str()); - } - - Y_UNIT_TEST(StartWithCacheForAnotherTvmId) { - CleanCache(); - WriteFile("./service_tickets", - TVM_RESPONSE + "\t" + "100499", - TInstant::Now()); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"kolmo", 213}}, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater u(s, l, true); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "4: Disk cache is for another tvmId (100499). Self=100500\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" - << "6: Cache was updated with 2 service ticket(s): XXXXXXXXXXX\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - } - - Y_UNIT_TEST(StartWithCacheForAnotherDsts) { - CleanCache(); - TInstant now = TInstant::Now(); - WriteFile("./service_tickets", - R"({"213" : { "ticket" : "3:serv:CBAQ__________9_IgYIlJEGEAs:T-"}})" - "\t" - "100500", - now); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"kolmo", 213}}, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater u(s, l, true); - auto cache = u.GetCachedServiceTickets(); - UNIT_ASSERT(cache->TicketsById.contains(213)); - UNIT_ASSERT(cache->TicketsById.contains(19)); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Response with service tickets for 1 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 1 destination(s)\n" - << "6: Cache was partly updated with 1 service ticket(s). total: 2\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - l->Stream.Str()); - l->Stream.Clear(); - - { - TOfflineUpdater u(s, l, true); - auto cache = u.GetCachedServiceTickets(); - UNIT_ASSERT(cache->TicketsById.contains(213)); - UNIT_ASSERT(cache->TicketsById.contains(19)); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "4: tvm_id in cache is not integer: deprecated\n" - << "6: Got 3 service ticket(s) from disk\n" - << "6: Cache was updated with 2 service ticket(s): XXXXXXXXXXX\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - } - - Y_UNIT_TEST(StartWithNotFreshCacheForAnotherDsts) { - CleanCache(); - TInstant now = TInstant::Now(); - WriteFile("./service_tickets", - R"({"213" : { "ticket" : "3:serv:CBAQ__________9_IgYIlJEGEAs:T-"}})" - "\t" - "100500", - now - TDuration::Hours(2)); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"kolmo", 213}}, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater u(s, l, true); - auto cache = u.GetCachedServiceTickets(); - UNIT_ASSERT(cache->TicketsById.contains(213)); - UNIT_ASSERT(cache->TicketsById.contains(19)); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): XXXXXXXXXXX\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" - << "6: Cache was updated with 2 service ticket(s): XXXXXXXXXXX\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - l->Stream.Clear(); - - { - TOfflineUpdater u(s, l, true); - auto cache = u.GetCachedServiceTickets(); - UNIT_ASSERT(cache->TicketsById.contains(213)); - UNIT_ASSERT(cache->TicketsById.contains(19)); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "4: tvm_id in cache is not integer: deprecated\n" - << "6: Got 3 service ticket(s) from disk\n" - << "6: Cache was updated with 2 service ticket(s): XXXXXXXXXXX\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - } - - Y_UNIT_TEST(StartWithPartialDiskCache) { - CleanCache(); - WriteFile("./public_keys", - NUnittest::TVMKNIFE_PUBLIC_KEYS, - TInstant::Now()); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"kolmo", 213}}, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater u(s, l, true); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: File './tmp/service_tickets' does not exist\n" - << "6: File './tmp/public_keys' was successfully read\n" - << "6: Cache was updated with public keys: XXXXXXXXXXX\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" - << "6: Cache was updated with 2 service ticket(s): XXXXXXXXXXX\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - } - - Y_UNIT_TEST(StartFromHttpAndRestartFromDisk) { - CleanCache(); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - .CheckServiceTickets = true, - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Test, - }; - - { - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater u(s, l, true); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: File './tmp/service_tickets' does not exist\n" - << "7: File './tmp/public_keys' does not exist\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Response with service tickets for 1 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 1 destination(s)\n" - << "6: Cache was updated with 1 service ticket(s): XXXXXXXXXXX\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Public keys were successfully fetched from https://tvm-api.yandex.net\n" - << "6: Cache was updated with public keys: XXXXXXXXXXX\n" - << "6: File './tmp/public_keys' was successfully written\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - } - - { - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater u(s, l, true); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "4: tvm_id in cache is not integer: deprecated\n" - << "6: Got 3 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): XXXXXXXXXXX\n" - << "6: File './tmp/public_keys' was successfully read\n" - << "6: Cache was updated with public keys: XXXXXXXXXXX\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - } - } - - class TUnstableUpdater: public NTvmApi::TThreadedUpdater { - mutable int V1_ = 0; - mutable int V2_ = 0; - - public: - TUnstableUpdater(const NTvmApi::TClientSettings& settings, TIntrusivePtr<TLogger> l) - : NTvmApi::TThreadedUpdater(settings, l) - { - UNIT_ASSERT_NO_EXCEPTION_C(Init(), l->Stream.Str()); - ExpBackoff_.SetEnabled(false); - StartWorker(); - - UNIT_ASSERT_VALUES_EQUAL_C(TClientStatus::Ok, GetStatus(), l->Stream.Str()); - - Sleep(TDuration::MicroSeconds(100)); - PublicKeysDurations_.Expiring = TDuration::MicroSeconds(100); - UNIT_ASSERT_VALUES_EQUAL_C(TClientStatus(TClientStatus::Warning, "Internal client error: failed to collect last useful error message, please report this message to tvm-dev@yandex-team.ru"), - GetStatus(), - l->Stream.Str()); - - PublicKeysDurations_.Invalid = TDuration::MicroSeconds(20); - UNIT_ASSERT_VALUES_EQUAL_C(TClientStatus::Error, GetStatus(), l->Stream.Str()); - - PublicKeysDurations_.Expiring = TDuration::Seconds(100); - PublicKeysDurations_.Invalid = TDuration::Seconds(200); - UNIT_ASSERT_VALUES_EQUAL_C(TClientStatus::Ok, GetStatus(), l->Stream.Str()); - - ServiceTicketsDurations_.Expiring = TDuration::MicroSeconds(100); - UNIT_ASSERT_VALUES_EQUAL_C(TClientStatus::Warning, GetStatus(), l->Stream.Str()); - - ServiceTicketsDurations_.Invalid = TDuration::MicroSeconds(20); - UNIT_ASSERT_VALUES_EQUAL_C(TClientStatus::Warning, GetStatus(), l->Stream.Str()); - - const TInstant* inv = &GetCachedServiceTickets()->InvalidationTime; - *const_cast<TInstant*>(inv) = TInstant::Now() + TDuration::Seconds(30); - UNIT_ASSERT_VALUES_EQUAL_C(TClientStatus::Error, GetStatus(), l->Stream.Str()); - } - - NUtils::TFetchResult FetchServiceTicketsFromHttp(const TString&) const override { - Y_ENSURE_EX(++V1_ > 1, yexception() << "++v1_ > 1:" << V1_); - return {200, {}, "/2/ticket", TVM_RESPONSE, ""}; - } - - NUtils::TFetchResult FetchPublicKeysFromHttp() const override { - Y_ENSURE_EX(++V2_ > 2, yexception() << "++v2_ > 2:" << V2_); - return {200, {}, "/2/keys", NUnittest::TVMKNIFE_PUBLIC_KEYS, ""}; - } - }; - - Y_UNIT_TEST(StartFromUnstableHttp) { - CleanCache(); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - .CheckServiceTickets = true, - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Test, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TUnstableUpdater u(s, l); - } - - UNIT_ASSERT_C(l->Stream.Str().Contains("++v1_ > 1"), l->Stream.Str()); - UNIT_ASSERT_C(l->Stream.Str().Contains("++v2_ > 2"), l->Stream.Str()); - UNIT_ASSERT_C(l->Stream.Str().Contains("7: Response with service tickets for 1 destination(s) was successfully fetched from https://tvm-api.yandex.net"), l->Stream.Str()); - UNIT_ASSERT_C(l->Stream.Str().Contains("7: Public keys were successfully fetched"), l->Stream.Str()); - } - - Y_UNIT_TEST(GetUpdateTimeOfServiceTickets) { - CleanCache(); - TInstant ins = TInstant::Now(); - WriteFile("./service_tickets", - TVM_RESPONSE + "\t" + "100500", - ins); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - }; - - auto l = MakeIntrusive<TLogger>(); - TOfflineUpdater u(s, l, true); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(TInstant(), u.GetUpdateTimeOfPublicKeys()); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(ins.Seconds()), u.GetUpdateTimeOfServiceTickets()); - } - - class TSignalingUpdater: public NTvmApi::TThreadedUpdater { - mutable int V_ = 0; - TAutoEvent& Ev_; - const TStringBuf PublicKeys_; - - public: - TSignalingUpdater(const NTvmApi::TClientSettings& settings, - TLoggerPtr l, - TAutoEvent& ev, - const TStringBuf keys = NUnittest::TVMKNIFE_PUBLIC_KEYS) - : NTvmApi::TThreadedUpdater(settings, l) - , Ev_(ev) - , PublicKeys_(keys) - { - WorkerAwakingPeriod_ = TDuration::MilliSeconds(300); - PublicKeysDurations_.RefreshPeriod = TDuration::MilliSeconds(700); - Init(); - ExpBackoff_.SetEnabled(false); - StartWorker(); - } - - NUtils::TFetchResult FetchPublicKeysFromHttp() const override { - if (++V_ >= 2) { - Ev_.Signal(); - } - return {200, {}, "/2/keys", TString(PublicKeys_), ""}; - } - }; - - Y_UNIT_TEST(StartWorker) { - class TSignalingUpdater: public NTvmApi::TThreadedUpdater { - mutable int V_ = 0; - TAutoEvent& Ev_; - - public: - TSignalingUpdater(const NTvmApi::TClientSettings& settings, TLoggerPtr l, TAutoEvent& ev) - : NTvmApi::TThreadedUpdater(settings, l) - , Ev_(ev) - { - WorkerAwakingPeriod_ = TDuration::MilliSeconds(300); - PublicKeysDurations_.RefreshPeriod = TDuration::MilliSeconds(700); - Init(); - ExpBackoff_.SetEnabled(false); - StartWorker(); - } - - void Worker() override { - NTvmApi::TThreadedUpdater::Worker(); - Ev_.Signal(); - } - - NUtils::TFetchResult FetchPublicKeysFromHttp() const override { - if (++V_ < 4) { - return {500, {}, "/2/keys", "lol", ""}; - } - return {200, {}, "/2/keys", NUnittest::TVMKNIFE_PUBLIC_KEYS, "CAEQChkAAAAAAAD4PyGamZmZmZm5PyhkMAE4B0BGSAI"}; - } - }; - - CleanCache(); - TInstant expiringPubKeys = TInstant::Now() - TDuration::Days(3); - WriteFile("./public_keys", NUnittest::TVMKNIFE_PUBLIC_KEYS, expiringPubKeys); - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - TAutoEvent ev; - { - TSignalingUpdater u(s, l, ev); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus(TClientStatus::Warning, "PublicKeys: Path:/2/keys.Code=500: lol"), - u.GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(expiringPubKeys.Seconds()), u.GetUpdateTimeOfPublicKeys()); - UNIT_ASSERT_VALUES_EQUAL(TInstant(), u.GetUpdateTimeOfServiceTickets()); - - UNIT_ASSERT(ev.WaitT(TDuration::Seconds(15))); - Sleep(TDuration::MilliSeconds(500)); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/public_keys' was successfully read\n" - << "6: Cache was updated with public keys: XXXXXXXXXXX\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "4: Failed to get PublicKeys: Path:/2/keys.Code=500: lol\n" - << "4: Failed to get PublicKeys: Path:/2/keys.Code=500: lol\n" - << "4: Failed to get PublicKeys: Path:/2/keys.Code=500: lol\n" - << "4: Failed to update public keys: Path:/2/keys.Code=500: lol\n" - << "3: Public keys have not been refreshed for too long period\n" - << "7: Thread-worker started\n" - << "7: Retry settings were updated: exponential_backoff_min:0.000000s->1.000000s;exponential_backoff_max:60.000000s->10.000000s;exponential_backoff_factor:2->1.5;exponential_backoff_jitter:0.5->0.1;max_random_sleep_default:5.000000s->0.100000s;retries_on_start:3->1;worker_awaking_period:10.000000s->7.000000s;dsts_limit:300->70;\n" - << "6: File './tmp/retry_settings' was successfully written\n" - << "7: Public keys were successfully fetched from https://tvm-api.yandex.net\n" - << "6: Cache was updated with public keys: XXXXXXXXXXX\n" - << "6: File './tmp/public_keys' was successfully written\n" - << "7: Thread-worker stopped\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - } - -#if defined(_unix_) - Y_UNIT_TEST(StartFromCacheAndBadPublicKeysFromHttp) { - CleanCache(); - TInstant now = TInstant::Now(); - WriteFile("public_keys", NUnittest::TVMKNIFE_PUBLIC_KEYS, now - TDuration::Days(3)); // expiring public keys - - NTvmApi::TClientSettings s{ - .DiskCacheDir = CACHE_DIR, - .SelfTvmId = 100500, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TAutoEvent ev; - TSignalingUpdater u(s, l, ev, "malformed keys"); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus(TClientStatus::Warning, "PublicKeys: Malformed TVM keys"), - u.GetStatus()); - - UNIT_ASSERT(ev.WaitT(TDuration::Seconds(15))); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Warning, u.GetStatus()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/public_keys' was successfully read\n" - << "6: Cache was updated with public keys: " << TInstant::Seconds((now - TDuration::Days(3)).Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Public keys were successfully fetched from https://tvm-api.yandex.net\n" - << "4: Failed to update public keys: Malformed TVM keys\n" - << "3: Public keys have not been refreshed for too long period\n" - << "7: Thread-worker started\n" - << "7: Public keys were successfully fetched from https://tvm-api.yandex.net\n" - << "4: Failed to update public keys: Malformed TVM keys\n" - << "3: Public keys have not been refreshed for too long period\n" - << "7: Thread-worker stopped\n", - l->Stream.Str()); - } -#endif - - Y_UNIT_TEST(StartWithBadPublicKeysFromHttp) { - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - TAutoEvent ev; - UNIT_ASSERT_EXCEPTION_CONTAINS(TOfflineUpdater(s, l, true, "some public keys"), - TRetriableException, - "Failed to start TvmClient. You can retry:"); - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: Disk cache disabled. Please set disk cache directory in settings for best reliability\n" - << "7: Public keys were successfully fetched from https://tvm-api.yandex.net\n" - << "4: Failed to update public keys: Malformed TVM keys\n" - << "3: Public keys have not been refreshed for too long period\n", - l->Stream.Str()); - } - - class TNotInitedUpdater: public NTvmApi::TThreadedUpdater { - public: - TNotInitedUpdater(const NTvmApi::TClientSettings& settings, TLoggerPtr l = TDevNullLogger::IAmBrave()) - : NTvmApi::TThreadedUpdater(settings, l) - { - this->ExpBackoff_.SetEnabled(false); - } - - using NTvmApi::TThreadedUpdater::AppendToJsonArray; - using NTvmApi::TThreadedUpdater::AreServicesTicketsOk; - using NTvmApi::TThreadedUpdater::CreateJsonArray; - using NTvmApi::TThreadedUpdater::FindMissingDsts; - using NTvmApi::TThreadedUpdater::GetPublicKeysFromHttp; - using NTvmApi::TThreadedUpdater::GetServiceTicketsFromHttp; - using NTvmApi::TThreadedUpdater::Init; - using NTvmApi::TThreadedUpdater::IsServiceContextOk; - using NTvmApi::TThreadedUpdater::IsTimeToUpdatePublicKeys; - using NTvmApi::TThreadedUpdater::IsTimeToUpdateServiceTickets; - using NTvmApi::TThreadedUpdater::IsUserContextOk; - using NTvmApi::TThreadedUpdater::ParseTicketsFromDisk; - using NTvmApi::TThreadedUpdater::ParseTicketsFromResponse; - using NTvmApi::TThreadedUpdater::PrepareRequestForServiceTickets; - using NTvmApi::TThreadedUpdater::PrepareTicketsForDisk; - using NTvmApi::TThreadedUpdater::SetServiceContext; - using NTvmApi::TThreadedUpdater::SetServiceTickets; - using NTvmApi::TThreadedUpdater::SetUserContext; - using NTvmApi::TThreadedUpdater::THttpResult; - using NTvmApi::TThreadedUpdater::TPairTicketsErrors; - using TAsyncUpdaterBase::IsServiceTicketMapOk; - }; - - Y_UNIT_TEST(IsCacheComplete_Empty) { - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"blackbox2", 20}}, - .CheckServiceTickets = true, - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Test, - }; - - TNotInitedUpdater u(s); - UNIT_ASSERT(!u.AreServicesTicketsOk()); - } - - Y_UNIT_TEST(IsCacheComplete_Tickets) { - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"blackbox2", 20}}, - }; - - TNotInitedUpdater u(s); - UNIT_ASSERT(!u.AreServicesTicketsOk()); - - u.SetServiceTickets(MakeIntrusiveConst<TServiceTickets>( - TServiceTickets::TMapIdStr({{1, "mega_ticket"}}), - TServiceTickets::TMapIdStr({{2, "mega_error"}}), - TServiceTickets::TMapAliasId())); - UNIT_ASSERT(!u.AreServicesTicketsOk()); - - u.SetServiceTickets(MakeIntrusiveConst<TServiceTickets>( - TServiceTickets::TMapIdStr({ - {1, "mega_ticket"}, - {2, "mega_ticket2"}, - }), - TServiceTickets::TMapIdStr({ - {3, "mega_error3"}, - }), - TServiceTickets::TMapAliasId())); - UNIT_ASSERT(u.AreServicesTicketsOk()); - } - - Y_UNIT_TEST(IsCacheComplete_Service) { - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .CheckServiceTickets = true, - }; - - TNotInitedUpdater u(s); - UNIT_ASSERT(!u.IsServiceContextOk()); - - u.SetServiceContext(MakeIntrusiveConst<TServiceContext>( - TServiceContext::CheckingFactory(100500, NUnittest::TVMKNIFE_PUBLIC_KEYS))); - UNIT_ASSERT(u.IsServiceContextOk()); - } - - Y_UNIT_TEST(IsCacheComplete_User) { - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Test, - }; - - TNotInitedUpdater u(s); - UNIT_ASSERT(!u.IsUserContextOk()); - - u.SetUserContext(NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT(u.IsUserContextOk()); - } - - Y_UNIT_TEST(TicketsOnDisk) { - TString res = R"({ - "19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}, - "213" : { "ticket" : "service_ticket_2"}, - "234" : { "error" : "Dst is not found" }, - "185" : { "ticket" : "service_ticket_3"}, - "deprecated" : { "ticket" : "deprecated_ticket" } - })"; - res.append("\t100500"); - - UNIT_ASSERT_VALUES_EQUAL(res, TNotInitedUpdater::PrepareTicketsForDisk(TVM_RESPONSE, 100500)); - - auto pair = TNotInitedUpdater::ParseTicketsFromDisk(res); - UNIT_ASSERT_VALUES_EQUAL(pair.first, TVM_RESPONSE); - UNIT_ASSERT_VALUES_EQUAL(pair.second, 100500); - - res.push_back('a'); - UNIT_ASSERT_EXCEPTION(TNotInitedUpdater::ParseTicketsFromDisk(res), yexception); - } - - Y_UNIT_TEST(IsTimeToUpdatePublicKeys) { - NTvmApi::TClientSettings s{ - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Test, - }; - - TNotInitedUpdater u(s); - - UNIT_ASSERT(!u.IsTimeToUpdatePublicKeys(TInstant::Now())); - UNIT_ASSERT(!u.IsTimeToUpdatePublicKeys(TInstant::Now() - TDuration::Hours(23))); - UNIT_ASSERT(u.IsTimeToUpdatePublicKeys(TInstant::Now() - TDuration::Days(1) - TDuration::MilliSeconds(1))); - } - - Y_UNIT_TEST(IsTimeToUpdateServiceTickets) { - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"blackbox2", 20}}, - }; - - TNotInitedUpdater u(s); - - UNIT_ASSERT(!u.IsTimeToUpdateServiceTickets(TInstant::Now() - TDuration::Minutes(59))); - UNIT_ASSERT(u.IsTimeToUpdateServiceTickets(TInstant::Now() - TDuration::Hours(1) - TDuration::MilliSeconds(1))); - } - - Y_UNIT_TEST(StartWithIncompliteCache) { - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}, {"blackbox2", 20}}, - .CheckServiceTickets = true, - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Test, - }; - - auto l = MakeIntrusive<TLogger>(); - UNIT_ASSERT_EXCEPTION_CONTAINS(TOfflineUpdater(s, l, true), - TNonRetriableException, - "Failed to get ServiceTicket for 20: Missing tvm_id in response, should never happend: 20"); - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: Disk cache disabled. Please set disk cache directory in settings for best reliability\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" - << "3: Failed to get service ticket for dst=20: Missing tvm_id in response, should never happend: 20\n" - << "6: Cache was updated with 1 service ticket(s): XXXXXXXXXXX\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - } - - Y_UNIT_TEST(PrepareRequestForServiceTickets) { - const TServiceContext ctx = TServiceContext::SigningFactory("AAAAAAAAAAAAAAAAAAAAAA"); - - TString s = TNotInitedUpdater::PrepareRequestForServiceTickets(117, - ctx, - {19, 20}, - NUtils::TProcInfo{ - "__some_pid__", - "__some_pname__", - "kar", - }, - 100700); - SubstGlobal(s.resize(s.size() - 5), "deb_", ""); - UNIT_ASSERT_VALUES_EQUAL("grant_type=client_credentials&src=117&dst=19,20&ts=100700&sign=XTz2Obd6PII_BHxswzWPJTjju9SrKsN6hyu1VsyxBvU&get_retry_settings=yes&_pid=__some_pid__&_procces_name=__some_pname__&lib_version=client_kar", - s); - - s = TNotInitedUpdater::PrepareRequestForServiceTickets(118, - ctx, - {19}, - NUtils::TProcInfo{ - "__some_pid__", - {}, - "kva_", - }, - 100900); - SubstGlobal(s.resize(s.size() - 5), "deb_", ""); - UNIT_ASSERT_VALUES_EQUAL("grant_type=client_credentials&src=118&dst=19&ts=100900&sign=-trBo9AtBLjp2ihy6cFAdMAQ6S9afHj23rFzYQ32jkQ&get_retry_settings=yes&_pid=__some_pid__&lib_version=client_kva_", - s); - } - - Y_UNIT_TEST(ParseTicketsFromResponse) { - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - TNotInitedUpdater u(s, l); - - TNotInitedUpdater::TPairTicketsErrors t; - UNIT_ASSERT_EXCEPTION_CONTAINS(u.ParseTicketsFromResponse("{", NTvmApi::TDstSet{19}, t), - yexception, - "Invalid json from tvm-api"); - - t = {}; - u.ParseTicketsFromResponse(TVM_RESPONSE, NTvmApi::TDstSet{19}, t); - - TNotInitedUpdater::TPairTicketsErrors expected{{{19, "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}}, {}}; - UNIT_ASSERT_VALUES_EQUAL("6: Disk cache disabled. Please set disk cache directory in settings for best reliability\n", - l->Stream.Str()); - UNIT_ASSERT_EQUAL(expected, t); - - t = {}; - u.ParseTicketsFromResponse(TVM_RESPONSE, - NTvmApi::TDstSet{19, 213, 234, 235}, - t); - expected = {{{19, "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}, - {213, "service_ticket_2"}}, - {{234, "Dst is not found"}, - {235, "Missing tvm_id in response, should never happend: 235"}}}; - UNIT_ASSERT_EQUAL(expected, t); - UNIT_ASSERT_VALUES_EQUAL("6: Disk cache disabled. Please set disk cache directory in settings for best reliability\n", - l->Stream.Str()); - - t = {}; - u.ParseTicketsFromResponse( - R"([ - {"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"},"234" : { "error" : "Dst is not found" }}, - {"213" : { "ticket" : "service_ticket_2"},"185" : { "ticket" : "service_ticket_3"}}, - {"deprecated" : { "ticket" : "deprecated_ticket" }} - ])", - NTvmApi::TDstSet{19, 213, 234, 235}, - t); - expected = {{{19, "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}, - {213, "service_ticket_2"}}, - {{234, "Dst is not found"}, - {235, "Missing tvm_id in response, should never happend: 235"}}}; - UNIT_ASSERT_EQUAL(expected, t); - UNIT_ASSERT_VALUES_EQUAL("6: Disk cache disabled. Please set disk cache directory in settings for best reliability\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(ParseTicketsFromResponseAsArray) { - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .CheckServiceTickets = true, - }; - - auto l = MakeIntrusive<TLogger>(); - TNotInitedUpdater u(s, l); - - TNotInitedUpdater::TPairTicketsErrors t; - UNIT_ASSERT_EXCEPTION_CONTAINS(u.ParseTicketsFromResponse("[", NTvmApi::TDstSet{19}, t), - yexception, - "Invalid json from tvm-api"); - - u.ParseTicketsFromResponse(R"([])", NTvmApi::TDstSet{19}, t); - UNIT_ASSERT_VALUES_EQUAL("6: Disk cache disabled. Please set disk cache directory in settings for best reliability\n", - l->Stream.Str()); - TNotInitedUpdater::TPairTicketsErrors expected = { - {}, {{19, "Missing tvm_id in response, should never happend: 19"}}}; - UNIT_ASSERT_VALUES_EQUAL(expected, t); - l->Stream.Clear(); - - t = {}; - u.ParseTicketsFromResponse( - R"([{},{"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}}, {"213" : { "ticket" : "service_ticket_2"}}])", - NTvmApi::TDstSet{19}, - t); - UNIT_ASSERT_VALUES_EQUAL("", l->Stream.Str()); - expected = {{{19, "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}}, {}}; - UNIT_ASSERT_EQUAL(expected, t); - - t = {}; - u.ParseTicketsFromResponse( - R"([{ - "19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"} - }, - { - "213" : { "ticket" : "service_ticket_2"}, - "234" : { "error" : "Dst is not found" } - }, - { - "185" : { "ticket" : "service_ticket_3"}, - "deprecated" : { "ticket" : "deprecated_ticket" } - } - ])", - NTvmApi::TDstSet{19, 213, 234, 235}, - t); - expected = {{{19, "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}, - {213, "service_ticket_2"}}, - {{234, "Dst is not found"}, - {235, "Missing tvm_id in response, should never happend: 235"}}}; - UNIT_ASSERT_EQUAL(expected, t); - UNIT_ASSERT_VALUES_EQUAL("", l->Stream.Str()); - } - - class TReplier: public TRequestReplier { - public: - HttpCodes Code = HTTP_OK; - - bool DoReply(const TReplyParams& params) override { - TParsedHttpFull fl(params.Input.FirstLine()); - - THttpResponse resp(Code); - if (fl.Path == "/2/keys") { - resp.SetContent(NUnittest::TVMKNIFE_PUBLIC_KEYS); - } else if (fl.Path == "/2/ticket") { - resp.SetContent(TVM_RESPONSE); - } else { - UNIT_ASSERT(false); - } - resp.OutTo(params.Output); - - return true; - } - }; - - class TOnlineUpdater: public NTvmApi::TThreadedUpdater { - public: - TOnlineUpdater(const NTvmApi::TClientSettings& settings, TIntrusivePtr<TLogger> l) - : NTvmApi::TThreadedUpdater(settings, l) - { - Init(); - ExpBackoff_.SetEnabled(false); - StartWorker(); - } - }; - - Y_UNIT_TEST(MocServerOk) { - TPortManager pm; - ui16 tvmPort = pm.GetPort(80); - NMock::TMockServer server(tvmPort, []() { return new TReplier; }); - - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - .CheckServiceTickets = true, - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Test, - .TvmHost = "http://localhost", - .TvmPort = tvmPort, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TOnlineUpdater u(s, l); - UNIT_ASSERT_VALUES_EQUAL_C(TClientStatus::Ok, u.GetStatus(), l->Stream.Str()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: Disk cache disabled. Please set disk cache directory in settings for best reliability\n" - << "7: Response with service tickets for 1 destination(s) was successfully fetched from http://localhost\n" - << "7: Got responses with service tickets with 1 pages for 1 destination(s)\n" - << "6: Cache was updated with 1 service ticket(s): XXXXXXXXXXX\n" - << "7: Public keys were successfully fetched from http://localhost\n" - << "6: Cache was updated with public keys: XXXXXXXXXXX\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - } - - Y_UNIT_TEST(MocServerBad) { - TPortManager pm; - ui16 tvmPort = pm.GetPort(80); - NMock::TMockServer server(tvmPort, - []() { - auto p = new TReplier; - p->Code = HTTP_BAD_REQUEST; - return p; - }); - - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDstsWithAliases = {{"blackbox", 19}}, - .CheckServiceTickets = true, - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Test, - .TvmHost = "http://localhost", - .TvmPort = tvmPort, - }; - - auto l = MakeIntrusive<TLogger>(); - UNIT_ASSERT_EXCEPTION_CONTAINS_C(TOnlineUpdater(s, l), - TNonRetriableException, - "Failed to start TvmClient. Do not retry: ServiceTickets: Path:/2/ticket.Code=400:", - l->Stream.Str()); - } - - Y_UNIT_TEST(MocServerPaginated) { - class TReplier: public TRequestReplier { - public: - TString Response; - TReplier(TString response) - : Response(response) - { - } - - bool DoReply(const TReplyParams& params) override { - TParsedHttpFull fl(params.Input.FirstLine()); - if (fl.Path != "/2/ticket") { - UNIT_ASSERT_C(false, fl.Path); - } - - THttpResponse resp(HTTP_OK); - resp.SetContent(Response); - resp.OutTo(params.Output); - return true; - } - }; - - TPortManager pm; - ui16 tvmPort = pm.GetPort(80); - TVector<TString> responses = { - R"({"15" : { "ticket" : "service_ticket_3" },"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})", - R"({"222" : { "ticket" : "service_ticket_2"}, "239" : { "error" : "Dst is not found" }})", - R"({"185" : { "ticket" : "service_ticket_3"}})", - }; - NMock::TMockServer server(tvmPort, [&responses]() { - if (responses.empty()) { - return new TReplier("<NULL>"); - } - TString r = responses.front(); - responses.erase(responses.begin()); - return new TReplier(r); - }); - - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .Secret = (TStringBuf) "qwerty", - .FetchServiceTicketsForDsts = {19, 222, 239, 100500, 15}, - .CheckServiceTickets = true, - .CheckUserTicketsWithBbEnv = EBlackboxEnv::Test, - .TvmHost = "http://localhost", - .TvmPort = tvmPort, - }; - - auto l = MakeIntrusive<TLogger>(); - { - TNotInitedUpdater u(s, l); - TNotInitedUpdater::THttpResult result = u.GetServiceTicketsFromHttp(NTvmApi::TDstSet{19, 222, 239, 100500, 15}, 2); - UNIT_ASSERT_VALUES_EQUAL(TSmallVec<TString>({ - R"({"15" : { "ticket" : "service_ticket_3" },"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})", - R"({"222" : { "ticket" : "service_ticket_2"}, "239" : { "error" : "Dst is not found" }})", - R"({"185" : { "ticket" : "service_ticket_3"}})", - }), - result.Responses); - TNotInitedUpdater::TPairTicketsErrors expected{ - { - {19, "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}, - {222, "service_ticket_2"}, - {15, "service_ticket_3"}, - }, - { - {239, "Dst is not found"}, - {100500, "Missing tvm_id in response, should never happend: 100500"}, - }, - }; - UNIT_ASSERT_VALUES_EQUAL(expected, result.TicketsWithErrors); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: Disk cache disabled. Please set disk cache directory in settings for best reliability\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from http://localhost\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from http://localhost\n" - << "7: Response with service tickets for 1 destination(s) was successfully fetched from http://localhost\n" - << "7: Got responses with service tickets with 3 pages for 5 destination(s)\n" - << "3: Failed to get service ticket for dst=100500: Missing tvm_id in response, should never happend: 100500\n" - << "3: Failed to get service ticket for dst=239: Dst is not found\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(FindMissingDsts) { - UNIT_ASSERT_VALUES_EQUAL(NTvmApi::TClientSettings::TDstVector({6, 9}), - TNotInitedUpdater::FindMissingDsts({1, 2, 3, 4}, {1, 4, 6, 9})); - UNIT_ASSERT_VALUES_EQUAL(NTvmApi::TClientSettings::TDstVector(), - TNotInitedUpdater::FindMissingDsts({1, 2, 3, 4, 5, 6, 7, 8, 9}, {1, 4, 6, 9})); - UNIT_ASSERT_VALUES_EQUAL(NTvmApi::TClientSettings::TDstVector({1, 4, 6, 9}), - TNotInitedUpdater::FindMissingDsts(NTvmApi::TDstSet(), {1, 4, 6, 9})); - UNIT_ASSERT_VALUES_EQUAL(NTvmApi::TClientSettings::TDstVector(1, 19), - TNotInitedUpdater::FindMissingDsts({213}, {19, 213})); - - auto make = [](TVector<int> ids) { - TServiceTickets::TMapIdStr m; - for (auto i : ids) { - m.insert({i, ""}); - } - return MakeIntrusiveConst<TServiceTickets>(std::move(m), TServiceTickets::TMapIdStr{}, TServiceTickets::TMapAliasId{}); - }; - - UNIT_ASSERT_VALUES_EQUAL(NTvmApi::TClientSettings::TDstVector({6, 9}), - TNotInitedUpdater::FindMissingDsts(make({1, 2, 3, 4}), {1, 4, 6, 9})); - UNIT_ASSERT_VALUES_EQUAL(NTvmApi::TClientSettings::TDstVector(), - TNotInitedUpdater::FindMissingDsts(make({1, 2, 3, 4, 5, 6, 7, 8, 9}), {1, 4, 6, 9})); - UNIT_ASSERT_VALUES_EQUAL(NTvmApi::TClientSettings::TDstVector({1, 4, 6, 9}), - TNotInitedUpdater::FindMissingDsts(make({}), {1, 4, 6, 9})); - UNIT_ASSERT_VALUES_EQUAL(NTvmApi::TClientSettings::TDstVector(1, 19), - TNotInitedUpdater::FindMissingDsts(make({213}), {19, 213})); - } - - Y_UNIT_TEST(CreateJsonArray) { - UNIT_ASSERT_VALUES_EQUAL("[]", TNotInitedUpdater::CreateJsonArray({})); - UNIT_ASSERT_VALUES_EQUAL("[sdlzkjvbsdljhfbsdajlhfbsakjdfb]", - TNotInitedUpdater::CreateJsonArray({"sdlzkjvbsdljhfbsdajlhfbsakjdfb"})); - UNIT_ASSERT_VALUES_EQUAL("[sdlzkjvbsdljhfbsdajlhfbsakjdfb,o92q83yh2uhq2eri23r]", - TNotInitedUpdater::CreateJsonArray({"sdlzkjvbsdljhfbsdajlhfbsakjdfb", - "o92q83yh2uhq2eri23r"})); - } - - Y_UNIT_TEST(AppendArrayToJson) { - UNIT_ASSERT_EXCEPTION_CONTAINS(TNotInitedUpdater::AppendToJsonArray("", {}), - yexception, - "previous body required"); - UNIT_ASSERT_EXCEPTION_CONTAINS(TNotInitedUpdater::AppendToJsonArray("[kek", {}), - yexception, - "array is broken:"); - - UNIT_ASSERT_VALUES_EQUAL("[kek]", TNotInitedUpdater::AppendToJsonArray("kek", {})); - - UNIT_ASSERT_VALUES_EQUAL( - "[kek,sdlzkjvbsdljhfbsdajlhfbsakjdfb]", - TNotInitedUpdater::AppendToJsonArray("kek", - {"sdlzkjvbsdljhfbsdajlhfbsakjdfb"})); - UNIT_ASSERT_VALUES_EQUAL( - "[kek,sdlzkjvbsdljhfbsdajlhfbsakjdfb,o92q83yh2uhq2eri23r]", - TNotInitedUpdater::AppendToJsonArray("kek", - {"sdlzkjvbsdljhfbsdajlhfbsakjdfb", "o92q83yh2uhq2eri23r"})); - - UNIT_ASSERT_VALUES_EQUAL( - "[kek,sdlzkjvbsdljhfbsdajlhfbsakjdfb]", - TNotInitedUpdater::AppendToJsonArray("[kek]", - {"sdlzkjvbsdljhfbsdajlhfbsakjdfb"})); - UNIT_ASSERT_VALUES_EQUAL( - "[kek,sdlzkjvbsdljhfbsdajlhfbsakjdfb,o92q83yh2uhq2eri23r]", - TNotInitedUpdater::AppendToJsonArray("[kek]", - {"sdlzkjvbsdljhfbsdajlhfbsakjdfb", "o92q83yh2uhq2eri23r"})); - } - - Y_UNIT_TEST(UpdaterTimeouts) { - const auto timeout = TDuration::MilliSeconds(10); - NTvmApi::TClientSettings s{ - .SelfTvmId = 100500, - .CheckServiceTickets = true, - .TvmHost = "localhost", - .TvmPort = GetRandomPort(), - .TvmSocketTimeout = timeout, - .TvmConnectTimeout = timeout, - }; - - { - auto l = MakeIntrusive<TLogger>(); - auto startTs = ::Now(); - UNIT_ASSERT_EXCEPTION(NTvmApi::TThreadedUpdater::Create(s, l), yexception); - UNIT_ASSERT_LT(::Now() - startTs, timeout * 2); - } - } -} - -template <> -void Out<TSmallVec<TString>>(IOutputStream& out, const TSmallVec<TString>& m) { - for (const TString& s : m) { - out << s << ";"; - } -} - -template <> -void Out<TServiceTickets::TMapIdStr>( - IOutputStream& out, - const TServiceTickets::TMapIdStr& m) { - for (const auto& pair : m) { - out << pair.first << " -> " << pair.second << ";"; - } -} - -template <> -void Out<NTestSuiteApiUpdater::TNotInitedUpdater::TPairTicketsErrors>( - IOutputStream& out, - const NTestSuiteApiUpdater::TNotInitedUpdater::TPairTicketsErrors& m) { - out << m.Tickets << "\n"; - out << m.Errors << "\n"; -} - -template <> -void Out<NTvmAuth::NTvmApi::TClientSettings::TDst>(IOutputStream& out, const NTvmAuth::NTvmApi::TClientSettings::TDst& m) { - out << m.Id; -} diff --git a/library/cpp/tvmauth/client/ut/tvmtool_updater_ut.cpp b/library/cpp/tvmauth/client/ut/tvmtool_updater_ut.cpp deleted file mode 100644 index 9435b46b38d..00000000000 --- a/library/cpp/tvmauth/client/ut/tvmtool_updater_ut.cpp +++ /dev/null @@ -1,756 +0,0 @@ -#include "common.h" - -#include <library/cpp/tvmauth/client/facade.h> -#include <library/cpp/tvmauth/client/misc/tool/threaded_updater.h> - -#include <library/cpp/http/simple/http_client.h> -#include <library/cpp/testing/unittest/registar.h> - -#include <util/system/env.h> - -using namespace NTvmAuth; -using namespace NTvmAuth::NTvmTool; - -Y_UNIT_TEST_SUITE(ToolUpdater) { - static const TString SRV_TICKET = "3:serv:CBAQ__________9_IgYIexCUkQY:GioCM49Ob6_f80y6FY0XBVN4hLXuMlFeyMvIMiDuQnZkbkLpRpQOuQo5YjWoBjM0Vf-XqOm8B7xtrvxSYHDD7Q4OatN2l-Iwg7i71lE3scUeD36x47st3nd0OThvtjrFx_D8mw_c0GT5KcniZlqq1SjhLyAk1b_zJsx8viRAhCU"; - static const TString SRV_TICKET_DST_100503 = "3:serv:CBAQ__________9_IggIwMQHEJeRBg:Kj7VApP6D91UJ8pKpeaE3vYaNTBBJcdYpJLbF9w2-Mb-75s_SmMKkPqqA2rMS358uFfoYpv9YZxq0tIaUj5HPQ1WaQ1yiVuPZ_oi3pJRdr006eRyihM8PUfl6m9ioCFftfOcAg9oN5BGeHTNhn7VWuj3yMg7feaMB0zAUpyaPG0"; - static const TString TEST_TICKET = "3:user:CA0Q__________9_Gg4KAgh7EHsg0oXYzAQoAQ:FSADps3wNGm92Vyb1E9IVq5M6ZygdGdt1vafWWEhfDDeCLoVA-sJesxMl2pGW4OxJ8J1r_MfpG3ZoBk8rLVMHUFrPa6HheTbeXFAWl8quEniauXvKQe4VyrpA1SPgtRoFqi5upSDIJzEAe1YRJjq1EClQ_slMt8R0kA_JjKUX54"; - static const TString PROD_YATEAM_TICKET = "3:user:CAwQ__________9_Gg4KAgh7EHsg0oXYzAQoAg:G2wloFRSi8--RLb2GDSro_sKXPF2JSdL5CVOuOHgUcRvLm-3OxIPn0NUqbJ9DWDmhPplOqEiblIbLK85My1VMJ2aG5SLbRNKEtwfmxLvkwNpl_gUEwWPJm9_8Khslfj71P3hccxtEEqM9bJSMwHueVAY-a9HSzFo-uMFMeSgQ-k"; - - class TMetaInfoProxy: public TMetaInfo { - public: - using TMetaInfo::ApplySettings; - using TMetaInfo::BbEnvFromString; - using TMetaInfo::Config_; - using TMetaInfo::Fetch; - using TMetaInfo::ParseMetaString; - using TMetaInfo::TMetaInfo; - }; - - Y_UNIT_TEST(Settings) { - NTvmTool::TClientSettings s("foo"); - UNIT_ASSERT_EXCEPTION_CONTAINS(s.SetAuthToken("\n "), - TBrokenTvmClientSettings, - "Auth token cannot be empty"); - UNIT_ASSERT_EXCEPTION_CONTAINS(s.GetAuthToken(), - TBrokenTvmClientSettings, - "Auth token cannot be empty. Env 'TVMTOOL_LOCAL_AUTHTOKEN' and 'QLOUD_TVM_TOKEN' are empty."); - - UNIT_ASSERT_NO_EXCEPTION(s.SetAuthToken(AUTH_TOKEN + "\n")); - UNIT_ASSERT_VALUES_EQUAL(AUTH_TOKEN, s.GetAuthToken()); - - UNIT_ASSERT_VALUES_EQUAL("localhost", s.GetHostname()); - UNIT_ASSERT_EXCEPTION_CONTAINS(s.SetHostname(""), - TBrokenTvmClientSettings, - "Hostname cannot be empty"); - - UNIT_ASSERT_NO_EXCEPTION(s.SetHostname("qwe")); - UNIT_ASSERT_VALUES_EQUAL("qwe", s.GetHostname()); - } - - Y_UNIT_TEST(SettingsCtor) { - UNIT_ASSERT_EXCEPTION_CONTAINS(NTvmTool::TClientSettings(""), - TBrokenTvmClientSettings, - "Alias for your TVM client cannot be empty"); - { - NTvmTool::TClientSettings s("self"); - UNIT_ASSERT_EXCEPTION_CONTAINS(s.GetAuthToken(), - TBrokenTvmClientSettings, - "Auth token cannot be empty. " - "Env 'TVMTOOL_LOCAL_AUTHTOKEN' and 'QLOUD_TVM_TOKEN' are empty."); - } - - struct TEnvs { - TEnvs(const std::map<TString, TString>& Env) { - for (const auto& [key, value] : Env) { - Prev[key] = GetEnv(key); - SetEnv(key, value); - } - } - - ~TEnvs() { - for (const auto& [key, value] : Prev) { - SetEnv(key, value); - } - } - - std::map<TString, TString> Prev; - }; - - struct TCase { - std::map<TString, TString> Env; - TString AuthToken; - ui16 Port = 0; - }; - - std::vector<TCase> cases = { - { - { - {"TVMTOOL_LOCAL_AUTHTOKEN", "qwerty"}, - }, - "qwerty", - 1, - }, - { - { - {"TVMTOOL_LOCAL_AUTHTOKEN", "qwerty"}, - {"QLOUD_TVM_TOKEN", "zxcvbn"}, - }, - "qwerty", - 1, - }, - { - { - {"QLOUD_TVM_TOKEN", "zxcvbn"}, - }, - "zxcvbn", - 1, - }, - { - { - {"TVMTOOL_LOCAL_AUTHTOKEN", "qwerty"}, - {"DEPLOY_TVM_TOOL_URL", "32272"}, - }, - "qwerty", - 1, - }, - { - { - {"TVMTOOL_LOCAL_AUTHTOKEN", "qwerty"}, - {"DEPLOY_TVM_TOOL_URL", "localhost:32272"}, - }, - "qwerty", - 32272, - }, - { - { - {"TVMTOOL_LOCAL_AUTHTOKEN", "qwerty"}, - {"DEPLOY_TVM_TOOL_URL", "http://localhost:32272"}, - }, - "qwerty", - 32272, - }, - }; - - for (const TCase& c : cases) { - TEnvs envs(c.Env); - - NTvmTool::TClientSettings s("self"); - UNIT_ASSERT_VALUES_EQUAL(c.AuthToken, s.GetAuthToken()); - UNIT_ASSERT_VALUES_EQUAL(c.Port, s.GetPort()); - } - } - - Y_UNIT_TEST(Meta_Fetch) { - TPortManager pm; - ui16 port = pm.GetPort(80); - NMock::TMockServer server(port, []() { return new TTvmTool; }); - TKeepAliveHttpClient client("localhost", port); - - TMetaInfoProxy m(nullptr); - NTvmTool::TClientSettings settings("me"); - settings.SetAuthToken(AUTH_TOKEN); - m.ApplySettings(settings); - - UNIT_ASSERT_VALUES_EQUAL(META, m.Fetch(client)); - - settings.SetAuthToken("qwerty"); - m.ApplySettings(settings); - UNIT_ASSERT_EXCEPTION_CONTAINS(m.Fetch(client), - TNonRetriableException, - "Failed to fetch meta from tvmtool: localhost:"); - - settings.SetAuthToken(AUTH_TOKEN); - m.ApplySettings(settings); - { - TKeepAliveHttpClient client("localhost", 0); - UNIT_ASSERT_EXCEPTION_CONTAINS(m.Fetch(client), - TRetriableException, - "Failed to fetch meta data from tvmtool: "); - } - - server.SetGenerator([]() { - auto p = new TTvmTool; - p->Code = HTTP_NOT_FOUND; - return p; }); - UNIT_ASSERT_EXCEPTION_CONTAINS(m.Fetch(client), - TNonRetriableException, - "Library does not support so old tvmtool. You need tvmtool>=1.1.0"); - server.SetGenerator([]() { - auto p = new TTvmTool; - p->Code = HTTP_INTERNAL_SERVER_ERROR; - return p; }); - UNIT_ASSERT_EXCEPTION_CONTAINS(m.Fetch(client), - TRetriableException, - "Failed to fetch meta from tvmtool: localhost:"); - } - - Y_UNIT_TEST(Meta_ParseMetaString_me) { - TMetaInfo::TConfigPtr c; - UNIT_ASSERT(c = TMetaInfoProxy::ParseMetaString(META, "me")); - UNIT_ASSERT_VALUES_EQUAL(100500, c->SelfTvmId); - UNIT_ASSERT_EQUAL(EBlackboxEnv::ProdYateam, c->BbEnv); - UNIT_ASSERT_VALUES_EQUAL("", c->IdmSlug); - UNIT_ASSERT_EQUAL(TMetaInfo::TDstAliases({{"bbox", 242}, {"pass_likers", 11}}), c->DstAliases); - } - - Y_UNIT_TEST(Meta_ParseMetaString_tenant_with_roles) { - TMetaInfo::TConfigPtr c; - UNIT_ASSERT(c = TMetaInfoProxy::ParseMetaString(META, "tenant_with_roles")); - UNIT_ASSERT_VALUES_EQUAL(100500, c->SelfTvmId); - UNIT_ASSERT_VALUES_EQUAL(EBlackboxEnv::ProdYateam, c->BbEnv); - UNIT_ASSERT_VALUES_EQUAL("some_slug", c->IdmSlug); - UNIT_ASSERT_VALUES_EQUAL(TMetaInfo::TDstAliases(), c->DstAliases); - } - - Y_UNIT_TEST(Meta_ParseMetaString_pc) { - TMetaInfo::TConfigPtr c; - UNIT_ASSERT(c = TMetaInfoProxy::ParseMetaString(META, "push-client")); - UNIT_ASSERT_VALUES_EQUAL(100501, c->SelfTvmId); - UNIT_ASSERT_EQUAL(EBlackboxEnv::ProdYateam, c->BbEnv); - UNIT_ASSERT_VALUES_EQUAL("", c->IdmSlug); - UNIT_ASSERT_EQUAL(TMetaInfo::TDstAliases({{"pass_likers", 100502}}), c->DstAliases); - } - - Y_UNIT_TEST(Meta_ParseMetaString_se) { - TMetaInfo::TConfigPtr c; - UNIT_ASSERT(c = TMetaInfoProxy::ParseMetaString(META, "something_else")); - UNIT_ASSERT_VALUES_EQUAL(100503, c->SelfTvmId); - UNIT_ASSERT_EQUAL(EBlackboxEnv::ProdYateam, c->BbEnv); - UNIT_ASSERT_VALUES_EQUAL("", c->IdmSlug); - UNIT_ASSERT(c->DstAliases.empty()); - } - - Y_UNIT_TEST(Meta_ParseMetaString_errors) { - TMetaInfoProxy m(nullptr); - UNIT_ASSERT(!m.ParseMetaString(META, "ololo")); - - TString meta = "}"; - UNIT_ASSERT_EXCEPTION_CONTAINS(m.ParseMetaString(meta, "qqq"), yexception, meta); - meta = "{}"; - UNIT_ASSERT_EXCEPTION_CONTAINS(m.ParseMetaString(meta, "qqq"), yexception, meta); - meta = R"({"tenants" : {}})"; - UNIT_ASSERT_EXCEPTION_CONTAINS(m.ParseMetaString(meta, "qqq"), yexception, meta); - meta = R"({"tenants" : [{"self":{}}]})"; - UNIT_ASSERT_EXCEPTION_CONTAINS(m.ParseMetaString(meta, "qqq"), yexception, meta); - } - - Y_UNIT_TEST(Meta_BbEnvFromString) { - UNIT_ASSERT_VALUES_EQUAL(EBlackboxEnv::Prod, TMetaInfoProxy::BbEnvFromString("Prod", META)); - UNIT_ASSERT_VALUES_EQUAL(EBlackboxEnv::Test, TMetaInfoProxy::BbEnvFromString("Test", META)); - UNIT_ASSERT_VALUES_EQUAL(EBlackboxEnv::ProdYateam, TMetaInfoProxy::BbEnvFromString("ProdYaTeam", META)); - UNIT_ASSERT_VALUES_EQUAL(EBlackboxEnv::TestYateam, TMetaInfoProxy::BbEnvFromString("TestYaTeam", META)); - UNIT_ASSERT_VALUES_EQUAL(EBlackboxEnv::Stress, TMetaInfoProxy::BbEnvFromString("Stress", META)); - UNIT_ASSERT_EXCEPTION_CONTAINS(TMetaInfoProxy::BbEnvFromString("foo", META), - yexception, - "'bb_env'=='foo'"); - } - - Y_UNIT_TEST(Meta_ApplySettings) { - NTvmTool::TClientSettings s("foo"); - s.SetAuthToken(AUTH_TOKEN); - - TMetaInfoProxy m(nullptr); - m.ApplySettings(s); - - UNIT_ASSERT_VALUES_EQUAL( - TKeepAliveHttpClient::THeaders({{"Authorization", AUTH_TOKEN}}), - m.GetAuthHeader()); - } - - Y_UNIT_TEST(Meta_Init) { - TPortManager pm; - ui16 port = pm.GetPort(80); - NMock::TMockServer server(port, []() { return new TTvmTool; }); - TKeepAliveHttpClient client("localhost", port); - - NTvmTool::TClientSettings s("me"); - s.SetAuthToken(AUTH_TOKEN); - s.SetPort(port); - auto l = MakeIntrusive<TLogger>(); - TMetaInfo m(l); - UNIT_ASSERT_NO_EXCEPTION(m.Init(client, s)); - UNIT_ASSERT_VALUES_EQUAL(100500, m.GetConfig()->SelfTvmId); - UNIT_ASSERT_EQUAL(EBlackboxEnv::ProdYateam, m.GetConfig()->BbEnv); - UNIT_ASSERT_EQUAL(TMetaInfo::TDstAliases({{"bbox", 242}, {"pass_likers", 11}}), m.GetConfig()->DstAliases); - UNIT_ASSERT_VALUES_EQUAL(TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n" - << "6: Meta: self_tvm_id=100500, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[(pass_likers:11)(bbox:242)]\n", - l->Stream.Str()); - l->Stream.Clear(); - UNIT_ASSERT_VALUES_EQUAL( - "/tvm/tickets?src=100500&dsts=11,242", - TMetaInfo::GetRequestForTickets(*m.GetConfig())); - - server.SetGenerator([]() { - auto p = new TTvmTool; - p->Meta = R"({ - "bb_env" : "Prod", - "tenants" : [{ - "self": {"alias" : "me", "client_id": 100500}, - "dsts" : [{"alias" : "pass_likers","client_id": 11}] - }] - })"; - return p; }); - UNIT_ASSERT(m.TryUpdateConfig(client)); - UNIT_ASSERT_VALUES_EQUAL( - "6: Meta was updated. Old: (self_tvm_id=100500, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[(pass_likers:11)(bbox:242)]). New: (self_tvm_id=100500, bb_env=Prod, idm_slug=<NULL>, dsts=[(pass_likers:11)])\n", - l->Stream.Str()); - l->Stream.clear(); - - s = NTvmTool::TClientSettings("foo"); - s.SetAuthToken(AUTH_TOKEN); - s.SetPort(port); - TMetaInfo m2(l); - UNIT_ASSERT_EXCEPTION_CONTAINS(m2.Init(client, s), TNonRetriableException, "Alias 'foo' not found in meta info"); - UNIT_ASSERT_VALUES_EQUAL(TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n", - l->Stream.Str()); - UNIT_ASSERT_EXCEPTION_CONTAINS(TMetaInfo::GetRequestForTickets({}), - yexception, - "DstAliases.empty()"); - - server.SetGenerator([]() { - auto p = new TTvmTool; - p->Meta = "}"; - return p; }); - UNIT_ASSERT_EXCEPTION_CONTAINS(m.Init(client, s), - TNonRetriableException, - "Malformed json from tvmtool:"); - } - - class TNonInitedUpdater: public TThreadedUpdater { - public: - TNonInitedUpdater(const TString& host, ui16 port, TLoggerPtr logger) - : TThreadedUpdater(host, port, TDuration::Seconds(5), TDuration::Seconds(30), logger) - { - } - - using TThreadedUpdater::ArePublicKeysOk; - using TThreadedUpdater::AreServiceTicketsOk; - using TThreadedUpdater::FetchPublicKeys; - using TThreadedUpdater::FetchServiceTickets; - using TThreadedUpdater::GetBirthTimeFromResponse; - using TThreadedUpdater::Init; - using TThreadedUpdater::IsTimeToUpdatePublicKeys; - using TThreadedUpdater::IsTimeToUpdateServiceTickets; - using TThreadedUpdater::LastVisitForConfig_; - using TThreadedUpdater::MetaInfo_; - using TThreadedUpdater::ParseFetchTicketsResponse; - using TThreadedUpdater::SetBbEnv; - using TThreadedUpdater::SetServiceContext; - using TThreadedUpdater::SetServiceTickets; - using TThreadedUpdater::SetUpdateTimeOfPublicKeys; - using TThreadedUpdater::SetUpdateTimeOfServiceTickets; - using TThreadedUpdater::SetUserContext; - using TThreadedUpdater::TPairTicketsErrors; - using TThreadedUpdater::UpdateKeys; - using TThreadedUpdater::UpdateServiceTickets; - }; - - Y_UNIT_TEST(GetBirthTimeFromResponse) { - THttpHeaders h; - UNIT_ASSERT_EXCEPTION_CONTAINS(TNonInitedUpdater::GetBirthTimeFromResponse(h, "ololo"), - yexception, - "Failed to fetch bithtime of ololo from tvmtool"); - - h.AddHeader(THttpInputHeader("X-Ya-Tvmtool-Data-Birthtime: qwe")); - UNIT_ASSERT_EXCEPTION_CONTAINS(TNonInitedUpdater::GetBirthTimeFromResponse(h, "ololo"), - yexception, - "Bithtime of ololo from tvmtool must be unixtime. Got: qwe"); - - h.AddOrReplaceHeader(THttpInputHeader("X-Ya-Tvmtool-Data-Birthtime: 123")); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(123), TNonInitedUpdater::GetBirthTimeFromResponse(h, "ololo")); - } - - Y_UNIT_TEST(Fetch) { - TPortManager pm; - ui16 port = pm.GetPort(80); - NMock::TMockServer server(port, []() { return new TTvmTool; }); - TKeepAliveHttpClient client("localhost", port); - - auto l = MakeIntrusive<TLogger>(); - TNonInitedUpdater u("localhost", port, l); - NTvmTool::TClientSettings s("me"); - s.SetAuthToken(AUTH_TOKEN); - s.SetPort(port); - u.MetaInfo_.Init(client, s); - auto p = u.FetchPublicKeys(); - UNIT_ASSERT_STRINGS_EQUAL(NUnittest::TVMKNIFE_PUBLIC_KEYS, p.first); - UNIT_ASSERT_VALUES_EQUAL(BIRTHTIME, p.second); - - auto p2 = u.FetchServiceTickets(*u.MetaInfo_.GetConfig()); - UNIT_ASSERT_STRINGS_EQUAL(TICKETS_ME, p2.first); - UNIT_ASSERT_VALUES_EQUAL(BIRTHTIME, p2.second); - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n" - << "6: Meta: self_tvm_id=100500, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[(pass_likers:11)(bbox:242)]\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(ParseFetchTicketsResponse) { - auto l = MakeIntrusive<TLogger>(); - TNonInitedUpdater u("", 0, l); - - UNIT_ASSERT_EXCEPTION_CONTAINS(u.ParseFetchTicketsResponse("}", {}), - yexception, - "Invalid json from tvmtool: }"); - - auto t = u.ParseFetchTicketsResponse(TICKETS_ME, {{"pass_likers", 11}, {"se", 2}}); - auto expected = TNonInitedUpdater::TPairTicketsErrors{ - {{11, "3:serv:CBAQ__________9_IgYIlJEGEAs:T-apeMNWFc_vHPQ3iLaZv9NjG-hf5-i23O4AhRu1M68ryN3FU5qvyqTSSiPbtJdFP6EE41QQBzEs59dHn9DRkqQNwwKf1is00Oewwj2XKO0uHukuzd9XxZnro7MfjPswsjWufxX28rmJtlfSXwAtyKt8TI5yKJnMeBPQ0m5R3k8"}}, - { - {2, "Missing tvm_id in response, should never happend: se"}, - }, - }; - UNIT_ASSERT_VALUES_EQUAL(expected, t); - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "3: Failed to get ServiceTicket for se (2): Missing tvm_id in response, should never happend: se\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(Update) { - TPortManager pm; - ui16 port = pm.GetPort(80); - NMock::TMockServer server(port, []() { return new TTvmTool; }); - TKeepAliveHttpClient client("localhost", port); - - auto l = MakeIntrusive<TLogger>(); - TNonInitedUpdater u("localhost", port, l); - NTvmTool::TClientSettings s("me"); - s.SetAuthToken(AUTH_TOKEN); - s.SetPort(port); - u.MetaInfo_.Init(client, s); - - using TTickets = TServiceTickets::TMapAliasStr; - UNIT_ASSERT(!u.GetCachedServiceTickets()); - UNIT_ASSERT_VALUES_EQUAL(BIRTHTIME, u.UpdateServiceTickets(*u.MetaInfo_.GetConfig())); - UNIT_ASSERT(u.GetCachedServiceTickets()); - UNIT_ASSERT_VALUES_EQUAL(TInstant(), u.GetUpdateTimeOfServiceTickets()); - UNIT_ASSERT_EQUAL( - TTickets({ - {"bbox", "3:serv:CBAQ__________9_IgcIlJEGEPIB:N7luw0_rVmBosTTI130jwDbQd0-cMmqJeEl0ma4ZlIo_mHXjBzpOuMQ3A9YagbmOBOt8TZ_gzGvVSegWZkEeB24gM22acw0w-RcHaQKrzSOA5Zq8WLNIC8QUa4_WGTlAsb7R7eC4KTAGgouIquNAgMBdTuGOuZHnMLvZyLnOMKc"}, - {"pass_likers", "3:serv:CBAQ__________9_IgYIlJEGEAs:T-apeMNWFc_vHPQ3iLaZv9NjG-hf5-i23O4AhRu1M68ryN3FU5qvyqTSSiPbtJdFP6EE41QQBzEs59dHn9DRkqQNwwKf1is00Oewwj2XKO0uHukuzd9XxZnro7MfjPswsjWufxX28rmJtlfSXwAtyKt8TI5yKJnMeBPQ0m5R3k8"}, - }), - u.GetCachedServiceTickets()->TicketsByAlias); - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n" - << "6: Meta: self_tvm_id=100500, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[(pass_likers:11)(bbox:242)]\n", - l->Stream.Str()); - l->Stream.Clear(); - - UNIT_ASSERT(!u.GetCachedServiceContext()); - UNIT_ASSERT(!u.GetCachedUserContext()); - UNIT_ASSERT_VALUES_EQUAL(BIRTHTIME, u.UpdateKeys(*u.MetaInfo_.GetConfig())); - UNIT_ASSERT(u.GetCachedServiceContext()); - UNIT_ASSERT(!u.GetCachedUserContext()); - u.SetBbEnv(EBlackboxEnv::Test); - UNIT_ASSERT(u.GetCachedUserContext()); - UNIT_ASSERT_VALUES_EQUAL("", l->Stream.Str()); - l->Stream.Clear(); - - { - TAsyncUpdaterPtr u = TThreadedUpdater::Create(s, l); - UNIT_ASSERT(u->GetCachedServiceTickets()); - UNIT_ASSERT(u->GetCachedServiceContext()); - UNIT_ASSERT(u->GetCachedUserContext()); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus()); - - NTvmAuth::TTvmClient c(u); - UNIT_ASSERT(c.CheckServiceTicket(SRV_TICKET)); - UNIT_ASSERT(!c.CheckServiceTicket(SRV_TICKET_DST_100503)); - UNIT_ASSERT(c.CheckUserTicket(PROD_YATEAM_TICKET)); - UNIT_ASSERT_VALUES_EQUAL("3:serv:CBAQ__________9_IgYIlJEGEAs:T-apeMNWFc_vHPQ3iLaZv9NjG-hf5-i23O4AhRu1M68ryN3FU5qvyqTSSiPbtJdFP6EE41QQBzEs59dHn9DRkqQNwwKf1is00Oewwj2XKO0uHukuzd9XxZnro7MfjPswsjWufxX28rmJtlfSXwAtyKt8TI5yKJnMeBPQ0m5R3k8", c.GetServiceTicketFor("pass_likers")); - } - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n" - << "6: Meta: self_tvm_id=100500, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[(pass_likers:11)(bbox:242)]\n" - << "7: Tickets fetched from tvmtool: 2425-09-17T11:04:00.000000Z\n" - << "7: Public keys fetched from tvmtool: 2425-09-17T11:04:00.000000Z\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - l->Stream.Str()); - l->Stream.Clear(); - - { - NTvmTool::TClientSettings s("something_else"); - s.SetAuthToken(AUTH_TOKEN); - s.SetPort(port); - - TAsyncUpdaterPtr u = TThreadedUpdater::Create(s, l); - UNIT_ASSERT(!u->GetCachedServiceTickets()); - UNIT_ASSERT(u->GetCachedServiceContext()); - UNIT_ASSERT(u->GetCachedUserContext()); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus()); - - NTvmAuth::TTvmClient c(u); - UNIT_ASSERT(!c.CheckServiceTicket(SRV_TICKET)); - UNIT_ASSERT(c.CheckServiceTicket(SRV_TICKET_DST_100503)); - UNIT_ASSERT(c.CheckUserTicket(PROD_YATEAM_TICKET)); - UNIT_ASSERT_EXCEPTION_CONTAINS(c.GetServiceTicketFor("pass_likers"), - TBrokenTvmClientSettings, - "Need to enable ServiceTickets fetching"); - } - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n" - << "6: Meta: self_tvm_id=100503, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[]\n" - << "7: Public keys fetched from tvmtool: 2425-09-17T11:04:00.000000Z\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - l->Stream.Str()); - l->Stream.Clear(); - } - - Y_UNIT_TEST(IsOk) { - TNonInitedUpdater u("", 0, TDevNullLogger::IAmBrave()); - using TTickets = TServiceTickets::TMapIdStr; - - UNIT_ASSERT(u.AreServiceTicketsOk(0)); - UNIT_ASSERT(!u.AreServiceTicketsOk(2)); - u.SetServiceTickets(MakeIntrusiveConst<TServiceTickets>(TTickets(), - TTickets(), - TServiceTickets::TMapAliasId())); - UNIT_ASSERT(u.AreServiceTicketsOk(0)); - UNIT_ASSERT(!u.AreServiceTicketsOk(2)); - u.SetServiceTickets(MakeIntrusiveConst<TServiceTickets>( - TTickets({ - {1, "mega_ticket"}, - {2, "mega_ticket2"}, - }), - TTickets({ - {3, "mega_error3"}, - }), - TServiceTickets::TMapAliasId())); - UNIT_ASSERT(u.AreServiceTicketsOk(0)); - UNIT_ASSERT(!u.AreServiceTicketsOk(2)); - - u.SetServiceTickets(MakeIntrusiveConst<TServiceTickets>( - TTickets({ - {1, "mega_ticket"}, - {2, "mega_ticket2"}, - }), - TTickets({ - {3, "mega_error3"}, - }), - TServiceTickets::TMapAliasId({ - {"mega_ticket", 1}, - {"mega_ticket2", 2}, - {"mega_ticket3", 3}, - }))); - UNIT_ASSERT(u.AreServiceTicketsOk(2)); - - UNIT_ASSERT(!u.ArePublicKeysOk()); - u.SetServiceContext(MakeIntrusiveConst<TServiceContext>( - TServiceContext::CheckingFactory(12, NUnittest::TVMKNIFE_PUBLIC_KEYS))); - UNIT_ASSERT(!u.ArePublicKeysOk()); - u.SetUserContext(NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT(!u.ArePublicKeysOk()); - u.SetBbEnv(EBlackboxEnv::Test); - UNIT_ASSERT(u.ArePublicKeysOk()); - } - - Y_UNIT_TEST(IsTimeToUpdate) { - TNonInitedUpdater u("", 0, TDevNullLogger::IAmBrave()); - - UNIT_ASSERT(!u.IsTimeToUpdatePublicKeys(TInstant::Now() - TDuration::Seconds(597))); - UNIT_ASSERT(u.IsTimeToUpdatePublicKeys(TInstant::Now() - TDuration::Seconds(603))); - - TMetaInfo::TConfig cfg; - UNIT_ASSERT(!u.IsTimeToUpdateServiceTickets(cfg, TInstant::Now() - TDuration::Seconds(597))); - UNIT_ASSERT(!u.IsTimeToUpdateServiceTickets(cfg, TInstant::Now() - TDuration::Seconds(603))); - - cfg.DstAliases = {{"q", 1}}; - UNIT_ASSERT(!u.IsTimeToUpdateServiceTickets(cfg, TInstant::Now() - TDuration::Seconds(597))); - UNIT_ASSERT(u.IsTimeToUpdateServiceTickets(cfg, TInstant::Now() - TDuration::Seconds(603))); - } - - Y_UNIT_TEST(InitWithOldData) { - TPortManager pm; - ui16 port = pm.GetPort(80); - NMock::TMockServer server(port, - []() { - auto p = new TTvmTool; - p->Birthtime = TInstant::Seconds(123); - return p; - }); - - NTvmTool::TClientSettings s("me"); - s.SetAuthToken(AUTH_TOKEN); - s.SetPort(port); - - auto l = MakeIntrusive<TLogger>(); - UNIT_ASSERT_EXCEPTION_CONTAINS(TThreadedUpdater::Create(s, l), - TRetriableException, - "Failed to start TvmClient. You can retry: "); - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n" - << "6: Meta: self_tvm_id=100500, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[(pass_likers:11)(bbox:242)]\n" - << "4: Error while fetching of tickets: Service tickets are too old: 1970-01-01T00:02:03.000000Z\n" - << "3: Service tickets have not been refreshed for too long period\n" - << "4: Error while fetching of public keys: Public keys are too old: 1970-01-01T00:02:03.000000Z\n" - << "3: Public keys have not been refreshed for too long period\n" - << "4: Error while fetching of tickets: Service tickets are too old: 1970-01-01T00:02:03.000000Z\n" - << "3: Service tickets have not been refreshed for too long period\n" - << "4: Error while fetching of public keys: Public keys are too old: 1970-01-01T00:02:03.000000Z\n" - << "3: Public keys have not been refreshed for too long period\n" - << "4: Error while fetching of tickets: Service tickets are too old: 1970-01-01T00:02:03.000000Z\n" - << "3: Service tickets have not been refreshed for too long period\n" - << "4: Error while fetching of public keys: Public keys are too old: 1970-01-01T00:02:03.000000Z\n" - << "3: Public keys have not been refreshed for too long period\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(InitWithOldData_onlyKeys) { - TPortManager pm; - ui16 port = pm.GetPort(80); - NMock::TMockServer server(port, - []() { - auto p = new TTvmTool; - p->Birthtime = TInstant::Seconds(123); - return p; - }); - - NTvmTool::TClientSettings s("something_else"); - s.SetAuthToken(AUTH_TOKEN); - s.SetPort(port); - - { - s.OverrideBlackboxEnv(EBlackboxEnv::Stress); - auto l = MakeIntrusive<TLogger>(); - UNIT_ASSERT_EXCEPTION_CONTAINS(TThreadedUpdater::Create(s, l), - TBrokenTvmClientSettings, - "Overriding of BlackboxEnv is illegal: ProdYateam -> Stress"); - } - - s.OverrideBlackboxEnv(EBlackboxEnv::Prod); - auto l = MakeIntrusive<TLogger>(); - UNIT_ASSERT_EXCEPTION_CONTAINS(TThreadedUpdater::Create(s, l), - TRetriableException, - "Failed to start TvmClient. You can retry: "); - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n" - << "6: Meta: self_tvm_id=100503, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[]\n" - << "6: Meta: override blackbox env: ProdYateam->Prod\n" - << "4: Error while fetching of public keys: Public keys are too old: 1970-01-01T00:02:03.000000Z\n" - << "3: Public keys have not been refreshed for too long period\n" - << "4: Error while fetching of public keys: Public keys are too old: 1970-01-01T00:02:03.000000Z\n" - << "3: Public keys have not been refreshed for too long period\n" - << "4: Error while fetching of public keys: Public keys are too old: 1970-01-01T00:02:03.000000Z\n" - << "3: Public keys have not been refreshed for too long period\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(Init) { - TPortManager pm; - ui16 port = pm.GetPort(80); - NMock::TMockServer server(port, []() { return new TTvmTool; }); - - NTvmTool::TClientSettings s("push-client"); - s.SetAuthToken(AUTH_TOKEN); - s.SetPort(port); - s.SetHostname("localhost"); - - auto l = MakeIntrusive<TLogger>(); - { - TAsyncUpdaterPtr u = TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus()); - } - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n" - << "6: Meta: self_tvm_id=100501, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[(pass_likers:100502)]\n" - << "7: Tickets fetched from tvmtool: 2425-09-17T11:04:00.000000Z\n" - << "7: Public keys fetched from tvmtool: 2425-09-17T11:04:00.000000Z\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(InitWithoutTvmtool) { - NTvmTool::TClientSettings s("me"); - s.SetAuthToken(AUTH_TOKEN); - s.SetPort(0); - - UNIT_ASSERT_EXCEPTION_CONTAINS(TThreadedUpdater::Create(s, TDevNullLogger::IAmBrave()), - TNonRetriableException, - "can not connect to "); - } - - Y_UNIT_TEST(GetStatus) { - TNonInitedUpdater u("", 0, TDevNullLogger::IAmBrave()); - TMetaInfoProxy m(nullptr); - m.Config_ = std::make_shared<TMetaInfo::TConfig>(); - u.MetaInfo_ = m; - u.LastVisitForConfig_ = TInstant::Now(); - - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Error, u.GetStatus()); - u.SetUpdateTimeOfPublicKeys(TInstant::Now() - TDuration::Days(3)); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Warning, u.GetStatus()); - u.SetUpdateTimeOfPublicKeys(TInstant::Now() - TDuration::Hours(3)); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - - u.SetServiceTickets(new TServiceTickets({}, {}, {})); - - TMetaInfo::TConfig cfg; - cfg.DstAliases = {{"q", 1}, {"q2", 2}}; - m.Config_ = std::make_shared<TMetaInfo::TConfig>(cfg); - u.MetaInfo_ = m; - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Error, u.GetStatus()); - u.SetUpdateTimeOfServiceTickets(TInstant::Now() - TDuration::Hours(3)); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Error, u.GetStatus()); - - u.SetServiceTickets(MakeIntrusiveConst<TServiceTickets>( - TServiceTickets::TMapIdStr({{1, "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}, {2, "t"}}), - TServiceTickets::TMapIdStr({{3, "mega_error"}, {4, "error2"}}), - TServiceTickets::TMapAliasId({ - {"some_alias#1", 1}, - {"some_alias#2", 2}, - }))); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Warning, u.GetStatus()); - - const TInstant* inv = &u.GetCachedServiceTickets()->InvalidationTime; - *const_cast<TInstant*>(inv) = TInstant::Now() + TDuration::Hours(3); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Warning, u.GetStatus()); - - u.SetUpdateTimeOfServiceTickets(TInstant::Now() - TDuration::Minutes(3)); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u.GetStatus()); - - u.LastVisitForConfig_ = TInstant::Now() - TDuration::Minutes(1); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Warning, u.GetStatus()); - } - - Y_UNIT_TEST(multiNamesForDst) { - TPortManager pm; - ui16 port = pm.GetPort(80); - NMock::TMockServer server(port, []() { return new TTvmTool; }); - - NTvmTool::TClientSettings s("multi_names_for_dst"); - s.SetAuthToken(AUTH_TOKEN); - s.SetPort(port); - s.SetHostname("localhost"); - - auto l = MakeIntrusive<TLogger>(); - { - TAsyncUpdaterPtr u = TThreadedUpdater::Create(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, u->GetStatus()); - } - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "7: Meta info fetched from localhost:" << port << "\n" - << "6: Meta: self_tvm_id=100599, bb_env=ProdYateam, idm_slug=<NULL>, dsts=[(pass_haters:100502)(pass_likers:100502)]\n" - << "7: Tickets fetched from tvmtool: 2425-09-17T11:04:00.000000Z\n" - << "7: Public keys fetched from tvmtool: 2425-09-17T11:04:00.000000Z\n" - << "7: Thread-worker started\n" - << "7: Thread-worker stopped\n", - l->Stream.Str()); - } -} diff --git a/library/cpp/tvmauth/client/ut/utils_ut.cpp b/library/cpp/tvmauth/client/ut/utils_ut.cpp deleted file mode 100644 index e780fb27791..00000000000 --- a/library/cpp/tvmauth/client/ut/utils_ut.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include <library/cpp/tvmauth/client/misc/utils.h> - -#include <library/cpp/testing/unittest/registar.h> - -Y_UNIT_TEST_SUITE(UtilsTest) { - using namespace NTvmAuth; - - Y_UNIT_TEST(ParseDstMap) { - using TMap = NTvmAuth::NTvmApi::TClientSettings::TDstMap; - UNIT_ASSERT_EQUAL(TMap(), NUtils::ParseDstMap("")); - UNIT_ASSERT_EXCEPTION(NUtils::ParseDstMap(";"), TFromStringException); - UNIT_ASSERT_EXCEPTION(NUtils::ParseDstMap(":"), TFromStringException); - UNIT_ASSERT_EXCEPTION(NUtils::ParseDstMap("3;"), TFromStringException); - UNIT_ASSERT_EXCEPTION(NUtils::ParseDstMap("3:foo;"), TFromStringException); - - UNIT_ASSERT_EQUAL(TMap({ - {"foo", 3}, - }), - NUtils::ParseDstMap("foo:3")); - UNIT_ASSERT_EQUAL(TMap({ - {"foo", 3}, - {"bar", 17}, - }), - NUtils::ParseDstMap("foo:3;bar:17;")); - } - - Y_UNIT_TEST(ParseDstVector) { - using TVector = NTvmAuth::NTvmApi::TClientSettings::TDstVector; - UNIT_ASSERT_EQUAL(TVector(), NUtils::ParseDstVector("")); - UNIT_ASSERT_EXCEPTION_CONTAINS(NUtils::ParseDstVector(";"), - yexception, - "Cannot parse empty string as number"); - UNIT_ASSERT_EXCEPTION_CONTAINS(NUtils::ParseDstVector(":"), - yexception, - "Unexpected symbol"); - UNIT_ASSERT_EXCEPTION_CONTAINS(NUtils::ParseDstVector("3:foo;"), - yexception, - "Unexpected symbol"); - UNIT_ASSERT_EXCEPTION_CONTAINS(NUtils::ParseDstVector("foo:3;"), - yexception, - "Unexpected symbol"); - - UNIT_ASSERT_EQUAL(TVector(1, 3), - NUtils::ParseDstVector("3")); - UNIT_ASSERT_EQUAL(TVector({3, 17}), - NUtils::ParseDstVector("3;17;")); - } - - Y_UNIT_TEST(ToHex) { - UNIT_ASSERT_VALUES_EQUAL("", NUtils::ToHex("")); - UNIT_ASSERT_VALUES_EQUAL("61", NUtils::ToHex("a")); - UNIT_ASSERT_VALUES_EQUAL( - "6C6B787A6E7620736C6A6876627761656220", - NUtils::ToHex("lkxznv sljhvbwaeb ")); - } - - Y_UNIT_TEST(CheckBbEnvOverriding) { - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::Prod, EBlackboxEnv::Prod)); - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::Prod, EBlackboxEnv::ProdYateam)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::Prod, EBlackboxEnv::Test)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::Prod, EBlackboxEnv::TestYateam)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::Prod, EBlackboxEnv::Stress)); - - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::ProdYateam, EBlackboxEnv::Prod)); - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::ProdYateam, EBlackboxEnv::ProdYateam)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::ProdYateam, EBlackboxEnv::Test)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::ProdYateam, EBlackboxEnv::TestYateam)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::ProdYateam, EBlackboxEnv::Stress)); - - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::Test, EBlackboxEnv::Prod)); - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::Test, EBlackboxEnv::ProdYateam)); - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::Test, EBlackboxEnv::Test)); - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::Test, EBlackboxEnv::TestYateam)); - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::Test, EBlackboxEnv::Stress)); - - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::TestYateam, EBlackboxEnv::Prod)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::TestYateam, EBlackboxEnv::ProdYateam)); - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::TestYateam, EBlackboxEnv::Test)); - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::TestYateam, EBlackboxEnv::TestYateam)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::TestYateam, EBlackboxEnv::Stress)); - - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::Stress, EBlackboxEnv::Prod)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::Stress, EBlackboxEnv::ProdYateam)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::Stress, EBlackboxEnv::Test)); - UNIT_ASSERT(!NUtils::CheckBbEnvOverriding(EBlackboxEnv::Stress, EBlackboxEnv::TestYateam)); - UNIT_ASSERT(NUtils::CheckBbEnvOverriding(EBlackboxEnv::Stress, EBlackboxEnv::Stress)); - } -} diff --git a/library/cpp/tvmauth/deprecated/service_context.cpp b/library/cpp/tvmauth/deprecated/service_context.cpp deleted file mode 100644 index 208206a9ddc..00000000000 --- a/library/cpp/tvmauth/deprecated/service_context.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include <library/cpp/tvmauth/checked_service_ticket.h> -#include <library/cpp/tvmauth/src/service_impl.h> - -namespace NTvmAuth { - static const char* EX_MSG = "ServiceContext already moved out"; - - TServiceContext::TServiceContext(TStringBuf secretBase64, TTvmId selfTvmId, TStringBuf tvmKeysResponse) - : Impl_(MakeHolder<TImpl>(secretBase64, selfTvmId, tvmKeysResponse)) - { - } - - TServiceContext::TServiceContext(TServiceContext&& o) = default; - TServiceContext& TServiceContext::operator=(TServiceContext&& o) = default; - TServiceContext::~TServiceContext() = default; - - TServiceContext TServiceContext::CheckingFactory(TTvmId selfTvmId, TStringBuf tvmKeysResponse) { - TServiceContext c; - c.Impl_ = MakeHolder<TImpl>(selfTvmId, tvmKeysResponse); - return c; - } - - TServiceContext TServiceContext::SigningFactory(TStringBuf secretBase64) { - TServiceContext c; - c.Impl_ = MakeHolder<TImpl>(secretBase64); - return c; - } - - TCheckedServiceTicket TServiceContext::Check(TStringBuf ticketBody, const TCheckFlags& flags) const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->Check(ticketBody, flags); - } - - TString TServiceContext::SignCgiParamsForTvm(TStringBuf ts, TStringBuf dst, TStringBuf scopes) const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->SignCgiParamsForTvm(ts, dst, scopes); - } -} diff --git a/library/cpp/tvmauth/deprecated/service_context.h b/library/cpp/tvmauth/deprecated/service_context.h deleted file mode 100644 index bdf1bb5224c..00000000000 --- a/library/cpp/tvmauth/deprecated/service_context.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/checked_service_ticket.h> - -#include <util/generic/ptr.h> - -namespace NTvmAuth { - class TServiceContext: public TAtomicRefCount<TServiceContext> { - public: - /*! - * @struct TCheckFlags holds flags that control checking - */ - struct TCheckFlags { - TCheckFlags() { - } - bool NeedDstCheck = true; - }; - - /*! - * Create service context. Serivce contexts are used to store TVM keys and parse service tickets. - * @param selfTvmId - * @param secretBase64 - * @param tvmKeysResponse - */ - TServiceContext(TStringBuf secretBase64, TTvmId selfTvmId, TStringBuf tvmKeysResponse); - TServiceContext(TServiceContext&&); - ~TServiceContext(); - - /*! - * Create service context only for checking service tickets - * \param[in] selfTvmId - * \param[in] tvmKeysResponse - * \return - */ - static TServiceContext CheckingFactory(TTvmId selfTvmId, TStringBuf tvmKeysResponse); - - /*! - * Create service context only for signing HTTP request to TVM-API - * \param[in] secretBase64 - * \return - */ - static TServiceContext SigningFactory(TStringBuf secretBase64); - - TServiceContext& operator=(TServiceContext&&); - - /*! - * Parse and validate service ticket body then create TCheckedServiceTicket object. - * @param ticketBody - * @return TCheckedServiceTicket object - */ - TCheckedServiceTicket Check(TStringBuf ticketBody, const TCheckFlags& flags = {}) const; - - /*! - * Sign params for TVM API - * @param ts Param 'ts' of request to TVM - * @param dst Param 'dst' of request to TVM - * @param scopes Param 'scopes' of request to TVM - * @return Signed string - */ - TString SignCgiParamsForTvm(TStringBuf ts, TStringBuf dst, TStringBuf scopes = TStringBuf()) const; - - class TImpl; - - private: - TServiceContext() = default; - - private: - THolder<TImpl> Impl_; - }; - - using TServiceContextPtr = TIntrusiveConstPtr<TServiceContext>; -} diff --git a/library/cpp/tvmauth/deprecated/user_context.cpp b/library/cpp/tvmauth/deprecated/user_context.cpp deleted file mode 100644 index 712f622f1a8..00000000000 --- a/library/cpp/tvmauth/deprecated/user_context.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include <library/cpp/tvmauth/checked_user_ticket.h> -#include <library/cpp/tvmauth/src/user_impl.h> - -namespace NTvmAuth { - static const char* EX_MSG = "UserContext already moved out"; - - TUserContext::TUserContext(EBlackboxEnv env, TStringBuf tvmKeysResponse) - : Impl_(MakeHolder<TImpl>(env, tvmKeysResponse)) - { - } - - TUserContext::TUserContext(TUserContext&& o) = default; - TUserContext& TUserContext::operator=(TUserContext&& o) = default; - TUserContext::~TUserContext() = default; - - TCheckedUserTicket TUserContext::Check(TStringBuf ticketBody) const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->Check(ticketBody); - } -} diff --git a/library/cpp/tvmauth/deprecated/user_context.h b/library/cpp/tvmauth/deprecated/user_context.h deleted file mode 100644 index f7fe67d02ed..00000000000 --- a/library/cpp/tvmauth/deprecated/user_context.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/checked_user_ticket.h> - -#include <util/generic/ptr.h> - -namespace NTvmAuth { - class TUserContext: public TAtomicRefCount<TUserContext> { - public: - TUserContext(EBlackboxEnv env, TStringBuf tvmKeysResponse); - TUserContext(TUserContext&&); - ~TUserContext(); - - TUserContext& operator=(TUserContext&&); - - /*! - * Parse and validate user ticket body then create TCheckedUserTicket object. - * @param ticketBody - * @return TCheckedUserTicket object - */ - TCheckedUserTicket Check(TStringBuf ticketBody) const; - - class TImpl; - - private: - THolder<TImpl> Impl_; - }; - - using TUserContextPtr = TIntrusiveConstPtr<TUserContext>; -} diff --git a/library/cpp/tvmauth/exception.h b/library/cpp/tvmauth/exception.h deleted file mode 100644 index f528886b954..00000000000 --- a/library/cpp/tvmauth/exception.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include <util/generic/yexception.h> - -#include <exception> - -namespace NTvmAuth { - class TTvmException: public yexception { - }; - class TContextException: public TTvmException { - }; - class TMalformedTvmSecretException: public TContextException { - }; - class TMalformedTvmKeysException: public TContextException { - }; - class TEmptyTvmKeysException: public TContextException { - }; - class TNotAllowedException: public TTvmException { - }; -} diff --git a/library/cpp/tvmauth/src/parser.cpp b/library/cpp/tvmauth/src/parser.cpp deleted file mode 100644 index 358de58d365..00000000000 --- a/library/cpp/tvmauth/src/parser.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#include "parser.h" - -#include "utils.h" - -#include <library/cpp/tvmauth/exception.h> - -#include <util/generic/strbuf.h> -#include <util/string/split.h> - -#include <ctime> - -namespace NTvmAuth { - TString TParserTvmKeys::ParseStrV1(TStringBuf str) { - while (str && str.back() == '\n') { - str.Chop(1); - } - - TStringBuf ver = str.NextTok(DELIM); - if (!str || !ver || ver != "1") { - throw TMalformedTvmKeysException() << "Malformed TVM keys"; - } - TString res = NUtils::Base64url2bin(str); - if (res.empty()) { - throw TMalformedTvmKeysException() << "Malformed TVM keys"; - } - return res; - } - - TStringBuf TParserTickets::UserFlag() { - static const char BUF_[] = "user"; - return TStringBuf(BUF_, sizeof(BUF_) - 1); - } - - TStringBuf TParserTickets::ServiceFlag() { - static const char BUF_[] = "serv"; - return TStringBuf(BUF_, sizeof(BUF_) - 1); - } - - TParserTickets::TRes TParserTickets::ParseV3(TStringBuf body, const NRw::TPublicKeys& keys, TStringBuf type) { - TStrRes str = ParseStrV3(body, type); - TRes res(str.Status); - if (str.Status != ETicketStatus::Ok) { - return TRes(str.Status); - } - if (!res.Ticket.ParseFromString(str.Proto)) { - res.Status = ETicketStatus::Malformed; - return res; - } - if (res.Ticket.expirationtime() <= time(nullptr)) { - res.Status = ETicketStatus::Expired; - return res; - } - - auto itKey = keys.find(res.Ticket.keyid()); - if (itKey == keys.end()) { - res.Status = ETicketStatus::MissingKey; - return res; - } - if (!itKey->second.CheckSign(str.ForCheck, str.Sign)) { - res.Status = ETicketStatus::SignBroken; - return res; - } - return res; - } - - TParserTickets::TStrRes TParserTickets::ParseStrV3(TStringBuf body, TStringBuf type) { - TStringBuf forCheck = body; - TStringBuf version = body.NextTok(DELIM); - if (!body || version.size() != 1) { - return {ETicketStatus::Malformed, {}, {}, {}}; - } - if (version != "3") { - return {ETicketStatus::UnsupportedVersion, {}, {}, {}}; - } - - TStringBuf ticketType = body.NextTok(DELIM); - if (ticketType != type) { - return {ETicketStatus::InvalidTicketType, {}, {}, {}}; - } - - TStringBuf proto = body.NextTok(DELIM); - TStringBuf sign = body.NextTok(DELIM); - - if (!proto || !sign || body.size() > 0) { - return {ETicketStatus::Malformed, {}, {}, {}}; - } - - TString protoBin = NUtils::Base64url2bin(proto); - TString signBin = NUtils::Base64url2bin(sign); - - if (!protoBin || !signBin) { - return {ETicketStatus::Malformed, {}, {}, {}}; - } - - return {ETicketStatus::Ok, std::move(protoBin), std::move(signBin), forCheck.Chop(sign.size())}; - } -} diff --git a/library/cpp/tvmauth/src/parser.h b/library/cpp/tvmauth/src/parser.h deleted file mode 100644 index 678e7094446..00000000000 --- a/library/cpp/tvmauth/src/parser.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/src/protos/ticket2.pb.h> -#include <library/cpp/tvmauth/src/rw/keys.h> - -#include <library/cpp/tvmauth/ticket_status.h> - -#include <util/generic/fwd.h> - -#include <string> - -namespace NTvmAuth { - struct TParserTvmKeys { - static inline const char DELIM = ':'; - static TString ParseStrV1(TStringBuf str); - }; - - struct TParserTickets { - static const char DELIM = ':'; - - static TStringBuf UserFlag(); - static TStringBuf ServiceFlag(); - - struct TRes { - TRes(ETicketStatus status) - : Status(status) - { - } - - ETicketStatus Status; - - ticket2::Ticket Ticket; - }; - static TRes ParseV3(TStringBuf body, const NRw::TPublicKeys& keys, TStringBuf type); - - // private: - struct TStrRes { - const ETicketStatus Status; - - TString Proto; - TString Sign; - - TStringBuf ForCheck; - - bool operator==(const TStrRes& o) const { // for tests - return Status == o.Status && Proto == o.Proto && Sign == o.Sign && ForCheck == o.ForCheck; - } - }; - static TStrRes ParseStrV3(TStringBuf body, TStringBuf type); - }; -} diff --git a/library/cpp/tvmauth/src/protos/ticket2.proto b/library/cpp/tvmauth/src/protos/ticket2.proto deleted file mode 100644 index 66c00a7d01c..00000000000 --- a/library/cpp/tvmauth/src/protos/ticket2.proto +++ /dev/null @@ -1,31 +0,0 @@ -package ticket2; - -option go_package = "a.yandex-team.ru/library/cpp/tvmauth/src/protos"; - -import "library/cpp/tvmauth/src/protos/tvm_keys.proto"; - -message User { - required uint64 uid = 1; -} - -message UserTicket { - repeated User users = 1; - required uint64 defaultUid = 2; - repeated string scopes = 3; - required uint32 entryPoint = 4; - required tvm_keys.BbEnvType env = 5; -} - -message ServiceTicket { - required uint32 srcClientId = 1; - required uint32 dstClientId = 2; - repeated string scopes = 3; - optional uint64 issuerUid = 4; -} - -message Ticket { - required uint32 keyId = 1; - required int64 expirationTime = 2; - optional UserTicket user = 3; - optional ServiceTicket service = 4; -} diff --git a/library/cpp/tvmauth/src/protos/tvm_keys.proto b/library/cpp/tvmauth/src/protos/tvm_keys.proto deleted file mode 100644 index 9ba42dbf805..00000000000 --- a/library/cpp/tvmauth/src/protos/tvm_keys.proto +++ /dev/null @@ -1,36 +0,0 @@ -package tvm_keys; - -option go_package = "a.yandex-team.ru/library/cpp/tvmauth/src/protos"; - -enum KeyType { - RabinWilliams = 0; -} - -enum BbEnvType { - Prod = 0; - Test = 1; - ProdYateam = 2; - TestYateam = 3; - Stress = 4; -} - -message General { - required uint32 id = 1; - required KeyType type = 2; - required bytes body = 3; - optional int64 createdTime = 4; -} - -message BbKey { - required General gen = 1; - required BbEnvType env = 2; -} - -message TvmKey { - required General gen = 1; -} - -message Keys { - repeated BbKey bb = 1; - repeated TvmKey tvm = 2; -} diff --git a/library/cpp/tvmauth/src/rw/keys.cpp b/library/cpp/tvmauth/src/rw/keys.cpp deleted file mode 100644 index 5fba7b92320..00000000000 --- a/library/cpp/tvmauth/src/rw/keys.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include "keys.h" - -#include "rw.h" - -#include <library/cpp/openssl/init/init.h> - -#include <openssl/evp.h> - -#include <util/generic/strbuf.h> -#include <util/generic/yexception.h> - -namespace { - struct TInit { - TInit() { - InitOpenSSL(); - } - } INIT; -} - -namespace NTvmAuth { - namespace NRw { - namespace NPrivate { - void TRwDestroyer::Destroy(TRwInternal* o) { - RwFree(o); - } - - class TArrayDestroyer { - public: - static void Destroy(unsigned char* o) { - free(o); - } - }; - } - - static TString SerializeRW(TRwKey* rw, int (*func)(const TRwKey*, unsigned char**)) { - unsigned char* buf = nullptr; - int size = func(rw, &buf); - THolder<unsigned char, NPrivate::TArrayDestroyer> guard(buf); - return TString((char*)buf, size); - } - - TKeyPair GenKeyPair(size_t size) { - TRw rw(RwNew()); - RwGenerateKey(rw.Get(), size); - - TRw skey(RwPrivateKeyDup(rw.Get())); - TRw vkey(RwPublicKeyDup(rw.Get())); - - TKeyPair res; - res.Private = SerializeRW(skey.Get(), &i2d_RWPrivateKey); - res.Public = SerializeRW(vkey.Get(), &i2d_RWPublicKey); - - TRwPrivateKey prKey(res.Private, 0); - TRwPublicKey pubKey(res.Public); - - const TStringBuf msg = "Test test test test test"; - - Y_ENSURE(pubKey.CheckSign(msg, prKey.SignTicket(msg)), "Failed to gen keys"); - - return res; - } - - TRwPrivateKey::TRwPrivateKey(TStringBuf body, TKeyId id) - : Id_(id) - , Rw_(Deserialize(body)) - , SignLen_(RwModSize(Rw_.Get())) - { - Y_ENSURE(SignLen_ > 0, "Private key has bad len: " << SignLen_); - } - - TKeyId TRwPrivateKey::GetId() const { - return Id_; - } - - TString TRwPrivateKey::SignTicket(TStringBuf ticket) const { - TString res(SignLen_, 0x00); - - int len = RwPssrSignMsg(ticket.size(), - (const unsigned char*)ticket.data(), - (unsigned char*)res.data(), - Rw_.Get(), - (EVP_MD*)EVP_sha256()); - - Y_ENSURE(len > 0 && len <= SignLen_, "Signing failed. len: " << len); - - res.resize(len); - return res; - } - - TRw TRwPrivateKey::Deserialize(TStringBuf key) { - TRwKey* rw = nullptr; - auto data = reinterpret_cast<const unsigned char*>(key.data()); - if (!d2i_RWPrivateKey(&rw, &data, key.size())) { - ythrow yexception() << "Private key is malformed"; - } - return TRw(rw); - } - - TRwPublicKey::TRwPublicKey(TStringBuf body) - : Rw_(Deserialize(body)) - { - } - - bool TRwPublicKey::CheckSign(TStringBuf ticket, TStringBuf sign) const { - int result = RwPssrVerifyMsg(ticket.size(), - (const unsigned char*)ticket.data(), - (unsigned char*)sign.data(), - sign.size(), - Rw_.Get(), - (EVP_MD*)EVP_sha256()); - - Y_ENSURE(result >= 0, "Failed to check sign: " << result); - return result; - } - - TRw TRwPublicKey::Deserialize(TStringBuf key) { - TRwKey* rw = nullptr; - auto data = reinterpret_cast<const unsigned char*>(key.data()); - auto status = d2i_RWPublicKey(&rw, &data, key.size()); - - TRw res(rw); - Y_ENSURE(status, "Public key is malformed: " << key); - return res; - } - - TSecureHeap::TSecureHeap(size_t totalSize, int minChunkSize) { - CRYPTO_secure_malloc_init(totalSize, minChunkSize); - } - - TSecureHeap::~TSecureHeap() { - CRYPTO_secure_malloc_done(); - } - - void TSecureHeap::Init(size_t totalSize, int minChunkSize) { - Singleton<TSecureHeap>(totalSize, minChunkSize); - } - } -} diff --git a/library/cpp/tvmauth/src/rw/keys.h b/library/cpp/tvmauth/src/rw/keys.h deleted file mode 100644 index e02b7e72a17..00000000000 --- a/library/cpp/tvmauth/src/rw/keys.h +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once - -#include <util/generic/ptr.h> -#include <util/generic/string.h> - -#include <unordered_map> - -struct TRwInternal; - -namespace NTvmAuth { - namespace NRw { - namespace NPrivate { - class TRwDestroyer { - public: - static void Destroy(TRwInternal* o); - }; - } - - using TRw = THolder<TRwInternal, NPrivate::TRwDestroyer>; - using TKeyId = ui32; - - struct TKeyPair { - TString Private; - TString Public; - }; - TKeyPair GenKeyPair(size_t size); - - class TRwPrivateKey { - public: - TRwPrivateKey(TStringBuf body, TKeyId id); - - TKeyId GetId() const; - TString SignTicket(TStringBuf ticket) const; - - private: - static TRw Deserialize(TStringBuf key); - - TKeyId Id_; - TRw Rw_; - int SignLen_; - }; - - class TRwPublicKey { - public: - TRwPublicKey(TStringBuf body); - - bool CheckSign(TStringBuf ticket, TStringBuf sign) const; - - private: - static TRw Deserialize(TStringBuf key); - - TRw Rw_; - }; - - using TPublicKeys = std::unordered_map<TKeyId, TRwPublicKey>; - - class TSecureHeap { - public: - TSecureHeap(size_t totalSize, int minChunkSize); - ~TSecureHeap(); - - static void Init(size_t totalSize = 16 * 1024 * 1024, int minChunkSize = 16); - }; - } -} diff --git a/library/cpp/tvmauth/src/rw/rw.h b/library/cpp/tvmauth/src/rw/rw.h deleted file mode 100644 index aee49148eba..00000000000 --- a/library/cpp/tvmauth/src/rw/rw.h +++ /dev/null @@ -1,86 +0,0 @@ -#pragma once - -#include <openssl/bn.h> -#include <openssl/crypto.h> - -#ifdef __cplusplus -extern "C" { -#endif - - typedef struct { - BIGNUM* S; - } TRwSignature; - - /*Rabin–Williams*/ - typedef struct TRwInternal TRwKey; - - typedef struct { - TRwSignature* (*RwSign)(const unsigned char* dgst, const int dlen, TRwKey* rw); - int (*RwVerify)(const unsigned char* dgst, int dgst_len, TRwSignature* sig, const TRwKey* rw); - int (*RwApply)(BIGNUM* r, BIGNUM* x, BN_CTX* ctx, const TRwKey* rw); - } TRwMethod; - - struct TRwInternal { - /* first private multiplier */ - BIGNUM* P; - /* second private multiplier */ - BIGNUM* Q; - /* n = p*q - RW modulus */ - BIGNUM* N; - /* precomputed 2^((3q-5)/8) mod q */ - BIGNUM* Twomq; - /* precomputed 2^((9p-11)/8) mod p*/ - BIGNUM* Twomp; - /* precomputed q^(p-2) == q^(-1) mod p */ - BIGNUM* Iqmp; - /* (q+1) / 8 */ - BIGNUM* Dq; - /* (p-3) / 8 */ - BIGNUM* Dp; - /* functions for working with RW */ - const TRwMethod* Meth; - }; - - TRwSignature* RwSignatureNew(void); - void RwSignatureFree(TRwSignature* a); - - /* RW signing functions */ - /* the function can put some tmp values to rw */ - int RwPssrSignHash(const unsigned char* from, unsigned char* to, TRwKey* rw, const EVP_MD* md); - int RwPssrSignMsg(const int msgLen, const unsigned char* msg, unsigned char* to, TRwKey* rw, const EVP_MD* md); - - /* RW-PSS verification functions */ - int RwPssrVerifyHash(const unsigned char* from, const unsigned char* sig, const int sig_len, const TRwKey* rw, const EVP_MD* md); - int RwPssrVerifyMsg(const int msgLen, const unsigned char* msg, const unsigned char* sig, const int sig_len, const TRwKey* rw, const EVP_MD* md); - - /* internal functions, use them only if you know what you're doing */ - int RwNoPaddingSign(int flen, const unsigned char* from, unsigned char* to, TRwKey* rw); - int RwApply(const int flen, const unsigned char* from, unsigned char* to, const TRwKey* rw); - - const TRwMethod* RwDefaultMethods(void); - - TRwKey* RwNew(void); - void RwFree(TRwKey* r); - int RwSize(const TRwKey* rw); - int RwModSize(const TRwKey* rw); - - TRwKey* RwPublicKeyDup(TRwKey* rw); - TRwKey* RwPrivateKeyDup(TRwKey* rw); - - // NOLINTNEXTLINE(readability-identifier-naming) - TRwKey* d2i_RWPublicKey(TRwKey** a, const unsigned char** pp, long length); - // NOLINTNEXTLINE(readability-identifier-naming) - TRwKey* d2i_RWPrivateKey(TRwKey** a, const unsigned char** pp, long length); - - int RwGenerateKey(TRwKey* a, int bits); - // NOLINTNEXTLINE(readability-identifier-naming) - int i2d_RWPublicKey(const TRwKey* a, unsigned char** pp); - // NOLINTNEXTLINE(readability-identifier-naming) - int i2d_RWPrivateKey(const TRwKey* a, unsigned char** pp); - - int RwPaddingAddPssr(const TRwKey* rw, unsigned char* EM, const unsigned char* mHash, const EVP_MD* Hash, int sLen); - int RwVerifyPssr(const TRwKey* rw, const unsigned char* mHash, const EVP_MD* Hash, const unsigned char* EM, int sLen); - -#ifdef __cplusplus -} -#endif diff --git a/library/cpp/tvmauth/src/rw/rw_asn1.c b/library/cpp/tvmauth/src/rw/rw_asn1.c deleted file mode 100644 index f9dfe3996d8..00000000000 --- a/library/cpp/tvmauth/src/rw/rw_asn1.c +++ /dev/null @@ -1,81 +0,0 @@ -#include "rw.h" - -#include <openssl/asn1.h> -#include <openssl/asn1t.h> -#include <openssl/rand.h> - -#include <stdio.h> - -/* Override the default new methods */ -/* This callback is used by OpenSSL's ASN.1 parser */ -static int SignatureCallback(int operation, ASN1_VALUE** pval, const ASN1_ITEM* it, void* exarg) { - (void)it; - (void)exarg; - - if (operation == ASN1_OP_NEW_PRE) { - TRwSignature* sig; - sig = OPENSSL_malloc(sizeof(TRwSignature)); - if (!sig) - return 0; - sig->S = NULL; - *pval = (ASN1_VALUE*)sig; - return 2; - } - return 1; -} - -/* ASN.1 structure representing RW signature value */ -ASN1_SEQUENCE_cb(TRwSignature, SignatureCallback) = { - ASN1_SIMPLE(TRwSignature, S, BIGNUM), -} ASN1_SEQUENCE_END_cb(TRwSignature, TRwSignature) - - /* i2d_ and d2i functions implementation for RW */ - IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(TRwSignature, TRwSignature, TRwSignature) - - /* Override the default free and new methods */ - static int RwCallback(int operation, ASN1_VALUE** pval, const ASN1_ITEM* it, void* exarg) { - (void)it; - (void)exarg; - - if (operation == ASN1_OP_NEW_PRE) { - *pval = (ASN1_VALUE*)RwNew(); - if (*pval) - return 2; - return 0; - } else if (operation == ASN1_OP_FREE_PRE) { - RwFree((TRwKey*)*pval); - *pval = NULL; - return 2; - } - return 1; -} - -/* ASN.1 representation of RW's private key */ -ASN1_SEQUENCE_cb(RWPrivateKey, RwCallback) = { - ASN1_SIMPLE(TRwKey, N, BIGNUM), - ASN1_SIMPLE(TRwKey, P, CBIGNUM), - ASN1_SIMPLE(TRwKey, Q, CBIGNUM), - ASN1_SIMPLE(TRwKey, Iqmp, CBIGNUM), - ASN1_SIMPLE(TRwKey, Dq, CBIGNUM), - ASN1_SIMPLE(TRwKey, Dp, CBIGNUM), - ASN1_SIMPLE(TRwKey, Twomp, CBIGNUM), - ASN1_SIMPLE(TRwKey, Twomq, CBIGNUM)} ASN1_SEQUENCE_END_cb(TRwKey, RWPrivateKey); - -/* i2d_ and d2i_ functions for RW's private key */ -IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(TRwKey, RWPrivateKey, RWPrivateKey); - -/* ASN.1 representation of RW public key */ -ASN1_SEQUENCE_cb(RWPublicKey, RwCallback) = { - ASN1_SIMPLE(TRwKey, N, BIGNUM), -} ASN1_SEQUENCE_END_cb(TRwKey, RWPublicKey); - -/* i2d_ and d2i functions for RW public key */ -IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(TRwKey, RWPublicKey, RWPublicKey); - -TRwKey* RwPublicKeyDup(TRwKey* rw) { - return ASN1_item_dup(ASN1_ITEM_rptr(RWPublicKey), rw); -} - -TRwKey* RwPrivateKeyDup(TRwKey* rw) { - return ASN1_item_dup(ASN1_ITEM_rptr(RWPrivateKey), rw); -} diff --git a/library/cpp/tvmauth/src/rw/rw_key.c b/library/cpp/tvmauth/src/rw/rw_key.c deleted file mode 100644 index 78baaf4dd91..00000000000 --- a/library/cpp/tvmauth/src/rw/rw_key.c +++ /dev/null @@ -1,135 +0,0 @@ -#include "rw.h" - -#include <openssl/rand.h> - -int RwGenerateKey(TRwKey* rw, int bits) { - int ok = 0; - - BN_CTX* ctx = NULL; - BIGNUM *rem3 = NULL, *rem7 = NULL, *mod8 = NULL, *rem5 = NULL; - BIGNUM *nmod = NULL, *twomqexp = NULL, *twompexp = NULL, *two = NULL; - - int bitsp = (bits + 1) / 2; - int bitsq = bits - bitsp; - - /* make sure that all components are not null */ - if ((ctx = BN_CTX_secure_new()) == NULL) - goto err; - if (!rw) - goto err; - if (!rw->N && ((rw->N = BN_new()) == NULL)) - goto err; - if (!rw->P && ((rw->P = BN_new()) == NULL)) - goto err; - if (!rw->Q && ((rw->Q = BN_new()) == NULL)) - goto err; - if (!rw->Iqmp && ((rw->Iqmp = BN_new()) == NULL)) - goto err; - if (!rw->Twomq && ((rw->Twomq = BN_new()) == NULL)) - goto err; - if (!rw->Twomp && ((rw->Twomp = BN_new()) == NULL)) - goto err; - if (!rw->Dq && ((rw->Dq = BN_new()) == NULL)) - goto err; - if (!rw->Dp && ((rw->Dp = BN_new()) == NULL)) - goto err; - - BN_CTX_start(ctx); - - rem3 = BN_CTX_get(ctx); - rem7 = BN_CTX_get(ctx); - rem5 = BN_CTX_get(ctx); - mod8 = BN_CTX_get(ctx); - nmod = BN_CTX_get(ctx); - twomqexp = BN_CTX_get(ctx); - twompexp = BN_CTX_get(ctx); - two = BN_CTX_get(ctx); - - if (!BN_set_word(mod8, 8)) - goto err; - if (!BN_set_word(rem3, 3)) - goto err; - if (!BN_set_word(rem7, 7)) - goto err; - if (!BN_set_word(rem5, 5)) - goto err; - if (!BN_set_word(two, 2)) - goto err; - - /* generate p */ - /* add == 8 */ - /* rem == 3 */ - /* safe == 0 as we don't need (p-1)/2 to be also prime */ - if (!BN_generate_prime_ex(rw->P, bitsp, 0, mod8, rem3, NULL)) - goto err; - - /* generate q */ - /* add == 8 */ - /* rem == 7 */ - /* safe == 0 */ - if (!BN_generate_prime_ex(rw->Q, bitsq, 0, mod8, rem7, NULL)) - goto err; - - /* n == p*q */ - if (!BN_mul(rw->N, rw->P, rw->Q, ctx)) - goto err; - - /* n == 5 mod 8 ? */ - if (!BN_nnmod(nmod, rw->N, mod8, ctx)) - goto err; - if (BN_ucmp(rem5, nmod) != 0) - goto err; - - /* q^(-1) mod p */ - if (!BN_mod_inverse(rw->Iqmp, rw->Q, rw->P, ctx)) - goto err; - - /* twomqexp = (3q-5)/8 */ - if (!BN_copy(twomqexp, rw->Q)) - goto err; - if (!BN_mul_word(twomqexp, 3)) - goto err; - if (!BN_sub_word(twomqexp, 5)) - goto err; - if (!BN_rshift(twomqexp, twomqexp, 3)) - goto err; - if (!BN_mod_exp(rw->Twomq, two, twomqexp, rw->Q, ctx)) - goto err; - - /* twompexp = (9p-11)/8 */ - if (!BN_copy(twompexp, rw->P)) - goto err; - if (!BN_mul_word(twompexp, 9)) - goto err; - if (!BN_sub_word(twompexp, 11)) - goto err; - if (!BN_rshift(twompexp, twompexp, 3)) - goto err; - if (!BN_mod_exp(rw->Twomp, two, twompexp, rw->P, ctx)) - goto err; - - /* dp = (p-3) / 8 */ - if (!BN_copy(rw->Dp, rw->P)) - goto err; - if (!BN_sub_word(rw->Dp, 3)) - goto err; - if (!BN_rshift(rw->Dp, rw->Dp, 3)) - goto err; - - /* dq = (q+1) / 8 */ - if (!BN_copy(rw->Dq, rw->Q)) - goto err; - if (!BN_add_word(rw->Dq, 1)) - goto err; - if (!BN_rshift(rw->Dq, rw->Dq, 3)) - goto err; - - ok = 1; - -err: - if (ctx != NULL) { - BN_CTX_end(ctx); - BN_CTX_free(ctx); - } - return ok; -} diff --git a/library/cpp/tvmauth/src/rw/rw_lib.c b/library/cpp/tvmauth/src/rw/rw_lib.c deleted file mode 100644 index afd73da38b8..00000000000 --- a/library/cpp/tvmauth/src/rw/rw_lib.c +++ /dev/null @@ -1,77 +0,0 @@ -#include "rw.h" - -#include <openssl/asn1.h> - -#include <stdio.h> - -TRwKey* RwNew(void) { - TRwKey* ret = NULL; - - ret = (TRwKey*)malloc(sizeof(TRwKey)); - if (ret == NULL) { - return (NULL); - } - ret->Meth = RwDefaultMethods(); - - ret->P = NULL; - ret->Q = NULL; - ret->N = NULL; - ret->Iqmp = NULL; - ret->Twomq = NULL; - ret->Twomp = NULL; - ret->Dp = NULL; - ret->Dq = NULL; - - return ret; -} - -void RwFree(TRwKey* r) { - if (r == NULL) - return; - - if (r->P != NULL) - BN_clear_free(r->P); - if (r->Q != NULL) - BN_clear_free(r->Q); - if (r->N != NULL) - BN_clear_free(r->N); - if (r->Iqmp != NULL) - BN_clear_free(r->Iqmp); - if (r->Dp != NULL) - BN_clear_free(r->Dp); - if (r->Dq != NULL) - BN_clear_free(r->Dq); - if (r->Twomp != NULL) - BN_clear_free(r->Twomp); - if (r->Twomq != NULL) - BN_clear_free(r->Twomq); - - free(r); -} - -int RwSize(const TRwKey* r) { - int ret = 0, i = 0; - ASN1_INTEGER bs; - unsigned char buf[4]; /* 4 bytes looks really small. - However, i2d_ASN1_INTEGER() will not look - beyond the first byte, as long as the second - parameter is NULL. */ - - i = BN_num_bits(r->N); - bs.length = (i + 7) / 8; - bs.data = buf; - bs.type = V_ASN1_INTEGER; - /* If the top bit is set the asn1 encoding is 1 larger. */ - buf[0] = 0xff; - - i = i2d_ASN1_INTEGER(&bs, NULL); - - ret = ASN1_object_size(1, i, V_ASN1_SEQUENCE); - return ret; -} - -int RwModSize(const TRwKey* rw) { - if (rw == NULL || rw->N == NULL) - return 0; - return BN_num_bytes(rw->N); -} diff --git a/library/cpp/tvmauth/src/rw/rw_ossl.c b/library/cpp/tvmauth/src/rw/rw_ossl.c deleted file mode 100644 index 85bcb802e96..00000000000 --- a/library/cpp/tvmauth/src/rw/rw_ossl.c +++ /dev/null @@ -1,481 +0,0 @@ -#include "rw.h" - -#include <openssl/rand.h> - -//#define RW_PRINT_DEBUG -//#define AVOID_IF -//#define FAULT_TOLERANCE_CHECK - -#ifdef RW_PRINT_DEBUG - #include <stdio.h> -#endif - -static TRwSignature* RwDoSign(const unsigned char* dgst, int dlen, TRwKey* rw); -static int RwDoVerify(const unsigned char* dgst, int dgst_len, TRwSignature* sig, const TRwKey* rw); -static int RwDoApply(BIGNUM* r, BIGNUM* x, BN_CTX* ctx, const TRwKey* rw); - -static TRwMethod rw_default_meth = { - RwDoSign, - RwDoVerify, - RwDoApply}; - -const TRwMethod* RwDefaultMethods(void) { - return &rw_default_meth; -} - -#ifdef RW_PRINT_DEBUG - -static void print_bn(char* name, BIGNUM* value) { - char* str_repr; - str_repr = BN_bn2dec(value); - printf("Name: %s\n", name); - printf("Value: %s\n", str_repr); - OPENSSL_free(str_repr); -} - - #define DEBUG_PRINT_BN(s, x) \ - do { \ - print_bn((s), (x)); \ - } while (0); - #define DEBUG_PRINT_RW(r) \ - do { \ - DEBUG_PRINT_BN("rw->p", (r)->p); \ - DEBUG_PRINT_BN("rw->q", (r)->q); \ - DEBUG_PRINT_BN("rw->n", (r)->n); \ - DEBUG_PRINT_BN("rw->iqmp", (r)->iqmp); \ - DEBUG_PRINT_BN("rw->twomp", (r)->twomp); \ - DEBUG_PRINT_BN("rw->twomq", (r)->twomq); \ - DEBUG_PRINT_BN("rw->dp", (r)->dp); \ - DEBUG_PRINT_BN("rw->dq", (r)->dq); \ - } while (0); - #define DEBUG_PRINTF(s, v) \ - do { \ - printf((s), (v)); \ - } while (0); -#else - #define DEBUG_PRINT_BN(s, x) - #define DEBUG_PRINT_RW(r) - #define DEBUG_PRINTF(s, v) -#endif - -/* - * The algorithms was taken from - * https://cr.yp.to/sigs/rwsota-20080131.pdf - * Section 6 -> "Avoiding Jacobi symbols" - * '^' means power - * 1. Compute U = h ^ ((q+1) / 8) mod q - * 2. If U ^ 4 - h mod q == 0, set e = 1 otherwise set e = -1 - * 3. Compute V = (eh) ^ ((p-3)/8) mod p - * 4. If (V^4 * (eh)^2 - eh) mod p = 0; set f = 1; otherwise set f = 2 - * 5. Precompute 2^((3q-5) / 8) mod q; Compute W = f^((3*q - 5) / 8) * U mod q - * 6. Precompute 2^((9p-11) / 8) mod p; Compute X = f^((9p-11) / 8) * V^3 * eh mod p - * 7. Precompute q^(p-2) mod p; Compute Y = W + q(q^(p-2) * (X - W) mod p) - * 8. Compute s = Y^2 mod pq - * 9. Fault tolerance: if efs^2 mod pq != h start over - */ -static TRwSignature* RwDoSign(const unsigned char* dgst, int dlen, TRwKey* rw) { - BIGNUM *m, *U, *V, *tmp, *m_q, *m_p, *tmp2; - /* additional variables to avoid "if" statements */ - BIGNUM* tmp_mp; - TRwSignature* ret = NULL; - BN_CTX* ctx = NULL; - int ok = 0, e = 0, f = 0; - -#ifdef AVOID_IF - /* additional variables to avoid "if" statements */ - BIGNUM *tmp_U, *tmp_V; -#endif - - if (!rw || !rw->P || !rw->Q || !rw->N || !rw->Iqmp || !rw->Dp || !rw->Dq || !rw->Twomp || !rw->Twomq) - goto err; - - if ((ctx = BN_CTX_secure_new()) == NULL) - goto err; - BN_CTX_start(ctx); - - m = BN_CTX_get(ctx); - U = BN_CTX_get(ctx); - V = BN_CTX_get(ctx); - tmp = BN_CTX_get(ctx); - tmp2 = BN_CTX_get(ctx); - m_q = BN_CTX_get(ctx); - m_p = BN_CTX_get(ctx); - tmp_mp = BN_CTX_get(ctx); - -#ifdef AVOID_IF - tmp_U = BN_CTX_get(ctx); - tmp_V = BN_CTX_get(ctx); -#endif - - DEBUG_PRINT_RW(rw) - - /* if (!BN_set_word(four, 4)) goto err; */ - - if (!BN_bin2bn(dgst, dlen, m)) - goto err; - if (BN_ucmp(m, rw->N) >= 0) - goto err; - - /* check if m % 16 == 12 */ - if (BN_mod_word(m, 16) != 12) - goto err; - DEBUG_PRINT_BN("m", m) - - /* TODO: optimization to avoid memory allocation? */ - if ((ret = RwSignatureNew()) == NULL) - goto err; - /* memory allocation */ - if ((ret->S = BN_new()) == NULL) - goto err; - - /* m_q = m mod q */ - if (!BN_nnmod(m_q, m, rw->Q, ctx)) - goto err; - /* m_p = m mod p */ - if (!BN_nnmod(m_p, m, rw->P, ctx)) - goto err; - - DEBUG_PRINT_BN("m_p", m_p) - DEBUG_PRINT_BN("m_q", m_q) - - /* U = h ** ((q+1)/8) mod q */ - if (!BN_mod_exp(U, m_q, rw->Dq, rw->Q, ctx)) - goto err; - DEBUG_PRINT_BN("U", U) - - /* tmp = U^4 - h mod q */ - if (!BN_mod_sqr(tmp, U, rw->Q, ctx)) - goto err; - if (!BN_mod_sqr(tmp, tmp, rw->Q, ctx)) - goto err; - DEBUG_PRINT_BN("U**4 mod q", tmp) - - /* e = 1 if tmp == 0 else -1 */ - e = 2 * (BN_ucmp(tmp, m_q) == 0) - 1; - DEBUG_PRINTF("e == %i\n", e) - - /* - to avoid "if" branch - if e == -1: m_p = tmp_mp - if e == 1: m_p = m_p - */ - if (!BN_sub(tmp_mp, rw->P, m_p)) - goto err; - m_p = (BIGNUM*)((1 - ((1 + e) >> 1)) * (BN_ULONG)tmp_mp + ((1 + e) >> 1) * (BN_ULONG)m_p); - DEBUG_PRINT_BN("eh mod p", m_p) - - /* V = (eh) ** ((p-3)/8) */ - if (!BN_mod_exp(V, m_p, rw->Dp, rw->P, ctx)) - goto err; - DEBUG_PRINT_BN("V == ((eh) ** ((p-3)/8))", V) - - /* (eh) ** 2 */ - if (!BN_mod_sqr(tmp2, m_p, rw->P, ctx)) - goto err; - DEBUG_PRINT_BN("(eh)**2", tmp2) - - /* V ** 4 */ - if (!BN_mod_sqr(tmp, V, rw->P, ctx)) - goto err; - if (!BN_mod_sqr(tmp, tmp, rw->P, ctx)) - goto err; - DEBUG_PRINT_BN("V**4", tmp) - - /* V**4 * (eh)**2 */ - if (!BN_mod_mul(tmp, tmp, tmp2, rw->P, ctx)) - goto err; - DEBUG_PRINT_BN("tmp = (V**4 * (eh)**2) mod p", tmp) - - /* tmp = tmp - eh mod p */ - if (!BN_mod_sub(tmp, tmp, m_p, rw->P, ctx)) - goto err; - - /* f = 1 if zero else 2 */ - f = 2 - BN_is_zero(tmp); - /* f = 2 - (constant_time_is_zero(BN_ucmp(tmp, m_p)) & 1); */ - DEBUG_PRINTF("f == %i\n", f) - -#ifdef AVOID_IF - if (!BN_mod_mul(tmp_U, U, rw->twomq, rw->q, ctx)) - goto err; - - /* - to avoid "if" branch we use tiny additional computation - */ - U = (BIGNUM*)((2 - f) * (BN_ULONG)U + (1 - (2 - f)) * (BN_ULONG)tmp_U); -#else - - if (f == 2) { - if (!BN_mod_mul(U, U, rw->Twomq, rw->Q, ctx)) - goto err; - } - -#endif - - DEBUG_PRINT_BN("W", U) - - /* V ** 3 */ - if (!BN_mod_sqr(tmp, V, rw->P, ctx)) - goto err; - if (!BN_mod_mul(V, V, tmp, rw->P, ctx)) - goto err; - DEBUG_PRINT_BN("V**3", V) - - /* *(eh) */ - if (!BN_mod_mul(V, V, m_p, rw->P, ctx)) - goto err; - DEBUG_PRINT_BN("V**3 * (eh) mod p", V) - -#ifdef AVOID_IF - - /* to avoid "if" statement we use simple computation */ - if (!BN_mod_mul(tmp_V, V, rw->twomp, rw->p, ctx)) - goto err; - V = (BIGNUM*)((2 - f) * (BN_ULONG)V + (1 - (2 - f)) * (BN_ULONG)tmp_V); - -#else - - if (f == 2) { - if (!BN_mod_mul(V, V, rw->Twomp, rw->P, ctx)) - goto err; - } - -#endif - - DEBUG_PRINT_BN("X", V) - - /* W = U, X = V */ - if (!BN_mod_sub(V, V, U, rw->P, ctx)) - goto err; - DEBUG_PRINT_BN("X - W mod p", V) - - if (!BN_mod_mul(V, V, rw->Iqmp, rw->P, ctx)) - goto err; - DEBUG_PRINT_BN("q**(p-2) * (X-W) mod p", V) - - if (!BN_mul(V, V, rw->Q, ctx)) - goto err; - DEBUG_PRINT_BN("q * prev mod p", V) - - if (!BN_mod_add(V, U, V, rw->N, ctx)) - goto err; - DEBUG_PRINT_BN("Y", V) - - /* now V = Y */ - if (!BN_mod_sqr(V, V, rw->N, ctx)) - goto err; - DEBUG_PRINT_BN("s", V) - -#ifdef FAULT_TOLERANCE_CHECK - - /* now V = s - principal square root */ - /* fault tolerance check */ - if (!BN_mod_sqr(tmp, V, rw->n, ctx)) - goto err; - DEBUG_PRINT_BN("s**2", tmp) - - if (!BN_mul_word(tmp, f)) - goto err; - DEBUG_PRINT_BN("f * s**2", tmp) - - if (!BN_nnmod(tmp, tmp, rw->n, ctx)) - goto err; - DEBUG_PRINT_BN("s**2 * f mod n", tmp) - - /* to avoid "if" statement */ - if (!BN_sub(tmp2, rw->n, tmp)) - goto err; - tmp = (BIGNUM*)(((1 + e) >> 1) * (BN_ULONG)tmp + (1 - ((1 + e) >> 1)) * (BN_ULONG)tmp2); - DEBUG_PRINT_BN("ef(s**2)", tmp) - DEBUG_PRINT_BN("(tmp == original m)", tmp) - - if (BN_ucmp(tmp, m) != 0) - goto err; - -#endif - - /* making the "principal square root" to be "|principal| square root" */ - if (!BN_sub(tmp, rw->N, V)) - goto err; - - /* if tmp = MIN(V, rw->n - V) */ - tmp = BN_ucmp(tmp, V) >= 0 ? V : tmp; - - if (!BN_copy(ret->S, tmp)) - goto err; - - ok = 1; - -err: - if (ctx != NULL) { - BN_CTX_end(ctx); - BN_CTX_free(ctx); - } - if (!ok) { - RwSignatureFree(ret); - ret = NULL; - } - - return ret; -} - -static int RwDoVerify(const unsigned char* dgst, int dgst_len, TRwSignature* sig, const TRwKey* rw) { - BIGNUM *m = NULL, *x = NULL, *t1 = NULL, *t2 = NULL, *t1d = NULL, *t2d = NULL; - BN_CTX* ctx = NULL; - BN_ULONG rest1 = 0, rest2 = 0; - int retval = 0; - - if (!rw || !rw->N || !sig || !sig->S) - goto err; - - if ((ctx = BN_CTX_secure_new()) == NULL) - goto err; - BN_CTX_start(ctx); - - m = BN_CTX_get(ctx); - t1 = BN_CTX_get(ctx); - t2 = BN_CTX_get(ctx); - t1d = BN_CTX_get(ctx); - t2d = BN_CTX_get(ctx); - - if (!BN_bin2bn(dgst, dgst_len, m)) - goto err; - /* dgst too big */ - if (!BN_copy(t1, rw->N)) - goto err; - if (!BN_sub_word(t1, 1)) - goto err; - if (!BN_rshift(t1, t1, 1)) - goto err; - - /* check m and rw->n relation */ - if (BN_ucmp(m, rw->N) >= 0) - goto err; - rest1 = BN_mod_word(m, 16); - if (rest1 != 12) - goto err; - - if (BN_ucmp(t1, sig->S) < 0) - goto err; - if (BN_is_negative(sig->S)) - goto err; - - if (!BN_mod_sqr(t1, sig->S, rw->N, ctx)) - goto err; - if (!BN_sub(t2, rw->N, t1)) - goto err; - if (!BN_lshift1(t1d, t1)) - goto err; - if (!BN_lshift1(t2d, t2)) - goto err; - - rest1 = BN_mod_word(t1, 16); - rest2 = BN_mod_word(t2, 16); - - /* mod 16 */ - if (rest1 == 12) { - x = t1; - } - /* mod 8 */ - else if ((rest1 & 0x07) == 6) { - x = t1d; - } - /* mod 16 */ - else if (rest2 == 12) { - x = t2; - } - /* mod 8 */ - else if ((rest2 & 0x07) == 6) { - x = t2d; - } else - goto err; - - DEBUG_PRINT_BN("m", m) - DEBUG_PRINT_BN("x", x) - - /* check signature value */ - retval = BN_ucmp(m, x) == 0; - -err: - if (ctx != NULL) { - BN_CTX_end(ctx); - BN_CTX_free(ctx); - } - return retval; -} - -static int RwDoApply(BIGNUM* r, BIGNUM* x, BN_CTX* ctx, const TRwKey* rw) { - BIGNUM *t1 = NULL, *t2 = NULL, *t1d = NULL, *t2d = NULL, *rs = NULL; - BN_ULONG rest1 = 0, rest2 = 0; - int retval = 0; - - if (!rw || !rw->N || !x || !ctx || !r) - goto err; - - DEBUG_PRINT_BN("Signature = x = ", x) - DEBUG_PRINT_BN("n", rw->n) - - BN_CTX_start(ctx); - - t1 = BN_CTX_get(ctx); - t2 = BN_CTX_get(ctx); - t1d = BN_CTX_get(ctx); - t2d = BN_CTX_get(ctx); - - if (!BN_copy(t1, rw->N)) - goto err; - if (!BN_sub_word(t1, 1)) - goto err; - if (!BN_rshift(t1, t1, 1)) - goto err; - - /* check m and rw->n relation */ - if (BN_ucmp(x, rw->N) >= 0) - goto err; - - if (BN_ucmp(t1, x) < 0) - goto err; - if (BN_is_negative(x)) - goto err; - - if (!BN_mod_sqr(t1, x, rw->N, ctx)) - goto err; - DEBUG_PRINT_BN("x**2 mod n", t1) - - if (!BN_sub(t2, rw->N, t1)) - goto err; - DEBUG_PRINT_BN("n - x**2", t2) - - if (!BN_lshift1(t1d, t1)) - goto err; - if (!BN_lshift1(t2d, t2)) - goto err; - - rest1 = BN_mod_word(t1, 16); - rest2 = BN_mod_word(t2, 16); - - /* mod 16 */ - if (rest1 == 12) { - rs = t1; - } - /* mod 8 */ - else if ((rest1 & 0x07) == 6) { - rs = t1d; - } - /* mod 16 */ - else if (rest2 == 12) { - rs = t2; - } - /* mod 8 */ - else if ((rest2 & 0x07) == 6) { - rs = t2d; - } else - goto err; - - DEBUG_PRINT_BN("Squaring and shifting result (rs)", rs) - retval = BN_copy(r, rs) != NULL; - -err: - BN_CTX_end(ctx); - return retval; -} diff --git a/library/cpp/tvmauth/src/rw/rw_pss.c b/library/cpp/tvmauth/src/rw/rw_pss.c deleted file mode 100644 index 1e040a55ebe..00000000000 --- a/library/cpp/tvmauth/src/rw/rw_pss.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - * This code was taken from the OpenSSL's RSA implementation - * and added to the RW project with some changes - * - * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL - * project 2005. - * - */ -/* ==================================================================== - * Copyright (c) 2005 The OpenSSL Project. 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. - * - * 2. 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. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * licensing@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED 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 OpenSSL PROJECT OR - * ITS 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. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - -#include "rw.h" - -#include <openssl/bn.h> -#include <openssl/evp.h> -#include <openssl/rand.h> -#include <openssl/sha.h> - -#include <stdio.h> -#include <string.h> - -static const unsigned char zeroes[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - -static int PkcS1MgF1(unsigned char *mask, const int len, const unsigned char *seed, const int seedlen, const EVP_MD *dgst) { - int i, outlen = 0; - unsigned char cnt[4]; - EVP_MD_CTX* c = EVP_MD_CTX_create(); - unsigned char md[EVP_MAX_MD_SIZE]; - int mdlen; - int rv = -1; - - if (!c) { - return rv; - } - - mdlen = EVP_MD_size(dgst); - - if (mdlen < 0 || seedlen < 0) - goto err; - - for (i = 0; outlen < len; i++) { - cnt[0] = (unsigned char)((i >> 24) & 255); - cnt[1] = (unsigned char)((i >> 16) & 255); - cnt[2] = (unsigned char)((i >> 8)) & 255; - cnt[3] = (unsigned char)(i & 255); - - if (!EVP_DigestInit_ex(c,dgst, NULL) || !EVP_DigestUpdate(c, seed, seedlen) || !EVP_DigestUpdate(c, cnt, 4)) - goto err; - - if (outlen + mdlen <= len) { - if (!EVP_DigestFinal_ex(c, mask + outlen, NULL)) - goto err; - outlen += mdlen; - } else { - if (!EVP_DigestFinal_ex(c, md, NULL)) - goto err; - memcpy(mask + outlen, md, len - outlen); - outlen = len; - } - } - rv = 0; - -err: - EVP_MD_CTX_destroy(c); - return rv; -} - -int RwVerifyPssr(const TRwKey *rw, const unsigned char *mHash, const EVP_MD *Hash, const unsigned char *EM, int sLen) { - int i = 0, ret = 0, hLen = 0, maskedDBLen = 0, MSBits = 0, emLen = 0; - const unsigned char *H = NULL; - unsigned char *DB = NULL; - EVP_MD_CTX* ctx = NULL; - unsigned char H_[EVP_MAX_MD_SIZE]; - const EVP_MD *mgf1Hash = Hash; - - ctx = EVP_MD_CTX_create(); - if (!ctx) { - return ret; - } - hLen = EVP_MD_size(Hash); - - if (hLen < 0) - goto err; - /* - * Negative sLen has special meanings: - * -1 sLen == hLen - * -2 salt length is autorecovered from signature - * -N reserved - */ - if (sLen == -1) - sLen = hLen; - else if (sLen < -2) - goto err; - - { - int bits = BN_num_bits(rw->N); - if (bits <= 0) - goto err; - - MSBits = (bits - 1) & 0x7; - } - emLen = RwModSize(rw); - - if (EM[0] & (0xFF << MSBits)) { - goto err; - } - - if (MSBits == 0) { - EM++; - emLen--; - } - - if (emLen < (hLen + sLen + 2)) /* sLen can be small negative */ - goto err; - - if (emLen < 1) - goto err; - - if (EM[emLen - 1] != 0xbc) - goto err; - - maskedDBLen = emLen - hLen - 1; - if (maskedDBLen <= 0) - goto err; - - H = EM + maskedDBLen; - DB = malloc(maskedDBLen); - - if (!DB) - goto err; - - if (PkcS1MgF1(DB, maskedDBLen, H, hLen, mgf1Hash) < 0) - goto err; - - for (i = 0; i < maskedDBLen; i++) - DB[i] ^= EM[i]; - - if (MSBits) - DB[0] &= 0xFF >> (8 - MSBits); - - for (i = 0; DB[i] == 0 && i < (maskedDBLen-1); i++) ; - - if (DB[i++] != 0x1) - goto err; - - if (sLen >= 0 && (maskedDBLen - i) != sLen) - goto err; - - if (!EVP_DigestInit_ex(ctx, Hash, NULL) || !EVP_DigestUpdate(ctx, zeroes, sizeof zeroes) || !EVP_DigestUpdate(ctx, mHash, hLen)) - goto err; - - if (maskedDBLen - i) { - if (!EVP_DigestUpdate(ctx, DB + i, maskedDBLen - i)) - goto err; - } - - if (!EVP_DigestFinal_ex(ctx, H_, NULL)) - goto err; - - ret = memcmp(H, H_, hLen) ? 0 : 1; - -err: - if (DB) - free(DB); - - EVP_MD_CTX_destroy(ctx); - - return ret; -} - -/* - rw - public key - EM - buffer to write padding value - mHash - hash value - Hash - EVP_MD() that will be used to pad - sLen - random salt len (usually == hashLen) - */ -int RwPaddingAddPssr(const TRwKey *rw, unsigned char *EM, const unsigned char *mHash, const EVP_MD *Hash, int sLen) { - int i = 0, ret = 0, hLen = 0, maskedDBLen = 0, MSBits = 0, emLen = 0; - unsigned char *H = NULL, *salt = NULL, *p = NULL; - const EVP_MD *mgf1Hash = Hash; - EVP_MD_CTX* ctx = EVP_MD_CTX_create(); - if (!ctx) { - return ret; - } - - hLen = EVP_MD_size(Hash); - if (hLen < 0) - goto err; - /* - * Negative sLen has special meanings: - * -1 sLen == hLen - * -2 salt length is maximized - * -N reserved - */ - if (sLen == -1) - sLen = hLen; - else if (sLen < -2) - goto err; - - { - int bits = BN_num_bits(rw->N); - if (bits <= 0) - goto err; - MSBits = (bits - 1) & 0x7; - } - emLen = RwModSize(rw); - if (emLen <= 0) - goto err; - - if (MSBits == 0) { - *EM++ = 0; - emLen--; - fprintf(stderr, "MSBits == 0\n"); - } - - if (sLen == -2) { - sLen = emLen - hLen - 2; - } - else if (emLen < (hLen + sLen + 2)) - goto err; - - if (sLen > 0) { - salt = malloc(sLen); - if (!salt) goto err; - if (RAND_bytes(salt, sLen) <= 0) - goto err; - } - - maskedDBLen = emLen - hLen - 1; - if (maskedDBLen < 0) - goto err; - H = EM + maskedDBLen; - - if (!EVP_DigestInit_ex(ctx, Hash, NULL) || !EVP_DigestUpdate(ctx, zeroes, sizeof zeroes) || !EVP_DigestUpdate(ctx, mHash, hLen)) - goto err; - - if (sLen && !EVP_DigestUpdate(ctx, salt, sLen)) - goto err; - - if (!EVP_DigestFinal_ex(ctx, H, NULL)) - goto err; - - /* Generate dbMask in place then perform XOR on it */ - if (PkcS1MgF1(EM, maskedDBLen, H, hLen, mgf1Hash)) - goto err; - - p = EM; - - /* Initial PS XORs with all zeroes which is a NOP so just update - * pointer. Note from a test above this value is guaranteed to - * be non-negative. - */ - p += emLen - sLen - hLen - 2; - *p++ ^= 0x1; - - if (sLen > 0) { - for (i = 0; i < sLen; i++) - *p++ ^= salt[i]; - } - - if (MSBits) - EM[0] &= 0xFF >> (8 - MSBits); - - /* H is already in place so just set final 0xbc */ - EM[emLen - 1] = 0xbc; - - ret = 1; - -err: - EVP_MD_CTX_destroy(ctx); - - if (salt) - free(salt); - - return ret; -} diff --git a/library/cpp/tvmauth/src/rw/rw_pss_sign.c b/library/cpp/tvmauth/src/rw/rw_pss_sign.c deleted file mode 100644 index 683514ad6d2..00000000000 --- a/library/cpp/tvmauth/src/rw/rw_pss_sign.c +++ /dev/null @@ -1,211 +0,0 @@ -#include "rw.h" - -#include <openssl/evp.h> - -//#define DBG_FUZZING - -int RwApply(const int flen, const unsigned char* from, unsigned char* to, const TRwKey* rw) { - int i, j, num, k, r = -1; - BN_CTX* ctx = NULL; - BIGNUM *f = NULL, *ret = NULL; - - if ((ctx = BN_CTX_secure_new()) == NULL) - goto err; - BN_CTX_start(ctx); - - f = BN_CTX_get(ctx); - ret = BN_CTX_get(ctx); - - num = BN_num_bytes(rw->N); - - if (num <= 0) - goto err; - - if (!f || !ret) - goto err; - - if (BN_bin2bn(from, flen, f) == NULL) - goto err; - if (BN_ucmp(f, rw->N) >= 0) - goto err; - - if (!rw->Meth->RwApply(ret, f, ctx, rw)) - goto err; - - j = BN_num_bytes(ret); - if (num < j || j < 0) - goto err; - - i = BN_bn2bin(ret, to + num - j); - if (i < 0 || i > num) - goto err; - - for (k = 0; k < (num - i); k++) - to[k] = 0; - r = num; - -err: - if (ctx != NULL) { - BN_CTX_end(ctx); - BN_CTX_free(ctx); - } - return r; -} - -int RwPssrSignHash(const unsigned char* from, unsigned char* to, TRwKey* rw, const EVP_MD* md) { - unsigned char* padding = NULL; - int result = 0; - - if (from == NULL || to == NULL || rw == NULL || md == NULL) - return 0; - - int digest_size = EVP_MD_size(md); - int sig_size = RwModSize(rw); - - if (digest_size <= 0 || sig_size <= 0) - return 0; - - int tries = 50; - do { - if (padding != NULL) { - free(padding); -#ifdef DBG_FUZZING - fprintf(stderr, "Padding regenerating required\n"); -#endif - } - - padding = malloc(sig_size); - if (padding == NULL) - return 0; - - if (!RwPaddingAddPssr(rw, padding, from, md, digest_size)) - goto err; - } while (padding[0] == 0x00 && tries-- > 0); - - result = RwNoPaddingSign(sig_size, padding, to, rw); - -err: - if (padding != NULL) - free(padding); - - return result; -} - -int RwPssrSignMsg(const int msgLen, const unsigned char* msg, unsigned char* to, TRwKey* rw, const EVP_MD* md) { - EVP_MD_CTX* mdctx = NULL; - unsigned char* digest = NULL; - unsigned int digestLen; - int result = 0; - - if (msg == NULL || to == NULL || rw == NULL || md == NULL) - goto err; - - if (rw->P == NULL || rw->Q == NULL) - goto err; - - if ((mdctx = EVP_MD_CTX_create()) == NULL) - goto err; - - if (1 != EVP_DigestInit_ex(mdctx, md, NULL)) - goto err; - - if (1 != EVP_DigestUpdate(mdctx, msg, msgLen)) - goto err; - - if ((digest = (unsigned char*)malloc(EVP_MD_size(md))) == NULL) - goto err; - - if (1 != EVP_DigestFinal_ex(mdctx, digest, &digestLen)) - goto err; - - result = RwPssrSignHash(digest, to, rw, md); - -err: - if (mdctx != NULL) - EVP_MD_CTX_destroy(mdctx); - if (digest != NULL) - free(digest); - - return result; -} - -int RwPssrVerifyHash(const unsigned char* from, const unsigned char* sig, const int sig_len, const TRwKey* rw, const EVP_MD* md) { - unsigned char* buffer = NULL; - int buffer_len; - int salt_size; - int result = 0; - - if (from == NULL || sig == NULL || rw == NULL || md == NULL) - return 0; - - if (rw->N == NULL || rw->Meth == NULL) - return 0; - - salt_size = EVP_MD_size(md); - if (salt_size <= 0) - return 0; - - buffer_len = RwModSize(rw); - if (buffer_len <= 0) - return 0; - - buffer = (unsigned char*)malloc(buffer_len); - if (buffer == NULL) - return 0; - - if (RwApply(sig_len, sig, buffer, rw) <= 0) - goto err; - - if (RwVerifyPssr(rw, from, md, buffer, salt_size) <= 0) - goto err; - - result = 1; - -err: - if (buffer != NULL) - free(buffer); - - return result; -} - -int RwPssrVerifyMsg(const int msgLen, const unsigned char* msg, const unsigned char* sig, const int sig_len, const TRwKey* rw, const EVP_MD* md) { - EVP_MD_CTX* mdctx = NULL; - unsigned char* digest = NULL; - unsigned int digestLen = 0; - int result = 0; - - if (msg == NULL || msgLen == 0 || sig == NULL || rw == NULL || md == NULL) - goto err; - - if (rw->N == NULL) - goto err; - - if ((mdctx = EVP_MD_CTX_create()) == NULL) - goto err; - - if (1 != EVP_DigestInit_ex(mdctx, md, NULL)) - goto err; - - int size_to_alloc = EVP_MD_size(md); - if (size_to_alloc <= 0) - goto err; - - if ((digest = (unsigned char*)malloc(size_to_alloc)) == NULL) - goto err; - - if (1 != EVP_DigestUpdate(mdctx, msg, msgLen)) - goto err; - - if (1 != EVP_DigestFinal_ex(mdctx, digest, &digestLen)) - goto err; - - result = RwPssrVerifyHash(digest, sig, sig_len, rw, md); - -err: - if (mdctx != NULL) - EVP_MD_CTX_destroy(mdctx); - if (digest != NULL) - free(digest); - - return result; -} diff --git a/library/cpp/tvmauth/src/rw/rw_sign.c b/library/cpp/tvmauth/src/rw/rw_sign.c deleted file mode 100644 index e320808dd3b..00000000000 --- a/library/cpp/tvmauth/src/rw/rw_sign.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "rw.h" - -TRwSignature* RwSignatureNew(void) { - TRwSignature* sig = NULL; - sig = malloc(sizeof(TRwSignature)); - if (!sig) - return NULL; - sig->S = NULL; - return sig; -} - -void RwSignatureFree(TRwSignature* sig) { - if (sig) { - if (sig->S) - BN_free(sig->S); - free(sig); - } -} - -int RwNoPaddingSign(int flen, const unsigned char* from, unsigned char* to, TRwKey* rw) { - int i = 0, r = 0, num = -1; - TRwSignature* sig = NULL; - - if (!rw || !rw->N || !rw->Meth || !rw->Meth->RwSign || !from || !to) - goto err; - - if ((sig = rw->Meth->RwSign(from, flen, rw)) == NULL) - goto err; - num = BN_num_bytes(rw->N); - - r = BN_bn2bin(sig->S, to); - if (r < 0) - goto err; - - /* put zeroes to the rest of the 'to' buffer */ - for (i = r; i < num; i++) { - to[i] = 0x00; - } - -err: - if (sig != NULL) { - RwSignatureFree(sig); - } - - return r; -} diff --git a/library/cpp/tvmauth/src/rw/ut/rw_ut.cpp b/library/cpp/tvmauth/src/rw/ut/rw_ut.cpp deleted file mode 100644 index 9467d5d7c41..00000000000 --- a/library/cpp/tvmauth/src/rw/ut/rw_ut.cpp +++ /dev/null @@ -1,200 +0,0 @@ -#include <library/cpp/tvmauth/src/rw/keys.h> -#include <library/cpp/tvmauth/src/rw/rw.h> - -#include <library/cpp/string_utils/base64/base64.h> -#include <library/cpp/testing/unittest/registar.h> - -#include <openssl/bn.h> -#include <openssl/evp.h> - -namespace NTvmAuth { - /* - returns 0 in case of error - */ - int MakeKeysRw(TRwKey** skey, TRwKey** vkey) { - int result = 0; - - TRwKey* rw = RwNew(); - - do { - RwGenerateKey(rw, 2048); - - if (rw == nullptr) { - printf("RwGenerateKey failed\n"); - break; /* failed */ - } - - printf("RW key bits: %d\n", BN_num_bits(rw->N)); - - /* Set signing key */ - *skey = RwPrivateKeyDup(rw); - if (*skey == nullptr) { - printf("RwPrivateKeyDup failed\n"); - break; - } - - /* Set verifier key */ - *vkey = RwPublicKeyDup(rw); - if (*vkey == nullptr) { - printf("RwPublicKeyDup failed\n"); - break; - } - - result = 1; - - } while (0); - - if (rw) { - RwFree(rw); - rw = nullptr; - } - - return result; - } - - static void PrintIt(const char* label, const unsigned char* buff, size_t len) { - if (!buff || !len) - return; - - if (label) - printf("%s: ", label); - - for (size_t i = 0; i < len; ++i) - printf("%02X", buff[i]); - - printf("\n"); - } - - int TestSignVerify() { - TRwKey *skey = nullptr, *vkey = nullptr; - const char* msg = "Test test test test test"; - unsigned int msg_len = 0; - int res = 0; - - msg_len = (unsigned int)strlen(msg); - if (MakeKeysRw(&skey, &vkey)) { - unsigned char* sign = new unsigned char[RwModSize(skey) + 10]; - int sign_len; - printf("RwModSize(skey) returned %d\n", RwModSize(skey)); - memset(sign, 0x00, RwModSize(skey) + 10); - - printf("--- Signing call ---\n"); - if ((sign_len = RwPssrSignMsg(msg_len, (unsigned char*)msg, sign, skey, (EVP_MD*)EVP_sha256())) != 0) { -#ifdef RW_PRINT_DEBUG - BIGNUM* s = BN_new(); -#endif - printf("\n"); - PrintIt("Signature", sign, RwModSize(skey)); - -#ifdef RW_PRINT_DEBUG - BN_bin2bn(sign, RW_mod_size(skey), s); - - print_bn("Signature BN", s); - - BN_free(s); -#endif - - printf("--- Verification call ---\n"); - if (RwPssrVerifyMsg(msg_len, (unsigned char*)msg, sign, sign_len, vkey, (EVP_MD*)EVP_sha256())) { - printf("Verification: success!\n"); - res = 1; - } else { - printf("Verification: failed!\n"); - printf("RwPssrVerifyMsg failed!\n"); - return 1; - } - } else { - printf("RwPssrSignMsg failed!\n"); - return 1; - } - - if (sign != nullptr) - delete[] sign; - - } else { - printf("MakeKeysRw failed!\n"); - return 1; - } - - if (skey != nullptr) { - RwFree(skey); - } - if (vkey != nullptr) - RwFree(vkey); - - return res; - } -} - -using namespace NTvmAuth; -Y_UNIT_TEST_SUITE(Rw) { - Y_UNIT_TEST(SignVerify) { - for (int i = 1; i < 10; ++i) { - UNIT_ASSERT_VALUES_EQUAL(1, TestSignVerify()); - } - } - - Y_UNIT_TEST(TKeysPriv) { - NRw::TRwPrivateKey priv(Base64Decode("MIIEmwKCAQBwsRd4frsVARIVSfj_vCdfvA3Q9SsGhSybdBDhbm8L6rPqxdoSNLCdNXzDWj7Ppf0o8uWHMxC-5Lfw0I18ri68nhm9-ndixcnbn6ti1uetgkc28eiEP6Q8ILD_JmkynbUl1aKDNAa5XsK2vFSEX402uydRomsTn46kRY23hfqcIi0ohh5VxIrpclRsRZus0JFu-RJzhqTbKYV4y4dglWPGHh5BuTv9k_Oh0_Ra8Xp5Rith5vjaKZUQ5Hyh9UtBYTkNWdvXP9OpmbiLVeRLuMzBm4HEFHDwMZ1h6LSVP-wB_spJPaMLTn3Q3JIHe-wGBYRWzU51RRYDqv4O_H12w5C1AoGBALAwCQ7fdAPG1lGclL7iWFjUofwPCFwPyDjicDT_MRRu6_Ta4GjqOGO9zuOp0o_ePgvR-7nA0fbaspM4LZNrPZwmoYBCJMtKXetg68ylu2DO-RRSN2SSh1AIZSA_8UTABk69bPzNL31j4PyZWxrgZ3zP9uZvzggveuKt5ZhCMoB7AoGBAKO9oC2AZjLdh2RaEFotTL_dY6lVcm38VA6PnigB8gB_TMuSrd4xtRw5BxvHpOCnBcUAJE0dN4_DDe5mrotKYMD2_3_lcq9PaLZadrPDCSDL89wtoVxNQNAJTqFjBFXYNu4Ze63lrsqg45TF5XmVRemyBHzXw3erd0pJaeoUDaSPAoGAJhGoHx_nVw8sDoLzeRkOJ1_6-uh_wVmVr6407_LPjrrySEq-GiYu43M3-QDp8J_J9e3S1Rpm4nQX2bEf5Gx9n4wKz7Hp0cwkOqBOWhvrAu6YLpv59wslEtkx0LYcJy6yQk5mpU8l29rPO7b50NyLnfnE2za-9DyK038FKlr5VgICgYAUd7QFsAzGW7Dsi0ILRamX-6x1Kq5Nv4qB0fPFAD5AD-mZclW7xjajhyDjePScFOC4oASJo6bx-GG9zNXRaUwYHt_v_K5V6e0Wy07WeGEkGX57hbQriagaASnULGCKuwbdwy91vLXZVBxymLyvMqi9NkCPmvhu9W7pSS09QoG0kgKBgBYGASHb7oB42sozkpfcSwsalD-B4QuB-QccTgaf5iKN3X6bXA0dRwx3udx1OlH7x8F6P3c4Gj7bVlJnBbJtZ7OE1DAIRJlpS71sHXmUt2wZ3yKKRuySUOoBDKQH_iiYAMnXrZ-Zpe-sfB-TK2NcDO-Z_tzN-cEF71xVvLMIRlAPAoGAdeikZPh1O57RxnVY72asiMRZheMBhK-9uSNPyYEZv3bUnIjg4XdMYStF2yTHNu014XvkDSQTe-drv2BDs9ExKplM4xFOtDtPQQ3mMB3GoK1qVhM_9n1QEElreurMicahkalnPo6tU4Z6PFL7PTpjRnCN67lJp0J0fxNDL13YSagCgYBA9VJrMtPjzcAx5ZCIYJjrYUPqEG_ttQN2RJIHN3MVpdpLAMIgX3tnlfyLwQFVKK45D1JgFa_1HHcxTWGtdIX4nsIjPWt-cWCCCkkw9rM5_Iqcb-YLSood6IP2OK0w0XLD1STnFRy_BRwdjPbGOYmp6YrJDZAlajDkFSdRvsz9Vg=="), - 0); - NRw::TRwPrivateKey priv2(Base64Decode("MIIEnAKCAQEA4RATOfumLD1n6ICrW5biaAl9VldinczmkNPjpUWwc3gs8PnkCrtdnPFmpBwW3gjHdSNU1OuEg5A6K1o1xiGv9sU-jd88zQBOdK6E2zwnJnkK6bNusKE2H2CLqg3aMWCmTa9JbzSy1uO7wa-xCqqNUuCko-2lyv12HhL1ICIH951SHDa4qO1U5xZhhlUAnqWi9R4tYDeMiF41WdOjwT2fg8UkbusThmxa3yjCXjD7OyjshPtukN8Tl3UyGtV_s2CLnE3f28VAi-AVW8FtgL22xbGhuyEplXRrtF1E5oV7NSqxH1FS0SYROA8ffYQGV5tfx5WDFHiXDEP6BzoVfeBDRQKBgQDzidelKZNFMWar_yj-r_cniMkZXNaNVEQbMg1A401blGjkU1r-ufGH5mkdNx4IgEoCEYBTM834Z88fYV1lOVfdT0OqtiVoC9NkLu3xhQ1r9_r6RMaAenwsV7leH8jWMOKvhkB0KNI49oznTGDqLp0AbDbtP66xdNH4dr3rw3WFywKBgQDslDdv4sdnRKN27h2drhn4Pp_Lgw2U-6MfHiyjp6BKR8Qtlld3hdb-ZjU9F0h38DqECmFIEe35_flKfd7X21CBQs9EuKR8EdaF3OAgzA-TRWeQhyHmaV7Fas1RlNqZHm8lckaZT8dX9Ygsxn0I_vUbm9pkFivwGvQnnwNQ7Te5LwKBgCVMYOzLHW911l6EbCZE6XU2HUrTKEd1bdqWCgtxPEmDl3BZcXpnyKpqSHmlH1F7s65WBfejxDM2hjin3OnXSog_x35ql_-Azu93-79QAzbQc6Z13BuWPpQxV8iw4ijqRRhzjD2pcvXlIxgebp5-H0eDt-Md2Y8rkrzyhm8EH7mwAoGAHZKG7fxY7OiUbt3Ds7XDPwfT-XBhsp90Y-PFlHT0CUj4hbLK7vC638zGp6LpDv4HUIFMKQI9vz-_KU-72vtqEChZ6JcUj4I60LucBBmB8mis8hDkPM0r2K1ZqjKbUyPN5K5I0yn46v6xBZjPoR_eo3N7TILFfgNehPPgah2m9yYCgYAecTr0pTJopizVf-Uf1f7k8RkjK5rRqoiDZkGoHGmrco0cimtf1z4w_M0jpuPBEAlAQjAKZnm_DPnj7Cuspyr7qeh1VsStAXpshd2-MKGtfv9fSJjQD0-Fivcrw_kaxhxV8MgOhRpHHtGc6YwdRdOgDYbdp_XWLpo_Dte9eG6wuQKBgDzo0e8d8pTyvCP23825rVzvrSHBZkliGkCEu0iggDnfKOreejFhQN9JeBo8sYdQFCRBptEU6k4b5O6J3NQ1Sspiez15ddqmFMD4uhJY6VsV-JFnL9YhLqVd355xZCyU4b07mReU9-LuqK2m2chjxH_HDAgUoEvO_yzR9EDYqHbNAoGAf529Ah9HIT5aG6IGTlwQdk-M7guy63U4vj4uC7z98qgvFEsV6cr4miT6RE8Aw5yAeN5pW59rZNjBNr9i-8n8kouasho2xNMTPKP8YuSNg2PNNS5T1Ou56mgsBCY5i10TIHKNIm2RVSUgzJ97BMEOZY6jQRytFfwgYkvnFzbuA9c="), - 0); - NRw::TRwPrivateKey priv3(Base64Decode("MIICVAKBgF9t2YJGAJkRRFq6fWhi3m1TFW1UOE0f6ZrfYhHAkpqGlKlh0QVfeTNPpeJhi75xXzCe6oReRUm-0DbqDNhTShC7uGUv1INYnRBQWH6E-5Fc5XrbDFSuGQw2EYjNfHy_HefHJXxQKAqPvxBDKMKkHgV58WtM6rC8jRi9sdX_ig2NAkEAg1xBDL_UkHy347HwioMscJFP-6eKeim3LoG9rd1EvOycxkoStZ4299OdyzzEXC9cjLdq401BXe-LairiMUgZawJBALn5ziBCc2ycMaYjZDon2EN55jBEe0tJdUy4mOi0ozTV9OLcBANds0nMYPjZFOY3QymzU0LcOa_An3JknI0C2ucCQGxtwTb3h7ux5Ld8jkeRYzkNoB2Y6Is5fqCYVRIJZmz0IcQFb2iW0EX92U7_BpgVuKlvSDTP9LuaxuPfmY6WXEECQBc_OcQITm2ThjTEbIdE-whvPMYIj2lpLqmXEx0WlGaavpxbgIBrtmk5jB8bIpzG6GU2amhbhzX4E-5Mk5GgW10CQBBriCGX-pIPlvx2PhFQZY4SKf908U9FNuXQN7W7qJedk5jJQlazxt76c7lnmIuF65GW7VxpqCu98W1FXEYpAy0CQG-lpihdvxaZ8SkHqNFZGnXhELT2YesLs7GehZSTwuUwx1iTpVm88PVROLYBDZqoGM316s9aZEJBALe5zEpxQTQCQQCDMszX1cQlbBCP08isuMQ2ac3S-qNd0mfRXDCRfMm4s7iuJ5MeHU3uPUVlA_MR4ULRbg1d97TGio912z4KPgjE"), - 0); - - UNIT_ASSERT_EXCEPTION(NRw::TRwPrivateKey("asdzxcv", 0), yexception); - UNIT_ASSERT_EXCEPTION(NRw::TRwPrivateKey(Base64Decode("AKBgF9t2YJGAJkRRFq6fWhi3m1TFW1UOE0f6ZrfYhHAkpqGlKlh0QVfeTNPpeJhi75xXzCe6oReRUm-0DbqDNhTShC7uGUv1INYnRBQWH6E-5Fc5XrbDFSuGQw2EYjNfHy_HefHJXxQKAqPvxBDKMKkHgV58WtM6rC8jRi9sdX_ig2NAkEAg1xBDL_UkHy347HwioMscJFP-6eKeim3LoG9rd1EvOycxkoStZ4299OdyzzEXC9cjLdq401BXe-LairiMUgZawJBALn5ziBCc2ycMaYjZDon2EN55jBEe0tJdUy4mOi0ozTV9OLcBANds0nMYPjZFOY3QymzU0LcOa_An3JknI0C2ucCQGxtwTb3h7ux5Ld8jkeRYzkNoB2Y6Is5fqCYVRIJZmz0IcQFb2iW0EX92U7_BpgVuKlvSDTP9LuaxuPfmY6WXEECQBc_OcQITm2ThjTEbIdE-whvPMYIj2lpLqmXEx0WlGaavpxbgIBrtmk5jB8bIpzG6GU2amhbhzX4E-5Mk5GgW10CQBBriCGX-pIPlvx2PhFQZY4SKf908U9FNuXQN7W7qJedk5jJQlazxt76c7lnmIuF65GW7VxpqCu98W1FXEYpAy0CQG-lpihdvxaZ8SkHqNFZGnXhELT2YesLs7GehZSTwuUwx1iTpVm88PVROLYBDZqoGM316s9aZEJBALe5zEpxQTQCQQCDMszX1cQlbBCP08isuMQ2ac3S-qNd0mfRXDCRfMm4s7iuJ5MeHU3uPUVlA_MR4ULRbg1d97TGio912z4KP"), - 0), - yexception); - - UNIT_ASSERT(!priv.SignTicket("").empty()); - } - - Y_UNIT_TEST(TKeysPub) { - NRw::TRwPublicKey pub(Base64Decode("MIIBBAKCAQBwsRd4frsVARIVSfj_vCdfvA3Q9SsGhSybdBDhbm8L6rPqxdoSNLCdNXzDWj7Ppf0o8uWHMxC-5Lfw0I18ri68nhm9-ndixcnbn6ti1uetgkc28eiEP6Q8ILD_JmkynbUl1aKDNAa5XsK2vFSEX402uydRomsTn46kRY23hfqcIi0ohh5VxIrpclRsRZus0JFu-RJzhqTbKYV4y4dglWPGHh5BuTv9k_Oh0_Ra8Xp5Rith5vjaKZUQ5Hyh9UtBYTkNWdvXP9OpmbiLVeRLuMzBm4HEFHDwMZ1h6LSVP-wB_spJPaMLTn3Q3JIHe-wGBYRWzU51RRYDqv4O_H12w5C1")); - NRw::TRwPublicKey pub2(Base64Decode("MIIBBQKCAQEA4RATOfumLD1n6ICrW5biaAl9VldinczmkNPjpUWwc3gs8PnkCrtdnPFmpBwW3gjHdSNU1OuEg5A6K1o1xiGv9sU-jd88zQBOdK6E2zwnJnkK6bNusKE2H2CLqg3aMWCmTa9JbzSy1uO7wa-xCqqNUuCko-2lyv12HhL1ICIH951SHDa4qO1U5xZhhlUAnqWi9R4tYDeMiF41WdOjwT2fg8UkbusThmxa3yjCXjD7OyjshPtukN8Tl3UyGtV_s2CLnE3f28VAi-AVW8FtgL22xbGhuyEplXRrtF1E5oV7NSqxH1FS0SYROA8ffYQGV5tfx5WDFHiXDEP6BzoVfeBDRQ==")); - NRw::TRwPublicKey pub3(Base64Decode("MIGDAoGAX23ZgkYAmRFEWrp9aGLebVMVbVQ4TR_pmt9iEcCSmoaUqWHRBV95M0-l4mGLvnFfMJ7qhF5FSb7QNuoM2FNKELu4ZS_Ug1idEFBYfoT7kVzletsMVK4ZDDYRiM18fL8d58clfFAoCo-_EEMowqQeBXnxa0zqsLyNGL2x1f-KDY0=")); - - UNIT_ASSERT_EXCEPTION(NRw::TRwPublicKey("asdzxcv"), yexception); - UNIT_ASSERT_EXCEPTION(NRw::TRwPublicKey(Base64Decode("AoGAX23ZgkYAmRFEWrp9aGLebVMVbVQ4TR_pmt9iEcCSmoaUqWHRBV95M0-l4mGLvnFfMJ7qhF5FSb7QNuoM2FNKELu4ZS_Ug1idEFBYfoT7kVzletsMVK40")), yexception); - - UNIT_ASSERT(!pub.CheckSign("~~~", "~~~")); - } - - Y_UNIT_TEST(TKeys) { - NRw::TRwPrivateKey priv(Base64Decode("MIIEmwKCAQBwsRd4frsVARIVSfj_vCdfvA3Q9SsGhSybdBDhbm8L6rPqxdoSNLCdNXzDWj7Ppf0o8uWHMxC-5Lfw0I18ri68nhm9-ndixcnbn6ti1uetgkc28eiEP6Q8ILD_JmkynbUl1aKDNAa5XsK2vFSEX402uydRomsTn46kRY23hfqcIi0ohh5VxIrpclRsRZus0JFu-RJzhqTbKYV4y4dglWPGHh5BuTv9k_Oh0_Ra8Xp5Rith5vjaKZUQ5Hyh9UtBYTkNWdvXP9OpmbiLVeRLuMzBm4HEFHDwMZ1h6LSVP-wB_spJPaMLTn3Q3JIHe-wGBYRWzU51RRYDqv4O_H12w5C1AoGBALAwCQ7fdAPG1lGclL7iWFjUofwPCFwPyDjicDT_MRRu6_Ta4GjqOGO9zuOp0o_ePgvR-7nA0fbaspM4LZNrPZwmoYBCJMtKXetg68ylu2DO-RRSN2SSh1AIZSA_8UTABk69bPzNL31j4PyZWxrgZ3zP9uZvzggveuKt5ZhCMoB7AoGBAKO9oC2AZjLdh2RaEFotTL_dY6lVcm38VA6PnigB8gB_TMuSrd4xtRw5BxvHpOCnBcUAJE0dN4_DDe5mrotKYMD2_3_lcq9PaLZadrPDCSDL89wtoVxNQNAJTqFjBFXYNu4Ze63lrsqg45TF5XmVRemyBHzXw3erd0pJaeoUDaSPAoGAJhGoHx_nVw8sDoLzeRkOJ1_6-uh_wVmVr6407_LPjrrySEq-GiYu43M3-QDp8J_J9e3S1Rpm4nQX2bEf5Gx9n4wKz7Hp0cwkOqBOWhvrAu6YLpv59wslEtkx0LYcJy6yQk5mpU8l29rPO7b50NyLnfnE2za-9DyK038FKlr5VgICgYAUd7QFsAzGW7Dsi0ILRamX-6x1Kq5Nv4qB0fPFAD5AD-mZclW7xjajhyDjePScFOC4oASJo6bx-GG9zNXRaUwYHt_v_K5V6e0Wy07WeGEkGX57hbQriagaASnULGCKuwbdwy91vLXZVBxymLyvMqi9NkCPmvhu9W7pSS09QoG0kgKBgBYGASHb7oB42sozkpfcSwsalD-B4QuB-QccTgaf5iKN3X6bXA0dRwx3udx1OlH7x8F6P3c4Gj7bVlJnBbJtZ7OE1DAIRJlpS71sHXmUt2wZ3yKKRuySUOoBDKQH_iiYAMnXrZ-Zpe-sfB-TK2NcDO-Z_tzN-cEF71xVvLMIRlAPAoGAdeikZPh1O57RxnVY72asiMRZheMBhK-9uSNPyYEZv3bUnIjg4XdMYStF2yTHNu014XvkDSQTe-drv2BDs9ExKplM4xFOtDtPQQ3mMB3GoK1qVhM_9n1QEElreurMicahkalnPo6tU4Z6PFL7PTpjRnCN67lJp0J0fxNDL13YSagCgYBA9VJrMtPjzcAx5ZCIYJjrYUPqEG_ttQN2RJIHN3MVpdpLAMIgX3tnlfyLwQFVKK45D1JgFa_1HHcxTWGtdIX4nsIjPWt-cWCCCkkw9rM5_Iqcb-YLSood6IP2OK0w0XLD1STnFRy_BRwdjPbGOYmp6YrJDZAlajDkFSdRvsz9Vg=="), - 0); - NRw::TRwPublicKey pub(Base64Decode("MIIBBAKCAQBwsRd4frsVARIVSfj_vCdfvA3Q9SsGhSybdBDhbm8L6rPqxdoSNLCdNXzDWj7Ppf0o8uWHMxC-5Lfw0I18ri68nhm9-ndixcnbn6ti1uetgkc28eiEP6Q8ILD_JmkynbUl1aKDNAa5XsK2vFSEX402uydRomsTn46kRY23hfqcIi0ohh5VxIrpclRsRZus0JFu-RJzhqTbKYV4y4dglWPGHh5BuTv9k_Oh0_Ra8Xp5Rith5vjaKZUQ5Hyh9UtBYTkNWdvXP9OpmbiLVeRLuMzBm4HEFHDwMZ1h6LSVP-wB_spJPaMLTn3Q3JIHe-wGBYRWzU51RRYDqv4O_H12w5C1")); - - const TString data = "my magic data"; - - UNIT_ASSERT(pub.CheckSign(data, priv.SignTicket(data))); - UNIT_ASSERT(!pub.CheckSign("~~~~" + data, priv.SignTicket(data))); - UNIT_ASSERT(!pub.CheckSign(data, "~~~~" + priv.SignTicket(data))); - - UNIT_ASSERT(pub.CheckSign(data, - Base64Decode("EC5hZunmK3hOJZeov_XlNIXcwj5EsgX94lMd-tQJTNUO4NR6bCO7qQkKjEeFJmI2QFYXGY-iSf9WeMJ_brECAMyYAix-L8sZqcMPXD945QgkPsNQKyC0DX9FkgfSh6ZKkA-UvFSHrkn3QbeE9omk3-yXpqR-M8DlVqmp3mwdYlYRq0NdfTaD3AMXVA4aZTbW3OmhJoLJ8AxJ3w1oG5q_lk8dpW9vvqfIzsfPABme6sY5XyPmsjYaRDf9z4ZJgR-wTkG06_N_YzIklS5T2s_4FUKLz5gLMhsnVlNUpgZyRN9sXTAn9-zMJnCwAC8WRgykWnljPGDDJCjk-Xwsg7AOLQ=="))); - UNIT_ASSERT(pub.CheckSign(data, - Base64Decode("JbHSn1QEQeOEvzyt-LpawbQv4vPEEE05bWhjB2-MkoV-tyq9FykSqGqhP3ZFc1_FPrqguwEYrHibI2l5w3q8wnI1fcyRUoNuJxmBSzf2f_Uzn9ZoUSc7D9pTGSvK_hhZoL4YMc_VfbdEdnDuvHZNlZyaDPH9EbmUqyXjnXTEwRoK0fAU1rhlHvSZvnp0ctVBWSkaQsaU8dJTKDBtIQVP1D5Py2pKB2NBF_Ytz2thWt7iLjbTyjtis6DC-JKwjFBqv6nQf42sKalHQqWFuIvBCIfNUswEw4_sGfwWVSBBmFplf7FmD7sN8znUahYUPGCe1uFNly6WwpPJsm8VtiU80g=="))); - UNIT_ASSERT(pub.CheckSign(data, - Base64Decode("FeMZtDP-yuoNqK2HYw3JxTV9v7p8IoQEuRMtuHddafh4bq1ZOeEqg7g7Su6M3iq_kN9DZ_fVhuhuVcbZmNYPIvJ8oL5DE80KI3d1Qbs9mS8_X4Oq2TJpZgNfFG-z_LPRZSNRP9Q8sQhlAoSZHOSZkBFcYj1EuqEp6nSSSbX8Ji4Se-TfhIh3YFQkr-Ivk_3NmSXhDXUaW7CHo2rVm58QJ2cgSEuxzBH-Q8E8tGDCEmk4p3_iot9XY8RRN-_j0yi15etmXCUIKFbpDogtHdT8CyAEVHMYvsLqkLux9pzy3RdvNQmoPjol3wIm-H0wMtF_pMw4G2QLNev6he6xWeckxw=="))); - } - - Y_UNIT_TEST(Keygen) { - for (size_t idx = 0; idx < 100; ++idx) { - NRw::TKeyPair pair = NRw::GenKeyPair(1024); - NRw::TRwPrivateKey priv(pair.Private, 0); - NRw::TRwPublicKey pub(pair.Public); - - const TString data = "my magic data"; - TStringStream s; - s << "data='" << data << "'."; - s << "private='" << Base64Encode(pair.Private) << "'."; - s << "public='" << Base64Encode(pair.Public) << "'."; - TString sign; - UNIT_ASSERT_NO_EXCEPTION_C(sign = priv.SignTicket(data), s.Str()); - s << "sign='" << Base64Encode(sign) << "'."; - UNIT_ASSERT_C(pub.CheckSign(data, sign), s.Str()); - } - } -} diff --git a/library/cpp/tvmauth/src/rw/ut_large/gen/main.cpp b/library/cpp/tvmauth/src/rw/ut_large/gen/main.cpp deleted file mode 100644 index 31a599c9968..00000000000 --- a/library/cpp/tvmauth/src/rw/ut_large/gen/main.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include <library/cpp/tvmauth/src/rw/keys.h> - -#include <library/cpp/string_utils/base64/base64.h> - -#include <util/generic/yexception.h> - -using namespace NTvmAuth; - -const TString DATA = "my magic data"; - -int main(int, char**) { - const NRw::TKeyPair pair = NRw::GenKeyPair(1024); - const NRw::TRwPrivateKey priv(pair.Private, 0); - const NRw::TRwPublicKey pub(pair.Public); - - Cout << "data='" << DATA << "'." - << "private='" << Base64Encode(pair.Private) << "'." - << "public='" << Base64Encode(pair.Public) << "'."; - - TString sign; - try { - sign = priv.SignTicket(DATA); - Cout << "sign='" << Base64Encode(sign) << "'."; - Y_ENSURE(pub.CheckSign(DATA, sign)); - } catch (const std::exception& e) { - Cout << "what='" << e.what() << "'" << Endl; - return 1; - } - Cout << Endl; - - return 0; -} diff --git a/library/cpp/tvmauth/src/rw/ut_large/test.py b/library/cpp/tvmauth/src/rw/ut_large/test.py deleted file mode 100644 index 0cf95d98485..00000000000 --- a/library/cpp/tvmauth/src/rw/ut_large/test.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import print_function - -import os -import subprocess -import sys - -import yatest.common as yc - - -def test_fuzzing(): - errfile = './errfile' - outfile = './outfile' - env = os.environ.copy() - - for number in range(25000): - with open(errfile, 'w') as fe: - with open(outfile, 'w') as fo: - p = subprocess.Popen( - [ - yc.build_path('library/cpp/tvmauth/src/rw/ut_large/gen/gen'), - ], - env=env, - stdout=fo, - stderr=fe, - ) - code = p.wait() - - with open(errfile) as fe: - all = fe.read() - if all != '': - with open(outfile) as fo: - print(fo.read(), file=sys.stderr) - assert all == '' - - assert code == 0 diff --git a/library/cpp/tvmauth/src/service_impl.cpp b/library/cpp/tvmauth/src/service_impl.cpp deleted file mode 100644 index 463b5d634c7..00000000000 --- a/library/cpp/tvmauth/src/service_impl.cpp +++ /dev/null @@ -1,204 +0,0 @@ -#include "service_impl.h" - -#include "parser.h" -#include "utils.h" - -#include <library/cpp/tvmauth/exception.h> -#include <library/cpp/tvmauth/ticket_status.h> - -#include <util/generic/strbuf.h> -#include <util/string/cast.h> -#include <util/string/split.h> - -namespace NTvmAuth { - static const char* EX_MSG = "Method cannot be used in non-valid ticket"; - - TCheckedServiceTicket::TImpl::operator bool() const { - return (Status_ == ETicketStatus::Ok); - } - - TTvmId TCheckedServiceTicket::TImpl::GetDst() const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - return ProtobufTicket_.service().dstclientid(); - } - - TTvmId TCheckedServiceTicket::TImpl::GetSrc() const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - return ProtobufTicket_.service().srcclientid(); - } - - const TScopes& TCheckedServiceTicket::TImpl::GetScopes() const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - if (CachedScopes_.empty()) { - for (const auto& el : ProtobufTicket_.service().scopes()) { - CachedScopes_.push_back(el); - } - } - return CachedScopes_; - } - - bool TCheckedServiceTicket::TImpl::HasScope(TStringBuf scopeName) const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - return std::binary_search(ProtobufTicket_.service().scopes().begin(), ProtobufTicket_.service().scopes().end(), scopeName); - } - - ETicketStatus TCheckedServiceTicket::TImpl::GetStatus() const { - return Status_; - } - - time_t TCheckedServiceTicket::TImpl::GetExpirationTime() const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - return ProtobufTicket_.expirationtime(); - } - - TString TCheckedServiceTicket::TImpl::DebugInfo() const { - if (CachedDebugInfo_) { - return CachedDebugInfo_; - } - - if (Status_ == ETicketStatus::Malformed) { - CachedDebugInfo_ = "status=malformed;"; - return CachedDebugInfo_; - } - - TString targetString = "ticket_type="; - targetString.reserve(256); - if (Status_ == ETicketStatus::InvalidTicketType) { - targetString.append("not-serv;"); - CachedDebugInfo_ = targetString; - return targetString; - } - - targetString.append("serv"); - if (ProtobufTicket_.has_expirationtime()) - targetString.append(";expiration_time=").append(IntToString<10>(ProtobufTicket_.expirationtime())); - if (ProtobufTicket_.service().has_srcclientid()) { - targetString.append(";src=").append(IntToString<10>(ProtobufTicket_.service().srcclientid())); - } - if (ProtobufTicket_.service().has_dstclientid()) { - targetString.append(";dst=").append(IntToString<10>(ProtobufTicket_.service().dstclientid())); - } - for (const auto& scope : ProtobufTicket_.service().scopes()) { - targetString.append(";scope=").append(scope); - } - if (ProtobufTicket_.service().has_issueruid()) { - targetString.append(";issuer_uid=").append(IntToString<10>(ProtobufTicket_.service().GetissuerUid())); - } - targetString.append(";"); - - CachedDebugInfo_ = targetString; - return targetString; - } - - TMaybe<TUid> TCheckedServiceTicket::TImpl::GetIssuerUid() const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - return ProtobufTicket_.service().has_issueruid() - ? ProtobufTicket_.service().GetissuerUid() - : TMaybe<TUid>(); - } - - void TCheckedServiceTicket::TImpl::SetStatus(ETicketStatus status) { - Status_ = status; - } - - TCheckedServiceTicket::TImpl::TImpl(ETicketStatus status, ticket2::Ticket&& protobufTicket) - : Status_(status) - , ProtobufTicket_(std::move(protobufTicket)) - { - } - - TServiceTicketImplPtr TCheckedServiceTicket::TImpl::CreateTicketForTests(ETicketStatus status, - TTvmId src, - TMaybe<TUid> issuerUid) { - ticket2::Ticket proto; - proto.mutable_service()->set_srcclientid(src); - proto.mutable_service()->set_dstclientid(100500); - if (issuerUid) { - proto.mutable_service()->set_issueruid(*issuerUid); - } - return MakeHolder<TImpl>(status, std::move(proto)); - } - - TServiceContext::TImpl::TImpl(TStringBuf secretBase64, TTvmId selfTvmId, TStringBuf tvmKeysResponse) - : Secret_(ParseSecret(secretBase64)) - , SelfTvmId_(selfTvmId) - { - ResetKeys(tvmKeysResponse); - } - - TServiceContext::TImpl::TImpl(TTvmId selfTvmId, TStringBuf tvmKeysResponse) - : SelfTvmId_(selfTvmId) - { - ResetKeys(tvmKeysResponse); - } - - TServiceContext::TImpl::TImpl(TStringBuf secretBase64) - : Secret_(ParseSecret(secretBase64)) - { - } - - void TServiceContext::TImpl::ResetKeys(TStringBuf tvmKeysResponse) { - tvm_keys::Keys protoKeys; - if (!protoKeys.ParseFromString(TParserTvmKeys::ParseStrV1(tvmKeysResponse))) { - ythrow TMalformedTvmKeysException() << "Malformed TVM keys"; - } - - NRw::TPublicKeys keys; - for (int idx = 0; idx < protoKeys.tvm_size(); ++idx) { - const tvm_keys::TvmKey& k = protoKeys.tvm(idx); - keys.emplace(k.gen().id(), - k.gen().body()); - } - - if (keys.empty()) { - ythrow TEmptyTvmKeysException() << "Empty TVM keys"; - } - - Keys_ = std::move(keys); - } - - TServiceTicketImplPtr TServiceContext::TImpl::Check(TStringBuf ticketBody, const TServiceContext::TCheckFlags& flags) const { - Y_ENSURE_EX(!Keys_.empty(), TEmptyTvmKeysException() << "Empty TVM keys"); - - TParserTickets::TRes res = TParserTickets::ParseV3(ticketBody, Keys_, TParserTickets::ServiceFlag()); - - if (res.Status != ETicketStatus::Ok) { - return MakeHolder<TCheckedServiceTicket::TImpl>(res.Status, std::move(res.Ticket)); - } - - if (!res.Ticket.has_service()) { - return MakeHolder<TCheckedServiceTicket::TImpl>(ETicketStatus::Malformed, std::move(res.Ticket)); - } - - if (flags.NeedDstCheck && SelfTvmId_ != res.Ticket.service().dstclientid()) { - return MakeHolder<TCheckedServiceTicket::TImpl>(ETicketStatus::InvalidDst, std::move(res.Ticket)); - } - - return MakeHolder<TCheckedServiceTicket::TImpl>(ETicketStatus::Ok, std::move(res.Ticket)); - } - - TString TServiceContext::TImpl::SignCgiParamsForTvm(TStringBuf ts, TStringBuf dst, TStringBuf scopes) const { - if (Secret_.Value().empty()) { - ythrow TMalformedTvmSecretException() << "Malformed TVM secret: it is empty"; - } - return NUtils::SignCgiParamsForTvm(Secret_, ts, dst, scopes); - } - - TString TServiceContext::TImpl::ParseSecret(TStringBuf secretBase64) { - while (secretBase64 && secretBase64.back() == '\n') { - secretBase64.Chop(1); - } - - if (secretBase64.empty()) { - ythrow TMalformedTvmSecretException() << "Malformed TVM secret: it is empty"; - } - - const TString secret = NUtils::Base64url2bin(secretBase64); - if (secret.empty()) { - ythrow TMalformedTvmSecretException() << "Malformed TVM secret: invalid base64url"; - } - - return secret; - } - -} diff --git a/library/cpp/tvmauth/src/service_impl.h b/library/cpp/tvmauth/src/service_impl.h deleted file mode 100644 index 26202f283e8..00000000000 --- a/library/cpp/tvmauth/src/service_impl.h +++ /dev/null @@ -1,77 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/src/protos/ticket2.pb.h> -#include <library/cpp/tvmauth/src/protos/tvm_keys.pb.h> -#include <library/cpp/tvmauth/src/rw/keys.h> - -#include <library/cpp/tvmauth/type.h> -#include <library/cpp/tvmauth/deprecated/service_context.h> - -#include <library/cpp/charset/ci_string.h> -#include <library/cpp/string_utils/secret_string/secret_string.h> - -#include <util/generic/maybe.h> - -#include <string> - -namespace NTvmAuth { - using TServiceTicketImplPtr = THolder<TCheckedServiceTicket::TImpl>; - class TCheckedServiceTicket::TImpl { - public: - explicit operator bool() const; - - TTvmId GetDst() const; - TTvmId GetSrc() const; - const TScopes& GetScopes() const; - bool HasScope(TStringBuf scopeName) const; - ETicketStatus GetStatus() const; - time_t GetExpirationTime() const; - - TString DebugInfo() const; - TMaybe<TUid> GetIssuerUid() const; - - void SetStatus(ETicketStatus status); - - /*! - * Constructor for creation invalid ticket storing error status in TServiceContext - * @param status - * @param protobufTicket - */ - TImpl(ETicketStatus status, ticket2::Ticket&& protobufTicket); - - static TServiceTicketImplPtr CreateTicketForTests(ETicketStatus status, - TTvmId src, - TMaybe<TUid> issuerUid); - - private: - ETicketStatus Status_; - ticket2::Ticket ProtobufTicket_; - mutable TScopes CachedScopes_; - mutable TString CachedDebugInfo_; - }; - - class TServiceContext::TImpl { - public: - TImpl(TStringBuf secretBase64, TTvmId selfTvmId, TStringBuf tvmKeysResponse); - TImpl(TTvmId selfTvmId, TStringBuf tvmKeysResponse); - TImpl(TStringBuf secretBase64); - - void ResetKeys(TStringBuf tvmKeysResponse); - - TServiceTicketImplPtr Check(TStringBuf ticketBody, const TServiceContext::TCheckFlags& flags = {}) const; - TString SignCgiParamsForTvm(TStringBuf ts, TStringBuf dst, TStringBuf scopes = TStringBuf()) const; - - const NRw::TPublicKeys& GetKeys() const { // for tests - return Keys_; - } - - private: - static TString ParseSecret(TStringBuf secretBase64); - - NRw::TPublicKeys Keys_; - const NSecretString::TSecretString Secret_; - const TTvmId SelfTvmId_ = 0; - - ::google::protobuf::LogSilencer LogSilencer_; - }; -} diff --git a/library/cpp/tvmauth/src/service_ticket.cpp b/library/cpp/tvmauth/src/service_ticket.cpp deleted file mode 100644 index 9716836cf5e..00000000000 --- a/library/cpp/tvmauth/src/service_ticket.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "service_impl.h" - -#include <library/cpp/tvmauth/checked_service_ticket.h> - -namespace NTvmAuth { - static const char* EX_MSG = "Ticket already moved out"; - - TCheckedServiceTicket::TCheckedServiceTicket(THolder<TImpl> impl) - : Impl_(std::move(impl)) - { - } - - TCheckedServiceTicket::TCheckedServiceTicket(TCheckedServiceTicket&& o) = default; - TCheckedServiceTicket& TCheckedServiceTicket::operator=(TCheckedServiceTicket&& o) = default; - TCheckedServiceTicket::~TCheckedServiceTicket() = default; - - TCheckedServiceTicket::operator bool() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->operator bool(); - } - - TTvmId TCheckedServiceTicket::GetDst() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->GetDst(); - } - - TTvmId TCheckedServiceTicket::GetSrc() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->GetSrc(); - } - - ETicketStatus TCheckedServiceTicket::GetStatus() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->GetStatus(); - } - - TString TCheckedServiceTicket::DebugInfo() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->DebugInfo(); - } - - TMaybe<TUid> TCheckedServiceTicket::GetIssuerUid() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->GetIssuerUid(); - } -} diff --git a/library/cpp/tvmauth/src/status.cpp b/library/cpp/tvmauth/src/status.cpp deleted file mode 100644 index 1b08fc098f9..00000000000 --- a/library/cpp/tvmauth/src/status.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include <library/cpp/tvmauth/ticket_status.h> - -#include <util/generic/yexception.h> - -namespace NTvmAuth { - TStringBuf StatusToString(ETicketStatus st) { - switch (st) { - case ETicketStatus::Ok: - return "OK"; - case ETicketStatus::Expired: - return "Expired ticket"; - case ETicketStatus::InvalidBlackboxEnv: - return "Invalid BlackBox environment"; - case ETicketStatus::InvalidDst: - return "Invalid ticket destination"; - case ETicketStatus::InvalidTicketType: - return "Invalid ticket type"; - case ETicketStatus::Malformed: - return "Malformed ticket"; - case ETicketStatus::MissingKey: - return "Context does not have required key to check ticket: public keys are too old"; - case ETicketStatus::SignBroken: - return "Invalid ticket signature"; - case ETicketStatus::UnsupportedVersion: - return "Unsupported ticket version"; - case ETicketStatus::NoRoles: - return "Subject (src or defaultUid) does not have any roles in IDM"; - } - - ythrow yexception() << "Unexpected status: " << static_cast<int>(st); - } -} diff --git a/library/cpp/tvmauth/src/unittest.cpp b/library/cpp/tvmauth/src/unittest.cpp deleted file mode 100644 index 5133d79ea9d..00000000000 --- a/library/cpp/tvmauth/src/unittest.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "service_impl.h" -#include "user_impl.h" - -#include <library/cpp/tvmauth/unittest.h> - -namespace NTvmAuth::NUnittest { - TCheckedServiceTicket CreateServiceTicket(ETicketStatus status, TTvmId src, TMaybe<TUid> issuerUid) { - return TCheckedServiceTicket(TCheckedServiceTicket::TImpl::CreateTicketForTests(status, src, issuerUid)); - } - - TCheckedUserTicket CreateUserTicket(ETicketStatus status, TUid defaultUid, const TScopes& scopes, const TUids& uids, EBlackboxEnv env) { - return TCheckedUserTicket(TCheckedUserTicket::TImpl::CreateTicketForTests(status, defaultUid, scopes, uids, env)); - } -} diff --git a/library/cpp/tvmauth/src/user_impl.cpp b/library/cpp/tvmauth/src/user_impl.cpp deleted file mode 100644 index 4fda799aac1..00000000000 --- a/library/cpp/tvmauth/src/user_impl.cpp +++ /dev/null @@ -1,241 +0,0 @@ -#include "user_impl.h" - -#include "parser.h" - -#include <library/cpp/tvmauth/exception.h> -#include <library/cpp/tvmauth/ticket_status.h> - -#include <util/generic/strbuf.h> -#include <util/string/cast.h> -#include <util/string/split.h> - -#include <algorithm> - -namespace NTvmAuth { - static const char* EX_MSG = "Method cannot be used in non-valid ticket"; - - TStringBuf GetBlackboxEnvAsString(EBlackboxEnv environment) { - switch (environment) { - case (EBlackboxEnv::Prod): - return TStringBuf("Prod"); - case (EBlackboxEnv::Test): - return TStringBuf("Test"); - case (EBlackboxEnv::ProdYateam): - return TStringBuf("ProdYateam"); - case (EBlackboxEnv::TestYateam): - return TStringBuf("TestYateam"); - case (EBlackboxEnv::Stress): - return TStringBuf("Stress"); - default: - throw yexception() << "Unknown environment"; - } - } - - TCheckedUserTicket::TImpl::operator bool() const { - return (Status_ == ETicketStatus::Ok); - } - - TUid TCheckedUserTicket::TImpl::GetDefaultUid() const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - return ProtobufTicket_.user().defaultuid(); - } - - time_t TCheckedUserTicket::TImpl::GetExpirationTime() const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - return ProtobufTicket_.expirationtime(); - } - - const TScopes& TCheckedUserTicket::TImpl::GetScopes() const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - if (CachedScopes_.empty()) { - for (const auto& el : ProtobufTicket_.user().scopes()) { - CachedScopes_.push_back(el); - } - } - return CachedScopes_; - } - - bool TCheckedUserTicket::TImpl::HasScope(TStringBuf scopeName) const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - return std::binary_search(ProtobufTicket_.user().scopes().begin(), ProtobufTicket_.user().scopes().end(), scopeName); - } - - ETicketStatus TCheckedUserTicket::TImpl::GetStatus() const { - return Status_; - } - - const TUids& TCheckedUserTicket::TImpl::GetUids() const { - Y_ENSURE_EX(bool(*this), TNotAllowedException() << EX_MSG); - if (CachedUids_.empty()) { - for (const auto& user : ProtobufTicket_.user().users()) { - CachedUids_.push_back(user.uid()); - } - } - return CachedUids_; - } - - TString TCheckedUserTicket::TImpl::DebugInfo() const { - if (CachedDebugInfo_) { - return CachedDebugInfo_; - } - - if (Status_ == ETicketStatus::Malformed) { - CachedDebugInfo_ = "status=malformed;"; - return CachedDebugInfo_; - } - - TString targetString = "ticket_type="; - targetString.reserve(256); - if (Status_ == ETicketStatus::InvalidTicketType) { - targetString.append("not-user;"); - CachedDebugInfo_ = targetString; - return targetString; - } - - targetString.append("user"); - if (ProtobufTicket_.expirationtime() > 0) - targetString.append(";expiration_time=").append(IntToString<10>(ProtobufTicket_.expirationtime())); - for (const auto& scope : ProtobufTicket_.user().scopes()) { - targetString.append(";scope=").append(scope); - } - - if (ProtobufTicket_.user().defaultuid() > 0) - targetString.append(";default_uid=").append(IntToString<10>(ProtobufTicket_.user().defaultuid())); - for (const auto& user : ProtobufTicket_.user().users()) { - targetString.append(";uid=").append(IntToString<10>(user.uid())); - } - - targetString.append(";env="); - EBlackboxEnv environment = static_cast<EBlackboxEnv>(ProtobufTicket_.user().env()); - targetString.append(GetBlackboxEnvAsString(environment)); - targetString.append(";"); - - CachedDebugInfo_ = targetString; - return targetString; - } - - EBlackboxEnv TCheckedUserTicket::TImpl::GetEnv() const { - return (EBlackboxEnv)ProtobufTicket_.user().env(); - } - - void TCheckedUserTicket::TImpl::SetStatus(ETicketStatus status) { - Status_ = status; - } - - TCheckedUserTicket::TImpl::TImpl(ETicketStatus status, ticket2::Ticket&& protobufTicket) - : Status_(status) - , ProtobufTicket_(std::move(protobufTicket)) - { - } - - TUserTicketImplPtr TCheckedUserTicket::TImpl::CreateTicketForTests(ETicketStatus status, - TUid defaultUid, - TScopes scopes, - TUids uids, - EBlackboxEnv env) { - auto prepareCont = [](auto& cont) { - std::sort(cont.begin(), cont.end()); - cont.erase(std::unique(cont.begin(), cont.end()), cont.end()); - }; - auto erase = [](auto& cont, auto val) { - auto it = std::find(cont.begin(), cont.end(), val); - if (it != cont.end()) { - cont.erase(it); - } - }; - - prepareCont(scopes); - erase(scopes, ""); - - uids.push_back(defaultUid); - prepareCont(uids); - erase(uids, 0); - Y_ENSURE(!uids.empty(), "User ticket cannot contain empty uid list"); - - ticket2::Ticket proto; - for (TUid uid : uids) { - proto.mutable_user()->add_users()->set_uid(uid); - } - proto.mutable_user()->set_defaultuid(defaultUid); - proto.mutable_user()->set_entrypoint(100500); - for (TStringBuf scope : scopes) { - proto.mutable_user()->add_scopes(TString(scope)); - } - - proto.mutable_user()->set_env((tvm_keys::BbEnvType)env); - - return MakeHolder<TImpl>(status, std::move(proto)); - } - - TUserContext::TImpl::TImpl(EBlackboxEnv env, TStringBuf tvmKeysResponse) - : Env_(env) - { - ResetKeys(tvmKeysResponse); - } - - void TUserContext::TImpl::ResetKeys(TStringBuf tvmKeysResponse) { - tvm_keys::Keys protoKeys; - if (!protoKeys.ParseFromString(TParserTvmKeys::ParseStrV1(tvmKeysResponse))) { - ythrow TMalformedTvmKeysException() << "Malformed TVM keys"; - } - - NRw::TPublicKeys keys; - for (int idx = 0; idx < protoKeys.bb_size(); ++idx) { - const tvm_keys::BbKey& k = protoKeys.bb(idx); - if (IsAllowed(k.env())) { - keys.emplace(k.gen().id(), - k.gen().body()); - } - } - - if (keys.empty()) { - ythrow TEmptyTvmKeysException() << "Empty TVM keys"; - } - - Keys_ = std::move(keys); - } - - TUserTicketImplPtr TUserContext::TImpl::Check(TStringBuf ticketBody) const { - TParserTickets::TRes res = TParserTickets::ParseV3(ticketBody, Keys_, TParserTickets::UserFlag()); - ETicketStatus status = CheckProtobufUserTicket(res.Ticket); - - if (res.Status != ETicketStatus::Ok && !(res.Status == ETicketStatus::MissingKey && status == ETicketStatus::InvalidBlackboxEnv)) { - status = res.Status; - } - return MakeHolder<TCheckedUserTicket::TImpl>(status, std::move(res.Ticket)); - } - - ETicketStatus TUserContext::TImpl::CheckProtobufUserTicket(const ticket2::Ticket& ticket) const { - if (!ticket.has_user()) { - return ETicketStatus::Malformed; - } - if (!IsAllowed(ticket.user().env())) { - return ETicketStatus::InvalidBlackboxEnv; - } - return ETicketStatus::Ok; - } - - const NRw::TPublicKeys& TUserContext::TImpl::GetKeys() const { - return Keys_; - } - - bool TUserContext::TImpl::IsAllowed(tvm_keys::BbEnvType env) const { - if (env == tvm_keys::Prod && (Env_ == EBlackboxEnv::Prod || Env_ == EBlackboxEnv::Stress)) { - return true; - } - if (env == tvm_keys::ProdYateam && Env_ == EBlackboxEnv::ProdYateam) { - return true; - } - if (env == tvm_keys::Test && Env_ == EBlackboxEnv::Test) { - return true; - } - if (env == tvm_keys::TestYateam && Env_ == EBlackboxEnv::TestYateam) { - return true; - } - if (env == tvm_keys::Stress && Env_ == EBlackboxEnv::Stress) { - return true; - } - - return false; - } -} diff --git a/library/cpp/tvmauth/src/user_impl.h b/library/cpp/tvmauth/src/user_impl.h deleted file mode 100644 index 292e94bf5b2..00000000000 --- a/library/cpp/tvmauth/src/user_impl.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/src/protos/ticket2.pb.h> -#include <library/cpp/tvmauth/src/protos/tvm_keys.pb.h> -#include <library/cpp/tvmauth/src/rw/keys.h> - -#include <library/cpp/tvmauth/deprecated/user_context.h> - -#include <library/cpp/charset/ci_string.h> - -#include <unordered_map> - -namespace NTvmAuth { - using TUserTicketImplPtr = THolder<TCheckedUserTicket::TImpl>; - class TCheckedUserTicket::TImpl { - public: - explicit operator bool() const; - - TUid GetDefaultUid() const; - time_t GetExpirationTime() const; - const TScopes& GetScopes() const; - bool HasScope(TStringBuf scopeName) const; - ETicketStatus GetStatus() const; - const TUids& GetUids() const; - - TString DebugInfo() const; - - EBlackboxEnv GetEnv() const; - - void SetStatus(ETicketStatus status); - - /*! - * Constructor for creation invalid ticket storing error status in TServiceContext - * @param status - * @param protobufTicket - */ - TImpl(ETicketStatus status, ticket2::Ticket&& protobufTicket); - - static TUserTicketImplPtr CreateTicketForTests(ETicketStatus status, - TUid defaultUid, - TScopes scopes, - TUids uids, - EBlackboxEnv env = EBlackboxEnv::Test); - - private: - static const int MaxUserCount = 15; - - ETicketStatus Status_; - ticket2::Ticket ProtobufTicket_; - mutable TScopes CachedScopes_; - mutable TUids CachedUids_; - mutable TString CachedDebugInfo_; - }; - - class TUserContext::TImpl { - public: - TImpl(EBlackboxEnv env, TStringBuf tvmKeysResponse); - void ResetKeys(TStringBuf tvmKeysResponse); - - TUserTicketImplPtr Check(TStringBuf ticketBody) const; - const NRw::TPublicKeys& GetKeys() const; - - bool IsAllowed(tvm_keys::BbEnvType env) const; - - private: - ETicketStatus CheckProtobufUserTicket(const ticket2::Ticket& ticket) const; - - NRw::TPublicKeys Keys_; - EBlackboxEnv Env_; - ::google::protobuf::LogSilencer LogSilencer_; - }; -} diff --git a/library/cpp/tvmauth/src/user_ticket.cpp b/library/cpp/tvmauth/src/user_ticket.cpp deleted file mode 100644 index 3e4e0c03645..00000000000 --- a/library/cpp/tvmauth/src/user_ticket.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "user_impl.h" - -#include <library/cpp/tvmauth/checked_user_ticket.h> - -namespace NTvmAuth { - static const char* EX_MSG = "Ticket already moved out"; - - TCheckedUserTicket::TCheckedUserTicket(THolder<TCheckedUserTicket::TImpl> impl) - : Impl_(std::move(impl)) - { - } - - TCheckedUserTicket::TCheckedUserTicket(TCheckedUserTicket&& o) = default; - TCheckedUserTicket::~TCheckedUserTicket() = default; - TCheckedUserTicket& TCheckedUserTicket::operator=(TCheckedUserTicket&& o) = default; - - TCheckedUserTicket::operator bool() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->operator bool(); - } - - const TUids& TCheckedUserTicket::GetUids() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->GetUids(); - } - - TUid TCheckedUserTicket::GetDefaultUid() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->GetDefaultUid(); - } - - const TScopes& TCheckedUserTicket::GetScopes() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->GetScopes(); - } - - bool TCheckedUserTicket::HasScope(TStringBuf scopeName) const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->HasScope(scopeName); - } - - ETicketStatus TCheckedUserTicket::GetStatus() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->GetStatus(); - } - - TString TCheckedUserTicket::DebugInfo() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->DebugInfo(); - } - - EBlackboxEnv TCheckedUserTicket::GetEnv() const { - Y_ENSURE(Impl_, EX_MSG); - return Impl_->GetEnv(); - } -} diff --git a/library/cpp/tvmauth/src/ut/parser_ut.cpp b/library/cpp/tvmauth/src/ut/parser_ut.cpp deleted file mode 100644 index 530f45331a2..00000000000 --- a/library/cpp/tvmauth/src/ut/parser_ut.cpp +++ /dev/null @@ -1,143 +0,0 @@ -#include <library/cpp/tvmauth/src/parser.h> -#include <library/cpp/tvmauth/src/utils.h> - -#include <library/cpp/tvmauth/exception.h> -#include <library/cpp/tvmauth/ticket_status.h> - -#include <library/cpp/testing/unittest/registar.h> - -Y_UNIT_TEST_SUITE(ParserTestSuite) { - using namespace NTvmAuth; - - Y_UNIT_TEST(Keys) { - UNIT_ASSERT_EXCEPTION(TParserTvmKeys::ParseStrV1("2:asds"), TMalformedTvmKeysException); - UNIT_ASSERT_EXCEPTION(TParserTvmKeys::ParseStrV1("3:asds"), TMalformedTvmKeysException); - UNIT_ASSERT_EXCEPTION(TParserTvmKeys::ParseStrV1("1:+a/sds"), TMalformedTvmKeysException); - - UNIT_ASSERT_VALUES_EQUAL("sdsd", NUtils::Bin2base64url(TParserTvmKeys::ParseStrV1("1:sdsd"))); - } - - Y_UNIT_TEST(TicketsStrV3) { - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::Ok, - NUtils::Base64url2bin("CgYIDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg"), - NUtils::Base64url2bin("ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA"), - "3:serv:CgYIDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg:"}), - TParserTickets::ParseStrV3("3:serv:CgYIDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg:ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA", - TParserTickets::ServiceFlag())); - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::UnsupportedVersion, - {}, - {}, - {}}), - TParserTickets::ParseStrV3("2:serv:CgYIDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg:ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA", - TParserTickets::ServiceFlag())); - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::InvalidTicketType, - {}, - {}, - {}}), - TParserTickets::ParseStrV3("3:serv:CgYIDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg:ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA", - TParserTickets::UserFlag())); - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::Malformed, - {}, - {}, - {}}), - TParserTickets::ParseStrV3("3:serv::ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA", - TParserTickets::ServiceFlag())); - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::Malformed, - {}, - {}, - {}}), - TParserTickets::ParseStrV3("3:serv:CgYIDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg:", - TParserTickets::ServiceFlag())); - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::Malformed, - {}, - {}, - {}}), - TParserTickets::ParseStrV3("3:serv:CgYIDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg:ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA:asd", - TParserTickets::ServiceFlag())); - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::Malformed, - {}, - {}, - {}}), - TParserTickets::ParseStrV3("3:serv:CgY+-*/IDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg:ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA", - TParserTickets::ServiceFlag())); - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::Malformed, - {}, - {}, - {}}), - TParserTickets::ParseStrV3("3:serv:CgYIDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg:ERme/*-+H_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA", - TParserTickets::ServiceFlag())); - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::Malformed, - {}, - {}, - {}}), - TParserTickets::ParseStrV3("", - TParserTickets::ServiceFlag())); - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::Malformed, - {}, - {}, - {}}), - TParserTickets::ParseStrV3("'", - TParserTickets::ServiceFlag())); - - // Invalid proto - UNIT_ASSERT_EQUAL(TParserTickets::TStrRes({ETicketStatus::Ok, - NUtils::Base64url2bin("YIDRCUkQYBgcIgdiYjpzZXNzIghiYjpzZXNzMg"), - NUtils::Base64url2bin("ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA"), - "3:serv:YIDRCUkQYBgcIgdiYjpzZXNzIghiYjpzZXNzMg:"}), - TParserTickets::ParseStrV3("3:serv:YIDRCUkQYBgcIgdiYjpzZXNzIghiYjpzZXNzMg:ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA", - TParserTickets::ServiceFlag())); - } - - Y_UNIT_TEST(TicketsV3) { - NRw::TPublicKeys pub; - - UNIT_ASSERT_EQUAL(ETicketStatus::Malformed, - TParserTickets::ParseV3("3:serv:CgYIDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg:ERme/*-+H_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA", - pub, - TParserTickets::ServiceFlag()) - .Status); - - // Invalid proto - UNIT_ASSERT_EQUAL(ETicketStatus::Malformed, - TParserTickets::ParseV3("3:serv:YIDRCUkQYBgcIgdiYjpzZXNzIghiYjpzZXNzMg:ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA", - pub, - TParserTickets::ServiceFlag()) - .Status); - - // Expire time == 100500 - UNIT_ASSERT_EQUAL(ETicketStatus::Expired, - TParserTickets::ParseV3("3:serv:CBAQlJEGIhcIDBAcGgdiYjpzZXNzGghiYjpzZXNzMg:HEzPbsjULegBvgX3nqwFX0GfVhESmN1kEWyeT7U03KAR-sQnNYgm6IuN-b9-lQYQKAJSW6p8ffyucC1yDrWSWRxXVzHJUxAVW4hnbiFDtXrurnEdpMK3izKbmTY25PJ4vH3_TkRXk-_oSAE8RvIFKXlh-aw1tezbXBUpJKvyJ0w", - pub, - TParserTickets::ServiceFlag()) - .Status); - - UNIT_ASSERT_EQUAL(ETicketStatus::MissingKey, - TParserTickets::ParseV3("3:serv:CBAQ__________9_IhcIDBAcGgdiYjpzZXNzGghiYjpzZXNzMg:OKjKEbygehEZWH0XEeLzvf0q0aS0VvSk_CKSXGdpqxPbE4RzU70jeM-X9rXVpbYjt76VgBLlBpumJdyiclulfGPDPiL8nwJuu8AnWIR_o-QqyXbsloo2_syE6w2aYw2Yw_5_qjnipYdxGUWegHAGCj3yeMde6O2BmNZ0OCfg6qU", - pub, - TParserTickets::ServiceFlag()) - .Status); - - pub.emplace(16, NRw::TRwPublicKey(NUtils::Base64url2bin("MIGEAoGBALhrihbf3EpjDQS2sCQHazoFgN0nBbE9eesnnFTfzQELXb2gnJU9enmV_aDqaHKjgtLIPpCgn40lHrn5k6mvH5OdedyI6cCzE-N-GFp3nAq0NDJyMe0fhtIRD__CbT0ulcvkeow65ubXWfw6dBC2gR_34rdMe_L_TGRLMWjDULbN"))); - UNIT_ASSERT_EQUAL(ETicketStatus::SignBroken, - TParserTickets::ParseV3("3:serv:CBAQ__________9_IhcIDBAcGgdiYjpzZXNzGghiYjpzZXNzMa:OKjKEbygehEZWH0XEeLzvf0q0aS0VvSk_CKSXGdpqxPbE4RzU70jeM-X9rXVpbYjt76VgBLlBpumJdyiclulfGPDPiL8nwJuu8AnWIR_o-QqyXbsloo2_syE6w2aYw2Yw_5_qjnipYdxGUWegHAGCj3yeMde6O2BmNZ0OCfg6qU", - pub, - TParserTickets::ServiceFlag()) - .Status); - UNIT_ASSERT_EQUAL(ETicketStatus::SignBroken, - TParserTickets::ParseV3("3:serv:CBAQ__________9_IhcIDBAcGgdiYjpzZXNzGghiYjpzZXNzMg:OKjKEbygehEZWH0XEeLzvf0q0aS0VvSk_CKSXGdpqxPbE4RzU70jeM-X9rXVpbYjt76VgBLlBpumJdyiclulfGPDPiL8nwJuu8AnWIR_o-QqyXbsloo2_syE6w2aYw2Yw_5_qjnipYdxGUWegHAGCj3yeMde6O2BmNZ0OCfg6qa", - pub, - TParserTickets::ServiceFlag()) - .Status); - UNIT_ASSERT_EQUAL(ETicketStatus::SignBroken, - TParserTickets::ParseV3("3:serv:CBAQ__________9_IhcIDBAcGgdiYjpzZXNzGghiYjpzZXNzMg:EbygehEZWH0XEeLzvf0q0aS0VvSk_CKSXGdpqxPbE4RzU70jeM-X9rXVpbYjt76VgBLlBpumJdyiclulfGPDPiL8nwJuu8AnWIR_o-QqyXbsloo2_syE6w2aYw2Yw_5_qjnipYdxGUWegHAGCj3yeMde6O2BmNZ0OCfg6qU", - pub, - TParserTickets::ServiceFlag()) - .Status); - - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, - TParserTickets::ParseV3("3:serv:CBAQ__________9_IhcIDBAcGgdiYjpzZXNzGghiYjpzZXNzMg:OKjKEbygehEZWH0XEeLzvf0q0aS0VvSk_CKSXGdpqxPbE4RzU70jeM-X9rXVpbYjt76VgBLlBpumJdyiclulfGPDPiL8nwJuu8AnWIR_o-QqyXbsloo2_syE6w2aYw2Yw_5_qjnipYdxGUWegHAGCj3yeMde6O2BmNZ0OCfg6qU", - pub, - TParserTickets::ServiceFlag()) - .Status); - } -} diff --git a/library/cpp/tvmauth/src/ut/public_ut.cpp b/library/cpp/tvmauth/src/ut/public_ut.cpp deleted file mode 100644 index 74a483d57bd..00000000000 --- a/library/cpp/tvmauth/src/ut/public_ut.cpp +++ /dev/null @@ -1,290 +0,0 @@ -// DO_NOT_STYLE -#include <library/cpp/tvmauth/src/service_impl.h> -#include <library/cpp/tvmauth/src/user_impl.h> - -#include <library/cpp/tvmauth/exception.h> -#include <library/cpp/tvmauth/ticket_status.h> -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(CommonPublicInterfaceTestSuite){ - Y_UNIT_TEST(StatusTest){ - UNIT_ASSERT_VALUES_EQUAL("OK", - StatusToString(ETicketStatus::Ok)); - UNIT_ASSERT_VALUES_EQUAL("Expired ticket", - StatusToString(ETicketStatus::Expired)); - UNIT_ASSERT_VALUES_EQUAL("Invalid BlackBox environment", - StatusToString(ETicketStatus::InvalidBlackboxEnv)); - UNIT_ASSERT_VALUES_EQUAL("Invalid ticket destination", - StatusToString(ETicketStatus::InvalidDst)); - UNIT_ASSERT_VALUES_EQUAL("Invalid ticket type", - StatusToString(ETicketStatus::InvalidTicketType)); - UNIT_ASSERT_VALUES_EQUAL("Malformed ticket", - StatusToString(ETicketStatus::Malformed)); - UNIT_ASSERT_VALUES_EQUAL("Invalid ticket signature", - StatusToString(ETicketStatus::SignBroken)); - UNIT_ASSERT_VALUES_EQUAL("Context does not have required key to check ticket: public keys are too old", - StatusToString(ETicketStatus::MissingKey)); - UNIT_ASSERT_VALUES_EQUAL("Unsupported ticket version", - StatusToString(ETicketStatus::UnsupportedVersion)); - } -} - -Y_UNIT_TEST_SUITE(PublicInterfaceServiceTestSuite) { - static const TString EMPTY_TVM_KEYS = "1:CpgCCpMCCAEQABqIAjCCAQQCggEAcLEXeH67FQESFUn4_7wnX7wN0PUrBoUsm3QQ4W5vC-qz6sXaEjSwnTV8w1o-z6X9KPLlhzMQvuS38NCNfK4uvJ4Zvfp3YsXJ25-rYtbnrYJHNvHohD-kPCCw_yZpMp21JdWigzQGuV7CtrxUhF-NNrsnUaJrE5-OpEWNt4X6nCItKIYeVcSK6XJUbEWbrNCRbvkSc4ak2ymFeMuHYJVjxh4eQbk7_ZPzodP0WvF6eUYrYeb42imVEOR8ofVLQWE5DVnb1z_TqZm4i1XkS7jMwZuBxBRw8DGdYei0lT_sAf7KST2jC0590NySB3vsBgWEVs1OdUUWA6r-Dvx9dsOQtSCVkQYQAAqZAgqUAggCEAAaiQIwggEFAoIBAQDhEBM5-6YsPWfogKtbluJoCX1WV2KdzOaQ0-OlRbBzeCzw-eQKu12c8WakHBbeCMd1I1TU64SDkDorWjXGIa_2xT6N3zzNAE50roTbPCcmeQrps26woTYfYIuqDdoxYKZNr0lvNLLW47vBr7EKqo1S4KSj7aXK_XYeEvUgIgf3nVIcNrio7VTnFmGGVQCepaL1Hi1gN4yIXjVZ06PBPZ-DxSRu6xOGbFrfKMJeMPs7KOyE-26Q3xOXdTIa1X-zYIucTd_bxUCL4BVbwW2AvbbFsaG7ISmVdGu0XUTmhXs1KrEfUVLRJhE4Dx99hAZXm1_HlYMUeJcMQ_oHOhV94ENFIJaRBhACCpYBCpEBCAMQABqGATCBgwKBgF9t2YJGAJkRRFq6fWhi3m1TFW1UOE0f6ZrfYhHAkpqGlKlh0QVfeTNPpeJhi75xXzCe6oReRUm-0DbqDNhTShC7uGUv1INYnRBQWH6E-5Fc5XrbDFSuGQw2EYjNfHy_HefHJXxQKAqPvxBDKMKkHgV58WtM6rC8jRi9sdX_ig2NIJeRBhABCpYBCpEBCAQQABqGATCBgwKBgGB4d6eLGUBv-Q6EPLehC4S-yuE2HB-_rJ7WkeYwyp-xIPolPrd-PQme2utHB4ZgpXHIu_OFksDe_0bPgZniNRSVRbl7W49DgS5Ya3kMfrYB4DnF5Fta5tn1oV6EwxYD4JONpFTenOJALPGTPawxXEfon_peiHOSBuQMu3_Vn-l1IJiRBhADCpcBCpIBCAUQABqHATCBhAKBgQCTJMKIfmfeZpaI7Q9rnsc29gdWawK7TnpVKRHws1iY7EUlYROeVcMdAwEqVM6f8BVCKLGgzQ7Gar_uuxfUGKwqEQzoppDraw4F75J464-7D5f6_oJQuGIBHZxqbMONtLjBCXRUhQW5szBLmTQ_R3qaJb5vf-h0APZfkYhq1cTttSCZkQYQBAqWAQqRAQgLEAAahgEwgYMCgYBvvGVH_M2H8qxxv94yaDYUTWbRnJ1uiIYc59KIQlfFimMPhSS7x2tqUa2-hI55JiII0Xym6GNkwLhyc1xtWChpVuIdSnbvttbrt4weDMLHqTwNOF6qAsVKGKT1Yh8yf-qb-DSmicgvFc74mBQm_6gAY1iQsf33YX8578ClhKBWHSCVkQYQAAqXAQqSAQgMEAAahwEwgYQCgYEAkuzFcd5TJu7lYWYe2hQLFfUWIIj91BvQQLa_Thln4YtGCO8gG1KJqJm-YlmJOWQG0B7H_5RVhxUxV9KpmFnsDVkzUFKOsCBaYGXc12xPVioawUlAwp5qp3QQtZyx_se97YIoLzuLr46UkLcLnkIrp-Jo46QzYi_QHq45WTm8MQ0glpEGEAIKlwEKkgEIDRAAGocBMIGEAoGBAIUzbxOknXf_rNt17_ir8JlWvrtnCWsQd1MAnl5mgArvavDtKeBYHzi5_Ak7DHlLzuA6YE8W175FxLFKpN2hkz-l-M7ltUSd8N1BvJRhK4t6WffWfC_1wPyoAbeSN2Yb1jygtZJQ8wGoXHcJQUXiMit3eFNyylwsJFj1gzAR4JCdIJeRBhABCpYBCpEBCA4QABqGATCBgwKBgFMcbEpl9ukVR6AO_R6sMyiU11I8b8MBSUCEC15iKsrVO8v_m47_TRRjWPYtQ9eZ7o1ocNJHaGUU7qqInFqtFaVnIceP6NmCsXhjs3MLrWPS8IRAy4Zf4FKmGOx3N9O2vemjUygZ9vUiSkULdVrecinRaT8JQ5RG4bUMY04XGIwFIJiRBhADCpYBCpEBCA8QABqGATCBgwKBgGpCkW-NR3li8GlRvqpq2YZGSIgm_PTyDI2Zwfw69grsBmPpVFW48Vw7xoMN35zcrojEpialB_uQzlpLYOvsMl634CRIuj-n1QE3-gaZTTTE8mg-AR4mcxnTKThPnRQpbuOlYAnriwiasWiQEMbGjq_HmWioYYxFo9USlklQn4-9IJmRBhAE"; - static const TString EXPIRED_SERVICE_TICKET = "3:serv:CBAQACIZCOUBEBwaCGJiOnNlc3MxGghiYjpzZXNzMg:IwfMNJYEqStY_SixwqJnyHOMCPR7-3HHk4uylB2oVRkthtezq-OOA7QizDvx7VABLs_iTlXuD1r5IjufNei_EiV145eaa3HIg4xCdJXCojMexf2UYJz8mF2b0YzFAy6_KWagU7xo13CyKAqzJuQf5MJcSUf0ecY9hVh36cJ51aw"; - static const TString MALFORMED_TVM_KEYS = "1:CpgCCpMCCAEQABqIAjCCAQQCggEAcLEXeH67FQESFUn4_7wnX7wN0PUrBoUsm3QQ4W5vC-qz6sXaEjSwnTV8w1o-z6X9KPLlhzMQvuS38NCNfK4uvJ4Zvfp3YsXJ25-rYtbnrYJHNvHohD-kPCCw_yZpMp21JdWigzQGuV7CtrxUhF-NNrsnUaJrE5-OpEWNt4X6nCItKIYeVcSK6XJUbEWbrNCRbvkSc4ak2ymFeMuHYJVjxh4eQbk7_ZPzodP0WvF6eUYrYeb42imVEOR8ofVLQWE5DVnb1z_TqZm4i1XkS7jMwZuBxBRw8DGdYei0lT_sAf7KST2jC0590NySB3vsBgWEVs1OdUUWA6r-Dvx9dsOQtSCVkQYQAAqZAgqUAggCEAAaiQIwggEFAoIBAQDhEBM5-6YsPWfogKtbluJoCX1WV2KdzOaQ0-OlRbBzeCzw-eQKu12c8WakHBbeCMd1I1TU64SDkDorWjXGIa_2xT6N3zzNAE50roTbPCcmeQrps26woTYfYIuqDdoxYKZNr0lvNLLW47vBr7EKqo1S4KSj7aXK_XYeEvUgIgf3nVIcNrio7VTnFmGGVQCepaL1Hi1gN4yIXjVZ06PBPZ-DxSRu6xOGbFrfKMJeMPs7KOyE-26Q3xOXdTIa1X-zYIucTd_bxUCL4BVbwW2AvbbFsaG7ISmVdGu0XUTmhXs1KrEfUVLRJhE4Dx99hAZXm1_HlYMUeJcMQ_oHOhV94ENFIJaRBhACCpYBCpEBCAMQABqGATCBgwKBgF9t2YJGAJkRRFq6fWhi3m1TFW1UOE0f6ZrfYhHAkpqGlKlh0QVfeTNPpeJhi75xXzCe6oReRUm-0DbqDNhTShC7uGUv1INYnRBQWH6E-5Fc5XrbDFSuGQw2EYjNfHy_HefHJXxQKAqPvxBDKMKkHgV58WtM6rC8jRi9sdX_ig2NIJeRBhABCpYBCpEBCAQQABqGATCBgwKBgGB4d6eLGUBv-Q6EPLehC4S-yuE2HB-_rJ7WkeYwyp-xIPolPrd-PQme2utHB4ZgpXHIu_OFksDe_0bPgZniNRSVRbl7W49DgS5Ya3kMfrYB4DnF5Fta5tn1oV6EwxYD4JONpFTenOJALPGTPawxXEfon_peiHOSBuQMu3_Vn-l1IJiRBhADCpcBCpIBCAUQABqHATCBhAKBgQCTJMKIfmfeZpaI7Q9rnsc29gdWawK7TnpVKRHws1iY7EUlYROeVcMdAwEqVM6f8BVCKLGgzQ7Gar_uuxfUGKwqEQzoppDraw4F75J464-7D5f6_oJQuGIBHZxqbMONtLjBCXRUhQW5szBLmTQ_R3qaJb5vf-h0APZfkYhq1cTttSCZkQYQBAqWAQqRAQgLEAAahgEwgYMCgYBvvGVH_M2H8qxxv94yaDYUTWbRnJ1uiIYc59KIQlfFimMPhSS7x2tqUa2-hI55JiII0Xym6GNkwLhyc1xtWChpVuIdSnbvttbrt4weDMLHqTwNOF6qAsVKGKT1Yh8yf-qb-DSmicgvFc74mBQm_6gAY1iQsf33YX8578ClhKBWHSCVkQYQAAqXAQqSAQgMEAAahwEwgYQCgYEAkuzFcd5TJu7lYWYe2hQLFfUWIIj91BvQQLa_Thln4YtGCO8gG1KJqJm-YlmJOWQG0B7H_5RVhxUxV9KpmFnsDVkzUFKOsCBaYGXc12xPVioawUlAwp5qp3QQtZyx_se97YIoLzuLr46UkLcLnkIrp-Jo46QzYi_QHq45WTm8MQ0glpEGEAIKlwEKkgEIDRAAGocBMIGEAoGBAIUzbxOknXf_rNt17_ir8JlWvrtnCWsQd1MAnl5mgArvavDtKeBYHzi5_Ak7DHlLzuA6YE8W175FxLFKpN2hkz-l-M7ltUSd8N1BvJRhK4t6WffWfC_1wPyoAbeSN2Yb1jygtZJQ8wGoXHcJQUXiMit3eFNyylwsJFj1gzAR4JCdIJeRBhABCpYBCpEBCA4QABqGATCBgwKBgFMcbEpl9ukVR6AO_R6sMyiU11I8b8MBSUCEC15iKsrVO8v_m47_TRRjWPYtQ9eZ7o1ocNJHaGUU7qqInFqtFaVnIceP6NmCsXhjs3MLrWPS8IRAy4Zf4FKmGOx3N9O2vemjUygZ9vUiSkULdVrecinRaT8JQ5RG4bUMY04XGIwFIJiRBhADCpYBCpEBCA8QABqGATCBgwKBgGpCkW-NR3li8GlRvqpq2YZGSIgm_PTyDI2Zwfw69grsBmPpVFW48Vw7xoMN35zcrojEpialB_uQzlpLYOvsMl634CRIuj-n1QE3-gaZTTTE8mg-AR4mcxnTKThPnRQpbuOlYAnriwiasWiQEMbGjq_HmWioYYxFo9USlklQn4-9IJmRBhAEEpUBCpIBCAYQABqHATCBhAKBgQCoZkFGm9oLTqjeXZAq6j5S6i7K20V0lNdBBLqfmFBIRuTkYxhs4vUYnWjZrKRAd5bp6_py0csmFmpl_5Yh0b-2pdo_E5PNP7LGRzKyKSiFddyykKKzVOazH8YYldDAfE8Z5HoS9e48an5JsPg0jr-TPu34DnJq3yv2a6dqiKL9zSCakQYSlQEKkgEIEBAAGocBMIGEAoGBALhrihbf3EpjDQS2sCQHazoFgN0nBbE9eesnnFTfzQELXb2gnJU9enmV_aDqaHKjgtLIPpCgn40lHrn5k6mvH5OdedyI6cCzE-N-GFp3nAq0NDJyMe0fhtIRD__CbT0ulcvkeow65ubXWfw6dBC2gR_34rdMe_L_TGRLMWjDULbNIJ"; - static const TString MALFORMED_TVM_SECRET = "adcvxcv./-+"; - static const TTvmId NOT_OUR_ID = 27; - static const TTvmId OUR_ID = 28; - static const TString SECRET = "GRMJrKnj4fOVnvOqe-WyD1"; - static const TString SERVICE_TICKET_PROTOBUF = "CBAQ__________9_IhkI5QEQHBoIYmI6c2VzczEaCGJiOnNlc3My"; - static const TTvmId SRC_ID = 229; - static const TString UNSUPPORTED_VERSION_SERVICE_TICKET = "2:serv:CBAQ__________9_IhkI5QEQHBoIYmI6c2VzczEaCGJiOnNlc3My:WUPx1cTf05fjD1exB35T5j2DCHWH1YaLJon_a4rN-D7JfXHK1Ai4wM4uSfboHD9xmGQH7extqtlEk1tCTCGm5qbRVloJwWzCZBXo3zKX6i1oBYP_89WcjCNPVe1e8jwGdLsnu6PpxL5cn0xCksiStILH5UmDR6xfkJdnmMG94o8"; - static const TString VALID_SERVICE_TICKET_1 = "3:serv:CBAQ__________9_IhkI5QEQHBoIYmI6c2VzczEaCGJiOnNlc3My:WUPx1cTf05fjD1exB35T5j2DCHWH1YaLJon_a4rN-D7JfXHK1Ai4wM4uSfboHD9xmGQH7extqtlEk1tCTCGm5qbRVloJwWzCZBXo3zKX6i1oBYP_89WcjCNPVe1e8jwGdLsnu6PpxL5cn0xCksiStILH5UmDR6xfkJdnmMG94o8"; - static const TString VALID_SERVICE_TICKET_2 = "3:serv:CBAQ__________9_IskICOUBEBwaCGJiOnNlc3MxGgliYjpzZXNzMTAaCmJiOnNlc3MxMDAaCWJiOnNlc3MxMRoJYmI6c2VzczEyGgliYjpzZXNzMTMaCWJiOnNlc3MxNBoJYmI6c2VzczE1GgliYjpzZXNzMTYaCWJiOnNlc3MxNxoJYmI6c2VzczE4GgliYjpzZXNzMTkaCGJiOnNlc3MyGgliYjpzZXNzMjAaCWJiOnNlc3MyMRoJYmI6c2VzczIyGgliYjpzZXNzMjMaCWJiOnNlc3MyNBoJYmI6c2VzczI1GgliYjpzZXNzMjYaCWJiOnNlc3MyNxoJYmI6c2VzczI4GgliYjpzZXNzMjkaCGJiOnNlc3MzGgliYjpzZXNzMzAaCWJiOnNlc3MzMRoJYmI6c2VzczMyGgliYjpzZXNzMzMaCWJiOnNlc3MzNBoJYmI6c2VzczM1GgliYjpzZXNzMzYaCWJiOnNlc3MzNxoJYmI6c2VzczM4GgliYjpzZXNzMzkaCGJiOnNlc3M0GgliYjpzZXNzNDAaCWJiOnNlc3M0MRoJYmI6c2VzczQyGgliYjpzZXNzNDMaCWJiOnNlc3M0NBoJYmI6c2VzczQ1GgliYjpzZXNzNDYaCWJiOnNlc3M0NxoJYmI6c2VzczQ4GgliYjpzZXNzNDkaCGJiOnNlc3M1GgliYjpzZXNzNTAaCWJiOnNlc3M1MRoJYmI6c2VzczUyGgliYjpzZXNzNTMaCWJiOnNlc3M1NBoJYmI6c2VzczU1GgliYjpzZXNzNTYaCWJiOnNlc3M1NxoJYmI6c2VzczU4GgliYjpzZXNzNTkaCGJiOnNlc3M2GgliYjpzZXNzNjAaCWJiOnNlc3M2MRoJYmI6c2VzczYyGgliYjpzZXNzNjMaCWJiOnNlc3M2NBoJYmI6c2VzczY1GgliYjpzZXNzNjYaCWJiOnNlc3M2NxoJYmI6c2VzczY4GgliYjpzZXNzNjkaCGJiOnNlc3M3GgliYjpzZXNzNzAaCWJiOnNlc3M3MRoJYmI6c2VzczcyGgliYjpzZXNzNzMaCWJiOnNlc3M3NBoJYmI6c2Vzczc1GgliYjpzZXNzNzYaCWJiOnNlc3M3NxoJYmI6c2Vzczc4GgliYjpzZXNzNzkaCGJiOnNlc3M4GgliYjpzZXNzODAaCWJiOnNlc3M4MRoJYmI6c2VzczgyGgliYjpzZXNzODMaCWJiOnNlc3M4NBoJYmI6c2Vzczg1GgliYjpzZXNzODYaCWJiOnNlc3M4NxoJYmI6c2Vzczg4GgliYjpzZXNzODkaCGJiOnNlc3M5GgliYjpzZXNzOTAaCWJiOnNlc3M5MRoJYmI6c2VzczkyGgliYjpzZXNzOTMaCWJiOnNlc3M5NBoJYmI6c2Vzczk1GgliYjpzZXNzOTYaCWJiOnNlc3M5NxoJYmI6c2Vzczk4GgliYjpzZXNzOTk:JYmABAVLM6y7_T4n1pRcwBfwDfzMV4JJ3cpbEG617zdGgKRZwL7MalsYn5bq1F2ibujMrsF9nzZf8l4s_e-Ivjkz_xu4KMzSp-pUh9V7XIF_smj0WHYpv6gOvWNuK8uIvlZTTKwtQX0qZOL9m-MEeZiHoQPKZGCfJ_qxMUp-J8I"; - static const TString VALID_SERVICE_TICKET_3 = "3:serv:CBAQ__________9_IgUI5QEQHA:Sd6tmA1CNy2Nf7XevC3x7zr2DrGNRmcl-TxUsDtDW2xI3YXyCxBltWeg0-KtDlqyYuPOP5Jd_-XXNA12KlOPnNzrz3jm-5z8uQl6CjCcrVHUHJ75pGC8r9UOlS8cOgeXQB5dYP-fOWyo5CNadlozx1S2meCIxncbQRV1kCBi4KU"; - - Y_UNIT_TEST(BlackboxTvmIdTest) { - UNIT_ASSERT_VALUES_EQUAL("222", NBlackboxTvmId::Prod); - UNIT_ASSERT_VALUES_EQUAL("224", NBlackboxTvmId::Test); - UNIT_ASSERT_VALUES_EQUAL("223", NBlackboxTvmId::ProdYateam); - UNIT_ASSERT_VALUES_EQUAL("225", NBlackboxTvmId::TestYateam); - UNIT_ASSERT_VALUES_EQUAL("226", NBlackboxTvmId::Stress); - UNIT_ASSERT_VALUES_EQUAL("239", NBlackboxTvmId::Mimino); - } - - Y_UNIT_TEST(Case1Test) { - TServiceContext context1(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - TServiceContext context2 = std::move(context1); - TServiceContext context3(std::move(context2)); - - TCheckedServiceTicket checkedTicket1 = context3.Check(VALID_SERVICE_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket1.GetStatus()); - TCheckedServiceTicket checkedTicket2 = std::move(checkedTicket1); - TCheckedServiceTicket checkedTicket3(std::move(checkedTicket2)); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket3.GetStatus()); - } - - Y_UNIT_TEST(ContextExceptionsTest) { - UNIT_ASSERT_EXCEPTION(TServiceContext(SECRET, OUR_ID, MALFORMED_TVM_KEYS), TMalformedTvmKeysException); - UNIT_ASSERT_EXCEPTION(TServiceContext(SECRET, OUR_ID, EMPTY_TVM_KEYS), TEmptyTvmKeysException); - UNIT_ASSERT_EXCEPTION(TServiceContext(MALFORMED_TVM_SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS), TMalformedTvmSecretException); - } - - Y_UNIT_TEST(ContextSignTest) { - TServiceContext context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT_VALUES_EQUAL( - "NsPTYak4Cfk-4vgau5lab3W4GPiTtb2etuj3y4MDPrk", - context.SignCgiParamsForTvm(IntToString<10>(std::numeric_limits<time_t>::max()), "13,28", "")); - } - - Y_UNIT_TEST(ContextSignExceptionTest) { - TServiceContext context = TServiceContext::CheckingFactory(OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT_EXCEPTION( - context.SignCgiParamsForTvm(IntToString<10>(std::numeric_limits<time_t>::max()), "13,28", ""), - TMalformedTvmSecretException - ); - - context = TServiceContext::SigningFactory(SECRET); - UNIT_ASSERT_NO_EXCEPTION( - context.SignCgiParamsForTvm(IntToString<10>(std::numeric_limits<time_t>::max()), "13,28", "") - ); - } - - Y_UNIT_TEST(ContextCheckExceptionTest) { - TServiceContext context = TServiceContext::CheckingFactory(OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT_NO_EXCEPTION( - context.Check("ABCDE") - ); - - context = TServiceContext::SigningFactory(SECRET); - UNIT_ASSERT_EXCEPTION( - context.Check("ABCDE"), - TEmptyTvmKeysException - ); - } - - - Y_UNIT_TEST(ContextTest) { - TServiceContext context1(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - TServiceContext context2 = TServiceContext::CheckingFactory(OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - } - - Y_UNIT_TEST(Ticket1Test) { - TServiceContext context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_SERVICE_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket.GetStatus()); - UNIT_ASSERT_EQUAL(SRC_ID, checkedTicket.GetSrc()); - UNIT_ASSERT_EQUAL("ticket_type=serv;expiration_time=9223372036854775807;src=229;dst=28;scope=bb:sess1;scope=bb:sess2;", checkedTicket.DebugInfo()); - } - - Y_UNIT_TEST(Ticket2Test) { - TServiceContext context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_SERVICE_TICKET_2); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket.GetStatus()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=serv;expiration_time=9223372036854775807;src=229;dst=28;scope=bb:sess1;scope=bb:sess10;scope=bb:sess100;scope=bb:sess11;scope=bb:sess12;scope=bb:sess13;scope=bb:sess14;scope=bb:sess15;scope=bb:sess16;scope=bb:sess17;scope=bb:sess18;scope=bb:sess19;scope=bb:sess2;scope=bb:sess20;scope=bb:sess21;scope=bb:sess22;scope=bb:sess23;scope=bb:sess24;scope=bb:sess25;scope=bb:sess26;scope=bb:sess27;scope=bb:sess28;scope=bb:sess29;scope=bb:sess3;scope=bb:sess30;scope=bb:sess31;scope=bb:sess32;scope=bb:sess33;scope=bb:sess34;scope=bb:sess35;scope=bb:sess36;scope=bb:sess37;scope=bb:sess38;scope=bb:sess39;scope=bb:sess4;scope=bb:sess40;scope=bb:sess41;scope=bb:sess42;scope=bb:sess43;scope=bb:sess44;scope=bb:sess45;scope=bb:sess46;scope=bb:sess47;scope=bb:sess48;scope=bb:sess49;scope=bb:sess5;scope=bb:sess50;scope=bb:sess51;scope=bb:sess52;scope=bb:sess53;scope=bb:sess54;scope=bb:sess55;scope=bb:sess56;scope=bb:sess57;scope=bb:sess58;scope=bb:sess59;scope=bb:sess6;scope=bb:sess60;scope=bb:sess61;scope=bb:sess62;scope=bb:sess63;scope=bb:sess64;scope=bb:sess65;scope=bb:sess66;scope=bb:sess67;scope=bb:sess68;scope=bb:sess69;scope=bb:sess7;scope=bb:sess70;scope=bb:sess71;scope=bb:sess72;scope=bb:sess73;scope=bb:sess74;scope=bb:sess75;scope=bb:sess76;scope=bb:sess77;scope=bb:sess78;scope=bb:sess79;scope=bb:sess8;scope=bb:sess80;scope=bb:sess81;scope=bb:sess82;scope=bb:sess83;scope=bb:sess84;scope=bb:sess85;scope=bb:sess86;scope=bb:sess87;scope=bb:sess88;scope=bb:sess89;scope=bb:sess9;scope=bb:sess90;scope=bb:sess91;scope=bb:sess92;scope=bb:sess93;scope=bb:sess94;scope=bb:sess95;scope=bb:sess96;scope=bb:sess97;scope=bb:sess98;scope=bb:sess99;", checkedTicket.DebugInfo()); - } - - Y_UNIT_TEST(Ticket3Test) { - TServiceContext context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_SERVICE_TICKET_3); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket.GetStatus()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=serv;expiration_time=9223372036854775807;src=229;dst=28;", checkedTicket.DebugInfo()); - } - - Y_UNIT_TEST(TicketCheckingTest) { - TServiceContext context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto ticket = context.Check(VALID_SERVICE_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, ticket.GetStatus()); - UNIT_ASSERT_EQUAL(SRC_ID, ticket.GetSrc()); - } - - Y_UNIT_TEST(TicketErrorsTest) { - TServiceContext context(SECRET, NOT_OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket1 = context.Check(VALID_SERVICE_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::InvalidDst, checkedTicket1.GetStatus()); - - auto checkedTicket2 = context.Check(UNSUPPORTED_VERSION_SERVICE_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::UnsupportedVersion, checkedTicket2.GetStatus()); - - auto checkedTicket3 = context.Check(EXPIRED_SERVICE_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::Expired, checkedTicket3.GetStatus()); - } - - Y_UNIT_TEST(TicketExceptionsTest) { - TServiceContext context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(EXPIRED_SERVICE_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::Expired, checkedTicket.GetStatus()); - - UNIT_ASSERT(!bool(checkedTicket)); - UNIT_ASSERT_EXCEPTION(checkedTicket.GetSrc(), TNotAllowedException); - UNIT_ASSERT_NO_EXCEPTION(bool(checkedTicket)); - UNIT_ASSERT_NO_EXCEPTION(checkedTicket.DebugInfo()); - UNIT_ASSERT_NO_EXCEPTION(checkedTicket.GetStatus()); - } - - Y_UNIT_TEST(RemoveSignatureTest) { - UNIT_ASSERT_VALUES_EQUAL("1:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds", - NUtils::RemoveTicketSignature("1:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("2:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds", - NUtils::RemoveTicketSignature("2:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("4:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds", - NUtils::RemoveTicketSignature("4:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("3.serv.ASDkljbjhsdbfLJHABFJHBslfbsfjs.asdxcvbxcvniueliuweklsvds", - NUtils::RemoveTicketSignature("3.serv.ASDkljbjhsdbfLJHABFJHBslfbsfjs.asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("3:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:", - NUtils::RemoveTicketSignature("3:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("3:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:", - NUtils::RemoveTicketSignature("3:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("3:serv:", - NUtils::RemoveTicketSignature("3:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs.asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("asdxcbvfgdsgfasdfxczvdsgfxcdvbcbvf", - NUtils::RemoveTicketSignature("asdxcbvfgdsgfasdfxczvdsgfxcdvbcbvf")); - } - - Y_UNIT_TEST(ResetKeysTest) { - TServiceContext context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - TCheckedServiceTicket checkedTicket = context.Check(VALID_SERVICE_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket.GetStatus()); - } -} - -Y_UNIT_TEST_SUITE(PublicInterfaceUserTestSuite) { - static const TString EMPTY_TVM_KEYS = "1:EpUBCpIBCAYQABqHATCBhAKBgQCoZkFGm9oLTqjeXZAq6j5S6i7K20V0lNdBBLqfmFBIRuTkYxhs4vUYnWjZrKRAd5bp6_py0csmFmpl_5Yh0b-2pdo_E5PNP7LGRzKyKSiFddyykKKzVOazH8YYldDAfE8Z5HoS9e48an5JsPg0jr-TPu34DnJq3yv2a6dqiKL9zSCakQY"; - static const TString EXPIRED_USER_TICKET = "3:user:CA0QABokCgMIyAMKAgh7EMgDGghiYjpzZXNzMRoIYmI6c2VzczIgEigB:D0CmYVwWg91LDYejjeQ2UP8AeiA_mr1q1CUD_lfJ9zQSEYEOYGDTafg4Um2rwOOvQnsD1JHM4zHyMUJ6Jtp9GAm5pmhbXBBZqaCcJpyxLTEC8a81MhJFCCJRvu_G1FiAgRgB25gI3HIbkvHFUEqAIC_nANy7NFQnbKk2S-EQPGY"; - static const TString MALFORMED_TVM_KEYS = "1:CpgCCpMCCAEQABqIAjCCAQQCggEAcLEXeH67FQESFUn4_7wnX7wN0PUrBoUsm3QQ4W5vC-qz6sXaEjSwnTV8w1o-z6X9KPLlhzMQvuS38NCNfK4uvJ4Zvfp3YsXJ25-rYtbnrYJHNvHohD-kPCCw_yZpMp21JdWigzQGuV7CtrxUhF-NNrsnUaJrE5-OpEWNt4X6nCItKIYeVcSK6XJUbEWbrNCRbvkSc4ak2ymFeMuHYJVjxh4eQbk7_ZPzodP0WvF6eUYrYeb42imVEOR8ofVLQWE5DVnb1z_TqZm4i1XkS7jMwZuBxBRw8DGdYei0lT_sAf7KST2jC0590NySB3vsBgWEVs1OdUUWA6r-Dvx9dsOQtSCVkQYQAAqZAgqUAggCEAAaiQIwggEFAoIBAQDhEBM5-6YsPWfogKtbluJoCX1WV2KdzOaQ0-OlRbBzeCzw-eQKu12c8WakHBbeCMd1I1TU64SDkDorWjXGIa_2xT6N3zzNAE50roTbPCcmeQrps26woTYfYIuqDdoxYKZNr0lvNLLW47vBr7EKqo1S4KSj7aXK_XYeEvUgIgf3nVIcNrio7VTnFmGGVQCepaL1Hi1gN4yIXjVZ06PBPZ-DxSRu6xOGbFrfKMJeMPs7KOyE-26Q3xOXdTIa1X-zYIucTd_bxUCL4BVbwW2AvbbFsaG7ISmVdGu0XUTmhXs1KrEfUVLRJhE4Dx99hAZXm1_HlYMUeJcMQ_oHOhV94ENFIJaRBhACCpYBCpEBCAMQABqGATCBgwKBgF9t2YJGAJkRRFq6fWhi3m1TFW1UOE0f6ZrfYhHAkpqGlKlh0QVfeTNPpeJhi75xXzCe6oReRUm-0DbqDNhTShC7uGUv1INYnRBQWH6E-5Fc5XrbDFSuGQw2EYjNfHy_HefHJXxQKAqPvxBDKMKkHgV58WtM6rC8jRi9sdX_ig2NIJeRBhABCpYBCpEBCAQQABqGATCBgwKBgGB4d6eLGUBv-Q6EPLehC4S-yuE2HB-_rJ7WkeYwyp-xIPolPrd-PQme2utHB4ZgpXHIu_OFksDe_0bPgZniNRSVRbl7W49DgS5Ya3kMfrYB4DnF5Fta5tn1oV6EwxYD4JONpFTenOJALPGTPawxXEfon_peiHOSBuQMu3_Vn-l1IJiRBhADCpcBCpIBCAUQABqHATCBhAKBgQCTJMKIfmfeZpaI7Q9rnsc29gdWawK7TnpVKRHws1iY7EUlYROeVcMdAwEqVM6f8BVCKLGgzQ7Gar_uuxfUGKwqEQzoppDraw4F75J464-7D5f6_oJQuGIBHZxqbMONtLjBCXRUhQW5szBLmTQ_R3qaJb5vf-h0APZfkYhq1cTttSCZkQYQBAqWAQqRAQgLEAAahgEwgYMCgYBvvGVH_M2H8qxxv94yaDYUTWbRnJ1uiIYc59KIQlfFimMPhSS7x2tqUa2-hI55JiII0Xym6GNkwLhyc1xtWChpVuIdSnbvttbrt4weDMLHqTwNOF6qAsVKGKT1Yh8yf-qb-DSmicgvFc74mBQm_6gAY1iQsf33YX8578ClhKBWHSCVkQYQAAqXAQqSAQgMEAAahwEwgYQCgYEAkuzFcd5TJu7lYWYe2hQLFfUWIIj91BvQQLa_Thln4YtGCO8gG1KJqJm-YlmJOWQG0B7H_5RVhxUxV9KpmFnsDVkzUFKOsCBaYGXc12xPVioawUlAwp5qp3QQtZyx_se97YIoLzuLr46UkLcLnkIrp-Jo46QzYi_QHq45WTm8MQ0glpEGEAIKlwEKkgEIDRAAGocBMIGEAoGBAIUzbxOknXf_rNt17_ir8JlWvrtnCWsQd1MAnl5mgArvavDtKeBYHzi5_Ak7DHlLzuA6YE8W175FxLFKpN2hkz-l-M7ltUSd8N1BvJRhK4t6WffWfC_1wPyoAbeSN2Yb1jygtZJQ8wGoXHcJQUXiMit3eFNyylwsJFj1gzAR4JCdIJeRBhABCpYBCpEBCA4QABqGATCBgwKBgFMcbEpl9ukVR6AO_R6sMyiU11I8b8MBSUCEC15iKsrVO8v_m47_TRRjWPYtQ9eZ7o1ocNJHaGUU7qqInFqtFaVnIceP6NmCsXhjs3MLrWPS8IRAy4Zf4FKmGOx3N9O2vemjUygZ9vUiSkULdVrecinRaT8JQ5RG4bUMY04XGIwFIJiRBhADCpYBCpEBCA8QABqGATCBgwKBgGpCkW-NR3li8GlRvqpq2YZGSIgm_PTyDI2Zwfw69grsBmPpVFW48Vw7xoMN35zcrojEpialB_uQzlpLYOvsMl634CRIuj-n1QE3-gaZTTTE8mg-AR4mcxnTKThPnRQpbuOlYAnriwiasWiQEMbGjq_HmWioYYxFo9USlklQn4-9IJmRBhAEEpUBCpIBCAYQABqHATCBhAKBgQCoZkFGm9oLTqjeXZAq6j5S6i7K20V0lNdBBLqfmFBIRuTkYxhs4vUYnWjZrKRAd5bp6_py0csmFmpl_5Yh0b-2pdo_E5PNP7LGRzKyKSiFddyykKKzVOazH8YYldDAfE8Z5HoS9e48an5JsPg0jr-TPu34DnJq3yv2a6dqiKL9zSCakQYSlQEKkgEIEBAAGocBMIGEAoGBALhrihbf3EpjDQS2sCQHazoFgN0nBbE9eesnnFTfzQELXb2gnJU9enmV_aDqaHKjgtLIPpCgn40lHrn5k6mvH5OdedyI6cCzE-N-GFp3nAq0NDJyMe0fhtIRD__CbT0ulcvkeow65ubXWfw6dBC2gR_34rdMe_L_TGRLMWjDULbNIJ"; - static const TString UNSUPPORTED_VERSION_USER_TICKET = "2:user:CA0Q__________9_GiQKAwjIAwoCCHsQyAMaCGJiOnNlc3MxGghiYjpzZXNzMiASKAE:KJFv5EcXn9krYk19LCvlFrhMW-R4q8mKfXJXCd-RBVBgUQzCOR1Dx2FiOyU-BxUoIsaU0PiwTjbVY5I2onJDilge70Cl5zEPI9pfab2qwklACq_ZBUvD1tzrfNUr88otBGAziHASJWgyVDkhyQ3p7YbN38qpb0vGQrYNxlk4e2I"; - static const TString USER_TICKET_PROTOBUF = "CA0Q__________9_GiQKAwjIAwoCCHsQyAMaCGJiOnNlc3MxGghiYjpzZXNzMiASKAE"; - static const TString VALID_USER_TICKET_1 = "3:user:CA0Q__________9_GiQKAwjIAwoCCHsQyAMaCGJiOnNlc3MxGghiYjpzZXNzMiASKAE:KJFv5EcXn9krYk19LCvlFrhMW-R4q8mKfXJXCd-RBVBgUQzCOR1Dx2FiOyU-BxUoIsaU0PiwTjbVY5I2onJDilge70Cl5zEPI9pfab2qwklACq_ZBUvD1tzrfNUr88otBGAziHASJWgyVDkhyQ3p7YbN38qpb0vGQrYNxlk4e2I"; - static const TString VALID_USER_TICKET_2 = "3:user:CA0Q__________9_GhAKAwjIAwoCCHsQyAMgEigB:KRibGYTJUA2ns0Fn7VYqeMZ1-GdscB1o9pRzELyr7QJrJsfsE8Y_HoVvB8Npr-oalv6AXOpagSc8HpZjAQz8zKMAVE_tI0tL-9DEsHirpawEbpy7OWV7-k18o1m-RaDaKeTlIB45KHbBul1-9aeKkortBfbbXtz_Qy9r_mfFPiQ"; - static const TString VALID_USER_TICKET_3 = "3:user:CA0Q__________9_Go8bCgIIAAoCCAEKAggCCgIIAwoCCAQKAggFCgIIBgoCCAcKAggICgIICQoCCAoKAggLCgIIDAoCCA0KAggOCgIIDwoCCBAKAggRCgIIEgoCCBMKAggUCgIIFQoCCBYKAggXCgIIGAoCCBkKAggaCgIIGwoCCBwKAggdCgIIHgoCCB8KAgggCgIIIQoCCCIKAggjCgIIJAoCCCUKAggmCgIIJwoCCCgKAggpCgIIKgoCCCsKAggsCgIILQoCCC4KAggvCgIIMAoCCDEKAggyCgIIMwoCCDQKAgg1CgIINgoCCDcKAgg4CgIIOQoCCDoKAgg7CgIIPAoCCD0KAgg-CgIIPwoCCEAKAghBCgIIQgoCCEMKAghECgIIRQoCCEYKAghHCgIISAoCCEkKAghKCgIISwoCCEwKAghNCgIITgoCCE8KAghQCgIIUQoCCFIKAghTCgIIVAoCCFUKAghWCgIIVwoCCFgKAghZCgIIWgoCCFsKAghcCgIIXQoCCF4KAghfCgIIYAoCCGEKAghiCgIIYwoCCGQKAghlCgIIZgoCCGcKAghoCgIIaQoCCGoKAghrCgIIbAoCCG0KAghuCgIIbwoCCHAKAghxCgIIcgoCCHMKAgh0CgIIdQoCCHYKAgh3CgIIeAoCCHkKAgh6CgIIewoCCHwKAgh9CgIIfgoCCH8KAwiAAQoDCIEBCgMIggEKAwiDAQoDCIQBCgMIhQEKAwiGAQoDCIcBCgMIiAEKAwiJAQoDCIoBCgMIiwEKAwiMAQoDCI0BCgMIjgEKAwiPAQoDCJABCgMIkQEKAwiSAQoDCJMBCgMIlAEKAwiVAQoDCJYBCgMIlwEKAwiYAQoDCJkBCgMImgEKAwibAQoDCJwBCgMInQEKAwieAQoDCJ8BCgMIoAEKAwihAQoDCKIBCgMIowEKAwikAQoDCKUBCgMIpgEKAwinAQoDCKgBCgMIqQEKAwiqAQoDCKsBCgMIrAEKAwitAQoDCK4BCgMIrwEKAwiwAQoDCLEBCgMIsgEKAwizAQoDCLQBCgMItQEKAwi2AQoDCLcBCgMIuAEKAwi5AQoDCLoBCgMIuwEKAwi8AQoDCL0BCgMIvgEKAwi_AQoDCMABCgMIwQEKAwjCAQoDCMMBCgMIxAEKAwjFAQoDCMYBCgMIxwEKAwjIAQoDCMkBCgMIygEKAwjLAQoDCMwBCgMIzQEKAwjOAQoDCM8BCgMI0AEKAwjRAQoDCNIBCgMI0wEKAwjUAQoDCNUBCgMI1gEKAwjXAQoDCNgBCgMI2QEKAwjaAQoDCNsBCgMI3AEKAwjdAQoDCN4BCgMI3wEKAwjgAQoDCOEBCgMI4gEKAwjjAQoDCOQBCgMI5QEKAwjmAQoDCOcBCgMI6AEKAwjpAQoDCOoBCgMI6wEKAwjsAQoDCO0BCgMI7gEKAwjvAQoDCPABCgMI8QEKAwjyAQoDCPMBCgMI9AEKAwj1AQoDCPYBCgMI9wEKAwj4AQoDCPkBCgMI-gEKAwj7AQoDCPwBCgMI_QEKAwj-AQoDCP8BCgMIgAIKAwiBAgoDCIICCgMIgwIKAwiEAgoDCIUCCgMIhgIKAwiHAgoDCIgCCgMIiQIKAwiKAgoDCIsCCgMIjAIKAwiNAgoDCI4CCgMIjwIKAwiQAgoDCJECCgMIkgIKAwiTAgoDCJQCCgMIlQIKAwiWAgoDCJcCCgMImAIKAwiZAgoDCJoCCgMImwIKAwicAgoDCJ0CCgMIngIKAwifAgoDCKACCgMIoQIKAwiiAgoDCKMCCgMIpAIKAwilAgoDCKYCCgMIpwIKAwioAgoDCKkCCgMIqgIKAwirAgoDCKwCCgMIrQIKAwiuAgoDCK8CCgMIsAIKAwixAgoDCLICCgMIswIKAwi0AgoDCLUCCgMItgIKAwi3AgoDCLgCCgMIuQIKAwi6AgoDCLsCCgMIvAIKAwi9AgoDCL4CCgMIvwIKAwjAAgoDCMECCgMIwgIKAwjDAgoDCMQCCgMIxQIKAwjGAgoDCMcCCgMIyAIKAwjJAgoDCMoCCgMIywIKAwjMAgoDCM0CCgMIzgIKAwjPAgoDCNACCgMI0QIKAwjSAgoDCNMCCgMI1AIKAwjVAgoDCNYCCgMI1wIKAwjYAgoDCNkCCgMI2gIKAwjbAgoDCNwCCgMI3QIKAwjeAgoDCN8CCgMI4AIKAwjhAgoDCOICCgMI4wIKAwjkAgoDCOUCCgMI5gIKAwjnAgoDCOgCCgMI6QIKAwjqAgoDCOsCCgMI7AIKAwjtAgoDCO4CCgMI7wIKAwjwAgoDCPECCgMI8gIKAwjzAgoDCPQCCgMI9QIKAwj2AgoDCPcCCgMI-AIKAwj5AgoDCPoCCgMI-wIKAwj8AgoDCP0CCgMI_gIKAwj_AgoDCIADCgMIgQMKAwiCAwoDCIMDCgMIhAMKAwiFAwoDCIYDCgMIhwMKAwiIAwoDCIkDCgMIigMKAwiLAwoDCIwDCgMIjQMKAwiOAwoDCI8DCgMIkAMKAwiRAwoDCJIDCgMIkwMKAwiUAwoDCJUDCgMIlgMKAwiXAwoDCJgDCgMImQMKAwiaAwoDCJsDCgMInAMKAwidAwoDCJ4DCgMInwMKAwigAwoDCKEDCgMIogMKAwijAwoDCKQDCgMIpQMKAwimAwoDCKcDCgMIqAMKAwipAwoDCKoDCgMIqwMKAwisAwoDCK0DCgMIrgMKAwivAwoDCLADCgMIsQMKAwiyAwoDCLMDCgMItAMKAwi1AwoDCLYDCgMItwMKAwi4AwoDCLkDCgMIugMKAwi7AwoDCLwDCgMIvQMKAwi-AwoDCL8DCgMIwAMKAwjBAwoDCMIDCgMIwwMKAwjEAwoDCMUDCgMIxgMKAwjHAwoDCMgDCgMIyQMKAwjKAwoDCMsDCgMIzAMKAwjNAwoDCM4DCgMIzwMKAwjQAwoDCNEDCgMI0gMKAwjTAwoDCNQDCgMI1QMKAwjWAwoDCNcDCgMI2AMKAwjZAwoDCNoDCgMI2wMKAwjcAwoDCN0DCgMI3gMKAwjfAwoDCOADCgMI4QMKAwjiAwoDCOMDCgMI5AMKAwjlAwoDCOYDCgMI5wMKAwjoAwoDCOkDCgMI6gMKAwjrAwoDCOwDCgMI7QMKAwjuAwoDCO8DCgMI8AMKAwjxAwoDCPIDCgMI8wMQyAMaCGJiOnNlc3MxGgliYjpzZXNzMTAaCmJiOnNlc3MxMDAaCWJiOnNlc3MxMRoJYmI6c2VzczEyGgliYjpzZXNzMTMaCWJiOnNlc3MxNBoJYmI6c2VzczE1GgliYjpzZXNzMTYaCWJiOnNlc3MxNxoJYmI6c2VzczE4GgliYjpzZXNzMTkaCGJiOnNlc3MyGgliYjpzZXNzMjAaCWJiOnNlc3MyMRoJYmI6c2VzczIyGgliYjpzZXNzMjMaCWJiOnNlc3MyNBoJYmI6c2VzczI1GgliYjpzZXNzMjYaCWJiOnNlc3MyNxoJYmI6c2VzczI4GgliYjpzZXNzMjkaCGJiOnNlc3MzGgliYjpzZXNzMzAaCWJiOnNlc3MzMRoJYmI6c2VzczMyGgliYjpzZXNzMzMaCWJiOnNlc3MzNBoJYmI6c2VzczM1GgliYjpzZXNzMzYaCWJiOnNlc3MzNxoJYmI6c2VzczM4GgliYjpzZXNzMzkaCGJiOnNlc3M0GgliYjpzZXNzNDAaCWJiOnNlc3M0MRoJYmI6c2VzczQyGgliYjpzZXNzNDMaCWJiOnNlc3M0NBoJYmI6c2VzczQ1GgliYjpzZXNzNDYaCWJiOnNlc3M0NxoJYmI6c2VzczQ4GgliYjpzZXNzNDkaCGJiOnNlc3M1GgliYjpzZXNzNTAaCWJiOnNlc3M1MRoJYmI6c2VzczUyGgliYjpzZXNzNTMaCWJiOnNlc3M1NBoJYmI6c2VzczU1GgliYjpzZXNzNTYaCWJiOnNlc3M1NxoJYmI6c2VzczU4GgliYjpzZXNzNTkaCGJiOnNlc3M2GgliYjpzZXNzNjAaCWJiOnNlc3M2MRoJYmI6c2VzczYyGgliYjpzZXNzNjMaCWJiOnNlc3M2NBoJYmI6c2VzczY1GgliYjpzZXNzNjYaCWJiOnNlc3M2NxoJYmI6c2VzczY4GgliYjpzZXNzNjkaCGJiOnNlc3M3GgliYjpzZXNzNzAaCWJiOnNlc3M3MRoJYmI6c2VzczcyGgliYjpzZXNzNzMaCWJiOnNlc3M3NBoJYmI6c2Vzczc1GgliYjpzZXNzNzYaCWJiOnNlc3M3NxoJYmI6c2Vzczc4GgliYjpzZXNzNzkaCGJiOnNlc3M4GgliYjpzZXNzODAaCWJiOnNlc3M4MRoJYmI6c2VzczgyGgliYjpzZXNzODMaCWJiOnNlc3M4NBoJYmI6c2Vzczg1GgliYjpzZXNzODYaCWJiOnNlc3M4NxoJYmI6c2Vzczg4GgliYjpzZXNzODkaCGJiOnNlc3M5GgliYjpzZXNzOTAaCWJiOnNlc3M5MRoJYmI6c2VzczkyGgliYjpzZXNzOTMaCWJiOnNlc3M5NBoJYmI6c2Vzczk1GgliYjpzZXNzOTYaCWJiOnNlc3M5NxoJYmI6c2Vzczk4GgliYjpzZXNzOTkgEigB:CX8PIOrxJnQqFXl7wAsiHJ_1VGjoI-asNlCXb8SE8jtI2vdh9x6CqbAurSgIlAAEgotVP-nuUR38x_a9YJuXzmG5AvJ458apWQtODHIDIX6ZaIwMxjS02R7S5LNqXa0gAuU_R6bCWpZdWe2uLMkdpu5KHbDgW08g-uaP_nceDOk"; - - Y_UNIT_TEST(Case1Test) { - TUserContext context1(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - - TCheckedUserTicket checkedTicket1 = context1.Check("2:serv:CgYIDRCUkQYQDBgcIgdiYjpzZXNzIghiYjpzZXNzMg:ERmeH_yzC7K_QsoHTyw7llCsyExEz3CoEopPIuivA0ZAtTaFq_Pa0l9Fhhx_NX9WpOp2CPyY5cFc4PXhcO83jCB7-EGvHNxGN-j2NQalERzPiKqkDCO0Q5etLzSzrfTlvMz7sXDvELNBHyA0PkAQnbz4supY0l-0Q6JBYSEF3zOVMjjE-HeQIFL3ats3_PakaUMWRvgQQ88pVdYZqAtbDw9PlTla7ommygVZQjcfNFXV1pJKRgOCLs-YyCjOJHLKL04zYj0X6KsOCTUeqhj7ml96wLZ-g1X9tyOR2WAr2Ctq7wIEHwqhxOLgOSKqm05xH6Vi3E_hekf50oe2jPfKEA"); - UNIT_ASSERT_EQUAL(ETicketStatus::UnsupportedVersion, checkedTicket1.GetStatus()); - UNIT_ASSERT(!checkedTicket1); - - TUserContext context2 = std::move(context1); - TUserContext context3(std::move(context2)); - TCheckedUserTicket checkedTicket2 = context3.Check(VALID_USER_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket2.GetStatus()); - TCheckedUserTicket checkedTicket3 = std::move(checkedTicket2); - TCheckedUserTicket checkedTicket4(std::move(checkedTicket3)); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket4.GetStatus()); - } - - Y_UNIT_TEST(ContextTest) { - TUserContext context(EBlackboxEnv::Prod, NUnittest::TVMKNIFE_PUBLIC_KEYS); - } - - Y_UNIT_TEST(ContextExceptionsTest) { - UNIT_ASSERT_EXCEPTION(TUserContext(EBlackboxEnv::Prod, EMPTY_TVM_KEYS), TEmptyTvmKeysException); - UNIT_ASSERT_EXCEPTION(TUserContext(EBlackboxEnv::Prod, MALFORMED_TVM_KEYS), TMalformedTvmKeysException); - } - - Y_UNIT_TEST(Ticket1Test) { - TUserContext context(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_USER_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket.GetStatus()); - UNIT_ASSERT_EQUAL(TUids({456, 123}), checkedTicket.GetUids()); - UNIT_ASSERT_EQUAL(456, checkedTicket.GetDefaultUid()); - UNIT_ASSERT_EQUAL(TScopes({"bb:sess1", "bb:sess2"}), checkedTicket.GetScopes()); - UNIT_ASSERT(checkedTicket.HasScope("bb:sess1")); - UNIT_ASSERT(checkedTicket.HasScope("bb:sess2")); - UNIT_ASSERT(!checkedTicket.HasScope("bb:sess3")); - UNIT_ASSERT_EQUAL("ticket_type=user;expiration_time=9223372036854775807;scope=bb:sess1;scope=bb:sess2;default_uid=456;uid=456;uid=123;env=Test;", checkedTicket.DebugInfo()); - } - - Y_UNIT_TEST(Ticket2Test) { - TUserContext context(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_USER_TICKET_2); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket.GetStatus()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=user;expiration_time=9223372036854775807;default_uid=456;uid=456;uid=123;env=Test;", checkedTicket.DebugInfo()); - } - - Y_UNIT_TEST(Ticket3Test) { - TUserContext context(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_USER_TICKET_3); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket.GetStatus()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=user;expiration_time=9223372036854775807;scope=bb:sess1;scope=bb:sess10;scope=bb:sess100;scope=bb:sess11;scope=bb:sess12;scope=bb:sess13;scope=bb:sess14;scope=bb:sess15;scope=bb:sess16;scope=bb:sess17;scope=bb:sess18;scope=bb:sess19;scope=bb:sess2;scope=bb:sess20;scope=bb:sess21;scope=bb:sess22;scope=bb:sess23;scope=bb:sess24;scope=bb:sess25;scope=bb:sess26;scope=bb:sess27;scope=bb:sess28;scope=bb:sess29;scope=bb:sess3;scope=bb:sess30;scope=bb:sess31;scope=bb:sess32;scope=bb:sess33;scope=bb:sess34;scope=bb:sess35;scope=bb:sess36;scope=bb:sess37;scope=bb:sess38;scope=bb:sess39;scope=bb:sess4;scope=bb:sess40;scope=bb:sess41;scope=bb:sess42;scope=bb:sess43;scope=bb:sess44;scope=bb:sess45;scope=bb:sess46;scope=bb:sess47;scope=bb:sess48;scope=bb:sess49;scope=bb:sess5;scope=bb:sess50;scope=bb:sess51;scope=bb:sess52;scope=bb:sess53;scope=bb:sess54;scope=bb:sess55;scope=bb:sess56;scope=bb:sess57;scope=bb:sess58;scope=bb:sess59;scope=bb:sess6;scope=bb:sess60;scope=bb:sess61;scope=bb:sess62;scope=bb:sess63;scope=bb:sess64;scope=bb:sess65;scope=bb:sess66;scope=bb:sess67;scope=bb:sess68;scope=bb:sess69;scope=bb:sess7;scope=bb:sess70;scope=bb:sess71;scope=bb:sess72;scope=bb:sess73;scope=bb:sess74;scope=bb:sess75;scope=bb:sess76;scope=bb:sess77;scope=bb:sess78;scope=bb:sess79;scope=bb:sess8;scope=bb:sess80;scope=bb:sess81;scope=bb:sess82;scope=bb:sess83;scope=bb:sess84;scope=bb:sess85;scope=bb:sess86;scope=bb:sess87;scope=bb:sess88;scope=bb:sess89;scope=bb:sess9;scope=bb:sess90;scope=bb:sess91;scope=bb:sess92;scope=bb:sess93;scope=bb:sess94;scope=bb:sess95;scope=bb:sess96;scope=bb:sess97;scope=bb:sess98;scope=bb:sess99;default_uid=456;uid=0;uid=1;uid=2;uid=3;uid=4;uid=5;uid=6;uid=7;uid=8;uid=9;uid=10;uid=11;uid=12;uid=13;uid=14;uid=15;uid=16;uid=17;uid=18;uid=19;uid=20;uid=21;uid=22;uid=23;uid=24;uid=25;uid=26;uid=27;uid=28;uid=29;uid=30;uid=31;uid=32;uid=33;uid=34;uid=35;uid=36;uid=37;uid=38;uid=39;uid=40;uid=41;uid=42;uid=43;uid=44;uid=45;uid=46;uid=47;uid=48;uid=49;uid=50;uid=51;uid=52;uid=53;uid=54;uid=55;uid=56;uid=57;uid=58;uid=59;uid=60;uid=61;uid=62;uid=63;uid=64;uid=65;uid=66;uid=67;uid=68;uid=69;uid=70;uid=71;uid=72;uid=73;uid=74;uid=75;uid=76;uid=77;uid=78;uid=79;uid=80;uid=81;uid=82;uid=83;uid=84;uid=85;uid=86;uid=87;uid=88;uid=89;uid=90;uid=91;uid=92;uid=93;uid=94;uid=95;uid=96;uid=97;uid=98;uid=99;uid=100;uid=101;uid=102;uid=103;uid=104;uid=105;uid=106;uid=107;uid=108;uid=109;uid=110;uid=111;uid=112;uid=113;uid=114;uid=115;uid=116;uid=117;uid=118;uid=119;uid=120;uid=121;uid=122;uid=123;uid=124;uid=125;uid=126;uid=127;uid=128;uid=129;uid=130;uid=131;uid=132;uid=133;uid=134;uid=135;uid=136;uid=137;uid=138;uid=139;uid=140;uid=141;uid=142;uid=143;uid=144;uid=145;uid=146;uid=147;uid=148;uid=149;uid=150;uid=151;uid=152;uid=153;uid=154;uid=155;uid=156;uid=157;uid=158;uid=159;uid=160;uid=161;uid=162;uid=163;uid=164;uid=165;uid=166;uid=167;uid=168;uid=169;uid=170;uid=171;uid=172;uid=173;uid=174;uid=175;uid=176;uid=177;uid=178;uid=179;uid=180;uid=181;uid=182;uid=183;uid=184;uid=185;uid=186;uid=187;uid=188;uid=189;uid=190;uid=191;uid=192;uid=193;uid=194;uid=195;uid=196;uid=197;uid=198;uid=199;uid=200;uid=201;uid=202;uid=203;uid=204;uid=205;uid=206;uid=207;uid=208;uid=209;uid=210;uid=211;uid=212;uid=213;uid=214;uid=215;uid=216;uid=217;uid=218;uid=219;uid=220;uid=221;uid=222;uid=223;uid=224;uid=225;uid=226;uid=227;uid=228;uid=229;uid=230;uid=231;uid=232;uid=233;uid=234;uid=235;uid=236;uid=237;uid=238;uid=239;uid=240;uid=241;uid=242;uid=243;uid=244;uid=245;uid=246;uid=247;uid=248;uid=249;uid=250;uid=251;uid=252;uid=253;uid=254;uid=255;uid=256;uid=257;uid=258;uid=259;uid=260;uid=261;uid=262;uid=263;uid=264;uid=265;uid=266;uid=267;uid=268;uid=269;uid=270;uid=271;uid=272;uid=273;uid=274;uid=275;uid=276;uid=277;uid=278;uid=279;uid=280;uid=281;uid=282;uid=283;uid=284;uid=285;uid=286;uid=287;uid=288;uid=289;uid=290;uid=291;uid=292;uid=293;uid=294;uid=295;uid=296;uid=297;uid=298;uid=299;uid=300;uid=301;uid=302;uid=303;uid=304;uid=305;uid=306;uid=307;uid=308;uid=309;uid=310;uid=311;uid=312;uid=313;uid=314;uid=315;uid=316;uid=317;uid=318;uid=319;uid=320;uid=321;uid=322;uid=323;uid=324;uid=325;uid=326;uid=327;uid=328;uid=329;uid=330;uid=331;uid=332;uid=333;uid=334;uid=335;uid=336;uid=337;uid=338;uid=339;uid=340;uid=341;uid=342;uid=343;uid=344;uid=345;uid=346;uid=347;uid=348;uid=349;uid=350;uid=351;uid=352;uid=353;uid=354;uid=355;uid=356;uid=357;uid=358;uid=359;uid=360;uid=361;uid=362;uid=363;uid=364;uid=365;uid=366;uid=367;uid=368;uid=369;uid=370;uid=371;uid=372;uid=373;uid=374;uid=375;uid=376;uid=377;uid=378;uid=379;uid=380;uid=381;uid=382;uid=383;uid=384;uid=385;uid=386;uid=387;uid=388;uid=389;uid=390;uid=391;uid=392;uid=393;uid=394;uid=395;uid=396;uid=397;uid=398;uid=399;uid=400;uid=401;uid=402;uid=403;uid=404;uid=405;uid=406;uid=407;uid=408;uid=409;uid=410;uid=411;uid=412;uid=413;uid=414;uid=415;uid=416;uid=417;uid=418;uid=419;uid=420;uid=421;uid=422;uid=423;uid=424;uid=425;uid=426;uid=427;uid=428;uid=429;uid=430;uid=431;uid=432;uid=433;uid=434;uid=435;uid=436;uid=437;uid=438;uid=439;uid=440;uid=441;uid=442;uid=443;uid=444;uid=445;uid=446;uid=447;uid=448;uid=449;uid=450;uid=451;uid=452;uid=453;uid=454;uid=455;uid=456;uid=457;uid=458;uid=459;uid=460;uid=461;uid=462;uid=463;uid=464;uid=465;uid=466;uid=467;uid=468;uid=469;uid=470;uid=471;uid=472;uid=473;uid=474;uid=475;uid=476;uid=477;uid=478;uid=479;uid=480;uid=481;uid=482;uid=483;uid=484;uid=485;uid=486;uid=487;uid=488;uid=489;uid=490;uid=491;uid=492;uid=493;uid=494;uid=495;uid=496;uid=497;uid=498;uid=499;env=Test;", checkedTicket.DebugInfo()); - } - - Y_UNIT_TEST(TicketErrorsTest) { - TUserContext contextTest(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket1 = contextTest.Check(UNSUPPORTED_VERSION_USER_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::UnsupportedVersion, checkedTicket1.GetStatus()); - - auto checkedTicket2 = contextTest.Check(EXPIRED_USER_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::Expired, checkedTicket2.GetStatus()); - - TUserContext contextProd(EBlackboxEnv::Prod, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket3 = contextProd.Check(VALID_USER_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::InvalidBlackboxEnv, checkedTicket3.GetStatus()); - } - - Y_UNIT_TEST(TicketExceptionsTest) { - TUserContext contextTest(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = contextTest.Check(EXPIRED_USER_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::Expired, checkedTicket.GetStatus()); - - UNIT_ASSERT_EXCEPTION(checkedTicket.GetDefaultUid(), TNotAllowedException); - UNIT_ASSERT_EXCEPTION(checkedTicket.GetUids(), TNotAllowedException); - UNIT_ASSERT_EXCEPTION(checkedTicket.GetScopes(), TNotAllowedException); - UNIT_ASSERT_EXCEPTION(checkedTicket.HasScope(""), TNotAllowedException); - UNIT_ASSERT_NO_EXCEPTION(bool(checkedTicket)); - UNIT_ASSERT_NO_EXCEPTION(checkedTicket.DebugInfo()); - UNIT_ASSERT_NO_EXCEPTION(checkedTicket.GetStatus()); - } - - Y_UNIT_TEST(ResetKeysTest) { - TUserContext context(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_USER_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket.GetStatus()); - } -} diff --git a/library/cpp/tvmauth/src/ut/service_ut.cpp b/library/cpp/tvmauth/src/ut/service_ut.cpp deleted file mode 100644 index 5b6b5143bd3..00000000000 --- a/library/cpp/tvmauth/src/ut/service_ut.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include <library/cpp/tvmauth/src/service_impl.h> -#include <library/cpp/tvmauth/src/utils.h> - -#include <library/cpp/tvmauth/exception.h> -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/testing/unittest/registar.h> - -#include <util/string/cast.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(ServiceTestSuite) { - Y_UNIT_TEST_DECLARE(TicketProtoTest); -} - -class TTestServiceTicketImpl: public TCheckedServiceTicket::TImpl { - using TCheckedServiceTicket::TImpl::TImpl; - Y_UNIT_TEST_FRIEND(ServiceTestSuite, TicketProtoTest); -}; - -Y_UNIT_TEST_SUITE_IMPLEMENTATION(ServiceTestSuite) { - static const TString EMPTY_TVM_KEYS = "1:CpgCCpMCCAEQABqIAjCCAQQCggEAcLEXeH67FQESFUn4_7wnX7wN0PUrBoUsm3QQ4W5vC-qz6sXaEjSwnTV8w1o-z6X9KPLlhzMQvuS38NCNfK4uvJ4Zvfp3YsXJ25-rYtbnrYJHNvHohD-kPCCw_yZpMp21JdWigzQGuV7CtrxUhF-NNrsnUaJrE5-OpEWNt4X6nCItKIYeVcSK6XJUbEWbrNCRbvkSc4ak2ymFeMuHYJVjxh4eQbk7_ZPzodP0WvF6eUYrYeb42imVEOR8ofVLQWE5DVnb1z_TqZm4i1XkS7jMwZuBxBRw8DGdYei0lT_sAf7KST2jC0590NySB3vsBgWEVs1OdUUWA6r-Dvx9dsOQtSCVkQYQAAqZAgqUAggCEAAaiQIwggEFAoIBAQDhEBM5-6YsPWfogKtbluJoCX1WV2KdzOaQ0-OlRbBzeCzw-eQKu12c8WakHBbeCMd1I1TU64SDkDorWjXGIa_2xT6N3zzNAE50roTbPCcmeQrps26woTYfYIuqDdoxYKZNr0lvNLLW47vBr7EKqo1S4KSj7aXK_XYeEvUgIgf3nVIcNrio7VTnFmGGVQCepaL1Hi1gN4yIXjVZ06PBPZ-DxSRu6xOGbFrfKMJeMPs7KOyE-26Q3xOXdTIa1X-zYIucTd_bxUCL4BVbwW2AvbbFsaG7ISmVdGu0XUTmhXs1KrEfUVLRJhE4Dx99hAZXm1_HlYMUeJcMQ_oHOhV94ENFIJaRBhACCpYBCpEBCAMQABqGATCBgwKBgF9t2YJGAJkRRFq6fWhi3m1TFW1UOE0f6ZrfYhHAkpqGlKlh0QVfeTNPpeJhi75xXzCe6oReRUm-0DbqDNhTShC7uGUv1INYnRBQWH6E-5Fc5XrbDFSuGQw2EYjNfHy_HefHJXxQKAqPvxBDKMKkHgV58WtM6rC8jRi9sdX_ig2NIJeRBhABCpYBCpEBCAQQABqGATCBgwKBgGB4d6eLGUBv-Q6EPLehC4S-yuE2HB-_rJ7WkeYwyp-xIPolPrd-PQme2utHB4ZgpXHIu_OFksDe_0bPgZniNRSVRbl7W49DgS5Ya3kMfrYB4DnF5Fta5tn1oV6EwxYD4JONpFTenOJALPGTPawxXEfon_peiHOSBuQMu3_Vn-l1IJiRBhADCpcBCpIBCAUQABqHATCBhAKBgQCTJMKIfmfeZpaI7Q9rnsc29gdWawK7TnpVKRHws1iY7EUlYROeVcMdAwEqVM6f8BVCKLGgzQ7Gar_uuxfUGKwqEQzoppDraw4F75J464-7D5f6_oJQuGIBHZxqbMONtLjBCXRUhQW5szBLmTQ_R3qaJb5vf-h0APZfkYhq1cTttSCZkQYQBAqWAQqRAQgLEAAahgEwgYMCgYBvvGVH_M2H8qxxv94yaDYUTWbRnJ1uiIYc59KIQlfFimMPhSS7x2tqUa2-hI55JiII0Xym6GNkwLhyc1xtWChpVuIdSnbvttbrt4weDMLHqTwNOF6qAsVKGKT1Yh8yf-qb-DSmicgvFc74mBQm_6gAY1iQsf33YX8578ClhKBWHSCVkQYQAAqXAQqSAQgMEAAahwEwgYQCgYEAkuzFcd5TJu7lYWYe2hQLFfUWIIj91BvQQLa_Thln4YtGCO8gG1KJqJm-YlmJOWQG0B7H_5RVhxUxV9KpmFnsDVkzUFKOsCBaYGXc12xPVioawUlAwp5qp3QQtZyx_se97YIoLzuLr46UkLcLnkIrp-Jo46QzYi_QHq45WTm8MQ0glpEGEAIKlwEKkgEIDRAAGocBMIGEAoGBAIUzbxOknXf_rNt17_ir8JlWvrtnCWsQd1MAnl5mgArvavDtKeBYHzi5_Ak7DHlLzuA6YE8W175FxLFKpN2hkz-l-M7ltUSd8N1BvJRhK4t6WffWfC_1wPyoAbeSN2Yb1jygtZJQ8wGoXHcJQUXiMit3eFNyylwsJFj1gzAR4JCdIJeRBhABCpYBCpEBCA4QABqGATCBgwKBgFMcbEpl9ukVR6AO_R6sMyiU11I8b8MBSUCEC15iKsrVO8v_m47_TRRjWPYtQ9eZ7o1ocNJHaGUU7qqInFqtFaVnIceP6NmCsXhjs3MLrWPS8IRAy4Zf4FKmGOx3N9O2vemjUygZ9vUiSkULdVrecinRaT8JQ5RG4bUMY04XGIwFIJiRBhADCpYBCpEBCA8QABqGATCBgwKBgGpCkW-NR3li8GlRvqpq2YZGSIgm_PTyDI2Zwfw69grsBmPpVFW48Vw7xoMN35zcrojEpialB_uQzlpLYOvsMl634CRIuj-n1QE3-gaZTTTE8mg-AR4mcxnTKThPnRQpbuOlYAnriwiasWiQEMbGjq_HmWioYYxFo9USlklQn4-9IJmRBhAE"; - static const TString EXPIRED_SERVICE_TICKET = "3:serv:CBAQACIZCOUBEBwaCGJiOnNlc3MxGghiYjpzZXNzMg:IwfMNJYEqStY_SixwqJnyHOMCPR7-3HHk4uylB2oVRkthtezq-OOA7QizDvx7VABLs_iTlXuD1r5IjufNei_EiV145eaa3HIg4xCdJXCojMexf2UYJz8mF2b0YzFAy6_KWagU7xo13CyKAqzJuQf5MJcSUf0ecY9hVh36cJ51aw"; - static const TString MALFORMED_TVM_KEYS = "1:CpgCCpMCCAEQABqIAjCCAQQCggEAcLEXeH67FQESFUn4_7wnX7wN0PUrBoUsm3QQ4W5vC-qz6sXaEjSwnTV8w1o-z6X9KPLlhzMQvuS38NCNfK4uvJ4Zvfp3YsXJ25-rYtbnrYJHNvHohD-kPCCw_yZpMp21JdWigzQGuV7CtrxUhF-NNrsnUaJrE5-OpEWNt4X6nCItKIYeVcSK6XJUbEWbrNCRbvkSc4ak2ymFeMuHYJVjxh4eQbk7_ZPzodP0WvF6eUYrYeb42imVEOR8ofVLQWE5DVnb1z_TqZm4i1XkS7jMwZuBxBRw8DGdYei0lT_sAf7KST2jC0590NySB3vsBgWEVs1OdUUWA6r-Dvx9dsOQtSCVkQYQAAqZAgqUAggCEAAaiQIwggEFAoIBAQDhEBM5-6YsPWfogKtbluJoCX1WV2KdzOaQ0-OlRbBzeCzw-eQKu12c8WakHBbeCMd1I1TU64SDkDorWjXGIa_2xT6N3zzNAE50roTbPCcmeQrps26woTYfYIuqDdoxYKZNr0lvNLLW47vBr7EKqo1S4KSj7aXK_XYeEvUgIgf3nVIcNrio7VTnFmGGVQCepaL1Hi1gN4yIXjVZ06PBPZ-DxSRu6xOGbFrfKMJeMPs7KOyE-26Q3xOXdTIa1X-zYIucTd_bxUCL4BVbwW2AvbbFsaG7ISmVdGu0XUTmhXs1KrEfUVLRJhE4Dx99hAZXm1_HlYMUeJcMQ_oHOhV94ENFIJaRBhACCpYBCpEBCAMQABqGATCBgwKBgF9t2YJGAJkRRFq6fWhi3m1TFW1UOE0f6ZrfYhHAkpqGlKlh0QVfeTNPpeJhi75xXzCe6oReRUm-0DbqDNhTShC7uGUv1INYnRBQWH6E-5Fc5XrbDFSuGQw2EYjNfHy_HefHJXxQKAqPvxBDKMKkHgV58WtM6rC8jRi9sdX_ig2NIJeRBhABCpYBCpEBCAQQABqGATCBgwKBgGB4d6eLGUBv-Q6EPLehC4S-yuE2HB-_rJ7WkeYwyp-xIPolPrd-PQme2utHB4ZgpXHIu_OFksDe_0bPgZniNRSVRbl7W49DgS5Ya3kMfrYB4DnF5Fta5tn1oV6EwxYD4JONpFTenOJALPGTPawxXEfon_peiHOSBuQMu3_Vn-l1IJiRBhADCpcBCpIBCAUQABqHATCBhAKBgQCTJMKIfmfeZpaI7Q9rnsc29gdWawK7TnpVKRHws1iY7EUlYROeVcMdAwEqVM6f8BVCKLGgzQ7Gar_uuxfUGKwqEQzoppDraw4F75J464-7D5f6_oJQuGIBHZxqbMONtLjBCXRUhQW5szBLmTQ_R3qaJb5vf-h0APZfkYhq1cTttSCZkQYQBAqWAQqRAQgLEAAahgEwgYMCgYBvvGVH_M2H8qxxv94yaDYUTWbRnJ1uiIYc59KIQlfFimMPhSS7x2tqUa2-hI55JiII0Xym6GNkwLhyc1xtWChpVuIdSnbvttbrt4weDMLHqTwNOF6qAsVKGKT1Yh8yf-qb-DSmicgvFc74mBQm_6gAY1iQsf33YX8578ClhKBWHSCVkQYQAAqXAQqSAQgMEAAahwEwgYQCgYEAkuzFcd5TJu7lYWYe2hQLFfUWIIj91BvQQLa_Thln4YtGCO8gG1KJqJm-YlmJOWQG0B7H_5RVhxUxV9KpmFnsDVkzUFKOsCBaYGXc12xPVioawUlAwp5qp3QQtZyx_se97YIoLzuLr46UkLcLnkIrp-Jo46QzYi_QHq45WTm8MQ0glpEGEAIKlwEKkgEIDRAAGocBMIGEAoGBAIUzbxOknXf_rNt17_ir8JlWvrtnCWsQd1MAnl5mgArvavDtKeBYHzi5_Ak7DHlLzuA6YE8W175FxLFKpN2hkz-l-M7ltUSd8N1BvJRhK4t6WffWfC_1wPyoAbeSN2Yb1jygtZJQ8wGoXHcJQUXiMit3eFNyylwsJFj1gzAR4JCdIJeRBhABCpYBCpEBCA4QABqGATCBgwKBgFMcbEpl9ukVR6AO_R6sMyiU11I8b8MBSUCEC15iKsrVO8v_m47_TRRjWPYtQ9eZ7o1ocNJHaGUU7qqInFqtFaVnIceP6NmCsXhjs3MLrWPS8IRAy4Zf4FKmGOx3N9O2vemjUygZ9vUiSkULdVrecinRaT8JQ5RG4bUMY04XGIwFIJiRBhADCpYBCpEBCA8QABqGATCBgwKBgGpCkW-NR3li8GlRvqpq2YZGSIgm_PTyDI2Zwfw69grsBmPpVFW48Vw7xoMN35zcrojEpialB_uQzlpLYOvsMl634CRIuj-n1QE3-gaZTTTE8mg-AR4mcxnTKThPnRQpbuOlYAnriwiasWiQEMbGjq_HmWioYYxFo9USlklQn4-9IJmRBhAEEpUBCpIBCAYQABqHATCBhAKBgQCoZkFGm9oLTqjeXZAq6j5S6i7K20V0lNdBBLqfmFBIRuTkYxhs4vUYnWjZrKRAd5bp6_py0csmFmpl_5Yh0b-2pdo_E5PNP7LGRzKyKSiFddyykKKzVOazH8YYldDAfE8Z5HoS9e48an5JsPg0jr-TPu34DnJq3yv2a6dqiKL9zSCakQYSlQEKkgEIEBAAGocBMIGEAoGBALhrihbf3EpjDQS2sCQHazoFgN0nBbE9eesnnFTfzQELXb2gnJU9enmV_aDqaHKjgtLIPpCgn40lHrn5k6mvH5OdedyI6cCzE-N-GFp3nAq0NDJyMe0fhtIRD__CbT0ulcvkeow65ubXWfw6dBC2gR_34rdMe_L_TGRLMWjDULbNIJ"; - static const TString MALFORMED_TVM_SECRET = "adcvxcv./-+"; - static const TTvmId NOT_OUR_ID = 27; - static const TTvmId OUR_ID = 28; - static const TString SECRET = "GRMJrKnj4fOVnvOqe-WyD1"; - static const TString SERVICE_TICKET_PROTOBUF = "CBAQ__________9_IhkI5QEQHBoIYmI6c2VzczEaCGJiOnNlc3My"; - static const TTvmId SRC_ID = 229; - static const TString UNSUPPORTED_VERSION_SERVICE_TICKET = "2:serv:CBAQ__________9_IhkI5QEQHBoIYmI6c2VzczEaCGJiOnNlc3My:WUPx1cTf05fjD1exB35T5j2DCHWH1YaLJon_a4rN-D7JfXHK1Ai4wM4uSfboHD9xmGQH7extqtlEk1tCTCGm5qbRVloJwWzCZBXo3zKX6i1oBYP_89WcjCNPVe1e8jwGdLsnu6PpxL5cn0xCksiStILH5UmDR6xfkJdnmMG94o8"; - static const TString VALID_SERVICE_TICKET_1 = "3:serv:CBAQ__________9_IhkI5QEQHBoIYmI6c2VzczEaCGJiOnNlc3My:WUPx1cTf05fjD1exB35T5j2DCHWH1YaLJon_a4rN-D7JfXHK1Ai4wM4uSfboHD9xmGQH7extqtlEk1tCTCGm5qbRVloJwWzCZBXo3zKX6i1oBYP_89WcjCNPVe1e8jwGdLsnu6PpxL5cn0xCksiStILH5UmDR6xfkJdnmMG94o8"; - static const TString VALID_SERVICE_TICKET_2 = "3:serv:CBAQ__________9_IskICOUBEBwaCGJiOnNlc3MxGgliYjpzZXNzMTAaCmJiOnNlc3MxMDAaCWJiOnNlc3MxMRoJYmI6c2VzczEyGgliYjpzZXNzMTMaCWJiOnNlc3MxNBoJYmI6c2VzczE1GgliYjpzZXNzMTYaCWJiOnNlc3MxNxoJYmI6c2VzczE4GgliYjpzZXNzMTkaCGJiOnNlc3MyGgliYjpzZXNzMjAaCWJiOnNlc3MyMRoJYmI6c2VzczIyGgliYjpzZXNzMjMaCWJiOnNlc3MyNBoJYmI6c2VzczI1GgliYjpzZXNzMjYaCWJiOnNlc3MyNxoJYmI6c2VzczI4GgliYjpzZXNzMjkaCGJiOnNlc3MzGgliYjpzZXNzMzAaCWJiOnNlc3MzMRoJYmI6c2VzczMyGgliYjpzZXNzMzMaCWJiOnNlc3MzNBoJYmI6c2VzczM1GgliYjpzZXNzMzYaCWJiOnNlc3MzNxoJYmI6c2VzczM4GgliYjpzZXNzMzkaCGJiOnNlc3M0GgliYjpzZXNzNDAaCWJiOnNlc3M0MRoJYmI6c2VzczQyGgliYjpzZXNzNDMaCWJiOnNlc3M0NBoJYmI6c2VzczQ1GgliYjpzZXNzNDYaCWJiOnNlc3M0NxoJYmI6c2VzczQ4GgliYjpzZXNzNDkaCGJiOnNlc3M1GgliYjpzZXNzNTAaCWJiOnNlc3M1MRoJYmI6c2VzczUyGgliYjpzZXNzNTMaCWJiOnNlc3M1NBoJYmI6c2VzczU1GgliYjpzZXNzNTYaCWJiOnNlc3M1NxoJYmI6c2VzczU4GgliYjpzZXNzNTkaCGJiOnNlc3M2GgliYjpzZXNzNjAaCWJiOnNlc3M2MRoJYmI6c2VzczYyGgliYjpzZXNzNjMaCWJiOnNlc3M2NBoJYmI6c2VzczY1GgliYjpzZXNzNjYaCWJiOnNlc3M2NxoJYmI6c2VzczY4GgliYjpzZXNzNjkaCGJiOnNlc3M3GgliYjpzZXNzNzAaCWJiOnNlc3M3MRoJYmI6c2VzczcyGgliYjpzZXNzNzMaCWJiOnNlc3M3NBoJYmI6c2Vzczc1GgliYjpzZXNzNzYaCWJiOnNlc3M3NxoJYmI6c2Vzczc4GgliYjpzZXNzNzkaCGJiOnNlc3M4GgliYjpzZXNzODAaCWJiOnNlc3M4MRoJYmI6c2VzczgyGgliYjpzZXNzODMaCWJiOnNlc3M4NBoJYmI6c2Vzczg1GgliYjpzZXNzODYaCWJiOnNlc3M4NxoJYmI6c2Vzczg4GgliYjpzZXNzODkaCGJiOnNlc3M5GgliYjpzZXNzOTAaCWJiOnNlc3M5MRoJYmI6c2VzczkyGgliYjpzZXNzOTMaCWJiOnNlc3M5NBoJYmI6c2Vzczk1GgliYjpzZXNzOTYaCWJiOnNlc3M5NxoJYmI6c2Vzczk4GgliYjpzZXNzOTk:JYmABAVLM6y7_T4n1pRcwBfwDfzMV4JJ3cpbEG617zdGgKRZwL7MalsYn5bq1F2ibujMrsF9nzZf8l4s_e-Ivjkz_xu4KMzSp-pUh9V7XIF_smj0WHYpv6gOvWNuK8uIvlZTTKwtQX0qZOL9m-MEeZiHoQPKZGCfJ_qxMUp-J8I"; - static const TString VALID_SERVICE_TICKET_3 = "3:serv:CBAQ__________9_IgUI5QEQHA:Sd6tmA1CNy2Nf7XevC3x7zr2DrGNRmcl-TxUsDtDW2xI3YXyCxBltWeg0-KtDlqyYuPOP5Jd_-XXNA12KlOPnNzrz3jm-5z8uQl6CjCcrVHUHJ75pGC8r9UOlS8cOgeXQB5dYP-fOWyo5CNadlozx1S2meCIxncbQRV1kCBi4KU"; - static const TString VALID_SERVICE_TICKET_ISSUER = "3:serv:CBAQ__________9_IgsI5QEQHCDr1MT4Ag:Gu66XJT_nKnIRJjFy1561wFhIqkJItcSTGftLo7Yvi7i5wIdV-QuKT_-IMPpgjxnnGbt1Dy3Ys2TEoeJAb0TdaCYG1uy3vpoLONmTx9AenN5dx1HHf46cypLK5D3OdiTjxvqI9uGmSIKrSdRxU8gprpu5QiBDPZqVCWhM60FVSY"; - - Y_UNIT_TEST(ContextExceptionsTest) { - UNIT_ASSERT_EXCEPTION(TServiceContext::TImpl(SECRET, OUR_ID, MALFORMED_TVM_KEYS), TMalformedTvmKeysException); - UNIT_ASSERT_EXCEPTION(TServiceContext::TImpl(SECRET, OUR_ID, EMPTY_TVM_KEYS), TEmptyTvmKeysException); - UNIT_ASSERT_EXCEPTION(TServiceContext::TImpl(MALFORMED_TVM_SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS), TMalformedTvmSecretException); - } - - Y_UNIT_TEST(ContextSignTest) { - TServiceContext::TImpl context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT_VALUES_EQUAL( - "NsPTYak4Cfk-4vgau5lab3W4GPiTtb2etuj3y4MDPrk", - context.SignCgiParamsForTvm(IntToString<10>(std::numeric_limits<time_t>::max()), "13,28", "")); - } - - Y_UNIT_TEST(Ticket1Test) { - TServiceContext::TImpl context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_SERVICE_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket->GetStatus()); - UNIT_ASSERT_EQUAL(std::numeric_limits<time_t>::max(), checkedTicket->GetExpirationTime()); - UNIT_ASSERT_EQUAL(SRC_ID, checkedTicket->GetSrc()); - UNIT_ASSERT_EQUAL(TScopes({"bb:sess1", "bb:sess2"}), checkedTicket->GetScopes()); - UNIT_ASSERT(checkedTicket->HasScope("bb:sess1")); - UNIT_ASSERT(checkedTicket->HasScope("bb:sess2")); - UNIT_ASSERT(!checkedTicket->HasScope("bb:sess3")); - UNIT_ASSERT_EQUAL("ticket_type=serv;expiration_time=9223372036854775807;src=229;dst=28;scope=bb:sess1;scope=bb:sess2;", checkedTicket->DebugInfo()); - UNIT_ASSERT(!checkedTicket->GetIssuerUid()); - } - - Y_UNIT_TEST(Ticket2Test) { - TServiceContext::TImpl context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_SERVICE_TICKET_2); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=serv;expiration_time=9223372036854775807;src=229;dst=28;scope=bb:sess1;scope=bb:sess10;scope=bb:sess100;scope=bb:sess11;scope=bb:sess12;scope=bb:sess13;scope=bb:sess14;scope=bb:sess15;scope=bb:sess16;scope=bb:sess17;scope=bb:sess18;scope=bb:sess19;scope=bb:sess2;scope=bb:sess20;scope=bb:sess21;scope=bb:sess22;scope=bb:sess23;scope=bb:sess24;scope=bb:sess25;scope=bb:sess26;scope=bb:sess27;scope=bb:sess28;scope=bb:sess29;scope=bb:sess3;scope=bb:sess30;scope=bb:sess31;scope=bb:sess32;scope=bb:sess33;scope=bb:sess34;scope=bb:sess35;scope=bb:sess36;scope=bb:sess37;scope=bb:sess38;scope=bb:sess39;scope=bb:sess4;scope=bb:sess40;scope=bb:sess41;scope=bb:sess42;scope=bb:sess43;scope=bb:sess44;scope=bb:sess45;scope=bb:sess46;scope=bb:sess47;scope=bb:sess48;scope=bb:sess49;scope=bb:sess5;scope=bb:sess50;scope=bb:sess51;scope=bb:sess52;scope=bb:sess53;scope=bb:sess54;scope=bb:sess55;scope=bb:sess56;scope=bb:sess57;scope=bb:sess58;scope=bb:sess59;scope=bb:sess6;scope=bb:sess60;scope=bb:sess61;scope=bb:sess62;scope=bb:sess63;scope=bb:sess64;scope=bb:sess65;scope=bb:sess66;scope=bb:sess67;scope=bb:sess68;scope=bb:sess69;scope=bb:sess7;scope=bb:sess70;scope=bb:sess71;scope=bb:sess72;scope=bb:sess73;scope=bb:sess74;scope=bb:sess75;scope=bb:sess76;scope=bb:sess77;scope=bb:sess78;scope=bb:sess79;scope=bb:sess8;scope=bb:sess80;scope=bb:sess81;scope=bb:sess82;scope=bb:sess83;scope=bb:sess84;scope=bb:sess85;scope=bb:sess86;scope=bb:sess87;scope=bb:sess88;scope=bb:sess89;scope=bb:sess9;scope=bb:sess90;scope=bb:sess91;scope=bb:sess92;scope=bb:sess93;scope=bb:sess94;scope=bb:sess95;scope=bb:sess96;scope=bb:sess97;scope=bb:sess98;scope=bb:sess99;", checkedTicket->DebugInfo()); - UNIT_ASSERT(!checkedTicket->GetIssuerUid()); - } - - Y_UNIT_TEST(Ticket3Test) { - TServiceContext::TImpl context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_SERVICE_TICKET_3); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=serv;expiration_time=9223372036854775807;src=229;dst=28;", checkedTicket->DebugInfo()); - UNIT_ASSERT(!checkedTicket->GetIssuerUid()); - } - - Y_UNIT_TEST(TicketIssuerTest) { - TServiceContext::TImpl context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_SERVICE_TICKET_ISSUER); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=serv;expiration_time=9223372036854775807;src=229;dst=28;issuer_uid=789654123;", - checkedTicket->DebugInfo()); - UNIT_ASSERT(checkedTicket->GetIssuerUid()); - UNIT_ASSERT_VALUES_EQUAL(789654123, *checkedTicket->GetIssuerUid()); - } - - Y_UNIT_TEST(TicketErrorsTest) { - TServiceContext::TImpl context(SECRET, NOT_OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket1 = context.Check(VALID_SERVICE_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::InvalidDst, checkedTicket1->GetStatus()); - - auto checkedTicket2 = context.Check(UNSUPPORTED_VERSION_SERVICE_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::UnsupportedVersion, checkedTicket2->GetStatus()); - - auto checkedTicket3 = context.Check(EXPIRED_SERVICE_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::Expired, checkedTicket3->GetStatus()); - } - - Y_UNIT_TEST(TicketExceptionTest) { - TServiceContext::TImpl context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - - auto checkedTicket = context.Check(EXPIRED_SERVICE_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::Expired, checkedTicket->GetStatus()); - - UNIT_ASSERT_EXCEPTION(checkedTicket->GetScopes(), TNotAllowedException); - UNIT_ASSERT_EXCEPTION(checkedTicket->GetSrc(), TNotAllowedException); - UNIT_ASSERT_EXCEPTION(checkedTicket->HasScope(""), TNotAllowedException); - UNIT_ASSERT_NO_EXCEPTION(bool(*checkedTicket)); - UNIT_ASSERT_NO_EXCEPTION(checkedTicket->DebugInfo()); - } - - Y_UNIT_TEST(TicketProtoTest) { - ticket2::Ticket protobufTicket; - UNIT_ASSERT(protobufTicket.ParseFromString(NUtils::Base64url2bin(SERVICE_TICKET_PROTOBUF))); - TTestServiceTicketImpl checkedTicket(ETicketStatus::Ok, std::move(protobufTicket)); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket.GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(std::numeric_limits<time_t>::max(), checkedTicket.GetExpirationTime()); - UNIT_ASSERT_EQUAL(SRC_ID, checkedTicket.GetSrc()); - } - - Y_UNIT_TEST(ResetKeysTest) { - TServiceContext::TImpl context(SECRET, OUR_ID, NUnittest::TVMKNIFE_PUBLIC_KEYS); - context.ResetKeys(NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_SERVICE_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket->GetStatus()); - } - - Y_UNIT_TEST(CreateTicketForTests) { - TCheckedServiceTicket t = NTvmAuth::NUnittest::CreateServiceTicket(ETicketStatus::Ok, 42); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, t.GetStatus()); - UNIT_ASSERT_EQUAL(42, t.GetSrc()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=serv;src=42;dst=100500;", t.DebugInfo()); - } - - Y_UNIT_TEST(CreateForTests) { - auto t = TCheckedServiceTicket::TImpl::CreateTicketForTests(ETicketStatus::Ok, 456, {}); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, t->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(456, t->GetSrc()); - UNIT_ASSERT(!t->GetIssuerUid()); - - t = TCheckedServiceTicket::TImpl::CreateTicketForTests(ETicketStatus::Ok, 456, 100800); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, t->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(456, t->GetSrc()); - UNIT_ASSERT(t->GetIssuerUid()); - UNIT_ASSERT_VALUES_EQUAL(*t->GetIssuerUid(), 100800); - - t = TCheckedServiceTicket::TImpl::CreateTicketForTests(ETicketStatus::Expired, 456, {}); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Expired, t->GetStatus()); - UNIT_ASSERT_EXCEPTION_CONTAINS(t->GetSrc(), TNotAllowedException, "Method cannot be used in non-valid ticket"); - UNIT_ASSERT_EXCEPTION_CONTAINS(t->GetIssuerUid(), TNotAllowedException, "Method cannot be used in non-valid ticket"); - } -} diff --git a/library/cpp/tvmauth/src/ut/user_ut.cpp b/library/cpp/tvmauth/src/ut/user_ut.cpp deleted file mode 100644 index c040e94974b..00000000000 --- a/library/cpp/tvmauth/src/ut/user_ut.cpp +++ /dev/null @@ -1,216 +0,0 @@ -#include <library/cpp/tvmauth/src/user_impl.h> -#include <library/cpp/tvmauth/src/utils.h> - -#include <library/cpp/tvmauth/exception.h> -#include <library/cpp/tvmauth/unittest.h> - -#include <library/cpp/testing/unittest/registar.h> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(UserTestSuite) { - Y_UNIT_TEST_DECLARE(TicketProtoTest); -} - -class TTestUserTicketImpl: TCheckedUserTicket::TImpl { - using TCheckedUserTicket::TImpl::TImpl; - Y_UNIT_TEST_FRIEND(UserTestSuite, TicketProtoTest); -}; - -Y_UNIT_TEST_SUITE_IMPLEMENTATION(UserTestSuite) { - static const TString EMPTY_TVM_KEYS = "1:EpUBCpIBCAYQABqHATCBhAKBgQCoZkFGm9oLTqjeXZAq6j5S6i7K20V0lNdBBLqfmFBIRuTkYxhs4vUYnWjZrKRAd5bp6_py0csmFmpl_5Yh0b-2pdo_E5PNP7LGRzKyKSiFddyykKKzVOazH8YYldDAfE8Z5HoS9e48an5JsPg0jr-TPu34DnJq3yv2a6dqiKL9zSCakQY"; - static const TString EXPIRED_USER_TICKET = "3:user:CA0QABokCgMIyAMKAgh7EMgDGghiYjpzZXNzMRoIYmI6c2VzczIgEigB:D0CmYVwWg91LDYejjeQ2UP8AeiA_mr1q1CUD_lfJ9zQSEYEOYGDTafg4Um2rwOOvQnsD1JHM4zHyMUJ6Jtp9GAm5pmhbXBBZqaCcJpyxLTEC8a81MhJFCCJRvu_G1FiAgRgB25gI3HIbkvHFUEqAIC_nANy7NFQnbKk2S-EQPGY"; - static const TString MALFORMED_TVM_KEYS = "1:CpgCCpMCCAEQABqIAjCCAQQCggEAcLEXeH67FQESFUn4_7wnX7wN0PUrBoUsm3QQ4W5vC-qz6sXaEjSwnTV8w1o-z6X9KPLlhzMQvuS38NCNfK4uvJ4Zvfp3YsXJ25-rYtbnrYJHNvHohD-kPCCw_yZpMp21JdWigzQGuV7CtrxUhF-NNrsnUaJrE5-OpEWNt4X6nCItKIYeVcSK6XJUbEWbrNCRbvkSc4ak2ymFeMuHYJVjxh4eQbk7_ZPzodP0WvF6eUYrYeb42imVEOR8ofVLQWE5DVnb1z_TqZm4i1XkS7jMwZuBxBRw8DGdYei0lT_sAf7KST2jC0590NySB3vsBgWEVs1OdUUWA6r-Dvx9dsOQtSCVkQYQAAqZAgqUAggCEAAaiQIwggEFAoIBAQDhEBM5-6YsPWfogKtbluJoCX1WV2KdzOaQ0-OlRbBzeCzw-eQKu12c8WakHBbeCMd1I1TU64SDkDorWjXGIa_2xT6N3zzNAE50roTbPCcmeQrps26woTYfYIuqDdoxYKZNr0lvNLLW47vBr7EKqo1S4KSj7aXK_XYeEvUgIgf3nVIcNrio7VTnFmGGVQCepaL1Hi1gN4yIXjVZ06PBPZ-DxSRu6xOGbFrfKMJeMPs7KOyE-26Q3xOXdTIa1X-zYIucTd_bxUCL4BVbwW2AvbbFsaG7ISmVdGu0XUTmhXs1KrEfUVLRJhE4Dx99hAZXm1_HlYMUeJcMQ_oHOhV94ENFIJaRBhACCpYBCpEBCAMQABqGATCBgwKBgF9t2YJGAJkRRFq6fWhi3m1TFW1UOE0f6ZrfYhHAkpqGlKlh0QVfeTNPpeJhi75xXzCe6oReRUm-0DbqDNhTShC7uGUv1INYnRBQWH6E-5Fc5XrbDFSuGQw2EYjNfHy_HefHJXxQKAqPvxBDKMKkHgV58WtM6rC8jRi9sdX_ig2NIJeRBhABCpYBCpEBCAQQABqGATCBgwKBgGB4d6eLGUBv-Q6EPLehC4S-yuE2HB-_rJ7WkeYwyp-xIPolPrd-PQme2utHB4ZgpXHIu_OFksDe_0bPgZniNRSVRbl7W49DgS5Ya3kMfrYB4DnF5Fta5tn1oV6EwxYD4JONpFTenOJALPGTPawxXEfon_peiHOSBuQMu3_Vn-l1IJiRBhADCpcBCpIBCAUQABqHATCBhAKBgQCTJMKIfmfeZpaI7Q9rnsc29gdWawK7TnpVKRHws1iY7EUlYROeVcMdAwEqVM6f8BVCKLGgzQ7Gar_uuxfUGKwqEQzoppDraw4F75J464-7D5f6_oJQuGIBHZxqbMONtLjBCXRUhQW5szBLmTQ_R3qaJb5vf-h0APZfkYhq1cTttSCZkQYQBAqWAQqRAQgLEAAahgEwgYMCgYBvvGVH_M2H8qxxv94yaDYUTWbRnJ1uiIYc59KIQlfFimMPhSS7x2tqUa2-hI55JiII0Xym6GNkwLhyc1xtWChpVuIdSnbvttbrt4weDMLHqTwNOF6qAsVKGKT1Yh8yf-qb-DSmicgvFc74mBQm_6gAY1iQsf33YX8578ClhKBWHSCVkQYQAAqXAQqSAQgMEAAahwEwgYQCgYEAkuzFcd5TJu7lYWYe2hQLFfUWIIj91BvQQLa_Thln4YtGCO8gG1KJqJm-YlmJOWQG0B7H_5RVhxUxV9KpmFnsDVkzUFKOsCBaYGXc12xPVioawUlAwp5qp3QQtZyx_se97YIoLzuLr46UkLcLnkIrp-Jo46QzYi_QHq45WTm8MQ0glpEGEAIKlwEKkgEIDRAAGocBMIGEAoGBAIUzbxOknXf_rNt17_ir8JlWvrtnCWsQd1MAnl5mgArvavDtKeBYHzi5_Ak7DHlLzuA6YE8W175FxLFKpN2hkz-l-M7ltUSd8N1BvJRhK4t6WffWfC_1wPyoAbeSN2Yb1jygtZJQ8wGoXHcJQUXiMit3eFNyylwsJFj1gzAR4JCdIJeRBhABCpYBCpEBCA4QABqGATCBgwKBgFMcbEpl9ukVR6AO_R6sMyiU11I8b8MBSUCEC15iKsrVO8v_m47_TRRjWPYtQ9eZ7o1ocNJHaGUU7qqInFqtFaVnIceP6NmCsXhjs3MLrWPS8IRAy4Zf4FKmGOx3N9O2vemjUygZ9vUiSkULdVrecinRaT8JQ5RG4bUMY04XGIwFIJiRBhADCpYBCpEBCA8QABqGATCBgwKBgGpCkW-NR3li8GlRvqpq2YZGSIgm_PTyDI2Zwfw69grsBmPpVFW48Vw7xoMN35zcrojEpialB_uQzlpLYOvsMl634CRIuj-n1QE3-gaZTTTE8mg-AR4mcxnTKThPnRQpbuOlYAnriwiasWiQEMbGjq_HmWioYYxFo9USlklQn4-9IJmRBhAEEpUBCpIBCAYQABqHATCBhAKBgQCoZkFGm9oLTqjeXZAq6j5S6i7K20V0lNdBBLqfmFBIRuTkYxhs4vUYnWjZrKRAd5bp6_py0csmFmpl_5Yh0b-2pdo_E5PNP7LGRzKyKSiFddyykKKzVOazH8YYldDAfE8Z5HoS9e48an5JsPg0jr-TPu34DnJq3yv2a6dqiKL9zSCakQYSlQEKkgEIEBAAGocBMIGEAoGBALhrihbf3EpjDQS2sCQHazoFgN0nBbE9eesnnFTfzQELXb2gnJU9enmV_aDqaHKjgtLIPpCgn40lHrn5k6mvH5OdedyI6cCzE-N-GFp3nAq0NDJyMe0fhtIRD__CbT0ulcvkeow65ubXWfw6dBC2gR_34rdMe_L_TGRLMWjDULbNIJ"; - static const TString UNSUPPORTED_VERSION_USER_TICKET = "2:user:CA0Q__________9_GiQKAwjIAwoCCHsQyAMaCGJiOnNlc3MxGghiYjpzZXNzMiASKAE:KJFv5EcXn9krYk19LCvlFrhMW-R4q8mKfXJXCd-RBVBgUQzCOR1Dx2FiOyU-BxUoIsaU0PiwTjbVY5I2onJDilge70Cl5zEPI9pfab2qwklACq_ZBUvD1tzrfNUr88otBGAziHASJWgyVDkhyQ3p7YbN38qpb0vGQrYNxlk4e2I"; - static const TString USER_TICKET_PROTOBUF = "CA0Q__________9_GiQKAwjIAwoCCHsQyAMaCGJiOnNlc3MxGghiYjpzZXNzMiASKAE"; - static const TString VALID_USER_TICKET_1 = "3:user:CA0Q__________9_GiQKAwjIAwoCCHsQyAMaCGJiOnNlc3MxGghiYjpzZXNzMiASKAE:KJFv5EcXn9krYk19LCvlFrhMW-R4q8mKfXJXCd-RBVBgUQzCOR1Dx2FiOyU-BxUoIsaU0PiwTjbVY5I2onJDilge70Cl5zEPI9pfab2qwklACq_ZBUvD1tzrfNUr88otBGAziHASJWgyVDkhyQ3p7YbN38qpb0vGQrYNxlk4e2I"; - static const TString VALID_USER_TICKET_2 = "3:user:CA0Q__________9_GhAKAwjIAwoCCHsQyAMgEigB:KRibGYTJUA2ns0Fn7VYqeMZ1-GdscB1o9pRzELyr7QJrJsfsE8Y_HoVvB8Npr-oalv6AXOpagSc8HpZjAQz8zKMAVE_tI0tL-9DEsHirpawEbpy7OWV7-k18o1m-RaDaKeTlIB45KHbBul1-9aeKkortBfbbXtz_Qy9r_mfFPiQ"; - static const TString VALID_USER_TICKET_3 = "3:user:CA0Q__________9_Go8bCgIIAAoCCAEKAggCCgIIAwoCCAQKAggFCgIIBgoCCAcKAggICgIICQoCCAoKAggLCgIIDAoCCA0KAggOCgIIDwoCCBAKAggRCgIIEgoCCBMKAggUCgIIFQoCCBYKAggXCgIIGAoCCBkKAggaCgIIGwoCCBwKAggdCgIIHgoCCB8KAgggCgIIIQoCCCIKAggjCgIIJAoCCCUKAggmCgIIJwoCCCgKAggpCgIIKgoCCCsKAggsCgIILQoCCC4KAggvCgIIMAoCCDEKAggyCgIIMwoCCDQKAgg1CgIINgoCCDcKAgg4CgIIOQoCCDoKAgg7CgIIPAoCCD0KAgg-CgIIPwoCCEAKAghBCgIIQgoCCEMKAghECgIIRQoCCEYKAghHCgIISAoCCEkKAghKCgIISwoCCEwKAghNCgIITgoCCE8KAghQCgIIUQoCCFIKAghTCgIIVAoCCFUKAghWCgIIVwoCCFgKAghZCgIIWgoCCFsKAghcCgIIXQoCCF4KAghfCgIIYAoCCGEKAghiCgIIYwoCCGQKAghlCgIIZgoCCGcKAghoCgIIaQoCCGoKAghrCgIIbAoCCG0KAghuCgIIbwoCCHAKAghxCgIIcgoCCHMKAgh0CgIIdQoCCHYKAgh3CgIIeAoCCHkKAgh6CgIIewoCCHwKAgh9CgIIfgoCCH8KAwiAAQoDCIEBCgMIggEKAwiDAQoDCIQBCgMIhQEKAwiGAQoDCIcBCgMIiAEKAwiJAQoDCIoBCgMIiwEKAwiMAQoDCI0BCgMIjgEKAwiPAQoDCJABCgMIkQEKAwiSAQoDCJMBCgMIlAEKAwiVAQoDCJYBCgMIlwEKAwiYAQoDCJkBCgMImgEKAwibAQoDCJwBCgMInQEKAwieAQoDCJ8BCgMIoAEKAwihAQoDCKIBCgMIowEKAwikAQoDCKUBCgMIpgEKAwinAQoDCKgBCgMIqQEKAwiqAQoDCKsBCgMIrAEKAwitAQoDCK4BCgMIrwEKAwiwAQoDCLEBCgMIsgEKAwizAQoDCLQBCgMItQEKAwi2AQoDCLcBCgMIuAEKAwi5AQoDCLoBCgMIuwEKAwi8AQoDCL0BCgMIvgEKAwi_AQoDCMABCgMIwQEKAwjCAQoDCMMBCgMIxAEKAwjFAQoDCMYBCgMIxwEKAwjIAQoDCMkBCgMIygEKAwjLAQoDCMwBCgMIzQEKAwjOAQoDCM8BCgMI0AEKAwjRAQoDCNIBCgMI0wEKAwjUAQoDCNUBCgMI1gEKAwjXAQoDCNgBCgMI2QEKAwjaAQoDCNsBCgMI3AEKAwjdAQoDCN4BCgMI3wEKAwjgAQoDCOEBCgMI4gEKAwjjAQoDCOQBCgMI5QEKAwjmAQoDCOcBCgMI6AEKAwjpAQoDCOoBCgMI6wEKAwjsAQoDCO0BCgMI7gEKAwjvAQoDCPABCgMI8QEKAwjyAQoDCPMBCgMI9AEKAwj1AQoDCPYBCgMI9wEKAwj4AQoDCPkBCgMI-gEKAwj7AQoDCPwBCgMI_QEKAwj-AQoDCP8BCgMIgAIKAwiBAgoDCIICCgMIgwIKAwiEAgoDCIUCCgMIhgIKAwiHAgoDCIgCCgMIiQIKAwiKAgoDCIsCCgMIjAIKAwiNAgoDCI4CCgMIjwIKAwiQAgoDCJECCgMIkgIKAwiTAgoDCJQCCgMIlQIKAwiWAgoDCJcCCgMImAIKAwiZAgoDCJoCCgMImwIKAwicAgoDCJ0CCgMIngIKAwifAgoDCKACCgMIoQIKAwiiAgoDCKMCCgMIpAIKAwilAgoDCKYCCgMIpwIKAwioAgoDCKkCCgMIqgIKAwirAgoDCKwCCgMIrQIKAwiuAgoDCK8CCgMIsAIKAwixAgoDCLICCgMIswIKAwi0AgoDCLUCCgMItgIKAwi3AgoDCLgCCgMIuQIKAwi6AgoDCLsCCgMIvAIKAwi9AgoDCL4CCgMIvwIKAwjAAgoDCMECCgMIwgIKAwjDAgoDCMQCCgMIxQIKAwjGAgoDCMcCCgMIyAIKAwjJAgoDCMoCCgMIywIKAwjMAgoDCM0CCgMIzgIKAwjPAgoDCNACCgMI0QIKAwjSAgoDCNMCCgMI1AIKAwjVAgoDCNYCCgMI1wIKAwjYAgoDCNkCCgMI2gIKAwjbAgoDCNwCCgMI3QIKAwjeAgoDCN8CCgMI4AIKAwjhAgoDCOICCgMI4wIKAwjkAgoDCOUCCgMI5gIKAwjnAgoDCOgCCgMI6QIKAwjqAgoDCOsCCgMI7AIKAwjtAgoDCO4CCgMI7wIKAwjwAgoDCPECCgMI8gIKAwjzAgoDCPQCCgMI9QIKAwj2AgoDCPcCCgMI-AIKAwj5AgoDCPoCCgMI-wIKAwj8AgoDCP0CCgMI_gIKAwj_AgoDCIADCgMIgQMKAwiCAwoDCIMDCgMIhAMKAwiFAwoDCIYDCgMIhwMKAwiIAwoDCIkDCgMIigMKAwiLAwoDCIwDCgMIjQMKAwiOAwoDCI8DCgMIkAMKAwiRAwoDCJIDCgMIkwMKAwiUAwoDCJUDCgMIlgMKAwiXAwoDCJgDCgMImQMKAwiaAwoDCJsDCgMInAMKAwidAwoDCJ4DCgMInwMKAwigAwoDCKEDCgMIogMKAwijAwoDCKQDCgMIpQMKAwimAwoDCKcDCgMIqAMKAwipAwoDCKoDCgMIqwMKAwisAwoDCK0DCgMIrgMKAwivAwoDCLADCgMIsQMKAwiyAwoDCLMDCgMItAMKAwi1AwoDCLYDCgMItwMKAwi4AwoDCLkDCgMIugMKAwi7AwoDCLwDCgMIvQMKAwi-AwoDCL8DCgMIwAMKAwjBAwoDCMIDCgMIwwMKAwjEAwoDCMUDCgMIxgMKAwjHAwoDCMgDCgMIyQMKAwjKAwoDCMsDCgMIzAMKAwjNAwoDCM4DCgMIzwMKAwjQAwoDCNEDCgMI0gMKAwjTAwoDCNQDCgMI1QMKAwjWAwoDCNcDCgMI2AMKAwjZAwoDCNoDCgMI2wMKAwjcAwoDCN0DCgMI3gMKAwjfAwoDCOADCgMI4QMKAwjiAwoDCOMDCgMI5AMKAwjlAwoDCOYDCgMI5wMKAwjoAwoDCOkDCgMI6gMKAwjrAwoDCOwDCgMI7QMKAwjuAwoDCO8DCgMI8AMKAwjxAwoDCPIDCgMI8wMQyAMaCGJiOnNlc3MxGgliYjpzZXNzMTAaCmJiOnNlc3MxMDAaCWJiOnNlc3MxMRoJYmI6c2VzczEyGgliYjpzZXNzMTMaCWJiOnNlc3MxNBoJYmI6c2VzczE1GgliYjpzZXNzMTYaCWJiOnNlc3MxNxoJYmI6c2VzczE4GgliYjpzZXNzMTkaCGJiOnNlc3MyGgliYjpzZXNzMjAaCWJiOnNlc3MyMRoJYmI6c2VzczIyGgliYjpzZXNzMjMaCWJiOnNlc3MyNBoJYmI6c2VzczI1GgliYjpzZXNzMjYaCWJiOnNlc3MyNxoJYmI6c2VzczI4GgliYjpzZXNzMjkaCGJiOnNlc3MzGgliYjpzZXNzMzAaCWJiOnNlc3MzMRoJYmI6c2VzczMyGgliYjpzZXNzMzMaCWJiOnNlc3MzNBoJYmI6c2VzczM1GgliYjpzZXNzMzYaCWJiOnNlc3MzNxoJYmI6c2VzczM4GgliYjpzZXNzMzkaCGJiOnNlc3M0GgliYjpzZXNzNDAaCWJiOnNlc3M0MRoJYmI6c2VzczQyGgliYjpzZXNzNDMaCWJiOnNlc3M0NBoJYmI6c2VzczQ1GgliYjpzZXNzNDYaCWJiOnNlc3M0NxoJYmI6c2VzczQ4GgliYjpzZXNzNDkaCGJiOnNlc3M1GgliYjpzZXNzNTAaCWJiOnNlc3M1MRoJYmI6c2VzczUyGgliYjpzZXNzNTMaCWJiOnNlc3M1NBoJYmI6c2VzczU1GgliYjpzZXNzNTYaCWJiOnNlc3M1NxoJYmI6c2VzczU4GgliYjpzZXNzNTkaCGJiOnNlc3M2GgliYjpzZXNzNjAaCWJiOnNlc3M2MRoJYmI6c2VzczYyGgliYjpzZXNzNjMaCWJiOnNlc3M2NBoJYmI6c2VzczY1GgliYjpzZXNzNjYaCWJiOnNlc3M2NxoJYmI6c2VzczY4GgliYjpzZXNzNjkaCGJiOnNlc3M3GgliYjpzZXNzNzAaCWJiOnNlc3M3MRoJYmI6c2VzczcyGgliYjpzZXNzNzMaCWJiOnNlc3M3NBoJYmI6c2Vzczc1GgliYjpzZXNzNzYaCWJiOnNlc3M3NxoJYmI6c2Vzczc4GgliYjpzZXNzNzkaCGJiOnNlc3M4GgliYjpzZXNzODAaCWJiOnNlc3M4MRoJYmI6c2VzczgyGgliYjpzZXNzODMaCWJiOnNlc3M4NBoJYmI6c2Vzczg1GgliYjpzZXNzODYaCWJiOnNlc3M4NxoJYmI6c2Vzczg4GgliYjpzZXNzODkaCGJiOnNlc3M5GgliYjpzZXNzOTAaCWJiOnNlc3M5MRoJYmI6c2VzczkyGgliYjpzZXNzOTMaCWJiOnNlc3M5NBoJYmI6c2Vzczk1GgliYjpzZXNzOTYaCWJiOnNlc3M5NxoJYmI6c2Vzczk4GgliYjpzZXNzOTkgEigB:CX8PIOrxJnQqFXl7wAsiHJ_1VGjoI-asNlCXb8SE8jtI2vdh9x6CqbAurSgIlAAEgotVP-nuUR38x_a9YJuXzmG5AvJ458apWQtODHIDIX6ZaIwMxjS02R7S5LNqXa0gAuU_R6bCWpZdWe2uLMkdpu5KHbDgW08g-uaP_nceDOk"; - - Y_UNIT_TEST(ContextText) { - TUserContext::TImpl context(EBlackboxEnv::Prod, NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT_EQUAL(2, context.GetKeys().size()); - UNIT_ASSERT_NO_EXCEPTION(context.ResetKeys(NUnittest::TVMKNIFE_PUBLIC_KEYS)); - UNIT_ASSERT_EQUAL(2, context.GetKeys().size()); - } - - Y_UNIT_TEST(ContextEnvTest) { - TUserContext::TImpl p(EBlackboxEnv::Prod, NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT_EQUAL(2, p.GetKeys().size()); - UNIT_ASSERT(p.IsAllowed(tvm_keys::Prod)); - UNIT_ASSERT(!p.IsAllowed(tvm_keys::ProdYateam)); - UNIT_ASSERT(!p.IsAllowed(tvm_keys::Test)); - UNIT_ASSERT(!p.IsAllowed(tvm_keys::TestYateam)); - UNIT_ASSERT(!p.IsAllowed(tvm_keys::Stress)); - - TUserContext::TImpl pt(EBlackboxEnv::ProdYateam, NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT_EQUAL(2, pt.GetKeys().size()); - UNIT_ASSERT(!pt.IsAllowed(tvm_keys::Prod)); - UNIT_ASSERT(pt.IsAllowed(tvm_keys::ProdYateam)); - UNIT_ASSERT(!pt.IsAllowed(tvm_keys::Test)); - UNIT_ASSERT(!pt.IsAllowed(tvm_keys::TestYateam)); - UNIT_ASSERT(!pt.IsAllowed(tvm_keys::Stress)); - - TUserContext::TImpl t(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT_EQUAL(2, t.GetKeys().size()); - UNIT_ASSERT(!t.IsAllowed(tvm_keys::Prod)); - UNIT_ASSERT(!t.IsAllowed(tvm_keys::ProdYateam)); - UNIT_ASSERT(t.IsAllowed(tvm_keys::Test)); - UNIT_ASSERT(!t.IsAllowed(tvm_keys::TestYateam)); - UNIT_ASSERT(!t.IsAllowed(tvm_keys::Stress)); - - TUserContext::TImpl tt(EBlackboxEnv::TestYateam, NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT_EQUAL(2, tt.GetKeys().size()); - UNIT_ASSERT(!tt.IsAllowed(tvm_keys::Prod)); - UNIT_ASSERT(!tt.IsAllowed(tvm_keys::ProdYateam)); - UNIT_ASSERT(!tt.IsAllowed(tvm_keys::Test)); - UNIT_ASSERT(tt.IsAllowed(tvm_keys::TestYateam)); - UNIT_ASSERT(!tt.IsAllowed(tvm_keys::Stress)); - - TUserContext::TImpl s(EBlackboxEnv::Stress, NUnittest::TVMKNIFE_PUBLIC_KEYS); - UNIT_ASSERT_EQUAL(4, s.GetKeys().size()); - UNIT_ASSERT(s.IsAllowed(tvm_keys::Prod)); - UNIT_ASSERT(!s.IsAllowed(tvm_keys::ProdYateam)); - UNIT_ASSERT(!s.IsAllowed(tvm_keys::Test)); - UNIT_ASSERT(!s.IsAllowed(tvm_keys::TestYateam)); - UNIT_ASSERT(s.IsAllowed(tvm_keys::Stress)); - } - - Y_UNIT_TEST(ContextExceptionsText) { - UNIT_ASSERT_EXCEPTION(TUserContext::TImpl(EBlackboxEnv::Prod, EMPTY_TVM_KEYS), TEmptyTvmKeysException); - UNIT_ASSERT_EXCEPTION(TUserContext::TImpl(EBlackboxEnv::Prod, MALFORMED_TVM_KEYS), TMalformedTvmKeysException); - UNIT_ASSERT_EXCEPTION(TUserContext::TImpl(EBlackboxEnv::Prod, "adcvxcv./-+"), TMalformedTvmKeysException); - } - - Y_UNIT_TEST(Ticket1Test) { - TUserContext::TImpl context(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_USER_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket->GetStatus()); - UNIT_ASSERT_EQUAL(std::numeric_limits<time_t>::max(), checkedTicket->GetExpirationTime()); - UNIT_ASSERT_EQUAL(TUids({456, 123}), checkedTicket->GetUids()); - UNIT_ASSERT_EQUAL(456, checkedTicket->GetDefaultUid()); - UNIT_ASSERT_EQUAL(TScopes({"bb:sess1", "bb:sess2"}), checkedTicket->GetScopes()); - UNIT_ASSERT(checkedTicket->HasScope("bb:sess1")); - UNIT_ASSERT(checkedTicket->HasScope("bb:sess2")); - UNIT_ASSERT(!checkedTicket->HasScope("bb:sess3")); - UNIT_ASSERT_EQUAL("ticket_type=user;expiration_time=9223372036854775807;scope=bb:sess1;scope=bb:sess2;default_uid=456;uid=456;uid=123;env=Test;", checkedTicket->DebugInfo()); - } - - Y_UNIT_TEST(Ticket2Test) { - TUserContext::TImpl context(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_USER_TICKET_2); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=user;expiration_time=9223372036854775807;default_uid=456;uid=456;uid=123;env=Test;", checkedTicket->DebugInfo()); - } - - Y_UNIT_TEST(Ticket3Test) { - TUserContext::TImpl context(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_USER_TICKET_3); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=user;expiration_time=9223372036854775807;scope=bb:sess1;scope=bb:sess10;scope=bb:sess100;scope=bb:sess11;scope=bb:sess12;scope=bb:sess13;scope=bb:sess14;scope=bb:sess15;scope=bb:sess16;scope=bb:sess17;scope=bb:sess18;scope=bb:sess19;scope=bb:sess2;scope=bb:sess20;scope=bb:sess21;scope=bb:sess22;scope=bb:sess23;scope=bb:sess24;scope=bb:sess25;scope=bb:sess26;scope=bb:sess27;scope=bb:sess28;scope=bb:sess29;scope=bb:sess3;scope=bb:sess30;scope=bb:sess31;scope=bb:sess32;scope=bb:sess33;scope=bb:sess34;scope=bb:sess35;scope=bb:sess36;scope=bb:sess37;scope=bb:sess38;scope=bb:sess39;scope=bb:sess4;scope=bb:sess40;scope=bb:sess41;scope=bb:sess42;scope=bb:sess43;scope=bb:sess44;scope=bb:sess45;scope=bb:sess46;scope=bb:sess47;scope=bb:sess48;scope=bb:sess49;scope=bb:sess5;scope=bb:sess50;scope=bb:sess51;scope=bb:sess52;scope=bb:sess53;scope=bb:sess54;scope=bb:sess55;scope=bb:sess56;scope=bb:sess57;scope=bb:sess58;scope=bb:sess59;scope=bb:sess6;scope=bb:sess60;scope=bb:sess61;scope=bb:sess62;scope=bb:sess63;scope=bb:sess64;scope=bb:sess65;scope=bb:sess66;scope=bb:sess67;scope=bb:sess68;scope=bb:sess69;scope=bb:sess7;scope=bb:sess70;scope=bb:sess71;scope=bb:sess72;scope=bb:sess73;scope=bb:sess74;scope=bb:sess75;scope=bb:sess76;scope=bb:sess77;scope=bb:sess78;scope=bb:sess79;scope=bb:sess8;scope=bb:sess80;scope=bb:sess81;scope=bb:sess82;scope=bb:sess83;scope=bb:sess84;scope=bb:sess85;scope=bb:sess86;scope=bb:sess87;scope=bb:sess88;scope=bb:sess89;scope=bb:sess9;scope=bb:sess90;scope=bb:sess91;scope=bb:sess92;scope=bb:sess93;scope=bb:sess94;scope=bb:sess95;scope=bb:sess96;scope=bb:sess97;scope=bb:sess98;scope=bb:sess99;default_uid=456;uid=0;uid=1;uid=2;uid=3;uid=4;uid=5;uid=6;uid=7;uid=8;uid=9;uid=10;uid=11;uid=12;uid=13;uid=14;uid=15;uid=16;uid=17;uid=18;uid=19;uid=20;uid=21;uid=22;uid=23;uid=24;uid=25;uid=26;uid=27;uid=28;uid=29;uid=30;uid=31;uid=32;uid=33;uid=34;uid=35;uid=36;uid=37;uid=38;uid=39;uid=40;uid=41;uid=42;uid=43;uid=44;uid=45;uid=46;uid=47;uid=48;uid=49;uid=50;uid=51;uid=52;uid=53;uid=54;uid=55;uid=56;uid=57;uid=58;uid=59;uid=60;uid=61;uid=62;uid=63;uid=64;uid=65;uid=66;uid=67;uid=68;uid=69;uid=70;uid=71;uid=72;uid=73;uid=74;uid=75;uid=76;uid=77;uid=78;uid=79;uid=80;uid=81;uid=82;uid=83;uid=84;uid=85;uid=86;uid=87;uid=88;uid=89;uid=90;uid=91;uid=92;uid=93;uid=94;uid=95;uid=96;uid=97;uid=98;uid=99;uid=100;uid=101;uid=102;uid=103;uid=104;uid=105;uid=106;uid=107;uid=108;uid=109;uid=110;uid=111;uid=112;uid=113;uid=114;uid=115;uid=116;uid=117;uid=118;uid=119;uid=120;uid=121;uid=122;uid=123;uid=124;uid=125;uid=126;uid=127;uid=128;uid=129;uid=130;uid=131;uid=132;uid=133;uid=134;uid=135;uid=136;uid=137;uid=138;uid=139;uid=140;uid=141;uid=142;uid=143;uid=144;uid=145;uid=146;uid=147;uid=148;uid=149;uid=150;uid=151;uid=152;uid=153;uid=154;uid=155;uid=156;uid=157;uid=158;uid=159;uid=160;uid=161;uid=162;uid=163;uid=164;uid=165;uid=166;uid=167;uid=168;uid=169;uid=170;uid=171;uid=172;uid=173;uid=174;uid=175;uid=176;uid=177;uid=178;uid=179;uid=180;uid=181;uid=182;uid=183;uid=184;uid=185;uid=186;uid=187;uid=188;uid=189;uid=190;uid=191;uid=192;uid=193;uid=194;uid=195;uid=196;uid=197;uid=198;uid=199;uid=200;uid=201;uid=202;uid=203;uid=204;uid=205;uid=206;uid=207;uid=208;uid=209;uid=210;uid=211;uid=212;uid=213;uid=214;uid=215;uid=216;uid=217;uid=218;uid=219;uid=220;uid=221;uid=222;uid=223;uid=224;uid=225;uid=226;uid=227;uid=228;uid=229;uid=230;uid=231;uid=232;uid=233;uid=234;uid=235;uid=236;uid=237;uid=238;uid=239;uid=240;uid=241;uid=242;uid=243;uid=244;uid=245;uid=246;uid=247;uid=248;uid=249;uid=250;uid=251;uid=252;uid=253;uid=254;uid=255;uid=256;uid=257;uid=258;uid=259;uid=260;uid=261;uid=262;uid=263;uid=264;uid=265;uid=266;uid=267;uid=268;uid=269;uid=270;uid=271;uid=272;uid=273;uid=274;uid=275;uid=276;uid=277;uid=278;uid=279;uid=280;uid=281;uid=282;uid=283;uid=284;uid=285;uid=286;uid=287;uid=288;uid=289;uid=290;uid=291;uid=292;uid=293;uid=294;uid=295;uid=296;uid=297;uid=298;uid=299;uid=300;uid=301;uid=302;uid=303;uid=304;uid=305;uid=306;uid=307;uid=308;uid=309;uid=310;uid=311;uid=312;uid=313;uid=314;uid=315;uid=316;uid=317;uid=318;uid=319;uid=320;uid=321;uid=322;uid=323;uid=324;uid=325;uid=326;uid=327;uid=328;uid=329;uid=330;uid=331;uid=332;uid=333;uid=334;uid=335;uid=336;uid=337;uid=338;uid=339;uid=340;uid=341;uid=342;uid=343;uid=344;uid=345;uid=346;uid=347;uid=348;uid=349;uid=350;uid=351;uid=352;uid=353;uid=354;uid=355;uid=356;uid=357;uid=358;uid=359;uid=360;uid=361;uid=362;uid=363;uid=364;uid=365;uid=366;uid=367;uid=368;uid=369;uid=370;uid=371;uid=372;uid=373;uid=374;uid=375;uid=376;uid=377;uid=378;uid=379;uid=380;uid=381;uid=382;uid=383;uid=384;uid=385;uid=386;uid=387;uid=388;uid=389;uid=390;uid=391;uid=392;uid=393;uid=394;uid=395;uid=396;uid=397;uid=398;uid=399;uid=400;uid=401;uid=402;uid=403;uid=404;uid=405;uid=406;uid=407;uid=408;uid=409;uid=410;uid=411;uid=412;uid=413;uid=414;uid=415;uid=416;uid=417;uid=418;uid=419;uid=420;uid=421;uid=422;uid=423;uid=424;uid=425;uid=426;uid=427;uid=428;uid=429;uid=430;uid=431;uid=432;uid=433;uid=434;uid=435;uid=436;uid=437;uid=438;uid=439;uid=440;uid=441;uid=442;uid=443;uid=444;uid=445;uid=446;uid=447;uid=448;uid=449;uid=450;uid=451;uid=452;uid=453;uid=454;uid=455;uid=456;uid=457;uid=458;uid=459;uid=460;uid=461;uid=462;uid=463;uid=464;uid=465;uid=466;uid=467;uid=468;uid=469;uid=470;uid=471;uid=472;uid=473;uid=474;uid=475;uid=476;uid=477;uid=478;uid=479;uid=480;uid=481;uid=482;uid=483;uid=484;uid=485;uid=486;uid=487;uid=488;uid=489;uid=490;uid=491;uid=492;uid=493;uid=494;uid=495;uid=496;uid=497;uid=498;uid=499;env=Test;", checkedTicket->DebugInfo()); - } - - Y_UNIT_TEST(TicketExceptionsTest) { - TUserContext::TImpl contextTest(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket1 = contextTest.Check(UNSUPPORTED_VERSION_USER_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::UnsupportedVersion, checkedTicket1->GetStatus()); - - auto checkedTicket2 = contextTest.Check(EXPIRED_USER_TICKET); - UNIT_ASSERT_EQUAL(ETicketStatus::Expired, checkedTicket2->GetStatus()); - - TUserContext::TImpl contextProd(EBlackboxEnv::Prod, NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket3 = contextProd.Check(VALID_USER_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::InvalidBlackboxEnv, checkedTicket3->GetStatus()); - - UNIT_ASSERT_EXCEPTION(checkedTicket3->GetDefaultUid(), TNotAllowedException); - UNIT_ASSERT_EXCEPTION(checkedTicket3->GetUids(), TNotAllowedException); - UNIT_ASSERT_EXCEPTION(checkedTicket3->GetScopes(), TNotAllowedException); - UNIT_ASSERT_EXCEPTION(checkedTicket3->HasScope(""), TNotAllowedException); - UNIT_ASSERT_NO_EXCEPTION(bool(*checkedTicket3)); - UNIT_ASSERT_NO_EXCEPTION(checkedTicket3->DebugInfo()); - UNIT_ASSERT_NO_EXCEPTION(checkedTicket3->GetStatus()); - } - - Y_UNIT_TEST(TicketProtoTest) { - ticket2::Ticket protobufTicket; - UNIT_ASSERT(protobufTicket.ParseFromString(NUtils::Base64url2bin(USER_TICKET_PROTOBUF))); - TTestUserTicketImpl userTicket(ETicketStatus::Ok, std::move(protobufTicket)); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, userTicket.GetStatus()); - UNIT_ASSERT_EQUAL(std::numeric_limits<time_t>::max(), userTicket.GetExpirationTime()); - UNIT_ASSERT_EQUAL(TUids({456, 123}), userTicket.GetUids()); - UNIT_ASSERT_EQUAL(456, userTicket.GetDefaultUid()); - UNIT_ASSERT_EQUAL(TScopes({"bb:sess1", "bb:sess2"}), userTicket.GetScopes()); - UNIT_ASSERT(userTicket.HasScope("bb:sess1")); - UNIT_ASSERT(userTicket.HasScope("bb:sess2")); - UNIT_ASSERT(!userTicket.HasScope("bb:sess3")); - } - - Y_UNIT_TEST(ResetKeysTest) { - TUserContext::TImpl context(EBlackboxEnv::Test, NUnittest::TVMKNIFE_PUBLIC_KEYS); - context.ResetKeys(NUnittest::TVMKNIFE_PUBLIC_KEYS); - auto checkedTicket = context.Check(VALID_USER_TICKET_1); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, checkedTicket->GetStatus()); - } - - Y_UNIT_TEST(CreateTicketForTests) { - TCheckedUserTicket t = NTvmAuth::NUnittest::CreateUserTicket(ETicketStatus::Ok, 42, {"qwerty", "omg"}, {43, 55, 47}); - UNIT_ASSERT_EQUAL(ETicketStatus::Ok, t.GetStatus()); - UNIT_ASSERT_EQUAL(42, t.GetDefaultUid()); - UNIT_ASSERT_EQUAL(TUids({42, 43, 47, 55}), t.GetUids()); - UNIT_ASSERT_EQUAL(TScopes({"omg", "qwerty"}), t.GetScopes()); - UNIT_ASSERT_VALUES_EQUAL("ticket_type=user;scope=omg;scope=qwerty;default_uid=42;uid=42;uid=43;uid=47;uid=55;env=Test;", t.DebugInfo()); - } - - Y_UNIT_TEST(CreateForTests) { - TUids uids{456}; - TScopes scopes{"scope1", "scope2", "scope3"}; - TScopes scopesIn{"scope1", "scope2", "scope3", "scope1", ""}; - auto t = TCheckedUserTicket::TImpl::CreateTicketForTests(ETicketStatus::Ok, 456, scopesIn, {}); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, t->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(456, t->GetDefaultUid()); - UNIT_ASSERT_VALUES_EQUAL(uids, t->GetUids()); - UNIT_ASSERT_VALUES_EQUAL(scopes, t->GetScopes()); - - t = TCheckedUserTicket::TImpl::CreateTicketForTests(ETicketStatus::Ok, 456, scopesIn, {123, 456, 789}); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, t->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(456, t->GetDefaultUid()); - uids = TUids{123, 456, 789}; - UNIT_ASSERT_VALUES_EQUAL(uids, t->GetUids()); - UNIT_ASSERT_VALUES_EQUAL(scopes, t->GetScopes()); - - t = TCheckedUserTicket::TImpl::CreateTicketForTests(ETicketStatus::Ok, 456, scopesIn, {123, 789}); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, t->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(456, t->GetDefaultUid()); - uids = TUids{123, 456, 789}; - UNIT_ASSERT_VALUES_EQUAL(uids, t->GetUids()); - UNIT_ASSERT_VALUES_EQUAL(scopes, t->GetScopes()); - - t = TCheckedUserTicket::TImpl::CreateTicketForTests(ETicketStatus::Ok, 0, scopesIn, {123, 789}); - UNIT_ASSERT_VALUES_EQUAL(ETicketStatus::Ok, t->GetStatus()); - UNIT_ASSERT_VALUES_EQUAL(0, t->GetDefaultUid()); - uids = TUids{123, 789}; - UNIT_ASSERT_VALUES_EQUAL(uids, t->GetUids()); - UNIT_ASSERT_VALUES_EQUAL(scopes, t->GetScopes()); - - UNIT_ASSERT_EXCEPTION_CONTAINS(TCheckedUserTicket::TImpl::CreateTicketForTests(ETicketStatus::Ok, 0, scopesIn, {}), - yexception, - "User ticket cannot contain empty uid list"); - UNIT_ASSERT_EXCEPTION_CONTAINS(TCheckedUserTicket::TImpl::CreateTicketForTests(ETicketStatus::Ok, 0, scopesIn, {0}), - yexception, - "User ticket cannot contain empty uid list"); - } -} - -template <> -void Out<NTvmAuth::TUids>(IOutputStream& o, const NTvmAuth::TUids& v) { - for (const auto& uid : v) { - o << uid << ","; - } -} - -template <> -void Out<NTvmAuth::TScopes>(IOutputStream& o, const NTvmAuth::TScopes& v) { - for (const auto& scope : v) { - o << scope << ","; - } -} diff --git a/library/cpp/tvmauth/src/ut/utils_ut.cpp b/library/cpp/tvmauth/src/ut/utils_ut.cpp deleted file mode 100644 index c9cb81c36fa..00000000000 --- a/library/cpp/tvmauth/src/ut/utils_ut.cpp +++ /dev/null @@ -1,95 +0,0 @@ -#include <library/cpp/tvmauth/src/utils.h> - -#include <library/cpp/testing/unittest/registar.h> - -#include <util/generic/maybe.h> - -Y_UNIT_TEST_SUITE(UtilsTestSuite) { - static const TString VALID_SERVICE_TICKET_1 = "3:serv:CBAQ__________9_IhkI5QEQHBoIYmI6c2VzczEaCGJiOnNlc3My:WUPx1cTf05fjD1exB35T5j2DCHWH1YaLJon_a4rN-D7JfXHK1Ai4wM4uSfboHD9xmGQH7extqtlEk1tCTCGm5qbRVloJwWzCZBXo3zKX6i1oBYP_89WcjCNPVe1e8jwGdLsnu6PpxL5cn0xCksiStILH5UmDR6xfkJdnmMG94o8"; - static const TString EXPIRED_SERVICE_TICKET = "3:serv:CBAQACIZCOUBEBwaCGJiOnNlc3MxGghiYjpzZXNzMg:IwfMNJYEqStY_SixwqJnyHOMCPR7-3HHk4uylB2oVRkthtezq-OOA7QizDvx7VABLs_iTlXuD1r5IjufNei_EiV145eaa3HIg4xCdJXCojMexf2UYJz8mF2b0YzFAy6_KWagU7xo13CyKAqzJuQf5MJcSUf0ecY9hVh36cJ51aw"; - using namespace NTvmAuth; - - Y_UNIT_TEST(base64Test) { - UNIT_ASSERT_VALUES_EQUAL("-hHx", NUtils::Bin2base64url("\xfa\x11\xf1")); - UNIT_ASSERT_VALUES_EQUAL("-hHx_g", NUtils::Bin2base64url("\xfa\x11\xf1\xfe")); - UNIT_ASSERT_VALUES_EQUAL("-hHx_v8", NUtils::Bin2base64url("\xfa\x11\xf1\xfe\xff")); - - UNIT_ASSERT_VALUES_EQUAL("", NUtils::Base64url2bin("hHx++")); - UNIT_ASSERT_VALUES_EQUAL("", NUtils::Base64url2bin("&*^")); - UNIT_ASSERT_VALUES_EQUAL("", NUtils::Base64url2bin("")); - UNIT_ASSERT_VALUES_EQUAL("", NUtils::Bin2base64url("")); - - UNIT_ASSERT_VALUES_EQUAL("\xfa\x11\xf1", NUtils::Base64url2bin("-hHx")); - UNIT_ASSERT_VALUES_EQUAL("\xfa\x11\xf1\xfe", NUtils::Base64url2bin("-hHx_g")); - UNIT_ASSERT_VALUES_EQUAL("\xfa\x11\xf1\xfe", NUtils::Base64url2bin("-hHx_g=")); - UNIT_ASSERT_VALUES_EQUAL("\xfa\x11\xf1\xfe", NUtils::Base64url2bin("-hHx_g==")); - UNIT_ASSERT_VALUES_EQUAL("\xfa\x11\xf1\xfe\xff", NUtils::Base64url2bin("-hHx_v8")); - UNIT_ASSERT_VALUES_EQUAL("\xfa\x11\xf1\xfe\xff", NUtils::Base64url2bin("-hHx_v8=")); - - UNIT_ASSERT_VALUES_EQUAL("SGVsbG8sIGV2ZXJ5Ym9keSE", - NUtils::Bin2base64url(("Hello, everybody!"))); - UNIT_ASSERT_VALUES_EQUAL("Hello, everybody!", - NUtils::Base64url2bin(("SGVsbG8sIGV2ZXJ5Ym9keSE"))); - UNIT_ASSERT_VALUES_EQUAL("VGhlIE1hZ2ljIFdvcmRzIGFyZSBTcXVlYW1pc2ggT3NzaWZyYWdl", - NUtils::Bin2base64url(("The Magic Words are Squeamish Ossifrage"))); - UNIT_ASSERT_VALUES_EQUAL("The Magic Words are Squeamish Ossifrage", - NUtils::Base64url2bin(("VGhlIE1hZ2ljIFdvcmRzIGFyZSBTcXVlYW1pc2ggT3NzaWZyYWdl"))); - } - - Y_UNIT_TEST(sign) { - UNIT_ASSERT_VALUES_EQUAL("wkGfeuopf709ozPAeGcDMqtZXPzsWvuNJ1BL586dSug", - NUtils::SignCgiParamsForTvm(NUtils::Base64url2bin("GRMJrKnj4fOVnvOqe-WyD1"), - "1490000000", - "13,19", - "bb:sess,bb:sess2")); - - UNIT_ASSERT_VALUES_EQUAL("HANDYrA4ApQMQ5cfSWZk_InHWJffoXAa57P_X_B5s4M", - NUtils::SignCgiParamsForTvm(NUtils::Base64url2bin("GRMJrKnj4fOasvOqe-WyD1"), - "1490000000", - "13,19", - "bb:sess,bb:sess2")); - - UNIT_ASSERT_VALUES_EQUAL("T-M-3_qtjRM1dR_3hS1CRlHBTZRKK04doHXBJw-5VRk", - NUtils::SignCgiParamsForTvm(NUtils::Base64url2bin("GRMJrKnj4fOasvOqe-WyD1"), - "1490000001", - "13,19", - "bb:sess,bb:sess2")); - - UNIT_ASSERT_VALUES_EQUAL("gwB6M_9Jij50ZADmlDMnoyLc6AhQmtq6MClgGzO1PBE", - NUtils::SignCgiParamsForTvm(NUtils::Base64url2bin("GRMJrKnj4fOasvOqe-WyD1"), - "1490000001", - "13,19", - "")); - } - - Y_UNIT_TEST(GetExpirationTime) { - UNIT_ASSERT(!NTvmAuth::NInternal::TCanningKnife::GetExpirationTime("3:aadasdasdasdas")); - - UNIT_ASSERT(NTvmAuth::NInternal::TCanningKnife::GetExpirationTime(VALID_SERVICE_TICKET_1)); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(std::numeric_limits<time_t>::max()), - *NTvmAuth::NInternal::TCanningKnife::GetExpirationTime(VALID_SERVICE_TICKET_1)); - - UNIT_ASSERT(NTvmAuth::NInternal::TCanningKnife::GetExpirationTime(EXPIRED_SERVICE_TICKET)); - UNIT_ASSERT_VALUES_EQUAL(TInstant::Seconds(0), - *NTvmAuth::NInternal::TCanningKnife::GetExpirationTime(EXPIRED_SERVICE_TICKET)); - } - - Y_UNIT_TEST(RemoveSignatureTest) { - UNIT_ASSERT_VALUES_EQUAL("1:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds", - NUtils::RemoveTicketSignature("1:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("2:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds", - NUtils::RemoveTicketSignature("2:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("4:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds", - NUtils::RemoveTicketSignature("4:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("3.serv.ASDkljbjhsdbfLJHABFJHBslfbsfjs.asdxcvbxcvniueliuweklsvds", - NUtils::RemoveTicketSignature("3.serv.ASDkljbjhsdbfLJHABFJHBslfbsfjs.asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("3:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:", - NUtils::RemoveTicketSignature("3:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("3:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:", - NUtils::RemoveTicketSignature("3:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs:asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("3:serv:", - NUtils::RemoveTicketSignature("3:serv:ASDkljbjhsdbfLJHABFJHBslfbsfjs.asdxcvbxcvniueliuweklsvds")); - UNIT_ASSERT_VALUES_EQUAL("asdxcbvfgdsgfasdfxczvdsgfxcdvbcbvf", - NUtils::RemoveTicketSignature("asdxcbvfgdsgfasdfxczvdsgfxcdvbcbvf")); - } -} diff --git a/library/cpp/tvmauth/src/ut/version_ut.cpp b/library/cpp/tvmauth/src/ut/version_ut.cpp deleted file mode 100644 index eeb95d1cde7..00000000000 --- a/library/cpp/tvmauth/src/ut/version_ut.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include <library/cpp/tvmauth/version.h> - -#include <library/cpp/testing/unittest/registar.h> - -#include <regex> - -using namespace NTvmAuth; - -Y_UNIT_TEST_SUITE(VersionTest) { - Y_UNIT_TEST(base64Test) { - const std::regex re(R"(^\d+\.\d+\.\d+$)"); - - for (size_t idx = 0; idx < 2; ++idx) { - TStringBuf ver = LibVersion(); - UNIT_ASSERT(std::regex_match(ver.begin(), ver.end(), re)); - } - } -} diff --git a/library/cpp/tvmauth/src/utils.cpp b/library/cpp/tvmauth/src/utils.cpp deleted file mode 100644 index f56fafd97b3..00000000000 --- a/library/cpp/tvmauth/src/utils.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include "utils.h" - -#include "parser.h" - -#include <openssl/evp.h> -#include <openssl/hmac.h> -#include <openssl/md5.h> -#include <openssl/sha.h> - -#include <util/generic/maybe.h> -#include <util/generic/strbuf.h> - -#include <array> - -namespace { - constexpr const unsigned char b64_encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; - - constexpr std::array<unsigned char, 256> B64Init() { - std::array<unsigned char, 256> buf{}; - for (auto& i : buf) - i = 0xff; - - for (int i = 0; i < 64; ++i) - buf[b64_encode[i]] = i; - - return buf; - } - constexpr std::array<unsigned char, 256> b64_decode = B64Init(); -} - -namespace NTvmAuth::NUtils { - TString Bin2base64url(TStringBuf buf) { - if (!buf) { - return TString(); - } - - TString res; - res.resize(((buf.size() + 2) / 3) << 2, 0); - - const unsigned char* pB = (const unsigned char*)buf.data(); - const unsigned char* pE = (const unsigned char*)buf.data() + buf.size(); - unsigned char* p = (unsigned char*)res.data(); - for (; pB + 2 < pE; pB += 3) { - const unsigned char a = *pB; - *p++ = b64_encode[(a >> 2) & 0x3F]; - const unsigned char b = *(pB + 1); - *p++ = b64_encode[((a & 0x3) << 4) | ((b & 0xF0) >> 4)]; - const unsigned char c = *(pB + 2); - *p++ = b64_encode[((b & 0xF) << 2) | ((c & 0xC0) >> 6)]; - *p++ = b64_encode[c & 0x3F]; - } - - if (pB < pE) { - const unsigned char a = *pB; - *p++ = b64_encode[(a >> 2) & 0x3F]; - - if (pB == (pE - 1)) { - *p++ = b64_encode[((a & 0x3) << 4)]; - } else { - const unsigned char b = *(pB + 1); - *p++ = b64_encode[((a & 0x3) << 4) | - ((int)(b & 0xF0) >> 4)]; - *p++ = b64_encode[((b & 0xF) << 2)]; - } - } - - res.resize(p - (unsigned char*)res.data()); - return res; - } - - TString Base64url2bin(TStringBuf buf) { - const unsigned char* bufin = (const unsigned char*)buf.data(); - if (!buf || b64_decode[*bufin] > 63) { - return TString(); - } - const unsigned char* bufend = (const unsigned char*)buf.data() + buf.size(); - while (++bufin < bufend && b64_decode[*bufin] < 64) - ; - int nprbytes = (bufin - (const unsigned char*)buf.data()); - int nbytesdecoded = ((nprbytes + 3) / 4) * 3; - - if (nprbytes < static_cast<int>(buf.size())) { - int left = buf.size() - nprbytes; - while (left--) { - if (*(bufin++) != '=') - return TString(); - } - } - - TString res; - res.resize(nbytesdecoded); - - unsigned char* bufout = (unsigned char*)res.data(); - bufin = (const unsigned char*)buf.data(); - - while (nprbytes > 4) { - unsigned char a = b64_decode[*bufin]; - unsigned char b = b64_decode[bufin[1]]; - *(bufout++) = (unsigned char)(a << 2 | b >> 4); - unsigned char c = b64_decode[bufin[2]]; - *(bufout++) = (unsigned char)(b << 4 | c >> 2); - unsigned char d = b64_decode[bufin[3]]; - *(bufout++) = (unsigned char)(c << 6 | d); - bufin += 4; - nprbytes -= 4; - } - - if (nprbytes == 1) { - return {}; // Impossible - } - if (nprbytes > 1) { - *(bufout++) = (unsigned char)(b64_decode[*bufin] << 2 | b64_decode[bufin[1]] >> 4); - } - if (nprbytes > 2) { - *(bufout++) = (unsigned char)(b64_decode[bufin[1]] << 4 | b64_decode[bufin[2]] >> 2); - } - if (nprbytes > 3) { - *(bufout++) = (unsigned char)(b64_decode[bufin[2]] << 6 | b64_decode[bufin[3]]); - } - - int diff = (4 - nprbytes) & 3; - if (diff) { - nbytesdecoded -= (4 - nprbytes) & 3; - res.resize(nbytesdecoded); - } - - return res; - } - - TString SignCgiParamsForTvm(TStringBuf secret, TStringBuf ts, TStringBuf dstTvmId, TStringBuf scopes) { - TString data; - data.reserve(ts.size() + dstTvmId.size() + scopes.size() + 3); - const char DELIM = '|'; - data.append(ts).push_back(DELIM); - data.append(dstTvmId).push_back(DELIM); - data.append(scopes).push_back(DELIM); - - TString value(EVP_MAX_MD_SIZE, 0); - unsigned macLen = 0; - - if (!::HMAC(EVP_sha256(), secret.data(), secret.size(), (unsigned char*)data.data(), data.size(), - (unsigned char*)value.data(), &macLen)) - { - return {}; - } - - if (macLen != EVP_MAX_MD_SIZE) { - value.resize(macLen); - } - return Bin2base64url(value); - } -} - -namespace NTvmAuth::NInternal { - TMaybe<TInstant> TCanningKnife::GetExpirationTime(TStringBuf ticket) { - const TParserTickets::TRes res = TParserTickets::ParseV3(ticket, {}, TParserTickets::ServiceFlag()); - - return res.Status == ETicketStatus::MissingKey || res.Status == ETicketStatus::Expired - ? TInstant::Seconds(res.Ticket.expirationtime()) - : TMaybe<TInstant>(); - } -} diff --git a/library/cpp/tvmauth/src/utils.h b/library/cpp/tvmauth/src/utils.h deleted file mode 100644 index e5847ac89f5..00000000000 --- a/library/cpp/tvmauth/src/utils.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include <library/cpp/tvmauth/checked_service_ticket.h> -#include <library/cpp/tvmauth/checked_user_ticket.h> -#include <library/cpp/tvmauth/ticket_status.h> - -#include <util/datetime/base.h> -#include <util/generic/fwd.h> - -namespace NTvmAuth::NUtils { - TString Bin2base64url(TStringBuf buf); - TString Base64url2bin(TStringBuf buf); - - TString SignCgiParamsForTvm(TStringBuf secret, TStringBuf ts, TStringBuf dstTvmId, TStringBuf scopes); -} - -namespace NTvmAuth::NInternal { - class TCanningKnife { - public: - static TCheckedServiceTicket::TImpl* GetS(TCheckedServiceTicket& t) { - return t.Impl_.Release(); - } - - static TCheckedUserTicket::TImpl* GetU(TCheckedUserTicket& t) { - return t.Impl_.Release(); - } - - static TMaybe<TInstant> GetExpirationTime(TStringBuf ticket); - }; -} diff --git a/library/cpp/tvmauth/src/version b/library/cpp/tvmauth/src/version deleted file mode 100644 index 4f5e69734c9..00000000000 --- a/library/cpp/tvmauth/src/version +++ /dev/null @@ -1 +0,0 @@ -3.4.5 diff --git a/library/cpp/tvmauth/src/version.cpp b/library/cpp/tvmauth/src/version.cpp deleted file mode 100644 index 6b389213d0a..00000000000 --- a/library/cpp/tvmauth/src/version.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include <library/cpp/resource/resource.h> - -#include <util/string/strip.h> - -namespace { - class TBuiltinVersion { - public: - TBuiltinVersion() { - Version_ = NResource::Find("/builtin/version"); - StripInPlace(Version_); - } - - TStringBuf Get() const { - return Version_; - } - - private: - TString Version_; - }; -} - -namespace NTvmAuth { - TStringBuf LibVersion() { - return Singleton<TBuiltinVersion>()->Get(); - } -} diff --git a/library/cpp/tvmauth/ticket_status.h b/library/cpp/tvmauth/ticket_status.h deleted file mode 100644 index 532d4de56e4..00000000000 --- a/library/cpp/tvmauth/ticket_status.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include <util/generic/strbuf.h> - -namespace NTvmAuth { - /*! - * Status mean result of ticket check - */ - enum class ETicketStatus { - Ok, - Expired, - InvalidBlackboxEnv, - InvalidDst, - InvalidTicketType, - Malformed, - MissingKey, - SignBroken, - UnsupportedVersion, - NoRoles, - }; - - TStringBuf StatusToString(ETicketStatus st); -} diff --git a/library/cpp/tvmauth/type.h b/library/cpp/tvmauth/type.h deleted file mode 100644 index 7f4ce2b7005..00000000000 --- a/library/cpp/tvmauth/type.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include <library/cpp/containers/stack_vector/stack_vec.h> - -namespace NTvmAuth { - using TScopes = TSmallVec<TStringBuf>; - using TTvmId = ui32; - using TUid = ui64; - using TUids = TSmallVec<TUid>; - using TAlias = TString; -} diff --git a/library/cpp/tvmauth/unittest.h b/library/cpp/tvmauth/unittest.h deleted file mode 100644 index efa651befa8..00000000000 --- a/library/cpp/tvmauth/unittest.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "checked_service_ticket.h" -#include "checked_user_ticket.h" - -#include <util/generic/maybe.h> - -namespace NTvmAuth::NUnittest { - static const TString TVMKNIFE_PUBLIC_KEYS = "1:CpgCCpMCCAEQABqIAjCCAQQCggEAcLEXeH67FQESFUn4_7wnX7wN0PUrBoUsm3QQ4W5vC-qz6sXaEjSwnTV8w1o-z6X9KPLlhzMQvuS38NCNfK4uvJ4Zvfp3YsXJ25-rYtbnrYJHNvHohD-kPCCw_yZpMp21JdWigzQGuV7CtrxUhF-NNrsnUaJrE5-OpEWNt4X6nCItKIYeVcSK6XJUbEWbrNCRbvkSc4ak2ymFeMuHYJVjxh4eQbk7_ZPzodP0WvF6eUYrYeb42imVEOR8ofVLQWE5DVnb1z_TqZm4i1XkS7jMwZuBxBRw8DGdYei0lT_sAf7KST2jC0590NySB3vsBgWEVs1OdUUWA6r-Dvx9dsOQtSCVkQYQAAqZAgqUAggCEAAaiQIwggEFAoIBAQDhEBM5-6YsPWfogKtbluJoCX1WV2KdzOaQ0-OlRbBzeCzw-eQKu12c8WakHBbeCMd1I1TU64SDkDorWjXGIa_2xT6N3zzNAE50roTbPCcmeQrps26woTYfYIuqDdoxYKZNr0lvNLLW47vBr7EKqo1S4KSj7aXK_XYeEvUgIgf3nVIcNrio7VTnFmGGVQCepaL1Hi1gN4yIXjVZ06PBPZ-DxSRu6xOGbFrfKMJeMPs7KOyE-26Q3xOXdTIa1X-zYIucTd_bxUCL4BVbwW2AvbbFsaG7ISmVdGu0XUTmhXs1KrEfUVLRJhE4Dx99hAZXm1_HlYMUeJcMQ_oHOhV94ENFIJaRBhACCpYBCpEBCAMQABqGATCBgwKBgF9t2YJGAJkRRFq6fWhi3m1TFW1UOE0f6ZrfYhHAkpqGlKlh0QVfeTNPpeJhi75xXzCe6oReRUm-0DbqDNhTShC7uGUv1INYnRBQWH6E-5Fc5XrbDFSuGQw2EYjNfHy_HefHJXxQKAqPvxBDKMKkHgV58WtM6rC8jRi9sdX_ig2NIJeRBhABCpYBCpEBCAQQABqGATCBgwKBgGB4d6eLGUBv-Q6EPLehC4S-yuE2HB-_rJ7WkeYwyp-xIPolPrd-PQme2utHB4ZgpXHIu_OFksDe_0bPgZniNRSVRbl7W49DgS5Ya3kMfrYB4DnF5Fta5tn1oV6EwxYD4JONpFTenOJALPGTPawxXEfon_peiHOSBuQMu3_Vn-l1IJiRBhADCpcBCpIBCAUQABqHATCBhAKBgQCTJMKIfmfeZpaI7Q9rnsc29gdWawK7TnpVKRHws1iY7EUlYROeVcMdAwEqVM6f8BVCKLGgzQ7Gar_uuxfUGKwqEQzoppDraw4F75J464-7D5f6_oJQuGIBHZxqbMONtLjBCXRUhQW5szBLmTQ_R3qaJb5vf-h0APZfkYhq1cTttSCZkQYQBAqWAQqRAQgLEAAahgEwgYMCgYBvvGVH_M2H8qxxv94yaDYUTWbRnJ1uiIYc59KIQlfFimMPhSS7x2tqUa2-hI55JiII0Xym6GNkwLhyc1xtWChpVuIdSnbvttbrt4weDMLHqTwNOF6qAsVKGKT1Yh8yf-qb-DSmicgvFc74mBQm_6gAY1iQsf33YX8578ClhKBWHSCVkQYQAAqXAQqSAQgMEAAahwEwgYQCgYEAkuzFcd5TJu7lYWYe2hQLFfUWIIj91BvQQLa_Thln4YtGCO8gG1KJqJm-YlmJOWQG0B7H_5RVhxUxV9KpmFnsDVkzUFKOsCBaYGXc12xPVioawUlAwp5qp3QQtZyx_se97YIoLzuLr46UkLcLnkIrp-Jo46QzYi_QHq45WTm8MQ0glpEGEAIKlwEKkgEIDRAAGocBMIGEAoGBAIUzbxOknXf_rNt17_ir8JlWvrtnCWsQd1MAnl5mgArvavDtKeBYHzi5_Ak7DHlLzuA6YE8W175FxLFKpN2hkz-l-M7ltUSd8N1BvJRhK4t6WffWfC_1wPyoAbeSN2Yb1jygtZJQ8wGoXHcJQUXiMit3eFNyylwsJFj1gzAR4JCdIJeRBhABCpYBCpEBCA4QABqGATCBgwKBgFMcbEpl9ukVR6AO_R6sMyiU11I8b8MBSUCEC15iKsrVO8v_m47_TRRjWPYtQ9eZ7o1ocNJHaGUU7qqInFqtFaVnIceP6NmCsXhjs3MLrWPS8IRAy4Zf4FKmGOx3N9O2vemjUygZ9vUiSkULdVrecinRaT8JQ5RG4bUMY04XGIwFIJiRBhADCpYBCpEBCA8QABqGATCBgwKBgGpCkW-NR3li8GlRvqpq2YZGSIgm_PTyDI2Zwfw69grsBmPpVFW48Vw7xoMN35zcrojEpialB_uQzlpLYOvsMl634CRIuj-n1QE3-gaZTTTE8mg-AR4mcxnTKThPnRQpbuOlYAnriwiasWiQEMbGjq_HmWioYYxFo9USlklQn4-9IJmRBhAEEpUBCpIBCAYQABqHATCBhAKBgQCoZkFGm9oLTqjeXZAq6j5S6i7K20V0lNdBBLqfmFBIRuTkYxhs4vUYnWjZrKRAd5bp6_py0csmFmpl_5Yh0b-2pdo_E5PNP7LGRzKyKSiFddyykKKzVOazH8YYldDAfE8Z5HoS9e48an5JsPg0jr-TPu34DnJq3yv2a6dqiKL9zSCakQYSlQEKkgEIEBAAGocBMIGEAoGBALhrihbf3EpjDQS2sCQHazoFgN0nBbE9eesnnFTfzQELXb2gnJU9enmV_aDqaHKjgtLIPpCgn40lHrn5k6mvH5OdedyI6cCzE-N-GFp3nAq0NDJyMe0fhtIRD__CbT0ulcvkeow65ubXWfw6dBC2gR_34rdMe_L_TGRLMWjDULbNIJqRBg"; - - TCheckedServiceTicket CreateServiceTicket(ETicketStatus status, - TTvmId src, - TMaybe<TUid> issuerUid = TMaybe<TUid>()); - - TCheckedUserTicket CreateUserTicket(ETicketStatus status, - TUid defaultUid, - const TScopes& scopes, - const TUids& uids = TUids(), - EBlackboxEnv env = EBlackboxEnv::Test); -} diff --git a/library/cpp/tvmauth/utils.cpp b/library/cpp/tvmauth/utils.cpp deleted file mode 100644 index a06cd6f5ba7..00000000000 --- a/library/cpp/tvmauth/utils.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "utils.h" - -namespace NTvmAuth::NUtils { - TStringBuf RemoveTicketSignature(TStringBuf ticketBody) { - if (ticketBody.size() < 2 || - ticketBody[0] != '3' || - ticketBody[1] != ':') { - return ticketBody; - } - - size_t pos = ticketBody.rfind(':'); - if (pos == TStringBuf::npos) { // impossible - return ticketBody; - } - - return ticketBody.substr(0, pos + 1); - } -} diff --git a/library/cpp/tvmauth/utils.h b/library/cpp/tvmauth/utils.h deleted file mode 100644 index ad8950cab58..00000000000 --- a/library/cpp/tvmauth/utils.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include <util/generic/strbuf.h> - -namespace NTvmAuth::NUtils { - /*! - * Remove signature from ticket string - rest part can be parsed later with `tvmknife parse_ticket ...` - * @param ticketBody Raw ticket body - * @return safe for logging part of ticket - */ - TStringBuf RemoveTicketSignature(TStringBuf ticketBody); -} diff --git a/library/cpp/tvmauth/version.h b/library/cpp/tvmauth/version.h deleted file mode 100644 index 48ec2798294..00000000000 --- a/library/cpp/tvmauth/version.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include <util/generic/strbuf.h> - -namespace NTvmAuth { - TStringBuf LibVersion(); -} diff --git a/library/cpp/type_info/test-data/bad-types.txt b/library/cpp/type_info/test-data/bad-types.txt deleted file mode 100644 index c8f3120f63a..00000000000 --- a/library/cpp/type_info/test-data/bad-types.txt +++ /dev/null @@ -1,229 +0,0 @@ -# -# The format of this file is described in README.txt -# -# Each test case contains 3 fields: -# - Yson representation (that cannot be parsed to type). -# - Expected error description. -# - Path in yson that we expect to see in error. -# -# Suggested approach to writing test: -# 1. Try to deserialize type from yson (1st field). -# 2. Ensure that error is raised. -# 3. (Optionally) ensure that error description matches (contains) 2nd field. -# 4. (Optionally) ensure that error description contains path from 3rd field - -5 :: type must be either a string or a map :: ;; - -"" :: unknown type "" :: ;; - -"int" :: unknown type "int" :: ;; - -# Type names must be in lowercase. -"Int32" :: unknown type "Int32" :: ;; - -{typename=int32} :: missing required key "type_name" :: ;; - -{type_name=5} :: "type_name" must contain a string :: ;; - -# -# Decimal -# - -{ - type_name=decimal; - precision=3; -} :: missing required key "scale" :: ;; - -{ - type_name=decimal; - scale=3; -} :: missing required key "precision" :: ;; - -# -# Optional -# - -{ - type_name=optional; -} :: missing required key "item" :: ;; - -{ - item=int32; -} :: missing required key "type_name" :: ;; - -# -# List -# - -{ - type_name=list; -} :: missing required key "item" :: ;; - -# -# Struct -# - -{ - type_name=struct; -} :: missing required key "members" :: ;; - -{ - type_name=struct; - members=5; -} :: "members" must contain a list :: ;; - -{ - type_name=struct; - members=[ - {name=foo; type=int32;}; - 5; - ]; -} :: "members" must contain a list of maps :: ;; - -{ - type_name=struct; - members=[ - {type=int32;}; - ]; -} :: missing required key "name" :: ;; - -{ - type_name=struct; - members=[ - {name=foo;}; - ]; -} :: missing required key "type" :: ;; - -{ - type_name=struct; - members=[ - {name=foo; type=int32}; - {name=bar; type=5}; - ]; -} :: type must be either a string or a map :: /members/1/type ;; - -{ - type_name=struct; - members=[ - {name=4; type=int32}; - ]; -} :: "name" must contain a string :: ;; - -{ - type_name=struct; - elements=[ - {name=4; type=int32}; - ]; -} :: missing required key "members" :: ;; - -# -# Tuple -# - -{ - type_name=tuple; -} :: missing required key "elements" :: ;; - -{ - type_name=tuple; - elements=5; -} :: "elements" must contain a list :: ;; - -{ - type_name=tuple; - elements=[ - {type=int32;}; - 5; - ]; -} :: "elements" must contain a list of maps :: ;; - -{ - type_name=tuple; - elements=[ - {}; - ]; -} :: missing required key "type" :: /elements/0 ;; - -{ - type_name=tuple; - elements=[ - {type=5}; - ]; -} :: type must be either a string or a map :: /elements/1/type ;; - -{ - type_name=tuple; - members=[ - {name=foo; type=int32}; - ]; -} :: missing required key "elements" :: ;; - -# -# Variant -# - -# We don't specify exception message here because in C++ library that message is not good and we don't want to canonize it -# Though fixing it is not that easy too. -{ - type_name=variant; - members=[ - {name=foo; type=int32}; - ]; - elements=[ - {type=int8}; - ] -} :: :: ;; - -{ - type_name=variant; -} :: missing both keys "members" and "elements" :: ;; - -# -# Dict -# -{ - type_name=dict; - key=string; -} :: missing required key "value" :: ;; - -{ - type_name=dict; - value=string; -} :: missing required key "key" :: ;; - -{ - type_name=dict; - value=string; -} :: missing required key "key" :: ;; - -{ - type_name=dict; - key=5; - value=string; -} :: type must be either a string or a map :: /key ;; - -{ - type_name=dict; - key=string; - value=5; -} :: type must be either a string or a map :: /value ;; - -# -# Tagged -# - -{ - type_name=tagged; - item=string; -} :: missing required key "tag" :: ;; - -{ - type_name=tagged; - tag=string; -} :: missing required key "item" :: ;; - -{ - type_name=tagged; - tag=5; - item=string; -} :: "tag" must contain a string :: /tag ;; diff --git a/library/cpp/type_info/test-data/good-types.txt b/library/cpp/type_info/test-data/good-types.txt deleted file mode 100644 index cb082707b6e..00000000000 --- a/library/cpp/type_info/test-data/good-types.txt +++ /dev/null @@ -1,478 +0,0 @@ -# -# The format of this file is described in README.txt -# -# Each test case contains 2 fields: -# - Yson reporesentation of the type. -# - String representation of the type. -# -# Suggested approach to writing test: -# 1. Try to deserialize type from yson (1st field). -# 2. Check that text representation of parsed type matches 2nd field. -# 3. Serialize type to yson and deserialize it from it. -# 4. Check that typef from 1. and 3. are equal. - -# Integer -int8 :: Int8 ;; -int16 :: Int16 ;; -int32 :: Int32 ;; -int64 :: Int64 ;; -{type_name=int8} :: Int8 ;; -{type_name=int16} :: Int16 ;; -{type_name=int32} :: Int32 ;; -{type_name=int64} :: Int64 ;; - -# Unsigned integer -uint8 :: Uint8 ;; -uint16 :: Uint16 ;; -uint32 :: Uint32 ;; -uint64 :: Uint64 ;; -{type_name=uint8} :: Uint8 ;; -{type_name=uint16} :: Uint16 ;; -{type_name=uint32} :: Uint32 ;; -{type_name=uint64} :: Uint64 ;; - -# Floating -float :: Float ;; -double :: Double ;; -{type_name=float} :: Float ;; -{type_name=double} :: Double ;; - -# Strings -string :: String ;; -utf8 :: Utf8 ;; -{type_name=string} :: String ;; -{type_name=utf8} :: Utf8 ;; - -# Time -date :: Date ;; -datetime :: Datetime ;; -timestamp :: Timestamp ;; -tz_date :: TzDate ;; -tz_datetime :: TzDatetime ;; -tz_timestamp :: TzTimestamp ;; -interval :: Interval ;; -{type_name=date} :: Date ;; -{type_name=datetime} :: Datetime ;; -{type_name=timestamp} :: Timestamp ;; -{type_name=tz_date} :: TzDate ;; -{type_name=tz_datetime} :: TzDatetime ;; -{type_name=tz_timestamp} :: TzTimestamp ;; -{type_name=interval} :: Interval ;; - -# Singular -void :: Void ;; -null :: Null ;; -{type_name=void} :: Void ;; -{type_name=null} :: Null ;; - -# UUID -uuid :: Uuid ;; -{type_name=uuid} :: Uuid ;; - -# Json / Yson -yson :: Yson ;; -json :: Json ;; -{type_name=yson} :: Yson ;; -{type_name=json} :: Json ;; - -{ - type_name=string; - unknown_key=bar; -} :: String ;; - -# Decimal -{ - type_name=decimal; - precision=3; - scale=2; -} :: Decimal(3, 2) ;; - -{ - type_name=decimal; - precision=3; - scale=2; - unknown_column=ha; -} :: Decimal(3, 2) ;; - -# -# Optional -# -{ - type_name=optional; - item=string; -} :: Optional<String> ;; - -{ - type_name=optional; - item={ - type_name=string; - } -} :: Optional<String> ;; - -{ - type_name=optional; - item={ - type_name=optional; - item={ - type_name=list; - item={ - type_name=decimal; - precision=10; - scale=5; - } - - } - } -} :: Optional<Optional<List<Decimal(10, 5)>>> ;; - -{ - type_name=optional; - item={ - type_name=tagged; - item=int32; - tag="foo"; - }; -} :: Optional<Tagged<Int32, 'foo'>> ;; - -{ - type_name=optional; - item={ - type_name=string; - }; - unknown_column=ha; -} :: Optional<String> ;; - -# -# List -# -{ - type_name=list; - item=string; -} :: List<String> ;; - -{ - type_name=list; - item={ - type_name=string; - } -} :: List<String> ;; - -{ - type_name=list; - item={ - type_name=list; - item={ - type_name=optional; - item=string; - } - }; -} :: List<List<Optional<String>>> ;; - -{ - type_name=list; - item={ - type_name=tagged; - item=int32; - tag="foo"; - }; -} :: List<Tagged<Int32, 'foo'>> ;; - -{ - type_name=list; - item={ - type_name=string; - }; - unknown_column=ha; -} :: List<String> ;; - -# -# Dict -# - -{ - type_name=dict; - key=int32; - value=string; -} :: Dict<Int32, String> ;; - -{ - type_name=dict; - key={ - type_name=optional; - item=string; - }; - value={ - type_name=list; - item={ - type_name=int32; - } - }; -} :: Dict<Optional<String>, List<Int32>> ;; - -{ - type_name=dict; - key={ - type_name=tagged; - item=int32; - tag="foo"; - }; - value={ - type_name=tagged; - item=string; - tag="bar"; - }; -} :: Dict<Tagged<Int32, 'foo'>, Tagged<String, 'bar'>> ;; - -{ - type_name=dict; - key=int32; - value=string; - unknown_column=ha; -} :: Dict<Int32, String> ;; - -# -# Struct -# - -{ - type_name=struct; - members=[]; -} :: Struct<> ;; - -{ - type_name=struct; - members=[ - { - name=foo; - type=int32; - }; - { - name=bar; - type={ - type_name=optional; - item=string; - }; - }; - ]; -} :: Struct<'foo': Int32, 'bar': Optional<String>> ;; - -{ - type_name=struct; - members=[ - { - name=foo; - type={ - type_name=tagged; - item=string; - tag=foo; - }; - }; - ]; -} :: Struct<'foo': Tagged<String, 'foo'>> ;; - -{ - type_name=struct; - unknown_column=ha; - members=[ - { - unknown_column=ha; - name=foo; - type=int32; - }; - { - name=bar; - type={ - type_name=optional; - item=string; - }; - }; - ]; -} :: Struct<'foo': Int32, 'bar': Optional<String>> ;; - -# -# Tuple -# - -{ - type_name=tuple; - elements=[]; -} :: Tuple<> ;; - -{ - type_name=tuple; - elements=[ - { - type=int32; - }; - { - type={ - type_name=optional; - item=string; - }; - }; - ]; -} :: Tuple<Int32, Optional<String>> ;; - -{ - type_name=tuple; - elements=[ - { - type={ - type_name=tagged; - item=string; - tag=foo; - }; - }; - ]; -} :: Tuple<Tagged<String, 'foo'>> ;; - -{ - type_name=tuple; - unknown_column=ha; - elements=[ - { - type=int32; - unknown_column=ha; - }; - { - type={ - type_name=optional; - item=string; - }; - }; - ]; -} :: Tuple<Int32, Optional<String>> ;; - -# -# Variant -# - -{ - type_name=variant; - elements=[ - { - type=int32; - }; - { - type={type_name=string}; - }; - ]; -} :: Variant<Int32, String> ;; - -{ - type_name=variant; - members=[ - { - name=foo; - type=int32; - }; - { - name=bar; - type={ - type_name=optional; - item=string; - }; - }; - ]; -} :: Variant<'foo': Int32, 'bar': Optional<String>> ;; - -{ - type_name=variant; - elements=[ - { - type={ - type_name=tagged; - item=string; - tag=foo; - } - }; - ]; -} :: Variant<Tagged<String, 'foo'>> ;; - -{ - type_name=variant; - members=[ - { - name=bar; - type={ - type_name=tagged; - item=string; - tag=foo; - }; - }; - ]; -} :: Variant<'bar': Tagged<String, 'foo'>> ;; - -{ - type_name=variant; - unknown_column=ha; - elements=[ - { - type=int32; - unknown_column=ha; - }; - { - type={ - type_name=string; - unknown_column=ha; - }; - unknown_column=ha; - }; - ]; -} :: Variant<Int32, String> ;; - -{ - type_name=variant; - unknown_column=ha; - members=[ - { - unknown_column=ha; - name=foo; - type=int32; - }; - { - name=bar; - type={ - type_name=optional; - unknown_column=ha; - item=string; - }; - }; - ]; -} :: Variant<'foo': Int32, 'bar': Optional<String>> ;; - -# -# Tagged -# - -{ - type_name=tagged; - item=string; - tag="image/png" -} :: Tagged<String, 'image/png'> ;; - -{ - type_name=tagged; - item={ - type_name=optional; - item=string; - }; - tag="image/png" -} :: Tagged<Optional<String>, 'image/png'> ;; - -{ - type_name=tagged; - item={ - type_name=tagged; - item=string; - tag=foo; - }; - tag=bar; -} :: Tagged<Tagged<String, 'foo'>, 'bar'> ;; - -{ - type_name=tagged; - item=string; - unknown_column=ha; - tag="image/png" -} :: Tagged<String, 'image/png'> ;; diff --git a/library/cpp/unicode/folding/fold.cpp b/library/cpp/unicode/folding/fold.cpp deleted file mode 100644 index 47a42a80b2e..00000000000 --- a/library/cpp/unicode/folding/fold.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "fold.h" - -namespace NUF { - TNormalizer::TNormalizer(ELanguage lmain, ELanguage laux) - : DoRenyxa() - , DoLowerCase() - , DoSimpleCyr() - , FillOffsets() - { - Reset(); - SetLanguages(lmain, laux); - } - - TNormalizer::TNormalizer(const TLanguages& langs) - : DoRenyxa() - , DoLowerCase() - , DoSimpleCyr() - , FillOffsets() - { - Reset(); - SetLanguages(langs); - } - - void TNormalizer::SetLanguages(ELanguage lmain, ELanguage laux) { - Languages.reset(); - Scripts.reset(); - Languages.set(lmain); - Languages.set(laux); - Scripts.set(ScriptByLanguage(lmain)); - Scripts.set(ScriptByLanguage(laux)); - } - - void TNormalizer::SetLanguages(const TLanguages& langs) { - Languages = langs; - Scripts.reset(); - - for (ui32 i = 0; i < langs.size(); ++i) { - if (langs.test(i)) - Scripts.set(ScriptByLanguage(ELanguage(i))); - } - } - - void TNormalizer::SetDoRenyxa(bool da) { - DoRenyxa = da; - } - - void TNormalizer::SetDoLowerCase(bool da) { - DoLowerCase = da; - } - - void TNormalizer::SetDoSimpleCyr(bool da) { - DoSimpleCyr = da; - } - - void TNormalizer::SetFillOffsets(bool da) { - FillOffsets = da; - } - - void TNormalizer::Reset() { - CDBuf.clear(); - OutBuf.clear(); - CDOffsets.clear(); - TmpBuf.clear(); - p = p0 = pe = eof = ts = te = ret = nullptr; - cs = act = 0; - } - - void TNormalizer::SetInput(TWtringBuf b) { - Reset(); - CDBuf.reserve(2 * b.size()); - OutBuf.reserve(2 * b.size()); - - Decomposer.Normalize(b.data(), b.size(), CDBuf); - p = p0 = CDBuf.begin(); - pe = eof = CDBuf.end(); - } - -} diff --git a/library/cpp/unicode/folding/fold.h b/library/cpp/unicode/folding/fold.h deleted file mode 100644 index 516c9962c04..00000000000 --- a/library/cpp/unicode/folding/fold.h +++ /dev/null @@ -1,141 +0,0 @@ -#pragma once - -#include <library/cpp/unicode/normalization/normalization.h> -#include <library/cpp/langs/langs.h> -#include <util/generic/strbuf.h> -#include <util/generic/vector.h> - -#include <bitset> - -namespace NUF { - using TLanguages = std::bitset<LANG_MAX>; - using TScripts = std::bitset<SCRIPT_MAX>; - - /* language-sensitive - * insignificant diacritics are removed - * significant diacritics are either left in place or turned into diftongs (i.e. umlauts in german) - * ligatures and special symbols are decomposed - * all control and space characters are made spaces and duplicates are collapsed - * all dash characters are made dashes - * all invisible characters (shy, zwspaces) are removed - * all other characters are left intact - * designed to be more robust and aggressive than lemmer normalization - * MAY CONTAIN INCORRECT DATA OR DISCONTAIN SOME IMPORTANT DATA! - * - * TODO: make a tool to generate rules automatically on ICU and lemmer data - * - * @maintainer: velavokr - */ - - using TOffsets = TVector<size_t>; - class TNormalizer { - TLanguages Languages; - TScripts Scripts; - - TVector<wchar16> CDBuf; - TVector<wchar16> OutBuf; - TVector<wchar16> TmpBuf; - TOffsets CDOffsets; - - NUnicode::TNormalizer<NUnicode::NFD> Decomposer; - NUnicode::TNormalizer<NUnicode::NFC> Recomposer; - - const wchar16* p; - const wchar16* p0; - const wchar16* pe; - const wchar16* eof; - const wchar16* ts; - const wchar16* te; - const wchar16* ret; - int cs; - int act; - - bool DoRenyxa; - bool DoLowerCase; - bool DoSimpleCyr; - bool FillOffsets; - - public: - TNormalizer(ELanguage lmain = LANG_UNK, ELanguage laux = LANG_UNK); - TNormalizer(const TLanguages& langs); - - void SetDoRenyxa(bool); - void SetDoLowerCase(bool); - void SetDoSimpleCyr(bool); - void SetFillOffsets(bool); - void SetLanguages(ELanguage lmain, ELanguage laux = LANG_UNK); - void SetLanguages(const TLanguages& langs); - - void Reset(); - void SetInput(TWtringBuf b); - - TWtringBuf GetOutput() const { - return TWtringBuf(OutBuf.data(), OutBuf.size()); - } - - TWtringBuf GetCanonDenormalizedInput() const { - return TWtringBuf(CDBuf.data(), CDBuf.size()); - } - - const TOffsets& GetOffsetsInCanonDenormalizedInput() const { - return CDOffsets; - } - - void DoNormalize(); - - protected: - static const ui64 ZERO_WIDTH = - (ULL(1) << (Cf_FORMAT)) | (ULL(1) << (Cf_JOIN)) | (ULL(1) << (Cf_BIDI)) | (ULL(1) << (Cf_ZWNBSP)) | (ULL(1) << (Zs_ZWSPACE)) | (ULL(1) << (Mc_SPACING)) | (ULL(1) << (Mn_NONSPACING)) | (ULL(1) << (Me_ENCLOSING)); - - static const ui64 SPACE = - (ULL(1) << (Cc_SPACE)) | (ULL(1) << (Zs_SPACE)) | (ULL(1) << (Zl_LINE)) | (ULL(1) << (Zp_PARAGRAPH)) | (ULL(1) << (Cc_ASCII)) | (ULL(1) << (Cc_SEPARATOR)) | (ULL(1) << (Cn_UNASSIGNED)) | (ULL(1) << (Co_PRIVATE)); - - bool Is(ELanguage lang) const { - return Languages.test(lang); - } - bool Is(EScript scr) const { - return Scripts.test(scr); - } - - bool IsSpace() const { - return NUnicode::CharHasType(*p, SPACE); - } - bool IsNothing() const { - return NUnicode::CharHasType(*p, ZERO_WIDTH) || wchar16(0xAD) /*shy*/ == *p; - } - bool IsDash() const { - return ::IsDash(*p); - } - - void Emit(wchar16 c, size_t off = 0) { - OutBuf.push_back(c); - if (FillOffsets) - CDOffsets.push_back(ts - p0 + off); - } - - void EmitUpper(wchar16 c, size_t off = 0) { - if (DoLowerCase) - Emit(ToLower(c), off); - else - Emit(c, off); - } - - void EmitRenyxa(wchar16 c, size_t off = 0) { - if (DoRenyxa) - EmitUpper(c, off); - else - EmitUpper(*ts, off); - } - - void EmitSimpleCyr(wchar16 c, size_t off = 0) { - if (DoSimpleCyr) - EmitUpper(c, off); - else - EmitUpper(*ts, off); - } - - wchar16 Last() const { - return OutBuf.empty() ? 0 : OutBuf.back(); - } - }; -} diff --git a/library/cpp/unicode/folding/fold_impl.rl6 b/library/cpp/unicode/folding/fold_impl.rl6 deleted file mode 100644 index 5f62e1c01d5..00000000000 --- a/library/cpp/unicode/folding/fold_impl.rl6 +++ /dev/null @@ -1,635 +0,0 @@ -#if defined(__GNUC__) -# pragma GCC diagnostic ignored "-Wsign-compare" -#endif - -#include <library/cpp/unicode/folding/fold.h> - -namespace NUF { - -void TNormalizer::DoNormalize() { -#if 0 -%%{ -machine Normalizer; -alphtype unsigned short; - -action H { Hold(); } -action R { Ret(); } - -dia = 0x300 .. 0x36F; - -main := |* - -############################ -## cyr -> lat renyxization -############################ - -## і -0x456 { EmitRenyxa('i'); }; -0x406 { EmitRenyxa('I'); }; - -## ј -0x458 { EmitRenyxa('j'); }; -0x408 { EmitRenyxa('J'); }; - -## с -0x441 { EmitRenyxa('c'); }; -0x421 { EmitRenyxa('C'); }; - -## - -############################ -## cyr simplification -############################ - -## ә -> а -0x4D9 { EmitSimpleCyr(0x430); }; -0x4D8 { EmitSimpleCyr(0x410); }; - -## Һ -> х -0x4BB { EmitSimpleCyr(0x445); }; -0x4BA { EmitSimpleCyr(0x425); }; - -## Ԧ -> Һ / х -0x0527 { - if (DoSimpleCyr) - EmitSimpleCyr(0x445); - else - Emit(0x04bb); -}; - -0x0526 { - if (DoSimpleCyr) - EmitSimpleCyr(0x420); - else - EmitUpper(0x04ba); -}; - -## є -> е -0x454 { EmitSimpleCyr(0x435); }; -0x404 { EmitSimpleCyr(0x415); }; - -## э -> е -0x44d { - if (Is(LANG_BEL)) - Emit(0x435); - else - Emit(0x44d); -}; -0x42d { - if (Is(LANG_BEL)) - EmitUpper(0x415); - else - EmitUpper(0x42d); -}; - -## ун -> вн -0x443 dia* 0x43d { - if (Is(LANG_BEL) || Is(LANG_UKR)) - Emit(0x432); - else - Emit(0x443); - - Emit(0x43d, te - ts - 1); -}; -0x423 dia* 0x43d { - if (Is(LANG_BEL) || Is(LANG_UKR)) - EmitUpper(0x412); - else - EmitUpper(0x423); - - Emit(0x43d, te - ts - 1); -}; - -## сьн -> сн -(0x441 | 'c') 0x44c 0x43d { - if (DoRenyxa) - Emit('c'); - else - Emit(0x441); - if (!Is(LANG_BEL)) - Emit(0x44c); - Emit(0x43d, te - ts - 1); -}; -(0x421 | 'C') 0x44c 0x43d { - if (DoRenyxa) - EmitUpper('C'); - else - EmitUpper(0x421); - if (!Is(LANG_BEL)) - Emit(0x44c); - Emit(0x43d, te - ts - 1); -}; - -############################ -## cyr diacritic fix -############################ - -## ҿ, ҽ -> е -0x04bf | 0x04bd { Emit(0x435); }; -0x04be | 0x04bc { EmitUpper(0x415); }; - -## ґ, ғ, ҕ, ӷ, ӻ -> г -0x491 | 0x493 | 0x0495 | 0x04f7 | 0x04fb { Emit(0x433); }; -0x490 | 0x492 | 0x0494 | 0x04f6 | 0x04fa { EmitUpper(0x413); }; - -## җ -> ж -0x497 { Emit(0x436); }; -0x496 { EmitUpper(0x416); }; - -## ҙ -> з -0x0499 { Emit(0x0437); }; -0x0498 { Emit(0x0417); }; - -## ӣ, й, ӥ, ҋ, ї -> й -0x438 (0x304 | 0x306 | 0x308) | 0x456 0x308 | 0x048b { Emit(0x439); }; -0x418 (0x304 | 0x306 | 0x308) | 0x406 0x308 | 0x048a { EmitUpper(0x419); }; - -## қ, ҝ, ҟ, ҡ, ӄ, ԟ -> к -0x49B | 0x049d | 0x049f | 0x04a1 | 0x04c4 | 0x051f { Emit(0x43A); }; -0x49A | 0x049c | 0x049e | 0x04a0 | 0x04c3 | 0x051e { EmitUpper(0x41A); }; - -## ӆ, ԓ, ԡ -> л -0x04c6 | 0x0513 | 0x0521 { Emit(0x043b); }; -0x04c5 | 0x0512 | 0x0520 { EmitUpper(0x041b); }; - -## ӎ -> м -0x04ce { Emit(0x043c); }; -0x04cd { EmitUpper(0x041c); }; - -## ң, ӈ, ӊ, ԣ -> н -0x4A3 | 0x04c8 | 0x04ca | 0x0523 { Emit(0x43D); }; -0x4A2 | 0x04c7 | 0x04c9 | 0x0522 { EmitUpper(0x41D); }; - -## ө -> о -0x4E9 { Emit(0x43E); }; -0x4E8 { EmitUpper(0x41E); }; - -## ҧ, ԥ -> п -0x04a7 | 0x0525 { Emit(0x043f); }; -0x04a6 | 0x0524 { EmitUpper(0x041f); }; - -## ҏ -0x048f { Emit(0x0440); }; -0x048e { EmitUpper(0x0420); }; - -## ҫ -0x04ab { Emit(0x0441); }; -0x04aa { EmitUpper(0x0421); }; - -## ҭ -0x04ad { Emit(0x0442); }; -0x04ac { EmitUpper(0x0422); }; - -## ұ, ү -> у -0x4B1 | 0x4AF { Emit(0x443); }; -0x4B0 | 0x4AE { EmitUpper(0x423); }; - -## ҳ, ӽ, ӿ -> х -0x04b3 | 0x04fd | 0x04ff { Emit(0x0445); }; -0x04b2 | 0x04fc | 0x04fe { EmitUpper(0x0425); }; - -## ҷ, ҹ, ӌ -> ч -0x04b7 | 0x04b9 | 0x04cc { Emit(0x0447); }; -0x04b6 | 0x04b8 | 0x04cb { EmitUpper(0x0427); }; - -## ҍ -> ь -0x048d { Emit(0x044c); }; -0x048c { EmitUpper(0x042c); }; - -############################ -## lat diacritic fix -############################ - -## Ⱥ, ɑ -0x0251 { Emit('a'); }; -0x023a { EmitUpper('A'); }; - -## ƀ, ƃ, ɓ -0x0180 | 0x183 | 0x0253 { Emit('b'); }; -0x0181 | 0x182 | 0x0243 { EmitUpper('B'); }; - -## ƈ, ȼ, ɕ -0x188 | 0x023c | 0x0255 { Emit('c'); }; -0x187 | 0x023b { EmitUpper('C'); }; - -## ð, đ, ƌ, Ɖ, Ɗ, ȡ, ɖ, ɗ -0x00f0 | 0x0111 | 0x18c | 0x221 | 0x256 | 0x257 { Emit('d'); }; -0x00d0 | 0x0110 | 0x189 | 0x18a | 0x18b { EmitUpper('D'); }; - -## ɛ, ɇ, ə, ɚ -0x0259 | 0x025a | 0x25b | 0x0247 { Emit('e'); }; -0x0190 | 0x0246 { EmitUpper('E'); }; - -## ƒ -0x192 { Emit('f'); }; -0x191 { EmitUpper('F'); }; - -## ǥ, ɠ -0x01e5 | 0x0260 | 0x0261 { Emit('g'); }; -0x01e4 | 0x0193 { EmitUpper('G'); }; - -## ħ, ɦ, ꜧ, ɧ -0x0127 | 0x0266 | 0x0267 | 0xa727 { Emit('h'); }; -0x0126 { EmitUpper('H'); }; - -## ɨ -0x0268 { Emit('i'); }; -0x0197 { EmitUpper('I'); }; - -## ɉ, ȷ -0x0249 | 0x0237 | 0x025f | 0x0284 | 0x029d { Emit('j'); }; -0x0248 { EmitUpper('J'); }; - -## ƙ -0x199 { Emit('k'); }; -0x198 { EmitUpper('K'); }; - -## ł, ƚ, ɫ, ɬ, ɭ, ȴ -0x0142 | 0x019a | 0x234 | 0x026b | 0x026c | 0x026d { Emit('l'); }; -0x0141 | 0x023d { EmitUpper('L'); }; - -## ɱ -0x0271 { Emit('m'); }; - -## ƞ, ȵ, ɲ, ɳ -0x019e | 0x0220 | 0x0272 | 0x0273 { Emit('n'); }; -0x019d | 0x0235 { EmitUpper('N'); }; - -## ɵ -0x0275 { Emit('o'); }; -0x019f { EmitUpper('O'); }; - -## ƥ -0x01a5 { Emit('p'); }; -0x01a4 { EmitUpper('P'); }; - -## ɋ, ʠ -0x024b | 0x02a0 { Emit('q'); }; - -## ɍ, ɼ, ɽ, ɾ -0x024d | 0x027c | 0x027d | 0x027e { Emit('r'); }; -0x024c { EmitUpper('R'); }; - -## ȿ, ʂ, ʆ, ʃ -0x023f | 0x0282 | 0x0283 | 0x0286 { Emit('s'); }; - -## ŧ, ƫ, ƭ, ȶ, ʈ, Ⱦ -0x0167 | 0x01ab | 0x01ad | 0x0236 | 0x0288 { Emit('t'); }; -0x0166 | 0x01ac | 0x01ae | 0x023e { EmitUpper('T'); }; - -## ʉ -0x0289 { Emit('u'); }; -0x0244 { EmitUpper('U'); }; - -## ʋ -0x028b { Emit('v'); }; -0x01b2 { EmitUpper('V'); }; - -## ƴ, ɏ -0x01b4 | 0x024f { Emit('y'); }; -0x01b3 | 0x024e { EmitUpper('Y'); }; - -## ƶ, ɀ, ʐ, ʓ, ʒ -0x01ba | 0x01b6 | 0x225 | 0x0240 | 0x0290 | 0x0291 | 0x0292 | 0x0293 { Emit('z'); }; -0x01b5 | 0x224 { EmitUpper('Z'); }; - -## İ -'I' 0x307 { - if (DoRenyxa) { - EmitUpper('I'); - } else if (Is(LANG_TUR)) { - if (DoLowerCase) - Emit(0x131); - else - Emit(0x130); - } else { - EmitUpper('I'); - } -}; - -## ı -0x131 { - if (Is(LANG_TUR)) - EmitRenyxa('i'); - else - Emit('i'); -}; - -## ø -0xf8 { - Emit('o'); - if (Is(LANG_NOR)) - Emit('e', 1); -}; - -0xd8 { - EmitUpper('O'); - if (Is(LANG_NOR)) - Emit('e', 1); -}; - -## å -'a' 0x30A { - Emit('a'); - if (Is(LANG_DAN) || Is(LANG_NOR)) - Emit('a', 1); -}; - -'A' 0x30A { - EmitUpper('A'); - if (Is(LANG_DAN) || Is(LANG_NOR)) - Emit('a', 1); -}; - -## ä -'a' 0x308 { - Emit('a'); - if (Is(LANG_GER) || Is(LANG_HUN) || Is(LANG_NOR)) - Emit('e', 1); -}; - -'A' 0x308 { - EmitUpper('A'); - if (Is(LANG_GER) || Is(LANG_HUN) || Is(LANG_NOR)) - Emit('e', 1); -}; - -## ö -'o' 0x308 { - Emit('o'); - if (Is(LANG_GER) || Is(LANG_HUN) || Is(LANG_NOR)) - Emit('e', 1); -}; - -'O' 0x308 { - EmitUpper('O'); - if (Is(LANG_GER) || Is(LANG_HUN) || Is(LANG_NOR)) - Emit('e', 1); -}; - -## ü -'u' 0x308 { - Emit('u'); - if (Is(LANG_GER) || Is(LANG_HUN) || Is(LANG_NOR)) - Emit('e', 1); -}; - -'U' 0x308 { - EmitUpper('U'); - if (Is(LANG_GER) || Is(LANG_HUN) || Is(LANG_NOR)) - Emit('e', 1); -}; - -############################ -## cyr ligature fix -############################ - -## ӕ -0x4D5 { Emit(0x430); Emit(0x435); }; -0x4D4 { EmitUpper(0x410); EmitUpper(0x415); }; - -## ԕ -0x0515 { Emit(0x043b); Emit(0x0445); }; -0x0514 { EmitUpper(0x041b); EmitUpper(0x0425); }; - -## љ -0x0459 { Emit(0x043b); Emit(0x044c); }; -0x0409 { EmitUpper(0x041b); EmitUpper(0x042c); }; - -## ҥ -0x04a5 { Emit(0x043d); Emit(0x0433); }; -0x04a4 { EmitUpper(0x041d); EmitUpper(0x0413); }; - -## њ -0x045a { Emit(0x043d); Emit(0x044c); }; -0x040a { EmitUpper(0x041d); EmitUpper(0x042c); }; - -## ԗ -0x0517 { Emit(0x0440); Emit(0x0445); }; -0x0516 { EmitUpper(0x0420); EmitUpper(0x0425); }; - -## ҵ -0x04b5 { Emit(0x0442); Emit(0x0446); }; -0x04b4 { EmitUpper(0x0422); EmitUpper(0x0426); }; - -## ԙ -0x0519 { Emit(0x044f); Emit(0x0435); }; -0x0518 { EmitUpper(0x042f); EmitUpper(0x0415); }; - -## ѹ -0x0478 { EmitUpper(0x41e); Emit(0x443); }; -0x0479 { Emit(0x43e); Emit(0x443); }; - -############################ -## lat ligature fix -############################ - -## ꜳ -0xa733 { Emit('a'); Emit('a'); }; -0xa732 { EmitUpper('A'); EmitUpper('A'); }; - -## æ -0xe6 { Emit('a'); Emit('e'); }; -0xc6 { EmitUpper('A'); EmitUpper('E'); }; - -## ꜵ -0xa735 { Emit('a'); Emit('o'); }; -0xa734 { EmitUpper('A'); EmitUpper('O'); }; - -## ꜷ -0xa737 { Emit('a'); Emit('u'); }; -0xa736 { EmitUpper('A'); EmitUpper('U'); }; - -## ꜹ, ꜻ -0xa739 | 0xa73b { Emit('a'); Emit('v'); }; -0xa738 | 0xa73a { EmitUpper('A'); EmitUpper('V'); }; - -## ꜽ -0xa73d { Emit('a'); Emit('y'); }; -0xa73c { EmitUpper('A'); EmitUpper('Y'); }; - -## ȸ -0x238 { Emit('d'); Emit('b'); }; - -## dz, dž, ʤ, ʥ -0x1F1 | 0x1C4 { EmitUpper('D'); EmitUpper('Z'); }; -0x1F2 | 0x1C5 { EmitUpper('D'); Emit('z'); }; -0x1F3 | 0x1C6 | 0x02a4 | 0x2a5 { Emit('d'); Emit('z'); }; - -## ff -0xfb00 { Emit('f'); Emit('f'); }; - -## fi -0xfb01 { Emit('f'); Emit('i'); }; - -## fl -0xfb02 { Emit('f'); Emit('l'); }; - -## ʩ -0x02a9 { Emit('f'); Emit('n'); Emit('g'); }; - -## ƕ -0x0195 { Emit('h'); Emit('v'); }; - -## ij -0x133 { Emit('i'); Emit('j'); }; -0x132 { Emit('I'); Emit('J'); }; - -## lj -0x1C7 { EmitUpper('L'); EmitUpper('J'); }; -0x1C8 { EmitUpper('L'); Emit('j'); }; -0x1C9 { Emit('l'); Emit('j'); }; - -## ʪ -0x02aa { Emit('l'); Emit('s'); }; - -## ʫ, ɮ -0x02ab | 0x026e { Emit('l'); Emit('z'); }; - -## nj -0x1CA { EmitUpper('N'); EmitUpper('J'); }; -0x1CB { EmitUpper('N'); Emit('j'); }; -0x1CC { Emit('n'); Emit('j'); }; - -## ŋ -0x14b { Emit('n'); Emit('g'); }; -0x14a { EmitUpper('N'); EmitUpper('G'); }; - -## œ -0x153 { Emit('o'); Emit('e'); }; -0x152 { EmitUpper('O'); EmitUpper('E'); }; - -## ƣ -0x1a3 { Emit('o'); Emit('i'); }; -0x1a2 { EmitUpper('O'); EmitUpper('I'); }; - -## ꝏ -0xa74f { Emit('o'); Emit('o'); }; -0xa74e { EmitUpper('O'); EmitUpper('O'); }; - -## ȹ -0x239 { Emit('q'); Emit('p'); }; - -## ß -0xdf { Emit('s'); Emit('s'); }; -0x1e9e { EmitUpper('S'); EmitUpper('S'); }; - -## st -0xfb06 { Emit('s'); Emit('t'); }; - -## ʦ, ʧ -0x02a6 | 0x02a7 { Emit('t'); Emit('s'); }; - -## ᵫ -0x1d6b { Emit('u'); Emit('e'); }; - -## ffi -0xfb03 { Emit('f'); Emit('f'); Emit('i'); }; - -## ffl -0xfb04 { Emit('f'); Emit('f'); Emit('l'); }; - -## ʨ -0x2a8 { Emit('t'); Emit('c'); }; - -## ᵺ -0x1d7a { Emit('t'); Emit('h'); }; - -############################ -## other symbols -############################ -# todo: check which letters need disambiguating accents and rewrite this - -## w -'w' { - if (Is(LANG_SWE)) - Emit('v'); - else - Emit('w'); -}; - -'W' { - if (Is(LANG_SWE)) - EmitUpper('V'); - else - EmitUpper('W'); -}; - -## disambiguating acute accent -## 0x301 { -## // if (Is(LANG_DAN) || Is(LANG_NOR) || Is(LANG_SPA) || Is(LANG_GRE)) -## // Emit(0x301); -## }; - -## disambiguating grave accent -## 0x300 { -## // if (Is(LANG_FRE) || Is(LANG_ITA) || Is(LANG_NOR) || Is(LANG_RUM) || Is(LANG_CAT)) -## // Emit(0x300); -## }; - -## disambiguating circumflex accent -## 0x302 { -## // if (Is(LANG_NOR)) -## // Emit(0x302); -## }; - -## single quotes and apostrophes -0x2b9 | 0x2bb | 0x2bc | 0x2c8 | 0x55A | 0x2018 | 0x2019 | 0x201b | 0x2032 | '`' { - Emit('\''); -}; - -## slashes ⁄ ∕ -0x2044 | 0x2215 { - Emit('/'); -}; - -## left chevrons -0xab | 0x226a | 0x300a { - Emit('<'); Emit('<'); -}; - -## right chevrons -0xbb | 0x226b | 0x300b { - Emit('>'); Emit('>'); -}; - -## left angles -0x3c | 0x2039 | 0x2329 | 0x27e8 | 0x3008 { - Emit('<'); -}; - -## right angles -0x3e | 0x203a | 0x232a | 0x27e9 | 0x3009 { - Emit('>'); -}; - -## other symbols -any { - if(IsNothing()) { - // nothing - } else if (IsSpace()) { - if (' ' != Last()) - Emit(' '); - } else if (IsDash()) { - Emit('-'); - } else { - EmitUpper(*ts); - } -}; - -*|; - -}%% -#endif - -%% write data noerror nofinal; -%% write init; -%% write exec; - -Y_UNUSED(Normalizer_en_main); - TmpBuf.swap(OutBuf); - OutBuf.clear(); - Recomposer.Normalize(TmpBuf.data(), TmpBuf.size(), OutBuf); -} - -} diff --git a/library/cpp/unistat/idl/stats.proto b/library/cpp/unistat/idl/stats.proto deleted file mode 100644 index 10a63ec8a2a..00000000000 --- a/library/cpp/unistat/idl/stats.proto +++ /dev/null @@ -1,19 +0,0 @@ -message TInstanceStats { - message THistogram { - message TBucket { - required double Boundary = 1; - required uint64 Weight = 2; - } - repeated TBucket Bucket = 1; - } - - message TMetric { - required string Name = 1; - oneof value { - double Number = 2; - THistogram Hgram = 3; - } - } - - repeated TMetric Metric = 1; -} diff --git a/library/cpp/unistat/raii.cpp b/library/cpp/unistat/raii.cpp deleted file mode 100644 index c06a2e05c72..00000000000 --- a/library/cpp/unistat/raii.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "raii.h" diff --git a/library/cpp/unistat/raii.h b/library/cpp/unistat/raii.h deleted file mode 100644 index f8f46745fe2..00000000000 --- a/library/cpp/unistat/raii.h +++ /dev/null @@ -1,120 +0,0 @@ -#pragma once - -#include "unistat.h" - -#include <util/datetime/base.h> -#include <util/generic/noncopyable.h> -#include <util/generic/va_args.h> -#include <util/generic/yexception.h> -#include <util/system/defaults.h> - -class TUnistatTimer: public TNonCopyable { -public: - template <typename T> - TUnistatTimer(TUnistat& unistat, T&& holename) - : Started_(Now()) - , HoleName_(ToString(holename)) - , Aggregator_(unistat) - { - } - - ~TUnistatTimer() { - if (!Dismiss_) { - Aggregator_.PushSignalUnsafe(HoleName_, (Now() - Started_).MillisecondsFloat()); - } - } - - void Dismiss() noexcept { - Dismiss_ = true; - } - - void Accept() noexcept { - Dismiss_ = false; - } - -private: - bool Dismiss_{false}; - const TInstant Started_; - const TString HoleName_; - TUnistat& Aggregator_; -}; - -class TUnistatExceptionCounter: public TNonCopyable { -public: - template <typename T, typename U> - TUnistatExceptionCounter(TUnistat& unistat, T&& hasExceptionHolename, U&& noExceptionHolename) - : HasExceptionHoleName_(ToString(hasExceptionHolename)) - , NoExceptionHoleName_(ToString(noExceptionHolename)) - , Aggregator_(unistat) - { - } - - template <typename T> - TUnistatExceptionCounter(TUnistat& unistat, T&& hasExceptionHolename) - : HasExceptionHoleName_(ToString(hasExceptionHolename)) - , Aggregator_(unistat) - { - } - - ~TUnistatExceptionCounter() { - if (!Dismiss_) { - if (UncaughtException()) { - Aggregator_.PushSignalUnsafe(HasExceptionHoleName_, 1.); - } else if (NoExceptionHoleName_) { - Aggregator_.PushSignalUnsafe(NoExceptionHoleName_, 1.); - } - } - } - - void Dismiss() noexcept { - Dismiss_ = true; - } - - void Accept() noexcept { - Dismiss_ = false; - } - -private: - bool Dismiss_{false}; - const TString HasExceptionHoleName_; - const TString NoExceptionHoleName_; - TUnistat& Aggregator_; -}; - -/** - * @def Y_UNISTAT_TIMER - * - * Macro is needed to time scope and push time into aggregator. - * - * @code - * void DoSomethingImportant() { - * Y_UNISTAT_TIMER(TUnistat::Instance(), "doing-important-stuff") - * // doing something here - * } - * @endcode - */ -#define Y_UNISTAT_TIMER(unistat, holeName) \ - ::TUnistatTimer Y_GENERATE_UNIQUE_ID(timer){unistat, holeName}; - -#define Y_UNISTAT_EXCEPTION_COUNTER_IMPL_2(unistat, hasExceptionHoleName) \ - ::TUnistatExceptionCounter Y_GENERATE_UNIQUE_ID(exceptionCounter){unistat, hasExceptionHoleName}; - -#define Y_UNISTAT_EXCEPTION_COUNTER_IMPL_3(unistat, hasExceptionHolename, noExceptionHolename) \ - ::TUnistatExceptionCounter Y_GENERATE_UNIQUE_ID(exceptionCounter){unistat, hasExceptionHolename, noExceptionHolename}; - -#define Y_UNISTAT_EXCEPTION_COUNTER_IMPL_DISPATCHER(_1, _2, _3, NAME, ...) NAME - -/** - * @def Y_UNISTAT_EXCEPTION_COUNTER - * - * Macro is needed to check if there was an exception on scope exit or not. - * - * @code - * void DoSomethingThatMayThrowException() { - * Y_UNISTAT_EXCEPTION_COUNTER(TUnistat::Instance(), "exception_occured", "no_exception") - * Y_UNISTAT_EXCEPTION_COUNTER(TUnistat::Instance(), "wow_exception_occured") - * // doing something here - * } - * @endcode - */ -#define Y_UNISTAT_EXCEPTION_COUNTER(...) Y_PASS_VA_ARGS(Y_UNISTAT_EXCEPTION_COUNTER_IMPL_DISPATCHER(__VA_ARGS__, Y_UNISTAT_EXCEPTION_COUNTER_IMPL_3, Y_UNISTAT_EXCEPTION_COUNTER_IMPL_2)(__VA_ARGS__)) diff --git a/library/cpp/unistat/types.h b/library/cpp/unistat/types.h deleted file mode 100644 index f4346c95f6d..00000000000 --- a/library/cpp/unistat/types.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include <util/generic/string.h> - -enum class EAggregationType { - Average /* "aver" Брать среднее среди всех полученных хостовых значений */, - HostHistogram /* "hgram" Выполнять слияние всех полученных хостовых значений в гистограмму */, - Max /* "max" Брать максимальное среди всех полученных хостовых значений */, - Min /* "min" Брать минимальное среди всех полученных хостовых значений */, - Sum /* "summ" Брать сумму всех полученных хостовых значений */, - SumOne /* "sumone" summ c None для отсутсвия сигналов */, - LastValue /* "trnsp" Брать последнее среди всех полученных хостовых значений */ -}; - -const TString& ToString(EAggregationType x); diff --git a/library/cpp/unistat/unistat.cpp b/library/cpp/unistat/unistat.cpp deleted file mode 100644 index 21bf49ff012..00000000000 --- a/library/cpp/unistat/unistat.cpp +++ /dev/null @@ -1,461 +0,0 @@ -#include "unistat.h" -#include <util/generic/strbuf.h> - -using namespace NUnistat; - -TIntervalsBuilder& TIntervalsBuilder::Append(double value) { - Y_ENSURE(Intervals_.empty() || Intervals_.back() < value); - Intervals_.push_back(value); - return *this; -} - -TIntervalsBuilder& TIntervalsBuilder::AppendFlat(size_t count, double step) { - Y_ENSURE(Intervals_.size() > 0 && step > 0); - double x = Intervals_.back(); - for (size_t i = 0; i < count; ++i) { - x += step; - Intervals_.push_back(x); - } - return *this; -} - -TIntervalsBuilder& TIntervalsBuilder::AppendExp(size_t count, double base) { - Y_ENSURE(Intervals_.size() > 0 && base > 1); - double x = Intervals_.back(); - for (size_t i = 0; i < count; ++i) { - x *= base; - Intervals_.push_back(x); - } - return *this; -} - -TIntervalsBuilder& TIntervalsBuilder::FlatRange(size_t count, double start, double stop) { - Y_ENSURE(count > 0 && start < stop); - Append(start); - AppendFlat(count - 1, (stop - start) / count); - return *this; -} - -TIntervalsBuilder& TIntervalsBuilder::ExpRange(size_t count, double start, double stop) { - Y_ENSURE(count > 0 && start < stop); - Append(start); - AppendExp(count - 1, std::pow(stop / start, 1. / count)); - return *this; -} - -TIntervals TIntervalsBuilder::Build() { - Y_ENSURE(Intervals_.size() <= MAX_HISTOGRAM_SIZE); - Y_ENSURE(IsSorted(Intervals_.begin(), Intervals_.end())); - return std::move(Intervals_); -} - -IHolePtr TUnistat::DrillFloatHole(const TString& name, const TString& suffix, TPriority priority, TStartValue startValue, EAggregationType type, bool alwaysVisible) { - return DrillFloatHole(name, "", suffix, priority, startValue, type, alwaysVisible); -} - -IHolePtr TUnistat::DrillFloatHole(const TString& name, const TString& description, const TString& suffix, TPriority priority, TStartValue startValue, EAggregationType type, bool alwaysVisible) { - { - TReadGuard guard(Mutex); - IHolePtr* exhole = Holes.FindPtr(name); - if (exhole) { - return *exhole; - } - } - { - TWriteGuard guard(Mutex); - IHolePtr* exhole = Holes.FindPtr(name); - if (exhole) { - return *exhole; - } - IHolePtr hole = new TFloatHole(name, description, suffix, type, priority.Priority, startValue.StartValue, alwaysVisible); - for (const auto& tag : GlobalTags) { - hole->AddTag(tag.first, tag.second); - } - Holes[name] = hole; - HolesByPriorityAndTags.insert(hole.Get()); - return hole; - } -} - -IHolePtr TUnistat::DrillHistogramHole(const TString& name, const TString& suffix, TPriority priority, const NUnistat::TIntervals& intervals, EAggregationType type, bool alwaysVisible) { - return DrillHistogramHole(name, "", suffix, priority, intervals, type, alwaysVisible); -} - -IHolePtr TUnistat::DrillHistogramHole(const TString& name, const TString& description, const TString& suffix, TPriority priority, const NUnistat::TIntervals& intervals, EAggregationType type, bool alwaysVisible) { - { - TReadGuard guard(Mutex); - IHolePtr* exhole = Holes.FindPtr(name); - if (exhole) { - return *exhole; - } - } - { - TWriteGuard guard(Mutex); - IHolePtr* exhole = Holes.FindPtr(name); - if (exhole) { - return *exhole; - } - IHolePtr hole = new THistogramHole(name, description, suffix, type, priority.Priority, intervals, alwaysVisible); - for (const auto& tag : GlobalTags) { - hole->AddTag(tag.first, tag.second); - } - Holes[name] = hole; - HolesByPriorityAndTags.insert(hole.Get()); - return hole; - } -} - -void TUnistat::AddGlobalTag(const TString& tagName, const TString& tagValue) { - TWriteGuard guard(Mutex); - GlobalTags[tagName] = tagValue; - for (IHole* hole : HolesByPriorityAndTags) { - hole->AddTag(tagName, tagValue); - } -} - -bool TUnistat::PushSignalUnsafeImpl(const TStringBuf holename, double signal) { - IHolePtr* hole = Holes.FindPtr(holename); - if (!hole) { - return false; - } - - (*hole)->PushSignal(signal); - return true; -} - -TMaybe<TInstanceStats::TMetric> TUnistat::GetSignalValueUnsafeImpl(const TStringBuf holename) { - IHolePtr* hole = Holes.FindPtr(holename); - if (!hole) { - return Nothing(); - } - - TInstanceStats stat; - (*hole)->ExportToProto(stat); - if (!stat.GetMetric().size()) { - return Nothing(); - } - return std::move(*stat.MutableMetric(0)); -} - -bool TUnistat::ResetSignalUnsafeImpl(const TStringBuf holename) { - IHolePtr* hole = Holes.FindPtr(holename); - if (!hole) { - return false; - } - - (*hole)->ResetSignal(); - return true; -} - -TString TUnistat::CreateInfoDump(int level) const { - TReadGuard guard(Mutex); - NJsonWriter::TBuf json; - json.BeginObject(); - for (IHole* hole : HolesByPriorityAndTags) { - if (hole->GetPriority() < level) { - break; - } - hole->PrintInfo(json); - } - json.EndObject(); - return json.Str(); -} - -TString TUnistat::CreateJsonDump(int level, bool allHoles) const { - TReadGuard guard(Mutex); - NJsonWriter::TBuf json; - json.BeginList(); - bool filterZeroHoles = !allHoles && level >= 0; - for (IHole* hole : HolesByPriorityAndTags) { - if (hole->GetPriority() < level) { - break; - } - hole->PrintValue(json, filterZeroHoles); - } - json.EndList(); - return json.Str(); -} - -TString TUnistat::CreatePushDump(int level, const NUnistat::TTags& tags, ui32 ttl, bool allHoles) const { - TReadGuard guard(Mutex); - NJsonWriter::TBuf json; - json.BeginList(); - bool filterZeroHoles = !allHoles && level >= 0; - int prevPriority = Max<int>(); - TString prevTagsStr; - for (IHole* hole : HolesByPriorityAndTags) { - int priority = hole->GetPriority(); - TString tagStr = hole->GetTagsStr(); - if (priority < level) { - break; - } - if (prevPriority != priority || prevTagsStr != tagStr) { - if (prevPriority != Max<int>()) { - json.EndList(); - json.EndObject(); - } - json.BeginObject(); - if (ttl) { - json.WriteKey("ttl").WriteULongLong(ttl); - } - json.WriteKey("tags").BeginObject() - .WriteKey("_priority").WriteInt(hole->GetPriority()); - for (const auto& tag : tags) { - json.WriteKey(tag.first); - json.WriteString(tag.second); - } - for (const auto& tag : hole->GetTags()) { - json.WriteKey(tag.first); - json.WriteString(tag.second); - } - json.EndObject(); - json.WriteKey("values").BeginList(); - prevPriority = priority; - prevTagsStr = tagStr; - } - hole->PrintToPush(json, filterZeroHoles); - } - if (prevPriority != Max<int>()) { - json.EndList(); - json.EndObject(); - } - json.EndList(); - return json.Str(); -} - -void TUnistat::ExportToProto(TInstanceStats& stats, int level) const { - TReadGuard guard(Mutex); - - for (IHole* hole : HolesByPriorityAndTags) { - if (hole->GetPriority() < level) { - break; - } - hole->ExportToProto(stats); - } -} - -TString TUnistat::GetSignalDescriptions() const { - TReadGuard guard(Mutex); - NJsonWriter::TBuf json; - json.BeginObject(); - - for (IHole* hole : HolesByPriorityAndTags) { - json.WriteKey(hole->GetName()); - json.WriteString(hole->GetDescription()); - } - - json.EndObject(); - return json.Str(); -} - -TVector<TString> TUnistat::GetHolenames() const { - TReadGuard guard(Mutex); - - TVector<TString> holenames; - for (const auto& [holeName, holeData] : Holes) { - holenames.emplace_back(holeName); - } - - return holenames; -} - -bool TUnistat::EraseHole(const TString& name) { - TWriteGuard guard(Mutex); - auto holeIterator = Holes.find(name); - if (holeIterator == Holes.end()) { - return false; - } - - HolesByPriorityAndTags.erase(holeIterator->second.Get()); - Holes.erase(holeIterator); - return true; -} - -void TFloatHole::PrintInfo(NJsonWriter::TBuf& json) const { - TValue value; - value.Atomic = AtomicGet(Value.Atomic); - json.WriteKey(Name) - .BeginObject() - .WriteKey(TStringBuf("Priority")) - .WriteInt(Priority) - .WriteKey(TStringBuf("Value")) - .WriteDouble(value.Value) - .WriteKey(TStringBuf("Type")) - .WriteString(ToString(Type)) - .WriteKey(TStringBuf("Suffix")) - .WriteString(Suffix) - .WriteKey(TStringBuf("Tags")) - .WriteString(GetTagsStr()) - .EndObject(); -} - -void TFloatHole::PrintValue(NJsonWriter::TBuf& json, bool check) const { - if (check && !AtomicGet(Pushed)) { - return; - } - - TValue value; - value.Atomic = AtomicGet(Value.Atomic); - json.BeginList() - .WriteString(TString::Join(GetTagsStr(), Name, TStringBuf("_"), Suffix)) - .WriteDouble(value.Value) - .EndList(); -} - -void TFloatHole::PrintToPush(NJsonWriter::TBuf& json, bool check) const { - if (check && !AtomicGet(Pushed)) { - return; - } - - TValue value; - value.Atomic = AtomicGet(Value.Atomic); - json.BeginObject() - .WriteKey("name").WriteString(TString::Join(Name, TStringBuf("_"), Suffix)) - .WriteKey("val").WriteDouble(value.Value) - .EndObject(); -} - - -void TFloatHole::ExportToProto(TInstanceStats& stats) const { - if (!AtomicGet(Pushed)) { - return; - } - - TValue value; - value.Atomic = AtomicGet(Value.Atomic); - TInstanceStats::TMetric* metric = stats.AddMetric(); - metric->SetName(TString::Join(GetTagsStr(), Name, TStringBuf("_"), Suffix)); - metric->SetNumber(value.Value); -} - -void TFloatHole::PushSignal(double signal) { - AtomicSet(Pushed, 1); - TValue old, toset; - do { - old.Atomic = AtomicGet(Value.Atomic); - switch (Type) { - case EAggregationType::Max: - toset.Value = Max(signal, old.Value); - break; - case EAggregationType::Min: - toset.Value = Min(signal, old.Value); - break; - case EAggregationType::Sum: - toset.Value = signal + old.Value; - break; - case EAggregationType::LastValue: - toset.Value = signal; - break; - default: - assert(0); - } - } while (!AtomicCas(&Value.Atomic, toset.Atomic, old.Atomic)); -} - -void TFloatHole::ResetSignal() { - AtomicSet(Value.Atomic, 0); - AtomicSet(Pushed, 0); -} - -void THistogramHole::PrintInfo(NJsonWriter::TBuf& json) const { - json.WriteKey(Name) - .BeginObject() - .WriteKey(TStringBuf("Priority")) - .WriteInt(Priority) - .WriteKey(TStringBuf("Value")); - - PrintWeights(json); - - json.WriteKey(TStringBuf("Type")) - .WriteString(ToString(Type)); - json.WriteKey(TStringBuf("Suffix")) - .WriteString(Suffix); - json.WriteKey(TStringBuf("Tags")) - .WriteString(GetTagsStr()) - .EndObject(); -} - -void THistogramHole::PrintValue(NJsonWriter::TBuf& json, bool check) const { - if (check && !AtomicGet(Pushed)) { - return; - } - - json.BeginList() - .WriteString(TString::Join(GetTagsStr(), Name, TStringBuf("_"), Suffix)); - - PrintWeights(json); - - json.EndList(); -} - -void THistogramHole::PrintToPush(NJsonWriter::TBuf& json, bool check) const { - if (check && !AtomicGet(Pushed)) { - return; - } - - json.BeginObject() - .WriteKey("name").WriteString(TString::Join(Name, TStringBuf("_"), Suffix)) - .WriteKey("val"); - PrintWeights(json); - json.EndObject(); -} - -void THistogramHole::PrintWeights(NJsonWriter::TBuf& json) const { - json.BeginList(); - for (size_t i = 0, size = Weights.size(); i < size; ++i) { - json.BeginList() - .WriteDouble(Intervals[i]) - .WriteLongLong(AtomicGet(Weights[i])) - .EndList(); - } - json.EndList(); -} - -void THistogramHole::ExportToProto(TInstanceStats& stats) const { - if (!AtomicGet(Pushed)) { - return; - } - - TInstanceStats::TMetric* metric = stats.AddMetric(); - metric->SetName(TString::Join(GetTagsStr(), Name, TStringBuf("_"), Suffix)); - - TInstanceStats::THistogram* hgram = metric->MutableHgram(); - for (size_t i = 0, size = Weights.size(); i < size; ++i) { - TInstanceStats::THistogram::TBucket* bucket = hgram->AddBucket(); - bucket->SetBoundary(Intervals[i]); - bucket->SetWeight(AtomicGet(Weights[i])); - } -} - -void THistogramHole::PushSignal(double signal) { - AtomicSet(Pushed, 1); - - const size_t i = UpperBound(Intervals.cbegin(), Intervals.cend(), signal) - Intervals.cbegin(); // Intervals[i - 1] <= signal < Intervals[i] - if (i > 0) { - AtomicIncrement(Weights[i - 1]); - } -} - -void THistogramHole::ResetSignal() { - for (size_t i = 0; i < Intervals.size(); ++i) { - SetWeight(i, 0); - } - AtomicSet(Pushed, 0); -} - -void THistogramHole::SetWeight(ui32 index, TAtomicBase value) { - AtomicSet(Weights.at(index), value); -} - -void TUnistat::Reset() { - TWriteGuard guard(Mutex); - Holes.clear(); - HolesByPriorityAndTags.clear(); - GlobalTags.clear(); -} - -void TUnistat::ResetSignals() { - for (auto& hole : Holes) { - hole.second->ResetSignal(); - } -} diff --git a/library/cpp/unistat/unistat.h b/library/cpp/unistat/unistat.h deleted file mode 100644 index 50acc0b30b5..00000000000 --- a/library/cpp/unistat/unistat.h +++ /dev/null @@ -1,382 +0,0 @@ -#pragma once - -#include <util/generic/singleton.h> -#include <util/generic/string.h> -#include <library/cpp/deprecated/atomic/atomic.h> -#include <util/generic/ptr.h> -#include <util/generic/vector.h> -#include <util/generic/hash.h> -#include <util/generic/maybe.h> -#include <util/generic/set.h> -#include <util/generic/map.h> -#include <util/string/strip.h> -#include <util/system/rwlock.h> - -#include <library/cpp/json/writer/json.h> -#include <library/cpp/unistat/idl/stats.pb.h> - -#include <functional> - -#include "types.h" - -/* - Agregator of Search Statistics - see https://wiki.yandex-team.ru/jandekspoisk/sepe/monitoring/stat-handle - see https://st.yandex-team.ru/SEARCH-948 -*/ - -namespace NUnistat { - struct TPriority { - constexpr explicit TPriority(int priority) - : Priority(priority) - { - } - const int Priority; - }; - - struct TStartValue { - constexpr explicit TStartValue(double startValue) - : StartValue(startValue) - { - } - - const double StartValue; - }; - - class IHole { - public: - virtual int GetPriority() const = 0; - virtual TString GetName() const = 0; - virtual TString GetDescription() const = 0; - virtual TString GetTagsStr() const = 0; - virtual TMap<TString, TString> GetTags() const = 0; - virtual void PrintValue(NJsonWriter::TBuf& json, bool check = true) const = 0; - virtual void PrintInfo(NJsonWriter::TBuf& json) const = 0; - virtual void PrintToPush(NJsonWriter::TBuf& json, bool check = true) const = 0; - virtual void ExportToProto(TInstanceStats& stats) const = 0; - virtual void PushSignal(double signal) = 0; - virtual void ResetSignal() = 0; - virtual void AddTag(const TString& tagName, const TString& tagValue) = 0; - virtual ~IHole() = default; - }; - - class TBaseHole: public IHole { - public: - void AddTag(const TString& tagName, const TString& tagValue) override { - TWriteGuard guard(Mutex); - Tags[tagName] = tagValue; - RebuildTagString(); - } - - protected: - TBaseHole(const TString& name, const TString& description, const TString& suffix, int priority) - : Name(name) - , Description(description) - , Suffix(suffix) - , Priority(priority) - - { - ParseTagsFromName(name); - } - - int GetPriority() const override { - return Priority; - } - - TString GetName() const override { - return Name; - } - - TString GetDescription() const override { - return Description; - } - - TString GetTagsStr() const override { - TReadGuard guard(Mutex); - return TagsJoined; - } - - TMap<TString, TString> GetTags() const override { - TReadGuard guard(Mutex); - return Tags; - } - - TString Name; - const TString Description; - const TString Suffix; - int Priority = 1; - - TRWMutex Mutex; - TMap<TString, TString> Tags; - TString TagsJoined; - - private: - void RebuildTagString() { - TagsJoined.clear(); - TStringOutput ss{TagsJoined}; - for (const auto& tag : Tags) { - ss << tag.first << "=" << tag.second << ";"; - } - } - - void ParseTagsFromName(TStringBuf name) { - TStringBuf tmp = name; - while (TStringBuf tag = tmp.NextTok(';')) { - TStringBuf name, value; - if (tag.TrySplit('=', name, value)) { - TStringBuf nameStr = StripString(name); - TStringBuf valueStr = StripString(value); - if (nameStr) { - Tags[ToString(nameStr)] = ToString(valueStr); - } - } - else { - Name = ToString(StripString(tag)); - } - } - - RebuildTagString(); - } - }; - - class TTypedHole: public TBaseHole { - protected: - TTypedHole(const TString& name, - const TString& description, - const TString& suffix, - EAggregationType type, - int priority, - bool alwaysVisible = false) - : TBaseHole(name, description, suffix, priority) - , Type(type) - , Pushed(alwaysVisible) - { - } - - const EAggregationType Type; - TAtomic Pushed; - }; - - class TFloatHole: public TTypedHole { - public: - TFloatHole(const TString& name, - const TString& description, - const TString& suffix, - EAggregationType type, - int priority, - double startValue, - bool alwaysVisible) - : TTypedHole(name, description, suffix, type, priority, alwaysVisible) - { - Value.Value = startValue; - } - - void PrintValue(NJsonWriter::TBuf& json, bool check = true) const override; - void PrintToPush(NJsonWriter::TBuf& json, bool check) const override; - void PrintInfo(NJsonWriter::TBuf& json) const override; - void ExportToProto(TInstanceStats& stats) const override; - - void PushSignal(double signal) override; - virtual void ResetSignal() override; - - private: - union TValue { - double Value; - TAtomic Atomic; - }; - - TValue Value; - }; - - using TIntervals = TVector<double>; - - const size_t MAX_HISTOGRAM_SIZE = 50; - - // - // Examples: - // Append(7).AppendFlat(2, 3) -> {7, 10, 13} - // FlatRange(4, 1, 5).FlatRange(3, 5, 20) -> {1, 2, 3, 4, 5, 10, 15} - // ExpRange(4, 1, 16).ExpRange(3, 16, 1024) -> {1, 2, 4, 8, 16, 64, 256} - // - class TIntervalsBuilder { - public: - // Append single point - TIntervalsBuilder& Append(double value); - - // Appends @count points at equal intervals: - // [last + step, last + 2 * step, ..., last + count * step] - TIntervalsBuilder& AppendFlat(size_t count, double step); - - // Appends @count points at exponential intervals: - // [last * base, last * base^2, ..., last * base^count] - TIntervalsBuilder& AppendExp(size_t count, double base); - - // Adds @count points at equal intervals, @stop is not included: - // [start, start + d, start + 2d, ..., start + count * d = stop) - TIntervalsBuilder& FlatRange(size_t count, double start, double stop); - - // Adds @count points at exponential intervals, @stop is not included: - // [start, start * q, start * q^2, ..., start * q^count = stop) - TIntervalsBuilder& ExpRange(size_t count, double start, double stop); - - TIntervals Build(); - private: - TIntervals Intervals_; - }; - - class THistogramHole: public TTypedHole { - public: - THistogramHole(const TString& name, const TString& description, const TString& suffix, EAggregationType type, int priority, TIntervals intervals, bool alwaysVisible) - : TTypedHole(name, description, suffix, type, priority, alwaysVisible) - , Intervals(std::move(intervals)) - { - Weights.resize(Intervals.size()); - } - - void PrintValue(NJsonWriter::TBuf& json, bool check = true) const override; - void PrintToPush(NJsonWriter::TBuf& json, bool check) const override; - void PrintInfo(NJsonWriter::TBuf& json) const override; - void ExportToProto(TInstanceStats& stats) const override; - - void PushSignal(double signal) override; - virtual void ResetSignal() override; - - // for tests only - void SetWeight(ui32 index, TAtomicBase value); - - private: - void PrintWeights(NJsonWriter::TBuf& json) const; - - const TIntervals Intervals; - TVector<TAtomicBase> Weights; - }; - - struct THolePriorityComparator { - bool operator()(IHole* lhs, IHole* rhs) const { - // Priorities are sorted in descending order, tags and names in ascending order. - auto lp = lhs->GetPriority(); - auto rp = rhs->GetPriority(); - if (lp != rp) { - return lp > rp; - } - - const auto& lt = lhs->GetTagsStr(); - const auto& rt = rhs->GetTagsStr(); - int cmp = lt.compare(rt); - if (cmp) { - return cmp < 0; - } - - return lhs->GetName() < rhs->GetName(); - } - }; - - using IHolePtr = TAtomicSharedPtr<NUnistat::IHole>; - using TTags = TMap<TString, TString>; -} - -class TUnistat { -public: - static TUnistat& Instance() { - return *Singleton<TUnistat>(); - } - - NUnistat::IHolePtr DrillFloatHole(const TString& name, - const TString& description, - const TString& suffix, - NUnistat::TPriority priority, - NUnistat::TStartValue startValue = NUnistat::TStartValue(0), - EAggregationType type = EAggregationType::Sum, - bool alwaysVisible = false); - - NUnistat::IHolePtr DrillFloatHole(const TString& name, - const TString& suffix, - NUnistat::TPriority priority, - NUnistat::TStartValue startValue = NUnistat::TStartValue(0), - EAggregationType type = EAggregationType::Sum, - bool alwaysVisible = false); - - - NUnistat::IHolePtr DrillHistogramHole(const TString& name, - const TString& description, - const TString& suffix, - NUnistat::TPriority priority, - const NUnistat::TIntervals& intervals, - EAggregationType type = EAggregationType::HostHistogram, - bool alwaysVisible = false); - - NUnistat::IHolePtr DrillHistogramHole(const TString& name, - const TString& suffix, - NUnistat::TPriority priority, - const NUnistat::TIntervals& intervals, - EAggregationType type = EAggregationType::HostHistogram, - bool alwaysVisible = false); - - void AddGlobalTag(const TString& tagName, const TString& tagValue); - - /*It called Unsafe, because assumed, that all holes are initilized before - first usage. Underlying hash is not locked, when invoked */ - template <typename T> - bool PushSignalUnsafe(const T& holename, double signal) { - return PushSignalUnsafeImpl(GetHolename(holename), signal); - } - - template <typename T> - TMaybe<TInstanceStats::TMetric> GetSignalValueUnsafe(const T& holename) { - return GetSignalValueUnsafeImpl(GetHolename(holename)); - } - - template <typename T> - bool ResetSignalUnsafe(const T& holename) { - return ResetSignalUnsafeImpl(GetHolename(holename)); - } - - TString CreateJsonDump(int level, bool allHoles = true) const; - TString CreatePushDump(int level, const NUnistat::TTags& tags = NUnistat::TTags(), ui32 ttl = 0, bool allHoles = false) const; - TString CreateInfoDump(int level) const; - void ExportToProto(TInstanceStats& stats, int level) const; - TString GetSignalDescriptions() const; - TVector<TString> GetHolenames() const; - - /* Erase hole from TUnistat internal state - returns false if name wasn't found */ - bool EraseHole(const TString& name); - - void Reset(); - void ResetSignals(); - -private: - template <typename T> - std::enable_if_t<std::is_same<T, TStringBuf>::value || - std::is_same<T, TString>::value || - std::is_same<T, char*>::value || - std::is_same<T, const char*>::value, - const T&> - GetHolename(const T& holename) { - return holename; - } - - template <typename T> - std::enable_if_t<std::is_enum<T>::value, TString> - GetHolename(const T holename) { - return ToString(holename); - } - - template <typename T> - std::enable_if_t<(std::is_same<char, std::remove_all_extents_t<T>>::value && - std::is_array<T>::value && std::rank<T>::value == 1 && std::extent<T>::value > 1), - TStringBuf> - GetHolename(const T& holename) { - return {holename, std::extent<T>::value - 1}; - } - - bool PushSignalUnsafeImpl(const TStringBuf holename, double signal); - TMaybe<TInstanceStats::TMetric> GetSignalValueUnsafeImpl(const TStringBuf holename); - bool ResetSignalUnsafeImpl(const TStringBuf holename); - -private: - TRWMutex Mutex; - THashMap<TString, NUnistat::IHolePtr> Holes; - TSet<NUnistat::IHole*, NUnistat::THolePriorityComparator> HolesByPriorityAndTags; - TMap<TString, TString> GlobalTags; -}; diff --git a/library/cpp/wordlistreader/README.md b/library/cpp/wordlistreader/README.md deleted file mode 100644 index 7521d886622..00000000000 --- a/library/cpp/wordlistreader/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Вспомогательная библиотека для работы с текстовыми файлами, разбитыми на разделы по языку. - -Используется в [библиотеке](https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/stopwords) для работы со стоп-словами ([пример файла](https://a.yandex-team.ru/arc/trunk/arcadia/search/wizard/data/wizard/language/stopword.lst)) и в морфологическом [дециматоре](https://a.yandex-team.ru/arc/trunk/arcadia/kernel/lemmer/core/decimator.h) ([пример файла](https://a.yandex-team.ru/arc/trunk/arcadia/kernel/lemmer/context/default_decimator/default_decimator.lst)). diff --git a/library/cpp/wordlistreader/wordlistreader.cpp b/library/cpp/wordlistreader/wordlistreader.cpp deleted file mode 100644 index 9cf6d86c00e..00000000000 --- a/library/cpp/wordlistreader/wordlistreader.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include "wordlistreader.h" - -#include <library/cpp/charset/wide.h> -#include <library/cpp/langs/langs.h> - -#include <library/cpp/charset/recyr.hh> -#include <util/string/cast.h> -#include <util/generic/yexception.h> -#include <util/string/vector.h> -#include <util/string/split.h> - -void TWordListReader::ProcessLine(const TString& line) { - if (line.find('[') == 0 && line.find(']') != TString::npos) { - size_t endpos = line.find(']'); - TString langname = line.substr(1, endpos - 1); - LangCode = LanguageByName(langname); - if (LangCode != LANG_UNK) { - SkippingByError = false; - } else { - Cerr << "Unknown language name: " << langname.c_str() << Endl; - SkippingByError = true; - } - } else if (!SkippingByError) { - TUtf16String recodedLine = CharToWide(line, Encoding); - ParseLine(recodedLine, LangCode, Version); - } -} - -void TWordListReader::ReadDataFile(IInputStream& src) { - // Read header for version and encoding - LangCode = LANG_UNK; - Encoding = CODES_YANDEX; - Version = 0; - SkippingByError = false; - - TString line; - while (src.ReadLine(line)) { - if (line[0] == '#') - continue; // comment - TVector<TString> tokens = StringSplitter(line).SplitBySet(" \t\r\n:,").SkipEmpty(); - if (tokens.size() == 2) { - if (stricmp(tokens[0].c_str(), "version") == 0) { - Version = FromString<int>(tokens[1]); - continue; - } else if (stricmp(tokens[0].c_str(), "encoding") == 0) { - Encoding = CharsetByName(tokens[1].c_str()); - if (Encoding == CODES_UNKNOWN) - ythrow yexception() << "Invalid encoding name"; - continue; - } - } - break; - } - - // Read the body - ProcessLine(line); - while (src.ReadLine(line)) { - if (line[0] == '#') - continue; // skip comments - ProcessLine(line); - } -} diff --git a/library/cpp/wordlistreader/wordlistreader.h b/library/cpp/wordlistreader/wordlistreader.h deleted file mode 100644 index 03abe78fe7d..00000000000 --- a/library/cpp/wordlistreader/wordlistreader.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include <util/generic/string.h> -#include <library/cpp/charset/codepage.h> -#include <util/stream/output.h> -#include <util/stream/file.h> - -#include <library/cpp/langmask/langmask.h> - -// Mix-in class for loading configuration files built of language sections. Handles version, encoding, -// comments, and language section switching; delegates actual processing to derived classes -// via ParseLine() function (pure virtual). - -class TWordListReader { -private: - ELanguage LangCode; - ECharset Encoding; - int Version; - bool SkippingByError; - -public: - TWordListReader() - : LangCode(LANG_UNK) - , Encoding(CODES_YANDEX) - , Version(0) - , SkippingByError(false) - { - } - virtual ~TWordListReader() { - } - -protected: - virtual void ParseLine(const TUtf16String& line, ELanguage langcode, int version) = 0; - - void ReadDataFile(const char* filename) { - TBuffered<TUnbufferedFileInput> src(4096, filename); - ReadDataFile(src); - } - void ReadDataFile(IInputStream& src); - -private: - void ProcessLine(const TString& line); -}; diff --git a/library/cpp/xdelta3/proto/state_header.proto b/library/cpp/xdelta3/proto/state_header.proto deleted file mode 100644 index 21454b8263b..00000000000 --- a/library/cpp/xdelta3/proto/state_header.proto +++ /dev/null @@ -1,37 +0,0 @@ -syntax = "proto2"; - -package NXdeltaAggregateColumn; - -option cc_enable_arenas = true; - -// update ArenaMaxSize with reasonable constant after Header modification -// note! not using strings here to avoid heap allocations - -message TStateHeader { - enum EType { - NONE_TYPE = 0; - BASE = 1; - PATCH = 2; - }; - - enum EErrorCode { - NO_ERROR = 0; - HEADER_PARSE_ERROR = 1; - BASE_HASH_ERROR = 2; - STATE_HASH_ERROR = 3; - MERGE_PATCHES_ERROR = 4; - APPLY_PATCH_ERROR = 5; - YT_MERGE_ERROR = 6; - MISSING_REQUIRED_FIELD_ERROR = 7; - WRONG_DATA_SIZE = 8; - STATE_SIZE_ERROR = 9; - PROTOBUF_ERROR = 10; - }; - - optional EType type = 1; // base or patch - optional uint32 base_hash = 2; // applicable for patch - hash of base to apply on - optional uint32 state_hash = 3; // applicable for patch - hash of target state - optional uint32 state_size = 4; // applicable for patch - target state size - remove it? - optional uint32 data_size = 5; // base or patch payload size - optional EErrorCode error_code = 6; -}; diff --git a/library/cpp/xdelta3/state/create_proto.cpp b/library/cpp/xdelta3/state/create_proto.cpp deleted file mode 100644 index ad97201e559..00000000000 --- a/library/cpp/xdelta3/state/create_proto.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include "create_proto.h" - -#include <library/cpp/xdelta3/state/data_ptr.h> -#include <library/cpp/xdelta3/state/hash.h> -#include <library/cpp/xdelta3/xdelta_codec/codec.h> - -namespace NXdeltaAggregateColumn { - bool EncodeHeaderTo(const TStateHeader& header, ui8* data, size_t size, size_t& resultSize); -} - -namespace { - using namespace NXdeltaAggregateColumn; - - template<typename TResult> - TResult EncodeProto(const TStateHeader& header, const ui8* data, size_t size) - { - using namespace NProtoBuf::io; - - TResult result; - ui8 totalHeaderSize = SizeOfHeader(header); - ui8* ptr = nullptr; - if constexpr (std::is_same_v<TResult, TString>) { - result.ReserveAndResize(totalHeaderSize + size); - ptr = reinterpret_cast<ui8*>(&result[0]); - } else { - result.Resize(totalHeaderSize + size); - ptr = reinterpret_cast<ui8*>(result.Data()); - } - size_t resultSize = 0; - - if (EncodeHeaderTo(header, ptr, result.Size(), resultSize)) { - if (data && size) { - memcpy(ptr + totalHeaderSize, data, size); - } - return result; - } - return {}; - } - - template<typename TResult> - TResult EncodeErrorProto(TStateHeader::EErrorCode error, const TChangeHeader& changeHeader = {}) - { - TStateHeader header; - header.set_error_code(error); - - if (changeHeader) { - changeHeader(header); - } - - return EncodeProto<TResult>(header, nullptr, 0); - } - - template<typename TResult> - TResult EncodeBaseProto(const ui8* base, size_t baseSize, const TChangeHeader& changeHeader = {}) - { - TStateHeader header; - header.set_type(TStateHeader::BASE); - header.set_data_size(baseSize); - - if (changeHeader) { - changeHeader(header); - } - - return EncodeProto<TResult>(header, base, baseSize); - } - - template<typename TResult> - TResult EncodePatchProto(const ui8* base, size_t baseSize, const ui8* state, size_t stateSize, const ui8* patch, size_t patchSize, const TChangeHeader& changeHeader = {}) - { - TStateHeader header; - header.set_type(TStateHeader::PATCH); - header.set_data_size(patchSize); - header.set_state_hash(CalcHash(state, stateSize)); - header.set_state_size(stateSize); - header.set_base_hash(CalcHash(base, baseSize)); - - if (changeHeader) { - changeHeader(header); - } - - return EncodeProto<TResult>(header, patch, patchSize); - } - - template<typename TResult> - TResult EncodePatchProto(const ui8* base, size_t baseSize, const ui8* state, size_t stateSize, const TChangeHeader& changeHeader = {}) - { - size_t patchSize = 0; - auto patch = TDataPtr(ComputePatch(nullptr, base, baseSize, state, stateSize, &patchSize)); - - return EncodePatchProto<TResult>(base, baseSize, state, stateSize, patch.get(), patchSize, changeHeader); - } -} - -namespace NXdeltaAggregateColumn { - TBuffer EncodeErrorProtoAsBuffer(TStateHeader::EErrorCode error, const TChangeHeader& changeHeader) { - return EncodeErrorProto<TBuffer>(error, changeHeader); - } - - TBuffer EncodeBaseProtoAsBuffer(const ui8* base, size_t baseSize, const TChangeHeader& changeHeader) { - return EncodeBaseProto<TBuffer>(base, baseSize, changeHeader); - } - - TBuffer EncodePatchProtoAsBuffer(const ui8* base, size_t baseSize, const ui8* state, size_t stateSize, const TChangeHeader& changeHeader) { - return EncodePatchProto<TBuffer>(base, baseSize, state, stateSize, changeHeader); - } - - TBuffer EncodePatchProtoAsBuffer(const ui8* base, size_t baseSize, const ui8* state, size_t stateSize, const ui8* patch, size_t patchSize, const TChangeHeader& changeHeader) { - return EncodePatchProto<TBuffer>(base, baseSize, state, stateSize, patch, patchSize, changeHeader); - } - - TBuffer EncodeProtoAsBuffer(const TStateHeader& header, const ui8* data, size_t size) { - return EncodeProto<TBuffer>(header, data, size); - } - - TString EncodeErrorProtoAsString(TStateHeader::EErrorCode error, const TChangeHeader& changeHeader) { - return EncodeErrorProto<TString>(error, changeHeader); - } - - TString EncodeBaseProtoAsString(const ui8* base, size_t baseSize, const TChangeHeader& changeHeader) { - return EncodeBaseProto<TString>(base, baseSize, changeHeader); - } - - TString EncodePatchProtoAsString(const ui8* base, size_t baseSize, const ui8* state, size_t stateSize, const TChangeHeader& changeHeader) { - return EncodePatchProto<TString>(base, baseSize, state, stateSize, changeHeader); - } - - TString EncodePatchProtoAsString(const ui8* base, size_t baseSize, const ui8* state, size_t stateSize, const ui8* patch, size_t patchSize, const TChangeHeader& changeHeader) { - return EncodePatchProto<TString>(base, baseSize, state, stateSize, patch, patchSize, changeHeader); - } - - TString EncodeProtoAsString(const TStateHeader& header, const ui8* data, size_t size) { - return EncodeProto<TString>(header, data, size); - } -} diff --git a/library/cpp/xdelta3/state/create_proto.h b/library/cpp/xdelta3/state/create_proto.h deleted file mode 100644 index 7ca9763d848..00000000000 --- a/library/cpp/xdelta3/state/create_proto.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "state.h" - -#include <library/cpp/xdelta3/proto/state_header.pb.h> - -#include <functional> - -namespace NXdeltaAggregateColumn { - - // functor used for testing - change header fields to inject errors - using TChangeHeader = std::function<void(TStateHeader&)>; - - TBuffer EncodeErrorProtoAsBuffer(TStateHeader::EErrorCode error, const TChangeHeader& changeHeader = {}); - TBuffer EncodeBaseProtoAsBuffer(const ui8* base, size_t baseSize, const TChangeHeader& changeHeader = {}); - TBuffer EncodePatchProtoAsBuffer(const ui8* base, size_t baseSize, const ui8* state, size_t stateSize, const TChangeHeader& changeHeader = {}); - TBuffer EncodePatchProtoAsBuffer(const ui8* base, size_t baseSize, const ui8* state, size_t stateSize, const ui8* patch, size_t patchSize, const TChangeHeader& changeHeader = {}); - TBuffer EncodeProtoAsBuffer(const TStateHeader& header, const ui8* data, size_t size); - - TString EncodeErrorProtoAsString(TStateHeader::EErrorCode error, const TChangeHeader& changeHeader = {}); - TString EncodeBaseProtoAsString(const ui8* base, size_t baseSize, const TChangeHeader& changeHeader = {}); - TString EncodePatchProtoAsString(const ui8* base, size_t baseSize, const ui8* state, size_t stateSize, const TChangeHeader& changeHeader = {}); - TString EncodePatchProtoAsString(const ui8* base, size_t baseSize, const ui8* state, size_t stateSize, const ui8* patch, size_t patchSize, const TChangeHeader& changeHeader = {}); - TString EncodeProtoAsString(const TStateHeader& header, const ui8* data, size_t size); - -} diff --git a/library/cpp/xdelta3/state/data_ptr.cpp b/library/cpp/xdelta3/state/data_ptr.cpp deleted file mode 100644 index a64af771244..00000000000 --- a/library/cpp/xdelta3/state/data_ptr.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "data_ptr.h" - -namespace NXdeltaAggregateColumn { - - TDeleter::TDeleter(XDeltaContext* context) - : Context(context) - { - } - - void TDeleter::operator()(ui8* ptr) const - { - if (!Context) { - free(ptr); - return; - } - Context->free(Context->opaque, ptr); - } -} diff --git a/library/cpp/xdelta3/state/data_ptr.h b/library/cpp/xdelta3/state/data_ptr.h deleted file mode 100644 index 7ba12eb4ba9..00000000000 --- a/library/cpp/xdelta3/state/data_ptr.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include <library/cpp/xdelta3/xdelta_codec/codec.h> - -#include <memory> - -namespace NXdeltaAggregateColumn { - struct TDeleter { - TDeleter() = default; - explicit TDeleter(XDeltaContext* context); - - void operator()(ui8* p) const; - - XDeltaContext* Context = nullptr; - }; - using TDataPtr = std::unique_ptr<ui8, TDeleter>; -} diff --git a/library/cpp/xdelta3/state/hash.cpp b/library/cpp/xdelta3/state/hash.cpp deleted file mode 100644 index 741e60c013c..00000000000 --- a/library/cpp/xdelta3/state/hash.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include <util/digest/murmur.h> - -namespace NXdeltaAggregateColumn { - - ui32 CalcHash(const ui8* data, size_t size) - { - return MurmurHash<ui32>(data, size); - } - -} diff --git a/library/cpp/xdelta3/state/hash.h b/library/cpp/xdelta3/state/hash.h deleted file mode 100644 index 437e3be1236..00000000000 --- a/library/cpp/xdelta3/state/hash.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -namespace NXdeltaAggregateColumn { - ui32 CalcHash(const ui8* data, size_t size); -} diff --git a/library/cpp/xdelta3/state/merge.cpp b/library/cpp/xdelta3/state/merge.cpp deleted file mode 100644 index de8b12226d5..00000000000 --- a/library/cpp/xdelta3/state/merge.cpp +++ /dev/null @@ -1,226 +0,0 @@ -#include "merge.h" - -#include "state.h" - -#include "data_ptr.h" - -#include <library/cpp/xdelta3/xdelta_codec/codec.h> -#include <library/cpp/xdelta3/state/hash.h> - -#include <util/digest/murmur.h> - -#include <google/protobuf/io/coded_stream.h> -#include <google/protobuf/io/zero_copy_stream.h> -#include <google/protobuf/io/zero_copy_stream_impl_lite.h> - -namespace NXdeltaAggregateColumn { - - static ui8* AllocateFromContext(XDeltaContext* context, size_t size) - { - if (!context) { - return reinterpret_cast<ui8*>(malloc(size)); - } - return reinterpret_cast<ui8*>(context->allocate(context->opaque, size)); - } - - bool EncodeHeaderTo(const TStateHeader& header, ui8* data, size_t size, size_t& resultSize); - - bool EncodeErrorHeader(XDeltaContext* context, NProtoBuf::Arena& arena, TStateHeader::EErrorCode error, TSpan* result) - { - result->Offset = result->Size = 0; - - auto header = NProtoBuf::Arena::CreateMessage<NXdeltaAggregateColumn::TStateHeader>(&arena); - header->set_error_code(error); - auto headerSize = SizeOfHeader(*header); - auto data = TDataPtr(AllocateFromContext(context, headerSize), TDeleter(context)); - if (EncodeHeaderTo(*header, data.get(), headerSize, result->Size)) { - result->Offset = 0; - result->Data = data.release(); - return true; - } - return false; - } - - bool EncodeState(XDeltaContext* context, NProtoBuf::Arena& arena, const TState& state, TSpan* result) - { - auto headerSize = SizeOfHeader(state.Header()); - result->Size = headerSize + state.PayloadSize(); - auto data = TDataPtr(AllocateFromContext(context, result->Size), TDeleter(context)); - size_t written = 0; - if (EncodeHeaderTo(state.Header(), data.get(), result->Size, written)) { - if (state.PayloadSize() && state.PayloadData()) { - memcpy(data.get() + headerSize, state.PayloadData(), state.PayloadSize()); - } - result->Data = data.release(); - return true; - } - return EncodeErrorHeader(context, arena, TStateHeader::PROTOBUF_ERROR, result); - } - - // NOTE: empty (data_size == 0) patch means nothing changed. - // empty valid patch and will be ignored unless will raise error - - bool IsBadEmptyPatch(const TState& empty) - { - return 0u == empty.PayloadSize() && empty.Header().base_hash() != empty.Header().state_hash(); - } - - bool MergePatches(XDeltaContext* context, NProtoBuf::Arena& arena, const TState& lhs, const TState& rhs, TSpan* result) - { - if (lhs.Header().state_hash() != rhs.Header().base_hash()) { - return EncodeErrorHeader(context, arena, TStateHeader::MERGE_PATCHES_ERROR, result); - } - - if (IsBadEmptyPatch(lhs) || IsBadEmptyPatch(rhs)) { - return EncodeErrorHeader(context, arena, TStateHeader::MERGE_PATCHES_ERROR, result); - } - - if (0u == lhs.PayloadSize()) { - return EncodeState(context, arena, rhs, result); - } - - if (0u == rhs.PayloadSize()) { - return EncodeState(context, arena, lhs, result); - } - - auto merged = NProtoBuf::Arena::CreateMessage<TStateHeader>(&arena); - merged->set_type(TStateHeader::PATCH); - merged->set_base_hash(lhs.Header().base_hash()); - merged->set_state_hash(rhs.Header().state_hash()); - merged->set_state_size(rhs.Header().state_size()); - - size_t patchSize = 0; - auto maxMergedHeaderSize = SizeOfHeader(*merged) + sizeof(patchSize); // estimation should be valid: sizeof(ui64 patchSize) covers possible sizeOfHeaderSize growth (+1) - // as well as ui32 data_size which is unset at this point - auto patch = TDataPtr(MergePatches( - context, - maxMergedHeaderSize, - lhs.PayloadData(), - lhs.PayloadSize(), - rhs.PayloadData(), - rhs.PayloadSize(), - &patchSize), - TDeleter(context)); - if (!patch) { - return EncodeErrorHeader(context, arena, TStateHeader::MERGE_PATCHES_ERROR, result); - } - - merged->set_data_size(patchSize); - - auto mergedHeaderSize = SizeOfHeader(*merged); - Y_ENSURE(maxMergedHeaderSize >= mergedHeaderSize); - auto offset = maxMergedHeaderSize - mergedHeaderSize; - - size_t headerSize = 0; - if (!EncodeHeaderTo(*merged, patch.get() + offset, mergedHeaderSize, headerSize)) { - return EncodeErrorHeader(context, arena, TStateHeader::PROTOBUF_ERROR, result); - } - - result->Size = mergedHeaderSize + patchSize; - result->Offset = offset; - result->Data = patch.release(); - return true; - } - - bool ApplyPatch(XDeltaContext* context, NProtoBuf::Arena& arena, const TState& base, const TState& patch, TSpan* result) - { - auto baseHash = base.CalcHash(); - if (baseHash != patch.Header().base_hash()) { - return EncodeErrorHeader(context, arena, TStateHeader::BASE_HASH_ERROR, result); - } - - if (patch.Header().data_size() == 0) { - if (patch.Header().state_size() == base.Header().data_size()) { - if (patch.Header().state_hash() == baseHash) { - return EncodeState(context, arena, base, result); - } - return EncodeErrorHeader(context, arena, TStateHeader::STATE_HASH_ERROR, result); - } - return EncodeErrorHeader(context, arena, TStateHeader::STATE_SIZE_ERROR, result); - } - - size_t stateSize = 0; - - auto merged = NProtoBuf::Arena::CreateMessage<TStateHeader>(&arena); - merged->set_type(TStateHeader::BASE); - - auto maxHeaderSize = SizeOfHeader(*merged) + sizeof(stateSize); - - auto state = TDataPtr(ApplyPatch( - context, - maxHeaderSize, - base.PayloadData(), - base.PayloadSize(), - patch.PayloadData(), - patch.PayloadSize(), - patch.Header().state_size(), - &stateSize), - TDeleter(context)); - if (!state) { - return EncodeErrorHeader(context, arena, TStateHeader::APPLY_PATCH_ERROR, result); - } - - if (stateSize != patch.Header().state_size()) { - return EncodeErrorHeader(context, arena, TStateHeader::STATE_SIZE_ERROR, result); - } - - auto stateHash = CalcHash(state.get() + maxHeaderSize, stateSize); - if (stateHash != patch.Header().state_hash()) { - return EncodeErrorHeader(context, arena, TStateHeader::STATE_HASH_ERROR, result); - } - - merged->set_data_size(stateSize); - - auto mergedHeaderSize = SizeOfHeader(*merged); - auto offset = maxHeaderSize - mergedHeaderSize; - size_t headerSize = 0; - if (!EncodeHeaderTo(*merged, state.get() + offset, mergedHeaderSize, headerSize)) { - return EncodeErrorHeader(context, arena, TStateHeader::PROTOBUF_ERROR, result); - } - - result->Size = mergedHeaderSize + stateSize; - result->Offset = offset; - result->Data = state.release(); - return true; - } - - int MergeStates(XDeltaContext* context, const ui8* lhsData, size_t lhsSize, const ui8* rhsData, size_t rhsSize, TSpan* result) - { - using namespace NXdeltaAggregateColumn; - using namespace NProtoBuf::io; - - result->Data = nullptr; - result->Size = 0; - result->Offset = 0; - - NProtoBuf::ArenaOptions options; - options.initial_block_size = ArenaMaxSize; - auto buffer = TDataPtr(AllocateFromContext(context, options.initial_block_size), TDeleter(context)); - options.initial_block = reinterpret_cast<char*>(buffer.get()); - NProtoBuf::Arena arena(options); - - TState rhs(arena, rhsData, rhsSize); - - if (rhs.Header().has_error_code()) { - return EncodeErrorHeader(context, arena, rhs.Error(), result); - } - - if (rhs.Type() == TStateHeader::BASE) { - result->Data = rhsData; - result->Size = rhsSize; - return true; - } - - TState lhs(arena, lhsData, lhsSize); - if (lhs.Header().has_error_code()) { - return EncodeErrorHeader(context, arena, lhs.Error(), result); - } - - if (lhs.Type() == TStateHeader::PATCH && rhs.Type() == TStateHeader::PATCH) { - return MergePatches(context, arena, lhs, rhs, result); - } else if (lhs.Type() == TStateHeader::BASE && rhs.Type() == TStateHeader::PATCH) { - return ApplyPatch(context, arena, lhs, rhs, result); - } - return EncodeErrorHeader(context, arena, TStateHeader::YT_MERGE_ERROR, result); - } -} diff --git a/library/cpp/xdelta3/state/merge.h b/library/cpp/xdelta3/state/merge.h deleted file mode 100644 index a93106c7d9a..00000000000 --- a/library/cpp/xdelta3/state/merge.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include <library/cpp/xdelta3/xdelta_codec/codec.h> - -#include <util/system/types.h> - -#include <string.h> - -#ifdef __cplusplus -namespace NXdeltaAggregateColumn { -extern "C" { -#endif - -// total Data size = Offset + Size -struct TSpan { - const ui8* Data; - size_t Offset; - size_t Size; -}; - -int MergeStates( - XDeltaContext* context, - const ui8* lhsSata, - size_t lhsSize, - const ui8* rhsData, - size_t rhsSize, - struct TSpan* result); - -#ifdef __cplusplus -} -} -#endif diff --git a/library/cpp/xdelta3/state/state.cpp b/library/cpp/xdelta3/state/state.cpp deleted file mode 100644 index f09dde04259..00000000000 --- a/library/cpp/xdelta3/state/state.cpp +++ /dev/null @@ -1,147 +0,0 @@ -#include "state.h" - -#include <library/cpp/xdelta3/state/hash.h> -#include <library/cpp/xdelta3/xdelta_codec/codec.h> - -#include <util/stream/null.h> - -#include <google/protobuf/io/coded_stream.h> -#include <google/protobuf/io/zero_copy_stream.h> -#include <google/protobuf/io/zero_copy_stream_impl_lite.h> - -namespace NXdeltaAggregateColumn { - size_t SizeOfHeaderSize(size_t headerSize) - { - using namespace NProtoBuf::io; - - ui32 dummy = 0; - auto data = reinterpret_cast<ui8*>(&dummy); - return CodedOutputStream::WriteVarint32ToArray(headerSize, data) - data; - } - - size_t SizeOfHeader(const TStateHeader& header) - { - // length of header + calculated length - auto headerSize = header.ByteSize(); - return SizeOfHeaderSize(headerSize) + headerSize; - } - - TStateHeader* ParseHeader(NProtoBuf::Arena& arena, const ui8* data, size_t size) - { - using namespace NProtoBuf::io; - - auto header = NProtoBuf::Arena::CreateMessage<TStateHeader>(&arena); - if (nullptr == data || 0 == size) { - header->set_error_code(TStateHeader::HEADER_PARSE_ERROR); - return header; - } - - ui32 headerSize = 0; - CodedInputStream in(data, size); - if (in.ReadVarint32(&headerSize)) { - auto sizeofHeaderSize = in.CurrentPosition(); - if (size - sizeofHeaderSize < headerSize) { - header->set_error_code(TStateHeader::HEADER_PARSE_ERROR); - return header; - } - - if (!header->ParseFromArray(data + sizeofHeaderSize, headerSize)) { - header->Clear(); - header->set_error_code(TStateHeader::HEADER_PARSE_ERROR); - } - } else { - header->set_error_code(TStateHeader::HEADER_PARSE_ERROR); - } - - return header; - } - - bool EncodeHeaderTo(const TStateHeader& header, ui8* data, size_t size, size_t& resultSize) - { - using namespace NProtoBuf::io; - - resultSize = 0; - auto headerSize = header.ByteSize(); - auto sizeOfHeaderSize = SizeOfHeaderSize(headerSize); - if (header.SerializeToArray(data + sizeOfHeaderSize, size - sizeOfHeaderSize)) { - sizeOfHeaderSize = CodedOutputStream::WriteVarint32ToArray(headerSize, data) - data; - resultSize = sizeOfHeaderSize + headerSize; - return true; - } - return false; - } - - TStateHeader::EErrorCode CheckProto(const TStateHeader* header, size_t dataSize) - { - auto hasRequiredFields = false; - if (header->type() == TStateHeader::BASE) { - hasRequiredFields = header->has_data_size(); - } else if (header->type() == TStateHeader::PATCH) { - hasRequiredFields = header->has_base_hash() && - header->has_state_hash() && - header->has_state_size() && - header->has_data_size(); - } else { - hasRequiredFields = header->has_error_code(); - } - if (!hasRequiredFields) { - return TStateHeader::MISSING_REQUIRED_FIELD_ERROR; - } - - auto payloadSizeOk = header->data_size() <= dataSize - SizeOfHeader(*header); - if (!payloadSizeOk) { - return TStateHeader::WRONG_DATA_SIZE; - } - return TStateHeader::NO_ERROR; - } - - TState::TState(NProtoBuf::Arena& arena, const ui8* data, size_t size) - { - if (nullptr == data || 0 == size) { - return; - } - - HeaderPtr = ParseHeader(arena, data, size); - if (HeaderPtr->has_error_code() && HeaderPtr->error_code() == TStateHeader::HEADER_PARSE_ERROR) { - return; - } - - auto errorCode = CheckProto(HeaderPtr, size); - if (errorCode != TStateHeader::NO_ERROR) { - HeaderPtr->Clear(); - HeaderPtr->set_error_code(errorCode); - return; - } - - if (HeaderPtr->type() != TStateHeader::NONE_TYPE) { - if (HeaderPtr->data_size()) { - Data = data + SizeOfHeader(*HeaderPtr); - } - } - } - - ui32 TState::CalcHash() const - { - if (nullptr != PayloadData() && 0 != PayloadSize()) { - return NXdeltaAggregateColumn::CalcHash(PayloadData(), PayloadSize()); - } - return 0; - } - - size_t TState::PayloadSize() const - { - return HeaderPtr->data_size(); - } - - TStateHeader::EErrorCode TState::Error() const - { - return HeaderPtr->has_error_code() - ? HeaderPtr->error_code() - : TStateHeader::NO_ERROR; - } - - TStateHeader::EType TState::Type() const - { - return HeaderPtr->type(); - } -} diff --git a/library/cpp/xdelta3/state/state.h b/library/cpp/xdelta3/state/state.h deleted file mode 100644 index 297824952a2..00000000000 --- a/library/cpp/xdelta3/state/state.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include <library/cpp/xdelta3/proto/state_header.pb.h> - -#include <google/protobuf/arena.h> - -namespace NXdeltaAggregateColumn { - - constexpr auto ArenaMaxSize = 65525; - - class TState { - public: - TState(NProtoBuf::Arena& arena, const ui8* data, size_t size); - - const NXdeltaAggregateColumn::TStateHeader& Header() const - { - return *HeaderPtr; - } - - const ui8* PayloadData() const - { - return Data; - } - - size_t PayloadSize() const; - TStateHeader::EErrorCode Error() const; - TStateHeader::EType Type() const; - - ui32 CalcHash() const; - - private: - const ui8* Data = nullptr; - TStateHeader* HeaderPtr = nullptr; - }; - - size_t SizeOfHeader(const TStateHeader& header); -} diff --git a/library/cpp/xdelta3/xdelta_codec/codec.c b/library/cpp/xdelta3/xdelta_codec/codec.c deleted file mode 100644 index 96c04affaf8..00000000000 --- a/library/cpp/xdelta3/xdelta_codec/codec.c +++ /dev/null @@ -1,199 +0,0 @@ -#include "codec.h" - -#include <contrib/libs/xdelta3/xdelta3.h> -#include <contrib/libs/xdelta3/xdelta3-internal.h> - -#include <util/system/types.h> - -#include <arpa/inet.h> - -#include <stdlib.h> -#include <string.h> - -#define IOPT_SIZE 100 - -#ifndef MAX - #define MAX(a,b) ((a) > (b) ? (a) : (b)) -#endif - - -void* xdelta3_buffer_alloc(XDeltaContext* context, size_t items, usize_t size); - -void xdelta3_buffer_free(XDeltaContext* context, void* ptr); - -void init_common_config(XDeltaContext* context, xd3_config* config, usize_t iopt_size); - -int merge_vcdiff_patches( - XDeltaContext* context, - const ui8* patch1, - size_t patch_size1, - const ui8* patch2, - size_t patch_size2, - ui8* result, - size_t* result_size, - size_t max_result_size); - -int ProcessMemory( - int isEncode, - int (*func)(xd3_stream*), - const ui8* input, - usize_t inputSize, - const ui8* source, - usize_t sourceSize, - ui8* output, - usize_t* outputSize, - usize_t outputSizeMax) -{ - xd3_stream stream; - xd3_config config; - xd3_source src; - int ret; - - memset(&stream, 0, sizeof(stream)); - xd3_init_config(&config, XD3_NOCOMPRESS); - - if (isEncode) { - config.winsize = inputSize; - config.sprevsz = xd3_pow2_roundup(config.winsize); - } - - init_common_config(NULL, &config, IOPT_SIZE); // IOPT_SIZE - key option drastically increased performance - - if ((ret = xd3_config_stream(&stream, &config)) == 0) { - if (source != NULL || sourceSize == 0) { - memset(&src, 0, sizeof(src)); - - src.blksize = sourceSize; - src.onblk = sourceSize; - src.curblk = source; - src.curblkno = 0; - src.max_winsize = sourceSize; - - if ((ret = xd3_set_source_and_size(&stream, &src, sourceSize)) == 0) { - ret = xd3_process_stream( - isEncode, - &stream, - func, - 1, - input, - inputSize, - output, - outputSize, - outputSizeMax); - } - } - } - xd3_free_stream(&stream); - return ret; -} - -ui8* ComputePatch( - XDeltaContext* context, - const ui8* from, - size_t fromSize, - const ui8* to, - size_t toSize, - size_t* patchSize) -{ - *patchSize = 0; - - size_t maxInputSize = MAX(toSize, fromSize); - size_t deltaSize = MAX(maxInputSize, 200u) * 1.5; // NOTE: for small data N * 1.5 does not work e.g. data 10 & 10 -> patch 31 - - ui8* delta = (ui8*)xdelta3_buffer_alloc(context, deltaSize, 1); - if (delta == NULL) { - return NULL; - } - - usize_t outSize = 0; - int ret = ProcessMemory( - 1, - &xd3_encode_input, - to, - toSize, - from, - fromSize, - delta, - &outSize, - deltaSize); - - if (ret != 0) { - xdelta3_buffer_free(context, delta); - return NULL; - } - - *patchSize = outSize; - return delta; -} - -ui8* ApplyPatch( - XDeltaContext* context, - size_t headroomSize, - const ui8* base, - size_t baseSize, - const ui8* patch, - size_t patchSize, - size_t stateSize, - size_t* resultSize) -{ - *resultSize = 0; - - ui8* buffer = (ui8*)xdelta3_buffer_alloc(context, headroomSize + stateSize, 1); - if (buffer == NULL) { - return NULL; - } - - size_t decodedSize = 0; - int ret = ProcessMemory( - 0, - &xd3_decode_input, - patch, - patchSize, - base, - baseSize, - buffer + headroomSize, - &decodedSize, - stateSize); - - if (ret != 0) { - xdelta3_buffer_free(context, buffer); - return NULL; - } - - *resultSize = decodedSize; - return buffer; -} - -ui8* MergePatches( - XDeltaContext* context, - size_t headroomSize, - const ui8* patch1, - size_t patch1Size, - const ui8* patch2, - size_t patch2Size, - size_t* patch3Size) -{ - *patch3Size = 0; - - size_t maxResultSize = headroomSize + 3 * (patch1Size + patch2Size); // estmation could be more accurate - - ui8* result = (ui8*)xdelta3_buffer_alloc(context, maxResultSize, 1); - size_t resultSize = 0; - int ret = merge_vcdiff_patches( - NULL, - patch1, - patch1Size, - patch2, - patch2Size, - result + headroomSize, - &resultSize, - maxResultSize - headroomSize); - - if (ret != 0) { - xdelta3_buffer_free(context, result); - return NULL; - } - - *patch3Size = resultSize; - return result; -} diff --git a/library/cpp/xdelta3/xdelta_codec/codec.h b/library/cpp/xdelta3/xdelta_codec/codec.h deleted file mode 100644 index 51b935c9162..00000000000 --- a/library/cpp/xdelta3/xdelta_codec/codec.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include <util/system/types.h> - -#include <string.h> - -struct _xdelta_context { - void* opaque; - void* (*allocate)(void* opaque, size_t size); - void (*free)(void* opaque, void* ptr); -}; -typedef struct _xdelta_context XDeltaContext; - -#ifdef __cplusplus -namespace NXdeltaAggregateColumn { -extern "C" { -#endif - -ui8* ApplyPatch( - XDeltaContext* context, - size_t headroomSize, - const ui8* base, - size_t baseSize, - const ui8* patch, - size_t patchSize, - size_t stateSize, - size_t* resultSize); - -ui8* ComputePatch( - XDeltaContext* context, - const ui8* from, - size_t fromSize, - const ui8* to, - size_t toSize, - size_t* patchSize); - -ui8* MergePatches( - XDeltaContext* context, - size_t headroomSize, - const ui8* patch1, - size_t patch1_size, - const ui8* patch2, - size_t patch2_size, - size_t* patch3_size); - -#ifdef __cplusplus -} -} -#endif diff --git a/library/cpp/xdelta3/xdelta_codec/merge_patches.c b/library/cpp/xdelta3/xdelta_codec/merge_patches.c deleted file mode 100644 index b425873dde1..00000000000 --- a/library/cpp/xdelta3/xdelta_codec/merge_patches.c +++ /dev/null @@ -1,494 +0,0 @@ -#include "codec.h" - -#include <contrib/libs/xdelta3/xdelta3.h> -#include <contrib/libs/xdelta3/xdelta3-internal.h> - -#include <util/system/types.h> - -// routines extracted from xdelta3-main.h - -// from xdelta3.c -#define VCD_ADLER32 (1U << 2) /* has adler32 checksum */ - -#define UNUSED(x) (void)(x) - -typedef enum { - CMD_MERGE_ARG, - CMD_MERGE, -} xd3_cmd; - -void* xdelta3_buffer_alloc(void* context, size_t items, usize_t size) -{ - if (!context) { - return malloc(items * size); - } - XDeltaContext* xd3_context = (XDeltaContext*) context; - return xd3_context->allocate(xd3_context->opaque, items * size); -} - -void xdelta3_buffer_free(void* context, void* ptr) -{ - if (!context) { - free(ptr); - return; - } - XDeltaContext* xd3_context = (XDeltaContext*) context; - xd3_context->free(xd3_context->opaque, ptr); -} - -void init_common_config(XDeltaContext* context, xd3_config* config, usize_t iopt_size) -{ - config->alloc = xdelta3_buffer_alloc; - config->freef = xdelta3_buffer_free; - config->opaque = context; - if (iopt_size) { // option should be 0 in case of patches merge, critical for patch calculation performance - config->iopt_size = iopt_size; - } -} - -int init_recode_stream(XDeltaContext* context, xd3_stream* recode_stream) -{ - int ret; - int stream_flags = XD3_ADLER32_NOVER | XD3_SKIP_EMIT; - int recode_flags; - xd3_config recode_config; - - recode_flags = (stream_flags & XD3_SEC_TYPE); - - xd3_init_config(&recode_config, recode_flags); - - init_common_config(context, &recode_config, 0); - - if ((ret = xd3_config_stream(recode_stream, &recode_config)) || - (ret = xd3_encode_init_partial(recode_stream)) || - (ret = xd3_whole_state_init(recode_stream))) - { - xd3_free_stream(recode_stream); - return ret; - } - - return 0; -} - -int merge_func(xd3_stream* stream, ui8* out_data, size_t* out_size) -{ - UNUSED(out_data); - UNUSED(out_size); - - return xd3_whole_append_window(stream); -} - -int write_output(xd3_stream* stream, ui8* out_data, size_t* out_size, size_t max_osize) -{ - if (stream->avail_out > 0) { - if (*out_size + stream->avail_out > max_osize) { - return ENOMEM; - } - - memcpy(out_data + *out_size, stream->next_out, stream->avail_out); - *out_size += stream->avail_out; - } - - return 0; -} - -int merge_output( - XDeltaContext* context, - xd3_stream* stream, - xd3_stream* recode_stream, - xd3_stream* merge_stream, - ui8** buffer, - size_t buffer_size, - ui8* out_data, - size_t* out_size, - size_t max_osize) -{ - int ret; - usize_t inst_pos = 0; - xoff_t output_pos = 0; - xd3_source recode_source; - usize_t window_num = 0; - int at_least_once = 0; - - /* merge_stream is set if there were arguments. this stream's input - * needs to be applied to the merge_stream source. */ - if ((merge_stream != NULL) && - (ret = xd3_merge_input_output(stream, &merge_stream->whole_target))) - { - return ret; - } - - /* Enter the ENC_INPUT state and bypass the next_in == NULL test - * and (leftover) input buffering logic. */ - XD3_ASSERT(recode_stream->enc_state == ENC_INIT); - recode_stream->enc_state = ENC_INPUT; - recode_stream->next_in = *buffer; - recode_stream->flags |= XD3_FLUSH; - - /* This encodes the entire target. */ - while (inst_pos < stream->whole_target.instlen || !at_least_once) { - xoff_t window_start = output_pos; - int window_srcset = 0; - xoff_t window_srcmin = 0; - xoff_t window_srcmax = 0; - usize_t window_pos = 0; - usize_t window_size; - - /* at_least_once ensures that we encode at least one window, - * which handles the 0-byte case. */ - at_least_once = 1; - - XD3_ASSERT(recode_stream->enc_state == ENC_INPUT); - - if ((ret = xd3_encode_input(recode_stream)) != XD3_WINSTART) { - return XD3_INVALID; - } - - /* Window sizes must match from the input to the output, so that - * target copies are in-range (and so that checksums carry - * over). */ - XD3_ASSERT(window_num < stream->whole_target.wininfolen); - window_size = stream->whole_target.wininfo[window_num].length; - - /* Output position should also match. */ - if (output_pos != stream->whole_target.wininfo[window_num].offset) { - // internal merge error: offset mismatch - return XD3_INVALID; - } - - // NOTE: check if delta_codecs can decode this. option_use_checksum = 1 - if ((stream->dec_win_ind & VCD_ADLER32) != 0) { - recode_stream->flags |= XD3_ADLER32_RECODE; - recode_stream->recode_adler32 = stream->whole_target.wininfo[window_num].adler32; - } - - window_num++; - - if (buffer_size < window_size) { - xdelta3_buffer_free(context, *buffer); - *buffer = NULL; - buffer_size = 0; - if ((*buffer = (ui8*)xdelta3_buffer_alloc(context, window_size, 1)) == NULL) { - return ENOMEM; - } - recode_stream->next_in = *buffer; // re-setting stream buffer - buffer_size = window_size; - } - - /* This encodes a single target window. */ - while (window_pos < window_size && inst_pos < stream->whole_target.instlen) { - xd3_winst* inst = &stream->whole_target.inst[inst_pos]; - usize_t take = xd3_min(inst->size, window_size - window_pos); - xoff_t addr; - - switch (inst->type) { - case XD3_RUN: - if ((ret = xd3_emit_run(recode_stream, window_pos, take, &stream->whole_target.adds[inst->addr]))) { - return ret; - } - break; - - case XD3_ADD: - /* Adds are implicit, put them into the input buffer. */ - memcpy(*buffer + window_pos, - stream->whole_target.adds + inst->addr, take); - break; - - default: /* XD3_COPY + copy mode */ - if (inst->mode != 0) { - if (window_srcset) { - window_srcmin = xd3_min(window_srcmin, inst->addr); - window_srcmax = xd3_max(window_srcmax, - inst->addr + take); - } else { - window_srcset = 1; - window_srcmin = inst->addr; - window_srcmax = inst->addr + take; - } - addr = inst->addr; - } else { - XD3_ASSERT(inst->addr >= window_start); - addr = inst->addr - window_start; - } - - if ((ret = xd3_found_match(recode_stream, window_pos, take, addr, inst->mode != 0))) { - return ret; - } - break; - } - - window_pos += take; - output_pos += take; - - if (take == inst->size) { - inst_pos += 1; - } else { - /* Modify the instruction for the next pass. */ - if (inst->type != XD3_RUN) { - inst->addr += take; - } - inst->size -= take; - } - } - - xd3_avail_input(recode_stream, *buffer, window_pos); - - recode_stream->enc_state = ENC_INSTR; - - if (window_srcset) { - recode_stream->srcwin_decided = 1; - recode_stream->src = &recode_source; - recode_source.srclen = (usize_t)(window_srcmax - window_srcmin); - recode_source.srcbase = window_srcmin; - recode_stream->taroff = recode_source.srclen; - - XD3_ASSERT(recode_source.srclen != 0); - } else { - recode_stream->srcwin_decided = 0; - recode_stream->src = NULL; - recode_stream->taroff = 0; - } - - for (;;) { - switch ((ret = xd3_encode_input(recode_stream))) { - case XD3_INPUT: { - goto done_window; - } - case XD3_OUTPUT: { - /* main_file_write below */ - break; - } - case XD3_GOTHEADER: - case XD3_WINSTART: - case XD3_WINFINISH: { - /* ignore */ - continue; - } - case XD3_GETSRCBLK: - case 0: { - return XD3_INTERNAL; - } - default: - return ret; - } - - if ((ret = write_output(recode_stream, out_data, out_size, max_osize))) { - return ret; - } - - xd3_consume_output(recode_stream); - } - done_window: - (void)0; - } - - return 0; -} - -int process_input( - XDeltaContext* context, - xd3_cmd cmd, - xd3_stream* recode_stream, - xd3_stream* merge_stream, - const ui8* patch, - size_t patch_size, - ui8* out_data, - size_t* out_size, - size_t max_out_size) -{ - int ret; - xd3_stream stream; - int stream_flags = 0; - xd3_config config; - xd3_source source; - - int (*input_func)(xd3_stream*); - int (*output_func)(xd3_stream*, ui8*, size_t*); - - memset(&stream, 0, sizeof(stream)); - memset(&source, 0, sizeof(source)); - memset(&config, 0, sizeof(config)); - - stream_flags |= XD3_ADLER32; - /* main_input setup. */ - stream_flags |= XD3_ADLER32_NOVER | XD3_SKIP_EMIT; // TODO: add nocompress - input_func = xd3_decode_input; - - if ((ret = init_recode_stream(context, recode_stream))) { - return EXIT_FAILURE; - } - - config.winsize = patch_size; - config.sprevsz = xd3_pow2_roundup(config.winsize); - config.flags = stream_flags; - init_common_config(context, &config, 0); - - output_func = merge_func; - - if ((ret = xd3_config_stream(&stream, &config)) || (ret = xd3_whole_state_init(&stream))) { - return EXIT_FAILURE; - } - - /* If we've reached EOF tell the stream to flush. */ - stream.flags |= XD3_FLUSH; - - xd3_avail_input(&stream, patch, patch_size); - - /* Main input loop. */ - - int again = 0; - do { - ret = input_func(&stream); - - switch (ret) { - case XD3_INPUT: - again = 0; - break; - - case XD3_GOTHEADER: { - XD3_ASSERT(stream.current_window == 0); - } - /* FALLTHROUGH */ - case XD3_WINSTART: { - /* e.g., set or unset XD3_SKIP_WINDOW. */ - again = 1; - break; - } - - case XD3_OUTPUT: { - if (ret = output_func(&stream, out_data, out_size)) { - xd3_free_stream(&stream); - return EXIT_FAILURE; - } - - xd3_consume_output(&stream); - again = 1; - break; - } - - case XD3_WINFINISH: { - again = 1; - break; - } - - default: - /* input_func() error */ - xd3_free_stream(&stream); - return EXIT_FAILURE; - } - } while (again); - - if (cmd == CMD_MERGE) { - ui8* buffer = NULL; - size_t buffer_size = patch_size; - if ((buffer = (ui8*)xdelta3_buffer_alloc(context, buffer_size, 1)) == NULL) { - xd3_free_stream(&stream); - return EXIT_FAILURE; - } - - ret = merge_output( - context, - &stream, - recode_stream, - merge_stream, - &buffer, - buffer_size, - out_data, - out_size, - max_out_size); - - xdelta3_buffer_free(context, buffer); - - if (ret) { - xd3_free_stream(&stream); - return EXIT_FAILURE; - } - } else if (cmd == CMD_MERGE_ARG) { - xd3_swap_whole_state(&stream.whole_target, &recode_stream->whole_target); - } - - if ((ret = xd3_close_stream(&stream))) { - return EXIT_FAILURE; - } - - xd3_free_stream(&stream); - return EXIT_SUCCESS; -} - -int patch_to_stream( - XDeltaContext* context, - const ui8* patch, - size_t patch_size, - xd3_stream* recode_stream, - xd3_stream* merge_stream) -{ - xd3_stream merge_input; - int ret; - - xd3_config config; - memset(&config, 0, sizeof(config)); - init_common_config(context, &config, 0); - - if ((ret = xd3_config_stream(&merge_input, &config)) || (ret = xd3_whole_state_init(&merge_input))) { - return ret; - } - - ret = process_input( - context, - CMD_MERGE_ARG, - recode_stream, - merge_stream, - patch, - patch_size, - NULL, - NULL, - 0); - - if (ret == 0) { - xd3_swap_whole_state(&recode_stream->whole_target, &merge_input.whole_target); - } - - xd3_free_stream(recode_stream); - - if (ret != 0) { - xd3_free_stream(&merge_input); - return ret; - } - - if ((ret = xd3_config_stream(merge_stream, &config)) || (ret = xd3_whole_state_init(merge_stream))) { - xd3_free_stream(&merge_input); - return ret; - } - - xd3_swap_whole_state(&merge_stream->whole_target, &merge_input.whole_target); - ret = 0; - xd3_free_stream(&merge_input); - return ret; -} - -int merge_vcdiff_patches( - XDeltaContext* context, - const ui8* patch1, - size_t patch_size1, - const ui8* patch2, - size_t patch_size2, - ui8* result, - size_t* result_size, - size_t max_result_size) -{ - xd3_stream recode_stream; - memset(&recode_stream, 0, sizeof(xd3_stream)); - xd3_stream merge_stream; - memset(&merge_stream, 0, sizeof(xd3_stream)); - - int ret; - ret = patch_to_stream(context, patch1, patch_size1, &recode_stream, &merge_stream); - if (!ret) { - ret = process_input(context, CMD_MERGE, &recode_stream, &merge_stream, patch2, patch_size2, result, result_size, max_result_size); - } - - xd3_free_stream(&recode_stream); - xd3_free_stream(&merge_stream); - - return ret; -} diff --git a/library/cpp/yt/containers/sharded_set-inl.h b/library/cpp/yt/containers/sharded_set-inl.h deleted file mode 100644 index 67d5be58c62..00000000000 --- a/library/cpp/yt/containers/sharded_set-inl.h +++ /dev/null @@ -1,217 +0,0 @@ -#ifndef SHARDED_SET_INL_H_ -#error "Direct inclusion of this file is not allowed, include sharded_set.h" -// For the sake of sane code completion. -#include "sharded_set.h" -#endif - -#include <library/cpp/yt/assert/assert.h> - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -template <class T, int N, class F, class S> -class TShardedSet<T, N, F, S>::const_iterator -{ -private: - friend class TShardedSet<T, N, F, S>; - - using TOwner = TShardedSet<T, N, F, S>; - using TShardIterator = typename S::const_iterator; - - const TOwner* const Owner_; - - int ShardIndex_; - TShardIterator ShardIterator_; - - const_iterator( - const TOwner* owner, - int shardIndex, - TShardIterator shardIterator) - : Owner_(owner) - , ShardIndex_(shardIndex) - , ShardIterator_(shardIterator) - { } - - bool IsValid() const - { - return ShardIterator_ != Owner_->Shards_[ShardIndex_].end(); - } - - void FastForward() - { - while (ShardIndex_ != N - 1 && !IsValid()) { - ++ShardIndex_; - ShardIterator_ = Owner_->Shards_[ShardIndex_].begin(); - } - } - -public: - using difference_type = typename std::iterator_traits<TShardIterator>::difference_type; - using value_type = typename std::iterator_traits<TShardIterator>::value_type; - using pointer = typename std::iterator_traits<TShardIterator>::pointer; - using reference = typename std::iterator_traits<TShardIterator>::reference; - using iterator_category = std::forward_iterator_tag; - - const_iterator& operator++() - { - ++ShardIterator_; - FastForward(); - - return *this; - } - - const_iterator operator++(int) - { - auto result = *this; - - ++ShardIterator_; - FastForward(); - - return result; - } - - bool operator==(const const_iterator& rhs) const - { - return - ShardIndex_ == rhs.ShardIndex_ && - ShardIterator_ == rhs.ShardIterator_; - } - - bool operator!=(const const_iterator& rhs) const - { - return !(*this == rhs); - } - - const T& operator*() const - { - return *ShardIterator_; - } - - const T* operator->() const - { - return &operator*(); - } -}; - -//////////////////////////////////////////////////////////////////////////////// - -template <class T, int N, class F, class S> -TShardedSet<T, N, F, S>::TShardedSet(F elementToShard) - : ElementToShard_(elementToShard) -{ } - -template <class T, int N, class F, class S> -bool TShardedSet<T, N, F, S>::empty() const -{ - return size() == 0; -} - -template <class T, int N, class F, class S> -typename TShardedSet<T, N, F, S>::size_type TShardedSet<T, N, F, S>::size() const -{ - size_type result = 0; - for (const auto& shard : Shards_) { - result += shard.size(); - } - - return result; -} - -template <class T, int N, class F, class S> -const T& TShardedSet<T, N, F, S>::front() const -{ - return *begin(); -} - -template <class T, int N, class F, class S> -typename TShardedSet<T, N, F, S>::size_type TShardedSet<T, N, F, S>::count(const T& value) const -{ - return GetShard(value).count(value); -} - -template <class T, int N, class F, class S> -bool TShardedSet<T, N, F, S>::contains(const T& value) const -{ - return GetShard(value).contains(value); -} - -template <class T, int N, class F, class S> -std::pair<typename TShardedSet<T, N, F, S>::const_iterator, bool> TShardedSet<T, N, F, S>::insert(const T& value) -{ - auto shardIndex = ElementToShard_(value); - auto& shard = Shards_[shardIndex]; - auto [shardIterator, inserted] = shard.insert(value); - - const_iterator iterator(this, shardIndex, shardIterator); - return {iterator, inserted}; -} - -template <class T, int N, class F, class S> -bool TShardedSet<T, N, F, S>::erase(const T& value) -{ - return GetShard(value).erase(value); -} - -template <class T, int N, class F, class S> -void TShardedSet<T, N, F, S>::clear() -{ - for (auto& shard : Shards_) { - shard.clear(); - } -} - -template <class T, int N, class F, class S> -typename TShardedSet<T, N, F, S>::const_iterator TShardedSet<T, N, F, S>::begin() const -{ - const_iterator iterator(this, /*shardIndex*/ 0, /*shardIterator*/ Shards_[0].begin()); - iterator.FastForward(); - - return iterator; -} - -template <class T, int N, class F, class S> -typename TShardedSet<T, N, F, S>::const_iterator TShardedSet<T, N, F, S>::cbegin() const -{ - return begin(); -} - -template <class T, int N, class F, class S> -typename TShardedSet<T, N, F, S>::const_iterator TShardedSet<T, N, F, S>::end() const -{ - return const_iterator(this, /*shardIndex*/ N - 1, /*shardIterator*/ Shards_[N - 1].end()); -} - -template <class T, int N, class F, class S> -typename TShardedSet<T, N, F, S>::const_iterator TShardedSet<T, N, F, S>::cend() const -{ - return end(); -} - -template <class T, int N, class F, class S> -const S& TShardedSet<T, N, F, S>::Shard(int shardIndex) const -{ - return Shards_[shardIndex]; -} - -template <class T, int N, class F, class S> -S& TShardedSet<T, N, F, S>::MutableShard(int shardIndex) -{ - return Shards_[shardIndex]; -} - -template <class T, int N, class F, class S> -S& TShardedSet<T, N, F, S>::GetShard(const T& value) -{ - return Shards_[ElementToShard_(value)]; -} - -template <class T, int N, class F, class S> -const S& TShardedSet<T, N, F, S>::GetShard(const T& value) const -{ - return Shards_[ElementToShard_(value)]; -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT diff --git a/library/cpp/yt/containers/sharded_set.h b/library/cpp/yt/containers/sharded_set.h deleted file mode 100644 index fa24893aa44..00000000000 --- a/library/cpp/yt/containers/sharded_set.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once - -#include <util/generic/hash_set.h> - -#include <array> -#include <cstddef> -#include <utility> - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -//! A set that stores elements divided into fixed amount of shards. -//! Provides access to whole set and particular shards. -//! The interface is pretty minimalistic, feel free to extend it when needed. -template <class T, int N, class F, class S = THashSet<T>> -class TShardedSet -{ -public: - using size_type = size_t; - using difference_type = ptrdiff_t; - - using value_type = T; - - class const_iterator; - - explicit TShardedSet(F elementToShard = F()); - - [[nodiscard]] bool empty() const; - - size_type size() const; - - const T& front() const; - - size_type count(const T& value) const; - - bool contains(const T& value) const; - - std::pair<const_iterator, bool> insert(const T& value); - - bool erase(const T& value); - - void clear(); - - const_iterator begin() const; - const_iterator cbegin() const; - - const_iterator end() const; - const_iterator cend() const; - - const S& Shard(int shardIndex) const; - S& MutableShard(int shardIndex); - -private: - std::array<S, N> Shards_; - - const F ElementToShard_; - - S& GetShard(const T& value); - const S& GetShard(const T& value) const; -}; - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT - -#define SHARDED_SET_INL_H_ -#include "sharded_set-inl.h" -#undef SHARDED_SET_INL_H_ diff --git a/library/cpp/yt/containers/unittests/sharded_set_ut.cpp b/library/cpp/yt/containers/unittests/sharded_set_ut.cpp deleted file mode 100644 index 2c4f8c59356..00000000000 --- a/library/cpp/yt/containers/unittests/sharded_set_ut.cpp +++ /dev/null @@ -1,121 +0,0 @@ -#include <library/cpp/yt/containers/sharded_set.h> - -#include <library/cpp/testing/gtest/gtest.h> - -#include <random> - -namespace NYT { -namespace { - -//////////////////////////////////////////////////////////////////////////////// - -struct TIntToShard -{ - int operator()(int value) const - { - return value % 16; - } -}; - -using TSet = TShardedSet<int, 16, TIntToShard>; - -//////////////////////////////////////////////////////////////////////////////// - -TEST(CompactSetTest, Insert) -{ - TSet set; - - for (int i = 0; i < 4; i++) { - set.insert(i); - } - - for (int i = 0; i < 4; i++) { - set.insert(i); - } - - EXPECT_EQ(4u, set.size()); - - for (int i = 0; i < 4; i++) - EXPECT_EQ(1u, set.count(i)); - - EXPECT_EQ(0u, set.count(4)); -} - -TEST(CompactSetTest, Erase) -{ - TSet set; - - for (int i = 0; i < 8; i++) { - set.insert(i); - } - - EXPECT_EQ(8u, set.size()); - - // Remove elements one by one and check if all other elements are still there. - for (int i = 0; i < 8; i++) { - EXPECT_EQ(1u, set.count(i)); - EXPECT_TRUE(set.erase(i)); - EXPECT_EQ(0u, set.count(i)); - EXPECT_EQ(8u - i - 1, set.size()); - for (int j = i + 1; j < 8; j++) { - EXPECT_EQ(1u, set.count(j)); - } - } - - EXPECT_EQ(0u, set.count(8)); -} - -TEST(CompactSetTest, StressTest) -{ - TSet set; - - constexpr int Iterations = 1'000'000; - constexpr int Values = 128; - - THashSet<int> values; - - auto checkEverything = [&] { - EXPECT_EQ(values.size(), set.size()); - EXPECT_EQ(values.empty(), set.empty()); - EXPECT_EQ(values, THashSet<int>(set.begin(), set.end())); - - std::array<THashSet<int>, 16> shards; - for (int value : values) { - shards[value % 16].insert(value); - } - for (int shardIndex = 0; shardIndex < 16; ++shardIndex) { - EXPECT_EQ(shards[shardIndex], set.Shard(shardIndex)); - } - - for (int value = 0; value < Values; ++value) { - EXPECT_EQ(values.contains(value), set.contains(value)); - EXPECT_EQ(values.count(value), set.count(value)); - } - }; - - std::mt19937_64 rng(42); - - for (int iteration = 0; iteration < Iterations; ++iteration) { - if (rng() % 100 == 0) { - set.clear(); - values.clear(); - checkEverything(); - } - - int value = rng() % Values; - if (rng() % 2 == 0) { - set.insert(value); - values.insert(value); - } else { - set.erase(value); - values.erase(value); - } - - checkEverything(); - } -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace -} // namespace NYT diff --git a/library/cpp/yt/cpu_clock/benchmark/benchmark.cpp b/library/cpp/yt/cpu_clock/benchmark/benchmark.cpp deleted file mode 100644 index e326da68379..00000000000 --- a/library/cpp/yt/cpu_clock/benchmark/benchmark.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "benchmark/benchmark.h" -#include <benchmark/benchmark.h> - -#include <library/cpp/yt/cpu_clock/clock.h> - -namespace NYT { -namespace { - -//////////////////////////////////////////////////////////////////////////////// - -void BenchmarkCpuTime(benchmark::State& state) -{ - for (auto _ : state) { - benchmark::DoNotOptimize(GetCpuInstant()); - } -} - -BENCHMARK(BenchmarkCpuTime); - -void BenchmarkInstantNow(benchmark::State& state) -{ - for (auto _ : state) { - benchmark::DoNotOptimize(TInstant::Now()); - } -} - -BENCHMARK(BenchmarkInstantNow); - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace -} // namespace NYT diff --git a/library/cpp/yt/cpu_clock/unittests/clock_ut.cpp b/library/cpp/yt/cpu_clock/unittests/clock_ut.cpp deleted file mode 100644 index bd9cb6d4be1..00000000000 --- a/library/cpp/yt/cpu_clock/unittests/clock_ut.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include <gtest/gtest.h> - -#include <library/cpp/yt/cpu_clock/clock.h> - -namespace NYT { -namespace { - -//////////////////////////////////////////////////////////////////////////////// - -template <class T> -i64 DiffMS(T a, T b) -{ - return a >= b - ? static_cast<i64>(a.MilliSeconds()) - static_cast<i64>(b.MilliSeconds()) - : DiffMS(b, a); -} - -TEST(TTimingTest, GetInstant) -{ - GetInstant(); - - EXPECT_LE(DiffMS(GetInstant(), TInstant::Now()), 10); -} - -TEST(TTimingTest, InstantVSCpuInstant) -{ - auto instant1 = TInstant::Now(); - auto cpuInstant = InstantToCpuInstant(instant1); - auto instant2 = CpuInstantToInstant(cpuInstant); - EXPECT_LE(DiffMS(instant1, instant2), 10); -} - -TEST(TTimingTest, DurationVSCpuDuration) -{ - auto cpuInstant1 = GetCpuInstant(); - constexpr auto duration1 = TDuration::MilliSeconds(100); - Sleep(duration1); - auto cpuInstant2 = GetCpuInstant(); - auto duration2 = CpuDurationToDuration(cpuInstant2 - cpuInstant1); - EXPECT_LE(DiffMS(duration1, duration2), 10); -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace -} // namespace NYT diff --git a/library/cpp/yt/farmhash/farm_hash.h b/library/cpp/yt/farmhash/farm_hash.h deleted file mode 100644 index fe4c8193a0a..00000000000 --- a/library/cpp/yt/farmhash/farm_hash.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include <contrib/libs/farmhash/farmhash.h> - -#include <util/system/types.h> - -#include <util/generic/strbuf.h> - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -using TFingerprint = ui64; - -static inline TFingerprint FarmHash(ui64 value) -{ - return ::util::Fingerprint(value); -} - -static inline TFingerprint FarmHash(const void* buf, size_t len) -{ - return ::util::Hash64(static_cast<const char*>(buf), len); -} - -static inline TFingerprint FarmHash(const void* buf, size_t len, ui64 seed) -{ - return ::util::Hash64WithSeed(static_cast<const char*>(buf), len, seed); -} - -static inline TFingerprint FarmFingerprint(ui64 value) -{ - return ::util::Fingerprint(value); -} - -static inline TFingerprint FarmFingerprint(const void* buf, size_t len) -{ - return ::util::Fingerprint64(static_cast<const char*>(buf), len); -} - -static inline TFingerprint FarmFingerprint(TStringBuf buf) -{ - return FarmFingerprint(buf.Data(), buf.Size()); -} - -static inline TFingerprint FarmFingerprint(ui64 first, ui64 second) -{ - return ::util::Fingerprint(::util::Uint128(first, second)); -} - -// Forever-fixed Google FarmHash fingerprint. -template <class T> -TFingerprint FarmFingerprint(const T* begin, const T* end) -{ - ui64 result = 0xdeadc0de; - for (const auto* value = begin; value < end; ++value) { - result = FarmFingerprint(result, FarmFingerprint(*value)); - } - return result ^ (end - begin); -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT diff --git a/library/cpp/yt/logging/logger-inl.h b/library/cpp/yt/logging/logger-inl.h deleted file mode 100644 index 6118aa00476..00000000000 --- a/library/cpp/yt/logging/logger-inl.h +++ /dev/null @@ -1,296 +0,0 @@ -#ifndef LOGGER_INL_H_ -#error "Direct inclusion of this file is not allowed, include logger.h" -// For the sake of sane code completion. -#include "logger.h" -#endif -#undef LOGGER_INL_H_ - -#include <library/cpp/yt/yson_string/convert.h> -#include <library/cpp/yt/yson_string/string.h> - -namespace NYT::NLogging { - -//////////////////////////////////////////////////////////////////////////////// - -inline bool TLogger::IsAnchorUpToDate(const TLoggingAnchor& position) const -{ - return - !Category_ || - position.CurrentVersion == Category_->ActualVersion->load(std::memory_order::relaxed); -} - -template <class... TArgs> -void TLogger::AddTag(const char* format, TArgs&&... args) -{ - AddRawTag(Format(format, std::forward<TArgs>(args)...)); -} - -template <class TType> -void TLogger::AddStructuredTag(TStringBuf key, TType value) -{ - StructuredTags_.emplace_back(key, NYson::ConvertToYsonString(value)); -} - -template <class... TArgs> -TLogger TLogger::WithTag(const char* format, TArgs&&... args) const -{ - auto result = *this; - result.AddTag(format, std::forward<TArgs>(args)...); - return result; -} - -template <class TType> -TLogger TLogger::WithStructuredTag(TStringBuf key, TType value) const -{ - auto result = *this; - result.AddStructuredTag(key, value); - return result; -} - -Y_FORCE_INLINE bool TLogger::IsLevelEnabled(ELogLevel level) const -{ - // This is the first check which is intended to be inlined next to - // logging invocation point. Check below is almost zero-cost due - // to branch prediction (which requires inlining for proper work). - if (level < MinLevel_) { - return false; - } - - // Next check is heavier and requires full log manager definition which - // is undesirable in -inl.h header file. This is why we extract it - // to a separate method which is implemented in cpp file. - return IsLevelEnabledHeavy(level); -} - -//////////////////////////////////////////////////////////////////////////////// - -namespace NDetail { - -struct TMessageStringBuilderContext -{ - TSharedMutableRef Chunk; -}; - -struct TMessageBufferTag -{ }; - -class TMessageStringBuilder - : public TStringBuilderBase -{ -public: - TSharedRef Flush(); - - // For testing only. - static void DisablePerThreadCache(); - -protected: - void DoReset() override; - void DoReserve(size_t newLength) override; - -private: - struct TPerThreadCache - { - ~TPerThreadCache(); - - TSharedMutableRef Chunk; - size_t ChunkOffset = 0; - }; - - TSharedMutableRef Buffer_; - - static thread_local TPerThreadCache* Cache_; - static thread_local bool CacheDestroyed_; - static TPerThreadCache* GetCache(); - - static constexpr size_t ChunkSize = 128_KB - 64; -}; - -inline bool HasMessageTags( - const TLoggingContext& loggingContext, - const TLogger& logger) -{ - if (logger.GetTag()) { - return true; - } - if (loggingContext.TraceLoggingTag) { - return true; - } - return false; -} - -inline void AppendMessageTags( - TStringBuilderBase* builder, - const TLoggingContext& loggingContext, - const TLogger& logger) -{ - bool printComma = false; - if (const auto& loggerTag = logger.GetTag()) { - builder->AppendString(loggerTag); - printComma = true; - } - if (auto traceLoggingTag = loggingContext.TraceLoggingTag) { - if (printComma) { - builder->AppendString(TStringBuf(", ")); - } - builder->AppendString(traceLoggingTag); - } -} - -inline void AppendLogMessage( - TStringBuilderBase* builder, - const TLoggingContext& loggingContext, - const TLogger& logger, - TRef message) -{ - if (HasMessageTags(loggingContext, logger)) { - if (message.Size() >= 1 && message[message.Size() - 1] == ')') { - builder->AppendString(TStringBuf(message.Begin(), message.Size() - 1)); - builder->AppendString(TStringBuf(", ")); - } else { - builder->AppendString(TStringBuf(message.Begin(), message.Size())); - builder->AppendString(TStringBuf(" (")); - } - AppendMessageTags(builder, loggingContext, logger); - builder->AppendChar(')'); - } else { - builder->AppendString(TStringBuf(message.Begin(), message.Size())); - } -} - -template <class... TArgs> -void AppendLogMessageWithFormat( - TStringBuilderBase* builder, - const TLoggingContext& loggingContext, - const TLogger& logger, - TStringBuf format, - TArgs&&... args) -{ - if (HasMessageTags(loggingContext, logger)) { - if (format.size() >= 2 && format[format.size() - 1] == ')') { - builder->AppendFormat(format.substr(0, format.size() - 1), std::forward<TArgs>(args)...); - builder->AppendString(TStringBuf(", ")); - } else { - builder->AppendFormat(format, std::forward<TArgs>(args)...); - builder->AppendString(TStringBuf(" (")); - } - AppendMessageTags(builder, loggingContext, logger); - builder->AppendChar(')'); - } else { - builder->AppendFormat(format, std::forward<TArgs>(args)...); - } -} - -struct TLogMessage -{ - TSharedRef MessageRef; - TStringBuf Anchor; -}; - -template <size_t Length, class... TArgs> -TLogMessage BuildLogMessage( - const TLoggingContext& loggingContext, - const TLogger& logger, - const char (&format)[Length], - TArgs&&... args) -{ - TMessageStringBuilder builder; - AppendLogMessageWithFormat(&builder, loggingContext, logger, format, std::forward<TArgs>(args)...); - return {builder.Flush(), format}; -} - -template <class T> -TLogMessage BuildLogMessage( - const TLoggingContext& loggingContext, - const TLogger& logger, - const T& obj) -{ - TMessageStringBuilder builder; - FormatValue(&builder, obj, TStringBuf()); - if (HasMessageTags(loggingContext, logger)) { - builder.AppendString(TStringBuf(" (")); - AppendMessageTags(&builder, loggingContext, logger); - builder.AppendChar(')'); - } - return {builder.Flush(), TStringBuf()}; -} - -inline TLogMessage BuildLogMessage( - const TLoggingContext& loggingContext, - const TLogger& logger, - TStringBuf message) -{ - TMessageStringBuilder builder; - builder.AppendString(message); - if (HasMessageTags(loggingContext, logger)) { - builder.AppendString(TStringBuf(" (")); - AppendMessageTags(&builder, loggingContext, logger); - builder.AppendChar(')'); - } - return {builder.Flush(), message}; -} - -template <size_t Length> -TLogMessage BuildLogMessage( - const TLoggingContext& loggingContext, - const TLogger& logger, - const char (&message)[Length]) -{ - return BuildLogMessage( - loggingContext, - logger, - TStringBuf(message)); -} - -inline TLogMessage BuildLogMessage( - const TLoggingContext& loggingContext, - const TLogger& logger, - TSharedRef&& message) -{ - if (HasMessageTags(loggingContext, logger)) { - TMessageStringBuilder builder; - AppendLogMessage(&builder, loggingContext, logger, message); - return {builder.Flush(), TStringBuf()}; - } else { - return {std::move(message), TStringBuf()}; - } -} - -inline TLogEvent CreateLogEvent( - const TLoggingContext& loggingContext, - const TLogger& logger, - ELogLevel level) -{ - TLogEvent event; - event.Instant = loggingContext.Instant; - event.Category = logger.GetCategory(); - event.Essential = logger.IsEssential(); - event.Level = level; - event.ThreadId = loggingContext.ThreadId; - event.ThreadName = loggingContext.ThreadName; - event.FiberId = loggingContext.FiberId; - event.TraceId = loggingContext.TraceId; - event.RequestId = loggingContext.RequestId; - return event; -} - -inline void LogEventImpl( - const TLoggingContext& loggingContext, - const TLogger& logger, - ELogLevel level, - ::TSourceLocation sourceLocation, - TSharedRef message) -{ - auto event = CreateLogEvent(loggingContext, logger, level); - event.MessageKind = ELogMessageKind::Unstructured; - event.MessageRef = std::move(message); - event.Family = ELogFamily::PlainText; - event.SourceFile = sourceLocation.File; - event.SourceLine = sourceLocation.Line; - logger.Write(std::move(event)); -} - -} // namespace NDetail - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT::NLogging diff --git a/library/cpp/yt/logging/logger.cpp b/library/cpp/yt/logging/logger.cpp deleted file mode 100644 index 7f6f217d860..00000000000 --- a/library/cpp/yt/logging/logger.cpp +++ /dev/null @@ -1,249 +0,0 @@ -#include "logger.h" - -#include <library/cpp/yt/assert/assert.h> - -#include <library/cpp/yt/cpu_clock/clock.h> - -#include <util/system/compiler.h> -#include <util/system/thread.h> - -namespace NYT::NLogging { - -//////////////////////////////////////////////////////////////////////////////// - -namespace NDetail { - -TSharedRef TMessageStringBuilder::Flush() -{ - return Buffer_.Slice(0, GetLength()); -} - -void TMessageStringBuilder::DisablePerThreadCache() -{ - Cache_ = nullptr; - CacheDestroyed_ = true; -} - -void TMessageStringBuilder::DoReset() -{ - Buffer_.Reset(); -} - -void TMessageStringBuilder::DoReserve(size_t newCapacity) -{ - auto oldLength = GetLength(); - newCapacity = FastClp2(newCapacity); - - auto newChunkSize = std::max(ChunkSize, newCapacity); - // Hold the old buffer until the data is copied. - auto oldBuffer = std::move(Buffer_); - auto* cache = GetCache(); - if (Y_LIKELY(cache)) { - auto oldCapacity = End_ - Begin_; - auto deltaCapacity = newCapacity - oldCapacity; - if (End_ == cache->Chunk.Begin() + cache->ChunkOffset && - cache->ChunkOffset + deltaCapacity <= cache->Chunk.Size()) - { - // Resize inplace. - Buffer_ = cache->Chunk.Slice(cache->ChunkOffset - oldCapacity, cache->ChunkOffset + deltaCapacity); - cache->ChunkOffset += deltaCapacity; - End_ = Begin_ + newCapacity; - return; - } - - if (Y_UNLIKELY(cache->ChunkOffset + newCapacity > cache->Chunk.Size())) { - cache->Chunk = TSharedMutableRef::Allocate<TMessageBufferTag>(newChunkSize, {.InitializeStorage = false}); - cache->ChunkOffset = 0; - } - - Buffer_ = cache->Chunk.Slice(cache->ChunkOffset, cache->ChunkOffset + newCapacity); - cache->ChunkOffset += newCapacity; - } else { - Buffer_ = TSharedMutableRef::Allocate<TMessageBufferTag>(newChunkSize, {.InitializeStorage = false}); - newCapacity = newChunkSize; - } - if (oldLength > 0) { - ::memcpy(Buffer_.Begin(), Begin_, oldLength); - } - Begin_ = Buffer_.Begin(); - End_ = Begin_ + newCapacity; -} - -TMessageStringBuilder::TPerThreadCache* TMessageStringBuilder::GetCache() -{ - if (Y_LIKELY(Cache_)) { - return Cache_; - } - if (CacheDestroyed_) { - return nullptr; - } - static thread_local TPerThreadCache Cache; - Cache_ = &Cache; - return Cache_; -} - -TMessageStringBuilder::TPerThreadCache::~TPerThreadCache() -{ - TMessageStringBuilder::DisablePerThreadCache(); -} - -thread_local TMessageStringBuilder::TPerThreadCache* TMessageStringBuilder::Cache_; -thread_local bool TMessageStringBuilder::CacheDestroyed_; - -} // namespace NDetail - -//////////////////////////////////////////////////////////////////////////////// - -Y_WEAK TLoggingContext GetLoggingContext() -{ - return { - .Instant = GetCpuInstant(), - .ThreadId = TThread::CurrentThreadId(), - .ThreadName = GetLoggingThreadName(), - }; -} - -Y_WEAK ILogManager* GetDefaultLogManager() -{ - return nullptr; -} - -//////////////////////////////////////////////////////////////////////////////// - -TLoggingThreadName GetLoggingThreadName() -{ - static thread_local TLoggingThreadName loggingThreadName; - if (loggingThreadName.Length == 0) { - if (auto name = TThread::CurrentThreadName()) { - auto length = std::min(TLoggingThreadName::BufferCapacity - 1, static_cast<int>(name.length())); - loggingThreadName.Length = length; - ::memcpy(loggingThreadName.Buffer.data(), name.data(), length); - } - } - return loggingThreadName; -} - -//////////////////////////////////////////////////////////////////////////////// - -TLogger::TLogger(ILogManager* logManager, TStringBuf categoryName) - : LogManager_(logManager) - , Category_(LogManager_ ? LogManager_->GetCategory(categoryName) : nullptr) - , MinLevel_(LogManager_ ? LoggerDefaultMinLevel : NullLoggerMinLevel) -{ } - -TLogger::TLogger(TStringBuf categoryName) - : TLogger(GetDefaultLogManager(), categoryName) -{ } - -TLogger::operator bool() const -{ - return LogManager_; -} - -const TLoggingCategory* TLogger::GetCategory() const -{ - return Category_; -} - -bool TLogger::IsLevelEnabledHeavy(ELogLevel level) const -{ - // Note that we managed to reach this point, i.e. level >= MinLevel_, - // which implies that MinLevel_ != ELogLevel::Maximum, so this logger was not - // default constructed, thus it has non-trivial category. - YT_ASSERT(Category_); - - if (Category_->CurrentVersion != Category_->ActualVersion->load(std::memory_order::relaxed)) { - LogManager_->UpdateCategory(const_cast<TLoggingCategory*>(Category_)); - } - - return level >= Category_->MinPlainTextLevel; -} - -bool TLogger::GetAbortOnAlert() const -{ - return LogManager_->GetAbortOnAlert(); -} - -bool TLogger::IsEssential() const -{ - return Essential_; -} - -void TLogger::UpdateAnchor(TLoggingAnchor* anchor) const -{ - LogManager_->UpdateAnchor(anchor); -} - -void TLogger::RegisterStaticAnchor(TLoggingAnchor* anchor, ::TSourceLocation sourceLocation, TStringBuf message) const -{ - LogManager_->RegisterStaticAnchor(anchor, sourceLocation, message); -} - -void TLogger::Write(TLogEvent&& event) const -{ - LogManager_->Enqueue(std::move(event)); -} - -void TLogger::AddRawTag(const TString& tag) -{ - if (!Tag_.empty()) { - Tag_ += ", "; - } - Tag_ += tag; -} - -TLogger TLogger::WithRawTag(const TString& tag) const -{ - auto result = *this; - result.AddRawTag(tag); - return result; -} - -TLogger TLogger::WithEssential(bool essential) const -{ - auto result = *this; - result.Essential_ = essential; - return result; -} - -TLogger TLogger::WithMinLevel(ELogLevel minLevel) const -{ - auto result = *this; - if (result) { - result.MinLevel_ = minLevel; - } - return result; -} - -const TString& TLogger::GetTag() const -{ - return Tag_; -} - -const TLogger::TStructuredTags& TLogger::GetStructuredTags() const -{ - return StructuredTags_; -} - -//////////////////////////////////////////////////////////////////////////////// - -void LogStructuredEvent( - const TLogger& logger, - NYson::TYsonString message, - ELogLevel level) -{ - YT_VERIFY(message.GetType() == NYson::EYsonType::MapFragment); - auto loggingContext = GetLoggingContext(); - auto event = NDetail::CreateLogEvent( - loggingContext, - logger, - level); - event.MessageKind = ELogMessageKind::Structured; - event.MessageRef = message.ToSharedRef(); - event.Family = ELogFamily::Structured; - logger.Write(std::move(event)); -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT::NLogging diff --git a/library/cpp/yt/logging/logger.h b/library/cpp/yt/logging/logger.h deleted file mode 100644 index 26b415a6b66..00000000000 --- a/library/cpp/yt/logging/logger.h +++ /dev/null @@ -1,345 +0,0 @@ -#pragma once - -#include "public.h" - -#include <library/cpp/yt/string/format.h> - -#include <library/cpp/yt/memory/ref.h> - -#include <library/cpp/yt/cpu_clock/public.h> - -#include <library/cpp/yt/yson_string/string.h> - -#include <library/cpp/yt/misc/guid.h> - -#include <library/cpp/yt/memory/leaky_singleton.h> - -#include <util/system/src_location.h> - -#include <util/generic/size_literals.h> - -#include <atomic> - -namespace NYT::NLogging { - -//////////////////////////////////////////////////////////////////////////////// - -struct TLoggingCategory -{ - TString Name; - //! This value is used for early dropping of plaintext events in order - //! to reduce load on logging thread for events which are definitely going - //! to be dropped due to rule setup. - //! NB: this optimization is used only for plaintext events since structured - //! logging rate is negligible comparing to the plaintext logging rate. - std::atomic<ELogLevel> MinPlainTextLevel; - std::atomic<int> CurrentVersion; - std::atomic<int>* ActualVersion; -}; - -//////////////////////////////////////////////////////////////////////////////// - -struct TLoggingAnchor -{ - std::atomic<bool> Registered = false; - ::TSourceLocation SourceLocation = {TStringBuf{}, 0}; - TString AnchorMessage; - TLoggingAnchor* NextAnchor = nullptr; - - std::atomic<int> CurrentVersion = 0; - std::atomic<bool> Enabled = false; - - struct TCounter - { - std::atomic<i64> Current = 0; - i64 Previous = 0; - }; - - TCounter MessageCounter; - TCounter ByteCounter; -}; - -//////////////////////////////////////////////////////////////////////////////// - -struct TLoggingThreadName -{ - static constexpr int BufferCapacity = 16; // including zero terminator - std::array<char, BufferCapacity> Buffer; // zero-terminated - int Length; // not including zero terminator -}; - -TLoggingThreadName GetLoggingThreadName(); - -//////////////////////////////////////////////////////////////////////////////// -// Declare some type aliases to avoid circular dependencies. -using TThreadId = size_t; -using TFiberId = size_t; -using TTraceId = TGuid; -using TRequestId = TGuid; - -//////////////////////////////////////////////////////////////////////////////// - -DEFINE_ENUM(ELogMessageKind, - (Unstructured) - (Structured) -); - -struct TLogEvent -{ - const TLoggingCategory* Category = nullptr; - ELogLevel Level = ELogLevel::Minimum; - ELogFamily Family = ELogFamily::PlainText; - bool Essential = false; - - ELogMessageKind MessageKind = ELogMessageKind::Unstructured; - TSharedRef MessageRef; - - TCpuInstant Instant = 0; - - TThreadId ThreadId = {}; - TLoggingThreadName ThreadName = {}; - - TFiberId FiberId = {}; - - TTraceId TraceId; - TRequestId RequestId; - - TStringBuf SourceFile; - int SourceLine = -1; -}; - -//////////////////////////////////////////////////////////////////////////////// - -struct ILogManager -{ - virtual ~ILogManager() = default; - - virtual void RegisterStaticAnchor( - TLoggingAnchor* position, - ::TSourceLocation sourceLocation, - TStringBuf anchorMessage) = 0; - virtual void UpdateAnchor(TLoggingAnchor* position) = 0; - - virtual void Enqueue(TLogEvent&& event) = 0; - - virtual const TLoggingCategory* GetCategory(TStringBuf categoryName) = 0; - virtual void UpdateCategory(TLoggingCategory* category) = 0; - - virtual bool GetAbortOnAlert() const = 0; -}; - -ILogManager* GetDefaultLogManager(); - -//////////////////////////////////////////////////////////////////////////////// - -struct TLoggingContext -{ - TCpuInstant Instant; - TThreadId ThreadId; - TLoggingThreadName ThreadName; - TFiberId FiberId; - TTraceId TraceId; - TRequestId RequestId; - TStringBuf TraceLoggingTag; -}; - -TLoggingContext GetLoggingContext(); - -//////////////////////////////////////////////////////////////////////////////// - -static constexpr auto NullLoggerMinLevel = ELogLevel::Maximum; - -// Min level for non-null logger depends on whether we are in debug or release build. -// - For release mode default behavior is to omit trace logging, -// this is done by setting logger min level to Debug by default. -// - For debug mode logger min level is set to trace by default, so that trace logging is -// allowed by logger, but still may be discarded by category min level. -#ifdef NDEBUG -static constexpr auto LoggerDefaultMinLevel = ELogLevel::Debug; -#else -static constexpr auto LoggerDefaultMinLevel = ELogLevel::Trace; -#endif - -class TLogger -{ -public: - using TStructuredTag = std::pair<TString, NYson::TYsonString>; - // TODO(max42): switch to TCompactVector after YT-15430. - using TStructuredTags = std::vector<TStructuredTag>; - - TLogger() = default; - TLogger(const TLogger& other) = default; - TLogger& operator=(const TLogger& other) = default; - - TLogger(ILogManager* logManager, TStringBuf categoryName); - explicit TLogger(TStringBuf categoryName); - - explicit operator bool() const; - - const TLoggingCategory* GetCategory() const; - - //! Validate that level is admitted by logger's own min level - //! and by category's min level. - bool IsLevelEnabled(ELogLevel level) const; - - bool GetAbortOnAlert() const; - - bool IsEssential() const; - - bool IsAnchorUpToDate(const TLoggingAnchor& anchor) const; - void UpdateAnchor(TLoggingAnchor* anchor) const; - void RegisterStaticAnchor(TLoggingAnchor* anchor, ::TSourceLocation sourceLocation, TStringBuf message) const; - - void Write(TLogEvent&& event) const; - - void AddRawTag(const TString& tag); - template <class... TArgs> - void AddTag(const char* format, TArgs&&... args); - - template <class TType> - void AddStructuredTag(TStringBuf key, TType value); - - TLogger WithRawTag(const TString& tag) const; - template <class... TArgs> - TLogger WithTag(const char* format, TArgs&&... args) const; - - template <class TType> - TLogger WithStructuredTag(TStringBuf key, TType value) const; - - TLogger WithMinLevel(ELogLevel minLevel) const; - - TLogger WithEssential(bool essential = true) const; - - const TString& GetTag() const; - const TStructuredTags& GetStructuredTags() const; - -protected: - // These fields are set only during logger creation, so they are effectively const - // and accessing them is thread-safe. - ILogManager* LogManager_ = nullptr; - const TLoggingCategory* Category_ = nullptr; - bool Essential_ = false; - ELogLevel MinLevel_ = NullLoggerMinLevel; - TString Tag_; - TStructuredTags StructuredTags_; - -private: - //! This method checks level against category's min level. - //! Refer to comment in TLogger::IsLevelEnabled for more details. - bool IsLevelEnabledHeavy(ELogLevel level) const; -}; - -//////////////////////////////////////////////////////////////////////////////// - -void LogStructuredEvent( - const TLogger& logger, - NYson::TYsonString message, - ELogLevel level); - -//////////////////////////////////////////////////////////////////////////////// - -#ifdef YT_ENABLE_TRACE_LOGGING -#define YT_LOG_TRACE(...) YT_LOG_EVENT(Logger, ::NYT::NLogging::ELogLevel::Trace, __VA_ARGS__) -#define YT_LOG_TRACE_IF(condition, ...) if (condition) YT_LOG_TRACE(__VA_ARGS__) -#define YT_LOG_TRACE_UNLESS(condition, ...) if (!(condition)) YT_LOG_TRACE(__VA_ARGS__) -#else -#define YT_LOG_UNUSED(...) if (true) { } else { YT_LOG_DEBUG(__VA_ARGS__); } -#define YT_LOG_TRACE(...) YT_LOG_UNUSED(__VA_ARGS__) -#define YT_LOG_TRACE_IF(condition, ...) YT_LOG_UNUSED(__VA_ARGS__) -#define YT_LOG_TRACE_UNLESS(condition, ...) YT_LOG_UNUSED(__VA_ARGS__) -#endif - -#define YT_LOG_DEBUG(...) YT_LOG_EVENT(Logger, ::NYT::NLogging::ELogLevel::Debug, __VA_ARGS__) -#define YT_LOG_DEBUG_IF(condition, ...) if (condition) YT_LOG_DEBUG(__VA_ARGS__) -#define YT_LOG_DEBUG_UNLESS(condition, ...) if (!(condition)) YT_LOG_DEBUG(__VA_ARGS__) - -#define YT_LOG_INFO(...) YT_LOG_EVENT(Logger, ::NYT::NLogging::ELogLevel::Info, __VA_ARGS__) -#define YT_LOG_INFO_IF(condition, ...) if (condition) YT_LOG_INFO(__VA_ARGS__) -#define YT_LOG_INFO_UNLESS(condition, ...) if (!(condition)) YT_LOG_INFO(__VA_ARGS__) - -#define YT_LOG_WARNING(...) YT_LOG_EVENT(Logger, ::NYT::NLogging::ELogLevel::Warning, __VA_ARGS__) -#define YT_LOG_WARNING_IF(condition, ...) if (condition) YT_LOG_WARNING(__VA_ARGS__) -#define YT_LOG_WARNING_UNLESS(condition, ...) if (!(condition)) YT_LOG_WARNING(__VA_ARGS__) - -#define YT_LOG_ERROR(...) YT_LOG_EVENT(Logger, ::NYT::NLogging::ELogLevel::Error, __VA_ARGS__) -#define YT_LOG_ERROR_IF(condition, ...) if (condition) YT_LOG_ERROR(__VA_ARGS__) -#define YT_LOG_ERROR_UNLESS(condition, ...) if (!(condition)) YT_LOG_ERROR(__VA_ARGS__) - -#define YT_LOG_ALERT(...) \ - do { \ - YT_LOG_EVENT(Logger, ::NYT::NLogging::ELogLevel::Alert, __VA_ARGS__); \ - YT_VERIFY(!Logger.GetAbortOnAlert()); \ - } while(false) -#define YT_LOG_ALERT_IF(condition, ...) if (condition) YT_LOG_ALERT(__VA_ARGS__) -#define YT_LOG_ALERT_UNLESS(condition, ...) if (!(condition)) YT_LOG_ALERT(__VA_ARGS__) - -#define YT_LOG_FATAL(...) \ - do { \ - YT_LOG_EVENT(Logger, ::NYT::NLogging::ELogLevel::Fatal, __VA_ARGS__); \ - YT_ABORT(); \ - } while(false) -#define YT_LOG_FATAL_IF(condition, ...) if (Y_UNLIKELY(condition)) YT_LOG_FATAL(__VA_ARGS__) -#define YT_LOG_FATAL_UNLESS(condition, ...) if (!Y_LIKELY(condition)) YT_LOG_FATAL(__VA_ARGS__) - -#define YT_LOG_EVENT(logger, level, ...) \ - YT_LOG_EVENT_WITH_ANCHOR(logger, level, nullptr, __VA_ARGS__) - -#define YT_LOG_EVENT_WITH_ANCHOR(logger, level, anchor, ...) \ - do { \ - const auto& logger__##__LINE__ = (logger); \ - auto level__##__LINE__ = (level); \ - \ - if (!logger__##__LINE__.IsLevelEnabled(level__##__LINE__)) { \ - break; \ - } \ - \ - auto location__##__LINE__ = __LOCATION__; \ - \ - ::NYT::NLogging::TLoggingAnchor* anchor__##__LINE__ = (anchor); \ - if (!anchor__##__LINE__) { \ - static ::NYT::TLeakyStorage<::NYT::NLogging::TLoggingAnchor> staticAnchor__##__LINE__; \ - anchor__##__LINE__ = staticAnchor__##__LINE__.Get(); \ - } \ - \ - bool anchorUpToDate__##__LINE__ = logger__##__LINE__.IsAnchorUpToDate(*anchor__##__LINE__); \ - if (anchorUpToDate__##__LINE__ && !anchor__##__LINE__->Enabled.load(std::memory_order::relaxed)) { \ - break; \ - } \ - \ - auto loggingContext__##__LINE__ = ::NYT::NLogging::GetLoggingContext(); \ - auto message__##__LINE__ = ::NYT::NLogging::NDetail::BuildLogMessage(loggingContext__##__LINE__, logger__##__LINE__, __VA_ARGS__); \ - \ - if (!anchorUpToDate__##__LINE__) { \ - logger__##__LINE__.RegisterStaticAnchor(anchor__##__LINE__, location__##__LINE__, message__##__LINE__.Anchor); \ - logger__##__LINE__.UpdateAnchor(anchor__##__LINE__); \ - } \ - \ - if (!anchor__##__LINE__->Enabled.load(std::memory_order::relaxed)) { \ - break; \ - } \ - \ - static thread_local i64 localByteCounter__##__LINE__; \ - static thread_local ui8 localMessageCounter__##__LINE__; \ - \ - localByteCounter__##__LINE__ += message__##__LINE__.MessageRef.Size(); \ - if (Y_UNLIKELY(++localMessageCounter__##__LINE__ == 0)) { \ - anchor__##__LINE__->MessageCounter.Current += 256; \ - anchor__##__LINE__->ByteCounter.Current += localByteCounter__##__LINE__; \ - localByteCounter__##__LINE__ = 0; \ - } \ - \ - ::NYT::NLogging::NDetail::LogEventImpl( \ - loggingContext__##__LINE__, \ - logger__##__LINE__, \ - level__##__LINE__, \ - location__##__LINE__, \ - std::move(message__##__LINE__.MessageRef)); \ - } while (false) - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT::NLogging - -#define LOGGER_INL_H_ -#include "logger-inl.h" -#undef LOGGER_INL_H_ diff --git a/library/cpp/yt/logging/public.h b/library/cpp/yt/logging/public.h deleted file mode 100644 index 1e2b59ca0d3..00000000000 --- a/library/cpp/yt/logging/public.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include <library/cpp/yt/misc/enum.h> - -namespace NYT::NLogging { - -//////////////////////////////////////////////////////////////////////////////// - -// Any change to this enum must be also propagated to FormatLevel. -DEFINE_ENUM(ELogLevel, - (Minimum) - (Trace) - (Debug) - (Info) - (Warning) - (Error) - (Alert) - (Fatal) - (Maximum) -); - -DEFINE_ENUM(ELogFamily, - (PlainText) - (Structured) -); - -//////////////////////////////////////////////////////////////////////////////// - -struct TLoggingCategory; -struct TLoggingAnchor; -struct TLogEvent; -struct TLoggingContext; - -class TLogger; -struct ILogManager; - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT::NLogging diff --git a/library/cpp/yt/logging/unittests/logger_ut.cpp b/library/cpp/yt/logging/unittests/logger_ut.cpp deleted file mode 100644 index 7696ea4a83b..00000000000 --- a/library/cpp/yt/logging/unittests/logger_ut.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include <library/cpp/testing/gtest/gtest.h> - -#include <library/cpp/yt/logging/logger.h> - -namespace NYT::NLogging { -namespace { - -//////////////////////////////////////////////////////////////////////////////// - -TEST(TLogger, NullByDefault) -{ - { - TLogger logger; - EXPECT_FALSE(logger); - EXPECT_FALSE(logger.IsLevelEnabled(ELogLevel::Fatal)); - } - { - TLogger logger{"Category"}; - EXPECT_FALSE(logger); - EXPECT_FALSE(logger.IsLevelEnabled(ELogLevel::Fatal)); - } -} - -TEST(TLogger, CopyOfNullLogger) -{ - TLogger nullLogger{/*logManager*/ nullptr, "Category"}; - ASSERT_FALSE(nullLogger); - - auto logger = nullLogger.WithMinLevel(ELogLevel::Debug); - - EXPECT_FALSE(logger); - EXPECT_FALSE(logger.IsLevelEnabled(ELogLevel::Fatal)); -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace -} // namespace NYT::NLogging diff --git a/library/cpp/yt/memory/leaky_ref_counted_singleton-inl.h b/library/cpp/yt/memory/leaky_ref_counted_singleton-inl.h deleted file mode 100644 index 1fba63c427a..00000000000 --- a/library/cpp/yt/memory/leaky_ref_counted_singleton-inl.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef LEAKY_REF_COUNTED_SINGLETON_INL_H_ -#error "Direct inclusion of this file is not allowed, include leaky_ref_counted_singleton.h" -// For the sake of sane code completion. -#include "leaky_ref_counted_singleton.h" -#endif - -#include "new.h" - -#include <atomic> -#include <mutex> - -#include <util/system/compiler.h> -#include <util/system/sanitizers.h> - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -template <class T, class... TArgs> -TIntrusivePtr<T> LeakyRefCountedSingleton(TArgs&&... args) -{ - static std::atomic<T*> Ptr; - auto* ptr = Ptr.load(std::memory_order::acquire); - if (Y_LIKELY(ptr)) { - return ptr; - } - - static std::once_flag Initialized; - std::call_once(Initialized, [&] { - auto ptr = New<T>(std::forward<TArgs>(args)...); - Ref(ptr.Get()); - Ptr.store(ptr.Get()); -#if defined(_asan_enabled_) - NSan::MarkAsIntentionallyLeaked(ptr.Get()); -#endif - }); - - return Ptr.load(); -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT diff --git a/library/cpp/yt/memory/leaky_ref_counted_singleton.h b/library/cpp/yt/memory/leaky_ref_counted_singleton.h deleted file mode 100644 index 4ad5b5f0528..00000000000 --- a/library/cpp/yt/memory/leaky_ref_counted_singleton.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include "intrusive_ptr.h" - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -template <class T, class... TArgs> -TIntrusivePtr<T> LeakyRefCountedSingleton(TArgs&&... args); - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT - -#define LEAKY_REF_COUNTED_SINGLETON_INL_H_ -#include "leaky_ref_counted_singleton-inl.h" -#undef LEAKY_REF_COUNTED_SINGLETON_INL_H_ diff --git a/library/cpp/yt/misc/property.h b/library/cpp/yt/misc/property.h deleted file mode 100644 index bef8024ae15..00000000000 --- a/library/cpp/yt/misc/property.h +++ /dev/null @@ -1,289 +0,0 @@ -#pragma once - -//////////////////////////////////////////////////////////////////////////////// - -//! Declares a trivial public read-write property that is passed by reference. -#define DECLARE_BYREF_RW_PROPERTY(type, name) \ -public: \ - type& name(); \ - const type& name() const; - -//! Defines a trivial public read-write property that is passed by reference. -//! All arguments after name are used as default value (via braced-init-list). -#define DEFINE_BYREF_RW_PROPERTY(type, name, ...) \ -protected: \ - type name##_ { __VA_ARGS__ }; \ - \ -public: \ - Y_FORCE_INLINE type& name() \ - { \ - return name##_; \ - } \ - \ - Y_FORCE_INLINE const type& name() const \ - { \ - return name##_; \ - } - -//! Defines a trivial public read-write property that is passed by reference -//! and is not inline-initialized. -#define DEFINE_BYREF_RW_PROPERTY_NO_INIT(type, name) \ -protected: \ - type name##_; \ - \ -public: \ - Y_FORCE_INLINE type& name() \ - { \ - return name##_; \ - } \ - \ - Y_FORCE_INLINE const type& name() const \ - { \ - return name##_; \ - } - -//! Forwards a trivial public read-write property that is passed by reference. -#define DELEGATE_BYREF_RW_PROPERTY(declaringType, type, name, delegateTo) \ - type& declaringType::name() \ - { \ - return (delegateTo).name(); \ - } \ - \ - const type& declaringType::name() const \ - { \ - return (delegateTo).name(); \ - } - -//////////////////////////////////////////////////////////////////////////////// - -//! Declares a trivial public read-only property that is passed by reference. -#define DECLARE_BYREF_RO_PROPERTY(type, name) \ -public: \ - const type& name() const; - -//! Defines a trivial public read-only property that is passed by reference. -//! All arguments after name are used as default value (via braced-init-list). -#define DEFINE_BYREF_RO_PROPERTY(type, name, ...) \ -protected: \ - type name##_ { __VA_ARGS__ }; \ - \ -public: \ - Y_FORCE_INLINE const type& name() const \ - { \ - return name##_; \ - } - -//! Defines a trivial public read-only property that is passed by reference -//! and is not inline-initialized. -#define DEFINE_BYREF_RO_PROPERTY_NO_INIT(type, name) \ -protected: \ - type name##_; \ - \ -public: \ - Y_FORCE_INLINE const type& name() const \ - { \ - return name##_; \ - } - -//! Forwards a trivial public read-only property that is passed by reference. -#define DELEGATE_BYREF_RO_PROPERTY(declaringType, type, name, delegateTo) \ - const type& declaringType::name() const \ - { \ - return (delegateTo).name(); \ - } - -//////////////////////////////////////////////////////////////////////////////// - -//! Declares a trivial public read-write property that is passed by value. -#define DECLARE_BYVAL_RW_PROPERTY(type, name) \ -public: \ - type Get##name() const; \ - void Set##name(type value); - -//! Defines a trivial public read-write property that is passed by value. -//! All arguments after name are used as default value (via braced-init-list). -#define DEFINE_BYVAL_RW_PROPERTY(type, name, ...) \ -protected: \ - type name##_ { __VA_ARGS__ }; \ - \ -public: \ - Y_FORCE_INLINE type Get##name() const \ - { \ - return name##_; \ - } \ - \ - Y_FORCE_INLINE void Set##name(type value) \ - { \ - name##_ = value; \ - } \ - -//! Defines a trivial public read-write property that is passed by value. -//! All arguments after name are used as default value (via braced-init-list). -#define DEFINE_BYVAL_RW_PROPERTY_WITH_FLUENT_SETTER(declaringType, type, name, ...) \ -protected: \ - type name##_ { __VA_ARGS__ }; \ - \ -public: \ - Y_FORCE_INLINE type Get##name() const \ - { \ - return name##_; \ - } \ - \ - Y_FORCE_INLINE void Set##name(type value) &\ - { \ - name##_ = value; \ - } \ - \ - Y_FORCE_INLINE declaringType&& Set##name(type value) &&\ - { \ - name##_ = value; \ - return std::move(*this); \ - } \ - -//! Defines a trivial public read-write property that is passed by value -//! and is not inline-initialized. -#define DEFINE_BYVAL_RW_PROPERTY_NO_INIT(type, name, ...) \ -protected: \ - type name##_; \ - \ -public: \ - Y_FORCE_INLINE type Get##name() const \ - { \ - return name##_; \ - } \ - \ - Y_FORCE_INLINE void Set##name(type value) \ - { \ - name##_ = value; \ - } \ - -//! Forwards a trivial public read-write property that is passed by value. -#define DELEGATE_BYVAL_RW_PROPERTY(declaringType, type, name, delegateTo) \ - type declaringType::Get##name() const \ - { \ - return (delegateTo).Get##name(); \ - } \ - \ - void declaringType::Set##name(type value) \ - { \ - (delegateTo).Set##name(value); \ - } - -//////////////////////////////////////////////////////////////////////////////// - -//! Declares a trivial public read-only property that is passed by value. -#define DECLARE_BYVAL_RO_PROPERTY(type, name) \ -public: \ - type Get##name() const; - -//! Defines a trivial public read-only property that is passed by value. -//! All arguments after name are used as default value (via braced-init-list). -#define DEFINE_BYVAL_RO_PROPERTY(type, name, ...) \ -protected: \ - type name##_ { __VA_ARGS__ }; \ - \ -public: \ - Y_FORCE_INLINE type Get##name() const \ - { \ - return name##_; \ - } - - -//! Defines a trivial public read-only property that is passed by value -//! and is not inline-initialized. -#define DEFINE_BYVAL_RO_PROPERTY_NO_INIT(type, name) \ -protected: \ - type name##_; \ - \ -public: \ - Y_FORCE_INLINE type Get##name() const \ - { \ - return name##_; \ - } - -//! Forwards a trivial public read-only property that is passed by value. -#define DELEGATE_BYVAL_RO_PROPERTY(declaringType, type, name, delegateTo) \ - type declaringType::Get##name() \ - { \ - return (delegateTo).Get##name(); \ - } - -//////////////////////////////////////////////////////////////////////////////// - -//! Below are macro helpers for extra properties. -//! Extra properties should be used for lazy memory allocation for properties that -//! hold default values for the majority of objects. - -//! Initializes extra property holder if it is not initialized. -#define INITIALIZE_EXTRA_PROPERTY_HOLDER(holder) \ - if (!holder##_) { \ - holder##_.reset(new decltype(holder##_)::element_type()); \ - } - -//! Declares an extra property holder. Holder contains extra properties values. -//! Holder is not created until some property is set with a non-default value. -//! If there is no holder property getter returns default value. -#define DECLARE_EXTRA_PROPERTY_HOLDER(type, holder) \ -public: \ - Y_FORCE_INLINE bool HasCustom##holder() const \ - { \ - return static_cast<bool>(holder##_); \ - } \ - Y_FORCE_INLINE const type* GetCustom##holder() const \ - { \ - return holder##_.get(); \ - } \ - Y_FORCE_INLINE type* GetCustom##holder() \ - { \ - return holder##_.get(); \ - } \ - Y_FORCE_INLINE void InitializeCustom##holder() \ - { \ - INITIALIZE_EXTRA_PROPERTY_HOLDER(holder) \ - } \ -private: \ - std::unique_ptr<type> holder##_; \ - static const type Default##holder##_; - -//! Defines a storage for extra properties default values. -#define DEFINE_EXTRA_PROPERTY_HOLDER(class, type, holder) \ - const type class::Default##holder##_; - -//! Defines a public read-write extra property that is passed by value. -#define DEFINE_BYVAL_RW_EXTRA_PROPERTY(holder, name) \ -public: \ - Y_FORCE_INLINE decltype(holder##_->name) Get##name() const \ - { \ - if (!holder##_) { \ - return Default##holder##_.name; \ - } \ - return holder##_->name; \ - } \ - Y_FORCE_INLINE void Set##name(decltype(holder##_->name) val) \ - { \ - if (!holder##_) { \ - if (val == Default##holder##_.name) { \ - return; \ - } \ - INITIALIZE_EXTRA_PROPERTY_HOLDER(holder); \ - } \ - holder##_->name = val; \ - } - -//! Defines a public read-write extra property that is passed by reference. -#define DEFINE_BYREF_RW_EXTRA_PROPERTY(holder, name) \ -public: \ - Y_FORCE_INLINE const decltype(holder##_->name)& name() const \ - { \ - if (!holder##_) { \ - return Default##holder##_.name; \ - } \ - return holder##_->name; \ - } \ - Y_FORCE_INLINE decltype(holder##_->name)& Mutable##name() \ - { \ - INITIALIZE_EXTRA_PROPERTY_HOLDER(holder); \ - return holder##_->name; \ - } - -//////////////////////////////////////////////////////////////////////////////// diff --git a/library/cpp/yt/mlock/README.md b/library/cpp/yt/mlock/README.md deleted file mode 100644 index b61b6072c4d..00000000000 --- a/library/cpp/yt/mlock/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# mlock - -MlockFileMappings подгружает и лочит в память все страницы исполняемого файла. - -В отличии от вызова mlockall, функция не лочит другие страницы процесса. -mlockall явно выделяет физическую память под все vma. Типичный процесс сначала -стартует и инициализирует аллокатор, а потом уже вызывает функцию для mlock страниц. -Аллокатор при старте выделяет большие диапазоны через mmap, но реально их не использует. -Поэтому mlockall приводит в повышенному потреблению памяти. - -Также, в отличии от mlockall, функция может подгрузить страницы в память сразу. diff --git a/library/cpp/yt/mlock/mlock.h b/library/cpp/yt/mlock/mlock.h deleted file mode 100644 index 035fc47e373..00000000000 --- a/library/cpp/yt/mlock/mlock.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -bool MlockFileMappings(bool populate = true); - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT diff --git a/library/cpp/yt/mlock/mlock_linux.cpp b/library/cpp/yt/mlock/mlock_linux.cpp deleted file mode 100644 index 8791869f951..00000000000 --- a/library/cpp/yt/mlock/mlock_linux.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include "mlock.h" - -#include <stdio.h> -#include <sys/mman.h> -#include <stdint.h> -#include <inttypes.h> - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -void PopulateFile(void* ptr, size_t size) -{ - constexpr size_t PageSize = 4096; - - auto* begin = static_cast<volatile char*>(ptr); - for (auto* current = begin; current < begin + size; current += PageSize) { - *current; - } -} - -bool MlockFileMappings(bool populate) -{ - auto* file = ::fopen("/proc/self/maps", "r"); - if (!file) { - return false; - } - - // Each line of /proc/<pid>/smaps has the following format: - // address perms offset dev inode path - // E.g. - // 08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm - - bool failed = false; - while (true) { - char line[1024]; - if (!fgets(line, sizeof(line), file)) { - break; - } - - char addressStr[64]; - char permsStr[64]; - char offsetStr[64]; - char devStr[64]; - int inode; - if (sscanf(line, "%s %s %s %s %d", - addressStr, - permsStr, - offsetStr, - devStr, - &inode) != 5) - { - continue; - } - - if (inode == 0) { - continue; - } - - if (permsStr[0] != 'r') { - continue; - } - - uintptr_t startAddress; - uintptr_t endAddress; - if (sscanf(addressStr, "%" PRIx64 "-%" PRIx64, - &startAddress, - &endAddress) != 2) - { - continue; - } - - if (::mlock(reinterpret_cast<const void*>(startAddress), endAddress - startAddress) != 0) { - failed = true; - continue; - } - - if (populate) { - PopulateFile(reinterpret_cast<void*>(startAddress), endAddress - startAddress); - } - } - - ::fclose(file); - return !failed; -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT diff --git a/library/cpp/yt/mlock/mlock_other.cpp b/library/cpp/yt/mlock/mlock_other.cpp deleted file mode 100644 index 269c5c3cb98..00000000000 --- a/library/cpp/yt/mlock/mlock_other.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "mlock.h" - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -bool MlockFileMappings(bool /* populate */) -{ - return false; -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT diff --git a/library/cpp/yt/stockpile/README.md b/library/cpp/yt/stockpile/README.md deleted file mode 100644 index 6ee4cd1b1f1..00000000000 --- a/library/cpp/yt/stockpile/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# stockpile - -При приближении к лимиту памяти в memory cgroup, linux запускает механизм direct reclaim, -чтобы освободить свободную память. По опыту YT, direct reclaim очень сильно замедляет работу -всего процесса. - -Проблема возникает не только, когда память занята анонимными страницами. 50% памяти контейнера -может быть занято не dirty страницами page cache, но проблема всёравно будет проявляться. Например, -если процесс активно читает файлы с диска без O_DIRECT, вся память очень быстро будет забита. - -Чтобы бороться с этой проблемой, в яндексовом ядре добавлена ручка `madvise(MADV_STOCKPILE)`. -Больше подробностей в https://st.yandex-team.ru/KERNEL-186
\ No newline at end of file diff --git a/library/cpp/yt/stockpile/stockpile.h b/library/cpp/yt/stockpile/stockpile.h deleted file mode 100644 index 2b1b53e9b57..00000000000 --- a/library/cpp/yt/stockpile/stockpile.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include <util/system/types.h> - -#include <util/generic/size_literals.h> - -#include <util/datetime/base.h> - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -struct TStockpileOptions -{ - i64 BufferSize = 4_GB; - int ThreadCount = 4; - TDuration Period = TDuration::MilliSeconds(10); -}; - -void StockpileMemory(const TStockpileOptions& options); - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT diff --git a/library/cpp/yt/stockpile/stockpile_linux.cpp b/library/cpp/yt/stockpile/stockpile_linux.cpp deleted file mode 100644 index 9be33e3811e..00000000000 --- a/library/cpp/yt/stockpile/stockpile_linux.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "stockpile.h" - -#include <thread> -#include <mutex> - -#include <sys/mman.h> - -#include <util/system/thread.h> - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -namespace { - -void RunStockpile(const TStockpileOptions& options) -{ - TThread::SetCurrentThreadName("Stockpile"); - - constexpr int MADV_STOCKPILE = 0x59410004; - - while (true) { - ::madvise(nullptr, options.BufferSize, MADV_STOCKPILE); - Sleep(options.Period); - } -} - -} // namespace - -void StockpileMemory(const TStockpileOptions& options) -{ - static std::once_flag OnceFlag; - std::call_once(OnceFlag, [options] { - for (int i = 0; i < options.ThreadCount; i++) { - std::thread(RunStockpile, options).detach(); - } - }); -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT diff --git a/library/cpp/yt/stockpile/stockpile_other.cpp b/library/cpp/yt/stockpile/stockpile_other.cpp deleted file mode 100644 index 913ad88b206..00000000000 --- a/library/cpp/yt/stockpile/stockpile_other.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "stockpile.h" - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - -void StockpileMemory(const TStockpileOptions& /*options*/) -{ } - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT diff --git a/library/cpp/yt/threading/unittests/recursive_spin_lock_ut.cpp b/library/cpp/yt/threading/unittests/recursive_spin_lock_ut.cpp deleted file mode 100644 index 9c2d8f16cbf..00000000000 --- a/library/cpp/yt/threading/unittests/recursive_spin_lock_ut.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include <library/cpp/testing/gtest/gtest.h> - -#include <library/cpp/yt/threading/recursive_spin_lock.h> -#include <library/cpp/yt/threading/event_count.h> - -#include <thread> - -namespace NYT::NThreading { -namespace { - -//////////////////////////////////////////////////////////////////////////////// - -TEST(TRecursiveSpinLockTest, SingleThread) -{ - TRecursiveSpinLock lock; - EXPECT_FALSE(lock.IsLocked()); - EXPECT_TRUE(lock.TryAcquire()); - EXPECT_TRUE(lock.IsLocked()); - EXPECT_TRUE(lock.TryAcquire()); - EXPECT_TRUE(lock.IsLocked()); - lock.Release(); - EXPECT_TRUE(lock.IsLocked()); - lock.Release(); - EXPECT_FALSE(lock.IsLocked()); - EXPECT_TRUE(lock.TryAcquire()); - EXPECT_TRUE(lock.IsLocked()); - lock.Release(); - lock.Acquire(); - lock.Release(); -} - -TEST(TRecursiveSpinLockTest, TwoThreads) -{ - TRecursiveSpinLock lock; - TEvent e1, e2, e3, e4, e5, e6, e7; - - std::thread t1([&] { - e1.Wait(); - EXPECT_TRUE(lock.IsLocked()); - EXPECT_FALSE(lock.IsLockedByCurrentThread()); - EXPECT_FALSE(lock.TryAcquire()); - e2.NotifyOne(); - e3.Wait(); - EXPECT_TRUE(lock.IsLocked()); - EXPECT_FALSE(lock.IsLockedByCurrentThread()); - EXPECT_FALSE(lock.TryAcquire()); - e4.NotifyOne(); - e5.Wait(); - EXPECT_FALSE(lock.IsLocked()); - EXPECT_FALSE(lock.IsLockedByCurrentThread()); - EXPECT_TRUE(lock.TryAcquire()); - e6.NotifyOne(); - e7.Wait(); - lock.Release(); - }); - - std::thread t2([&] { - EXPECT_FALSE(lock.IsLocked()); - EXPECT_TRUE(lock.TryAcquire()); - EXPECT_TRUE(lock.IsLockedByCurrentThread()); - e1.NotifyOne(); - e2.Wait(); - EXPECT_TRUE(lock.TryAcquire()); - EXPECT_TRUE(lock.IsLockedByCurrentThread()); - e3.NotifyOne(); - e4.Wait(); - lock.Release(); - lock.Release(); - EXPECT_FALSE(lock.IsLocked()); - e5.NotifyOne(); - e6.Wait(); - EXPECT_TRUE(lock.IsLocked()); - EXPECT_FALSE(lock.IsLockedByCurrentThread()); - e7.NotifyOne(); - lock.Acquire(); - lock.Acquire(); - lock.Release(); - lock.Release(); - }); - - t1.join(); - t2.join(); -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace -} // namespace NYT::NThreading diff --git a/library/cpp/yt/threading/unittests/spin_wait_ut.cpp b/library/cpp/yt/threading/unittests/spin_wait_ut.cpp deleted file mode 100644 index 8469634f346..00000000000 --- a/library/cpp/yt/threading/unittests/spin_wait_ut.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include <library/cpp/testing/gtest/gtest.h> - -#include <library/cpp/yt/threading/spin_wait.h> -#include <library/cpp/yt/threading/spin_wait_hook.h> - -#include <thread> -#include <mutex> - -namespace NYT::NThreading { -namespace { - -//////////////////////////////////////////////////////////////////////////////// - -bool SpinWaitSlowPathHookInvoked; - -void SpinWaitSlowPathHook( - TCpuDuration cpuDelay, - const TSourceLocation& /*location*/, - ESpinLockActivityKind /*activityKind*/) -{ - SpinWaitSlowPathHookInvoked = true; - auto delay = CpuDurationToDuration(cpuDelay); - EXPECT_GE(delay, TDuration::Seconds(1)); - EXPECT_LE(delay, TDuration::Seconds(5)); -} - -TEST(TSpinWaitTest, SlowPathHook) -{ - static std::once_flag registerFlag; - std::call_once( - registerFlag, - [] { - RegisterSpinWaitSlowPathHook(SpinWaitSlowPathHook); - }); - SpinWaitSlowPathHookInvoked = false; - { - TSpinWait spinWait(__LOCATION__, ESpinLockActivityKind::ReadWrite); - for (int i = 0; i < 1'000'000; ++i) { - spinWait.Wait(); - } - } - EXPECT_TRUE(SpinWaitSlowPathHookInvoked); -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace -} // namespace NYT::NThreading |